pax_global_header00006660000000000000000000000064147760203230014516gustar00rootroot0000000000000052 comment=7eb1f39d8c08fb98c089ec6c6ab77e7dc01c991e c4core-0.2.6/000077500000000000000000000000001477602032300127025ustar00rootroot00000000000000c4core-0.2.6/.clang-tidy000066400000000000000000000234721477602032300147460ustar00rootroot00000000000000Checks: - '*' # enable everything # but disable the following: - -altera-id-dependent-backward-branch # backward branch (for loop) is ID-dependent due to variable reference to 'n' and may cause performance degradation - -altera-struct-pack-align # accessing fields in struct 'base64_wrapper_' is inefficient due to poor alignment; currently aligned to 8 bytes, but recommended alignment is 16 bytes - -altera-unroll-loops # kernel performance could be improved by unrolling this loop with a '#pragma unroll' directive - -bugprone-branch-clone # repeated branch body in conditional chain - -bugprone-easily-swappable-parameters # 2 adjacent parameters of 'Tree' of similar type are easily swapped by mistake - -bugprone-reserved-identifier # warnings on identifiers with leading _ - -bugprone-switch-missing-default-case # switching on non-enum value without default case may not cover all cases - -cert-dcl37-c # warnings on identifiers with leading _ - -cert-dcl51-cpp # warnings on identifiers with leading _ - -cert-dcl59-cpp,fuchsia-header-anon-namespaces # do not use unnamed namespaces in header files - -clang-analyzer-optin.core.EnumCastOutOfRange # The value '44' provided to the cast expression is not in the valid range of values for the enum - -clang-diagnostic-pragma-system-header-outside-header # #pragma system_header ignored in main file - -clang-diagnostic-unknown-warning-option # unknown compiler options - -cppcoreguidelines-avoid-c-arrays # allow C arrays - -cppcoreguidelines-avoid-do-while # avoid do-while loops - -cppcoreguidelines-avoid-magic-numbers - -cppcoreguidelines-avoid-non-const-global-variables # variable 's_default_callbacks' is non-const and globally accessible, consider making it const - -cppcoreguidelines-init-variables # variable 'node' is not initialized - -cppcoreguidelines-macro-to-enum # replace macro with enum - -cppcoreguidelines-macro-usage # function-like macro 'c4append_' used; consider a 'constexpr' template function - -cppcoreguidelines-no-malloc # do not manage memory manually; consider a container or a smart pointer - -cppcoreguidelines-owning-memory # initializing non-owner 'void *' with a newly created 'gsl::owner<>' - -cppcoreguidelines-pro-bounds-array-to-pointer-decay - -cppcoreguidelines-pro-bounds-constant-array-index # do not use array subscript when the index is not an integer constant expression - -cppcoreguidelines-pro-bounds-pointer-arithmetic # do not use pointer arithmetic - -cppcoreguidelines-pro-type-cstyle-cast # do not use C-style cast to convert between unrelated types - -cppcoreguidelines-pro-type-member-init # constructor does not initialize these fields: len - -cppcoreguidelines-pro-type-vararg # do not call c-style vararg functions - -cppcoreguidelines-use-default-member-init # use default member initializer for 'm_pos' - -fuchsia-default-arguments-calls # calling a function that uses a default argument is disallowed - -fuchsia-default-arguments-declarations # declaring a parameter with a default argument is disallowed - -fuchsia-overloaded-operator # overloading 'operator[]' is disallowed - -fuchsia-statically-constructed-objects # static objects are disallowed; if possible, use a constexpr constructor instead - -fuchsia-trailing-return # a trailing return type is disallowed for this function declaration - -google-build-namespaces # do not use unnamed namespaces in header files - -google-build-using-namespace # do not use namespace using-directives; use using-declarations instead - -google-explicit-constructor # single-argument constructors must be marked explicit to avoid unintentional implicit conversions - -google-readability-braces-around-statements # statement should be inside braces - -google-readability-casting # C-style casts are discouraged; use static_cast - -google-readability-function-size # function '_handle_map_block' exceeds recommended size/complexity thresholds - -google-readability-namespace-comments # anonymous namespace not terminated with a closing comment - -google-readability-todo # missing username/bug in TODO - -hicpp-avoid-c-arrays # allow C arrays - -hicpp-braces-around-statements # statement should be inside braces - -hicpp-deprecated-headers # inclusion of deprecated C++ header 'stdlib.h'; consider using 'cstdlib' instead - -hicpp-explicit-conversions # single-argument constructors must be marked explicit to avoid unintentional implicit conversions - -hicpp-function-size # function '_handle_map_block' exceeds recommended size/complexity thresholds - -hicpp-member-init # constructor does not initialize these fields: len - -hicpp-named-parameter # all parameters should be named in a function - -hicpp-no-array-decay # do not implicitly decay an array into a pointer; consider using gsl::array_view or an explicit cast instead - -hicpp-no-malloc # do not manage memory manually; consider a container or a smart pointer - -hicpp-uppercase-literal-suffix # integer literal has suffix 'u', which is not uppercase - -hicpp-use-auto,modernize-use-auto # use auto when initializing with a cast to avoid duplicating the type name - -hicpp-vararg # do not call c-style vararg functions - -llvm-else-after-return,readability-else-after-return # do not use 'else' after 'return' - -llvm-header-guard # header guard does not follow preferred style - -llvm-include-order # #includes are not sorted properly - -llvm-namespace-comment # anonymous namespace not terminated with a closing comment - -llvmlibc-callee-namespace # ... must resolve to a function declared within the namespace defined by the ... macro - -llvmlibc-implementation-in-namespace # the outermost namespace should be the 'LIBC_NAMESPACE' macro - -llvmlibc-inline-function-decl # '_is_idchar' must be tagged with the LIBC_INLINE macro; the macro should be placed at the beginning of the declaration - -llvmlibc-restrict-system-libc-headers # system include stdlib.h not allowed - -misc-const-correctness # variable 's2c' of type 'char' can be declared 'const' - -misc-include-cleaner # no header providing ... is directly included - -misc-no-recursion # function 'reserve' is within a recursive call chain - -misc-non-private-member-variables-in-classes # member variable 'data' has public visibility - -modernize-avoid-c-arrays # allow C arrays - -modernize-concat-nested-namespaces # nested namespaces can be concatenated - -modernize-deprecated-headers # inclusion of deprecated C++ header 'stdlib.h'; consider using 'cstdlib' instead - -modernize-deprecated-headers # inclusion of deprecated C++ header 'stdlib.h'; consider using 'cstdlib' instead - -modernize-loop-convert # use range-based for loop instead - -modernize-macro-to-enum # replace macro with enum - -modernize-return-braced-init-list # avoid repeating the return type from the declaration; use a braced initializer list instead - -modernize-type-traits # use c++17 style variable templates - -modernize-use-auto # use auto when initializing with a cast to avoid duplicating the type name - -modernize-use-default-member-init # use default member initializer for 'm_pos' - -modernize-use-nodiscard # function 'valid' should be marked nodiscard - -modernize-use-trailing-return-type # don't care about this - -modernize-use-using # use 'using' instead of 'typedef' - -performance-enum-size # enum '_ppstate' uses a larger base type ('int', size: 4 bytes) than necessary for its value set, consider using 'std::uint8_t' (1 byte) as the base type to reduce its size - -readability-avoid-nested-conditional-operator # conditional operator is used as sub-expression of parent conditional operator, refrain from using nested conditional operators - -readability-avoid-unconditional-preprocessor-if # preprocessor condition is always 'false', consider removing both the condition and its contents - -readability-braces-around-statements # statement should be inside braces - -readability-else-after-return # do not use 'else' after 'return' - -readability-function-cognitive-complexity # function ... has cognitive complexity of ... (threshold ...) - -readability-function-size # function '_handle_map_block' exceeds recommended size/complexity thresholds - -readability-identifier-length # variable name 'c' is too short, expected at least 3 characters - -readability-implicit-bool-conversion # implicit conversion 'NodeData *' -> 'bool' - -readability-inconsistent-declaration-parameter-name # definition with different parameter names - -readability-isolate-declaration # multiple declarations in a single statement reduces readability - -readability-magic-numbers # 16 is a magic number; consider replacing it with a named constant - -readability-named-parameter # all parameters should be named in a function - -readability-redundant-access-specifiers # redundant access specifier has the same accessibility as the previous access specifier - -readability-redundant-member-init # initializer for member 'm_arena' is redundant - -readability-redundant-declaration # redundant 'to_substr' declaration - -readability-simplify-boolean-expr # boolean expression can be simplified by DeMorgan's theorem - -readability-suspicious-call-argument # 1st argument 'after' (passed to 'node') looks like it might be swapped with the 2nd, 'node' (passed to 'sib') - -readability-uppercase-literal-suffix # integer literal has suffix 'u', which is not uppercase - -readability-use-anyofallof # replace loop by 'std::all_of()' # Turn all the warnings from the checks above into errors. WarningsAsErrors: '*' #CheckOptions: # - { key: readability-identifier-naming.ClassCase, value: CamelCase } # - { key: readability-identifier-naming.MethodCase, value: CamelCase } # - { key: readability-identifier-naming.MemberPrefix, value: m_ } # - { key: readability-identifier-naming.MemberCase, value: lower_case } c4core-0.2.6/.github/000077500000000000000000000000001477602032300142425ustar00rootroot00000000000000c4core-0.2.6/.github/docker/000077500000000000000000000000001477602032300155115ustar00rootroot00000000000000c4core-0.2.6/.github/docker/build_and_push.sh000077500000000000000000000031601477602032300210300ustar00rootroot00000000000000#!/bin/bash -xe set -o pipefail # To run an image: # # docker run -it --network host -v ~/proj/rapidyaml:/rapidyaml --name c4core_ubuntu22 ghcr.io/biojppm/c4core/ubuntu22.04:latest /bin/bash # # To resume a running image # # docker start # docker attach # # To see existing images, or find an id: # # docker ps -a # # To delete all containers including its volumes use, # # docker rm -vf $(docker ps -aq) # # To delete all the images, # # docker rmi -f $(docker images -aq) # # Remember, you should remove all the containers before removing all # the images from which those containers were created. See # https://stackoverflow.com/questions/44785585/how-can-i-delete-all-local-docker-images if [ -z "$CR_USR" ] ; then echo "error: \$CR_USR is not defined. Set it to a user name." exit 1 fi if [ -z "$CR_PAT" ] ; then echo "error: \$CR_PAT is not defined. Set it to a personal access token." exit 1 fi # see https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry#building-container-images echo $CR_PAT | docker login ghcr.io -u $CR_USR --password-stdin mydir=$(cd $(dirname $0) ; pwd) time ( \ cd $mydir/ubuntu18.04 ; \ img=ghcr.io/biojppm/c4core/ubuntu18.04:latest ; \ time docker build -t $img . ; \ time docker push $img \ ) time ( \ cd $mydir/ubuntu22.04 ; \ img=ghcr.io/biojppm/c4core/ubuntu22.04:latest ; \ time docker build -t $img . ; \ time docker push $img \ ) time ( \ cd $mydir/ubuntu24.04 ; \ img=ghcr.io/biojppm/c4core/ubuntu24.04:latest ; \ time docker build -t $img . ; \ time docker push $img \ ) c4core-0.2.6/.github/docker/ubuntu18.04/000077500000000000000000000000001477602032300174265ustar00rootroot00000000000000c4core-0.2.6/.github/docker/ubuntu18.04/Dockerfile000066400000000000000000000114741477602032300214270ustar00rootroot00000000000000FROM ubuntu:18.04 # to build, use the script build_and_push.sh, located above LABEL org.opencontainers.image.source=https://github.com/biojppm/c4core LABEL org.opencontainers.image.description="C++ build testing: gcc4.8-gcc11, clang3.9-clang16, arm-eabi-none, swig" LABEL org.opencontainers.image.licenses=MIT LABEL maintainer=dev@jpmag.me LABEL version=1.2 SHELL ["/bin/bash", "-c"] RUN apt-get update \ && apt-get install -y \ apt-utils \ ca-certificates \ lsb-core \ gnupg \ software-properties-common \ wget \ curl \ sudo \ build-essential \ swig \ musl-dev \ && \ echo "basics done" # git version must be >= 2.18 RUN add-apt-repository --yes --no-update ppa:git-core/ppa \ && apt-get update \ && apt-get install -y \ git \ && echo "git done" # cmake RUN wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | apt-key add - \ && apt-add-repository --yes --no-update "deb https://apt.kitware.com/ubuntu/ bionic main" \ && apt-get update \ && apt-get install -y \ cmake \ ninja-build \ && echo "cmake done" # 32 bit requirements RUN dpkg --add-architecture i386 \ && apt-get update \ && apt-get install -y \ linux-libc-dev:i386 \ libc6:i386 \ libc6-dev:i386 \ libc6-dbg:i386 \ g++-multilib \ && echo "32bit done" # libc++ RUN apt-get install -y \ clang \ libc++1 \ libc++abi-dev \ libc++-dev \ && echo "libc++ done" # coverage RUN apt-get install -y \ lcov \ libffi-dev \ libssl-dev \ && echo "coverage done" # python RUN apt-get install -y \ python3 \ python3-setuptools \ python3-pip \ && pip3 install setuptools-rust \ && pip3 install --upgrade pip \ && pip3 install \ requests[security] \ pyopenssl \ ndg-httpsclient \ pyasn1 \ cpp-coveralls \ && echo "python done" # cmany RUN ( \ set -xe ; \ cd /tmp ; \ git clone --recursive https://github.com/biojppm/cmany -b dev ; \ pip install ./cmany \ ) \ && echo "cmany done" # valgrind RUN apt-get install -y valgrind \ && echo "valgrind done" # helper to install compiler versions, etc ADD c4core-install /usr/bin/c4core-install ## actions/checkout@v4 needs a different version of nodejs: ## node 18 and 20 failed with this: ## error:node: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.28' not found (required by node) #RUN cd /tmp \ # && git clone --recursive https://github.com/nodejs/node --branch v20.12.1 \ # && cd node \ # && /usr/bin/c4core-install g++-10 \ # && env CXX=g++-10 ./configure \ # && make -j `nproc` \ # && make install \ # && cd .. \ # && rm -rf node ## actions/checkout@v4 needs a different version of nodejs: ## node 18 and 20 failed with this: ## error:node: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.28' not found (required by node) ## see https://tecadmin.net/how-to-install-nvm-on-ubuntu-20-04/ ## see https://stackoverflow.com/questions/25899912/how-to-install-nvm-in-docker ## /usr/local/nvm or ~/.nvm , depending #ENV NVM_DIR /usr/local/nvm ##ENV NVM_DIR ~/.nvm #ENV NODE_VERSION 20.12.2 #ENV NODE_PATH $NVM_DIR/versions/node/v$NODE_VERSION/lib/node_modules #ENV PATH $NVM_DIR/versions/node/v$NODE_VERSION/bin:$PATH #SHELL ["/bin/bash", "--login", "-i", "-c"] # https://stackoverflow.com/questions/25899912/how-to-install-nvm-in-docker/60137919#60137919 #RUN mkdir $NVM_DIR \ # && curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.35.2/install.sh | bash \ # && whoami \ # && echo "NVM_DIR=$NVM_DIR" \ # && . $NVM_DIR/nvm.sh \ # && nvm install $NODE_VERSION \ # && nvm alias default $NODE_VERSION \ # && nvm use default \ # # node 20 doesn't work because it requires glib-2.28 # #&& set -x \ # #&& which node \ # #&& `which node` --version \ # #&& node --version # ## ## so install glibc-2.28! ## #RUN echo "glibc-2.28" \ # && apt install -y gawk \ # && cd /tmp \ # && wget -c https://ftp.gnu.org/gnu/glibc/glibc-2.28.tar.gz \ # && tar -zxf glibc-2.28.tar.gz \ # && cd glibc-2.28 \ # && ../configure --prefix=/opt/glibc-2.28 \ # && make -j `nproc` \ # && make install \ # && cd .. \ # && rm -fr glibc-2.28 glibc-2.28.tar.gz ## ## Patch the installed Node 20 to work with /opt/glibc-2.28 instead: ## #RUN echo "patching node to use glibc 2.28" \ # && apt install -y patchelf \ # && patchelf --set-interpreter \ # #&& /opt/glibc-2.28/lib/ld-linux-x86_64.so.2 --set-rpath /opt/glibc-2.28/lib/:/lib/aarch64-linux-gnu/:/usr/lib/aarch64-linux-gnu/ /usr/local/bin/node # Standard Cleanup on Debian images RUN apt-get -y clean \ && apt-get -y autoclean \ && apt-get -y autoremove \ && rm -rf /var/lib/apt/lists/* \ && rm -rf /var/cache/debconf/*-old \ && rm -rf /usr/share/doc/* \ && rm -rf /usr/share/man/?? \ && rm -rf /usr/share/man/??_* \ && echo "cleanup done" c4core-0.2.6/.github/docker/ubuntu18.04/c4core-install000077500000000000000000000347171477602032300222130ustar00rootroot00000000000000#!/bin/bash -x script=$0 what=${1:-all} case $what in all) $script gcc-all $script clang-all $script embedded ;; gcc-all) $script gcc-4.8 $script gcc-4.9 $script gcc-5 $script gcc-6 $script gcc-7 $script gcc-8 $script gcc-9 $script gcc-10 $script gcc-11 #$script gcc-12 #not available in ubuntu 18.04 $script gcc-13 $script gcc-14 ;; clang-all) $script clang-18 $script clang-17 $script clang-16 $script clang-15 $script clang-14 $script clang-13 $script clang-12 $script clang-11 $script clang-10 $script clang-9 $script clang-8 $script clang-7 $script clang-6.0 $script clang-5.0 $script clang-4.0 $script clang-3.9 ;; embedded) $script arm-none-eabi $script arm-linux-gnueabihf $script qemu ;; g++-4.8|gcc-4.8) apt-get update apt-get install -y \ cpp-4.8 gcc-4.8 gcc-4.8-multilib g++-4.8 g++-4.8-multilib libstdc++-4.8-dev lib32stdc++-4.8-dev ;; g++-4.9|gcc-4.9) apt-get update apt-get install -y \ wget \ software-properties-common #apt-add-repository --yes --no-update ppa:ubuntu-toolchain-r/test apt-add-repository --yes --no-update "deb http://dk.archive.ubuntu.com/ubuntu/ xenial main" apt-add-repository --yes --no-update "deb http://dk.archive.ubuntu.com/ubuntu/ xenial universe" wget -O /tmp/libmpfr4_3.1.4-1_amd64.deb http://security.ubuntu.com/ubuntu/pool/main/m/mpfr4/libmpfr4_3.1.4-1_amd64.deb dpkg -i /tmp/libmpfr4_3.1.4-1_amd64.deb apt-get update apt-get install -y \ cpp-4.9 gcc-4.9 gcc-4.9-multilib g++-4.9 libstdc++-4.9-dev lib32stdc++-4.9-dev ;; g++-5|gcc-5) apt-get update apt-get install -y \ cpp-5 gcc-5 g++-5 g++-5-multilib libstdc++-5-dev lib32stdc++-5-dev ;; g++-6|gcc-6) apt-get update apt-get install -y \ cpp-6 gcc-6 g++-6 g++-6-multilib libstdc++-6-dev lib32stdc++-6-dev ;; g++-7|gcc-7) apt-get update apt-get install -y \ cpp-7 gcc-7 g++-7 g++-7-multilib libstdc++-7-dev lib32stdc++-7-dev ;; g++-8|gcc-8) apt-get update apt-get install -y \ cpp-8 gcc-8 g++-8 g++-8-multilib libstdc++-8-dev lib32stdc++-8-dev ;; g++-9|gcc-9) apt-get update apt-get install -y \ software-properties-common apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 6AF7F09730B3F0A4 apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 40976EAF437D05B5 apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32 apt-add-repository --yes --no-update ppa:ubuntu-toolchain-r/test apt-get update apt-get install -y \ cpp-9 gcc-9 g++-9 g++-9-multilib libstdc++-9-dev lib32stdc++-9-dev ;; g++-10|gcc-10) apt-get update apt-get install -y \ software-properties-common apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 6AF7F09730B3F0A4 apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 40976EAF437D05B5 apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32 apt-add-repository --yes --no-update ppa:ubuntu-toolchain-r/test apt-get update apt-get install -y \ cpp-10 gcc-10 g++-10 g++-10-multilib libstdc++-10-dev lib32stdc++-10-dev ;; g++-11|gcc-11) apt-get update apt-get install -y \ software-properties-common apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 6AF7F09730B3F0A4 apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 40976EAF437D05B5 apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32 apt-add-repository --yes --no-update ppa:ubuntu-toolchain-r/test apt-get update apt-get install -y \ cpp-11 gcc-11 g++-11 g++-11-multilib libstdc++-11-dev lib32stdc++-11-dev ;; #not available in ubuntu18.04 #g++-12|gcc-12) # apt-get update # apt-get install -y \ # software-properties-common # apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 6AF7F09730B3F0A4 # apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 40976EAF437D05B5 # apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32 # apt-add-repository --yes --no-update ppa:ubuntu-toolchain-r/test # apt-get update # apt-get install -y \ # cpp-12 gcc-12 g++-12 g++-12-multilib libstdc++-12-dev lib32stdc++-12-dev # ;; g++-13|gcc-13) apt-get update apt-get install -y \ software-properties-common apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 6AF7F09730B3F0A4 apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 40976EAF437D05B5 apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32 apt-add-repository --yes --no-update ppa:ubuntu-toolchain-r/test apt-get update apt-get install -y \ cpp-13 gcc-13 g++-13 g++-13-multilib libstdc++-13-dev lib32stdc++-13-dev ;; g++-14|gcc-14) apt-get update apt-get install -y \ wget \ software-properties-common apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 6AF7F09730B3F0A4 apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32 apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 6AF7F09730B3F0A4 apt-add-repository --yes --no-update "deb http://dk.archive.ubuntu.com/ubuntu/ noble main" apt-add-repository --yes --no-update "deb http://dk.archive.ubuntu.com/ubuntu/ noble universe" apt-get update apt-get install -y \ cpp-14 gcc-14 g++-14 g++-14-multilib libstdc++-14-dev lib32stdc++-14-dev ;; clang++-3.9|clang-3.9) apt-get update apt-get install -y \ software-properties-common apt-add-repository --yes --no-update ppa:ubuntu-toolchain-r/test apt-get update apt-get install -y \ clang-3.9 clang-tidy-3.9 ;; clang++-4.0|clang-4.0) apt-get update apt-get install -y \ software-properties-common apt-add-repository --yes --no-update ppa:ubuntu-toolchain-r/test apt-get update apt-get install -y \ clang-4.0 clang-tidy-4.0 ;; clang++-5.0|clang-5.0) apt-get update apt-get install -y \ software-properties-common apt-add-repository --yes --no-update ppa:ubuntu-toolchain-r/test apt-get update apt-get install -y \ clang-5.0 clang-tidy-5.0 ;; clang++-6.0|clang-6.0) # this is the default in 18.04 apt-get update apt-get install -y \ clang-6.0 clang-tidy-6.0 ;; clang++-7|clang-7) apt-get update apt-get install -y \ clang-7 clang-tidy-7 ;; clang++-8|clang-8) apt-get update apt-get install -y \ clang-8 clang-tidy-8 ;; clang++-9|clang-9) #apt-get update #apt-get install -y \ # wget \ # software-properties-common #wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key 2>/dev/null | apt-key add - #apt-add-repository --yes --no-update "deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-9 main" apt-get update apt-get install -y \ clang-9 clang-tidy-9 ;; clang++-10|clang-10) #apt-get update #apt-get install -y \ # wget \ # software-properties-common #wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key 2>/dev/null | apt-key add - #apt-add-repository --yes --no-update "deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-10 main" apt-get update apt-get install -y \ clang-10 clang-tidy-10 ;; clang++-11|clang-11) apt-get update apt-get install -y \ wget \ software-properties-common wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key 2>/dev/null | apt-key add - apt-add-repository --yes --no-update "deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-11 main" apt-get update apt-get install -y \ clang-11 clang-tidy-11 ;; clang++-12|clang-12) apt-get update apt-get install -y \ wget \ software-properties-common wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key 2>/dev/null | apt-key add - apt-add-repository --yes --no-update "deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-12 main" apt-get update apt-get install -y \ clang-12 clang-tidy-12 ;; clang++-13|clang-13) apt-get update apt-get install -y \ wget \ software-properties-common wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key 2>/dev/null | apt-key add - apt-add-repository --yes --no-update "deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-13 main" apt-get update apt-get install -y \ clang-13 clang-tidy-13 ;; clang++-14|clang-14) apt-get update apt-get install -y \ wget \ software-properties-common wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key 2>/dev/null | apt-key add - apt-add-repository --yes --no-update "deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-14 main" apt-get update apt-get install -y \ clang-14 clang-tidy-14 ;; clang++-15|clang-15) apt-get update apt-get install -y \ wget \ software-properties-common wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key 2>/dev/null | apt-key add - apt-add-repository --yes --no-update "deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-15 main" apt-get update apt-get install -y \ clang-15 clang-tidy-15 ;; clang++-16|clang-16) apt-get update apt-get install -y \ wget \ software-properties-common wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key 2>/dev/null | apt-key add - apt-add-repository --yes --no-update ppa:ubuntu-toolchain-r/test apt-add-repository --yes --no-update "deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-16 main" apt-get update apt-get install -y \ clang-16 clang-tidy-16 ;; clang++-17|clang-17) apt-get update apt-get install -y \ wget \ software-properties-common wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key 2>/dev/null | apt-key add - apt-add-repository --yes --no-update ppa:ubuntu-toolchain-r/test apt-add-repository --yes --no-update "deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-17 main" apt-get update apt-get install -y \ clang-17 clang-tidy-17 ;; clang++-18|clang-18) apt-get update apt-get install -y \ wget \ software-properties-common wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key 2>/dev/null | apt-key add - apt-add-repository --yes --no-update ppa:ubuntu-toolchain-r/test apt-add-repository --yes --no-update "deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-18 main" apt-get update apt-get install -y \ clang-18 clang-tidy-18 ;; arm-none-eabi) # taken from: https://askubuntu.com/questions/1243252/how-to-install-arm-none-eabi-gdb-on-ubuntu-20-04-lts-focal-fossa/1371525#1371525 apt-get update apt-get install -y \ wget echo "Creating gcc-arm-none-eabi debian package" set -xe ver=10.3-2021.10 longver=15:10.3-2021.10-9 name=/tmp/gcc-arm-none-eabi-$ver rm -rf /tmp/gcc-arm-none-eabi-$ver* echo "Downloading..." wget --no-check-certificate -nv -O $name.tar "https://developer.arm.com/-/media/Files/downloads/gnu-rm/$ver/gcc-arm-none-eabi-$ver-x86_64-linux.tar.bz2" echo "Extracting..." ( cd /tmp ; tar -xf $name.tar ) rm -f $name.tar echo "Generating debian package..." mkdir -p $name-dpkg/DEBIAN mkdir -p $name-dpkg/usr echo "Package: gcc-arm-none-eabi" >> $name-dpkg/DEBIAN/control echo "Version: $longver" >> $name-dpkg/DEBIAN/control echo "Architecture: amd64" >> $name-dpkg/DEBIAN/control echo "Maintainer: maintainer" >> $name-dpkg/DEBIAN/control echo "Description: Arm Embedded toolchain" >> $name-dpkg/DEBIAN/control cat $name-dpkg/DEBIAN/control mv -f $name/* $name-dpkg/usr/ echo "Building debian package..." dpkg-deb --build --root-owner-group $name-dpkg mv -v $name-dpkg.deb $name.deb dpkg -i $name.deb echo "Testing install..." arm-none-eabi-gcc --version arm-none-eabi-g++ --version ;; arm-linux-gnueabihf) apt-get update apt-get install -y \ gcc-arm-linux-gnueabihf \ g++-arm-linux-gnueabihf ;; qemu) apt-get update apt-get install -y \ qemu ;; mingw) apt-get update apt-get install -y \ gcc-mingw-w64-x86-64 \ g++-mingw-w64-x86-64 \ mingw-w64 \ mingw-w64-x86-64-dev \ mingw-w64-tools update-alternatives --set x86_64-w64-mingw32-gcc /usr/bin/x86_64-w64-mingw32-gcc-posix update-alternatives --set x86_64-w64-mingw32-g++ /usr/bin/x86_64-w64-mingw32-g++-posix ;; wine) apt-get update apt-get install -y wine # run exe with env WINEPATH="/usr/lib/gcc/x86_64-w64-mingw32/7.3-win32;/usr/x86_64-w64-mingw32/lib" wine exe ;; *) echo "unknown package: $what" exit 1 ;; esac c4core-0.2.6/.github/docker/ubuntu22.04/000077500000000000000000000000001477602032300174215ustar00rootroot00000000000000c4core-0.2.6/.github/docker/ubuntu22.04/Dockerfile000066400000000000000000000051021477602032300214110ustar00rootroot00000000000000ARG EMSCRIPTEN_VERSION=latest FROM ubuntu:22.04 FROM emscripten/emsdk:$EMSCRIPTEN_VERSION LABEL org.opencontainers.image.source=https://github.com/biojppm/c4core LABEL org.opencontainers.image.description="C++ build testing: gcc9-gcc12, clang9-clang16, arm-eabi-none, swig, emscripten" LABEL org.opencontainers.image.licenses=MIT LABEL maintainer=dev@jpmag.me LABEL version=1.2 SHELL ["/bin/bash", "-c"] RUN apt-get update \ && apt-get install -y \ apt-utils \ ca-certificates \ lsb-core \ gnupg \ software-properties-common \ wget \ curl \ sudo \ git \ build-essential \ swig \ musl-dev \ && \ echo "basics done" # cmake RUN wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | apt-key add - \ && wget -O /tmp/libssl1.1_1.1.1f-1ubuntu2_amd64.deb http://archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2_amd64.deb \ && dpkg -i /tmp/libssl1.1_1.1.1f-1ubuntu2_amd64.deb \ && apt-add-repository --yes --no-update "deb https://apt.kitware.com/ubuntu/ bionic main" \ && apt-get update \ && apt-get install -y \ cmake \ ninja-build \ && echo "cmake done" # 32 bit requirements RUN dpkg --add-architecture i386 \ && apt-get update \ && apt-get install -y \ linux-libc-dev:i386 \ libc6:i386 \ libc6-dev:i386 \ libc6-dbg:i386 \ g++-multilib \ && echo "32bit done" # libc++ RUN apt-get install -y \ clang \ libc++1 \ libc++abi-dev \ libc++-dev \ && echo "libc++ done" # coverage RUN apt-get install -y \ lcov \ libffi-dev \ libssl-dev \ && echo "coverage done" # python RUN apt-get install -y \ python3 \ python3-setuptools \ python3-pip \ && pip3 install setuptools-rust \ && pip3 install --upgrade pip \ && pip3 install \ requests[security] \ pyopenssl \ ndg-httpsclient \ pyasn1 \ cpp-coveralls \ && echo "python done" # cmany RUN ( \ cd /tmp ; \ git clone --recursive https://github.com/biojppm/cmany -b dev ; \ pip install ./cmany \ ) \ && echo "cmany done" # valgrind RUN apt-get install -y valgrind \ && echo "valgrind done" ADD c4core-install /usr/bin/c4core-install RUN \ # Standard Cleanup on Debian images apt-get -y clean \ && apt-get -y autoclean \ && apt-get -y autoremove \ && rm -rf /var/lib/apt/lists/* \ && rm -rf /var/cache/debconf/*-old \ && rm -rf /usr/share/doc/* \ && rm -rf /usr/share/man/?? \ && rm -rf /usr/share/man/??_* \ && echo "cleanup done" c4core-0.2.6/.github/docker/ubuntu22.04/c4core-install000077500000000000000000000310761477602032300222010ustar00rootroot00000000000000#!/bin/bash -x script=$0 what=${1:-all} case $what in all) $script gcc-all $script clang-all $script embedded ;; gcc-all) $script gcc-4.8 $script gcc-4.9 $script gcc-5 $script gcc-6 #$script gcc-7 #$script gcc-8 $script gcc-9 $script gcc-10 $script gcc-11 $script gcc-12 $script gcc-13 $script gcc-14 ;; clang-all) $script clang-19 $script clang-18 $script clang-17 $script clang-16 $script clang-15 $script clang-14 $script clang-13 $script clang-12 $script clang-11 $script clang-10 $script clang-9 #$script clang-8 #$script clang-7 #$script clang-6.0 #$script clang-5.0 #$script clang-4.0 #$script clang-3.9 ;; embedded) $script arm-none-eabi $script arm-linux-gnueabihf $script qemu ;; g++-4.8|gcc-4.8) apt-get update apt-get install -y \ software-properties-common apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32 apt-add-repository --yes --no-update "deb http://dk.archive.ubuntu.com/ubuntu/ bionic main" apt-add-repository --yes --no-update "deb http://dk.archive.ubuntu.com/ubuntu/ bionic universe" apt-get update apt-get install -y \ cpp-4.8 gcc-4.8 g++-4.8 libstdc++-4.8-dev ;; g++-4.9|gcc-4.9) apt-get update apt-get install -y \ wget \ software-properties-common apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32 apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 6AF7F09730B3F0A4 apt-add-repository --yes --no-update "deb http://dk.archive.ubuntu.com/ubuntu/ xenial main" apt-add-repository --yes --no-update "deb http://dk.archive.ubuntu.com/ubuntu/ xenial universe" apt-get update apt-get install -y \ cpp-4.9 gcc-4.9 g++-4.9 libstdc++-4.9-dev ;; g++-5|gcc-5) apt-get update apt-get install -y \ wget \ software-properties-common apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32 apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 6AF7F09730B3F0A4 apt-add-repository --yes --no-update "deb http://dk.archive.ubuntu.com/ubuntu/ xenial main" apt-add-repository --yes --no-update "deb http://dk.archive.ubuntu.com/ubuntu/ xenial universe" apt-get update apt-get install -y \ cpp-5 gcc-5 g++-5 libstdc++-5-dev ;; g++-6|gcc-6) apt-get update apt-get install -y \ wget \ software-properties-common apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32 apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 6AF7F09730B3F0A4 apt-add-repository --yes --no-update "deb http://dk.archive.ubuntu.com/ubuntu/ bionic main" apt-add-repository --yes --no-update "deb http://dk.archive.ubuntu.com/ubuntu/ bionic universe" apt-get update apt-get install -y \ cpp-6 gcc-6 g++-6 libstdc++-6-dev ;; #gcc-7) # ;; #gcc-8) # ;; g++-9|gcc-9) apt-get update apt-get install -y \ cpp-9 gcc-9 g++-9 g++-9-multilib libstdc++-9-dev lib32stdc++-9-dev ;; g++-10|gcc-10) apt-get update apt-get install -y \ cpp-10 gcc-10 g++-10 g++-10-multilib libstdc++-10-dev lib32stdc++-10-dev ;; g++-11|gcc-11) apt-get update apt-get install -y \ cpp-11 gcc-11 g++-11 g++-11-multilib libstdc++-11-dev lib32stdc++-11-dev ;; g++-12|gcc-12) apt-get update apt-get install -y \ cpp-12 gcc-12 g++-12 g++-12-multilib libstdc++-12-dev lib32stdc++-12-dev ;; g++-13|gcc-13) apt-get update apt-get install -y \ wget \ software-properties-common apt-add-repository --yes --no-update ppa:ubuntu-toolchain-r/test apt-get update apt-get install -y \ cpp-13 gcc-13 g++-13 g++-13-multilib libstdc++-13-dev lib32stdc++-13-dev ;; g++-14|gcc-14) apt-get update apt-get install -y \ wget \ software-properties-common apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32 apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 6AF7F09730B3F0A4 apt-add-repository --yes --no-update "deb http://dk.archive.ubuntu.com/ubuntu/ noble main" apt-add-repository --yes --no-update "deb http://dk.archive.ubuntu.com/ubuntu/ noble universe" apt-get update apt-get install -y \ cpp-14 gcc-14 g++-14 g++-14-multilib libstdc++-14-dev lib32stdc++-14-dev ;; #clang++-3.9|clang-3.9) # apt-get update # apt-get install -y \ # software-properties-common # apt-add-repository --yes --no-update ppa:ubuntu-toolchain-r/test # apt-get update # apt-get install -y \ # clang-3.9 clang-tidy-3.9 # ;; #clang++-4.0|clang-4.0) # apt-get update # apt-get install -y \ # software-properties-common # apt-add-repository --yes --no-update ppa:ubuntu-toolchain-r/test # apt-get update # apt-get install -y \ # clang-4.0 clang-tidy-4.0 # ;; #clang++-5.0|clang-5.0) # apt-get update # apt-get install -y \ # software-properties-common # apt-add-repository --yes --no-update ppa:ubuntu-toolchain-r/test # apt-get update # apt-get install -y \ # clang-5.0 clang-tidy-5.0 # ;; #clang++-6.0|clang-6.0) # apt-get update # apt-get install -y \ # clang-6.0 clang-tidy-6.0 # ;; #clang++-7|clang-7) # apt-get update # apt-get install -y \ # clang-7 clang-tidy-7 # ;; #clang++-8|clang-8) # apt-get update # apt-get install -y \ # clang-8 clang-tidy-8 # ;; clang++-9|clang-9) apt-get update apt-get install -y \ wget \ software-properties-common wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key 2>/dev/null | apt-key add - apt-add-repository --yes --no-update "deb http://apt.llvm.org/focal/ llvm-toolchain-focal-9 main" apt-get update apt-get install -y \ clang-9 clang-tidy-9 ;; clang++-10|clang-10) apt-get update apt-get install -y \ wget \ software-properties-common wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key 2>/dev/null | apt-key add - apt-add-repository --yes --no-update "deb http://apt.llvm.org/focal/ llvm-toolchain-focal-10 main" apt-get update apt-get install -y \ clang-10 clang-tidy-10 ;; clang++-11|clang-11) apt-get update apt-get install -y \ clang-11 clang-tidy-11 ;; clang++-12|clang-12) apt-get update apt-get install -y \ clang-12 clang-tidy-12 ;; clang++-13|clang-13) apt-get update apt-get install -y \ clang-13 clang-tidy-13 ;; clang++-14|clang-14) apt-get update apt-get install -y \ clang-14 clang-tidy-14 ;; clang++-15|clang-15) apt-get update apt-get install -y \ wget \ software-properties-common wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key 2>/dev/null | apt-key add - apt-add-repository --yes --no-update "deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-15 main" apt-get update apt-get install -y \ clang-15 clang-tidy-15 ;; clang++-16|clang-16) apt-get update apt-get install -y \ wget \ software-properties-common wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key 2>/dev/null | apt-key add - apt-add-repository --yes --no-update ppa:ubuntu-toolchain-r/test apt-add-repository --yes --no-update "deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-16 main" apt-get update apt-get install -y \ clang-16 clang-tidy-16 ;; clang++-17|clang-17) apt-get update apt-get install -y \ wget \ software-properties-common wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key 2>/dev/null | apt-key add - apt-add-repository --yes --no-update ppa:ubuntu-toolchain-r/test apt-add-repository --yes --no-update "deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-17 main" apt-get update apt-get install -y \ clang-17 clang-tidy-17 ;; clang++-18|clang-18) apt-get update apt-get install -y \ wget \ software-properties-common wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key 2>/dev/null | apt-key add - apt-add-repository --yes --no-update ppa:ubuntu-toolchain-r/test apt-add-repository --yes --no-update "deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-18 main" apt-get update apt-get install -y \ clang-18 clang-tidy-18 ;; clang++-19|clang-19) apt-get update apt-get install -y \ wget \ software-properties-common wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key 2>/dev/null | apt-key add - apt-add-repository --yes --no-update ppa:ubuntu-toolchain-r/test apt-add-repository --yes --no-update "deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-19 main" apt-get update apt-get install -y \ clang-19 clang-tidy-19 ;; arm-none-eabi) # taken from: https://askubuntu.com/questions/1243252/how-to-install-arm-none-eabi-gdb-on-ubuntu-20-04-lts-focal-fossa/1371525#1371525 apt-get update apt-get install -y \ wget echo "Creating gcc-arm-none-eabi debian package" set -xe ver=10.3-2021.10 longver=15:10.3-2021.10-9 name=/tmp/gcc-arm-none-eabi-$ver rm -rf /tmp/gcc-arm-none-eabi-$ver* echo "Downloading..." wget --no-check-certificate -nv -O $name.tar "https://developer.arm.com/-/media/Files/downloads/gnu-rm/$ver/gcc-arm-none-eabi-$ver-x86_64-linux.tar.bz2" echo "Extracting..." ( cd /tmp ; tar -xf $name.tar ) rm -f $name.tar echo "Generating debian package..." mkdir -p $name-dpkg/DEBIAN mkdir -p $name-dpkg/usr echo "Package: gcc-arm-none-eabi" >> $name-dpkg/DEBIAN/control echo "Version: $longver" >> $name-dpkg/DEBIAN/control echo "Architecture: amd64" >> $name-dpkg/DEBIAN/control echo "Maintainer: maintainer" >> $name-dpkg/DEBIAN/control echo "Description: Arm Embedded toolchain" >> $name-dpkg/DEBIAN/control cat $name-dpkg/DEBIAN/control mv -f $name/* $name-dpkg/usr/ echo "Building debian package..." dpkg-deb --build --root-owner-group $name-dpkg mv -v $name-dpkg.deb $name.deb dpkg -i $name.deb echo "Testing install..." arm-none-eabi-gcc --version arm-none-eabi-g++ --version ;; arm-linux-gnueabihf) apt-get update apt-get install -y \ gcc-arm-linux-gnueabihf \ g++-arm-linux-gnueabihf ;; qemu) apt-get update apt-get install -y \ qemu ;; mingw) apt-get update apt-get install -y \ gcc-mingw-w64-x86-64 \ g++-mingw-w64-x86-64 \ mingw-w64 \ mingw-w64-x86-64-dev \ mingw-w64-tools update-alternatives --set x86_64-w64-mingw32-gcc /usr/bin/x86_64-w64-mingw32-gcc-posix update-alternatives --set x86_64-w64-mingw32-g++ /usr/bin/x86_64-w64-mingw32-g++-posix ;; wine) apt-get update apt-get install -y wine # run exe with env WINEPATH="/usr/lib/gcc/x86_64-w64-mingw32/7.3-win32;/usr/x86_64-w64-mingw32/lib" wine exe ;; *) echo "unknown package: $what" exit 1 ;; esac c4core-0.2.6/.github/docker/ubuntu24.04/000077500000000000000000000000001477602032300174235ustar00rootroot00000000000000c4core-0.2.6/.github/docker/ubuntu24.04/Dockerfile000066400000000000000000000041111477602032300214120ustar00rootroot00000000000000ARG EMSCRIPTEN_VERSION=latest FROM ubuntu:24.04 FROM emscripten/emsdk:$EMSCRIPTEN_VERSION LABEL org.opencontainers.image.source=https://github.com/biojppm/c4core LABEL org.opencontainers.image.description="C++ build testing: gcc, clang, arm-eabi-none, swig, emscripten" LABEL org.opencontainers.image.licenses=MIT LABEL maintainer=dev@jpmag.me LABEL version=1.2 SHELL ["/bin/bash", "-c"] RUN apt-get update \ && apt-get install -y \ apt-utils \ ca-certificates \ lsb-core \ gnupg \ software-properties-common \ wget \ curl \ sudo \ git \ build-essential \ cmake \ swig \ musl-dev \ && \ echo "basics done" # 32 bit requirements RUN dpkg --add-architecture i386 \ && apt-get update \ && apt-get install -y \ linux-libc-dev:i386 \ libc6:i386 \ libc6-dev:i386 \ libc6-dbg:i386 \ g++-multilib \ && echo "32bit done" # libc++ RUN apt-get install -y \ clang \ libc++1 \ libc++abi-dev \ libc++-dev \ && echo "libc++ done" # coverage RUN apt-get install -y \ lcov \ libffi-dev \ libssl-dev \ && echo "coverage done" # python RUN apt-get install -y \ python3 \ python3-setuptools \ python3-pip \ && pip3 install setuptools-rust \ && pip3 install --upgrade pip \ && pip3 install \ requests[security] \ pyopenssl \ ndg-httpsclient \ pyasn1 \ cpp-coveralls \ && echo "python done" # cmany RUN ( \ cd /tmp ; \ git clone --recursive https://github.com/biojppm/cmany -b dev ; \ pip install ./cmany \ ) \ && echo "cmany done" # valgrind RUN apt-get install -y valgrind \ && echo "valgrind done" ADD c4core-install /usr/bin/c4core-install RUN \ # Standard Cleanup on Debian images apt-get -y clean \ && apt-get -y autoclean \ && apt-get -y autoremove \ && rm -rf /var/lib/apt/lists/* \ && rm -rf /var/cache/debconf/*-old \ && rm -rf /usr/share/doc/* \ && rm -rf /usr/share/man/?? \ && rm -rf /usr/share/man/??_* \ && echo "cleanup done" c4core-0.2.6/.github/docker/ubuntu24.04/c4core-install000077500000000000000000000344321477602032300222020ustar00rootroot00000000000000#!/bin/bash -xe script=$0 what=${1:-all} case $what in all) $script gcc-all $script clang-all $script embedded ;; gcc-all) $script gcc-14 $script gcc-13 $script gcc-12 $script gcc-11 $script gcc-10 $script gcc-9 $script gcc-8 $script gcc-7 $script gcc-6 $script gcc-5 $script gcc-4.9 $script gcc-4.8 ;; clang-all) $script clang-19 $script clang-18 $script clang-17 $script clang-16 $script clang-15 $script clang-14 #$script clang-13 #$script clang-12 #$script clang-11 #$script clang-10 #$script clang-9 #$script clang-8 #$script clang-7 #$script clang-6.0 #$script clang-5.0 $script clang-4.0 $script clang-3.9 ;; embedded) $script arm-none-eabi $script arm-linux-gnueabihf $script qemu ;; g++-4.8|gcc-4.8|gcc4.8) apt-get update apt-get install -y \ software-properties-common apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32 apt-add-repository --yes --no-update "deb http://dk.archive.ubuntu.com/ubuntu/ bionic main" apt-add-repository --yes --no-update "deb http://dk.archive.ubuntu.com/ubuntu/ bionic universe" apt-get update apt-get install -y \ cpp-4.8 gcc-4.8 g++-4.8 libstdc++-4.8-dev gcc-4.8 --version g++-4.8 --version ;; g++-4.9|gcc-4.9|gcc4.9) apt-get update apt-get install -y \ wget \ software-properties-common apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32 apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 6AF7F09730B3F0A4 apt-add-repository --yes --no-update "deb http://dk.archive.ubuntu.com/ubuntu/ xenial main" apt-add-repository --yes --no-update "deb http://dk.archive.ubuntu.com/ubuntu/ xenial universe" apt-get update apt-get install -y \ cpp-4.9 gcc-4.9 g++-4.9 libstdc++-4.9-dev gcc-4.9 --version g++-4.9 --version ;; g++-5|gcc-5|gcc5) apt-get update apt-get install -y \ wget \ software-properties-common apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32 apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 6AF7F09730B3F0A4 apt-add-repository --yes --no-update "deb http://dk.archive.ubuntu.com/ubuntu/ xenial main" apt-add-repository --yes --no-update "deb http://dk.archive.ubuntu.com/ubuntu/ xenial universe" apt-get update apt-get install -y \ cpp-5 gcc-5 g++-5 libstdc++-5-dev gcc-5 --version g++-5 --version ;; g++-6|gcc-6) apt-get update apt-get install -y \ wget \ software-properties-common apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32 apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 6AF7F09730B3F0A4 apt-add-repository --yes --no-update "deb http://dk.archive.ubuntu.com/ubuntu/ bionic main" apt-add-repository --yes --no-update "deb http://dk.archive.ubuntu.com/ubuntu/ bionic universe" apt-get update apt-get install -y \ cpp-6 gcc-6 g++-6 libstdc++-6-dev gcc-6 --version g++-6 --version ;; gcc-7) apt-get update apt-get install -y \ wget \ software-properties-common apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32 apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 6AF7F09730B3F0A4 apt-add-repository --yes --no-update "deb http://dk.archive.ubuntu.com/ubuntu/ bionic main" apt-add-repository --yes --no-update "deb http://dk.archive.ubuntu.com/ubuntu/ bionic universe" apt-get update apt-get install -y \ cpp-7 gcc-7 g++-7 libstdc++-7-dev gcc-7 --version g++-7 --version ;; gcc-8) apt-get update apt-get install -y \ wget \ software-properties-common apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32 apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 6AF7F09730B3F0A4 apt-add-repository --yes --no-update "deb http://dk.archive.ubuntu.com/ubuntu/ bionic main" apt-add-repository --yes --no-update "deb http://dk.archive.ubuntu.com/ubuntu/ bionic universe" apt-get update apt-get install -y \ cpp-8 gcc-8 g++-8 libstdc++-8-dev gcc-8 --version g++-8 --version ;; g++-9|gcc-9) apt-get update apt-get install -y \ wget \ software-properties-common add-apt-repository --yes --no-update ppa:ubuntu-toolchain-r/ppa apt-get update apt-get install -y \ cpp-9 gcc-9 g++-9 g++-9-multilib libstdc++-9-dev lib32stdc++-9-dev gcc-9 --version g++-9 --version ;; g++-10|gcc-10) apt-get update apt-get install -y \ wget \ software-properties-common add-apt-repository --yes --no-update ppa:ubuntu-toolchain-r/ppa apt-get update apt-get install -y \ cpp-10 gcc-10 g++-10 g++-10-multilib libstdc++-10-dev lib32stdc++-10-dev gcc-10 --version g++-10 --version ;; g++-11|gcc-11) apt-get update apt-get install -y \ wget \ software-properties-common add-apt-repository --yes --no-update ppa:ubuntu-toolchain-r/ppa apt-get update apt-get install -y \ cpp-11 gcc-11 g++-11 g++-11-multilib libstdc++-11-dev lib32stdc++-11-dev gcc-11 --version g++-11 --version ;; g++-12|gcc-12) apt-get update apt-get install -y \ cpp-12 gcc-12 g++-12 g++-12-multilib libstdc++-12-dev lib32stdc++-12-dev gcc-12 --version g++-12 --version ;; g++-13|gcc-13) apt-get update apt-get install -y \ cpp-13 gcc-13 g++-13 g++-13-multilib libstdc++-13-dev lib32stdc++-13-dev gcc-13 --version g++-13 --version ;; g++-14|gcc-14) apt-get update apt-get install -y \ cpp-14 gcc-14 g++-14 g++-14-multilib libstdc++-14-dev lib32stdc++-14-dev gcc-14 --version g++-14 --version ;; clang++-3.9|clang-3.9) apt-get update apt-get install -y \ software-properties-common apt-add-repository --yes --no-update ppa:ubuntu-toolchain-r/test apt-get update apt-get install -y \ clang-3.9 clang-tidy-3.9 clang-3.9 --version clang++-3.9 --version ;; clang++-4.0|clang-4.0) apt-get update apt-get install -y \ software-properties-common apt-add-repository --yes --no-update ppa:ubuntu-toolchain-r/test apt-get update apt-get install -y \ clang-4.0 clang-tidy-4.0 clang-4.0 --version clang++-4.0 --version ;; #clang++-5.0|clang-5.0) # apt-get update # apt-get install -y \ # software-properties-common # apt-add-repository --yes --no-update ppa:ubuntu-toolchain-r/test # apt-get update # apt-get install -y \ # clang-5.0 clang-tidy-5.0 # clang-5.0 --version # clang++-5.0 --version # ;; #clang++-6.0|clang-6.0) # apt-get update # apt-get install -y \ # wget \ # software-properties-common # wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key 2>/dev/null | apt-key add - # apt-add-repository --yes --no-update "deb http://apt.llvm.org/focal/ llvm-toolchain-focal main" # apt-get update # apt-get install -y \ # clang-6.0 clang-tidy-6.0 # clang-6.0 --version # clang++-6.0 --version # ;; #clang++-7|clang-7) # apt-get update # apt-get install -y \ # wget \ # software-properties-common # wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key 2>/dev/null | apt-key add - # apt-add-repository --yes --no-update "deb http://apt.llvm.org/focal/ llvm-toolchain-focal main" # apt-get update # apt-get install -y \ # clang-7 clang-tidy-7 # clang-7 --version # clang++-7 --version # ;; #clang++-8|clang-8) # apt-get update # apt-get install -y \ # wget \ # software-properties-common # wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key 2>/dev/null | apt-key add - # apt-add-repository --yes --no-update "deb http://apt.llvm.org/focal/ llvm-toolchain-focal main" # apt-get update # apt-get install -y \ # clang-8 clang-tidy-8 # clang-8 --version # clang++-8 --version # ;; #clang++-9|clang-9) # apt-get update # apt-get install -y \ # wget \ # software-properties-common # wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key 2>/dev/null | apt-key add - # apt-add-repository --yes --no-update "deb http://apt.llvm.org/focal/ llvm-toolchain-focal-9 main" # apt-get update # apt-get install -y \ # clang-9 clang-tidy-9 # clang-9 --version # clang++-9 --version # ;; #clang++-10|clang-10) # apt-get update # apt-get install -y \ # wget \ # software-properties-common # wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key 2>/dev/null | apt-key add - # apt-add-repository --yes --no-update "deb http://apt.llvm.org/focal/ llvm-toolchain-focal-10 main" # apt-get update # apt-get install -y \ # clang-10 clang-tidy-10 # clang-10 --version # clang++-10 --version # ;; #clang++-11|clang-11) # apt-get update # apt-get install -y \ # clang-11 clang-tidy-11 # clang-11 --version # clang++-11 --version # ;; #clang++-12|clang-12) # apt-get update # apt-add-repository --yes --no-update "deb http://apt.llvm.org/noble/ llvm-toolchain-noble main" # apt-get update # apt-get install -y \ # clang-12 clang-tidy-12 # ;; #clang++-13|clang-13) # apt-get update # apt-get install -y \ # clang-13 clang-tidy-13 # ;; clang++-14|clang-14) apt-get update apt-get install -y \ clang-14 clang-tidy-14 ;; clang++-15|clang-15) apt-get update apt-get install -y \ clang-15 clang-tidy-15 ;; clang++-16|clang-16) apt-get update apt-get install -y \ clang-16 clang-tidy-16 ;; clang++-17|clang-17) apt-get update apt-get install -y \ clang-17 clang-tidy-17 ;; clang++-18|clang-18) apt-get update apt-get install -y \ clang-18 clang-tidy-18 ;; clang++-19|clang-19) apt-get update apt-get install -y \ clang-19 clang-tidy-19 ;; arm-none-eabi) apt-get update apt-get install -y \ gcc-arm-none-eabi arm-none-eabi-gcc --version arm-none-eabi-g++ --version ;; armv7|arm-linux-gnueabihf) apt-get update apt-get install -y \ gcc-arm-linux-gnueabihf \ g++-arm-linux-gnueabihf arm-linux-gnueabihf-gcc --version arm-linux-gnueabihf-g++ --version ;; armv6|arm-linux-gnueabi) apt-get update apt-get install -y \ gcc-arm-linux-gnueabi \ g++-arm-linux-gnueabi arm-linux-gnueabi-gcc --version arm-linux-gnueabi-g++ --version ;; aarch64|aarch64-linux-gnu) apt-get update apt-get install -y \ gcc-aarch64-linux-gnu \ g++-aarch64-linux-gnu aarch64-linux-gnu-gcc --version aarch64-linux-gnu-g++ --version ;; s390|s390x|s390x-linux-gnu) apt-get update apt-get install -y \ gcc-s390x-linux-gnu \ g++-s390x-linux-gnu s390x-linux-gnu-gcc --version s390x-linux-gnu-g++ --version ;; ppc64le|powerpc64le|ppc64le-linux-gnu) apt-get update apt-get install -y \ gcc-powerpc64le-linux-gnu \ g++-powerpc64le-linux-gnu powerpc64le-linux-gnu-gcc --version powerpc64le-linux-gnu-g++ --version ;; ppc64|powerpc64|ppc64-linux-gnu) apt-get update apt-get install -y \ gcc-powerpc64-linux-gnu \ g++-powerpc64-linux-gnu powerpc64-linux-gnu-gcc --version powerpc64-linux-gnu-g++ --version ;; riscv64|riscv64-linux-gnu) apt-get update apt-get install -y \ gcc-riscv64-linux-gnu \ g++-riscv64-linux-gnu riscv64-linux-gnu-gcc --version riscv64-linux-gnu-g++ --version ;; qemu) apt-get update apt-get install -y \ qemu-user \ qemu-user-static ;; mingw) apt-get update apt-get install -y \ gcc-mingw-w64-x86-64 \ g++-mingw-w64-x86-64 \ mingw-w64 \ mingw-w64-x86-64-dev \ mingw-w64-tools update-alternatives --set x86_64-w64-mingw32-gcc /usr/bin/x86_64-w64-mingw32-gcc-posix update-alternatives --set x86_64-w64-mingw32-g++ /usr/bin/x86_64-w64-mingw32-g++-posix ;; wine) apt-get update apt-get install -y wine # run exe with env WINEPATH="/usr/lib/gcc/x86_64-w64-mingw32/7.3-win32;/usr/x86_64-w64-mingw32/lib" wine exe ;; *) echo "unknown package: $what" exit 1 ;; esac c4core-0.2.6/.github/release.sh000066400000000000000000000057351477602032300162300ustar00rootroot00000000000000#!/bin/bash # useful to iterate when fixing the release: # ver=0.2.1 ; ( set -x ; git tag -d v$ver ; git push origin :v$ver ) ; (set -x ; set -e ; tbump --only-patch --non-interactive $ver ; git add -u ; git commit --amend --no-edit ; git tag --annotate --message "v$ver" "v$ver" ; git push -f --tags origin ) function c4_release_create() { ( \ set -euxo pipefail ; \ ver=$(_c4_validate_ver $1) ; \ branch=$(_c4_validate_branch) ; \ c4_release_bump $ver ; \ c4_release_commit $ver $branch \ ) } function c4_release_redo() { ( \ set -euxo pipefail ; \ ver=$(_c4_validate_ver $1) ; \ branch=$(_c4_validate_branch) ; \ c4_release_delete $ver ; \ c4_release_bump $ver ; \ c4_release_amend $ver $branch \ ) } function c4_release_bump() { ( \ set -euxo pipefail ; \ ver=$(_c4_validate_ver $1) ; \ tbump --non-interactive --only-patch $ver ; \ sed 's/C[0-9]CORE_/C4CORE_/g' -i src/c4/version.hpp \ ) } function c4_release_commit() { ( \ set -euxo pipefail ; \ ver=$(_c4_validate_ver $1) ; \ branch=$(_c4_validate_branch) ; \ tag=v$ver ; \ git add -u ; \ git commit -m $tag ; \ git tag --annotate --message $tag $tag ; \ ) } function c4_release_amend() { ( \ set -euxo pipefail ; \ ver=$(_c4_validate_ver $1) ; \ branch=$(_c4_validate_branch) ; \ tag=v$ver ; \ git add -u ; \ git commit --amend -m $tag ; \ git tag --annotate --message $tag $tag ; \ ) } function c4_release_delete() { ( \ set -euxo pipefail ; \ ver=$(_c4_validate_ver $1) ; \ git tag -d v$ver ; \ git push origin :v$ver \ ) } function c4_release_push() { ( \ set -euxo pipefail ; \ ver=$(_c4_validate_ver $1) ; \ branch=$(_c4_validate_branch) ; \ tag=v$ver ; \ git push origin $branch ; \ git push --tags origin $tag \ ) } function c4_release_force_push() { ( \ set -euxo pipefail ; \ ver=$(_c4_validate_ver $1) ; \ branch=$(_c4_validate_branch) ; \ tag=v$ver ; \ git push -f origin $branch ; \ git push -f --tags origin $tag \ ) } function _c4_validate_ver() { ver=$1 if [ -z "$ver" ] ; then \ exit 1 fi ver=$(echo $ver | sed "s:v\(.*\):\1:") #sver=$(echo $ver | sed "s:\([0-9]*\.[0-9]*\..[0-9]*\).*:\1:") if [ ! -f changelog/$ver.md ] ; then \ if [ -f changelog/current.md ] ; then git mv changelog/current.md changelog/$ver.md touch changelog/current.md git add changelog/current.md else echo "ERROR: could not find changelog/$ver.md or changelog/current.md" exit 1 fi fi echo $ver } function _c4_validate_branch() { branch=$(git rev-parse --abbrev-ref HEAD) if [ "$branch" != "master" ] ; then echo "ERROR: release branch must be master" exit 1 fi echo $branch } c4core-0.2.6/.github/reqs.sh000066400000000000000000000271321477602032300155550ustar00rootroot00000000000000#!/usr/bin/env bash set -x # input environment variables: # OS: the operating system # CXX_: the compiler version. eg, g++-9 or clang++-6.0 # BT: the build type # VG: whether to install valgrind # ARM: whether to arm cross-compiler and emulator # GITHUB_WORKFLOW: when run from github # API: whether to install swig # CMANY: whether to install cmany #------------------------------------------------------------------------------- function c4_install_test_requirements() { os=$1 if [ "$os" == "" ] ; then if [ "$(which lsb_release)" != "" ] ; then os=ubuntu fi fi case "$os" in ubuntu*) c4_install_test_requirements_ubuntu return 0 ;; macos*) c4_install_test_requirements_macos return 0 ;; win*) c4_install_test_requirements_windows return 0 ;; *) return 0 ;; esac } function c4_install_test_requirements_windows() { if [ "$CMANY" == "ON" ] ; then pip install cmany fi if [ "$API" == "ON" ] ; then choco install swig which swig fi # ensure chocolatey does not override cmake's cpack which cpack choco_cpack="/c/ProgramData/Chocolatey/bin/cpack.exe" if [ -f $choco_cpack ] ; then newname=$(echo $choco_cpack | sed 's:cpack:choco-cpack:') mv -vf $choco_cpack $newname fi which cpack } function c4_install_test_requirements_macos() { if [ "$CMANY" == "ON" ] ; then sudo pip3 install cmany fi } function c4_install_test_requirements_ubuntu() { UBUNTU_RELEASE=$(lsb_release -rs) UBUNTU_RELEASE_NAME=$(lsb_release -cs) APT_PKG="" # all PIP_PKG="" c4_gather_test_requirements_ubuntu echo "apt packages: $APT_PKG" echo "pip packages: $PIP_PKG" c4_install_test_requirements_ubuntu_impl echo 'INSTALL COMPLETE!' } function c4_install_all_possible_requirements_ubuntu() { UBUNTU_RELEASE=$(lsb_release -rs) UBUNTU_RELEASE_NAME=$(lsb_release -cs) export CXX_=all export BT=Coverage APT_PKG="" # all PIP_PKG="" c4_gather_test_requirements_ubuntu _c4_add_arm_compilers echo "apt packages: $APT_PKG" echo "pip packages: $PIP_PKG" c4_install_test_requirements_ubuntu_impl echo 'INSTALL COMPLETE!' } function c4_gather_test_requirements_ubuntu() { sudo dpkg --add-architecture i386 _add_apt build-essential _add_apt cmake _add_apt linux-libc-dev:i386 _add_apt libc6:i386 _add_apt libc6-dev:i386 _add_apt libc6-dbg:i386 _c4_addlibcxx _c4_gather_compilers "$CXX_" _add_apt python3-setuptools _add_apt python3-pip #_add_apt iwyu #_add_apt cppcheck #_add_pip cpplint # oclint? if [ "$VG" == "ON" ] ; then _add_apt valgrind fi if [ "$BT" == "Coverage" ]; then _add_apt lcov _add_apt libffi-dev _add_apt libssl-dev _add_pip requests[security] _add_pip pyopenssl _add_pip ndg-httpsclient _add_pip pyasn1 _add_pip cpp-coveralls _add_pip setuptools_rust fi if [ "$CMANY" != "" ] ; then _add_pip cmany fi case "$CXX_" in arm*) _c4_add_arm_compilers ;; esac } function c4_install_test_requirements_ubuntu_impl() { wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key 2>/dev/null | sudo apt-key add - wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | sudo apt-key add - sudo -E apt-add-repository --yes --no-update "deb https://apt.kitware.com/ubuntu/ $UBUNTU_RELEASE_NAME main" sudo -E apt-add-repository --yes --no-update ppa:ubuntu-toolchain-r/test if [ "$APT_PKG" != "" ] ; then #sudo -E apt-get clean sudo -E apt-get update sudo -E apt-get install -y --force-yes $APT_PKG fi if [ "$PIP_PKG" != "" ]; then sudo pip3 install --force-reinstall importlib_metadata sudo pip3 install --force-reinstall setuptools sudo pip3 install setuptools-rust sudo pip3 install --upgrade pip || echo "could not upgrade pip" sudo pip3 install $PIP_PKG fi } #------------------------------------------------------------------------------- function _c4_add_arm_compilers() { _add_apt qemu # this is going to be deprecated: # https://askubuntu.com/questions/1243252/how-to-install-arm-none-eabi-gdb-on-ubuntu-20-04-lts-focal-fossa #sudo -E add-apt-repository --yes --no-update ppa:team-gcc-arm-embedded/ppa #_add_apt gcc-arm-embedded #_add_apt g++-arm-linux-gnueabihf #_add_apt g++-multilib-arm-linux-gnueabihf # do this instead: _c4_install_arm_none_eabi } function _c4_install_arm_none_eabi() { # taken from: # https://askubuntu.com/questions/1243252/how-to-install-arm-none-eabi-gdb-on-ubuntu-20-04-lts-focal-fossa/1371525#1371525 VER=${1:-15:10.3-2021.10-9} SHORTVER=${2:-10.3-2021.10} URL=https://developer.arm.com/-/media/Files/downloads/gnu-rm/$SHORTVER/gcc-arm-none-eabi-$SHORTVER-x86_64-linux.tar.bz2 echo "Creating gcc-arm-none-eabi debian package version $VER" echo "Entering temporary directory..." cd /tmp echo "Downloading..." name=gcc-arm-none-eabi-$SHORTVER curl -fSL -A "Mozilla/4.0" -o $name.tar "$URL" echo "Extracting..." tar -xf $name.tar rm -f $name.tar echo "Generating debian package..." [ -d $name-dpkg ] && rm -rf $name-dpkg mkdir $name-dpkg mkdir $name-dpkg/DEBIAN mkdir $name-dpkg/usr cat > $name-dpkg/DEBIAN/control <> /etc/apt/sources.list < $coverage_service" cmake --build $build_dir --config $BT --target ${PROJ_PFX_TARGET}coverage-submit-$coverage_service } # WIP function c4_run_static_analysis() { if _c4skipbitlink "$1" ; then return 0 ; fi id=$1 linktype=$(_c4linktype $id) build_dir=`pwd`/build/$id # https://blog.kitware.com/static-checks-with-cmake-cdash-iwyu-clang-tidy-lwyu-cpplint-and-cppcheck/ pushd $PROJ_DIR } function c4_cfg_test() { if _c4skipbitlink "$1" ; then return 0 ; fi id=$1 # build_dir=`pwd`/build/$id install_dir=`pwd`/install/$id mkdir -p $build_dir mkdir -p $install_dir # if [ "$TOOLCHAIN" != "" ] ; then toolchain_file=`pwd`/$TOOLCHAIN if [ ! -f "$toolchain_file" ] ; then echo "ERROR: toolchain not found: $toolchain_file" exit 1 fi _addcmkflags -DCMAKE_TOOLCHAIN_FILE=$toolchain_file else bits=$(_c4bits $id) linktype=$(_c4linktype $id) case "$linktype" in static) _addcmkflags -DBUILD_SHARED_LIBS=OFF ;; shared) _addcmkflags -DBUILD_SHARED_LIBS=ON ;; *) echo "ERROR: unknown linktype: $linktype" exit 1 ;; esac fi if [ "$STD" != "" ] ; then _addcmkflags -DC4_CXX_STANDARD=$STD _addprojflags CXX_STANDARD=$STD fi if [ "$LIBCXX" != "" ] ; then _addprojflags USE_LIBCXX=$LIBCXX fi # if [ "$DEV" != "OFF" ] ; then _addprojflags DEV=ON fi case "$LINT" in all ) _addprojflags LINT=ON LINT_TESTS=ON LINT_CLANG_TIDY=ON LINT_PVS_STUDIO=ON ;; clang-tidy) _addprojflags LINT=ON LINT_TESTS=ON LINT_CLANG_TIDY=ON LINT_PVS_STUDIO=OFF ;; pvs-studio) _addprojflags LINT=ON LINT_TESTS=ON LINT_CLANG_TIDY=OFF LINT_PVS_STUDIO=ON ;; * ) _addprojflags LINT=OFF ;; esac case "$SAN" in ALL) _addprojflags SANITIZE=ON ;; A ) _addprojflags SANITIZE=ON ASAN=ON TSAN=OFF MSAN=OFF UBSAN=OFF ;; T ) _addprojflags SANITIZE=ON ASAN=OFF TSAN=ON MSAN=OFF UBSAN=OFF ;; M ) _addprojflags SANITIZE=ON ASAN=OFF TSAN=OFF MSAN=ON UBSAN=OFF ;; UB ) _addprojflags SANITIZE=ON ASAN=OFF TSAN=OFF MSAN=OFF UBSAN=ON ;; * ) _addprojflags SANITIZE=OFF ;; esac case "$SAN_ONLY" in ON) _addprojflags SANITIZE_ONLY=ON ;; * ) _addprojflags SANITIZE_ONLY=OFF ;; esac case "$VG" in ON) _addprojflags VALGRIND=ON VALGRIND_SGCHECK=OFF ;; # FIXME SGCHECK should be ON * ) _addprojflags VALGRIND=OFF VALGRIND_SGCHECK=OFF ;; esac case "$BM" in ON) _addprojflags BUILD_BENCHMARKS=ON ;; * ) _addprojflags BUILD_BENCHMARKS=OFF ;; esac if [ "$BT" == "Coverage" ] ; then # the coverage repo tokens can be set in the travis environment: # export CODECOV_TOKEN=....... # export COVERALLS_REPO_TOKEN=....... _addprojflags COVERAGE_CODECOV=ON COVERAGE_CODECOV_SILENT=OFF _addprojflags COVERAGE_COVERALLS=ON COVERAGE_COVERALLS_SILENT=OFF fi if [ ! -z "$VERBOSE_MAKEFILES" ] ; then _addcmkflags -DCMAKE_VERBOSE_MAKEFILES=$VERBOSE_MAKEFILES fi _addcmkflags -DCMAKE_EXPORT_COMPILE_COMMANDS=ON if [ ! -z "$CMAKE_FLAGS" ] ; then _addcmkflags $CMAKE_FLAGS fi # do this before setting CMAKE_C_FLAGS case "$CXX_" in vs*) # WATCHOUT: leave a leading space in the _FLAGS options! # This is needed because bash will expand a leading # /DWIN32 to the fs root, ie to something like # C:/Git/DWIN32. The leading space prevents this. # # see https://github.com/bmatzelle/gow/issues/196 CFLAGS=" /DWIN32 /D_WINDOWS $CFLAGS" CXXFLAGS=" /DWIN32 /D_WINDOWS /EHsc /GR $CXXFLAGS" ;; xcode) ;; arm*|"") # make sure arm* comes before *g++ or *gcc* ;; *g++*|*gcc*|*clang*) CFLAGS="-std=c99 -m$bits $CFLAGS" CXXFLAGS="-m$bits $CXXFLAGS" ;; em++) CFLAGS="-s DISABLE_EXCEPTION_CATCHING=0 $CFLAGS" CXXFLAGS="-s DISABLE_EXCEPTION_CATCHING=0 $CXXFLAGS" ;; *) echo "unknown compiler" exit 1 ;; esac echo "building with additional cmake flags: $CMFLAGS" export C4_EXTERN_DIR=`pwd`/build/extern mkdir -p $C4_EXTERN_DIR cmake --version pwd # # bash quote handling is a fiasco, and I could not find a way of storing # quoted strings in variables and then expand the variables with correct quotes # so we have to do this precious jewell of chicanery: case "$CXX_" in vs2022) cmake -S $PROJ_DIR -B $build_dir -DCMAKE_INSTALL_PREFIX="$install_dir" \ -G 'Visual Studio 17 2022' -A $(_c4vsarchtype $id) \ $(_c4_add_ehsc_to_vs_arm32 $id) \ -DCMAKE_BUILD_TYPE=$BT $CMFLAGS \ -DCMAKE_C_FLAGS=" $CFLAGS" -DCMAKE_CXX_FLAGS=" $CXXFLAGS" ;; vs2019) cmake -S $PROJ_DIR -B $build_dir -DCMAKE_INSTALL_PREFIX="$install_dir" \ -G 'Visual Studio 16 2019' -A $(_c4vsarchtype $id) \ $(_c4_add_ehsc_to_vs_arm32 $id) \ -DCMAKE_BUILD_TYPE=$BT $CMFLAGS \ -DCMAKE_C_FLAGS=" $CFLAGS" -DCMAKE_CXX_FLAGS=" $CXXFLAGS" ;; vs2017) case "$bits" in 64) g="Visual Studio 15 2017 Win64" ;; 32) g="Visual Studio 15 2017" ;; *) exit 1 ;; esac cmake -S $PROJ_DIR -B $build_dir -DCMAKE_INSTALL_PREFIX="$install_dir" \ $(_c4_add_ehsc_to_vs_arm32 $id) \ -DCMAKE_BUILD_TYPE=$BT -G "$g" \ -DCMAKE_C_FLAGS=" $CFLAGS" -DCMAKE_CXX_FLAGS=" $CXXFLAGS" ;; xcode) g=Xcode case "$bits" in 64) a="x86_64" ;; 32) a="i386" echo "xcode does not support i386" exit 1 # i386 is deprecated in xcode ;; esac cmake -S $PROJ_DIR -B $build_dir -DCMAKE_INSTALL_PREFIX="$install_dir" \ -DCMAKE_BUILD_TYPE=$BT -G "$g" \ -DCMAKE_OSX_ARCHITECTURES=$a $CMFLAGS \ -DCMAKE_C_FLAGS="$CFLAGS" -DCMAKE_CXX_FLAGS="$CXXFLAGS" ;; arm*|"") # make sure arm* comes before *g++ or *gcc* cmake -S $PROJ_DIR -B $build_dir -DCMAKE_INSTALL_PREFIX="$install_dir" \ -DCMAKE_BUILD_TYPE=$BT $CMFLAGS \ -DCMAKE_C_FLAGS="$CFLAGS" -DCMAKE_CXX_FLAGS="$CXXFLAGS" ;; *g++*|*gcc*|*clang*) export CC_=$(echo "$CXX_" | sed 's:clang++:clang:g' | sed 's:g++:gcc:g') _c4_choose_clang_tidy $CXX_ cmake -S $PROJ_DIR -B $build_dir -DCMAKE_INSTALL_PREFIX="$install_dir" \ -DCMAKE_C_COMPILER=$CC_ -DCMAKE_CXX_COMPILER=$CXX_ \ -DCMAKE_BUILD_TYPE=$BT $CMFLAGS \ -DCMAKE_C_FLAGS="$CFLAGS" -DCMAKE_CXX_FLAGS="$CXXFLAGS" cmake --build $build_dir --target help | sed 1d | sort ;; em++) emcmake cmake -S $PROJ_DIR -B $build_dir -DCMAKE_INSTALL_PREFIX="$install_dir" \ -DCMAKE_BUILD_TYPE=$BT $CMFLAGS \ -DCMAKE_C_FLAGS="$CFLAGS" -DCMAKE_CXX_FLAGS="$CXXFLAGS" ;; *) echo "unknown compiler" exit 1 ;; esac } function _c4_choose_clang_tidy() { cxx=$1 # only for clang compilers. case $cxx in clang*) # try with version first clang_tidy_ver=$(echo $cxx | sed "s:++:-tidy:") clang_tidy=$(echo $cxx | sed "s:++.*:-tidy:") for n in $clang_tidy_ver $clang_tidy ; do exe=$(which $n) echo "searching for $n: $exe" if [ -z "$exe" ] ; then echo "could not find $clang_tidy" else _addcmkflags "-DCLANG_TIDY=$exe" return 0 fi done echo "error: could not find clang-tidy for $cxx" exit 1 ;; esac } # add cmake flags without project prefix function _addcmkflags() { for f in $* ; do CMFLAGS="$CMFLAGS ${f}" done } # add cmake flags with project prefix function _addprojflags() { for f in $* ; do CMFLAGS="$CMFLAGS -D${PROJ_PFX_CMAKE}${f}" done } function _c4_add_ehsc_to_vs_arm32() { id=$1 case "$CXX_" in vs*) case "$id" in arm32|arm32shared|arm32static|shared32arm|static32arm|arm) echo '-DCMAKE_CXX_FLAGS="/EHsc"' ;; *) esac ;; esac } function _c4_parallel_build_flags() { case "$CXX_" in vs2022|vs2019|vs2017|vs2015) # https://docs.microsoft.com/en-us/visualstudio/msbuild/msbuild-command-line-reference?view=vs-2019 # https://stackoverflow.com/questions/2619198/how-to-get-number-of-cores-in-win32 if [ -z "$NUM_JOBS_BUILD" ] ; then echo "/maxcpucount:$NUMBER_OF_PROCESSORS" else echo "/maxcpucount:$NUM_JOBS_BUILD" fi ;; xcode) # https://stackoverflow.com/questions/5417835/how-to-modify-the-number-of-parallel-compilation-with-xcode # https://gist.github.com/nlutsenko/ee245fbd239087d22137 if [ -z "$NUM_JOBS_BUILD" ] ; then echo "-IDEBuildOperationMaxNumberOfConcurrentCompileTasks=$(sysctl -n hw.ncpu)" else echo "-IDEBuildOperationMaxNumberOfConcurrentCompileTasks=$NUM_JOBS_BUILD" fi ;; *g++*|*gcc*|*clang*|em++) if [ -z "$NUM_JOBS_BUILD" ] ; then echo "-j $(nproc)" else echo "-j $NUM_JOBS_BUILD" fi ;; "") # allow empty compiler ;; *) echo "unknown compiler" exit 1 ;; esac } function _c4_generator_build_flags() { case "$CXX_" in vs2022|vs2019|vs2017|vs2015) ;; xcode) # WTF??? # https://github.com/biojppm/rapidyaml/pull/97/checks?check_run_id=1504677928#step:7:964 # https://stackoverflow.com/questions/51153525/xcode-10-unable-to-attach-db-error echo "-UseModernBuildSystem=NO" ;; *g++*|*gcc*|*clang*|em++) ;; "") # allow empty compiler ;; *) echo "unknown compiler" exit 1 ;; esac } c4core-0.2.6/.github/toolchains/000077500000000000000000000000001477602032300164055ustar00rootroot00000000000000c4core-0.2.6/.github/toolchains/aarch64.cmake000066400000000000000000000011041477602032300206330ustar00rootroot00000000000000set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR aarch64) set(CMAKE_CROSSCOMPILING TRUE) set(CMAKE_C_COMPILER /usr/bin/aarch64-linux-gnu-gcc) set(CMAKE_CXX_COMPILER /usr/bin/aarch64-linux-gnu-g++) set(CMAKE_FIND_ROOT_PATH /usr/aarch64-linux-gnu/) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) set(CMAKE_CROSSCOMPILING_EMULATOR "qemu-aarch64-static;-L;/usr/aarch64-linux-gnu/" CACHE FILEPATH "Path to the emulator for the target system.") c4core-0.2.6/.github/toolchains/armv4.cmake000066400000000000000000000010761477602032300204440ustar00rootroot00000000000000set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR armv6) set(CMAKE_CROSSCOMPILING TRUE) set(CMAKE_C_COMPILER /usr/bin/arm-linux-gnueabi-gcc) set(CMAKE_CXX_COMPILER /usr/bin/arm-linux-gnueabi-g++) set(CMAKE_FIND_ROOT_PATH /usr/arm-linux-gnueabi/) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) set(CMAKE_CROSSCOMPILING_EMULATOR "qemu-arm-static;-L;/usr/arm-linux-gnueabi/" CACHE FILEPATH "Path to the emulator for the target system.") c4core-0.2.6/.github/toolchains/armv5.cmake000066400000000000000000000010761477602032300204450ustar00rootroot00000000000000set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR armv6) set(CMAKE_CROSSCOMPILING TRUE) set(CMAKE_C_COMPILER /usr/bin/arm-linux-gnueabi-gcc) set(CMAKE_CXX_COMPILER /usr/bin/arm-linux-gnueabi-g++) set(CMAKE_FIND_ROOT_PATH /usr/arm-linux-gnueabi/) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) set(CMAKE_CROSSCOMPILING_EMULATOR "qemu-arm-static;-L;/usr/arm-linux-gnueabi/" CACHE FILEPATH "Path to the emulator for the target system.") c4core-0.2.6/.github/toolchains/armv6.cmake000066400000000000000000000010761477602032300204460ustar00rootroot00000000000000set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR armv6) set(CMAKE_CROSSCOMPILING TRUE) set(CMAKE_C_COMPILER /usr/bin/arm-linux-gnueabi-gcc) set(CMAKE_CXX_COMPILER /usr/bin/arm-linux-gnueabi-g++) set(CMAKE_FIND_ROOT_PATH /usr/arm-linux-gnueabi/) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) set(CMAKE_CROSSCOMPILING_EMULATOR "qemu-arm-static;-L;/usr/arm-linux-gnueabi/" CACHE FILEPATH "Path to the emulator for the target system.") c4core-0.2.6/.github/toolchains/armv7.cmake000066400000000000000000000011511477602032300204410ustar00rootroot00000000000000set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR armv7) set(CMAKE_CROSSCOMPILING TRUE) if (CMAKE_TOOLCHAIN_FILE) endif() set(CMAKE_C_COMPILER /usr/bin/arm-linux-gnueabihf-gcc) set(CMAKE_CXX_COMPILER /usr/bin/arm-linux-gnueabihf-g++) set(CMAKE_FIND_ROOT_PATH /usr/arm-linux-gnueabihf/) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) set(CMAKE_CROSSCOMPILING_EMULATOR "qemu-arm-static;-L;/usr/arm-linux-gnueabihf/" CACHE FILEPATH "Path to the emulator for the target system.") c4core-0.2.6/.github/toolchains/loongarch64.cmake000066400000000000000000000011421477602032300215330ustar00rootroot00000000000000set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR loongarch64) set(CMAKE_CROSSCOMPILING TRUE) set(CMAKE_C_COMPILER /usr/bin/loongarch64-linux-gnu-gcc-14) set(CMAKE_CXX_COMPILER /usr/bin/loongarch64-linux-gnu-g++-14) set(CMAKE_FIND_ROOT_PATH /usr/loongarch64-linux-gnu/) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) set(CMAKE_CROSSCOMPILING_EMULATOR "qemu-loongarch64-static;-L;/usr/loongarch64-linux-gnu/" CACHE FILEPATH "Path to the emulator for the target system.") c4core-0.2.6/.github/toolchains/mingw32.cmake000066400000000000000000000010501477602032300206710ustar00rootroot00000000000000set(CMAKE_SYSTEM_NAME Windows) set(CMAKE_CROSSCOMPILING TRUE) set(TOOLCHAIN_PREFIX i686-w64-mingw32) set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}-gcc-posix) set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}-g++-posix) set(CMAKE_Fortran_COMPILER ${TOOLCHAIN_PREFIX}-gfortran-posix) set(CMAKE_RC_COMPILER ${TOOLCHAIN_PREFIX}-windres) set(CMAKE_FIND_ROOT_PATH /usr/${TOOLCHAIN_PREFIX}) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) c4core-0.2.6/.github/toolchains/mingw64.cmake000066400000000000000000000010521477602032300207000ustar00rootroot00000000000000set(CMAKE_SYSTEM_NAME Windows) set(CMAKE_CROSSCOMPILING TRUE) set(TOOLCHAIN_PREFIX x86_64-w64-mingw32) set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}-gcc-posix) set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}-g++-posix) set(CMAKE_Fortran_COMPILER ${TOOLCHAIN_PREFIX}-gfortran-posix) set(CMAKE_RC_COMPILER ${TOOLCHAIN_PREFIX}-windres) set(CMAKE_FIND_ROOT_PATH /usr/${TOOLCHAIN_PREFIX}) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) c4core-0.2.6/.github/toolchains/mips.cmake000066400000000000000000000010621477602032300203560ustar00rootroot00000000000000set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR mips) set(CMAKE_CROSSCOMPILING TRUE) set(CMAKE_C_COMPILER /usr/bin/mips-linux-gnu-gcc) set(CMAKE_CXX_COMPILER /usr/bin/mips-linux-gnu-g++) set(CMAKE_FIND_ROOT_PATH /usr/mips-linux-gnu/) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) set(CMAKE_CROSSCOMPILING_EMULATOR "qemu-mips-static;-L;/usr/mips-linux-gnu/" CACHE FILEPATH "Path to the emulator for the target system.") c4core-0.2.6/.github/toolchains/mips64.cmake000066400000000000000000000011221477602032300205250ustar00rootroot00000000000000set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR mips64) set(CMAKE_CROSSCOMPILING TRUE) set(CMAKE_C_COMPILER /usr/bin/mips64-linux-gnuabi64-gcc) set(CMAKE_CXX_COMPILER /usr/bin/mips64-linux-gnuabi64-g++) set(CMAKE_FIND_ROOT_PATH /usr/mips64-linux-gnuabi64/) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) set(CMAKE_CROSSCOMPILING_EMULATOR "qemu-mips64-static;-L;/usr/mips64-linux-gnuabi64/" CACHE FILEPATH "Path to the emulator for the target system.") c4core-0.2.6/.github/toolchains/mips64el.cmake000066400000000000000000000011361477602032300210530ustar00rootroot00000000000000set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR mips64el) set(CMAKE_CROSSCOMPILING TRUE) set(CMAKE_C_COMPILER /usr/bin/mips64el-linux-gnuabi64-gcc) set(CMAKE_CXX_COMPILER /usr/bin/mips64el-linux-gnuabi64-g++) set(CMAKE_FIND_ROOT_PATH /usr/mips64el-linux-gnuabi64/) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) set(CMAKE_CROSSCOMPILING_EMULATOR "qemu-mips64el-static;-L;/usr/mips64el-linux-gnuabi64/" CACHE FILEPATH "Path to the emulator for the target system.") c4core-0.2.6/.github/toolchains/mipsel.cmake000066400000000000000000000010761477602032300207040ustar00rootroot00000000000000set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR mipsel) set(CMAKE_CROSSCOMPILING TRUE) set(CMAKE_C_COMPILER /usr/bin/mipsel-linux-gnu-gcc) set(CMAKE_CXX_COMPILER /usr/bin/mipsel-linux-gnu-g++) set(CMAKE_FIND_ROOT_PATH /usr/mipsel-linux-gnu/) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) set(CMAKE_CROSSCOMPILING_EMULATOR "qemu-mipsel-static;-L;/usr/mipsel-linux-gnu/" CACHE FILEPATH "Path to the emulator for the target system.") c4core-0.2.6/.github/toolchains/ppc.cmake000066400000000000000000000010741477602032300201730ustar00rootroot00000000000000set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR ppc) set(CMAKE_CROSSCOMPILING TRUE) set(CMAKE_C_COMPILER /usr/bin/powerpc-linux-gnu-gcc) set(CMAKE_CXX_COMPILER /usr/bin/powerpc-linux-gnu-g++) set(CMAKE_FIND_ROOT_PATH /usr/powerpc-linux-gnu/) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) set(CMAKE_CROSSCOMPILING_EMULATOR "qemu-ppc-static;-L;/usr/powerpc-linux-gnu/" CACHE FILEPATH "Path to the emulator for the target system.") c4core-0.2.6/.github/toolchains/ppc64.cmake000066400000000000000000000011101477602032300203340ustar00rootroot00000000000000set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR ppc64) set(CMAKE_CROSSCOMPILING TRUE) set(CMAKE_C_COMPILER /usr/bin/powerpc64-linux-gnu-gcc) set(CMAKE_CXX_COMPILER /usr/bin/powerpc64-linux-gnu-g++) set(CMAKE_FIND_ROOT_PATH /usr/powerpc64-linux-gnu/) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) set(CMAKE_CROSSCOMPILING_EMULATOR "qemu-ppc64-static;-L;/usr/powerpc64-linux-gnu/" CACHE FILEPATH "Path to the emulator for the target system.") c4core-0.2.6/.github/toolchains/ppc64le.cmake000066400000000000000000000011241477602032300206620ustar00rootroot00000000000000set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR ppc64le) set(CMAKE_CROSSCOMPILING TRUE) set(CMAKE_C_COMPILER /usr/bin/powerpc64le-linux-gnu-gcc) set(CMAKE_CXX_COMPILER /usr/bin/powerpc64le-linux-gnu-g++) set(CMAKE_FIND_ROOT_PATH /usr/powerpc64le-linux-gnu/) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) set(CMAKE_CROSSCOMPILING_EMULATOR "qemu-ppc64le-static;-L;/usr/powerpc64le-linux-gnu/" CACHE FILEPATH "Path to the emulator for the target system.") c4core-0.2.6/.github/toolchains/riscv64.cmake000066400000000000000000000011041477602032300207030ustar00rootroot00000000000000set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR riscv64) set(CMAKE_CROSSCOMPILING TRUE) set(CMAKE_C_COMPILER /usr/bin/riscv64-linux-gnu-gcc) set(CMAKE_CXX_COMPILER /usr/bin/riscv64-linux-gnu-g++) set(CMAKE_FIND_ROOT_PATH /usr/riscv64-linux-gnu/) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) set(CMAKE_CROSSCOMPILING_EMULATOR "qemu-riscv64-static;-L;/usr/riscv64-linux-gnu/" CACHE FILEPATH "Path to the emulator for the target system.") c4core-0.2.6/.github/toolchains/s390x.cmake000066400000000000000000000010701477602032300202730ustar00rootroot00000000000000set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR s390x) set(CMAKE_CROSSCOMPILING TRUE) set(CMAKE_C_COMPILER /usr/bin/s390x-linux-gnu-gcc) set(CMAKE_CXX_COMPILER /usr/bin/s390x-linux-gnu-g++) set(CMAKE_FIND_ROOT_PATH /usr/s390x-linux-gnu/) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) set(CMAKE_CROSSCOMPILING_EMULATOR "qemu-s390x-static;-L;/usr/s390x-linux-gnu/" CACHE FILEPATH "Path to the emulator for the target system.") c4core-0.2.6/.github/toolchains/sparc.cmake000066400000000000000000000011001477602032300205070ustar00rootroot00000000000000set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR sparc64) set(CMAKE_CROSSCOMPILING TRUE) set(CMAKE_C_COMPILER /usr/bin/sparc64-linux-gnu-gcc) set(CMAKE_CXX_COMPILER /usr/bin/sparc64-linux-gnu-g++) set(CMAKE_FIND_ROOT_PATH /usr/sparc64-linux-gnu/) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) set(CMAKE_CROSSCOMPILING_EMULATOR "qemu-sparc-static;-L;/usr/sparc-linux-gnu/" CACHE FILEPATH "Path to the emulator for the target system.") c4core-0.2.6/.github/toolchains/sparc64.cmake000066400000000000000000000011041477602032300206650ustar00rootroot00000000000000set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR sparc64) set(CMAKE_CROSSCOMPILING TRUE) set(CMAKE_C_COMPILER /usr/bin/sparc64-linux-gnu-gcc) set(CMAKE_CXX_COMPILER /usr/bin/sparc64-linux-gnu-g++) set(CMAKE_FIND_ROOT_PATH /usr/sparc64-linux-gnu/) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) set(CMAKE_CROSSCOMPILING_EMULATOR "qemu-sparc64-static;-L;/usr/sparc64-linux-gnu/" CACHE FILEPATH "Path to the emulator for the target system.") c4core-0.2.6/.github/vagrant/000077500000000000000000000000001477602032300157045ustar00rootroot00000000000000c4core-0.2.6/.github/vagrant/Vagrantfile000066400000000000000000000065371477602032300201040ustar00rootroot00000000000000# -*- mode: ruby -*- # vi: set ft=ruby : # 1) download and install vagrant: https://www.vagrantup.com/downloads.html # (do not install ubuntu's 14.04 16.04 version, see https://stackoverflow.com/questions/22717428/vagrant-error-failed-to-mount-folders-in-linux-guest ): # 2) vagrant plugin install vagrant-vbguest # 3) vagrant up --provider virtualbox # 4) vagrant ssh # All Vagrant configuration is done below. The "2" in Vagrant.configure # configures the configuration version (we support older styles for # backwards compatibility). Please don't change it unless you know what # you're doing. Vagrant.configure(2) do |config| # The most common configuration options are documented and commented below. # For a complete reference, please see the online documentation at # https://docs.vagrantup.com. # Every Vagrant development environment requires a box. You can search for # boxes at https://atlas.hashicorp.com/search. config.vm.box = "generic/ubuntu2004" # Disable automatic box update checking. If you disable this, then # boxes will only be checked for updates when the user runs # `vagrant box outdated`. This is not recommended. # config.vm.box_check_update = false # Create a forwarded port mapping which allows access to a specific port # within the machine from a port on the host machine. In the example below, # accessing "localhost:8080" will access port 80 on the guest machine. # config.vm.network "forwarded_port", guest: 80, host: 8080 #config.ssh.username = 'travis' #config.ssh.password = 'travis' # Create a private network, which allows host-only access to the machine # using a specific IP. # config.vm.network "private_network", ip: "192.168.33.10" # Create a public network, which generally matched to bridged network. # Bridged networks make the machine appear as another physical device on # your network. # config.vm.network "public_network" # Share an additional folder to the guest VM. The first argument is # the path on the host to the actual folder. The second argument is # the path on the guest to mount the folder. And the optional third # argument is a set of non-required options. config.vm.synced_folder "../../../..", "/vagrant" #config.vm.synced_folder '.', '/vagrant', disabled: true # Provider-specific configuration so you can fine-tune various # backing providers for Vagrant. These expose provider-specific options. # Example for VirtualBox: # # config.vm.provider "virtualbox" do |vb| # # Display the VirtualBox GUI when booting the machine # vb.gui = true # # # Customize the amount of memory on the VM: # vb.memory = "1024" # end # # View the documentation for the provider you are using for more # information on available options. # Define a Vagrant Push strategy for pushing to Atlas. Other push strategies # such as FTP and Heroku are also available. See the documentation at # https://docs.vagrantup.com/v2/push/atlas.html for more information. # config.push.define "atlas" do |push| # push.app = "YOUR_ATLAS_USERNAME/YOUR_APPLICATION_NAME" # end # Enable provisioning with a shell script. Additional provisioners such as # Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the # documentation for more information about their specific syntax and use. #config.vm.provision "shell", path: "travis-install.sh" end c4core-0.2.6/.github/vagrant/macos/000077500000000000000000000000001477602032300170065ustar00rootroot00000000000000c4core-0.2.6/.github/vagrant/macos/Vagrantfile000066400000000000000000000057651477602032300212100ustar00rootroot00000000000000# -*- mode: ruby -*- # vi: set ft=ruby : # All Vagrant configuration is done below. The "2" in Vagrant.configure # configures the configuration version (we support older styles for # backwards compatibility). Please don't change it unless you know what # you're doing. Vagrant.configure("2") do |config| # The most common configuration options are documented and commented below. # For a complete reference, please see the online documentation at # https://docs.vagrantup.com. # Every Vagrant development environment requires a box. You can search for # boxes at https://vagrantcloud.com/search. config.vm.box = "ramsey/macos-catalina" config.vm.box_version = "1.0.0" # Disable automatic box update checking. If you disable this, then # boxes will only be checked for updates when the user runs # `vagrant box outdated`. This is not recommended. # config.vm.box_check_update = false # Create a forwarded port mapping which allows access to a specific port # within the machine from a port on the host machine. In the example below, # accessing "localhost:8080" will access port 80 on the guest machine. # NOTE: This will enable public access to the opened port # config.vm.network "forwarded_port", guest: 80, host: 8080 # Create a forwarded port mapping which allows access to a specific port # within the machine from a port on the host machine and only allow access # via 127.0.0.1 to disable public access # config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "127.0.0.1" # Create a private network, which allows host-only access to the machine # using a specific IP. # config.vm.network "private_network", ip: "192.168.33.10" # Create a public network, which generally matched to bridged network. # Bridged networks make the machine appear as another physical device on # your network. # config.vm.network "public_network" # Share an additional folder to the guest VM. The first argument is # the path on the host to the actual folder. The second argument is # the path on the guest to mount the folder. And the optional third # argument is a set of non-required options. # config.vm.synced_folder "../data", "/vagrant_data" # Provider-specific configuration so you can fine-tune various # backing providers for Vagrant. These expose provider-specific options. # Example for VirtualBox: # # config.vm.provider "virtualbox" do |vb| # # Display the VirtualBox GUI when booting the machine # vb.gui = true # # # Customize the amount of memory on the VM: # vb.memory = "1024" # end # # View the documentation for the provider you are using for more # information on available options. # Enable provisioning with a shell script. Additional provisioners such as # Ansible, Chef, Docker, Puppet and Salt are also available. Please see the # documentation for more information about their specific syntax and use. # config.vm.provision "shell", inline: <<-SHELL # apt-get update # apt-get install -y apache2 # SHELL end c4core-0.2.6/.github/vagrant/vagrant-provision.sh000077500000000000000000000031641477602032300217370ustar00rootroot00000000000000#!/usr/bin/env bash set -x # https://askubuntu.com/questions/735201/installing-clang-3-8-on-ubuntu-14-04-3 wget -O - http://llvm.org/apt/llvm-snapshot.gpg.key | sudo apt-key add - done=$(grep C4STL /etc/apt/sources.list) if [ -z "$done" ] ; then cat >> /etc/apt/sources.list </dev/null) ]] && t=$$t; \ diff -u --color=auto \ <(yq -P 'sort_keys(..)' \ -o=props <(git show $(DIFF_ORIG_COMMIT):.github/workflows/$$t) | \ grep -Ev '(^$$|^#)' \ ) \ <(yq -P 'sort_keys(..)' \ -o=props ../workflows-in/$$s | \ grep -Ev '(^$$|^#)'\ ); \ done force: touch *.ys ../workflows/%.yml: %.ys $(YS) $(INPUT_FILES) @if [ -f "$@" ] ; then chmod a+w $@ ; fi @echo "# DO NOT EDIT - GENERATED FROM .github/workflows-in/$<" > $@ @echo >> $@ $(YS) -Y $< >> $@ @chmod a-w $@ @wc -lm --total=never $< $@ # Auto install a specific version of ys install-ys: $(YS) $(YS): curl -s https://yamlscript.org/install | \ BIN=1 VERSION=$(YS_VERSION) PREFIX=$(YS_PREFIX) bash stats: @echo "ys : $$(wc -lm *.ys)" @echo "yml: $$(wc -lm *.yml)" c4core-0.2.6/.github/workflows-in/README.md000066400000000000000000000007371477602032300201710ustar00rootroot00000000000000`.github/workflows/*.ys` ======================== Use YAMLScript for GHA workflows ## Synopsis ```bash $ make build $ make test $ make diff ``` ## Description Edit the `*.ys` files in this directory and run `make build` to generate the files used by GitHub Actions (`.*.yml`). Running `make test` runs `make build` and shows the diff in the of the workflow `.foo.yml` files. If you are only refactoring the `*.ys` source files, you should see no diff when you run this. c4core-0.2.6/.github/workflows-in/arch.ys000066400000000000000000000041001477602032300201700ustar00rootroot00000000000000!yamlscript/v0: :use common: :all :: workflow-setup() jobs: xcompile: :: setup-job('rarearchs' 'xcompile') name: ${{matrix.arch}} runs-on: ubuntu-24.04 strategy: fail-fast: false matrix: include: - {arch: aarch64 , tc: aarch64-linux-gnu} # this is armv8 - {arch: armv7 , tc: arm-linux-gnueabihf, flags: -march=armv7+fp} - {arch: armv6 , tc: arm-linux-gnueabi, flags: -march=armv6+fp} - {arch: armv5 , tc: arm-linux-gnueabi, flags: -march=armv5te+fp} - {arch: armv4 , tc: arm-linux-gnueabi, flags: -march=armv4} - {arch: loongarch64, tc: loongarch64-linux-gnu, version: -14} - {arch: mips , tc: mips-linux-gnu} - {arch: mipsel , tc: mipsel-linux-gnu} - {arch: mips64 , tc: mips64-linux-gnuabi64} - {arch: mips64el , tc: mips64el-linux-gnuabi64} - {arch: riscv64 , tc: riscv64-linux-gnu} - {arch: s390x , tc: s390x-linux-gnu} - {arch: ppc , tc: powerpc-linux-gnu} - {arch: ppc64 , tc: powerpc64-linux-gnu} - {arch: ppc64le , tc: powerpc64le-linux-gnu} - {arch: sparc64 , tc: sparc64-linux-gnu} # TODO xtensa! steps: - :: checkout-action - name: install run: | sudo apt-get update sudo apt-get install -y \ gcc${{matrix.version}}-${{matrix.tc}} \ g++${{matrix.version}}-${{matrix.tc}} \ qemu-user-static - name: info run: | ${{matrix.tc}}-g++${{matrix.version}} --version ${{matrix.tc}}-g++${{matrix.version}} -dM -E - /dev/null check_workflows: :: setup-job('infra' 'check_workflows') runs-on: ubuntu-24.04 steps: - :: checkout-action - name: install ys run: make -C .github/workflows-in install-ys - name: generate workflows run: make -C .github/workflows-in build - name: test status of workflows run: | wc --version wc --help make -C .github/workflows-in test status=$? if [ $status != 0 ] ; then echo "ERROR: generated workflows are out of date" fi exit $status check_fast_float: :: setup-job('infra' 'check_fast_float') runs-on: ubuntu-24.04 steps: - :: checkout-action - name: check status of fast_float_all.h run: | python tools/amalgamate.py > /dev/null git diff --exit-code src/c4/ext/fast_float_all.h c4core-0.2.6/.github/workflows-in/install.ys000066400000000000000000000436221477602032300207350ustar00rootroot00000000000000!yamlscript/v0: :use common: :all :: workflow-setup() jobs: #---------------------------------------------------------------------------- install_tests: :: setup-job('coverage' 'coverage') name: ${{matrix.name}}/${{matrix.bt}} runs-on: ${{matrix.os}} strategy: fail-fast: false matrix: include: - {name: find_package/linux/Release , sdir: test/test_install , os: ubuntu-24.04, cxx: g++-13 , gen: "-DCMAKE_CXX_COMPILER=g++-13" , tgt: all , bt: Release, vars: "-Dc4core_DIR=$GITHUB_WORKSPACE/$PDIR/lib/cmake/c4core -DC4CORE_TEST_INSTALL_PACKAGE_MODE=ON", commonvars: } - {name: find_package/linux/Debug , sdir: test/test_install , os: ubuntu-24.04, cxx: g++-13 , gen: "-DCMAKE_CXX_COMPILER=g++-13" , tgt: all , bt: Debug , vars: "-Dc4core_DIR=$GITHUB_WORKSPACE/$PDIR/lib/cmake/c4core -DC4CORE_TEST_INSTALL_PACKAGE_MODE=ON", commonvars: } - {name: find_package/linux/RelNoExc , sdir: test/test_install , os: ubuntu-24.04, cxx: g++-13 , gen: "-DCMAKE_CXX_COMPILER=g++-13 -DCMAKE_CXX_FLAGS='-fno-exceptions -fno-rtti'" , tgt: all , bt: Release, vars: "-Dc4core_DIR=$GITHUB_WORKSPACE/$PDIR/lib/cmake/c4core -DC4CORE_TEST_INSTALL_PACKAGE_MODE=ON", commonvars: } - {name: find_package/linux/DbgNoExc , sdir: test/test_install , os: ubuntu-24.04, cxx: g++-13 , gen: "-DCMAKE_CXX_COMPILER=g++-13 -DCMAKE_CXX_FLAGS='-fno-exceptions -fno-rtti'" , tgt: all , bt: Debug , vars: "-Dc4core_DIR=$GITHUB_WORKSPACE/$PDIR/lib/cmake/c4core -DC4CORE_TEST_INSTALL_PACKAGE_MODE=ON", commonvars: } - {name: find_package/linux/libcxx/Release, sdir: test/test_install , os: ubuntu-24.04, cxx: clang++-14, gen: "-DCMAKE_CXX_COMPILER=clang++-14" , tgt: all , bt: Release, vars: "-Dc4core_DIR=$GITHUB_WORKSPACE/$PDIR/lib/cmake/c4core -DC4CORE_TEST_INSTALL_PACKAGE_MODE=ON", commonvars: "-DC4CORE_USE_LIBCXX=ON"} - {name: find_package/linux/libcxx/Debug , sdir: test/test_install , os: ubuntu-24.04, cxx: clang++-14, gen: "-DCMAKE_CXX_COMPILER=clang++-14" , tgt: all , bt: Debug , vars: "-Dc4core_DIR=$GITHUB_WORKSPACE/$PDIR/lib/cmake/c4core -DC4CORE_TEST_INSTALL_PACKAGE_MODE=ON", commonvars: "-DC4CORE_USE_LIBCXX=ON"} - {name: find_package/linux/libcxx/RelNoExc,sdir: test/test_install , os: ubuntu-24.04, cxx: clang++-14, gen: "-DCMAKE_CXX_COMPILER=clang++-14 -DCMAKE_CXX_FLAGS='-fno-exceptions -fno-rtti'" , tgt: all , bt: Release, vars: "-Dc4core_DIR=$GITHUB_WORKSPACE/$PDIR/lib/cmake/c4core -DC4CORE_TEST_INSTALL_PACKAGE_MODE=ON", commonvars: "-DC4CORE_USE_LIBCXX=ON"} - {name: find_package/linux/libcxx/DbgNoExc,sdir: test/test_install , os: ubuntu-24.04, cxx: clang++-14, gen: "-DCMAKE_CXX_COMPILER=clang++-14 -DCMAKE_CXX_FLAGS='-fno-exceptions -fno-rtti'" , tgt: all , bt: Debug , vars: "-Dc4core_DIR=$GITHUB_WORKSPACE/$PDIR/lib/cmake/c4core -DC4CORE_TEST_INSTALL_PACKAGE_MODE=ON", commonvars: "-DC4CORE_USE_LIBCXX=ON"} - {name: find_package/macos/Release , sdir: test/test_install , os: macos-13 , cxx: xcode , gen: "-G Xcode -DCMAKE_OSX_ARCHITECTURES=x86_64" , tgt: ALL_BUILD, bt: Release, vars: "-Dc4core_DIR=$GITHUB_WORKSPACE/$PDIR/lib/cmake/c4core -DC4CORE_TEST_INSTALL_PACKAGE_MODE=ON", commonvars: } - {name: find_package/macos/Debug , sdir: test/test_install , os: macos-13 , cxx: xcode , gen: "-G Xcode -DCMAKE_OSX_ARCHITECTURES=x86_64" , tgt: ALL_BUILD, bt: Debug , vars: "-Dc4core_DIR=$GITHUB_WORKSPACE/$PDIR/lib/cmake/c4core -DC4CORE_TEST_INSTALL_PACKAGE_MODE=ON", commonvars: } - {name: find_package/macos/RelNoExc , sdir: test/test_install , os: macos-13 , cxx: xcode , gen: "-G Xcode -DCMAKE_OSX_ARCHITECTURES=x86_64 -DCMAKE_CXX_FLAGS='-fno-exceptions -fno-rtti'" , tgt: ALL_BUILD, bt: Release, vars: "-Dc4core_DIR=$GITHUB_WORKSPACE/$PDIR/lib/cmake/c4core -DC4CORE_TEST_INSTALL_PACKAGE_MODE=ON", commonvars: } - {name: find_package/macos/DbgNoExc , sdir: test/test_install , os: macos-13 , cxx: xcode , gen: "-G Xcode -DCMAKE_OSX_ARCHITECTURES=x86_64 -DCMAKE_CXX_FLAGS='-fno-exceptions -fno-rtti'" , tgt: ALL_BUILD, bt: Debug , vars: "-Dc4core_DIR=$GITHUB_WORKSPACE/$PDIR/lib/cmake/c4core -DC4CORE_TEST_INSTALL_PACKAGE_MODE=ON", commonvars: } - {name: find_package/win/Release , sdir: test/test_install , os: windows-2019, cxx: vs2019 , gen: "-G 'Visual Studio 16 2019' -A x64" , tgt: ALL_BUILD, bt: Release, vars: "-Dc4core_DIR=$GITHUB_WORKSPACE/$PDIR/cmake -DC4CORE_TEST_INSTALL_PACKAGE_MODE=ON", commonvars: } - {name: find_package/win/Debug , sdir: test/test_install , os: windows-2019, cxx: vs2019 , gen: "-G 'Visual Studio 16 2019' -A x64" , tgt: ALL_BUILD, bt: Debug , vars: "-Dc4core_DIR=$GITHUB_WORKSPACE/$PDIR/cmake -DC4CORE_TEST_INSTALL_PACKAGE_MODE=ON", commonvars: } - {name: find_package/win/RelNoExc , sdir: test/test_install , os: windows-2019, cxx: vs2019 , gen: "-G 'Visual Studio 16 2019' -A x64 -DCMAKE_CXX_FLAGS=' /EHa- /EHs- /EHc /EHr- /GR- /wd4530'", tgt: ALL_BUILD, bt: Release, vars: "-Dc4core_DIR=$GITHUB_WORKSPACE/$PDIR/cmake -DC4CORE_TEST_INSTALL_PACKAGE_MODE=ON", commonvars: } - {name: find_package/win/DbgNoExc , sdir: test/test_install , os: windows-2019, cxx: vs2019 , gen: "-G 'Visual Studio 16 2019' -A x64 -DCMAKE_CXX_FLAGS=' /EHa- /EHs- /EHc /EHr- /GR- /wd4530'", tgt: ALL_BUILD, bt: Debug , vars: "-Dc4core_DIR=$GITHUB_WORKSPACE/$PDIR/cmake -DC4CORE_TEST_INSTALL_PACKAGE_MODE=ON", commonvars: } # - {name: find_library/linux/Release , sdir: test/test_install , os: ubuntu-24.04, cxx: g++-13 , gen: "-DCMAKE_CXX_COMPILER=g++-13" , tgt: all , bt: Release, vars: "-DCMAKE_PREFIX_PATH=$GITHUB_WORKSPACE/$PDIR -DC4CORE_TEST_INSTALL_PACKAGE_MODE=OFF", commonvars: } - {name: find_library/linux/Debug , sdir: test/test_install , os: ubuntu-24.04, cxx: g++-13 , gen: "-DCMAKE_CXX_COMPILER=g++-13" , tgt: all , bt: Debug , vars: "-DCMAKE_PREFIX_PATH=$GITHUB_WORKSPACE/$PDIR -DC4CORE_TEST_INSTALL_PACKAGE_MODE=OFF", commonvars: } - {name: find_library/linux/RelNoExc , sdir: test/test_install , os: ubuntu-24.04, cxx: g++-13 , gen: "-DCMAKE_CXX_COMPILER=g++-13 -DCMAKE_CXX_FLAGS='-fno-exceptions -fno-rtti'" , tgt: all , bt: Release, vars: "-DCMAKE_PREFIX_PATH=$GITHUB_WORKSPACE/$PDIR -DC4CORE_TEST_INSTALL_PACKAGE_MODE=OFF", commonvars: } - {name: find_library/linux/DbgNoExc , sdir: test/test_install , os: ubuntu-24.04, cxx: g++-13 , gen: "-DCMAKE_CXX_COMPILER=g++-13 -DCMAKE_CXX_FLAGS='-fno-exceptions -fno-rtti'" , tgt: all , bt: Debug , vars: "-DCMAKE_PREFIX_PATH=$GITHUB_WORKSPACE/$PDIR -DC4CORE_TEST_INSTALL_PACKAGE_MODE=OFF", commonvars: } - {name: find_library/linux/libcxx/Release, sdir: test/test_install , os: ubuntu-24.04, cxx: clang++-14, gen: "-DCMAKE_CXX_COMPILER=clang++-14" , tgt: all , bt: Release, vars: "-DCMAKE_PREFIX_PATH=$GITHUB_WORKSPACE/$PDIR -DC4CORE_TEST_INSTALL_PACKAGE_MODE=OFF", commonvars: "-DC4CORE_USE_LIBCXX=ON"} - {name: find_library/linux/libcxx/Debug , sdir: test/test_install , os: ubuntu-24.04, cxx: clang++-14, gen: "-DCMAKE_CXX_COMPILER=clang++-14" , tgt: all , bt: Debug , vars: "-DCMAKE_PREFIX_PATH=$GITHUB_WORKSPACE/$PDIR -DC4CORE_TEST_INSTALL_PACKAGE_MODE=OFF", commonvars: "-DC4CORE_USE_LIBCXX=ON"} - {name: find_library/linux/libcxx/RelNoExc,sdir: test/test_install , os: ubuntu-24.04, cxx: clang++-14, gen: "-DCMAKE_CXX_COMPILER=clang++-14 -DCMAKE_CXX_FLAGS='-fno-exceptions -fno-rtti'" , tgt: all , bt: Release, vars: "-DCMAKE_PREFIX_PATH=$GITHUB_WORKSPACE/$PDIR -DC4CORE_TEST_INSTALL_PACKAGE_MODE=OFF", commonvars: "-DC4CORE_USE_LIBCXX=ON"} - {name: find_library/linux/libcxx/DbgNoExc,sdir: test/test_install , os: ubuntu-24.04, cxx: clang++-14, gen: "-DCMAKE_CXX_COMPILER=clang++-14 -DCMAKE_CXX_FLAGS='-fno-exceptions -fno-rtti'" , tgt: all , bt: Debug , vars: "-DCMAKE_PREFIX_PATH=$GITHUB_WORKSPACE/$PDIR -DC4CORE_TEST_INSTALL_PACKAGE_MODE=OFF", commonvars: "-DC4CORE_USE_LIBCXX=ON"} - {name: find_library/macos/Release , sdir: test/test_install , os: macos-13 , cxx: xcode , gen: "-G Xcode -DCMAKE_OSX_ARCHITECTURES=x86_64" , tgt: ALL_BUILD, bt: Release, vars: "-DCMAKE_PREFIX_PATH=$GITHUB_WORKSPACE/$PDIR -DC4CORE_TEST_INSTALL_PACKAGE_MODE=OFF", commonvars: } - {name: find_library/macos/Debug , sdir: test/test_install , os: macos-13 , cxx: xcode , gen: "-G Xcode -DCMAKE_OSX_ARCHITECTURES=x86_64" , tgt: ALL_BUILD, bt: Debug , vars: "-DCMAKE_PREFIX_PATH=$GITHUB_WORKSPACE/$PDIR -DC4CORE_TEST_INSTALL_PACKAGE_MODE=OFF", commonvars: } - {name: find_library/macos/RelNoExc , sdir: test/test_install , os: macos-13 , cxx: xcode , gen: "-G Xcode -DCMAKE_OSX_ARCHITECTURES=x86_64 -DCMAKE_CXX_FLAGS='-fno-exceptions -fno-rtti'" , tgt: ALL_BUILD, bt: Release, vars: "-DCMAKE_PREFIX_PATH=$GITHUB_WORKSPACE/$PDIR -DC4CORE_TEST_INSTALL_PACKAGE_MODE=OFF", commonvars: } - {name: find_library/macos/DbgNoExc , sdir: test/test_install , os: macos-13 , cxx: xcode , gen: "-G Xcode -DCMAKE_OSX_ARCHITECTURES=x86_64 -DCMAKE_CXX_FLAGS='-fno-exceptions -fno-rtti'" , tgt: ALL_BUILD, bt: Debug , vars: "-DCMAKE_PREFIX_PATH=$GITHUB_WORKSPACE/$PDIR -DC4CORE_TEST_INSTALL_PACKAGE_MODE=OFF", commonvars: } - {name: find_library/win/Release , sdir: test/test_install , os: windows-2019, cxx: vs2019 , gen: "-G 'Visual Studio 16 2019' -A x64" , tgt: ALL_BUILD, bt: Release, vars: "-DCMAKE_PREFIX_PATH=$GITHUB_WORKSPACE/$PDIR -DC4CORE_TEST_INSTALL_PACKAGE_MODE=OFF", commonvars: } - {name: find_library/win/Debug , sdir: test/test_install , os: windows-2019, cxx: vs2019 , gen: "-G 'Visual Studio 16 2019' -A x64" , tgt: ALL_BUILD, bt: Debug , vars: "-DCMAKE_PREFIX_PATH=$GITHUB_WORKSPACE/$PDIR -DC4CORE_TEST_INSTALL_PACKAGE_MODE=OFF", commonvars: } - {name: find_library/win/RelNoExc , sdir: test/test_install , os: windows-2019, cxx: vs2019 , gen: "-G 'Visual Studio 16 2019' -A x64 -DCMAKE_CXX_FLAGS=' /EHa- /EHs- /EHc /EHr- /GR- /wd4530'", tgt: ALL_BUILD, bt: Release, vars: "-DCMAKE_PREFIX_PATH=$GITHUB_WORKSPACE/$PDIR -DC4CORE_TEST_INSTALL_PACKAGE_MODE=OFF", commonvars: } - {name: find_library/win/DbgNoExc , sdir: test/test_install , os: windows-2019, cxx: vs2019 , gen: "-G 'Visual Studio 16 2019' -A x64 -DCMAKE_CXX_FLAGS=' /EHa- /EHs- /EHc /EHr- /GR- /wd4530'", tgt: ALL_BUILD, bt: Debug , vars: "-DCMAKE_PREFIX_PATH=$GITHUB_WORKSPACE/$PDIR -DC4CORE_TEST_INSTALL_PACKAGE_MODE=OFF", commonvars: } # - {name: singleheader/linux/Release , sdir: test/test_singleheader, os: ubuntu-24.04, cxx: g++-13 , gen: "-DCMAKE_CXX_COMPILER=g++-13" , tgt: all , bt: Release, vars: , commonvars: } - {name: singleheader/linux/Debug , sdir: test/test_singleheader, os: ubuntu-24.04, cxx: g++-13 , gen: "-DCMAKE_CXX_COMPILER=g++-13" , tgt: all , bt: Debug , vars: , commonvars: } - {name: singleheader/linux/RelNoExc , sdir: test/test_singleheader, os: ubuntu-24.04, cxx: g++-13 , gen: "-DCMAKE_CXX_COMPILER=g++-13 -DCMAKE_CXX_FLAGS='-fno-exceptions -fno-rtti'" , tgt: all , bt: Release, vars: , commonvars: } - {name: singleheader/linux/DbgNoExc , sdir: test/test_singleheader, os: ubuntu-24.04, cxx: g++-13 , gen: "-DCMAKE_CXX_COMPILER=g++-13 -DCMAKE_CXX_FLAGS='-fno-exceptions -fno-rtti'" , tgt: all , bt: Debug , vars: , commonvars: } - {name: singleheader/linux/libcxx/Release, sdir: test/test_singleheader, os: ubuntu-24.04, cxx: clang++-14, gen: "-DCMAKE_CXX_COMPILER=clang++-14" , tgt: all , bt: Release, vars: , commonvars: "-DC4CORE_USE_LIBCXX=ON"} - {name: singleheader/linux/libcxx/Debug , sdir: test/test_singleheader, os: ubuntu-24.04, cxx: clang++-14, gen: "-DCMAKE_CXX_COMPILER=clang++-14" , tgt: all , bt: Debug , vars: , commonvars: "-DC4CORE_USE_LIBCXX=ON"} - {name: singleheader/linux/libcxx/RelNoExc,sdir: test/test_singleheader, os: ubuntu-24.04, cxx: clang++-14, gen: "-DCMAKE_CXX_COMPILER=clang++-14 -DCMAKE_CXX_FLAGS='-fno-exceptions -fno-rtti'" , tgt: all , bt: Release, vars: , commonvars: "-DC4CORE_USE_LIBCXX=ON"} - {name: singleheader/linux/libcxx/DbgNoExc,sdir: test/test_singleheader, os: ubuntu-24.04, cxx: clang++-14, gen: "-DCMAKE_CXX_COMPILER=clang++-14 -DCMAKE_CXX_FLAGS='-fno-exceptions -fno-rtti'" , tgt: all , bt: Debug , vars: , commonvars: "-DC4CORE_USE_LIBCXX=ON"} - {name: singleheader/macos/Release , sdir: test/test_singleheader, os: macos-13 , cxx: xcode , gen: "-G Xcode -DCMAKE_OSX_ARCHITECTURES=x86_64" , tgt: ALL_BUILD, bt: Release, vars: , commonvars: } - {name: singleheader/macos/Debug , sdir: test/test_singleheader, os: macos-13 , cxx: xcode , gen: "-G Xcode -DCMAKE_OSX_ARCHITECTURES=x86_64" , tgt: ALL_BUILD, bt: Debug , vars: , commonvars: } - {name: singleheader/macos/RelNoExc , sdir: test/test_singleheader, os: macos-13 , cxx: xcode , gen: "-G Xcode -DCMAKE_OSX_ARCHITECTURES=x86_64 -DCMAKE_CXX_FLAGS='-fno-exceptions -fno-rtti'" , tgt: ALL_BUILD, bt: Release, vars: , commonvars: } - {name: singleheader/macos/DbgNoExc , sdir: test/test_singleheader, os: macos-13 , cxx: xcode , gen: "-G Xcode -DCMAKE_OSX_ARCHITECTURES=x86_64 -DCMAKE_CXX_FLAGS='-fno-exceptions -fno-rtti'" , tgt: ALL_BUILD, bt: Debug , vars: , commonvars: } - {name: singleheader/win/Release , sdir: test/test_singleheader, os: windows-2019, cxx: vs2019 , gen: "-G 'Visual Studio 16 2019' -A x64" , tgt: ALL_BUILD, bt: Release, vars: , commonvars: } - {name: singleheader/win/Debug , sdir: test/test_singleheader, os: windows-2019, cxx: vs2019 , gen: "-G 'Visual Studio 16 2019' -A x64" , tgt: ALL_BUILD, bt: Debug , vars: , commonvars: } - {name: singleheader/win/RelNoExc , sdir: test/test_singleheader, os: windows-2019, cxx: vs2019 , gen: "-G 'Visual Studio 16 2019' -A x64 -DCMAKE_CXX_FLAGS=' /EHa- /EHs- /EHc /EHr- /GR- /wd4530'", tgt: ALL_BUILD, bt: Release, vars: , commonvars: } - {name: singleheader/win/DbgNoExc , sdir: test/test_singleheader, os: windows-2019, cxx: vs2019 , gen: "-G 'Visual Studio 16 2019' -A x64 -DCMAKE_CXX_FLAGS=' /EHa- /EHs- /EHc /EHr- /GR- /wd4530'", tgt: ALL_BUILD, bt: Debug , vars: , commonvars: } env: CXX_: "${{matrix.cxx}}" BT: "${{matrix.bt}}" OS: "${{matrix.os}}" BDIR: "build/${{matrix.name}}" IDIR: "install/${{matrix.name}}" PDIR: "prefix/${{matrix.name}}" steps: - :: checkout-action - {name: install requirements, run: source .github/reqs.sh && c4_install_test_requirements $OS} - {name: show info, run: source .github/setenv.sh && c4_show_info} - name: Install python 3.9 uses: actions/setup-python@v4 with: { python-version: 3.9 } - name: dirs run: | set -x echo $BDIR echo $IDIR echo $PDIR mkdir -p $BDIR mkdir -p $IDIR mkdir -p $PDIR - name: preinstall run: | if [ "${{matrix.sdir}}" == "test/test_install" ] ; then mkdir -p $BDIR-staging cmake -S . -B $BDIR-staging -DCMAKE_INSTALL_PREFIX=$PDIR -DCMAKE_BUILD_TYPE=${{matrix.bt}} ${{matrix.gen}} ${{matrix.commonvars}} cmake --build $BDIR-staging --config ${{matrix.bt}} --target ${{matrix.tgt}} -j cmake --build $BDIR-staging --config ${{matrix.bt}} --target install fi - name: configure run: | cmake -S ${{matrix.sdir}} -B $BDIR \ -DC4CORE_BUILD_TESTS=ON \ -DC4CORE_VALGRIND=OFF \ -DCMAKE_BUILD_TYPE=${{matrix.bt}} \ -DCMAKE_INSTALL_PREFIX=$IDIR \ ${{matrix.gen}} \ ${{matrix.vars}} \ ${{matrix.commonvars}} - name: build run: | cmake --build $BDIR --config ${{matrix.bt}} --target c4core-test-build -j - name: run run: | cmake --build $BDIR --config ${{matrix.bt}} --target c4core-test-run c4core-0.2.6/.github/workflows-in/libcxx.ys000066400000000000000000000035641477602032300205610ustar00rootroot00000000000000!yamlscript/v0: :use common: :all :: workflow-setup() jobs: #---------------------------------------------------------------------------- libcxx: :: setup-job('libcxx' 'libcxx') name: libc++/${{matrix.cxx}}/c++${{matrix.std}}/${{matrix.bt}} :: runs-on-docker-c4core('22.04') strategy: fail-fast: false matrix: include: - {std: 20, cxx: clang++-17 , bt: Debug , bitlinks: shared64 static64} - {std: 20, cxx: clang++-17 , bt: Release, bitlinks: shared64 static64} - {std: 17, cxx: clang++-17 , bt: Debug , bitlinks: shared64 static64} - {std: 17, cxx: clang++-17 , bt: Release, bitlinks: shared64 static64} - {std: 14, cxx: clang++-17 , bt: Debug , bitlinks: shared64 static64} - {std: 14, cxx: clang++-17 , bt: Release, bitlinks: shared64 static64} - {std: 11, cxx: clang++-17 , bt: Debug , bitlinks: shared64 static64} - {std: 11, cxx: clang++-17 , bt: Release, bitlinks: shared64 static64} - {std: 17, cxx: clang++-9 , bt: Debug , bitlinks: shared64 static64} - {std: 17, cxx: clang++-9 , bt: Release, bitlinks: shared64 static64} - {std: 14, cxx: clang++-9 , bt: Debug , bitlinks: shared64 static64} - {std: 14, cxx: clang++-9 , bt: Release, bitlinks: shared64 static64} - {std: 11, cxx: clang++-9 , bt: Debug , bitlinks: shared64 static64} - {std: 11, cxx: clang++-9 , bt: Release, bitlinks: shared64 static64} env: LIBCXX: ON # <---- enable libc++ STD: "${{matrix.std}}" CXX_: "${{matrix.cxx}}" BT: "${{matrix.bt}}" BITLINKS: "${{matrix.bitlinks}}" VG: "${{matrix.vg}}" SAN: "${{matrix.san}}" LINT: "${{matrix.lint}}" OS: "${{matrix.os}}" steps: - :: checkout-action-docker - run: c4core-install ${{matrix.cxx}} - :: run-steps c4core-0.2.6/.github/workflows-in/macosx.ys000066400000000000000000000030331477602032300205510ustar00rootroot00000000000000!yamlscript/v0: :use common: :all :: workflow-setup() jobs: xcode: :: setup-job('macosx' 'xcode') name: xcode${{matrix.xcver}}/c++${{matrix.std}}/${{matrix.bt}} runs-on: ${{matrix.os}} strategy: fail-fast: false matrix: include: - {std: 11, cxx: xcode, xcver: 15, bt: Debug , os: macos-13, bitlinks: shared64 static64} - {std: 11, cxx: xcode, xcver: 15, bt: Release, os: macos-13, bitlinks: shared64 static64} - {std: 17, cxx: xcode, xcver: 15, bt: Debug , os: macos-13, bitlinks: shared64 static64} - {std: 17, cxx: xcode, xcver: 15, bt: Release, os: macos-13, bitlinks: shared64 static64} # - {std: 11, cxx: xcode, xcver: 14, bt: Debug , os: macos-13, bitlinks: shared64 static64} - {std: 11, cxx: xcode, xcver: 14, bt: Release, os: macos-13, bitlinks: shared64 static64} - {std: 17, cxx: xcode, xcver: 14, bt: Debug , os: macos-13, bitlinks: shared64 static64} - {std: 17, cxx: xcode, xcver: 14, bt: Release, os: macos-13, bitlinks: shared64 static64} env: {STD: "${{matrix.std}}", CXX_: "${{matrix.cxx}}", BT: "${{matrix.bt}}", BITLINKS: "${{matrix.bitlinks}}", VG: "${{matrix.vg}}", SAN: "${{matrix.san}}", LINT: "${{matrix.lint}}", OS: "${{matrix.os}}"} steps: - :: checkout-action - {name: xcode, uses: maxim-lobanov/setup-xcode@v1, with: {xcode-version: "${{matrix.xcver}}" }} - {name: install requirements, run: source .github/reqs.sh && c4_install_test_requirements $OS} - :: run-steps c4core-0.2.6/.github/workflows-in/release.ys000066400000000000000000000135111477602032300207010ustar00rootroot00000000000000!yamlscript/v0: :use common: :all :workflow-setup 'release':: push: tags: [v0.*, v1.*, v2.*] branches: [master] # useful to iterate when fixing the release: # ver=0.2.1 ; ( set -x ; git tag -d v$ver ; git push origin :v$ver ) ; (set -x ; set -e ; tbump --only-patch --non-interactive $ver ; git add -u ; git commit --amend --no-edit ; git tag --annotate --message "v$ver" "v$ver" ; git push -f --tags origin ) jobs: gettag: :: setup-job('release' 'gettag') runs-on: ubuntu-latest steps: - :: checkout-action - :: version-discover #---------------------------------------------------------------------------- # create source packages src: :: setup-job('release' 'src') needs: gettag runs-on: ubuntu-latest steps: - :: checkout-action - :: version-get-vars - name: Install python 3.9 uses: actions/setup-python@v5 with: { python-version: 3.9 } - name: Install requirements run: | sudo -E pip install git-archive-all - name: Create source packages run: | pwd ls -lFhp source vars.sh echo SRC_TAG=$SRC_TAG echo SRC_VERSION=$SRC_VERSION id=${PROJ_PKG_NAME}${SRC_VERSION} name=${id}-src mkdir -p assets git-archive-all --prefix $name assets/$name.tgz git-archive-all --prefix $name assets/$name.zip python --version python tools/amalgamate.py assets/$id.hpp - name: Save source artifacts uses: actions/upload-artifact@v4 with: {name: assets-src, path: assets} #---------------------------------------------------------------------------- # create c++ packages cpp: name: cpp/${{matrix.os}}/${{matrix.gen}} needs: gettag runs-on: ${{matrix.os}} env: {DEV: OFF, BT: Release, OS: "${{matrix.os}}", CXX_: "${{matrix.cxx}}", GEN: "${{matrix.gen}}"} strategy: fail-fast: false matrix: include: # name of the artifact | suffix (gen) | suffix (package) | cpack gen | mime type | os | cxx - {name: Ubuntu 24.04 deb , sfxg: unix64-shared-Release.deb, sfxp: ubuntu-24.04.deb , gen: DEB , mime: vnd.debian.binary-package, os: ubuntu-24.04 } - {name: Ubuntu 22.04 deb , sfxg: unix64-shared-Release.deb, sfxp: ubuntu-22.04.deb , gen: DEB , mime: vnd.debian.binary-package, os: ubuntu-22.04 } - {name: Windows VS2022 zip, sfxg: win64-shared-Release.zip , sfxp: windows-vs2022.zip , gen: ZIP , mime: zip , os: windows-2022, cxx: vs2022} - {name: Windows VS2019 zip, sfxg: win64-shared-Release.zip , sfxp: windows-vs2019.zip , gen: ZIP , mime: zip , os: windows-2019, cxx: vs2019} - {name: MacOSX sh , sfxg: apple64-shared-Release.sh, sfxp: macosx-xcode.sh , gen: STGZ , mime: x-sh , os: macos-13 , cxx: xcode } steps: - :: checkout-action - :: version-get-vars - {name: install requirements, run: source .github/reqs.sh && c4_install_test_requirements $OS} - {name: show info, run: source .github/setenv.sh && c4_show_info } - name: shared64-configure--------------------------------------------------- run: source .github/setenv.sh && c4_cfg_test shared64 - {name: shared64-build, run: source .github/setenv.sh && c4_build_target shared64} - name: shared64-pack run: source .github/setenv.sh && c4_package shared64 $GEN - name: shared64-normalize run: | set -x source vars.sh ls -lFhp . ls -lFhp ./build ls -lFhp ./build/shared64 mkdir -p assets asset_src=`ls -1 ./build/shared64/${PROJ_PFX_TARGET}*-${{matrix.sfxg}}` asset_dst=./assets/${PROJ_PKG_NAME}${SRC_VERSION}-${{matrix.sfxp}} [ ! -f $asset_src ] && exit 1 cp -fav $asset_src $asset_dst - name: Save artifacts uses: actions/upload-artifact@v4 with: {name: "assets-cpp-${{matrix.os}}-${{matrix.cxx}}", path: assets} #---------------------------------------------------------------------------- merge_artifacts: :: setup-job('release' 'merge_artifacts') runs-on: ubuntu-latest needs: [src, cpp] steps: - name: Merge assets artifacts uses: actions/upload-artifact/merge@v4 with: name: assets pattern: assets-* separate-directories: true delete-merged: true #---------------------------------------------------------------------------- release: runs-on: ubuntu-latest needs: - merge_artifacts steps: - :: checkout-action - name: Gather artifacts - ./assets uses: actions/download-artifact@v4 with: {name: assets, pattern: assets} - name: Verify existing artifacts run: | ls -lFhp . ls -lFhp assets*/ || echo 'none found' ( \ mkdir -p assets cd assets ; \ for asset in ../assets-*/ ; do \ ls -lFhpA $asset/ ; \ mv -v $asset/* . ; \ rmdir $asset ; \ done ; ) ls -lFhp assets*/ || echo 'none found' # # Github - :: version-get-vars - name: Create Github Release if: contains(github.ref, 'tags/v') id: create_release uses: actions/create-release@v1 env: { GITHUB_TOKEN: "${{secrets.GITHUB_TOKEN}}" } with: tag_name: ${{github.ref}} release_name: Release ${{env.SRC_VERSION}} body_path: ${{env.SRC_VERSION_BODY}} draft: true prerelease: ${{contains(github.ref, 'rc')}} - name: Upload assets to Github Release if: contains(github.ref, 'tags/v') uses: dwenegar/upload-release-assets@v1 env: { GITHUB_TOKEN: "${{secrets.GITHUB_TOKEN}}" } with: release_id: ${{steps.create_release.outputs.id}} assets_path: ./assets/ c4core-0.2.6/.github/workflows-in/share/000077500000000000000000000000001477602032300200055ustar00rootroot00000000000000c4core-0.2.6/.github/workflows-in/share/env.yaml000066400000000000000000000002671477602032300214660ustar00rootroot00000000000000STD: ${{matrix.std}} CXX_: ${{matrix.cxx}} BT: ${{matrix.bt}} BITLINKS: ${{matrix.bitlinks}} VG: ${{matrix.vg}} SAN: ${{matrix.san}} LINT: ${{matrix.lint}} OS: ${{matrix.os}} c4core-0.2.6/.github/workflows-in/windows.ys000066400000000000000000000162131477602032300207550ustar00rootroot00000000000000!yamlscript/v0: :use common: :all :: workflow-setup() jobs: #---------------------------------------------------------------------------- windows: :: setup-job('windows' 'windows') name: ${{matrix.cxx}}/c++${{matrix.std}}/${{matrix.bt}} continue-on-error: true if: always() # https://stackoverflow.com/questions/62045967/github-actions-is-there-a-way-to-continue-on-error-while-still-getting-correct runs-on: ${{matrix.os}} strategy: fail-fast: false matrix: include: # github retired windows-2016 #- {std: 11, cxx: vs2017, bt: Debug , os: windows-2016, bitlinks: shared64 static32} #- {std: 11, cxx: vs2017, bt: Release, os: windows-2016, bitlinks: shared64 static32} #- {std: 14, cxx: vs2017, bt: Debug , os: windows-2016, bitlinks: shared64 static32} #- {std: 14, cxx: vs2017, bt: Release, os: windows-2016, bitlinks: shared64 static32} # - {std: 11, cxx: vs2019, bt: Debug , os: windows-2019, bitlinks: shared64 static32} - {std: 11, cxx: vs2019, bt: Release, os: windows-2019, bitlinks: shared64 static32} - {std: 14, cxx: vs2019, bt: Debug , os: windows-2019, bitlinks: shared64 static32} - {std: 14, cxx: vs2019, bt: Release, os: windows-2019, bitlinks: shared64 static32} - {std: 17, cxx: vs2019, bt: Debug , os: windows-2019, bitlinks: shared64 static32} - {std: 17, cxx: vs2019, bt: Release, os: windows-2019, bitlinks: shared64 static32} # - {std: 11, cxx: vs2022, bt: Debug , os: windows-2022, bitlinks: shared64 static32} - {std: 11, cxx: vs2022, bt: Release, os: windows-2022, bitlinks: shared64 static32} - {std: 14, cxx: vs2022, bt: Debug , os: windows-2022, bitlinks: shared64 static32} - {std: 14, cxx: vs2022, bt: Release, os: windows-2022, bitlinks: shared64 static32} - {std: 17, cxx: vs2022, bt: Debug , os: windows-2022, bitlinks: shared64 static32} - {std: 17, cxx: vs2022, bt: Release, os: windows-2022, bitlinks: shared64 static32} - {std: 20, cxx: vs2022, bt: Debug , os: windows-2022, bitlinks: shared64 static32} - {std: 20, cxx: vs2022, bt: Release, os: windows-2022, bitlinks: shared64 static32} env: {STD: "${{matrix.std}}", CXX_: "${{matrix.cxx}}", BT: "${{matrix.bt}}", BITLINKS: "${{matrix.bitlinks}}", VG: "${{matrix.vg}}", SAN: "${{matrix.san}}", LINT: "${{matrix.lint}}", OS: "${{matrix.os}}"} steps: - :: checkout-action - {name: install requirements, run: source .github/reqs.sh && c4_install_test_requirements $OS} - :: run-steps #---------------------------------------------------------------------------- noexc: :: setup-job('windows' 'noexc') name: noexc/${{matrix.cxx}}/c++${{matrix.std}}/${{matrix.bt}} runs-on: ${{matrix.os}} strategy: fail-fast: false matrix: include: - {std: 11, cxx: vs2022, bt: Debug , os: windows-2022, bitlinks: shared64 static32} - {std: 11, cxx: vs2022, bt: Release, os: windows-2022, bitlinks: shared64 static32} - {std: 20, cxx: vs2022, bt: Debug , os: windows-2022, bitlinks: shared64 static32} - {std: 20, cxx: vs2022, bt: Release, os: windows-2022, bitlinks: shared64 static32} # https://learn.microsoft.com/en-us/cpp/build/reference/eh-exception-handling-model?view=msvc-170 # https://learn.microsoft.com/en-us/cpp/build/reference/gr-enable-run-time-type-information?view=msvc-170 env: {CXXFLAGS: "/EHa- /EHs- /EHc /EHr- /GR- /wd4530", STD: "${{matrix.std}}", CXX_: "${{matrix.cxx}}", BT: "${{matrix.bt}}", BITLINKS: "${{matrix.bitlinks}}", VG: "${{matrix.vg}}", SAN: "${{matrix.san}}", LINT: "${{matrix.lint}}", OS: "${{matrix.os}}"} steps: - :: checkout-action - {name: install requirements, run: source .github/reqs.sh && c4_install_test_requirements $OS} - :: run-steps #---------------------------------------------------------------------------- clang: :: setup-job('windows' 'clang') name: clang/${{matrix.cxx}}/c++${{matrix.std}}/${{matrix.bt}} runs-on: ${{matrix.os}} strategy: fail-fast: false matrix: include: - {std: 11, cxx: vs2022, bt: Debug , os: windows-2022, bitlinks: shared64 static32} - {std: 11, cxx: vs2022, bt: Release, os: windows-2022, bitlinks: shared64 static32} env: {STD: "${{matrix.std}}", CXX_: "${{matrix.cxx}}", BT: "${{matrix.bt}}", BITLINKS: "${{matrix.bitlinks}}", VG: "${{matrix.vg}}", SAN: "${{matrix.san}}", LINT: "${{matrix.lint}}", OS: "${{matrix.os}}", BDIR: "build_${{matrix.arch}}_${{matrix.bt}}_${{matrix.std}}", IDIR: "install_${{matrix.arch}}_${{matrix.bt}}_${{matrix.std}}" } steps: - :: checkout-action - {name: show info, run: source .github/setenv.sh && c4_show_info} - name: configure run: | set -x echo BDIR=$BDIR echo IDIR=$IDIR cmake -S . -B $BDIR \ -G "Unix Makefiles" \ -DCMAKE_CXX_COMPILER=clang++ \ -DCMAKE_INSTALL_PREFIX=$IDIR \ -DCMAKE_BUILD_TYPE=${{matrix.bt}} \ -DC4_CXX_STANDARD=${{matrix.std}} \ -DCXX_STANDARD=${{matrix.std}} \ -DC4CORE_DEV=ON \ -DC4CORE_BUILD_BENCHMARKS=OFF \ -DC4CORE_SANITIZE=OFF \ -DC4CORE_LINT=OFF \ -DC4CORE_VALGRIND=OFF - name: build run: cmake --build $BDIR -j --target c4core-test-build - name: run run: cmake --build $BDIR -j --target c4core-test-run #---------------------------------------------------------------------------- # TODO how to run? arm: name: arm/${{matrix.cxx}}/c++${{matrix.std}}/${{matrix.bt}} :: setup-job('windows' 'arm') runs-on: ${{matrix.os}} strategy: fail-fast: false matrix: include: - {std: 11, cxx: vs2019, bt: Debug , os: windows-2019, bitlinks: shared64arm static32arm} - {std: 11, cxx: vs2019, bt: Release, os: windows-2019, bitlinks: shared64arm static32arm} - {std: 17, cxx: vs2019, bt: Debug , os: windows-2019, bitlinks: shared64arm static32arm} - {std: 17, cxx: vs2019, bt: Release, os: windows-2019, bitlinks: shared64arm static32arm} # # vs2022 has an internal compiler error on iarm32 Release builds: # https://github.com/biojppm/c4core/runs/5593534734?check_suite_focus=true#step:15:126 #- {std: 11, cxx: vs2022, bt: Debug , os: windows-2022, bitlinks: shared64arm static32arm} - {std: 11, cxx: vs2022, bt: Release, os: windows-2022, bitlinks: shared64arm } #- {std: 20, cxx: vs2022, bt: Debug , os: windows-2022, bitlinks: shared64arm static32arm} - {std: 20, cxx: vs2022, bt: Release, os: windows-2022, bitlinks: shared64arm } env: {STD: "${{matrix.std}}", CXX_: "${{matrix.cxx}}", BT: "${{matrix.bt}}", BITLINKS: "${{matrix.bitlinks}}", VG: "${{matrix.vg}}", SAN: "${{matrix.san}}", LINT: "${{matrix.lint}}", OS: "${{matrix.os}}"} steps: - :: checkout-action - {name: install requirements, run: source .github/reqs.sh && c4_install_test_requirements $OS} - :: run-steps-arm c4core-0.2.6/.github/workflows-in/ys/000077500000000000000000000000001477602032300173365ustar00rootroot00000000000000c4core-0.2.6/.github/workflows-in/ys/common.ys000066400000000000000000000331061477602032300212060ustar00rootroot00000000000000!yamlscript/v0 ns: common #---------------------------------------------------------- defn workflow-setup(name=nil overrides={}):: name =: name || FILE.replace(/.*\//).replace(/\.ys$/) name:: name defaults: run: # Use a bash shell so we can use the same syntax for environment # variable access regardless of the host operating system shell: bash -e -x {0} on:: merge _ overrides:: # https://github.com/orgs/community/discussions/26276 workflow_dispatch: push: branches: [master] pull_request: branches: [master] env: PROJ_PKG_NAME: c4core- PROJ_PFX_TARGET: c4core- PROJ_PFX_CMAKE: C4CORE_ CMAKE_FLAGS: NUM_JOBS_BUILD: # 4 #---------------------------------------------------------- defn bash(name): slurp: "bash/$name.bash" #---------------------------------------------------------- defn setup-job(workflowname jobname):: if: always() # https://stackoverflow.com/a/62112985/721703 #if:: | # ${{ # ( # !contains(github.event.head_commit.message, '[skip all]') # && # !contains(github.event.head_commit.message, '[skip $workflowname]') # && # !contains(github.event.head_commit.message, '[skip $workflowname.$jobname]') # ) # || # contains(github.event.head_commit.message, '[only $workflowname]') # || # contains(github.event.head_commit.message, '[only $workflowname.$jobname]') # }} continue-on-error: false #---------------------------------------------------------- defn runs-on-docker-c4core(which):: runs-on: ubuntu-24.04 container:: "ghcr.io/biojppm/c4core/ubuntu$which:latest" #---------------------------------------------------------- checkout-action =:: - name: checkout (action) uses: actions/checkout@v4 # use fetch-depth to ensure all tags are fetched with: {submodules: recursive, fetch-depth: 0} #---------------------------------------------------------- checkout-action-docker =:: - name: checkout (action + docker) uses: actions/checkout@v4 # use fetch-depth to ensure all tags are fetched with: {submodules: recursive, fetch-depth: 0} # needed for running in the docker image. # see https://github.com/actions/checkout/issues/1169 - run: git config --system --add safe.directory '*' #---------------------------------------------------------- checkout-manual =:: # This provides a manual checkout, needed because the nodejs version # prevents use of checkout@v3/v4 action on ubuntu18.04 - name: checkout (manually) run: | set -xeo pipefail env | sort echo GITHUB_SERVER_URL=$GITHUB_SERVER_URL echo GITHUB_REPOSITORY=$GITHUB_REPOSITORY echo GITHUB_REF=$GITHUB_REF echo GITHUB_REF_NAME=$GITHUB_REF_NAME echo GITHUB_HEAD_REF=$GITHUB_HEAD_REF repo=$GITHUB_SERVER_URL/$GITHUB_REPOSITORY # check the branch # https://stackoverflow.com/questions/58033366 branch=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}} echo branch=$branch # does the branch exist in the repo? if [ -z "$(git ls-remote $repo | grep $branch)" ] ; then echo "branch $branch does not exist on $repo" # refs/pull/485/merge -> pull/485/head branch=`echo ${GITHUB_REF#refs/} | sed -e 's:merge:head:g'` echo "... falling back to $branch" # does the fallback exist? if [ -z "(git ls-remote $repo | grep $branch)" ] ; then echo "branch $branch does not exist on $repo" exit 1 else echo "branch $branch exists on $repo" localbranch=$(echo $branch | sed -e 's@[/:]@_@g') branch=$branch:$localbranch echo "naming locally as $branch" fi fi # finally, create the local repo git init -q . # needed for running in the docker image. # see https://github.com/actions/checkout/issues/1169 git config --system --add safe.directory '*' # finally, do it! git remote add origin $repo git fetch origin $branch git reset --hard FETCH_HEAD git submodule update --init --recursive # show the log git log --graph --date=relative --date-order --color=always \ --pretty='%C(yellow)%h %C(cyan)%cd %Cblue%aN%C(auto)%d %Creset%s' \ | head -30 \ || echo -n # show the last commit git log --name-status HEAD^..HEAD #---------------------------------------------------------- version-env =:: - name: Env (common) run: | source vars.sh echo "SRC_TAG=$SRC_TAG" >> $GITHUB_ENV echo "SRC_VERSION=$SRC_VERSION" >> $GITHUB_ENV - name: Env (from tag) if: contains(github.ref, 'tags/v') run: | source vars.sh echo "SRC_VERSION_BODY=$SRC_VERSION_BODY" >> $GITHUB_ENV - name: Variables (from commit, no tag) if: ${{ !contains(github.ref, 'tags/v') }} run: echo 'nothing to do' version-discover =:: - name: Variables (from tag) if: contains(github.ref, 'tags/v') run: | set -exo pipefail # https://github.community/t/how-to-get-just-the-tag-name/16241/11 SRC_TAG=${GITHUB_REF#refs/tags/} SRC_VERSION=${GITHUB_REF#refs/tags/v} SRC_VERSION_BODY=`pwd`/changelog/$SRC_VERSION.md if [ ! -f $SRC_VERSION_BODY ] ; then echo "version body file was not found: $SRC_VERSION_BODY" exit 1 fi cat <> vars.sh export SRC_TAG=$SRC_TAG export SRC_VERSION=$SRC_VERSION export SRC_VERSION_BODY=$SRC_VERSION_BODY EOF - name: Variables (from commit, no tag) if: ${{ !contains(github.ref, 'tags/v') }} run: | set -exo pipefail branch_name=${GITHUB_REF#refs/heads/} # builds triggered from PRs have the branch_name like this: refs/pull/150/merge # so filter to eg pr0150_merge branch_name=`echo $branch_name | sed "s:refs/pull/\([0-9]*\)/\(.*\):pr0\1_\2:"` # sanitize the branch name; eg merge/foo-bar -> merge_foo_bar branch_name=`echo $branch_name | sed 's:[/.-]:_:g'` SRC_TAG=$(git describe || git rev-parse --short HEAD) # eg v0.2.0-110-gda837e0 SRC_VERSION="${branch_name}-${SRC_TAG}" cat < vars.sh export SRC_TAG=$SRC_TAG export SRC_VERSION=$SRC_VERSION EOF - name: Save vars.sh uses: actions/upload-artifact@v4 with: {name: vars.sh, path: ./vars.sh} - name: Show vars.sh run: cat vars.sh - name: Source vars.sh run: source vars.sh - :: version-env - name: Verify vars.sh run: env | grep SRC version-get-vars =:: - name: Download vars.sh uses: actions/download-artifact@v4 with: {name: vars.sh, path: ./} - name: Show vars.sh run: cat vars.sh - name: Source vars.sh run: source vars.sh - :: version-env - name: Verify vars.sh run: env | grep SRC #---------------------------------------------------------- install-cxx =:: - run: c4core-install ${{matrix.cxx}} #---------------------------------------------------------- run-steps =:: - name: show info run: source .github/setenv.sh && c4_show_info - name: shared64-configure--------------------------------------------------- run: source .github/setenv.sh && c4_cfg_test shared64 - {name: shared64-build, run: source .github/setenv.sh && c4_build_test shared64} - {name: shared64-run, run: source .github/setenv.sh && c4_run_test shared64} - {name: shared64-pack, run: source .github/setenv.sh && c4_package shared64} - name: static64-configure--------------------------------------------------- run: source .github/setenv.sh && c4_cfg_test static64 - {name: static64-build, run: source .github/setenv.sh && c4_build_test static64} - {name: static64-run, run: source .github/setenv.sh && c4_run_test static64} - {name: static64-pack, run: source .github/setenv.sh && c4_package static64} - name: static32-configure--------------------------------------------------- run: source .github/setenv.sh && c4_cfg_test static32 - {name: static32-build, run: source .github/setenv.sh && c4_build_test static32} - {name: static32-run, run: source .github/setenv.sh && c4_run_test static32} - {name: static32-pack, run: source .github/setenv.sh && c4_package static32} - name: shared32-configure--------------------------------------------------- run: source .github/setenv.sh && c4_cfg_test shared32 - {name: shared32-build, run: source .github/setenv.sh && c4_build_test shared32} - {name: shared32-run, run: source .github/setenv.sh && c4_run_test shared32} - {name: shared32-pack, run: source .github/setenv.sh && c4_package shared32} run-steps-arm =:: - {name: show info, run: source .github/setenv.sh && c4_show_info} - name: shared64arm-configure--------------------------------------------------- run: source .github/setenv.sh && c4_cfg_test shared64arm - {name: shared64arm-build, run: source .github/setenv.sh && c4_build_test shared64arm} #- {name: shared64arm-run, run: source .github/setenv.sh && c4_run_test shared64arm} - {name: shared64arm-pack, run: source .github/setenv.sh && c4_package shared64arm} - name: static64arm-configure--------------------------------------------------- run: source .github/setenv.sh && c4_cfg_test static64arm - {name: static64arm-build, run: source .github/setenv.sh && c4_build_test static64arm} #- {name: static64arm-run, run: source .github/setenv.sh && c4_run_test static64arm} - {name: static64arm-pack, run: source .github/setenv.sh && c4_package static64arm} - name: shared32arm-configure--------------------------------------------------- run: source .github/setenv.sh && c4_cfg_test shared32arm - {name: shared32arm-build, run: source .github/setenv.sh && c4_build_test shared32arm} #- {name: shared32arm-run, run: source .github/setenv.sh && c4_run_test shared32arm} - {name: shared32arm-pack, run: source .github/setenv.sh && c4_package shared32arm} - name: static32arm-configure--------------------------------------------------- run: source .github/setenv.sh && c4_cfg_test static32arm - {name: static32arm-build, run: source .github/setenv.sh && c4_build_test static32arm} #- {name: static32arm-run, run: source .github/setenv.sh && c4_run_test static32arm} - {name: static32arm-pack, run: source .github/setenv.sh && c4_package static32arm} #---------------------------------------------------------- defn run-gcc-manual-with-flags(buildtype flags="" cmkflags=""): run-manual-with-flags('g++' 'gcc' buildtype flags cmkflags) defn run-clang-manual-with-flags(buildtype flags="" cmkflags=""): run-manual-with-flags('clang++' 'clang' buildtype flags cmkflags) defn run-manual-with-flags(cxx cc buildtype flags="" cmkflags=""):: # $(buildtype:uc) # also in that case you could $uc(buildtype) # $() is the more general syntax for any expr # $name and ${name} for simple var expansion # those are the 4 interpolation forms - name:: "---------------------------------------------------------" run:: | echo "$buildtype ::: $flags" - name:: "configure $buildtype ::: $flags" run:: | rm -rf build/$buildtype export C4_EXTERN_DIR=`pwd`/build/extern cmake -S . -B build/$buildtype \ -DCMAKE_CXX_COMPILER=$cxx-${{matrix.cxx}} \ -DCMAKE_C_COMPILER=$cc-${{matrix.cxx}} \ -DCMAKE_BUILD_TYPE=$buildtype \ -DCMAKE_CXX_FLAGS_$(buildtype:uc)="$flags" \ -DCMAKE_C_FLAGS_$(buildtype:uc)="$flags" \ -DC4_CXX_STANDARD=${{matrix.std}} \ -DC4CORE_CXX_STANDARD=${{matrix.std}} \ -DC4CORE_BUILD_TESTS=ON \ -DC4CORE_VALGRIND=${{matrix.vg}} \ -DC4CORE_DEV=ON \ -DC4CORE_BUILD_BENCHMARKS=OFF \ -DC4CORE_DBG=OFF \ $cmkflags - name:: "build $buildtype ::: $flags" run:: | cmake --build build/$buildtype --target c4core-test-build --parallel --verbose - name:: "run $buildtype ::: $flags" run:: | cmake --build build/$buildtype --target c4core-test-run defn run-vs-manual-with-flags(gen arch buildtype shared flags="" cmkflags=""):: - name:: "---------------------------------------------------------" run:: | echo "$buildtype ::: $flags shared=$shared" - name:: "configure $buildtype ::: $flags shared=$shared" # WATCHOUT: the flags require a leading space, or # git bash will interpret the first / as the root path # and wrongly expand it to c:/Program Files/git/ run:: | rm -rf build/$buildtype export C4_EXTERN_DIR=`pwd`/build/extern cmake -S . -B build/$buildtype \ -G "$gen" -A $arch \ -DCMAKE_BUILD_TYPE=$buildtype \ -DCMAKE_CXX_FLAGS_$(buildtype:uc)=" $flags" \ -DCMAKE_C_FLAGS_$(buildtype:uc)=" $flags" \ -DBUILD_SHARED_LIBS=$shared \ -DC4_CXX_STANDARD=${{matrix.std}} \ -DC4CORE_CXX_STANDARD=${{matrix.std}} \ -DC4CORE_BUILD_TESTS=ON \ -DC4CORE_DEV=ON \ -DC4CORE_BUILD_BENCHMARKS=OFF \ -DC4CORE_DBG=OFF \ $cmkflags - name:: "build $buildtype ::: $flags shared=$shared" run:: | cmake --build build/$buildtype --target c4core-test-build --parallel --verbose - name:: "run $buildtype ::: $flags shared=$shared" run:: | cmake --build build/$buildtype --target c4core-test-run #---------------------------------------------------------- defn xcompile-steps(arch buildtype std flags=""):: - name: "-------------------------------------------------" run:: "echo $arch/c++$std/$buildtype" - name:: "configure $arch/c++$std/$buildtype" run:: | touch build rm -rf build export C4_EXTERN_DIR=`pwd`/build/extern cmake -S . -B build \ -DCMAKE_TOOLCHAIN_FILE=.github/toolchains/${{matrix.arch}}.cmake \ -DCMAKE_BUILD_TYPE=$buildtype \ -DCMAKE_CXX_FLAGS=" $flags" \ -DCMAKE_C_FLAGS=" $flags" \ -DC4_CXX_STANDARD=$std \ -DCXX_STANDARD=$std \ -DC4CORE_DEV=ON \ -DC4CORE_BUILD_BENCHMARKS=OFF \ -DC4CORE_SANITIZE=OFF \ -DC4CORE_LINT=OFF \ -DC4CORE_VALGRIND=OFF - name:: "build $arch/c++$std/$buildtype" run: | cmake --build build --parallel --target c4core-test-build --verbose - name:: "test $arch/c++$std/$buildtype" run: | cmake --build build --target c4core-test-run c4core-0.2.6/.github/workflows/000077500000000000000000000000001477602032300162775ustar00rootroot00000000000000c4core-0.2.6/.github/workflows/arch.yml000066400000000000000000000141421477602032300177410ustar00rootroot00000000000000# DO NOT EDIT - GENERATED FROM .github/workflows-in/arch.ys name: arch defaults: run: shell: bash -e -x {0} 'on': workflow_dispatch: null push: branches: - master pull_request: branches: - master env: PROJ_PKG_NAME: c4core- PROJ_PFX_TARGET: c4core- PROJ_PFX_CMAKE: C4CORE_ CMAKE_FLAGS: null NUM_JOBS_BUILD: null jobs: xcompile: if: always() continue-on-error: false name: ${{matrix.arch}} runs-on: ubuntu-24.04 strategy: fail-fast: false matrix: include: - arch: aarch64 tc: aarch64-linux-gnu - arch: armv7 tc: arm-linux-gnueabihf flags: -march=armv7+fp - arch: armv6 tc: arm-linux-gnueabi flags: -march=armv6+fp - arch: armv5 tc: arm-linux-gnueabi flags: -march=armv5te+fp - arch: armv4 tc: arm-linux-gnueabi flags: -march=armv4 - arch: loongarch64 tc: loongarch64-linux-gnu version: -14 - arch: mips tc: mips-linux-gnu - arch: mipsel tc: mipsel-linux-gnu - arch: mips64 tc: mips64-linux-gnuabi64 - arch: mips64el tc: mips64el-linux-gnuabi64 - arch: riscv64 tc: riscv64-linux-gnu - arch: s390x tc: s390x-linux-gnu - arch: ppc tc: powerpc-linux-gnu - arch: ppc64 tc: powerpc64-linux-gnu - arch: ppc64le tc: powerpc64le-linux-gnu - arch: sparc64 tc: sparc64-linux-gnu steps: - name: checkout (action) uses: actions/checkout@v4 with: submodules: recursive fetch-depth: 0 - name: install run: | sudo apt-get update sudo apt-get install -y \ gcc${{matrix.version}}-${{matrix.tc}} \ g++${{matrix.version}}-${{matrix.tc}} \ qemu-user-static - name: info run: | ${{matrix.tc}}-g++${{matrix.version}} --version ${{matrix.tc}}-g++${{matrix.version}} -dM -E - > vars.sh export SRC_TAG=$SRC_TAG export SRC_VERSION=$SRC_VERSION export SRC_VERSION_BODY=$SRC_VERSION_BODY EOF - name: Variables (from commit, no tag) if: ${{ !contains(github.ref, 'tags/v') }} run: | set -exo pipefail branch_name=${GITHUB_REF#refs/heads/} # builds triggered from PRs have the branch_name like this: refs/pull/150/merge # so filter to eg pr0150_merge branch_name=`echo $branch_name | sed "s:refs/pull/\([0-9]*\)/\(.*\):pr0\1_\2:"` # sanitize the branch name; eg merge/foo-bar -> merge_foo_bar branch_name=`echo $branch_name | sed 's:[/.-]:_:g'` SRC_TAG=$(git describe || git rev-parse --short HEAD) # eg v0.2.0-110-gda837e0 SRC_VERSION="${branch_name}-${SRC_TAG}" cat < vars.sh export SRC_TAG=$SRC_TAG export SRC_VERSION=$SRC_VERSION EOF - name: Save vars.sh uses: actions/upload-artifact@v4 with: name: vars.sh path: ./vars.sh - name: Show vars.sh run: cat vars.sh - name: Source vars.sh run: source vars.sh - name: Env (common) run: | source vars.sh echo "SRC_TAG=$SRC_TAG" >> $GITHUB_ENV echo "SRC_VERSION=$SRC_VERSION" >> $GITHUB_ENV - name: Env (from tag) if: contains(github.ref, 'tags/v') run: | source vars.sh echo "SRC_VERSION_BODY=$SRC_VERSION_BODY" >> $GITHUB_ENV - name: Variables (from commit, no tag) if: ${{ !contains(github.ref, 'tags/v') }} run: echo 'nothing to do' - name: Verify vars.sh run: env | grep SRC x64: name: bm/x64/${{matrix.comp}}/${{matrix.bt}} needs: gettag if: always() continue-on-error: false runs-on: ${{matrix.os}} strategy: fail-fast: false matrix: include: - std: 17 comp: gcc14 os: ubuntu-24.04 cmkflags: -DCMAKE_CXX_COMPILER=g++-14 -DCMAKE_C_COMPILER=gcc-14 - std: 17 comp: clang18 os: ubuntu-24.04 cmkflags: -DCMAKE_CXX_COMPILER=clang++-18 -DCMAKE_C_COMPILER=clang-18 - std: 17 comp: vs2022 os: windows-2022 cmkflags: -G 'Visual Studio 17 2022' -A x64 - std: 17 comp: xcode15 os: macos-13 xcver: 15 cmkflags: -G Xcode -DCMAKE_OSX_ARCHITECTURES=x86_64 env: BM: 'ON' STD: ${{matrix.std}} CXX_: ${{matrix.cxx}} BT: ${{matrix.bt}} BITLINKS: ${{matrix.bitlinks}} VG: ${{matrix.vg}} SAN: ${{matrix.san}} LINT: ${{matrix.lint}} OS: ${{matrix.os}} steps: - name: checkout (action) uses: actions/checkout@v4 with: submodules: recursive fetch-depth: 0 - name: Download vars.sh uses: actions/download-artifact@v4 with: name: vars.sh path: ./ - name: Show vars.sh run: cat vars.sh - name: Source vars.sh run: source vars.sh - name: Env (common) run: | source vars.sh echo "SRC_TAG=$SRC_TAG" >> $GITHUB_ENV echo "SRC_VERSION=$SRC_VERSION" >> $GITHUB_ENV - name: Env (from tag) if: contains(github.ref, 'tags/v') run: | source vars.sh echo "SRC_VERSION_BODY=$SRC_VERSION_BODY" >> $GITHUB_ENV - name: Variables (from commit, no tag) if: ${{ !contains(github.ref, 'tags/v') }} run: echo 'nothing to do' - name: Verify vars.sh run: env | grep SRC - name: install requirements run: source .github/reqs.sh && c4_install_test_requirements $OS - name: show info run: source .github/setenv.sh && c4_show_info - name: Install python 3.10 for plotting uses: actions/setup-python@v5 with: python-version: '3.10' - name: install benchmark plotting dependencies run: | which python which pip python --version pip --version pip install -v -r cmake/bm-xp/requirements.txt python -c 'import munch ; print("ok!") ; exit(0)' echo $? - name: configure------------------------------------------------- run: | cmake -S . -B build \ ${{matrix.cmkflags}} \ -DPython_EXECUTABLE="$(which python)" \ -DC4_CXX_STANDARD=${{matrix.std}} \ -DC4CORE_CXX_STANDARD=${{matrix.std}} \ -DC4CORE_BUILD_BENCHMARKS=ON - name: build run: cmake --build build --config Release --parallel --verbose --target c4core-bm-build - name: run run: cmake --build build --config Release --verbose --target c4core-bm-run - name: plot run: cmake --build build --config Release --verbose --target c4core-bm-plot - name: gather benchmark results------------------------------------------- run: | set -x source vars.sh echo SRC_TAG=$SRC_TAG echo SRC_VERSION=$SRC_VERSION desc=$SRC_TAG dst=c4core-benchmark_results/$desc/x64/${{matrix.comp}}-${{matrix.bt}} mkdir -p $dst find build -name bm-results mv -vf build/$bl/bm/bm-results/* $dst/. - name: upload benchmark result artifacts uses: actions/upload-artifact@v4 with: name: c4core-benchmark_results-x64-${{matrix.comp}}-${{matrix.bt}} path: c4core-benchmark_results/ c4core-0.2.6/.github/workflows/clang.yml000066400000000000000000000471611477602032300201170ustar00rootroot00000000000000# DO NOT EDIT - GENERATED FROM .github/workflows-in/clang.ys name: clang defaults: run: shell: bash -e -x {0} 'on': workflow_dispatch: null push: branches: - master pull_request: branches: - master env: PROJ_PKG_NAME: c4core- PROJ_PFX_TARGET: c4core- PROJ_PFX_CMAKE: C4CORE_ CMAKE_FLAGS: null NUM_JOBS_BUILD: null jobs: canary: if: always() continue-on-error: false name: canary/${{matrix.cxx}}/c++${{matrix.std}}/${{matrix.bt}} runs-on: ubuntu-24.04 container: ghcr.io/biojppm/c4core/ubuntu22.04:latest strategy: fail-fast: false matrix: include: - std: 20 cxx: clang++-18 bt: Debug bitlinks: shared64 static32 - std: 20 cxx: clang++-18 bt: Release bitlinks: shared64 static32 - std: 11 cxx: clang++-18 bt: Debug bitlinks: shared64 static32 - std: 11 cxx: clang++-18 bt: Release bitlinks: shared64 static32 env: STD: ${{matrix.std}} CXX_: ${{matrix.cxx}} BT: ${{matrix.bt}} BITLINKS: ${{matrix.bitlinks}} VG: ${{matrix.vg}} SAN: ${{matrix.san}} LINT: ${{matrix.lint}} OS: ${{matrix.os}} steps: - name: checkout (action + docker) uses: actions/checkout@v4 with: submodules: recursive fetch-depth: 0 - run: git config --system --add safe.directory '*' - run: c4core-install ${{matrix.cxx}} - name: show info run: source .github/setenv.sh && c4_show_info - name: shared64-configure--------------------------------------------------- run: source .github/setenv.sh && c4_cfg_test shared64 - name: shared64-build run: source .github/setenv.sh && c4_build_test shared64 - name: shared64-run run: source .github/setenv.sh && c4_run_test shared64 - name: shared64-pack run: source .github/setenv.sh && c4_package shared64 - name: static64-configure--------------------------------------------------- run: source .github/setenv.sh && c4_cfg_test static64 - name: static64-build run: source .github/setenv.sh && c4_build_test static64 - name: static64-run run: source .github/setenv.sh && c4_run_test static64 - name: static64-pack run: source .github/setenv.sh && c4_package static64 - name: static32-configure--------------------------------------------------- run: source .github/setenv.sh && c4_cfg_test static32 - name: static32-build run: source .github/setenv.sh && c4_build_test static32 - name: static32-run run: source .github/setenv.sh && c4_run_test static32 - name: static32-pack run: source .github/setenv.sh && c4_package static32 - name: shared32-configure--------------------------------------------------- run: source .github/setenv.sh && c4_cfg_test shared32 - name: shared32-build run: source .github/setenv.sh && c4_build_test shared32 - name: shared32-run run: source .github/setenv.sh && c4_run_test shared32 - name: shared32-pack run: source .github/setenv.sh && c4_package shared32 noexceptions: if: always() continue-on-error: false name: noexc/${{matrix.cxx}}/c++${{matrix.std}}/${{matrix.bt}} runs-on: ubuntu-24.04 container: ghcr.io/biojppm/c4core/ubuntu22.04:latest strategy: fail-fast: false matrix: include: - std: 20 cxx: clang++-18 bt: Debug bitlinks: shared64 static32 - std: 20 cxx: clang++-18 bt: Release bitlinks: shared64 static32 - std: 11 cxx: clang++-18 bt: Debug bitlinks: shared64 static32 - std: 11 cxx: clang++-18 bt: Release bitlinks: shared64 static32 env: CXXFLAGS: -fno-exceptions -fno-rtti STD: ${{matrix.std}} CXX_: ${{matrix.cxx}} BT: ${{matrix.bt}} BITLINKS: ${{matrix.bitlinks}} VG: ${{matrix.vg}} SAN: ${{matrix.san}} LINT: ${{matrix.lint}} OS: ${{matrix.os}} steps: - name: checkout (action + docker) uses: actions/checkout@v4 with: submodules: recursive fetch-depth: 0 - run: git config --system --add safe.directory '*' - run: c4core-install ${{matrix.cxx}} - name: show info run: source .github/setenv.sh && c4_show_info - name: shared64-configure--------------------------------------------------- run: source .github/setenv.sh && c4_cfg_test shared64 - name: shared64-build run: source .github/setenv.sh && c4_build_test shared64 - name: shared64-run run: source .github/setenv.sh && c4_run_test shared64 - name: shared64-pack run: source .github/setenv.sh && c4_package shared64 - name: static64-configure--------------------------------------------------- run: source .github/setenv.sh && c4_cfg_test static64 - name: static64-build run: source .github/setenv.sh && c4_build_test static64 - name: static64-run run: source .github/setenv.sh && c4_run_test static64 - name: static64-pack run: source .github/setenv.sh && c4_package static64 - name: static32-configure--------------------------------------------------- run: source .github/setenv.sh && c4_cfg_test static32 - name: static32-build run: source .github/setenv.sh && c4_build_test static32 - name: static32-run run: source .github/setenv.sh && c4_run_test static32 - name: static32-pack run: source .github/setenv.sh && c4_package static32 - name: shared32-configure--------------------------------------------------- run: source .github/setenv.sh && c4_cfg_test shared32 - name: shared32-build run: source .github/setenv.sh && c4_build_test shared32 - name: shared32-run run: source .github/setenv.sh && c4_run_test shared32 - name: shared32-pack run: source .github/setenv.sh && c4_package shared32 extended: if: always() continue-on-error: false name: extended/${{matrix.cxx}}/c++${{matrix.std}}/vg${{matrix.vg}} runs-on: ubuntu-24.04 container: ghcr.io/biojppm/c4core/ubuntu${{matrix.img}}:latest strategy: fail-fast: false matrix: include: - std: 20 cxx: 18 bits: 64 vg: 'ON' img: 22.04 - std: 20 cxx: 18 bits: 32 vg: 'ON' img: 22.04 - std: 17 cxx: 18 bits: 64 vg: 'ON' img: 22.04 - std: 17 cxx: 18 bits: 32 vg: 'ON' img: 22.04 - std: 14 cxx: 18 bits: 64 vg: 'ON' img: 22.04 - std: 14 cxx: 18 bits: 32 vg: 'ON' img: 22.04 - std: 11 cxx: 18 bits: 64 vg: 'ON' img: 22.04 - std: 11 cxx: 18 bits: 32 vg: 'ON' img: 22.04 - std: 11 cxx: 17 bits: 64 vg: 'OFF' img: 22.04 - std: 11 cxx: 17 bits: 32 vg: 'OFF' img: 22.04 - std: 11 cxx: 16 bits: 64 vg: 'OFF' img: 22.04 - std: 11 cxx: 16 bits: 32 vg: 'OFF' img: 22.04 - std: 11 cxx: 15 bits: 64 vg: 'OFF' img: 22.04 - std: 11 cxx: 15 bits: 32 vg: 'OFF' img: 22.04 - std: 11 cxx: 14 bits: 64 vg: 'OFF' img: 22.04 - std: 11 cxx: 14 bits: 32 vg: 'OFF' img: 22.04 - std: 11 cxx: 13 bits: 64 vg: 'OFF' img: 18.04 - std: 11 cxx: 13 bits: 32 vg: 'OFF' img: 18.04 - std: 11 cxx: 12 bits: 64 vg: 'OFF' img: 18.04 - std: 11 cxx: 12 bits: 32 vg: 'OFF' img: 18.04 - std: 11 cxx: 11 bits: 64 vg: 'OFF' img: 18.04 - std: 11 cxx: 11 bits: 32 vg: 'OFF' img: 18.04 - std: 11 cxx: 10 bits: 64 vg: 'OFF' img: 18.04 - std: 11 cxx: 10 bits: 32 vg: 'OFF' img: 18.04 - std: 11 cxx: 9 bits: 64 vg: 'OFF' img: 18.04 - std: 11 cxx: 9 bits: 32 vg: 'OFF' img: 18.04 - std: 11 cxx: 8 bits: 64 vg: 'OFF' img: 18.04 - std: 11 cxx: 8 bits: 32 vg: 'OFF' img: 18.04 - std: 11 cxx: 7 bits: 64 vg: 'OFF' img: 18.04 - std: 11 cxx: 7 bits: 32 vg: 'OFF' img: 18.04 - std: 11 cxx: '6.0' bits: 64 vg: 'OFF' img: 18.04 - std: 11 cxx: '6.0' bits: 32 vg: 'OFF' img: 18.04 - std: 11 cxx: '5.0' bits: 64 vg: 'OFF' img: 18.04 - std: 11 cxx: '5.0' bits: 32 vg: 'OFF' img: 18.04 - std: 11 cxx: '4.0' bits: 64 vg: 'OFF' img: 18.04 - std: 11 cxx: '4.0' bits: 32 vg: 'OFF' img: 18.04 - std: 11 cxx: '3.9' bits: 64 vg: 'OFF' img: 18.04 - std: 11 cxx: '3.9' bits: 32 vg: 'OFF' img: 18.04 env: STD: ${{matrix.std}} CXX_: ${{matrix.cxx}} BT: ${{matrix.bt}} BITLINKS: ${{matrix.bitlinks}} VG: ${{matrix.vg}} SAN: ${{matrix.san}} LINT: ${{matrix.lint}} OS: ${{matrix.os}} steps: - name: checkout (manually) run: | set -xeo pipefail env | sort echo GITHUB_SERVER_URL=$GITHUB_SERVER_URL echo GITHUB_REPOSITORY=$GITHUB_REPOSITORY echo GITHUB_REF=$GITHUB_REF echo GITHUB_REF_NAME=$GITHUB_REF_NAME echo GITHUB_HEAD_REF=$GITHUB_HEAD_REF repo=$GITHUB_SERVER_URL/$GITHUB_REPOSITORY # check the branch # https://stackoverflow.com/questions/58033366 branch=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}} echo branch=$branch # does the branch exist in the repo? if [ -z "$(git ls-remote $repo | grep $branch)" ] ; then echo "branch $branch does not exist on $repo" # refs/pull/485/merge -> pull/485/head branch=`echo ${GITHUB_REF#refs/} | sed -e 's:merge:head:g'` echo "... falling back to $branch" # does the fallback exist? if [ -z "(git ls-remote $repo | grep $branch)" ] ; then echo "branch $branch does not exist on $repo" exit 1 else echo "branch $branch exists on $repo" localbranch=$(echo $branch | sed -e 's@[/:]@_@g') branch=$branch:$localbranch echo "naming locally as $branch" fi fi # finally, create the local repo git init -q . # needed for running in the docker image. # see https://github.com/actions/checkout/issues/1169 git config --system --add safe.directory '*' # finally, do it! git remote add origin $repo git fetch origin $branch git reset --hard FETCH_HEAD git submodule update --init --recursive # show the log git log --graph --date=relative --date-order --color=always \ --pretty='%C(yellow)%h %C(cyan)%cd %Cblue%aN%C(auto)%d %Creset%s' \ | head -30 \ || echo -n # show the last commit git log --name-status HEAD^..HEAD - run: c4core-install clang++-${{matrix.cxx}} - name: '---------------------------------------------------------' run: | echo "Debug ::: -m${{matrix.bits}}" - name: 'configure Debug ::: -m${{matrix.bits}}' run: "rm -rf build/Debug\nexport C4_EXTERN_DIR=`pwd`/build/extern\ncmake -S . -B build/Debug \\\n -DCMAKE_CXX_COMPILER=clang++-${{matrix.cxx}} \\\n -DCMAKE_C_COMPILER=clang-${{matrix.cxx}} \\\n -DCMAKE_BUILD_TYPE=Debug \\\n -DCMAKE_CXX_FLAGS_DEBUG=\"-m${{matrix.bits}}\" \\\n -DCMAKE_C_FLAGS_DEBUG=\"-m${{matrix.bits}}\" \\\n -DC4_CXX_STANDARD=${{matrix.std}} \\\n -DC4CORE_CXX_STANDARD=${{matrix.std}} \\\n -DC4CORE_BUILD_TESTS=ON \\\n -DC4CORE_VALGRIND=${{matrix.vg}} \\\n -DC4CORE_DEV=ON \\\n -DC4CORE_BUILD_BENCHMARKS=OFF \\\n -DC4CORE_DBG=OFF \\\n \n" - name: 'build Debug ::: -m${{matrix.bits}}' run: | cmake --build build/Debug --target c4core-test-build --parallel --verbose - name: 'run Debug ::: -m${{matrix.bits}}' run: | cmake --build build/Debug --target c4core-test-run - name: '---------------------------------------------------------' run: | echo "Release ::: -O1 -DNDEBUG -m${{matrix.bits}}" - name: 'configure Release ::: -O1 -DNDEBUG -m${{matrix.bits}}' run: "rm -rf build/Release\nexport C4_EXTERN_DIR=`pwd`/build/extern\ncmake -S . -B build/Release \\\n -DCMAKE_CXX_COMPILER=clang++-${{matrix.cxx}} \\\n -DCMAKE_C_COMPILER=clang-${{matrix.cxx}} \\\n -DCMAKE_BUILD_TYPE=Release \\\n -DCMAKE_CXX_FLAGS_RELEASE=\"-O1 -DNDEBUG -m${{matrix.bits}}\" \\\n -DCMAKE_C_FLAGS_RELEASE=\"-O1 -DNDEBUG -m${{matrix.bits}}\" \\\n -DC4_CXX_STANDARD=${{matrix.std}} \\\n -DC4CORE_CXX_STANDARD=${{matrix.std}} \\\n -DC4CORE_BUILD_TESTS=ON \\\n -DC4CORE_VALGRIND=${{matrix.vg}} \\\n -DC4CORE_DEV=ON \\\n -DC4CORE_BUILD_BENCHMARKS=OFF \\\n -DC4CORE_DBG=OFF \\\n \n" - name: 'build Release ::: -O1 -DNDEBUG -m${{matrix.bits}}' run: | cmake --build build/Release --target c4core-test-build --parallel --verbose - name: 'run Release ::: -O1 -DNDEBUG -m${{matrix.bits}}' run: | cmake --build build/Release --target c4core-test-run - name: '---------------------------------------------------------' run: | echo "Release ::: -O2 -DNDEBUG -m${{matrix.bits}}" - name: 'configure Release ::: -O2 -DNDEBUG -m${{matrix.bits}}' run: "rm -rf build/Release\nexport C4_EXTERN_DIR=`pwd`/build/extern\ncmake -S . -B build/Release \\\n -DCMAKE_CXX_COMPILER=clang++-${{matrix.cxx}} \\\n -DCMAKE_C_COMPILER=clang-${{matrix.cxx}} \\\n -DCMAKE_BUILD_TYPE=Release \\\n -DCMAKE_CXX_FLAGS_RELEASE=\"-O2 -DNDEBUG -m${{matrix.bits}}\" \\\n -DCMAKE_C_FLAGS_RELEASE=\"-O2 -DNDEBUG -m${{matrix.bits}}\" \\\n -DC4_CXX_STANDARD=${{matrix.std}} \\\n -DC4CORE_CXX_STANDARD=${{matrix.std}} \\\n -DC4CORE_BUILD_TESTS=ON \\\n -DC4CORE_VALGRIND=${{matrix.vg}} \\\n -DC4CORE_DEV=ON \\\n -DC4CORE_BUILD_BENCHMARKS=OFF \\\n -DC4CORE_DBG=OFF \\\n \n" - name: 'build Release ::: -O2 -DNDEBUG -m${{matrix.bits}}' run: | cmake --build build/Release --target c4core-test-build --parallel --verbose - name: 'run Release ::: -O2 -DNDEBUG -m${{matrix.bits}}' run: | cmake --build build/Release --target c4core-test-run - name: '---------------------------------------------------------' run: | echo "Release ::: -O3 -DNDEBUG -m${{matrix.bits}}" - name: 'configure Release ::: -O3 -DNDEBUG -m${{matrix.bits}}' run: "rm -rf build/Release\nexport C4_EXTERN_DIR=`pwd`/build/extern\ncmake -S . -B build/Release \\\n -DCMAKE_CXX_COMPILER=clang++-${{matrix.cxx}} \\\n -DCMAKE_C_COMPILER=clang-${{matrix.cxx}} \\\n -DCMAKE_BUILD_TYPE=Release \\\n -DCMAKE_CXX_FLAGS_RELEASE=\"-O3 -DNDEBUG -m${{matrix.bits}}\" \\\n -DCMAKE_C_FLAGS_RELEASE=\"-O3 -DNDEBUG -m${{matrix.bits}}\" \\\n -DC4_CXX_STANDARD=${{matrix.std}} \\\n -DC4CORE_CXX_STANDARD=${{matrix.std}} \\\n -DC4CORE_BUILD_TESTS=ON \\\n -DC4CORE_VALGRIND=${{matrix.vg}} \\\n -DC4CORE_DEV=ON \\\n -DC4CORE_BUILD_BENCHMARKS=OFF \\\n -DC4CORE_DBG=OFF \\\n \n" - name: 'build Release ::: -O3 -DNDEBUG -m${{matrix.bits}}' run: | cmake --build build/Release --target c4core-test-build --parallel --verbose - name: 'run Release ::: -O3 -DNDEBUG -m${{matrix.bits}}' run: | cmake --build build/Release --target c4core-test-run - name: '---------------------------------------------------------' run: | echo "Release ::: -Os -DNDEBUG -m${{matrix.bits}}" - name: 'configure Release ::: -Os -DNDEBUG -m${{matrix.bits}}' run: "rm -rf build/Release\nexport C4_EXTERN_DIR=`pwd`/build/extern\ncmake -S . -B build/Release \\\n -DCMAKE_CXX_COMPILER=clang++-${{matrix.cxx}} \\\n -DCMAKE_C_COMPILER=clang-${{matrix.cxx}} \\\n -DCMAKE_BUILD_TYPE=Release \\\n -DCMAKE_CXX_FLAGS_RELEASE=\"-Os -DNDEBUG -m${{matrix.bits}}\" \\\n -DCMAKE_C_FLAGS_RELEASE=\"-Os -DNDEBUG -m${{matrix.bits}}\" \\\n -DC4_CXX_STANDARD=${{matrix.std}} \\\n -DC4CORE_CXX_STANDARD=${{matrix.std}} \\\n -DC4CORE_BUILD_TESTS=ON \\\n -DC4CORE_VALGRIND=${{matrix.vg}} \\\n -DC4CORE_DEV=ON \\\n -DC4CORE_BUILD_BENCHMARKS=OFF \\\n -DC4CORE_DBG=OFF \\\n \n" - name: 'build Release ::: -Os -DNDEBUG -m${{matrix.bits}}' run: | cmake --build build/Release --target c4core-test-build --parallel --verbose - name: 'run Release ::: -Os -DNDEBUG -m${{matrix.bits}}' run: | cmake --build build/Release --target c4core-test-run clangsan: if: always() continue-on-error: false name: ${{matrix.bt}}/c++${{matrix.std}} runs-on: ubuntu-24.04 container: ghcr.io/biojppm/c4core/ubuntu22.04:latest strategy: fail-fast: false matrix: include: - std: 11 cxx: 18 bt: asan - std: 20 cxx: 18 bt: asan - std: 11 cxx: 18 bt: lsan - std: 20 cxx: 18 bt: lsan - std: 11 cxx: 18 bt: tsan - std: 20 cxx: 18 bt: tsan - std: 11 cxx: 18 bt: ubsan - std: 20 cxx: 18 bt: ubsan env: STD: ${{matrix.std}} CXX_: ${{matrix.cxx}} BT: ${{matrix.bt}} BITLINKS: ${{matrix.bitlinks}} VG: ${{matrix.vg}} SAN: ${{matrix.san}} LINT: ${{matrix.lint}} OS: ${{matrix.os}} steps: - name: checkout (action + docker) uses: actions/checkout@v4 with: submodules: recursive fetch-depth: 0 - run: git config --system --add safe.directory '*' - run: c4core-install clang++-${{matrix.cxx}} - name: '---------------------------------------------------------' run: | echo "${{matrix.bt}} ::: -m64" - name: 'configure ${{matrix.bt}} ::: -m64' run: "rm -rf build/${{matrix.bt}}\nexport C4_EXTERN_DIR=`pwd`/build/extern\ncmake -S . -B build/${{matrix.bt}} \\\n -DCMAKE_CXX_COMPILER=clang++-${{matrix.cxx}} \\\n -DCMAKE_C_COMPILER=clang-${{matrix.cxx}} \\\n -DCMAKE_BUILD_TYPE=${{matrix.bt}} \\\n -DCMAKE_CXX_FLAGS_${{MATRIX.BT}}=\"-m64\" \\\n -DCMAKE_C_FLAGS_${{MATRIX.BT}}=\"-m64\" \\\n -DC4_CXX_STANDARD=${{matrix.std}} \\\n -DC4CORE_CXX_STANDARD=${{matrix.std}} \\\n -DC4CORE_BUILD_TESTS=ON \\\n -DC4CORE_VALGRIND=${{matrix.vg}} \\\n -DC4CORE_DEV=ON \\\n -DC4CORE_BUILD_BENCHMARKS=OFF \\\n -DC4CORE_DBG=OFF \\\n \n" - name: 'build ${{matrix.bt}} ::: -m64' run: | cmake --build build/${{matrix.bt}} --target c4core-test-build --parallel --verbose - name: 'run ${{matrix.bt}} ::: -m64' run: | cmake --build build/${{matrix.bt}} --target c4core-test-run c4core-0.2.6/.github/workflows/clang_tidy.yml000066400000000000000000000035561477602032300211500ustar00rootroot00000000000000# DO NOT EDIT - GENERATED FROM .github/workflows-in/clang_tidy.ys name: clang_tidy defaults: run: shell: bash -e -x {0} 'on': workflow_dispatch: null push: branches: - master pull_request: branches: - master env: PROJ_PKG_NAME: c4core- PROJ_PFX_TARGET: c4core- PROJ_PFX_CMAKE: C4CORE_ CMAKE_FLAGS: null NUM_JOBS_BUILD: null jobs: clang_tidy: if: always() continue-on-error: false runs-on: ubuntu-24.04 container: ghcr.io/biojppm/c4core/ubuntu22.04:latest name: clang_tidy/c++${{matrix.std}}/${{matrix.bt}} strategy: fail-fast: false matrix: include: - std: 11 clang: 18 bt: Debug bits: 64 - std: 11 clang: 18 bt: Release bits: 64 env: STD: ${{matrix.std}} CXX_: ${{matrix.cxx}} BT: ${{matrix.bt}} BITLINKS: ${{matrix.bitlinks}} VG: ${{matrix.vg}} SAN: ${{matrix.san}} LINT: ${{matrix.lint}} OS: ${{matrix.os}} steps: - name: checkout (action + docker) uses: actions/checkout@v4 with: submodules: recursive fetch-depth: 0 - run: git config --system --add safe.directory '*' - name: install run: c4core-install clang++-${{matrix.clang}} - name: configure run: | cmake -S . -B build \ -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \ -DCMAKE_CXX_COMPILER=clang++-${{matrix.clang}} \ -DCMAKE_C_COMPILER=clang-${{matrix.clang}} \ -DCLANG_TIDY=/usr/bin/clang-tidy-${{matrix.clang}} \ -DCMAKE_BUILD_TYPE=${{matrix.bt}} \ -DC4CORE_DEV=ON \ -DC4CORE_VALGRIND=OFF \ -DC4CORE_BUILD_TESTS=OFF \ -DC4CORE_BUILD_BENCHMARKS=OFF \ -DC4CORE_DBG=OFF - name: clang-tidy run: cmake --build build --target c4core-clang-tidy --verbose c4core-0.2.6/.github/workflows/codeql.yml000066400000000000000000000016131477602032300202720ustar00rootroot00000000000000# DO NOT EDIT - GENERATED FROM .github/workflows-in/codeql.ys name: CodeQL 'on': push: branches: - master pull_request: branches: - master schedule: - cron: 59 18 * * 1 jobs: analyze: name: Analyze runs-on: ubuntu-latest permissions: actions: read contents: read security-events: write strategy: fail-fast: false matrix: language: - cpp steps: - name: Checkout uses: actions/checkout@v3 with: submodules: recursive - name: Initialize CodeQL uses: github/codeql-action/init@v2 with: languages: ${{ matrix.language }} queries: +security-and-quality - name: Autobuild uses: github/codeql-action/autobuild@v2 - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@v2 with: category: /language:${{ matrix.language }} c4core-0.2.6/.github/workflows/coverage.yml000066400000000000000000000063251477602032300206230ustar00rootroot00000000000000# DO NOT EDIT - GENERATED FROM .github/workflows-in/coverage.ys name: coverage defaults: run: shell: bash -e -x {0} 'on': workflow_dispatch: null push: branches: - master pull_request: branches: - master env: PROJ_PKG_NAME: c4core- PROJ_PFX_TARGET: c4core- PROJ_PFX_CMAKE: C4CORE_ CMAKE_FLAGS: null NUM_JOBS_BUILD: null jobs: coverage: if: always() continue-on-error: false name: cov/c++${{matrix.std}}/${{matrix.namesfx}} runs-on: ubuntu-24.04 strategy: fail-fast: false matrix: include: - std: 11 namesfx: 32bit cmk: -DCMAKE_CXX_FLAGS=-m32 - std: 11 namesfx: 64bit cmk: -DCMAKE_CXX_FLAGS=-m64 - std: 11 namesfx: 64bit_no_ff cmk: -DCMAKE_CXX_FLAGS=-m64 -DC4CORE_WITH_FASTFLOAT=OFF - std: 17 namesfx: 32bit cmk: -DCMAKE_CXX_FLAGS=-m32 - std: 17 namesfx: 64bit cmk: -DCMAKE_CXX_FLAGS=-m64 - std: 17 namesfx: 64bit_no_ff cmk: -DCMAKE_CXX_FLAGS=-m64 -DC4CORE_WITH_FASTFLOAT=OFF env: GCC_VERSION: 13 LCOV_ARGS: -v --ignore-errors mismatch,mismatch --ignore-errors unused,unused BUILD_ID: cpp${{matrix.std}}_${{matrix.namesfx}} CODECOV_TOKEN: ${{secrets.CODECOV_TOKEN}} steps: - name: checkout (action) uses: actions/checkout@v4 with: submodules: recursive fetch-depth: 0 - name: install compiler run: | sudo dpkg --add-architecture i386 sudo apt-get update sudo apt-get install -y \ build-essential \ cmake \ git \ lcov \ linux-libc-dev:i386 \ libc6:i386 \ libc6-dev:i386 \ libc6-dbg:i386 \ g++-$GCC_VERSION \ g++-$GCC_VERSION-multilib - name: show info run: source .github/setenv.sh && c4_show_info - name: configure run: | cmake -B build/$BUILD_ID \ -DCMAKE_BUILD_TYPE=Coverage \ -DC4CORE_BUILD_TESTS=ON \ -DC4CORE_COVERAGE_LCOV_ARGS=" $LCOV_ARGS " \ -DC4CORE_COVERAGE_CODECOV=ON \ ${{matrix.cmk}} - name: build run: | cmake --build build/$BUILD_ID --verbose --target c4core-test-build --parallel - name: run run: | cmake --build build/$BUILD_ID --verbose --target c4core-coverage - name: upload artifacts uses: actions/upload-artifact@v4 with: name: coverage-${{env.BUILD_ID}} path: | build/${{env.BUILD_ID}}/lcov build/${{env.BUILD_ID}}/coverage3-final_filtered.lcov - name: upload codecov run: | cmake --build build/$BUILD_ID --target c4core-coverage-submit-codecov --verbose - name: upload coveralls uses: coverallsapp/github-action@v2 with: github-token: ${{secrets.COVERALLS_REPO_TOKEN}} parallel: true files: build/${{env.BUILD_ID}}/coverage3-final_filtered.lcov coveralls_finish: needs: coverage if: ${{always()}} runs-on: ubuntu-24.04 steps: - name: Coveralls Finished uses: coverallsapp/github-action@v2 with: parallel-finished: true c4core-0.2.6/.github/workflows/emscripten.yml000066400000000000000000000037441477602032300212030ustar00rootroot00000000000000# DO NOT EDIT - GENERATED FROM .github/workflows-in/emscripten.ys name: emscripten defaults: run: shell: bash -e -x {0} 'on': workflow_dispatch: null push: branches: - master pull_request: branches: - master env: PROJ_PFX_TARGET: c4core- PROJ_PFX_CMAKE: C4CORE_ CMAKE_FLAGS: null NUM_JOBS_BUILD: null jobs: emscripten: name: emscripten/${{matrix.emver}}/c++${{matrix.std}}/${{matrix.bt}} continue-on-error: true if: always() runs-on: ${{matrix.os}} strategy: fail-fast: false matrix: include: - std: 11 cxx: em++ emver: 3.1.61 bt: Release os: ubuntu-latest bitlinks: static32 - std: 20 cxx: em++ emver: 3.1.61 bt: Release os: ubuntu-latest bitlinks: static32 env: STD: ${{matrix.std}} CXX_: ${{matrix.cxx}} BT: ${{matrix.bt}} BITLINKS: ${{matrix.bitlinks}} VG: ${{matrix.vg}} SAN: ${{matrix.san}} LINT: ${{matrix.lint}} OS: ${{matrix.os}} EM_VERSION: ${{matrix.emver}} EM_CACHE_FOLDER: emsdk-cache steps: - name: checkout uses: actions/checkout@v3 with: submodules: recursive - name: setup emscripten cache id: cache-system-libraries uses: actions/cache@v3 with: path: ${{env.EM_CACHE_FOLDER}} key: ${{env.EM_VERSION}}-${{runner.os}} - name: setup emscripten uses: mymindstorm/setup-emsdk@v14 with: version: ${{matrix.emver}} actions-cache-folder: ${{env.EM_CACHE_FOLDER}} - name: show info run: source .github/setenv.sh && c4_show_info - name: static32-configure--------------------------------------------------- run: source .github/setenv.sh && c4_cfg_test static32 - name: static32-build run: source .github/setenv.sh && c4_build_test static32 - name: static32-run run: source .github/setenv.sh && c4_run_test static32 c4core-0.2.6/.github/workflows/gcc.yml000066400000000000000000000723341477602032300175670ustar00rootroot00000000000000# DO NOT EDIT - GENERATED FROM .github/workflows-in/gcc.ys name: gcc defaults: run: shell: bash -e -x {0} 'on': workflow_dispatch: null push: branches: - master pull_request: branches: - master env: PROJ_PKG_NAME: c4core- PROJ_PFX_TARGET: c4core- PROJ_PFX_CMAKE: C4CORE_ CMAKE_FLAGS: null NUM_JOBS_BUILD: null jobs: canary: if: always() continue-on-error: false name: canary/${{matrix.cxx}}/c++${{matrix.std}}/${{matrix.bt}} runs-on: ubuntu-24.04 container: ghcr.io/biojppm/c4core/ubuntu${{matrix.img}}:latest strategy: fail-fast: false matrix: include: - std: 11 cxx: g++-14 bt: Debug bitlinks: shared64 static32 img: 22.04 - std: 11 cxx: g++-14 bt: Release bitlinks: shared64 static32 img: 22.04 - std: 20 cxx: g++-14 bt: Debug bitlinks: shared64 static32 img: 22.04 - std: 20 cxx: g++-14 bt: Release bitlinks: shared64 static32 img: 22.04 - std: 11 cxx: g++-5 bt: Debug bitlinks: shared64 static32 img: 18.04 - std: 11 cxx: g++-5 bt: Release bitlinks: shared64 static32 img: 18.04 - std: 11 cxx: g++-4.8 bt: Debug bitlinks: shared64 static32 img: 18.04 - std: 11 cxx: g++-4.8 bt: Release bitlinks: shared64 static32 img: 18.04 env: STD: ${{matrix.std}} CXX_: ${{matrix.cxx}} BT: ${{matrix.bt}} BITLINKS: ${{matrix.bitlinks}} VG: ${{matrix.vg}} SAN: ${{matrix.san}} LINT: ${{matrix.lint}} OS: ${{matrix.os}} steps: - name: checkout (manually) run: | set -xeo pipefail env | sort echo GITHUB_SERVER_URL=$GITHUB_SERVER_URL echo GITHUB_REPOSITORY=$GITHUB_REPOSITORY echo GITHUB_REF=$GITHUB_REF echo GITHUB_REF_NAME=$GITHUB_REF_NAME echo GITHUB_HEAD_REF=$GITHUB_HEAD_REF repo=$GITHUB_SERVER_URL/$GITHUB_REPOSITORY # check the branch # https://stackoverflow.com/questions/58033366 branch=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}} echo branch=$branch # does the branch exist in the repo? if [ -z "$(git ls-remote $repo | grep $branch)" ] ; then echo "branch $branch does not exist on $repo" # refs/pull/485/merge -> pull/485/head branch=`echo ${GITHUB_REF#refs/} | sed -e 's:merge:head:g'` echo "... falling back to $branch" # does the fallback exist? if [ -z "(git ls-remote $repo | grep $branch)" ] ; then echo "branch $branch does not exist on $repo" exit 1 else echo "branch $branch exists on $repo" localbranch=$(echo $branch | sed -e 's@[/:]@_@g') branch=$branch:$localbranch echo "naming locally as $branch" fi fi # finally, create the local repo git init -q . # needed for running in the docker image. # see https://github.com/actions/checkout/issues/1169 git config --system --add safe.directory '*' # finally, do it! git remote add origin $repo git fetch origin $branch git reset --hard FETCH_HEAD git submodule update --init --recursive # show the log git log --graph --date=relative --date-order --color=always \ --pretty='%C(yellow)%h %C(cyan)%cd %Cblue%aN%C(auto)%d %Creset%s' \ | head -30 \ || echo -n # show the last commit git log --name-status HEAD^..HEAD - name: install run: c4core-install ${{matrix.cxx}} - name: show info run: source .github/setenv.sh && c4_show_info - name: shared64-configure--------------------------------------------------- run: source .github/setenv.sh && c4_cfg_test shared64 - name: shared64-build run: source .github/setenv.sh && c4_build_test shared64 - name: shared64-run run: source .github/setenv.sh && c4_run_test shared64 - name: shared64-pack run: source .github/setenv.sh && c4_package shared64 - name: static64-configure--------------------------------------------------- run: source .github/setenv.sh && c4_cfg_test static64 - name: static64-build run: source .github/setenv.sh && c4_build_test static64 - name: static64-run run: source .github/setenv.sh && c4_run_test static64 - name: static64-pack run: source .github/setenv.sh && c4_package static64 - name: static32-configure--------------------------------------------------- run: source .github/setenv.sh && c4_cfg_test static32 - name: static32-build run: source .github/setenv.sh && c4_build_test static32 - name: static32-run run: source .github/setenv.sh && c4_run_test static32 - name: static32-pack run: source .github/setenv.sh && c4_package static32 - name: shared32-configure--------------------------------------------------- run: source .github/setenv.sh && c4_cfg_test shared32 - name: shared32-build run: source .github/setenv.sh && c4_build_test shared32 - name: shared32-run run: source .github/setenv.sh && c4_run_test shared32 - name: shared32-pack run: source .github/setenv.sh && c4_package shared32 noexceptions: if: always() continue-on-error: false name: noexceptions/${{matrix.cxx}}/c++${{matrix.std}}/${{matrix.bt}} runs-on: ubuntu-24.04 container: ghcr.io/biojppm/c4core/ubuntu${{matrix.img}}:latest strategy: fail-fast: false matrix: include: - std: 11 cxx: g++-5 bt: Debug bitlinks: shared64 static32 img: 18.04 - std: 11 cxx: g++-5 bt: Release bitlinks: shared64 static32 img: 18.04 - std: 20 cxx: g++-14 bt: Debug bitlinks: shared64 static32 img: 22.04 - std: 20 cxx: g++-14 bt: Release bitlinks: shared64 static32 img: 22.04 env: STD: ${{matrix.std}} CXX_: ${{matrix.cxx}} BT: ${{matrix.bt}} BITLINKS: ${{matrix.bitlinks}} VG: ${{matrix.vg}} SAN: ${{matrix.san}} LINT: ${{matrix.lint}} OS: ${{matrix.os}} steps: - name: checkout (manually) run: | set -xeo pipefail env | sort echo GITHUB_SERVER_URL=$GITHUB_SERVER_URL echo GITHUB_REPOSITORY=$GITHUB_REPOSITORY echo GITHUB_REF=$GITHUB_REF echo GITHUB_REF_NAME=$GITHUB_REF_NAME echo GITHUB_HEAD_REF=$GITHUB_HEAD_REF repo=$GITHUB_SERVER_URL/$GITHUB_REPOSITORY # check the branch # https://stackoverflow.com/questions/58033366 branch=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}} echo branch=$branch # does the branch exist in the repo? if [ -z "$(git ls-remote $repo | grep $branch)" ] ; then echo "branch $branch does not exist on $repo" # refs/pull/485/merge -> pull/485/head branch=`echo ${GITHUB_REF#refs/} | sed -e 's:merge:head:g'` echo "... falling back to $branch" # does the fallback exist? if [ -z "(git ls-remote $repo | grep $branch)" ] ; then echo "branch $branch does not exist on $repo" exit 1 else echo "branch $branch exists on $repo" localbranch=$(echo $branch | sed -e 's@[/:]@_@g') branch=$branch:$localbranch echo "naming locally as $branch" fi fi # finally, create the local repo git init -q . # needed for running in the docker image. # see https://github.com/actions/checkout/issues/1169 git config --system --add safe.directory '*' # finally, do it! git remote add origin $repo git fetch origin $branch git reset --hard FETCH_HEAD git submodule update --init --recursive # show the log git log --graph --date=relative --date-order --color=always \ --pretty='%C(yellow)%h %C(cyan)%cd %Cblue%aN%C(auto)%d %Creset%s' \ | head -30 \ || echo -n # show the last commit git log --name-status HEAD^..HEAD - name: install run: c4core-install ${{matrix.cxx}} - name: show info run: source .github/setenv.sh && c4_show_info - name: shared64-configure--------------------------------------------------- run: source .github/setenv.sh && c4_cfg_test shared64 - name: shared64-build run: source .github/setenv.sh && c4_build_test shared64 - name: shared64-run run: source .github/setenv.sh && c4_run_test shared64 - name: shared64-pack run: source .github/setenv.sh && c4_package shared64 - name: static64-configure--------------------------------------------------- run: source .github/setenv.sh && c4_cfg_test static64 - name: static64-build run: source .github/setenv.sh && c4_build_test static64 - name: static64-run run: source .github/setenv.sh && c4_run_test static64 - name: static64-pack run: source .github/setenv.sh && c4_package static64 - name: static32-configure--------------------------------------------------- run: source .github/setenv.sh && c4_cfg_test static32 - name: static32-build run: source .github/setenv.sh && c4_build_test static32 - name: static32-run run: source .github/setenv.sh && c4_run_test static32 - name: static32-pack run: source .github/setenv.sh && c4_package static32 - name: shared32-configure--------------------------------------------------- run: source .github/setenv.sh && c4_cfg_test shared32 - name: shared32-build run: source .github/setenv.sh && c4_build_test shared32 - name: shared32-run run: source .github/setenv.sh && c4_run_test shared32 - name: shared32-pack run: source .github/setenv.sh && c4_package shared32 extended: if: always() continue-on-error: false name: extended/${{matrix.cxx}}/${{matrix.bits}}bit/c++${{matrix.std}}/vg${{matrix.vg}} runs-on: ubuntu-24.04 container: ghcr.io/biojppm/c4core/ubuntu${{matrix.img}}:latest strategy: fail-fast: false matrix: include: - std: 11 cxx: 14 bits: 64 vg: 'ON' img: 22.04 - std: 11 cxx: 14 bits: 32 vg: 'ON' img: 22.04 - std: 14 cxx: 14 bits: 64 vg: 'ON' img: 22.04 - std: 14 cxx: 14 bits: 32 vg: 'ON' img: 22.04 - std: 17 cxx: 14 bits: 64 vg: 'ON' img: 22.04 - std: 17 cxx: 14 bits: 32 vg: 'ON' img: 22.04 - std: 20 cxx: 14 bits: 64 vg: 'ON' img: 22.04 - std: 20 cxx: 14 bits: 32 vg: 'ON' img: 22.04 - std: 11 cxx: 13 bits: 64 vg: 'OFF' img: 22.04 - std: 11 cxx: 13 bits: 32 vg: 'OFF' img: 22.04 - std: 11 cxx: 13 bits: 64 vg: 'OFF' img: 22.04 - std: 11 cxx: 13 bits: 32 vg: 'OFF' img: 22.04 - std: 11 cxx: 11 bits: 64 vg: 'OFF' img: 22.04 - std: 11 cxx: 11 bits: 32 vg: 'OFF' img: 22.04 extra_flags: -Wno-stringop-overflow - std: 11 cxx: 10 bits: 64 vg: 'OFF' img: 22.04 - std: 11 cxx: 10 bits: 32 vg: 'OFF' img: 22.04 - std: 11 cxx: 9 bits: 64 vg: 'OFF' img: 22.04 - std: 11 cxx: 9 bits: 32 vg: 'OFF' img: 22.04 - std: 11 cxx: 8 bits: 64 vg: 'OFF' img: 18.04 - std: 11 cxx: 8 bits: 32 vg: 'OFF' img: 18.04 - std: 11 cxx: 7 bits: 64 vg: 'OFF' img: 18.04 - std: 11 cxx: 7 bits: 32 vg: 'OFF' img: 18.04 - std: 11 cxx: 6 bits: 64 vg: 'OFF' img: 18.04 - std: 11 cxx: 6 bits: 32 vg: 'OFF' img: 18.04 - std: 11 cxx: 5 bits: 64 vg: 'OFF' img: 18.04 - std: 11 cxx: 5 bits: 32 vg: 'OFF' img: 18.04 - std: 11 cxx: 4.9 bits: 64 vg: 'OFF' img: 18.04 - std: 11 cxx: 4.9 bits: 32 vg: 'OFF' img: 18.04 - std: 11 cxx: 4.8 bits: 64 vg: 'OFF' img: 18.04 - std: 11 cxx: 4.8 bits: 32 vg: 'OFF' img: 18.04 env: STD: ${{matrix.std}} CXX_: ${{matrix.cxx}} BT: ${{matrix.bt}} BITLINKS: ${{matrix.bitlinks}} VG: ${{matrix.vg}} SAN: ${{matrix.san}} LINT: ${{matrix.lint}} OS: ${{matrix.os}} steps: - name: checkout (manually) run: | set -xeo pipefail env | sort echo GITHUB_SERVER_URL=$GITHUB_SERVER_URL echo GITHUB_REPOSITORY=$GITHUB_REPOSITORY echo GITHUB_REF=$GITHUB_REF echo GITHUB_REF_NAME=$GITHUB_REF_NAME echo GITHUB_HEAD_REF=$GITHUB_HEAD_REF repo=$GITHUB_SERVER_URL/$GITHUB_REPOSITORY # check the branch # https://stackoverflow.com/questions/58033366 branch=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}} echo branch=$branch # does the branch exist in the repo? if [ -z "$(git ls-remote $repo | grep $branch)" ] ; then echo "branch $branch does not exist on $repo" # refs/pull/485/merge -> pull/485/head branch=`echo ${GITHUB_REF#refs/} | sed -e 's:merge:head:g'` echo "... falling back to $branch" # does the fallback exist? if [ -z "(git ls-remote $repo | grep $branch)" ] ; then echo "branch $branch does not exist on $repo" exit 1 else echo "branch $branch exists on $repo" localbranch=$(echo $branch | sed -e 's@[/:]@_@g') branch=$branch:$localbranch echo "naming locally as $branch" fi fi # finally, create the local repo git init -q . # needed for running in the docker image. # see https://github.com/actions/checkout/issues/1169 git config --system --add safe.directory '*' # finally, do it! git remote add origin $repo git fetch origin $branch git reset --hard FETCH_HEAD git submodule update --init --recursive # show the log git log --graph --date=relative --date-order --color=always \ --pretty='%C(yellow)%h %C(cyan)%cd %Cblue%aN%C(auto)%d %Creset%s' \ | head -30 \ || echo -n # show the last commit git log --name-status HEAD^..HEAD - name: install run: c4core-install g++-${{matrix.cxx}} - name: '---------------------------------------------------------' run: | echo "Debug ::: -m${{matrix.bits}} ${{matrix.extra_flags}}" - name: 'configure Debug ::: -m${{matrix.bits}} ${{matrix.extra_flags}}' run: "rm -rf build/Debug\nexport C4_EXTERN_DIR=`pwd`/build/extern\ncmake -S . -B build/Debug \\\n -DCMAKE_CXX_COMPILER=g++-${{matrix.cxx}} \\\n -DCMAKE_C_COMPILER=gcc-${{matrix.cxx}} \\\n -DCMAKE_BUILD_TYPE=Debug \\\n -DCMAKE_CXX_FLAGS_DEBUG=\"-m${{matrix.bits}} ${{matrix.extra_flags}}\" \\\n -DCMAKE_C_FLAGS_DEBUG=\"-m${{matrix.bits}} ${{matrix.extra_flags}}\" \\\n -DC4_CXX_STANDARD=${{matrix.std}} \\\n -DC4CORE_CXX_STANDARD=${{matrix.std}} \\\n -DC4CORE_BUILD_TESTS=ON \\\n -DC4CORE_VALGRIND=${{matrix.vg}} \\\n -DC4CORE_DEV=ON \\\n -DC4CORE_BUILD_BENCHMARKS=OFF \\\n -DC4CORE_DBG=OFF \\\n \n" - name: 'build Debug ::: -m${{matrix.bits}} ${{matrix.extra_flags}}' run: | cmake --build build/Debug --target c4core-test-build --parallel --verbose - name: 'run Debug ::: -m${{matrix.bits}} ${{matrix.extra_flags}}' run: | cmake --build build/Debug --target c4core-test-run - name: '---------------------------------------------------------' run: | echo "Release ::: -O1 -DNDEBUG -m${{matrix.bits}} ${{matrix.extra_flags}}" - name: 'configure Release ::: -O1 -DNDEBUG -m${{matrix.bits}} ${{matrix.extra_flags}}' run: "rm -rf build/Release\nexport C4_EXTERN_DIR=`pwd`/build/extern\ncmake -S . -B build/Release \\\n -DCMAKE_CXX_COMPILER=g++-${{matrix.cxx}} \\\n -DCMAKE_C_COMPILER=gcc-${{matrix.cxx}} \\\n -DCMAKE_BUILD_TYPE=Release \\\n -DCMAKE_CXX_FLAGS_RELEASE=\"-O1 -DNDEBUG -m${{matrix.bits}} ${{matrix.extra_flags}}\" \\\n -DCMAKE_C_FLAGS_RELEASE=\"-O1 -DNDEBUG -m${{matrix.bits}} ${{matrix.extra_flags}}\" \\\n -DC4_CXX_STANDARD=${{matrix.std}} \\\n -DC4CORE_CXX_STANDARD=${{matrix.std}} \\\n -DC4CORE_BUILD_TESTS=ON \\\n -DC4CORE_VALGRIND=${{matrix.vg}} \\\n -DC4CORE_DEV=ON \\\n -DC4CORE_BUILD_BENCHMARKS=OFF \\\n -DC4CORE_DBG=OFF \\\n \n" - name: 'build Release ::: -O1 -DNDEBUG -m${{matrix.bits}} ${{matrix.extra_flags}}' run: | cmake --build build/Release --target c4core-test-build --parallel --verbose - name: 'run Release ::: -O1 -DNDEBUG -m${{matrix.bits}} ${{matrix.extra_flags}}' run: | cmake --build build/Release --target c4core-test-run - name: '---------------------------------------------------------' run: | echo "Release ::: -O2 -DNDEBUG -m${{matrix.bits}} ${{matrix.extra_flags}}" - name: 'configure Release ::: -O2 -DNDEBUG -m${{matrix.bits}} ${{matrix.extra_flags}}' run: "rm -rf build/Release\nexport C4_EXTERN_DIR=`pwd`/build/extern\ncmake -S . -B build/Release \\\n -DCMAKE_CXX_COMPILER=g++-${{matrix.cxx}} \\\n -DCMAKE_C_COMPILER=gcc-${{matrix.cxx}} \\\n -DCMAKE_BUILD_TYPE=Release \\\n -DCMAKE_CXX_FLAGS_RELEASE=\"-O2 -DNDEBUG -m${{matrix.bits}} ${{matrix.extra_flags}}\" \\\n -DCMAKE_C_FLAGS_RELEASE=\"-O2 -DNDEBUG -m${{matrix.bits}} ${{matrix.extra_flags}}\" \\\n -DC4_CXX_STANDARD=${{matrix.std}} \\\n -DC4CORE_CXX_STANDARD=${{matrix.std}} \\\n -DC4CORE_BUILD_TESTS=ON \\\n -DC4CORE_VALGRIND=${{matrix.vg}} \\\n -DC4CORE_DEV=ON \\\n -DC4CORE_BUILD_BENCHMARKS=OFF \\\n -DC4CORE_DBG=OFF \\\n \n" - name: 'build Release ::: -O2 -DNDEBUG -m${{matrix.bits}} ${{matrix.extra_flags}}' run: | cmake --build build/Release --target c4core-test-build --parallel --verbose - name: 'run Release ::: -O2 -DNDEBUG -m${{matrix.bits}} ${{matrix.extra_flags}}' run: | cmake --build build/Release --target c4core-test-run - name: '---------------------------------------------------------' run: | echo "Release ::: -O3 -DNDEBUG -m${{matrix.bits}} ${{matrix.extra_flags}}" - name: 'configure Release ::: -O3 -DNDEBUG -m${{matrix.bits}} ${{matrix.extra_flags}}' run: "rm -rf build/Release\nexport C4_EXTERN_DIR=`pwd`/build/extern\ncmake -S . -B build/Release \\\n -DCMAKE_CXX_COMPILER=g++-${{matrix.cxx}} \\\n -DCMAKE_C_COMPILER=gcc-${{matrix.cxx}} \\\n -DCMAKE_BUILD_TYPE=Release \\\n -DCMAKE_CXX_FLAGS_RELEASE=\"-O3 -DNDEBUG -m${{matrix.bits}} ${{matrix.extra_flags}}\" \\\n -DCMAKE_C_FLAGS_RELEASE=\"-O3 -DNDEBUG -m${{matrix.bits}} ${{matrix.extra_flags}}\" \\\n -DC4_CXX_STANDARD=${{matrix.std}} \\\n -DC4CORE_CXX_STANDARD=${{matrix.std}} \\\n -DC4CORE_BUILD_TESTS=ON \\\n -DC4CORE_VALGRIND=${{matrix.vg}} \\\n -DC4CORE_DEV=ON \\\n -DC4CORE_BUILD_BENCHMARKS=OFF \\\n -DC4CORE_DBG=OFF \\\n \n" - name: 'build Release ::: -O3 -DNDEBUG -m${{matrix.bits}} ${{matrix.extra_flags}}' run: | cmake --build build/Release --target c4core-test-build --parallel --verbose - name: 'run Release ::: -O3 -DNDEBUG -m${{matrix.bits}} ${{matrix.extra_flags}}' run: | cmake --build build/Release --target c4core-test-run - name: '---------------------------------------------------------' run: | echo "Release ::: -Os -DNDEBUG -m${{matrix.bits}} ${{matrix.extra_flags}}" - name: 'configure Release ::: -Os -DNDEBUG -m${{matrix.bits}} ${{matrix.extra_flags}}' run: "rm -rf build/Release\nexport C4_EXTERN_DIR=`pwd`/build/extern\ncmake -S . -B build/Release \\\n -DCMAKE_CXX_COMPILER=g++-${{matrix.cxx}} \\\n -DCMAKE_C_COMPILER=gcc-${{matrix.cxx}} \\\n -DCMAKE_BUILD_TYPE=Release \\\n -DCMAKE_CXX_FLAGS_RELEASE=\"-Os -DNDEBUG -m${{matrix.bits}} ${{matrix.extra_flags}}\" \\\n -DCMAKE_C_FLAGS_RELEASE=\"-Os -DNDEBUG -m${{matrix.bits}} ${{matrix.extra_flags}}\" \\\n -DC4_CXX_STANDARD=${{matrix.std}} \\\n -DC4CORE_CXX_STANDARD=${{matrix.std}} \\\n -DC4CORE_BUILD_TESTS=ON \\\n -DC4CORE_VALGRIND=${{matrix.vg}} \\\n -DC4CORE_DEV=ON \\\n -DC4CORE_BUILD_BENCHMARKS=OFF \\\n -DC4CORE_DBG=OFF \\\n \n" - name: 'build Release ::: -Os -DNDEBUG -m${{matrix.bits}} ${{matrix.extra_flags}}' run: | cmake --build build/Release --target c4core-test-build --parallel --verbose - name: 'run Release ::: -Os -DNDEBUG -m${{matrix.bits}} ${{matrix.extra_flags}}' run: | cmake --build build/Release --target c4core-test-run gccsan: if: always() continue-on-error: false name: ${{matrix.bt}}/${{matrix.cxx}}/c++${{matrix.std}} runs-on: ubuntu-24.04 container: ghcr.io/biojppm/c4core/ubuntu22.04:latest strategy: fail-fast: false matrix: include: - std: 11 cxx: g++-14 bt: asan bitlinks: static64 - std: 14 cxx: g++-14 bt: asan bitlinks: static64 - std: 17 cxx: g++-14 bt: asan bitlinks: static64 - std: 20 cxx: g++-14 bt: asan bitlinks: static64 - std: 11 cxx: g++-14 bt: lsan bitlinks: static64 - std: 14 cxx: g++-14 bt: lsan bitlinks: static64 - std: 17 cxx: g++-14 bt: lsan bitlinks: static64 - std: 20 cxx: g++-14 bt: lsan bitlinks: static64 - std: 11 cxx: g++-14 bt: tsan bitlinks: static64 - std: 14 cxx: g++-14 bt: tsan bitlinks: static64 - std: 17 cxx: g++-14 bt: tsan bitlinks: static64 - std: 20 cxx: g++-14 bt: tsan bitlinks: static64 - std: 11 cxx: g++-14 bt: ubsan bitlinks: static64 - std: 14 cxx: g++-14 bt: ubsan bitlinks: static64 - std: 17 cxx: g++-14 bt: ubsan bitlinks: static64 - std: 20 cxx: g++-14 bt: ubsan bitlinks: static64 env: STD: ${{matrix.std}} CXX_: ${{matrix.cxx}} BT: ${{matrix.bt}} BITLINKS: ${{matrix.bitlinks}} VG: ${{matrix.vg}} SAN: ${{matrix.san}} LINT: ${{matrix.lint}} OS: ${{matrix.os}} steps: - name: checkout (action + docker) uses: actions/checkout@v4 with: submodules: recursive fetch-depth: 0 - run: git config --system --add safe.directory '*' - name: install run: c4core-install ${{matrix.cxx}} - name: show info run: source .github/setenv.sh && c4_show_info - name: shared64-configure--------------------------------------------------- run: source .github/setenv.sh && c4_cfg_test shared64 - name: shared64-build run: source .github/setenv.sh && c4_build_test shared64 - name: shared64-run run: source .github/setenv.sh && c4_run_test shared64 - name: shared64-pack run: source .github/setenv.sh && c4_package shared64 - name: static64-configure--------------------------------------------------- run: source .github/setenv.sh && c4_cfg_test static64 - name: static64-build run: source .github/setenv.sh && c4_build_test static64 - name: static64-run run: source .github/setenv.sh && c4_run_test static64 - name: static64-pack run: source .github/setenv.sh && c4_package static64 - name: static32-configure--------------------------------------------------- run: source .github/setenv.sh && c4_cfg_test static32 - name: static32-build run: source .github/setenv.sh && c4_build_test static32 - name: static32-run run: source .github/setenv.sh && c4_run_test static32 - name: static32-pack run: source .github/setenv.sh && c4_package static32 - name: shared32-configure--------------------------------------------------- run: source .github/setenv.sh && c4_cfg_test shared32 - name: shared32-build run: source .github/setenv.sh && c4_build_test shared32 - name: shared32-run run: source .github/setenv.sh && c4_run_test shared32 - name: shared32-pack run: source .github/setenv.sh && c4_package shared32 arm: if: always() continue-on-error: false name: arm/c++${{matrix.std}}/${{matrix.bt}} runs-on: ubuntu-24.04 container: ghcr.io/biojppm/c4core/ubuntu18.04:latest strategy: fail-fast: false matrix: include: - std: 11 bt: Debug toolchain: cmake/Toolchain-Arm-ubuntu.cmake cxx: arm-linux-gnueabihf-gcc - std: 11 bt: Release toolchain: cmake/Toolchain-Arm-ubuntu.cmake cxx: arm-linux-gnueabihf-gcc - std: 14 bt: Debug toolchain: cmake/Toolchain-Arm-ubuntu.cmake cxx: arm-linux-gnueabihf-gcc - std: 14 bt: Release toolchain: cmake/Toolchain-Arm-ubuntu.cmake cxx: arm-linux-gnueabihf-gcc - std: 17 bt: Debug toolchain: cmake/Toolchain-Arm-ubuntu.cmake cxx: arm-linux-gnueabihf-gcc - std: 17 bt: Release toolchain: cmake/Toolchain-Arm-ubuntu.cmake cxx: arm-linux-gnueabihf-gcc env: TOOLCHAIN: ${{matrix.toolchain}} STD: ${{matrix.std}} CXX_: ${{matrix.cxx}} BT: ${{matrix.bt}} BITLINKS: ${{matrix.bitlinks}} VG: ${{matrix.vg}} SAN: ${{matrix.san}} LINT: ${{matrix.lint}} OS: ${{matrix.os}} steps: - name: checkout (manually) run: | set -xeo pipefail env | sort echo GITHUB_SERVER_URL=$GITHUB_SERVER_URL echo GITHUB_REPOSITORY=$GITHUB_REPOSITORY echo GITHUB_REF=$GITHUB_REF echo GITHUB_REF_NAME=$GITHUB_REF_NAME echo GITHUB_HEAD_REF=$GITHUB_HEAD_REF repo=$GITHUB_SERVER_URL/$GITHUB_REPOSITORY # check the branch # https://stackoverflow.com/questions/58033366 branch=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}} echo branch=$branch # does the branch exist in the repo? if [ -z "$(git ls-remote $repo | grep $branch)" ] ; then echo "branch $branch does not exist on $repo" # refs/pull/485/merge -> pull/485/head branch=`echo ${GITHUB_REF#refs/} | sed -e 's:merge:head:g'` echo "... falling back to $branch" # does the fallback exist? if [ -z "(git ls-remote $repo | grep $branch)" ] ; then echo "branch $branch does not exist on $repo" exit 1 else echo "branch $branch exists on $repo" localbranch=$(echo $branch | sed -e 's@[/:]@_@g') branch=$branch:$localbranch echo "naming locally as $branch" fi fi # finally, create the local repo git init -q . # needed for running in the docker image. # see https://github.com/actions/checkout/issues/1169 git config --system --add safe.directory '*' # finally, do it! git remote add origin $repo git fetch origin $branch git reset --hard FETCH_HEAD git submodule update --init --recursive # show the log git log --graph --date=relative --date-order --color=always \ --pretty='%C(yellow)%h %C(cyan)%cd %Cblue%aN%C(auto)%d %Creset%s' \ | head -30 \ || echo -n # show the last commit git log --name-status HEAD^..HEAD - name: install gcc-arm-linux-gnueabihf run: | c4core-install arm-linux-gnueabihf c4core-install qemu - name: show info run: source .github/setenv.sh && c4_show_info - name: configure--------------------------------------------------- run: source .github/setenv.sh && c4_cfg_test arm - name: build run: source .github/setenv.sh && c4_build_test arm - name: run run: source .github/setenv.sh && c4_run_test arm - name: pack run: source .github/setenv.sh && c4_package arm c4core-0.2.6/.github/workflows/infra.yml000066400000000000000000000025771477602032300201340ustar00rootroot00000000000000# DO NOT EDIT - GENERATED FROM .github/workflows-in/infra.ys name: infra defaults: run: shell: bash -e -x {0} 'on': workflow_dispatch: null push: branches: - master pull_request: branches: - master env: PROJ_PKG_NAME: c4core- PROJ_PFX_TARGET: c4core- PROJ_PFX_CMAKE: C4CORE_ CMAKE_FLAGS: null NUM_JOBS_BUILD: null jobs: check_workflows: if: always() continue-on-error: false runs-on: ubuntu-24.04 steps: - name: checkout (action) uses: actions/checkout@v4 with: submodules: recursive fetch-depth: 0 - name: install ys run: make -C .github/workflows-in install-ys - name: generate workflows run: make -C .github/workflows-in build - name: test status of workflows run: | wc --version wc --help make -C .github/workflows-in test status=$? if [ $status != 0 ] ; then echo "ERROR: generated workflows are out of date" fi exit $status check_fast_float: if: always() continue-on-error: false runs-on: ubuntu-24.04 steps: - name: checkout (action) uses: actions/checkout@v4 with: submodules: recursive fetch-depth: 0 - name: check status of fast_float_all.h run: | python tools/amalgamate.py > /dev/null git diff --exit-code src/c4/ext/fast_float_all.h c4core-0.2.6/.github/workflows/install.yml000066400000000000000000000457511477602032300205040ustar00rootroot00000000000000# DO NOT EDIT - GENERATED FROM .github/workflows-in/install.ys name: install defaults: run: shell: bash -e -x {0} 'on': workflow_dispatch: null push: branches: - master pull_request: branches: - master env: PROJ_PKG_NAME: c4core- PROJ_PFX_TARGET: c4core- PROJ_PFX_CMAKE: C4CORE_ CMAKE_FLAGS: null NUM_JOBS_BUILD: null jobs: install_tests: if: always() continue-on-error: false name: ${{matrix.name}}/${{matrix.bt}} runs-on: ${{matrix.os}} strategy: fail-fast: false matrix: include: - name: find_package/linux/Release sdir: test/test_install os: ubuntu-24.04 cxx: g++-13 gen: -DCMAKE_CXX_COMPILER=g++-13 tgt: all bt: Release vars: -Dc4core_DIR=$GITHUB_WORKSPACE/$PDIR/lib/cmake/c4core -DC4CORE_TEST_INSTALL_PACKAGE_MODE=ON commonvars: null - name: find_package/linux/Debug sdir: test/test_install os: ubuntu-24.04 cxx: g++-13 gen: -DCMAKE_CXX_COMPILER=g++-13 tgt: all bt: Debug vars: -Dc4core_DIR=$GITHUB_WORKSPACE/$PDIR/lib/cmake/c4core -DC4CORE_TEST_INSTALL_PACKAGE_MODE=ON commonvars: null - name: find_package/linux/RelNoExc sdir: test/test_install os: ubuntu-24.04 cxx: g++-13 gen: -DCMAKE_CXX_COMPILER=g++-13 -DCMAKE_CXX_FLAGS='-fno-exceptions -fno-rtti' tgt: all bt: Release vars: -Dc4core_DIR=$GITHUB_WORKSPACE/$PDIR/lib/cmake/c4core -DC4CORE_TEST_INSTALL_PACKAGE_MODE=ON commonvars: null - name: find_package/linux/DbgNoExc sdir: test/test_install os: ubuntu-24.04 cxx: g++-13 gen: -DCMAKE_CXX_COMPILER=g++-13 -DCMAKE_CXX_FLAGS='-fno-exceptions -fno-rtti' tgt: all bt: Debug vars: -Dc4core_DIR=$GITHUB_WORKSPACE/$PDIR/lib/cmake/c4core -DC4CORE_TEST_INSTALL_PACKAGE_MODE=ON commonvars: null - name: find_package/linux/libcxx/Release sdir: test/test_install os: ubuntu-24.04 cxx: clang++-14 gen: -DCMAKE_CXX_COMPILER=clang++-14 tgt: all bt: Release vars: -Dc4core_DIR=$GITHUB_WORKSPACE/$PDIR/lib/cmake/c4core -DC4CORE_TEST_INSTALL_PACKAGE_MODE=ON commonvars: -DC4CORE_USE_LIBCXX=ON - name: find_package/linux/libcxx/Debug sdir: test/test_install os: ubuntu-24.04 cxx: clang++-14 gen: -DCMAKE_CXX_COMPILER=clang++-14 tgt: all bt: Debug vars: -Dc4core_DIR=$GITHUB_WORKSPACE/$PDIR/lib/cmake/c4core -DC4CORE_TEST_INSTALL_PACKAGE_MODE=ON commonvars: -DC4CORE_USE_LIBCXX=ON - name: find_package/linux/libcxx/RelNoExc sdir: test/test_install os: ubuntu-24.04 cxx: clang++-14 gen: -DCMAKE_CXX_COMPILER=clang++-14 -DCMAKE_CXX_FLAGS='-fno-exceptions -fno-rtti' tgt: all bt: Release vars: -Dc4core_DIR=$GITHUB_WORKSPACE/$PDIR/lib/cmake/c4core -DC4CORE_TEST_INSTALL_PACKAGE_MODE=ON commonvars: -DC4CORE_USE_LIBCXX=ON - name: find_package/linux/libcxx/DbgNoExc sdir: test/test_install os: ubuntu-24.04 cxx: clang++-14 gen: -DCMAKE_CXX_COMPILER=clang++-14 -DCMAKE_CXX_FLAGS='-fno-exceptions -fno-rtti' tgt: all bt: Debug vars: -Dc4core_DIR=$GITHUB_WORKSPACE/$PDIR/lib/cmake/c4core -DC4CORE_TEST_INSTALL_PACKAGE_MODE=ON commonvars: -DC4CORE_USE_LIBCXX=ON - name: find_package/macos/Release sdir: test/test_install os: macos-13 cxx: xcode gen: -G Xcode -DCMAKE_OSX_ARCHITECTURES=x86_64 tgt: ALL_BUILD bt: Release vars: -Dc4core_DIR=$GITHUB_WORKSPACE/$PDIR/lib/cmake/c4core -DC4CORE_TEST_INSTALL_PACKAGE_MODE=ON commonvars: null - name: find_package/macos/Debug sdir: test/test_install os: macos-13 cxx: xcode gen: -G Xcode -DCMAKE_OSX_ARCHITECTURES=x86_64 tgt: ALL_BUILD bt: Debug vars: -Dc4core_DIR=$GITHUB_WORKSPACE/$PDIR/lib/cmake/c4core -DC4CORE_TEST_INSTALL_PACKAGE_MODE=ON commonvars: null - name: find_package/macos/RelNoExc sdir: test/test_install os: macos-13 cxx: xcode gen: -G Xcode -DCMAKE_OSX_ARCHITECTURES=x86_64 -DCMAKE_CXX_FLAGS='-fno-exceptions -fno-rtti' tgt: ALL_BUILD bt: Release vars: -Dc4core_DIR=$GITHUB_WORKSPACE/$PDIR/lib/cmake/c4core -DC4CORE_TEST_INSTALL_PACKAGE_MODE=ON commonvars: null - name: find_package/macos/DbgNoExc sdir: test/test_install os: macos-13 cxx: xcode gen: -G Xcode -DCMAKE_OSX_ARCHITECTURES=x86_64 -DCMAKE_CXX_FLAGS='-fno-exceptions -fno-rtti' tgt: ALL_BUILD bt: Debug vars: -Dc4core_DIR=$GITHUB_WORKSPACE/$PDIR/lib/cmake/c4core -DC4CORE_TEST_INSTALL_PACKAGE_MODE=ON commonvars: null - name: find_package/win/Release sdir: test/test_install os: windows-2019 cxx: vs2019 gen: -G 'Visual Studio 16 2019' -A x64 tgt: ALL_BUILD bt: Release vars: -Dc4core_DIR=$GITHUB_WORKSPACE/$PDIR/cmake -DC4CORE_TEST_INSTALL_PACKAGE_MODE=ON commonvars: null - name: find_package/win/Debug sdir: test/test_install os: windows-2019 cxx: vs2019 gen: -G 'Visual Studio 16 2019' -A x64 tgt: ALL_BUILD bt: Debug vars: -Dc4core_DIR=$GITHUB_WORKSPACE/$PDIR/cmake -DC4CORE_TEST_INSTALL_PACKAGE_MODE=ON commonvars: null - name: find_package/win/RelNoExc sdir: test/test_install os: windows-2019 cxx: vs2019 gen: -G 'Visual Studio 16 2019' -A x64 -DCMAKE_CXX_FLAGS=' /EHa- /EHs- /EHc /EHr- /GR- /wd4530' tgt: ALL_BUILD bt: Release vars: -Dc4core_DIR=$GITHUB_WORKSPACE/$PDIR/cmake -DC4CORE_TEST_INSTALL_PACKAGE_MODE=ON commonvars: null - name: find_package/win/DbgNoExc sdir: test/test_install os: windows-2019 cxx: vs2019 gen: -G 'Visual Studio 16 2019' -A x64 -DCMAKE_CXX_FLAGS=' /EHa- /EHs- /EHc /EHr- /GR- /wd4530' tgt: ALL_BUILD bt: Debug vars: -Dc4core_DIR=$GITHUB_WORKSPACE/$PDIR/cmake -DC4CORE_TEST_INSTALL_PACKAGE_MODE=ON commonvars: null - name: find_library/linux/Release sdir: test/test_install os: ubuntu-24.04 cxx: g++-13 gen: -DCMAKE_CXX_COMPILER=g++-13 tgt: all bt: Release vars: -DCMAKE_PREFIX_PATH=$GITHUB_WORKSPACE/$PDIR -DC4CORE_TEST_INSTALL_PACKAGE_MODE=OFF commonvars: null - name: find_library/linux/Debug sdir: test/test_install os: ubuntu-24.04 cxx: g++-13 gen: -DCMAKE_CXX_COMPILER=g++-13 tgt: all bt: Debug vars: -DCMAKE_PREFIX_PATH=$GITHUB_WORKSPACE/$PDIR -DC4CORE_TEST_INSTALL_PACKAGE_MODE=OFF commonvars: null - name: find_library/linux/RelNoExc sdir: test/test_install os: ubuntu-24.04 cxx: g++-13 gen: -DCMAKE_CXX_COMPILER=g++-13 -DCMAKE_CXX_FLAGS='-fno-exceptions -fno-rtti' tgt: all bt: Release vars: -DCMAKE_PREFIX_PATH=$GITHUB_WORKSPACE/$PDIR -DC4CORE_TEST_INSTALL_PACKAGE_MODE=OFF commonvars: null - name: find_library/linux/DbgNoExc sdir: test/test_install os: ubuntu-24.04 cxx: g++-13 gen: -DCMAKE_CXX_COMPILER=g++-13 -DCMAKE_CXX_FLAGS='-fno-exceptions -fno-rtti' tgt: all bt: Debug vars: -DCMAKE_PREFIX_PATH=$GITHUB_WORKSPACE/$PDIR -DC4CORE_TEST_INSTALL_PACKAGE_MODE=OFF commonvars: null - name: find_library/linux/libcxx/Release sdir: test/test_install os: ubuntu-24.04 cxx: clang++-14 gen: -DCMAKE_CXX_COMPILER=clang++-14 tgt: all bt: Release vars: -DCMAKE_PREFIX_PATH=$GITHUB_WORKSPACE/$PDIR -DC4CORE_TEST_INSTALL_PACKAGE_MODE=OFF commonvars: -DC4CORE_USE_LIBCXX=ON - name: find_library/linux/libcxx/Debug sdir: test/test_install os: ubuntu-24.04 cxx: clang++-14 gen: -DCMAKE_CXX_COMPILER=clang++-14 tgt: all bt: Debug vars: -DCMAKE_PREFIX_PATH=$GITHUB_WORKSPACE/$PDIR -DC4CORE_TEST_INSTALL_PACKAGE_MODE=OFF commonvars: -DC4CORE_USE_LIBCXX=ON - name: find_library/linux/libcxx/RelNoExc sdir: test/test_install os: ubuntu-24.04 cxx: clang++-14 gen: -DCMAKE_CXX_COMPILER=clang++-14 -DCMAKE_CXX_FLAGS='-fno-exceptions -fno-rtti' tgt: all bt: Release vars: -DCMAKE_PREFIX_PATH=$GITHUB_WORKSPACE/$PDIR -DC4CORE_TEST_INSTALL_PACKAGE_MODE=OFF commonvars: -DC4CORE_USE_LIBCXX=ON - name: find_library/linux/libcxx/DbgNoExc sdir: test/test_install os: ubuntu-24.04 cxx: clang++-14 gen: -DCMAKE_CXX_COMPILER=clang++-14 -DCMAKE_CXX_FLAGS='-fno-exceptions -fno-rtti' tgt: all bt: Debug vars: -DCMAKE_PREFIX_PATH=$GITHUB_WORKSPACE/$PDIR -DC4CORE_TEST_INSTALL_PACKAGE_MODE=OFF commonvars: -DC4CORE_USE_LIBCXX=ON - name: find_library/macos/Release sdir: test/test_install os: macos-13 cxx: xcode gen: -G Xcode -DCMAKE_OSX_ARCHITECTURES=x86_64 tgt: ALL_BUILD bt: Release vars: -DCMAKE_PREFIX_PATH=$GITHUB_WORKSPACE/$PDIR -DC4CORE_TEST_INSTALL_PACKAGE_MODE=OFF commonvars: null - name: find_library/macos/Debug sdir: test/test_install os: macos-13 cxx: xcode gen: -G Xcode -DCMAKE_OSX_ARCHITECTURES=x86_64 tgt: ALL_BUILD bt: Debug vars: -DCMAKE_PREFIX_PATH=$GITHUB_WORKSPACE/$PDIR -DC4CORE_TEST_INSTALL_PACKAGE_MODE=OFF commonvars: null - name: find_library/macos/RelNoExc sdir: test/test_install os: macos-13 cxx: xcode gen: -G Xcode -DCMAKE_OSX_ARCHITECTURES=x86_64 -DCMAKE_CXX_FLAGS='-fno-exceptions -fno-rtti' tgt: ALL_BUILD bt: Release vars: -DCMAKE_PREFIX_PATH=$GITHUB_WORKSPACE/$PDIR -DC4CORE_TEST_INSTALL_PACKAGE_MODE=OFF commonvars: null - name: find_library/macos/DbgNoExc sdir: test/test_install os: macos-13 cxx: xcode gen: -G Xcode -DCMAKE_OSX_ARCHITECTURES=x86_64 -DCMAKE_CXX_FLAGS='-fno-exceptions -fno-rtti' tgt: ALL_BUILD bt: Debug vars: -DCMAKE_PREFIX_PATH=$GITHUB_WORKSPACE/$PDIR -DC4CORE_TEST_INSTALL_PACKAGE_MODE=OFF commonvars: null - name: find_library/win/Release sdir: test/test_install os: windows-2019 cxx: vs2019 gen: -G 'Visual Studio 16 2019' -A x64 tgt: ALL_BUILD bt: Release vars: -DCMAKE_PREFIX_PATH=$GITHUB_WORKSPACE/$PDIR -DC4CORE_TEST_INSTALL_PACKAGE_MODE=OFF commonvars: null - name: find_library/win/Debug sdir: test/test_install os: windows-2019 cxx: vs2019 gen: -G 'Visual Studio 16 2019' -A x64 tgt: ALL_BUILD bt: Debug vars: -DCMAKE_PREFIX_PATH=$GITHUB_WORKSPACE/$PDIR -DC4CORE_TEST_INSTALL_PACKAGE_MODE=OFF commonvars: null - name: find_library/win/RelNoExc sdir: test/test_install os: windows-2019 cxx: vs2019 gen: -G 'Visual Studio 16 2019' -A x64 -DCMAKE_CXX_FLAGS=' /EHa- /EHs- /EHc /EHr- /GR- /wd4530' tgt: ALL_BUILD bt: Release vars: -DCMAKE_PREFIX_PATH=$GITHUB_WORKSPACE/$PDIR -DC4CORE_TEST_INSTALL_PACKAGE_MODE=OFF commonvars: null - name: find_library/win/DbgNoExc sdir: test/test_install os: windows-2019 cxx: vs2019 gen: -G 'Visual Studio 16 2019' -A x64 -DCMAKE_CXX_FLAGS=' /EHa- /EHs- /EHc /EHr- /GR- /wd4530' tgt: ALL_BUILD bt: Debug vars: -DCMAKE_PREFIX_PATH=$GITHUB_WORKSPACE/$PDIR -DC4CORE_TEST_INSTALL_PACKAGE_MODE=OFF commonvars: null - name: singleheader/linux/Release sdir: test/test_singleheader os: ubuntu-24.04 cxx: g++-13 gen: -DCMAKE_CXX_COMPILER=g++-13 tgt: all bt: Release vars: null commonvars: null - name: singleheader/linux/Debug sdir: test/test_singleheader os: ubuntu-24.04 cxx: g++-13 gen: -DCMAKE_CXX_COMPILER=g++-13 tgt: all bt: Debug vars: null commonvars: null - name: singleheader/linux/RelNoExc sdir: test/test_singleheader os: ubuntu-24.04 cxx: g++-13 gen: -DCMAKE_CXX_COMPILER=g++-13 -DCMAKE_CXX_FLAGS='-fno-exceptions -fno-rtti' tgt: all bt: Release vars: null commonvars: null - name: singleheader/linux/DbgNoExc sdir: test/test_singleheader os: ubuntu-24.04 cxx: g++-13 gen: -DCMAKE_CXX_COMPILER=g++-13 -DCMAKE_CXX_FLAGS='-fno-exceptions -fno-rtti' tgt: all bt: Debug vars: null commonvars: null - name: singleheader/linux/libcxx/Release sdir: test/test_singleheader os: ubuntu-24.04 cxx: clang++-14 gen: -DCMAKE_CXX_COMPILER=clang++-14 tgt: all bt: Release vars: null commonvars: -DC4CORE_USE_LIBCXX=ON - name: singleheader/linux/libcxx/Debug sdir: test/test_singleheader os: ubuntu-24.04 cxx: clang++-14 gen: -DCMAKE_CXX_COMPILER=clang++-14 tgt: all bt: Debug vars: null commonvars: -DC4CORE_USE_LIBCXX=ON - name: singleheader/linux/libcxx/RelNoExc sdir: test/test_singleheader os: ubuntu-24.04 cxx: clang++-14 gen: -DCMAKE_CXX_COMPILER=clang++-14 -DCMAKE_CXX_FLAGS='-fno-exceptions -fno-rtti' tgt: all bt: Release vars: null commonvars: -DC4CORE_USE_LIBCXX=ON - name: singleheader/linux/libcxx/DbgNoExc sdir: test/test_singleheader os: ubuntu-24.04 cxx: clang++-14 gen: -DCMAKE_CXX_COMPILER=clang++-14 -DCMAKE_CXX_FLAGS='-fno-exceptions -fno-rtti' tgt: all bt: Debug vars: null commonvars: -DC4CORE_USE_LIBCXX=ON - name: singleheader/macos/Release sdir: test/test_singleheader os: macos-13 cxx: xcode gen: -G Xcode -DCMAKE_OSX_ARCHITECTURES=x86_64 tgt: ALL_BUILD bt: Release vars: null commonvars: null - name: singleheader/macos/Debug sdir: test/test_singleheader os: macos-13 cxx: xcode gen: -G Xcode -DCMAKE_OSX_ARCHITECTURES=x86_64 tgt: ALL_BUILD bt: Debug vars: null commonvars: null - name: singleheader/macos/RelNoExc sdir: test/test_singleheader os: macos-13 cxx: xcode gen: -G Xcode -DCMAKE_OSX_ARCHITECTURES=x86_64 -DCMAKE_CXX_FLAGS='-fno-exceptions -fno-rtti' tgt: ALL_BUILD bt: Release vars: null commonvars: null - name: singleheader/macos/DbgNoExc sdir: test/test_singleheader os: macos-13 cxx: xcode gen: -G Xcode -DCMAKE_OSX_ARCHITECTURES=x86_64 -DCMAKE_CXX_FLAGS='-fno-exceptions -fno-rtti' tgt: ALL_BUILD bt: Debug vars: null commonvars: null - name: singleheader/win/Release sdir: test/test_singleheader os: windows-2019 cxx: vs2019 gen: -G 'Visual Studio 16 2019' -A x64 tgt: ALL_BUILD bt: Release vars: null commonvars: null - name: singleheader/win/Debug sdir: test/test_singleheader os: windows-2019 cxx: vs2019 gen: -G 'Visual Studio 16 2019' -A x64 tgt: ALL_BUILD bt: Debug vars: null commonvars: null - name: singleheader/win/RelNoExc sdir: test/test_singleheader os: windows-2019 cxx: vs2019 gen: -G 'Visual Studio 16 2019' -A x64 -DCMAKE_CXX_FLAGS=' /EHa- /EHs- /EHc /EHr- /GR- /wd4530' tgt: ALL_BUILD bt: Release vars: null commonvars: null - name: singleheader/win/DbgNoExc sdir: test/test_singleheader os: windows-2019 cxx: vs2019 gen: -G 'Visual Studio 16 2019' -A x64 -DCMAKE_CXX_FLAGS=' /EHa- /EHs- /EHc /EHr- /GR- /wd4530' tgt: ALL_BUILD bt: Debug vars: null commonvars: null env: CXX_: ${{matrix.cxx}} BT: ${{matrix.bt}} OS: ${{matrix.os}} BDIR: build/${{matrix.name}} IDIR: install/${{matrix.name}} PDIR: prefix/${{matrix.name}} steps: - name: checkout (action) uses: actions/checkout@v4 with: submodules: recursive fetch-depth: 0 - name: install requirements run: source .github/reqs.sh && c4_install_test_requirements $OS - name: show info run: source .github/setenv.sh && c4_show_info - name: Install python 3.9 uses: actions/setup-python@v4 with: python-version: 3.9 - name: dirs run: | set -x echo $BDIR echo $IDIR echo $PDIR mkdir -p $BDIR mkdir -p $IDIR mkdir -p $PDIR - name: preinstall run: | if [ "${{matrix.sdir}}" == "test/test_install" ] ; then mkdir -p $BDIR-staging cmake -S . -B $BDIR-staging -DCMAKE_INSTALL_PREFIX=$PDIR -DCMAKE_BUILD_TYPE=${{matrix.bt}} ${{matrix.gen}} ${{matrix.commonvars}} cmake --build $BDIR-staging --config ${{matrix.bt}} --target ${{matrix.tgt}} -j cmake --build $BDIR-staging --config ${{matrix.bt}} --target install fi - name: configure run: | cmake -S ${{matrix.sdir}} -B $BDIR \ -DC4CORE_BUILD_TESTS=ON \ -DC4CORE_VALGRIND=OFF \ -DCMAKE_BUILD_TYPE=${{matrix.bt}} \ -DCMAKE_INSTALL_PREFIX=$IDIR \ ${{matrix.gen}} \ ${{matrix.vars}} \ ${{matrix.commonvars}} - name: build run: | cmake --build $BDIR --config ${{matrix.bt}} --target c4core-test-build -j - name: run run: | cmake --build $BDIR --config ${{matrix.bt}} --target c4core-test-run c4core-0.2.6/.github/workflows/libcxx.yml000066400000000000000000000102251477602032300203130ustar00rootroot00000000000000# DO NOT EDIT - GENERATED FROM .github/workflows-in/libcxx.ys name: libcxx defaults: run: shell: bash -e -x {0} 'on': workflow_dispatch: null push: branches: - master pull_request: branches: - master env: PROJ_PKG_NAME: c4core- PROJ_PFX_TARGET: c4core- PROJ_PFX_CMAKE: C4CORE_ CMAKE_FLAGS: null NUM_JOBS_BUILD: null jobs: libcxx: if: always() continue-on-error: false name: libc++/${{matrix.cxx}}/c++${{matrix.std}}/${{matrix.bt}} runs-on: ubuntu-24.04 container: ghcr.io/biojppm/c4core/ubuntu22.04:latest strategy: fail-fast: false matrix: include: - std: 20 cxx: clang++-17 bt: Debug bitlinks: shared64 static64 - std: 20 cxx: clang++-17 bt: Release bitlinks: shared64 static64 - std: 17 cxx: clang++-17 bt: Debug bitlinks: shared64 static64 - std: 17 cxx: clang++-17 bt: Release bitlinks: shared64 static64 - std: 14 cxx: clang++-17 bt: Debug bitlinks: shared64 static64 - std: 14 cxx: clang++-17 bt: Release bitlinks: shared64 static64 - std: 11 cxx: clang++-17 bt: Debug bitlinks: shared64 static64 - std: 11 cxx: clang++-17 bt: Release bitlinks: shared64 static64 - std: 17 cxx: clang++-9 bt: Debug bitlinks: shared64 static64 - std: 17 cxx: clang++-9 bt: Release bitlinks: shared64 static64 - std: 14 cxx: clang++-9 bt: Debug bitlinks: shared64 static64 - std: 14 cxx: clang++-9 bt: Release bitlinks: shared64 static64 - std: 11 cxx: clang++-9 bt: Debug bitlinks: shared64 static64 - std: 11 cxx: clang++-9 bt: Release bitlinks: shared64 static64 env: LIBCXX: 'ON' STD: ${{matrix.std}} CXX_: ${{matrix.cxx}} BT: ${{matrix.bt}} BITLINKS: ${{matrix.bitlinks}} VG: ${{matrix.vg}} SAN: ${{matrix.san}} LINT: ${{matrix.lint}} OS: ${{matrix.os}} steps: - name: checkout (action + docker) uses: actions/checkout@v4 with: submodules: recursive fetch-depth: 0 - run: git config --system --add safe.directory '*' - run: c4core-install ${{matrix.cxx}} - name: show info run: source .github/setenv.sh && c4_show_info - name: shared64-configure--------------------------------------------------- run: source .github/setenv.sh && c4_cfg_test shared64 - name: shared64-build run: source .github/setenv.sh && c4_build_test shared64 - name: shared64-run run: source .github/setenv.sh && c4_run_test shared64 - name: shared64-pack run: source .github/setenv.sh && c4_package shared64 - name: static64-configure--------------------------------------------------- run: source .github/setenv.sh && c4_cfg_test static64 - name: static64-build run: source .github/setenv.sh && c4_build_test static64 - name: static64-run run: source .github/setenv.sh && c4_run_test static64 - name: static64-pack run: source .github/setenv.sh && c4_package static64 - name: static32-configure--------------------------------------------------- run: source .github/setenv.sh && c4_cfg_test static32 - name: static32-build run: source .github/setenv.sh && c4_build_test static32 - name: static32-run run: source .github/setenv.sh && c4_run_test static32 - name: static32-pack run: source .github/setenv.sh && c4_package static32 - name: shared32-configure--------------------------------------------------- run: source .github/setenv.sh && c4_cfg_test shared32 - name: shared32-build run: source .github/setenv.sh && c4_build_test shared32 - name: shared32-run run: source .github/setenv.sh && c4_run_test shared32 - name: shared32-pack run: source .github/setenv.sh && c4_package shared32 c4core-0.2.6/.github/workflows/macosx.yml000066400000000000000000000076021477602032300203210ustar00rootroot00000000000000# DO NOT EDIT - GENERATED FROM .github/workflows-in/macosx.ys name: macosx defaults: run: shell: bash -e -x {0} 'on': workflow_dispatch: null push: branches: - master pull_request: branches: - master env: PROJ_PKG_NAME: c4core- PROJ_PFX_TARGET: c4core- PROJ_PFX_CMAKE: C4CORE_ CMAKE_FLAGS: null NUM_JOBS_BUILD: null jobs: xcode: if: always() continue-on-error: false name: xcode${{matrix.xcver}}/c++${{matrix.std}}/${{matrix.bt}} runs-on: ${{matrix.os}} strategy: fail-fast: false matrix: include: - std: 11 cxx: xcode xcver: 15 bt: Debug os: macos-13 bitlinks: shared64 static64 - std: 11 cxx: xcode xcver: 15 bt: Release os: macos-13 bitlinks: shared64 static64 - std: 17 cxx: xcode xcver: 15 bt: Debug os: macos-13 bitlinks: shared64 static64 - std: 17 cxx: xcode xcver: 15 bt: Release os: macos-13 bitlinks: shared64 static64 - std: 11 cxx: xcode xcver: 14 bt: Debug os: macos-13 bitlinks: shared64 static64 - std: 11 cxx: xcode xcver: 14 bt: Release os: macos-13 bitlinks: shared64 static64 - std: 17 cxx: xcode xcver: 14 bt: Debug os: macos-13 bitlinks: shared64 static64 - std: 17 cxx: xcode xcver: 14 bt: Release os: macos-13 bitlinks: shared64 static64 env: STD: ${{matrix.std}} CXX_: ${{matrix.cxx}} BT: ${{matrix.bt}} BITLINKS: ${{matrix.bitlinks}} VG: ${{matrix.vg}} SAN: ${{matrix.san}} LINT: ${{matrix.lint}} OS: ${{matrix.os}} steps: - name: checkout (action) uses: actions/checkout@v4 with: submodules: recursive fetch-depth: 0 - name: xcode uses: maxim-lobanov/setup-xcode@v1 with: xcode-version: ${{matrix.xcver}} - name: install requirements run: source .github/reqs.sh && c4_install_test_requirements $OS - name: show info run: source .github/setenv.sh && c4_show_info - name: shared64-configure--------------------------------------------------- run: source .github/setenv.sh && c4_cfg_test shared64 - name: shared64-build run: source .github/setenv.sh && c4_build_test shared64 - name: shared64-run run: source .github/setenv.sh && c4_run_test shared64 - name: shared64-pack run: source .github/setenv.sh && c4_package shared64 - name: static64-configure--------------------------------------------------- run: source .github/setenv.sh && c4_cfg_test static64 - name: static64-build run: source .github/setenv.sh && c4_build_test static64 - name: static64-run run: source .github/setenv.sh && c4_run_test static64 - name: static64-pack run: source .github/setenv.sh && c4_package static64 - name: static32-configure--------------------------------------------------- run: source .github/setenv.sh && c4_cfg_test static32 - name: static32-build run: source .github/setenv.sh && c4_build_test static32 - name: static32-run run: source .github/setenv.sh && c4_run_test static32 - name: static32-pack run: source .github/setenv.sh && c4_package static32 - name: shared32-configure--------------------------------------------------- run: source .github/setenv.sh && c4_cfg_test shared32 - name: shared32-build run: source .github/setenv.sh && c4_build_test shared32 - name: shared32-run run: source .github/setenv.sh && c4_run_test shared32 - name: shared32-pack run: source .github/setenv.sh && c4_package shared32 c4core-0.2.6/.github/workflows/release.yml000066400000000000000000000237541477602032300204550ustar00rootroot00000000000000# DO NOT EDIT - GENERATED FROM .github/workflows-in/release.ys name: release defaults: run: shell: bash -e -x {0} 'on': workflow_dispatch: null push: tags: - v0.* - v1.* - v2.* branches: - master pull_request: branches: - master env: PROJ_PKG_NAME: c4core- PROJ_PFX_TARGET: c4core- PROJ_PFX_CMAKE: C4CORE_ CMAKE_FLAGS: null NUM_JOBS_BUILD: null jobs: gettag: if: always() continue-on-error: false runs-on: ubuntu-latest steps: - name: checkout (action) uses: actions/checkout@v4 with: submodules: recursive fetch-depth: 0 - name: Variables (from tag) if: contains(github.ref, 'tags/v') run: | set -exo pipefail # https://github.community/t/how-to-get-just-the-tag-name/16241/11 SRC_TAG=${GITHUB_REF#refs/tags/} SRC_VERSION=${GITHUB_REF#refs/tags/v} SRC_VERSION_BODY=`pwd`/changelog/$SRC_VERSION.md if [ ! -f $SRC_VERSION_BODY ] ; then echo "version body file was not found: $SRC_VERSION_BODY" exit 1 fi cat <> vars.sh export SRC_TAG=$SRC_TAG export SRC_VERSION=$SRC_VERSION export SRC_VERSION_BODY=$SRC_VERSION_BODY EOF - name: Variables (from commit, no tag) if: ${{ !contains(github.ref, 'tags/v') }} run: | set -exo pipefail branch_name=${GITHUB_REF#refs/heads/} # builds triggered from PRs have the branch_name like this: refs/pull/150/merge # so filter to eg pr0150_merge branch_name=`echo $branch_name | sed "s:refs/pull/\([0-9]*\)/\(.*\):pr0\1_\2:"` # sanitize the branch name; eg merge/foo-bar -> merge_foo_bar branch_name=`echo $branch_name | sed 's:[/.-]:_:g'` SRC_TAG=$(git describe || git rev-parse --short HEAD) # eg v0.2.0-110-gda837e0 SRC_VERSION="${branch_name}-${SRC_TAG}" cat < vars.sh export SRC_TAG=$SRC_TAG export SRC_VERSION=$SRC_VERSION EOF - name: Save vars.sh uses: actions/upload-artifact@v4 with: name: vars.sh path: ./vars.sh - name: Show vars.sh run: cat vars.sh - name: Source vars.sh run: source vars.sh - name: Env (common) run: | source vars.sh echo "SRC_TAG=$SRC_TAG" >> $GITHUB_ENV echo "SRC_VERSION=$SRC_VERSION" >> $GITHUB_ENV - name: Env (from tag) if: contains(github.ref, 'tags/v') run: | source vars.sh echo "SRC_VERSION_BODY=$SRC_VERSION_BODY" >> $GITHUB_ENV - name: Variables (from commit, no tag) if: ${{ !contains(github.ref, 'tags/v') }} run: echo 'nothing to do' - name: Verify vars.sh run: env | grep SRC src: if: always() continue-on-error: false needs: gettag runs-on: ubuntu-latest steps: - name: checkout (action) uses: actions/checkout@v4 with: submodules: recursive fetch-depth: 0 - name: Download vars.sh uses: actions/download-artifact@v4 with: name: vars.sh path: ./ - name: Show vars.sh run: cat vars.sh - name: Source vars.sh run: source vars.sh - name: Env (common) run: | source vars.sh echo "SRC_TAG=$SRC_TAG" >> $GITHUB_ENV echo "SRC_VERSION=$SRC_VERSION" >> $GITHUB_ENV - name: Env (from tag) if: contains(github.ref, 'tags/v') run: | source vars.sh echo "SRC_VERSION_BODY=$SRC_VERSION_BODY" >> $GITHUB_ENV - name: Variables (from commit, no tag) if: ${{ !contains(github.ref, 'tags/v') }} run: echo 'nothing to do' - name: Verify vars.sh run: env | grep SRC - name: Install python 3.9 uses: actions/setup-python@v5 with: python-version: 3.9 - name: Install requirements run: | sudo -E pip install git-archive-all - name: Create source packages run: | pwd ls -lFhp source vars.sh echo SRC_TAG=$SRC_TAG echo SRC_VERSION=$SRC_VERSION id=${PROJ_PKG_NAME}${SRC_VERSION} name=${id}-src mkdir -p assets git-archive-all --prefix $name assets/$name.tgz git-archive-all --prefix $name assets/$name.zip python --version python tools/amalgamate.py assets/$id.hpp - name: Save source artifacts uses: actions/upload-artifact@v4 with: name: assets-src path: assets cpp: name: cpp/${{matrix.os}}/${{matrix.gen}} needs: gettag runs-on: ${{matrix.os}} env: DEV: 'OFF' BT: Release OS: ${{matrix.os}} CXX_: ${{matrix.cxx}} GEN: ${{matrix.gen}} strategy: fail-fast: false matrix: include: - name: Ubuntu 24.04 deb sfxg: unix64-shared-Release.deb sfxp: ubuntu-24.04.deb gen: DEB mime: vnd.debian.binary-package os: ubuntu-24.04 - name: Ubuntu 22.04 deb sfxg: unix64-shared-Release.deb sfxp: ubuntu-22.04.deb gen: DEB mime: vnd.debian.binary-package os: ubuntu-22.04 - name: Windows VS2022 zip sfxg: win64-shared-Release.zip sfxp: windows-vs2022.zip gen: ZIP mime: zip os: windows-2022 cxx: vs2022 - name: Windows VS2019 zip sfxg: win64-shared-Release.zip sfxp: windows-vs2019.zip gen: ZIP mime: zip os: windows-2019 cxx: vs2019 - name: MacOSX sh sfxg: apple64-shared-Release.sh sfxp: macosx-xcode.sh gen: STGZ mime: x-sh os: macos-13 cxx: xcode steps: - name: checkout (action) uses: actions/checkout@v4 with: submodules: recursive fetch-depth: 0 - name: Download vars.sh uses: actions/download-artifact@v4 with: name: vars.sh path: ./ - name: Show vars.sh run: cat vars.sh - name: Source vars.sh run: source vars.sh - name: Env (common) run: | source vars.sh echo "SRC_TAG=$SRC_TAG" >> $GITHUB_ENV echo "SRC_VERSION=$SRC_VERSION" >> $GITHUB_ENV - name: Env (from tag) if: contains(github.ref, 'tags/v') run: | source vars.sh echo "SRC_VERSION_BODY=$SRC_VERSION_BODY" >> $GITHUB_ENV - name: Variables (from commit, no tag) if: ${{ !contains(github.ref, 'tags/v') }} run: echo 'nothing to do' - name: Verify vars.sh run: env | grep SRC - name: install requirements run: source .github/reqs.sh && c4_install_test_requirements $OS - name: show info run: source .github/setenv.sh && c4_show_info - name: shared64-configure--------------------------------------------------- run: source .github/setenv.sh && c4_cfg_test shared64 - name: shared64-build run: source .github/setenv.sh && c4_build_target shared64 - name: shared64-pack run: source .github/setenv.sh && c4_package shared64 $GEN - name: shared64-normalize run: | set -x source vars.sh ls -lFhp . ls -lFhp ./build ls -lFhp ./build/shared64 mkdir -p assets asset_src=`ls -1 ./build/shared64/${PROJ_PFX_TARGET}*-${{matrix.sfxg}}` asset_dst=./assets/${PROJ_PKG_NAME}${SRC_VERSION}-${{matrix.sfxp}} [ ! -f $asset_src ] && exit 1 cp -fav $asset_src $asset_dst - name: Save artifacts uses: actions/upload-artifact@v4 with: name: assets-cpp-${{matrix.os}}-${{matrix.cxx}} path: assets merge_artifacts: if: always() continue-on-error: false runs-on: ubuntu-latest needs: - src - cpp steps: - name: Merge assets artifacts uses: actions/upload-artifact/merge@v4 with: name: assets pattern: assets-* separate-directories: true delete-merged: true release: runs-on: ubuntu-latest needs: - merge_artifacts steps: - name: checkout (action) uses: actions/checkout@v4 with: submodules: recursive fetch-depth: 0 - name: Gather artifacts - ./assets uses: actions/download-artifact@v4 with: name: assets pattern: assets - name: Verify existing artifacts run: | ls -lFhp . ls -lFhp assets*/ || echo 'none found' ( \ mkdir -p assets cd assets ; \ for asset in ../assets-*/ ; do \ ls -lFhpA $asset/ ; \ mv -v $asset/* . ; \ rmdir $asset ; \ done ; ) ls -lFhp assets*/ || echo 'none found' - name: Download vars.sh uses: actions/download-artifact@v4 with: name: vars.sh path: ./ - name: Show vars.sh run: cat vars.sh - name: Source vars.sh run: source vars.sh - name: Env (common) run: | source vars.sh echo "SRC_TAG=$SRC_TAG" >> $GITHUB_ENV echo "SRC_VERSION=$SRC_VERSION" >> $GITHUB_ENV - name: Env (from tag) if: contains(github.ref, 'tags/v') run: | source vars.sh echo "SRC_VERSION_BODY=$SRC_VERSION_BODY" >> $GITHUB_ENV - name: Variables (from commit, no tag) if: ${{ !contains(github.ref, 'tags/v') }} run: echo 'nothing to do' - name: Verify vars.sh run: env | grep SRC - name: Create Github Release if: contains(github.ref, 'tags/v') id: create_release uses: actions/create-release@v1 env: GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} with: tag_name: ${{github.ref}} release_name: Release ${{env.SRC_VERSION}} body_path: ${{env.SRC_VERSION_BODY}} draft: true prerelease: ${{contains(github.ref, 'rc')}} - name: Upload assets to Github Release if: contains(github.ref, 'tags/v') uses: dwenegar/upload-release-assets@v1 env: GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} with: release_id: ${{steps.create_release.outputs.id}} assets_path: ./assets/ c4core-0.2.6/.github/workflows/windows.yml000066400000000000000000000273701477602032300205250ustar00rootroot00000000000000# DO NOT EDIT - GENERATED FROM .github/workflows-in/windows.ys name: windows defaults: run: shell: bash -e -x {0} 'on': workflow_dispatch: null push: branches: - master pull_request: branches: - master env: PROJ_PKG_NAME: c4core- PROJ_PFX_TARGET: c4core- PROJ_PFX_CMAKE: C4CORE_ CMAKE_FLAGS: null NUM_JOBS_BUILD: null jobs: windows: if: always() continue-on-error: true name: ${{matrix.cxx}}/c++${{matrix.std}}/${{matrix.bt}} runs-on: ${{matrix.os}} strategy: fail-fast: false matrix: include: - std: 11 cxx: vs2019 bt: Debug os: windows-2019 bitlinks: shared64 static32 - std: 11 cxx: vs2019 bt: Release os: windows-2019 bitlinks: shared64 static32 - std: 14 cxx: vs2019 bt: Debug os: windows-2019 bitlinks: shared64 static32 - std: 14 cxx: vs2019 bt: Release os: windows-2019 bitlinks: shared64 static32 - std: 17 cxx: vs2019 bt: Debug os: windows-2019 bitlinks: shared64 static32 - std: 17 cxx: vs2019 bt: Release os: windows-2019 bitlinks: shared64 static32 - std: 11 cxx: vs2022 bt: Debug os: windows-2022 bitlinks: shared64 static32 - std: 11 cxx: vs2022 bt: Release os: windows-2022 bitlinks: shared64 static32 - std: 14 cxx: vs2022 bt: Debug os: windows-2022 bitlinks: shared64 static32 - std: 14 cxx: vs2022 bt: Release os: windows-2022 bitlinks: shared64 static32 - std: 17 cxx: vs2022 bt: Debug os: windows-2022 bitlinks: shared64 static32 - std: 17 cxx: vs2022 bt: Release os: windows-2022 bitlinks: shared64 static32 - std: 20 cxx: vs2022 bt: Debug os: windows-2022 bitlinks: shared64 static32 - std: 20 cxx: vs2022 bt: Release os: windows-2022 bitlinks: shared64 static32 env: STD: ${{matrix.std}} CXX_: ${{matrix.cxx}} BT: ${{matrix.bt}} BITLINKS: ${{matrix.bitlinks}} VG: ${{matrix.vg}} SAN: ${{matrix.san}} LINT: ${{matrix.lint}} OS: ${{matrix.os}} steps: - name: checkout (action) uses: actions/checkout@v4 with: submodules: recursive fetch-depth: 0 - name: install requirements run: source .github/reqs.sh && c4_install_test_requirements $OS - name: show info run: source .github/setenv.sh && c4_show_info - name: shared64-configure--------------------------------------------------- run: source .github/setenv.sh && c4_cfg_test shared64 - name: shared64-build run: source .github/setenv.sh && c4_build_test shared64 - name: shared64-run run: source .github/setenv.sh && c4_run_test shared64 - name: shared64-pack run: source .github/setenv.sh && c4_package shared64 - name: static64-configure--------------------------------------------------- run: source .github/setenv.sh && c4_cfg_test static64 - name: static64-build run: source .github/setenv.sh && c4_build_test static64 - name: static64-run run: source .github/setenv.sh && c4_run_test static64 - name: static64-pack run: source .github/setenv.sh && c4_package static64 - name: static32-configure--------------------------------------------------- run: source .github/setenv.sh && c4_cfg_test static32 - name: static32-build run: source .github/setenv.sh && c4_build_test static32 - name: static32-run run: source .github/setenv.sh && c4_run_test static32 - name: static32-pack run: source .github/setenv.sh && c4_package static32 - name: shared32-configure--------------------------------------------------- run: source .github/setenv.sh && c4_cfg_test shared32 - name: shared32-build run: source .github/setenv.sh && c4_build_test shared32 - name: shared32-run run: source .github/setenv.sh && c4_run_test shared32 - name: shared32-pack run: source .github/setenv.sh && c4_package shared32 noexc: if: always() continue-on-error: false name: noexc/${{matrix.cxx}}/c++${{matrix.std}}/${{matrix.bt}} runs-on: ${{matrix.os}} strategy: fail-fast: false matrix: include: - std: 11 cxx: vs2022 bt: Debug os: windows-2022 bitlinks: shared64 static32 - std: 11 cxx: vs2022 bt: Release os: windows-2022 bitlinks: shared64 static32 - std: 20 cxx: vs2022 bt: Debug os: windows-2022 bitlinks: shared64 static32 - std: 20 cxx: vs2022 bt: Release os: windows-2022 bitlinks: shared64 static32 env: CXXFLAGS: /EHa- /EHs- /EHc /EHr- /GR- /wd4530 STD: ${{matrix.std}} CXX_: ${{matrix.cxx}} BT: ${{matrix.bt}} BITLINKS: ${{matrix.bitlinks}} VG: ${{matrix.vg}} SAN: ${{matrix.san}} LINT: ${{matrix.lint}} OS: ${{matrix.os}} steps: - name: checkout (action) uses: actions/checkout@v4 with: submodules: recursive fetch-depth: 0 - name: install requirements run: source .github/reqs.sh && c4_install_test_requirements $OS - name: show info run: source .github/setenv.sh && c4_show_info - name: shared64-configure--------------------------------------------------- run: source .github/setenv.sh && c4_cfg_test shared64 - name: shared64-build run: source .github/setenv.sh && c4_build_test shared64 - name: shared64-run run: source .github/setenv.sh && c4_run_test shared64 - name: shared64-pack run: source .github/setenv.sh && c4_package shared64 - name: static64-configure--------------------------------------------------- run: source .github/setenv.sh && c4_cfg_test static64 - name: static64-build run: source .github/setenv.sh && c4_build_test static64 - name: static64-run run: source .github/setenv.sh && c4_run_test static64 - name: static64-pack run: source .github/setenv.sh && c4_package static64 - name: static32-configure--------------------------------------------------- run: source .github/setenv.sh && c4_cfg_test static32 - name: static32-build run: source .github/setenv.sh && c4_build_test static32 - name: static32-run run: source .github/setenv.sh && c4_run_test static32 - name: static32-pack run: source .github/setenv.sh && c4_package static32 - name: shared32-configure--------------------------------------------------- run: source .github/setenv.sh && c4_cfg_test shared32 - name: shared32-build run: source .github/setenv.sh && c4_build_test shared32 - name: shared32-run run: source .github/setenv.sh && c4_run_test shared32 - name: shared32-pack run: source .github/setenv.sh && c4_package shared32 clang: if: always() continue-on-error: false name: clang/${{matrix.cxx}}/c++${{matrix.std}}/${{matrix.bt}} runs-on: ${{matrix.os}} strategy: fail-fast: false matrix: include: - std: 11 cxx: vs2022 bt: Debug os: windows-2022 bitlinks: shared64 static32 - std: 11 cxx: vs2022 bt: Release os: windows-2022 bitlinks: shared64 static32 env: STD: ${{matrix.std}} CXX_: ${{matrix.cxx}} BT: ${{matrix.bt}} BITLINKS: ${{matrix.bitlinks}} VG: ${{matrix.vg}} SAN: ${{matrix.san}} LINT: ${{matrix.lint}} OS: ${{matrix.os}} BDIR: build_${{matrix.arch}}_${{matrix.bt}}_${{matrix.std}} IDIR: install_${{matrix.arch}}_${{matrix.bt}}_${{matrix.std}} steps: - name: checkout (action) uses: actions/checkout@v4 with: submodules: recursive fetch-depth: 0 - name: show info run: source .github/setenv.sh && c4_show_info - name: configure run: | set -x echo BDIR=$BDIR echo IDIR=$IDIR cmake -S . -B $BDIR \ -G "Unix Makefiles" \ -DCMAKE_CXX_COMPILER=clang++ \ -DCMAKE_INSTALL_PREFIX=$IDIR \ -DCMAKE_BUILD_TYPE=${{matrix.bt}} \ -DC4_CXX_STANDARD=${{matrix.std}} \ -DCXX_STANDARD=${{matrix.std}} \ -DC4CORE_DEV=ON \ -DC4CORE_BUILD_BENCHMARKS=OFF \ -DC4CORE_SANITIZE=OFF \ -DC4CORE_LINT=OFF \ -DC4CORE_VALGRIND=OFF - name: build run: cmake --build $BDIR -j --target c4core-test-build - name: run run: cmake --build $BDIR -j --target c4core-test-run arm: name: arm/${{matrix.cxx}}/c++${{matrix.std}}/${{matrix.bt}} if: always() continue-on-error: false runs-on: ${{matrix.os}} strategy: fail-fast: false matrix: include: - std: 11 cxx: vs2019 bt: Debug os: windows-2019 bitlinks: shared64arm static32arm - std: 11 cxx: vs2019 bt: Release os: windows-2019 bitlinks: shared64arm static32arm - std: 17 cxx: vs2019 bt: Debug os: windows-2019 bitlinks: shared64arm static32arm - std: 17 cxx: vs2019 bt: Release os: windows-2019 bitlinks: shared64arm static32arm - std: 11 cxx: vs2022 bt: Release os: windows-2022 bitlinks: shared64arm - std: 20 cxx: vs2022 bt: Release os: windows-2022 bitlinks: shared64arm env: STD: ${{matrix.std}} CXX_: ${{matrix.cxx}} BT: ${{matrix.bt}} BITLINKS: ${{matrix.bitlinks}} VG: ${{matrix.vg}} SAN: ${{matrix.san}} LINT: ${{matrix.lint}} OS: ${{matrix.os}} steps: - name: checkout (action) uses: actions/checkout@v4 with: submodules: recursive fetch-depth: 0 - name: install requirements run: source .github/reqs.sh && c4_install_test_requirements $OS - name: show info run: source .github/setenv.sh && c4_show_info - name: shared64arm-configure--------------------------------------------------- run: source .github/setenv.sh && c4_cfg_test shared64arm - name: shared64arm-build run: source .github/setenv.sh && c4_build_test shared64arm - name: shared64arm-pack run: source .github/setenv.sh && c4_package shared64arm - name: static64arm-configure--------------------------------------------------- run: source .github/setenv.sh && c4_cfg_test static64arm - name: static64arm-build run: source .github/setenv.sh && c4_build_test static64arm - name: static64arm-pack run: source .github/setenv.sh && c4_package static64arm - name: shared32arm-configure--------------------------------------------------- run: source .github/setenv.sh && c4_cfg_test shared32arm - name: shared32arm-build run: source .github/setenv.sh && c4_build_test shared32arm - name: shared32arm-pack run: source .github/setenv.sh && c4_package shared32arm - name: static32arm-configure--------------------------------------------------- run: source .github/setenv.sh && c4_cfg_test static32arm - name: static32arm-build run: source .github/setenv.sh && c4_build_test static32arm - name: static32arm-pack run: source .github/setenv.sh && c4_package static32arm c4core-0.2.6/.gitignore000066400000000000000000000006621477602032300146760ustar00rootroot00000000000000# text editor files *.bck \#* *~ .ccls-cache/ .clangd/ .cache/ .cquery_cached_index/ __pycache__/ # Visual Studio files .vs/ .vscode/ # QtCreator files CMakeLists.txt.user # Eclipse .project .cproject /.settings/ # build files build/ install/ .python-version compile_commands.json # test files /Testing/ # continuous integration files .github/vagrant/*.log .github/vagrant/.vagrant .github/vagrant/macos/.vagrant src_singleheader/c4core-0.2.6/.gitmodules000066400000000000000000000005271477602032300150630ustar00rootroot00000000000000[submodule "cmake"] path = cmake url = https://github.com/biojppm/cmake branch = master [submodule "extern/debugbreak"] path = src/c4/ext/debugbreak url = https://github.com/biojppm/debugbreak branch = master [submodule "src/c4/ext/fast_float"] path = src/c4/ext/fast_float url = https://github.com/fastfloat/fast_float branch = main c4core-0.2.6/CMakeLists.txt000066400000000000000000000076201477602032300154470ustar00rootroot00000000000000cmake_minimum_required(VERSION 3.13 FATAL_ERROR) project(c4core DESCRIPTION "Multiplatform low-level C++ utilities" HOMEPAGE_URL "https://github.com/biojppm/c4core" LANGUAGES CXX) include(./cmake/c4Project.cmake) include(./compat.cmake) c4_project(VERSION 0.2.6 AUTHOR "Joao Paulo Magalhaes ") option(C4CORE_INSTALL "create install target" ON) option(C4CORE_WITH_FASTFLOAT "use fastfloat to parse floats" ON) option(C4CORE_NO_DEBUG_BREAK "disable use of debug break even in debug builds" OFF) set(C4CORE_SRC_FILES c4/allocator.hpp c4/base64.hpp c4/base64.cpp c4/blob.hpp c4/bitmask.hpp c4/charconv.hpp c4/c4_pop.hpp c4/c4_push.hpp c4/char_traits.cpp c4/char_traits.hpp c4/common.hpp c4/compiler.hpp c4/config.hpp c4/cpu.hpp c4/ctor_dtor.hpp c4/dump.hpp c4/enum.hpp c4/error.cpp c4/error.hpp c4/export.hpp c4/format.hpp c4/format.cpp c4/gcc-4.8.hpp c4/hash.hpp c4/language.hpp c4/language.cpp c4/memory_resource.cpp c4/memory_resource.hpp c4/memory_util.cpp c4/memory_util.hpp c4/platform.hpp c4/preprocessor.hpp c4/restrict.hpp c4/span.hpp c4/std/std.hpp c4/std/std_fwd.hpp c4/std/string.hpp c4/std/string_fwd.hpp c4/std/string_view.hpp c4/std/tuple.hpp c4/std/vector.hpp c4/std/vector_fwd.hpp c4/substr.hpp c4/substr_fwd.hpp c4/szconv.hpp c4/type_name.hpp c4/types.hpp c4/unrestrict.hpp c4/utf.hpp c4/utf.cpp c4/windows.hpp c4/version.hpp c4/version.cpp c4/windows_pop.hpp c4/windows_push.hpp c4/c4core.natvis # c4/ext/debugbreak/debugbreak.h c4/ext/rng/rng.hpp c4/ext/sg14/inplace_function.h ) if(C4CORE_WITH_FASTFLOAT) list(APPEND C4CORE_SRC_FILES c4/ext/fast_float.hpp c4/ext/fast_float_all.h ) endif() set(C4CORE_AMALGAMATED ${C4CORE_SRC_DIR}/../src_singleheader/c4/c4core_all.hpp) list(TRANSFORM C4CORE_SRC_FILES PREPEND "${C4CORE_SRC_DIR}/" OUTPUT_VARIABLE C4CORE_SRC_FILES_FULL) add_custom_target(c4core-amalgamate python ${CMAKE_CURRENT_LIST_DIR}/tools/amalgamate.py ${C4CORE_AMALGAMATED} COMMENT "${CMAKE_CURRENT_LIST_DIR}/tools/amalgamate.py ${C4CORE_AMALGAMATED}" BYPRODUCTS ${C4CORE_AMALGAMATED} DEPENDS ${C4CORE_SRC_FILES_FULL} ) c4_add_library(c4core INC_DIRS $ $ SOURCE_ROOT ${C4CORE_SRC_DIR} SOURCES ${C4CORE_SRC_FILES} ) if(NOT C4CORE_WITH_FASTFLOAT) target_compile_definitions(c4core PUBLIC -DC4CORE_NO_FAST_FLOAT) endif() if(C4CORE_NO_DEBUG_BREAK) target_compile_definitions(c4core PUBLIC -DC4_NO_DEBUG_BREAK) endif() #------------------------------------------------------- if(C4CORE_INSTALL) c4_install_target(c4core) c4_install_exports() endif() c4_add_dev_targets() if(C4CORE_INSTALL) c4_pack_project(TYPE LIBRARY) endif() #------------------------------------------------------- # clang-tidy function(c4core_setup_clang_tidy rootdir) get_target_property(srcs c4core SOURCES) string(REPLACE "${rootdir}/" "./" srcs "${srcs}") set(exclude ./c4/ext/.* .natvis) foreach(e ${exclude}) list(FILTER srcs EXCLUDE REGEX ${e}) endforeach() set(cmd ${srcs} -p ${CMAKE_BINARY_DIR} "--config-file=${rootdir}/.clang-tidy" "--header-filter=${rootdir}/src/c4/.*pp|${rootdir}/src/c4/std/.*pp") add_custom_target(c4core-clang-tidy COMMAND ${CMAKE_COMMAND} -E cat ${CMAKE_BINARY_DIR}/compile_commands.json COMMAND ${CLANG_TIDY} --version COMMAND ${CLANG_TIDY} ${cmd} --dump-config COMMAND ${CLANG_TIDY} ${cmd} --list-checks COMMAND ${CLANG_TIDY} ${cmd} WORKING_DIRECTORY ${rootdir} VERBATIM ) endfunction() find_program(CLANG_TIDY clang-tidy) if(CLANG_TIDY) c4core_setup_clang_tidy(${CMAKE_CURRENT_LIST_DIR}) endif() c4core-0.2.6/LICENSE-BOOST.txt000066400000000000000000000027251477602032300154170ustar00rootroot00000000000000src/c4/ext/sg14/inplace_function.h is distributed under the following terms: ---------------------------------------------------------------------------- Boost Software License - Version 1.0 - August 17th, 2003 Permission is hereby granted, free of charge, to any person or organization obtaining a copy of the software and accompanying documentation covered by this license (the "Software") to use, reproduce, display, distribute, execute, and transmit the Software, and to prepare derivative works of the Software, and to permit third-parties to whom the Software is furnished to do so, all subject to the following: The copyright notices in the Software and this entire statement, including the above license grant, this restriction and the following disclaimer, must be included in all copies of the Software, in whole or in part, and all derivative works of the Software, unless such copies or derivative works are solely in the form of machine-executable object code generated by a source language processor. 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, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. c4core-0.2.6/LICENSE.txt000066400000000000000000000020711477602032300145250ustar00rootroot00000000000000Copyright (c) 2018, Joao Paulo Magalhaes 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. c4core-0.2.6/README.md000066400000000000000000000375341477602032300141750ustar00rootroot00000000000000# c4core - C++ core utilities [![MIT Licensed](https://img.shields.io/badge/License-MIT-green.svg)](https://github.com/biojppm/c4core/blob/master/LICENSE.txt) [![ci](https://github.com/biojppm/c4core/workflows/ci/badge.svg)](https://github.com/biojppm/c4core/actions?query=ci) [![Codecov](https://codecov.io/gh/biojppm/c4core/branch/master/graph/badge.svg)](https://codecov.io/gh/biojppm/c4core) c4core is a library of low-level C++ utilities, written with low-latency projects in mind. Some of the utilities provided by c4core have already equivalent functionality in the C++ standard, but they are provided as the existing C++ equivalent may be insufficient (eg, std::string_view), inefficient (eg, std::string), heavy (eg streams), or plainly unusable on some platforms/projects, (eg exceptions); some other utilities have equivalent under consideration for C++ standardisation; and yet some other utilities have (to my knowledge) no equivalent under consideration. Be that as it may, I've been using these utilities in this or similar forms for some years now, and I've found them incredibly useful in my projects. I'm packing these as a separate library, as all of my projects use it. c4core is [extensively unit-tested in Linux, Windows and MacOS](https://github.com/biojppm/c4core/actions). The tests cover x64, x86, arm, wasm (emscripten), aarch64, ppc64le and s390x architectures, and include analysing c4core with: * valgrind * clang-tidy * clang sanitizers: * memory * address * undefined behavior * thread * [LGTM.com](https://lgtm.com/projects/g/biojppm/c4core) c4core also works [in bare-metal](https://github.com/biojppm/c4core/issues/63), as well as [in RISC-V](https://github.com/biojppm/c4core/pull/69), and [in LoongArch](https://github.com/biojppm/c4core/pull/119), but at the moment it's not easy to add automated tests to the CI, so for now these are not in the list of official architectures. - [c4core - C++ core utilities](#c4core---c-core-utilities) - [Obtaining c4core](#obtaining-c4core) - [Using c4core in your project](#using-c4core-in-your-project) - [CMake](#cmake) - [Bazel](#bazel) - [Header-only](#header-only) - [Package managers](#package-managers) - [Quick tour](#quick-tour) - [Writeable string views: c4::substr and c4::csubstr](#writeable-string-views-c4substr-and-c4csubstr) - [Value <-> character interoperation](#value---character-interoperation) - [String formatting and parsing](#string-formatting-and-parsing) - [`c4::span` and `c4::blob`](#c4span-and-c4blob) - [Enums and enum symbols](#enums-and-enum-symbols) - [Bitmasks and bitmask symbols](#bitmasks-and-bitmask-symbols) - [Base64 encoding / decoding](#base64-encoding--decoding) - [Fuzzy float comparison](#fuzzy-float-comparison) - [Multi-platform / multi-compiler utilities](#multi-platform--multi-compiler-utilities) - [Runtime assertions and error handling](#runtime-assertions-and-error-handling) - [Memory allocation](#memory-allocation) - [Mass initialization/construction/destruction](#mass-initializationconstructiondestruction) ## Obtaining c4core c4core uses git submodules. It is best to clone c4core with the `--recursive` option: ```bash # using --recursive makes sure git submodules are also cloned at the same time git clone --recursive https://github.com/biojppm/c4core ``` If you ommit the `--recursive` option, then after cloning you will have to make git checkout the current version of the submodules, using `git submodule init` followed by `git submodule update`. ## Using c4core in your project c4core can be built with [cmake](#cmake), or can be used header only. It can also be obtained through some package managers. ### CMake The recommended way to use c4core is by making it part of your project by using `add_subdirectory(${path_to_c4core_root})` in your CMakeLists.txt. Doing this is not intrusive to your cmake project because c4core is fast to build, also prefixes every cmake variable with `C4CORE_`. But more importantly, this will enable you to compile c4core with the exact same compile settings used by your project. Here's a very quick complete example of setting up your project to use c4core as a cmake subproject: ```cmake project(foo) add_subdirectory(c4core) add_library(foo foo.cpp) target_link_libraries(foo PUBLIC c4core) # that's it! ``` Note above that the call to `target_link_libraries()` is using PUBLIC linking. This is required to make sure the include directories from `c4core` are transitively used by clients of `foo`. ### Header-only If you prefer to pick a single header to get you quickly going, [there is an amalgamation tool](tools/amalgamate.py) which generates this header: ```console [user@host c4core]$ python tools/amalgamate.py -h usage: amalgamate.py [-h] [--fastfloat | --no-fastfloat] [--stl | --no-stl] [output] positional arguments: output output file. defaults to stdout options: -h, --help show this help message and exit --fastfloat enable fastfloat library. this is the default. --no-fastfloat enable fastfloat library. the default is --fastfloat. --stl enable stl interop. this is the default. --no-stl enable stl interop. the default is --stl. ``` ### Package managers c4core is available through the following package managers: * [vcpkg](https://vcpkg.io/en/packages.html): `vcpkg install c4core` * Arch Linux/Manjaro: * [rapidyaml](https://aur.archlinux.org/packages/rapidyaml/) ## Quick tour All of the utilities in this library are under the namespace `c4`; any exposed macros use the prefix `C4_`: eg `C4_ASSERT()`. See partial documentation in [rapidyaml's doxygen docs](https://rapidyaml.readthedocs.io/latest/doxygen/index.html). ### Writeable string views: c4::substr and c4::csubstr Here: [`#include `](src/c4/substr.hpp). There is a [useful quickstart sample](https://rapidyaml.readthedocs.io/latest/doxygen/group__doc__quickstart.html#ga43e253da0692c13967019446809c1113) in rapidyaml's doxygen docs. ### charconv: Value <-> character interoperation Here: [`#include `](src/c4/charconv.hpp) ```c++ // TODO: elaborate on the topics: c4::digits_dec(), c4::read_dec(), c4::write_dec() c4::digits_hex(), c4::read_hex(), c4::write_hex() c4::digits_oct(), c4::read_oct(), c4::write_oct() c4::digits_bin(), c4::read_bin(), c4::write_bin() c4::utoa(), c4::atou() c4::itoa(), c4::atoi() c4::ftoa(), c4::atof() c4::dtoa(), c4::atod() c4::xtoa(), c4::atox() c4::to_chars(), c4::from_chars() c4::to_chars_sub() c4::to_chars_first() ``` The charconv funcions above are very fast; even faster than C++'s fastest facility `std::from_chars()`, `std::to_chars()`. For continuous benchmark results, browse through c4core's [github CI benchmark runs](https://github.com/biojppm/c4core/actions/workflows/benchmarks.yml). For example, a benchmark run on Linux/g++11.2 shows that: - `c4::to_chars()` can be expected to be roughly... - ~40% to 2x faster than `std::to_chars()` - ~10x-30x faster than `sprintf()` - ~50x-100x faster than a naive `stringstream::operator<<()` followed by `stringstream::str()` - `c4::from_chars()` can be expected to be roughly... - ~10%-30% faster than `std::from_chars()` - ~10x faster than `scanf()` - ~30x-50x faster than a naive `stringstream::str()` followed by `stringstream::operator>>()` Here are the results: | Write throughput | | Read throughput | | |:-------------------------|--------:|:-------------------------|---------:| | **write `uint8_t`** | **MB/s**| **read `uint8_t`** | **MB/s**| | `c4::to_chars` | 526.86 | `c4::from_chars` | 163.06 | | `std::to_chars` | 379.03 | `std::from_chars` | 154.85 | | `std::sprintf` | 20.49 | `std::scanf` | 15.75 | | `std::stringstream` | 3.82 | `std::stringstream` | 3.83 | | **write `int8_t`** | **MB/s**| **read `int8_t`** | **MB/s**| | `c4::to_chars` | 599.98 | `c4::from_chars` | 184.20 | | `std::to_chars` | 246.32 | `std::from_chars` | 156.40 | | `std::sprintf` | 19.15 | `std::scanf` | 16.44 | | `std::stringstream` | 3.83 | `std::stringstream` | 3.89 | | **write `uint16_t`** | **MB/s**| **read `uint16_t`** | **MB/s**| | `c4::to_chars` | 486.40 | `c4::from_chars` | 349.48 | | `std::to_chars` | 454.24 | `std::from_chars` | 319.13 | | `std::sprintf` | 38.74 | `std::scanf` | 28.12 | | `std::stringstream` | 7.08 | `std::stringstream`| 6.73 | | **write `int16_t`** | **MB/s**| **read `int16_t`** | **MB/s**| | `c4::to_chars` | 507.44 | `c4::from_chars` | 282.95 | | `std::to_chars` | 297.49 | `std::from_chars` | 186.18 | | `std::sprintf` | 39.03 | `std::scanf` | 28.45 | | `std::stringstream` | 6.98 | `std::stringstream`| 6.49 | | **write `uint32_t`** | **MB/s**| **read `uint32_t`** | **MB/s**| | `c4::to_chars` | 730.12 | `c4::from_chars` | 463.95 | | `std::to_chars` | 514.76 | `std::from_chars` | 329.42 | | `std::sprintf` | 71.19 | `std::scanf` | 44.97 | | `std::stringstream` | 14.05 | `std::stringstream`| 12.57 | | **write `int32_t`** | **MB/s**| **read `int32_t`** | **MB/s**| | `c4::to_chars` | 618.76 | `c4::from_chars` | 345.53 | | `std::to_chars` | 394.72 | `std::from_chars` | 224.46 | | `std::sprintf` | 71.14 | `std::scanf` | 43.49 | | `std::stringstream` | 13.91 | `std::stringstream`| 12.03 | | **write `uint64_t`** | **MB/s**| **read `uint64_t`** | **MB/s**| | `c4::to_chars` | 1118.87 | `c4::from_chars` | 928.49 | | `std::to_chars` | 886.58 | `std::from_chars` | 759.03 | | `std::sprintf` | 140.96 | `std::scanf` | 91.60 | | `std::stringstream` | 28.01 | `std::stringstream`| 25.00 | | **write `int64_t`** | **MB/s**| **read `int64_t`** | **MB/s**| | `c4::to_chars` | 1198.78 | `c4::from_chars` | 713.76 | | `std::to_chars` | 882.17 | `std::from_chars` | 646.18 | | `std::sprintf` | 138.79 | `std::scanf` | 90.07 | | `std::stringstream` | 27.62 | `std::stringstream`| 25.12 | Or here are plots for g++12.1 and VS2019 (from the same computer): | Linux gxx12.1 | Windows VS2019 | |---------------|----------------| | ![atox-u32-linux](doc/img/linux-x86_64-gxx12.1-Release/c4core-bm-charconv-atox-mega_bytes_per_second-u32.png "atox-u32-linux") | ![atox-u32-windows](doc/img/windows-x86_64-vs2019-Release/c4core-bm-charconv-atox-mega_bytes_per_second-u32.png "atox-u32-windows") | | ![atox-i32-linux](doc/img/linux-x86_64-gxx12.1-Release/c4core-bm-charconv-atox-mega_bytes_per_second-i32.png "atox-i32-linux") | ![atox-i32-windows](doc/img/windows-x86_64-vs2019-Release/c4core-bm-charconv-atox-mega_bytes_per_second-i32.png "atox-i32-windows") | | ![atox-u64-linux](doc/img/linux-x86_64-gxx12.1-Release/c4core-bm-charconv-atox-mega_bytes_per_second-u64.png "atox-u64-linux") | ![atox-u64-windows](doc/img/windows-x86_64-vs2019-Release/c4core-bm-charconv-atox-mega_bytes_per_second-u64.png "atox-u64-windows") | | ![atox-i64-linux](doc/img/linux-x86_64-gxx12.1-Release/c4core-bm-charconv-atox-mega_bytes_per_second-i64.png "atox-i64-linux") | ![atox-i64-windows](doc/img/windows-x86_64-vs2019-Release/c4core-bm-charconv-atox-mega_bytes_per_second-i64.png "atox-i64-windows") | | ![atof-double-linux](doc/img/linux-x86_64-gxx12.1-Release/c4core-bm-charconv-atof-mega_bytes_per_second-double.png "atof-double-linux") | ![atof-double-windows](doc/img/windows-x86_64-vs2019-Release/c4core-bm-charconv-atof-mega_bytes_per_second-double.png "atof-double-windows") | | ![atof-float-linux](doc/img/linux-x86_64-gxx12.1-Release/c4core-bm-charconv-atof-mega_bytes_per_second-float.png "atof-float-linux") | ![atof-float-windows](doc/img/windows-x86_64-vs2019-Release/c4core-bm-charconv-atof-mega_bytes_per_second-float.png "atof-float-windows") | | | | | ![xtoa-u32-linux](doc/img/linux-x86_64-gxx12.1-Release/c4core-bm-charconv-xtoa-mega_bytes_per_second-u32.png "xtoa-u32-linux") | ![xtoa-u32-windows](doc/img/windows-x86_64-vs2019-Release/c4core-bm-charconv-xtoa-mega_bytes_per_second-u32.png "xtoa-u32-windows") | | ![xtoa-i32-linux](doc/img/linux-x86_64-gxx12.1-Release/c4core-bm-charconv-xtoa-mega_bytes_per_second-i32.png "xtoa-i32-linux") | ![xtoa-i32-windows](doc/img/windows-x86_64-vs2019-Release/c4core-bm-charconv-xtoa-mega_bytes_per_second-i32.png "xtoa-i32-windows") | | ![xtoa-u64-linux](doc/img/linux-x86_64-gxx12.1-Release/c4core-bm-charconv-xtoa-mega_bytes_per_second-u64.png "xtoa-u64-linux") | ![xtoa-u64-windows](doc/img/windows-x86_64-vs2019-Release/c4core-bm-charconv-xtoa-mega_bytes_per_second-u64.png "xtoa-u64-windows") | | ![xtoa-i64-linux](doc/img/linux-x86_64-gxx12.1-Release/c4core-bm-charconv-xtoa-mega_bytes_per_second-i64.png "xtoa-i64-linux") | ![xtoa-i64-windows](doc/img/windows-x86_64-vs2019-Release/c4core-bm-charconv-xtoa-mega_bytes_per_second-i64.png "xtoa-i64-windows") | ### String formatting and parsing * [`#include `](src/c4/format.hpp) * There is a [useful quickstart sample](https://rapidyaml.readthedocs.io/latest/doxygen/group__doc__quickstart.html#gac2425b515eb552589708cfff70c52b14) in rapidyaml's doxygen docs. ```c++ // TODO: elaborate on the topics: c4::cat(), c4::uncat() c4::catsep(), c4::uncatsep() c4::format(), c4::unformat() c4::catrs() c4::catseprs() c4::formatrs() // formatting: c4::fmt::overflow_checked c4::fmt::real c4::fmt::boolalpha c4::fmt::dec c4::fmt::hex c4::fmt::oct c4::fmt::bin c4::fmt::zpad c4::fmt::right c4::fmt::left c4::fmt::raw, c4::fmt::craw c4::fmt::base64, c4::fmt::cbase64 ``` ### `c4::span` and `c4::blob` * [`#include `](src/c4/span.hpp) * [`#include `](src/c4/blob.hpp) ### Enums and enum symbols [`#include `](src/c4/enum.hpp) ```c++ // TODO: elaborate on the topics: c4::e2str(), c4::str2e() ``` ### Bitmasks and bitmask symbols [`#include `](src/c4/bitmask.hpp) ```c++ // TODO: elaborate on the topics: c4::bm2str(), c4::str2bm() ``` ### Base64 encoding / decoding [`#include `](src/c4/base64.hpp) ### Fuzzy float comparison ### Multi-platform / multi-compiler utilities ```c++ // TODO: elaborate on the topics: #include C4_RESTRICT, $, c$, $$, c$$ #include #include #include #include C4_UNREACHABLE() c4::type_name() // portable attributes C4_LIKELY()/C4_UNLIKELY() C4_ALWAYS_INLINE C4_CONST C4_PURE C4_HOT C4_COLD ``` ### Runtime assertions and error handling ```c++ // TODO: elaborate on the topics: error callback C4_ASSERT() C4_XASSERT() C4_CHECK() C4_ERROR() C4_NOT_IMPLEMENTED() ``` ### Memory allocation ```c++ // TODO: elaborate on the topics: c4::aalloc(), c4::afree() // aligned allocation c4::MemoryResource // global and scope c4::Allocator ``` ### Mass initialization/construction/destruction ```c++ // TODO: elaborate on the topics: c4::make_room()/c4::destroy_room() c4::construct()/c4::construct_n() c4::destroy()/c4::destroy_n() c4::copy_construct()/c4::copy_construct_n() c4::copy_assign()/c4::copy_assign_n() c4::move_construct()/c4::move_construct_n() c4::move_assign()/c4::move_assign_n() ``` c4core-0.2.6/ROADMAP.md000066400000000000000000000010671477602032300143130ustar00rootroot00000000000000# ROADMAP ## New features These changes will provide new features, and client code can be kept unchanged. ## API changes These changes will require client code to be updated. * [breaking] drop use of C-style sprintf() formats in error messages and assertions. Change the implementation to use c4::format() ```c++ C4_ASSERT_MSG(sz > s.size(), "sz=%zu s.size()=%zu", sz, s.size()); // ... the above changes to: C4_ASSERT_MSG(sz > s.size(), "sz={} s.size()={}", sz, s.size()); ``` ## Implementation changes * drop calls to sprintf() in charconv.hpp. c4core-0.2.6/bm/000077500000000000000000000000001477602032300133005ustar00rootroot00000000000000c4core-0.2.6/bm/CMakeLists.txt000066400000000000000000000166231477602032300160500ustar00rootroot00000000000000c4_setup_benchmarking() add_custom_target(c4core-bm-plot) c4_set_folder_remote_project_targets(bm/plot c4core-bm-plot) find_package(Python REQUIRED COMPONENTS Interpreter) #---------------------------------------------- c4_add_executable(c4core-bm-format SOURCES bm_format.cpp LIBS c4core benchmark FOLDER bm) c4_add_target_benchmark(c4core-bm-format cat FILTER "^cat_.*") c4_add_target_benchmark(c4core-bm-format catsep FILTER "^catsep_.*") c4_add_target_benchmark(c4core-bm-format format FILTER "^format_.*") c4_add_target_benchmark(c4core-bm-format catfile FILTER "^catfile_.*") c4_add_target_benchmark(c4core-bm-format catsepfile FILTER "^catsepfile_.*") c4_add_target_benchmark(c4core-bm-format formatfile FILTER "^formatfile_.*") #---------------------------------------------- # R&D for xtoa option(C4CORE_BM_XTOA_RND "whether to enable R&D benchmark for xtoa" OFF) option(C4CORE_BM_ATOX_RND "whether to enable R&D benchmark for atox" OFF) if(C4CORE_BM_XTOA_RND) c4_add_executable(c4core-bm-xtoa SOURCES bm_xtoa.cpp LIBS c4core benchmark FOLDER bm) function(c4core_xtoa_benchmark pfx) foreach(case ${ARGN}) c4_add_target_benchmark(c4core-bm-xtoa ${pfx}-${case} FILTER "^${pfx}_.*<${case}.*") endforeach() endfunction() c4core_xtoa_benchmark(msb uint8 int8 uint16 int16 uint32 int32 uint64 int64) c4core_xtoa_benchmark(digits_dec uint8 int8 uint16 int16 uint32 int32 uint64 int64) c4core_xtoa_benchmark(write_dec uint8 int8 uint16 int16 uint32 int32 uint64 int64) endif() if(C4CORE_BM_ATOX_RND) c4_add_executable(c4core-bm-atox SOURCES bm_atox.cpp LIBS c4core benchmark FOLDER bm) function(c4core_atox_benchmark) foreach(case ${ARGN}) c4_add_target_benchmark(c4core-bm-atox ${case} FILTER "^.*<${case}.*") endforeach() endfunction() c4core_atox_benchmark(uint8 int8 uint16 int16 uint32 int32 uint64 int64) endif() #---------------------------------------------- c4_add_executable(c4core-bm-charconv SOURCES bm_charconv.cpp bm_charconv.hpp LIBS c4core benchmark INC_DIRS ${C4CORE_SRC_DIR}/c4/ext/fast_float/include FOLDER bm) # libraries to compare. defaults to off. option(C4CORE_BM_USE_RYU "enable comparison with ryu library" OFF) option(C4CORE_BM_USE_FP "enable comparison with fp library" OFF) # fp requires c++17 or later get_property(known_features GLOBAL PROPERTY CMAKE_CXX_KNOWN_FEATURES) if(cxx_std_17 IN_LIST known_features) set(C4CORE_BM_USE_FP OFF CACHE BOOL "" FORCE) endif() if(C4CORE_BM_USE_FP) c4_require_subproject(fp REMOTE GIT_REPOSITORY https://github.com/jk-jeon/fp GIT_TAG master GIT_SHALLOW ON EXCLUDE_FROM_ALL) target_link_libraries(c4core-bm-charconv PRIVATE jkj_fp) target_compile_definitions(c4core-bm-charconv PUBLIC -DC4CORE_BM_USE_FP) endif() # ryu not supported in windows with 32bit if(MSVC AND (CMAKE_SIZEOF_VOID_P EQUAL 4)) set(C4CORE_BM_USE_RYU OFF CACHE BOOL "" FORCE) endif() if(C4CORE_BM_USE_RYU) # ryu requires too much code; use an include for clarity include(./ryu.cmake) target_link_libraries(c4core-bm-charconv PRIVATE ryu_c4) target_compile_definitions(c4core-bm-charconv PUBLIC -DC4CORE_BM_USE_RYU) endif() function(c4core_charconv_benchmark name rx) unset(result_files) foreach(datatype ${ARGN}) c4_add_target_benchmark(c4core-bm-charconv ${name}-${datatype} FILTER "${rx}<${datatype}.*" RESULTS_FILE results_file) list(APPEND result_files ${results_file}) endforeach() add_custom_target(c4core-bm-charconv-${name}-plot #DEPENDS ${result_files} COMMAND cmake -E echo "${Python_EXECUTABLE}" COMMAND ${Python_EXECUTABLE} --version COMMAND ${Python_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/bm_plot_c4core.py ${name} ${result_files} ) add_dependencies(c4core-bm-plot c4core-bm-charconv-${name}-plot) c4_set_folder_remote_project_targets(bm/plot c4core-bm-charconv-${name}-plot) endfunction() c4core_charconv_benchmark(digits "^c4_digits.*" uint8 int8 uint16 int16 uint32 int32 uint64 int64) c4core_charconv_benchmark(xtoa "^xtoa_.*" uint8 int8 uint16 int16 uint32 int32 uint64 int64) c4core_charconv_benchmark(atox "^atox_.*" uint8 int8 uint16 int16 uint32 int32 uint64 int64) c4core_charconv_benchmark(ftoa "^xtoa_.*" float double) c4core_charconv_benchmark(atof "^atox_.*" float double) #---------------------------------------------- option(C4CORE_BM_FLOAT_CMP "compare between alternative implementations for reading/writing floats" ON) if(C4CORE_BM_FLOAT_CMP) add_subdirectory(float) endif() #---------------------------------------------- option(C4CORE_BM_ITOA_THREADS "compare itoa thread degradation across alternative implementations" OFF) if(C4CORE_BM_ITOA_THREADS) c4_download_remote_proj(stb stbdir REMOTE GIT_REPOSITORY https://github.com/nothings/stb GIT_SHALLOW ON) c4_require_subproject(fmtlib REMOTE GIT_REPOSITORY https://github.com/fmtlib/fmt GIT_TAG 8.1.1 GIT_SHALLOW ON) c4_set_folder_remote_project_targets(ext fmt) c4_add_executable(c4core-bm-itoa_threads SOURCES bm_itoa_threads.cpp bm_charconv.hpp LIBS fmt c4core benchmark INC_DIRS ${stbdir} FOLDER bm) unset(_c4core_itoa_thread_result_files) add_custom_target(c4core-bm-itoa_threads-all) function(c4core_itoa_threads_benchmark name rx) set(li ${_c4core_itoa_thread_result_files}) c4_add_target_benchmark(c4core-bm-itoa_threads ${name} FILTER "${rx}" RESULTS_FILE results_file) add_dependencies(c4core-bm-itoa_threads-all c4core-bm-itoa_threads-${name}) c4_set_folder_remote_project_targets(bm/run c4core-bm-itoa_threads-all) list(APPEND li ${results_file}) set(_c4core_itoa_thread_result_files ${li} PARENT_SCOPE) endfunction() c4core_itoa_threads_benchmark(c4_write_dec "^c4_write_dec/.*") c4core_itoa_threads_benchmark(c4_itoa "^c4_itoa/.*") c4core_itoa_threads_benchmark(c4_xtoa "^c4_xtoa/.*") c4core_itoa_threads_benchmark(c4_to_chars "^c4_to_chars/.*") c4core_itoa_threads_benchmark(std_to_chars "^std_to_chars/.*") c4core_itoa_threads_benchmark(fmtlib_format_to "^fmtlib_format_to/.*") c4core_itoa_threads_benchmark(snprintf "^snprintf/.*") c4core_itoa_threads_benchmark(stb_snprintf "^stb_snprintf/.*") if(WIN32) c4core_itoa_threads_benchmark(snprintf_l "^snprintf_l/.*") c4core_itoa_threads_benchmark(itoa "^itoa/.*") #get_property(known_features GLOBAL PROPERTY CMAKE_CXX_KNOWN_FEATURES) #if(cxx_std_20 IN_LIST known_features) #c4core_itoa_threads_benchmark(std_format_to "^std_format_to/.*") #endif() endif() c4core_itoa_threads_benchmark(sstream "^sstream/.*") c4core_itoa_threads_benchmark(sstream_naive_reuse "^sstream_naive_reuse/.*") c4core_itoa_threads_benchmark(sstream_naive "^sstream_naive/.*") add_custom_target(c4core-bm-itoa_threads-plot #DEPENDS ${_c4core_itoa_thread_result_files} COMMAND cmake -E echo "${Python_EXECUTABLE}" COMMAND ${Python_EXECUTABLE} --version COMMAND ${Python_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/bm_plot_c4core.py itoa_threads ${_c4core_itoa_thread_result_files} ) c4_set_folder_remote_project_targets(bm/plot c4core-bm-itoa_threads-plot) add_dependencies(c4core-bm-plot c4core-bm-itoa_threads-plot) endif() c4core-0.2.6/bm/bm.yml000066400000000000000000000023501477602032300144210ustar00rootroot00000000000000 prefix: c4core-bm # TODO https://stackoverflow.com/questions/12360547/tool-for-retrieving-the-list-of-functions-and-methods-in-a-c-code-base bm: charconv-atox: desc: read string to arithmetic value src: bm_charconv.cpp template_types: [uint8, int8, uint16, int16, uint32, int32, uint64, int64, float, double] charconv-xtoa: desc: write arithmetic value to string src: bm_charconv.cpp template_types: [uint8, int8, uint16, int16, uint32, int32, uint64, int64, float, double] format-cat: desc: compares stringification of a sequence of heterogeneous general types src: bm_format.cpp format-catfile: desc: compares stringification to a file of a sequence of heterogeneous general types src: bm_format.cpp format-catsep: desc: compares stringification of a sequence of heterogeneous general types src: bm_format.cpp format-catsepfile: desc: compares stringification to a file of a sequence of heterogeneous general types src: bm_format.cpp format-format: desc: compares formatting of a sequence of heterogeneous general types src: bm_format.cpp format-formatfile: desc: compares stringification to a file of a sequence of heterogeneous general types src: bm_format.cpp c4core-0.2.6/bm/bm_atox.cpp000066400000000000000000000352721477602032300154460ustar00rootroot00000000000000#include "./bm_charconv.hpp" // this is an exploratory benchmark to compare the possible // combinations for all the components of the read_dec() algorithm template bool range_based_restrictvar0(c4::csubstr s, T * v) { *v = 0; for(char c : s) { if(C4_UNLIKELY(c < '0' || c > '9')) return false; *v = (*v) * T(10) + (T(c) - T('0')); } return true; } template bool range_based_restrictvar1(c4::csubstr s, T *C4_RESTRICT v) { *v = 0; for(char c : s) { if(C4_UNLIKELY(c < '0' || c > '9')) return false; *v = (*v) * T(10) + (T(c) - T('0')); } return true; } template bool indexloop_restrictvar0(c4::csubstr s, T * v) { *v = 0; for(size_t i = 0; i < s.len; ++i) { const char c = s.str[i]; if(C4_UNLIKELY(c < '0' || c > '9')) return false; *v = (*v) * T(10) + (T(c) - T('0')); } return true; } template bool indexloop_restrictvar1(c4::csubstr s, T *C4_RESTRICT v) { *v = 0; for(size_t i = 0; i < s.len; ++i) { const char c = s.str[i]; if(C4_UNLIKELY(c < '0' || c > '9')) return false; *v = (*v) * T(10) + (T(c) - T('0')); } return true; } template bool prefer_likely(c4::csubstr s, T * v) { *v = 0; for(char c : s) { if(C4_LIKELY(c >= '0' && c <= '9')) *v = (*v) * T(10) + (T(c) - T('0')); else return false; } return true; } template bool no_early_return(c4::csubstr s, T *C4_RESTRICT v) { *v = 0; bool stat = true; for(char c : s) { if(C4_LIKELY(c >= '0' && c <= '9')) *v = (*v) * T(10) + (T(c) - T('0')); else { stat = false; break; } } return stat; } template bool no_early_return_auto_type(c4::csubstr s, T *C4_RESTRICT v) { *v = 0; bool stat = true; for(char c : s) { if(C4_LIKELY(c >= '0' && c <= '9')) *v = (*v) * T(10) + (T)(c - '0'); else { stat = false; break; } } return stat; } template bool no_early_return_auto_type2(c4::csubstr s, T *C4_RESTRICT v) { *v = 0; bool stat = true; for(char c : s) { if(C4_LIKELY(c >= '0' && c <= '9')) { *v *= 10; *v += (T)(c - '0'); } else { stat = false; break; } } return stat; } #define _(i) (T)(s.str[i] - '0') C4_SUPPRESS_WARNING_GCC_CLANG_WITH_PUSH("-Wimplicit-fallthrough") template C4_ALWAYS_INLINE auto unroll_switch_nocheck(c4::csubstr s, T *C4_RESTRICT v) -> typename std::enable_if::type { *v = 0; switch(s.len) { case 1: *v = _(0); return true; case 2: *v = T(10) * _(0) + _(1); return true; case 3: *v = T(100) * _(0) + T(10) * _(1) + _(2); return true; } return false; } template C4_ALWAYS_INLINE auto unroll_switch_nocheck(c4::csubstr s, T *C4_RESTRICT v) -> typename std::enable_if::type { *v = 0; switch(s.len) { case 1: *v = _(0); return true; case 2: *v = T(10) * _(0) + _(1); return true; case 3: *v = T(100) * _(0) + T(10) * _(1) + _(2); return true; case 4: *v = T(1000) * _(0) + T(100) * _(1) + T(10) * _(2) + _(3); return true; case 5: *v = T(10000) * _(0) + T(1000) * _(1) + T(100) * _(2) + T(10) * _(3) + _(4); return true; } return false; } template C4_ALWAYS_INLINE auto unroll_switch_nocheck(c4::csubstr s, T *C4_RESTRICT v) -> typename std::enable_if::type { switch(s.len) { case 1: *v = _(0); return true; case 2: *v = T(10) * _(0) + _(1); return true; case 3: *v = T(100) * _(0) + T(10) * _(1) + _(2); return true; case 4: *v = T(1000) * _(0) + T(100) * _(1) + T(10) * _(2) + _(3); return true; case 5: *v = T(10000) * _(0) + T(1000) * _(1) + T(100) * _(2) + T(10) * _(3) + _(4); return true; case 6: *v = T(100000) * _(0) + T(10000) * _(1) + T(1000) * _(2) + T(100) * _(3) + T(10) * _(4) + _(5); return true; case 7: *v = T(1000000) * _(0) + T(100000) * _(1) + T(10000) * _(2) + T(1000) * _(3) + T(100) * _(4) + T(10) * _(5) + _(6); return true; case 8: *v = T(10000000) * _(0) + T(1000000) * _(1) + T(100000) * _(2) + T(10000) * _(3) + T(1000) * _(4) + T(100) * _(5) + T(10) * _(6) + _(7); return true; case 9: *v = T(100000000) * _(0) + T(10000000) * _(1) + T(1000000) * _(2) + T(100000) * _(3) + T(10000) * _(4) + T(1000) * _(5) + T(100) * _(6) + T(10) * _(7) + _(8); return true; case 10: *v = T(1000000000) * _(0) + T(100000000) * _(1) + T(10000000) * _(2) + T(1000000) * _(3) + T(100000) * _(4) + T(10000) * _(5) + T(1000) * _(6) + T(100) * _(7) + T(10) * _(8) + _(9); return true; } return false; } template C4_ALWAYS_INLINE auto unroll_switch_nocheck(c4::csubstr s, T *C4_RESTRICT v) -> typename std::enable_if::type { switch(s.len) { case 1: *v = _(0); return true; case 2: *v = T(10) * _(0) + _(1); return true; case 3: *v = T(100) * _(0) + T(10) * _(1) + _(2); return true; case 4: *v = T(1000) * _(0) + T(100) * _(1) + T(10) * _(2) + _(3); return true; case 5: *v = T(10000) * _(0) + T(1000) * _(1) + T(100) * _(2) + T(10) * _(3) + _(4); return true; case 6: *v = T(100000) * _(0) + T(10000) * _(1) + T(1000) * _(2) + T(100) * _(3) + T(10) * _(4) + _(5); return true; case 7: *v = T(1000000) * _(0) + T(100000) * _(1) + T(10000) * _(2) + T(1000) * _(3) + T(100) * _(4) + T(10) * _(5) + _(6); return true; case 8: *v = T(10000000) * _(0) + T(1000000) * _(1) + T(100000) * _(2) + T(10000) * _(3) + T(1000) * _(4) + T(100) * _(5) + T(10) * _(6) + _(7); return true; case 9: *v = T(100000000) * _(0) + T(10000000) * _(1) + T(1000000) * _(2) + T(100000) * _(3) + T(10000) * _(4) + T(1000) * _(5) + T(100) * _(6) + T(10) * _(7) + _(8); return true; case 10: *v = T(1000000000) * _(0) + T(100000000) * _(1) + T(10000000) * _(2) + T(1000000) * _(3) + T(100000) * _(4) + T(10000) * _(5) + T(1000) * _(6) + T(100) * _(7) + T(10) * _(8) + _(9); return true; default: { size_t i = 0; *v = 0; for( ; i + 10 < s.len; ++i) *v = *v * T(10) + _(i); *v = T(1000000000) * _(i) + T(100000000) * _(i+1) + T(10000000) * _(i+2) + T(1000000) * _(i+3) + T(100000) * _(i+4) + T(10000) * _(i+5) + T(1000) * _(i+6) + T(100) * _(i+7) + T(10) * _(i+8) + _(i+9); return true; } } return false; } #define ok(i) (s.str[i] >= '0' && s.str[i] <= '9') template C4_ALWAYS_INLINE auto unroll_switch(c4::csubstr s, T *C4_RESTRICT v) -> typename std::enable_if::type { *v = 0; switch(s.len) { case 1: *v = _(0); return ok(0); case 2: *v = T(10) * _(0) + _(1); return ok(0) && ok(1); case 3: *v = T(100) * _(0) + T(10) * _(1) + _(2); return ok(0) && ok(1) && ok(2); } return false; } template C4_ALWAYS_INLINE auto unroll_switch(c4::csubstr s, T *C4_RESTRICT v) -> typename std::enable_if::type { *v = 0; switch(s.len) { case 1: *v = _(0); return true; case 2: *v = T(10) * _(0) + _(1); return true; case 3: *v = T(100) * _(0) + T(10) * _(1) + _(2); return ok(0) && ok(1) && ok(2); case 4: *v = T(1000) * _(0) + T(100) * _(1) + T(10) * _(2) + _(3); return ok(0) && ok(1) && ok(2) && ok(3); case 5: *v = T(10000) * _(0) + T(1000) * _(1) + T(100) * _(2) + T(10) * _(3) + _(4); return ok(0) && ok(1) && ok(2) && ok(3) && ok(4); } return false; } template C4_ALWAYS_INLINE auto unroll_switch(c4::csubstr s, T *C4_RESTRICT v) -> typename std::enable_if::type { switch(s.len) { case 1: *v = _(0); return ok(0); case 2: *v = T(10) * _(0) + _(1); return ok(0) && ok(1); case 3: *v = T(100) * _(0) + T(10) * _(1) + _(2); return ok(0) && ok(1) && ok(2); case 4: *v = T(1000) * _(0) + T(100) * _(1) + T(10) * _(2) + _(3); return ok(0) && ok(1) && ok(2) && ok(3); case 5: *v = T(10000) * _(0) + T(1000) * _(1) + T(100) * _(2) + T(10) * _(3) + _(4); return ok(0) && ok(1) && ok(2) && ok(3) && ok(4); case 6: *v = T(100000) * _(0) + T(10000) * _(1) + T(1000) * _(2) + T(100) * _(3) + T(10) * _(4) + _(5); return ok(0) && ok(1) && ok(2) && ok(3) && ok(4) && ok(5); case 7: *v = T(1000000) * _(0) + T(100000) * _(1) + T(10000) * _(2) + T(1000) * _(3) + T(100) * _(4) + T(10) * _(5) + _(6); return ok(0) && ok(1) && ok(2) && ok(3) && ok(4) && ok(5) && ok(6); case 8: *v = T(10000000) * _(0) + T(1000000) * _(1) + T(100000) * _(2) + T(10000) * _(3) + T(1000) * _(4) + T(100) * _(5) + T(10) * _(6) + _(7); return ok(0) && ok(1) && ok(2) && ok(3) && ok(4) && ok(5) && ok(6) && ok(7); case 9: *v = T(100000000) * _(0) + T(10000000) * _(1) + T(1000000) * _(2) + T(100000) * _(3) + T(10000) * _(4) + T(1000) * _(5) + T(100) * _(6) + T(10) * _(7) + _(8); return ok(0) && ok(1) && ok(2) && ok(3) && ok(4) && ok(5) && ok(6) && ok(7) && ok(8); case 10: *v = T(1000000000) * _(0) + T(100000000) * _(1) + T(10000000) * _(2) + T(1000000) * _(3) + T(100000) * _(4) + T(10000) * _(5) + T(1000) * _(6) + T(100) * _(7) + T(10) * _(8) + _(9); return ok(0) && ok(1) && ok(2) && ok(3) && ok(4) && ok(5) && ok(6) && ok(7) && ok(8) && ok(9); } return false; } template C4_ALWAYS_INLINE auto unroll_switch(c4::csubstr s, T *C4_RESTRICT v) -> typename std::enable_if::type { switch(s.len) { case 1: *v = _(0); return ok(0); case 2: *v = T(10) * _(0) + _(1); return ok(0) && ok(1); case 3: *v = T(100) * _(0) + T(10) * _(1) + _(2); return ok(0) && ok(1) && ok(2); case 4: *v = T(1000) * _(0) + T(100) * _(1) + T(10) * _(2) + _(3); return ok(0) && ok(1) && ok(2) && ok(3); case 5: *v = T(10000) * _(0) + T(1000) * _(1) + T(100) * _(2) + T(10) * _(3) + _(4); return ok(0) && ok(1) && ok(2) && ok(3) && ok(4); case 6: *v = T(100000) * _(0) + T(10000) * _(1) + T(1000) * _(2) + T(100) * _(3) + T(10) * _(4) + _(5); return ok(0) && ok(1) && ok(2) && ok(3) && ok(4) && ok(5); case 7: *v = T(1000000) * _(0) + T(100000) * _(1) + T(10000) * _(2) + T(1000) * _(3) + T(100) * _(4) + T(10) * _(5) + _(6); return ok(0) && ok(1) && ok(2) && ok(3) && ok(4) && ok(5) && ok(6); case 8: *v = T(10000000) * _(0) + T(1000000) * _(1) + T(100000) * _(2) + T(10000) * _(3) + T(1000) * _(4) + T(100) * _(5) + T(10) * _(6) + _(7); return ok(0) && ok(1) && ok(2) && ok(3) && ok(4) && ok(5) && ok(6) && ok(7); case 9: *v = T(100000000) * _(0) + T(10000000) * _(1) + T(1000000) * _(2) + T(100000) * _(3) + T(10000) * _(4) + T(1000) * _(5) + T(100) * _(6) + T(10) * _(7) + _(8); return ok(0) && ok(1) && ok(2) && ok(3) && ok(4) && ok(5) && ok(6) && ok(7) && ok(8); case 10: *v = T(1000000000) * _(0) + T(100000000) * _(1) + T(10000000) * _(2) + T(1000000) * _(3) + T(100000) * _(4) + T(10000) * _(5) + T(1000) * _(6) + T(100) * _(7) + T(10) * _(8) + _(9); return ok(0) && ok(1) && ok(2) && ok(3) && ok(4) && ok(5) && ok(6) && ok(7) && ok(8) && ok(9); default: { size_t i = 0; *v = 0; for( ; i + 10 < s.len; ++i) { *v = *v * T(10) + _(i); if(C4_UNLIKELY(!ok(i))) return false; } *v = T(1000000000) * _(i) + T(100000000) * _(i+1) + T(10000000) * _(i+2) + T(1000000) * _(i+3) + T(100000) * _(i+4) + T(10000) * _(i+5) + T(1000) * _(i+6) + T(100) * _(i+7) + T(10) * _(i+8) + _(i+9); return ok(i) && ok(i+1) && ok(i+2) && ok(i+3) && ok(i+4) && ok(i+5) && ok(i+6) && ok(i+7) && ok(i+8) && ok(i+9); } } return false; } C4_SUPPRESS_WARNING_GCC_CLANG_POP #undef _ #define DECLARE_BM(func) \ template \ void func(bm::State &st) \ { \ random_strings_cref values = mkstrings_positive(); \ T val = {}; \ T sum = {}; \ for(auto _ : st) \ { \ C4DOALL(kNumValues) \ { \ const bool ok = func(values.next(), &val); \ sum += (T)(T(ok) + val); \ } \ } \ bm::DoNotOptimize(sum); \ report(st, kNumValues); \ } #define DEFINE_BM(ty) \ C4BM_TEMPLATE(unroll_switch_nocheck, ty); \ C4BM_TEMPLATE(unroll_switch, ty); \ C4BM_TEMPLATE(indexloop_restrictvar0, ty); \ C4BM_TEMPLATE(indexloop_restrictvar1, ty); \ C4BM_TEMPLATE(range_based_restrictvar0, ty); \ C4BM_TEMPLATE(range_based_restrictvar1, ty); \ C4BM_TEMPLATE(prefer_likely, ty); \ C4BM_TEMPLATE(no_early_return, ty); \ C4BM_TEMPLATE(no_early_return_auto_type, ty); \ C4BM_TEMPLATE(no_early_return_auto_type2, ty); \ DECLARE_BM(unroll_switch_nocheck) DECLARE_BM(unroll_switch) DECLARE_BM(indexloop_restrictvar0) DECLARE_BM(indexloop_restrictvar1) DECLARE_BM(range_based_restrictvar0) DECLARE_BM(range_based_restrictvar1) DECLARE_BM(prefer_likely) DECLARE_BM(no_early_return) DECLARE_BM(no_early_return_auto_type) DECLARE_BM(no_early_return_auto_type2) DEFINE_BM(uint8_t) DEFINE_BM(int8_t) DEFINE_BM(uint16_t) DEFINE_BM(int16_t) DEFINE_BM(uint32_t) DEFINE_BM(int32_t) DEFINE_BM(uint64_t) DEFINE_BM(int64_t) int main(int argc, char *argv[]) { //do_test(); bm::Initialize(&argc, argv); bm::RunSpecifiedBenchmarks(); return 0; } c4core-0.2.6/bm/bm_charconv.cpp000066400000000000000000001224071477602032300162730ustar00rootroot00000000000000#include "./bm_charconv.hpp" #include #if C4_CPP >= 17 #include #if defined(__cpp_lib_to_chars) #define C4CORE_BM_HAVE_TOCHARS 1 #endif #include #endif #ifdef C4CORE_BM_USE_RYU #include #include #endif #ifdef C4CORE_BM_USE_FP #include #endif // some of the benchmarks do not need to be templates, // but it helps in the naming scheme. // xtoa means to string // atox means string to //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- C4FOR(T, isint) c4_digits_dec(bm::State &st) { random_values_cref values = mkvals_positive(); unsigned sum = {}; for(auto _ : st) { C4DOALL(kNumValues) sum += c4::digits_dec(values.next()); } bm::DoNotOptimize(sum); report(st, kNumValues); } C4FOR(T, isint) c4_digits_hex(bm::State &st) { random_values_cref values = mkvals_positive(); unsigned sum = {}; for(auto _ : st) { C4DOALL(kNumValues) sum += c4::digits_hex(values.next()); } bm::DoNotOptimize(sum); report(st, kNumValues); } C4FOR(T, isint) c4_digits_oct(bm::State &st) { random_values_cref values = mkvals_positive(); unsigned sum = {}; for(auto _ : st) { C4DOALL(kNumValues) sum += c4::digits_oct(values.next()); } bm::DoNotOptimize(sum); report(st, kNumValues); } C4FOR(T, isint) c4_digits_bin(bm::State &st) { random_values_cref values = mkvals_positive(); unsigned sum = {}; for(auto _ : st) { C4DOALL(kNumValues) sum += c4::digits_bin(values.next()); } bm::DoNotOptimize(sum); report(st, kNumValues); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- C4FOR(T, isint) atox_c4_read_dec(bm::State& st) { random_strings_cref strings = mkstrings_positive(); T val = {}, sum = {}; for(auto _ : st) { C4DOALL(kNumValues) { c4::read_dec(strings.next(), &val); sum += val; } } bm::DoNotOptimize(sum); report(st, kNumValues); } C4FOR(T, isint) atoxhex_c4_read_hex(bm::State& st) { random_strings_cref strings = mkstrings_hex_positive(/*with_prefix*/false); T val = {}, sum = {}; for(auto _ : st) { C4DOALL(kNumValues) { c4::read_hex(strings.next(), &val); sum += val; } } bm::DoNotOptimize(sum); report(st, kNumValues); } C4FOR(T, isint) atoxoct_c4_read_oct(bm::State& st) { random_strings_cref strings = mkstrings_oct_positive(/*with_prefix*/false); T val = {}, sum = {}; for(auto _ : st) { C4DOALL(kNumValues) { c4::read_oct(strings.next(), &val); sum += val; } } bm::DoNotOptimize(sum); report(st, kNumValues); } C4FOR(T, isint) atoxbin_c4_read_bin(bm::State& st) { random_strings_cref strings = mkstrings_bin_positive(/*with_prefix*/false); T val = {}, sum = {}; for(auto _ : st) { C4DOALL(kNumValues) { c4::read_bin(strings.next(), &val); sum += val; } } bm::DoNotOptimize(sum); report(st, kNumValues); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- C4FOR(T, isint) xtoa_c4_write_dec(bm::State& st) { string_buffer buf; random_values_cref values = mkvals_positive(); for(auto _ : st) { C4DOALL(kNumValues) c4::write_dec(buf, values.next()); } bm::DoNotOptimize(buf); report(st, kNumValues); } C4FOR(T, isint) xtoahex_c4_write_hex(bm::State& st) { string_buffer buf; random_values_cref values = mkvals_positive(); for(auto _ : st) { C4DOALL(kNumValues) c4::write_hex(buf, values.next()); } bm::DoNotOptimize(buf); report(st, kNumValues); } C4FOR(T, isint) xtoaoct_c4_write_oct(bm::State& st) { string_buffer buf; random_values_cref values = mkvals_positive(); for(auto _ : st) { C4DOALL(kNumValues) c4::write_oct(buf, values.next()); } bm::DoNotOptimize(buf); report(st, kNumValues); } C4FOR(T, isint) xtoabin_c4_write_bin(bm::State& st) { string_buffer buf; random_values_cref values = mkvals_positive(); for(auto _ : st) { C4DOALL(kNumValues) c4::write_bin(buf, values.next()); } bm::DoNotOptimize(buf); report(st, kNumValues); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- C4FOR(T, isiint) xtoa_c4_itoa(bm::State& st) { string_buffer buf; random_values_cref values = mkvals_positive(); for(auto _ : st) { C4DOALL(kNumValues) c4::itoa(buf, values.next()); } bm::DoNotOptimize(buf); report(st, kNumValues); } C4FOR(T, isuint) xtoa_c4_utoa(bm::State& st) { string_buffer buf; random_values_cref values = mkvals_positive(); for(auto _ : st) { C4DOALL(kNumValues) c4::utoa(buf, values.next()); } bm::DoNotOptimize(buf); report(st, kNumValues); } C4FOR(T, isfloat) xtoa_c4_ftoa(bm::State& st) { string_buffer buf; random_values_cref values = mkvals(); for(auto _ : st) { C4DOALL(kNumValues) c4::ftoa(buf, values.next()); } bm::DoNotOptimize(buf); report(st, kNumValues); } C4FOR(T, isdouble) xtoa_c4_dtoa(bm::State& st) { string_buffer buf; random_values_cref values = mkvals(); for(auto _ : st) { C4DOALL(kNumValues) c4::dtoa(buf, values.next()); } bm::DoNotOptimize(buf); report(st, kNumValues); } C4FOR(T, isint) xtoa_c4_xtoa(bm::State& st) { string_buffer buf; random_values values = mkvals_positive(); for(auto _ : st) { C4DOALL(kNumValues) c4::xtoa(buf, values.next()); } bm::DoNotOptimize(buf); report(st, kNumValues); } C4FOR(T, isreal) xtoa_c4_xtoa(bm::State& st) { string_buffer buf; random_values_cref values = mkvals(); for(auto _ : st) { C4DOALL(kNumValues) c4::xtoa(buf, values.next()); } bm::DoNotOptimize(buf); report(st, kNumValues); } //----------------------------------------------------------------------------- C4FOR(T, isiint) atox_c4_atoi(bm::State& st) { random_strings_cref strings = mkstrings_positive(); T val = {}, sum = {}; for(auto _ : st) { C4DOALL(kNumValues) { c4::atoi(strings.next(), &val); sum += val; } } bm::DoNotOptimize(sum); report(st, kNumValues); } C4FOR(T, isuint) atox_c4_atou(bm::State& st) { random_strings_cref strings = mkstrings_positive(); T val = {}, sum = {}; for(auto _ : st) { C4DOALL(kNumValues) { c4::atou(strings.next(), &val); sum += val; } } bm::DoNotOptimize(sum); report(st, kNumValues); } C4FOR(T, isfloat) atox_c4_atof(bm::State& st) { random_strings_cref strings = mkstrings(); T val = {}, sum = {}; for(auto _ : st) { C4DOALL(kNumValues) { c4::atof(strings.next(), &val); sum += val; } } bm::DoNotOptimize(sum); report(st, kNumValues); } C4FOR(T, isdouble) atox_c4_atod(bm::State& st) { random_strings_cref strings = mkstrings(); T val = {}, sum = {}; for(auto _ : st) { C4DOALL(kNumValues) { c4::atod(strings.next(), &val); sum += val; } } bm::DoNotOptimize(sum); report(st, kNumValues); } C4FOR(T, isint) atox_c4_atox(bm::State& st) { random_strings_cref strings = mkstrings_positive(); T val = {}, sum = {}; for(auto _ : st) { C4DOALL(kNumValues) { c4::atox(strings.next(), &val); sum += val; } } bm::DoNotOptimize(sum); report(st, kNumValues); } C4FOR(T, isreal) atox_c4_atox(bm::State& st) { random_strings_cref strings = mkstrings(); T val = {}, sum = {}; for(auto _ : st) { C4DOALL(kNumValues) { c4::atox(strings.next(), &val); sum += val; } } bm::DoNotOptimize(sum); report(st, kNumValues); } //----------------------------------------------------------------------------- C4FOR(T, isint) atox_std_atoi(bm::State& st) { random_strings_cref strings = mkstrings_positive(); T val = {}, sum = {}; for(auto _ : st) { C4DOALL(kNumValues) { val = (T) std::atoi(strings.next_s().c_str()); sum += val; } } bm::DoNotOptimize(sum); report(st, kNumValues); } C4FOR(T, isint) atox_std_atol(bm::State& st) { random_strings_cref strings = mkstrings_positive(); T val = {}, sum = {}; for(auto _ : st) { C4DOALL(kNumValues) { val = (T) std::atol(strings.next_s().c_str()); sum += val; } } bm::DoNotOptimize(sum); report(st, kNumValues); } C4FOR(T, isreal) atox_std_atof(bm::State& st) { random_strings_cref strings = mkstrings(); T val = {}, sum = {}; for(auto _ : st) { C4DOALL(kNumValues) { val = (T) std::atof(strings.next_s().c_str()); sum += val; } } bm::DoNotOptimize(sum); report(st, kNumValues); } //----------------------------------------------------------------------------- C4FOR(T, isint) atox_std_strtol(bm::State& st) { random_strings_cref strings = mkstrings_positive(); T val = {}, sum = {}; for(auto _ : st) { C4DOALL(kNumValues) { std::string const& s = strings.next_s(); val = (T) std::strtol(s.data(), nullptr, 10); sum += val; } } bm::DoNotOptimize(sum); report(st, kNumValues); } C4FOR(T, isint) atox_std_strtoll(bm::State& st) { random_strings_cref strings = mkstrings_positive(); T val = {}, sum = {}; for(auto _ : st) { C4DOALL(kNumValues) { std::string const& s = strings.next_s(); val = (T) std::strtoll(s.data(), nullptr, 10); sum += val; } } bm::DoNotOptimize(sum); report(st, kNumValues); } C4FOR(T, isint) atox_std_strtoul(bm::State& st) { random_strings_cref strings = mkstrings_positive(); T val = {}, sum = {}; for(auto _ : st) { C4DOALL(kNumValues) { std::string const& s = strings.next_s(); val = (T) std::strtoul(s.data(), nullptr, 10); sum += val; } } bm::DoNotOptimize(sum); report(st, kNumValues); } C4FOR(T, isint) atox_std_strtoull(bm::State& st) { random_strings_cref strings = mkstrings_positive(); T val = {}, sum = {}; for(auto _ : st) { C4DOALL(kNumValues) { std::string const& s = strings.next_s(); val = (T) std::strtoull(s.data(), nullptr, 10); sum += val; } } bm::DoNotOptimize(sum); report(st, kNumValues); } C4FOR(T, isreal) atox_std_strtof(bm::State& st) { random_strings_cref strings = mkstrings(); T val = {}, sum = {}; for(auto _ : st) { C4DOALL(kNumValues) { std::string const& s = strings.next_s(); val = (T) std::strtof(s.data(), nullptr); sum += val; } } bm::DoNotOptimize(sum); report(st, kNumValues); } C4FOR(T, isreal) atox_std_strtod(bm::State& st) { random_strings_cref strings = mkstrings(); T val = {}, sum = {}; for(auto _ : st) { C4DOALL(kNumValues) { std::string const& s = strings.next_s(); val = (T) std::strtod(s.data(), nullptr); sum += val; } } bm::DoNotOptimize(sum); report(st, kNumValues); } C4FOR(T, isreal) atox_std_stof(bm::State &st) { random_strings_cref strings = mkstrings(); T val = {}, sum = {}; for(auto _ : st) { C4DOALL(kNumValues) { val = std::stof(strings.next_s()); sum += val; } } bm::DoNotOptimize(sum); report(st, kNumValues); } C4FOR(T, isreal) atox_std_stod(bm::State &st) { random_strings_cref strings = mkstrings(); T val = {}, sum = {}; for(auto _ : st) { C4DOALL(kNumValues) { val = std::stod(strings.next_s()); sum += val; } } bm::DoNotOptimize(sum); report(st, kNumValues); } //----------------------------------------------------------------------------- #ifdef C4CORE_BM_USE_RYU C4FOR(T, isfloat) atox_ryu_s2f(bm::State &st) { random_strings_cref strings = mkstrings(); T val = {}, sum = {}; for(auto _ : st) { C4DOALL(kNumValues) { c4::csubstr s = strings.next(); s2f_n(s.data(), (int) s.size(), &val); sum += val; } } bm::DoNotOptimize(sum); report(st, kNumValues); } C4FOR(T, isdouble) atox_ryu_s2d(bm::State &st) { random_strings_cref strings = mkstrings(); T val = {}, sum = {}; for(auto _ : st) { C4DOALL(kNumValues) { c4::csubstr s = strings.next(); s2d_n(s.data(), (int) s.size(), &val); sum += val; } } bm::DoNotOptimize(sum); report(st, kNumValues); } C4FOR(T, isfloat) xtoa_ryu_f2s(bm::State &st) { string_buffer buf; random_values_cref values = mkvals(); for(auto _ : st) { C4DOALL(kNumValues) f2s_buffered_n(values.next(), buf.buf.str); } bm::DoNotOptimize(buf.buf); report(st, kNumValues); } C4FOR(T, isdouble) xtoa_ryu_d2s(bm::State &st) { string_buffer buf; random_values_cref values = mkvals(); for(auto _ : st) { C4DOALL(kNumValues) d2s_buffered_n(values.next(), buf.buf.str); } bm::DoNotOptimize(buf.buf); report(st, kNumValues); } #endif // C4CORE_BM_USE_RYU //----------------------------------------------------------------------------- // fp is still experimental and undocumented; // some assertions are firing in debug builds // so we make these benchmarks available only with NDEBUG #if (defined(C4CORE_BM_USE_FP)) && (!defined(NDEBUG)) #undef C4CORE_BM_USE_FP #endif #ifdef C4CORE_BM_USE_FP C4FOR(T, isreal) atox_fp_from_chars_limited(bm::State &st) { random_strings_cref strings = mkstrings(); T val = {}, sum = {}; for(auto _ : st) { C4DOALL(kNumValues) { c4::csubstr s = strings.next(); val = jkj::fp::from_chars_limited(s.begin(), s.end()).to_float(); sum += val; } } bm::DoNotOptimize(sum); report(st, kNumValues); } #endif // C4CORE_BM_USE_FP #ifdef C4CORE_BM_USE_FP C4FOR(T, isreal) atox_fp_from_chars_unlimited(bm::State &st) { random_strings_cref strings = mkstrings(); T val = {}, sum = {}; for(auto _ : st) { C4DOALL(kNumValues) { c4::csubstr s = strings.next(); val = jkj::fp::from_chars_unlimited(s.begin(), s.end()).to_float(); sum += val; } } bm::DoNotOptimize(sum); report(st, kNumValues); } #endif // C4CORE_BM_USE_FP //----------------------------------------------------------------------------- C4FOR(T, isreal) atox_fast_float(bm::State &st) { random_strings_cref strings = mkstrings(); T val = {}, sum = {}; for(auto _ : st) { C4DOALL(kNumValues) { c4::csubstr s = strings.next(); fast_float::from_chars(s.begin(), s.end(), val); sum += val; } } bm::DoNotOptimize(sum); report(st, kNumValues); } //----------------------------------------------------------------------------- template struct fmtspec; template<> struct fmtspec< uint8_t> { static const char w[], r[]; }; template<> struct fmtspec< int8_t> { static const char w[], r[]; }; template<> struct fmtspec { static const char w[], r[]; }; template<> struct fmtspec< int16_t> { static const char w[], r[]; }; template<> struct fmtspec { static const char w[], r[]; }; template<> struct fmtspec< int32_t> { static const char w[], r[]; }; template<> struct fmtspec { static const char w[], r[]; }; template<> struct fmtspec< int64_t> { static const char w[], r[]; }; template<> struct fmtspec< float > { static const char w[], r[]; }; template<> struct fmtspec< double > { static const char w[], r[]; }; constexpr const char fmtspec< uint8_t>::w[] = "%" PRIu8 ; constexpr const char fmtspec< int8_t>::w[] = "%" PRIi8 ; constexpr const char fmtspec::w[] = "%" PRIu16; constexpr const char fmtspec< int16_t>::w[] = "%" PRIi16; constexpr const char fmtspec::w[] = "%" PRIu32; constexpr const char fmtspec< int32_t>::w[] = "%" PRIi32; constexpr const char fmtspec::w[] = "%" PRIu64; constexpr const char fmtspec< int64_t>::w[] = "%" PRIi64; constexpr const char fmtspec< float >::w[] = "%g" ; constexpr const char fmtspec< double >::w[] = "%lg" ; constexpr const char fmtspec< uint8_t>::r[] = "%" SCNu8 ; constexpr const char fmtspec< int8_t>::r[] = "%" SCNi8 ; constexpr const char fmtspec::r[] = "%" SCNu16; constexpr const char fmtspec< int16_t>::r[] = "%" SCNi16; constexpr const char fmtspec::r[] = "%" SCNu32; constexpr const char fmtspec< int32_t>::r[] = "%" SCNi32; constexpr const char fmtspec::r[] = "%" SCNu64; constexpr const char fmtspec< int64_t>::r[] = "%" SCNi64; constexpr const char fmtspec< float >::r[] = "%g" ; constexpr const char fmtspec< double >::r[] = "%lg" ; C4FOR(T, isint) xtoa_sprintf(bm::State& st) { string_buffer buf; random_values_cref values = mkvals_positive(); for(auto _ : st) { C4DOALL(kNumValues) ::snprintf(buf.buf.str, buf.buf.len, fmtspec::w, values.next()); } bm::DoNotOptimize(buf.buf); report(st, kNumValues); } C4FOR(T, isreal) xtoa_sprintf(bm::State& st) { string_buffer buf; random_values_cref values = mkvals(); C4_SUPPRESS_WARNING_GCC_CLANG_WITH_PUSH("-Wdouble-promotion") for(auto _ : st) { C4DOALL(kNumValues) ::snprintf(buf.buf.str, buf.buf.len, fmtspec::w, values.next()); } C4_SUPPRESS_WARNING_GCC_CLANG_POP bm::DoNotOptimize(buf.buf); report(st, kNumValues); } C4FOR(T, isint) atox_scanf(bm::State& st) { random_strings_cref strings = mkstrings_positive(); T val = {}, sum = {}; for(auto _ : st) { C4DOALL(kNumValues) { ::sscanf(strings.next_s().c_str(), fmtspec::r, &val); sum += val; } } bm::DoNotOptimize(sum); report(st, kNumValues); } C4FOR(T, isreal) atox_scanf(bm::State& st) { random_strings_cref strings = mkstrings(); T val = {}, sum = {}; for(auto _ : st) { C4DOALL(kNumValues) { ::sscanf(strings.next_s().c_str(), fmtspec::r, &val); sum += val; } } bm::DoNotOptimize(sum); report(st, kNumValues); } //----------------------------------------------------------------------------- C4FOR(T, isint) xtoa_sstream(bm::State& st) { random_values_cref values = mkvals_positive(); std::string out; C4_UNUSED(out); for(auto _ : st) { C4DOALL(kNumValues) { std::stringstream ss; ss << values.next(); out = ss.str(); } } bm::DoNotOptimize(out); report(st, kNumValues); } C4FOR(T, isreal) xtoa_sstream(bm::State& st) { random_values_cref values = mkvals(); std::string out; C4_UNUSED(out); for(auto _ : st) { C4DOALL(kNumValues) { std::stringstream ss; ss << values.next(); out = ss.str(); } } bm::DoNotOptimize(out); report(st, kNumValues); } C4FOR(T, isint) xtoa_sstream_reuse(bm::State& st) { random_values_cref values = mkvals_positive(); std::stringstream ss; std::string out; C4_UNUSED(out); for(auto _ : st) { C4DOALL(kNumValues) { ss.clear(); ss.str(""); ss << values.next(); out = ss.str(); } } bm::DoNotOptimize(out); report(st, kNumValues); } C4FOR(T, isreal) xtoa_sstream_reuse(bm::State& st) { random_values_cref values = mkvals(); std::stringstream ss; std::string out; C4_UNUSED(out); for(auto _ : st) { C4DOALL(kNumValues) { ss.clear(); ss.str(""); ss << values.next(); out = ss.str(); } } bm::DoNotOptimize(out); report(st, kNumValues); } C4FOR(T, isint) atox_sstream(bm::State& st) { random_strings_cref strings = mkstrings_positive(); T val = {}, sum = {}; for(auto _ : st) { C4DOALL(kNumValues) { std::stringstream ss(strings.next_s()); ss >> val; sum += val; } } bm::DoNotOptimize(sum); report(st, kNumValues); } C4FOR(T, isreal) atox_sstream(bm::State& st) { random_strings_cref strings = mkstrings(); T val = {}, sum = {}; for(auto _ : st) { C4DOALL(kNumValues) { std::stringstream ss(strings.next_s()); ss >> val; sum += val; } } bm::DoNotOptimize(sum); report(st, kNumValues); } C4FOR(T, isint) atox_sstream_reuse(bm::State& st) { random_strings_cref strings = mkstrings_positive(); std::stringstream ss; T val = {}, sum = {}; for(auto _ : st) { C4DOALL(kNumValues) { ss.clear(); ss.str(strings.next_s()); ss >> val; sum += val; } } bm::DoNotOptimize(sum); report(st, kNumValues); } C4FOR(T, isreal) atox_sstream_reuse(bm::State& st) { random_strings_cref strings = mkstrings(); std::stringstream ss; T val = {}, sum = {}; for(auto _ : st) { C4DOALL(kNumValues) { ss.clear(); ss.str(strings.next_s()); ss >> val; sum += val; } } bm::DoNotOptimize(sum); report(st, kNumValues); } //----------------------------------------------------------------------------- C4FOR(T, isint) xtoa_std_to_string(bm::State& st) { random_values_cref values = mkvals_positive(); std::string out; for(auto _ : st) { C4DOALL(kNumValues) out = std::to_string(values.next()); } bm::DoNotOptimize(out); report(st, kNumValues); } C4FOR(T, isreal) xtoa_std_to_string(bm::State& st) { random_values_cref values = mkvals(); std::string out; for(auto _ : st) { C4DOALL(kNumValues) out = std::to_string(values.next()); } bm::DoNotOptimize(out); report(st, kNumValues); } //----------------------------------------------------------------------------- C4FOR(T, isint) xtoa_c4_to_chars(bm::State& st) { random_values_cref values = mkvals_positive(); string_buffer buf; for(auto _ : st) { C4DOALL(kNumValues) c4::to_chars(buf, values.next()); } bm::DoNotOptimize(buf); report(st, kNumValues); } C4FOR(T, isreal) xtoa_c4_to_chars(bm::State& st) { random_values_cref values = mkvals(); string_buffer buf; for(auto _ : st) { C4DOALL(kNumValues) c4::to_chars(buf, values.next()); } bm::DoNotOptimize(buf); report(st, kNumValues); } C4FOR(T, isint) atox_c4_from_chars(bm::State& st) { random_strings_cref strings = mkstrings_positive(); T val = {}, sum = {}; for(auto _ : st) { C4DOALL(kNumValues) { c4::from_chars(strings.next(), &val); sum += val; } } bm::DoNotOptimize(sum); report(st, kNumValues); } C4FOR(T, isint) atox_c4_from_chars_checked(bm::State& st) { random_strings_cref strings = mkstrings_positive(); T val = {}, sum = {}; for(auto _ : st) { C4DOALL(kNumValues) { c4::from_chars(strings.next(), c4::fmt::overflow_checked(val)); sum += val; } } bm::DoNotOptimize(sum); report(st, kNumValues); } C4FOR(T, isreal) atox_c4_from_chars(bm::State& st) { random_strings_cref strings = mkstrings(); T val = {}, sum = {}; for(auto _ : st) { C4DOALL(kNumValues) { c4::from_chars(strings.next(), &val); sum += val; } } bm::DoNotOptimize(sum); report(st, kNumValues); } #if (C4_CPP >= 17) C4FOR(T, isint) xtoa_std_to_chars(bm::State& st) { random_values_cref values = mkvals_positive(); string_buffer buf; for(auto _ : st) { C4DOALL(kNumValues) std::to_chars(buf.begin(), buf.end(), values.next()); } bm::DoNotOptimize(buf); report(st, kNumValues); } #endif #if defined(C4CORE_BM_HAVE_TOCHARS) C4FOR(T, isreal) xtoa_std_to_chars(bm::State& st) { random_values_cref values = mkvals(); string_buffer buf; for(auto _ : st) { C4DOALL(kNumValues) std::to_chars(buf.begin(), buf.end(), values.next()); } bm::DoNotOptimize(buf); report(st, kNumValues); } #endif #if (C4_CPP >= 17) C4FOR(T, isint) atox_std_from_chars(bm::State& st) { random_strings_cref strings = mkstrings_positive(); T val = {}, sum = {}; for(auto _ : st) { C4DOALL(kNumValues) { c4::csubstr s = strings.next(); std::from_chars(s.begin(), s.end(), val); sum += val; } } bm::DoNotOptimize(sum); report(st, kNumValues); } #endif #if defined(C4CORE_BM_HAVE_TOCHARS) C4FOR(T, isreal) atox_std_from_chars(bm::State& st) { random_strings_cref strings = mkstrings(); T val = {}, sum = {}; for(auto _ : st) { C4DOALL(kNumValues) { c4::csubstr s = strings.next(); std::from_chars(s.begin(), s.end(), val); sum += val; } } bm::DoNotOptimize(sum); report(st, kNumValues); } #endif //----------------------------------------------------------------------------- C4BM_TEMPLATE(c4_digits_dec, uint8_t); C4BM_TEMPLATE(c4_digits_hex, uint8_t); C4BM_TEMPLATE(c4_digits_oct, uint8_t); C4BM_TEMPLATE(c4_digits_bin, uint8_t); C4BM_TEMPLATE(c4_digits_dec, int8_t); C4BM_TEMPLATE(c4_digits_hex, int8_t); C4BM_TEMPLATE(c4_digits_oct, int8_t); C4BM_TEMPLATE(c4_digits_bin, int8_t); C4BM_TEMPLATE(c4_digits_dec, uint16_t); C4BM_TEMPLATE(c4_digits_hex, uint16_t); C4BM_TEMPLATE(c4_digits_oct, uint16_t); C4BM_TEMPLATE(c4_digits_bin, uint16_t); C4BM_TEMPLATE(c4_digits_dec, int16_t); C4BM_TEMPLATE(c4_digits_hex, int16_t); C4BM_TEMPLATE(c4_digits_oct, int16_t); C4BM_TEMPLATE(c4_digits_bin, int16_t); C4BM_TEMPLATE(c4_digits_dec, uint32_t); C4BM_TEMPLATE(c4_digits_hex, uint32_t); C4BM_TEMPLATE(c4_digits_oct, uint32_t); C4BM_TEMPLATE(c4_digits_bin, uint32_t); C4BM_TEMPLATE(c4_digits_dec, int32_t); C4BM_TEMPLATE(c4_digits_hex, int32_t); C4BM_TEMPLATE(c4_digits_oct, int32_t); C4BM_TEMPLATE(c4_digits_bin, int32_t); C4BM_TEMPLATE(c4_digits_dec, uint64_t); C4BM_TEMPLATE(c4_digits_hex, uint64_t); C4BM_TEMPLATE(c4_digits_oct, uint64_t); C4BM_TEMPLATE(c4_digits_bin, uint64_t); C4BM_TEMPLATE(c4_digits_dec, int64_t); C4BM_TEMPLATE(c4_digits_hex, int64_t); C4BM_TEMPLATE(c4_digits_oct, int64_t); C4BM_TEMPLATE(c4_digits_bin, int64_t); //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- C4BM_TEMPLATE(xtoahex_c4_write_hex, uint8_t); C4BM_TEMPLATE(xtoaoct_c4_write_oct, uint8_t); C4BM_TEMPLATE(xtoabin_c4_write_bin, uint8_t); C4BM_TEMPLATE(xtoahex_c4_write_hex, int8_t); C4BM_TEMPLATE(xtoaoct_c4_write_oct, int8_t); C4BM_TEMPLATE(xtoabin_c4_write_bin, int8_t); C4BM_TEMPLATE(xtoahex_c4_write_hex, uint16_t); C4BM_TEMPLATE(xtoaoct_c4_write_oct, uint16_t); C4BM_TEMPLATE(xtoabin_c4_write_bin, uint16_t); C4BM_TEMPLATE(xtoahex_c4_write_hex, int16_t); C4BM_TEMPLATE(xtoaoct_c4_write_oct, int16_t); C4BM_TEMPLATE(xtoabin_c4_write_bin, int16_t); C4BM_TEMPLATE(xtoahex_c4_write_hex, uint32_t); C4BM_TEMPLATE(xtoaoct_c4_write_oct, uint32_t); C4BM_TEMPLATE(xtoabin_c4_write_bin, uint32_t); C4BM_TEMPLATE(xtoahex_c4_write_hex, int32_t); C4BM_TEMPLATE(xtoaoct_c4_write_oct, int32_t); C4BM_TEMPLATE(xtoabin_c4_write_bin, int32_t); C4BM_TEMPLATE(xtoahex_c4_write_hex, uint64_t); C4BM_TEMPLATE(xtoaoct_c4_write_oct, uint64_t); C4BM_TEMPLATE(xtoabin_c4_write_bin, uint64_t); C4BM_TEMPLATE(xtoahex_c4_write_hex, int64_t); C4BM_TEMPLATE(xtoaoct_c4_write_oct, int64_t); C4BM_TEMPLATE(xtoabin_c4_write_bin, int64_t); //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- C4BM_TEMPLATE(xtoa_c4_write_dec, uint8_t); C4BM_TEMPLATE(xtoa_c4_utoa, uint8_t); C4BM_TEMPLATE(xtoa_c4_xtoa, uint8_t); C4BM_TEMPLATE(xtoa_c4_to_chars, uint8_t); #if (C4_CPP >= 17) C4BM_TEMPLATE_TO_CHARS_INT(xtoa_std_to_chars, uint8_t); #endif C4BM_TEMPLATE(xtoa_std_to_string, uint8_t); C4BM_TEMPLATE(xtoa_sprintf, uint8_t); C4BM_TEMPLATE(xtoa_sstream_reuse, uint8_t); C4BM_TEMPLATE(xtoa_sstream, uint8_t); C4BM_TEMPLATE(xtoa_c4_write_dec, int8_t); C4BM_TEMPLATE(xtoa_c4_itoa, int8_t); C4BM_TEMPLATE(xtoa_c4_xtoa, int8_t); C4BM_TEMPLATE(xtoa_c4_to_chars, int8_t); #if (C4_CPP >= 17) C4BM_TEMPLATE_TO_CHARS_INT(xtoa_std_to_chars, int8_t); #endif C4BM_TEMPLATE(xtoa_std_to_string, int8_t); C4BM_TEMPLATE(xtoa_sprintf, int8_t); C4BM_TEMPLATE(xtoa_sstream_reuse, int8_t); C4BM_TEMPLATE(xtoa_sstream, int8_t); C4BM_TEMPLATE(xtoa_c4_write_dec, uint16_t); C4BM_TEMPLATE(xtoa_c4_utoa, uint16_t); C4BM_TEMPLATE(xtoa_c4_xtoa, uint16_t); C4BM_TEMPLATE(xtoa_c4_to_chars, uint16_t); #if (C4_CPP >= 17) C4BM_TEMPLATE_TO_CHARS_INT(xtoa_std_to_chars, uint16_t); #endif C4BM_TEMPLATE(xtoa_std_to_string, uint16_t); C4BM_TEMPLATE(xtoa_sprintf, uint16_t); C4BM_TEMPLATE(xtoa_sstream_reuse, uint16_t); C4BM_TEMPLATE(xtoa_sstream, uint16_t); C4BM_TEMPLATE(xtoa_c4_write_dec, int16_t); C4BM_TEMPLATE(xtoa_c4_itoa, int16_t); C4BM_TEMPLATE(xtoa_c4_xtoa, int16_t); C4BM_TEMPLATE(xtoa_c4_to_chars, int16_t); #if (C4_CPP >= 17) C4BM_TEMPLATE_TO_CHARS_INT(xtoa_std_to_chars, int16_t); #endif C4BM_TEMPLATE(xtoa_std_to_string, int16_t); C4BM_TEMPLATE(xtoa_sprintf, int16_t); C4BM_TEMPLATE(xtoa_sstream_reuse, int16_t); C4BM_TEMPLATE(xtoa_sstream, int16_t); C4BM_TEMPLATE(xtoa_c4_write_dec, uint32_t); C4BM_TEMPLATE(xtoa_c4_utoa, uint32_t); C4BM_TEMPLATE(xtoa_c4_xtoa, uint32_t); C4BM_TEMPLATE(xtoa_c4_to_chars, uint32_t); #if (C4_CPP >= 17) C4BM_TEMPLATE_TO_CHARS_INT(xtoa_std_to_chars, uint32_t); #endif C4BM_TEMPLATE(xtoa_std_to_string, uint32_t); C4BM_TEMPLATE(xtoa_sprintf, uint32_t); C4BM_TEMPLATE(xtoa_sstream_reuse, uint32_t); C4BM_TEMPLATE(xtoa_sstream, uint32_t); C4BM_TEMPLATE(xtoa_c4_write_dec, int32_t); C4BM_TEMPLATE(xtoa_c4_itoa, int32_t); C4BM_TEMPLATE(xtoa_c4_xtoa, int32_t); C4BM_TEMPLATE(xtoa_c4_to_chars, int32_t); #if (C4_CPP >= 17) C4BM_TEMPLATE_TO_CHARS_INT(xtoa_std_to_chars, int32_t); #endif C4BM_TEMPLATE(xtoa_std_to_string, int32_t); C4BM_TEMPLATE(xtoa_sprintf, int32_t); C4BM_TEMPLATE(xtoa_sstream_reuse, int32_t); C4BM_TEMPLATE(xtoa_sstream, int32_t); C4BM_TEMPLATE(xtoa_c4_write_dec, uint64_t); C4BM_TEMPLATE(xtoa_c4_utoa, uint64_t); C4BM_TEMPLATE(xtoa_c4_xtoa, uint64_t); C4BM_TEMPLATE(xtoa_c4_to_chars, uint64_t); #if (C4_CPP >= 17) C4BM_TEMPLATE_TO_CHARS_INT(xtoa_std_to_chars, uint64_t); #endif C4BM_TEMPLATE(xtoa_std_to_string, uint64_t); C4BM_TEMPLATE(xtoa_sprintf, uint64_t); C4BM_TEMPLATE(xtoa_sstream_reuse, uint64_t); C4BM_TEMPLATE(xtoa_sstream, uint64_t); C4BM_TEMPLATE(xtoa_c4_write_dec, int64_t); C4BM_TEMPLATE(xtoa_c4_itoa, int64_t); C4BM_TEMPLATE(xtoa_c4_xtoa, int64_t); C4BM_TEMPLATE(xtoa_c4_to_chars, int64_t); #if (C4_CPP >= 17) C4BM_TEMPLATE_TO_CHARS_INT(xtoa_std_to_chars, int64_t); #endif C4BM_TEMPLATE(xtoa_std_to_string, int64_t); C4BM_TEMPLATE(xtoa_sprintf, int64_t); C4BM_TEMPLATE(xtoa_sstream_reuse, int64_t); C4BM_TEMPLATE(xtoa_sstream, int64_t); C4BM_TEMPLATE(xtoa_c4_ftoa, float); C4BM_TEMPLATE(xtoa_c4_xtoa, float); C4BM_TEMPLATE(xtoa_c4_to_chars, float); #ifdef C4CORE_BM_USE_RYU C4BM_TEMPLATE(xtoa_ryu_f2s, float); #endif #ifdef C4CORE_BM_HAVE_TOCHARS C4BM_TEMPLATE_TO_CHARS_FLOAT(xtoa_std_to_chars, float); #endif C4BM_TEMPLATE(xtoa_std_to_string, float); C4BM_TEMPLATE(xtoa_sprintf, float); C4BM_TEMPLATE(xtoa_sstream_reuse, float); C4BM_TEMPLATE(xtoa_sstream, float); C4BM_TEMPLATE(xtoa_c4_dtoa, double); C4BM_TEMPLATE(xtoa_c4_xtoa, double); C4BM_TEMPLATE(xtoa_c4_to_chars, double); #ifdef C4CORE_BM_USE_RYU C4BM_TEMPLATE(xtoa_ryu_d2s, double); #endif #ifdef C4CORE_BM_HAVE_TOCHARS C4BM_TEMPLATE_TO_CHARS_FLOAT(xtoa_std_to_chars, double); #endif C4BM_TEMPLATE(xtoa_std_to_string, double); C4BM_TEMPLATE(xtoa_sprintf, double); C4BM_TEMPLATE(xtoa_sstream_reuse, double); C4BM_TEMPLATE(xtoa_sstream, double); //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- C4BM_TEMPLATE(atoxhex_c4_read_hex, uint8_t); C4BM_TEMPLATE(atoxoct_c4_read_oct, uint8_t); C4BM_TEMPLATE(atoxbin_c4_read_bin, uint8_t); C4BM_TEMPLATE(atoxhex_c4_read_hex, int8_t); C4BM_TEMPLATE(atoxoct_c4_read_oct, int8_t); C4BM_TEMPLATE(atoxbin_c4_read_bin, int8_t); C4BM_TEMPLATE(atoxhex_c4_read_hex, uint16_t); C4BM_TEMPLATE(atoxoct_c4_read_oct, uint16_t); C4BM_TEMPLATE(atoxbin_c4_read_bin, uint16_t); C4BM_TEMPLATE(atoxhex_c4_read_hex, int16_t); C4BM_TEMPLATE(atoxoct_c4_read_oct, int16_t); C4BM_TEMPLATE(atoxbin_c4_read_bin, int16_t); C4BM_TEMPLATE(atoxhex_c4_read_hex, uint32_t); C4BM_TEMPLATE(atoxoct_c4_read_oct, uint32_t); C4BM_TEMPLATE(atoxbin_c4_read_bin, uint32_t); C4BM_TEMPLATE(atoxhex_c4_read_hex, int32_t); C4BM_TEMPLATE(atoxoct_c4_read_oct, int32_t); C4BM_TEMPLATE(atoxbin_c4_read_bin, int32_t); C4BM_TEMPLATE(atoxhex_c4_read_hex, uint64_t); C4BM_TEMPLATE(atoxoct_c4_read_oct, uint64_t); C4BM_TEMPLATE(atoxbin_c4_read_bin, uint64_t); C4BM_TEMPLATE(atoxhex_c4_read_hex, int64_t); C4BM_TEMPLATE(atoxoct_c4_read_oct, int64_t); C4BM_TEMPLATE(atoxbin_c4_read_bin, int64_t); //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- C4BM_TEMPLATE(atox_c4_read_dec, uint8_t); C4BM_TEMPLATE(atox_c4_atou, uint8_t); C4BM_TEMPLATE(atox_c4_atox, uint8_t); C4BM_TEMPLATE(atox_c4_from_chars, uint8_t); C4BM_TEMPLATE(atox_c4_from_chars_checked, uint8_t); #if (C4_CPP >= 17) C4BM_TEMPLATE_TO_CHARS_INT(atox_std_from_chars, uint8_t); #endif C4BM_TEMPLATE(atox_std_atoi, uint8_t); C4BM_TEMPLATE(atox_std_strtoul, uint8_t); C4BM_TEMPLATE(atox_scanf, uint8_t); C4BM_TEMPLATE(atox_sstream_reuse, uint8_t); C4BM_TEMPLATE(atox_sstream, uint8_t); C4BM_TEMPLATE(atox_c4_read_dec, int8_t); C4BM_TEMPLATE(atox_c4_atoi, int8_t); C4BM_TEMPLATE(atox_c4_atox, int8_t); C4BM_TEMPLATE(atox_c4_from_chars, int8_t); C4BM_TEMPLATE(atox_c4_from_chars_checked, int8_t); #if (C4_CPP >= 17) C4BM_TEMPLATE_TO_CHARS_INT(atox_std_from_chars, int8_t); #endif C4BM_TEMPLATE(atox_std_atoi, int8_t); C4BM_TEMPLATE(atox_std_strtol, int8_t); C4BM_TEMPLATE(atox_scanf, int8_t); C4BM_TEMPLATE(atox_sstream_reuse, int8_t); C4BM_TEMPLATE(atox_sstream, int8_t); C4BM_TEMPLATE(atox_c4_read_dec, uint16_t); C4BM_TEMPLATE(atox_c4_atou, uint16_t); C4BM_TEMPLATE(atox_c4_atox, uint16_t); C4BM_TEMPLATE(atox_c4_from_chars, uint16_t); C4BM_TEMPLATE(atox_c4_from_chars_checked, uint16_t); #if (C4_CPP >= 17) C4BM_TEMPLATE_TO_CHARS_INT(atox_std_from_chars, uint16_t); #endif C4BM_TEMPLATE(atox_std_atoi, uint16_t); C4BM_TEMPLATE(atox_std_strtoul, uint16_t); C4BM_TEMPLATE(atox_scanf, uint16_t); C4BM_TEMPLATE(atox_sstream_reuse, uint16_t); C4BM_TEMPLATE(atox_sstream, uint16_t); C4BM_TEMPLATE(atox_c4_read_dec, int16_t); C4BM_TEMPLATE(atox_c4_atoi, int16_t); C4BM_TEMPLATE(atox_c4_atox, int16_t); C4BM_TEMPLATE(atox_c4_from_chars, int16_t); C4BM_TEMPLATE(atox_c4_from_chars_checked, int16_t); #if (C4_CPP >= 17) C4BM_TEMPLATE_TO_CHARS_INT(atox_std_from_chars, int16_t); #endif C4BM_TEMPLATE(atox_std_atoi, int16_t); C4BM_TEMPLATE(atox_std_strtol, int16_t); C4BM_TEMPLATE(atox_scanf, int16_t); C4BM_TEMPLATE(atox_sstream_reuse, int16_t); C4BM_TEMPLATE(atox_sstream, int16_t); C4BM_TEMPLATE(atox_c4_read_dec, uint32_t); C4BM_TEMPLATE(atox_c4_atou, uint32_t); C4BM_TEMPLATE(atox_c4_atox, uint32_t); C4BM_TEMPLATE(atox_c4_from_chars, uint32_t); C4BM_TEMPLATE(atox_c4_from_chars_checked, uint32_t); #if (C4_CPP >= 17) C4BM_TEMPLATE_TO_CHARS_INT(atox_std_from_chars, uint32_t); #endif C4BM_TEMPLATE(atox_std_atoi, uint32_t); C4BM_TEMPLATE(atox_std_strtoul, uint32_t); C4BM_TEMPLATE(atox_scanf, uint32_t); C4BM_TEMPLATE(atox_sstream_reuse, uint32_t); C4BM_TEMPLATE(atox_sstream, uint32_t); C4BM_TEMPLATE(atox_c4_read_dec, int32_t); C4BM_TEMPLATE(atox_c4_atoi, int32_t); C4BM_TEMPLATE(atox_c4_atox, int32_t); C4BM_TEMPLATE(atox_c4_from_chars, int32_t); C4BM_TEMPLATE(atox_c4_from_chars_checked, int32_t); #if (C4_CPP >= 17) C4BM_TEMPLATE_TO_CHARS_INT(atox_std_from_chars, int32_t); #endif C4BM_TEMPLATE(atox_std_atoi, int32_t); C4BM_TEMPLATE(atox_std_strtol, int32_t); C4BM_TEMPLATE(atox_scanf, int32_t); C4BM_TEMPLATE(atox_sstream_reuse, int32_t); C4BM_TEMPLATE(atox_sstream, int32_t); C4BM_TEMPLATE(atox_c4_read_dec, uint64_t); C4BM_TEMPLATE(atox_c4_atou, uint64_t); C4BM_TEMPLATE(atox_c4_atox, uint64_t); C4BM_TEMPLATE(atox_c4_from_chars, uint64_t); C4BM_TEMPLATE(atox_c4_from_chars_checked, uint64_t); #if (C4_CPP >= 17) C4BM_TEMPLATE_TO_CHARS_INT(atox_std_from_chars, uint64_t); #endif C4BM_TEMPLATE(atox_std_atol, uint64_t); C4BM_TEMPLATE(atox_std_strtoull, uint64_t); C4BM_TEMPLATE(atox_scanf, uint64_t); C4BM_TEMPLATE(atox_sstream_reuse, uint64_t); C4BM_TEMPLATE(atox_sstream, uint64_t); C4BM_TEMPLATE(atox_c4_read_dec, int64_t); C4BM_TEMPLATE(atox_c4_atoi, int64_t); C4BM_TEMPLATE(atox_c4_atox, int64_t); C4BM_TEMPLATE(atox_c4_from_chars, int64_t); C4BM_TEMPLATE(atox_c4_from_chars_checked, int64_t); #if (C4_CPP >= 17) C4BM_TEMPLATE_TO_CHARS_INT(atox_std_from_chars, int64_t); #endif C4BM_TEMPLATE(atox_std_atol, int64_t); C4BM_TEMPLATE(atox_std_strtoll, int64_t); C4BM_TEMPLATE(atox_scanf, int64_t); C4BM_TEMPLATE(atox_sstream_reuse, int64_t); C4BM_TEMPLATE(atox_sstream, int64_t); C4BM_TEMPLATE(atox_c4_atof, float); C4BM_TEMPLATE(atox_c4_atox, float); C4BM_TEMPLATE(atox_c4_from_chars, float); C4BM_TEMPLATE(atox_fast_float, float); #ifdef C4CORE_BM_HAVE_TOCHARS C4BM_TEMPLATE_TO_CHARS_FLOAT(atox_std_from_chars, float); #endif #ifdef C4CORE_BM_USE_RYU C4BM_TEMPLATE(atox_ryu_s2f, float); #endif #ifdef C4CORE_BM_USE_FP C4BM_FP_BENCHMARK(atox_fp_from_chars_limited, float); C4BM_FP_BENCHMARK(atox_fp_from_chars_unlimited, float); #endif C4BM_TEMPLATE(atox_std_atof, float); C4BM_TEMPLATE(atox_std_strtof, float); C4BM_TEMPLATE(atox_std_stof, float); C4BM_TEMPLATE(atox_scanf, float); C4BM_TEMPLATE(atox_sstream_reuse, float); C4BM_TEMPLATE(atox_sstream, float); C4BM_TEMPLATE(atox_c4_atod, double); C4BM_TEMPLATE(atox_c4_atox, double); C4BM_TEMPLATE(atox_c4_from_chars, double); C4BM_TEMPLATE(atox_fast_float, double); #ifdef C4CORE_BM_HAVE_TOCHARS C4BM_TEMPLATE_TO_CHARS_FLOAT(atox_std_from_chars, double); #endif #ifdef C4CORE_BM_USE_RYU C4BM_TEMPLATE(atox_ryu_s2d, double); #endif #ifdef C4CORE_BM_USE_FP C4BM_FP_BENCHMARK(atox_fp_from_chars_limited, double); C4BM_FP_BENCHMARK(atox_fp_from_chars_unlimited, double); #endif C4BM_TEMPLATE(atox_std_atof, double); C4BM_TEMPLATE(atox_std_strtod, double); C4BM_TEMPLATE(atox_std_stod, double); C4BM_TEMPLATE(atox_scanf, double); C4BM_TEMPLATE(atox_sstream_reuse, double); C4BM_TEMPLATE(atox_sstream, double); //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- int main(int argc, char *argv[]) { bm::Initialize(&argc, argv); bm::RunSpecifiedBenchmarks(); return 0; } #include c4core-0.2.6/bm/bm_charconv.hpp000066400000000000000000000323511477602032300162760ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include #include #include #include #include inline double getmax(std::vector const& v) { return *(std::max_element(std::begin(v), std::end(v))); } inline double getmin(std::vector const& v) { return *(std::min_element(std::begin(v), std::end(v))); } inline double getrange(std::vector const& v) { auto min_max = std::minmax_element(std::begin(v), std::end(v)); return *min_max.second - *min_max.first; } #define _c4bm_stats \ /*->Repetitions(20)*/ \ ->DisplayAggregatesOnly(true) \ ->ComputeStatistics("range", &getrange) \ ->ComputeStatistics("max", &getmax) \ ->ComputeStatistics("min", &getmin) #define C4BM_TEMPLATE(fn, ...) BENCHMARK_TEMPLATE(fn, __VA_ARGS__) _c4bm_stats // benchmarks depending on c++17 features are disabled using the // preprocessor. google benchmark has state.SkipWithError() but it // makes the program return a nonzero exit code when it finishes. So // we must resort to the preprocessor to conditionally disable these // benchmarks #if defined(__cpp_lib_to_chars) || (C4_CPP >= 17) #define C4BM_TEMPLATE_TO_CHARS_INT(fn, ...) BENCHMARK_TEMPLATE(fn, __VA_ARGS__) _c4bm_stats #define C4BM_TEMPLATE_TO_CHARS_FLOAT(fn, ...) BENCHMARK_TEMPLATE(fn, __VA_ARGS__) _c4bm_stats #else #define C4BM_TEMPLATE_TO_CHARS_INT(fn, ...) void shutup_extra_semicolon() #define C4BM_TEMPLATE_TO_CHARS_FLOAT(fn, ...) void shutup_extra_semicolon() #endif C4_SUPPRESS_WARNING_GCC_CLANG_PUSH C4_SUPPRESS_WARNING_GCC_CLANG("-Wdouble-promotion") C4_SUPPRESS_WARNING_GCC_CLANG("-Wdeprecated") C4_SUPPRESS_WARNING_GCC_CLANG("-Wsign-conversion") C4_SUPPRESS_WARNING_GCC_CLANG("-Wconversion") C4_SUPPRESS_WARNING_GCC_CLANG("-Wold-style-cast") #if defined(__GNUC__) && (__GNUC__ >= 6) C4_SUPPRESS_WARNING_GCC_WITH_PUSH("-Wunused-const-variable") #endif #include #if defined(__GNUC__) && (__GNUC__ >= 6) C4_SUPPRESS_WARNING_GCC_POP #endif namespace bm = benchmark; //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // utilities for use in the benchmarks below // facilities to deuglify SFINAE #define C4FOR(ty, condition) \ template \ typename std::enable_if::type #define C4FOR2(ty1, ty2, condition) \ template \ typename std::enable_if::type #define isint(ty) std::is_integral::value #define isiint(ty) std::is_integral::value && !std::is_unsigned::value #define isuint(ty) std::is_integral::value && std::is_unsigned::value #define isreal(ty) std::is_floating_point::value #define isfloat(ty) std::is_same::value #define isdouble(ty) std::is_same::value /** convenience wrapper to avoid boilerplate code */ template void report(bm::State &st, size_t numvals=1) { int64_t iters = (int64_t)(st.iterations() * numvals); int64_t bytes = (int64_t)(st.iterations() * numvals * sizeof(T)); st.SetBytesProcessed(bytes); st.SetItemsProcessed(iters); } template void report_threadavg(bm::State &st, size_t numvals=1) { int64_t iters = (int64_t)(st.iterations() * numvals); int64_t bytes = (int64_t)(st.iterations() * numvals * sizeof(T)); st.SetBytesProcessed(bytes / (int64_t)st.threads()); st.SetItemsProcessed(iters / (int64_t)st.threads()); } template constexpr bool is_pot(T val) { return val > 0 && (val & (val-T(1))) == 0; } constexpr const uint64_t kSeed = 37; constexpr const size_t kNumValues = 1u<<20; // 1.049M C4_STATIC_ASSERT(is_pot(kNumValues)); template T gen(Dist &dist, Eng &eng) { return static_cast(dist(eng)); } template T gen_pos(Dist &dist, Eng &eng) { T val = static_cast(dist(eng)); while(val <= T(0)) val = static_cast(dist(eng)); return val; } /** generate in place a random sequence of values: integral version*/ C4FOR(T, isint) generate_n(T *begin, T *end) { // do not use T in the distribution: // N4659 29.6.1.1 [rand.req.genl]/1e requires one of short, int, long, long long, unsigned short, unsigned int, unsigned long, or unsigned long long std::uniform_int_distribution idist; c4::rng::pcg rng(kSeed); for(; begin != end; ++begin) *begin = gen(idist, rng); } C4FOR(T, isint) generate_n_positive(T *begin, T *end) { // do not use T in the distribution: // N4659 29.6.1.1 [rand.req.genl]/1e requires one of short, int, long, long long, unsigned short, unsigned int, unsigned long, or unsigned long long std::uniform_int_distribution idist; c4::rng::pcg rng(kSeed); for(; begin != end; ++begin) *begin = gen_pos(idist, rng); } /** generate in place a random sequence of values: real-number version*/ C4FOR(T, isreal) generate_n(T *begin, T *end) { c4::rng::pcg rng(kSeed); // make sure we also have some integral numbers in the real sequence T *rstart = begin + (std::distance(begin, end) / 20); // 5% integral numbers std::uniform_int_distribution idist; std::uniform_real_distribution rdist; for(; begin != rstart; ++begin) *begin = gen(idist, rng); for(; begin != end; ++begin) *begin = gen(rdist, rng); } /** generate in place a random sequence of values: real-number version*/ C4FOR(T, isreal) generate_n_positive(T *begin, T *end) { c4::rng::pcg rng(kSeed); // make sure we also have some integral numbers in the real sequence T *rstart = begin + (std::distance(begin, end) / 20); // 5% integral numbers std::uniform_int_distribution idist; std::uniform_real_distribution rdist; for(; begin != rstart; ++begin) *begin = gen_pos(idist, rng); for(; begin != end; ++begin) *begin = gen_pos(rdist, rng); } /** a ring buffer with input values for xtoa benchmarks */ template struct random_values { std::vector v; mutable size_t curr; size_t szm1; T next() const { T f = v[curr]; curr = (curr + 1) & szm1; return f; } random_values(bool positive_only, size_t sz) : v(sz), curr(0), szm1(sz) { C4_CHECK(is_pot(sz)); if(positive_only) generate_n_positive(&v.front(), &v.back()); else generate_n(&v.front(), &v.back()); } }; template using random_values_cref = random_values const&; template random_values_cref mkvals() { static random_values vals(/*positive_only*/false, kNumValues); return vals; } template random_values_cref mkvals_positive() { static random_values vals(/*positive_only*/true, kNumValues); return vals; } /** a ring buffer with input strings for atox benchmarks */ struct random_strings { std::vector v_s; std::vector v; std::vector arena; mutable size_t curr; size_t szm1; C4_HOT C4_ALWAYS_INLINE c4::csubstr next() const noexcept { c4::csubstr f = v[curr]; curr = (curr + 1) & szm1; return f; } C4_HOT C4_ALWAYS_INLINE std::string const& next_s() const noexcept { std::string const& f = v_s[curr]; curr = (curr + 1) & szm1; return f; } random_strings() = default; template void _init(random_values const& tmp) { C4_CHECK(is_pot(tmp.v.size())); v.resize(tmp.v.size()); v_s.resize(tmp.v.size()); curr = 0; szm1 = tmp.v.size() - 1; } void _build_arena() { size_t sum = 0; for(std::string const& s : v_s) sum += s.size(); sum += v_s.size(); v.resize(v_s.size()); arena.resize(sum); size_t pos = 0; size_t i = 0; for(std::string const& s : v_s) { memcpy(&arena[pos], s.data(), s.size()); v[i++] = c4::csubstr(&arena[pos], s.size()); pos += s.size(); arena[pos++] = '\0'; } } template void init_as(random_values const& tmp) { _init(tmp); for(size_t i = 0; i < v.size(); ++i) c4::catrs(&v_s[i], tmp.v[i]); _build_arena(); } template void init_as_hex(random_values const& tmp, bool with_prefix) { _init(tmp); for(size_t i = 0; i < v.size(); ++i) { c4::catrs(&v_s[i], c4::fmt::hex(tmp.v[i])); if(!with_prefix) _erase_radix_prefix(&v_s[i]); } _build_arena(); } template void init_as_oct(random_values const& tmp, bool with_prefix) { _init(tmp); for(size_t i = 0; i < v.size(); ++i) { c4::catrs(&v_s[i], c4::fmt::oct(tmp.v[i])); if(!with_prefix) _erase_radix_prefix(&v_s[i]); } _build_arena(); } template void init_as_bin(random_values const& tmp, bool with_prefix) { _init(tmp); for(size_t i = 0; i < v.size(); ++i) { c4::catrs(&v_s[i], c4::fmt::bin(tmp.v[i])); if(!with_prefix) _erase_radix_prefix(&v_s[i]); } _build_arena(); } static void _erase_radix_prefix(std::string *s) { C4_ASSERT(s->front() != '-'); s->erase(0, 2); } }; using random_strings_cref = random_strings const&; template random_strings_cref mkstrings() { static random_strings rs; if(rs.v.empty()) rs.init_as(mkvals()); return rs; } template random_strings_cref mkstrings_positive() { static random_strings rs; if(rs.v.empty()) rs.init_as(mkvals_positive()); return rs; } template random_strings_cref mkstrings_hex(bool with_prefix=true) { static random_strings rs; static random_strings rs_wo_prefix; if(with_prefix) { if(rs.v.empty()) rs.init_as_hex(mkvals()); return rs; } else { if(rs_wo_prefix.v.empty()) rs_wo_prefix.init_as_hex(mkvals(), false); return rs_wo_prefix; } } template random_strings_cref mkstrings_hex_positive(bool with_prefix=true) { static random_strings rs; static random_strings rs_wo_prefix; if(with_prefix) { if(rs.v.empty()) rs.init_as_hex(mkvals_positive(), true); return rs; } else { if(rs_wo_prefix.v.empty()) rs_wo_prefix.init_as_hex(mkvals_positive(), false); return rs_wo_prefix; } } template random_strings_cref mkstrings_oct(bool with_prefix=true) { static random_strings rs; static random_strings rs_wo_prefix; if(with_prefix) { if(rs.v.empty()) rs.init_as_oct(mkvals(), true); return rs; } else { if(rs_wo_prefix.v.empty()) rs_wo_prefix.init_as_oct(mkvals(), false); return rs_wo_prefix; } } template random_strings_cref mkstrings_oct_positive(bool with_prefix=true) { static random_strings rs; static random_strings rs_wo_prefix; if(with_prefix) { if(rs.v.empty()) rs.init_as_oct(mkvals_positive(), true); return rs; } else { if(rs_wo_prefix.v.empty()) rs_wo_prefix.init_as_oct(mkvals_positive(), false); return rs_wo_prefix; } } template random_strings_cref mkstrings_bin(bool with_prefix=true) { static random_strings rs; static random_strings rs_wo_prefix; if(with_prefix) { if(rs.v.empty()) rs.init_as_bin(mkvals(), true); return rs; } else { if(rs_wo_prefix.v.empty()) rs_wo_prefix.init_as_bin(mkvals(), false); return rs_wo_prefix; } } template random_strings_cref mkstrings_bin_positive(bool with_prefix=true) { static random_strings rs; static random_strings rs_wo_prefix; if(with_prefix) { if(rs.v.empty()) rs.init_as_bin(mkvals_positive(), true); return rs; } else { if(rs_wo_prefix.v.empty()) rs_wo_prefix.init_as_bin(mkvals_positive(), false); return rs_wo_prefix; } } /** a character buffer, easily convertible to c4::substr */ template struct sbuf { char buf_[Dim]; c4::substr buf; sbuf() : buf_(), buf(buf_) {} C4_HOT C4_ALWAYS_INLINE operator c4::substr& () { return buf; } char* begin() { return buf.begin(); } char* end() { return buf.end(); } }; using string_buffer = sbuf<>; #define C4DOALL(n) for(size_t elm##__LINE__ = 0; elm##__LINE__ < n; ++elm##__LINE__) c4core-0.2.6/bm/bm_format.cpp000066400000000000000000000574101477602032300157610ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include #if defined(__GNUC__) && (__GNUC__ >= 6) C4_SUPPRESS_WARNING_GCC_WITH_PUSH("-Wunused-const-variable") #endif #include #if defined(__GNUC__) && (__GNUC__ >= 6) C4_SUPPRESS_WARNING_GCC_POP #endif C4_SUPPRESS_WARNING_GCC_CLANG_WITH_PUSH("-Wold-style-cast") namespace bm = benchmark; double getmax(std::vector const& v) { return *(std::max_element(std::begin(v), std::end(v))); } double getmin(std::vector const& v) { return *(std::min_element(std::begin(v), std::end(v))); } double getrange(std::vector const& v) { auto min_max = std::minmax_element(std::begin(v), std::end(v)); return *min_max.second - *min_max.first; } #define _c4bm_stats \ /*->Repetitions(20)*/ \ ->DisplayAggregatesOnly(true) \ ->ComputeStatistics("range", &getrange) \ ->ComputeStatistics("max", &getmax) \ ->ComputeStatistics("min", &getmin) #define C4BM(fn) BENCHMARK(fn) _c4bm_stats /** convenience wrapper to avoid boilerplate code */ void report(bm::State &st, size_t sz) { st.SetBytesProcessed(st.iterations() * static_cast(sz)); st.SetItemsProcessed(st.iterations()); } const c4::csubstr sep = " --- "; #define _c4argbundle_fmt "hello here you have some numbers: "\ "1={}, 2={}, 3={}, 4={}, 5={}, 6={}, 7={}, 8={}, 9={}, size_t(283482349)={}, "\ "\" \"=\"{}\", \"haha\"=\"{}\", std::string(\"hehe\")=\"{}\", "\ "str=\"{}\"" #define _c4argbundle_fmt_printf "hello here you have some numbers: "\ "1=%d, 2=%d, 3=%d, 4=%d, 5=%d, 6=%d, 7=%d, 8=%d, 9=%d, size_t(283482349)=%zu, "\ "\" \"=\"%s\", \"haha\"=\"%s\", std::string(\"hehe\")=\"%s\", "\ "str=\"%s\"" #define _c4argbundle_fmt_printf_sep "hello here you have some numbers: "\ "1=%d%s2=%d%s3=%d%s4=%d%s5=%d%s6=%d%s7=%d%s8=%d%s9=%d%ssize_t(283482349)=%zu%s"\ "\" \"=\"%s\"%s\"haha\"=\"%s\"%sstd::string(\"hehe\")=\"%s\"%s"\ "str=\"%s\"" #define _c4argbundle \ 1, 2, 3, 4, 5, 6, 7, 8, 9, size_t(283482349),\ " ", "haha", std::string("hehe"),\ std::string("asdlklkasdlkjasd asdlkjasdlkjasdlkjasdoiasdlkjasldkj") #define _c4argbundle_printf \ 1, 2, 3, 4, 5, 6, 7, 8, 9, size_t(283482349),\ " ", "haha", std::string("hehe").c_str(),\ std::string("asdlklkasdlkjasd asdlkjasdlkjasdlkjasdoiasdlkjasldkj").c_str() #define _c4argbundle_printf_sep \ 1, sep.str, 2, sep.str, 3, sep.str, 4, sep.str, 5, sep.str, 6, sep.str, 7, sep.str, 8, sep.str, 9, sep.str, size_t(283482349), sep.str,\ " ", sep.str, "haha", sep.str, std::string("hehe").c_str(), sep.str,\ std::string("asdlklkasdlkjasd asdlkjasdlkjasdlkjasdoiasdlkjasldkj").c_str() #define _c4argbundle_lshift \ 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << size_t(283482349)\ << " " << "haha" << std::string("hehe")\ << std::string("asdlklkasdlkjasd asdlkjasdlkjasdlkjasdoiasdlkjasldkj") #define _c4argbundle_lshift_sep \ 1 << sep << 2 << sep << 3 << sep << 4 << sep << 5 << sep << 6 << sep << 7 << sep << 8 << sep << 9 << sep << size_t(283482349)\ << sep << " " << sep << "haha" << sep << std::string("hehe")\ << sep << std::string("asdlklkasdlkjasd asdlkjasdlkjasdlkjasdoiasdlkjasldkj") //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- namespace dump2str { static constexpr size_t strsz = 20000000u; std::string c_style_subject; void c_style(c4::csubstr s) { c_style_subject.append(s.str, s.len); } void reset_c_style() noexcept { c_style_subject.clear(); c_style_subject.reserve(strsz); } struct cpp_style { std::string subject = {}; cpp_style() { subject.reserve(strsz); } void operator() (c4::csubstr s) { subject.append(s.str, s.len); } }; struct lambda_style { std::string subject = {}; lambda_style() { subject.reserve(strsz); } }; } // namespace dump2str namespace dump2file { FILE * c_style_subject; void c_style(c4::csubstr s) { fwrite(s.str, 1, s.len, c_style_subject); } struct cpp_style { FILE * subject; cpp_style() : subject(fopen("asdkjhasdkjhsdfoiefkjn", "wb")) {} ~cpp_style() { fclose(subject); } void operator() (c4::csubstr s) { fwrite(s.str, 1, s.len, subject); } }; struct lambda_style { lambda_style() : subject(fopen("asdkjhasdkjhsdfoiefkjn", "wb")) {} ~lambda_style() { fclose(subject); } FILE * subject; }; } // namespace dump2fil template C4_ALWAYS_INLINE typename std::enable_if::value, std::string>::type std_to_string(T const& a) { return std::to_string(a); } template C4_ALWAYS_INLINE typename std::enable_if::value, std::string const&>::type std_to_string(std::string const& a) { return a; } C4_ALWAYS_INLINE std::string std_to_string(c4::csubstr a) { return std::string(a.str, a.len); } template C4_ALWAYS_INLINE typename std::enable_if< ! std::is_arithmetic::value, std::string>::type std_to_string(T const& a) { return std::string(a); } C4_ALWAYS_INLINE void cat_std_string_impl(std::string *) { } C4_ALWAYS_INLINE void catsep_std_string_impl(std::string *) { } template void cat_std_string_impl(std::string *s, Arg const& a, Args const& ...args) { *s += std_to_string(a); cat_std_string_impl(s, args...); } template void catsep_std_string_impl(std::string *s, Arg const& a, Args const& ...args) { *s += std_to_string(a); if(sizeof...(args) > 0) { s->append(sep.str, sep.len); catsep_std_string_impl(s, args...); } } void cat_std_stringstream_impl(std::stringstream &) { } void catsep_std_stringstream_impl(std::stringstream &) { } template void cat_std_stringstream_impl(std::stringstream &ss, Arg const& a, Args const& ...args) { ss << a; cat_std_stringstream_impl(ss, args...); } template void catsep_std_stringstream_impl(std::stringstream &ss, Arg const& a, Args const& ...args) { ss << sep << a; cat_std_stringstream_impl(ss, args...); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- void cat_c4cat_substr(bm::State &st) { char buf_[256]; c4::substr buf(buf_); size_t sz = 0; for(auto _ : st) { sz = cat(buf, _c4argbundle); } report(st, sz); } void cat_c4catrs_reuse(bm::State &st) { std::string buf; size_t sz = 0; for(auto _ : st) { c4::catrs(&buf, _c4argbundle); sz = buf.size(); } report(st, sz); } void cat_c4catrs_no_reuse(bm::State &st) { size_t sz = 0; for(auto _ : st) { auto buf = c4::catrs(_c4argbundle); sz = buf.size(); } report(st, sz); } void cat_c4catdump_c_style_static_dispatch(bm::State &st) { dump2str::reset_c_style(); char buf_[256]; c4::substr buf(buf_); size_t sz = c4::cat(buf, _c4argbundle); for(auto _ : st) { c4::cat_dump<&dump2str::c_style>(buf, _c4argbundle); } report(st, sz); } void cat_c4catdump_c_style_dynamic_dispatch(bm::State &st) { dump2str::reset_c_style(); char buf_[256]; c4::substr buf(buf_); size_t sz = c4::cat(buf, _c4argbundle); for(auto _ : st) { sz = c4::cat_dump(&dump2str::c_style, buf, _c4argbundle); } report(st, sz); } void cat_c4catdump_cpp_style(bm::State &st) { char buf_[256]; c4::substr buf(buf_); size_t sz = c4::cat(buf, _c4argbundle); dump2str::cpp_style dumper; for(auto _ : st) { sz = c4::cat_dump(dumper, buf, _c4argbundle); } report(st, sz); } void cat_c4catdump_lambda_style(bm::State &st) { char buf_[256]; c4::substr buf(buf_); size_t sz = c4::cat(buf, _c4argbundle); dump2str::lambda_style dumper; auto lambda = [&dumper](c4::csubstr s) { dumper.subject.append(s.str, s.len); }; for(auto _ : st) { sz = c4::cat_dump(lambda, buf, _c4argbundle); } report(st, sz); } void cat_stdsstream_reuse(bm::State &st) { size_t sz = 0; std::stringstream ss; for(auto _ : st) { ss.clear(); ss.str(""); cat_std_stringstream_impl(ss, _c4argbundle); sz = ss.str().size(); } report(st, sz); } void cat_stdsstream_no_reuse(bm::State &st) { size_t sz = 0; for(auto _ : st) { std::stringstream ss; cat_std_stringstream_impl(ss, _c4argbundle); sz = ss.str().size(); } report(st, sz); } void cat_std_to_string_reuse(bm::State &st) { size_t sz = 0; std::string s; for(auto _ : st) { s.clear(); cat_std_string_impl(&s, _c4argbundle); sz = s.size(); } report(st, sz); } void cat_std_to_string_no_reuse(bm::State &st) { size_t sz = 0; for(auto _ : st) { std::string s; cat_std_string_impl(&s, _c4argbundle); sz = s.size(); } report(st, sz); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- void catfile_c4catdump_c_style_static_dispatch(bm::State &st) { char buf_[256]; c4::substr buf(buf_); dump2file::cpp_style fileowner; dump2file::c_style_subject = fileowner.subject; size_t sz = c4::cat(buf, _c4argbundle); for(auto _ : st) { c4::cat_dump<&dump2file::c_style>(buf, _c4argbundle); } report(st, sz); } void catfile_c4catdump_c_style_dynamic_dispatch(bm::State &st) { char buf_[256]; c4::substr buf(buf_); dump2file::cpp_style fileowner; dump2file::c_style_subject = fileowner.subject; size_t sz = c4::cat(buf, _c4argbundle); for(auto _ : st) { c4::cat_dump(&dump2file::c_style, buf, _c4argbundle); } report(st, sz); } void catfile_c4catdump_cpp_style(bm::State &st) { char buf_[256]; c4::substr buf(buf_); size_t sz = c4::cat(buf, _c4argbundle); dump2file::cpp_style dumper; for(auto _ : st) { sz = c4::cat_dump(dumper, buf, _c4argbundle); } report(st, sz); } void catfile_c4catdump_lambda_style(bm::State &st) { char buf_[256]; c4::substr buf(buf_); size_t sz = c4::cat(buf, _c4argbundle); dump2file::lambda_style dumper; auto lambda = [&dumper](c4::csubstr s) { fwrite(s.str, 1, s.len, dumper.subject); }; for(auto _ : st) { sz = c4::cat_dump(lambda, buf, _c4argbundle); } report(st, sz); } void catfile_fprintf(bm::State &st) { char buf[256]; size_t sz = c4::cat(buf, _c4argbundle); dump2file::cpp_style dumper; for(auto _ : st) { fprintf(dumper.subject, _c4argbundle_fmt_printf, _c4argbundle_printf); } report(st, sz); } void catfile_ofstream(bm::State &st) { char buf[256]; size_t sz = c4::cat(buf, _c4argbundle); std::ofstream ofs("ddofgufgbmn4g0rtglf", std::ios::out|std::ios::binary); for(auto _ : st) { ofs << _c4argbundle_lshift; } report(st, sz); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- void catsep_c4cat_substr(bm::State &st) { char buf_[256]; c4::substr buf(buf_); size_t sz = 0; for(auto _ : st) { sz = catsep(buf, _c4argbundle); } report(st, sz); } void catsep_c4catrs_reuse(bm::State &st) { std::string buf; size_t sz = 0; for(auto _ : st) { c4::catseprs(&buf, _c4argbundle); sz = buf.size(); } report(st, sz); } void catsep_c4catrs_no_reuse(bm::State &st) { size_t sz = 0; for(auto _ : st) { auto buf = c4::catseprs(sep, _c4argbundle); sz = buf.size(); } report(st, sz); } void catsep_c4catdump_c_style_static_dispatch(bm::State &st) { dump2str::reset_c_style(); char buf_[256]; c4::substr buf(buf_); size_t sz = c4::catsep(buf, _c4argbundle); for(auto _ : st) { c4::catsep_dump<&dump2str::c_style>(buf, sep, _c4argbundle); } report(st, sz); } void catsep_c4catdump_c_style_dynamic_dispatch(bm::State &st) { dump2str::reset_c_style(); char buf_[256]; c4::substr buf(buf_); size_t sz = c4::catsep(buf, _c4argbundle); for(auto _ : st) { sz = c4::catsep_dump(&dump2str::c_style, buf, sep, _c4argbundle); } report(st, sz); } void catsep_c4catdump_cpp_style(bm::State &st) { char buf_[256]; c4::substr buf(buf_); size_t sz = c4::catsep(buf, _c4argbundle); dump2str::cpp_style dumper; for(auto _ : st) { sz = c4::catsep_dump(dumper, buf, sep, _c4argbundle); } report(st, sz); } void catsep_c4catdump_lambda_style(bm::State &st) { char buf_[256]; c4::substr buf(buf_); size_t sz = c4::catsep(buf, sep, _c4argbundle); dump2str::lambda_style dumper; auto lambda = [&dumper](c4::csubstr s) { dumper.subject.append(s.str, s.len); }; for(auto _ : st) { sz = c4::catsep_dump(lambda, buf, _c4argbundle); } report(st, sz); } void catsep_stdsstream_reuse(bm::State &st) { size_t sz = 0; std::stringstream ss; for(auto _ : st) { ss.clear(); ss.str(""); catsep_std_stringstream_impl(ss, sep, _c4argbundle); sz = ss.str().size(); } report(st, sz); } void catsep_stdsstream_no_reuse(bm::State &st) { size_t sz = 0; for(auto _ : st) { std::stringstream ss; catsep_std_stringstream_impl(ss, sep, _c4argbundle); sz = ss.str().size(); } report(st, sz); } void catsep_std_to_string_reuse(bm::State &st) { size_t sz = 0; std::string s; for(auto _ : st) { s.clear(); catsep_std_string_impl(&s, sep, _c4argbundle); sz = s.size(); } report(st, sz); } void catsep_std_to_string_no_reuse(bm::State &st) { size_t sz = 0; for(auto _ : st) { std::string s; catsep_std_string_impl(&s, sep, _c4argbundle); sz = s.size(); } report(st, sz); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- void catsepfile_c4catsepdump_c_style_static_dispatch(bm::State &st) { char buf_[256]; c4::substr buf(buf_); dump2file::cpp_style fileowner; dump2file::c_style_subject = fileowner.subject; size_t sz = c4::catsep(buf, sep, _c4argbundle); for(auto _ : st) { c4::catsep_dump<&dump2file::c_style>(buf, sep, _c4argbundle); } report(st, sz); } void catsepfile_c4catsepdump_c_style_dynamic_dispatch(bm::State &st) { char buf_[256]; c4::substr buf(buf_); dump2file::cpp_style fileowner; dump2file::c_style_subject = fileowner.subject; size_t sz = c4::catsep(buf, sep, _c4argbundle); for(auto _ : st) { c4::catsep_dump(&dump2file::c_style, buf, sep, _c4argbundle); } report(st, sz); } void catsepfile_c4catsepdump_cpp_style(bm::State &st) { char buf_[256]; c4::substr buf(buf_); size_t sz = c4::catsep(buf, sep, _c4argbundle); dump2file::cpp_style dumper; for(auto _ : st) { c4::catsep_dump(dumper, buf, sep, _c4argbundle); } report(st, sz); } void catsepfile_c4catsepdump_lambda_style(bm::State &st) { char buf_[256]; c4::substr buf(buf_); size_t sz = c4::catsep(buf, sep, _c4argbundle); dump2file::lambda_style dumper; auto lambda = [&dumper](c4::csubstr s) { fwrite(s.str, 1, s.len, dumper.subject); }; for(auto _ : st) { c4::catsep_dump(lambda, buf, sep, _c4argbundle); } report(st, sz); } void catsepfile_fprintf(bm::State &st) { char buf[256]; size_t sz = c4::catsep(buf, sep, _c4argbundle); dump2file::cpp_style dumper; for(auto _ : st) { fprintf(dumper.subject, _c4argbundle_fmt_printf_sep, _c4argbundle_printf_sep); } report(st, sz); } void catsepfile_ofstream(bm::State &st) { char buf[256]; size_t sz = c4::catsep(buf, sep, _c4argbundle); std::ofstream ofs("ddofgufgbmn4g0rtglf", std::ios::out|std::ios::binary); for(auto _ : st) { ofs << _c4argbundle_lshift_sep; } report(st, sz); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- void format_c4format(bm::State &st) { char buf_[512]; c4::substr buf(buf_); size_t sz = 0; for(auto _ : st) { sz = format(buf, _c4argbundle_fmt, _c4argbundle); } report(st, sz); } void format_c4formatrs_reuse(bm::State &st) { std::string buf; size_t sz = 0; for(auto _ : st) { c4::formatrs(&buf, _c4argbundle_fmt, _c4argbundle); sz = buf.size(); } report(st, sz); } void format_c4formatrs_no_reuse(bm::State &st) { size_t sz = 0; for(auto _ : st) { auto buf = c4::formatrs(_c4argbundle_fmt, _c4argbundle); sz = buf.size(); } report(st, sz); } void format_c4formatdump_c_style_static_dispatch(bm::State &st) { dump2str::reset_c_style(); char buf_[256]; c4::substr buf(buf_); size_t sz = c4::format(buf, _c4argbundle_fmt, _c4argbundle); for(auto _ : st) { c4::format_dump<&dump2str::c_style>(buf, _c4argbundle_fmt, _c4argbundle); } report(st, sz); } void format_c4formatdump_c_style_dynamic_dispatch(bm::State &st) { dump2str::reset_c_style(); char buf_[256]; c4::substr buf(buf_); size_t sz = c4::format(buf, _c4argbundle_fmt, _c4argbundle); for(auto _ : st) { c4::format_dump(&dump2str::c_style, buf, _c4argbundle_fmt, _c4argbundle); } report(st, sz); } void format_c4formatdump_cpp_style(bm::State &st) { char buf_[256]; c4::substr buf(buf_); size_t sz = c4::format(buf, _c4argbundle_fmt, _c4argbundle); dump2str::cpp_style dumper; for(auto _ : st) { c4::format_dump(dumper, buf, _c4argbundle_fmt, _c4argbundle); } report(st, sz); } void format_c4formatdump_lambda_style(bm::State &st) { char buf_[256]; c4::substr buf(buf_); size_t sz = c4::format(buf, _c4argbundle_fmt, _c4argbundle); dump2str::lambda_style dumper; auto lambda = [&dumper](c4::csubstr s) { dumper.subject.append(s.str, s.len); }; for(auto _ : st) { c4::format_dump(lambda, buf, _c4argbundle_fmt, _c4argbundle); } report(st, sz); } void format_snprintf(bm::State &st) { char buf_[512]; c4::substr buf(buf_); size_t sz = 0; for(auto _ : st) { sz = (size_t) snprintf(buf.str, buf.len, _c4argbundle_fmt_printf, _c4argbundle_printf); } report(st, sz); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- void formatfile_c4formatdump_c_style_static_dispatch(bm::State &st) { char buf_[256]; c4::substr buf(buf_); dump2file::cpp_style fileowner; dump2file::c_style_subject = fileowner.subject; size_t sz = c4::format(buf, _c4argbundle_fmt, _c4argbundle); for(auto _ : st) { c4::format_dump<&dump2file::c_style>(buf, _c4argbundle_fmt, _c4argbundle); } report(st, sz); } void formatfile_c4formatdump_c_style_dynamic_dispatch(bm::State &st) { char buf_[256]; c4::substr buf(buf_); dump2file::cpp_style fileowner; dump2file::c_style_subject = fileowner.subject; size_t sz = c4::format(buf, _c4argbundle_fmt, _c4argbundle); for(auto _ : st) { c4::format_dump(&dump2file::c_style, buf, _c4argbundle_fmt, _c4argbundle); } report(st, sz); } void formatfile_c4formatdump_cpp_style(bm::State &st) { char buf_[256]; c4::substr buf(buf_); size_t sz = c4::format(buf, _c4argbundle_fmt, _c4argbundle); dump2file::cpp_style dumper; for(auto _ : st) { c4::format_dump(dumper, buf, _c4argbundle_fmt, _c4argbundle); } report(st, sz); } void formatfile_c4formatdump_lambda_style(bm::State &st) { char buf_[256]; c4::substr buf(buf_); size_t sz = c4::format(buf, _c4argbundle_fmt, _c4argbundle); dump2file::lambda_style dumper; auto lambda = [&dumper](c4::csubstr s) { fwrite(s.str, 1, s.len, dumper.subject); }; for(auto _ : st) { c4::format_dump(lambda, buf, _c4argbundle_fmt, _c4argbundle); } report(st, sz); } void formatfile_fprintf(bm::State &st) { char buf[256]; size_t sz = c4::format(buf, _c4argbundle_fmt, _c4argbundle); dump2file::cpp_style dumper; for(auto _ : st) { fprintf(dumper.subject, _c4argbundle_fmt_printf, _c4argbundle_printf); } report(st, sz); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- C4BM(cat_c4cat_substr); C4BM(cat_c4catrs_reuse); C4BM(cat_c4catrs_no_reuse); C4BM(cat_c4catdump_c_style_static_dispatch); C4BM(cat_c4catdump_c_style_dynamic_dispatch); C4BM(cat_c4catdump_cpp_style); C4BM(cat_c4catdump_lambda_style); C4BM(cat_std_to_string_reuse); C4BM(cat_std_to_string_no_reuse); C4BM(cat_stdsstream_reuse); C4BM(cat_stdsstream_no_reuse); C4BM(catfile_c4catdump_c_style_static_dispatch); C4BM(catfile_c4catdump_c_style_dynamic_dispatch); C4BM(catfile_c4catdump_cpp_style); C4BM(catfile_c4catdump_lambda_style); C4BM(catfile_fprintf); C4BM(catfile_ofstream); C4BM(catsep_c4cat_substr); C4BM(catsep_c4catrs_reuse); C4BM(catsep_c4catrs_no_reuse); C4BM(catsep_c4catdump_c_style_static_dispatch); C4BM(catsep_c4catdump_c_style_dynamic_dispatch); C4BM(catsep_c4catdump_cpp_style); C4BM(catsep_c4catdump_lambda_style); C4BM(catsep_std_to_string_reuse); C4BM(catsep_std_to_string_no_reuse); C4BM(catsep_stdsstream_reuse); C4BM(catsep_stdsstream_no_reuse); C4BM(catsepfile_c4catsepdump_c_style_static_dispatch); C4BM(catsepfile_c4catsepdump_c_style_dynamic_dispatch); C4BM(catsepfile_c4catsepdump_cpp_style); C4BM(catsepfile_c4catsepdump_lambda_style); C4BM(catsepfile_fprintf); C4BM(catsepfile_ofstream); C4BM(format_c4format); C4BM(format_c4formatrs_reuse); C4BM(format_c4formatrs_no_reuse); C4BM(format_c4formatdump_c_style_static_dispatch); C4BM(format_c4formatdump_c_style_dynamic_dispatch); C4BM(format_c4formatdump_cpp_style); C4BM(format_c4formatdump_lambda_style); C4BM(format_snprintf); C4BM(formatfile_c4formatdump_c_style_static_dispatch); C4BM(formatfile_c4formatdump_c_style_dynamic_dispatch); C4BM(formatfile_c4formatdump_cpp_style); C4BM(formatfile_c4formatdump_lambda_style); C4BM(formatfile_fprintf); //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- int main(int argc, char *argv[]) { bm::Initialize(&argc, argv); bm::RunSpecifiedBenchmarks(); return 0; } C4_SUPPRESS_WARNING_GCC_CLANG_POP #include c4core-0.2.6/bm/bm_itoa_threads.cpp000066400000000000000000000157561477602032300171460ustar00rootroot00000000000000#include "./bm_charconv.hpp" #include #include #include #include #include #include #include #if defined(__cpp_lib_to_chars) || (C4_CPP >= 17) #define C4_HAS_STDTOCHARS 1 #else #define C4_HAS_STDTOCHARS 0 #endif #if C4_HAS_STDTOCHARS #include #endif C4_SUPPRESS_WARNING_GCC_CLANG_PUSH C4_SUPPRESS_WARNING_GCC_CLANG("-Wcast-align") C4_SUPPRESS_WARNING_GCC("-Wuseless-cast") #define FMT_HEADER_ONLY #include #define STB_SPRINTF_IMPLEMENTATION #include C4_SUPPRESS_WARNING_GCC_POP #if C4_CXX >= 20 #include #define C4_HAS_STD_FORMAT (__has_cpp_attribute(__cpp_lib_format)) #else #define C4_HAS_STD_FORMAT (0) #endif #if C4_HAS_STD_FORMAT #include #endif #define BMTHREADS(func) \ BENCHMARK(func) \ ->Threads(1) \ ->Threads(2) \ ->Threads(3) \ ->Threads(4) \ ->Threads(5) \ ->Threads(6) \ ->Threads(7) \ ->Threads(8) \ ->Threads(9) \ ->Threads(10) \ ->UseRealTime() \ void snprintf(bm::State &st) { size_t sum = {}; char buf[100]; int i = 0; for(auto _ : st) { C4DOALL(kNumValues) { int ret = snprintf(buf, sizeof(buf), "%i", i++); sum += (size_t)ret + buf[0]; } } bm::DoNotOptimize(sum); report_threadavg(st, kNumValues); } BMTHREADS(snprintf); #ifndef __linux__ void snprintf_l(bm::State &st) { size_t sum = {}; char buf[100]; int i = 0; for(auto _ : st) { C4DOALL(kNumValues) { #if defined(_MSC_VER) int ret = _snprintf_l(buf, 100, "%i", NULL, i++); #else int ret = snprintf_l(buf, 100, NULL, "%i", i++); #endif sum += (size_t)ret + buf[0]; } } bm::DoNotOptimize(sum); report_threadavg(st, kNumValues); } BMTHREADS(snprintf_l); #endif void stb_snprintf(bm::State &st) { size_t sum = {}; char buf[100]; int i = 0; for(auto _ : st) { C4DOALL(kNumValues) { stbsp_snprintf(buf, 100, "%i", i++); sum += strlen(buf) + buf[0]; } } bm::DoNotOptimize(sum); report_threadavg(st, kNumValues); } BMTHREADS(stb_snprintf); void sstream(bm::State &st) { size_t sum = {}; std::stringstream buf; int i = 0; for(auto _ : st) { C4DOALL(kNumValues) { buf.seekp(0); buf << i++; size_t len = (size_t)buf.tellp(); buf.seekg(0); int firstchar = buf.get(); sum += len + firstchar; } } bm::DoNotOptimize(sum); report_threadavg(st, kNumValues); } BMTHREADS(sstream); void sstream_naive(bm::State &st) { size_t sum = {}; int i = 0; for(auto _ : st) { C4DOALL(kNumValues) { std::stringstream buf; buf << i++; std::string ret = buf.str(); sum += ret.size() + ret[0]; } } bm::DoNotOptimize(sum); report_threadavg(st, kNumValues); } BMTHREADS(sstream_naive); void sstream_naive_reuse(bm::State &st) { size_t sum = {}; int i = 0; std::stringstream buf; for(auto _ : st) { C4DOALL(kNumValues) { buf.clear(); buf.str(""); buf << i++; std::string ret = buf.str(); sum += ret.size() + ret[0]; } } bm::DoNotOptimize(sum); report_threadavg(st, kNumValues); } BMTHREADS(sstream_naive_reuse); #ifdef _MSC_VER void itoa(bm::State &st) { char buf[100]; size_t sum = {}; int i = 0; for(auto _ : st) { C4DOALL(kNumValues) { ::_itoa(i++, buf, 10); sum += strlen(buf) + buf[0]; } } bm::DoNotOptimize(sum); report_threadavg(st, kNumValues); } BMTHREADS(itoa); #endif #if C4_HAS_STD_FORMAT static void std_format_to(bm::State &st) { size_t sum = {}; char buf[100]; int i = 0; for(auto _ : st) { C4DOALL(kNumValues) { const auto res = std::format_to_n(buf, sizeof(buf), /*loc,*/ "{}", i++); sum += (res.out - buf) + buf[0]; } } bm::DoNotOptimize(sum); report_threadavg(st, kNumValues); } BMTHREADS(std_format_to); #endif void fmtlib_format_to(bm::State &st) { size_t sum = {}; fmt::memory_buffer buf; int i = 0; for(auto _ : st) { C4DOALL(kNumValues) { buf.clear(); fmt::format_to(fmt::appender(buf), "{}", i++); sum += buf.size() + buf[0]; } } bm::DoNotOptimize(sum); report_threadavg(st, kNumValues); } BMTHREADS(fmtlib_format_to); #if C4_HAS_STDTOCHARS void std_to_chars(bm::State &st) { size_t sum = {}; char buf[100]; int i = 0; for(auto _ : st) { C4DOALL(kNumValues) { std::to_chars_result res = std::to_chars(buf, buf+sizeof(buf), i++); sum += (res.ptr - buf) + buf[0]; } } bm::DoNotOptimize(sum); report_threadavg(st, kNumValues); } BMTHREADS(std_to_chars); #endif void c4_write_dec(bm::State &st) { size_t sum = {}; char buf_[100]; c4::substr buf = buf_; int i = 0; for(auto _ : st) { C4DOALL(kNumValues) { size_t len = c4::write_dec(buf, i++); sum += len + buf[0]; } } bm::DoNotOptimize(sum); report_threadavg(st, kNumValues); } BMTHREADS(c4_write_dec); void c4_itoa(bm::State &st) { size_t sum = {}; char buf_[100]; c4::substr buf = buf_; int i = 0; for(auto _ : st) { C4DOALL(kNumValues) { size_t len = c4::itoa(buf, i++); sum += len + buf[0]; } } bm::DoNotOptimize(sum); report_threadavg(st, kNumValues); } BMTHREADS(c4_itoa); void c4_xtoa(bm::State &st) { size_t sum = {}; char buf_[100]; c4::substr buf = buf_; int i = 0; for(auto _ : st) { C4DOALL(kNumValues) { size_t len = c4::xtoa(buf, i++); sum += len + buf[0]; } } bm::DoNotOptimize(sum); report_threadavg(st, kNumValues); } BMTHREADS(c4_xtoa); void c4_to_chars(bm::State &st) { size_t sum = {}; char buf_[100]; c4::substr buf = buf_; int i = 0; for(auto _ : st) { C4DOALL(kNumValues) { size_t len = c4::to_chars(buf, i++); sum += len + buf[0]; } } bm::DoNotOptimize(sum); report_threadavg(st, kNumValues); } BMTHREADS(c4_to_chars); //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- int main(int argc, char *argv[]) { bm::Initialize(&argc, argv); bm::RunSpecifiedBenchmarks(); return 0; } c4core-0.2.6/bm/bm_plot_c4core.py000066400000000000000000000243041477602032300165500ustar00rootroot00000000000000import sys import os import re thisdir = os.path.dirname(os.path.abspath(__file__)) moddir = os.path.abspath(f"{thisdir}/../cmake/bm-xp") sys.path.insert(0, moddir) import bm_plot as bm from bm_util import first from dataclasses import dataclass import prettytable def get_function_benchmark(function_name, run: bm.BenchmarkRun): for rbm in run.entries: if rbm.meta.function == function_name: return rbm raise Exception(f"function not found: {function_name}. Existing: {[rbm.meta.function for rbm in run.entries]}") @dataclass class CharconvMeta: # also for atox title: str subject: str function: str data_type: bm.FundamentalTypes @classmethod def make(cls, bm_title: str): # eg: # xtoa_c4_write_dec # xtoa_c4_utoa # xtoa_c4_xtoa # xtoa_c4_to_chars # xtoa_std_to_chars # xtoa_std_to_string # xtoa_sprintf # xtoa_sstream_reuse # xtoa_sstream rx = re.compile(r'(atox|xtoa|xtoahex|xtoaoct|xtoabin)_(.*?)<(u?int\d+_t|float|double)>') if not rx.fullmatch(bm_title): raise Exception(f"cannot understand bm title: {bm_title}") subject = rx.sub(r'\1', bm_title) function = rx.sub(r'\2', bm_title) data_type = rx.sub(r'\3', bm_title) return cls( title=bm_title, subject=subject, function=function.replace("c4_", "c4::").replace("std_", "std::"), data_type=bm.FundamentalTypes.make(data_type) ) @property def shortname(self): return self.function @property def shortparams(self): return str(self.data_type.short) @property def shorttitle(self): return f"{self.shortname}<{self.shortparams}>" @dataclass class CharconvThreadsMeta: function: str num_threads: int @classmethod def make(cls, bm_title: str): # eg: # c4_itoa/real_time/threads:4 rx = re.compile(r'(.*?)/real_time/threads:(\d+)') if not rx.fullmatch(bm_title): raise Exception(f"cannot understand bm title: {bm_title}") function = rx.sub(r'\1', bm_title) num_threads = int(rx.sub(r'\2', bm_title)) return cls( function=function.replace("c4_", "c4::").replace("std_", "std::"), num_threads=num_threads ) def checkbox_groups(self): return {} @property def shortname(self): return self.function @property def shorttitle(self): return self.shortname def plot_charconv_bars(bm_panel: bm.BenchmarkPanel, getref, panel_title_human: str, outputfile_prefix: str): assert os.path.isabs(outputfile_prefix), outputfile_prefix # make a comparison table anchor = lambda run: f"{os.path.basename(outputfile_prefix)}-{first(run.meta).data_type}" anchorlink = lambda run: f"
{first(run.meta).data_type}
" with open(f"{outputfile_prefix}.txt", "w") as tablefile: with open(f"{outputfile_prefix}.md", "w") as mdfile: print(f"## {panel_title_human}\n\n

Data type benchmark results:

\n
    \n", "\n".join([f"
  • {anchorlink(run)}
  • " for run in bm_panel.runs]), "
\n\n", file=mdfile) for run in bm_panel.runs: data_type = first(run.meta).data_type tabletitle = f"{outputfile_prefix}-{data_type.short}" table = prettytable.PrettyTable(title=f"{panel_title_human}: {data_type}") table.add_column("function", [m.shorttitle for m in run.meta], align="l") for prop in ("mega_bytes_per_second", "cpu_time_ms"): ref = getref(run) bar_values = list(run.extract_plot_series(prop)) bar_values_rel = list(run.extract_plot_series(prop, relative_to_entry=ref)) bar_values_pc = list(run.extract_plot_series(prop, percent_of_entry=ref)) pd = bm_panel.first_run.property_plot_data(prop) hns = pd.human_name_short table.add_column(hns, [f"{v_:7.2f}" for v_ in bar_values], align="r") hns = hns.replace(" (ms)", "") table.add_column(f"{hns}(x)", [f"{v_:5.2f}x" for v_ in bar_values_rel], align="r") table.add_column(f"{hns}(%)", [f"{v_:7.2f}%" for v_ in bar_values_pc], align="r") print(table, "\n\n") print(table, "\n\n", file=tablefile) pfx_bps = f"{os.path.basename(outputfile_prefix)}-mega_bytes_per_second-{data_type.short}" pfx_cpu = f"{os.path.basename(outputfile_prefix)}-cpu_time_ms-{data_type.short}" print(f"""

--- ### {panel_title_human}: `{data_type}` * Interactive html graphs for `{data_type}`: * [MB/s](./{pfx_bps}.html) * [CPU time](./{pfx_cpu}.html) [![{data_type}: MB/s](./{pfx_bps}.png)](./{pfx_bps}.png) [![{data_type}: CPU time](./{pfx_cpu}.png)](./{pfx_cpu}.png) ``` {table} ``` """, file=mdfile) # make plots for prop in ("mega_bytes_per_second", "cpu_time_ms"): ps, ps_ = [], [] pd = bm_panel.first_run.property_plot_data(prop) bar_label = f"{pd.human_name_short}{pd.qty_type.comment}" outfilename = f"{outputfile_prefix}-{prop}" for run in bm_panel.runs: data_type = first(run.meta).data_type bar_names = [m.shorttitle for m in run.meta] bar_values = list(run.extract_plot_series(prop)) runtitle = f"{outfilename}-{data_type.short}" # to save each bokeh plot separately and also # a grid plot with all of them, we have to plot # twice because bokeh does not allow saving twice # the same plot from multiple pictures. plotit = lambda: bm.plot_benchmark_run_as_bars(run, title=f"{panel_title_human}: {data_type}\n{bar_label}", bar_names=bar_names, bar_values=bar_values, bar_label=bar_label) # make one plot to save: p, p_ = plotit() bm._bokeh_save_html(f"{runtitle}.html", p) bm._plt_save_png(f"{runtitle}.png") bm._plt_clear() # and another to gather: p, p_ = plotit() ps.append(p) ps_.append(p_) bm._plt_clear() bm.bokeh_plot_many(ps, f"{outfilename}.html") def plot_itoa_threads_(bm_panel: bm.BenchmarkPanel, getref, panel_title_human: str, outputfile_prefix: str): assert os.path.isabs(outputfile_prefix), outputfile_prefix orig = lambda yprop, **kw: lambda run: list(run.extract_plot_series(yprop, **kw)) divnt = lambda yprop, **kw: lambda run: [v / n for v, n in run.extract_plot_series_with_threads(yprop, **kw)] mulnt = lambda yprop, **kw: lambda run: [v * n for v, n in run.extract_plot_series_with_threads(yprop, **kw)] xprop = "threads" xpd = bm_panel.first_run.property_plot_data(xprop) xlabel = f"{xpd.human_name_short}" for yprop, ylog, yget in ( #("mega_items_per_second", False, orig), ("mega_bytes_per_second", False, orig), #("iterations", False, divnt), #("real_time_ms", True, mulnt), ("cpu_time_ms", True, orig),): ypd = bm_panel.first_run.property_plot_data(yprop) ylabel = f"{ypd.human_name_short}{ypd.qty_type.comment}" p = bm.plot_benchmark_panel_as_lines( bm_panel, f"{panel_title_human}\n{ylabel}", xget=orig("threads"), yget=yget(yprop), nameget=lambda run: first(run.meta).function, ylog=ylog, xlabel=xlabel, ylabel=ylabel ) name = f"{outputfile_prefix}-lines-{yprop}" # save png using matplotlib bm._plt_save_png(f"{name}.png") bm._plt_clear() # save html using bokeh bm._bokeh_save_html(f"{name}.html", p) #bkp.show(p) return p def plot_itoa_threads(dir_: str, json_files): panel = bm.BenchmarkPanel(json_files, CharconvThreadsMeta) ref = lambda bmrun: get_function_benchmark("std::to_chars", run=bmrun) plot_itoa_threads_(panel, ref, f"itoa benchmark: convert 2M 32b integers to string", f"{dir_}/c4core-bm-charconv_threads") def plot_charconv_xtoa(dir_: str, json_files, is_ftoa: bool): fcase = "ftoa" if is_ftoa else "xtoa" panel = bm.BenchmarkPanel(json_files, CharconvMeta) ref = lambda bmrun: get_function_benchmark("sprintf", run=bmrun) plot_charconv_bars(panel, ref, f"xtoa benchmark: convert 1M numbers to strings", f"{dir_}/c4core-bm-charconv-{fcase}") def plot_charconv_atox(dir_: str, json_files, is_atof: bool): fcase = "atof" if is_atof else "atox" panel = bm.BenchmarkPanel(json_files, CharconvMeta) ref = lambda bmrun: get_function_benchmark("scanf", run=bmrun) plot_charconv_bars(panel, ref, f"atox benchmark: convert 1M strings to numbers", f"{dir_}/c4core-bm-charconv-{fcase}") if __name__ == '__main__': args = sys.argv[1:] if len(args) < 2: raise Exception(f"usage: {sys.executable} {sys.argv[0]} benchmarkfile.json[,benchmarkfile2.json,...]") cmd = args[0] json_files = args[1:] dir_ = os.path.dirname(json_files[0]) for jf in json_files: print("jf:", jf, flush=True) assert os.path.dirname(jf) == dir_, (os.path.dirname(jf), dir_) assert os.path.exists(jf), jf if cmd == "itoa_threads": plot_itoa_threads(dir_, json_files) elif cmd == "xtoa" or cmd == "ftoa": plot_charconv_xtoa(dir_, json_files, (cmd == "ftoa")) elif cmd == "atox" or cmd == "atof": plot_charconv_atox(dir_, json_files, (cmd == "atof")) elif cmd == "format": raise Exception(f"not implemented: {cmd}") elif cmd == "digits": pass # nothing to do else: raise Exception(f"not implemented: {cmd}") c4core-0.2.6/bm/bm_xtoa.cpp000066400000000000000000001644501477602032300154470ustar00rootroot00000000000000#include "./bm_charconv.hpp" #include #include // this is an exploratory benchmark to compare the possible // combinations for all the components of the write_dec() algorithm template using msb_func = unsigned (*)(T val); #if defined(__GNUC__) # pragma GCC diagnostic push # if __GNUC__ >= 8 # pragma GCC diagnostic ignored "-Wstringop-truncation" # pragma GCC diagnostic ignored "-Wstringop-overflow" # endif #endif //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // WIP. // TODO: _BitscanReverse() in MSVC C4_SUPPRESS_WARNING_GCC_WITH_PUSH("-Wuseless-cast") C4_CONSTEXPR14 C4_ALWAYS_INLINE auto msb_intrinsic(unsigned v) noexcept -> typename std::enable_if<__has_builtin(__builtin_clz), unsigned>::type { using I = unsigned; enum : I { total = (I)(I(8) * sizeof(I) - 1) }; return (total - (I) __builtin_clz(v)); } C4_CONSTEXPR14 C4_ALWAYS_INLINE auto msb_intrinsic_64bit(unsigned long v) noexcept -> typename std::enable_if<__has_builtin(__builtin_clzl), unsigned>::type { using I = unsigned long; enum : I { total = (I)(I(8) * sizeof(I) - 1) }; return (unsigned)(total - (I) __builtin_clzl(v)); } C4_CONSTEXPR14 C4_ALWAYS_INLINE auto msb_intrinsic_64bit(unsigned long long v) noexcept -> typename std::enable_if<__has_builtin(__builtin_clzll), unsigned>::type { using I = unsigned long long; enum : I { total = (I)(I(8) * sizeof(I) - 1) }; return (unsigned)(total - (I) __builtin_clzll(v)); } C4_SUPPRESS_WARNING_GCC_POP template C4_CONSTEXPR14 C4_ALWAYS_INLINE unsigned msb_loop(I v) noexcept { // https://graphics.stanford.edu/~seander/bithacks.html#IntegerLog10Obvious unsigned r = 0; while (v >>= 1) // unroll for more speed... r++; return r; } // https://graphics.stanford.edu/~seander/bithacks.html#IntegerLogLookup constexpr static const int8_t LogTable256[256] = { #define LT(n) n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n -1, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, LT(4), LT(5), LT(5), LT(6), LT(6), LT(6), LT(6), LT(7), LT(7), LT(7), LT(7), LT(7), LT(7), LT(7), LT(7) #undef LT }; template C4_CONSTEXPR14 C4_ALWAYS_INLINE unsigned msb_de_bruijn_32bit(I v) noexcept { I t, tt; // temporaries tt = v >> 16; if (tt) return (unsigned)((t = tt >> 8) ? 24 + LogTable256[t] : 16 + LogTable256[tt]); return (unsigned)((t = v >> 8) ? 8 + LogTable256[t] : LogTable256[v]); } template C4_CONSTEXPR14 C4_ALWAYS_INLINE unsigned msb_intrinsic_8bit(I v) noexcept { return msb_intrinsic((unsigned)v); } template C4_CONSTEXPR14 C4_ALWAYS_INLINE unsigned msb_divconq_8bit(I v) noexcept { C4_STATIC_ASSERT(sizeof(I) == 1); unsigned n = 0; if(v & I(0xf0)) v >>= 4, n |= I(4); if(v & I(0x0c)) v >>= 2, n |= I(2); if(v & I(0x02)) v >>= 1, n |= I(1); return n; } template C4_CONSTEXPR14 C4_ALWAYS_INLINE unsigned msb_intrinsic_16bit(I v) noexcept { return msb_intrinsic((unsigned)v); } template C4_CONSTEXPR14 C4_ALWAYS_INLINE unsigned msb_divconq_16bit(I v) noexcept { C4_STATIC_ASSERT(sizeof(I) == 2); unsigned n = 0; if(v & I(0xff00)) v >>= 8, n |= I(8); if(v & I(0x00f0)) v >>= 4, n |= I(4); if(v & I(0x000c)) v >>= 2, n |= I(2); if(v & I(0x0002)) v >>= 1, n |= I(1); return n; } template C4_CONSTEXPR14 C4_ALWAYS_INLINE unsigned msb_intrinsic_32bit(I v) noexcept { return msb_intrinsic((unsigned)v); } template C4_CONSTEXPR14 C4_ALWAYS_INLINE unsigned msb_divconq_32bit(I v) noexcept { C4_STATIC_ASSERT(sizeof(I) == 4); unsigned n = 0; if(v & I(0xffff0000)) v >>= 16, n |= I(16); if(v & I(0x0000ff00)) v >>= 8, n |= I(8); if(v & I(0x000000f0)) v >>= 4, n |= I(4); if(v & I(0x0000000c)) v >>= 2, n |= I(2); if(v & I(0x00000002)) v >>= 1, n |= I(1); return n; } template C4_CONSTEXPR14 C4_ALWAYS_INLINE unsigned msb_divconq_branchless_32bit(I v) noexcept { C4_STATIC_ASSERT(sizeof(I) == 4); unsigned r = (unsigned)(v > 0xFFFF) << 4; v >>= r; unsigned shift = (unsigned)(v > 0xFF ) << 3; v >>= shift; r |= shift; shift = (unsigned)(v > 0xF ) << 2; v >>= shift; r |= shift; shift = (unsigned)(v > 0x3 ) << 1; v >>= shift; r |= shift; r |= (unsigned)(v >> 1); return r; } template C4_CONSTEXPR14 C4_ALWAYS_INLINE unsigned msb_intrinsic_64bit(I v) noexcept { return msb_intrinsic_64bit((uint64_t)v); } template C4_CONSTEXPR14 C4_ALWAYS_INLINE unsigned msb_divconq_64bit(I v) noexcept { C4_STATIC_ASSERT(sizeof(I) == 8); unsigned n = 0; if(v & I(0xffffffff00000000)) v >>= 32, n |= I(32); if(v & I(0x00000000ffff0000)) v >>= 16, n |= I(16); if(v & I(0x000000000000ff00)) v >>= 8, n |= I(8); if(v & I(0x00000000000000f0)) v >>= 4, n |= I(4); if(v & I(0x000000000000000c)) v >>= 2, n |= I(2); if(v & I(0x0000000000000002)) v >>= 1, n |= I(1); return n; } template msbfunc> void msb(bm::State &st) { random_values_cref values = mkvals_positive(); unsigned sum = {}; for(auto _ : st) { C4DOALL(kNumValues) sum += msbfunc(values.next()); } bm::DoNotOptimize(sum); report(st, kNumValues); } C4BM_TEMPLATE(msb, uint8_t, msb_intrinsic_8bit); C4BM_TEMPLATE(msb, uint8_t, msb_divconq_8bit); C4BM_TEMPLATE(msb, uint8_t, msb_loop); C4BM_TEMPLATE(msb, int8_t, msb_intrinsic_8bit); C4BM_TEMPLATE(msb, int8_t, msb_divconq_8bit); C4BM_TEMPLATE(msb, int8_t, msb_loop); C4BM_TEMPLATE(msb, uint16_t, msb_intrinsic_16bit); C4BM_TEMPLATE(msb, uint16_t, msb_divconq_16bit); C4BM_TEMPLATE(msb, uint16_t, msb_loop); C4BM_TEMPLATE(msb, int16_t, msb_intrinsic_16bit); C4BM_TEMPLATE(msb, int16_t, msb_divconq_16bit); C4BM_TEMPLATE(msb, int16_t, msb_loop); C4BM_TEMPLATE(msb, uint32_t, msb_intrinsic_32bit); C4BM_TEMPLATE(msb, uint32_t, msb_de_bruijn_32bit); C4BM_TEMPLATE(msb, uint32_t, msb_divconq_32bit); C4BM_TEMPLATE(msb, uint32_t, msb_divconq_branchless_32bit); C4BM_TEMPLATE(msb, uint32_t, msb_loop); C4BM_TEMPLATE(msb, int32_t, msb_intrinsic_32bit); C4BM_TEMPLATE(msb, int32_t, msb_de_bruijn_32bit); C4BM_TEMPLATE(msb, int32_t, msb_divconq_32bit); C4BM_TEMPLATE(msb, int32_t, msb_divconq_branchless_32bit); C4BM_TEMPLATE(msb, int32_t, msb_loop); C4BM_TEMPLATE(msb, uint64_t, msb_intrinsic_64bit); C4BM_TEMPLATE(msb, uint64_t, msb_divconq_64bit); C4BM_TEMPLATE(msb, uint64_t, msb_loop); C4BM_TEMPLATE(msb, int64_t, msb_intrinsic_64bit); C4BM_TEMPLATE(msb, int64_t, msb_divconq_64bit); C4BM_TEMPLATE(msb, int64_t, msb_loop); //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- namespace impl { template C4_CONSTEXPR14 C4_ALWAYS_INLINE auto digits_glibc(_Tp __value) noexcept -> typename std::enable_if::value, unsigned>::type { static_assert(std::is_integral<_Tp>::value, "implementation bug"); static_assert(std::is_unsigned<_Tp>::value, "implementation bug"); unsigned __n = 1; const unsigned __b2 = __base * __base; const unsigned __b3 = __b2 * __base; const unsigned long __b4 = __b3 * __base; for (;;) { if (__value < (unsigned)__base) return __n; if (__value < __b2) return __n + 1; if (__value < __b3) return __n + 2; if (__value < __b4) return __n + 3; __value /= (_Tp) __b4; __n += 4; } } template C4_CONSTEXPR14 C4_ALWAYS_INLINE auto digits_glibc(_Tp __value, unsigned __base) noexcept -> typename std::enable_if::value, unsigned>::type { static_assert(std::is_integral<_Tp>::value, "implementation bug"); static_assert(std::is_unsigned<_Tp>::value, "implementation bug"); unsigned __n = 1; const unsigned __b2 = __base * __base; const unsigned __b3 = __b2 * __base; const unsigned long __b4 = __b3 * __base; for (;;) { if (__value < (unsigned)__base) return __n; if (__value < __b2) return __n + 1; if (__value < __b3) return __n + 2; if (__value < __b4) return __n + 3; __value /= (_Tp)__b4; __n += 4; } } template constexpr C4_ALWAYS_INLINE auto digits_glibc(_Tp __value) noexcept -> typename std::enable_if::value, unsigned>::type { using U = typename std::make_unsigned<_Tp>::type; return digits_glibc((U)__value); } template constexpr C4_ALWAYS_INLINE auto digits_glibc(_Tp __value, unsigned __base) noexcept -> typename std::enable_if::value, unsigned>::type { using U = typename std::make_unsigned<_Tp>::type; return digits_glibc((U)__value, __base); } //------------------------------------------- // https://graphics.stanford.edu/~seander/bithacks.html#IntegerLog10Obvious // these functions assume the numbers are positive even when the type // is signed template constexpr C4_ALWAYS_INLINE auto digits_dec_naive_hifirst(T v) noexcept -> typename std::enable_if::type { // best when the numbers are uniformly distributed over the whole range return ((v >= 100) ? 3u : ((v >= 10) ? 2u : 1u)); } template constexpr C4_ALWAYS_INLINE auto digits_dec_naive_lofirst(T v) noexcept -> typename std::enable_if::type { // best when lower numbers are more likely return ((v < 10) ? 1u : ((v < 100) ? 2u : 3u)); } // 16 bit template constexpr C4_ALWAYS_INLINE auto digits_dec_naive_hifirst(T v) noexcept -> typename std::enable_if::type { // best when the numbers are uniformly distributed over the whole range return ((v >= 10000) ? 5u : (v >= 1000) ? 4u : (v >= 100) ? 3u : (v >= 10) ? 2u : 1u); } template constexpr C4_ALWAYS_INLINE auto digits_dec_naive_lofirst(T v) noexcept -> typename std::enable_if::type { // best when lower numbers are more likely return ((v < 100) ? ((v >= 10) ? 2u : 1u) : ((v < 1000) ? 3u : ((v < 10000) ? 4u : 5u))); } // 32 bit template constexpr C4_ALWAYS_INLINE auto digits_dec_naive_hifirst(T v) noexcept -> typename std::enable_if::type { return ((v >= 1000000000) ? 10u : (v >= 100000000) ? 9u : (v >= 10000000) ? 8u : (v >= 1000000) ? 7u : (v >= 100000) ? 6u : (v >= 10000) ? 5u : (v >= 1000) ? 4u : (v >= 100) ? 3u : (v >= 10) ? 2u : 1u); } template constexpr C4_ALWAYS_INLINE auto digits_dec_naive_lofirst(T v) noexcept -> typename std::enable_if::type { return ((v < 10) ? 1u : (v < 100) ? 2u : (v < 1000) ? 3u : (v < 10000) ? 4u : (v < 100000) ? 5u : (v < 1000000) ? 6u : (v < 10000000) ? 7u : (v < 100000000) ? 8u : (v < 1000000000) ? 9u : 10u); } // 64 bit template constexpr C4_ALWAYS_INLINE auto digits_dec_naive_hifirst(T v) noexcept -> typename std::enable_if::type { return ((std::is_unsigned::value && v >= T(10000000000000000000u)) ? 20u : (v >= 1000000000000000000) ? 19u : (v >= 100000000000000000) ? 18u : (v >= 10000000000000000) ? 17u : (v >= 1000000000000000) ? 16u : (v >= 100000000000000) ? 15u : (v >= 10000000000000) ? 14u : (v >= 1000000000000) ? 13u : (v >= 100000000000) ? 12u : (v >= 10000000000) ? 11u : (v >= 1000000000) ? 10u : (v >= 100000000) ? 9u : (v >= 10000000) ? 8u : (v >= 1000000) ? 7u : (v >= 100000) ? 6u : (v >= 10000) ? 5u : (v >= 1000) ? 4u : (v >= 100) ? 3u : (v >= 10) ? 2u : 1u); } template constexpr C4_ALWAYS_INLINE auto digits_dec_naive_lofirst(T v) noexcept -> typename std::enable_if::type { return ((v < 10) ? 1u : (v < 100) ? 2u : (v < 1000) ? 3u : (v < 10000) ? 4u : (v < 100000) ? 5u : (v < 1000000) ? 6u : (v < 10000000) ? 7u : (v < 100000000) ? 8u : (v < 1000000000) ? 9u : (v < 10000000000) ? 10u : (v < 100000000000) ? 11u : (v < 1000000000000) ? 12u : (v < 10000000000000) ? 13u : (v < 100000000000000) ? 14u : (v < 1000000000000000) ? 15u : (v < 10000000000000000) ? 16u : (v < 100000000000000000) ? 17u : (v < 1000000000000000000) ? 18u : ((typename std::make_unsigned::type)v < 10000000000000000000u) ? 19u : 20u); } template C4_CONSTEXPR14 C4_ALWAYS_INLINE auto digits_dec_naive_hifirst64fallback32(T v) noexcept -> typename std::enable_if::type { if(v >= std::numeric_limits::max()) return digits_glibc(v); else return ((v >= 1000000000) ? 10u : (v >= 100000000) ? 9u : (v >= 10000000) ? 8u : (v >= 1000000) ? 7u : (v >= 100000) ? 6u : (v >= 10000) ? 5u : (v >= 1000) ? 4u : (v >= 100) ? 3u : (v >= 10) ? 2u : 1u); } template C4_CONSTEXPR14 C4_ALWAYS_INLINE auto digits_dec_naive_lofirst64fallback32(T v) noexcept -> typename std::enable_if::type { if(v < std::numeric_limits::max()) return ((v < 10) ? 1u : (v < 100) ? 2u : (v < 1000) ? 3u : (v < 10000) ? 4u : (v < 100000) ? 5u : (v < 1000000) ? 6u : (v < 10000000) ? 7u : (v < 100000000) ? 8u : (v < 1000000000) ? 9u : 10u); else return digits_glibc(v); } template C4_CONSTEXPR14 C4_ALWAYS_INLINE auto digits_dec_naive_fargies(T v) noexcept -> typename std::enable_if::type { // https://github.com/biojppm/c4core/pull/77#issuecomment-1063753568 if(v >= 1000000000) // 10 { if(v >= 100000000000000) // 15 [15-20] range { if(v >= 100000000000000000) // 18 (15 + (20 - 15) / 2) { if((typename std::make_unsigned::type)v >= 10000000000000000000u) // 20 return 20u; else return (v >= 1000000000000000000) ? 19u : 18u; } else if(v >= 10000000000000000) // 17 return 17u; else return(v >= 1000000000000000) ? 16u : 15u; } else if(v >= 1000000000000) // 13 return (v >= 10000000000000) ? 14u : 13u; else if(v >= 100000000000) // 12 return 12; else return(v >= 10000000000) ? 11u : 10u; } else if(v >= 10000) // 5 [5-9] range { if(v >= 10000000) // 8 return (v >= 100000000) ? 9u : 8u; else if(v >= 1000000) // 7 return 7; else return (v >= 100000) ? 6u : 5u; } else if(v >= 100) return (v >= 1000) ? 4u : 3u; else return (v >= 10) ? 2u : 1u; } //------------------------------------------- namespace c4 { namespace detail { template struct powers_of_10; #define _C4_POWERS_OF_10_FOR(cond, ...) \ template \ struct powers_of_10::type> \ { \ static C4_INLINE_CONSTEXPR const T values[] = {__VA_ARGS__}; \ static C4_INLINE_CONSTEXPR const T values_size = C4_COUNTOF(values); \ }; \ template \ C4_INLINE_CONSTEXPR const T powers_of_10::type>::values[] _C4_POWERS_OF_10_FOR(sizeof(T)==1u, 1, 10, 100 ); _C4_POWERS_OF_10_FOR(sizeof(T)==2u, 1, 10, 100, 1000, 10000 ); _C4_POWERS_OF_10_FOR(sizeof(T)==4u, 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 ); _C4_POWERS_OF_10_FOR(std::is_signed::value && sizeof(T)==8u, 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000, 10000000000, 100000000000, 1000000000000, 10000000000000, 100000000000000, 1000000000000000, 10000000000000000, 100000000000000000, 1000000000000000000 ); _C4_POWERS_OF_10_FOR(std::is_unsigned::value && sizeof(T)==8u, 1u, 10u, 100u, 1000u, 10000u, 100000u, 1000000u, 10000000u, 100000000u, 1000000000u, 10000000000u, 100000000000u, 1000000000000u, 10000000000000u, 100000000000000u, 1000000000000000u, 10000000000000000u, 100000000000000000u, 1000000000000000000u, 10000000000000000000u ); } // namespace detail } // namespace c4 template msbfunc> C4_CONSTEXPR14 C4_ALWAYS_INLINE unsigned digits_dec_log10_nocheck(T v) noexcept { // https://graphics.stanford.edu/~seander/bithacks.html#IntegerLog10 const unsigned mag = ((unsigned)msbfunc(v) + 1u) * 1233u >> 12; C4_ASSERT(mag < c4::detail::powers_of_10::values_size); return 1u + mag - (v < c4::detail::powers_of_10::values[mag]); } template msbfunc> C4_CONSTEXPR14 C4_ALWAYS_INLINE unsigned digits_dec_log10(T v) noexcept { if(v) { // https://graphics.stanford.edu/~seander/bithacks.html#IntegerLog10 const unsigned mag = ((unsigned)msbfunc(v) + 1u) * 1233u >> 12; C4_ASSERT(mag < c4::detail::powers_of_10::values_size); return 1u + mag - (v < c4::detail::powers_of_10::values[mag]); } return 1u; } } // namespace impl template void digits_dec_naive_fargies(bm::State &st) { random_values_cref values = mkvals_positive(); unsigned sum = {}; for(auto _ : st) { C4DOALL(kNumValues) sum += impl::digits_dec_naive_fargies(values.next()); } bm::DoNotOptimize(sum); report(st, kNumValues); } template void digits_dec_naive_hifirst(bm::State &st) { random_values_cref values = mkvals_positive(); unsigned sum = {}; for(auto _ : st) { C4DOALL(kNumValues) sum += impl::digits_dec_naive_hifirst(values.next()); } bm::DoNotOptimize(sum); report(st, kNumValues); } template void digits_dec_naive_lofirst(bm::State &st) { random_values_cref values = mkvals_positive(); unsigned sum = {}; for(auto _ : st) { C4DOALL(kNumValues) sum += impl::digits_dec_naive_lofirst(values.next()); } bm::DoNotOptimize(sum); report(st, kNumValues); } template void digits_dec_naive_hifirst64fallback32(bm::State &st) { random_values_cref values = mkvals_positive(); unsigned sum = {}; for(auto _ : st) { C4DOALL(kNumValues) sum += impl::digits_dec_naive_hifirst64fallback32(values.next()); } bm::DoNotOptimize(sum); report(st, kNumValues); } template void digits_dec_naive_lofirst64fallback32(bm::State &st) { random_values_cref values = mkvals_positive(); unsigned sum = {}; for(auto _ : st) { C4DOALL(kNumValues) sum += impl::digits_dec_naive_lofirst64fallback32(values.next()); } bm::DoNotOptimize(sum); report(st, kNumValues); } template void digits_dec_glibc_tpl(bm::State &st) { random_values_cref values = mkvals_positive(); unsigned sum = {}; for(auto _ : st) { C4DOALL(kNumValues) sum += impl::digits_glibc(values.next()); } bm::DoNotOptimize(sum); report(st, kNumValues); } template void digits_dec_glibc(bm::State &st) { random_values_cref values = mkvals_positive(); unsigned sum = {}; for(auto _ : st) { C4DOALL(kNumValues) sum += impl::digits_glibc(values.next(), 10); } bm::DoNotOptimize(sum); report(st, kNumValues); } template msbfunc> void digits_dec_log10_nocheck(bm::State &st) { random_values_cref values = mkvals_positive(); unsigned sum = {}; for(auto _ : st) { C4DOALL(kNumValues) sum += impl::digits_dec_log10_nocheck(values.next()); } bm::DoNotOptimize(sum); report(st, kNumValues); } template msbfunc> void digits_dec_log10(bm::State &st) { random_values_cref values = mkvals_positive(); unsigned sum = {}; for(auto _ : st) { C4DOALL(kNumValues) sum += impl::digits_dec_log10(values.next()); } bm::DoNotOptimize(sum); report(st, kNumValues); } #define C4_INSTANTIATE_DIGITS_DEC_BENCHMARKS(ty, num) \ C4BM_TEMPLATE(digits_dec_naive_hifirst, ty); \ C4BM_TEMPLATE(digits_dec_naive_lofirst, ty); \ C4BM_TEMPLATE(digits_dec_log10_nocheck, ty, msb_intrinsic_##num##bit); \ C4BM_TEMPLATE(digits_dec_log10_nocheck, ty, msb_divconq_##num##bit); \ C4BM_TEMPLATE(digits_dec_log10_nocheck, ty, msb_loop); \ C4BM_TEMPLATE(digits_dec_log10, ty, msb_intrinsic_##num##bit); \ C4BM_TEMPLATE(digits_dec_log10, ty, msb_divconq_##num##bit); \ C4BM_TEMPLATE(digits_dec_log10, ty, msb_loop); \ C4BM_TEMPLATE(digits_dec_glibc_tpl, ty); \ C4BM_TEMPLATE(digits_dec_glibc, ty) C4_INSTANTIATE_DIGITS_DEC_BENCHMARKS(uint8_t, 8); C4_INSTANTIATE_DIGITS_DEC_BENCHMARKS(int8_t, 8); C4_INSTANTIATE_DIGITS_DEC_BENCHMARKS(uint16_t, 16); C4_INSTANTIATE_DIGITS_DEC_BENCHMARKS(int16_t, 16); C4_INSTANTIATE_DIGITS_DEC_BENCHMARKS(uint32_t, 32); C4_INSTANTIATE_DIGITS_DEC_BENCHMARKS(int32_t, 32); C4BM_TEMPLATE(digits_dec_naive_fargies, uint64_t); C4BM_TEMPLATE(digits_dec_naive_hifirst64fallback32, uint64_t); C4BM_TEMPLATE(digits_dec_naive_lofirst64fallback32, uint64_t); C4_INSTANTIATE_DIGITS_DEC_BENCHMARKS(uint64_t, 64); C4BM_TEMPLATE(digits_dec_naive_fargies, int64_t); C4BM_TEMPLATE(digits_dec_naive_hifirst64fallback32, int64_t); C4BM_TEMPLATE(digits_dec_naive_lofirst64fallback32, int64_t); C4_INSTANTIATE_DIGITS_DEC_BENCHMARKS(int64_t, 64); //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- namespace impl { // LEGEND: // checkall: check buffer length on every insertion // checkonce: check buffer length only once when entering the function // checkoncemax: as above, and compare against a compile-time maxdigits for the type // checkoncelog: as above, and compare against the exact digits each from the actual number // divrem: compute div with operator/ and rem with operator% // singlediv: compute div with operator/ but rem without using operator% (explicitly compute the remainder) // write1: write 1 digit per division (divide by 10 on each step) // write2: write 2 digits per division (divide by 100 on each step) static constexpr const char digits0099[201] = "0001020304050607080910111213141516171819" "2021222324252627282930313233343536373839" "4041424344454647484950515253545556575859" "6061626364656667686970717273747576777879" "8081828384858687888990919293949596979899"; //------------------------------------------------------------------- template C4_ALWAYS_INLINE size_t write_dec_checkall_divrem_write1(c4::substr buf, T v) noexcept { C4_STATIC_ASSERT(std::is_integral::value); C4_ASSERT(v >= 0); size_t pos = 0; do { if(C4_LIKELY(pos < buf.len)) buf.str[pos] = (char)('0' + (v % T(10))); ++pos; v /= T(10); } while(v); buf.reverse_range(0, pos); return pos; } template C4_ALWAYS_INLINE size_t write_dec_checkall_divrem_write2(c4::substr buf, T v) noexcept { C4_STATIC_ASSERT(std::is_integral::value); C4_ASSERT(v >= 0); size_t pos = 0; while(v >= T(100)) { const auto num = (v % T(100)) << 1u; v /= T(100); if(C4_LIKELY(pos + 2 < buf.len)) { buf.str[pos++] = digits0099[num + 1]; buf.str[pos++] = digits0099[num]; } } if(v >= T(10)) { const auto num = v << 1u; if(C4_LIKELY(pos + 2 < buf.len)) { buf.str[pos++] = digits0099[num + 1]; buf.str[pos++] = digits0099[num]; } } else { if(C4_LIKELY(pos < buf.len)) buf.str[pos++] = (char)('0' + v); } buf.reverse_range(0, pos); return pos; } //------------------------------------------------------------------- template C4_ALWAYS_INLINE size_t write_dec_checkall_singlediv_write1(c4::substr buf, T v) noexcept { C4_STATIC_ASSERT(std::is_integral::value); C4_ASSERT(v >= 0); size_t pos = 0; do { const T quo = v / T(10); const auto rem = v - quo * T(10); v = quo; if(C4_LIKELY(pos < buf.len)) buf.str[pos] = (char)('0' + rem); ++pos; } while(v); buf.reverse_range(0, pos); return pos; } template C4_ALWAYS_INLINE size_t write_dec_checkall_singlediv_write2(c4::substr buf, T v) noexcept { C4_STATIC_ASSERT(std::is_integral::value); C4_ASSERT(v >= 0); size_t pos = 0; while(v >= T(100)) { const T quo = v / T(100); const auto num = (v - quo * T(100)) << 1u; v = quo; if(C4_LIKELY(pos+2 < buf.len)) { buf.str[pos++] = digits0099[num + 1]; buf.str[pos++] = digits0099[num]; } } if(v >= T(10)) { const auto num = v << 1u; if(C4_LIKELY(pos+2 < buf.len)) { buf.str[pos++] = digits0099[num + 1]; buf.str[pos++] = digits0099[num ]; } } else { if(C4_LIKELY(pos < buf.len)) buf.str[pos++] = (char)('0' + v); } buf.reverse_range(0, pos); return pos; } //------------------------------------------------------------------- template C4_ALWAYS_INLINE size_t write_dec_checkoncemax_divrem_write1(c4::substr buf, T v) noexcept { C4_STATIC_ASSERT(std::is_integral::value); C4_ASSERT(v >= 0); if(C4_UNLIKELY(buf.len < c4::detail::charconv_digits::maxdigits_dec)) return c4::detail::charconv_digits::maxdigits_dec; size_t pos = 0; do { buf.str[pos++] = (char)('0' + (v % T(10))); v /= T(10); } while(v); buf.reverse_range(0, pos); return pos; } template C4_ALWAYS_INLINE size_t write_dec_checkoncemax_divrem_write2(c4::substr buf, T v) noexcept { C4_STATIC_ASSERT(std::is_integral::value); C4_ASSERT(v >= 0); if(C4_UNLIKELY(buf.len < c4::detail::charconv_digits::maxdigits_dec)) return c4::detail::charconv_digits::maxdigits_dec; size_t pos = 0; while(v >= T(100)) { const auto num = (v % T(100)) << 1u; v /= T(100); buf.str[pos++] = digits0099[num + 1]; buf.str[pos++] = digits0099[num]; } if(v >= T(10)) { const auto num = v << 1u; buf.str[pos++] = digits0099[num + 1]; buf.str[pos++] = digits0099[num ]; } else { buf.str[pos++] = (char)('0' + v); } buf.reverse_range(0, pos); return pos; } //------------------------------------------------------------------- template C4_ALWAYS_INLINE size_t write_dec_checkoncemax_singlediv_write1(c4::substr buf, T v) noexcept { C4_STATIC_ASSERT(std::is_integral::value); C4_ASSERT(v >= 0); if(C4_UNLIKELY(buf.len < c4::detail::charconv_digits::maxdigits_dec)) return c4::detail::charconv_digits::maxdigits_dec; size_t pos = 0; do { const T quo = v / T(10); const auto rem = (v - quo * T(10)); v = quo; buf.str[pos++] = (char)('0' + rem); } while(v); buf.reverse_range(0, pos); return pos; } template C4_ALWAYS_INLINE size_t write_dec_checkoncemax_singlediv_write2(c4::substr buf, T v) noexcept { C4_STATIC_ASSERT(std::is_integral::value); C4_ASSERT(v >= 0); size_t pos = 0; if(C4_UNLIKELY(buf.len < c4::detail::charconv_digits::maxdigits_dec)) return c4::detail::charconv_digits::maxdigits_dec; while(v >= T(100)) { const T quo = v / T(100); const auto num = (v - quo * T(100)) << 1u; v = quo; buf.str[pos++] = digits0099[num + 1]; buf.str[pos++] = digits0099[num]; } if(v >= T(10)) { const auto num = v << 1u; buf.str[pos++] = digits0099[num + 1]; buf.str[pos++] = digits0099[num ]; } else { buf.str[pos++] = (char)('0' + v); } buf.reverse_range(0, pos); return pos; } //------------------------------------------------------------------- template digitsfunc> C4_ALWAYS_INLINE size_t write_dec_checkoncelog_divrem_write1(c4::substr buf, T v) noexcept { C4_STATIC_ASSERT(std::is_integral::value); C4_ASSERT(v >= 0); unsigned digits = digitsfunc(v); if(C4_UNLIKELY(buf.len < digits)) return digits; size_t pos = digits; do { buf.str[--pos] = (char)('0' + (v % T(10))); v /= T(10); } while(v); return digits; } template digitsfunc> C4_ALWAYS_INLINE size_t write_dec_checkoncelog_divrem_write2(c4::substr buf, T v) noexcept { C4_STATIC_ASSERT(std::is_integral::value); C4_ASSERT(v >= 0); unsigned digits = digitsfunc(v); if(C4_UNLIKELY(buf.len < digits)) return digits; size_t pos = digits; while(v >= T(100)) { const auto num = (v % T(100)) << 1u; v /= T(100); buf.str[--pos] = digits0099[num + 1]; buf.str[--pos] = digits0099[num]; } if(v >= T(10)) { const auto num = v << 1u; buf.str[1] = digits0099[num + 1]; buf.str[0] = digits0099[num]; } else { buf.str[0] = (char)('0' + v); } return digits; } //------------------------------------------------------------------- template digitsfunc> C4_ALWAYS_INLINE size_t write_dec_checkoncelog_singlediv_write1(c4::substr buf, T v) noexcept { C4_STATIC_ASSERT(std::is_integral::value); C4_ASSERT(v >= 0); unsigned digits = digitsfunc(v); if(C4_UNLIKELY(buf.len < digits)) return digits; size_t pos = digits; do { const T quo = v / T(10); const auto rem = (v - quo * T(10)); v = quo; buf.str[--pos] = (char)('0' + rem); } while(v); return digits; } template digitsfunc> C4_ALWAYS_INLINE size_t write_dec_checkoncelog_singlediv_write2(c4::substr buf, T v) noexcept { C4_STATIC_ASSERT(std::is_integral::value); C4_ASSERT(v >= 0); unsigned digits = digitsfunc(v); if(C4_UNLIKELY(buf.len < digits)) return digits; size_t pos = digits; while(v >= T(100)) { const T quo = v / T(100); const auto num = (v - quo * T(100)) << 1u; v = quo; buf.str[--pos] = digits0099[num + 1]; buf.str[--pos] = digits0099[num]; } if(v >= T(10)) { const auto num = v << 1u; buf.str[1] = digits0099[num + 1]; buf.str[0] = digits0099[num ]; } else { buf.str[0] = (char)('0' + v); } return digits; } } // namespace impl #define C4_DEFINE_WRITE_DEC_BM(name) \ template \ void write_dec_##name(bm::State &st) \ { \ random_values_cref values = mkvals_positive(); \ string_buffer buf_ = {}; \ c4::substr buf = buf_; \ C4_ASSERT(buf.len > 11); \ size_t sum = {}; \ for(auto _ : st) \ { \ C4DOALL(kNumValues) \ sum += impl::write_dec_##name(buf, values.next()); \ } \ bm::DoNotOptimize(sum); \ report(st, kNumValues); \ } #define C4_DEFINE_WRITE_DEC_BM_FUNC(name) \ template msbfunc> \ void write_dec_##name(bm::State &st) \ { \ random_values_cref values = mkvals_positive(); \ string_buffer buf_ = {}; \ c4::substr buf = buf_; \ C4_ASSERT(buf.len > 11); \ size_t sum = {}; \ for(auto _ : st) \ { \ C4DOALL(kNumValues) \ sum += impl::write_dec_##name(buf, values.next()); \ } \ bm::DoNotOptimize(sum); \ report(st, kNumValues); \ } C4FOR(T, isint) write_dec_c4_write_dec(bm::State& st) { random_values_cref values = mkvals_positive(); string_buffer buf_ = {}; c4::substr buf = buf_; size_t sum = {}; for(auto _ : st) { C4DOALL(kNumValues) sum += c4::write_dec(buf, values.next()); } bm::DoNotOptimize(sum); report(st, kNumValues); } #if defined(__cpp_lib_to_chars) || (C4_CPP >= 17) #define C4_TO_CHARS_BM(ty) C4BM_TEMPLATE(write_dec_std_to_chars, ty) C4FOR(T, isint) write_dec_std_to_chars(bm::State& st) { random_values_cref values = mkvals_positive(); string_buffer buf_ = {}; c4::substr buf = buf_; size_t sum = {}; for(auto _ : st) { C4DOALL(kNumValues) { auto result = std::to_chars(buf.begin(), buf.end(), values.next()); sum += (size_t)(result.ptr - buf.str); } } bm::DoNotOptimize(sum); report(st, kNumValues); } #else #define C4_TO_CHARS_BM(ty) #endif C4_DEFINE_WRITE_DEC_BM_FUNC(checkoncelog_singlediv_write2) C4_DEFINE_WRITE_DEC_BM_FUNC(checkoncelog_singlediv_write1) C4_DEFINE_WRITE_DEC_BM_FUNC(checkoncelog_divrem_write2) C4_DEFINE_WRITE_DEC_BM_FUNC(checkoncelog_divrem_write1) C4_DEFINE_WRITE_DEC_BM(checkoncemax_singlediv_write2) C4_DEFINE_WRITE_DEC_BM(checkoncemax_singlediv_write1) C4_DEFINE_WRITE_DEC_BM(checkoncemax_divrem_write2) C4_DEFINE_WRITE_DEC_BM(checkoncemax_divrem_write1) C4_DEFINE_WRITE_DEC_BM(checkall_singlediv_write2) C4_DEFINE_WRITE_DEC_BM(checkall_singlediv_write1) C4_DEFINE_WRITE_DEC_BM(checkall_divrem_write2) C4_DEFINE_WRITE_DEC_BM(checkall_divrem_write1) #define C4_INSTANTIATE_WRITE_DEC_BENCHMARKS(ty, num) \ \ /*compare against std::to_chars()*/ \ C4_TO_CHARS_BM(ty); \ \ /*our versions*/ \ C4BM_TEMPLATE(write_dec_c4_write_dec, ty); \ \ C4BM_TEMPLATE(write_dec_checkoncelog_singlediv_write2, ty, impl::digits_dec_naive_hifirst); \ C4BM_TEMPLATE(write_dec_checkoncelog_singlediv_write2, ty, impl::digits_dec_naive_lofirst); \ C4BM_TEMPLATE(write_dec_checkoncelog_singlediv_write2, ty, impl::digits_glibc); \ C4BM_TEMPLATE(write_dec_checkoncelog_singlediv_write2, ty, impl::digits_dec_log10_nocheck>); \ C4BM_TEMPLATE(write_dec_checkoncelog_singlediv_write2, ty, impl::digits_dec_log10_nocheck>); \ C4BM_TEMPLATE(write_dec_checkoncelog_singlediv_write2, ty, impl::digits_dec_log10_nocheck>); \ C4BM_TEMPLATE(write_dec_checkoncelog_singlediv_write2, ty, impl::digits_dec_log10>); \ C4BM_TEMPLATE(write_dec_checkoncelog_singlediv_write2, ty, impl::digits_dec_log10>); \ C4BM_TEMPLATE(write_dec_checkoncelog_singlediv_write2, ty, impl::digits_dec_log10>); \ \ C4BM_TEMPLATE(write_dec_checkoncelog_singlediv_write1, ty, impl::digits_dec_naive_hifirst); \ C4BM_TEMPLATE(write_dec_checkoncelog_singlediv_write1, ty, impl::digits_dec_naive_lofirst); \ C4BM_TEMPLATE(write_dec_checkoncelog_singlediv_write1, ty, impl::digits_glibc); \ C4BM_TEMPLATE(write_dec_checkoncelog_singlediv_write1, ty, impl::digits_dec_log10_nocheck>); \ C4BM_TEMPLATE(write_dec_checkoncelog_singlediv_write1, ty, impl::digits_dec_log10_nocheck>); \ C4BM_TEMPLATE(write_dec_checkoncelog_singlediv_write1, ty, impl::digits_dec_log10_nocheck>); \ C4BM_TEMPLATE(write_dec_checkoncelog_singlediv_write1, ty, impl::digits_dec_log10>); \ C4BM_TEMPLATE(write_dec_checkoncelog_singlediv_write1, ty, impl::digits_dec_log10>); \ C4BM_TEMPLATE(write_dec_checkoncelog_singlediv_write1, ty, impl::digits_dec_log10>); \ \ C4BM_TEMPLATE(write_dec_checkoncelog_divrem_write2, ty, impl::digits_dec_naive_hifirst); \ C4BM_TEMPLATE(write_dec_checkoncelog_divrem_write2, ty, impl::digits_dec_naive_lofirst); \ C4BM_TEMPLATE(write_dec_checkoncelog_divrem_write2, ty, impl::digits_glibc); \ C4BM_TEMPLATE(write_dec_checkoncelog_divrem_write2, ty, impl::digits_dec_log10_nocheck>); \ C4BM_TEMPLATE(write_dec_checkoncelog_divrem_write2, ty, impl::digits_dec_log10_nocheck>); \ C4BM_TEMPLATE(write_dec_checkoncelog_divrem_write2, ty, impl::digits_dec_log10_nocheck>); \ C4BM_TEMPLATE(write_dec_checkoncelog_divrem_write2, ty, impl::digits_dec_log10>); \ C4BM_TEMPLATE(write_dec_checkoncelog_divrem_write2, ty, impl::digits_dec_log10>); \ C4BM_TEMPLATE(write_dec_checkoncelog_divrem_write2, ty, impl::digits_dec_log10>); \ \ C4BM_TEMPLATE(write_dec_checkoncelog_divrem_write1, ty, impl::digits_dec_naive_hifirst); \ C4BM_TEMPLATE(write_dec_checkoncelog_divrem_write1, ty, impl::digits_dec_naive_lofirst); \ C4BM_TEMPLATE(write_dec_checkoncelog_divrem_write1, ty, impl::digits_glibc); \ C4BM_TEMPLATE(write_dec_checkoncelog_divrem_write1, ty, impl::digits_dec_log10_nocheck>); \ C4BM_TEMPLATE(write_dec_checkoncelog_divrem_write1, ty, impl::digits_dec_log10_nocheck>); \ C4BM_TEMPLATE(write_dec_checkoncelog_divrem_write1, ty, impl::digits_dec_log10_nocheck>); \ C4BM_TEMPLATE(write_dec_checkoncelog_divrem_write1, ty, impl::digits_dec_log10>); \ C4BM_TEMPLATE(write_dec_checkoncelog_divrem_write1, ty, impl::digits_dec_log10>); \ C4BM_TEMPLATE(write_dec_checkoncelog_divrem_write1, ty, impl::digits_dec_log10>); \ \ C4BM_TEMPLATE(write_dec_checkoncemax_singlediv_write2, ty); \ C4BM_TEMPLATE(write_dec_checkoncemax_singlediv_write1, ty); \ C4BM_TEMPLATE(write_dec_checkoncemax_divrem_write2, ty); \ C4BM_TEMPLATE(write_dec_checkoncemax_divrem_write1, ty); \ \ C4BM_TEMPLATE(write_dec_checkall_singlediv_write2, ty); \ C4BM_TEMPLATE(write_dec_checkall_singlediv_write1, ty); \ C4BM_TEMPLATE(write_dec_checkall_divrem_write2, ty); \ C4BM_TEMPLATE(write_dec_checkall_divrem_write1, ty) #define C4_INSTANTIATE_WRITE_DEC_BENCHMARKS64(ty) \ \ C4BM_TEMPLATE(write_dec_checkoncelog_singlediv_write2, ty, impl::digits_dec_naive_fargies); \ C4BM_TEMPLATE(write_dec_checkoncelog_singlediv_write2, ty, impl::digits_dec_naive_hifirst64fallback32); \ C4BM_TEMPLATE(write_dec_checkoncelog_singlediv_write2, ty, impl::digits_dec_naive_lofirst64fallback32); \ \ C4BM_TEMPLATE(write_dec_checkoncelog_singlediv_write1, ty, impl::digits_dec_naive_fargies); \ C4BM_TEMPLATE(write_dec_checkoncelog_singlediv_write1, ty, impl::digits_dec_naive_hifirst64fallback32); \ C4BM_TEMPLATE(write_dec_checkoncelog_singlediv_write1, ty, impl::digits_dec_naive_lofirst64fallback32); \ \ C4BM_TEMPLATE(write_dec_checkoncelog_divrem_write2, ty, impl::digits_dec_naive_fargies); \ C4BM_TEMPLATE(write_dec_checkoncelog_divrem_write2, ty, impl::digits_dec_naive_hifirst64fallback32); \ C4BM_TEMPLATE(write_dec_checkoncelog_divrem_write2, ty, impl::digits_dec_naive_lofirst64fallback32); \ \ C4BM_TEMPLATE(write_dec_checkoncelog_divrem_write1, ty, impl::digits_dec_naive_fargies); \ C4BM_TEMPLATE(write_dec_checkoncelog_divrem_write1, ty, impl::digits_dec_naive_hifirst64fallback32); \ C4BM_TEMPLATE(write_dec_checkoncelog_divrem_write1, ty, impl::digits_dec_naive_lofirst64fallback32) C4_INSTANTIATE_WRITE_DEC_BENCHMARKS(uint8_t, 8); C4_INSTANTIATE_WRITE_DEC_BENCHMARKS(int8_t, 8); C4_INSTANTIATE_WRITE_DEC_BENCHMARKS(uint16_t, 16); C4_INSTANTIATE_WRITE_DEC_BENCHMARKS(int16_t, 16); C4_INSTANTIATE_WRITE_DEC_BENCHMARKS(uint32_t, 32); C4_INSTANTIATE_WRITE_DEC_BENCHMARKS(int32_t, 32); C4_INSTANTIATE_WRITE_DEC_BENCHMARKS64(uint64_t); C4_INSTANTIATE_WRITE_DEC_BENCHMARKS(uint64_t, 64); C4_INSTANTIATE_WRITE_DEC_BENCHMARKS64(int64_t); C4_INSTANTIATE_WRITE_DEC_BENCHMARKS(int64_t, 64); #if defined(__GNUC__) # pragma GCC diagnostic pop #endif //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- template struct xtoacase { c4::csubstr str; T val; }; #define _(num) {c4::csubstr(#num), num##u} xtoacase cases_8bit[] = { _(0), _(1), _(9), _(10), _(11), _(98), _(99), _(100), _(101), }; xtoacase cases_16bit[] = { _(999), _(1000), _(1001), _(9999), _(10000), _(10001), }; xtoacase cases_32bit[] = { _(99999), _(100000), _(100001), _(999999), _(1000000), _(1000001), _(9999999), _(10000000), _(10000001), _(99999999), _(100000000), _(100000001), _(999999999), _(1000000000), _(1000000001), }; xtoacase cases_64bit[] = { _(9999999999), _(10000000000), _(10000000001), _(99999999999), _(100000000000), _(100000000001), _(999999999999), _(1000000000000), _(1000000000001), _(9999999999999), _(10000000000000), _(10000000000001), _(99999999999999), _(100000000000000), _(100000000000001), _(999999999999999), _(1000000000000000), _(1000000000000001), _(9999999999999999), _(10000000000000000), _(10000000000000001), _(99999999999999999), _(100000000000000000), _(100000000000000001), _(999999999999999999), _(1000000000000000000), _(1000000000000000001), _(9223372036854775807), }; xtoacase cases_64bitu[] = { _(9999999999999999999), _(10000000000000000000), _(18446744073709551615), }; #undef _ bool logtest = true; bool printok = false; bool testfail = false; #define C4_CHECK_(lhs, op, rhs, ...) \ { \ if(!((lhs) op (rhs))) \ { \ std::cout << __FILE__ << ":" << __LINE__ \ << ": failed! " << #lhs " " #op " " #rhs "\n" \ << " " #lhs "=" << (lhs) << "\n" \ << " " #rhs "=" << (rhs) << "\n" \ << " " << __VA_ARGS__ << "\n"; \ testfail = true; \ } \ else if(printok) \ { \ std::cout << __FILE__ << ":" << __LINE__ \ << ": ok! " << #lhs " " #op " " #rhs \ << " " << __VA_ARGS__ << "\n"; \ } \ } C4_SUPPRESS_WARNING_CLANG("-Wgnu-zero-variadic-macro-arguments") #define C4_CHECK_LT(lhs, rhs, ...) C4_CHECK_(lhs, <, rhs, ## __VA_ARGS__) #define C4_CHECK_LE(lhs, rhs, ...) C4_CHECK_(lhs, <=, rhs, ## __VA_ARGS__) #define C4_CHECK_GT(lhs, rhs, ...) C4_CHECK_(lhs, >, rhs, ## __VA_ARGS__) #define C4_CHECK_GE(lhs, rhs, ...) C4_CHECK_(lhs, >=, rhs, ## __VA_ARGS__) #define C4_CHECK_EQ(lhs, rhs, ...) C4_CHECK_(lhs, ==, rhs, ## __VA_ARGS__) #define C4_CHECK_NE(lhs, rhs, ...) C4_CHECK_(lhs, !=, rhs, ## __VA_ARGS__) #define DO_TEST_DIGITS_(ty, fn, num) \ if(logtest) std::cout << "\ntesting: " #fn "\n"; \ test_digits##num(); \ if(logtest) std::cout << "success: " #fn "\n" #define DO_TEST_WRITE_(ty, fn, num) \ if(logtest) std::cout << "\ntesting: " #fn "\n"; \ test_write##num(&fn); \ if(logtest) std::cout << "success: " #fn "\n" template void test_write(xtoacase c, Func fn) { if(c.val == 0) return; C4_STATIC_ASSERT(sizeof(T) >= sizeof(U)); char buf_[32] = {}; c4::substr buf = buf_; C4_CHECK_GT(c.val, 0, c.str << "/" << (uint64_t)c.val); C4_CHECK_LE((U)c.val, (U)std::numeric_limits::max(), c.str << "/" << (uint64_t)c.val); T val = (T)c.val; size_t ret = fn(buf, val); C4_CHECK_EQ(ret, c.str.len, c.str << "/" << (uint64_t)c.val << ": " << buf.first(ret)); C4_CHECK_EQ(buf.first(ret), c.str, c.str << "/" << (uint64_t)c.val); } template digitsfunc> void test_digits8() { for(auto c : cases_8bit) C4_CHECK_EQ(digitsfunc((T)c.val), c.str.len, (uint64_t)c.val); } template void test_write8(Func func) { for(auto c : cases_8bit) test_write(c, func); } template digitsfunc> void test_digits16() { test_digits8(); for(auto c : cases_16bit) C4_CHECK_EQ(digitsfunc((T)c.val), c.str.len, (uint64_t)c.val); } template void test_write16(Func func) { test_write8(func); for(auto c : cases_16bit) test_write(c, func); } template digitsfunc> void test_digits32() { test_digits8(); test_digits16(); for(auto c : cases_32bit) C4_CHECK_EQ(digitsfunc((T)c.val), c.str.len, (uint64_t)c.val); } template void test_write32(Func func) { test_write8(func); test_write16(func); for(auto c : cases_32bit) test_write(c, func); } template digitsfunc> void test_digits64() { test_digits8(); test_digits16(); test_digits32(); for(auto c : cases_64bit) C4_CHECK_EQ(digitsfunc((T)c.val), c.str.len, (uint64_t)c.val); if(std::is_unsigned::value) for(auto c : cases_64bitu) C4_CHECK_EQ(digitsfunc((T)c.val), c.str.len, (uint64_t)c.val << "/" << c.str); } template auto test_write64(Func func) -> typename std::enable_if::value, void>::type { test_write8(func); test_write16(func); test_write32(func); for(auto c : cases_64bit) test_write(c, func); for(auto c : cases_64bitu) test_write(c, func); } template auto test_write64(Func func) -> typename std::enable_if::value, void>::type { test_write8(func); test_write16(func); test_write32(func); for(auto c : cases_64bit) test_write(c, func); } #define DO_TEST_DIGITS(ty, num) \ DO_TEST_DIGITS_(ty, impl::digits_dec_naive_hifirst, num); \ DO_TEST_DIGITS_(ty, impl::digits_dec_naive_lofirst, num); \ DO_TEST_DIGITS_(ty, impl::digits_glibc, num); \ DO_TEST_DIGITS_(ty, impl::digits_dec_log10>, num); \ DO_TEST_DIGITS_(ty, impl::digits_dec_log10>, num); \ DO_TEST_DIGITS_(ty, impl::digits_dec_log10>, num) #define DO_TEST_DIGITS_64(ty) \ DO_TEST_DIGITS_(ty, impl::digits_dec_naive_fargies, 64); \ DO_TEST_DIGITS_(ty, impl::digits_dec_naive_hifirst64fallback32, 64); \ DO_TEST_DIGITS_(ty, impl::digits_dec_naive_lofirst64fallback32, 64); \ DO_TEST_DIGITS_(ty, impl::digits_dec_naive_fargies, 64); \ DO_TEST_DIGITS_(ty, impl::digits_dec_naive_hifirst64fallback32, 64); \ DO_TEST_DIGITS_(ty, impl::digits_dec_naive_lofirst64fallback32, 64); \ DO_TEST_DIGITS_(ty, impl::digits_dec_naive_fargies, 64); \ DO_TEST_DIGITS_(ty, impl::digits_dec_naive_hifirst64fallback32, 64); \ DO_TEST_DIGITS_(ty, impl::digits_dec_naive_lofirst64fallback32, 64); \ DO_TEST_DIGITS_(ty, impl::digits_dec_naive_fargies, 64); \ DO_TEST_DIGITS_(ty, impl::digits_dec_naive_hifirst64fallback32, 64); \ DO_TEST_DIGITS_(ty, impl::digits_dec_naive_lofirst64fallback32, 64) #define DO_TEST_WRITE(ty, num) \ DO_TEST_WRITE_(ty, impl::write_dec_checkoncelog_singlediv_write2>, num);\ DO_TEST_WRITE_(ty, impl::write_dec_checkoncelog_singlediv_write2>, num);\ DO_TEST_WRITE_(ty, impl::write_dec_checkoncelog_singlediv_write2>, num);\ DO_TEST_WRITE_(ty, impl::write_dec_checkoncelog_singlediv_write2>>, num);\ DO_TEST_WRITE_(ty, impl::write_dec_checkoncelog_singlediv_write2>>, num);\ DO_TEST_WRITE_(ty, impl::write_dec_checkoncelog_singlediv_write2>>, num);\ DO_TEST_WRITE_(ty, impl::write_dec_checkoncelog_singlediv_write2>>, num);\ DO_TEST_WRITE_(ty, impl::write_dec_checkoncelog_singlediv_write2>>, num);\ DO_TEST_WRITE_(ty, impl::write_dec_checkoncelog_singlediv_write2>>, num);\ DO_TEST_WRITE_(ty, impl::write_dec_checkoncelog_singlediv_write1>, num);\ DO_TEST_WRITE_(ty, impl::write_dec_checkoncelog_singlediv_write1>, num);\ DO_TEST_WRITE_(ty, impl::write_dec_checkoncelog_singlediv_write1>, num);\ DO_TEST_WRITE_(ty, impl::write_dec_checkoncelog_singlediv_write1>>, num);\ DO_TEST_WRITE_(ty, impl::write_dec_checkoncelog_singlediv_write1>>, num);\ DO_TEST_WRITE_(ty, impl::write_dec_checkoncelog_singlediv_write1>>, num);\ DO_TEST_WRITE_(ty, impl::write_dec_checkoncelog_singlediv_write1>>, num);\ DO_TEST_WRITE_(ty, impl::write_dec_checkoncelog_singlediv_write1>>, num);\ DO_TEST_WRITE_(ty, impl::write_dec_checkoncelog_singlediv_write1>>, num);\ DO_TEST_WRITE_(ty, impl::write_dec_checkoncelog_divrem_write2>, num);\ DO_TEST_WRITE_(ty, impl::write_dec_checkoncelog_divrem_write2>, num);\ DO_TEST_WRITE_(ty, impl::write_dec_checkoncelog_divrem_write2>, num);\ DO_TEST_WRITE_(ty, impl::write_dec_checkoncelog_divrem_write2>>, num);\ DO_TEST_WRITE_(ty, impl::write_dec_checkoncelog_divrem_write2>>, num);\ DO_TEST_WRITE_(ty, impl::write_dec_checkoncelog_divrem_write2>>, num);\ DO_TEST_WRITE_(ty, impl::write_dec_checkoncelog_divrem_write2>>, num);\ DO_TEST_WRITE_(ty, impl::write_dec_checkoncelog_divrem_write2>>, num);\ DO_TEST_WRITE_(ty, impl::write_dec_checkoncelog_divrem_write2>>, num);\ DO_TEST_WRITE_(ty, impl::write_dec_checkoncelog_divrem_write1>, num);\ DO_TEST_WRITE_(ty, impl::write_dec_checkoncelog_divrem_write1>, num);\ DO_TEST_WRITE_(ty, impl::write_dec_checkoncelog_divrem_write1>, num);\ DO_TEST_WRITE_(ty, impl::write_dec_checkoncelog_divrem_write1>>, num);\ DO_TEST_WRITE_(ty, impl::write_dec_checkoncelog_divrem_write1>>, num);\ DO_TEST_WRITE_(ty, impl::write_dec_checkoncelog_divrem_write1>>, num);\ DO_TEST_WRITE_(ty, impl::write_dec_checkoncelog_divrem_write1>>, num);\ DO_TEST_WRITE_(ty, impl::write_dec_checkoncelog_divrem_write1>>, num);\ DO_TEST_WRITE_(ty, impl::write_dec_checkoncelog_divrem_write1>>, num);\ DO_TEST_WRITE_(ty, impl::write_dec_checkoncemax_singlediv_write2, num);\ DO_TEST_WRITE_(ty, impl::write_dec_checkoncemax_singlediv_write1, num);\ DO_TEST_WRITE_(ty, impl::write_dec_checkoncemax_divrem_write2, num);\ DO_TEST_WRITE_(ty, impl::write_dec_checkoncemax_divrem_write1, num);\ DO_TEST_WRITE_(ty, impl::write_dec_checkall_singlediv_write2, num);\ DO_TEST_WRITE_(ty, impl::write_dec_checkall_singlediv_write1, num);\ DO_TEST_WRITE_(ty, impl::write_dec_checkall_divrem_write2, num);\ DO_TEST_WRITE_(ty, impl::write_dec_checkall_divrem_write1, num) #define DO_TEST_WRITE_64(ty) \ DO_TEST_WRITE_(ty, impl::write_dec_checkoncelog_singlediv_write2>, 64); \ DO_TEST_WRITE_(ty, impl::write_dec_checkoncelog_singlediv_write2>, 64); \ DO_TEST_WRITE_(ty, impl::write_dec_checkoncelog_singlediv_write2>, 64); \ DO_TEST_WRITE_(ty, impl::write_dec_checkoncelog_singlediv_write1>, 64); \ DO_TEST_WRITE_(ty, impl::write_dec_checkoncelog_singlediv_write1>, 64); \ DO_TEST_WRITE_(ty, impl::write_dec_checkoncelog_singlediv_write1>, 64); \ DO_TEST_WRITE_(ty, impl::write_dec_checkoncelog_divrem_write2>, 64); \ DO_TEST_WRITE_(ty, impl::write_dec_checkoncelog_divrem_write2>, 64); \ DO_TEST_WRITE_(ty, impl::write_dec_checkoncelog_divrem_write2>, 64); \ DO_TEST_WRITE_(ty, impl::write_dec_checkoncelog_divrem_write1>, 64); \ DO_TEST_WRITE_(ty, impl::write_dec_checkoncelog_divrem_write1>, 64); \ DO_TEST_WRITE_(ty, impl::write_dec_checkoncelog_divrem_write1>, 64) void do_test() { DO_TEST_DIGITS(uint8_t, 8); DO_TEST_DIGITS(int8_t, 8); DO_TEST_DIGITS(uint16_t, 16); DO_TEST_DIGITS(int16_t, 16); DO_TEST_DIGITS(uint32_t, 32); DO_TEST_DIGITS(int32_t, 32); DO_TEST_DIGITS(uint64_t, 64); DO_TEST_DIGITS(int64_t, 64); DO_TEST_DIGITS_64(uint64_t); DO_TEST_DIGITS_64(int64_t); printf("\n"); DO_TEST_WRITE(uint8_t, 8); DO_TEST_WRITE(int8_t, 8); DO_TEST_WRITE(uint16_t, 16); DO_TEST_WRITE(int16_t, 16); DO_TEST_WRITE(uint32_t, 32); DO_TEST_WRITE(int32_t, 32); DO_TEST_WRITE(uint64_t, 64); DO_TEST_WRITE(int64_t, 64); DO_TEST_WRITE_64(uint64_t); DO_TEST_WRITE_64(int64_t); printf("\n"); C4_CHECK(!testfail); } int main(int argc, char *argv[]) { //do_test(); bm::Initialize(&argc, argv); bm::RunSpecifiedBenchmarks(); return 0; } c4core-0.2.6/bm/float/000077500000000000000000000000001477602032300144055ustar00rootroot00000000000000c4core-0.2.6/bm/float/CMakeLists.txt000066400000000000000000000073031477602032300171500ustar00rootroot00000000000000find_package(Python COMPONENTS Interpreter) # this benchmark compares the binaries from several float libraries function(c4core_bm_readfloat name define) set(target c4core-bm-readfloat-${name}) c4_add_executable(${target} SOURCES read.cpp LIBS ${ARGN} FOLDER bm/float) use_static_libc(${target}) if(NOT "${define}" STREQUAL "") target_compile_definitions(${target} PUBLIC ${define}=1) endif() target_include_directories(${target} PUBLIC ${C4CORE_SRC_DIR}) if(NOT TARGET c4core-bm-readfloat) add_custom_target(c4core-bm-readfloat) endif() add_dependencies(c4core-bm-readfloat ${target}) _c4_set_target_folder(c4core-bm-readfloat bm) set(measure ${CMAKE_CURRENT_LIST_DIR}/measure.py) target_sources(${target} PRIVATE ${measure}) if(UNIX) set(unix --unix) # $<$:--unix> endif() add_custom_command(TARGET ${target} PRE_BUILD COMMAND ${Python_EXECUTABLE} ${measure} start ${target} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) add_custom_command(TARGET ${target} POST_BUILD COMMAND ${Python_EXECUTABLE} ${measure} finish ${unix} ${target} $ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) endfunction() function(use_static_libc target) if(MSVC) # https://cmake.org/cmake/help/v3.15/prop_tgt/MSVC_RUNTIME_LIBRARY.html set_property(TARGET ${target} PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") else() # https://stackoverflow.com/questions/38694058/cmake-linking-statically-against-libgcc-and-libstdc-into-a-shared-library # see also: # https://github.com/fastfloat/fast_float/pull/41#issuecomment-733346131 target_link_libraries(${target} PUBLIC -static -static-libgcc -static-libstdc++) endif() endfunction() c4core_bm_readfloat(baseline "") c4core_bm_readfloat(std_atof C4FLOAT_STD_ATOF) c4core_bm_readfloat(sscanf_f C4FLOAT_SSCANF_F) c4core_bm_readfloat(sscanf_d C4FLOAT_SSCANF_D) c4core_bm_readfloat(iostream_f C4FLOAT_IOSTREAM_F) c4core_bm_readfloat(iostream_d C4FLOAT_IOSTREAM_D) c4core_bm_readfloat(fast_float_f C4FLOAT_FASTFLOAT_F) c4core_bm_readfloat(fast_float_d C4FLOAT_FASTFLOAT_D) if(C4CORE_BM_USE_RYU) c4core_bm_readfloat(ryu_f C4FLOAT_RYU_F ryu_c4) c4core_bm_readfloat(ryu_d C4FLOAT_RYU_D ryu_c4) endif() get_property(known_features GLOBAL PROPERTY CMAKE_CXX_KNOWN_FEATURES) if(cxx_std_17 IN_LIST known_features) if(C4CORE_BM_USE_FP) c4core_bm_readfloat(fast_fp_f_limited C4FLOAT_FP_F_LIMITED jkj_fp) c4core_bm_readfloat(fast_fp_d_limited C4FLOAT_FP_D_LIMITED jkj_fp) c4core_bm_readfloat(fast_fp_f_unlimited C4FLOAT_FP_F_UNLIMITED jkj_fp) c4core_bm_readfloat(fast_fp_d_unlimited C4FLOAT_FP_D_UNLIMITED jkj_fp) target_compile_features(c4core-bm-readfloat-fast_fp_f_limited PRIVATE cxx_std_17) target_compile_features(c4core-bm-readfloat-fast_fp_d_limited PRIVATE cxx_std_17) target_compile_features(c4core-bm-readfloat-fast_fp_f_unlimited PRIVATE cxx_std_17) target_compile_features(c4core-bm-readfloat-fast_fp_d_unlimited PRIVATE cxx_std_17) endif() # incredible - 6 years of C++17 and from_chars()/to_chars() is not available if(NOT ((CMAKE_CXX_COMPILER_ID STREQUAL GNU) OR (CMAKE_CXX_COMPILER_ID STREQUAL Clang))) c4core_bm_readfloat(std_from_chars_f C4FLOAT_STD_FROM_CHARS_F) c4core_bm_readfloat(std_from_chars_d C4FLOAT_STD_FROM_CHARS_D) target_compile_features(c4core-bm-readfloat-std_from_chars_f PRIVATE cxx_std_17) target_compile_features(c4core-bm-readfloat-std_from_chars_d PRIVATE cxx_std_17) endif() endif() c4core-0.2.6/bm/float/measure.py000066400000000000000000000042001477602032300164140ustar00rootroot00000000000000import time import argparse import os import subprocess import shlex import ruamel from ruamel.yaml import YAML from io import StringIO def dump_to_string(obj, **kwargs): yaml = YAML(typ='unsafe', pure=True) with StringIO() as stream: yaml.dump(obj, stream, **kwargs) s = stream.getvalue() return s def runcmd(cmd, *cmd_args, **subprocess_args): cmd = shlex.split(cmd) + list(cmd_args) #print(" ".join([f"'{a}'" for a in cmd]), flush=True) proc = subprocess.run(cmd, **subprocess_args) return proc def getoutput(cmd, *cmd_args, **subprocess_args): proc = runcmd(cmd, *cmd_args, **subprocess_args, check=True, stdout=subprocess.PIPE) return proc.stdout.decode("utf8") def start_build(args): ts = time.time() with open(args.out, "w") as f: f.write(str(ts)) def finish_build(args): ts = time.time() with open(args.out, "r") as f: start = float(f.read()) duration = ts - start results = { 'compile': f"{duration:.3f}s", 'file_size': f"{os.path.getsize(args.exe)}B" } s = dump_to_string({args.target: results}) print(s, flush=True, end="") ## too much output: #if args.unix: # # https://stackoverflow.com/questions/35485 # results['size'] = getoutput('size', args.exe) # #results['symbols'] = getoutput('nm -t d -l -S --size-sort', args.exe) #s = dump_to_string({args.target: results}) with open(args.out, "w") as f: f.write(s) if __name__ == "__main__": parser = argparse.ArgumentParser() subparsers = parser.add_subparsers() # sp = subparsers.add_parser("start") sp.set_defaults(func=start_build) sp.add_argument('target', type=str, help='the target name') # sp = subparsers.add_parser("finish") sp.set_defaults(func=finish_build) sp.add_argument('target', type=str, help='the target name') sp.add_argument('exe', type=str, help='the executable file') sp.add_argument('-u', '--unix', action="store_true", help='use unix style size reporters') # args = parser.parse_args() args.out = f"{args.target}.dat" args.func(args) c4core-0.2.6/bm/float/read.cpp000066400000000000000000000076751477602032300160430ustar00rootroot00000000000000#include #ifdef _MSC_VER # pragma warning(push) # pragma warning(disable : 4430) # pragma warning(disable : 4305) # pragma warning(disable : 4309) # pragma warning(disable : 4838) # pragma warning(disable : 4996) #elif defined(__clang__) # pragma clang diagnostic push # pragma clang diagnostic ignored "-Wsign-conversion" #elif defined(__GNUC__) # pragma GCC diagnostic push # pragma GCC diagnostic ignored "-Wsign-conversion" #endif #if defined(C4FLOAT_STD_ATOF) #include double doit(const char *s) { return atof(s); } #define C4_TO_REAL(s) doit(s) #elif defined(C4FLOAT_SSCANF_F) float doit(const char *s) { float val; sscanf(s, "%f", &val); return val; } #define C4_TO_REAL(s) doit(s) #elif defined(C4FLOAT_SSCANF_D) double doit(const char *s) { double val; sscanf(s, "%lf", &val); return val; } #define C4_TO_REAL(s) doit(s) #elif defined(C4FLOAT_IOSTREAM_F) #include float doit(const char *s) { std::stringstream ss; ss << s; float val; ss >> val; return val; } #define C4_TO_REAL(s) doit(s) #elif defined(C4FLOAT_IOSTREAM_D) #include double doit(const char *s) { std::stringstream ss; ss << s; double val; ss >> val; return val; } #define C4_TO_REAL(s) doit(s) #elif defined(C4FLOAT_IOSTREAM_D) #include double doit(const char *s) { std::stringstream ss; ss << s; double val; ss >> val; return val; } #define C4_TO_REAL(s) doit(s) #elif defined(C4FLOAT_FP_F_LIMITED) #include float doit(const char *s) { auto result = jkj::fp::from_chars_limited(s, s+strlen(s)); return result.to_float(); } #define C4_TO_REAL(s) doit(s) #elif defined(C4FLOAT_FP_D_LIMITED) #include double doit(const char *s) { auto result = jkj::fp::from_chars_limited(s, s+strlen(s)); return result.to_float(); } #define C4_TO_REAL(s) doit(s) #elif defined(C4FLOAT_FP_F_UNLIMITED) #include float doit(const char *s) { auto result = jkj::fp::from_chars_unlimited(s, s+strlen(s)); return result.to_float(); } #define C4_TO_REAL(s) doit(s) #elif defined(C4FLOAT_FP_D_UNLIMITED) #include double doit(const char *s) { auto result = jkj::fp::from_chars_unlimited(s, s+strlen(s)); return result.to_float(); } #define C4_TO_REAL(s) doit(s) #elif defined(C4FLOAT_FASTFLOAT_F) #include #include float doit(const char *s) { float result; fast_float::from_chars(s, s+strlen(s), result); return result; } #define C4_TO_REAL(s) doit(s) #elif defined(C4FLOAT_FASTFLOAT_D) #include #include double doit(const char *s) { double result; fast_float::from_chars(s, s+strlen(s), result); return result; } #define C4_TO_REAL(s) doit(s) #elif defined(C4FLOAT_STD_FROM_CHARS_F) #include #include float doit(const char *s) { float result; std::from_chars(s, s+strlen(s), result); return result; } #define C4_TO_REAL(s) doit(s) #elif defined(C4FLOAT_STD_FROM_CHARS_D) #include #include double doit(const char *s) { double result; std::from_chars(s, s+strlen(s), result); return result; } #define C4_TO_REAL(s) doit(s) #elif defined(C4FLOAT_RYU_F) #include float doit(const char *s) { float result; s2f(s, &result); return result; } #define C4_TO_REAL(s) doit(s) #elif defined(C4FLOAT_RYU_D) #include double doit(const char *s) { double result; s2d(s, &result); return result; } #define C4_TO_REAL(s) doit(s) #else #define C4_TO_REAL(s) 0 #endif int main() { #define BUFSIZE 128 char buf[BUFSIZE]; while(fgets(buf, BUFSIZE, stdin)) { fputs(buf, stdout); (void) C4_TO_REAL(buf); } } #ifdef _MSC_VER # pragma warning(pop) #elif defined(__clang__) # pragma clang diagnostic pop #elif defined(__GNUC__) # pragma GCC diagnostic pop #endif c4core-0.2.6/bm/ryu.cmake000066400000000000000000000023421477602032300151220ustar00rootroot00000000000000# ryu does not have a cmakelists if(C4CORE_BM_USE_RYU) enable_language(C) c4_download_remote_proj(ryu RYU_DIR GIT_REPOSITORY https://github.com/ulfjack/ryu GIT_TAG master GIT_SHALLOW ON) set(RYU_HDR ${RYU_DIR}/ryu/common.h ${RYU_DIR}/ryu/d2fixed_full_table.h ${RYU_DIR}/ryu/d2s_full_table.h ${RYU_DIR}/ryu/d2s_intrinsics.h ${RYU_DIR}/ryu/d2s_small_table.h ${RYU_DIR}/ryu/digit_table.h ${RYU_DIR}/ryu/f2s_full_table.h ${RYU_DIR}/ryu/f2s_intrinsics.h ${RYU_DIR}/ryu/ryu.h ${RYU_DIR}/ryu/ryu_parse.h ) set(RYU_SRC ${RYU_DIR}/ryu/d2fixed.c ${RYU_DIR}/ryu/d2s.c ${RYU_DIR}/ryu/f2s.c ${RYU_DIR}/ryu/s2d.c ${RYU_DIR}/ryu/s2f.c ) add_library(ryu_c4 ${RYU_SRC} ${RYU_HDR}) target_include_directories(ryu_c4 PUBLIC $) set_target_properties(ryu_c4 PROPERTIES LINKER_LANGUAGE CXX) if(CMAKE_CXX_COMPILER_ID STREQUAL GNU) target_compile_options(ryu_c4 PRIVATE -Wno-sign-conversion) elseif(CMAKE_CXX_COMPILER_ID STREQUAL GNU) target_compile_options(ryu_c4 -Wno-deprecated) endif() _c4_set_target_folder(ryu_c4 ext) endif() c4core-0.2.6/changelog/000077500000000000000000000000001477602032300146315ustar00rootroot00000000000000c4core-0.2.6/changelog/0.1.0.md000066400000000000000000000000301477602032300156000ustar00rootroot00000000000000# 0.1.0 First release. c4core-0.2.6/changelog/0.1.1.md000066400000000000000000000004231477602032300156070ustar00rootroot00000000000000# 0.1.1 - Fix parsing of hexadecimal floats ([2d5c3f0](https://github.com/biojppm/c4core/commits/2d5c3f0)) - Fix `csubstr::reverse_sub()` ([902c5b9](https://github.com/biojppm/c4core/commits/902c5b9)) - Fix [#35](https://github.com/biojppm/c4core/issues/35): add SO_VERSION c4core-0.2.6/changelog/0.1.10.md000066400000000000000000000164651477602032300157040ustar00rootroot00000000000000### Changes Improved the performance of `c4/charconv.hpp` functions ([PR#77](https://github.com/biojppm/c4core/pull/77)): - Added `digits_dec/hex/oct/bin()`. - Optimized `write_dec/hex/oct/bin()`: - these functions now return immediately without entering the loop if the output buffer is smaller than respectively `digits_dec/hex/oct/bin()`. This enables both: - writing every character in its final position without having to revert the string at the end - the need to check the buffer size on appending every character. - `write_dec()` now writes two digits at once, thus halving the number of integer divisions. - Added `write_dec/hex/oct/bin_unchecked()`, which receive precomputed `digits_dec/hex/oct/bin()`, thus speeding up the radix `itoa()/utoa()` overloads. - Added `xtoa()` radix+digits overloads: - `size_t xtoa(substr s, T v, T radix)` - `size_t xtoa(substr s, T v, T radix, size_t num_digits)` - `read_dec/hex/oct/bin()`: these functions no longer allow an empty input buffer. - Use intrinsic functions `__builtin_clz()` (gcc) / `_BitScanReverse()` (msvc) in `c4::msb()` and `__builtin_ctz()` (gcc) / `_BitScanForward()` (msvc) in `c4::lsb()` when they are available. `msb()` is used by `digits_hex()/digits_bin()`. - Refactored the charconv tests to improve consistency and thoroughness. - Improved the charconv benchmarks to ensure full consistency across benchmarks. - Special thanks and kudos to @fargies for being attentive and pinpointing several issues throughout the PR! - Finding the best approach involved [writing a R&D benchmark for the several algorithm components](https://github.com/biojppm/c4core/tree/master/bm/bm_xtoa.cpp). This benchmark is disabled by default, and can be enabled with the flag `C4CORE_BM_XTOA_RND`. - With the changes from this PR, the [charconv benchmark](https://github.com/biojppm/c4core/tree/master/bm_charconv.cpp) results show that on Linux/g++11.2, with integral types: - `c4::to_chars()` can be expected to be roughly... - ~40% to 2x faster than `std::to_chars()` - ~10x-30x faster than `sprintf()` - ~50x-100x faster than a naive `stringstream::operator<<()` followed by `stringstream::str()` - `c4::from_chars()` can be expected to be roughly... - ~10%-30% faster than `std::from_chars()` - ~10x faster than `scanf()` - ~30x-50x faster than a naive `stringstream::str()` followed by `stringstream::operator>>()` - Here are the results from the run: | Write throughput | | Read throughput | | |:-------------------------|--------:|:-------------------------|---------:| | **write `uint8_t`** | **MB/s**| **read `uint8_t`** | **MB/s**| | `c4::to_chars` | 526.86 | `c4::from_chars` | 163.06 | | `std::to_chars` | 379.03 | `std::from_chars` | 154.85 | | `std::sprintf` | 20.49 | `std::scanf` | 15.75 | | `std::stringstream` | 3.82 | `std::stringstream` | 3.83 | | **write `int8_t`** | **MB/s**| **read `int8_t`** | **MB/s**| | `c4::to_chars` | 599.98 | `c4::from_chars` | 184.20 | | `std::to_chars` | 246.32 | `std::from_chars` | 156.40 | | `std::sprintf` | 19.15 | `std::scanf` | 16.44 | | `std::stringstream` | 3.83 | `std::stringstream` | 3.89 | | **write `uint16_t`** | **MB/s**| **read `uint16_t`** | **MB/s**| | `c4::to_chars` | 486.40 | `c4::from_chars` | 349.48 | | `std::to_chars` | 454.24 | `std::from_chars` | 319.13 | | `std::sprintf` | 38.74 | `std::scanf` | 28.12 | | `std::stringstream` | 7.08 | `std::stringstream`| 6.73 | | **write `int16_t`** | **MB/s**| **read `int16_t`** | **MB/s**| | `c4::to_chars` | 507.44 | `c4::from_chars` | 282.95 | | `std::to_chars` | 297.49 | `std::from_chars` | 186.18 | | `std::sprintf` | 39.03 | `std::scanf` | 28.45 | | `std::stringstream` | 6.98 | `std::stringstream`| 6.49 | | **write `uint32_t`** | **MB/s**| **read `uint32_t`** | **MB/s**| | `c4::to_chars` | 730.12 | `c4::from_chars` | 463.95 | | `std::to_chars` | 514.76 | `std::from_chars` | 329.42 | | `std::sprintf` | 71.19 | `std::scanf` | 44.97 | | `std::stringstream` | 14.05 | `std::stringstream`| 12.57 | | **write `int32_t`** | **MB/s**| **read `int32_t`** | **MB/s**| | `c4::to_chars` | 618.76 | `c4::from_chars` | 345.53 | | `std::to_chars` | 394.72 | `std::from_chars` | 224.46 | | `std::sprintf` | 71.14 | `std::scanf` | 43.49 | | `std::stringstream` | 13.91 | `std::stringstream`| 12.03 | | **write `uint64_t`** | **MB/s**| **read `uint64_t`** | **MB/s**| | `c4::to_chars` | 1118.87 | `c4::from_chars` | 928.49 | | `std::to_chars` | 886.58 | `std::from_chars` | 759.03 | | `std::sprintf` | 140.96 | `std::scanf` | 91.60 | | `std::stringstream` | 28.01 | `std::stringstream`| 25.00 | | **write `int64_t`** | **MB/s**| **read `int64_t`** | **MB/s**| | `c4::to_chars` | 1198.78 | `c4::from_chars` | 713.76 | | `std::to_chars` | 882.17 | `std::from_chars` | 646.18 | | `std::sprintf` | 138.79 | `std::scanf` | 90.07 | | `std::stringstream` | 27.62 | `std::stringstream`| 25.12 | If you feel suspicious about these bold claims, you can browse through [c4core's CI benchmark results](https://github.com/biojppm/c4core/actions/workflows/benchmarks.yml) which will hopefully give these more substance. ### New features - Added `bool c4::overflows(csubstr s)` for detecting whether a string overflows a given integral type. See [PR#78](https://github.com/biojppm/c4core/pull/78). - Also, added `c4::fmt::overflow_checked()` (and the corresponding `from_chars()` overload) to enable a check for overflow before parsing from string: ```c++ c4::from_chars(str, &val); // no overflow check c4::from_chars(str, c4::fmt::overflow_checked(val)); // enable overflow check // as an example, the implementation looks like: template bool c4::from_chars(c4::csubstr str, c4::fmt::overflow_checked oc) { if(overflows(str)) return false; return c4::from_chars(str, oc.val); } ``` ### Fixes - Fix missing endianess macro on windows arm/arm64 compilations [PR #76](https://github.com/biojppm/c4core/pull/76) - Add missing `#define` for the include guard of the amalgamated header (see [rapidyaml#246](https://github.com/biojppm/rapidyaml/issues/246)). - Fix CPU detection with ARMEL [PR #86](https://github.com/biojppm/c4core/pull/86). - Fix GCC version detection [PR #87](https://github.com/biojppm/c4core/pull/87). - Fix [cmake#8](https://github.com/biojppm/cmake/issues/8): `SOVERSION` missing from shared libraries. - Update fastfloat to 3.5.1. ### Thanks - @fargies - @daichifukui - @janisozaur c4core-0.2.6/changelog/0.1.11.md000066400000000000000000000113461477602032300156760ustar00rootroot00000000000000 ### Breaking changes - `csubstr::operator==(std::nullptr_t)` now strictly checks if the pointer is null and no longer looks at the length ([rapidyaml#264](https://github.com/biojppm/rapidyaml/pull/264)): ```diff -bool csubstr::operator== (std::nullptr_t) const noexcept { return str == nullptr || len == 0; } -bool csubstr::operator!= (std::nullptr_t) const noexcept { return str != nullptr || len == 0; } +bool csubstr::operator== (std::nullptr_t) const noexcept { return str == nullptr; } +bool csubstr::operator!= (std::nullptr_t) const noexcept { return str != nullptr; } ``` - `to_substr(std::string &s)` and `to_csubstr(std::string const& s)` now point at the first element when the string is empty ([rapidyaml#264](https://github.com/biojppm/rapidyaml/pull/264#issuecomment-1264421024)): ```diff - return c4::substr(!s.empty() ? &s[0] : nullptr, s.size()); + return c4::substr(&s[0], s.size()); ``` This is OK because an empty `std::string` is guaranteed to have storage, so calling `s[0]` is safe. ### New features - `charconv.hpp`: added `xtoa()` floating-point overloads accepting precision and format ([PR#88](https://github.com/biojppm/c4core/pull/88)): ```c++ size_t xtoa(substr s, float v, int precision, RealFormat_e formatting=FTOA_FLEX) noexcept; size_t xtoa(substr s, double v, int precision, RealFormat_e formatting=FTOA_FLEX) noexcept; ``` - `memory_util.hpp`: added `ipow()` overloads for computing powers with integral exponents ([PR#88](https://github.com/biojppm/c4core/pull/88)). - Add `C4_NO_DEBUG_BREAK` preprocessor check to disable calls to `c4::debug_break()` (see [rapidyaml#326](https://github.com/biojppm/rapidyaml/issues/326)) - The cmake project conditionally enables this macro if the cmake option `C4CORE_NO_DEBUG_BREAK` is set to `ON`. ### Fixes - `substr`, `to_chars()`, charconv: ensure `memcpy()` is not called when the length is zero. Doing this is UB and enabled the optimizer to wreak havoc in the branches of calling code. See comments at [rapidyaml#264](https://github.com/biojppm/rapidyaml/pull/264#issuecomment-1262133637) for an example and fix. See [Raymond Chen's blog](https://devblogs.microsoft.com/oldnewthing/20140627-00/?p=633) for an explanation. - `atof()` and `atod()` ([PR#88](https://github.com/biojppm/c4core/pull/88)): - Always use the fastest implementation available: `std::from_chars()` if available (C++17 or higher standard, with later compilers), `fast_float::from_chars()` otherwise. On Visual Studio, `fast_float::from_chars()` is preferred over `std::from_chars()`. - If `std::from_chars()` is not available and `C4CORE_NO_FAST_FLOAT` is defined, then the fallback is based on `sscanf()`. - Ensure hexadecimal floats are accepted. The current fast_float implementation does not accept hexadecimal floats, so an hexfloat scanner was added. - Likewise for `ftoa()` and `dtoa()`. Prefer the fastest implementation available: `std::to_chars()`->`snprintf()`. - Change the `FTOA_*` enum values and type to save a function call when converting format. From now on, only the symbols of this enum can be relied on; the values or type will change depending on the selected implementation (`std::to_chars()` or `snprintf()`) ([PR#91](https://github.com/biojppm/c4core/pull/91)). - Fix [#84](https://github.com/biojppm/c4core/issues/84): `csubstr::compare(char)`: refactor to avoid false-positive warning from VS2022. - `csubstr` methods: add `noexcept` and annotations `C4_PURE` and `C4_ALWAYS_INLINE` - `csubstr`: add `C4_RESTRICT` to incoming string on `csubstr::compare()` - `csubstr::first_real_span()` ([PR#89](https://github.com/biojppm/c4core/pull/89)): - Refactor to fix number matching rules. Now fully valid for floating point numbers in decimal (eg `0.123/1.23e+01`), hexadecimal (eg `0x123.abc/0x1.23abcp+01`), binary (eg `0b101.10/0b1.0110p+01`) and octal format (eg `0o701.10/0o7.0110p+01`) , with or without exponent or power, in lower or upper case. - Also, make the number parsing stateful to fix cases where repeated characters occur, (like e.g. `0.1.0` or `1.23e+e10`) which are no longer reported as numbers (see [biojppm/rapidyaml#291](https://github.com/biojppm/rapidyaml/issues/291)). - `csubstr::first_int_span()`, `csubstr::first_uint_span()`: fix edge cases like e.g. `0xzz` which were wrongly reported as numbers. - Add fully qualified ARM detection macros: - `__ARM_ARCH_7EM__` ([PR#90](https://github.com/biojppm/c4core/pull/90)). - `__ARM_ARCH_6KZ__` ([PR#93](https://github.com/biojppm/c4core/pull/93)). - `__ARM_ARCH_8A__` ([#94](https://github.com/biojppm/c4core/issues/94)). - Improve linux and unix platform detection: detect both `__linux` and `__linux__` ([PR#92](https://github.com/biojppm/c4core/pull/92)). ### Thanks - @mlondono74 - @musicinmybrain - @pkubaj - @Gei0r c4core-0.2.6/changelog/0.1.2.md000066400000000000000000000004131477602032300156070ustar00rootroot00000000000000- Fix error macros (ie `C4_ERROR()`, `C4_CHECK()`, `C4_ASSERT()`, etc) such that they are a single statement - `is_debugger_attached()`: add MacOSX version - Add support for Visual Studio 2022 - Ensure `C4_LITTLE_ENDIAN` is always defined, even with mixed endianness c4core-0.2.6/changelog/0.1.3.md000066400000000000000000000001341477602032300156100ustar00rootroot00000000000000- Update fast_float to [3.2.1](https://github.com/fastfloat/fast_float/releases/tag/v3.2.0) c4core-0.2.6/changelog/0.1.4.md000066400000000000000000000003701477602032300156130ustar00rootroot00000000000000- [PR #38](https://github.com/biojppm/c4core/pull/38): add s390x architecture feature macros. - Fix compiler warnings after update of fast_float to [3.2.1](https://github.com/fastfloat/fast_float/releases/tag/v3.2.0). ### Thanks @musicinmybrain c4core-0.2.6/changelog/0.1.5.md000066400000000000000000000002031477602032300156070ustar00rootroot00000000000000- Add support for aarch64, s390x, ppc64le CPU architectures - Update debugbreak header (added support for the above architectures) c4core-0.2.6/changelog/0.1.6.md000066400000000000000000000001201477602032300156060ustar00rootroot00000000000000- Fix wrong version names in version 0.1.5 (was saying 0.1.4, should be 0.1.5) c4core-0.2.6/changelog/0.1.7.md000066400000000000000000000003101477602032300156100ustar00rootroot00000000000000- Fix build with C4CORE_NO_FAST_FLOAT ([#42](https://github.com/biojppm/c4core/pull/42)). - Fix clang warning in AIX/xlclang ([#44](https://github.com/biojppm/c4core/pull/44)). ### Thanks --- @mbs-c c4core-0.2.6/changelog/0.1.8.md000066400000000000000000000055111477602032300156210ustar00rootroot00000000000000 ### New features - Add amalgamation into a single header file ([PR #48](https://github.com/biojppm/c4core/pull/48)): - The amalgamated header will be available together with the deliverables from each release. - To generate the amalgamated header: ``` $ python tools/amalgamate.py c4core_all.hpp ``` - To use the amalgamated header: - Include at will in any header of your project. - In one - and only one - of your project source files, `#define C4CORE_SINGLE_HDR_DEFINE_NOW` and then `#include `. This will enable the function and class definitions in the header file. For example, here's a sample program: ```c++ #include #define C4CORE_SINGLE_HDR_DEFINE_NOW // do this before the include #include int main() { for(c4::csubstr s : c4::csubstr("a/b/c/d").split('/')) std::cout << s << "\n"; } ``` - Add `csubstr::is_unsigned_integer()` and `csubstr::is_real()` ([PR #49](https://github.com/biojppm/c4core/pull/49)). - CMake: add alias target c4core::c4core, guaranteeing that the same code can be used with `add_subdirectory()` and `find_package()`. (see [rapidyaml #173](https://github.com/biojppm/rapidyaml/issues/173)) - Add support for compilation with emscripten (WebAssembly+javascript) ([PR #52](https://github.com/biojppm/c4core/pull/52)). ### Fixes - Fix edge cases with empty strings in `span::first()`, `span::last()` and `span::range()` ([PR #49](https://github.com/biojppm/c4core/pull/49)). - Accept octal numbers in `substr::first_real_span()` and `substr::is_real()` ([PR #49](https://github.com/biojppm/c4core/pull/49)). - `substr`: fix coverage misses in number query methods ([PR #49](https://github.com/biojppm/c4core/pull/49)). - Use single-header version of fast_float ([PR #49](https://github.com/biojppm/c4core/pull/47)). - Suppress warnings triggered from fast_float in clang (`-Wfortify-source`) ([PR #49](https://github.com/biojppm/c4core/pull/47)). - Add missing `inline` in [src/c4/ext/rng/rng.hpp](src/c4/ext/rng/rng.hpp) ([PR #49](https://github.com/biojppm/c4core/pull/47)). - Fix compilation of [src/c4/ext/rng/inplace_function.h](src/c4/ext/inplace_function.h) in C++11 ([PR #49](https://github.com/biojppm/c4core/pull/47)). - Change order of headers, notably in `windows_push.hpp` ([PR #47](https://github.com/biojppm/c4core/pull/47)). - In `c4/charconv.hpp`: do not use C4_ASSERT in `to_c_fmt()`, which is `constexpr`. - Fix [#53](https://github.com/biojppm/c4core/issues/53): cmake install targets were missing call to `export()` ([PR #55](https://github.com/biojppm/c4core/pull/55)). - Fix linking of subprojects with libc++: flags should be forwarded through `CMAKE_***_FLAGS` instead of being set explicitly per-target ([PR #54](https://github.com/biojppm/c4core/pull/54)). ### Thanks - @cschreib c4core-0.2.6/changelog/0.1.9.md000066400000000000000000000062531477602032300156260ustar00rootroot00000000000000### Breaking changes - fix [#63](https://github.com/biojppm/c4core/issues/63): remove `c4/time.hpp` and `c4/time.cpp` which prevented compilation in bare-metal mode ([PR #64](https://github.com/biojppm/c4core/issues/64)). ### New features - Added decoding of UTF codepoints: `c4::decode_code_point()` ([PR #65](https://github.com/biojppm/c4core/issues/65)). - Experimental feature: add formatted-dumping facilities: using semantics like `c4::cat()`, `c4::catsep()` and `c4::format()`, where the subject is not a string buffer but a dump callback accepting strings. This still requires a string buffer for serialization of non-string types, but the buffer's required size is now limited to the max serialized size of non-string arguments, in contrast to the requirement in `c4::cat()` et al which is the total serialized size of every argument. This enables very efficient and generic printf-like semantics with reuse of a single small buffer, and allows direct-printing to terminal or file ([PR #67](https://github.com/biojppm/c4core/issues/67)). This feature is still experimental and a minor amount of changes to the API is possible. - Added macro `C4_IF_CONSTEXPR` resolving to `if constexpr (...)` if the c++ standard is at least c++17. - `csubstr`: add `count(csubstr)` overload. - Add support for RISC-V architectures ([PR #69](https://github.com/biojppm/c4core/issues/69)). - Add support for bare-metal compilation ([PR #64](https://github.com/biojppm/c4core/issues/64)). - gcc >= 4.8 support using polyfills for missing templates and features ([PR #74](https://github.com/biojppm/c4core/pull/74) and [PR #68](https://github.com/biojppm/c4core/pull/68)). ### Fixes - `csubstr::operator==(std::nullptr_t)` now returns true if either `.str==nullptr` or `.len==0`. - Fix: `bool operator==(const char (&s)[N], csubstr)` and `operator==(const char (&s)[N], substr)`. The template declaration for these functions had an extra `const` which prevented these functions to participate in overload resolution, which in some cases resulted in calls resolving to `operator==(std::string const&, csubstr)` if that header was visible ([PR #64](https://github.com/biojppm/c4core/issues/64)). - Fix `csubstr::last_not_of()`: optional positional parameter was ignored [PR #62](https://github.com/biojppm/c4core/pull/62). - `atof()`, `atod()`, `atox()`, `substr::is_real()`, `substr::first_real_span()`: accept `infinity`, `inf` and `nan` as valid reals [PR #60](https://github.com/biojppm/c4core/pull/60). - Add missing export symbols [PR #56](https://github.com/biojppm/c4core/pull/56), [PR #57](https://github.com/biojppm/c4core/pull/57). - `c4/substr_fwd.hpp`: fix compilation failure in Xcode 12 and earlier, where the forward declaration for `std::allocator` is inside the `inline namespace __1`, unlike later versions [PR #61](https://github.com/biojppm/c4core/pull/61), reported in [rapidyaml#185](https://github.com/biojppm/rapidyaml/issues/185). - `c4/error.hpp`: fix compilation failure in debug mode in Xcode 12 and earlier: `__clang_major__` does not mean the same as in the common clang, and as a result the warning `-Wgnu-inline-cpp-without-extern` does not exist there. ### Thanks - @danngreen - @Xeonacid - @aviktorov - @fargies c4core-0.2.6/changelog/0.2.0.md000066400000000000000000000146101477602032300156120ustar00rootroot00000000000000### Breaking changes - [#PR101](https://github.com/biojppm/c4core/pull/101): As part of the `substr` ctor cleanup, the `to_substr(char (&arr)[N])` overload no longer decays to `char*` inside. This changes calling code by now returning a `substr` with length equal to `N-1` instead of `strlen(arr)` as before: ```c++ // longer than "foo", ie longer than {'f', 'o', 'o', '\0'}: char arr[] = "foo\0\0\0\0\0\0"; assert(strlen(arr) == 3); assert(sizeof(arr) == 9); // previously: assert(to_substr(arr).len == 3); // now: assert(to_substr(arr).len == 9); // the breaking change happens only with arrays: assert(to_substr((char*)ptr).len == 3); // as before ``` - [PR#111](https://github.com/biojppm/c4core/pull/111) - Rename formatting overloads accepting `c4::append`: - `catrs(append_t, ...) -> catrs_append(...)` - `catseprs(append_t, ...) -> catseprs_append(...)` - `formatrs(append_t, ...) -> formatrs_append(...)` ### New features - [#PR101](https://github.com/biojppm/c4core/pull/101): For `substr` and `csubstr`: - add simultaneous ctors from `char[]` and `char*`. Using SFINAE to narrow the `char*` overload prevents it from overriding the `char[]` overload. Thanks to @huangqinjin for the idea (see [#97](https://github.com/biojppm/c4core/issues/97)). - remove unneeded constructors of `csubstr` from non-const chars. - to each single-argument ctor, add corresponding functions `to_csubstr()` and `to_substr()` to enable clients coercing their types in generic code such as `c4::cat()` and `c4::format()`. - Add interop with `std::string_view` when the standard is at least C++17 ([#PR101](https://github.com/biojppm/c4core/pull/101)): - provided in the header [`c4/std/string_view.hpp`](src/c4/std/string_view.hpp) - similarly to existing interop headers, this is opt-in and requires explicit inclusion - implemented: - `to_csubstr()` (since `std::string_view` is not writeable, cannot provide `to_csubstr()`) - `to_chars()` (since `std::string_view` is not writeable, cannot provide `from_chars()`) - comparison operators - `substr`: split `.first_not_of()` and `.last_not_of()` into different overloads, removing the defaulted `start` parameter: - `.first_not_of(T, start=0)` -> `.first_not_of(T)` , `.first_not_of(T, start)` - `.last_not_of(T, start=npos)` -> `.first_not_of(T)` , `.first_not_of(T, npos)` This may or may not result in a speedup. - [PR#105](https://github.com/biojppm/c4core/pull/105): Add macros in `c4/language.hpp` for compile-time flow of exceptions: - `C4_EXCEPTIONS`: defined when exceptions are enabled - `C4_IF_EXCEPTIONS(code_with_exc, code_without_exc)`: select statements for exceptions enabled/disabled - `C4_IF_EXCEPTIONS_(code_with_exc, code_without_exc)`: select code tokens for exceptions enabled/disabled - [PR#105](https://github.com/biojppm/c4core/pull/105): Add macros in `c4/language.hpp` for compile-time flow of RTTI: - `C4_RTTI`: defined when rtti is enabled - `C4_IF_RTTI(code_with_rtti, code_without_rtti)`: select statements for rtti enabled/disabled - `C4_IF_RTTI_(code_with_rtti, code_without_rtti)`: select code tokens for rtti enabled/disabled - [PR#109](https://github.com/biojppm/c4core/pull/109): Add partial support for XTENSA processors (missing implementation of `c4::aalloc()`). See [rapidyaml#358](https://github.com/biojppm/rapidyaml/issues/358). - [PR#119](https://github.com/biojppm/c4core/pull/119) Add LoongArch cpu support. - Add compiler annotation helper macros: `C4_ASSUME`, `C4_NODISCARD`, `C4_DEPRECATED`, `C4_UNREACHABLE_AFTER_ERR` ### Fixes - Fix [#126](https://github.com/biojppm/c4core/issues/126): bad `Exception` being used with `C4_ERROR_THROWS_EXCEPTION`. - [PR#132](https://github.com/biojppm/c4core/pull/132): - Fix typo `C_4MSVC_VERSION_2019` in `src/compiler.hpp` ([#124](https://github.com/biojppm/c4core/issues/124)). - Add check for definition of `__GNUC__` in `gcc-4.8.hpp` ([#125](https://github.com/biojppm/c4core/issues/125)). - [PR#121](https://github.com/biojppm/c4core/pull/121) - Fix compile on armv8 due to broken macro definition; see [#122](https://github.com/biojppm/c4core/issues/122) and [#94](https://github.com/biojppm/c4core/issues/94). - [PR#129](https://github.com/biojppm/c4core/pull/129) - Support android by enabling `aalloc()`'s call to `memalign()`, available for API 16+. - [PR#115](https://github.com/biojppm/c4core/pull/115) - Refactor of `c4::blob`/`c4::cblob`. Use SFINAE to invalidate some of the constructors. - [PR#110](https://github.com/biojppm/c4core/pull/110)/[PR#107](https://github.com/biojppm/c4core/pull/107) - Update fast_float. - [PR#108](https://github.com/biojppm/c4core/pull/108) - Fix preprocessor concatenation of strings in `C4_NOT_IMPLEMENTED_MSG()` and `C4_NOT_IMPLEMENTED_IF_MSG()`. - [PR#106](https://github.com/biojppm/c4core/pull/106) - Fix include guard in the gcc 4.8 compatibility header, causing it to be missing from the amalgamated header. See also [#125](https://github.com/biojppm/c4core/issues/125): there was no check for `__GNUC__` being defined. - [PR#123](https://github.com/biojppm/c4core/pull/123) - Ensure the gcc 4.8 compatibility header is installed (fixes [#103](https://github.com/biojppm/c4core/issues/103)). - [PR#105](https://github.com/biojppm/c4core/pull/105) - Fix existing throw in `c4/ext/sg14/inplace_function.h`. Ensure tests run with exceptions disabled and RTTI disabled. Add examples of exceptional control flow with `setjmp()/std::longjmp()`. - [PR#104](https://github.com/biojppm/c4core/pull/104)/[PR#112](https://github.com/biojppm/c4core/pull/112) - Fix pedantic warnings in gcc, clang and MSVC - [PR#104](https://github.com/biojppm/c4core/pull/104) - Fix possible compile error when `__GNUC__` is not defined - Inject explicit `#include ` on the amalgamated header. The amalgamation tool was filtering all prior includes, thus causing a compilation error. Addresses [rapidyaml#364](https://github.com/biojppm/rapidyaml/issues/364). - [PR#117](https://github.com/biojppm/c4core/pull/117): Windows: fix compilation with MSVC/clang++. - Windows: add missing `C4CORE_EXPORT` to `c4::base64_valid()`, `c4::base64_encode()` and `c4::base64_decode()`. - [rapidyaml#390](https://github.com/biojppm/rapidyaml/issues/390) - fix `csubstr.first_real_span()` when the exponent only has one digit (see [fae7106](https://github.com/biojppm/c4core/commit/fae71067acd5439ec7b11d47f55bd99e6e3bbc65)) ### Thanks - @huangqinjin - @zangruochen - @yrHeTaTeJlb c4core-0.2.6/changelog/0.2.1.md000066400000000000000000000000561477602032300156120ustar00rootroot00000000000000- `atod()`: add missing assertion str.len > 0 c4core-0.2.6/changelog/0.2.2.md000066400000000000000000000012741477602032300156160ustar00rootroot00000000000000 - Amalgamate: fix include of `` (see [rapidyaml#445](https://github.com/biojppm/biojppm/pull/445)). - Add `C4_MINGW` ([PR#139](https://github.com/biojppm/c4core/pull/139)) - Annotate `c4::handle_error()` with `[[noreturn]]` ([PR#137](https://github.com/biojppm/c4core/pull/137)). - Add `bool from_chars(csubstr s, fmt::overflow_checked_ *wrapper)`. There was already a function receiving `&wrapper`, but `*wrapper` was missing for use with generic code. - Ensure `posix_memalign()` is never called with bad alignment values ([PR#138](https://github.com/biojppm/c4core/pull/138)) - Update fast_float to v6.1.1 ([PR#136](https://github.com/biojppm/c4core/pull/136)) ### Thanks - @toge c4core-0.2.6/changelog/0.2.3.md000066400000000000000000000024061477602032300156150ustar00rootroot00000000000000- [PR#147](https://github.com/biojppm/c4core/pull/147): Add utf utilities: - `c4::first_non_bom()` - `c4::get_bom()` - `c4::skip_bom()` - [PR#148](https://github.com/biojppm/c4core/pull/148): Improvements in dump.hpp: - add traits class `c4::dump_directly` to enable selection of faster path where the intermediate dump buffer is not used for strings which can be directly dumped to the sink - improve `c4::format_dump_resume()` to ensure the needed buffer size is still computed after buffer exhaustion - [PR#148](https://github.com/biojppm/c4core/pull/148): add `noexcept` to `c4::overflows` - [PR#148](https://github.com/biojppm/c4core/pull/148): Add support for mips, mipsel, mips64, mips64el CPU architectures - [PR#148](https://github.com/biojppm/c4core/pull/148): Add support for sparc, sparc64 CPU architectures - [PR#148](https://github.com/biojppm/c4core/pull/148) and [PR#12 cmake](https://github.com/biojppm/cmake/pull/12): Add support for loongarch, loongarch64 architectures - [PR#148](https://github.com/biojppm/c4core/pull/148): Improve CPU detection in armv4 and armv5 - [PR#144](https://github.com/biojppm/c4core/pull/144): Include `` for `ptrdiff_t` usage - Minor improvements to doxygen documentation ### Thanks - @huajingyun01 - @mbrukman c4core-0.2.6/changelog/0.2.4.md000066400000000000000000000002361477602032300156150ustar00rootroot00000000000000- Add header `c4/version.hpp`: - `c4::version()` - `c4::version_major()` - `c4::version_minor()` - `c4::version_patch()` - Update fast_float to 8.0.0 c4core-0.2.6/changelog/0.2.5.md000066400000000000000000000001241477602032300156120ustar00rootroot00000000000000- [PR#149](https://github.com/biojppm/c4core/pull/149): Fix warnings from `-Wundef` c4core-0.2.6/changelog/0.2.6.md000066400000000000000000000001241477602032300156130ustar00rootroot00000000000000- [PR#150](https://github.com/biojppm/c4core/pull/149): fix configure with cmake 4. c4core-0.2.6/changelog/current.md000066400000000000000000000000001477602032300166230ustar00rootroot00000000000000c4core-0.2.6/cmake/000077500000000000000000000000001477602032300137625ustar00rootroot00000000000000c4core-0.2.6/compat.cmake000066400000000000000000000007431477602032300151730ustar00rootroot00000000000000 # old gcc-4.8 support if((CMAKE_CXX_COMPILER_ID STREQUAL "GNU") AND (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 4.8) AND (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0)) c4_install_files( "${CMAKE_CURRENT_LIST_DIR}/cmake/compat/c4/gcc-4.8.hpp" "include" "${CMAKE_CURRENT_LIST_DIR}/cmake/compat") # c++17 compiler required set(C4CORE_BUILD_BENCHMARKS OFF CACHE BOOL "" FORCE) # LLVM required set(C4CORE_SANITIZE OFF CACHE BOOL "" FORCE) endif() c4core-0.2.6/doc/000077500000000000000000000000001477602032300134475ustar00rootroot00000000000000c4core-0.2.6/doc/img/000077500000000000000000000000001477602032300142235ustar00rootroot00000000000000linux-x86_64-gxx12.1-Release-c4core-bm-charconv-atof-mega_bytes_per_second-double.png000077700000000000000000000000001477602032300530712linux-x86_64-gxx12.1-Release/c4core-bm-charconv-atof-mega_bytes_per_second-double.pngustar00rootroot00000000000000c4core-0.2.6/doc/imglinux-x86_64-gxx12.1-Release-c4core-bm-charconv-atof-mega_bytes_per_second-float.png000077700000000000000000000000001477602032300525572linux-x86_64-gxx12.1-Release/c4core-bm-charconv-atof-mega_bytes_per_second-float.pngustar00rootroot00000000000000c4core-0.2.6/doc/imglinux-x86_64-gxx12.1-Release-c4core-bm-charconv-atox-mega_bytes_per_second-i16.png000077700000000000000000000000001477602032300514072linux-x86_64-gxx12.1-Release/c4core-bm-charconv-atox-mega_bytes_per_second-i16.pngustar00rootroot00000000000000c4core-0.2.6/doc/imglinux-x86_64-gxx12.1-Release-c4core-bm-charconv-atox-mega_bytes_per_second-i32.png000077700000000000000000000000001477602032300514032linux-x86_64-gxx12.1-Release/c4core-bm-charconv-atox-mega_bytes_per_second-i32.pngustar00rootroot00000000000000c4core-0.2.6/doc/imglinux-x86_64-gxx12.1-Release-c4core-bm-charconv-atox-mega_bytes_per_second-i64.png000077700000000000000000000000001477602032300514152linux-x86_64-gxx12.1-Release/c4core-bm-charconv-atox-mega_bytes_per_second-i64.pngustar00rootroot00000000000000c4core-0.2.6/doc/imglinux-x86_64-gxx12.1-Release-c4core-bm-charconv-atox-mega_bytes_per_second-i8.png000077700000000000000000000000001477602032300512512linux-x86_64-gxx12.1-Release/c4core-bm-charconv-atox-mega_bytes_per_second-i8.pngustar00rootroot00000000000000c4core-0.2.6/doc/imglinux-x86_64-gxx12.1-Release-c4core-bm-charconv-atox-mega_bytes_per_second-u16.png000077700000000000000000000000001477602032300514372linux-x86_64-gxx12.1-Release/c4core-bm-charconv-atox-mega_bytes_per_second-u16.pngustar00rootroot00000000000000c4core-0.2.6/doc/imglinux-x86_64-gxx12.1-Release-c4core-bm-charconv-atox-mega_bytes_per_second-u32.png000077700000000000000000000000001477602032300514332linux-x86_64-gxx12.1-Release/c4core-bm-charconv-atox-mega_bytes_per_second-u32.pngustar00rootroot00000000000000c4core-0.2.6/doc/imglinux-x86_64-gxx12.1-Release-c4core-bm-charconv-atox-mega_bytes_per_second-u64.png000077700000000000000000000000001477602032300514452linux-x86_64-gxx12.1-Release/c4core-bm-charconv-atox-mega_bytes_per_second-u64.pngustar00rootroot00000000000000c4core-0.2.6/doc/imglinux-x86_64-gxx12.1-Release-c4core-bm-charconv-atox-mega_bytes_per_second-u8.png000077700000000000000000000000001477602032300513012linux-x86_64-gxx12.1-Release/c4core-bm-charconv-atox-mega_bytes_per_second-u8.pngustar00rootroot00000000000000c4core-0.2.6/doc/imglinux-x86_64-gxx12.1-Release-c4core-bm-charconv-ftoa-mega_bytes_per_second-double.png000077700000000000000000000000001477602032300530712linux-x86_64-gxx12.1-Release/c4core-bm-charconv-ftoa-mega_bytes_per_second-double.pngustar00rootroot00000000000000c4core-0.2.6/doc/imglinux-x86_64-gxx12.1-Release-c4core-bm-charconv-ftoa-mega_bytes_per_second-float.png000077700000000000000000000000001477602032300525572linux-x86_64-gxx12.1-Release/c4core-bm-charconv-ftoa-mega_bytes_per_second-float.pngustar00rootroot00000000000000c4core-0.2.6/doc/imglinux-x86_64-gxx12.1-Release-c4core-bm-charconv-xtoa-mega_bytes_per_second-i16.png000077700000000000000000000000001477602032300514072linux-x86_64-gxx12.1-Release/c4core-bm-charconv-xtoa-mega_bytes_per_second-i16.pngustar00rootroot00000000000000c4core-0.2.6/doc/imglinux-x86_64-gxx12.1-Release-c4core-bm-charconv-xtoa-mega_bytes_per_second-i32.png000077700000000000000000000000001477602032300514032linux-x86_64-gxx12.1-Release/c4core-bm-charconv-xtoa-mega_bytes_per_second-i32.pngustar00rootroot00000000000000c4core-0.2.6/doc/imglinux-x86_64-gxx12.1-Release-c4core-bm-charconv-xtoa-mega_bytes_per_second-i64.png000077700000000000000000000000001477602032300514152linux-x86_64-gxx12.1-Release/c4core-bm-charconv-xtoa-mega_bytes_per_second-i64.pngustar00rootroot00000000000000c4core-0.2.6/doc/imglinux-x86_64-gxx12.1-Release-c4core-bm-charconv-xtoa-mega_bytes_per_second-i8.png000077700000000000000000000000001477602032300512512linux-x86_64-gxx12.1-Release/c4core-bm-charconv-xtoa-mega_bytes_per_second-i8.pngustar00rootroot00000000000000c4core-0.2.6/doc/imglinux-x86_64-gxx12.1-Release-c4core-bm-charconv-xtoa-mega_bytes_per_second-u16.png000077700000000000000000000000001477602032300514372linux-x86_64-gxx12.1-Release/c4core-bm-charconv-xtoa-mega_bytes_per_second-u16.pngustar00rootroot00000000000000c4core-0.2.6/doc/imglinux-x86_64-gxx12.1-Release-c4core-bm-charconv-xtoa-mega_bytes_per_second-u32.png000077700000000000000000000000001477602032300514332linux-x86_64-gxx12.1-Release/c4core-bm-charconv-xtoa-mega_bytes_per_second-u32.pngustar00rootroot00000000000000c4core-0.2.6/doc/imglinux-x86_64-gxx12.1-Release-c4core-bm-charconv-xtoa-mega_bytes_per_second-u64.png000077700000000000000000000000001477602032300514452linux-x86_64-gxx12.1-Release/c4core-bm-charconv-xtoa-mega_bytes_per_second-u64.pngustar00rootroot00000000000000c4core-0.2.6/doc/imglinux-x86_64-gxx12.1-Release-c4core-bm-charconv-xtoa-mega_bytes_per_second-u8.png000077700000000000000000000000001477602032300513012linux-x86_64-gxx12.1-Release/c4core-bm-charconv-xtoa-mega_bytes_per_second-u8.pngustar00rootroot00000000000000c4core-0.2.6/doc/imgc4core-0.2.6/doc/img/linux-x86_64-gxx12.1-Release/000077500000000000000000000000001477602032300210025ustar00rootroot00000000000000c4core-bm-charconv-atof-mega_bytes_per_second-double.png000066400000000000000000001060601477602032300335250ustar00rootroot00000000000000c4core-0.2.6/doc/img/linux-x86_64-gxx12.1-Release‰PNG  IHDR‰งy@9tEXtSoftwareMatplotlib version3.5.1, https://matplotlib.org/ุa๒ฝ pHYsaaจ?งi‹IDATxœ์y\อู๐ืm/-hb*ป๊JeiตคฌูMvc!ฦ c อ0Œ}ษ๒d—]๖Jdd™รจ›hั=ฟ?<๚\Ÿ6aฏ็ใq๎็œฯ9๏ฯ็ๅ๙,W!„ """"zNI@DDDD๏&‰DDDD$ร$‘ˆˆˆˆd˜$‘ “D""""’a’HDDDD2L‰ˆˆˆH†I"ษ0I$""""&‰D๙HJJ‚Bกภฬ™3K:”|5nNNN%F‘) >ผคร R$:: …ััั%สฏo฿พ055-้0จโ๕๕*฿%“&M‚Bกxkฑผ*&‰๔NKLLฤคI“””Tาก•ˆcวŽaาคIHII)Rห—/#$$žžž022‚Bกศ๗ฃP( P(0`ภ€<หว/ีy๐เA1ทเญ^ฝs็ฮ}ํv%๏ใ6ๅb’H๏ดฤฤD„††2IคึฑcวZไ$๑๘๑ใ˜7oาาาPทnB๋แ?@VV–ฌ์๗฿‡‘‘ัซ†œฏโ$Tพพพx๚๔)|}}฿Xo“DzŸ1I$ขทJงOŸ–tฅNzzzฑึ BJJ ะฃGB๋ทhัjตQQQZห;†7n u๋ึลŠใuedd@ฃั@GGFFFะัแืี‡€Ÿ๏พ๋จDผyC‡Eํฺตall KKKt้าEkฦp๙๒ๅ่าฅ  I“&าaฏฯYธp!ahhˆส•+cุฐaZ3.}๚๔‘‘.^ผจี`` ส•+‡ไไไ"ล;gฮฺฺุยุุ~~~8ผฌฮฅK—ะนsg”/_FFFpwwว–-[ด๊,_พ …GลจQฃPกB”)S:tภ?#k3** ~~~033ƒนน9<<<ฐz๕jYฝฤฤD4iา&&&ฐฑฑม๔้ำตสsฯปYทnBCCacc333t๎ฉฉฉศฬฬฤศ‘#aeeSSS๔๋ื™™™Zm,[ถ M›6…•• แเเ€_~๙E‹ฺดiƒ]ปvมฦฦฦXดhQพ๛v๒ไษะััม๙๓ฅeทnยฅK—๒]็E˜4ijีช###TชT ;vฤตkืค:้้้=z4ชVญ CCCิฎ]3gฮ„Bซญs&7mฺ'''ยัั;w๎”๊lุฐ …”ลฒhั"( ญืวซผ.<ˆกC‡ยสส UชTมคI“0fฬ€ฝฝฝ๔(hfฝ|๙๒033+าพ๘๚๚ส^WP*•E>็5-- #GŽ„ aee…ๆอ›ใฬ™3žŸ?ป}๛vผySฺ;;;๚\ณf พ๖[ุุุภฤฤjต:ฯsฦrฯล-์u<ฌ B™2e`ee…์ฺตKึๆีซWัฉS'TฌXFFFจRฅ ‚ƒƒ‘ššš๏6ดMp}๔๏฿ึึึ022‚ณณ3~๛ํท"ํฯ๗ั‘#GPฟ~}กZตjXฑb…Vฝฮaห}Mฝ๘Zษm3::Zzo*•Ji?DFFBฉTยศศnnn8{๖lžฑ]ฟ~(Sฆ *WฎŒ๏ฟ^๖^าh4˜;w.addkkk 4=สs;๓๚ผุณgผฝฝQถlY˜ššขvํฺ๘ๆ›oดึ•ฯŠ;w๎ }๛๖Zฏ…—?็rญ_ฟnnn066ฦG}„ž={โฏฟาชำธqc4nXถn฿พ}ต^/*สwI^VญZ%ลSพ|yใ๖ํEZ๗ตขฐ~zแ์์,พ๛๎;ฑx๑b๑อ7฿ˆrๅส [[[‘žž.„โฺตkโ‹/พฤ7฿|#Vฎ\)Vฎ\)๎ฝ+„bโฤ‰€๐๗๗๓็ฯร‡บบบยรรCdee !„x๔่‘จRฅŠ๐๐๐ฯž=B.ˆ•+Wใ7กT*…๘้งŸDhhจ(_พผจPก‚‡Bœ?^XXX๑ำO?‰ ___กP(DddคToูฒe€puuM›6๓็ฯฃGบบบขkืฎZ/[ถL( แไไ$ฆL™"ยยยฤ€Dฏ^ฝค:~~~ขrๅสขjีชbฤˆbแย…ขiำฆ€ุฑc‡T๏ภ€pqq5๓ๆอ_|๑…P("88Xt๏]ดlูR„……‰^ฝz "44T+ัทo_1gฮ1| ˆ hีณตต5jิๅส•cวŽแแแโภB!ˆaร†Iuว/ …XผxฑV~~~ข(Oฯž=อš5DppฐXฐ`˜:uชhฺดฉุดi“BF#š6m* …0`€Xฐ`hถญ FŽฉีแ์์,*Uช$~๘แ1w๎\QญZ5abb"/ห}Mฝ8๖นmVชTILš4Iฬ™3GุุุSSSฑjี*๑๑ว‹iำฆ‰iำฆ QฃF ‘““#ญ฿งOadd$jึฌ)z๕๊%,X ฺดi#ˆ &h๕?`ภกงง'(ยรรลื_-ส”)ฃ๕๙œS^Ÿ็ฯŸย]๓ฯ"<<\|๙ๅ—ยืืWซŸข~V๙D,\ธP„††Š>๚Hฯภ$‘Jฤ“'OdหŽ?.ˆ+VHหึฏ_/{ !ฤ๛๗…ะ๚[ฐ` ~๕Wiูฎ]ป1y๒dq๚uajj*ฺทo_hŒนolcccq็ฮi๙‰'"-kึฌ™P*•"##CZฆัh„งงงจYณฆด,๗รว฿฿_h4iyHHˆะีี)))B!RRR„™™™hะ x๚๔ฉV\/ฎ—๛๙โ>หฬฬ+V:u’–ๅ~ั:99i}@w๋ึM( ัฒeKญ>5jค๕!'Dc(ชUซฆตฬึึV;w๎”ี1I=zดะััห—/—ี+๊ฏฟ*ˆูณgหสr๗ำฆM›ค๑Q็ฮ…Bก๙งV|Zหโใใ1|iYทn„•••๔‡B๗฿BGGG|๗าฒW}]x{{kต)Dแ‰^AŠš$๛๏ฟยภภ@๚วi๛๖ํBกPˆคคค"'‰Zไฅu๋ึฒื•๚ฌVญš์u–_’X”ืฌYณ้!„x๚๔ฉจSงŽV›gฯžฤ๚๕๋ ŒUถi๎น€”$ !DVV–hิจ‘055jตบภvs฿G‡’–ฟ_ŠัฃGKห^5I Ž;&-ห|4667o”–/ZดHถ฿๛๔้#ˆฯ?\ZฆัhD๋ึญ…๔9|๘ฐ """ดbฺนsงly~Ÿsๆฬ)า๋ฎจŸนใฑn:iYzzบจQฃ†ึvfee +++แไไค๕ูปm6@|๗wZ}ฟJ’X”๏’—ว3))I่๊๊Š)Sฆh๕‘ ๔๔๔dห฿4nฆall,‡ขF([ถฌtxช {๗๎EVVFŽฉuฎาภannŽํทKห0hะ |๗ุ่ฑ#ŒŒŒ <๙ฒ๖ํรฦฦFz^ฟ~}4hะ;v์๛๏ฟุฟ?บvํŠดด4ม๛๗ตWnุฐŸ|๒ €โฝ.]]Bท๛M+WฎZดh฿ภ๓‹1<==akk[ไ6ส–-‹'N๙Žผ๔้ำG๋uVขผ๎w๎ IหŒŒŒ0pเ@ญถ,,,ปvํย“'OŠ‹v์ุŠ+ข[ทnา2}}}|๑ลx๘qžง+ผฬมม>>>า๓ * vํฺyพท‹สมม5’ž7hะะดiS|๑วฒๅy๕๕โmฌrOัศสสยฝ{๛์3ญzฑฑฑธ>†ช๕ูบukิฉSG๋ปๅU๖]’—ศศHh4tํฺUk_VฌX5kึ”ํห7I"•ˆงOŸโป๏พ“ฮ๛่ฃPกBคคคxPฎdชvํฺZห PญZ5ฉ<ืฬ™3Qพ|yฤลลaผyฐฒฒ*rฌ5kึ”-ซUซ–tฎฯŸ !&L˜€ *h=&Nœเ๙นI/z๑รx% @:_'๗|บขœVฅJYโXฎ\9ูน?y๕›๛ๅXตjUูrFฃ5G…ฟฟ?ส”)ƒฒeหขB… า๙Ay%‰๙Yฑbยยย0|ญ/ะโธvํjืฎ ==ฝ|๋ผy•+W–ง—{ๅ๏หฏ•—๗ ฿Ÿ-Zด€……ึฎ]+-[ปv-\\\PซV-ล{]ด฿ถ๎ปcฯž=ธu๋6mฺ„๎ปฟา๚ำงOว๙๓็QตjUิฏ_“&MzๅdๆUถฟ(ฏ๛›7oขz๕๊ฒz5jิ๕;jิ(,]บ}๔Vคฯขผy5kึ”]p“฿๋./Ey-พชW๙ ๋KGGีชUำZ–๛šฯLผz๕*RSSaee%{ํ?~ธHฏ๛O>๙^^^0`ฌญญŒu๋ึ˜0ไๆอ›จQฃ†์ต๐๒wH~฿-PงN"[~ ๛.ษหีซW!„@อš5e๛๒โล‹ฒ}๙ฆๅษJ๔}๙็XถlFމFมยย …มมมล(ศูณgฅ7SBBยk''/ส๗ห/ฟฬw๖์ๅ/ฅf‹Š๒๑ห^ฅญ๊ึฦตkืะฌY3ิฉSณgฯFีชUa``€;v`ฮœ9ฒ1+h6ศหห qqqXฐ`บvํŠ๒ๅห็[ท$eข}๛๖ุธq#.\ˆ{๗๎แ่ัฃ๘๑วฅ:ลy]uํm ‚กก!๚๔้ƒฬฬLtํฺ๕•ึ๏ฺต+|||ฐqใF์ฝ3fฬภO?„ศศHดlูฒHmผส๖ฟษ๗ฬš5 }๛๖ลๆอ›ฑ{๗n|๑ล˜:u*bbbPฅJ•bต๙บŠฒ๙x9''็•ฺ|“๛Sฃัภสส y–WจPA๋y^ใnllŒC‡แภุพ};v๎‰ตkืขiำฆุฝ{w‰ฬธฟLกPไน๒๗ลกัh P(•็6ฟํ››3Iคฑaร๔้ำณfอ’–eddศ๎—฿`๎aฐห—/kW›••…7nภ฿฿_Z–žžŽ~๚มมมžžž˜>}::t่"ลz๕๊Uูฒ+WฎHWฏๅ๖ฏฏฏฏี๏๋ศ=yyY"QถnŠฬฬLlูฒEk&ข8‡:jิจ้ำงฃqใฦhัข๖ํ๗JWใพจz๕๊8qโฒณณตฃฟศึึ{๗๎EZZšV?นWDพส!ี}๒ษ'๘ํท฿ฐo฿>\ผxB้P3๐ๆ^ีฏ/ฃ}๛๖XตjZถl‰>๚่•จTฉ†ŠกC‡โ๛จWฏฆL™"%‰๕/Iฺฺุ"11Bญพ๓ฯ<๋+•J(•J|๛ํท8v์ผผผŽษ“'็GAŸQ็ฮ“nใ“๋u_w/ห= ‘’’"ขŠ6SYืฏ_—f็Ÿ‡คฯฤ๊ีซc๏ฝ๐๒๒zญ|tttะฌY34kึ ณgฯฦ?ˆ๑ใวใภฏžฒตตล๙๓็eฏ…ห—/ห๊ๅ.oฺดฉVูๅห—ตฦญ\นryฮ–็ท๏ ๛.ษK๕๊ี!„€ฝฝฝึ>ฏ๐p3•]]]ู`๓็ฯ—VฆL%000ภผy๓ดฺ๙฿‡ิิTญ{ป}๕ืธu๋~๛ํ7ฬž=vvvาlIQlฺดI๋ฑ“'Oโฤ‰าŸ••7nŒE‹แ๏ฟ–ญŸืญm 333L:Zeล)yนมพุwjj*–-[Vฌ๖T*v์ุ‹/ขmถฒ๛ข๕ถ:uยƒฐ`มYYnฌญZตBNNŽฌฮœ9s P(Š<ห๕2”/_kืฎลฺตkQฟ~}ญรfo๊u‘฿{เm๘๒ห/1qโDL˜0แ•ึหษษ‘šตฒฒBๅส•ตgeส”yญCธฏ*00๕—ึ-‡222ฐdษญzjตZ๋[เyยจฃฃS่็D~ิชU+ฝ{W๋”„gฯža๙055…ŸŸ_q6I&๗สC‡Iหาำำ‹|ซโx๑ฝ$„ภ‚  ฏฏfอšx>ซœ““ƒ~๘Aถ๎ณgฯŠ๔Z๗฿eห\\\@kLŠ๚YัชU+$''cร† าฒ'Ož`๑โลZ๕aee…๐๐pญ~ขขขp๑โEญ๏–๊ีซใาฅKZ๏ๅ๘๘x=z4ฯ ๛.ษKวŽกซซ‹ะะPูgฟ>,dห_gฉDดiำ+Wฎ„……p๘q์ป–––Z๕\\\ ซซ‹Ÿ~๚ ฉฉฉ044”๎ี7n8„††ขE‹ ยๅห—ฑpแBxxxH'ด๏฿ฟ .ฤฤ‰Qฏ^=ฯ๏๗ืธqcL˜0!ฯ๛ชฝฌF๐๖๖ฦ!C™™‰นs็ยาา_}๕•T',, P*•8p ชUซ†{๗๎แ๘๑ใธs็โใใ_i˜››cฮœ90`<<<ะฝ{w”+W๑๑๑x๒ไษ[ศK@@ ะถm[ 4?ฦ’%K`ee•gT 6ฤๆอ›ัชU+t๎›6m’f{๗๎ƒš๗๎+VฌภจQฃp๒ไI๘๘๘ =={๗๎ละกCัฎ];ดmMš4ม๘๑ใ‘””ggg์ฝ›7oฦศ‘#ต.Ry๚๚๚ุ่ฑ#ึฌYƒ๔๔๔<—๕Mผ.<‰ผเเ`่๋๋ฃmถR๒๘ฒิิT้ž“น_V ,@ูฒeQถlู;ููฮฮฮ…ฦ๔ฒดด4TฉR;w†ณณ3LMMฑw๏^œ:uJ๋h››ึฎ]‹QฃFมรรฆฆฆhถํ+๗WTƒ ย‚ ะญ[7Œ1•*UBDD„tAB๎Œา๛1|๘pt้าตjียณgฯฐrๅJ่๊๊ขSงN๖‘฿6}๖ูgXดh๚๖ํ‹ำงOรฮฮ6lภัฃG1w๎bฯžฟ, 1๚๗๏1cฦ@WWฟ๚+*Tจ€[ทnฝ‘>^ddd„;wขOŸ>hะ ขขขฐ}๛v|๓อ7าad??? 4SงNE\\ ฏฏซWฏb๚๕๘๙็Ÿต. ษห๗฿C‡กu๋ึฐตตล๛๗ฑpแBTฉRRฝข~V 8 ,@๏ฝq๚๔iTชT +Wฎ„‰‰‰V=}}}๔ำO่ืฏะญ[7ปw?3์์์"ี๔ำO1{๖lขธ>ยรรแ่่ตZ-‹ก(฿%/ซ^ฝ:&OžŒqใฦ!)) ํท‡™™nธ7โณฯ>ร—_~Yเถฟ–ทzํ4Q>=z$๚๕๋'>๚่#ajj*ลฅK—„ญญญ่ำงV%K–ˆjีช ]]]ู-,X ๊ิฉ#๔๕๕…ตตต2dˆt฿(ตZ-lmmEฝz๕DvvถV›!!!BGGG?~<฿so[0cฦ 1kึ,QตjUahh(|||D||ผฌตkืD๏ฝEลŠ…พพพฐฑฑmฺด6l๊ไ–โิฉSZ๋ๆu›!„ุฒe‹๐๔๔ฦฦฦย\ิฏ__๛๏RนŸŸŸึ}๙rฝ| †๖_พลG~๑ไu“-[ถ•J%ŒŒŒค{}ๅ‚ๆๅlดnZพC…>‰Bฑy๓fกงง'>๙ไ้vFEฝญ…ฯoอ3~xaoo/๔๕๕EลŠE็ฮลตkืค:iii"$$DTฎ\Y่๋๋‹š5kŠ3fhN(ฟ๘rท้ๅืฅB์ูณG …Bพ};ฯ๘^็u‘๋‡~666BGGงะแไพn๓zผ|ซ–ถ๗EEนNffฆ3fŒpvvfffขL™2ยููY,\ธPซใวE๗๎Eูฒeตโษ๏๕๙bูหทภ)ส๋^!ฎ_ฟ.Zทn-ŒE… ฤ่ัฃล!ˆ˜˜ฉฮงŸ~*ชWฏ.ŒŒŒD๙๒ๅE“&Mฤฝ{ 7m“BปwO๚œ300JฅR,[ถฌะ6…ศ}”ืmWNŸ>-4h ฤว,fฯž๏-p๒j3ฏืม‹Ÿน๚๔้#ส”)#ฎ]ป&„‰‰‰ฐถถ'NิบYฎล‹ 777all,ฬฬฬ„Rฉ_}๕•HNN.4ฆ}๛๖‰vํฺ‰ส•+ Qนreัญ[7qๅสู(๊gลอ›7EPP011}๔‘1b„t[ž—?{ืฎ]+\]]…กกก(_พผ่ัฃ‡ึํkrญZตJTซVMฑkืฎ|oS”๏’ni๔วoooQฆLQฆLQงN1lุ0q๙๒ๅ"m{q)„(cWDDD%d๎น ม;wดnIBDฺ˜$ั{๋้ำงZOdddภีี999าD”7ž“HDD๏ญŽ;โใ?†‹‹ RSSฑjี*\บt)฿ณัc’HDD๏ญภภ@,]บศษษƒƒึฌYฃuป""ส7‘ ๏“HDDDD2L‰ˆˆˆH†I"Q น}๛6ŒŒŒ๒…†า(:: …ัััฏVใฦแไไ๔๚Aฝ6lXเM“‰EL‰จT[พ|9  Ž9"+B jีชP(hำฆVY๎zน2eสภมม“'Oฦ“'O๒์/!! …'Ož|ํุฟ{4hะ^^^ฏอ?ˆM›6ษ–;v “&Mzk?๘๕ื_#,, w๏}+ํฝ L‰่ฝ`dd„ีซWห–†††ฦฺตkŒVญZaฺดiHOOG็ฮ‘––&ญ{แย๘๘๘ >>_}๕&L˜€7n qใฦ8qโ„ฌฏกC‡"11฿}๗ฦŽ Xนr%Zทn SSS๔ำO˜0aแํํญ•8EVVƒฯ?aaa๘์ณฯp๚๕"ฺ}๔่Zตj777LŸ>UชTม!C๐๋ฏฟJu4 ‚‚‚0sๆLดm๓็ฯG๛๖ํ1gฮญ›fฏ\น†††๐๑๑‘N14h:v์ˆnบๆฬ™#•UจP0eส๔๎5kึฤ์ูณ1rไH์ทพพพฒmx๘๐!Zถl ฬ;Mš4‘สเฝบP‰s‚ˆจ[ถl™ N:%,X ฬฬฬฤ“'O„Bt้าE4iาD!„ญญญhบตึบ๒|ดo฿^dddศ๚๊ีซ—๐๓๓“ž1B˜››‹gฯžฝRฬ๙ง ๆฯŸ/+๓๓๓ฤ๊ีซฅe—.]„ŽŽŽˆ‰‰‘–๏ฺตKห–-“–ตo฿^ˆkืฎIห’““…™™™๐๕๕•–ๅ๎7oooญ๘ำาาDูฒeลภตโบ{๗ฎฐฐฐ-ูqเภ!„gฯžฤ๚๕๋ )yศณfอ’–eff aee%ฒฒฒ„Bฌ\นR่่่ˆร‡kญ.ˆฃGJหส”)#๚๔้#๋kฦŒ€ธqใ†ึ๒คค$กซซ+ฆL™ขตOณ(fอš…พ}๛b๓ๆอุฝ{7พ๘โ L:111Zห—FฃRฉฤ์ูณ๓,9น~ีถ ขขข๒/_x๔๒|YJJ >๚่ฃbวC๔_b’HD๏•:`ะ Aˆ‰‰มฺตk‹ีฦณgฯ?––m฿พญZต’ี500@ถmัถm[h4 :‹-ย„ PฃF<๘ใallŒ7n+พTจP&&&ธ|๙ฒฌ์าฅKะัั)4aช^ฝ:€็ ๐‹3ฌฏKฉTBฉTโoฟลฑcวเๅๅ…๐๐pLž<นภ๕’““eทๆนrๅ €็+ๅฦfอš:K—_y~หซWฏ!์ํํฅฬโ๚๋ฏฟ••…บu๋พV;Dž“HD๏SSS๒ห/˜4iRฑ๏Aธu๋V€ณณ3เฝ{8sๆŒึกfเฯ-ฬฅฃฃ•JZท^y™พพ>[ฌ๘๒ฃซซ‹€€lผY๋*ไ{๗๎a๕๊ี๐๖๖.๔pq`` ฬออ๑ใ?";;[Vฯ?ผRLjตZJบs)•J่่่ธr={๖ ‹-’žgeeaัขEจPก‚tตpืฎ]๑ื_aษ’%ฒ๕Ÿ>}Š๔๔t้y™2e๒ผช:7 }นฌcวŽะีีEhhจlฦV!{ $๗JOOฯ"ฏCT’8“HD๏~-%/Wฎ\มชUซ<ฟ๑qLL ~๛ํ7ิจQฝz๕๐Pณ‘‘‘ึํL`ภ€๘๗฿ัดiSTฉR7oฤ๙๓แโโR่lQปvํ0~xจี๊W>ฯฏ “'Oฦž={เํํกC‡BOO‹-Bff&ฆOŸ^่๚ๆๆๆ๘ๅ—_ะซW/ิซWมมมจPกnบ…ํทรหห ,(r<๛๗๏ว๐แรัฅKิชU ฯž=รส•+กซซ‹N:บ~ๅส•๑ำO?!)) ตjียฺตk‡ล‹K็๖๊ี ๋ึญรเมƒqเภxyy!''—.]ยบu๋ฐkื.ธปปx~šฝ{๗b๖์ูจ\น2์ํํั A)แ?~<‚ƒƒกฏฏถmขz๕๊˜๛ _~๙e‘๖ลž={๐๑วรีีตศ๛จD•…ีDDฏ๏ล[เค(ทภัีีUชTŸ}๖™ธw๏žTฏs็ฮขUซVฒ67lุ „•••000ฑ4h๘๛๏ฟ ๛ฝ{BOOOฌ\นRkนŸŸŸptt,Rน0lุ0ญegฮœยิิT˜˜˜ˆ&MšˆcวŽiี)lฟ8p@ add$ชWฏ.๚๖ํ+bcc ฎ—os๚u๑้งŸŠ๊ีซ ###Qพ|yัคIฑw๏โ๗Ellฌhิจ‘022ถถถbม‚ฒบYYYโงŸ~ŽŽŽยะะP”+WNธนน‰ะะP‘šš*ีปt้’๐๕๕ฦฦฦ€ึํp~๘แacc#tttdทร๙ใ?„ททท(SฆŒ(SฆŒจSงŽ6l˜ธ|๙ฒ,ผไไไˆJ•*‰oฟถะํ&zW(„x3ž‰ˆsฯž=ƒฅฅ%ฆNŠกC‡พัถ๛๗๏+Wฎเ๐แรoด]z๗lฺด ปwวตkืPฉRฅ’‡จH˜$เ๛Xธp! ๔ฦฟoบ…Zตja฿พ}๐๒๒zฃmำปฅQฃF๐๑๑)า!ขw“D""""’แีอDDDD$ร$‘ˆˆˆˆd˜$‘ “D""""’แอดฉุ4 ’““affฦฌ'""*%„HKKCๅส•กฃ“|!“D*ถไไไB–ˆˆˆMทo฿F•*U๒-g’Hลfffธqใส—/_ยัPaฒณณฑ{๗nH?gF๏.ŽW้ย๑*]>๔๑RซีจZตช๔=ž&‰Tlน‡˜อฬฬ่oฯา‘ ˜››Šฅ วซtแx•.ฏ็ ;UŒฎ‘ “D""""’a’HDDDD2L‰ˆˆˆH†I"ษ0I$""""&‰DDDD$ร$‘ˆˆˆˆd˜$‘ “D""""’a’HDDDD2L‰ˆˆˆH†I"ษ0I$""""ฝ’€JฟภนGก10-้0จ:ใœŸ้‡ฅQ”t8TŽW้ย๑*]๒ฏ3š–pT๏ฮ$‘ “D""""’a’HDDDD2L‰ˆˆˆH†I"ษ0I$""""&‰DDDD$ร$‘ˆˆˆˆd˜$‘ฬ{™$v๎ 6,๖๚IIIุฐaร+ญs้า%4n๘•๛สศศ€+ฏห—/วุฑceหฃฃฃ\ฌ6‰ˆˆˆ€๗0Iณgtuu_ซโ$‰E๑่ัฃ7fqฅคค”tDDD๔+ีIโ’%K T*แ์์Œ‰'";;?๘#พ๖"ญฏVซัดiSิซWฎฎฎ8rไ`๘๑ุตk\\\๙-[ถ„RฉD`` ๎ปธrๅ แ์์Œล‹็ูGFF~๛ํ7xzzbฦŒ€{๗๎กI“&P*• •๊>y๒บuƒRฉ„——ฎ\น˜4iยรรฅz+V”พvํผฝฝQซV-,ZดHึใวัซW/xxxภรร111€฿ฮฮฮ ƒZญ.า"""ขGฉMฯ;‡ฐฐ0=z๑๑๑1bfฯž>}๚ภฬฬLซnxxธ”dลฦฦbภ€ccclผgฮœมึญ[1z๔hภ”)Sˆธธ8๔่ั'ND๓ๆอ‘€vํฺa๘๑€‘#Gโป๏พC||<„Z}^พ|!!!prrย™3gฐdษ๘ใ€ะะPt่ะ Z ฿‚ PกB$$$`๘๑:thก๛แิฉSุฑcbcc1kึ,$''k•Ož<:uยฉSงฐqใF 6 0dศlผ71pเ@œ>}บภพ233กVซตDDD๔~*ตIb๎ywๆๆๆ€งOŸb๗๎่ำงฌ๎เมƒ1x๐`€ปป;–.] Bเซฏพ‚RฉD›6mpแย…<๛:v์z๖์ ู่ณ'Ž= ˆ‹‹CPP [ทnR?๘NNNจTฉฮŸ?ŸŽŽŽZํๅž3๘โz/๖ำชU+\ผxฑะะชU+˜››ร8y๒คV๙ž={0qโDธธธ M›6ธ>ž={ฐณณรไษ“‘˜˜///๘๚๚bึฌY๙๖5u๊TXXXHชUซ•Nz%ภ›‡ฤฤDุใูณg๘็Ÿ„-[ถไปNDDฒฒฒ]]]˜ššพRŸ …"ฯฟ›7oŽ™3gโื_ล๑ใว1pเ@ดhั:::ฒ๚/ฎ—]]]h4ฯg๓ Šแๅ๖„ˆŠŠBๅส•๓l๛๐แรXผx1bcc๑อ7฿HIj^ฦ‡QฃFIฯีj5E""ข๗TฉIlฺด)ึฌY#๒lิจ๛o$%%แศ‘#puu-0Až'9VVVะีีล† žž033CZZšTฯำำkืฎฌ^ฝggglถ คr077วˆ#DDD vํฺXตj•ฌฝื{q๙ฮ;แเเฐตตE\\ศถ)** iiiHKKรพ}๛เแแกU๎๏๏ฐฐ0้y||<`๗๎prrยฬ™3ัญ[7\ธpใว‡ตตuพ๛หะะPšตฬ}ั๛ฉิ&‰NNN>|8<==แ์์Œy๓ๆๅ[7ฟsปw๏Ž๛๗CฅRแะกCR‚คRฉ๐๔้S้ย•I“&aวŽPฉTˆŒŒฤไษ“s็ฮลคI“เ์์,;'1—ฏฏ/"""#๊fโฤ‰ุฐa”Jฅึ9„ร‡Grr2T*~๘แ)นุ๋ฑ#ฎ\น•J…๓็ฯkต๏ๆๆ†–-[ยออ !!!ฒร๏พ๛NjำมมA:ิnii‰;wb๓ๆอhีช•ึ,'‘Bไ—BญVรยยn฿n†ฦเีีำฯ@G`œำcL=oŠ,Mแง9Pษโx•.ฏา%ฏ๑:3กi G๕฿ษNMM-๐จ งˆˆˆˆH†I"ษ0I$""""&‰DDDD$ร$‘ˆˆˆˆd˜$‘ “D""""’a’HDDDD2L‰ˆˆˆHFฏค าoืH/XZZ–tTˆ์์l์ุฑ‡ฟ๒…พพ~I‡C…เx•.ฏา…ใU4œI$""""&‰DDDD$ฃBˆ’‚Jงด๊8๔L,J:*„.rะT็๖kช#บ%‚ใUบpผJ—โŒื‚u฿rT๏๏ิิT˜››็[3‰DDDD$ร$‘ˆˆˆˆd˜$‘ “D""""’a’HDDDD2L‰ˆˆˆH†I"ษ0I$""""&‰DDDD$๓^&‰;wFร† ‹ฝ~RR6lุ๐#ส_pp0ขฃฃ‹ตnลŠ๓\ngg‡ŒŒŒืˆŠˆˆˆ>t๏]’ธgฯ่๊พO"ฝ$๑ัฃGoดฝื‘••…'Ož”tDDD๔+ีIโ’%K T*แ์์Œ‰'";;?๘#พ๖"ญฏVซัดiSิซWฎฎฎ8rไ`๘๑ุตk\\\๙-[ถ„RฉD`` ๎ป‡Gกnบ๘๋ฏฟ““ƒ† โฤ‰ฒ>bbbะทo_ธปปKห&L˜€ฺตk# >”–/[ถ NNNprrยโล‹ุุXX[[ใย… pwwว Aƒเ็็‡ีซW#33ณภ233กVซตDDD๔~*ตIbtt4‚ƒƒannx๚๔)v๏>}๚ศ๊<ƒธปปc้าฅžฯฤ}๕ีWP*•hำฆ .\ธg_วŽCฯž=={๖ฤัฃG:t€‘‘๗ฟแ‡~๊Wฎ\‘‘‘ˆŒŒDTT:t่===ฉญŽ;B__666๐๑๑๐ณณณqใฦ !žž.-_ฟ~=ส”)ƒ   ฬ;W๋2(Š<ฮ‹ฎฎ.4๔<ฟู>…B!kK!C†H๗็Ÿข[ทnR๙_…~๘]บtั:ฤŸqใฦ!55Uzพ}ปภ๚DDDTz•ฺ$ฑiำฆXณftศณQฃF๘๛๏ฟ‘””„#GŽภีี[ถl)ฐ ตZ +++่๊๊bร† Rขgff†ดด4ฉžงง'ึฎ] Xฝz5ผฝฝ<ŸY ฤท฿~‹/พ๘Bช฿ขE lธQQQPซีhิจบw๏.ตตqใFdgg#99‡xxx`฿พ}Pซีx๘1ขขขะ AX[[ใฮ;HOOGJJŠTžJII๐๖ร‡‘ššŠ   ยิิวŽรŠ+ะจQฃ๗—กก!ฬออตDDD๔~*ตIข““†OOO8;;cผy๙ึอ๏œฤ๎ปcPฉT8t่ฌญญ*• OŸ>•.\™4iv์ุ•J…ศศHLž<.\ภ๏พ๛ฝ{๗ฦฃGค„-Wๅส•๑w฿แโล‹R’Xฟ~}4kึ NNN่ืฏŸtQŠ พ๚kxzzขaร†  0rไH8;;#88ฮฮฮR๛VVVุบu+qํฺ5 2Dถพ๒K๘๙๙AฅRกkืฎR"zัฝ{๗ะฎ];ธปปรววWฎ\ฬ˜1^^^Xฑb222 ,™™™PซีZ"""z?;I]*355ล้ำงัณgO)N???œ8qqqq๐๒๒ย๗?ฉ~JJ Nž<‰ัฃGcส”)8{๖,โใใ*ีษNฝ{›7oฦเมƒ#GŽฤw฿}‡๘๘x!คu&Nœˆๆอ›#!!ํฺตร๘๑ใ ‡‹/โ่ัฃ8pเFŒ!K๘BBB0qโDฤฦฦb๖์ู5jเวฤโล‹q๚๔i(•JŒ5 —/_.ฐฏฉSงยยยBzTญZตะ๘ˆˆˆจt*v’เเ`˜››ž>}ŠปwฃOŸ>ฒบƒ–$www,]บ4฿vปt้8v์:w๎ CCCTชT ๕๊ีร… žžž(Wฎ*Tจ ดiำเไไ„[ทnๅู๎‰'เ๏๏J•*ส—//•\]]‘””ธu๋กT*ฑhั"$&&J๕;w๎ …BpssCฯž=ฑfอfอš???x{{#11“'O†ด~\\œิgทnคๅวŽCฯž=={๖ฤัฃG๓Oน:v์}}}ุุุ N:ฒ๓+๗๏฿O?...8p ๛oฉฬัั?3PฑbE899แ?ศทฏqใฦ!55Uzไฮบั๛็“‡ฤฤDุใูณg๘็Ÿ„-[ถผR;&&&…ึ100ึัั‘ž๋่่ ''็ีคไ๎ล๕ฟ๘โ „††ขqใฦุฐaถm–gŒทoว๐ว <<ัััู่ณ'ž>}ŠŸ~๚ ๛๗๏วภแใใ#ญ“›`พw~tuuกัh|8<==แ์์Œy๓ๆๅ[7ฟs Rฟ~}ดnฎฎฎภผy๓`jjZpaee…9sๆ E‹pvv.๔1&L@ห–-ั Aุ็Y'''ปw‡JฅBƒ ๐๗฿k•๋่่ UซVุฒe v๎ KKKภนs1iา$8;;k“8iา$์ุฑ*• ‘‘‘˜ขขขเ์์ '''l฿พภ๓s?cbbก5หIDDD ๑b–B๔ ิj5,,,ถ/ฦfeK:*Œ&ๅ๏žรฟU€ฮป}{)วซดแx•./W?K:ขT๎๗wjjjG๙‹+DDDD$๓ฦoฆ.่ะกnธกตlำฆMZWQห$qใฦ%QฉฦรอDDDD$ร$‘ˆˆˆˆd˜$‘ “D""""’a’HDDDD2๏ๅีอ๔฿๚ฤูF๚5zweggcวŽs่Yฏ ๔๕๕K:*วซtแx•.ฏขแL"ษ0I$""""nฆืv:I ณGญาw&็เไ๕T่่๒ญฎใx•.ฏาฅ4ŒWฃeK:ฮ$‘“D""""’a’HDDDD2L‰ˆˆˆH†I"ษ0I$""""&‰DDDD$ร$‘ˆˆˆˆd˜$‘ “D""""’)IโจQฃเไไ„3fyๅห—ใมƒEnทqใฦธt้า+ว–’’‚ฅK—พ๒zน*VฌXฌ๕ขฃฃ,[ž””„† ;"""" ”v๓๊ีซ๑๗฿CกPyๅห—ฃaร†๘่ฃŠิ๎๖ํ‹[n’8`ภ€๋=z๔ๅส•+VoZjj*ฬออ_iั‡ๅŸI์น3>|WWW๓ฯ๐๐๐€JฅBฟ~ ัhcฦŒA:uเ์์Œ3f`ใฦˆE‡เใใShปปvํา*[ถlœœœเไไ„ล‹Kหดi777(•JDFFฦ„„ธธธศf:Ÿ={†ศศH`๘๐แ€๔๔tt่ะŒบu๋bฺดiธ~FแนฬฬLจีjญฝŸ๙™ฤ 6 bลŠˆ‹‹รฟ‹#F†Šญ[ทย6lภตkื ฃฃƒิิTXXXภแแแจSงNกํภิฉSw๎ม”)S ]]]xxx vvvXฑbส—/ตZFกC‡˜2e ฎ]ป&%up๛๖m,Yฒkึฌทท7พ{้pXX์ํํฑqใFlผ‹-’โนs็pyt้าฅะร฿111ธt้*Tจ___ดmVkๆt้าฅฐททวฯ?,ลขE ดiำXถl7n •J…มƒฃqใฦ๖7u๊T„††X‡ˆˆˆ๏Lโ‹โใใแๅๅฅR‰ญ[ท"11055ล€ฐeห˜ššพVฑฑฑ@ูฒeaff†VญZแฤ‰€9sๆภูู>>>HJJยปwe๋Ÿ633CZZฺ+๗แแแ}๛๖AญVใ๑ใวˆŠŠBƒ  VซQพ|yโไษ“ธx๑bžแำO?ELL fฬ˜๛๗ฃN:˜5kภำำSŠ}ถmx๒ไ‰ด|๚๕Bเย… x๚๔)ฌญญakk‹๘๘xฯg)_œ]<|๘0’““‘ศศHxyyim‹ฟฟ?~๙ๅ)ษฬ7gฮœ‡‡F ???œ?ำฆMƒ+๏/"""z?•ช™ฤ๑ใวฃ^ฝzฐถถ†ซซ+ -- AAAศสส‚Bกภ?่ท/z๕๊… *เ๐แรE๎รฦฦ_ต4๛;;;TฌXaaaptt„Jฅ‚ณณ3ภาา*• *• ฝz๕ย˜1cคถ\\\ŽวK‡ฌ‡ †=zภััพพพฐถถ๐BšC‡AฉTยภภห–-x{{ริิ๐๑๑AีชUฅ๖4h€พ}๛โๆอ›†ปป;’’’ค๒Aƒแ๚๕๋pvv†FฃAํฺต DDD VญZฏ:DDD๔P!DIAฅ“Zญ†……vล^‡™ลปq{สŸ&็\:Š๊xAGทT๘Aโx•.ฏาฅ4ŒWฃe฿Zน฿฿นทฤหOฉ:LDDDDw3}~ร4h ปศไไษ“Z“ั๛ ’ฤ๓‰ˆˆˆจhxธ™ˆˆˆˆd˜$‘ “D""""’a’HDDDD2L‰ˆˆˆHๆƒธบ™.7;sXZ–-้0จูููุq จ_อ๚๚๚%‚ใUบpผJŽWัp&‘ˆˆˆˆd˜$‘ 7ำkป?ธ6ฒY%"Gฯ๘d ๎๕ฑ๎ณŒ’‡ ม๑*]8^…ซดN]า!ะ+โL"ษ0I$""""&‰DDDD$ร$‘ˆˆˆˆd˜$‘ “D""""’a’HDDDD2L‰ˆˆˆH†I"ษ0I$""""™b'‰)))Xบtiพๅ+V,ดƒยัั>>>ล ใตDGG#88ธD๚ฮŒ่่่bญ›฿>ถณณCFŠˆˆˆŠ๏ญ%‰Eฑz๕jL™2‡ึZž““๓Zํ^5ฦGฝฅH^]VVž>>HJJยปwu๋ึ…ฃฃc๛คrๅสˆŒŒDdd$ขขขะกC่้้I๛ฉcวŽะืื‡t>fll,PถlY˜™™กUซV8qโDพ&&& t๋ึ GŽั*฿ทoŽ?777ิซW‰‰‰ธz๕*ภุุฝ{๗ฦแร‡†™3gๆ;.นฦ‡ิิT้q๛๖ํ๋Q้Uไ$ัืื‡‚••:u๊„}๛๖ษ๊(Šื ๆลฤฒ ญฟ‹s.ฃกกก๔wnภษ“'q๒ไIฤววร^še{1ฦ๖ษ๚๕๋QฆLa๎นZ‡”ํTุ>ำีี…Fฃ‘ž็7งP(dm !0dศฤลล!..๙'บu๋&•๕ื_๘แ‡ะฅKญC๙144„นนนึƒˆˆˆOENoผ‰J•*aศ!FJJ าาาคrOOOฌ]ปฐmถืพ0ยลล[ทn๐oo๏ืjฯ฿฿แแแ€gฯžiล2ตZ๒ๅหระะ'Ožฤล‹๓ฌ๗๒>IHH๐|FtใฦˆŠŠ‚ZญFฃFะฝ{wฯ๗ำฦ‘ไไd้ข์ทjต?FTT4hkkkนs้้้HIIับศ็ษ“'ุถm`ํฺตฒ}ิดiSฌYณ)))žา~๘๐!RSS„ภภ@˜ššโุฑcXฑb5jTŒ=KDDD๏ฃ"'‰ัััPฉTpuuลแร‡ังOจT*จT*ฬ˜1ร† รŸ GGGl฿พึึึาบy“X˜y๓ๆa๚๔้PฉTธ~:FŽ๙J๖ฒ &เส•+P*•๐๐๐ภ•+W๒ญˆ‡ยััQ:์œ——๗Iฯž=ตส+WฎŒ๏พ๛/^”’ฤ๚๕๋ฃYณfprrBฟ~ค‹Rlll๐๕ื_รำำ 6DHH์์์```€‘#GยููมมมZฑXYYa๋ึญpttฤตkื0dศญœœ๐ๅ—_ยฯฯOvะจQฃpy„„„ \นrฏพC‰ˆˆ่ฝฆนWdฝ"ตZ $vถDYEVI‡C…ศั3ย้O–ภmํ@่>ใ}4฿uฏา…ใUธJ๋;bdggcวŽhีช๔๕๕K:œ\๎๗wjjjงŽ๑WˆˆˆˆHFฏคxำvํฺ…ฏฟZkY‹-0mฺดŠˆˆˆˆจ๔y๏’ฤภภ@–tDDDDฅ7‘ “D""""’a’HDDDD2L‰ˆˆˆH†I"ษผwW7ำฯ*2,--K: *Dvv6ฐcฌ๛๋ƒผyliร๑*]8^๔>โL"ษ0I$""""nฆืฆYCMI‡๑ะuธคC ""โL"ษ1I$""""&‰DDDD$ร$‘ˆˆˆˆd˜$‘ “D""""’a’HDDDD2L‰ˆˆˆH†I"ษผIbJJ –.]šoyลŠ‹๖๒ๅห๑เมƒB๋5 NNN˜1cฦ+ตฟs็N๔ํทXฑ๕ํ;w๎”-Ÿ4iยรร‹ี&๐$‰ฏฃจIโ๊ีซ‘€1cฦไYฎัhšš๚ฆร+ถG•tDDD๔+•Ibrr2ผผผเโโ•J…ัฃG#!!...˜1cาำำักC888`๐เมEj3<<PฉT่ืฏ4 6nˆุุXt่ะ>>>€eห–มษษ NNNXผx1 s็ฮx๘๐!\]]ฑkื.ญv๏฿ฟฉSงขnบ8|๘๙o๒?~ŽŽŽจWฏถn*ี๓ฯ?แใใ•J…ฎ]ป"==ะธqc\บt เเ`i-[ถภีีŽŽŽ8qโ„lปฎ^ฝŠๆอ›รออ -Zดภฝ{๗ร‡G`` 6nˆgฯžiั‡ฃT&‰ฟ;‡ำงOc๒ไษP*•ˆ‹‹ร˜1c{{{$&&ขeห–Rb...า฿ @ll, kืฎ8u๊ฮ;ccclบ:t€ปป;6nˆร‡ใฮ;˜2e Ž9‚ใวc๖์ูHJJย† `ii‰ธธ88€O>๙7†BกภกC‡ะฆMภภำงOใ๎ปR<_|๑BBBp๎9ุููaฮœ9…๎‹{๗๎แฬ™3Xตj(+6l–.]ŠำงOฃ๘แ‡ ลึญ[แเเ€‰'โฮ;๖•™™ ตZญ๕ ""ข๗“^IP่ท/tttะฅK˜˜˜h•;v ฿|๓  ]ปvZๅqqqา฿/ขŽวท฿~ ตZ””TญZํฺตำj766([ถ, UซV8qโ์์์ด๊}๙็Xณf ~๕Wดiำ …B*KIIFฃ‘’ีO>๙;v์bุ๋ฑ# gฯž๘๚๋ฏ Ÿ|๒  \]]๑์ู3คคคHeiii8z๔จด999จ^ฝบTฐaC4lุjตกกกฐณณรฑcวPฟ~<๛š:u*BCC ‰ˆˆˆJฟR™$๚๚๚โะกCุบu+:u๊„/ฟRV็ลฤฌ(ˆจจ(ิฌY3gฮฤใว‹฿่ัฃabb‚QฃF!** Ÿ}๖™ึ ๆ‹ฑ%N]]]h4ฯg๓^๔r[/>ืh4ฐฑฑัJŒ_”••…7bษ’%x๘1/^ •J•oใฦรจQฃค็jตUซV-4~"""*}Jๅแๆ›7oขRฅJ2d‚ƒƒ‘’’‚ดด4ฉำำkืฎlถ Ož<)ดอ๔๔tTจPาบ`ff&ตํแแ}๛๖AญVใ๑ใวˆŠŠBƒ dmูููแงŸ~ย… เ็็‡QฃFก~๚8sๆ ส–- œ;wBฌ[ทNZฯลลE:Gq๕๊ี๐๖๖ฺฺุJ‰–-[ด๚ส]?>>zzzฐฐฐส,,,Pฎ\9์ฝ‹/fอš…:u๊เภ˜9s&bbb๐้งŸยศศ(฿}dhhsssญฝŸJe’ •JWWW>|}๚๔Jฅ‚JฅยŒ30lุ0๙็Ÿpttฤ๖ํamm-ญ›฿9‰ใวGฝz๕ะคIธบบJu๚๖ํ‹^ฝzมวว666๘๚๋ฏแ้้‰† "$$Dvจ๙E๘ไ“Oฐ~ฌ\นR:์ฝx๑bt๋ึ nnnZฑอ›7ำงO‡Jฅย๕๋ื1rไH@HH&Ož www่้iOVจP๕๊ีC๗๎ฅ i^3fภูู...าล-...8w๎ยรรต๖ („ขคƒ าIญVรยย๗๔…ฅกฆครyo่Œ:VฺอฮฮฦŽ;ะชU+่๋๋ฟ•>่อแx•.ฏาๅCฏ๏๏ิิิ –ส™D""""zป˜$‘ “D""""’a’HDDDD2L‰ˆˆˆH†I"ษ0I$""""&‰DDDD$ร$‘ˆˆˆˆd๔ ฏBT0ฯ"กciYาaัฤ™D""""’a’HDDDD2„‹‹ BBB ัh0|๘p899มออ 111PคX„ุณg:u๊„๖ํrrr0pเ@ิญ[;wFffฆT๒ไษprr‚Jฅยึญ[ััั–๊4n—.]dffขSงNจ[ท.>๛์3h4Y SฆL‡‡T*–,Yธrๅ ๊ิฉƒ๑ใวใๆอ›EฺDDD๔แะ+้^๖๛๏ฟร฿฿กกกศฮฮฦŸ‰ฟ๚KJฬฆOŸ{{{lธ›7oฦขE‹คu]\\0` {{{lุฐืฎ]ƒŽŽRSSaaawww„‡‡ฃN:€๛๗๏ฃ}๛๖๘ๅ—_QQQR[๋ึญร;w€๓็ฯฃK—.ธt้ยยย๒ๅมƒXถl–/_GGG <€?๘๛/777ภษ“'ฑeหœ>}๛/5j„&Mšธฟฮ;‡eห–มูู:uBdd$:w๎,•๏น๓N:…ฌฌ,๘๘๘ M›6puuล™3gฐjี*t่ะ•*UยเมƒัชU+่๊๊ๆูWffฆVBซVซ O"""*น™Dฌ\นกกกธz๕*Œตส;&อชตkื&&&RYnRK—.…ปป;,,,`jjŠ`ห–-055อณ_333ๆYv์ุ1t๏ …Jฅ&&&ธw๏^พฑ$''ฃJ•*8w๎ขฃฃฑn:4o …Bj๏“O>Bก€ซซซ”จ;v ;w†กก!*Uช„z๕๊แย… ๎ฏฺตkรลล …มมม8rไˆV๙ž={ฐu๋Vธธธ ~๚ธ>ฎ]ปฐฐฐภฐaรpๆฬŒ7#FŒf;๓2u๊TXXXHชUซ•^๏\’่๋๋‹C‡มสส :uยพ}๛dur“ญขะำำCll,ฺทoˆˆ๔๏฿?ฯz/&›ฏ"ฏXฌญญฑrๅJ๗฿ ย๗?คงง็ป^aฃซซซu๙ลูผ—yน-!~๘แฤลล!..7n€ทททT~๕๊U|๕ื๘๔ำOัฒeKL:5฿8ฦ‡ิิT้q๛๖ํใ&""ขา๋Koผ‰J•*aศ!FJJ าาาคrOOOฌ]ปฐm6…ตตuพฑ่๊๊ขK—.ุปw/VฌXK—.AฉTโห/ฟ”ฺ[ทn >>^:ฟะำำ7nDvv6๎ฝ‹ณgฯยัั1.\ธ€gฯžแๆอ›8w๎œ็ฅK—p๎9!ฐn:ญ๑ฟ€ห—/###IIIhาค z๔่š5kโ์ูณ ƒ““Sพ๛ฤะะๆๆๆZ"""z?ฝs็$FGGc๚๔้000€ฅฅ%ึฌYƒุุXจT*๔๊ี ร† C=เ่่___X[[K๋ๆuNข ‚‚‚••…B~๘ะทo_๔๊ี *Tภแร‡eq๔์ูJฅ˜5k:ฅR ,[ถ Œ%Wอš51cฦ L™2๛๗๏t๊ิ ปw๏Fบuฅ‹T ~๚hบ5\]]กฃฃƒy๓ๆมิิฆฆฆhึฌกRฉด9•J…ะะP\ธpพพพ่ะกƒVญZตย๙๓็แแแ!ฌฌฌฐu๋V่้้aึฌYจWฏkŒฝฏBQาAP้คVซaaa๛ซมาไ๛ฃTำ้ฐเท™;v UซVะืืใํำ›ล๑*]8^ฅห‡>^น฿฿ฉฉฉ|็7Qษc’HDDDD2L‰ˆˆˆH†I"ษ0I$""""&‰DDDD$ร$‘ˆˆˆˆd˜$‘ “D""""’แฯdะkำi1:––%ฝAœI$""""&‰DDDD$รรอ๔ฺ4‰@cn\าaผ7tœ{•tDDDœI$""""9&‰DDDD$ร$‘ˆˆˆˆd˜$‘ “D""""’a’HDDDD2L‰ˆˆˆH†I"ษ0I$""""™R$ฆคค`้าฅ๙–WฌXฑXํ._พ|˜g๛.\ภ็ŸGGG)1๛ๅ—_PซV-๘๘๘เฺตkR;v@ฅRมษษ “&M’–ฟ8#:iา$„‡‡Kฯ'Nœ'''4mฺ๓ฌํทฃaร†pqqมเมƒกัh๎๎๎่ืฏNœ8QคDDDD–R•$๛๏๐๗๗G\\NŸ>ษ“'CฉT"..cฦŒAXX์ํํ‘˜˜ˆ–-[โฝ{าบ...า฿ @ll,>|ˆ 6 11๑๑๑๘์ณฯะกCธปปcใฦ8|๘0๎นƒ)Sฆเศ‘#8~8fฯžคค$œ|ˆนs็"((eส”ม๚๕๋ ŒcธqHMM•ทo฿.4v"""*JU’x๓ๆMTชT C† App0RRRดfพ<==ฑvํZภถm๐ไษ“{๘1RSS„้ำงKณfffRปุทoิj5?~Œจจ(4hะžžžุธq#ฒณณ‘œœŒร‡Kํ6jิ+VฌภัฃGQฆL"((ฉฉฉ๐๐๐ภฝ{‘––†ดด4DEEjืฎ‹/"99ฯž=ร๚๕๋แๅๅ(Sฆ ๎นƒฬฬL์ฝ[krทwํฺตฒYว† b฿พ}ธs็€็Ia๎฿ปwGฃF Vซ…7ขE‹๎/CCC˜››k=ˆˆˆ่Tช7GGGc๚๔้000€ฅฅ%ึฌYƒุุXจT*๔๊ี ร† C=เ่่___X[[K๋บธธHIเ€0x๐`ุุุ ((YYYP(๘แ‡}๛๖Eฏ^ฝPกB>|_5<==!!!ฐณณƒš5k'''ุููI‡t_Tพ|y„„„ $$Dบ=Ž FŽ 777X[[ร`llŒฐฐ0ดlู999่นณ”๔…††ยฯฯUชTAํฺตต๚ธs็”J%>๚่#ฌ[ทNซฬสส aaahืฎฒณณกฏฏ%K– J•*่ฝ;VญZR๕GBQาAP้คVซaaa๛‡มาธครyo่8๗z+ํfggcวŽhีช๔๕๕฿J๔ๆpผJŽW้๒กW๎๗wjjjG9DDDDD2L‰ˆˆˆH†I"ษ0I$""""&‰DDDD$ร$‘ˆˆˆˆd˜$‘ “D""""’)UฟธB๏&‡Nะฑด,้0ˆˆˆ่ โL"ษ0I$""""&‰DDDD$รs้ตF†ฦธคฃ(š3=ื—tDDDฅg‰ˆˆˆH†I"ษ0I$""""&‰DDDD$ร$‘ˆˆˆˆd˜$‘ “D""""’a’HDDDD2L฿ƒยัั>>>ฏผnลŠ‹ีgtt4‚ƒƒeห“’’ะฐaรbตIDDD0I|cVฏ^)Sฆเ๐แร๙ึy๔่ัQมRSS!„(้0ˆˆˆ่๕ม%‰ษษษ๐๒๒‚‹‹ T*.]บ„%K–@ฉTยูู'NLœ8prrย7฿|#ญogg‡‰'ยููพพพPซีXฑbึฏ_ัฃGcุฐaZ={๖ ‘‘‘ภ๐แร้้้่ะก0x๐`ฉฎFฃม๐แรแไไ777ฤฤฤ–/_Žฑcวjล‘‘x๘๐!š7oŽฺตkKฑฟˆ#เแแlบp๘๐aิญ[ำฆMร๛๗฿ฤฎ%""ข๗ศ—$๛๏๐๗๗G\\NŸ>ฬฬL„……แ่ัฃˆวˆ##FŒภฉSงp๎9œ;w๑๑๑R5jิ@||<œฑvํZ๔๎AAA CXXเ๖ํ๘๎ป๏เเเ€mถแ๛๏ฟGDD ,, ๖๖๖HLLDห–-q๏=ภ† p็ฮ$$$`๙๒ๅ่ทoกƒๅห—#!!ปvํBllฌV๙าฅKaooSงNแะกC;v,ฒณณัฆM|ษษษศฮฮFdd$ผผผดb๑๗๗ว/ฟ"%™qqq€3gฮภรรฃG†ŸŸฮŸ?iำฆมฮฮ.฿ํ244„นนนึƒˆˆˆOz%ภ-::ำงO‡,--ฑfอTฌXžžžะีีE‡0iา$t๋ึ u๋ึE•*UะจQฃb๗็โโ‚๐๐p<~'Nœ 6 =z๔€ฃฃ#|}}amm ่น3:ฅR ,[ถ เํํ SSS888ภววG๋0oƒ ะทo_ผyมมมpwwื:>hะ \ฟ~ฮฮฮะh4จ]ป6"##abb‚ˆˆิชUซุFDDD๏/…เ}Pจ˜ิj5,,,เถธ34ฦ%Mัœ้นพคC(1ูููุฑcZตj}}’‡ ม๑*]8^ฅห‡>^น฿฿ฉฉฉเ7Qแ˜$‘ “D""""’a’HDDDD2L‰ˆˆˆH†I"ษ0I$""""&‰DDDD$ร$‘ˆˆˆˆd>ธŸๅฃ7oWวpXZZ–tDDD๔q&‘ˆˆˆˆd˜$‘ 7ำk›|๊G่™•Ki†ืO%ั{ƒ3‰DDDD$ร$‘ˆˆˆˆd˜$‘ “D""""’a’HDDDD2L‰ˆˆˆH†I"ษ0I$""""&‰DDDD$ร$‘ˆˆˆˆdz’˜’’‚ฅK—พํnJญ๐๐pLš4ฉX๋6n—.]’-๏ท/v๎๙š‘ั‡ฌD“ฤœœœท;ำovv6าำำ๓~๓๓่ัฃ’ˆˆˆaฏ•$&''รหห ...PฉT8v์˜ึ๓K—.a๘๑HHH€‹‹ fฬ˜ๅห—ฃs็ฮ๐๓๓Cฏ^ฝp๏=ดkื๎๎๎๐๑๑ม•+W<Ÿa๓๐๐€JฅBฟ~ ัh<Ÿ==z4\]]แแแุุX4kึ ีชUร๖ํ๓uาคI่ืฏ5j„ฏพ๚ Wฏ^E๓ๆอแๆๆ†-Zเฝ{;;;ddd–/_ŽฑcวฦŒƒ:u๊ภูู3fฬ€|xQRRพ๙ๆิฉSGฺถอ›7ฃVญZจ_ฟ>Nž<)ี=u๊กT*1dศ)™อ/&Xดhœแแแ?Sึษ“'แใใƒz๕๊กK—.x๒ไ  }๛๖่น3๖๎ !Dกc ™™™PซีZ"""z?ฝV’๘๛๏ฟร฿฿qqq8}๚48 ๕ึึSฆLRฉD\\ฦŒ8w๎ถm†ีซW#$$'NDll,fฯžQฃFบvํŠSงNแนs066ฦึญ[ฅ~---q๖์Yx{{c๘๐แุพ};6mฺ„ษ“'๏ตkืp่ะ!ฬš5 ร† ราฅKq๚๔i๔๏฿?๐Cพ๋=|๘6l@bb"โใใ๑ูgŸ@พmไไไ`ห–-hีช:v์œ9sฎฎฎx๚๔)FŒเศ‘#ธpแ‚ิOฟ~ฐhั"$$$เ฿ล๏ฟ^่( ฤววใoฟลศ‘#ตสฒฒฒ0fฬlูฒgฮœA๚๕ฑpแB@tt4 „E‹มษษ 3gฮฤƒ ์k๊ิฉฐฐฐUซV-4>"""*๔^ge๔ํ:::่าฅ |||ดž;88ไน^‹-`ffุฟ?ฅ2]]]ตZ””TญZํฺตดiำ T*กP(`dd'''บuซภxทo}}}คฅฅแ่ัฃR{999จ^ฝzพ๋YXXภิิ @๛๖ํับu๋h฿พ=.\ธ€+Vภ[ซญห—/รมม666€N:แษ“'HIIFฃ›› GˆŠŠBฯž= ฆเเ`@ปvํ0t่PY_็ฮC“&M>>า…- €๔๔tTจPXปvํ๋„)caarๅสIษSvv6.^ผฐตตE\\4 ถmเy2•ššŠ   LŸ>qqqถแไไ„… โ์ูณจYณ&บw๏Ž&Mš )) ตkืFbb"’““‘ศศH@ูฒeกซซ‹๘๘xฯๅ็ฮBๆSฎ}ณm6ธบบj•ีฉS7nะฺงน็-~๙ๅ—าyฃ+Wฎฤฝ{ัฅKi&—ˆˆˆ>lฏ5“้ำงรภภ–––่ีซT*•๔|อš5ฐดด„Jฅ‚JฅBฏ^ฝPกBญ6ๆฯŸมƒ#,, ููู่ป7”J%ฦz๕๊มฺฺZ–ผ 2dฦŒƒgฯžaฬ˜1จ[ท.พ๖[๔๎}๔œiii BVV …t๎a~mไ*Sฆ  €เ๔้ำะำำƒฑฑ1ๆฬ™ƒ&Mš lูฒptt”๊๚๋ฏ่฿ฟ?233แๅๅ%Jฮ+ฆ\999pvv†์Fฌ^ฝƒฦใว!„ภ๔้ำQฃF ๘๛๛ใว”fb‰ˆˆˆ^คEฝด•่%jต5 zfฏ๕ฦ1ร๋ง’แ–;v UซVะืื/้pจฏา…ใUบ|่ใ•๛šš ss๓|๋๑WˆˆˆˆHฆไงฐ]ปvแ๋ฏฟึZึขE L›6ญ„"""""*}ป$100%QฉฦรอDDDD$ร$‘ˆˆˆˆd˜$‘ “D""""’a’HDDDD2๏ีอ๔฿๛ึใXZZ–tDDD๔q&‘ˆˆˆˆd˜$‘ 7ำkpw?4zญ6zื๐†ข!""ข73‰DDDD$ร$‘ˆˆˆˆd˜$‘ “D""""’a’HDDDD2L‰ˆˆˆH†I"ษ0I$""""&‰DDDD$๓'‰)))XบtiI‡Q Š+kฝ่่hห–'%%กaร†ฏ}ภ>่$1''็?ๅัฃGiIMM…ขคร ""ขwTฉN“““แๅๅจT*;vL๋๙ฅK—0~x$$$ภลล3fฬภ๒ๅหันsg๘๙๙กWฏ^ธw๏ฺตkwww๘๘๘เส•+€๐๐pxxx@ฅRก_ฟ~ะh4€ฦc๔่ัpuu…‡‡bccัฌY3TซV ทo—ล๘์ู3DFF" ร‡คงงฃC‡pppภเมƒฅบร‡‡““Xพ|9ฦŽ+ีณณณCFFเแร‡hผ9jืฎ‰'ๆูˆ#เแแlบp๘๐aิญ[ำฆMร๛๗฿ฤpั{คT'‰ฟ;‡ำงOใภZฯmmm1eส(•Jฤลลaฬ˜1€s็ฮaถmXฝz5BBB0qโDฤฦฦb๖์ู5j kืฎ8u๊ฮ;ccc)นKKKœ={>|8ถo฿ŽM›6a๒ไษRทoใป๏พƒƒƒถm†๏ฟ€ฐฐ0ุ#11-[ถฤฝ{๗6lภ;w€ๅห—ฃo฿พ…๎ƒ˜˜,_พ ุตkbccตส—.] {{{œ:u ‡ยุฑc‘6mฺเเมƒž'พมมมˆŽŽ.ฐฏฬฬLจีjญฝŸ๔J:€ืแแแพ}๛BGG]บtึs‡<ืkัขฬฬฬ๛๗๏GbbขTฆซซ ˆวท฿~ ตZ””TญZํฺตดiำ T*กP(`dd'''บu p๒ไIxzzbไศ‘ˆ…นนนVวŽร7฿|hืฎLLLคๅปw‡Bก€Rฉ„‰‰‰”@ๆววว666€Ž;โศ‘#h฿พฝTพgฯ$&&b๙๒ๅ€ดด4$''รึึึึึ;v,พ๚klถ ]บtApp0ๆฯŸŸg_SงNEhhh๑ั๛กTฯ$๚๚๚โะกCฐฒฒBงNญ๕|฿พ}yฎ—›”€Bกภ™3g'อ@ภภฅบ#F 33SZวภภ ฃฃฃ๕w๎9Ž*• ‹/ฦ‘#GะฉS'ฌ[ทYYYZ1(Š"oงฎฎฎtธ€V,/ถฃP(dํ !๐ฟOฺพ[ทnมึึV*?{๖,† †ัฃGฃ=ztพqŒ7ฉฉฉาใ๖ํE"""*]Ju’x๓ๆMTชT C† App0Ž9ข๕K๙โ์โแร‡‘œœŒ์์lDFFยหหK+๒ห/R’8sๆ <<<0z๔h๘๙๙แ๙๓˜6m์์์๒.CCC˜››k=ˆˆˆ่Tช7GGGc๚๔้000€ฅฅ%z๕๊•J%=_ณf ,--กRฉ RฉะซW/TจPAซ๙๓็c๐เม Cvv6z๗๎ ฅR‰๑ใวฃ^ฝzฐถถ†ซซkฑctqqAxx8?~Œ'N† †=zภััพพพฐถถt๎‡‚Rฉ„–-[๐๖๖†ฉฉ)เใใƒชUซJํ7hะ}๛๖ลอ›7 www$%%Iๅƒ ย๕๋ืแ์์ Fƒฺตk#22&&&ˆˆˆ@ญZตŠฝmDDD๔R…ŠIญVรยยแ'็รุย่ตฺ๊]kภŠŠ๒“;v UซVะืื/้pจฏา…ใUบ|่ใ•๛ššZเQมR}ธ™ˆˆˆˆ&‰DDDD$ร$‘ˆˆˆˆd˜$‘ “D""""’a’HDDDD2L‰ˆˆˆH†I"ษ0I$""""™Rณ|๔n่\ญ,--K: """zƒ8“HDDDD2L‰ˆˆˆH†I"ษ0I$""""&‰DDDD$ร$‘ˆˆˆˆd˜$‘ “D""""’a’HDDDD2L‰ˆˆˆH†I"ษ0I$""""&‰DDDD$ร$‘ˆˆˆˆd˜$‘Œ^I@ฅ—––}}ކ “'Ož@ญVsผJŽW้ย๑*]>๔๑Rซี{|ฐทท/แHˆˆˆ่Uฅฅฅมยย"฿r&‰Tlๅห—บuซภูซ๒๐๐ภฉSงX{ฅฑทัฆZญFีชUq๛๖m˜››ฟฑvKำ~}[ํ–ฆ๑Jฯ>(Mํ–ถ๑z[ํ––X?๔๑B -- •+W.ฐ“D*6็งดZXXผั7™ฎฎ๎ำ–ถv฿Vฌ`nnฮ๑๚€ว (]๛ ดต[Zฦ๋mต[šb>์๑*สไ/\กwฮฐaร>๘v฿VฌoCiฺฏoซา4^@ฺ้ฅญทก4ํƒา๋๒>ํ…(์ฌEข|จีjXXX 55๕ญอขะ›ร๑*]8^ฅ วซtแx gฉุ 1qโD–t(Tฏา…ใUบpผJŽWัp&‘ˆˆˆˆd8“HDDDD2L‰ˆˆˆH†I"ษ0Iคb ƒŒŒŒะ Aœ‚ฎฎฎ์jฐ{๗๎กbลŠ%ๅ%w< ซŠ+ส.8z๖์๗_Ž็[4|๘plถ @•*Uคๅ+VDVVRRRด๊ฟ๛๗๏ฃ^ฝzะำำƒžž<ˆy๓ๆAOOึึึณWฤ$‘^‰มตs๏1Uื}ภ฿ศm่แpธื’ฆG5@ฃฅdL…LีจcจฌPื,‡`+ขeซีjุ2gCถ@hLpแ"ฅ4 ”!Bห่˜oแ r๙<8~๓t@ฤ็yDๅฺฮ๖ป|ฏ็๛ฯ{ฟ›"""PYYฉEee%ขฃฃงqd๔o!!!ะ้tVkี‹บบ:eญขฃฃั3gฮ(eชชช0::ŠฅK—>๔1?้Doฟ6JKKQUU…ซ๓pttดZณ––˜L&ซ5kllด ๗วŽƒZญ†ม`x8™มFGGq๋ึ-ฎี#(66hhhP~‘‘‘HMMUถนfS4oฮะใงจจHœๅภryy๋ญทDฃัXฝ FG__ŸิืืK}}ฝ/พ๘B๊๋๋ๅ๏ฟ‘O>๙D4>|Xฮ;' "ƒƒƒJqqq๒์ณฯJ]]ิึึสผy๓ฤh4Nื”žh›7o777ฉฉฉณูฌ,‹RfำฆM$UUUr๚๔i‰ŽŽ–่่hๅ๐๐ฐ„……ษชUซคกกA***ฤ[v์ุ1Szขeggห๑ใวๅฏฟ’s็ฮIvvถุููษัฃGE„k๕8ธ๛ํfฎูT1$าษออ•   qrr’%K–ศฉSงฆ{H3Ruuตฐ๙ฅงง‹ศฯเ|๐มโใใ#ฮฮฮ+---Vmtttˆัh•J%jตZ6lุ }}}ำ0›'฿xk@๒๒๒”2ƒƒƒฒeหqww—ูณgKRR’˜อfซvฺฺฺ$>>^\\\ฤหหKฒฒฒdhh่!ฯๆษทqใFั๋๕โไไ$ซDฎีใเ฿!‘k65v""ำs “ˆˆˆˆU|&‘ˆˆˆˆl0$‘ †D""""ฒมHDDDD6‰ˆˆˆศC"ู`H$"""" ‰DDDDdƒ!‘ˆˆˆˆl0$=`0ะ฿฿?Cฑฒhั"œ๚่ฃns๙ะ้t๘๑วแ=q‰ˆ๎“ฟฟ?สสส”ร‡รืืืฆัฃGั฿฿“ษ„ทo#''ว๊|EEโโโฆิ๗w฿}ฃั๘@ใžŠแแแ{ŠฑนF์฿ฟšGC๔่aH$"บOFฃส๗฿ิิิ หฯ™3๋ึญCssณี๑ฑ888ฃัxxx`ูฒeใถc2™ะŽล‹+ว‚ƒƒ๑ูgŸaแย…puuลฮ;ัาา‚ศศHธนนaำฆMJูััQ์ฺต ๐๕๕ลึญ[q๋ึ-ภฐbล dffยออ yyy่์์DJJ ดZ-ๆฮ‹ ็x๗ญใ๒๒r<๔ำสีีขขข ๋๚๋ฏ˜?><==ฑ}๛vŒŽŽ*็พ๚kฬ›7^^^HOOวภภFFF‹/BฅRAฅR!??ศษษJฅRๆุุˆๅห—ร8}๚ดาถ๖์ูƒฌXฑฐ|๙rTVVฮจ€Lt_„ˆˆ&ฅื๋ฅฆฆFไฺตkrํฺ5 ฺฺZั๋๕Vๅ~๙ๅ้้้‘ตkืสฎ]ป”๓ฝฝฝขำ้dddDพ๙ๆYปvญX,’'NŒwyyนDDDุŒ'&&F:::คนนYœeๅส•b2™ฤl6‹TUU‰ˆศพ}๛ฤ`0ศฅK—ไฦ๒๓ฯ+cสหห{{{ษหห“‘‘ฑX,๒๒ห/KVV–ผySš››ลืืWฮž=;แ26_ฉญญณู,MMMึyๆ™gฤl6หๅห—ล`0ศ๛EDไ‡~ฐฐ0ikk‹ล"FฃQฒฒฒDDคบบZBCCญฺJOO—œœeฟฏฏOคคคD†‡‡ฅดดTeppPDDศบu๋คงงG,‹ROญVห… ฦ/ัLล+‰DD๗ษฏฝ๖Š‹‹Q\\ŒW_}๖๖๖6ๅโใใกัhเ๎๎ŽึึVlผY9WYY‰˜˜ฬš5 ŽŽŽ่่่ภล‹แเเ0แ•ฤ๎๎๎qŸEบu+<<<ฐ`ม„‡‡#..ะ้tˆ‰‰มูณgEEEุพ};เ้้‰;wโเมƒJ;กกกXฟ~=fอš…žžิิิ`๗๎pvvฦ‚ ’’‚C‡M๚8::ขนนะ้t0 –}็w ำ้เ็็‡mถกธธภ๊;v์€^ฏ‡‹‹ {๏=”””Lฺ๗˜๒๒r,ZดHY›ฤฤDhตZœ:uJ)“ ตZ ๅ˜ซซ+zzz๎ปข™€!‘ˆh RSSQXXˆ‚‚‚ o5๔ำO่๎๎†ลbAbb"ึฌYฃœป๛yฤดด4ฤฦฦ")) zฝปw๏ท=77ทq฿jึjตสถ‹‹‹อX๖๖v)็๔z=ฺ•€€ed2แๆอ›๐๖๖†FฃFฃมท฿~‹+Wฎ๓€’’”––" qqq6ทู๏hตm6›•333•พ_xแ\ฟ~}าพ๏๑ใว•๚อออฮwL__๎ปข™€!‘ˆh "##ัูู‰ฎฎ.DEEณฌณณ3าาาpๆฬธqภ—ZVฏ^ prrย‡~ˆึึV๓ฯ๘๊ซฏPSScำฮโล‹๑็Ÿ>๐˜`2™”}“ษ???e฿ฮฮNู๖๗๗‡JฅBWWบปปัพพ>์ปwา~–.]Š#GŽเ๊ีซทบ‚๚o—.]ฒฺ{ศ฿฿๙๙๙J฿สๅwsผฑี_ฝzตM””” ๋\นrรรร tŽD3 C"ั:t่พnฟ กฐฐZญžžžธpแิjตˆชซซัิิ„ััQจีj888Œ{๛ZฏืCงำกฑฑ๑ฦ๛๚๋ฏใ๓ฯ?วๅห—ัูู‰œœผ๑ฦใ–๕๗๗Gtt4}X, ใ๗฿ว๙๓็๏ูวํทQXXˆ^8::BฅR;—1นนนธz๕*ฬf3พ๒K$''6nˆ?X ลfณ๎\9ฝ~บีgˆดZ-ฺฺฺ”W^y๕๕๕(++ร๐๐0QQQqฯ[ษ'NœภK/ฝ‡{ฮ‘hฆaH$"š"ƒมpฯ็ํVญZ•J///TWWฃฌฌ vvv6Ÿพ1›อHLL„ZญFTT233'|.1##ร๊9ยฉศศศ@RR–,Yƒม€๐๐p์ุฑcย๒๘็Ÿ0w๎\hตZผ๛๎ปœดŸ|่๕zธปปใุฑcุณgฯ„e“““ฑlู2„……aๅส•ุฐa€;ogdd`อš5Pซีˆ‰‰Q๊ย… ‘€ภภ@h4wBe]]4 ถlู7779rนนนะjตฦพ}๛๎9๎ƒโอ7฿œt~D3ˆศt‚ˆh&ˆ‹‹Cvv6^|๑ล)ื@TT~๛ํทG๎ƒฺณ?๘iii8y๒ไธทณ‰f2†D"ข‡ไำO?ลถmเ่่8C!"šC"ูเ3‰DDDDdƒ!‘ˆˆˆˆl0$‘ †D""""ฒมHDDDD6‰ˆˆˆศC"ู`H$"""" ‰DDDDdใ?๔G" ๋\ิIENDฎB`‚c4core-bm-charconv-atof-mega_bytes_per_second-float.png000066400000000000000000001017351477602032300333640ustar00rootroot00000000000000c4core-0.2.6/doc/img/linux-x86_64-gxx12.1-Release‰PNG  IHDR~U้— 9tEXtSoftwareMatplotlib version3.5.1, https://matplotlib.org/ุa๒ฝ pHYsaaจ?งiƒJIDATxœ์wXื๛6๐{Ašาi–‘…E H +jDล^ขKLิ˜D1–DƒŠ-* ˆฦ๎ืมPZฤ#–ุ" ‹(E8๏พฬฯ•*ฝ?ืตืลฮœ9็™9ณณgสส„DDDDT้i”wDDDD๔n0๑#"""RLˆˆˆˆิ?""""5มฤˆˆˆHM0๑#"""RLˆˆˆˆิ?""""5มฤˆˆˆHM0๑#zIrr2d2ๆฮ[กฉeห–ฐณณ+๏0JM&“a๔่ัๅฝGขฃฃ!“ษ]กจฝAƒA__ฟผร(ณ{๗๎ม฿฿&&&ษdXธpกZ๏_LจBJJJยดiำœœ\ก•‹ใวcฺดiHMM-U๙K—.a์ุฑpww‡ฎฎ.d2Y‘Ÿ™L™L†กC‡:?((H*๓เมƒ2ฎมYฝz5.\๘ฺ๕T$•q*ซฑcวb๏ฝ˜8q"Vฎ\‰vํฺฝ“v_๕3ฎ0๑ฃ ))) ำงOgโGj๋๘๑ใ˜>}zฉฟ4Nœ8E‹!==Mš4)ฑผฎฎ.๗ฟ!;;ปภผ5kึ@WW๗UC.RY’ค-Zเ้ำงhัขล‹ใMbโ๗8x๐ บt้‚ฏพ๚ ๚๕ƒอ;i๗U?ร๏ ?"z+„x๚๔iy‡๑ษศศ(ำr~~~HMMEbb"๚๖ํ[b๙vํฺAฉTb๗๎*ำ?ŽkืฎกcวŽeŠใueff"//ะีี…†ฟฆิม<^ฟฦฦฦoฅ๎๗?Q๔N]ฟ~#GŽDใฦกงง๔่ัCed/""=z๔ดjีJ:ๅ๔โต?3š6m ิชU ฃFR๙ฏjเภะีีล… Tฺ๗๕๕E๕๊ีq๛๖ํRลป`มิซWzzz๐๖๖ฦ_U ฬล‹แ๏๏5j@WWฮฮฮุถm›J™ˆˆศd2;v ใฦƒฉฉ)ชUซ†nบแฟ+P็๎ปแํํ ยลลซWฏ.P.)) ญZตBีชUQปvmฬ™3Ge~u,๋ืฏว๔้ำQปvmภ฿฿iiiศสสย—_~ 333่๋๋c๐เมศสสRฉ#<<ญ[ท†™™ttt`kk‹_~๙ฅ@,VVV่ิฉ๖๎ ggg่้้a้าฅEn3f@CC‹/–ฆธq/^,r™effbฺดihิจtuuaii‰O>๙Wฏ^•สddd`๘๑จ[ท.tttะธqcฬ;B•บ๒ฏAฒe ์์์ ฃฃƒฆM›bฯž=R™7B&“แะกCbYบt)d2™ส๑*๛ลกC‡0rไH˜™™กN:˜6m&L˜ฐถถ–>ล€ืจQฅฺvPปvmดhัขภ~ตjี*ศๅ๒R_CšžžŽ/ฟVVVะัั™™>๘cœ;wภ๓๋Qw๎‰๋ืฏK๋aeeเ๖ฯตkืb๒ไษจ]ป6ชVญ ฅRY่5X๙ืถ–ด฿ฯ5~~~จVญฬฬฬคำ}/ืyๅสt๏ะีีE:u€ดดด"ืนธuž'Ÿ~๚)ฬออกซซ ๑วฅฺž๙ŸฃฃGโฃ>‚ฎฎ.๊ืฏ+Vจ”›6md2Yๅ๓๗ฉ๗•:ฃฃฃฅฯฆ\.—ถรฆM› —หกซซ '''ฤฦฦ?___TซV ตjีย๗฿_เณ”——‡… ขiำฆะีี…นน9†ŽGบž…/๖๏฿OOOC__7ฦคI“T–/อฑ"[!*๕Uq6lุ'''่้้กfอš่ืฏ๗_•2 4h๊ืฏ]]]XXX`ศ!HII‘ส”ๅ3ฮขwhร† ยมมAL™2E,[ถLLš4ITฏ^]ิซWOddd!„ธz๕ช3fŒ &Mš$Vฎ\)Vฎ\)๎ฝ+„b๊ิฉ€๐๑๑‹/ฃGšššยลลEdgg !„x๔่‘จSงŽpqqฯž=B&ˆ•+Wใตkื!—ห…•••˜={ถ˜>}บจQฃ†055•โBˆฟ๚K [[[1{๖lฑdษัขE !“ษฤฆM›คrแแแ€pttญ[ท‹/ใวšššขgฯž*ํ‡‡‡ ™L&์์์ฤฬ™3Ehhจ:tจ่฿ฟฟTฦ[ิชUKิญ[W|๑ลโ็Ÿญ[ทฤฎ]ปคrQQQ€P(ยออM,ZดHŒ3Fศd2 ๚๔้#ฺทo/BCCE1}๚t•x\\\ฤ Aƒฤ‚ ฤโล‹Eถmฑdษ•r๕๊ี~๘กจ^ฝบ๘๖oEXX˜ˆŠŠB@Œ5J*$d2™Xถl™Jข4‡ฅgฯž‰6mฺ" @,YฒD‹ึญ[‹-[ถ!„ศหหญ[ท2™L :T,YฒDt๎Y_~๙ฅJ}„ƒƒƒฐดด?๐ƒXธpกจ_ฟพจZตชx๐เBˆ'Ož}}}1rไศ๑ดjีJ4mฺTzช๛…ญญญ๐๖๖‹/ณfอ๑๑๑ขw๏€Xฐ`๔x๘q‰F!BBBqํฺตB็็๗วฒeห„žžžHOOB‘““#LMMEppฐ๔9๛๏ฟŠmซOŸ>B[[[Œ7N,_พ\ฬž=[t๎Y๙็ŸB!๖ํ' …จYณฆด›7oB฿ikk+ …˜?พาผ}Hˆา๏๗?๕๋ืzzzโoฟ .}๔‘pppPฉ3++KX[[‹Zตj‰3fˆๅห—‹้ำง ‘œœ\ไ:ทNOž<Mš4ZZZb์ุฑbัขEยหหK .,v[ ๑sิธqcann.&Mš$–,Y"š5k&d2™๘๋ฏฟคr๙๓ฒ}๊ลพฯฏำาาRL›6M,Xฐ@ิฎ][่๋๋‹?S|๐มbึฌYbึฌYยศศH|๘แ‡"77WZ~เภBWWW4lุP๔๏฿_,YฒDt๊ิI฿}๗J๛C‡UชTร† aaaโ›oพีชUS9>็วTุ๑โฏฟฺฺฺยููY๔ำO",,L|๕ีWขE‹*ํ”ๆXq๕๊UฑrๅJ@|๑วR_ ! ฟ๒ท‹‹‹Xฐ`๘๖o…žžžฐฒฒ=’สอ;Wxyy‰๏ฟ^,[ถL|๑ลBOOO|๔ัG"//O!^๛361๑ฃw๊ษ“'ฆ8qB+Vฌฆmุฐกภ‡R!๎฿ฟ/ดตตEถmULK–,ฤ๏ฟ.Mปwฏ fฬ˜!๙็กฏฏ/บvํZbŒ๙‰Ÿžžžธu๋–4ิฉS€;vฌ4ญM›6B.—‹ฬฬLiZ^^žpww 6”ฆๅP|||คƒBŒ;VhjjŠิิT!„ฉฉฉยภภ@ธบบŠงOŸชฤ๕โr๙ฝทYVV–ฐฐฐปw—ฆๅ์์์Tบฝ{๗2™Lดo฿^ฅ 777Qฏ^=•i…๕™ฏฏฏจ_ฟพสดz๕๊ bฯž=สฟ˜๘?^hhhˆˆˆˆๅJ›๘๛๏€˜?~y๙iห–-Rฟศ฿฿_ศd2๑๗฿ซฤงญญญ2->>^‹/–ฆ๕๎[˜™™IL!ฤ;w„†††๘๛๏ฅiฏบ_xzzชิ)Dษษ[qJ›๘=|๘PhkkK_†;w๎2™L$''—:๑322RI๊ ำฑcว๛•ทึฏ_ฟภ~VTโWš~ผy€๔O€B<}๚Tุุุจิ+ˆ 6ซฌำย… )๑Bˆ์์lแๆๆ&๔๕๕…Rฉ,ถฯัแร‡ฅi๗๏฿:::b๘๑าดWMˆใวKำ๒zzzโ๚๕๋า๔ฅK—ุ๎ฤ็Ÿ.Mหหห;vฺฺฺา>rไศ@ฌZตJ%ฆ={๖˜^ิ๑bม‚ฅฺ๏J{ฌขเ?žBฟฒณณ…™™™ฐณณS9๖๎ุฑCSฆL‘ฆvL\ณfM~{ฯ๐ฤSฝ๔N้้้I็ไไ %%~๘!ŒฅSCล9pเฒณณ๑ๅ—_ช\๛3lุ0b็ฮาดถmb๘๐แ๘๛๏๑ษ'Ÿ@WWทุS/ฺ๋ต+jืฎ-ฝ่ฃเ๊๊Š]ปv>|ˆƒขgฯžHOOวƒ๐เมคคคภืืWฎ\)pŠเณฯ>S9ีเๅๅ…\\ฟ~ภ๓S้้้๘๖o \\๒) }}}๔๋ืOzฏญญ>๚๓Ou0`ดดดค๗ฎฎฎB`ศ!*ๅ\]]q๓ๆM<{๖Lš๖bŸฅฅฅแมƒ๐๖๖ฦ?Sเt˜ตต5|}} ด<ฟ†g๔่ั๘้งŸ๐็ŸbเภสDGG8uT˜๏จYณ&>๓๓๒ทำฎ]ป ฉฉ‰1cฦจฬ?~<„ฎm๓๑๑Aƒ ค๗๖๖๖044Tูžฝz๕ย๛๗UNnธyyy่ีซ€ฒํร† ƒฆฆf‰๋ฆUฏ^ํฺตรš5k<ฟaม๕๊ี+uฦฦฦ8u๊Tฉ/Ÿ(ฬภU๖ณโ”fฟ฿ณgjืฎ ???išฎฎ.† ฆR—‘‘`๏ฝx๒ไI™ใัฎ]ป`aaฝ{Kำดดด0fฬ<~ธะK^fkk ///้ฝฉฉ)7n\่gปดlmmแๆๆ&ฝwuuดn|๐A้…ต๕โ#™๒/ศฮฮฦล”)Sคkฎjึฌ SSSคฆฆ{MMพฉqใฦ*ำตตตQฟ~}i~พนs็ขFˆ‹‹รขE‹`ffV๊X6lX`ZฃFคk4๛o!๐w฿มิิTๅ5u๊Tฯฏ๕yั‹Xเ๙/้๚—๋ำJs}U:u $ƒีซW/p-Maํๆแีญ[ทภ๔ผผ<•พ8v์|||PญZ5ริิTบฆฐฤฏ(+Vฌ@hh(/^ฌ๒ฅXWฏ^EใฦQฅJ•"ห\ฟ~ตjี*p[ฏ/๏+/o# เ๖lืฎŒŒŒฐn:iฺบu๋ P(ะจQ#e/Šno[Ÿ>}ฐ~ธq[ถlAŸ>}^i๙9sๆเฏฟBบu๑ัGaฺดiฏœ ผส๚—fฟฟ~:4hP ‡~X qใฦa๙๒ๅจYณ&|}}ZชcQQฎ_ฟކ ธ)ฅจฎ0ฅู_ีซhKCC๕๋ืW™–ฟฯ็ฏ\น‚ดด4˜™™ุ๗?~\ชพWฏ^๐๐๐ภะกCannŽ€€ฌ_ฟพุ$๐M(๊ปlllT๚ํแร‡๘โ‹/`nn===˜ššJ๋๒:๛ฮปR๔Q“่-๘๓ฯŽ/ฟnnn022‚L&C@@ภ[๙`วฦฦJ›ฤฤฤืN8^”๏W_}Uไ(ืห_4E๊”ๅ?ืWฉซจฒ%ีq๕๊Uดiำ666˜?>๊ึญ mmm์ฺต ,(ะgลฺxxx ..K–,Aฯž=QฃF"ห–‡าlOtํฺ›7oฦฯ?Œ{๗๎แุฑc๘๑วฅ2eู/J;ฺ๕6๘๙๙AGGDVVz๖์๙Jห๗์ู^^^ุผy3๖ํ‡ฬž=›6mB๛๖ํKUวซฌ› ภผy๓0hะ lบ๛๖ํร˜1cŒ“'OขN:eช๓u•f‹บI!77๗•๊|“3//fffXตjUก๓MMMUึ๏zzz8|๘0ขขขฐs็N์ูณ๋ึญC๋ึญฑo฿พrYฯž=q๘qL˜0 …๚๚๚ศหหCปvํz‚๚&0๑ฃwjใฦ8p ๆอ›'Mหฬฬ,๐œฃขj๙ง .]บค๒฿gvv6ฎ]ปiZFF [[[ธปปcฮœ9่ึญ\\\J๋•+W Lป|๙ฒt๗^~๛ZZZ*ํพŽS๕Wไ >>จQฃึญ[‡u๋ึแฃ>R9e๕ฆ๖‹ข>oรW_}…ฉSงโป๏พ{ฅๅrss œฺ233CญZตT>gีชU{งงภ|}}๑๏ฟช<>'33ฟ๚ซJ9ฅRฉr=+๐< ิะะ(๑8Qิ:u่ะw๏UนเูณgXผx1๔๕๕แํํ]–U* Ÿฤร‡Kำ222Jุ˜ฒx๑ณ$„ภ’%K ฅฅ…6mฺx>–››‹~๘กภฒฯž=+ีพ๐แรำ จ๔ษซ<๚ฉ4œaff†ฐฐ0•vv๏ .H฿-…๚0๏w๙~๑ฃwชSงNXนr%ŒŒŒ`kk‹'Nเภ011Q)งP( ฉฉ‰ูณg#-- :::าณไ&Nœˆ้ำงฃ]ปv๐๓๓รฅK—๐๓ฯ?รลลEบ่๛เมƒ๘๙็Ÿ1u๊T4kึ ภ๓็ัตlู฿}๗]กฯzู‡~OOOŒ1YYYXธp!LLL๐๕ื_KeBCCแ้้ น\Žaร†ก~๚ธw๏Nœ8[ทn!>>•ถกก!,X€กC‡ยลล}๚๔A๕๊ี'Ožผีƒzaฺถm mmmt๎ร‡วใว๑๋ฏฟยฬฬฌะคฆ4š7oŽญ[ทขC‡๐๗๗ว–-[คQปเะกC%&น ภŠ+0n8œ>}^^^ศศศภ0rไHt้า;wFซVญ„ไไd888`฿พ}ุบu+พ๒K•9^…––>๙ไฌ]ป…ฆ๓›ุ/œœœ<๙ด€€hiiกs็ฮา—ษหาาาคg";v ภ๓/jccc๛[ษppp(1ฆ—ฅงงฃN:๐๗๗‡ƒƒ๔๕๕qเภœ9sFeT฿ษษ ๋ึญรธqใเโโ}}}t๎๙•+ญแร‡cษ’%่ป7พ๘โ XZZbีชUาE๛๙#1ฤ่ัฃัฃG4jิฯž=รส•+กฉฉ‰๎ปFQ๋๔ูgŸa้าฅ4hฮž= +++lธวŽรย… ห<สฒถmโƒ>ภงŸ~Š &@SSฟ;LMMqใฦ7าฦ‹tuuฑgฯ 8ฎฎฎุฝ{7v๎‰I“&Iงpฝฝฝ1|๘p#..mถ…––ฎ\น‚ 6เงŸ~‚ฟฟฑํ|๗8|๘0:v์ˆz๕๊แ๛๘๙็ŸQงNxzzJๅJ{ฌ(----ฬž=ƒ†ทท7z๗๎{๗๎แงŸ~‚••ฦŽ เ๙1บE‹˜3grrrPปvm์ทืฎ]+P็ซ~†฿™wv0‘x|ฝมƒ‹š5k }}}แ๋๋+.^ผ(๊ีซ'จR๖ื_๕๋ืššš/ฐdษacc#ดดด„นนน1b„๔œ%ฅR)๊ีซ'š5k&rrrT๊;vฌะะะ'Nœ(2ฦวน„„„ˆy๓ๆ‰บu๋ แๅๅ%โใใ ”ฟz๕ช0`€ฐฐฐZZZขvํฺขSงNbใฦR™G,œ9sFeูยY!„ถm๎๎๎BOOOŠ>๚HฌYณFš๏ํํญ๒ธ|TyฤD~/?ฎขจx {„วถm„ฝฝฝะีี•žk˜8•—ัฑcว‚T8…ญ[ทŠ*Uชˆ^ฝzIๆy•G4}„ฑฑฑJ๘@ฬŸ?ฟศวนVga๛ม‹วฟ|ีชUWฏ^mถUซVๆๆๆb๊ิฉ*ีสทlู2แไไ$๔๔๔„หๅโ๋ฏฟทo฿.1ฆศศHัฅKQซV-กญญ-jีช%z๗๎-._พ\`{”๖XQุzu์]ทnptt:::ขFขo฿พ*๕Bˆ[ทn‰nบ cccadd$z๔่!n฿พ-ˆฉSงช”}•ฯ๐ป"ขฮฝc .ฤุฑcq๋ึ-•G5ฉ&~DDT้<}๚ดภ๓ึ‘››+”@คŽxU:Ÿ|๒ >๘เ( คฅฅแฯ?ฤล‹‹|ิ‘บ`โGDD•Žฏฏ/–/_ŽUซV!77ถถถXปvญสฃwˆิO๕ฉ >วˆˆˆHM0๑#"""RLˆˆ›7oBWWWz€re ™L†่่่ืฎซeห–ฐณณ{ *€ๆอ›ซ<ฬ่}มฤˆ*”ˆˆศd2ศd2=zดภ|!๊ึญ ™L†N:ฉฬห_.UญZ5ฺฺุbฦŒx๒ไIกํ%&&B&“แ๔้ำฏ๛๗฿WWWxxxผv]T:?๘#ถlูR`๚๑ใว1mฺดท๖sY฿|๓ BCCq๗๎ทR?ัยฤˆ*$]]]ฌ^ฝบภ๔C‡แึญ[ะัั)tน?+Wฎฤส•+1o<8::โป๏พรภ -ฟs็N˜™™มลลๅตโ๏ฟ๐ว 00๐ต๊ฉhZดhงOŸขE‹ๅJกŠKฆOŸึฟ.]บภะะ?๓[ฉŸ่mแใ\ˆจB๊ะก6lุ€E‹กJ•;Tญ^ฝNNNx๐เAกห5jิH๚อf Dvv66mฺ„ฬฬL้๗Z๓ํฺต ํท—~ฟตฌ๓OTฉRๅญํซสศศxํ฿ีะะ(ฐอิู“'OPตjUhhhภ฿฿+Vฌภ๔้ำ_{!zW8โGDR๏ฝ‘’’‚๛๗KำฒณณฑqใF๔้ำ็•๊ฒฐฐ€L&SI  55วGวŽฅikืฎ…““ `hhน\ŽŸ~๚ฉฤ6ถlูWWW่๋๋ซLฯฟฎ-!!จZต*>๐Clธภ๓LWWW่้้กqใฦ8pเ@บcccัพ}{B__mฺดมษ“'UสไŸ"?t่FŽ 333ิฉSGšฟ{๗nxyyกZตj000@วŽq๙ืซฐkฎ\น‚๎ปรยยบบบจSง––Vb}p๖์YธปปCOOึึึ +P&++ SงNล‡~ิญ[_5ฒฒฒค22™ ๘ใ?คำ๛ƒ ยดiำ0aย€ตตต4/99YZ๖ฯ?„““๔๔๔PฃF เๆอ›*1ไ๗ูณgัขE TญZ“&M’ๆ๑วธ~:โโโJตD?"ชฌฌฌเๆๆ†5kึHำv๏ดด4น\ff&fฯž๏พ๛III๐๔๔TI†J#;;พพพ8y๒$>s„††โณฯ>ร?Sชำช=B‡เไไ„9sๆ N:1b~wฉL^^0w๎\t๎‹/Fืฎ]ฑ`ม•0ฏ\น:::๐๒๒’N๏>Ÿ|๒ z๗๎ Xฐ`4ฯิิ0sๆL 0 6ฤ๙๓๑ๅ—_"22-Zด(ฐ)))h฿พ= .\ˆVญZI๓œœœ RฬCj@U แแแ€8sๆŒXฒd‰000Ož<BัฃGัชU+!„๕๊ี;vTY@กฏฎ]ปŠฬฬฬm๕๏฿_x{{K๏ฟ๘โ ahh(ž={๖J1๗฿€Xผxqy€Xฝzต4ํโล‹€ะะะ'Ož”ฆ๏ปWแแแาดฎ]ป mmmq๕๊Uiฺํท…hัข…4-ปyzzชฤŸžž.ŒลฐaรTโบ{๗ฎ022*0eQQQ€ˆŠŠB+ˆ 6ฟQ ‘ฟ-ๆอ›'Mหสส …B˜™™‰์์l!„+Wฎโศ‘#*ห‡…… โุฑcาดjีช‰h+$$Dืฎ]S™žœœ,455ลฬ™3Uฆ'&&Š*UชจLฯ7,,ฌศuาึึ#FŒ(q‰* Ž๘Q…ีณgO<}๚;v์@zz:v์ุQโi.]บ`ุฟ?ถnЉ'bฯž=่ำงฤ ?T”——‡={๖จœๆ566FFF†ส้ๅาHIITฏ^ฝะ๙๚๚๚*ฃ”7†ฑฑ1š4iWWWiz฿๓ 77๛๖ํCืฎ]Qฟ~}ฉœฅฅ%๚๔้ƒฃGBฉTชด5lุ0hjjJ๏๗๏฿ิิT๔๎[ }๐เ455แ๊๊ŠจจจWZW###ฯGK‹บSบ8UชTม๐แรฅ๗ฺฺฺ>|8๎฿ฟณgฯ6lุ€&MšภฦฦF%ๆึญ[ภ+วขM›6!//={๖Tฉยย 6,PทŽŽ\d}ีซW/๒zSขŠˆ7wQ…ejj ฌ^ฝOž}ŠŒŒ ้}ตjี ฝ›8?ฑ|y'Ÿ|MMMLŸ>ฝภศชขภ>PœkKฝ QyใˆUxE๊Fa._พŒ?ภ๓‡ํž๐C๔๏฿ภ๓ำผบบบ*ๆ€กC‡โแร‡hบ5๊ิฉƒ๋ืฏc๑โลP(%Ž๊t้าAAAP*•ฏ|\qfฬ˜๛๗รำำ#GŽD•*Uฐt้Rdeeaฮœ9%.ohhˆ_~๙๛๗GณfอSSSธq;w๎„‡‡–,YR๊x<ˆัฃGฃGhิจž={†•+WBSSปw/q๙Zตja๖์ูHNNFฃFฐn:ฤลลaูฒeา๕u๛๗ว๚๕๋ˆจจ(xxx 77/^ฤ๚๕๋ฑw๏^8;;xH•`๙จUซฌญญแ๊๊*%‘AAA€––:w๎Œ `ฦŒ˜8q"’““ัตkWเฺตkุผy3>๛์3|๕ีWฅฺ๛๗๏ว|GGวRo?ขrW~7๔โใ\ŠSšวนhjjŠ:u๊ˆฯ>๛LปwO*็๏๏/:t่P ฮ7Šถm 333กญญ->๘เ1|๘pq็ฮใพw๏žจRฅŠXนrฅสtoooัดiำRลŸฟฃFR™v๎9แ๋๋+๔๕๕EีชUEซVญฤ๑ใวUส”ดขขข„ฏฏฏ022บบบขAƒbะ A"&&ฆุ๕z๙q.๓2dˆhะ ะีี5jิญZต(ถ!o[ฤฤฤ777กซซ+๊ีซ'–,YR lvvถ˜={ถhฺดฉะััีซWNNNb๚๔้"--M*w๑โEัขE กงง'จ<ฺๅ‡~ตkืํ๒ฟOxzzŠjีช‰jีช 1jิ(q้าฅ๑&77WXZZŠษ“'—ธD‰LˆืธŠ˜ˆ่=๓์ู3˜˜˜ 88#GŽ|ฃu๚้งธ|๙2Ž9๒F๋ฅŠgห–-่ำงฎ^ฝ KKห๒‡จิ˜๘‘Zน>~๙g >a฿ธq5Bdd$<<"""ช*Mโ๗๋ฏฟB.—รมมSงNENN~๑GLž<นTห+•Jดnอš5ƒฃฃ#Ž=  ยฝ{กP(ฐjี*๗฿h฿พ=ไr9|}}q๏=8p?๔ๆอ›‡nบฉิ+„ภ๛ัฝ{wtํฺะนsg\นr …‰‰‰*ๅgฬ˜;;;ุc๛๖ํฏ‘#GะคIฬš5 ๗๏฿อIDDD•P•๒เMHHH@hh(Ž;CCC<|๘๓็ฯวภ Œพ………ƒฐฐ0,_พzzzุบu+ p๋ึ-t๏งNยฬ™3†ตkืFމ?ใฦรฯ?Œ   ,_พฐฐฐ@`` เมƒGDDš6mŠภภ@๘๘๘6nˆ€€œ|777ดjีชิฑ€‹‹ ยรรัฒeKุ#00-[ถ,tปeee!++KzฏT*_ฏ#ˆˆˆจBซ#~ััั€กก!เ้ำงุทoX l`` ”œ9;;c๙๒ๅžฬ}๕ืหๅ่ิฉฮŸ?_h[วGฟ~๚๕รฑcว ”น}๛6๊ิฉƒ„„DGGc๚๕๘๘ใ!“ษŠ]ใวร฿฿:::ฐดดDณfอp๙Rวๆๆๆ๘๖oqy๔ํ=z๔ภ็Ÿ^hูเเ`Iฏบu๋ฝ฿*Eโ๗ฒธธ8$%%มฺฺžžžˆ…ŸŸ_ฑหฌZต ูููˆ‹‹C\\kตonnŽ•+Wโฮ;๐๓๓รoฟ†ŒŒŒ2ื๗ชฑลฦฦbิจQ?~<>๔SŒ?พะr'NDZZš๔บy๓f™c$""ขŠฏR$~ญ[ทฦฺตkฅS•nnnธs็’““q๔่Q8::bถmลึกT*affMMMlธQJิ T๎าuwwวบu๋ซWฏ†งงgบ455ัฃG8p+Vฌภล‹!—ห๑ีW_ƒปป;6oŒœœฝ{ฑฑฑhฺดiฉc;w๎\\\0~xx{{ใฏฟยฌYณ`eeUh{:::044TyQๅU)?;;;Œ=๎๎๎pppภขE‹Š,&]็ƒกC‡๚๔้ƒƒย‡†นน9ภOŸ>•n ˜6mvํฺ{{{lฺด 3fฬ(6ถ† "$$/^”ฎ๑+สG}„Ž;ยััmถลขE‹ ฏฏ_ุ๊ชVญŠUซVแเมƒ่ีซดตตKฝ ‰ˆˆจ๒“ >ƒ?ฅR ###8MŠลพ}๛pเภ#^า฿ฮฮฮR&„ภื_ฃGBSSwกm?~ำฆM๔๋ื‹/t๋ึ ซWฏฦoฟ&%rPซV-ธนนaำฆMจWฏ^ฉึ'&&mถ…ฑฑ1 C‡8u๊ฌฌฌฐ`มlถ ภ๓ำะw๏-ด###Œ5 ฃFยัฃG1`ภ,[ถ ทo/ด|pp0ฆOŸ^ช๘ˆˆˆ่๗^Ÿ๊}Q\\’’’`mm OOOฤฦฦยฯฯฏุeVญZ…์์lฤลลฉ$nฅ•““ƒkืฎAŒŒ i๚† PญZ5๘๙๙aแย…HIIyๅบ๓EEEแ๔้ำ8}๚4โใใammญ2J๗ฒ+Wฎเ›oพม!Cะพ}{iDฑ0'NDZZš๔บy๓f™ใ$""ขŠ๏ฝMZทnตkืJง'p็ฮ$''ใ่ัฃptt”FษŠขT*affMMMlธQJ žž.•swwวบu๋<ฟ1รำำภ๓3___Lž<cฦŒ‘สทkื›7oฦ๎ปฅำณ}๚๔)6DFFBฉTโ๑ใวุฝ{7\]]กT*QฃF ่่่เ๔้ำธpแBก1&''ฃUซV่ท/6lˆุุX„††ยฮฮฎศ6utt`hhจ๒"""ขส๋ฝM์์์0z๔hธปปรมม‹-*ฒlXX˜t_LL † ่ำง<{{{>|ๆๆๆ{{{<}๚Tบนcฺดiุตk์ํํฑiำ&ฬ˜1็ฯŸว๗?L™2 ภฃGฐcว•vkีช…)Sฆเย… %&~ตkืฦ7฿|www4ocวŽ…••|}}‘’’‚ฆM›bม‚ppp˜˜˜ภ๖๖๖ A•*U0o<œ>}C‡Eตjีสผm‰ˆˆจr’ !DyAƒRฉ„‘‘†yUช•w8TMไขตฦUฬk€\ผc‹่ํ`Ul์ŸŠฏ<๛hIท&๏ดฝ7%๛;--ญฤณw๏ํˆฝ&~DDDDj‚‰‘š`โGDDDค&˜๘ฉ &~DDDDj‚‰‘š`โGDDDค&ช”wT๑ฬlื&&&ๅ"''ปv]ลNกฅฅUแP!ุG๛งโcฝ]๑#"""RLˆˆˆˆิ?""""5มkจ€u๑Bฯ ฃผร ยไๅข€?ฯ4๘๓๛จbcT|๏จป|๐ึ๊ฎศ8โGDDDค&˜๘ฉ &~DDDDj‚‰‘š`โGDDDค&˜๘ฉ &~DDDDj‚‰‘š`โGDDDค&Jโ็๏๏ๆอ›—ชlฯž=แเเ€UซVฝPJิฒeK\ผx๑ถyแย888ภััทoG@@@™ู๊ฒe ๛๏7UVo<๑ฟ?45K๗+w๎มๅห—พ}๛ชฬหออ}ำกฝqฏใฃG 8ฐ@ูภภ@œฑ|๙๒"๋ํัฃเ๘๑ใ๐๗๗‡ŽŽ,--ัฌY3œ?เ๎๎Ž๊ีซริิFFF่ิฉภฮฮ7n(ดSงNมวว–––€5jH๓ŽŽŽHNNธq>>>หๅXบt)’’’ค๒ษd'''๔๋ืkืฎ…ŽŽ`ผy๐๖๖†งง'’’’0cฦ XYYณ5!ญsฟ~๚๕รฑcวJŒๅeอ›7ว๏ฟŽ˜˜<~VVV8}๚tกe'Nœˆดด4้•?ฺIDDD•ำปฦ/..IIIฐถถ†งง'bccฅ„๊UTญZตฤ2ฺฺฺา฿า{ 2]˜Ÿฐฝธ˜1c0y๒d$&&b๖์ูศสส*4ฦ;wbฤˆ8tฺ่ตkเyา6qโDฬž=C† ม‘#G^9ฆหหฒณณฑn:|๒ษ'8v์–-[{{๛"ืะะPๅEDDD•W™ฟึญ[cํฺตาuannnธs็’““q๔่Q8::bถmeฬ›7oFNN๎ฝ‹ุุX4mฺดฬ๕5oภ;w>,ถผRฉ„ฅฅ%๒๒๒ฐrๅสBหไๅๅแึญ[๐๑๑มผy๓p๙๒e€นน9&OžŒ๓็ฯ# !!!ฐณณรพ}๛Šmำ๋ึญฌ^ฝžžžลฦb``€๔๔t้ผy๓`ccƒจจ(ฬ;'Ožฤ!C ซซ[ยึ!"""uPฅฌ ฺููa๔่ัpww‡ฆฆ&บu๋†iำฆZ6บนภภ@ฤฤฤ ,,ฌุำฝ๐ัGกcวŽptt„††-Z}}ฒ† 333,Xฐ@•suuลฒeหŠ,w฿ก}๛๖011‡‡RSS ”ษออEŸ>}žž!พ{•๙่ะก:t่€[ทnI7keฺดi8p ~๕WXXXHI^Qฑ`ุฐa˜9s&Ž9…B„„„ืฺNDDDTyษ„ขผƒ ŠAฉTยศศก‘๑ะ30.๏pจ0yนจq7-์า=6‰1๖Qลฦฉ๘Q v๙เญีฎๅงฅฅ•xูนƒˆˆˆHM”๙ToEึญ[7\ปvMeฺ–-[Jug-QeU)ฟ—ŸGDDDD<ีKDDDค6˜๘ฉ &~DDDDj‚‰‘š`โGDDDค&*ๅ]ฝ๔zz9ิ†‰‰Iy‡A…ศษษมฎ] ่ืฌดดดส;*๛จbcT|์ฃท‹#~DDDDj‚‰‘šเฉ^*เlฒ๘–Q^๎3ภ้า กษoEฤ>ชุุ?_e๎#ทห;Ž๘ฉ &~DDDDj‚‰‘š`โGDDDค&˜๘ฉ &~DDDDj‚‰‘š`โGDDDค&˜๘ฉ &~DDDDjโฝHฦ;;;„„„”z™ˆˆD5#GŽ„ฏฏ/<==แ์์ŒซWฏBCCiii022Bห–-›๋ •ืืืGห–-MMMธธธ`ฯž=ฐฒฒ’ฺW*•pssร_…๋ืฏ# @Jิเๆอ›๘๕ื_ฑvํZxzzโณฯ>C๓ๆอััั รฺตkUbXฟ~=Vฏ^อ›7ใฏฟB=p๑โEฝภ๔ฝ1ภภจ๚+๔ฝ+yนฯ๐เโ1ิด๑€†ๆ{1`ฏvุG๛งโซฬ}ไ๖ก๑[ฉWฉTยศศiii044,ถl…๑{Q||<<<< —หฑ}๛v$%%มศศ๚๚๚:t(ถm}}ืj#&&mถ…ฑฑ1 ะกCœ:u ฐ`ม888ภหห ษษษRา๘ขำงOรฺฺOž๔ำทาvTTNŸ>ำงO#>>ึึึศสส*Pฮห–-รัฃGัฝ{wฌ_ฟูููenwแย…hธ1Yh›/:rไŒูณgcาคI่ืฏ_‘eutt`hhจ๒"""ขส๋ฝJ222`jjŠฬฬLฌ[ท๐๘๑cคฅฅมฯฯsๆฬA\\ภภภ้้้ฏ†‹‹ "##กT*๑๘๑c์ฝฎฎฎP*•จQฃ†tส๕ย… …ถฃซซ‹!C†เไษ“ มมƒaccS์ศธปปcร† Bเ๙๓x๚๔)ฬออกT*aaa™L†ˆˆฉหํ๎ทvvv˜;w.z๗๎๓็ฯ#((ๆๆๆฏผ ˆˆˆจrzฏNžกYณf077‡ฃฃ# ==~~~ศฮฮ†L&ร?4h๚๗๏SSS9rคิmิฎ]฿|๓ cวŽ…••,,,ŠฆM›ยุร๛๗ว„ คบ ยยย๐๘๑c้tqQq๘๐aศๅrhkk#<<๒ห/่าฅ‹TพUซV˜5k1|˜˜˜`ฯž=จSงNฉื•ˆˆˆิห{qsฝ๙‡๒ๆŽŠซ2_๔\Yฐ*6๖OลW™๛ˆ7wั;SนR้"ธบบธ)โ๔้ำะึึ.งˆˆˆˆˆ=ตHJบพŽˆˆˆH๐T/‘š`โGDDDค&˜๘ฉ &~DDDDj‚‰‘šP‹ปz้ี8Yยฤฤธผร Bไไไ`ืEเฃ๚Fะาา*๏pจ์ฃŠS๑ฑ.Ž๘ฉ &~DDDDj‚งzฉ€๛‘-ห.๏0จนUt^ฟโภฺะ|–YแP!ุG[e๎ห๕ส๒๑#"""RLˆˆˆˆิ?""""5มฤˆˆˆHM0๑#"""RLˆˆˆˆิ?""""5มฤˆˆˆHM0๑#"""RLˆˆˆˆิD™ฟิิT,_พผศ๙%ึq่ะ!4mฺ^^^e ใตDGG# เท;n8ุูู!$$-[ถฤล‹_นŽ’ถ?ัหZโWซWฏฦฬ™3qไศ•้นนนฏU๏ป๐ช1>z๔H๚{๕๊ีHLLฤ„ สห?##999eฎˆˆˆ*ฟR'~ทo฿†‡‡ ์ํํ1~x$&&BกP $$่ึญlmmXb}+Vฌภ† 0~xŒ5 ๐๗๗‡ทท7๚๗๏ฟ^^^ฐททGฯž=‘‘‘hูฒ%ฦGGGธธธ &&mฺดA๚๕ฑs็ฮ"S*•่ำง์ํํกP(เyBึนsg4lุ3gฮ”สw๊ิ NNNหๅุดi 99 …={๖„ญญmmRุศษ“'1hะ 8;;‘’’GGG์ปWฅlxx8์์์`gg‡eห–KPPส๖ฟ|๙2lll„๋ืฏ—ธ ++ JฅRๅEDDD•Wฉฟ5kึภววqqq8{๖,fฬ˜น\Žธธ8L˜0กกกฐถถFRRฺทo{๗๎Iห* ้๏กC‡"&& €ŸŸBCC HHHภŽ;ฐz๕jŒ3cวŽEBBฌฌฌฐ`มฉฤฦฦยำำฃGฦฮ;ฑeหฬ˜1ฃศ๘ฟ{4jิ ˆ‰‰AฃFฑฑฑˆˆˆ@||<ยยยคsลŠ8{๖,Ž;†๏พ๛Bภ๙๓็1u๊T\บtฉภ6ฉWฏ ==aaaprrย๔้ำัฅK\บt ฐqใF˜˜˜ ..พพพR|ทnยฬ™3q๔่Qœ8q๓็ฯGrrr‘ฑฬœ9Se๛;::โนsจUซบu๋†Ž;b๛๖ํลŽLรศศHzีญ[ทฤ€ˆˆˆ_UJ[ะลลƒ ‚††z๔่ชUซชฬ?~8&Mš่าฅ‹สธธ8้๏โNทkืา2Ÿ|๒  _ฟ~๘ๆ›oคr:uศๅrศd2่๊๊ยฮฮ7n(ฒ๎ƒbืฎ]€*Uชภะะเแแ€ตต5n฿พ† bม‚ุถm€็#}w๏4iาM›6-t›ฺฺุjีช777lฺดIJKƒถmยุุะกCœ:uJJz ‹ๅeFFF5jF…ฃGbภ€Xถlถo฿^h๙‰'bธqา{ฅRษไˆˆจ+๕ˆ_‹-p๘๐a˜™™ก{๗๎ˆŒŒ,PF&“ฝV0/'“Eัึึhhhจ]–kuttคฟ๓๋ˆŠŠย้ำงq๚๔iฤววรฺฺYYYb,j›lุฐีชUƒŸŸ.\ˆ”””WŽ+_qฑๆส•+๘ๆ›o0dศดo฿มมมลฎปกกกส‹ˆˆˆ*ฏR'~ืฏ_‡ฅฅ%FŒ€€คฆฆ"==]š๏๎๎Žu๋ึv์ุ'OžผV` …BฉZฝz5<==_ซ>„……ž={ฆ๛ห”J%jิจœ>}.\(ดห$11ภ๓‘หอ›7c๗๎P*•pssCŸ>}Šฯลล‘‘‘P*•x๘1v๏ WWื"c100PY‡ไไdดjี }๛๖Eร† ‹ะะPุููฝาv"""ขสซิ‰_tt4์ํํแ่่ˆ#GŽ`เภฐทท‡ฝฝ=BBB0jิ(๗฿hฺด)v๎ sssiูยฎ๑+ษขE‹0gฮุใŸม—_~๙J+๖ฒ๏พ๛—/_†\.‡‹‹ ._พ\dY___คคค iำฆXฐ` -๗๒6้ืฏŸสZตjaส”)ธpแB‰‰_ํฺต๑อ7฿ภอ›7วุฑcaeeUd,&&&*ฟJ•*˜7oNŸ>กC‡ขZตjฏธ…ˆˆˆจฒ“‰ปHํ)•J!ษ฿ฦฒ์๒‡ ‘[Eg{ งuร ๙,ณผรกBฐ*ถส?–๋+ว“rrrฐkื.t่ะZZZๅฮ{!๛;--ญฤหถ๘หDDDDjขิw๕พ/๖๎ซr0๐šปYณf•SDDDDDCฅK|}}UžGDDDDฯ๑T/‘š`โGDDDค&˜๘ฉ &~DDDDj‚‰‘šจtw๕า๋3 ป“๒ƒ ‘““์ฺ๓?ๅƒM+(๖Qลฦ!uว?""""5มฤˆˆˆHM๐T/ท์ไ้ไ•w๔iŒ;R!Q%ม?""""5มฤˆˆˆHM0๑#"""RLˆˆˆˆิ?""""5มฤˆˆˆHM0๑#"""RLˆˆˆˆิ?""""5Q)ฟิิT,_พผศ๙eฎ;""<(ฑธqใ`gg‡ห:tM›6…——"""๐ํท฿พีุˆˆˆˆ5I^Gi“ซีซW#11&L(t~^^าาาคฒ3gฮฤ‘#ฏ๗S\/ว๖่ัฃืชˆˆˆ*ท๗2๑ป}๛6<<< P(`oo๑ใว#11 …!!!ศศศ@ทn`kk‹ภภภRีุc๐เมศหหรๆอ›ƒnบมหห ;;;ุููaูฒeคคคภัั{๗๎Uฉ๗๛F“&MpไศฌXฑ6lภ๘๑ใ1jิ(•ฒ7ผผผ`oož={"##ใ•bฺ๋ต+qเภ!^kQๅ๓^&~kึฌโโโp๖์Yฬ˜1rนqqq˜0aBCCammคค$ดo฿๗๎“–U(า฿C‡ELL  gฯž8sๆ  งง‡ํทฃ[ทnpvvฦๆอ›qไศบu 3gฮฤัฃGqโฤ ฬŸ?ษษษุธq#LLL___@TTz๕๊…–-[B&“แ๐แร่ิฉ ???„††"44TeฝฦŒƒฑcว"!!VVVXฐ`Aฉc€่่h >K—.…ๆฮ[์heVV”Jฅส‹ˆˆˆ*ฏ๗2๑sqqมส•+1}๚t\นrzzz*๓?Ž€€@—.]PตjUi^\\œ๔๗๒ๅหแ์์ ˆ‡‡‡ไr9ถo฿Žคคคํฦฤฤ mถ066†:t่€SงN(๗๙็Ÿฃgฯž่ืฏฮŸ?oฟๆๆๆ%ฎW\\>๙ไ@ฟ~p์ุฑRว2™ 16lุ€่่hฤลลกN:ธ}๛vกๅƒƒƒadd$ฝ๊ึญ[bŒDDD๔z/ฟ-Zเ๐แร033C๗๎Y ŒL&{ฅ:‡ †ˆˆ$&&โ‹/พ@VVV™ใ?~<† ‚qใฦaิจQ*ษfYผJl?ฦoฟ???ฝ{+Wฎ,2้œ8q"าาาคือ›7_+N"""ชุหฤ๏๚๕๋ฐดดฤˆ#€ิิTคงงK๓ฑn:ภŽ;๐ไษ“๋ฬศศ€ฉฉ)233ฅeภภภ@ชลล‘‘‘P*•x๘1v๏ WWืuYYYa๖์ู8<ผฝฝ1n8|๔ัG8w๎\ฑ1( l฿พภ๓@<==K|๕ีWฐททวล‹ฑrๅJ8p=z๔€ฆฆfกํ้่่ภะะPๅEDDD•W•๒ ,ขฃฃ1gฮhkkรฤฤkืฎELL ์ํํัฟŒ5 }๛๖EำฆMัขE •/…B!ภ :pvvFPPš5ksss8::Jๅ „๛ริิGŽม7฿|wwwภุฑcaeeUdœฺฺฺ่ีซz๕๊…K—.•xรลขE‹0x๐`มฦฦแแแPุ๊|||๐ใ?B[[๛U7)ฉ™เํŸ๔)•Jแ-`ข“Wแะง1๎๛“““ƒ]ปvกC‡ะาา*วจจ(์ฃŠS๑ฑ^]๗wZZZ‰g๏หSฝDDDD๔๊˜๘ฉ &~DDDDj‚‰‘š`โGDDDค&˜๘ฉ &~DDDDj‚‰‘š`โGDDDค&หŸlฃทKใณMะ01)๏0ˆˆˆ่ ใˆ‘š`โGDDDค&xช— ศ„ผช5*ข}Š‘#Gโศ‘#ฐฐฐ@ห–-แใใOOOฬš5 5jิ@NNัซW/ฬœ9ฟ๖›๐<ษฐa† >ปw‡ŽŽNก8++ YYYา{ฅR๙๚GDDDV…M\\\0hะ hhh GจZตชสใวcาคI€.]บจฬ1ส?=์ู3่๋๋c่ะกฺ่ต+:v์Xhป๐๕๕-t๑ใวังOศd2ศๅrTญZ๗๎+Pฮฺฺฺูู๘ใ?`ggWช๕ฝt้lmmQทn]@ฏ^ฝp์ุ1xzzb๕๊ี๘ํท฿››‹›7oโส•+จYณf:๔๔๔0`ภ 0๕ €เเ`$&&ฺfpp0ฆOŸ^ช๘ˆˆˆ่WaO๕ถhั‡†™™บw๏Žศศศed2Yฉ๋ซRฅ bbbะตkWฌZต Ÿ~๚iกๅ^N0หbูฒehฺด)z๔่3fเ฿-s]๓–.]Šร‡#!!*ฃt/๛๗฿๑ร? GฐณณรฒeหŠ,;qโDคฅฅIฏ›7o–9N"""ช๘*lโw๚uXZZbฤˆ@jj*าำำฅ๙๎๎๎Xทn`วŽ%ุ๐๘๑cคฅฅมฯฯsๆฬ‘F T๊}™††๒๒๒ค67lุ!ฮŸ?งOŸยผภ2nnnXฑbŽ;†jีชมืื~~~HKK+ฒฦใย… ธ}๛6ž={† 6ภรร้้้000€พพ>’““ฅSร/ว–ฟnพพพะืืว๑ใวฑbล ธนนูฆŽŽ U^DDDTyUุSฝััั˜3gดตตabb‚ตkื"&&๖๖๖่฿ฟ?F…พ}๛ขiำฆhัข…JVุ5~ตkื†ŸŸฒณณ!“ษ๐ร? „๛ริิGŽ)Gฟ~ —หัถm[ฬ›7‡†\.‡ถถv›3^VฃF Œ;cวŽEtttฑe๕๔๔Š๖ํ#77๐๔๔4hะ666hะ <<< mฺดi7nZถlYŠญKDDD๊H&„ๅU JฅFFFธ็p˜TญฐจตhbFkt่ะZZZๅ"''ปvํbUP์ŸŠ}๔๊๒ฟฟำาาJ<{WaO๕ั›ลฤˆˆˆHM0๑#"""RLˆˆˆˆิ?""""5มฤˆˆˆHM0๑#"""RLˆˆˆˆิ?""""5มŸg 4ฺอ„†‰Iy‡A…ะศษvํ*๏0ˆˆ่=ล?""""5มฤˆˆˆHM๐T/—๔?ไ๊•wT€๒Ž€ˆˆc๑#"""RLˆˆˆˆิ?""""5มฤˆˆˆHM0๑#"""RLˆˆˆˆิ?""""5มฤˆˆˆHM0๑#"""R•&๑KMMล๒ๅห‹œoaaQฆz#""๐เมƒห7vvv )ฑ์กC‡ะดiSxyy!""฿~๛ํ[ˆˆˆPฃฤฏฌJ›\ญ^ฝ‰‰‰˜0aBก๓๓๒๒––&•9s&Ž9๒Fc{๔่ัkีGDDD•{›๘พ}P(ฐททว๘๑ใ‘˜˜…Bddd [ทnฐตตE```ฉ๊œ0alllเเเ€lผ111่ึญผผผแแแฐณณƒ–-[๐๗๗GJJ ฑw๏^•:๏฿ฟเเ`4iาGŽมŠ+ฐaรŒ?ฃFR)๛๗฿รหห ๖๖๖ู่ณ'222aaapqqฝฝ=ŒผผผBcฺ๋ต+qเภ!^k๛Qๅ๓&~kึฌโโโp๖์Yฬ˜1rนqqq˜0aBCCammคค$ดo฿๗๎“–U(า฿C‡ELL RRRฐqใF$%%!>>Ÿ}๖บu๋ggglผGŽมญ[ท0sๆL=z'Nœภ๙๓‘œœŒ7ยฤฤqqq๐๕๕DEEกWฏ^hูฒ%d2>ŒN:aภ€๐๓๓Chh(BCCUึiฬ˜1;v,`ee… z๖์‰3gฮ !!zzzุพ}{ุ ::ร‡วาฅKagg‡นs็;Z™••ฅRฉ๒"""ขส๋ฝM\\\ฐrๅJLŸ>Wฎ\žžžสใว# ะฅKTญZUš'ฝ|๙r8;;รศศ๚๚๚:t(ถm}}mฦฤฤ mถ066†:t่€SงN(๗๙็Ÿฃgฯž่ืฏฮŸ?oฟๆๆๆ%ฎS\\>๙ไ@ฟ~p์ุ1@||<<<< —หฑ}๛v$%%บผL&รวŒ 6 ::qqqจSงn฿พ]h๙เเ`Iฏบu๋–#ฝฟฤฏE‹8|๘0ฬฬฬะฝ{wDFF(#“ษJ]_•*Uƒฎ]ปbีชU๘๔ำOห๘๑ใ1dศŒ7ฃFRI4หbุฐaˆˆˆ@bb"พ๘โ deeY๖๑ใว๘ํท฿เ็็‡ปw๏bๅส•E&'NDZZš๔บy๓ๆkลIDDD{›๘]ฟ~–––1bššŠ๔๔tiพปป;ึญ[ุฑcž|ˆํทฟRบบบ2dNž<‰"""ช^+๑ป}๛6<<< P(`ooใวซผฟx๑"‚‚‚˜˜…BDDDภ฿฿่฿ฟ?๎ป‡.]บภูู^^^ธ|๙2 ,, ...ฐททวเมƒ‘——hูฒ%ฦGGGธธธ &&mฺดA๚๕ฑs็ฮ"c6m 777|๕ืธrๅ >๘c899ก]ปvธw๏ภสส ™™™€ˆˆ|๛ํท€ &ภฦฦ €"๋xQrr2&Mš\พ|ณfอยฑcวะปwoฬœ9Sฅ์™3gเ์์ น\Ž#FH ๊ิฉSแโโ;;;Lš4 Šทoรีีฝz๕8;;c๐เม8u๊Tฉ๚/++ JฅRๅEDDD•ืk%~kึฌโโโp๖์YDEEฉผฏWฏfฮœ น\Žธธ8L˜0€;v`๕๊ี;v,ฆNŠ˜˜ฬŸ?ใฦ๔์ูgฮœABB๔๔๔ฐ}๛vฉ]ฤฦฦยำำฃGฦฮ;ฑeหฬ˜1ฃุxฏ^ฝŠร‡cผy5j–/_ŽณgฯโำO?ล?Pไr)))ุธq#’’’ฯ>๛ Šฌ#77ถmC‡๐ษ'Ÿ vํฺ8w๎๑ํท฿ยูู›7oFPPJ;ƒฦาฅK‘˜˜ˆ‡bอš5€/พ๘Bฺ ˆวจQฃPซV-œ:uJ9ผt้0mฺ48;;c้าฅx๘q‘๋ ###้Uทnbทฝ฿ชผฮย...4h444ะฃGxyyฉผทตต-tนvํฺมภภp๐เA$%%I๓455๑๑๑˜}๚ภออ Jฅปw๏ฦๆอ›ัฎ]ป7ทแˆˆˆ่ฝ๖Z‰_tt4์ํํแ่่ˆ#GŽภสสJๅ}ฟ~`bb{{{ุK7Eผh๑โลุฝ{7`gg' „fอšกUซVptt|0 ตjี*„„„ภมม …Bบ!b๒ไษ0`QซV-@zz::v์t้าEบ–ฏจ:๒UซV C‡ล™3g0w๎\TฉR๋๏ฟŽO?rนFFF€ฑฑ1z๗๎&Mšเ“O>›››T~ุฐa๐๒๒’n๎่ำง.^ผˆ)SฆHฑๅ“ !DyAƒRฉ„‘‘พ=U ^๋*€w*ฤcvy‡๐ฮไไไ`ืฎ]่ะกดดดส;*๛จbcT|์ฃW—––CCรbห๒—;ˆˆˆˆิฤ๛3ฌSJ{๗๎ล7฿|ฃ2ญ]ปv˜5kV9EDDDDT1TบฤฯืืพพพๅQ…รSฝDDDDj‚‰‘š`โGDDDค&˜๘ฉ &~DDDDjขาีKฏoฒห$˜˜˜”wDDD๔†qฤˆˆˆHM0๑#"""R<ีKlg ๔Rt฿X} }cuQูqฤˆˆˆHM0๑#"""RLˆˆˆˆิ?""""5มฤˆˆˆHM0๑#"""RLˆˆˆˆิ?""""5มฤˆˆˆHMT๚ฤ/55ห—//๏0Tdffขu๋ึpttDTT,,,สTO\\8๐†ฃ#""ขสJญฟwหฃGฑฑฑ044Dll,ZตjUๆ๚^NRSS_7D"""ชฤ๋ฤ๏๖ํ๐๐๐€Bก€ฝฝ=Ž?ฎ๒โล‹ Bbb" BBBx{{ฃธw๏บt้gggxyyแ๒ๅห€ฐฐ0ธธธภƒF^^ eห–?~<แโโ‚˜˜ดiำ๕๋ืวฮ; ฤ๘์ู3lฺด mถล่ัฃ‘ššŠ๛ใะกCP(HII‘สๆๅๅa๔่ัฐณณƒ““Nž< ธz๕*<==ัฌY3ธนนแย… ศออล”)S…Bจจ(ฌYณ …Rฉ|=@DDD๏“๗:๑[ณf |||‡ณgฯ"**Jๅ}ฝz๕0sๆLศๅrฤลลaย„ €„„์ุฑซWฏฦุฑc1u๊Tฤฤฤ`๙7n gฯž8sๆ  งง‡ํทKํš˜˜ 66žžž=z4v๎‰-[ถ`ฦŒR™›7obส”)ฐตตลŽ;๐๗฿cีชU066ฦ๒ๅหแ๋๋‹ธธ8˜˜˜HหlธทnBbb""""0hะ €ฅฅ%"##q๎9๔ำO˜4i455๑๗฿c๐เมˆ‹‹CซVญ0bฤlบw๎ณณ3† †ณgฯนฒฒฒ T*U^DDDTyU)๏^‡‹‹   ๔่ั^^^*๏mmm ]ฎ]ปv000วGŸ>} “ษ —หQตjUปwฺฺฺ5j ฉฉ‰ฬฬฬ"๋ฐฒฒยŒ30mฺ4๙็Ÿhัขพ{Œ?พ@ูเเ`LŸ>ฝTฑั๛๏ฝ๑kัข> 333t๏999*๏### ]ฎjีชา฿2™ ็ฮC\\œ4Rร† CDD๑ล_ ++KZF[[ กกก๒w5ƒ๖๖๖XถlŽ=Š๎ปc๚๕ศฮฮ.๓z.\ธ7Fbb""##Ub)ฬ‘#G0x๐`ฬž=“&MBฟ~ -7qโDคฅฅIฏ›7o–9F"""ช๘๋ฤ๏๚๕๋ฐดดฤˆ#€ฃGชผOLL„าำำ‹ฌรหหKบ๙#//‰‰‰€ŒŒ ˜šš"33๋ึญ{ฅธtuu1dศœŒŒ่‡MSS๓ึง๎u€กก!๛จื ฐ*j}๙ุ?ปN€}๔ชJ;`ร›;่ญ5j๋ฌเ—u_๊|—uำuฒิณฮทแ}Y๗ทฝ=eข4W’ZP*•022BZZฺ[๙๏^๛จโcUl์ŸŠ}๔vqฤ$:::˜:u*tttส;*๛จโcUl์ŸŠ}๔vqฤˆˆˆHMpฤˆˆˆHM0๑#"""RLˆˆˆˆิ?’„††ยสส บบบpuuล้ำงห;$ต4mฺ4ศd2•—4?33ฃF‚‰‰ ๔๕๕ัฝ{wปwฏ#ฎ>Œฮ;ฃVญZษdุฒe‹ส|!ฆL™KKK่้้มววWฎ\Q)๓๐แC๔ํ†††066ฦงŸ~ŠวฟรตจJ๊ฃAƒ๘\ตkืNฅ ๛่ํ †‹‹ `ff†ฎ]ปโาฅK*eJslปqใ:v์ˆชUซยฬฬ &Lภณgฯๅชผ๗˜๘`บu7nฆNŠs็ฮมมมพพพธ~y‡ฆ–š6mŠ;w๎HฏฃGJ๓ฦŽ‹ํทcร† 8t่n฿พO>๙คฃญ222เเเ€ะะะB็ฯ™3‹-BXXN:…jีชมืื™™™R™พ}๛โ๙๓ุฟ?v์ุร‡ใณฯ>{WซP้•ิGะฎ];•ฯีš5kTๆณžC‡aิจQ8y๒$๖๏฿œœดmR™’Žmนนนุ่ฑ#ฒณณq๘q๑วˆˆˆภ”)Sสc•_‚H๑ัG‰QฃFI๏sssEญZตDppp9FฅžฆN* —šš*ดดดฤ† คi.\ฤ‰'Q„๊ €ุผyณ๔>//OXXXˆiZjjชะััkึฌB‘””$ˆ3gฮHev๏-d2™๘๗฿฿Y์๊โๅ>BˆŠ.]บน ๛่บพ :$„(ฑmืฎ]BCCCฝ{W*๓ห/ฟCCC‘••๕nWเ=ฦ?Bvv6ฮž= iš††|||pโฤ‰rŒL}]นrตjีB๚๕ัทo_ธqp๖์Yไไไจ๔• >๘เ๖U9นvํ๎ฝซา'FFFpuu•๚ไฤ‰066†ณณณTฦวว8u๊ิ;Y]EGGรฬฬ 7ฦˆ#’’"อcฝ[iii๏7โKsl;qโไr9ฬออฅ2พพพP*•8;Œฦฤ๐เมไๆๆช|˜ภw๏-งจิ—ซซ+"""ฐgฯ๒ห/ธvํผผผžžŽปw๏B[[ฦฦฦ*หฐฏสOv/๎๓s๗๎]˜™™ฉฬฏRฅ jิจม~{Gฺตk‡+V 22ณgฯฦกC‡ะพ}{ไๆๆ`ฝKyyy๘๒ห/แแแ;;;(ีฑํ๎ป…~ฮ๒็Q้T)๏ˆHU๛๖ํฅฟํํํแ๊๊Šz๕๊a๚๕ะำำ+วศˆ_า฿rน๖๖๖hะ ขฃฃัฆM›rŒLŒ5 ๕—สตห๔๎pฤPณfMhjjธ{๊ฝ{ฐฐฐ(งจ(Ÿฑฑ15j„ฟศฮฮFjjชJ๖U๙ษ฿๎ล}~,,, (๕์ู3<|๘VN๊ืฏš5kโ๏ฟภ>zWF;v ** u๊ิ‘ฆ—ๆุfaaQ่็,•?‚ถถ6œœœ)MหหหCdd$ส12€วใ๊ีซฐดด„““ดดดT๚๊าฅKธqใ๛ชœX[[รยยBฅO”J%N:%๕‰››RSSq๖์Yฉฬมƒ‘——WWืw3ทnBJJ ,--ฐ6!Fอ›7ใเมƒฐถถV™_šc›››U๔๛๗ระะถถถ๏fE*ƒ๒พป„*†ตkื !’’’ฤgŸ}&ŒU๎žขwc๘๑"::Z\ปvM;vL๘๘๘ˆš5kŠ๛๗๏ !„ |๐8x๐ ˆ‰‰nnnยออญœฃฎาำำEllฌˆฤ๙๓Ellฌธ~บBˆYณf cccฑu๋V‘ บt้"ฌญญลำงOฅ:ฺตk'ลฉSงฤัฃGEร† E๏ฝหk•*โ๚(==]|๕ีWโฤ‰โฺตkโภขYณfขaร†"33Sชƒ}๔๖Œ1B‰่่hq็ฮ้๕ไษฉLIวถgฯž ;;;ัถm['๖์ู#LMMลฤ‰หc•[LHฒx๑b๑มmmm๑ัG‰“'O–wHjฉWฏ^ยาาRhkk‹ฺตk‹^ฝz‰ฟ[š๔้S1rไHQฝzuQตjUัญ[7q็ฮrŒธ๒‹ŠŠ ผ(„xH—๏พ๛N˜›› ัฆMq้า%•:RRRD๏ฝ…พพพ044ƒ้้้ๅฐ6•Sq}๔ไษัถm[ajj*ดดดDฝz๕ฤฐaร cห>z{ ๋"<<\*Sšc[rrฒh฿พฝะำำ5kึใว999๏xmo2!„xืฃŒDDDD๔๎๑?""""5มฤˆˆˆHM0๑#"""RLˆˆˆˆิ?""""5มฤˆˆˆHM0๑#"""RLˆˆˆˆิ?""""5มฤˆจœdddภึึ?.๏PT4mฺ'Nœxฅeฌฌฌp๔่ัทัซน|๙2š7o^aUHLˆHmYYYกZตjศศศฆ=y๒ฐฒฒR)WตjU่๋๋รฤฤ={๖ฤฃGT๊Š‹‹{ๅd#,, ]บtพพkญว›vyธนนฝ“ถขฃฃ๑แ‡ชL4hfฬ˜Qๆ:5j l฿พuร#ชt˜๘‘Zซ]ป6ถlู"ฝ฿บu+,-- ”ทo?~Œ7n ;;?๐ƒส={๖ ]ปvฏิ๖oฟ†ฝ{—)๎W๑์ูณทFE‘ฟฎฝ{๗ฦ๒ๅหห9ขЇ‰ฉตฝ{cีชUา๛?}๛๖-ฒ|ตjีเ็็‡ .จLฯOž>}Šฝ{ฃFจQฃผผผ ญ็ฦธ}๛6ไrน4อสส !!!hาค 0eส\บt ฮฮฮ022B`` T6//SงNEบuaii‰1cฦ ++ VญZa๘๐แ022Bxx8>|ˆ>}๚ภฬฬ ๕๋ืวQไ:พxฺvวŽhธฑ4 บvํฺ"—;~85j|๕ีWศหห“ๆ…††ขaร†จYณ&ˆŒŒ ไๆๆข}๛๖๘็Ÿ ฏฏ}}}๑วXตj~๘แ่๋๋K๋œ˜˜ˆ-Z z๕๊prrBLLŒTทL&ร’%K`mmVญZZดhศศHตJz‰JEฉฉz๕๊‰่่hQงNq}q}QงNq๔่QQฏ^=•rGŽB‘––&:w๎,ฆN*อW*•ยยยBไๆๆŠ_~๙Et๎Y==]ิชUKlธQ<{๖LlผYิญ[W<}๚T!แ็็'าาาฤ“'Oคๅ ลล‹ —H]qฤˆิšฆฆ&ฑn:ฌ[ทปw‡ฆฆfrํท‡ฑฑ1ชWฏŽห—/cฤˆาผศศHx{{CCCZZZHIIม?ƒ*Uช9โ—ššZ่ต}cฦŒA5`ccดkืu๋ึ………ผฝฝXปv-พ๚๊+ิฉS&&&˜2e ึฌY#ีำ A 4HKKCtt4‚ƒƒกฃฃ๔้ำ›6m*q๛hiiแย… x๘1,,,`kk[dู/พ๘จUซฦŽ‹u๋ึx~J{โฤ‰จWฏ๔๔๔0iา$lธฑฤถ๓ํุฑM›6•๚ฆkืฎ033รษ“'ฅ2฿~๛- กงง'M300@ZZZฉ!RLˆHํ๕ํซWฏฦชUซŠ<อป{๗nคฆฆโษ“'ฺ่ต+:v์(อ{๑๚พ๛ฃM›6่ึญ๊ีซ‡เเเB๋322*๔n^333้o==ฝ๏๓—น}๛6>๘เi^ฝz๕p๛๖m้}:uคฟoธฬฬL˜ššยุุฦฦฦXบt)๎ฝ[์v€7b๓ๆอจSงฺตkWเ๗‹๊ึญซ๒๗;wค๖‡.ตํ้้‰๛ฏฤถ_ŒะกCา๒ฦฦฦธpแB‘๋›/==FFFฅn‡H0๑#"ต็์์Œ‡โัฃGpqq)ถฌŽŽ๚๗๏ณgฯโมƒž฿๘แ๋๋ ะึึฦ๗฿ห—/c๏ฝ๘้งŸ] น\ŽซWฏ–9ๆZตjแฦา๛7n VญZา{™L&]ปvm่๋๋ใัฃGHMMEjj*าำำVb;ฎฎฎุนs'๎ป•‘ฮ—ผySๅ๏›djืฎ?๘Cj;55Uบ“๚ล8 ‹=y__฿ห๗้ำงศe๎ฝ‹gฯžกAƒ%ฎ#‘:aโGD`ำฆMฅ:๕™““ƒีซWรฬฬ &&&ธx๑" ฅ$'** ็ฯŸG^^ QฅJ•BOืซWHLL,Sผฝz๕ยผy๓๐๏ฟโแร‡๘แ‡Phฺูตkรออ “'Oฦ“'O๐์ู3œ;wIIIลถ‘ีซWCฉTBKK ๚๚๚…ฎKพล‹ใฝ{ธs็.\ˆž={† ‚QJt๏นƒ={๖x>ย๙฿ฉภ4žวใ๑๘๎MภOUฉT4U(พ์ํv“m:N%ฮ?ู๙|Vซีาแp๘๋Q2`2ยมx<ึ`0ฯ็๛๎ญภ[„€!˜๑0แ`ยภ„€!?C~† A๘‚๐0ฤฝ!ํ„,‡ƒIENDฎB`‚c4core-bm-charconv-atox-mega_bytes_per_second-i16.png000066400000000000000000001046461477602032300327040ustar00rootroot00000000000000c4core-0.2.6/doc/img/linux-x86_64-gxx12.1-Release‰PNG  IHDR 1(Z9tEXtSoftwareMatplotlib version3.5.1, https://matplotlib.org/ุa๒ฝ pHYsaaจ?งi‰IDATxœ์wXื๛6๐{ฉาAมv้ˆˆˆAQฑ4*šhฌฑ‘ขฑปฦ’`ษWฃมุbปbร ขุc‹จด=๏พฬฯ•โbY๏ฯuํuฑ3gฮ<๓0ป๛์™ฒ2!„‘†ศ‹:""""๚ผฐ%""""bJDDDDล”ˆˆˆˆ4Š(i P""""า( DDDDคQ,@‰ˆˆˆHฃX€‘Fฑ%าฐ7n@&“aๆฬ™EJพ7n ‡ขCm2™ ƒ.๊0่ ™L†่่่ขๅณืซW/u๏$็|๙๒ๅEส'‡(}–’’’0aยธqฃจC!*111˜0a’““ีj้า% > 4€žžd2Yพฏ™L™L†>}๚ไ9๔่ัR›วฟใŸUซVa๎น๏OqRท‰T=&Lศ๓Kะฝ{๗0rไH4iาFFFoฒ”‘‘)Sฆ vํฺะำำCนrๅะชU+นs็ƒฤ๓1ฐฅฯRRR&Nœศ”>[111˜8qขฺ่ฑcว0o<คฆฆขN:omฏงง‡ฟนๆ๕ื_ะำำ+lศ๙z—bญQฃFx๑โ5j๔มโ๘X€~ชTฉ‚/^ G…^๖๙๓็˜8qbž฿ฅK—0mฺ4๛๏ฟptt,ฐŸฬฬLดjี “'OF‹-๐๋ฏฟโ‡~@้าฅ‘’’๒Aโ๙Jid-DD˜/_พ„พพ~Q‡๒IIKKC้าฅ ฝ\PP’““add„™3g">>พภ๖-Zดภ–-[ฐcวดmVšƒ๋ืฏฃcวŽ๘๛๏ฟ ว๛z๙๒%ttt —ห?hLลวzฟษde?rssร“'O`ff†๕๋ืฃs็ฮ๙ถ3g<ˆ#GŽ ^ฝz<–…# TขผyDญZต ฏฏssst๎Yeคs๙๒ๅา‹นI“&ากภืฟ๕๚๋ฏฐทท‡ฎฎ.ฌญญ1hะ •‘ข่้้แย… *๋@™2ep๗๎]ตโ3gชTฉ}}}๘๚๚โนsนฺ\ผx:u‚™™๔๔๔เ๎๎Ž-[ถจดYพ|9d2Ž=Š#FภยยฅK—F๛๖ํ๑่ัฃ\}๎ุฑพพพ022‚ฑฑ1<<<ฐjีช\ํ’’’ะคI B… ˜>}บสœ๓่ึฎ]‹‰'ขB… 022BงN’’‚๔๔t 6 –––044D๏ฝ‘žžฎาวฒeหะดiSXZZBWWvvv๘ํท฿rลbccƒึญ[cืฎ]pww‡พพ>-Z”onรยย —ห1|iฺญ[ทp๑โล|—yห—/1aยิฌYzzzฐฒฒB‡pํฺ5ฉMZZBCCQฉR%่๊๊ขVญZ˜9s&„*}ๅœฃบiำ&888@WW๖๖๖ุนsงิf๚๕ษd8x๐`ฎX-Z™Lฆฒfฟ8x๐ KKKTฌX&Lภ๗฿ฐตต•^033ƒ‘‘‘Zน€ * QฃFน๖ซศศH8::ช}Žqjj*† ่๊๊ยาาอ›7ว้ำงผ:_y๛๖ํธy๓ฆด666o\ฝz5ฦŒƒ *ภภภ …"ฯs@sฮ}~~ผzฏ B้าฅaii‰แร‡cืฎ]น๚ผrๅ :v์ˆ๒ๅหCOO+VDppp#Sm<|๘_5ส•+===8;;ใ?P+Ÿ9ฏฃœbEOOUซVลŠ+TฺM˜02™,ื๒9๛ิ๋๛JNŸัััาkำััQสร† เ่่===ธนนแฬ™3yฦ๖ฯ? ฅK—†ตต5&Mš”๋ตคT*1w๎\ุK‡š๛๕๋‡งOŸๆนyฝ_์ูณ 6„ฉฉ) QซV-๔ำO*หซ๛^‘ื9 9็ด๛๏ฟhืฎ aaa๏พ๛ูููาr€‰'J็ &ŒŒŒ`ff๖ึ๕+•J๒ห/h฿พ=๊ีซ‡ฌฌ,<ญหๅตล๓QขdบuยููYŒ7N,^ผX๔ำOขL™2ขJ•*"--M!ฤตkืฤ!C๑ำO?‰•+WŠ•+WŠ๛๗๏ !„?~ผ ฤ๙๓ลเมƒ…–––๐๐๐B!ž>}**Vฌ(<<>>€˜;wnนโี๋จVญZข\นrโงŸ~ ,u๋ึ2™Lœ;wNj—๓ySฮ>๕๚>งO+++1aย1gฮQกBahh(๓OQนre1u๊T1u๊Tabb"ชWฏ.ฒณณฅๅCBB„žžžจQฃ†่ัฃ‡Xฐ`hบต ฦŽซฒ>}๚ˆRฅJ‰พ}๛Šˆˆ๑ใ?ŠาฅKซผ?็ฤ”ื๛ลนs็„ŽŽŽpwwฟ๒‹ˆˆˆ฿}๗hิจ‘สzิ}ฏศy?_ถlYฎํฑทท_}๕•๘ํท฿DวŽ๑๋ฏฟ !^ํCฟ๖› ฺทo/Ÿrญcบuน๖ี‰‰‰€ }๛๖:::า็ห๛฿Žยฤ๓กฐฅๅ๙๓็นฆ;vL+Vฌฆๅ๗‚~๘๐กะัั*o ,ฤ๗?iฺฎ]ปค?# Eปvํcฮ–พพพธs็Ž4ฤ‰€>|ธ4ญYณfยััQผ|๙RšฆT*Eƒ D5คi9 ~~~BฉTJำ‡.ดดดDrrฒBˆไไdadd$<==ล‹/Tโz}นœ7฿ืs–žž.ส—//:v์(Mห๙wppPy๓๏ฺตซษdขeห–*๋๐๒๒UชTQ™–ื, @TญZUeZ•*Uฑs็ฮ\ํ_/@CCC…\.ห—/ฯีN•๏€˜={vฎy9yฺดi“๔]งN„L&Wฏ^U‰OGGGeZBB‚ ๆฯŸ/Mฺ๋ตซฐดด”พิ!ฤฝ{๗„\.“&M’ฆvฟhุฐกJŸBผฝˆ,ˆบ่'tttค/eทo2™LธqCํิฤฤDๅหE^Zตj•kฟโ๖ฯชUซๆฺฯ๒+@ีู๏gอš%H_F„โล‹ขvํฺ*}ž9sF๋ึญ+0ยlำนsฉBˆŒŒ แๅๅ% …Bก(ฐ฿œืักC‡คi>บบบ"44TšVุ€ˆ‰‰‘ฆๅผ?๊๋๋‹›7oJำ-Z”+๏!!!€๘๖oฅiJฅRดjีJ่่่H๛ศแร‡ฉำฮ;sMฯ๏bฮœ9jํw๏[€Pyอ !„ซซซpss“ž?z๔Hใว/p 6l„นนนจQฃ†Xถl™Xถl™จQฃ†ะัั)Tฉn< มS‰๒๚๙=™™™x๒ไ ชWฏSSS้]A๖๎‹ŒŒ 6 r๙ฝ<๚๖ํ cccl฿พ]šๆ๏๏~๚aาคI่ะก๔๔๔ <$ฆvํฺกB… า๓z๕๊มำำQQQ€๛๛๗๏G—.]ššŠวใ๑ใวx๒ไ pๅส๛๏ฟ*}~๓อ7*‡อ|||›7oxu่)55#GŽฬuา›‡ ัฝ{w้นŽŽ๊ีซ‡๙'ืถ๔์ฺฺฺูาsOOO!๐ีW_ฉด๓๔๔ฤํท‘••%M{–’’‚วรืื๓Oฎร”ถถถศต~เี9^ƒฦ/ฟ‚?!!!นฺDGG็:ค——ฟeห–ลท฿~›k^Nžขขข ฅฅ…!C†จฬ …;v์P™๎็็‡jีชIฯœœ`llฌ’ฯ/พ๘>T9„ป~z(•J|๑ลmฟ่ท/ดดดบZ™2eะขE ๕ื_^]Xำ ATฉREํ>LMMqโฤ ตOkษKHHˆฺ็ฉณ฿๏น*T@PP4MOO}๛๖U้หฤฤฐkืฎw:,š—จจ(”/_]ปv•ฆikkcศ!x๖์Yžงpผษฮฮ>>>าs ิชU+ฯืถบ์์์เๅๅ%=๗๔๔4mฺ•+Wฮ5=ฏuฝ~+ตœำV222ฐw๏^ภบu๋`bb‚ๆอ›K๛ใวแๆๆCCC8p@ฅฟผ/LMM›7o†Rฉฬw{ิ}ฏ(HUž๛๘๘ผWŽ๓๒์ู3ฏNUูทoz๕๊…^ฝza๏ฝBไy๚Hqม”J”/^`ธqา9yeห–………’““ีบ0งPซUซ–สtTญZUšŸcๆฬ™033C||<ๆอ›KKKตcญQฃFฎi5kึ”ฮญบz๕*„;v,,,,Tใว๐๊\ฐืฝFผ*H็Gๅœฟจฮ๙w+VฬU”–)S&ืนVyญ7็ƒทRฅJนฆ+•J•ลัฃGแ็็‡าฅKริิา๙Xy ๙Yฑb.\ˆ๙๓็ซ|8ฟ‹kืฎกVญZ(U*๋4oผ kk๋\็Eๆ\!ๆพ๒fŽ€๙lัขLLLฐfอiฺš5kเโโ‚š5kxทข ผ}lบuรž={p๋ึ-lฺด บu+ิ๒ำงOวนs็PฉR%ิซW&L(๔‡xaถ_ๆอ›จVญZฎvีซWฯต#F`้าฅ([ถ,ฐpแยB]™ฆ›7oขF*_๗ปผจณ/VaไZ—\.GีชUUฆๅ์๓9๏‰Wฎ\AJJ ,--sํ๛ฯž=Skฟโ‹/เํํ>}๚ \นrฦฺตk ,F฿…žžžtNeŽ๗อq^rพXy{{ซไบrๅสhุฐ!bbb>่๚>$^O%สท฿~‹eห–aุฐa๐๒๒‚‰‰ d2‚ƒƒ?๘ œ9sFzำKLL|๏ย็u9๑~๗w๙Ž๚ฝ๙—฿(ืป|“/L_๙ต}[ืฎ]CณfอPปvmฬž=•*U‚ŽŽขขข0gฮœ\ณ‚Fฑผฝฝ  K—.jภฏI๊ไSWWํฺตรฦ๑๋ฏฟโมƒ8z๔(ฆL™"ตy—ข(๏]]]„„„ ==]บt)ิ๒]บt6nˆปwcฦŒ˜6m6lุ€–-[ชีGaถCพ†`ึฌY่ีซ6oŒปwcศ!ว๑ใวQฑbลw๊๓}ฉณy]€@บˆF>?d>•J%,--™็7 พผ๏๚๚๚8t่8€ํทc็ฮXณf š6mŠปwฐ#š:โ`mm (Wฎ\ฎy–––๙^๐Uฐฅe๚๕ มฌYณคi/_พฬuฏร\s ^บtIๅxFFฎ_ฟ???iZZZz๗๎ ;;;4hะำงOG๛๖ํแแแกVฌWฎ\ษ5ํ๒ๅหาีฎ9๋ืึึVY๏๛ศ9|๎น\EJQุบu+าำำฑeห•”7ฅฉฃz๕๊˜>}:7nŒ-Z`฿พ}…บj๛uีชUร‰'™™ฉrjม๋ชTฉ‚ฝ{๗"55Ue=9Wฮๆ0๓๋พ๘โ ๑วุทo.\ธ!„t๘๘p๛E~ฏM__ํฺตรŸ‰–-[ขlูฒ…๎รสส ฤภ๑๐แCิญ[“'O– PMmKŽ*Uช )) B•u_ฝz5ฯ๖ŽŽŽpttฤ˜1coooDDD ,,,฿u๔u๖์Y(•J•Qะ๗๏”s๔$99Y:l จ7ย๚.”J%๙็iิx๕~@zOฌVญ๖๎ oo๏๗๚R%—หัฌY34kึ ณgฯฦ”)S0z๔h8pเƒฝืชใC์ทŽŽŽะึึฮuฺ ฝ{7WQฑใ) ‚งEKK+ื7๋๙๓็็๚ึžsฤ7 S???่่่`ผy*๛๏HIIAซVญคi?๘#nบ…?๘ณgฯ†4สฃŽM›6ฉผiœT---ัธqc,Zด๗๎หต|^ทWz!<</_พT™๗พ็;ฝ‹œQ‚ืื’’‚eห–ฝSNNNˆŠŠย… ะฆMผx๑BeพบทVุ้ฑ#?~Œ ไš—k`` ฒณณsต™3gd2™ฺฃso๒๓๓ƒ™™ึฌYƒ5kึ ^ฝz*‡?ิ~‘฿kเc๘๎ป๏0~xŒ;ถPหegg็:\mii kkk•ืYaoธพ๐๏ฟช๖๊ๅห—Xฒd‰J;…Bกrพ3๐ช`หๅo}Ÿศo›q}•ำ4ฒฒฒ0|ยืื๗]6)—œ/ซ‡’ฆฅฅฅฉ}ปงw๑๚kI @[[อš5๐j4<;;?sฎeณฒฒิฺ—๛๏ฟ\ำ\\\@ๅR˜[ถฝ+๏๗422B`` bbbTโฝpแbbbะผysฦSฅฅu๋ึXนr%LLL`gg‡cวŽa๏ฝ077Wi็โโ---L›6 )))ะีี•๎E9jิ(Lœ8-Zด@PP.]บ„_าล ๛๗๏วฏฟŠ๑ใวฃnบ^ฯฒqใฦ;vฌZ'~Wฏ^ 6ฤ€žžŽนs็ย?๐ƒิfแย…hุฐ!ัทo_TญZ<ภฑcวp็ฮ$$$*?ฦฦฦ˜3g๚๔้t๋ึ eส”ABBž?Q?\๒โ๏๏ดiำ๚๕รณgฯฐdษXZZๆY\ฉฃ~๚ุผy3ัฉS'lฺดIล์ูณ'<๘ึbปgฯžXฑbFŒ“'Oยววiiiุปw/ˆถmขM›6hาค F7nภููปw๏ฦๆอ›1lุ0• Ž C[[:tภ๊ีซ‘––†™3gๆj๓!๖ 777ฏ~388ฺฺฺhำฆMพ7ฉOII‘๎ฉz๔่Qฏ SSS˜ššช\@๒&ggg8;;ฟ5ฆ7ฅฆฆขbลŠ่ิฉœahhˆฝ{๗โิฉS*G9ฐfอŒ1044D›6m ฝ>u๕๋ื ,@ืฎ]1t่PXYY!22Rบฐ/g$i Bฑy๓fQชT)๑ล_HทิR๗ึ*Bผบ=ิ่ัฃ…ญญญะึึๅห—:uืฎ]“ฺคฆฆŠแร‡ kkkกญญ-jิจ!fฬ˜กrKซโหูฆ7๗K!„ุณg d2™ธ}๛vž๑ฝฯ~‘ใ็Ÿ*Trนญทdสูo๓zผyป ถ๗u๊†)==]|๗ยููY‰าฅK ggg้^Š9ž={&บu๋&LMMUโษo|}›ทaRgฟBˆ๙GดjีJ่๋๋ *๛o@?~\j๓ีW_‰jีช ===aff&š4i"๖๎[`n ฺ&!„x๐เ๔>งฃฃ#UnT^GพพพยืืWeZ\\œ๐๔๔:::ขrๅสb๖์ู๙†)ฏ>๓ฺ^ห"J—.-ฎ]ป&…(Wฎœ?~ผสํ๐r,^ผXธนน }}}add$ล? ๎ฝ๛ึ˜๖ํ'ฺถm+ฌญญ…ŽŽŽฐถถ]ปv—/_ฮ•u+๒ป S้าฅsตอ๋ึV111ยออMบ็๋ท@ส๏๕–W\qqqยฯฯO”.]Z‰ถmๆฺ&uฯ‡&ขŽป•0s็ฮล๐แรq็ฮ•[ฌQn,@‰ˆˆ ้ล‹*ยผ|๙ฎฎฎศฮฮ–.ž!ข๑P""ขB๊ะก*Wฎ คคคเฯ?ฤล‹๓ฝEQQษฮฮ~๋ล‰†††044ิPDฏฐ%""*ค€€,]บ‘‘‘ศฮฮ†Vฏ^ญrห,ขโเ๖ํo1†๑ใวcย„ š ่ใ!x"""ข๊ๅห—าี๓๙ฉZตjฎ_ข๚ุX€‘F๑F๔DDDDคQ,@‰ˆJ ทoCOOOบi|I ™L†่่่๗๎ซqใฦ๏Vฟ~}•ฐ ๚ฐ%"สว๒ๅห!“ษ “ษ๒<‡JJ•*A&“กu๋ึ*๓r–หy”.]vvv ร๓็ฯ๓\_bb"d2Nž<๙ฑOš4 žžž๐๖๖~๏พH=SฆLมฆM›rM‰‰ม„ >ฺO๘ใXธp!๎฿ฟQ๚'๚X€ฝ…žžVญZ•k๚มƒq็ฮ่๊๊ๆน\๓ๆอฑrๅJฌ\นณfอ‚ซซ+ฦŽ‹+Vฤ€๐ฟOjฃT*„™3gขM›6˜?>ฺตk‡9sๆจt~ๅส•ะีี…tฺEฟ~ะกCtํฺ0gฮiž……`๒ไษู่ณ'jิจูณgcุฐaุทo5j”kžฌฒ|DD„ Ž=*M+]บด ษตฎ3fโ๚๕๋*ำoธ!ดดดฤไษ“Uฆ'&&ŠRฅJฉLฯ‰7"""฿mาัั x๋ถ%"RC—.]๐โล lถ ฉฉฉุถm[ฟทm{๖์มž={ฐy๓fŒ5 ;w๎Dทn ^๛ ฅR‰;wช~755EZZšสau‡ฃฃ#ไry9ส‘••…E‹Iฯ322ฐhั"XXXHW•w้า๛/–,Y’k๙/^ --Mz^บt้<ฏพฯ)p฿œืกChiiaโฤ‰นFš…น๖‚ไœณฺ Aต—!*J%"*„~ล(/—/_ฦŸ เีMร?Ž?๘ีซWG=ผ:ฎงงงrK่ำง๛๏?4mฺ+Vฤอ›71|ธธธผu”ซmถ=z4 Eกฯซ,HXX๖์ูƒ† bเภ(Uช-Z„๔๔tLŸ>ญหใท฿~C=Pทn]รยยทnย๖ํแํํ จฯ๛1x๐`t๎5kึDVVVฎ\ ---t์ุ๑ญห[[[cฺดiธqใjึฌ‰5kึ >>‹/–ฮฟ์ัฃึฎ]‹๛ใภ๐๖๖Fvv6.^ผˆตkืbืฎ]pww๐๊VH{๗๎ล์ูณamm [[[xzzJล์่ัฃ mmmดiำีชUCXXF…7n ]ปv022ย๕๋ืฑqใF|๓อ7๘๎ป๏ิสลž={Pนreธบบช?ข"Utเoฏ฿†ฉ ๊†IKKKTฌXQ|๓อ7โมƒRปN:‰ภภภ\}ฎ_ฟ^๘๛๛ KKKกฃฃ#*Wฎ,๚๕๋'๎ป๗ึธ|๘ƒ๖KลฯฆM›ะญ[7\ปv VVVE‘ZX€‘‡โื_Eฟ~>xแp๋ึ-ิฌY๛๖ํƒทท๗ํ›Š///๘๘๘จuQqม”ˆˆˆˆ4ŠWม‘Fฑ%""""bJDDDDล”ˆˆˆˆ4Š7ขงbIฉTโ๎ป022z๋ฯ฿Q๑ „@jj*ฌญญ!—็?ฮษ”Šฅปw๏พ๕wฅ‰ˆˆจxบ}๛6*Vฌ˜๏| T,ฎ_ฟ33ณ"Žฆxหฬฬฤ๎ปแ๏๏/| ๅนRsฅ>ๆJ}ฬ•๚>ี\) TชTI๚ฯ P*–rป}ะ฿ฒ.‰233a``ccใO๊Mช(0W๊cฎิว\ฉนR฿งžซท>ว‹ˆˆˆˆHฃX€‘Fฑ%""""bJDDDDล”ˆˆˆˆ4Š(i P""""า( DDDDคQ,@‰ˆˆˆHฃX€‘Fฑ%""""bJDDDDล”ˆˆˆˆ4Š(i”L!Š:ข7) ˜˜˜ภmฬf(u ‹:œbMG.0สแยฯ"C)+๊pŠ5ๆJ}ฬ•๚˜+๕1W๊๛˜น:=ถ้ํ๏u9Ÿ฿)))066ฮทG@‰ˆˆˆHฃX€‘Fฑ%""""bJDDDDล”ˆˆˆˆ4Š(i P""""า( DDDDคQ,@‰ˆˆˆHฃX€‘Fฑ}‹N:ก~๚]็ล‹ัธqใถ0ถlู‚y๓ๆv์ุGGGศๅr\ผxQฅ๒ๅหQงNุูู!,,์ƒวADDD%Oฉข 8ณgดดด ฝ\vv๖;-W<}๚eส”APP4ญFXปv-  า๖ย… Xฒd โโโ```€‡€๔๛ฏ2็—ˆˆˆrใ่ทdษ8::ยููใวGff&ฆL™‚1cฦจต|tt4ะขE ๘๙๙แูณg่ัฃ<<<เแแใว6mฺOOOธธธ mถx๖์เ๒ๅหpww‡ณณ3/^\เบ๒k›฿:๏ฝ‹VญZมููnnnธ}๛ถJYYYุฐa1x๐`ฏF6GŽ จ^ฝ:๊ิฉ“+Ž฿C† ภาาp๘๐aิฉSSงN•ŠาทIOO‡BกPyQษฤภูณgฑpแB=z :t(fฯžฉดˆˆ@DD 66}๚๔‘ๆลลลa๙๒ๅ8pเยยยะฑcGœ:u 7nฤ Aƒพพพ8qโโใใแํํ฿0lุ0Œ7 Bo~m๓[็!Cะนsg$$$เศ‘#([ถ,เ๖ํ7n์์์ฐm6Lš4 ‘‘‘j็ํส•+8}๚4๊ืฏ&Mš 11ะบukฟsnษ˜Ž€‘Fฑ-ฦ–-[•GAง} x|1ึปwo๔๎ปจร """๚ 8JDDDDล”ˆˆˆˆ4Š(i P""""า( DDDDคQผ=K97ฒ}๘1ฬออ‹:œb-33QQQ „ถถvQ‡Sฌ1W๊cฎิว\ฉนR฿งš+ˆžˆˆˆˆŠ% DDDDคQผ=kฃw^A)ƒ‡EFฑฆ…l4•฿mป„lhu8ลsฅ>ๆJ}ฬ•๚>ง\-h_งจC(ึ8JDDDDล”ˆˆˆˆ4Š(i P""""า( DDDDคQ,@‰ˆˆˆHฃX€‘Fฑ%""""bJDDDDลด่ิฉ๊ืฏฮห฿ธq๋ืฏkปqใฦ!&&Fญ>‘‘‘!ลWฆLซดy๔่Zตj…:u๊ภ?.|๐DDD๔ูaZฤ๖์ู-ญ๗๛92u ะI“&กAƒ๙ฮฯฬฬDZZ ** :::€มƒcลŠนฺ2_5.\ธ€˜˜ž>}๚.›ADDDŸ  ดdษ8::ยููใวGff&ฆL™‚1cฦจตผBก@ำฆMQทn]ธบบโศ‘#€ัฃGcืฎ]pqqAdd$=z„–-[ยััx๐เ Wฏ^ุนsgฎ~oธŸ~๚ ตkืฦๅห—666x๙๒% qใฦRq™#99็ฮC‡&&&ะีีดkื:uยฝ{!„x‡LQIฦTCฮž=‹… โ่ัฃHHHภะกC1{๖l„„„ไ*๎"""ˆEŸ>}๚๚๚ุผy3NŸ>ญ[ท"440y๒d >>_~๙%ฦๆอ›#11mถล่ัฃsล“-[ถ 00:t@… p๚๔iธบบชต=ืฏ_‡™™พ๘โ ธบบชัััั่ืฏ-Zฬœ9๓ญ‡็ำำำกP(TDDDT2•*๊>ััั†ฑฑ1เล‹ุฝ{7๖๎‹›7oชดํ฿ฟฟ๔ทปป;–.] Bเ‡~ภ‘#G ฅฅ…ซWฏๆนฎ˜˜L˜0ะฝ{wฬŸ??W›vํฺแ๙๓Xฑb6lX่ํษฮฮฦ๑ใวq๚๔iิฌYํฺตร–-[™L†ๆอ›ฃy๓ๆx๔่†ŽŠ+โŸตตuž…‡‡cโฤ‰…Žƒˆˆˆ>=-"๑๑๑HJJ‚ญญ-6lˆ3gฮ ((จภe"##‘‘‘๘๘xฤววฟื๚รรรัขE |๕ีW๘๑วqๅส•B-omm5jภฺฺฺhบ5ค๙ฯž=ร๏ฟŽ   ฟ+WฎDนrๅ๒ํoิจQHII‘ทo฿~็m#""ขโจ†4mฺซWฏ–-{yyแฝ{ธqใŽ9WWWlูฒฅภ> ,--กฅฅ…๕๋ืK !55Ujื AฌYณฐjีชๆJ}ฬ•๚>ง\-h_็ฝ–ฯฬฬDTTกญญข๚๘r>ฟSRR <šษP""""า( DDDDคQ,@‰ˆˆˆHฃX€‘Fฑ%""""bJDDDDล”ˆˆˆˆ4Š(iT๎Ÿฝ!*F&ทจss๓ขฃX{uณโk˜ูบึ'uณโขภ\ฉนRsฅ>ๆŠrp”ˆˆˆˆ4Š(i P""""า(žJลฺš„กo”Vิaoสl˜๘๓๔@ฎUิัoฬ•๚˜+๕1W๊cฎิงfฎz{Tึ\LG@‰ˆˆˆHฃX€‘Fฑ%""""bJDDDDล”ˆˆˆˆ4Š(i P""""า( DDDDคQ,@‰ˆˆˆHฃX€กN:ก~๚๏ผ7ฐ~๚ัน{๗.z๖์ ธu๋ผฝฝกงง‡ˆˆ•vงN‚ปป;์ํํัฆM› •,)ฮ"ฒgฯhiฝ฿ฯๅ :u๚@QOŸ>E™2e`mm+VŒ1{๖llูฒEฅmff&๚๖ํ‹๕๋ืฃz๕๊x๘๐! ##YYY000๘`qQษมP Xฒd แ์์Œ๑ใว#33SฆLม˜1cิZ^กP iำฆจ[ท.\]]qไศภ่ัฃฑkื.ธธธ 22=Bห–-แ่่ˆ€€E:u๐๏ฟ";;๕๋ืว‰'rญใ๘๑ใ่ีซผ*nsFgMMMแ้้ mmm•evํฺ///Tฏ^`ii เU๋เเ€!C† ))IญmLOO‡BกPyQษฤ๔#;{๖,.\ˆฃG"!!C‡ล์ูณ###•ถา!๎ุุX๔้ำ ฏฏอ›7ใ๔้ำุบu+BCC“'OF@@โใใ๑ๅ—_b๘๑hผ9ัถm[Œ=eส”ม”)Sะฟฬš5 6„งง' 55pssรฤ‰ัถm[\บtIํmปrๅ าำำัดiSธปปKง”+W็ฯŸ‡ปป;๚๕๋___ฌZต ้้้๙๖้QฉR%๕“LDDDŸ‚ศขฃฃ cccภ‹/ฐ{๗n์ป7oTiฟ้owww,]บ „ภ?€#GŽ@KK Wฏ^อs]111˜0a {๗๎˜?> }๛๖Xตj~wฤววKํญญญแๅๅ… 6 J•*…ถ์์lœ8qวŽCzz:ผผผะจQ#XZZB__={๖Dฯž=q๎9๔์ูแแแHLLฬณฏQฃFaฤˆาs…Bม"”ˆˆจ„โจ†ลวว#)) ถถถhุฐ!ฮœ9ƒ   —‰ŒŒDFFโใใU Hueffโ๚๕๋B --Mšพn:”.]AAA˜;w.žๆJ}ฬ•๚˜+๕•๔\q”ˆˆˆˆ4Š(iมSฑwCฃงฝเ‚(ณณ'I\‹/้‚0W๊cฎิว\ฉ๏sศ•Wuำขแ“ภP""""า( DDDDคQ,@‰ˆˆˆHฃX€‘Fฑ%""""bJDDDDล”ˆˆˆˆ4Š(i P""""า( DDDDคQŸmฺฉS'ิฏ__ญถ]บtณณ3"##?rTykธ1.^ผจัuŽ7111€๐๐pTฎ\ๅห—WiฃT*1lุ0ิชU ตkืฦ๎ป5#}šJๆฑพลž={ ฅฅ๏‹฿ปw—/_FBBBฎyูููj๗ST ใำงOQฆLLš4Išึผys„„„ nบ*m—,YฅR‰K—.!;;)))*}ๅฅฤ€.YฒŽŽŽpvvฦ๘๑ใ‘™™‰)Sฆ`ฬ˜1j-฿ฆM\นr...HLL„ F;v aaappp€““ถn ˆŽŽ†ฟฟ?accƒˆˆLž<NNNhูฒ%ฒฒฒ๒]฿–-[เโโggg๔้ำGšพlู2ธนนมีีทo฿lฺด žžžpqqAถm๑์ู3@ฏ^ฝ0pเ@xxx`๎น˜;w.jืฎ ggg 6,ื:SRRฐ`ม8;;cอš5R;w๎ธปปรฺฺ:ฯŽ= ฅฅ333ภŒ3เํํ+Vเๅห—jๅ9== …BๅADDD%S‰.@ฯž=‹… โ่ัฃHHHภะกC1{๖l„„„ภศศHฅmDD"""ฑฑฑR๑ท~z8::">>ŽŽŽฤววCGG[ถlA\\vํฺ…oฟV*ฯž=‹ศศHœ:u ?๘#lmmq๖์Y่๋๋c฿พ}yฦ๛เมŒ1;v์@BBฆOŸ.อ344D\\บw๏.ล้๋๋‹'N >>๘๗฿ฅ๖ษษษ8y๒$BCC1y๒dœ9s ˜8qขิ&g;=<ก——๎ป‡7nเศ‘#puuล–-[น `ใฦศฬฬฤ๛๗qๆฬุฟs๕๋ืวฝ{q๏=ภW`{…B+++(•Jฌ\น2ฯ6Jฅw๎ŸŸfอš…ห—/ส•+‡1cฦเ๙๓ฦŒ3เเเPจ+ู[ทnƒx5ฺ\ปvmภŸ‰Zตj!22#FŒN`QIDDD@ ฟ มมƒFƒ  ฅฅ…๖ํcย„ yถอ9ฏฒˆEDDD‡แ ^ฝzhีช\]]!—ห1o<พsผ–––˜3gŽ4J้้้‰ล‹็~์ุฑhูฒ%ฬออแํํ-ƒ๙บ์์lt๋ึ ฉฉฉBจ&^จ"00w๎มƒr๕†ˆˆๆJ}ŸCฎผช›~~233…ภภ@hkk>5!็๓;%%ฅภ#Ÿ%๚<?%๓๋ว' }๛๖ธ~บสดM›6๚Jt"""ขO ะ"ฒqใฦขˆˆˆจH๐<i P""""า( DDDDคQ,@‰ˆˆˆHฃX€‘F๑*x*ึlŒannZิak™™™ˆบิซj๒Iฌธ(0W๊cฎิว\ฉนข%""""bJDDDDลC๐Tฌ=์_ ฒŒขฃXห.ฅ|ฑB*@+๋eQ‡Sฌ1W๊cฎิงฉ\YญU|ดพ‰4# DDDDคQ,@‰ˆˆˆHฃX€‘Fฑ%""""bJDDDDล”ˆˆˆˆ4Š(i P""""า( DDDDคQ,@‰ˆˆˆHฃ>HฺฉS'ิฏ__ญถ]บtณณ3"##?ฤช ญqใฦธx๑b‘ฌ{ย„ ˆˆˆxฏ>ขฃฃNห#::Zญถ~~~€/^ Yณf044ฤศ‘#Uฺ\ฝz5‚ฝฝ=\]]฿)&"""๚ผ๗oม๏ูณZZZjตฝw๏._พŒ„„„\๓ฒณณี๎งจ| 1พ็ฯŸฃTฉRะััมฝ{ฅJ•ยธqใ””„›7oชด๏ป7fอš…z๕๊แแร‡า๔งOŸขL™2ˆˆˆ>…]ฒd แ์์Œ๑ใว#33SฆLม˜1cิZพM›6ธrๅ \\\˜˜Œ5 ...8v์ยยยเเเ'''lบภซ?ยฦฦ˜}ภซโs๒ไษุบu+2331w๎\DGGCOOƒ ย† Pนre์ูณ็ฮรร‡Qปvm)พ๔๔tฌ_ฟ‹-‚}๛๖ลŒ3 งงงึpๅส่๋๋ฃUซVธw๏พ๚๊+ <p้า%lบ&LภฃGะทo_|๙ๅ—044ฬทฟ๐๐pLœ8QญuังMํ4็Ccccฏฮ ฝ{7๖๎›๋ะlฅฟฑt้า|๛ํน3 &&:u‚ฎฎ.ฌฌฌPทn]œ?ะ A้ฎ‰‰ Zทn pppภญ[ท๒์๗ฤ‰๐๓๓ƒ••ภฬฬLšpuuล๏ฟธu๋:w๎Œเ๙๓็า9ภซs\e2ภออ ปwG็ฮฅ‚๕M …ฉฉฉRmbb"อkีชดดดเ๊๊Š7nxuCRR–/_HMMลปwฑ~DEExu(<'๗งOŸฦๅห—ฑo฿>˜ššb๋ึญ8{๖ฌt๎‹/PฅJนs:t€ถถ6*Tจ)www่่่เ?€ƒƒCžQ์์l9r 022‚ฏฏ/|||เ์์ŒRฅJก}๛๖h฿พ=nผ‰พ}๛โป๏พCjjjพ5 #FŒPษaฅJ• ๏|R||<’’’`kk‹† โฬ™3RaWomฃฃฃ#-—หฅ็rนููู…^งฎฎnฎๅ‡ ‚1cฦ 11ำฆM“™ฟใ๖ํ1`ภ*Vฌˆ์์l\ธpAZพmถา๒—.]ย?Rแๆ฿‹/†ฝฝ=:w๎Œฐฐ0๛๏ฟ…ฺkkkิซWVVV044„ŸŸฮž=+อ๒ไ ๆฮ‹   ”.]๋ึญ{k^ŒUDDDT2ฉ]€6mฺซWฏ–ฮอ๓๒๒ยฝ{๗pใฦ 9rฎฎฎุฒeห;า Alธ™™™ธ>ฮœ9{{๛w๎ฏ~๚ุปw/๎ป*‡เ๓ขP(`eeฅR‰•+WๆูFฉTโฮ;๐๓๓รฌYณp๙๒ๅ<รฤฤคคคH็dๆลฯฯฟ๖›ิ&>>^šžs:CVV–4‚hii‰M›6แ›oพม๙๓็Qฟ~}์ทw๎๐ช๘ปs็ŽJN๏ฝ‹ร‡K๋๔๒๒ยŠ+p๔่Q”.] *๐ด‚ืีซWw๏…Bก@VVŽ=ŠZตjบu๋///( ์ุฑ7n|งbˆˆˆJ&ตม;88`๐เมhะ ดดดะพ}{L˜0!ฯถ๙Zz๕๊กUซVpuu…\.วผy๓ MๅสjํงwฬฬLDEE!00Pบ8—๒๖ฉๆ*็๓;%%ฅภำ้8DEDDDD๕7ข/ฺทo๋ืฏซLดilll>๚บ'Ožœ๋›1cฦ SงN}DDDDŸขQ€nธฑศึ=z๔hŒ=บศึODDD๔ฉแ!x""""า( DDDDคQ,@‰ˆˆˆHฃX€‘Fฑ%""""*WมSษeq ๆๆๆEFฑ–™™ DEก~R7+. ฬ•๚˜+๕1WD…วP""""า( DDDDคQ<Oลšrq(u•EFฑฆ”้U‡@น ”"ฃจร)ึ˜+๕1W๊cฎิว\ฉ๏cๆJ>โ๐ํ๏b(๊ˆˆˆˆ่๓ย”ˆˆˆˆ4Š(i P""""า( DDDDคQ,@‰ˆˆˆHฃX€‘Fฑ%""""bJDDDDล”ˆˆˆˆ4ชฤ ษษษXบtiพ๓ห—/ึ><{{{๘๘๘|ศะิเเ`ฎ๓๎ปู่ณ'เึญ[๐๖๖†žž"""Tฺ:u ๎๎๎ฐททG›6m4#}š>๛TซVญยไษ“q๘ฐ๊oงfggฟWฟšPุŸ>} ฐถถฦŠ+ฦฦฦ˜={6BCCUฺfffขo฿พXฝz5ฮŸ?฿‘‘็ฯŸ€่‰ˆˆจ$*q่ปwแํํ 899!44‰‰‰pqqมŒ3––†๖ํรฮฮ๛๗k+Vฌภบu๋ŠAƒa๙๒ๅ่ิฉ|}}ัฃG\ฝz>>>prrB—.]––hธ1BCCแ๊๊ ฤฦฦขYณfจZต*ถo฿ž๏๚ บu๋'''ธธธ 66ภซยฐM›6จQฃ&Ož,ตoบ5เ่่ˆ 6nธt้าvvvนrr๑โล\๋=~8z๕๊wwwฉ๚๕๋LMMแ้้ mmm•evํฺ///Tฏ^`ii)ล๊เเ€!C† ))้ญ9€๔๔t( ••L%ฎ๋ฏฟเ็็‡๘๘xฤลล!,, ŽŽŽˆว๗฿… ยึึIIIhูฒ%>^๚ป ร๖-Zด€‘‘‘ดL‡ปwว?(ตkบ5ภัั2™ zzzpppภญ[ท๒ํ{ˆŠŠ”*U ฦฦฦooo˜››lmmq๗๎]ิจQsๆฬม–-[ผตผ> N:ฐททฯ3'vvv^f๗๒๒ย† คขด0ฒณณqโฤ ;v ้้้๐๒๒BฃF`ii }}}๔์ู={๖ฤนs็ะณgO„‡‡#111ฯพF…#FHฯ ‹P""ขชฤ€6jิ‡‚ฅฅ%:v์ˆ}๛๖ๅj#“ษkoต๙ัััศๅr•ฟ฿ๅQ]]]้๏œ>8€“'Oโไษ“HHH€ญญญ4ส๘zŒ๙ๅdบu(]บ4‚‚‚0w๎\|!!!prr‚““fฬ˜Aƒแ๊ีซฐททว๖ํQฎ\9iูผฮ}›y๓ๆa๚๔้prrย?ƒaร†ฝWcวŽลๅห—แ่่\พ|9฿ถx๒ไ ์ํํ1gฮ8;;็ู๎อœt๏]eพตต5ฦ‡ .ไY€>+Vฤ์ูณ1jิ(้ขฃฒeหขw๏pqqงง'BCCamm 1bฮ;‡แร‡ฃL™2๏š"""*d"็ชขbDกPภฤฤง4‚นฎฒจร)ึ2e:ุYuZ3ฺ"ฃจร)ึ˜+๕1W๊cฎิว\ฉ๏cๆJ>โ๐ฝฃœฯ๏”””Oง+q# DDDDTผ•ธซเ?ปvํRนbxuNๆิฉS‹("""""อ`ZDPิaiม‘Fฑ%""""bJDDDDล”ˆˆˆˆ4Š(iฏ‚งbMอศออ‹:ŒbMž™ DEA>x'ไฺฺENฑฦ\ฉนRsฅ>ๆJ}%=W%""""bJDDDDลC๐Tฌ)wކา€ปiA”ะไMก๖”ศ.๊pr‘ท_Pิ!Q1รP""""า( DDDDคQ,@‰ˆˆˆHฃX€‘Fฑ%""""bJDDDDล”ˆˆˆˆ4Š(i P""""า( ”œœŒฅK—ๆ;ฟ|๙๒๏๗๒ๅห๑๘๑ใฝ{={๖Tซฟ-[ถ`ผy€;vภััrน/^ฬต:u๊ภฮฮaaa๏<}VX€jะ ะ๗กNjmm+Vุๆ้ำง€   2PฃF ฌ]ป5Ri{แย,YฒqqqHJJย7฿|HIIโ]7…ˆˆˆJ8 ัปwแํํ 899!44‰‰‰pqqมŒ3––†๖ํรฮฮ๛๗Wซฯˆˆxxxภษษ ฝ{๗†Rฉฤฦ‹๖ํรววฐlู2888ภมม‹/ธq๕๋ืฯีgVV6lุ <ภซ‚vไศ‘€๊ีซฃN:น–๛๗฿1dศ,--‡F:u0u๊T<|๘ฐY#""ข’Ž่G๔ื_มฯฯ๑๑๑ˆ‹‹CXX๏ฟ .„ญญ-’’’ะฒeKˆt้างNยูณgกฏฏญ[ทข}๛๖pwwวฦq๘๐aนs“'Oฦ‘#Gp์ุ1ฬž=7nศ฿ํท1n8ุููaถm˜4i"##ีพ+Wฎเ๔้ำจ_ฟ>š4i‚ฤฤD@๋ึญq๐เA@ใฦŒ่่่๛JOO‡BกPyQษฤ๔#๒๐๐ภส•+1qโD\นr๚๚๚*๓cbb hถญ4’๑๑๑า฿K—.…ปป; !!pttฤึญ[‘”””kฝฑฑฑ๐๗๗‡ฉฉ)ŒŒŒˆ'Nจด9y๒$lmm๑๙sฤฦฦโ๛_žฃฃษฮฮฦฝ{๗ƒฐฐ0๔๊ีKšWฎ\9Œ9็ฯŸว—_~‰ฮ;ใoฟอทฏ๐๐p˜˜˜HJ•**"""๚tฐˆ5j„C‡มาา;vฤพ}๛rต‘ษd…๊ณo฿พXพ|91t่PคงงฟSlNNNXผx1Ž9‚Ž;bํฺตศศศ(Tึึึ ‚\.‡ทท7๎฿ฟฏr๎็™3g0hะ „††โ๋ฏฟFhhhพ}5 )))าใ๖ํ๏ด]DDDTฑˆnผ +++ 0มมมHNNFjjช4ฟAƒXณf `ถmx๙[๛LKKƒ……^พ|)- FFFR฿ุทo ž={†;vภำำSฅ===|๕ีW8~8fฬ˜๛๗ฃvํฺ˜5k–ฺ๗๚ก๖s็ฮมฬฬ 2™ งOŸ†‡‡BCCแ๋๋‹s็ฮa๊ิฉฐฑฑษท/]]]ซ<ˆˆˆจdb๚EGGรษษ ฎฎฎ8|๘0BBBเไไ'''ฬ˜1ƒ ยีซWaooํทฃ\นrาฒ๙:z๔hิญ[Mš4ซซซิฆWฏ^่ัฃ|||PกB๘ใhะ ๊ืฏแร‡Xนธธ ""gฯžUYoŽ}๛๖กbลŠ8v์7nŒ=zxU€fffยฝz๕ย’%KˆŒŒฤ๛๑ล_@GG็=ฒHDDD%L๐~9T ) ˜˜˜เแŸ`nPชจร)ึ2ก…๒ฆhกmdu8นศ/(๊$™™™ˆŠŠB`` ดตต‹:œbนRsฅ>ๆJ}Ÿjฎr>ฟSRR <šษP""""า( DDDDคQ,@‰ˆˆˆHฃX€‘Fฑ%""""bJDDDDล”ˆˆˆˆ4Š(i P""""า(ฤ k๒“!77/๊0Š5yf&y๋™Bฟ–ADDŸ/Ž€‘Fฑ%""""โ!x*ึ”ICiฌ_ิakJ%Cyn5”ล์+ฅนGQ‡@DDลP1๛ธ""""ข’Ž(i P""""า( DDDDคQ,@‰ˆˆˆHฃX€‘Fฑ%""""bJDDDDล”ˆˆˆˆ4Š่–œœŒฅK—ๆ;ฟ|๙๒๏ิ๏๒ๅห๑๘๑ใ|็ฯœ9Sญ>FŽฉึ๚ฦ‡˜˜@xx8*Wฎœ+vฅR‰aร†กVญZจ]ป6v๏ญV฿DDD๔yc๚ฝญ}W๙ B(•Jต Pu<}๚0iา$4hะะผys?~ุฒe ๓\ฏ‘‘๒œƒnบA&“มััx๐เJ›Yณfมืื 6DRRยยย U|ฏFNmmmLš4Išgoo_~๙‰‰‰(_พ<๐๗฿็Wxx8LLLคGฅJ•  }:X€พงFแะกCฐดดDวŽฑo฿พ\md2™ฺ•*U ฑฑฑhืฎ"##๑๕ื_็ู๎๕B๖]t๏ฃFยดiำ๐ีW_แ๐แร…๎รฺฺํฺตดo฿ า<ฅR‰จจ(tํฺ‘‘‘˜9s&š7ožo_ฃFBJJŠ๔ธ}๛vกใ!""ขO ะ๗t๓ๆMXYYaภ€Frr2RSSฅ๙ 4ฮซถmž?^`ฯž=CJJ ‚‚‚0}๚ti”ิศศHฅ฿7ษๅr(•Ji๋ึญƒ็ฯŸว‹/Pฎ\9•๖ๅส•ร˜1cpycฦŒppp(ิ•์ญ[ทฦมƒัััา้๙'jีช…ศศHŒ1 :t(Œ๓ํKWWฦฦฦ*"""*™x่{ŠŽŽฦ๔้ำกฃฃsssฌ^ฝฑฑฑprrB=0hะ |๙ๅ—ฐททGฃFT มผฮญPก‚‚‚‘‘™L†Ÿภซ‹‚z๔่ ‹คคคภุุ2™์ฃl}ฺ8Z ฝ{pqq““.^ผˆ%K–ภััฮฮฮ?~<`๘๑๐๐๐€ƒƒ~๚้'iyŒ?ฮฮฮhิจ VฌXu๋ึ!44ƒ RY_VV6lุ <ภซ‘อ‘#GชWฏŽ:u๊ไŠ๓๗฿ว!C```ฐดด>|u๊ิมิฉSฅข๔mาำำกP(TDDDT2ฑ-†๚๋/๘๙๙!>>qqqHOOวย… q๔่Q$$$`่ะก€กC‡โิฉS8{๖,ฮž=‹„„ฉ๊ีซ#!!ฮฮฮXณf z๖์‰   ,\ธ .พ}ใฦƒถm†I“&!22Rํ8ฏ\น‚ำงOฃ~๚hาค ญ[ทฦมƒ7Fpp0ขฃฃ ์+<<&&&าฃRฅJ…I}BX€CXนr%&Nœˆ+Wฎเเมƒ†ฑฑ1ภฬฬ ฐo฿>xxxภลลงNBRR’ิGฮ!tWWWธq#ื:Nž< [[[<ฑฑฑ๘฿‡๚๕๋*ฮ์์lปw111 Cฏ^ฝคyๅส•รศ‘#qy|๙ๅ—่น3พ๖|๛5jRRRควํท  }:X€C5ยกC‡`ii‰Ž;B‘ซอห—/1bฤl฿พgฯžE็ฮ‘žž.อืีีศๅrdgg็Zษษ ‹/ฦ‘#GะฑcGฌ]ป…ŠำฺฺAAAหๅ๐๖๖ฦ๛๗Ub=sๆ  „ะะP|๕ื อท/]]]ซ<ˆˆˆจdbZ ผyVVV0`‚ƒƒ‘ššŠีซWK็E๗฿x๙๒%ไr9ส”)ƒ๛[ทn-ิ:๔๔๔๐ีW_แ๘๑ใ˜1c๖๏฿ฺตkcึฌYj๗๑๚ก๖s็ฮมฬฬ 2™ งOŸ†‡‡BCCแ๋๋‹s็ฮa๊ิฉฐฑฑ)TŒDDDT2๑*๘b(::ำงO‡ŽŽฬออฑz๕j”/_ 4€––ฺทo & kืฎจSง*Vฌ//ฏw^Ÿ‹‹ """๐์ู3œ8q"ื}๛๖!$$=Bใฦัผysฌ\นญ[ทFTT์ํํกฏฏ%K– ‰š5kพsLDDDTrษD^วw‰Š˜Bก€‰‰ w‚Rฟจฃ๙?งปฏ+๊rษฬฬDTTกญญ]ิแkฬ•๚˜+๕1W๊cฎิ๗ฉๆ*็๓;็–Œ๙แ!x""""า( DDDDคQ,@‰ˆˆˆHฃX€‘Fฑ%""""bJDDDDล”ˆˆˆˆ4Š(i ‰Šต]"`nn^ิaัฤP""""า( DDDDคQ<OลZุฉ)(eTฒvำำŠ:""ข"ลP""""า( DDDDคQ,@‰ˆˆˆHฃX€‘Fฑ%""""bJDDDDล”ˆˆˆˆ4Š(i P""""า( DDDDคQ,@$''c้าฅEFฑˆŒŒ @งNPฆLซดy๔่Zตj…:u๊ภ?.ŠP‰ˆˆ่ร ูููŽฆ่ึ›™™‰ดด4@TTtttƒฦŠ+rต2dพ๚k\ธp111022<}๚TsAั'งฤ w๏…ทท7\\\เไไ„˜˜•็/^ฤ่ัฃ‘˜˜ฬ˜1ห—/GงNเ๋๋‹=zเมƒhถ-แใใƒห—/"""เแแ'''๔๎Jฅะธqc„††ยีีˆEณfอPตjUl฿พ=฿X'L˜€ฝ{รหห ?๐ฎ\น‚ๆอ›รออ -Zดภƒ666x๙๒%`๙๒ๅ9r$เ๛๏ฟGํฺตแ์์Œ3f@พ}ผ๎ฦ๘้งŸPปvmi^_Gใฦฅโ2Grr2ฮ;‡:LLL ซซ hืฎ:u๊„ฝ{๗Bกึ)== …BๅADDD%S‰/@๚๋/๘๙๙!>>qqq8pเ€ส๓*Uช`๒ไษpttD||<พ{ภูณgฑm6ฌZต ร‡ว๘๑ใ‹ูณgcฤˆ€.]บเิฉS8{๖,๔๕๕ฑu๋Viฝๆๆๆ8sๆ 6lˆมƒc๛๖ํุดiยยย Œ๗ฺตk8t่fอš…Aƒa้าฅˆ‹‹รื_Ÿ9฿ๅžฒณณฑeหขC‡จPกNŸ> WWWต๒z๚u˜™™แ‹/พ€ซซ+ฦŒ#อ‹ŽŽFฟ~ฐhั"888`ๆฬ™o=<้QฉR%ตโ ""ขOOฉขเc๓๐๐@ฏ^ฝ —หันsg๘๘๘จ<ทณณหsน-ZHฃ~๛๗๏GRR’4OKK €1cฦ@กP 99•*UBถmญ[ท8::B&“AOOธu๋V๑ถkืฺฺฺHMMลัฃGฅฒณณQญZต|—311กก!๚๔้ƒvํฺกUซV๖ัฎ];œ?+Vฌ@ร† ฿šว7eggใ๘๑ใ8}๚4jึฌ‰vํฺaห–- ‚L&C๓ๆอัผys>>W---้pzz: TฉRˆลฎ]ป‰ 6เ—_~ษท๐๐p๚๋ฏ๘๊ซฏะพ}{๔้ำ5jิ(0ถืY[[ฃFฐทท๐ชเNHH@PPเูณgXณf –.]ŠาฅKcๅส•(Wฎ\พ้๊๊J‡๐‰ˆˆจd+๑‡เoผ +++ 0มมม8rไˆส๓ฤฤD!555฿>|||ค‹””J%iiiฐฐฐภห—/ฑfอšท‰‰ ส”)ƒปwxuะ… UชTA||<”J%ถmเUม—’’‚   LŸ>๑๑๑๖แเเ€_gฮœA5ะญ[74iา7nP+>kkk˜ššโ๖ํBเเมƒจ]ป6เป๏พ“ฮฏ]นr%๖๎‹ฮ;K#วDDD๔y+๑htt4œœœเ๊๊Šร‡รฦฦFๅy๗๎ann'''899I๏ผn๙ุฑcœแเเ ]H4z๔hิญ[Mš4Q๛ษยˆŒŒฤŒ3เ์์ œ8q0fฬ๔์ู 4iงฆฆขUซVpvvFถmฅs=๓๋#G้าฅังOœ:u 3gฮDฉRนล[ตj…ฮ;cห–-จXฑ"ฮœ9˜5k‚‚‚เไไSSSt์ุเ็็‡‹/bฦŒจ^ฝ๚ฯ }ฺdBห”‰4HกPภฤฤรvŒ@)ฃ’uฆศ ๏iดฟฬฬLDEE!00ฺฺฺด๏’†นRsฅ>ๆJ}ฬ•๚>ี\ๅ|~งคคภุุ8฿v%~”ˆˆˆˆŠ—’5ด๔‰ุตk~๑G•i-ZดภิฉS‹("""""อaZPิa ‚'""""bJDDDDล”ˆˆˆˆ4Š(i P""""า(^OลฺŸ`nn^ิaัฤP""""า( DDDDคQ<Oลฺ๚‚ฝทถ๋Yณข!""ข# DDDDคQ,@‰ˆˆˆHฃX€‘Fฑ%""""bJDDDDล”ˆˆˆˆ4Š(i P""""า( DDDDคQ,@‹ไไd,]บดจรPฑeหฬ›7ฐcว8::B.—ใโล‹*ํ–/_Ž:u๊ภฮฮaaaE*}b๘Sœล@NฺงO๎Ÿ“ฬฮฮ†–––ฦby๚๔)ส”)ƒ   iZ5ฐvํZ 0@ฅํ… ฐdษฤลลมภภ>คคคภุุ2™Lcqังƒ# ูปwแํํ 899!&&Fๅ๙ล‹1z๔h$&&ยลล3fฬภ๒ๅหัฉS'๘๚๚ขGx๐เฺถm www๘๘๘เ๒ๅห€ˆˆxxxภษษ ฝ{๗†Rฉ4nกกกpuu…‡‡bccัฌY3TญZทoฯcVV6lุ <ภซ‘อ‘#GชWฏŽ:u๊ไZ๎๗฿ว!C```ฐดด>|u๊ิมิฉSฅข”ˆˆˆ( ะ์ฏฟ‚ŸŸโใใ‡จ<ฏRฅ &Ož GGGฤววใ๛๏ฟœ={ถmรชUซ0|๘pŒ?ฑฑฑ˜={6FŒ่าฅ N:…ณgฯB__[ทn•ึknnŽ3gฮ aร†}๕๋ืG“&M˜˜hบ5<เU1Œ่่่๛JOO‡BกPyQษฤC๐™‡‡z๕๊น\Žฮ;รววGๅน]žหตhัFFF€๛๗#))Iš—sH>!!cฦŒBก@rr2*Uช„ถmxU€ฃฃ#d2๔๔๔เเเ€[ทnNž<‰ `ุฐaˆ…ฑฑqกท-;;๗๎CLL Ž;†^ฝz!..Pฎ\9Œ9?๘#ถm†ฮ;#88๓็ฯฯณฏ๐๐pLœ8ฑะ1ัง‡# YฃFp่ะ!XZZขcวŽศฬฬTyพo฿พ<—ห9ฌ 2™ งOŸF||ผ4r }๛๖ล๒ๅห‘˜˜ˆกC‡"==]ZFGG —หUฮฮฮ899a๑โล8rไ:v์ˆตkื"##ฃPfmm   ศๅrx{{ใ๛BH๓ฯœ9ƒAƒ!44_5BCC๓ํkิจQHII‘ทo฿.T,DDD๔้`๚‘ผyVVV0`‚ƒƒqไศ•็‰‰‰022Bjjjพ}๘๘๘HWษ+•J้PwZZ,,,๐๒ๅKฌYณฆPq้้้แซฏพย๑ใว1cฦ ์฿ฟตkืฦฌYณิ๎ใ๕Cํ็ฮƒ™™™T,{xx 44พพพ8w๎ฆN ›|๛าีี…ฑฑฑสƒˆˆˆJ&‚ศขฃฃ1}๚t่่่ภ=z๔€“““๔|๕๊ี077‡““œœœะฃGXXXจ๔1|๔๏฿ .Dff&z๖์ GGGŒ=u๋ึEนrๅเ๊๊๚ฮ1บธธ ""ฯž=ร‰'rอ฿ทoBBB๐่ั#4nอ›7วส•+ับukDEEม๚๚๚Xฒd €Wฃท‘‘‘จYณๆ;วDDDD%—Lผ~ฬ”จ˜P(011Aฤษ๙ะ7ั{k๛ž5s฿ย๊s‘™™‰จจ(B[[ปจร)ึ˜+๕1W๊cฎิว\ฉ๏SอUฮ็wฮ-๓รC๐DDDDคQ,@‰ˆˆˆHฃX€‘Fฑ%""""bJDDDDล”ˆˆˆˆ4Š(i P""""า( DDDDคQ)N*ึ:Uํ ss๓ขƒˆˆˆ> Ž€‘Fฑ%""""bJDDDDล”ˆˆˆˆ4Š(i P""""า( DDDDคQ,@‰ˆˆˆHฃX€‘Fฑ%""""bJDDDDล”ˆˆˆˆ4Š(i P""""า( DDDDคQฅŠ:ขผ!ฉฉฉะึึ.โhŠทฬฬL< …‚นz ๆJ}ฬ•๚˜+๕1W๊๛TsฅP(฿็x~X€Rฑ๔ไษ€ญญmGBDDD…•šš “|็ณฅbษฬฬ p๋ึญwเxxxเิฉS๏ด๎OmY…BJ•*แ๖ํ066ึุz?ลe™+๕1W๊cฎิว\ฉ๏}s๕>๋~Ÿe…pssƒตตuํX€Rฑ$—ฟ:=ูฤฤไ^xZZZ๏‚—cccๆJMฬ•๚˜+๕1W๊cฎิ๗ฎนz฿uฟฯฒ:::า็x~x•Hƒ ๚ฌ–}Ÿโ๖2WšY๖}|Šห\ifู๗๑)noQๅ๊}ืฑ—•‰ท%JT LLL’’๒^฿?ฬ•๚˜+๕1W๊cฎิว\ฉฏค็Š# T,้๊๊b๘๑ะีี-๊PŠ=ๆJ}ฬ•๚˜+๕1W๊cฎิWาsลP""""า(Ž€‘Fฑ%""""bJDDDDล”ˆˆˆˆ4Š(; .„ ๔๔๔เ้้‰“'OuHEnย„ ษd*ฺตkK๓_พ|‰Aƒม†††ุ่ฑ#—\…‡‡รรรFFFฐดดDปvํp้า%•6๊ผ๎nบ…VญZมภภ–––๘๛๏‘••ฅษM๙่ิษUใฦsํ[๛๗Wi๓9ไ๊ท฿~ƒ“““tsy///์ุฑCš9ํS,@ฉXYณf FŒ๑ใวใ๔้ำpvvF@@>|Xิก9{{{ปwOz9rDš7|๘plบ๋ึญรมƒq๗๎]t่ะกฃีœดด48;;cแย…yฮŸ>}:ๆอ›‡ˆˆœ8qฅK—F@@^พ|)ต๙๒ห/qy์ูณถmรกC‡๐อ7฿hj4ๆmน€-Zจ์g๕—สฯ%Wฤ Aƒp๘q์ูณ™™™๐๗๗GZZšิๆmฏป์์lดjี ˆ‰‰มๅห—cธqEฑI:น€พ}๛ช์[ำงO—ๆ}.นชXฑ"ฆNŠธธ8ฤฦฦขiำฆhถ-ฮŸ?เ3งQ1Rฏ^=1hะ ้yvvถฐถถแแแEUั?~ผpvvฮs^rrฒะึึ๋ึญ“ฆ]ธpAวŽำP„ลฑqใF้นRฉๅห—3fฬฆ%'' ]]]๑ื_ !„HJJฤฉSงค6;v์2™L๛๏ฟ‹]ำฬ•B„„„ˆถmๆปฬ็š+!„x๘๐ก <(„P๏u%ไrนธพิๆท฿~ฦฦฦ"==]ณ AoๆJ!|}}ละกC๓]ๆsอ•B”)SF,]บ๔ณง8JลFFFโโโเ็็'M“หๅ๐๓๓รฑcวŠ0ฒโแส•+ฐถถFีชU๑ๅ—_โึญ[€ธธ8dffชไญvํฺจ\น๒gŸท๋ืฏใ๛*น111งงง”›cวŽมิิ๎๎๎R???ศๅrœ8qBใ1ต่่hXZZขVญZ0`ž>>8w๎๎฿ฟ˜ššช,Sฎ\9ฟฟh.&rถ?ฏ}*g๛๗aiiฉ2ฟTฉR033๛์๒ืขE t่ะถถถธvํ~๚้'ดlูวŽƒ––ึg›+ฅR‰aร†ม ึ๋๎๛y๎{9๓JขผrบuC•*U`mmณgฯโวฤฅK—ฐaรŸWฎแๅๅ…—/_ยะะ7n„โใใ?ซ}Š(ั' eห–า฿NNN๐๔๔D•*UฐvํZ่๋๋adT’K;::ยษษ ีชUCtt4š5kV„‘ญAƒแนs*็]S๒หี๋็ ;::ยสส อš5รตkืPญZ5M‡Yคjีช…๘๘xคคค`๚๕ มมƒ‹:,ใ!x*6ส–- --ญ\W=x๐ๅห—/ขจŠ'SSSิฌYWฏ^E๙๒ๅ‘‘‘ไไd•6ฬคํ/hŸ*_พ|ฎ‹ฒฒฒ๐฿}๖๙ซZต*ส–-‹ซWฏ๘$?Ww๎ม“'O`eeเ๓ส•ƒฦฦฑ~ฺฺุชฬW็u็ๅๅ…ฤฤD•ข}ฯž=066†f6D–ซผฤวว€สพ๕9ไ*/Jฅ้้้Ÿ฿>UิWAฝn๕๊ีBWWW,_พ\$%%‰oพ๙F˜ššช\๑๗9 ัััโ๚๕๋โ่ัฃยฯฯO”-[V<|๘P!DEๅส•ล๛Ellฌ๐๒๒^^^EตfคฆฆŠ3gฮˆ3gฮb๖์ูโฬ™3โๆอ›B!ฆN*LMMลๆอ›ลูณgEถm…ญญญx๑โ…ิG‹-„ซซซ8qโ„8rไˆจQฃ†ฺ่ตkQmาGSPฎRSSลw฿}'Ž;&ฎ_ฟ.๖๎+๊ึญ+jิจ!^พ|)๕๑นไjภ€ยฤฤDDGG‹{๗๎I็ฯŸKm๖บหสสย฿฿_ฤวว‹;w 1jิจขุคๆmนบz๕ช˜4i’ˆืฏ_›7oUซV5’๚๘\r5rไHq๐เAq๚uq๖์Y1rไH!“ษฤ๎ป…Ÿื>ล”Š๙๓็‹ส•+ Qฏ^=q๘๑ขฉศ}๑ลยสสJ่่่ˆ *ˆ/พ๘B\ฝzUšโล 1pเ@QฆLa`` ฺทo/๎ปW„kฮ€\!ฤซ[1;V”+WN่๊๊Šfอš‰K—.ฉ๔๑ไษัตkWahh(ŒE๏ฝEjjjlอวUPฎž?.…………ะึึUชT}๛๖อ๕ๅ๏sษU^y –-[&ตQ็uwใฦ ัฒeKกฏฏ/ส–-+BCCEffฆ†ทๆใz[ฎnบ%5j$ฬฬฬ„ฎฎฎจ^ฝบ๘๛๏EJJŠJ?ŸCฎพ๚๊+QฅJกฃฃ#,,,DณfอคโSˆฯkŸ’ !„ๆฦ[‰ˆˆˆ่sวs@‰ˆˆˆHฃX€‘Fฑ%""""bJDDDDล”ˆˆˆˆ4Š(i P""""า( DDDDคQ,@‰ˆ>siiiฐณณรณgฯŠ:๖๖๖8v์Xก–ฑฑฑม‘#G>RD…s๙๒eิฏ_ฟจร *–X€1”.]iiiาด็ฯŸรศศ666*ํ `hhssst้าOŸ>U้+>>พะEODDฺถm CCร๗ฺŽํ๙๓๐๒๒าศบขฃฃQฝzu•iฝz๕BXXุ;๗YณfM”/_[ทn}฿๐ˆJ DDล@… ฐiำ&้๙ๆอ›aee•ซ๎ป๑์ู3บu ๘๙็ŸUๆ๏น-Zด(ิบwtํฺ๕โ.ŒฌฌฌพŽโ"g[ปvํŠฅK—q4Dล P"ขb kืฎˆŒŒ”ž๙็Ÿ๘๒ห/๓m_บtiแย… *ำs ะ/^ kืฎ033ƒ™™|||๒์็ึญ[ธ{๗.ฅi66ฏ{ ‰ชkใ๗0ฏใฬ˜6ŽใLSJฅ“a E9Y˜šYJaeˆ•„ี…%zก EPhT˜žBิ %#L3้DDL3ำ๑์Œๆhyx‹p“ŸŽ๖พ˜฿็๓ปฺk๖Z๛yึž›‡ฝึkq๚uxyyมมมiii๘๔้ •Jq๖์Yก๏๔๔4าำำกVซแ๊๊Š„„|๐เม">>RฉนนนDtt4ไr9‘——gqŽฟ.งWTT`ใฦยSแขข"‹ใ^ผx 6ภษษ ษษษ˜žžฮพ}๋ืฏ‡ณณ3bcc1::Šฉฉ)„††ขญญ bฑbฑyyyศฯฯGFFฤbฑ0็ฦฦFภััพพพx๛๖ญpm+++dggcบu  บบzE฿ŒbŒ1๖Gi4ชญญ%•JEฝฝฝิK*•Š๊๋๋Iฃัฬ๊๗๙s""2™LN้้้ย๙แแaR(455Ew๎ก๐๐p2›อ411Auuu๓ฦฎจจ __฿9๙่t: ๆๆfฒณณฃ   า๋๕d0ศลล…ž>}JDD999คีjฉฃฃƒ๚๛๛iวŽBNนนนdccCนนน455Efณ™๖๏฿OIII4>>Nอออไ๊๊J ๏หฬ|]\\จพพžˆˆ 555Yณeห2 ิููIZญ–๎฿ฟODD>$ooojoo'ณูLวงคค$""ชฉฉ!YืŠฅŒŒ ก=22BJฅ’JJJhrr’สสสHญVำุุ ƒ’ษd"ณู,Œ“H$ิาา2oพŒญT”1ฦ–9rลลล(..ฦแร‡acc3ง_hh(d2ัฺฺŠs็ฮ ็ชซซกำ้`mm ‘H„ดตตมึึึโPฃั8๏ฯ„„ฌZต žžž๐๑๑AHHิj5 t:EEEHNN†Jฅ‚““าาาPXX(\วรร'Ož„ตต5L&jkk‘™™ ;;;xzz"::ฅฅฅ‹‘H„ๆๆf|๛๖ …Zญึb฿ .@กP@ฉT"11ลลล~n5HMM…Fฃฝฝ=.]บ„’’’EcฯจจจภฆM›„&""rนฏ^ฝ๚คคค@"‘ภ^๘อมม&“้ทใ0ถpสcหฤ‰'PPP€|‹ห๏=‚ัh„ูlFDDยยย„sฟ๎Œ‰‰มฝ{ Fƒฬฬฬyฏ'•J็}๛].— ว๖๖๖sฺ3cบบบฐfอแœFฃAWW—ะVฉTยฑ^ฏว๘๘8Vฏ^ ™L™L†{๗๎กปป{ม๛%%%(++ƒJฅBHHศœญฟRซีณŽ ƒ?>>^ˆฝs็N๔๕๕-๛ืŸ={&Œ—ษdhnnถ8฿###Jฅฟ‡ฑ•€ Pฦ[&088ˆกก!๘๛๛/ุืฮฮ111x๗๎๚๛๛|A)88๐ื_แส•+hmmลใวq๋ึ-ิึึฮนฮๆอ›๑ๅห—ณRฉ„^ฏฺzฝJฅRh[YY วnnn‹ล‚ัh„ัhฤศศ๎ฝปhœmถกฒฒ===๐๑๑™๕ไ๗?uttฬ:žy™หออ yyyBlฃั(|yเื<็ห}f|pp๐œ๑ัััวtwwcrr‹ฮ‘ฑ•„ Pฦ[FJKKkIzbbหๅprrBKK $‰Plีิิ ฉฉ ำำำH$ฐตตwI_ฃั@กP ฑฑ๑_ๅ{๔่QธqDFFŽ;6o_777l฿พ—/_†ูlฦไไ$ฟ?.ใว(((ภ๐๐0D"ฤb๑ผs™‘••…žž ผyQQQ€ำงOใ๊ีซBมm0PUUเ็฿พพพYŸย’หๅhooฺภ‡P^^ŽษษIŒกชชjมๅ๕บบ:์ูณถถถ ฮ‘ฑ•† Pฦ[FดZํ‚๛๗ํฑX gggิิิ ผผVVVs>ฟd0‰Dฤวว[7k฿ๆ?‡ศศHlบZญ>>>HMMตุ???_ฟ~…ปป;ไr9.^ผˆฑฑฑEใไๅๅAฃัภััOžๆŸนs็2~๘]ฯณ$;“Xบ}๛6ƒN๕?Aถm#88˜โล‹ใ่่HกB…จSง;w๎LQวไษ“ฉ]ป6… ฦลล…rๅส๑ํท฿’˜˜๘ศ1}๑ล,Yฒไ1่ั(•คศศH† ขTณvํฺล!C2œ€๚๋ฏL˜0ุุX^yๅ•‡–wttไ—_~แฝ{)ึ๔ำO8::>jศizœdญZตjนs‡jีช=ฑ8ž$% YC‰%ธs็ญZตzไmo฿พอ!CRM@Oœ8ญญ-;wf๒ไษ|๔ัG\ผx‘jีชฑfอsน?“>๘ร0่ป7_}๕žžžtํฺ•vํฺ=rLJ@EDย0 ๎น“ูad9ทnzฌํ‚ƒƒนqใผ๛๎ป-_งNbbbXฝzตล๒]ปvq๊ิ)๊ืฏXq[w๏%)) [[[ฑตีืเมำ๚ผฐฑฑมัั;;ป'Zo‡Xฒd ๛๗ง}๛๖|๔ัG์ฺต‹๙๓[วคPกBDDDฐ~z๚๖ํKงNXดh๏ฝ๗ณfอโ๗฿ขq=I๚ห“lๅ๔้ำtํฺ•RฅJแไไ„ปป;อš5ณ่้œ9s&อš5เตื^3_ ็Bฟ๙ๆส–-‹ƒƒEŠก[ทn=Emฺดมัั‘฿~๛อbAAAไอ›—๓็ฯg(qใฦQขD œœœจ^ฝ:GŽIQๆุฑc4mฺ”|๙๒แ่่H… Xถl™E™™3gbccรฮ;้ป7๙๓็'w๎4n˜+Wฎคจs๕๊ีTฏ^\]]๑๗๗g๎น)สEFF๒ฺkฏ‘+W.Š-สจQฃ,ึ'ฃ๛๙็Ÿ2dE‹ลลล…ฆM›M\\~๘! ภูู™๗{ธธ8‹:fฬ˜ม๋ฏฟNppp L™2|๛ํท)b๑๐๐ Aƒฌ]ป– *เไไฤ”)Sา<ทร† รึึ–‰'š—9s†cวŽฅนอ?ฝ{—มƒSฒdI)\ธ0oฝ๕๑‡นฬญ[ท่ำงล‹วมมRฅJ๑ีW_a†E]ษcT—,Y‚——”-[ึข'cแย…ุุุฐu๋ึฑL™2‹๗วฃผ/ถnJืฎ])P ลŠc๐เม๔ํOOO๓฿@zW๒ๅห‡‹‹K†ฮ@ัขEฉVญZŠ๗ีœ9s๐๖๖ฮ๐ใุุX>๐C<<}ฺ|ภฝ?็อ›ว€(Zด(นrๅ"&&&ี1 ษcŸ๖พ‡๛Ÿ5มมมไฮ› ะซW/ึฎ]›ขฮ“'OาคI *„ฃฃ#ลŠ#$$„่่่49ฝcธ|๙2ํทง`ม‚8::โ๋๋ห?ก๓™wดcว^}๕Uyแ…˜5k–Eนมƒccc“b๛ไ๗ิ?฿+ษunูฒลท้ํํm>‹-ยGGG8x๐`ชฑ๙็Ÿ‘;wnŠ)ยะกCS-%%%1~xส–-‹ฃฃ# คSงN\ฟ~=ีใLํ๓b๚๕TฉR…๙„฿‰'’3gNlmmน~:ƒf๗๎ฬœ9OOOh๖oฟฅlูฒ“#G–/_Nืฎ]IJJข[ทn๛9~8๏ผ๓:uขcวŽ”*U*ีs;`ภพ๘โ ฆL™BวŽอห[ทnอึญ[S|ฉ=(11‘ ฐqใFBBBู่ณ'ฑฑฑฌ_ฟž#GŽ๐โ‹/bมมมlผ™๖ํc2™Xปv-}๛๖ๅนsŒ7ฮขฮ;vฐhั"บvํŠ‹‹ &L I“&œ9swww๊ืฏณณ3?3ีซWทุv๙”-[ึœด=๊๛ขkืฎไฯŸŸr๋ึ-๊ึญห‰'๘้งŸ7nฯ=๗€๙ ๑Iiัข={๖ไๆอ›8;;“ภ‚ ่ป7w๏อP;wfแย…t๏2eสpํฺ5v์ุมoฟF๙๒ๅ้฿ฟ?ััั๕ื_ๆsเ -Ÿ9๖๖๖|๔ัGฤลลaooŸๆ2๒พฟu๋ฏฟ:.\ gฯž*Tˆนs็ฒy๓f‹บ๎ปGPPqqq|๐ม*Tˆs็ฮฑbล nธ››[ช1คwLw๎กF๛๏t๏OOO,X@ถmนqใ={๖|่9๗฿iฺด)ํทงM›6|๗ดm??ฟT“™Œ๘๗฿iัข:uขeห–|๕ีWผ๙ๆ›„††๒้งŸาตkWเgE๓ๆอ9~ธE๏sbb"u๊ิกRฅJŒ5Š5kึ0hะ :tจน\งN˜9s&๏ฝ๗=z๔เิฉSLš4‰ƒš?Ÿ“ฅ๖yq๔่Q4h€C‡ลมม฿=ลุสŒ~Vค%11‘   *VฌศW_}ล† 3f /พ๘"]บt!|๛ํทt้า…ฦ๓ึ[oเใใcQOLL ๗๎ใ๊ีซฬš5‹#GŽคH–Ss๑โE๓฿vFฬž=›:๐๊ซฏ๒๛๏๐โ‹/fx๛Gfˆd#ทo฿Nฑ์ื_5cึฌYๆe ,0c๓ๆอe/_พlุตkื6อห'Mšdฦ๗฿o^ถvํZ0† f๙็Ÿ†ณณณัจQฃ‡ฦx๊ิ)0œœœŒฟ๚หผ|ฯž=`๔๊ีหผฌfอš†ทททq๗๎]๓ฒคค$#00ะx๙ๅ—อหfฬ˜aFญZตŒคค$๓๒^ฝzvvvฦ7 ร0Œ7n...FลŠ;w๎Xฤ๕ฯํชWฏžโœลลล… 2š4ib^ถy๓f0ผผผŒ{๗๎™—ฟ๓ฮ;†Qทn]‹}%J”ฐX–Z›/ผ๐‚ลฒ%J€ฑfอšๅฃ[ทn†aFŸ>} [[[cๆฬ™)ส%ืร|๗`Œ;6ลบไ๓ดdษs๛SำฆM ใ๗฿ทˆฯbูกC‡ ภ˜8qขyู;๏ผc(PภHHH0/ปpแ‚akkk :ิผ์Q฿UชTฑจำ0 c๔่ั`œ:u๊ก็ใA6น=๛oร˜={ถa†ฑrๅJรฦฦฦˆŠŠ2 dฦ•+Wา—›››นmำRฟ~๏+ร๘ฟ๗็ /ผโ}–ผ๎ŸŸ}฿3ฦŒ%K–˜—นsว(]บดE4cม‚้ฦ(ว4~x0~๑G๓ฒ{๗๎†ณณณ“nฝษGถm3/ป|๙ฒแเเ`๔้ำวผ,น}”ž๚g'ืนkื.๓ฒไฯG'''ใ๔้ำๆๅSฆLIqดicฦ|`^–””dิฏ_฿ฐทท7ฟGถo฿nฦœ9s,bZณfMŠๅi}^Œ7.C๏ปŒ~V$žฯ˜1#ล๑๓oึ0 ฃ\นr†ŸŸŸ๙๕•+W ภ4hPš๕€๙3คSงN)>ปg”)Sฦ๐๔๔4โใใz ”;wnฃM›6ดอใา%xษVœœœฬฯใใในvํ/ฝ๔y๒ไ1_ฒKฯ† ธw๏~๘กลฮ;v์ˆซซ++Wฎ4/ซ]ป6:ub่ะกผ๕ึ[8::ฆ{I๘A5ขhัขๆืฏพ๚*+VdีชU๗฿lฺด‰ๆอ›หีซWนz๕*ืฎ]#((ˆ“'Or๎9‹:฿}‹หfUซV%11‘ำงO๗/=ลฦฦ๒ษ'Ÿคธ ไมหmฮฮฮดlูาฺžW_}•?3ลฑดnฺข็กbลІ‘b|ลŠ9{๖, ๆelณ่่hฎ^ฝJ๕๊ี๙๓ฯ?S\ฆ๔๔๔$(((ลแฏ๎ป๓๕ื_๓ใ?าฆM›eถlู’ก_~๙…็ž{Ž>๘ ลบไ๓ดjี*์์์่ัฃ‡ล๚>}๚`FŠฑตjีฒ่M๐๑๑มีีีโ|พ๖\พ|ูโ๎ย… IJJโํท฿๏}ัฑcว'>F-#๒ๆอK:u๘้งŸ€๛7ึRขD‰ ื‘'O๖์ู“แa-ฉiำฆล๛,=y฿ฏYณ†ขE‹l^ๆ่่hั˜{8ืฎ]หํท;Zตj… โw1/ห™3'=z๔เๆอ›ฉแxP™2eจZตช๙u๙)UชTชUฆLฬฏ+Vฌภ๋ฏฟฮ๓ฯ?Ÿbyj๛๚็TjษรV๎ปว† Xฐ`nnnผ๑ฦๆ๗ีซW๑๓๓รูู9EtjŸy๒ไ`้าฅ$%%ฅy<ฌHO็ฮ-^WญZ๕‘ฯ๑ศ‘#Yทn฿}๗•*Uโฝ{ŸŸฉ้ฝ;‘‘‘Lš4‰9ž J@%[นs็4ษ{๎น็ฬcfาs•,9Q{๐าฎฝฝ=/ผ๐‚y}ฒฏพ๚Š|๙๒ฮ„ (P @†c}๙ๅ—S,+Yฒคylี๏ฟŽa|๖ูgไฯŸ฿โ1hะ เXฐ๚็=O๓๘จไ๑‹WฌXฑIiผySŒตJmฟษ_ผล‹Oฑ<))ษข-v๎IญZตศ;7y๒ไ!ๆKLฉ% i™5k“'Ofโฤ‰_ฮใ? TฉR้~xŸ>}š"EŠค™<”ใม๗สƒ็Ržฯ:u๊เๆๆf1db๙˜L&J–, <๛"ฝ๓๖ดตhั‚๕๋ืsๆฬ–,Yb1ฬ##Fล‘#G(^ผ8ฏพ๚*ƒ~ไ/๑G9Œผ๏OŸ>อ‹/พ˜ขK/ฝ”bฟฝ{๗f๚๔้<๗s1y๒ไ }ฅๅ๔้ำผ๒ห)nžJ๋}—šŒผีฃ|)๖ekkห /ผ`ฑ,๙=Ÿ™x๒ไIขฃฃ)P @Š๗อ›73๔พ๛ํทฉ\น2:t `ม‚„„„๐๓ฯ?ง›Œ>GGวCZ็›L&xใ ฺตkว๚๕ู๋ปwoบใ2Gอดiำ๘๓ฯฉWฏใ„n5ฯnj,๒>๘เfฬ˜ม‡~H@@nnnุุุ๒ฤ?`>bhม?•(Q‚ 6kฑŸไ;gๅ2๓?ฝ๖๐รlธ‘฿~๛ ร0ฬ—฿แษฝ/า๚xาœœœhิจ?๘#u๋ึ}ค›"’.\˜ฎ]ปาตkW._พL๙๒ๅ>|ธ9ตึฑ$+Qข‘‘‘†aฑ๏ดฆผ๑๖๖ฦ›ฐkื.*WฎLhh(ร† Ks้}F>|ุ<•Tฒ๛พ{P๒ี“7n˜/[CฦzXGRR๙งนื๎ๆฯฤ_|‘ 6Pนrๅ๕Ÿ*[[[jึฌIอš5;v,_|๑๛๗g๓ๆอO์ณ6#็}{็ฮ ร 66ึโ,]บ”:๐ึ[o1y๒dซฦ๔ธt ^ฒ;;ปณž8qbŠต็ฮ EbZซV-์ํํ™0a‚E=฿}๗ัััs๏ใฬ™3๐รŒ;s/OF,Yฒฤbฌฝ{ูณg๙Kต@ิจQƒ)Sฆpแย…ง6ฝาริฎ]FŒ‘โ.ไ;้q$๗s฿ัััฬ˜1ใฑ๊๓๑๑aีชU๖oผ๙ๆ›)ๆห่ิ*Mš4แ๊ีซLš4)ลบไX๋ีซGbbbŠ2ใฦรฦฦ&รฝsชUซ๙๒ๅc๙ฬŸ?ŸW_}ีโRโ“z_ค๕7๐4|๔ัG 4ˆฯ>๛์‘ถKLLLqนบ@)Rฤโ๏,w๎๊ฒ๖ฃ โนsำ^ฝ{—iำฆY”‹‰‰I1^ฯ[[‡~NคuL๕๊ีใโล‹ร4˜8q"ฮฮฮ)fPx\ษYถm›yY๒=Oห?– ร`าคIไฬ™“š5k๗{ร๙๓ฯSl›ก๗๒฿b™ษdฐh“G™ฒํqๅส• Ho๐มแษๅ~๙ๅŠ/n1kถm„„„PญZ5ๆฬ™๓ฏๆถอ;ทU>@= ’อ4hะ€ูณgใๆๆF™2e๘๕ื_ูฐa๎๎๎ๅL&vvv|๙ๅ—DGGใเเ`ž‹ฒ_ฟ~ 2„:u๊ฬ๑ใว๙ๆ›o๐๗๗7฿œฐiำ&พ๙ๆ D๙๒ๅ๛๓YึจQƒฯ>๛,ีy๔าK/QฅJบt้B\\ใวว?ุ\f๒ไษTฉRooo:v์ศ /ผภฅK—๘๕ื_๙๋ฏฟ8t่ะ#WWWฦG‡๐๗๗งE‹ไอ›—C‡q๛๖ํง๚ๅ’šฺตkcooฯ›oพIงNธy๓&ำฆMฃ@ฉ&WQฉR%–.]Jฝz๕hฺด)K–,1๗bftj•ึญ[3kึ,z๗๎อฝ{ฉZต*ทnbร† tํฺ•† ๒ๆ›o๒ฺkฏัฟขขข๐๕๕eบu,]บ”?๐ฑง/ษ™3'oฝ๕๓ๆอใึญ[|๕ีW)ส<‰๗…ŸŸpสŸrๆฬษ›oพiNLmžS5yสšI“&‘'O๒ไษcqษƒ|}}๑๕๕}hLŠฅXฑb4mฺ___œูฐa๛๖ํณธสแ็็ว๙๓้ป78;;๓ๆ›o>๒2ชSงNLš4‰wy‡ž={Rธpaๆฬ™cพฑ/นiำฆMt๏fอšQฒdI˜={6vvv4iา$}คuL๏ฟ>SฆLกmถ์฿ฟ.\ศฮ;?~c๗๚?จvํฺ<๓ดo฿žพ}๛bggว๗฿O๙9sๆฬูว?9::ฒfอฺดiCลŠYฝz5+WฎไำO?5_Zฏ^ฝ::ubฤˆ„‡‡Sปvmrๆฬษษ“'Yฐ`_5M›6Mw?C‡eถmิฏ_Ÿ%Jp๙๒eพ๙ๆŠ+F•*Uฬๅํ4LแไไD™2e˜?>%K–$_พ|xyyแๅๅEบu)Vฌ+Vค@œ9s†3fpy‹|$ฯGkccCำฆMYฐ`ล>|||RLํ”???6lุภุฑc)Rคžžžๆวž8ซk/b%ืฏ_7{๏=ใน็ž3œ   ใุฑcF‰%RL-1mฺ4ใ…^0์์์RL 2iา$ฃt้าFฮœ9‚ ]บt1ฎ_ฟn†aฤฤฤ%J”0ส—/ŸbŠ‹^ฝzถถถฦฏฟšfŒษำvŒ=ฺ3fŒQผxqรมมมจZตชq่ะกๅ๘ใฃu๋ึFกB…Œœ9sE‹54h`,\ธะ\&yj”}๛๖Yl›ฺT3†aห–-3 '''รีีีx๕ีWŸ~๚ษผพz๕๊FูฒeSฤาฆM‹ฉa’๋pš™ดโIm๊eห–>>>†ฃฃฃแแแa|๙ๅ—ๆiœ๊ฅ~๚)Oจa9 SฒฅK—9rไ0~๛m๓”ZZล0๎Oีฟรำำำศ™3งQจP!ฃiำฆฦa.k๔๊ีห(Rคˆ‘3gNใๅ—_6Fm1ฅUZ๑%SjSžฌ_ฟ ใ์ูณฉฦ๗oษ>sฃhัข†ญญํCงdJ~฿ฆ๖xpบ ดŽ๗Ÿ22 S\\œัทo_รืืืpqq1r็ฮm๘๚๚฿|๓Eน›7o-Zด0๒ไษcOZ๏ฯฎ{pฆŒผ๏ ร0๓Oฃ~๚†“““‘?~ฃOŸ>ฦ/ฟbฦ๎ปอeฺตkgผ๘โ‹†ฃฃฃ‘/_>ใตื^36lุ๎นI๏˜ ร0.]บdœณทท7ผฝฝ-ฆJOZGีซW7ชWฏnฑlFลŠ {{{ใ๙็Ÿ7ฦŽ›ๆ4Lฉี™ฺ๛เŸŸษฺดicไฮ๘ใ?Œฺตkนrๅ2 ,h 4ศb:ผdSงN5 '''รลลล๐๖๖6>๘cใ๙๓iใฦFร† "EŠ๖๖๖F‘"EŒwyว8qโDŠ๓‘‘ฯŠดฆaส;wŠฒฉMmตkื.รฯฯฯฐททท˜’iาคIF•*UŒ็ž{ฮศ‘#‡‘?~ใอ7฿ด˜>ห0๏}œึ#ฝ)žRs์ุ1ฃZตj†“““<ี)™l #ฎป‰ˆˆd3ใวงWฏ^๕ื_Sฌ‰HJJ@EDDัƒw!฿ฝ{—rๅส‘˜˜hพyFDาฆ1 """่ญทโ๙็Ÿวd2อ?ศฑcวาœ"H$3%4gZœœœาiุงE= """h๘๑LŸ>จจ()Sฆ ฑล”Y"ฯЇMฏิฆMfฮœi`?% """"ูX๒ฯ™ฆฅH‘"”)SฦJังTDDDDฌJั‹ˆˆˆˆU)ษ†ฮž=‹ฃฃฃyา๘์`ห–-ุุุฐeห–]W5๐๒๒๚๗A=*Uชd๑"YP‘4ฬœ9lllุฑcGŠ๕†aPผxqlllhะ ลบไํ’นs็ฆL™2 6Œทoงบฟˆˆlllุปw๏ฟŽ}่ะกTฌX‘ส•+๋บ$cพ๘โ –,Y’b๙ฎ]ป๛ŒSงNQฃF ๖์ู“b_]ปv%22’๒ษ'Ÿ0{๖l๊ืฏณณ3_~๙%Ÿ}๖‘‘‘TฉRล")หˆ{๗๎ฤ๎ป๙เƒ˜๙g†.w_ฟ~z๕๊แ็็วจQฃ(Vฌ]บtแ๛๏ฟ7—IJJ"88˜ฏพ๚Š7฿|“‰'าจQ#ฦg1้์ูณqpp jีชๆa:uโญทโw`ธqๆu๙๓็`๘๐แดnš—_~™ฑcว๒แ‡ฒqใFชUซ–โฎ]ปFบu1™LŒ?žื^{อผฮฯฯ [t&ูœ!""ฉš1c†๛๖ํ3&Mšdธธธทo฿6 ร0š5kfผ๖ฺk†aF‰%Œ๚๕๋[l ค๚hิจ‘q๗๎๛jีช•Qฝzu๓๋ž={ฎฎฎFBBย#ล๛๏ฟ€1qโฤ๋ชWฏnฦนsอหŽ;f†ญญญฑ{๗n๓๒ตkื€1cฦ ๓ฒF๖๖๖ฦa^vyรลลลจVญšyY๒yซRฅŠEฑฑฑFž|ธล๒ˆˆ#GŽห“ใ M๓˜์ํํ.]บ<๔ุEž๊ษ€ๆอ›s็ฮVฌXAll,+Vฌx่ๅ๗† ฒ~zึฏ_ฯาฅK้ืฏkึฌกE‹๘ คค$ึฌYcq๙=Ož<บuหโฒF\ปv €ผy๓ฆบูููขืถTฉRไษ“‡W^y…Š+š—'?๓ฯ?HLLdบu4jิˆ^xม\ฎpแยดhั‚;vcฑฏŽ;bggg~ฝ~znธม;๏ผc๎พz๕*vvvTฌX‘อ›7?าฑ&v๕ฺตkำœY =9rไ SงNๆื๖๖๖t๊ิ‰ห—/ณ~,Xภ+ฏผB้าฅ-b~๕ื9ๆZดhIII4oข๎B… ๑๒ห/งจมม๗{/อ๚๒ๆอ›ๆxd‘gnBษ€๙๓SซV-ๆฮหํทILLคiำฆ้nSฌX1jีชe~Œปป;}๔+Vฌ0฿$ดo฿>ฎ\นb‘€vํฺ•Ÿ™บu๋RดhQjืฎM๓ๆอฉSงN†โ5า๘‘ปbลŠฅธIลออโล‹งX๗/Sร;๋o฿พMฉRฅRิ๙ส+ฏ””ฤูณg)[ถฌyนงงงEน“'O˜“ทนบบฆwH)xzzาปwoฦŽหœ9sจZต*มมมดlูาzŠ)’โฦจ’%KEฅJ•8y๒$ฟ๖›๙’๙ƒ._พH1ำษ“'1 ƒ—_~9ี๕9sๆดx]ดhQ์ํํำฌฯ0 €$Y†P‘ jัข;vไโล‹ิญ[—่ฦ<๗sˆ5)ษ ฦำฉS'v๏อ๙๓ซŽ„„nผi^ถrๅJ๊ีซ—ขฌฝฝ=oพ๙&oพ๙&IIItํฺ•)Sฆ๐ูgŸ๑าK/ฅZ๓ฯ?““งNzฌ๘า’?~rๅสล๑ใวSฌ;v์ถถถMฦ^|๑Eเ~rฯžแหooo ภฎ]ปจ\น2กกก 6,ํฮŸ?Ÿbzจ'N๗o>>ำ<(gฮœTจPฐฐฐวŠ/-vvvิฎ]›ฅK—Zญ~้า%ๆฮK•*Uz =((WWWพ๘โ โใใSฌฟrๅส#ลcN่“y{{ckk›๎9J–ภ”)Sฬฏ๏ปว”)SศŸ?ฟ๙ฎ๒ๆอ›s๎9ฆM›–b๛;w๎p๋ึ-๓๋นsงz๗}r‚๛เบทz ;;;† ’ขงู0Œ๏๔$Y ฬ๐6"™I= "" ญ_1Jอ‰'๘๑ว๛“†๏ฝ›~๘—^z‰VญZ๗/ฟ;::ZLฉะกC๛o^uŠ+ฦ้ำง™8q"&“้กฝ\ 6คฤฤฤ<๒ธส๔ 6Œ๕๋ืSฅJบvํJŽ9˜2e qqqŒ5๊กปบบ๒ํท฿าชU+ส—/OHH๙๓็็ฬ™3ฌ\น’ส•+3iาค วณiำ&บw๏Nณfอ(Yฒ$ ฬž=;;;š4i๒ะํ‹)ย—_~ITT%K–d๙„‡‡3u๊T๓๘หVญZ๑๓ฯ?ำนsg6oLๅส•ILLไุฑc๓ฯฌ]ป– *๗งBฺฐacวŽฅH‘"xzzRฑbEs2ฟBBBศ™3'oพ๙&/พ๘"ร† ฃ_ฟ~DEEัจQ#\\\8u๊‹/ๆ๗฿็ฃ>สะนXฟ~=ฯ?<ๅส•ห๐๙ษT™wพˆศณํŸำ0ฅ'#ำ0ูููลŠ3}ใาฅKๆrM›65๊ีซ—ขฮ… ตkื6 (`ุฯ?ผัฉS'ใย… ๛าฅKFŽ9Œูณg[,ฏ^ฝบQถlู ลŸ| บuณXvเภ#((ศpvv6rๅสeผ๖ฺkฦฎ]ป,ส<์ผmผู 2 GGGใล_4ฺถmk„……ฅ{\Nร๔็Ÿํฺต3^|๑Eรัััศ—/Ÿ๑ฺkฏ6lHทร๘ฟsfŽŽŽF‰%ŒI“&ฅ({๏=ให/ฟ4ส–-k888y๓ๆ5Œ!C†ัััๆrวŽ3ชUซf899€ล”LŸนQดhQรึึ6ล”Lฟ๒‹QฅJ#w๎F๎นาฅKบu3Ž?ž"ิ$&&… 6 ๐ะใyVุฦฟa.""-!!wwwFŒAืฎ]Ÿhํท็ฤ‰l฿พ‰ึ+ฯž%K–ะขE ๘ใ .œูแˆdˆP‘Lr๙๒eพ๙ๆ:u๊๔ฤ‡3gฮPฒdI6nHๅส•Ÿh๒l  jีช!๒ฌP*""""VฅปเEDDDฤช”€ŠˆˆˆˆU)ซR*""""Vฅ‰่ๅ™”””ฤ๙๓็qqqy่ฯ฿‰ˆˆศณม0 bcc)Rคถถi๗s*•gา๙๓็๚ปา"""๒l:{๖,ลŠKsฝPy&นธธp๊ิ)๒ๅห—ษัHFลววณn:jืฎm)Cyถฉอฒ&ต[ึ๔_hท˜˜Š/nO‹Py&%_vwqqyขฟe-OW||<นrๅยีี5~ธf7jณฌIํ–5—ฺํaร็t’ˆˆˆˆX•Pฑ*% """"bUJ@EDDDฤช”€ŠˆˆˆˆU)ซR*""""VฅTDDDDฌJ จˆˆˆˆX•Pฑ*% """"bUJ@EDDDฤช”€ŠˆˆˆˆU)ซส‘ูˆค'hN’์3; ษ {[ƒ~^Puิ6๎%ูdv8’jณฌIํ–5=+ํvเณื3m฿ษิ*""""VฅTDDDDฌJ จˆˆˆˆX•Pฑ*% """"bUJ@EDDDฤช”€ŠˆˆˆˆU)ซR*""""VฅTDDDDฌJ ่C4mฺ”J•*YuŸวŽฃFOผ์ฃXถl&Lเoฟลวว“ษDํฺตนt้กกก”-[5jDLLฬCDDDฒ% ้Xฟ~=vvvผ]bbโSˆฦ:ฎ_ฟ@pp0=z๔ eห–>|˜๐๐p‚ƒƒ๙๒ห/๐๒๒b฿พ}>|///ฦ@tt4†adฮˆˆˆศ3O ่7mฺ4ผฝฝ๑๕๕eะ Aฤวว๓ล_0`ภ€ mฟeหjีชE:uจUซ7oคUซV๘๛๛ใ๏๏ฯ๎ปXฒd +Vฤd2ัฐaCnผ ภ‰'จPกพพพL:5}ฅU6ญ}ž?ž๚๕๋ใ๋๋‹ŸŸgฯžตจ/!!E‹Qปvmบw๏ภฬ™3๙ไ“Opqq1—ฝ}๛6666TฉR…\นrเ็็วนs็ุพ};ฏผ๒ #GŽไ๒ๅห:qqqฤฤฤX|˜ษ“'ณs็N:Dฯž=;v,mฺดฑHพเe็ะะPยยย่ะกƒy๛™9s&›7ofุฐa4iา„}๛๖ฑx๑bบu๋@๕๊ีูณgแแแTฎ\™๏พ๛€?r่ะก‡๖ฆU6ญ}๖่ัƒfอšq่ะ!v์ุมsฯ=ภูณg8p eส”aลŠ :”9sๆคบฯqใฦแแแม?@ฟ~RฌŸ5k5kึ Aƒlบ€5jย–-[า=ฆ#Fเๆๆf~/^<๒"""’u)ๅ~๏eHHฎฎฎนs‡u๋ึัฆM›e;w๎L็ฮจPกำงO7ฏซZต*… ๎_พ4h&“‰ p๙๒e8sๆ ตjีย›)Sฆ `พผ ๐ฮ;๏คoZeำฺ็ฏฟj>'''œœœุปw/žžžพ}›ฐฐ0พ๛tวบ๖๊ี‹จจ(:u๊ฤฤ‰-ึ}๓อ7$$$๐๖o›—,XO>๙„ฃG๒๎ป๏าฌY3>๘เƒ4๋๏ืฏัััๆวƒฝด"""’}ไศ์žEแแแDFFโ้้IBBWฎ\!88˜eห–ฅป]๒ๅhร0Xฝz5EŠฑ(ำฃG† B5Xธp!+Vฌ0_ึ~๐yjา*›ึ>SใใใริฉS™:u*Mš4กcวŽ4jิ{{๛tทkูฒ%UซVeศ!ฌ[ทŽฉSงฒmถe<ศดiำุฐaํท7'๎ฉqppภมมแกq‹ˆˆHึงPเ๕ื_gผyๆq‡\ธpจจ(v์ุAนrๅš|>จVญZLž<ู๚ะกCฤฤฤPธpa’’’˜={ถyฝฏฏฏ9?~บuงU6ญ}Vฎ\™~๘€ปw๏r็ฮiืฎปw๏f๔่ัlฺด‰าฅK3fฬ˜๛;y๒ค๙๙าฅK)]บ4‘‘‘t๏%K–˜{8€ฟฟ?}๚๔กz๕๊9r„‘#Gโแแ‘๎q‰ˆˆศƒP๎฿อฝ{w๑๕๕5O?”š๔ฦ€ำภ9<>>>”)Sฦ|ฉณฯ>ฃnบTฌXOOOs๙๑ใว3x๐`|}}:4ญฒiํ๓๋ฏฟๆ็Ÿฦวว‡*Uชpํฺ5‹๚L&กกก>|“ษ”b'Nฤหห “ษฤ‚ ?~ผyััั4jิ“ษdพk>Wฎ\ฬ™3‡M›6๑๖o?ดWUDDD[l อ—#ฯ ˜˜๐ฐ”${็ฬG2ศึ ŸืMFqๆ^R๚CIไู 6หšิnYำณาn>{ฉีmqu๔A๊ซR๚ ›1c&“ษโ‘๐‘ฌ@wม?ร{๏={๏ฝฬCDDDไ‰RจˆˆˆˆX•Pฑ*% """"bUJ@EDDDฤช”€ŠˆˆˆˆU้.xyฆญฐ2๎๎๎™†dP||<ซVญb๛วีศ™3gf‡# 6หšิnY“ฺํจTDDDDฌJ จˆˆˆˆX•.มห3ญš“ไศu9ณร ฒ#‘ืmแฃวIฤ.ณร‘ P›eMjทฬ3ฉ๑+™Bถ Pฑ*% """"bUJ@EDDDฤช”€ŠˆˆˆˆU)ซR*""""VฅTDDDDฌJ จˆˆˆˆX•Pฑ*% ฯ€ฆM›RฉRฅว>**Š… >ดภูตkW†๊ฌWฏ๗๎ใ๎ปผ๚๊ซ˜L&ผผผ˜6mืฎ]ฃfอš”)Sooo,X๐ุ๑‹ˆˆศ‹~Š3“ญ_ฟ;ป๗3jษ hำฆMำ-7t่ะtืวววs๏=r็ฮอชUซ0 ƒอ›7“;wnnบ…ทท7อš5รึึ–‘#Gโ๏๏ฯๅห—)_พ< 4ภษษ‰๋ืฏ“7ouL"""’}ฉิŠฆM›†ทท7พพพ 4ˆ๘๘xพ๘โ  กํcbbx๕ื)_พ<ๅส•cวŽ๔๏฿Ÿตkืb2™˜3gWฎ\กnบx{{ฤฅK—hถ-kึฌIQoTTŸ~๚)ฅK—ๆฤ‰xxxp๗๎]lllศ;7qqq$%%‘””Dผy๑๗๗ @ธปปs๚u5jDำฆMูฐa†aป“&"""ูŽP+9|๘0“'Of็ฮ:tˆž={2v์Xฺดiƒ‹‹‹EูะะPBCC ฃC‡899ฑt้R8ภ๒ๅห้ำงร‡'((ˆ๐๐p}๗] ฤoผADD 6ค)โILLdูฒeิซWทz‹ขE‹rเภส•+—ข์;w๐๕๕ฅx๑โ๔ํ—|๙๒Yฌ?x๐ ‰‰‰)R€-[ถะฉS'ฆL™‚——_}๕Wฏ^M๗ฤลลc๑‘์I—เญdห–-„„„เ๊๊ O๊ึญ[ว† 8}๚ดEูฮ;›ŸWจP้ำง๗/‡๑ว์ุฑ;;;~๗T๗ตkื. @ห–-™8qbŠ25โ่ัฃฬš5‹*Uชคป““‡โส•+4iา„ฆM›Rฐ`AnธA๋ึญ™:uชนผ oผ๑oผ๑Wฎ\กWฏ^+VŒ?ำœค>hฤˆ 2$8DDD${Ph& '22OOOชTฉยมƒ Nw›9sๆp๏=ยรร W๛1bu๊ิก]ปv๏ใไษ“&˜L&ถm3ฺคIz๕๊E`` Eู›7o๒w฿ฬล‹™={ถ9iMMฟ~ˆŽŽ6?ฮž=๛ฏŽODDDž]J@ญไ๕ื_gผyๆKห\ธpจจ(v์ุAนrๅXถlYบuฤฤฤP @์์์Xธp!ทnภลล…ุุXsนภภ@ๆฯŸภนsSํแ๔๒๒โ›oพแเมƒผ๒หดhั‚ื^{จจ(‹rWฎ\แฦฤฦฦฒeหJ•*@ืฎ]ฉPกํฺตณุๆฃ>ยวว‡cวŽ1{๖l6lุ@ณfอาฝูสมมWWW‹‡ˆˆˆdOJ@ญฤหห‹๎ปˆฏฏ/&LHณlZc@[ดhมฆM›๐๑๑aถmๆE๎นcพ i๐เมฌZต -ZฤฐaราW๎น้ะก๛๖ํใซฏพ"GหQ.\เตื^รืื—ภภ@บt้‚GŽa๚๔้ฌYณ“ษ„ษd"22€Zตjq์ุ1FอK/ฝ๔ฏฮ›ˆˆˆd?6†nS–gPLL nnnt๚๑Wrไrห์p$ƒ์Hไu?ุ”๔"‰ป้ลฤ:ิfY“ฺ-๓LjสcoฯชUซจWฏ9sๆ|‚Q=;’ฟฟฃฃฃำฝšฉPฑ*% """"bUJ@EDDDฤช”€ŠˆˆˆˆU)ซR*""""VฅTDDDDฌJ จˆˆˆˆXUއษ<ร๋ผŒปป{f‡!t’ๅ?๘ชAฉl;ษrvฃ6หšิn’ีฉTDDDDฌJ จˆˆˆˆX•Pฑ*•gฺC็prน•ูaHF%%’๘๑ภ_`k—ูัHFจอฒ&ต3้=็3;„,C= """"bUJ@EDDDฤช”€ŠˆˆˆˆU)ซR*""""VฅTDDDDฌJ จˆˆˆˆX•Pฑ*% """"bUJ@3QำฆMฉTฉาcoลย… Ÿ`D็๙๓ดn€ฝ{๗b2™0™LTจP_€;wRกBผฝฝ  ""โฉฤ""""ู‹ะLฒ~z์์ฯง=๔๚๕๋)R„Yณfเๅๅล๛ gๆฬ™t๋ึ €”€Zมดiำ๐๖๖ฦืื—Aƒฯ_|ม€2ด}LL ฏฟ:ๅห—ง\นr์ุฑ€๛ณvํZL&sๆฬแส•+ิญ[ooo‚‚‚ธt้ืฏ_็•W^แนs$&&RฉR%๖์ู“bปw๏ฆmถTจPธŸ&๗ฮๆส•หœ,฿บu ส–-Kฑbล๐๓๓ในsภ$ึหห‹=z™กcŒ‹‹#&&ฦโ!"""ู“ะง์๐แรLž<™;wr่ะ!z๖์ษุฑciำฆ ...eCCC  ,,Œ:เไไฤาฅK9pเห—/งOŸ> >œ   ยรรy๗w4hoผ๑4lุ๛“7o^พ๘โ :w๎ฬ˜1cจRฅ +V 66–ะะP2d 6ไ๘๑ใฉว๖ํ)Sฆ u๋ึe๒ไษ)ึฯš5‹š5kPฐ`AŽ=J… ่ิฉีซWg๎นฤลลฅyžFŒ›››๙Qผx๑G<ำ"""’Uไศ์ฒป-[ถ‚ซซ+w๎aบulุฐำงO[”ํนณ๙y… ˜>}:†a๐๑วณcว์์์๘๗฿Sืฎ]ปLห๒ลฒํ$หูฺ,kRปIVงPฑ*% """"bUบ/ฯดQ1ธ\ื๏gI‰ ์3[;}ผdjณฌIํf/ๅษ์ฒ-๕€ŠˆˆˆˆU)ซR*""""VฅTDDDDฌJ จˆˆˆˆX•Pฑ*% """"bUJ@EDDDฤช”€ŠˆˆˆˆU)ซ๚ฯ& M›6ฅRฅJ*ผys|}}™3gฮSŽ*u5jิเุฑcV็ภูตkํทวd2แๅๅE—.]HJJเ๗฿งTฉR”-[–~๚Y5>ษบ“ ่๚๕๋ฑณหุ๏‹_ธp'Np่ะ!}๗]‹u‰‰‰O#ผ'๊Qcผ~:C‡%00€๑ใวNDDWฏ^eลŠ4kึŒcวŽq่ะ!v๏อึญ[-๊IMถO@งM›†ทท7พพพ 4ˆ๘๘xพ๘โ  กํ฿|๓MNž<‰ษd"""๚๕๋‡ษdโื_eุฐaxyyแใใร๒ๅหุฒe ตkืฆ^ฝzxxxส๐แร๑๑๑กnบ$$$คนฟeห–a2™๐๕๕ฅC‡ๆๅ3fฬภฯฯrๅสq๖์Y–,YBลŠ1™L4lุ›7oะถm[บvํŠฟฟ?ใวg๘๑”.]___>๐ร๛ŒŽŽfาคI๘๚๚2|skึฌภลลธŸฬฦลลaccภoผ 9rไภวว‡s็ฮ0z๔h*WฎฬฌYณธ{๗n†ฮs\\111ษžฒuz๘๐a&Ožฬฮ;9t่={๖d์ุฑดiำฦœT% %44€ฐฐ0s๒ทpแBผฝฝ วยรรฑททgูฒe์฿ฟŸตkื๒ม˜“ภร‡3gฮ๖ํว๗?<==9|๘0NNNlธ1ีx/]บD๏ฝYฝz5‡bิจQๆuฮฮฮ์฿ฟŸ–-[šใฌ^ฝ:{๖์!<<œส•+๓w฿™ห฿ธqƒฝ{๗างO†ฮมƒ9t่C† 1—I>N.^ผศาฅK้นsชฑฝ๛๎ป*Tggg๊ืฏoฑ๎ๆอ›ฌZตŠชUซ๐ล_0u๊T๖๏฿ทท7ฝ{๗ๆ๘๑ใ้ถีˆ#pss3?Š/žnyษบฒuบeหBBBpuuเฮ;ฌ[ทŽ6mฺค(นsgs๒UกBฆOŸžfฝอš5`ืฎ]4mฺ .L๙๒ๅ9z๔(ไอ›—๙๓ใๆๆFƒ ๐๒๒โฬ™3ฉึปgฯjีชEแย…ศ—/Ÿy]pp0ๅส•#** €3gฮPซV-ผฝฝ™2e ‘‘‘ๆ๒M›65๗T๚๙๙ัฒeKๆอ›‡ƒƒcฦŒกz๕๊TฉR…ศศH† †‡‡Gšว>ž‹/r๐เAส–-๛ุ๕UชT‰ 6pแย๛๏tหวฤฤPธpa’’’˜={vชe’’’๘๋ฏฟจUซcฦŒแฤ‰,Xp๔่QBBB=z4^^^ฌ[ทฮb{ร0๘ใ?ฬuญXฑ‚าฅK๐ใ?ฒeหฆM›fฑอ?HฉRฅ˜3gฝ{๗6PR)"""92;€งษหห‹๎ปˆ7f๐เมฉ–MWูนsgยยย M๗2<ภซฏพJ๚๕)WฎถถถL˜0gg็วŽท@Œ7ฮKYฑbEฆNšf๙ฯ>๛Œบu๋โ๎๎Nๅส•นqใFŠ2‰‰‰ดhั‚ุุX ร`่ะก๋mmmฉWฏ๕๊ีใฏฟโาฅK๋ ร u๋ึฤฤฤ`UซV5U๘๐รqssฃbลŠ๔๎›ึญ[ใแแม๎ปqww์s!"""ู—aFf!๒ ˜˜X๖'.ny3;ษ คฤฎษsฅ+ck—ญ›mจอฒ&ต›uผ”็‰ึฯชUซจWฏ9sๆ|ขu?+’ฟฟฃฃฃำฝ๒™ญ/ม‹ˆˆˆศณGmส$7ๆิฉSห–,Y’๎่""""ูะLฒx๑โฬADDD$S่ผˆˆˆˆX•Pฑ*% """"bUJ@EDDDฤช”€ŠˆˆˆˆU้.xyฆ๙yธโ๎ž'ณร Šgี1x๕ทl;ษrvฃ6หšิn’ีฉTDDDDฌJ จˆˆˆˆX•.มห3ํr็Rณน—ูaH%ๆp„ทงqฉMQ์๎fv8’jณฌษšํV๘็˜งZฟ7ฉTDDDDฌJ จˆˆˆˆX•Pฑ*% """"bUJ@EDDDฤช”€ŠˆˆˆˆU)ซR*""""VฅTDDDDฌJ จˆˆˆˆXีI@›6mJฅJ•2Tถy๓ๆ๘๚๚2gฮœ'ฑ๋GVฃF Ž;–)๛>ž/พ๘‚dh๛ไ$ลd2‡‡๚๕รd2๑๋ฏฟ2lุ0ผผผ๐๑๑a๙๒ๅภฟฺตkSฏ^=<<< e๘๐แ๘๘๘Pทn]า฿ฒeหฬ=w:t0/Ÿ1c~~~”+WŽณgฯฐdษ*Vฌˆษdขaร†ผy€ถmาตkW?~<ใวงt้า๘๚๚๒แ‡ฆน๏cวŽQฝzu|}}ฉXฑ"qqq์฿ฟŸ*Uช๐โ‹/ฒn:ู่ณ'˜L&๓ฑวฤฤะขE |||0™L„……Y์cอš5Tฏ^่่hVฎ\IฅJ•0™Lt๎™คค$>๛์3J•*EํฺตนvํZชฑ=z”>๘€ฒeหr๚u *€ฝฝ=ฝ{ื\o‰%(UชฅJ•"&&ร0จPก๏ฝ๗{๖์I๓<(..Ž˜˜‹‡ˆˆˆdO๎=|๘0“'Of็ฮธบบ๒๗฿3v์Xฺดiƒ‹‹‹Eูไหฬ;w&,,ŒะะPฆOŸฮย… a๗๎ๆฒ„‡‡ณw๏^–-[ฦ๛๙๛๏ฟ เตื^3๏๛ท฿~#!!—^z‰oฟ–ร‡๓ึ[oฑqใF‚‚‚Rฤ{้า%z๗๎อ๖ํ)\ธ0ทyณณ3๛๗๏gฬ˜1ๆ„ถz๕๊4jิ€QฃF๑w฿ัณgOnธมฝ{ฑฑฑ!œ9s'''ขฃฃำ<_ญZตbิจQผ๖ฺkDGG“3gNเ%ํญ[ทN=จ]ป6ำงOวำำ“ฏฟš˜˜จSงC‡ฅdษ’ฬ;—„„n฿พอ€๛ษ็๐แรYพ|9๑๑๑Œ?ž-[ถเ่่HทnXดhฯ?<๋ืฏ็ศ‘#\พ|™าฅK›ใ‹‹‹cแย…L™2ร0ุ่ฑ#ฃGฦัั1ลฑ๑ว4jิˆSงN๑ใ?ฆXฟlู2ส—/ p๒๒ๅหmQถs็ฮๆ็*T`๚๔้iึฌY3vํฺEำฆMqpp pแย”/_žฃGhพค๋ๆๆFƒ ๐๒๒โฬ™3ฉึปgฯjีชEแย…ศ—/Ÿy]pp0ๅส•ใป๏พเฬ™34kึŒK—.q๛๖m๓Hธ?ฦ59น๒๓๓ฃeห–4kึฬœฐ>(&&†ุุXsํๆๆf^Wฟ~}์์์(WฎQQQภa ‘‘‘ฬœ9€ุุXฮŸ?ฯฆM›Xตj9rไ0Ÿ๛pโฤ 6nHž๚ˆุุุ4๗ัฏ_?z๗๎mq‹/žn\"""’5=๖MHแแแDFFโ้้I•*U8x๐ 9ฑ{นrๅzh{{{๓s[[[๓k[[[yŸษ—”น}=0`|๙ๅ—ๆKๆฦธrๅJบt้ยึญ[ฉSงฮูทa|๗w„‡‡ฮ™3g(QขDšu+VŒฤฤD~๛ํ7๓๖ 64o๘q>๘csโเ๓ฉSงRถlYš5kฦฐaร8w๎Ccแ…ศ—/ภ$ฑaร†Lš4‰—^zษข์ตkื?~<มมมไฮ› <๔ผธบบZ>ž‹/r๐เAส–-๛ุ๕UชT‰ 6pแย‹K๐ฉ‰‰‰กpแย$%%1{๖์Tห$%%๑ื_QซV-ฦŒร‰'R-็๊๊Š›››7o ::ฺ+Vd๊ิฉi–์ณฯจ[ท.๎๎๎Tฎ\™7nค(“˜˜H‹-ˆล0 †šf}ณfอขcวŽ|๘แ‡ไส•+้:u๊ฤŸ‰ฏฏ/III”*UŠE‹๑ูgŸัฉS'ผฝฝษ‘#‡ล9๔๔๔d๎น„„„ฐrๅJ&OžLร† ‰'gฮœL›6W_}•š5kโๅๅ…‡‡GชSeๅห—^ฝzัซWฏTcŒŒŒคw๏ฺฺุbkkห˜1cx๎น็Xฑb7nไโล‹L™2ธ?L#Ož<ดhั‚[[M3+""")ูษท.‹ษะ2lห–-„„„XuŸ็ฯŸงu๋ึ์ป“ษ„ษdขB… ๚๋ฏ์น“ *เํํM@@VQDDDฒฆ|šs็ฮe๘๐แl฿n๙ณ‰‰‰ช^kxิฏ_ฟ@‘"E˜5k^^^์฿ฟŸ๐๐pfฮœIทnศ“'K–,!""‚ฯ?œ=zp๏=n฿พBDDDฒ“l—€ž?žส•+c2™๐๑๑กOŸ>DDD`2™=z4ทnขqใฦ”)S†ฮ;?ดพYณfฑ`ม๚๔้Cทn˜9s&M›6ฅz๕๊ดjีŠ฿ชUซโใใC๓ๆอนu๋5jิ OŸ>”+WยยยจYณ&/ผ๐+WฎLs111ดhัL&aaaภฤ๐อ7฿ไๅ—_f๘๐แๆ๒ 4ภฯฯooo-Z@TT&“‰ๆอ›SฆL™็ไุฑc)๖ป{๗nฺถmK… ฬuTชT €\นraggภญ[ทฐฑฑ lูฒ+V ???ฮ;gŽีหห‹=z๙ะs GLLŒลCDDDฒงl—€๔ำOิชU‹๐๐p๖๏฿ฯฐaร๐๖๖&<<œพ}๛2y๒d<==‰ŒŒคnบ\บtษผญษd2?๏ะกaaaดnšเเ`&Ožฬไษ“8|๘0+Vฌ`๎น๔่ัƒ^ฝzq๘๐a<<<7nœนwwwฒ]บeห|||(WฎทoงM›6๘๘๘เใใร่ัฃ้ึญฟ;eห–eๅส•,Xะผmjc@fย„ Œ5 ๓O>๐รgŸ}ฦ‰'๐๖๖ฦ฿฿Ÿ'NคY6((ˆkืฎQถlYฦg‘ำƒ็คeห–๋‹)ยภ๙ํท฿RM@ทo฿Žฏฏ/&“‰ถm2{๖llmm™1cวŽcภ€˜L&อ๔๎›#GŽะซW/๒ๆอ๛˜gCDDDฒ##๙ฎ‘gHLL nnn\ข๎I™ŽdPผ=k^่A?'ำธ—ูแHจอฒฆzปู๖๐Bฯ ๘๘xVญZEฝz๕ศ™3gf‡๓T$GGGง;œ.๕€Šˆˆˆศณ-ŸUฌ]ปึโŽyธ?&sไศ‘™‘ˆˆˆˆu(อ$AAAev""""VงK๐""""bUJ@EDDDฤช”€ŠˆˆˆˆU)ซR*""""Vฅปเๅ™f๛"l๘yyvูฦวรชUุv_ƒm6d9ปQ›eMj7ษ๊ิ*""""VฅTDDDDฌJ—เๅ™–ดฆ?Iน๔6}lOส์DDไ?J= """"bUJ@EDDDฤช”€ŠˆˆˆˆU)ซR*""""VฅTDDDDฌJ จˆˆˆˆX•Pฑ*% """"bUJ@ญ่ฦLŸ>=อ๕… z์บgฮœษีซWำ-syZทnก๚–-[ฦ„ ๘๖o๑๑๑มd2Qปvm.]บ@hh(eห–ลวว‡F๓ุ๑‹ˆˆศ‡P+zX๚od$-RคณfอJทฬ๕๋ืฆGดlู’ร‡Npp0_~๙%^^^์ทร‡ใๅๅลธqใˆŽŽฦ0Œ{H"""’M)}ŠฮŸ?Oๅส•1™L๘๘๘ะงO"""0™LŒ=š[ทnัธqcส”)C็ฮ3Tghh(๘๘๘๐{๏‘””ฤโล‹ ฃqใฦTญZ€3fเๅๅ…——SงN **ŠJ•*ฅจ3!!E‹Qปvmบw๏Oh?๙ไ\\\ฬeo฿พ UชT!Wฎ\๘๙๙q๎9ถo฿ฮ+ฏผยศ‘#น|๙๒ใœ:ษฦ”€>E?๔ตjี"<<œ๛๗3lุ0ผฝฝ งo฿พLž<OOO"##ฉ[ทฎ๙า6€ษd2?๏ะกaaa4o๋่ไไฤ๒ๅหiธ1*T`๑โลl฿พฟ๚‹แร‡ณcว~๕WฦŽKTTTŠ๘ฮž=หภ)Sฆ +Vฌ`่ะกฬ™3'ีc7n๐ร๔๋ื/ล๚YณfQณfM4hภึญ[จQฃ!!!lูฒ%sGLLŒลCDDDฒ'% O‘ฟฟ?ณgฯfศ!œHณ#Fเๆๆf~/^<อฒ"""’ต)}ŠชUซฦถm(P Mš4aใฦ)ส$_ฮฮจŽ;2sๆL"""ู่ณ'qqq›SงNeวŽ4iา„Ÿ™{๗๎=tป–-[ฒpแB๓๋u๋ึ1u๊ิT{Niึฏ_?ขฃฃอณgฯ>ึq‰ˆˆศณO ่St๚๔i .L—.] แฦฤฦฦšื2|VฌXมํทZ็ญ[ทศŸ??w๏5o ๗วi&ืํ๏๏ฯฦ‰‰‰แๆอ›ฌ^ฝšŠ+Zิใ่่Hปvํุฝ{7ฃGfำฆM”.]š1cฦคุ็ษ“'อฯ—.]J้าฅˆŒŒค{๗๎,YฒWWWs™เ๏๏OŸ>}จ^ฝ:GŽaไศ‘xxxคy\ธบบZ *เๆๆ†ณณ3:t`ูฒe8;;งบ_‚‚‚R]ทkื.Zดh ไส•ห"๑3f ีซWงJ•*DFF2lุ0<<<า<ฮ9sๆpy์์์ุธqฃyนaดo฿žN:Qผxq๓๒ฒeห๒๕ื_AกB…๐๒๒โ—_~Iณ#Fเๆๆf~ณ.ษ^”€KีชUcถm(P€&MšX$gษ’/YgDŽ9 ฃQฃFฬ™3‡๖ํงZ๎Ÿ‰์ใhูฒ%๚๕ให/ฟค]ปvๆžี๔ุำธqc–,Yb^6hะ ๘่ฃ,ส&%%ฑjี*y็ๆฬ™รW_}ลoผ‘f๚๕#::ฺ8{๖์c›ˆˆˆ<”€KงOŸฆpแยt้า…nธAllฌy}`` y\ๅŠ+ธ}๛vบ๕ผy“่่h‚ƒƒ5j”น—ิลลลขฺฺูš๏N dม‚†มัฃGนs็ ด(_ฐ`A ภัฃG a๔่ัxyyฑn:‹r†a๐ว๗“ส+VPบti~๑Gถlูยดiำ,ถ๙๑ว)Uชsๆฬกw๏:tˆž={โ๊๊šfธบบZsเMAญZต"ฉ๖Vถlูooojืฎอ˜1cุถmุ3cฦŒ4ใทตตฅ^ฝzิซWฟ๚+ลฅzร0hบ5111†AีชUอใD?๐CจXฑ"ฝ{๗ฆu๋ึxxxฐ{๗nีน‘์ษฦ0 #ณƒyPLL nnn\6wWง‡o ฬึทีฏ3>>žUซVQฏ^=rๆฬ๙ฤ๋—'Om–5ฉฒฆBป%GGGง{5S—เEDDDฤช”€ŠˆˆˆˆU)ซR*""""VฅTDDDDฌJ จˆˆˆˆX•Pฑ*% """"bU๚%$yฆู–i‚ญ~QIDD$[QจˆˆˆˆX•Pฑ*% """"bU*ฯด EIrส์(,hน ณCษาิ*""""VฅTDDDDฌJ จˆˆˆˆX•Pฑ*% """"bUJ@EDDDฤช”€ŠˆˆˆˆU)ซR*""""Vฅ๔?d๋ึญ”-[–ชUซ>ด์ฒeห˜0a฿~๛->>>˜L&jืฎอฅK— ฅlูฒ๘๘๘ะจQ#bbbžj"""’=(™;w.ร‡g๛๖ํi–น~:มมม๔่ั€–-[r๘๐aยรร ๆห/ฟภหห‹}๛๖q๘๐aผผผ7nััั†๑”FDDDฒ*% ฯ ๓็ฯSนreL&>>>;vŒiำฆแํํฏฏ/ƒ `ะ A๘๛๛ใๅๅลงŸ~jรรƒAƒแ๋๋Kตjีˆ‰‰aึฌY,Xฐ€>}๚ะญ[7‹%$$ฐhั"jืฎM๗๎˜9s&Ÿ|๒ ...ๆฒทo฿ฦฦฦ€*Uช+W.8w๎ทo็•W^aไศ‘\พ|9CวGLLŒลCDDDฒ'% ฯ Ÿ~๚‰Zตjฮ๛‰‹‹c๒ไษ์น“C‡ัณgOz๖์i๎<|๘0‡2ื๑าK/q่ะ!|}}™?>ญ[ท&88˜ษ“'3y๒dฮž=หภ)Sฆ +Vฌ`่ะกฬ™3'ี˜ฦ‡‡‡?๐๚๕Kฑ~ึฌYิฌY€ ฐu๋VjิจAHH[ถlI๗˜GŒ›››๙Qผx๑G>o"""’5(}๙๛๛3{๖l† ยษ“'ูบu+!!!ธบบ/_>6nˆฟฟ?&“‰}๛๖iฎ#88€rๅส•b{๗๎ลำำ“ทoฦ๗฿OฅJ•าŒฉWฏ^DEEัฉS'&Nœhฑ๎›oพ!!!ท฿~ผฌ`ม‚|๒ษ'=z”w฿}—fอš๑มคYฟ~ˆŽŽ6?ฮž=๛๐%"""Y’ะgPตjีุถm  I“&ฉŽงผ{๗.ฝ{๗fๅส•>|˜fอšg^๏เเ€ญญ-‰‰‰)ถ๗๑๑a๊ิฉ์ุฑƒ&Mš๐๓ฯ?s๏ฝ‡ฦึฒeK.\h~ฝn:ฆNšjฯ้มƒ้ึญ}๚๔ก}๛๖๔้ำ'อzpuuตxˆˆˆH๖ค๔t๚๔i .L—.] !66–y๓ๆ™วE๗฿ฝ{[[[๒ๆอห฿อ๒ๅหiŽŽŽดkืŽปw3z๔h6mฺD้าฅ3fLŠฒ'Ož4?_บt)ฅK— 22’๎ปณdษ‹„๑ภ๘๛๛ำงOชWฏฮ‘#G9r$q6DDD$ปษ‘ูHJ[ถlaิจQุใ๎๎ฮผy๓(Tจุููัธqcฬ;๏ผร+ฏผBฑbลx์™L&BCCนy๓&{๖์Iฑ~โฤ‰lฺด‰9rPคHฆL™ภภ‰ŽŽฆQฃFภž &+W.ๆฬ™Cษ’%;&ษพl อ—#ฯ ˜˜๐›ฺ”$งฬŽฦา– 2;„gV||<ซVญข^ฝzไฬ™3ณร‘ P›eMjทฌ้ฟะnษ฿฿ััั้งำ%xฑ*% """"bUJ@EDDDฤช”€ŠˆˆˆˆU)ซR*""""VฅTDDDDฌJ จˆˆˆˆX•~ Ižik฿ ล=ณร‘'H= """"bUJ@EDDDฤชt ^žiร๖}A—ึttๅ/3;‘งJ= """"bUJ@EDDDฤช”€ŠˆˆˆˆU)ซR*""""VฅTDDDDฌJ จˆˆˆˆX•Pฑ*% """"bUJ@EDDDฤช”€7n`๚๔้™ฦ3ฅ^ฝzปwปw๏๒๊ซฏb2™๐๒๒bฺดi\ปvš5kRฆLผฝฝYฐ`A&G,"""Y…PาO@ญMๆํ7>>ž[ทnฐjี*์ํํqpp`๓ๆอ„‡‡ณgฯFŒม7ฐตตeไศ‘DFFฒqใFz๕๊ล;wธ~บีc‘ฌ#' ็ฯŸงrๅส˜L&|||ุตk—ล๋cวŽัฟ"""0™LŒ=š™3gาดiSชWฏNซVญธt้ 6คB… TญZ•'NŠฟฟ?>>>ผ๗{$%%PฃF ๚๔้Cนrๅ๐๗๗',,Œš5k๒ย /ฐrๅส4c๙€พ}๛Rบti|}}=z4@šuSTTŸ~๚)ฅK—6[๒>lllศ;7qqq$%%‘””Dผy๑๗๗ @ธปป›ฯFัดiS6lุ€ajงธธ8bbb,"""’=e๛๔งŸ~ขVญZ„‡‡ณ~6ol๑บD‰ >oooยรร้ท/‡fลŠฬ;—^ฝz1hะ ยยย;v,ฝ{๗ y๓ๆ์ทร‡ใไไฤ๒ๅหอ๛uww็เมƒTฉR…๎ปณrๅJ–,Yยฐaรา๗?`ถmŒ3†nบ1}๚t๖๏฿O๛๖ํ๙๓ฯำ๎ฺตk,\ธศศH:ฤ๛๏ฟf‰‰‰,[ถŒz๕๊๑ึ[oQดhQ8@นrๅRิ}็ฮ|}})^ผ8}๛๖%_พ|๋}šย… ำฅKBBBุฑc‡ล๋ˆˆ\\\ˆMณŽชUซšoRJJJ"""€[ทn‘?~๎ฝห๙๓Ÿhnnnไอ›—u๋ึ๗o๚ํท฿(Qขแแแ$%%ฑbล เ~ยMpp0ฃF"<<<:ผผผ๘ๆ›o8x๐ /ฟ2-Zดเตื^#**ส"Ž+Wฎpใฦ bccูฒe ฅJ• kืฎTจPvํฺYl๓ัG™วืฮž=› 6ะฌY3sฯฑˆˆˆทe๛tห–-๘๘๘Pฎ\9ถo฿އ‡‡ล๋–-[โ๎๎Ž>>>ๆ›wiโฤ‰ฌ^ฝ___ผผผฬ7๕๏฿Ÿ๒ๅห๓ฺkฏฅ:v๒฿š3gฃGฦืื“ษฤž={0`ญ[ท&00ะ|I;66–๚๕๋ใ๋๋Kร† อc=ำช#Y๎น้ะก๛๖ํใซฏพ"GหN๑ .๐ฺkฏแ๋๋K`` ]บtมวว‡#GŽ0}๚tึฌYƒษdยd2™‡)ิชU‹cวŽ1z๔h^z้ฅ'~^DDD$kณ12z›ฒˆลฤฤเๆๆฦ‡ซ{“ร%ฑ0บ๒—™ยc‹gีชUิซWœ9sfv8’jณฌIํ–5ฺ-๙๛;::WWื4หe๛Pyถทบ–žkืฎๅ๛Ÿลฒ:u๊0rไศLŠHDDDฤz”€f‚   ‚‚‚2; ‘LกK๐""""bUJ@EDDDฤช”€ŠˆˆˆˆU)ซR*""""Vฅปเๅ™6ภS3; y‚ิ*""""VฅTDDDDฌJ—เๅ™ถ๐ฯŸpบๆ๘ศต.ูแ)D#"""O‚z@EDDDฤช”€ŠˆˆˆˆU)ซR*""""VฅTDDDDฌJ จˆˆˆˆX•Pฑ*% """"bUJ@EDDDฤช”€>nธม๔้ำ3; ห–-cย„ |๛ํท๘๘๘`2™จ]ป6—.] 44”ฒeหโใใCฃFˆ‰‰ษฬEDD$‹P๚ H/MLLดj,ืฏ_ 88˜=zะฒeK>Lxx8มมม|๙ๅ—xyyฑo฿>>Œ——ใฦ ::ร0ฌทˆˆˆdJ@Ÿฒ๓็ฯSนreL&>>>์ฺตหโ๕ฑcว่฿ฟ?˜L&Fอฬ™3iฺด)ีซWงUซV\บt‰† RกBชVญส‰'€๛=๘๘๘๐{๏‘””@5่ำงๅส•ร฿฿Ÿฐฐ0jึฌษ /ผภส•+Sฤ˜ภขE‹จ]ป6ปw`ๆฬ™|๒ษ'ธธธ˜หพ}ชTฉBฎ\น๐๓๓ในsl฿พW^y…‘#Gr๙๒ๅงtfEDD$ซR๚”๔ำOิชU‹๐๐p๖๏฿ฯๆอ›-^—(Q‚แร‡ใํํMxx8}๛๖เ๐แรฌXฑ‚นs็าซW/ DXXcวŽฅw๏4o้ไไฤ๒ๅหอ๛uww็เมƒTฉR…๎ปณrๅJ–,Yยฐaรฬeฮž=หภ)Sฆ +Vฌ`่ะกฬ™3'ีใ7n๐ร๔๋ื/ล๚YณfQณfM4hภึญ[๛ษpHH[ถlI๗<ลลลc๑‘์I ่Sๆ๏๏ฯ์ูณ2d'OžคjีชฏœœRฎN:ๆžวM›6ัฎ];L&;vไย… :tˆส•+ใํํอ๒ๅห‰ŒŒ4o฿ Aผฝฝ ฤัั///ฮœ9ภฝ{๑๔๔ไ๖ํ„……๑๗฿SฉRฅ4ฃWฏ^DEEัฉS'&Nœhฑ๎›oพ!!!ท฿~ผฌ`ม‚|๒ษ'=z”w฿}—fอš๑มคYˆ#pss3?Š/ži‘,L ่SVญZ5ถmFhาค ๑๑๑ฏ7n˜๊vษ—ถlll8pเแแแๆžS€Ž;2sๆL"""ู่ณ'qqqๆm์ํํฐตตตxž<ฆิวว‡ฉSงฒcวš4iยฯ?ฬฝ{๗z<-[ถdแย…ๆื๋ึญc๊ิฉฉ๖œ}าฌท_ฟ~DGG›gฯž}h,"""’5)}สNŸ>Mแย…้าฅ !!!์ุฑรโuDD...ฤฦฦฆYGีชUอ7)%%%ภญ[ทศŸ??w๏e๙—ฃฃ#ํฺตc๗๎Œ=šM›6QบtiฦŒ“ข์ษ“'อฯ—.]J้าฅˆŒŒค{๗๎,YฒWWWs™เ๏๏OŸ>}จ^ฝ:GŽaไศ‘xxxคƒƒฎฎฎษžrdvู–-[5j๖๖๖ธปปำชU+|||ฬฏ็อ›‡ปป;>>>๘๘๘ะชU+๒็ฯoQวฤ‰้น3“'O&>>žึญ[ใํํM)_พ< ค\นrฃษd"44”›7oฒgฯž๋'NœศฆM›ศ‘#EŠaส”) 8่่h5j๏ํ0aนrๅbฮœ9”,Y๒ฑc‘์หฦะ|9๒ Љ‰มออะฝqrs|ไํ[—์๐ข’‡‰gีชUิซWœ9sfv8’jณฌIํ–5ฺ-๙๛;:::ซ™บ/""""VฅTDDDDฌJ จˆˆˆˆX•Pฑ*% """"bUJ@EDDDฤช”€ŠˆˆˆˆU)ซR*""""VฅŸโ”gZำม=ณร‘'H= """"bUJ@EDDDฤช”€ŠˆˆˆˆU)ซR*""""VฅTDDDDฌJ จˆˆˆˆX•Pฑ*% """"bUJ@EDDDฤช”€ŠˆˆˆˆU)ซR*""""VฅTDDDDฌJ จˆˆˆˆXUŽฬ@$5†aKฮœ939ษจ๘๘xn฿พMLLŒฺ-‹P›eMjทฌ้ฟะn111ภ}งE จ<“ฎ]ป€งงg&G""""*6677ท4ื+•gRพ|๙8sๆLบoเวแ๏๏ฯพ}๛žhช๗พ˜˜Š/ฮูณgquu}b๕fฅsี๊}ZmY๋ YํdตzŸ–ฌvฒZฝOKV;Yญง%ซใaฃDE2ALL nnnDGG?ตส“งvหzิfY“ฺ-kRป๕€ส3ษมมAƒแเเูกศ#Pปe=jณฌIํ–5ฉz@EDDDฤชิ*""""VฅTDDDDฌJ จˆˆˆˆX•Pฑ*% ๒ฬ™๐C๓2ต]JJ@ๅ™2|z๗๎อ Aƒ8pเพพพq๙๒ๅฬํ?๋ึญ[๘๚๚2y๒ไTื5Š &สž={ศ;7AAAฝ{ื\ๆw฿ๅ่ัฃฌ_ฟž+Vฐm6}kยฮึญ[้ึญปw๏f๚๕ฤววSปvmnบe.ำซW/–/_ฮ‚ ุบu+็ฯŸ็ญท2ฏOLLค~๚ปw]ปv๑ร?0sๆL˜‡๔ŸPฌX1FŽษ๛ ใ๕ื_งaร†=zP›e๛๖ํcส”)๘๘๘X,Wฅยy†ผ๚๊ซFทnฬฏ"EŠ#FŒศฤจ$`,^ผุ:))ษ(Tจ1z๔h๓ฒ7nฦO?d†aDFF€ฑo฿>s™ีซW666ฦนs็ฌ๛ูๅห— ภุบuซa๗(gฮœฦ‚ ฬe~๛ํ70~๕Wร0 cีชU†ญญญq๑โEs™oฟึpuu5โโโฌ{ay๓ๆ5ฆOŸฎ6หbcc—_~ูXฟ~ฝQฝzuฃgฯž†a่๏--๊•gฦฝ{๗ุฟ?ตjี2/ณตตฅVญZ๚๋ฏ™™คๅิฉS\ผxัขอจXฑขนอ~๕W๒ไษC… ฬejีช…ญญ-{๖์ฑzฬEัััไห—€๛๗oัnฅK—ๆ๙็Ÿทh7ooo ,h.DLLŒนGNžžฤฤDๆอ›วญ[ทP›eบuฃ~๚m๚{KKŽฬ@$ูีซWILLด๘(Xฐ วŽหคจ$=/^Hตอ’ื]ผx‘ Xฌฯ‘#๙๒ๅ3—‘ง'))‰?ส•+ใๅๅo{{{๒ไษcQ๖มvKญ]“ืษำA@@w๏ลูู™ล‹SฆLยรรีfฯฐy๓ๆqเภ๖ํ—bRงTD$๋ึญGŽaวŽ™Šd@ฉRฅ'::š… าฆMถnšูaI:ฮž=Kฯž=Yฟ~=ŽŽŽ™N–กK๐๒ฬx๎น็ฐณณKqgเฅK—(TจP&E%้In—๔ฺฌPกB)n"KHHเ๏ฟVป>eปwgลŠlผ™bลŠ™—*Tˆ{๗๎qใฦ ‹๒ถ[jํšผNž{{{^z้%1bพพพ|๕ืjณgุ๛น|๙2ๅห—'GŽไศ‘ƒญ[ท2aยrไศAม‚ีvฉP*ฯ {{{ุธqฃyYRR7n$ #“ดxzzRจP!‹6‹‰‰aฯž=ๆ6 เฦ์฿ฟ฿\fำฆM$%%QฑbEซว_`ปwg๑โลlฺด OOO‹๕~~~ไฬ™ำขŽ?ฮ™3g,ฺ-""ยโ?๋ืฏวีี•2eสX็@„คค$โโโิfฯฐš5kAxxธ๙QกB}๗]๓sต]*2๛.(‘š7ožแเเ`ฬœ9ำˆŒŒ4}#Ož<wŠuลฦฦ4๙ไรฦฦฦXทnajณฌไŸwม†ฺ.5J@ๅ™3qโDใ๙็Ÿ7์ํํW_}ีุฝ{wf‡๔Ÿถy๓fH๑hำฆa๗งb๚์ณฯŒ‚ Fอš5ใว[ิqํฺ5ใw1œ WWWใฝ๗3bcc3แhRk/ภ˜1c†นฬ;wŒฎ]ปy๓ๆ5rๅสe4nุธpแ‚E=QQQFบu '''ใน็ž3๚๔้cฤวว[๙h;ฺตkg”(Qยฐทท7๒็ฯoิฌYำœ|†ฺ,+y0Uฅdc†‘9}ฏ""""๒_ค1 """"bUJ@EDDDฤช”€ŠˆˆˆˆU)๙ํmLSg๐?o#Œาpต@k;pพT&ยิeยtaข๘‚ูยV ,l~P‰~c0หLถ,ัจัF2P QŒQใ`Ž๘ฒฬทฌฒฬ˜2จ/E 8-\ฯร‰}  ๎Yแ฿งsŸs฿๗uํ—+็็‘Oฑ%""""ŸbJDDDD>ล”ˆˆˆˆ|Š(๙ P"ข ฎงง‹cŠ‡Yณfแ๙๓ฃc6›ัะะ๐e4:MMM˜7oXงA4.ฑ%"cfณกกก่้้Qฮน\.„……มl6{๔{๕ีWกRฉ‰ฌฌ,tttxฬu๕๊ีQ={๗๎ลส•+กRฉึ:ื1|ŸฤชฏฏวิฉS=ฮๅๅๅแห/ฟ|้9งM›ฝ^cวŽ๔ˆuX€111จฎฎVฺGETTิ ~งNBww7์v;žูณg,_พ\\.—<}๚Tฮž=;d์šš™3gฮ |RSSๅแร‡bณู$88Xาาาฤnท‹รแษ“'หO?$""๛๖ํ‹ล"อออาึึ&oฝ๕–’SiiฉHiiฉ๔๕๕‰หๅ’ฅK—ส† ไ๑ใวbณู$**Jฎ]ปๆ๕wX๏ไษ“ฅกกADD‡466z3{๖lq8าาา"‹E๖๏฿/""‡’๘๘xนs็Žธ\.ฑZญฒaรฉซซ“ธธ8นrssฅคคDiwuuIttดTUU‰ํ–#GŽˆัh”^ +VฌฮฮNqน\ส8ตZ-7o2_ข‰Šw@‰ˆฦ€€|๐มจฌฌDee%} ๊ทdษhตZ„‡‡ฃฉฉ Ÿนrํฬ™3HMM…ฟฟ?‚‚‚๐๐แCพ}^๏€:ฮ!๗~ฎ]ป˜1c‘žžฃัฝ^ิิT\ปv p๐เAlธƒ‘‘‘(..ฦ”yโโโ——tvvขพพถmCpp0fฬ˜์์l>|xฤ฿'((6› ะ๋๕ฐX,^๛ฎ[ทzฝััั(,,Dee%€g[ ŠŠŠ`2™‚อ›7ฃชชjฤุjjj0kึ,ๅฟษฬฬ„Nงร… ”>›6m‚ZญFHHˆr.,, /‡h"`JD4Nฌ^ฝ(//๗๚๘ฤ‰p:pน\ศฬฬDFF†rํ๙Ÿ999x๗wฑjี*˜L&lถmศ๙4อoฟ๋t:ๅ8$$dP{`Lkk+ฆL™ข\3™LhmmUฺƒA9ถํx๘1^{ํ5hตZhตZ|๗wธ{๗๎ฐฟ TUUแศ‘#0 HOOด๕เyFฃัใุแp(๑ ”ุoฟ6๚่ฃ!๛ฦฤฤ`๙ุฒe \.n7._พŒ7n ใษ“'จจจภฃG•J5ไZ์น๗๎ƒรแภ๖ํ‘••๘ไ“O๐ีW_)ทรแ@mm-€gw|ล”ˆˆˆˆ|Š(๙ิภšอ@ะˆ9IENDฎB`‚c4core-bm-charconv-atox-mega_bytes_per_second-i64.png000066400000000000000000001054561477602032300327070ustar00rootroot00000000000000c4core-0.2.6/doc/img/linux-x86_64-gxx12.1-Release‰PNG  IHDR 1(Z9tEXtSoftwareMatplotlib version3.5.1, https://matplotlib.org/ุa๒ฝ pHYsaaจ?งiŠ›IDATxœ์wXื๛6๐{้ EE@ฑ]้*(bAQTฤ~‘X56L;Fลุc –Dฃม]์Šฝ€ ˆXHK์FXฅํy๐e~ฎ ˆ…ษนฎฝ.vๆฬ™g–‡33geB"""""5ั(๎ˆˆˆˆ่ฟ…(ฉ P""""R+ DDDDคV,@‰ˆˆˆHญX€‘Zฑ%""""ตbJDDDDjล”ˆˆˆˆิŠ(‘š%''C&“aฮœ9ลJพZดh[[โฃะd2†Zaะg$** 2™ QQQลส^Ÿ>}`hhXa|๗๓ีซWw(Ÿ ๔Ÿ”˜˜ˆ)Sฆ 99นธC!*งNย”)S’’Rจ๖ืฎ]รศ‘#แ๎๎===ศdฒ|~d2d2๚๕๋—็๚๑ใวKmžŒ9๒“ฦRT๘—Gฅสญ[ท0x๐`ิญ[๚๚๚055E@@€าH็๊ีซhูฒฅt*๐อB—.] ่๊๊ยาาC† Q)๊ป7๔๔๔pๅสฅ{{{ฃ\นrธw๏^กโ?>ชWฏ}}}xzz"!!AฅอีซWแ๏๏๒ๅหCOO...ุฑc‡R›ีซWC&“แไษ“5jฬฬฬPฆLt้า?V้sฯž=๐๔๔„‘‘Œแ๊๊Šu๋ึฉดKLLDห–-a``€ส•+cึฌYJ๋sฏฃ๛ใ?Šส•+รศศHMMEFFFŒsssขo฿พศศศP๊cีชUhีชฬออกซซ‹ เ็ŸV‰ลสส ;vฤพ}๛เโโ}}},[ถ,฿N›6 Xดh‘ด์๖ํธz๕jพผ้ีซW˜2e ๊ิฉ===TชT _|๑๛oฉอ‹/ŒชUซBWWu๋ึลœ9s „P๊+๗ีmถมึึบบบฐฑฑมฝ{ฅ6›7o†L&รัฃGUbYถld2™า๋ใ}^GลเมƒannŽ*Uช`ส”)๘๎ป๏ึึึา฿@Agส—/##ฃBๅ*WฎŒๆอ›ซผฎ"""`ggW่kŒำาา0bฤXYYAWWๆๆๆhำฆ .\ธเ๕๕สปw๏ฦญ[ทคใฐฒฒ๐ฏฯ 6`ย„ จ\น2 —ห๓ผ4๗ฺ็wฝ๎ื๏5พพพ(Sฆ ฬออ1rไH์ทOฅฯคค$tํฺ+V„žžชTฉ‚ภภ@คฆฆๆ{ฬ|8†Žš5kพ3๎ทEEEมีีะทo_)ž"ฝถU•"›6mbาคIb๙๒ๅbธqข\นrขz๕๊โล‹B!๛o1lุ0@Œ7Nฌ]ปVฌ]ปV}บXฒd‰่ืฏŸู่ณงิฦำำSXZZŠชUซŠแร‡‹ฅK—ŠVญZ "22Rjwไศ@8:: 777ฑpแB1lุ0!“ษD``  ํทK–,={๖DhhจR<ฎฎฎขOŸ>b๙bัขEขmถ€XผxฑRป๊ีซ‹Zตj‰rๅส‰ฑcวŠ๐๐pqไศ!„ฤ!Cคถใว2™L,_พ\ฉOOOQ˜ทฝ์์lับuk@Šล‹‹ฐฐ0ัชU+ฑm6!„ …BดjีJศd2ัฏ_?ฑx๑bัฉS'@Œ1Bฉ?ยมมATชTI๐รbม‚ขFยภภ@4h ลผy๓DXX˜x๑โ…ด.๗5$Dแ_๗ฯŸ?5jิ๚๚๚b์ุฑbม‚ขQฃFยมมAฉฯŒŒ amm-,--ลดiำฤส•+Ehhจpuuษษษ๙sAว”žž.๊ืฏ/ดตตลศ‘#ลย… …‡‡‡ ,XP`.…xwTทn]aaa!ฦ'/^,6l(d2™HHHฺๅ~–๛šz๓wŸgฅJ•ฤ”)Sฤ๙๓Eๅส•…กกก๘๗฿Eตjีฤฬ™3ลฬ™3…‰‰‰จUซ–ศษษ‘ถ๏ปทะำำตkื={๖‹/;vฤฤ‰•๖฿ฏ_?กฅฅ%๚๗๏/ยรรล˜1cD™2e”Ÿscส๋"!!A่่่๑ำO?‰๐๐p1z๔hัผysฅ๖ฝ"๗|ีชU*วccc#พ๚๊+๑๓ฯ?‹ฎ]ป b้าฅBˆืฏกŸY]บt‘~ฯqqqB!œ…ฝฝฝXทnจ\นฒ ส•+'&L˜ ”ป\ณfอๆๆๆ"55U๚EGGฟ3\<SงNฤ7฿|#ล๓๗฿บ๗ล”J•๔๔t•eงOŸฤš5kคe›6mR๙๐BˆG ัถm[ฅ?๒ล‹ โื_•–ํทOำฆM7n†††ยฯฯ๏1ๆพa้๋๋‹ปw๏Jหฯž=+ˆ‘#GJหZทn-์์์ฤซWฏคe …Bธปป‹ฺตkKหr฿pผผผ„Bก–9RhjjŠ””!„)))ยศศH4nXผ|๙R)ฎ7ทห}๓}3gขbลŠขkืฎาฒq[[[ฅ7๎ป ™L&ฺทoฏด777QฝzuฅeyฮผฝฝE5”–Uฏ^]{๗๎Uif,444ฤ๊ีซUฺ๖Cๅื_ฤผy๓Tึๅๆiถmา๏MB&“‰ฟ๚K)>ฅeqqq€Xดh‘ดฌ{๗๎ย\๚งF!๎฿ฟ/444ฤิฉSฅe๏๛บhึฌ™RŸBผปˆ,Ha ะW่่่H”ํฝ[ศd2‘œœ\่ิฤฤD้Ÿ‹ผt่ะAๅu%ฤฝ>kิจก๒:หฏ-ฬ๋~๎น€๔ฯˆBผ|๙RิซWOฉฯ‹/ bำฆMฦ>วด`ม@*ภ…"33Sธนน CCC!—ห ์7๗๏ุ่ฑcาฒG ]]],-{฿€8u๊”ด,๗Q___บuKZพlู2•ผ๗๎[฿~๛ญดLกPˆ:้5r๘q@DDD(ลดw๏^•ๅ๙ฝ_ฬŸ?ฟPฏป-@(อ !„“““pvv–ž?~X“'OV้ืุุX”+WN่๊๊Љ'Šอ›7‹   @Œ;Vฉํ๛๗…‘‘‘Xถl™B|P*„ััั*วR”x žJ}}}้็ฌฌ,<}๚ตjีBูฒeฅSv9x๐ 2331bฤฅkร๚๗๏ccc์ฝ[Zึถm[ 0SงNล_|==ฝO ฟอฯฯ•+W–ž7jิ7Fdd$เ฿ลแร‡ัญ[7คฅฅแษ“'x๒ไ ž>} ooo$%%แŸQ๊๓›oพQ:mๆแแœœบu ภ๋SOiii;vฌสM oŸn344D=ค็:::hิจnธกr,ฝz๕‚ถถถ๔ผqใฦBเซฏพRjืธqcนsูููาฒ7gฉฉฉx๒ไ <==qใฦ •ำ”ึึึ๐๖๖Vู?๐๚ฏกC‡โงŸ~ย๏ฟŽฝ{ซด‰ŠŠ*๐4Vฎ?*Tภท฿~ซฒ.7O‘‘‘ะิิฤฐaร”ึCกrํฃ———าฉ1{{{+ๅ๓๛=zคt w๓ๆอP(๘฿เร^๛๗ไืจFนrๅะฎ];ฌ_ฟภ๋kQฝz๕B๗QถlYœ={ถะ—ตไฅw๏Jฏณ‚ๆuฟw๏^Tฎ\พพพา2===๔๏฿_ฉ/ฏฏอKOOเ๘฿‰Š+ข{๗๎า2mmm 6 ฯŸ?ฯ๓Žท5hะาs333ิญ[7ฯฟํยjะ ค็7ดjี ีชUSYžืพœJ-๗ฒ•ฬฬLQ ๕ํท฿bีชU1b`bb™L†ภภภO/^”๔.]บ๔ั…ฯ›rใ=ztพฃ~oเๅ7ส๕!ษฟO_๙ต}W7Zทnz๕๊aผyจZต*ttt‰๙๓็ซฮ ลjฺด)bccฑx๑bt๋ึ ๅห—ฯทmq(L>uuuแ็็‡ญ[ทb้าฅx๘๐!Nž<‰3fHm>ไuQุัฟขเ๋๋ ]]]๔๎่ึญ{m฿ญ[7xxx`๋ึญุฟ?fฯž[ถlA๛๖ํ ีว๛ง€นs็ขOŸ>ุพ};๖๏฿aร†!,, gฮœA•*U>จฯU˜cฬ๋$าM4…ํ๓SๆSกPภyฎปเห๋๗ฎฏฏcวŽแศ‘#ุฝ{7๖๎‹7ขUซVุฟ';S๐ฑXZZ")) Jหs9r ู๏ฟฐถถ– ๕นu๏฿ฟทo็๙GIภ”J•อ›7ฃw๏˜;wฎด์ีซW*sๆ๗ๆš{j๐ฺตkJgffโๆอ›๐๒๒’–ฝx๑}๛๖Eƒ เ๎๎ŽYณfกK—.า„๏’””คฒ์๚๕๋าฎน๛ืึึVฺ๏วศ=œ Rค‡;w"##;v์Pz“|๛TZaิชU ณfอB‹-ะฎ];:t่ฝ๎ฺ~Sอš5q๖์Ydee)]Z๐ฆ๊ีซใเมƒHKKSฺO๎ณ๏sš๙M๛฿๐oฟแะกCธrๅ „า้wเำฝ.๒๛๘ิ๔๕๕แ็็‡฿ํทG… ปJ•*a๐เม>^šJ*ืวพ๎–{๖$%%E:m n„๕C( ธqC๕^ฟkึฌ‰ƒขiำฆ๕O•††Zทnึญ[cผy˜1cฦ#GŽ|ฒ๗ฺย(่u๋์์,]N๓ๆgQ๎ฅ(นล๖ํทq๋ึญgฮœ|G‹๓ขฮ๗€# Tสt์ุkืฎ…‰‰ 4h€ำงOใเมƒ055Uj็่่MMM๘ใHMM…ฎฎฎ4eHHBCCัฎ];๘๚๚โฺตkXบt)\]]ฅ›>ŒฅK—b๒ไษhุฐ!€ื๓Yถhั'NฬsภทีชU อš5ร Aƒ‘‘ ภิิ฿ฝิfษ’%hึฌ์์์ะฟิจQ>ฤ้ำงq๗๎]ฤลลฝW~Œ1|๔๋ืฎฎฎ Bนrๅ‡๔๔๔"pษKถmกฃฃƒN:aภ€x9VฌXss๓<‹ซยhาค ถo฿๘๛๛cถmา(fฏ^ฝp๔่ัwฝz๕ยš5k0jิ(œ;wx๑โ<ˆมƒฃs็ฮ่ิฉZถl‰๑ใว#99ุฟ?ถo฿Ž#F|ะ\|ภ๋‘อ/พ๘6lภ‹/0gฮ•6Ÿโu‘๛6~xB[[:u’>„–šš*อฉz๒ไIฏ †ฒeหขlูฒJ7ผอมม๏Œ้miiiจRฅ แเเCCCxิmmถEตjี๐๕ื_ใป๏พƒฆฆ&~๕W˜™™แ๖ํŸdoาำำรฝ{ัปwo4n{๖์ม๎ป1n8iดฯำำ @XXbccฅo JJJยฆM›๐ำO?ม฿฿ฟภL:วŽC‡Pฝzu†พพ>4h€7ขN:(_พ๊ ่ใ)x"""ขRู๊ณg8|mlllPฉR%5E๔ P""""R+NDODDDDjล”ˆจบs็๔๔๔คIใKƒจจ(ศd2DEE}t_-Zด€ญญํวU4iาD้ ,ˆ>,@‰ˆ๒ฑz๕jศd2ศd2œ8qBeฝUซV…L&CวŽ•ึๅn—๛(Sฆ 4h€iำฆ!===ฯ]บt 2™ ็ฮ๛ุ่งNŠฦฃiำฆฮŒ3ฐm6•ๅงNย”)SŠ์+วŒƒ%K–เมƒEา?QQ`JD๔zzzXทnส๒ฃGโ๎ปาืโฝญM›6Xปv-ึฎ]‹นs็ยษษ 'ND๏ฝ๓lฟ{๗n˜››รีี๕ฃโ}๘1~๛ํ7 8๐ฃ๚)iš7oŽ—/_ขy๓ๆลJž *@CCC‹ฌํน3Œฑt้า"้Ÿจ(p&"ขw๐๑๑มฆM›ฐpแBhi฿ๆบu๋เ์์Œ'Ožไน]:uะฃG้๙ภ‘™™‰-[ถเีซWาw‡็ŠŒŒD๛๖ํฅ๏Pฟ;ดดดŠ๔๛ะ฿ื‹/๒ž๙ยาะะPษูYzz:  กกฌYณกกก๚!RŽ€ฝC๗๎๑๔้S8p@Z–™™‰อ›7#((่ฝ๚ชXฑ"d2™R! )))8u๊:t่ -ฐaœaddcccุููแงŸ~z็>ถm†ฦระะPiy๎u๑๑๑๐๔๔„jีช…อ›7x=ขธqc่๋๋ฃnบ8x๐ J฿/^D๛๖ํall CCCดngฮœQj“{้ยัฃG1x๐`˜››ฃJ•*า๚={๖ภรรeส”‘‘:t่€ห—/ฟ๓ธ๒บ4)) ]ปvEลŠกงง‡*Uช 00ฉฉฉ๏์ฮŸ?www่๋๋รฺฺแแแ*m2220y๒dิชU บบบจZต*พ{dddHmd2^ผx฿~๛Mบ์ขOŸ>˜2e พ๛๎;€ตตตด.99Yฺ๖๗฿‡ณณ3๔๕๕Qพ|yโฮ;J1ไ๎ฮŸ?ๆอ›รภภใฦ“ึทiำทnBlllกŽ›จธฑ%"z+++ธนนa๚๕าฒ={๖ 55๙n๗๊ี+|๘pall,ฒณณ฿+ๆฟ๚K‹-RY็้้)ˆu๋ึIหฎ^ฝ* qๆฬi๙พ}๛ฑjี*i™ŸŸŸะััทด์ฝ{ยศศH4o\Z–›ทfอš)ลŸ––&ส–-+๚๗๏ฏืƒ„‰‰‰ส๒ท9rDGŽBq๑โE@lฺดฉเคไ!7s็ฮ•–eddGGGann.233…Bฌ]ปVhhhˆใว+m.ˆ“'OJหส”)#z๗๎ญฒฏูณg โๆอ›Jห“““…ฆฆฆ˜>}บา๒K—. ---ฅๅน๑†‡‡็{L:::bะ A๏} (Wฎ\ž๋ •Fm๋ึญ‹ฒeหข~๚hธฑด<๗็7nrrrฐ~๘๙๙กFRปJ•*!(('Nœ€\.WฺWกฉฉ)=?pเRRRะฝ{wid๘ษ“'ะิิDใฦqไศ‘๗:VฏG๓›Y  ZZZ0`€๔\GG ภฃGคoŽูดi๊ืฏz๕๊)ลชU+x๏˜฿ดeห( t๋ึMฉ๏Š+ขvํฺ*}๋๊๊ขo฿พ๙๖Wฎ\น|ฏG&*ixQ!˜™™มหห ๋ึญCzz:rrrเ๏๏_เ6UชT———๔ืืฆฆฆ=z4vํฺ%$ว+ ƒฦ๖ํฃrๅสhถ-บu๋†vํฺ*^‘ฯ—UฉREๅ&TญZUe๐๚45๐๚ฮ๚๔๔tิญ[Wฅฯ๚๕๋CกPเฮ;ฐฑฑ‘–[[[+ตKJJฉx{›ฑฑqA‡คยฺฺฃFยผy๓๘๚๚ขGRฑดดTน1ชN:€ไไd4iาIIIธrๅŠtสm=zฏ˜฿”””!jืฎ็zmmmฅ็•+W†ŽŽNพ !x}6X€RPP๚๗๏ }๛๖([ถ์{๗ับukภฑcวค422VVVhะ ิฮฑฑฑุทo๖์ูƒ={๖`ีชU่ีซ~๛ํท|๛755๐…ใ‘,ฬ๒ ูยะืืWzฎP(ผพ^ฒbลŠ*ํ฿พ.ถ0ๆฮ‹>}๚`๛๖ํุฟ?† †ฐฐ0œ9sF้ฦงฅP(`gg‡y๓ๆๅนํย}๛–ษdุณgOž๙๛&ฒท๓๙ถ””TจPแƒใ!R' DD…ิฅK 0gฮœมฦ?จ์์lภ๓็ฯฅeปw๏†J[t๊ิ :u‚Bกภเมƒฑlู2Lœ8ตjีสณjีชA__7o ๘๒cff\ปvMeีซWกกก๑ฮbฌfอš^ืoŽ ,;;;ุููaย„ 8u๊š6mŠ๐๐pL›6ญภํ๎ปง2=ิ๕๋ืผพ๑,7ๆธธ8ดn๚ฃ‹๙ญฯoyอš5!„€ตตต4๒๚ก๙็dffข~๚ี‘บ๐P"ขB244ฤฯ?Œ)Sฆ|๐›;w๎888>|ˆ .(~๏Zฮ\ฐททฅ้ฆญญ ฤฤฤ|P|๙ัิิDถmฑ}๛vฅปี>|ˆu๋ึกYณf๏<…๎ํํ cccฬ˜1YYY*๋?~^1ษๅrฉ ฯegg s”+;;ห–-“žgffbูฒe033“๎*๏ึญ๙็ฌXฑBe๛—/_โล‹า๓2eสไy๗}n๛๖บ/พ๘ššš UiBจผ ’{อชปป{กท!*N%"z๙}‹Q^ฎ_ฟŽ฿ภ๋Iรฯœ9ƒ฿~๛ ตjีBฯž=ผ>ฎงงง4ฅ๔๋ื๛/Zตj…*Uชเึญ[Xดh฿9สีนsgŒ?rนฝฏซ,ศดiำpเภ4kึ ƒ†–––-[†ŒŒ ฬš5๋ใ็ŸFฯž=ัฐaCยฬฬ ทo฿ฦ๎ปัดiS,^ผธะ๑>|C‡E@@๊ิฉƒ์์lฌ]ปšššฺ่ต๋;ททดดฤ?ˆไไdิฉS7nDll,–/_.]ูณgO๑ว8p Ž9‚ฆM›"''Wฏ^ล}๛๖มลลภ๋ฉ<ˆy๓ๆมาาึึึhธฑTฬŽ?ะึึFงNPณfML›6 !!!HNN†ŸŸŒŒŒp๓ๆMlบ฿|๓ F]จ\8pีชUƒ““Sก๓GTฌŠ๏|"ข’ํอi˜ R˜i˜455E•*Uฤ7฿|#>|(ต๓๗๗>>>*}nผYดmV˜›› QญZ51`ภqwฦ๐แCกฅฅ%ึฎ]ซดำำSุุุ*c2dˆาฒ .oooahh( Dห–-ลฉSง”ฺผ+oGŽยฤฤD่้้‰š5kŠ>}๚ˆ˜˜˜๋ํi˜nธ!พ๚๊+QณfMกงง'ส—//Zถl)้wYำษสส‚ŒKล›^Iฤ-ๆท่1วEฏดๆ๘]—ฯ๑&$""""R+ DDDDคV,@‰ˆˆˆHญX€‘Zฑ%""""ตbJDDDDjล”ˆˆˆˆิŠ(ฉ P""""R+ DDDDคV,@‰ˆˆˆHญX€‘Zฑ%""""ตbJDDDDjฅUฤ{มI(t ‹;ŒRIGC ฤ๐˜u ™ Yq‡S*1วE‹๙-zฬqั+Ž_˜ุJ-๛)G@‰ˆˆˆHญX€‘Zฑ%""""ตbJDDDDjล”ˆˆˆˆิŠ(ฉ P""""R+ DDDDคV,@‰ˆˆˆHญX€‘Zฑ}4iาDญ๛ผz๕*Zดh๑ษพ;v`แย…า๓ฐฐ0ิญ[๕๋ืว๊ีซ•ฺ.^ผ2™ ฏ^ฝ๚ไqQ้ร๏‚/ภ ฉฉ๙ๅไไ|ะv%มณgฯPฎ\9๘๚๚Jห๖ํ‡่่h$&&BCCOž<‘ึ=~ปw๏Fตjีคeฉฉฉ066†Lฦ๏ &"""UVฌX;;;888`๒ไษศสสยŒ30aย„Bm///ดkื^^^x9z๖์ WWWธบบโฬ™3€mถกqใฦpttD็ฮ๑๙sภ๕๋ืแโโ,_พผภ}ๅื6ฟ}ปw:t€ƒƒœq็ฮฅฒณณฑeหดmC‡ฌ^ฝcวŽ•r3fฬhjjB&“มฬฬLฺ6$$กกกJลๆ๑ใวQฟ~}ฬœ9=*T222 —ห•DDDT:ฑ%K–เไษ“ˆ‹‹ร๐แร1o<๔๎FFFJmรรรˆ‰‰Aฟ~คu็ฯŸว๊ีซqไศL›6 ]ปvEtt4ถnŠ!C†<==q๖์Yฤฦฦขiำฆ๘ๅ—_#FŒภคI“!D๑ๆื6ฟ}6 ˆ‹‹ร‰'PกBภ;w0iา$4hะปvํยิฉSกฒฟคค$DFFยีี;v” ุ3gฮ@กP QฃFJํ;v์ˆฃGZดhภภ@DEExLaaa011‘UซV-ฐ=}พX€โ๕่e`` Œ/_พฤ๛ัปwo•ถฤภ...Xนrฅดฮรร+V๐๚๔ไษ“แ่่ˆŽ;โัฃGศฮฮฦํทแๅๅ;;;,[ถ ‰‰‰€ุุX้ดw๗๎ Œ7ฟถ๙ํ๓๔้ำาฑ่๋๋C__็ฮƒตต5าำำƒ_5฿k]srr““ƒ่่ha๘๐แP( มŒ3๒ฦยยcวŽลๅห—๑ๅ—_" ฿~๛mพว‚ิิT้๑๖(-•ผ4ฑฑฑHLL„ตต5ฒณณ๑๘๑c๘๚๚bวŽng`` ,„ภž={`iiฉิfุฐa E‹-ฐy๓f์ฺต ”Naฟฺ๋ษฺๆทฯผุc๙๒ๅXพ|9บvํŠ๛รฯฯ:::*m---แ็็่าฅ &Nœˆดด4$$$HE๋ปwQทn]\นrEสรล‹ฑbล ะชU+lุฐAบ๎ะออ ๗๏฿Grr2Nœ8''งwŸo๓๒๒ย’%Kค็qqqน\ŽJ•*AกP`ํฺตาzฉธqc}็ื6ฟ}6mฺฟ๖เีซWx๙๒%๔๔๔๐ีW_แฬ™3˜={6>Œz๕๊a๎น*๛{๓”zTT๊ีซ<~ษษษHNNF•*Upํฺ5เย… puuEpp0<==‘€™3gยสสชะ๙#""ขา‹([[[ :๎๎๎pppPš~่m]๚ฆI“&แฝ{ฐททGƒ คS๕'ND๛๖ํัธqcX[[Kํ,X€)Sฆภมมแื€ๆื6ฟ}๔ำO๘ใ?`oofอšแ้ำงJ9::"<<๑๑๑pttTู_q๊ิ)ุููa๚๔้˜?~๑ ""‡ฦ๗ฟGX‚!2œ2ซ(0วE‹๙-zฬqั+Ž_˜ุชศ๚ฮฮ’1?%""""ตbZ‚ญZต ŽŽŽJ‚. """๚๐.๘ฌo฿พ่ทoq‡ADDD๔Iq”ˆˆˆˆิŠ(ฉ P""""R+ DDDDคV,@‰ˆˆˆHญ8=•Hนู>y๒ฆฆฆลNฉ”••…ศศH๘๘๘@[[ปธร)•˜ใขล=ๆธ่•ถs"z""""*‘X€‘Zq"z*ัฦ๏M‚–มฃโฃTาDZiฃw]C4‹;œR‰9.Zฬoั+9^ฅ~q‡@เ(ฉ P""""R+ DDDDคV,@‰ˆˆˆHญX€‘Zฑ%""""ตbJDDDDjล”ˆˆˆˆิŠ(ฉ ะภ฿฿Mš4๙เํ“““ฑy๓ๆwถ›4iN:Uจ>}||™™ ๘๋ฏฟะผysุุุภษษIฉ]zz:ชWฏŽฑcวพเDDD๔Ÿฤด˜8pšš๗๕f…-@งN ww๗|ืgeeแล‹€ศศH่่่๚๖ํ‹9sๆเ๒ๅหุทoŸา6ำงOW)žŸ={๖พ‡@DDD!,@ีhลŠฐณณƒƒƒ&OžŒฌฌ,ฬ˜1&L(ิ๖rนญZตBร† แไไ„'Nฦ}๛๖มััx๘1ฺทo;;;x{{ใแร‡€>}๚`๏ฝ*&''cธqจWฏฎ_ฟฐฒฒยซWฏCCC4jิ`nn.m—””„ซWฏข}๛๖J๙๙๙ม฿฿„โEDDDฅ P5‰ว’%Kp๒ไIฤลลa๘๐แ˜7oz๗๎ ###ฅถแแแฤฤฤ _ฟ~}}}l฿พ.\ภฮ; เ๕(คทท7bcc๑ๅ—_b๒ไษhำฆ .]บ„ฮ;c๘๑*๑ไไไ`วŽ๐๑๑ม_|ส•+ใย… *งุ“’’ ฏฏ: aร†Xผxฑดn๔่ั S้;**  ภฒeห`kk‹9sๆเษ“'ๆ'##rน\้ADDDฅ“Vq๐_…ภภ@^พ|‰๛๗ใเมƒธu๋–RJ?ปธธ`ๅส•!พ{œ8qššš๘๋ฏฟ๒ืฉSง0eส@=ฐhั"•6~~~ธ|๙2ึฌYƒfอšๅwNNNœ8ธธ8มำำHNNF:uPงN•๋Je2ฺดiƒ6mฺเ๑ใว9r$ชTฉ‚7nภาา2ฯ„……!444฿8ˆˆˆจ๔`ZLbcc‘˜˜kkkdggใ๑ใว๐๕๕ลŽ;๒&""™™™ˆ…ฆฆ& ?xaaaXบt)พ๚๊+t้า๚๕CํฺตUฺYZZขQฃFจTฉภหห ๑๑๑HLLฤ† ฐiำ&<YYY066ฦธqใฯŸ?วฦฑrๅJ”)Skืฎ………Eพ๑„„„`ิจQาsน\ŽชUซ~๐๑QษลS๐jาชU+lุฐA:ต์ๆๆ†๛๗๏#99'Nœ€““Sล'๐บ(377‡ฆฆ&6o,0ddd„ดด4ฉปป;6nXทn]ž#œถถถXบt).^ผˆฺตk#((-[ถDrrฒRปFแฝ{หๅศฮฮฦษ“'Qทn]„……แฮ;HNNฦœ9s0hะ ฉ๘=z4์ํํq๕๊Uฌ]ปD@@@7[้๊๊ยุุX้ADDDฅ P5ฑตตละกCแ๎๎,\ธ0฿ถ๙]„ร‡รวŽ“Fํํํ๑๒ๅK้&ค)Sฆ 22๖๖๖ุฒe ฆM›–๏พส”)ƒ~๚!::sๆฬ––๒ ธ––BCCแ๎๎GGGดiำFบ!)?^^^ธz๕*fฯžZตj*?DDD๔฿!ผM™J น\ ๘4ด LŠ;œRI9hฅ๑7+j"7ๅ9.Zฬoั+9^ฅ~q‡ $++ ‘‘‘๐๑๑ถถvq‡๓ัr?ฟSSS <›ษP""""R+ DDDDคV,@‰ˆˆˆHญX€‘Zฑ%""""ตbJDDDDjล”ˆˆˆˆิŠ(ฉฟ žJด้ํjริิดธร(•^O~7ๆtฌ[*&?.‰˜ใขล=ๆ˜Š G@‰ˆˆˆHญX€‘Zฑ%""""ตโ5 TขmŒ๛๚F/Š;ŒาI‘ƒ๒~ฟpะะ,๎hJ'ๆธh1ฟE๏?ใพฎีŠ;„$Ž€‘Zฑ%""""ตbJDDDDjล”ˆˆˆˆิŠ(ฉ P""""R+ DDDDคV,@‰ˆˆˆHญX€‘Zฑ-FhาคษoŸœœŒอ›7ยˆฯฝ{๗ะซW/้๙ž={`kk  8Pฉm\\ดดดฐw๏"‰…ˆˆˆJ~g19pเ45?๎kอr PO๐์ู3”+W–––Xณf เ้ำง;v,Ž9333Y\DDDTzpT VฌX;;;888`๒ไษศสสยŒ30aย„Bm/—หัชU+4lุNNN8qโ`๘๑ุทoวฃ}๛๖ฐณณƒทท7>|ˆgฯžก~๚๘็Ÿ““ƒ&Mšเ์ูณ*๛8sๆ ๚๔้ฏ‹ัู๕๋ื#((fffsssiปตkืขUซVฐฐฐ–={๖ ถถถ6l uŒหๅJ"""*X€ฑ๘๘x,Yฒ'OžD\\†Žy๓ๆกw๏022RjŽ๐๐p@LL ๚๕๋ะืืว๖ํqแย์นมมม€้ำงรฑฑฑ๘๒ห/1y๒dดiำ—.]B็ฮ1~x”+W3fฬภภ1w๎\4kึ 7คฅฅ!<<ฮฮฮ E็ฮqํฺ5•cHJJยปwัฌY3ธปปใ่ัฃ€ิิTฌ\นร‡Wjoaaห—/รลล €งง'ึญ[‡ŒŒŒ|๓้Qตjีฬ8•t<_ฤขขขcccภห—/ฑ~}š็๖–––h฿พ=tuuQปvm˜››ใ๛8<† +++lผฝ{๗ฦแร‡ฅํ๙็๐ร€ญญ-–/_žoŒบบบ066VzQ้ฤดˆตjี 6lฎitssร๛๗‘œœŒ'Nภษษ ;v์(ฐน\ssshjjb๓ๆอRidd„ดด4ฉปป;6nXทnš5kเ๕้moooL˜0ร† “ฺทkื[ทnลž={ —หแๆๆ†   •w์ุว‡<ภƒPฑbE;v ษษษHNN†ฟฟ?~๛ํ7ดjี ฉฉฉ๐๕๕…ทท7 q๊ิ)ฌYณnnn—L"""*X€1[[[ :๎๎๎pppภย… ๓m›฿5 AAA8|๘0์ํํq์ุ1้†{{{ผ|๙Rบ iส”)ˆŒŒ„ฝฝ=ถlู‚iำฆแ๒ๅห๘๓ฯ?1iา$๔๊ี ฯž=รฎ]ป”๖kii‰I“&แส•+y ๖๖๖hุฐ!lllะถm[,^ผ8ฯำ๎o5j0rไH”+W๎ฝrFDDDฅ›L!Š;ขทษๅr˜˜˜`ษก8่•-๎pJ'Eส?ˆวฟํ›Œ๒ม-ๆท่rืตZฑ๎?++ ‘‘‘๐๑๑y็เฮ็ ๗๓;55ตภห้8JDDDDjล”ˆˆˆˆิŠ(ฉ P""""R+ DDDDคV,@‰ˆˆˆHญX€‘Zฑ%""""ตา*๎ˆ ๒?‡ส055-๎0Jฅื“วฃGร*ฅb๒ใ’ˆ9.ZฬoัcŽฉจp”ˆˆˆˆิŠ(ฉOมS‰v>Yฃgฅ๓๛‡‹›"'p๎F*44๙VP˜ใขลฝาœcทZe‹;„4Ž€‘Zฑ%""""ตbJDDDDjล”ˆˆˆˆิŠ(ฉ P""""R+ DDDDคV,@‰ˆˆˆHญX€‘Zฑ%""""ต๚ฯ hาคIกฺv๋ึ ˆˆˆ(โจ๒ึขE \ฝzUญ๛œ4iN:x๙๒%z๔่z๕๊ก~๚HHHPj๛>น$"""*]_์ZH€ฆfแพ_๛ธ~:โโโTึๅไไบŸโ๒พ1>{๖ ๅส•ริฉSฅeSงNEร† ๑๛๏ฟใีซWศสส’ึๅ•ห>ˆˆˆˆ๒R๊G@WฌX;;;888`๒ไษศสสยŒ30aย„Bm฿ฉS'$%%มัั—.]‚••BBBเ่่ˆำงOcฺดiฐตต…ฝฝ=v๎ ˆŠŠBถmแใใ+++„‡‡c๚๔้ฐททG๛๖ํ‘๏v์ุGGG888 _ฟ~า๒UซVมููNNNธs็`ถmhธ1ันsg<ะงO <ฎฎฎXฐ`,X€z๕๊มมม#FŒPูgjj*/^ lธQ๊c๏ฝ€7โoฟ่้้มศศ๒อๅ์ูณัดiSฌYณฏ^ฝ*Tž322 —ห•DDDT:•๊4>>K–,มษ“'‡แร‡cผy่ปทTDๅ Gxx8 &&F*6o ;;;ฤฦฦยฮฮ`ee…ุุX่่่`วŽ8<๖ํ‡oฟV*ใใใ่่hŒ3ึึึˆ‡พพ>:”gผ>ฤจQฃฐgฯฤลลaึฌYา:CCCœ?=z๔โ๔๔๔ฤูณg‹ฆM›โ—_~‘ฺงคคเนsฦ๔้ำq๑โEฤลล!44Tj“{œฎฎฎx๐เถo฿ށ*ล๔์ู3่่่เoฟ…““ŒŒŒ ศ7—3fฬภ๒ๅหqyุููaิจQธvํZฟซฐฐ0˜˜˜HชUซุžˆˆˆ>_ฅบŠŠB`` Œผพ–q่ปทJJล—‹‹ Vฎ\™oฟ€SงNม฿฿บบบจTฉ6lˆห—/Qฎ\9˜™™มฤฤ;vฺฺุโ๖ํy๖{๖์YxyyกRฅJ€๒ๅหK๋|}}NNNHNNพ}^^^ฐณณรฒeห˜˜(ต๗๗๗‡L&8;;ฃGุฐatuus็ฮ…งง'š5k†ฤฤDL›6 VVV*1ๅไไเฺตk๐๗๗ว… ““ƒeห–แŸษ7—`ccƒŸ~๚ —.]BลŠakk‹?3฿œ†„„ 55UzไŽ๒Q้Sช ะทลฦฦ"11ึึึhึฌ.^ผ(v๏รภภเmtttคŸ544ค็ศษษy๏}ๆŽon?lุ0L˜0—.]ย?(Lพใ๎ป1hะ =zํฺต๔่ั!!!๘๑ว๑ีW_แ๘๑ใy๎ืิิๅห—‡——d2๗ฮ\* DFFข{๗๎ˆˆˆภœ9sะฆM›ฯุุX้ADDDฅSฉ.@[ตj… 6Hืบนนแ๛HNNฦ‰'เไไ„;v|p๎๎๎ุบu+ฒฒฒ๐เม\ผx666_“&Mp๐เAฟ๐๏ฟุ^.—ฃRฅJP(Xปvmžm ๎ฝ ///ฬ;ืฏ_XXX`ย„ ธ|๙21{๖lฺฺุbJหd2xzzโ๙๓^*ืซW:tศ7—ฟ;๊ึญ‹ˆˆŒ5JบE%ฅ.x[[[ :๎๎๎ะิิD—.]0eส”<ๆ^W9pเ@ฤฤฤ <<ผภำ๐ะจQ#t่ะNNNะะะภย… ahh๘ม๑š››c๙า(eใฦฑ|๙๒|Oœ8ํท‡ฉฉ)š6mŠ””•6999 BZZ„JwทฏGT}||เใใƒปw๏โแร‡*}ฬš5 ={๖ฤ‹/Pทn]Lž<นภใฐฒฒย™3g`jjZˆฃ&""ข™BwDo“หๅ011มพ˜02แ”NEA‘“'WOขBฝฆะะ,ี‹ๆธh1ฟEฏ4็ุญVูโภ๋e"##แใใmmํโ็ฃๅ~~งฆฆxๆณTŸ‚'"""ข’งt;๓้าฅ nผฉดlถmy‰NDDDTšฐ-&[ทn-๎ˆˆˆˆŠOม‘Zฑ%""""ตbJDDDDjล”ˆˆˆˆิŠ(ฉ๏‚งอูสฆฆe‹;ŒR)++ ‘WF5LJลไว%s\ด˜฿ขวSQแ(ฉ P""""R+ž‚งํัภบศ”ewฅRŽ–๐ฟxุป24ณ_w8ฅs\ด˜฿ื*!/๎ˆG@‰ˆˆˆHญX€‘Zฑ%""""ตbJDDDDjล”ˆˆˆˆิŠ(ฉ P""""R+ DDDDคV,@‰ˆˆˆHญX€‘Z}’ิ฿฿Mš4)TnบมมมŸbื๏ญE‹ธz๕jฑ์{ส”)จ>ขขข๘A"**ชPmฝผผคŸฃฃฃแโโt๊ิIฉ๛๗allัวEDDD]๐€ฆฆfกฺฟืฏ_G\\œสบœœœB๗S\>‡?Fzz:ดดด ฃฃƒƒฒฒฒะฟlผตjียฃG”ถ;v,ฺดiฃด์ูณg(Wฎœฺโ&""ขฯห{€ฎXฑvvvpppภไษ“‘••…3f`ย„ …ฺพSงNHJJ‚ฃฃ#.]บ+++„„„ภัังOŸฦดiำ`kk {{{์นภ๋ฟถmยววVVVว๔้ำaoo๖ํ#;;;฿ํุฑŽŽŽppp@ฟ~คๅซVญ‚ณณ3œœœp็ฮภถmะธqc8::ขs็ฮx9 OŸ>ธนนกVญZsssiปcวŽมุุvvvJนธธ o฿พ8{๖lพ๙y[FFไrนาƒˆˆˆJงB ๑๑๑Xฒd Nž<‰ธธ8 >๓ๆอC๏ฝaddคิ6<<\:%#›7o†bccฅขลสส ฑฑฑะััมŽ;py์ท฿~๛ญTฦวว#""ััั3f ฌญญ}}}:t(ฯx>|ˆQฃFaฯž=ˆ‹‹รฌYณคu†††8}Š+WฎภBt๎ห—/Wjท`มฉp ๔๓๒ๅห๑๓ฯ?# _~๙%๚๖ํ‹ส•+ซ์หาา-[ถ”Š_ggg\ปv ็ฮร‰'0{๖lคคค@SS่ีซเ้ำงXปv-VญZ…5j`ำฆM๏ฬKnnˆˆˆจt+๔)๘VญZaร† าตynnnธ>’““qโฤ 899ฝw๑๙&wwwlบYYYx๐เ.^ผ›๎ฏI“&8x๐ ๎฿ฟ๘๗฿ l/—หQฉR%( ฌ]ป6ฯ6 …w๏…——ๆฮ‹๋ืฏ็ูฮุุ&&&8rไ 55Uบ&3/^^^๘๙็Ÿฅ6ฑฑฑา๒KฒณณฅDssslถ ฿|๓ ._พŒ&MšเะกCธ{๗.€ืล฿ปw•rz๏=?~\ฺง››ึฌYƒ“'OขL™2๐๖๖†ฏฏ/RSS•bkถ-.\ธ€ฬฬLผx๑qqqจYณ&"""p๋ึ-$''cฤˆ˜>}บT|มออ rน{๖์มึญ[ัฎ]ป๓ODDD…ตตตละกCแ๎๎MMMt้าSฆLษณmnั4pเ@ฤฤฤ <<ผภำ๐ะจQ#t่ะNNNะะะภย… ahhX๘#y‹นน9ๆฯŸ/>7V!|ำฤ‰ัพ}{˜ššขiำฆHIIQi“““ƒ   คฅฅAฉSงๆ฿š5kะฟŒ1Ž”07n€ƒƒ ๊ึญ‹-[ถ`โฤ‰0`์์์ ฅฅฅ”Ckkkฌ[ทุฝ{7–,Y‚ฮ;#++ ฺฺฺXฑb5j„ึญ[รึึVVVyN•Uพ|yŒ9#GŽฬ3ฦ * o฿พptt„††‚ƒƒaii™๏ฑฏ ะ฿œf–ˆˆˆTษ„ขธƒ z›\.‡‰‰ MQV–Yแ”J9Zz8ฟpุšูฏŠ;œR‰9.Zฬ๏k•(บYCฒฒฒ ้fZ๚ดJ[Žs?ฟSSSฅห๗๒ย!*""""Rซžˆพ$่าฅ nผฉดlถmฐฒฒ*๒}OŸ>]ๅ› &ภ฿฿ฟศ๗MDDD๔9*่ึญ[‹m฿ใวว๘๑ใ‹mDDDDŸž‚'""""ตbJDDDDjล”ˆˆˆˆิŠ(ฉ P""""RซRq<•^ๆแื`jjZa”JYYY@d$,~๛งTL~\1วE‹๙%๚|q”ˆˆˆˆิŠ(ฉOมS‰ฆXบŠโฃTRศt€ร X ‘Yแ”JฬqัRG~5F/’~‰๋8JDDDDjล”ˆˆˆˆิŠ(ฉ P""""R+ DDDDคV,@‰ˆˆˆHญX€‘Zฑ%""""ตbJDDDDjล”ˆˆˆˆิชิ )))Xนreพ๋+Vฌ๘ฮ>Ž= xxx|สะ -** j็ฝ{๗ะซW/้๙ž={`kk  8Pฉm\\ดดดฐw๏^ตฦHDDDŸง|Z๋ึญร๔้ำqธ๒w็ไไ|Tฟ๊๐พ1>{๖ `ii‰5kึž>}Šฑcวโศ‘#ธ|๙2ฆN*ตB $$mฺด‘–eff"==DODDDฅQฉ+@๏ป‡ฆM›ยัั๖๖๖ฦฅK—เ่่ˆูณgใล‹่าฅ 4h 2’——5kึ`ำฆMฦ!Cฐz๕j๘๛๛รำำ={๖ฤ_ุฃ[ทnx๑โ E‹†““\]]ƒึญ[ฃFุฝ{wพ๛“หๅ ‚ฝฝ=เuaุฉS'ิฎ]ำงO—ฺw์ุฮฮฮฐณณร–-[ษษษpttDทnะ A•œ\ฝzUeฟgฮœAŸ>}เโโ"๕ัคIภ๚๕๋333€นนนดฺตkัชU+XXXHหž={[[[ 6 ‰‰‰๏ฬ1ddd@.—+=ˆˆˆจt*u่๚๕๋แๅๅ…ุุXœ?ำฆMƒbcc๑w฿aษ’%ฐถถFbb"ฺทo‡J:::J?๗๋ื111่ีซ|}}ฑdษ,Yฒ]ปvaบu6lFމ๘๘xXYYa๙Rฆฆฆธx๑"š5k†กC‡b๗๎ุถmฆM›–oSงNE:u˜˜ิฉSp๑โEฌ^ฝqqq— 5kึเ๙๓8y๒$&Nœ!เ๒ๅห˜5WWW๔้ำ€า๚SงNaธq€ฮ;+ญ•~.่ด}ปvํ`dd$m๓ล_z๔่1cฦHํ:v์ฐณณƒL&ƒžžlmmq๛๖ํ|๛>|๘0"##ZZZ0664mฺฆฆฆkkkปwตkืฦ๙๓ฑcวฏG-lll๒ฬIƒ ผ>อ๎ๆๆ†-[ถHEi^rrrpๅส:tทo฿Fถm‘””„)Sฆ`ฬ˜1ะึึVูF__ฝz๕Bฏ^ฝ€^ฝz!,, —.]สs!!!5j”๔\.—ณ%""*ฅJh๓ๆอq์ุ1˜››ฃkืฎ8t่J™L๖Q๛xปจอŽŽ@CCC้็นvTWWW๚9ท#GŽเนs8w๎โโโ`mm-2พc~9ูดiส”)___,XฐOŸ>อs฿–––h฿พ=tuuQปvm˜››ใ๛8<† +++lผฝ{๗ฦแร‡ฅํ๙็๐ร€ญญ-–/_^เ๑+=ˆˆˆจt*u่ญ[ทPฉR% 4HIIAZZšด7n์ฺต๋ฃo–qttฤฮ;ผพYฉYณfีŸ——ยรรูููJฑฟM.—ฃ|๙๒ะีีลนs็pๅส•<ฝ“Qศvํฺa๋ึญุณgไr9คฒ}วŽq๘q!๐เม} ฬŸ?yถ{;'=z๔PZoii‰I“&แส•+y ๖๖๖hุฐ!lllะถm[,^ผ8ฯำ๎o5j0rไH”+WฎGNDDD2‘{ื Q "—หabb‚G3šรTWQแ”JY2์ญ1 ํn,„ถศ,๎pJ%ๆธhฉ#ฟฃŽฟปQ)–••…ศศH๘๘๘ผsเ>Liหq๎็wjjj—ำ•บP""""*ูJ]๐Ÿ‹}๛๖)1ผพ&sๆฬ™ล‘zฐ-&๐๖๖.๎0ˆˆˆˆิŽงเ‰ˆˆˆHญX€‘Zฑ%""""ตbJDDDDjล”ˆˆˆˆิŠwมS‰ฆ๑อh˜šwฅ’FV ก{กQ &?.‰˜ใขล}พ8JDDDDjล”ˆˆˆˆิŠงเฉDS์…_ฆ๙ั่ฒธธC ""zo%""""ตbJDDDDjล”ˆˆˆˆิŠ(ฉ P""""R+ DDDDคV,@‰ˆˆˆHญX€‘Zฑ%""""ตbชF)))Xนreพ๋+Vฌ๘ม}ฏ^ฝOž<)ฐMrr2š4iRจv์ุ… JฯรยยPทn]ิฏ_ซWฏVjปx๑bศd2ผz๕๊ฝใ&""ข~วกๅ ๚๕๛ไ}ฏ^ฝMš4A… >ชŸgฯžก\นr๐๕๕•–ํทัััHLL„†††Rก๛๘๑c์ฝีชU“–ฅฆฆยุุ2™์ฃb!""ขา‰# E่ฝ{hฺด)aooเเ`\บt ŽŽŽ˜={6^ผx.]บ Aƒ8p`ก๚ ‡ซซ+์ํํัทo_( lบ111่าฅ <<<ซVญ‚ญญ-lmmฑ|๙๒๛ฬฮฮฦ–-[ะถm[ :ภ๋‚v์ุฑ€+V`ฬ˜1ะิิ„L&ƒ™™™ดmHHBCC•Šอใวฃ~๚˜9s&=z๔^9#""ขาhZฟ~=ผผผ‹๓็ฯcฺดiฐณณCll,พ๛๎;,YฒึึึHLLD๛๖ํ๑๐แCi[GGG้็~๚!&&ะญ[7DGG#>>๚๚๚ุนs'บt้lบววปw1}๚tœ8qงOŸฦผy๓œœฌ฿;w0iา$4hะปvํยิฉSกา.)) ‘‘‘puuEวŽq็ฮภ™3g P(ะจQ#ฅ๖;vฤัฃG-Zด@`` ขขข ฬUFFไrนาƒˆˆˆJ' EศีีkืฎEhh(’’’ ฏฏฏดิฉS t๎าบุุX้็•+Wยลล‡ฆM›ยฮฮ;w๎Dbbขส~cbbะถm[”-[FFF๐๑๑มูณg•ฺœ;wึึึHOOGLL ~๕ื|ฏอษษANNขฃฃ„แร‡CกP $$3fฬศs Œ;—/_ฦ—_~‰€€|๛ํท๙ๆ*,, &&&าฃjีช๙ถ%""ขฯ ะ"ิผys;v ๆๆๆฺ่ต+:คาๆ}ฏ“์฿ฟ?Vฏ^K—.a๘๐แศศศ๘ ุ์ํํฑ|๙rœ8q]ปvลฬฬฬ>>ศฬฬ๕ื_hผ9lllเไไคิ.==ีซW—๖ADDD๔.,@?w *ฟT…BQจ๔}deeแล‹€ศศH่่่๚๖ํ‹9sๆเ๒ๅหุทoŸา6ำงOG“&M”–={๖์“ฦEDDDฅ ะp๏=4mฺŽŽŽฐททGpp0.]บGGGฬž=/^ผ@—.]ะ A 8ฐP}~๗wจWฏ0{๖llบ111่าฅ <<<4h์์์๐๕ื_ใ้ำงpttฤศ‘#กP(0t่Pฺฺุยููgฮœ)๔๑$''cธqจWฏฎ_ฟฐฒฒยซWฏCCC4jิ`nn.m—””„ซWฏข}๛๖J๙๙๙ม฿฿„ขะqัƒVq๐9Zฟ~=ผผผŠฌฌ,๕ื_๘็ŸคขoึฌYฐถถฦึญ[ฑ}๛v,[ถLฺึััฑฑฑ€~๚aเภฐถถฦๆอ›๑๗฿CCCฉฉฉ011‹‹ ยรรQฏ^=ภฃGเ็็‡Ÿฐgฯฉฏ?๘w๏ลฅK—€€€\ฝz5฿cศษษม๎ปŽเ๋ฏฟฦ… `bbขิ.)) ๚๚๚่ะก๎฿ฟฏพ๚ C‡Œ=ณgฯฦฉSง”ถ‰ŠŠยมƒฑlู2 >}๛๖EŸ>}PกB…|ใษศศ@FF†๔\.—๔+ ""ขฯ ะเ๊๊Š>}๚@CC000PZ๊ิ)Œ7ะนsgฅ๕น#้ด}vv6 ัฏ_?๘๙๙กC‡y๎ืศศyฎ;u๊‚‚‚ “ษ`gg<|๘0฿c๐๓๓รๅห—ฑfอ4kึ,฿v9998qโโโโ`ddOOOxxx 99u๊ิA:uT P™L†6mฺ M›6x๘1Fމ*Uชเฦฐดดฬs?aaa อ7"""*=x 4oวŽƒนน9บvํŠC‡ฉด‘ษd…๎OKK 111๐๓๓CDDพ๚๋<ฝ]่~Œฐฐ0ดkื_}๕ฦŒƒคคค}:๒m๓์ู3”+Wพพพาฒ}๛๖!::‰‰‰ะะะภ“'Oคu?ฦ๎ปQญZ5iYjj*Œ!“ษŠไ8ˆˆˆ่๓ฦะ่ฝ{hฺด)aooซWฏbลŠฐณณƒƒƒ&Ož ˜0|๘pDGG#>>๑๑๑ˆ‹‹“๚จUซโโโเเเ€7ขWฏ^๐๕๕ล’%Kฐdษภ;w0iา$4hะปvํยิฉSกORR"##แ๊๊ŠŽ;โฮ;€3gฮ@กP QฃFJํ;v์ˆฃGZดhภภ@DEExฬaaa011‘UซVเQษฦดruuลฺตkŠคค$=z066”/_p่ะ!ธบบยััQ:Ež+๗บ““’““U๖q๎9X[[#==111๘๕ื_ัคI“<ใษษษANNขฃฃ„แร‡CกP $$3fฬศs Œ;—/_ฦ—_~‰€€|๛ํท๙sHHRSSฅGn‘KDDDฅ ะจy๓ๆ8v์ฬออัตkW!Tฺผz๕ ฃFย๎ป€€dddH๋uuuศษษQูห—/ว‰'ะตkW๑วศฬฬฬ3KKK้บั.]บ ..iiiHHH@“&M`ee…ปw๏ขnบHOO—ถปx๑"† ‚เเ`|๕ืฮ๗˜uuuallฌ๔ ""ขา‰h t๋ึ-TชT ƒ B`` าาาฐaร้บศฏ^ฝ‚††ส•+‡;w๎|ฏ}่้้แซฏพย™3g0{๖l>|๕๊ีรนsUฺพyJ=** ๕๊ีƒ‰‰ ?~Œไไd$''ฃJ•*ธvํ pแยธบบ"88žžžHHHภฬ™3aee๕ัน!""ขฯ๏‚/ขขข0kึ,่่่ภิิ6l@ลŠแ๎๎MMMt้าSฆLA๗๎Qฟ~}TฉRnnnผ?GGG„‡‡ใ๙๓็8{๖ฌส๚๛ฃGXฝz5LLL๐๋ฏฟุŸ"""PงNމˆˆˆJ/™ศ๋.Q1“หๅ011๓r(๔ีฟ =6ฉงj–••…ศศH๘๘๘@[[ปธร)•˜ใขล=ๆธ่•ถ็~~็Nษ˜ž‚'""""ตbJDDDDjล”ˆˆˆˆิŠ(ฉ P""""R+ DDDDคV,@‰ˆˆˆHญX€‘Z๑›จD๗E8LMM‹; """๚„8JDDDDjล”ˆˆˆˆิŠงเฉD›=ZFฅ็e:ป้ลQฑใ(ฉ P""""R+ DDDDคV,@‰ˆˆˆHญX€‘Zฑ%""""ตbJDDDDjล”ˆˆˆˆิŠ(ฉ P""""R+ RRRฐrๅสโฃD๑๑๑Aff&เฏฟB๓ๆอacc'''ฅv้้้จ^ฝ:ฦŽ[aัgˆ( .@srrิM๑ํ7++ /^ผDFFBGGะทo_ฬ™3—/_ฦพ}๛”ถ™>}:š4iขด์ูณg๊ ˜ˆˆˆ>Kฅพฝw๏š6m GGGุใิฉSJฯฏ^ฝŠ๑ใวใาฅKpttฤ์ูณฑz๕j๘๛๛รำำ={๖ฤร‡ันsgธธธภรรืฏ_„‡‡รีี๖๖๖่ท/  E‹†““\]]ƒึญ[ฃFุฝ{wพฑN™2}๛๖…››พ{$%%กM›6pvvFปvํ๐๐แC€••^ฝzXฝzต4๚๘w฿ก^ฝzpppภ์ูณ ฿>”œœŒqใฦก^ฝzาฑๅ๎#!!†††hิจภ\ฺ.)) Wฏ^E๛๖ํ•๚๓๓๓ƒฟฟ?<!Dก~OหๅJ"""*J}บ~zxyy!66็ฯŸว‘#G”žWฏ^ำงO‡bcc๑w฿โใใฑkื.ฌ[ท#GŽฤไษ“ƒy๓ๆaิจQ€nบ!::๑๑๑ะืืวฮ;ฅšššโโล‹hึฌ†Šปwcถm˜6mZ๑๗฿8v์ๆฮ‹!C†`ๅส•8<พ๚k๐ร๙n๗๔้Slผ‰‰‰ˆ‹‹ร7฿|๙๖‘““ƒ;vภวว_|๑*WฎŒ .จœbOJJ‚พพ>:t่€† b๑โลาบัฃG#,,L%–จจ( 0ห–-ƒญญ-ๆฬ™ƒ'Ožxaaa011‘UซV-ฐ=}พดŠ;€ขๆ๊๊Š>}๚@CC๐๐๐Pz Aƒ<ทkืฎŒŒŒ‡FbbขดNSS‡ &@.—#%%UซVE็ฮ;vุููA&“AOOถถถธ}๛v๑๚๙๙A[[iii8y๒คิ_NNjึฌ™๏v&&&044Dฟ~เ็็‡:ุ‡ŸŸ._พŒ5kึ Yณf๙๖›““ƒ'N ..FFF๐๔๔„‡‡’““QงNิฉSงNRฺF&“กM›6hำฆ ?~Œ‘#GขJ•*ธqใ,--๓OHHˆTุ€\.gJDDTJ•๚ดy๓ๆ8v์v๎‰ฎ]ปb๑โล*ฯ๓*์ คŸe2.\ธ ๅใ๛cฯž=จ]ป6ๆฬ™ƒ็ฯŸK๋rฏŸิะะP๚๙]ืvๆ๎WกP rๅสˆUiฃฉฉ)๎ฯศศhii!&&๛๖ํCDDถlู‚Ÿ~๚)฿>ยยยฐt้R|๕ีW่าฅ ๚๕๋‡ฺตkซดณดดDฃFPฉR%€——โใใ‘˜˜ˆ 6`ำฆMx9ฒฒฒ`llŒqใฦž?Ž7bๅส•(Sฆ ึฎ] ‹|[WWบบบๆ†ˆˆˆJ‡R ึญ[จTฉ „ภภ@œ8qB้๙ฅK—`dd„ดดด|๛๐๐๐nRR(ธt้เล‹033รซWฏฐqใฦOท‰‰ ส•+‡๛๗x}ƒะ•+WีซWGll, vํฺเuม—šš ___ฬš5 ฑฑฑ๖akk‹ฅK—โโล‹จ]ป6‚‚‚ะฒeK$''+ลัจQ#ปwrนููู8y๒$๊ึญ‹ฐฐ0นsษษษ˜3g $ŸฃG–ฎฏ]ปv-<ˆ€€iไ˜ˆˆˆJ}{{{899แ๘๑ใฐฒฒRzฃG˜ššย๖๖๖าอ;oZดh๖์ฺฺูุJ7? 6Dห–-Uฎ"""0{๖l888ภััgฯžL˜0ฝz๕‚ปปปtJ;-- :t€ƒƒ:w๎,]๋™_นส”)ƒ~๚!::sๆฬ––๒ ธ––BCCแ๎๎GGGดiำFบ!)?^^^ธz๕*fฯžZตj}ชtQ)!…ฝM™Hไr9LLL0bฯ(h•ž+Ef7ฑธCdee!22>>>ะึึ.๎pJ%ๆธh1ฟE9.zฅ-วนŸ฿ฉฉฉ066ฮท]ฉ%"""ข’ฅ๔ -}F๖ํ‡1cฦ(-kืฎfฮœYLฉ ะbเํํ oo๏โƒˆˆˆจX๐<ฉ P""""R+ DDDDคV,@‰ˆˆˆHญX€‘Z๑.x*ั&ธŽƒฉฉiq‡ADDDŸG@‰ˆˆˆHญX€‘Z๑<•h›oฌ‡SฝBตํUง_GCDDDŸG@‰ˆˆˆHญX€‘Zฑ%""""ตbJDDDDjล”ˆˆˆˆิŠ(ฉ P""""R+ DDDDคV,@‰ˆˆˆHญX€–)))Xนreq‡กdวŽXธpก๔<,, u๋ึE๚๕ฑz๕jฅถ‹/†L&รซWฏิ%}Ž๘Uœ%@nฺฏŸ๊WIๆไไ@SSSmฑ<{๖ ๅส•ƒฏฏฏดl฿พ}ˆŽŽFbb"444๐ไษiใวฑ{๗nTซVMZ–šš cccศd2ตลMDDDŸŽ€ฑ{๗๎กiำฆptt„ฝฝ=N:ฅ๔๊ีซ?~<.]บGGGฬž=ซWฏ†ฟฟ?<==ัณgO<|๘;w†‹‹ <<fฮœ‰GYn‰ˆˆ่๓ฤดˆญ_ฟ^^^ˆล๙๓็qไศฅ็ีซWว๔้ำagg‡ุุX|๗w€๘๘x์ฺต ๋ึญรศ‘#1y๒dฤฤฤ`ผy5j [ทnˆŽŽF||<๔๕๕ฑs็Niฟฆฆฆธx๑"š5k†กC‡b๗๎ุถmฆM›&ตนs็&Mš„ `ืฎ]˜:u*"""TŽ!)) ‘‘‘puuEวŽq็ฮภ™3g P(ะจQ#ฅ๖;vฤัฃGผ.†U`ž222 —ห•DDDT:๑|suuEŸ>} กก€€xxx(=oะ AžตkืFFF€ร‡#11QZ—{J>..&L€\.GJJ ชVญŠฮ;x]€d2๔๔๔`kk‹ทoฮ;wwwŒ1111066ฮ๗rrr““ƒ่่hฌ[ทร‡วๆอ›‚๕๋ื็น……ฦŽ‹1cฦ`ืฎ]@`` -Z”g๛ฐฐ0„††”J"""*%8Zฤš7oŽcวŽม]ปvEVV–า๓C‡ๅน๔ณL&ร… +œ@ฑz๕j\บt ร‡GFF†ดŽŽ@CCC้็œœ€ฝฝ=–/_Ž'N kืฎ๘ใ?™™™g,–––๐๓๓t้าqqqHKKCBBš4i+++ฝ{u๋ึEzzบดล‹1dศใ๋ฏฟFpppพy Ajjช๔ศe%""ขา‡hปu๋*Uช„Aƒ!00'NœPz~้า%!---฿><<<คปไ .]บx๑โฬฬฬ๐๊ี+lธ๑ฝโาำำรW_}…3gฮ`๖์ู8|๘0๊ีซ‡นs็ชด}๓”zTT๊ีซ<~ษษษHNNF•*Upํฺ5เย… puuEpp0<==‘€™3gยสส*฿xtuuallฌ๔ ""ขา‰งเ‹XTTfอš˜ššขgฯžฐทท—žoุฐฆฆฆฐทท‡ฝฝ=z๖์ฉt“,Zดฤ’%K••…^ฝzมฮฮใวGร† aaa''งŽัััแแแx9ฮž=ซฒพ่ัฃVฏ^ ๚๋ฏ๖g``€ˆˆิฉS็ƒc"""ขาK&„ลัไr9LLL~n๔M๔ ตMฏ:ชำXQฒฒฒ hkkw8ฅs\ด˜฿ขวฝา–ใฯ๏)๓รS๐DDDDคV,@‰ˆˆˆHญX€‘Zฑ%""""ตbJDDDDjล”ˆˆˆˆิŠ(ฉ P""""R+ DDDDคV*N*ัkt‡ฉฉiq‡ADDDŸG@‰ˆˆˆHญX€‘Zฑ%""""ตbJDDDDjล”ˆˆˆˆิŠ(ฉ P""""R+ DDDDคV,@‰ˆˆˆHญX€‘Zฑ%""""ตbJDDDDjล”ˆˆˆˆิŠ(ฉ P""""R+ญโ€(/B@ZZดตต‹9šา)++ ้้้หๅฬqaŽ‹๓[๔˜ใขWฺr,—ห฿็x~X€R‰๔๔้S€ตตu1GBDDD๏+-- &&&๙ฎgJ%R๙๒ๅทo฿.๐!\]]I๛๛•หๅจZต*๎นccใOฺ๗็– ๆ๘๓์ท(๓ |^น(ช~™ใข๏ทดๅXดด4XZZธ= P*‘44^_žlbb๒ษ 555‹ไs๋7—ฑฑ1sฬถE“_เ๓หs๙๖ ”ฎfเˆ7!ัฮ!Cุo๛rมพฅฯ-ฬ๑็oQ*ฉน‰w]%JT ไr9LLLššZค#SeฬqัcŽ‹๓[๔˜ใข๗_อ1G@ฉDาีีลไษ“กซซ[ก”ZฬqัcŽ‹๓[๔˜ใข๗_อ1G@‰ˆˆˆHญ8JDDDDjล”ˆˆˆˆิŠ(ฉ P""""R+ Tโ,YฒVVVะำำCใฦq๎นโ้ณWWWม~~~ธvํšR›Wฏ^aศ!055…กก!บvํЇ*ตน}๛6:t่˜››ใป๏พCvvถ:ๅณ0sๆLศd2Œ1BZฦ~ผ๙=z๔€ฉฉ)๔๕๕agg‡˜˜iฝ“&MBฅJ• ฏฏ///$%%)๕๑๏ฟโห/ฟ„ฑฑ1ส–-‹ฏฟฯŸ?W๗ก”H999˜8q"ฌญญกฏฏš5kโ‡~P๚๎nๆ๘;v :u‚ฅฅ%d2ถmฆดSๅ3>>ะำำCีชU1kึฌข>ดข#ˆJ 6๑๋ฏฟŠห—/‹๛‹ฒeหЇwhŸoooฑjี*‘ bcc…จVญšxนิfเภขjีชโะกC"&&F4iาDธปปK๋ณณณ…ญญญ๐๒๒/^‘‘‘ขB… "$$ค8ฉฤ:w๎œฐฒฒ๖๖๖b๘๐แาrๆ๗ใ๛๏ฟขz๕๊ขOŸ>โ์ูณโฦb฿พ}โฏฟ’ฺฬœ9S˜˜˜ˆmถ‰ธธ8แ๋๋+ฌญญลห—/ฅ6ํฺตโฬ™3โ๘๑ใขVญZข{๗๎ลqH%ฮ๔้ำ…ฉฉฉุตk—ธy๓ฆุดi“044?๔“ิ†9~?‘‘‘b๘๑bห–-€ุบuซา๚O‘ฯิิTaaa!พ๒K‘ ึฏ_/๔๕๕ลฒeหิu˜Ÿ P*Q5j$† "=ฯษษ–––",,ฌฃ๚|=z๔HGB‘’’"ดตตลฆM›ค6Wฎ\ฤ้ำง…ฏ฿H544ฤƒค6?ณ066๊=€*--Mิฎ][8p@xzzJ(๓๛๑ฦŒ#š5k–๏z…B!*Vฌ(fฯž--KIIบบบb๚๕B!-ตูณgษdโŸ)บเ?:t_}๕•าฒ/พ๘B|๙ๅ—Bๆ๘cฝ]€~ช|.]บT”+WN้}bฬ˜1ขnบE|DEƒงเฉฤศฬฬฤ๙๓็แๅๅ%-ำะะ€——NŸ>]Œ‘}พRSSๅห—œ?YYYJ9ฎWฏชUซ&ๅ๘๔้ำฐณณƒ………ิฦrน—/_Vc๔%ื!CะกCฅ<ฬ๏งฐcวธธธ ๆๆๆprrยŠ+ค๕7oฤƒ”rlbb‚ฦ+ๅธlูฒpqq‘ฺxyyACCgฯžU฿ม”P๎๎๎8t่ฎ_ฟˆ‹‹ร‰'ะพ}{ฬ๑ง๖ฉ๒y๚๔i4o:::Rooo\ปv ฯž=Sำั|:ZลQฎ'Ož ''G้ƒ,,,p๕๊ีbŠ๊๓ฅP(0bฤ4mฺถถถ€@GGeห–UjkaaHm๒๚ไฎ๛ฏฐa.\ธ€่่h•uฬ๏วปqใ~๙gŒ5 ใฦCtt4† ๔๎[สQ^9|3วๆๆๆJ๋ตดดPพ|yๆภุฑc!—หQฏ^=hjj"''ำงOว—_~ ฬ๑'๖ฉ๒๙เมX[[ซ๔‘ปฎ\นrEQaJTJ 2 8qโDq‡Rjนsร‡ว งงWแ”J …...˜1cภษษ G๏ฝ‹9บาแ?@DDึญ[ฤฦฦbฤˆฐดดdŽImx žJŒ *@SSSๅŽแ‡ขbลŠลี็i่ะกุตkŽ9‚*UชHห+VฌˆฬฬLคคค(ต3ว+Vฬ๓wป๎ฟ์๙๓x๔่6l---hiiแ่ัฃXธp!ดดด`aaม~คJ•*กAƒJห๊ืฏทo๘ฟ๔>QฑbE …Bฦซแ(Jถ๔๔thh(kjjBกP`Ž?ตO•O777;v YYYR› nบŸ้wœ†‰J– 6]]]ฑz๕j‘˜˜(พ๙ๆQถlYฅ;†)ƒ &&&"**Jฟ_zคงงKm(ชUซ&>,bbb„›››pss“ึ็Nิถm[+๖๎+ฬฬฬ8MP>ผ ^ๆ๗c;wNhii‰้ำง‹คค$! ฤ๏ฟ.ต™9sฆ([ถฌุพ}ปˆ;wฮsJ'''q๖์Yqโฤ Qปvํ์Ao๋ปทจ\นฒ4 ำ–-[D… ฤ๗฿/ตaŽ฿OZZšธx๑ขธx๑ข ๆอ›'.^ผ(nบ%„๘4๙LIIขgฯž"!!AlุฐAp&ขOeัขEขZตjBGGG4jิHœ9sฆธC๚lศ๓ฑjี*ฉอห—/ลเมƒEนrๅ„่าฅ‹ธพR?ษษษข}๛๖B___TจPA‹ฌฌ,5อ็แํ”๙x;w๎ถถถBWWWิซWO,_พ\iฝBก'NBWWWดnZ\ปvMฉอำงOE๗๎…กกก066}๛๖iii๊<ŒK.—‹แร‡‹jีช ===QฃF 1~xฅ้}˜ใ๗sไศ‘<฿{{๗๎-„๘t๙Œ‹‹อš5บบบขrๅสbๆฬ™๊:ฤON&ฤ_}@DDDDTฤx (ฉ P""""R+ DDDDคV,@‰ˆˆˆHญX€‘Zฑ%"๚ํLิ๕๐'2๒ธ;~tp็]R&งŽ6ฅขฉ„Žฤ”ฎFŽiฑF๕‡ๅเtNถhน้jะ"†#ถ@iLqยคšAฦฒZฅฮั-็ฮไ๘กpฏ๏Žฯผ/ˆ~;๘ฦ๓๑ื็๙ผ฿๏ื๋}๗ฯkŸฯ๛๓!""ŸbJDDDD>ล”ˆˆˆˆ|Š(ั788‹ล‚นNลรชUซpแย…Y1›อhii๙‡2šถถ6<๛์ณsัผฤ”ˆhŽ™อf,Yฒƒƒƒส9—ห…˜อf~<๒T*ยรร‘™™‰^น.]บ4๋ขงดด้้้PฉTตŽตึึV$$$๘$Vss3qsปw๏ฦ๛๏ฟภsฎXฑzฝgฮœyุ๔ˆuX€อัััจซซSฺงOŸFddไค~_}๕`ท122‚ขข"๋HII™U์cวŽมjต>Pณแvป๑๓ลฤZญV+สหห็8ข๙‡(ั<`ตZQUUฅด?s์นำk%K– -- 6›อใD:44ซีŠฐฐ0„……aร† SฮcทัŽ5kึ(็ฬf3Ž9‚ุุX„„„เเมƒ๘๗฿ฑn:h4ผ๙ๆ›J฿๑๑qยh4"22{๖์ม฿ ๘์ณฯ””„\h4TTT งงYYYะ้tXพ|9*++ฝฎ๑ว้๕๕๕x๒ษ'•ปย'Nœ๐:๎๛๏ฟวŠ+Ž|Œ+ื>๘c<๑ฤˆˆˆภฎ]ป088ˆฑฑ1lบืฎ]ƒJฅ‚JฅBee%ชชชPTT•Jฅฌ๙ส•+ุธq#BCCฑvํZ๓ฯส~~~())มc=†คค$ภฦq๎นU|!"ข9e2™คนนY ƒtuuIWW— iii“ษไั๏ป๏พ‘พพ>IMM•ยยBๅ๚;wDฏืหุุ˜|๒ษ'’šš*.—KFGGๅ๙๓Sฦฎฏฏ—ตkืNส'11Qn฿พ-6›M‚‚‚$99Y์vป8Yบtฉ|๓อ7""RVV&‹Enธ!ทn’็ž{NษฉขขBฅขขBฦฦฦฤๅrษ‹/พ(yyy2<<,6›M"##ๅ๒ๅห^—‰๕.]บTZZZDDฤแpHkkซื1O=๕”8นy๓ฆX,)//‘/พ๘BVฏ^-ืฏ_—ห%VซU๒๒๒DDคฉฉIbbb<ๆฺตk—)ํ~‰ŠŠ’ฺฺZqปr๊ิ)1244$""$--M๚๚๚ฤๅr)ใิjต\ฝzuส|‰*%"š๑๒ห/ฃฆฆ555x้ฅ—เ๏๏?ฉ฿ึญ[กีjŠถถ6ผ๕ึ[สตs็ฮ!11‹-B`` n฿พkืฎ! ภ๋Pงำ9ๅฯ={๖ ,, +WฎD\\RRR`4กื๋‘˜˜ˆห—/Nœ8| „‡‡ใเมƒ8~ธ2OLL v๏E‹กฏฏอออ8t่‚‚‚ฐrๅJdeeแไษ“3>ฐูl€^ฏ‡ลb๑ฺ๗w^ฏGTT๖๎‹ššwท์ท&“ มมมุฟ?jkkgŒ=กพพซVญR›ŒŒ ่t:๐รJŸ‚‚จีj+็BBBะืืw฿qˆ DD๓ฤฮ;Q]]ชช*ฏ฿ฯž= งำ —ห…ŒŒ lถMนv๏ฯ์์llผ;v์€ษdยกC‡ฆœOฃัL๙๖ปNงSŽƒƒƒ'ต'ฦดททcูฒeส5“ษ„๖๖vฅm0”cปŽแแa<๚่ฃะjตะjต๘๔ำOััั1ํ๏ตตต8u๊ RRR&m=ธ—ัh๔8v8J\%๖๚๕๋ั=c์{๓๖o•๑Zญ6›อ๋z'๔๗๗Cฃัwข…€(ั<ฑn:๔๔๔ ทท๑๑๑ำ๖ Bvv6~๙ๅบu ภ”ถlูXผx1{๏=ดตตแห/ฟฤG}„ๆๆๆI๓ฌYณ๙็็ปฎดํv;ขขข”ถŸŸŸr •J…^8N8N๔๗๗ฃดดtฦ8ฯ<๓ ะูู‰ธธ8;ฟํฦว/sEGGฃฒฒR‰ํt:•/›็TนOŒ฿ฒeหค๑YYY^วtttภํv#&&fฦ5-$,@‰ˆๆ‘“'Oื#้ััQTWWCงำ!<<Wฏ^…ZญVŠญฆฆ&ดถถb||jตS>า7™Lะ๋๕ธrๅสๅ๛ส+ฏเ่ัฃธy๓&zzzPTT„W_}uสพัััHHHภเrนเvป๑๋ฏฟโท฿~›6ฦศศชซซq็ฮBฅRMน– ลลล่์์„รแภ‡~ˆฬฬLภ๋ฏฟŽ>๘@)ธฝใํ๑),N‡๋ืฏ+ํํทใโล‹จซซƒํฦะะง}ผ~ylฺด ำฎ‘hกaJD4X,–i๗7พ๐ย PฉTˆˆˆ@SS๊๊๊เ็็7้๓K‡PซีˆGnnฎื} 999๛6g#'';v์ภำO? ‹ล‚ธธ8์ทฯkชช*๕ื_Xพ|9t:}๗] องฒฒ&“ กกก๘๚๋ฏQRRโตoff&6lุ€ีซW#99ฏฝ๖€ป_ศษษมถm Vซ‘˜˜จฟฑฑฑHOO‡ัh„Vซpท`๑วกีj๑๖oCฃั กกลลละ้t0›อ(++›6๏ใวใ7˜q}D Ÿˆศ\'ADD'%%x๙็g=vpp๑๑๑๘้งŸๆว่Ÿ๑วศฮฮฦ… ฆ|ฤOดฑ%"๚8|๘0๖๎‹ภภภนN…ˆhF,@‰ˆˆˆศงธ”ˆˆˆˆ|Š(๙ P""""๒) DDDDไS,@‰ˆˆˆศงX€‘Oฑ%""""ŸbJDDDD>ล”ˆˆˆˆ|๊?ํ hœ.+IENDฎB`‚c4core-bm-charconv-atox-mega_bytes_per_second-i8.png000066400000000000000000001026261477602032300326210ustar00rootroot00000000000000c4core-0.2.6/doc/img/linux-x86_64-gxx12.1-Release‰PNG  IHDRškเ:ซ9tEXtSoftwareMatplotlib version3.5.1, https://matplotlib.org/ุa๒ฝ pHYsaaจ?งi…IDATxœ์wXื๛6๐{—Ž•HXPฉK,Xˆ *ุƒฦ–Dch0K, j4ุcปboจ{EMฐ+,‚า๖ผ๘2?WŠX–Uผ?ืต—์ฬ™3ฯ<;ป๛xฆฌL!@DDDD๔–ษต•M,4‰ˆˆˆH#Xh‘Fฐะ$""""`กIDDDDมB“ˆˆˆˆ4‚…&i M""""าšDDDDค,4‰JYrr2d2~๕Wm‡RคฦรออMa”˜L&รภตฝGbcc!“ษซํP>x={๖„‰‰‰ถรx-๙Ÿ็‹-าv(๏,š๔A:{๖,ฦ‡ไไdm‡Bค‡ยธqใššZข๖.\ภะกCแ็็CCCศdฒ"฿?2™ 2™ ฝz๕*tศ‘#ฅ6๗๏฿อ-๘?K—.ลŒ3ธŸwIY&R—™™‰qใฦ๙Ÿ'N UซVฐถถ†‰‰ <<<0sๆLไๅๅฝาzดฝ/ฑะคาูณg1~xš๔ม:t่ฦ_โB๓๐แร˜9s&าำำQซVญ—ถ744ฤ?ƒ์์์๓–-[CCรW นHฏ๓EฺจQ#}ฐn:4jิ่ฝ;Lฯw•)ืฏ_GQฃF มยย;vTน\ดh:v์hาค‰t๏๙U๛๏puu…lmm1`ภต‘Ÿ=zภะะ็ฮS[`` *Tจ€”””ล;}๚t888ภศศ8}๚t6็ฯŸG‡PฑbEขN:ุฐaƒZ›E‹A&“แเมƒ6l*Uช„rๅสกmถธw๏^>ทlู˜ššยฬฬ XบtivgฯžE“&M`llŒส•+cส”)j๓๓ฯs[นr%ฦส•+ริิ:t@ZZฒฒฒ0dศXZZยฤฤ_|๑ฒฒฒิ๚Xธp!š6m KKKภลล๑GXัชU+lถ u๊ิ‘‘‘๔a\˜‰'B.—cึฌYาด7nเ๙๓E.๓ผงOŸbธqpvv†กก!lllะฎ];\นrEj“‘‘๐๐pุรภภ5jิภฏฟ !„Z_๙็ฎ[ทnnn000€ซซ+ถn*ตYฝz5d2๖๎[ –นs็B&“ฉํฏฒ_์ป๛๗‡ฅฅ%์์์0n8|๗w'''้=PลŠajjZข@ๅส•ัจQฃ๛Utt4K|pzz:† GGGภาาŸ~๚)Nž< เู๙ฤ›7oฦ๕๋ืฅํptt๐๛็๒ๅห1jิ(Tฎ\ฦฦฦP*•…žฃ™n๒ห๖{เูgMHHส•+KKK :ถm+ะ็ฅK—ะพ}{X[[ระะvvv CZZZ‘\6ภปw๑ีW_มสส †††๐๔๔ฤ_Uข|ๆฟ8€บu๋ยะะUชTมโล‹ีฺ72™ฌภ๒๙๛ิ๓๛J~Ÿฑฑฑา{ำ]สรš5kเ๎๎CCCิฎ]งN*4ถซWฏ"00ๅส•ƒญญ-&L˜PเฝคRฉ0cฦ ธบบยะะVVV่ำง=zT่v๖yฑcว4hะๅห—‡‰‰ jิจQm๙’~VvŽf9ง๗ฺดiTชT ฿~๛ญtุ;99•*UŒ?^zวP*•044D๙๒ๅีึgcc##ฃ—ฦ•๏e๛RฉDeศชUซ„งงง3fŒ˜7ož๘๑วE… „ƒƒƒศศศBqๅส1hะ @๘ใbษ’%bษ’%โ๖ํB!ฦŽ+ˆ€€1kึ,1pเ@กฃฃ#ผฝฝEvvถBˆG ;;;แํํ-rss…BDEE bษ’%ลฦxํฺ5@ธปป GGG๑ห/ฟˆ๑ใว‹Š+ŠJ•*Iq!ฤ้ำง…นนนpqqฟ๒‹˜={ถhิจ‘ษdbอš5Rป…  ยหหK4mฺTฬš5K„‡‡ ัฉS'ต๕/\ธPศd2แๆๆ&&Mš$ๆฬ™#z๕๊%บu๋&ต๑๗๗ถถถย^ ปw๏^ฑ๋๊าฅ‹ะืืร† ๓็ฯฟ๒‹hบต๘๛๏ฟ…Bl฿พ]( ๑ัGIฑvํZ!ฤํŸ...BกPˆiำฆ‰ˆˆ‘‘‘!อห฿‡„(๙~๘๑cQฅJadd$†.fฬ˜!๊ึญ+<==ี๚ฬสสNNNยึึVLœ8QฬŸ?_Œ?^x{{‹ไไไ"ทนธmสฬฬตjีzzzb่ะกbๆฬ™ขaร†€˜1cFฑนโู๛จFยสสJ๘ใb๖์ูโ“O>2™Lœ>}Zj—๚ผ(Ÿzตฯ๏ำฦฦFŒ7NLŸ>]Tฎ\Y˜˜˜ˆฟ[|๑วb๒ไษb๒ไษย\TซVMไๅๅIห๗่ัCŠ๊ีซ‹nบ‰ูณg‹VญZ b๔่ัj๋๏ีซ—ะีีฝ{๗QQQโ‡~ๅส•S๛|ฮฉฐฯ‹ำงO }}}QงN๑oฟ‰จจ(๑ํท฿ŠFฉญงคŸ๙Ÿ็ .,ฐ=ฎฎฎโห/ฟ๑‡h฿พฝ ~w!ฤณ}่?Dถmฅื9!!A!คyฝz๕gฯžษษษโ?zzz%z๓ท/•šTฆdff˜v๘๐a@,^ผXšถjีช_2Bq๗๎]กฏฏ/š7oฎ๖A8{๖l@๏“ฆmถM'NWฏ^&&&ขM›6/1ƒษศศH๛๏ฟา๔ฃG b่ะกาดfอš www๑๔้SišJฅ~~~ขz๕๊าด€€กRฉค้C‡:::"55U!Djjช055>>>โษ“'jq=ฟ\‡์๓9หสสึึึข}๛๖าด/k777ต๙ฮ; ™L&Zดhกถ___แเเ 6ญฐื,00PTฉREmšƒƒƒ ถnZ ๓…fxxธหๅbัขEฺ•๔หใ๛Ÿ ฆM›V`^~žึญ['ฝฯ๋ะกƒษdโ๒ๅหj๑้๋๋ซMKHHฤฌYณคi;w–––า^„โึญ[B.—‹ &Hำ^uฟhะ ZŸBผผX,NI อ‡ }}}้?_›7o2™L$''—ธะ477W๛ODaZถlY`ฟโ๖ฯ*UชุฯŠ*4Kฒ฿O:Uำ!„Ož<5kึT๋๓ิฉS€XตjUฑ๑ฟส6อ˜1C m!„ศฮฮพพพยฤฤD(•สb๛อํทOšv๗๎]a`` ยรรฅiฏZh‡’ฆๅ>‰๋ืฏKำ็ฮ[ ๏=z๔ฤ7฿|#MSฉTขeห–B___ฺG๖๏฿/ˆ่่hต˜ถnZ`zQŸำงO/ั~๗ฆ…&ต๗ฌBxyy‰ฺตkKฯ๏ป'ˆฑcว่777W 8P่้้ €ะัั๑วKczQQ๛Riแกs*Sž?ค““ƒ Zตj(_พผtจญ8;w๎Dvv6† ขv๎V๏ฝaff†อ›7Kำš7oŽ>}๚`ย„ hืฎ ‹=”๛ข6mฺ rๅสา๓บu๋ยวว111€‡b๗๎่ิฉาำำq}ฟ<@`` .]บ„๛OญฯฏฟZํpWร† ‘——‡๋ืฏxvศ(==ร‡/p1ฦ‹‡ษLLLะตkW้นพพ>๊ึญ‹ซWฏุ–๎ปCOOOz๎ใใ!พ๒Kตv>>>ธy๓&rssฅiฯฟfiiiธ>q๕๊ี‡œœX`ภณsฐˆ฿~๛ 7z๔่Q MlllCq…๙็Ÿ๐ัGแ›oพ)0/?O111ะััม Aƒิๆ‡‡‡CQเฤ€€TญZUz๎แแ333ต|~๖ูgธ{๗ฎฺกืีซWCฅRแณฯ>๐z๛E๏ฝ฿๚9d%QกBaูฒež]”เ็็‡๗Qพ|y=zดฤงฃฆG%>X’~๋ึญจ\น2BBBคi†††่ปทZ_ๆๆๆ€mถ!33๓ตใ^LL ฌญญันsgišžž „วz๊ล‹\\\ะฐaC้yฅJ•PฃFB฿%ๅโโ___้น iำฆ๘๘ใ L/l]ฯ฿ข,t“์์l์นฐjี*˜››ใำO?•๖๛๛๗๏ฃvํฺ011มž={ิ๚+์๓"P๔๚๕๋กRฉŠž’~Vงo฿พjฯ6lXโ๋่่ jีช ฤ_…+V u๋ึ๘ๆ›oฐnบ7Šซดฑะค2ๅษ“'3fŒtฮG}„J•*!55ตุsข๒ๅd5jิP›ฎฏฏ*UชH๓๓๚๋ฏจXฑ"โใใ1sๆLXZZ–8ึ๊ีซ˜ๆ์์,๛t๙๒e!0z๔hTชTIํ1v์Xฯฮีz๓่ภณ/zา๙K๙็–ไ8;;ปลg…  œ Uุz๓ฟ`ํํํ LWฉTjฏลมƒ€rๅสก|๙๒จTฉ’tพTa…fQ/^Œ9sๆ`ึฌYj_ยฏใส•+จQฃtuu‹ls๚uฺฺุ8o1Š์๗•sฬgPPฬออฑbล iฺŠ+ P(เ์์ เ๕๖‹โ๒ฆi]บtมŽ;pใฦ ฌ[ท]บtyฅๅงL™‚ำงOรu๋ึลธqใ^น z•ํ/ษ~๚uTญZต@ปjีชX๏ฐaร0||๔ัG ฤœ9sJ๔YT”๋ืฏฃz๕๊.b*jฟ+LI๖ลW๕*Ÿ ฌK.—ฃJ•*jำ๒๗๙ฯฤK—.!-- –––๖ว—hฟ์ณฯPฟ~}๔๊ี VVV รส•+‹-:_‡กกกtfพWษ๑ไษ“๑ห/ฟ`ูฒe่ฝ;:u๊„ตkืขAƒ0`€ฺึ฿uEŠฝ‡พ๙ๆ,\ธC† ฏฏ/ฬออ!“ษ๖ึ?HเิฉSา‡[RRา8ฯห๗oฟ-r๏ล/ถขFญ^็ๆฏาWQm_ึว•+WะฌY3ิฌYำฆMƒฝฝ=๔๕๕ƒ้ำงxอŠ•ช_ฟ>โใใ1{๖lt๊ิ +V,ฒญ6”$Ÿhำฆ ึฎ]‹฿w๎มมƒ๑๓ฯ?Km^gฟx•‹ถ GศสสBงN^i๙N:กaร†Xปv-ถo฿ŽศศH๒ห/Xณf ZดhQข>^e๛฿ๆ{ฆNŠž={b๚๕ุพ}; „ˆˆ9rvvvฏี็›*ษ6v!€"๏แ๘บŸฏBฅRมาาััั…ฮฑฐ+์u722ยพ}๛ฐgฯlผ[ทnลŠ+ะดiSl฿พญฟi?ฟ;š6mZเF๖!!!6l’““ ผฯ฿U,4ฉLYฝz5z๔่ฉSงJำž>}Zเ^E}ˆๆาปpแ‚ฺฎณณณqํฺ5Hำ222๐ล_ภลล~~~˜2e ฺถm oo๏ลz้าฅำ.^ผ(]˜ฟ~===ต๕พ‰CทงOŸ~'>ค6nˆฌฌ,lุฐAmDไลC`%QญZ5L™27FPPvํฺ๕JWI?ฏjีช8z๔(rrrิN xžƒƒv๎‰๔๔tต๕ไ_ฉ๚*‡‡Ÿ๗ูgŸแฏฟยฎ]ปp๎9!ครๆภ/ŠzผmFFFhำฆ ๛oดhั}๔ั+๗accƒ๛ฃธ{๗.>๙ไLš4I*4Kk[๒988เ์ูณBจญ๛๒ๅห…ถwww‡ปป;F…C‡ก~๚ˆŠŠยฤ‰‹\GqŸQ‰‰‰า-š๒ฝ้~๗ขฃ!ฉฉฉjW>—dฤ๔uจT*\ฝzUลž}>ซVญŠ;wข~๚o๔Ÿ'น\ŽfอšกYณf˜6m~๙gŒ9{๖์ykŸต%Q~{็ฮB‹๚œœxฅอา~ผˆ‡ฮฉLััั)๐?ๅYณfxร–+W  ะืืวฬ™3ี๚Yฐ`าาาิ๎๗ร?เฦ๘๋ฏฟ0mฺ48::Jฃ6%ฑn:ตs้Ž;†ฃGJ_ž–––hธ1ๆฮ‹[ทnXพฐฝL๓ๆอajjŠˆˆ<}๚Tm›ž๔:๒ืบำาาฐpแยื๊ฯรร1118w๎Zทn]เพy%ฝeI๛๖ํq}ฬž=ปภผXƒƒƒ‘——W อ๔้ำ!“ษJ<ฺ๖ข€€TฌX+VฌภŠ+Pทn]ตC€okฟ(๊=  ฿~๛-ฦŽ‹ัฃGฟาryyy3[ZZยึึVํ}Vฎ\น7:ช๑฿ฉN๊้ำง๘๓ฯ?ีฺ)•สปป;ไr๙K?'Šฺฆเเ`พ}[ํ๔Š\ฬš5 &&&๐๗๗M* ?ฅ๛๖ํ“ฆedd”๘6Jฏใ๙๗’ณgฯ†žžš5kเู่v^^~๚้งหๆๆๆ–h_~๘๐ai …ิ^“Wนฺ๋266P๘{ะูู;v์ภƒคiyyyXนr%LMMีฮ๗~™า~ผˆ#šTฆดjี K–,นน9\\\p๘๐a์นjํ ttt๐ห/ฟ -- าฝGŒ๑ใว#((!!!ธpแ~wx{{K ์ฝฟ;ฦŽ‹O>๙ภณ๛A6nฃG.๔พ{/ชVญ4h€~๚!++ 3fฬ€……พ{ฉอœ9sะ Aธปปฃw๏จRฅ ๎นƒร‡ใ฿EBBย+ๅวฬฬ ำงOGฏ^ฝเํํ.]บ B… HHH@ffฆFฟD ำผys่๋๋ฃu๋ึ่ำง?~Œ?–––…Q%Qฏ^=ฌ_ฟมมม่ะกึญ['Jv๏{๗๎}iQฝ{w,^ผร† รฑcวะฐaCddd`็ฮ่฿ฟ?BCCับuk4iา#GŽDrr2<==ฑ}๛vฌ_ฟC† yฅ/‚็้้้ก]ปvXพ|9222๐๋ฏฟh๓6๖‹ฺตkx๖saaaะำำC๋ึญฅ๔Eiiiา=I<เYaPพ|y”/_พุ฿š๗๔๔„งง็KczQzz:์์์ะกCxzzยฤฤ;w๎ฤ๑ใวีŽZิฎ]+Vฌภฐaรเํํ ดn๚•ืWR}๚๔ม์ูณันsg <666ˆŽŽ–.ฐหAฺฝ{7ˆŽ;ยููนนนXฒd tttะพ}๛bืQิ6}๕ื˜;w.z๖์‰'NภััซWฏฦมƒ1cฦŒืลQ๓ๆอ๑๑วใซฏพยw฿}๏CฅJ•pใฦทฒŽ็b๋ึญ่ัฃ|||ฐeหlผ?๘ฃtH฿฿}๚๔ADDโใใัผys่้้แาฅKXตj~๛ํ7t่ะกุ๕L˜0๛๖ํCห–-แเเ€ปw๏โ๗฿‡4h ต+้gล›022‚‹‹ VฌXgggTฌXnnnpssร๐แรัตkW๘๘๘เ๋ฏฟ†‘‘–-[†'N`โฤ‰Ei)Liฟ? (ฝ ‰4๏ัฃGโ‹/พ}๔‘011โ๙๓ยมมA๔่ัCญํŸ)ชTฉ"ttt nc๖์ูขfอšBOOOXYY‰~๚‰G !„P*•ยมมA|๒ษ'"''GญฯกC‡ น\.>\dŒ๙ทรˆŒŒSงN๖๖๖ยภภ@4lุPบ‡ฺ๓ฎ\น"บw๏.ฌญญ…žžžจ\นฒhีช•Xฝzติ&–#วW[ถฐ[ธ!ฤ† „ŸŸŸ022fffขnบbูฒeา|ต๛6ๆ๋ัฃ‡ฺm2๒๛๑๖-EลSุ-m6lุ <<<„กกกt_ั ฝx •–-[Lจ(xM!„Xฟ~ฝะีีŸ}๖™tซช’ฒDˆgท]9rคprrzzzยฺฺZt่ะA\นrEj“žž.†*lmm…žžžจ^ฝบˆŒŒTปUTQ๑ๅoำ‹๛ฅB์ุฑC2™Lผyณะ๘dฟศ๗ำO?‰ส•+ น\า[ๅ๏ท…=^ผuJQ๛ผ’(++K|๗wยำำS˜ššŠrๅส OOO้^„๙?~,บt้"ส—/ฏOQ๛็๓๓^ผฝQI๖{!„ธz๕ชhูฒฅ022•*UแแแโŸฤ‘#Gค6_~๙ฅจZตช044+VMš4;w๎,67ลm“BนsG๚œำืื๎๎๎jทื)NQ๏#แ๏๏ฏ6ํฤ‰ยววG่๋๋‹?XL›6ญศึga๛ม๓Ÿ๙z๔่!ส•+'ฎ\น"š7o.Œ…•••;vฌฺmๆ๒อ›7Oิฎ][ SSSแ๎๎.พ{‘’’๒า˜vํฺ%BCC…ญญญะืืถถถขs็ฮโโล‹๒Q’ฯŠขnoTฎ\นm ปeิกC‡Dํฺต…พพ~[mบU๘๛๛ซฝฮQQQ/้EลํKฅA&„Ž—•13fฬภะกC๑๏ฟชบŒ่CฦB“ˆˆ่=y๒Dํ‚”งOŸยหห yyyาE,Dฤs4‰ˆˆ^Yปvํ๐๑วCกP -- 7ฮŸ?_ไญwˆถ‡";;ปศ๙:::n๙ค ั$""zE3fฬภ๙๓‘œœŒผผ<ธธธเ๛๏ฟWป‘&5nธุ_‚rppnvฏM,4‰ˆˆˆ3'Nœ(๖—†ŒŒŒPฟ~RŒจp,4‰ˆˆˆH#xรv""""าšDD๏ฑ›7oยะะPบ‰zY ™L†ุุุ7๎ซqใฦpss{๓ ๕๊ีS๛Aข๗ M"๚เ-Zด2™ 2™ (0_{{{ศd2ดjีJm^r๙rๅสมลล'NDfffก๋KJJ‚L&รฑcว8๖ &ภวว็8๋C๑๓ฯ?cบuฆ:tใฦำุฯz๐ร˜3gn฿พญ‘‰4…&ัghhˆฅK—˜พw๏^๛๏ฟ000(tนO?K–,ม’%K0u๊Txyya๔่ั่ัฃGกํ7o KKKx{{ฟQผ๗๎ร_…พ}๛พQ?๏šFแษ“'hิจ‘ถC)Tq…ๆ๘๑ใ5Vh†††ยฬฬ ฟปF๚'าG“ˆ่ ฦชUซ0sๆL่๊฿วใาฅKQปvmฟฟะๅœัตkW้y฿พ}‘5kึเ้ำงาo`็‹‰‰A‹-ค฿ฤ~]7tuuK๗w‹_"##ฃศ฿K/)น\^ gฒฬฬLC.—ฃC‡Xผx1ฦฦ๛Qiเˆ&ัืนsg>>011Q›ž^bbb"allŒjีชa๕๊ีžะ๚๘๘ภศศ5jิภฮ; ๔}๊ิ)ดhัfff011Aณfอpไศต6๙ง์ป๛๗‡ฅฅ%์์์ค๙[ถlAร† Qฎ\9˜ššขeห–8sๆฬKทซฐs4/]บ„๖ํรฺฺ†††ฐณณCXXาาา^ฺ๐์V0~~~022‚““ขขข ดษสสยุฑcQญZ5ภ฿=ฒฒฒค62™ ๘๋ฏฟคำ%z๖์‰qใฦแป๏พ899I๓žฟแ฿ฺตkรศศ+VDXXnผฉCkwโฤ 4jิฦฦฦ๘๑วฅ๙Ÿ~๚)ฎ_ฟŽ๘๘๘m7‘ถฑะ$"๚แ๋๋‹eห–Iำถlู‚ดด4„……นำงOq}ฟืฏ_วาฅK๑ื_กK—. อmถA&“กy๓ๆ€;v s็ฮจPก~๙ๅLž<7~้ล=9998~8>๙ไ“B็?z๔ญZต‚ฆL™„……aลŠ Cpp0&OžŒŒŒ t่ะ้้้าฒgฮœAร† ‘€๏ฟฃGฦตkืะธqc=zดภบ๚๗๏ณgฯbฬ˜1>|8`ษ’%hูฒ%LLL๐ห/ฟ`๔่ั8{๖,4h๐ส7‘ฮฮฮF`` Ž9‚oพ๙sๆฬมื_ซWฏ–่0๕ฃGŒฺตkcส”)ฐณณCฟ~๐ฟOjฃRฉ‚_ญ[ทฦฌYณะฆMLŸ>]ํ&์K–,6l(.ังOดkื;wLŸ>]š—ห,“&MB๗๎QฝzuL›6 C† มฎ]ปะจQฃ๐เมดhั …3fฬ@“&Mคyตkื€2u๑•q‚ˆ่ทpแB@?~\ฬž=[˜ššŠฬฬL!„;vMš4Bแเเ Zถlฉถ,€BmฺดOŸ>-ฐฎnบ ้๙เมƒ…™™™ศออ}ฅ˜/_พ,ˆYณf˜็๏๏/ˆฅK—JำฮŸ?/น\.Ž9"M฿ถm› .\(MkำฆะืืWฎ\‘ฆฅคคSSSัจQ#iZ~4h zzบ(_พผ่ปทZ\ทo฿ๆๆๆฆฟhฯž=€ุณgBˆSงN bีชUล'ฅ๙น˜:uช4-++K( aii)ฒณณ…B,YฒDศๅrฑ~ตๅฃขขq๐เAiZนrๅD= ฌ+22Rืฎ]S›žœœ,tttฤคI“ิฆ'%% ]]]ต้๙๑FEEนM๚๚๚ข_ฟ~/vขwG4‰ˆžำฉS'ธ{๗.Nœ8Xตjjีช…š5kชลดiSxๅ˜ŸทfอจT*t๊ิIญokkkTฏ^ฝ@฿๘โ‹/Š์ฏB… Ež/L๔ฎแล@DDฯฉTฉฐt้Rdff"//:t(v;;;HฯCBB`aaoฟ›6m’.ึ9~8๎ปงVh๖๏฿+WฎD‹-Pนre4o:uBPPP‰โEธ›]‹Eฬออaoo_`้ง์๎ป‡ฬฬLิจQฃ@Ÿตjี‚Jฅยอ›7แ๊๊*MwrrRkw้า%Šด™™™ทI899aุฐa˜6mขฃฃัฐaC„„„ kืฎRลฑตต-p’ณณ3 99๕๊ีรฅK—p๎9้P๗‹๎ฝ๛J1?๏าฅKB z๕๊…ฮืำำS{^นreู่๋๋Ÿ‚ั{ƒ…&ั บt้‚ฝ{ใ๖ํhัขส—/ส}4kึ ฐo฿>ฉะŒ‰‰ฃฃ#\\\คv–––ˆวถmฐeหlูฒ .D๗๎๑ื_ูฟ……๙[วฯ0–dzQkIฉ=WฉTžฯhmm] ‹็ญ–ฤิฉSัณgOฌ_ฟทoว Aƒ#GŽจ]€๔บT*1mฺดB็ฟX ฟj฿2™ [ถl)4/^ฬ๕b>_”ššŠ>๚่ตใ!*M,4‰ˆ^ะถm[๔้ำGŽมŠ+^ซ\ภใวฅi›7oFpppถ๚๚๚hบ5Zทn •J…๛c๎น=z4ชUซVh1ŒŒŒpํฺตืŠฏ(•*U‚ฑฑ1.\ธP`๙๓็!—ห_ZtUญZภณ"๚๙‘7ๅ๎๎wwwŒ5 ‡B๚๕…‰'ป\JJJ.]ผxภณ ภ๒cNHH@ณfอ^:ZXิขฆWญZB899I#ฉฏ๋ฟCvv6jีช๕F•žฃID๔๑ว7nk฿ฃrใฦOOOภ;wp๒ไIตรๆภk™O.—รรริnซ๓"===ิฉSqqqฏ_Qtttะผysฌ_ฟ^ํ๊๐;w๎`้าฅhะ มK}ยฬฬ ?3rrr ฬฟw๏+ลคT*ฅย=Ÿปป;ไryฑ9ส—››‹นs็Jฯณณณ1w๎\TชTIบŠปSงN๘๏ฟ๐็ŸXษ“'ศศศž—+Wฎะซ๓ ู็ตkื:::?~|‘c!D} 8๙็”๚๙๙•x"mโˆ&Q!Š๚UŸย\ผx7€g7ื>rไ๚๋/TซV บu๐์ฐนกกกฺญj Wฏ^x๘๐!š6m ;;;\ฟ~ณfอ‚Bกx้จUhh(FŽ ฅR๙ส็=gโฤ‰ุฑc4h€๛CWWs็ฮEVVฆL™๒าๅอฬฬ๐ว [ทn๘ไ“O†J•*แฦุผy3๊ืฏูณg—8žปwcเภุ่ฑ#œ‘››‹%K–@GGํท้๒ถถถ๘ๅ—_œœ gggฌXฑ๑๑๑˜7ožt~dทnฐrๅJ๔ํ{๖์A๚๕‘——‡๓็ฯcๅส•ุถm๊ิฉเู-†v๎‰iำฆมึึNNN๐๑๑‘Šึ‘#G",, zzzhบ5ชVญЉ'bฤˆHNNF›6m`jjŠkืฎaํฺต๘๚๋ฏ๑ํท฿–(;v์ภว //ฏ็Hซดwม;ัปแ๙ง$ท7าััvvvโ๋ฏฟw๎‘ฺu่ะA่s๕๊ีขy๓ๆยาาR่๋๋‹?X๔้ำGบu๋ฅq฿นsG่๊๊Š%K–จM๗๗๗ฎฎฎ%Š?  6ํไษ“"00P˜˜˜cccัคIq่ะ!ต6/หž={D`` 077†††ขjีชขgฯž"..ฎุํz๑๖FWฏ^_~๙ฅจZตช044+VMš4;w๎,ถ!/qqqยืืW 1{๖์mณณณล/ฟ"\]]…จPก‚จ]ปถ?~ผHKK“ฺ?^4jิH jท:๚้งŸDๅส•…\./pซฃ๙G4hะ@”+WN”+WNิฌYS 0@\ธpก@ผ…ษหห666bิจQ/nขw…Lˆ78œˆˆ^*77ˆˆˆ@฿j฿_}๕.^ผˆ๛๗ฟี~้ณn:t้าWฎ\ถร!*šDDv๗๎]๛๏่ำงฯ[/nธggg์ฺต ๕๋ืซ}ำปลืื 6,ั้ D๏ šDDDDคผ๊œˆˆˆˆ4‚…&i M""""าšDDDDคผa;i•JฅBJJ LMM_๚ณoDDD๔nB ==ถถถห‹ทdกIZ•’’๒า฿M&""ขwำอ›7aggWไ|šคUฆฆฆ€kืฎกbลŠZŽๆร‘““ƒํทฃy๓ๆาO๐Q้`๎ตƒyืๆ^{4™{ฅR {{{้{ผ(,4Iซ๒—›ššพี฿jฆโๅไไภุุfffเ/eฬฝv0๏ฺรkOiไeงฝ๑b """"าšDDDDค,4‰ˆˆˆH#Xh‘Fฐะ$""""`กIDDDDมB“ˆˆˆˆ4‚…&i M""""าšDDDDค,4‰ˆˆˆH#Xh‘Fฐะ$""""`กIDDDDกซํˆ pฦAจ๔MดฦC_.0ย h8eฒU2m‡๓Aa๎ตƒyืๆ^{Žoจํ8ขIDDDDšมB“ˆˆˆˆ4‚…&i M""""าšDDDDค,4‰ˆˆˆH#Xh‘Fฐะ$""""`กIDDDDมB“ˆˆˆˆ4‚…ๆKt่ะ๕๊ี+ีuž?7~๋m_ล† 0sๆLภอ›7แ๏๏///ิญ[‰‰‰o}}DDDT๖ฐะ,ฦŽ; ฃฃ๓สหๅๅๅi šา๑่ั#@HH ˜:u*บvํŠSงNaไศ‘?~< -- BญลJDDD๏6š฿Ÿ wwwxzzb์ุฑศษษมฯ?ŒQฃF•h๙ุุX ((x๘1บu๋ooox{{ใศ‘#€u๋ึมวว …กกกx๘1เโล‹จSง<==1oผbืUTขึ™’’‚–-[ยำำตkืฦอ›7ี๚หออลš5kะผys 8ฐhั" >\jฃT*ฅmll๛๗๏GญZต0y๒dฝ{ทDyสสส‚RฉT{QูฤB@bb"ๆฬ™ƒƒ"!!ƒฦดiำะฃG˜ššชตŠŠBTT ..ฝz๕’ๆ8q‹-ยž={0qโDดo฿ววฺตk1`ภ€ฟฟ?Ž=Š๘๘xิฏ_ , 2cฦŒABBยKG ‹j[ิ: „Ž;"!!ภG}เู!๑1cฦภลล›6mย„ ]`}ร‡วย… aoo‘#Gb๔่ั€VญZa๏ฝ€ฦ#,, ฑฑฑลฦsss้aoo_l{"""zฑะฤณัศฐฐ0˜™™ž๛์ณBGC‰ˆˆ่ร%ผ? i‘Rฉ„นน9jZ•พ‰ถร๙`่หFธ=FฤidซŠ?Uƒ.ๆ^;˜wํa๎ต็่๐†ˆ‰‰App0๔๔๔j฿๙฿฿iiiา5.…แˆ&i อwุย… กP(ิลึ'"""z—๐ช๓wุ_|/พ๘BaฝŽh‘Fฐะ$""""`กIDDDDมB“ˆˆˆˆ4‚…&iฏ:งwยถ!๕aaaกํ0>999ˆ‰‰ม๏ฝ๕›๘R๑˜{ํ`ต‡นืžœœm‡ภM""""า šDDDDค99ซWฏ~iป1cฦเะกC%๊388ููู€3fภีี...๘๛๏_;N"""๚ฐฐะิฒ;v@G็อ~ญค…ๆ„ เ็็Wไœœdddbbb ฏฏ‡b๖์ู8y๒$’’’ฐgฯ$%%=z๔FqQูฦBณ๙็Ÿpww‡งง'ฦŽ‹œœ๓ฯ5jT‰–W*•hฺด)>๙ไxyyแภ€‘#GbถmP(ˆŽŽฦฝ{๗ะขE ธปป#00w๎๔์ู[ทn-ะorr2~๑GิฌY/^8::โ้ำงB 77YYYศฮฮ†Jฅ‚…… M›6่ะกv๎ !ฤH•!,4KIbb"ๆฬ™ƒƒ"!!ƒฦดiำะฃG˜ššชตŠŠBTT ..ฝz๕a๚๕8y๒$6nˆ๐๐pภคI“ˆ๘๘x|๙็;v,>๔S$%%!44#GŽ,O^^6lุ€เเ`ดkื•+Wฦษ“'แๅๅฅึฮยยร† ƒฝฝ=lllะพ}{ฺฺุbccังOฬ;nnn๘๕ื_qb๓••ฅRฉ๖ ""ขฒIW|(bcc333ภ“'Oฐ}๛v์นืฏ_Wkทo_้๏:u๊`๙!พ{8p:::ธ|๙rก๋:t่ฦฺ่ต+fอšU M›6mpๆฬ,^ผ 4(2๎Gaถmธqใไr9š5k†ะะPธบบB&“แำO?ลงŸ~Š{๗๎a่ะกฐณณรีซWฅb๔E?~|ั‰"""ข2ƒ#šZณgฯยษษ 4ภฉSงR์2ัััศฮฮF||<โใใ฿h ย—_~‰~๘—.]*ดฮ;QญZ5˜››ริิMš4ม‰'ค๙?ฦ‚ ‚ทocษ’%ฐฒฒ*rฝ#FŒ@ZZš๔ธy๓ๆmฝปXh–’ฆM›b๙๒ๅากb___บu ษษษ8pเผผผฐaร†b๛P*•ฐดด„ŽŽVฏ^-]ธcjjŠ๔๔tฉŸŸVฌXXบtiก#–nnn๘๗฿q๊ิ)Tฏ^]บtA“&Mœœฌึฮฮฮ‡–ฮัฟ?œ฿~๛-<<ปm-m‡๐สrrrƒเเ`่้้i;œŠ&sŸ––V์ัIŽh‘Fฐะ$""""`กIDDDDมB“ˆˆˆˆ4‚…&i M""""าšDDDDค,4‰ˆˆˆH#t_„H๓&U‡………ถร๘`<ป‰๏ฺชo \ส˜{ํ`‰ดƒ#šDDDDค,4‰ˆˆˆH#Xh‘F๐Mz'ฌH๘FฆฺใรกสCEŸ๋h;š sฏฬป๖h(๗_xึ๚"อแˆ&i M""""าšDDDDค,4‰ˆˆˆH#Xh‘Fฐะ$""""`กIDDDDมB“ˆˆˆˆ4‚…&i M-๊ะก๊ีซ๗ฺห'''c๕๊ีo1ข“’’‚๎ปrssัญ[7xxxภออ +Vฌะศ:‰ˆˆจlaกฉ%;v์€Žฮ›—& อGlmmฑx๑bภฆM› Rฉ˜˜ˆปwc่ะก€์์ldffพี๕QูมBณ๙็Ÿpww‡งง'ฦŽ‹œœ๓ฯ5jT‰–W*•hฺด)>๙ไxyyแภ€‘#GbถmP(ˆŽŽฦฝ{๗ะขE ธปป#00w๎มฃGPซV-๗฿ศหหCฝz๕p๔่ั๋8rไz๖์‰:u๊xVฤ>?ฺš‘‘•J…วรสส ภณขิออ ƒ ยูณgKด-YYYP*•j"""*›XhjXbb"ๆฬ™ƒƒ"!!ƒฦดiำะฃG˜ššชตŠŠBTT ..ฝz๕a๚๕8y๒$6nˆ๐๐pภคI“ˆ๘๘x|๙็;v,>๔S$%%!44#GŽD… ๐๓ฯ?ฃo฿พ˜:u*4h@zz:ขขขPปvmŒ?กกกธpแBmhีช akk …BiำฆฌฌฌpๆฬิฉS}๚๔ฟฟ?–.]Šฌฌฌ"๓sss้aooๆI&""ขw’ฎถ(๋bcc333ภ“'Oฐ}๛v์นืฏ_Wkทo_้๏:u๊`๙!พ{8p:::ธ|๙rก๋:t่ฦฺ่ต+fอšhถ-–.]Š  >>^jokk ___ฌYณEnรัฃGannŽ””\พ|กกกHJJ‚ฎฎ.ŒŒŒะฝ{wt๏งOŸF๗๎คคคB๛1b† &=W*•,6‰ˆˆส(Žh–ฒ๘๘xœ={NNNhะ N:…b—‰ŽŽFvv6โใใี ล’สษษมตkื „@FF†4}ีชU(WฎBBB0cฦ ((kืฎล–-[ T*แ๋๋‹.]บXฟbcc<ป=%%ึึึHKKCHHabb‚C‡a๑โล๐๕๕}„Q™มBSร0pเ@๘๙๙มำำ3gฮ,ฒmQ็hv้าปw๏†‡‡๖ํ']Œใแแ'OžH7111๐๐๐ภš5k0qโDœ9s๓ฦŒƒ๎ปใัฃGุดi“ฺzmmm1fฬœ;wฎะBsภ€ธvํšt‘ัoฟ}}}ภฐaรp๚๔i :*Tx+9#""ขฒA&„ฺ‚>\Jฅๆๆๆ˜ณ+Fฆๅตฮ‡C•‡Šท๑ะฺฟูmถ่1๗ฺมผk†r…๗วoญฏฒ*''111†žž[ํ;๛;--ญุำเ8ขIDDDDมB“ˆˆˆˆ4‚…&i M""""าšDDDDค,4‰ˆˆˆH#Xh‘Fฐะ$""""ะีvD๐™geXXXh;Œฦณ›๘&ข๋'vo&พT<ๆ^;˜wํa๎?lั$""""`กIDDDDมC็๔N8‘ฌ„้#piQๅๅŽ]Mƒ\‡ฅ‰นืŽ-๏พีสk;"ั$"""" aกIDDDDมB“ˆˆˆˆ4‚…&i M""""าšDDDDค,4‰ˆˆˆH#Xh‘Fฐะ$""""`กIDDDD๑มš:t@ฝz๕JิถSงN๐๔๔Dttด†ฃ*\ใฦq๙R]็˜1cp่ะ!ภ๎ปแๅๅOOOดlู้้้ฅ ฝŸ>ศBsวŽะั)ู๏j฿บu /^DBB>sตyyyyš๏ญzี=z˜0aร† รส•+‘ggg,ZดHญ-Qaส|ก๙็Ÿยžžž;v,rrr๐๓ฯ?cิจQ%Zพu๋ึธt้ ’’’เ่่ˆ#F@กPเ๐แร˜8q"เแแ7bccัผysรััQQQ˜4i<<<ะขE ไๆๆนพ 6@กPภำำฝz๕’ฆ/\ธตkื†——nผ Xทn||| P(Šวz๖์‰๛ร3fฬภŒ3PณfMxzzbศ!ึ™––†ูณgรำำ+Vฌ๚ุบuซิFฉTB๔๔tุุุ"##Qฟ~},^ผOŸ>-Q>ณฒฒ T*ีDDDT6้j;MJLLฤœ9sp๐เA˜™™แแร‡˜6mz๔่SSSตถQQQ€พ}๛"..QQQ˜?>Vฏ^ฐฐ09rDj๋่่ˆ๘๘x;v 6lภ‰'๐๐แC๘๚๚ขI“&าบฯ;‡\TซV ๑ัฎ];์ฺต โฝs็† †๛๗รฦฦ>”ๆ™˜˜เฤ‰˜:uชTธ๚๛๛ฃM›6€)Sฆ`ม‚๔ำbทรฬฬLํADDDeS™.4›6mŠๅห—K็๚๚๚โึญ[HNNฦเๅๅ… 6ผv~~~Xปv-rrrp๛๖mœ:u ฎฎฎฏ_ฝz๕ฐs็Nบu ิFฉTยฦฦ*• K–,)ดJฅยฟ‹€€L:/^XYYaิจQ8sๆ ยยย 777l฿พ]m๙ *เฮ;าศใฎ]ปเ์์ ๘๛๏ฟQฃF DGGcุฐaHHHภเมƒY<€2~Žฆ››???่่่ mถ7n\กm‹:Gณ8u๋ึEห–-แๅๅน\Ž™3gยฤฤไตใตดดฤ๔้ำฅQGตริ/=z4Zดh ิฏ_ฉฉฉฺไๅๅกK—.HOO‡&LP›/—หŒเเ`๛๏ฟธs็Žฺ|]]]ฬœ9AAAหๅจ^ฝบ”CGGG9rฏฝอDDDTvษ„BAะ‡KฉTยโฎยิผ‚ถร๙`จ๒rqA|Tณ>ไ:e๚›๏ๆ^;>ดผ๛V+ฏํ$999ˆ‰‰App0๔๔๔ดฮE“นฯNKK+๖Hf™>tNDDDDฺS๖[๗Žjถ-ฎ]ปฆ6mบuE^๙MDDD๔พaกฉ%kืฎีvDDDDลC็DDDDค,4‰ˆˆˆH#Xh‘Fฐะ$""""`กIDDDDมซฮ้Pั ๅตฦ#''1็บUฬyๅRฦk๓Nคั$""""`กIDDDDมC็๔Nธทฒeฺูใƒ‘งk|๖'๎๔จ งฺ็ƒยkG~‰จtqD“ˆˆˆˆ4‚…&i M""""าšDDDDค,4‰ˆˆˆH#Xh‘Fฐะ$""""`กIDDDDมB“ˆˆˆˆ4‚…&iฤ[)4;t่€z๕๊•จmงNเ้้‰่่่ทฑ๊Wึธqcœ?^+๋7nขขขจุุX„……ฝึฒaaaˆ-Q€€้๏๏พ๛nnnpqqมoฟ๖Z๋&""ขฯึ๙Ž; ฃฃSขถทnยล‹‘P`^^^^‰๛ั–๗!ฦ7‘™™ ]]]่๋๋c็ฮ€๘๘x9r‰‰‰x๚๔)jิจ/พ๘fffx๔่*Tจ ๅจ‰ˆˆ่]๕J#š๙'แ้้‰ฑcว"''?3FUขๅ[ทnK—.AกP )) ŽŽŽ1b >Œ‰'ยออ ุธq#€g#xอ›7Gpp0…I“&มรร-Zด@nnn‘๋ฐa <==ัซW/i๚ย… Qปvmxyyแๆอ›€u๋ึมวว …กกกx๘1 gฯž่฿ฟ?ผฝฝ1cฦ ฬ˜15kึ„งง'† RไบฯŸ?xzzยววYYY€'N AƒจZต*ถo฿ศออลเมƒแํํ …B!mปRฉD—.]เแแ…Bธธ8ตulบHKKรๆอ›Qฏ^=( ๔ํ*• 0z๔hิจQอ›7วƒ ๕ฬ™3๘ๆ›oเ๊๊ŠGฌญญฅ๙OŸ>ENNž|ˆiำฆกG055Uk›xธo฿พˆ‹‹CTTๆฯŸีซW#,, GŽ‘ฺ:::">>วŽร† pโฤ <|๘พพพhาค‰ด๎s็ฮ!77ีชUรฤฤDดkืปvํB```x๏นƒaร†aฐฑฑมร‡ฅy&&&8qโฆN*ฎhำฆ `ส”)Xฐ` HMMลฑcว “ษPฉR%ธqFFFHKK+2_บuร”)SะคIคฅฅAOOp๚u์ป๑๑๑4hš7oŽ๙๓็รษษ ฟ๖”J%|}}„ &ภููK—.Enn.233q๒ไIฯŠฬI“&aใฦศษษมŒ3 CCC 0kึฌมวŒ;vเ๔้ำธ{๗.jึฌ)ล—••…ีซWc๎นB w๏ˆŒŒ„กกกฺv( ๘๛๛รึึููู๘ใ?คB๓ย… ุธq#ฦ‡{๗๎กw๏๘๓ฯabbRd^"""0~๘"็QูQโB3@333ภ“'Oฐ}๛v์นืฏ_Wkทo_้๏:u๊`๙E๖ฑcGภกC‡ะกCภฦฦŸ|๒ ฮœ9๐๓๓“ัš››ฃUซV777ธqฃะ~=Š€€ุุุ*Vฌ(อ xyyaม‚€7n cวŽธs็233ีฮQ์ะกd2 vํฺฺ่ต+:v์(ฆ/R*•HOO— esssi^ห–-กฃฃ///$''xv๚มูณgฑhั"@zz:RRRฐ{๗nฤฤฤtuuฅŸ์์์——‡s็ฮIห‡††Jห_ธp฿=H๒‹ฯ›7ฎฎฎุ่ฑ#&Nœˆ๛ฏะuญ]ปพพพ000€••<==ฅภƒ0cฦ „„„ \นrXตjีKท฿ฬฬLํADDDeS‰ อฆM›b๙๒ๅา9uพพพธu๋’““qเภxyyaร† ฏˆŸŸึฎ]‹œœพ}งN‚ซซ๋k๗Wฏ^=์นทnตC็…Q*•ฐฑฑJฅย’%K mฃRฉ๐๏ฟ" SงNลล‹ mgffsss์ูณ––&3Y˜€€๑วR›๘๘xiziนนนาHกฅฅ%ึญ[‡ฏฟgฮœAฝz๕ฐkื.๛๏ฟž๛ฏZNSRRฐ~iพพพXผx1<ˆrๅส!00!!!Nฐณณรพ}๛ RฉžžŽ“'Oขjีช€.]บภืืJฅ[ถlมฺตk_ซ๘&""ขฒฉฤ‡ฮ0pเ@๘๙๙AGGmถลธqใ m[ิ9šลฉ[ท.Zถl ///ศๅrฬœ9ณุs^ฦาาำงO— ฬ›7ฏศ๖ฃG– ืฏ_ฉฉฉฺไๅๅกK—.HOO‡&L(ฒฟล‹ฃw๏2dŒ‹ฝญPŸ>}p๕๊UxzzBฅRกFXณf F>}๚ภบบบj9trrยาฅK†อ›7cฮœ9 ENN๔๔๔๐็Ÿขnบhึฌเ่่X่-จ*VฌˆกC‡b่ะก…ฦุฑcGlถ ๎๎๎€กC‡ขrๅสžš7ไrŽ•ˆˆˆ ’ !„ถƒ —Rฉ„นน9ฮvฐ@yYถถร๙`ไ้โฤgข๖Šะษ}ชํp>(ฬฝvไ็=88Xบ8“JGNNbbb˜{-ะd๎๓ฟฟำาาŠ= ŽCQDDDDคo|ร๖wAถmqํฺ5ตi๋ึญƒฃฃฃฦื=iาคภŒ5 :tะ๘บ‰ˆˆˆeeขะ\ปvญึึ=rไHŒ9Rk๋'"""zW๑ะ9i M""""าšDDDDค,4‰ˆˆˆH#Xh‘F”‰ซฮ้guฺใƒ‘““ฤฤภ๊ฏxๅRฦkG~‰จtqD“ˆˆˆˆ4‚…&iำ;A5ฏT*m‡๑มPษ๔*ƒ š•เoฬ—&ๆ^;˜wํyน—ขขายM""""าšDDDDค,4‰ˆˆˆH#Xh‘Fฐะ$""""`กIDDDDมB“ˆˆˆˆ4‚…&i M""""าšDDDDคeพะLMMล๙๓‹œommา>๖๎ WWW4lุ๐m†Vbฑฑฑ +ีuฆคค {๗๎€\t๋ึ pssรŠ+J5"""z?}๐…fI,]บ“&Mย๊ฟฏš——๗F–†W๑ัฃG[[[,^ผฐiำ&จT*$&&b๗๎:t( ;;™™™o7`"""*3ส\ก™’’‚๚๕๋CกPภรรแแแHJJ‚Bก@dd$222ะถm[ธธธ o฿พ/ํo๑โลXตjยรร1`ภ,Zด:t€ฟฟ?บu๋†ห—/ฃaร†๐๐๐@งN‘‘hธ1ยรรแๅๅoooฤลลกYณfจRฅ 6o\ไ๚”J%บt้( ฤลลxVถnีซWวคI“ค๖ญZตBํฺตแ๎๎Ž5kึ’““กP(ะฉS'ธธธศษ๙๓็ ฌ๗ศ‘#ู่ณ'๊ิฉ#๕Qฏ^=i~FFT*?~ +++)&777 4gฯž}i. ++ JฅRํADDDeS™+4—-[†€€ฤววใฤ‰˜8q"๏พ๛sๆฬ““ฮž=‹-Zเฮ;าฒ …B๚ปWฏ^ˆ‹‹C๗๎‚9sๆ`ฮœ9€ฤฤDlฺด K—.ล Aƒ0t่P$&&ยััำงO—๚ฐฐฐภฉSงะ A 8›7oฦบu๋0qโฤ"ใŸ0aœ‘˜˜ˆธธ88;;N:…E‹!!!QQQRAปx๑bœ8qฤ่ัฃ!„œ9scวŽล…  ไฤมมžžŽจจ(ิฎ]ใวGhh(.\ธP ฆVญZมะะถถถP(˜6mภสส gฮœA:uะงO๘๛๛c้าฅศสส*r๛"""`nn.=์ํํ‹}=‰ˆˆ่ฅซํ6ooo๔์ูrน;v„ฑฑฑฺC‡แว„††ชอ—.๎p{PPLMMฅeฺตkฺ่ต+~๘แฉ]ซVญ๎๎๎ษd044„››nธQd฿ปw๏FLL @WWfff€๚๕๋รยยเไไ„””Tฏ^ำงOว† <…ผ}๛6 VญZpuu-4'...ž๗๕๕ลš5kคโณ0G…นน9RRRp๙๒e„††")) บบบ022B๗๎ัฝ{wœ>}ปwGDD’’’ ํkฤˆ6l˜๔\ฉTฒุ$""*ฃสˆfฃFฐo฿>XZZข}๛๖ุตkW62™์ึ๑b๑Z}}}€\.W๛๛uฮํ400ฮ๏cฯž=8v์Ž;†„„899Iฃ‰ฯวXTNVญZ…rๅส!$$3fฬภƒ ]๗าฅKน\ggg˜™™!%%Eš฿แงŸ~BวŽแๆๆ†y๓ๆปfffj"""*›ส\กy๚uุุุ _ฟ~ Cjj*าำำฅ๙~~~าUำ›6mzใ‹Y 6nเYAึ Aƒ7๊/ QQQž]ํ|์/R*•จXฑ" p์ุ1œ;wฎะv/ๆ$ด1((kืฎล–-[ T*แ๋๋‹.]บXฮฮฑฑฑž›’’kkkคฅฅ!$$011มกC‡ฐx๑b๘๚๚พQˆˆˆจl(s…fll,<<<เๅๅ…๛๗ฃG๐๐๐€‡‡"##1`ภ\พ|ฎฎฎุผyณta P๘9š/3sๆLL™2ธz๕*† ๒F๑=/^„ปป;ผฝฝq๑โล"โมƒpuuล๔้ำแ้้YhปsาตkWต๙ถถถ3f ฮ;Whก9`ภ\ปv ๎๎๎ ฤoฟ&ะ6 งOŸฦะกCQกB…7ุr"""*kd"๊"-P*•077วŸมย@ฅํp>92}lญ2AWgBOdk;œ sฏฬป๖ผํห‡ํy#ไไไ &&มมมะำำ{ซ}็งฅฅ{\™ั$"""ขwC™ป๊}ฑm6ต+ิg็LNž,4Kัห อ7Q’Bำึึ‹/.ถอฃG!!!4h`๊ิฉฺ่ต+N:…‘#Gb๘๑€ดด4!B๔DDDTฑะิ ””ิฏ_ …GRR "##‘‘‘ถmยลล}๛๖-QŸQQQ๐๖๖†‡‡พ๘โ จT*ฌ]ปqqqhถ-6lXธp!เๆๆ†y๓ๆ’““Qฏ^ฝ}ๆๆๆbอš5hผ9เYแ:|๘pฉRฉ”ตฑฑ์฿ฟตjียไษ“q๗๎ืO•I,45hูฒe@||•–SSSฉoooo์ฺต Jฅ?ฦ–-[เใใฃึกก!พ๒K9r‘‘‘ุฝ{7jึฌ‰ฉSงXงtH|ืฎ]pvvœษ“'รััฑศ๘ `ffฆ๖ ""ขฒIW”eฑฑฑ˜2e ๔๕๕aaaๅห—#..่ึญ €ฯ?ฎฎฎhิจฌฌฌคe …t๘ผWฏ^่ท/๊ิฉƒ‘#Gโ“O>••ผผผค๖={๖DทnPฉR%์฿ฟ?๐C‡…ฃฃcก็iๆฏ+** ?.0Z ‘‘‘่ป7ฦccc,Xฐ`llŒ่่hฉ๐$"""zžL๐4คEJฅๆๆๆธ๛wX๓=ฅ%:ุ*oŠ ีn่!ฏุถ๒ถณK)ชCNNbbb ===m‡๓ม`ต‡นืMๆ>๛;--ญุฃ“}PฃF"๓•••…ฌฌ,้นRฉ,yฒ‰ˆˆ่ฝยอ7ไํํ%K–`๘๑ธt้ŒŒŒิๆ:taaa€ะะPK๓๒ C˜?>๊ิฉsss˜˜˜ Wฏ^ุฐaLLL ]ฏฉฉ) w่ะ!t้า2™ ๎๎๎066ฦ;wิฺL:hะ ฮž=‹‰'Zdภฬ™3‹””888`ผyาvํฺ๎๎๎hผ9ฆNŠ}๛๖ม๚๚๚Xธpa‘๑หๅr#88๛oC์บบบ˜9s&‚‚‚ —หQฝzuŒ7เ่่ˆ#GŽภยยโ ณHDDDe‘L!ด}ธ”J%ฬออqw฿\X˜ฝ|z+rTภึf๚X ฝ—ื{v+ >999ˆ‰‰App0๔๔๔ดฮƒyืๆ^{4™๛๏๏ดดดbN๒ะ9i M""""าšDDDDค,4‰ˆˆˆH#Xh‘Fฐะ$""""`กIDDDDมB“ˆˆˆˆ4‚ฟ D๏นK{ศ๙ CฅFž“ˆ- r@™ˆˆ4„#šDDDDค,4‰ˆˆˆH#Xh‘F๐Mz'ฎ้ •Q้ฌ๋dืUฅณ"""ขG4‰ˆˆˆH#Xh‘Fฐะ$""""`กIDDDDมB“ˆˆˆˆ4‚…&i M""""าšDDDDค,4‰ˆˆˆH#Xh~@๖๎ WWW4lุ๐ฅm7lุ€™3gnผ xyyกnบHLLิtจDDDTฐะ€,]บ“&Mย๛‹l๓่ั#@HH ˜:u*บvํŠSงNaไศ‘?~< -- BอNDDD๏%š๏ ””ิฏ_ …8<๓OธปปรำำcวŽŒ;pssร?(-๏่่ˆฑcวยำำ5‚Rฉฤโล‹ฑjี*„‡‡cภ€j๋หออลš5kะผys 8ฐhั" >\jฃT*ฅmll๛๗๏GญZต0y๒dฝ{ทD–••ฅRฉ๖ ""ขฒ‰…ๆ;hูฒe@||fฬธธธ`ำฆM˜0aขฃฃ ฤ3|๘p,\ธ๖๖๖9r$F hีช๖๎ hธ1ยยย[์ถEDDภ\zุฟ”ั;ˆ…ๆ;ศK–,ม๘๑ใq้า%์ปaaa033TฌXฐkื.x{{CกPเ๘๑ใ8{๖ฌิGHHภหห ษษษึq์ุ1899!33qqq๘฿‡z๕๊ฯาฅK1t่Pผy2dˆ4ฯสส ร‡ว™3g๐๙็ŸฃcวŽ๘ๆ›oŠถ#F --Mzผy๓UำCDDD๏ š๏ Fa฿พ}ฐดดD๛๖ํ =๒้ำง6l6oŒฤฤDt์ุYYYา|€\.G^^^ๅ=<<0o<8pํทวส•+‘]h< ,@ปvํํฺตรัฃGีๆŸ:u  @xx8พ๚๊+„‡‡นm033S{QูฤB๓t๚uุุุ _ฟ~ Czz:–/_.ฯ๘๐แC<}๚rน*Tภร‡ฑqใฦWZ‡กก!พ๒K9r‘‘‘ุฝ{7jึฌ‰ฉSงhkgg'฿ตkœ'Ož„ทท7ยรรแ๏๏ำงOc๒ไษptt|ฃํ'""ขฒAWPAฑฑฑ˜2e ๔๕๕aaaๅห—รฺฺ~~~ะััAถm1n8t๎ตjี‚|}}_{} …QQQx๘qัJˆŒŒD๏ฝ1n8cม‚cccDGGK…'ั๓d‚๗ง!-R*•077Gํy 2*už์บชtV๔หษษALL ‚ƒƒกงงงํp>(ฬฝv0๏ฺรk&sŸ––V์ip>|ˆูณgใไษ“HJJยž={””x๔่QฉวHDDD๏2_hฆคค ~๚P(๐๐๐ภกC‡ิžŸ?#GŽDRR "##ฑhั"t่ะ่ึญ๎นƒะะPิฉS 6ฤล‹QQQ๐๖๖†‡‡พ๘โ จT*@ใฦ///x{{#..อš5C•*Uฐy๓ๆ"c7nพ๘โ ๘๚๚โ๛๏ฟวฅK—๐้งŸขvํฺ ย;wŽŽŽx๚๔)`ัขE>|8เป๏พCอš5แ้้‰ศศH(ฒ็%''ใวDอš5ฅmห_‡นนนศสสBvv6T*,,,mฺดA‡ฐs็N!J๔zdeeAฉTช=ˆˆˆจl*๓…ๆฒeห€๘๘xœ8q{๖์Q{๎เเ€I“&ม๑๑๑๘๎ป๏‰‰‰ุดi–.]ŠกC‡b์ุฑˆ‹‹รดiำ0lุ0@งNp๘q$&&ยศศ7n”ึkaaSงNกAƒ8p 6oŒu๋ึaโฤ‰ลฦ{ๅส์ทSงNล€0|œ8q_}๕~๚้ง"—{๐เVฏ^ณgฯ"!!_5ูG^^6lุ€เเ`ดkื•+Wฦษ“'แๅๅฅึฏ……† {{{ุุุ }๛๖ฐตตฤฦฦขOŸ>˜;w.๐๋ฏฟโ๛ลn_DDฬออฅ‡ฝฝ}ฑํ‰ˆˆ่ฅซํ4อ={๖„\.GวŽัฐaCต็...….SSSภ๎ปq๖์YižŽŽ !!ฃF‚RฉDjj*์ํํ hีชภ2™ †††pssร7ŠทM›6ะำำCzz:<(๕———‡ชUซนœนน9LLLะซW/ดiำ-[ถ,ถ6mฺเฬ™3Xผx14hPdฟ=ยถmpใฦ ศๅr4kึ กกกpuu…L&รงŸ~ŠO?๗๎ระกCagg‡ซWฏJล่‹FŒ!๊ T*Yl•Qeพะlิจ๖ํ‡7ข}๛๖˜={v็…pฦฦฦา฿2™ 'Ož„\ฎ>ปwolูฒีซWวฏฟŠวK๓๔๕๕rน\ํ๏—{™ฟ^•J…ส•+#>>พ@้0}VV@WWqqqุถmขฃฃฑfอ๖oE๖฿_~๙%ฺถm‹^ฝzกz๕ฺ๊ํนีชUƒนน9 I“&8qโ\]]?ฦŠ+0|”+WK–,••U‘g``ƒbs@DDDeC™?t~๚uุุุ _ฟ~ ริž'%%มิิ้้้E๖ัฐaC้b!•J%] “‘‘J•*แ้ำงXฑbล[*Tภ๖ํ<ปP็นsฤววCฅRaำฆMž|iii ม”)S_lnnn๘๗฿q๊ิ)Tฏ^]บtA“&Mœœฌ‡>,ฃน~8;;พ๖[้<ื%K–`็ฮุ่ฑฃ4โKDDDถ2_hฦฦฦยรร^^^ุฟ?ีžwํฺ๐๐๐€‡‡‡tอ๓fอš…-[ถภำำnnnา=#GŽฤ'Ÿ|‚&Mš8ท๑mˆŽŽFdd$<==กP(p๔่QภจQฃะฝ{w๘๙๙I‡จำำำัฒeKxzz"44T:ณจ>๒•+Wฝz๕ย๑ใว๑๋ฏฟBWW}ืืM›6…Bก€Bก@ำฆMQฏ^=@@@ฮŸ?ศศHTซVํญo?ฝ฿dขค— i€Rฉ„นน9†l]ำ2&ว;ใ็บƒเเ`่้้i;œJNNsฏฬป๖0๗ฺฃษ็งฅฅมฬฬฌศve~D“ˆˆˆˆดƒCHZฐm6๐รjำ‚‚‚0y๒d-EDDDD๔๖ฑะิ‚ภภ@j; """"โกs""""าšDDDDค,4‰ˆˆˆH#Xh‘Fฐะ$""""เU็๔Nๅ#,,,ดฦ#''G!ั€#šDDDDค,4‰ˆˆˆH#x่œ ซฏ.ƒัรB็uw๎UสััภM""""าšDDDDค,4‰ˆˆˆH#Xh‘Fฐะ$""""`กIDDDDมB“ˆˆˆˆ4‚…&i M""""าš๏€ิิTฬŸ?_aจูฐafฮœ ธy๓&แๅๅ…บu๋"11Qหัั๛€…ๆ; ธB3//ฏTcy๔่ $$ƒ L:]ปvลฉSง0rไHŒ?––!DฉฦGDDD๏š–’’‚๚๕๋CกPภรร‡R{~yŒ9IIIP(ˆŒŒฤขE‹ะกC๘๛๛ฃ[ทnธs็BCCQงN4lุ/^DEEม๘โ‹/ Rฉ7Fxx8ผผผเํํธธ84kึ UชTมๆอ› ฤ˜››‹5kึ y๓ๆ8p `ัขE>|ธิFฉTJฺุุ๖๏฿Zตja๒ไษธ{๗ฎF๓HDDD๏šถlู2 >>'Nœภž={ิž;88`าคIpwwG||<พ๛๎;@bb"6mฺ„ฅK—b่ะก;v,โโโ0mฺ4 6 ะฉS'?~‰‰‰022ยฦฅ๕ZXXเิฉShะ ˆอ›7cบu˜8qขิๆๆอ›3f \\\ฐiำ&L˜0ัััถa๘๐แXธp!์ํํ1rไHŒ=ะชU+์ปภณโ6,, ฑฑฑลๆ#++ JฅRํADDDe“ฎถ(๋ผฝฝัณgOศๅrt์ุ 6T{๎โโR่rAAA055์ฝgฯž•ๆ้่่0jิ((•Jคฆฆยกกกžเ๎๎™LCCCธนนแฦ€cวŽมฯฯC† A\\ฬฬฬІb๗ซฏพBtt4† ‚eห–ฌฌฌ0|๘p๐รุดi:v์ˆฐฐ0ฬš5ซะพ"""คC๏DDDTถqDSร5j„}๛๖มาาํทGNNŽฺ๓]ปvบœฑฑฑ๔ทL&รษ“'/„@๏ฝฑhั"$%%a๐เมศสส’–ัืืศๅrตฟ๓ฯ๙๔๐๐ภผy๓pเภดo฿+WฎDvvvกฑ,XฐํฺตดkืGU›๊ิ) 0แแแ๘๊ซฏ^d>FŒดด4้q๓ๆอb๓GDDD๏/šv๚uุุุ _ฟ~ ริž'%%มิิ้้้E๖ัฐaC้b!•J…คค$@FF*Uช„งOŸbลŠฏ—กก!พ๒K9r‘‘‘ุฝ{7jึฌ‰ฉSงhkgg'฿ตkœ'Ož„ทท7ยรรแ๏๏ำงOc๒ไษptt,rฝ033S{QูฤC็‹)Sฆ@__่ึญ<<<ค็ห—/‡……<<<เแแnบกRฅJj}ฬš5 }๛๖ลœ9s““ƒ๎ปร#GŽฤ'Ÿ|+++xyyฝvŒ …QQQx๘qัJˆŒŒD๏ฝ1n8cม‚žบFGGK…'ั๓d‚๗ง!-R*•077GิฑY027,ดMw็^ฅUู—““ƒ˜˜COOOแ|P˜{ํ`ต‡นืMๆ>๛;--ญุฃ“(ฬป๖0๗ฺมผksฏ=๏B๎9ขIDDDDมM""""าšDDDDค,4‰ˆˆˆH#Xh‘Fฐะ$ญ™3gahh;vL!•9ใฦƒL&S{ิฌYSš๔้S 0011A๛๖ํq็ฮ-F~ฺทoZทn [[[ศd2ฌ[ทNmพcฦŒ ŒŒŒ€K—.ฉตy๘๐!>s˜™™ก|๙๒๘๊ซฏ๐๘๑ใRŠ๗ำหr฿ณgฯ๏   ต6ฬซ‹ˆˆ€ทท7LMMaii‰6mฺเย… jmJ๒๙rใฦ ดlูฦฦฦฐดดฤw฿}‡า”๗JI๒ธqใ๛|฿พ}ีฺ”fYh’VฌXฑร† รุฑcq๒ไIxzz"00w๏ีvheŽซซ+nบ%=8 อ:t(6nˆUซVa๏ฝHIIAปvํดํ๛)##žžž˜3gNก๓งL™‚™3g"** GEนrๅˆงOŸJm>sœ9s;v์ภฆM›ฐo฿>|๕ืฅต ๏ญ—ๅ‚‚‚ิห–-S›ฯฟบฝ{๗bภ€8rไv์ุœœ4oR›—}พไๅๅกeห–ศฮฮฦกC‡๐ื_aัขE3fŒ66้ฝP’ผ@๏ฝี๖๙)SฆH๓J=๏‚H ๊ึญ+  =ฯหหถถถ"""B‹Q•=cวŽžžž…ฮKMMzzzbีชUาดs็ฮ โ๐แรฅaู@ฌ]ปVzฎRฉ„ตตตˆŒŒ”ฆฅฆฆ ฑlู2!„gฯžฤ๑ใวฅ6[ถl2™L๗฿ฅ๛๛๎ล !D=Dhhh‘ห0๗oวปwฑw๏^!Dษ>_bbb„\.ทo฿–ฺ๑วยฬฬLdee•๎ผง^ฬปB๘๛๛‹มƒนLi็#šT๊ฒณณqโฤ Hำไr9p๘๐a-FV6]บt ถถถจRฅ >sธqpโฤ ไไไจฝ5kึฤวฬืแ-บvํn฿พญ–gsss๘๘๘Hy>|๘0ส—/:u๊Hm —หq๔่ัRนฌ‰…ฅฅ%jิจ~๚แมƒา<ๆํHKKTฌX@ษ>_> wwwXYYImกT*qๆฬ™RŒ๕b๓EGGใฃ>‚››FŒฬฬLi^i็]๗ญ๗H๔๗๏฿G^^žฺNVVV8ผ–ข*›|||ฐhั"ิจQทnย๘๑ใัฐaCœ>}ทo฿†พพ>ส—/ฏถŒ••n฿พญ€ห \ถฟ็ฯป}๛6,--ีๆ๋๊๊ขbลŠ|-PPPฺตk'''\นr?๘#Zดhร‡CGG‡น T*† ‚๚๕๋รออ J๔๙r๛๖ํB฿๙๓จx…ๅบtฺฺุ้"11?๐.\ธ€5kึ(ผณะ$*รZดh!ํแแ888`ๅส•022าbdDฅ#,,L๚จZต*bccัฌY3-FVv 0งOŸV;›4ฏจผ?~ฑปป;lllะฌY3\นrUซV-ํ0y1•พ>๚:::ฎ>ผs็ฌญญตี‡ก|๙๒pvvฦๅห—amm์์lคฆฆชตแ๋๐vๅ็ฒธฺฺบภ…pนนนx๘๐!_‹ทฌJ•*๘่ฃp๙๒eฬ›8p 6mฺ„={๖ภฮฮNš^’ฯkk๋B฿๙๓จhEๅฝ0>>> ถฯ—fYhRฉำืืGํฺตฑkื.išJฅยฎ]ปเ๋๋ซลศสพวใส•+ฐฑฑAํฺตกงงง๖:\ธp7nเ๋๐999มฺฺZ-ฯJฅG•๒์๋๋‹ิิTœ8qBjณ{๗nจT*้K‚Ž<€ ๆu !0pเ@ฌ]ปปw๏†“““ฺ’|พ๘๚๚"))Iญะ฿ฑcฬฬฬเโโR:๒žyY j๛|ฉๆญ_^DTห—/bัขEโ์ูณโ๋ฏฟๅห—Wป Ž\xxธˆืฎ]โฃ>w๏Bัทo_๑๑ว‹ปw‹ธธ8แ๋๋+|}}ต๕๛'==]œ:uJœ:uJำฆMงNืฏ_B1y๒dQพ|yฑ~z‘˜˜(BCC…“““x๒ไ‰ิGPP๐๒๒GีซW;wึึ&ฝ7Šห}zzบ๘๖oลแร‡ลตkืฤฮ;ล'Ÿ|"ชWฏ.ž>}*๕มฟบ~๚ sss+nบ%=233ฅ6/๛|ษออnnnขy๓ๆ">>^lบUTชTIŒ1B›๔^xY/_พ,&L˜ โโโฤตkืฤ๚๕๋E•*UDฃFค>J;๏,4Ikfอš%>๘cกฏฏ/๊ึญ+Ž9ขํสœฯ>๛Lุุุ}}}Qนre๑ูgŸ‰ห—/K๓Ÿ>•‹›จจ(„††ยฤฤไถใm;sๆ |}}Ke]ฑฑฑจVญšฺดž={bโฤ‰ฏงณณ3ฌญญฑqใฦ7 จฬaกIDTŠ*WฎŒu๋ึIฯืฏ_›ํถo฿ŽวใฦศฮฮฦO?ค6๋ึญ zฅu/Xฐ;w~ญธ_Ennฎฦื๑ฎศ฿ึฮ;c๙Zކ่รB“ˆจu๎ัััา๓ฟŸy‘ํห•+‡œ;wNmz~ก๙ไษt๎+VDลŠัฐaรB๛นqใRRRเ๎๎.MsttDdd$jีชSSSŒ3.\@:u`nnŽพ}๛JmU*ฦŽ {{{ุุุ`ะ Aศสส,ZดMš4AŸ>}`nnŽ… โแร‡่าฅ ,--QฅJ๕ื_Enใ๓‡ม7mฺ„5jHฃผห—//rนC‡มูู๘๖oกRฉคysๆฬA๕๊ี๑ัGกGศศศ@^^ZดhซWฏยฤฤ&&&๘๋ฏฟŸ~๚ &&&า6'%%กQฃFจPกjืฎธธ8ฉo™L†ูณgรษษ Mš44jิปvํ๚ ŠlขDDT*Dllฌฐณณw๏w๏vvvโภยมมAญ๛…Bคฅฅ‰ึญ[‹ฑcวJ๓•Jฅฐถถyyyโ?ญ[ท™™™"''G์ทฏะuoฺดIิฎ]ป@<โมƒโนsยภภ@|๚้งโฦโึญ[ยสสJ์ฝ[!ฤผy๓„‹‹‹ธy๓ฆธพ๐๓๓“bZธpกะัั .yyy"33S‹๐๐p๑๔้Sq๎9acc#ŠฬK๖ZYY‰!„ธu๋–8sๆL‘ห( q๋ึ-๑฿ 1|!„+Wฎnnn"99YdffŠฮ;‹๐๐p!„{๖์UซVU๋ซGโงŸ~’žงงง [[[ฑz๕j‘››+ึฎ]+์ํํล“'O„B!!!"--MdffJห™™™‰๓็ฯ/ั‡Š#šDDฅHGG:tภŠ+ฐbล ดo฿:::ฺตhัๅห—G… p๑โE๔๋ืOšทkื.๘๛๛C.—COO<ภีซWกซซ[ไˆfjjjก็f4+VDอš5แ้้‰   ุรฺฺHHH,_พ฿~๛-์์์`aa1cฦ`ูฒeR?UซVEฯž=!—ห‘––†ุุXDDDภภภ5kึD—.]ฐfอš—ๆGOO็ฮรใวamm —"<ึึึฐตตละกCฑbล ฯN1b`dd„ซWฏ~้บ๓mฺด ฎฎฎาkำฆMXZZโศ‘#R›แร‡รฬฬ FFFา4SSSคฅฅ•x=๔ฺนฟPfฟเ฿•?ฉต=ย“ถ1qEไฦHS”นั.XRฎธฃ\Q”Rฤ๎vฑนปYศ…?7ขp!"ฅ๙3"[–‹๗Bž๘ูฦ๛ึ^ฟ7฿ฯี9=็์œณซoฯ9็กŸ€A“ˆ่/khh€อfƒีj บm>33วŸฯƒม€สสJู้๓™&“ ฅฅฅจฉฉVซE___ภ฿S*•o›‹ข(•cbb>ิ_๛œ!99Yzฆีjqvv&ี5Tv:ธฟฟGBBA€ ร๙๙yศ&''1== FƒŠŠŠGJJJzWvน\า๘---าุธผผt์ท๓_ZZ’๚ ‚€ ๋}ๅ๕zกT*ฟ<ัOภ ID๔—ๅไไเ๚๚nท:.d่่h˜L&ฌฏฏใ๊๊ ภหE!ฝ^ˆŠŠBww7๖๗๗177‡กก!,..~๘ฌฌ,๑œU*œNงTw:PฉTR]&“IeตZ น\ท ววฏื‹ัััOวษหหƒรแภลลฒณณ฿ฝษฏใใใwๅืKUjต‹Eใ๑H7฿ฮ3ะ_๛๋๕๚๋๋๋ƒ๖9??‡฿๏GZZฺงk$๚I4‰ˆพมิิิ—ถ’aณู Š"โโโฐทท…B!…ช……looใ้้ …ทโตZ-ฑตต๕G๓ญญญลภภNOOq}}žžิีีlซVซ‘ŸŸฎฎ.๘|>๘~lll`gg'ไฐูlธนนAdd$ไryภตผฦลล\.a4MMM่ํํ•‚ตหๅย์์,€—7ธ———๏>1%Š"ŽŽŽคzUU677aทแ๗๛qww‡ูููโหหห())ADDDศ54 šDD฿ ###ไ๙ร๒๒rศๅrฤววcaavป2™์รg\.  t:ZZZ‚žำ4›อ๏ฮUณูŒššไๆๆ"##ููู่์์ ฺjตโไไฉฉฉEmmmธปป๛t‹ลญV‹ุุXฬฯฯcdd$h[ฃัˆยยBdffขฌฌ ^n๖›อfTVVBกP จจH น้้้จฎฎFRRA๐LWWW!Z[[กT*แp80<< Q‘’’‚๑๑๑๓ž˜˜@ss๓ง๋#๚idฯฯฯฯ฿= ""๚šŠŠ ttt ธธ๘ท๛Bงำammํ๗ั๖ูมมL&VVVnอd šDD~ดทท#22๒ปงBD๔)M"""" žั$"""ขฐ`ะ$"""ขฐ`ะ$"""ขฐ`ะ$"""ขฐ`ะ$"""ขฐ`ะ$"""ขฐ`ะ$"""ขฐ`ะ$"""ขฐ`ะ$"""ขฐ๘4ต6g๘ศIENDฎB`‚c4core-bm-charconv-atox-mega_bytes_per_second-u16.png000066400000000000000000001041631477602032300327120ustar00rootroot00000000000000c4core-0.2.6/doc/img/linux-x86_64-gxx12.1-Release‰PNG  IHDRคฺˆ 9tEXtSoftwareMatplotlib version3.5.1, https://matplotlib.org/ุa๒ฝ pHYsaaจ?งi‡เIDATxœ์wXื๛6๐{้ E%€ ฐ‡ฒ€€HทPQEฟHฌ‰ฦS460–ฤฃ –ฤŠ%๖๖ป EEQฑ—h„E”บ๓แห\ฉขf๏ฯuํ%;็ฬ™gๆ หใ™3ณ2AIDM๊ˆˆˆˆ่รฦ„”ˆˆˆˆ$ล„”ˆˆˆˆ$ล„”ˆˆˆˆ$ล„”ˆˆˆˆ$ล„”ˆˆˆˆ$ล„”ˆˆˆˆ$ล„”ˆˆˆˆ$ล„”ˆˆˆˆ$ล„”่?’šš ™L†ูณgKJฑZดh;;;ฉร(3™L†กC‡JU"GށL&ร‘#GคๅƒืงO่๋๋Kฦ{ืงOXYYIF…ว„”>(ษษษGjjชิกIโไษ“GZZZ™๊งคค`ิจQ๐๐๐€ŽŽd2Yฑฟ?2™ 2™ ๚๕+ฒ|๘๑bว—sฯฺตk1ทnง"ฉŠ๛Dๅ๐๐๐"ห6lุ€=z aร†ษdhัขE‰m?AAAจYณ&๔๔๔`gg‡ ผณxR๚ $''#""‚ )}ฐNž<‰ˆˆˆ2'คงNย‚ ‘‘O>๙คิ๚:::ุผy3rrr •ญ[ท:::orฑส“ผ๙๘๘เล‹๐๑๑ygqผKLHซžฅK—"%%ฅ\๋FGG#""ขศฒ_ทoGบuQฃFูทo๑่ั#Lœ8?๔ฺทo;w๎ผณx–ฦ{i•ˆ่=YYYะีี•:”J%33ีชU{ใ๕‚‚‚––ฬž= %ึoำฆ v์ุ˜˜t์ุQ\~๒ไIธq]บtมๆอ›฿8Žท•••---จฉฉฝำค˜*ถŠ๐yกฉฉ๙^ฺ]ฝz5jืฎ 55ตงZ) ๔๊ี ุดiิิ*ๆXdลŒŠ่ ผyƒFใฦกซซ ccctํฺUe$tลŠฺ่ต+ eห–โฅรW็’๒ห/ฐตต…ถถ6,,,0dศ•‘คฝ{CGG—/_Vู~@@jิจ{๗๎•)y๓ๆมาาบบบ๐๕๕ลล‹ ีนrๅ BBBPณfM่่่ภลล;v์Pฉณbล ศd2œ8qฃG†‰‰ ชUซ†เเ`๓ฯ?…ฺŒ‰‰ฏฏ/ `hhWWWฌ]ปถPฝไไdดlูzzzจ]ป6fฮœฉR^0๏?@DDjืฎ „„„ ==ููู9r$LMMกฏฏพ}๛";;[ฅๅห—ฃUซV055…ถถ6lll๐๋ฏฟŠลสส ํทวฝ{แโโ]]],^ผธุc;u๊Tจฉฉแ็Ÿ—บu Wฎ\)vWeee!<<5‚ŽŽฬออันsg๕ื_bฬฬLŒ3u๋ึ…ถถ67nŒูณgC•ถ ๆธnถ vvvะึึ†ญญ-๖์ู#ึูดid2Ž=Z(–ล‹C&“ฉœor^=zƒ†ฉฉ)๊ิฉƒ๐๐p|๕ืkkk๑w ค+5kึ„A™Žิฎ]>>>…ฮซจจ(ุ—yŽrFFFŽ +++hkkริิŸ~๚)ฮŸ?เๅ|็ปwใๆอ›โ~ฬำ+8?ืฏ_ & vํฺะำำƒBก(riม้าฮ{เๅgMPPชUซSSSŒ5 {๗๎-ิๆตkืะฅKิชU :::จSงBCC‘žž^์>—ดO๐่ั#|๑ล033ƒŽŽฐrๅส2ฯ‚฿ฃใวฃYณfะััAฝz๕ฐjี*•zแแแษd…ึ/8ง^=W ฺlmmกฃฃ333 0OŸ>-r?‹๚ผุฟ?ผผผPฝzu่๋๋ฃqใฦ๘๎ป๏Tึ/๋gEQว(zŽ๒๋sH_ฝŸ`ษ’%จ_ฟ>ดตตแ๊๊Šs็ฮฉฌทhั"7ๆีพฉ[ทn™’หตkืโแร‡˜6mิิิ™™ ฅRY๊zฏ+-žทลRชฮ;‡“'O"44u๊ิAjj*~๕Wดhัษษษะำำƒ†Ž เป๏พ/?Žˆˆ๘๙๙aะ AHIIมฏฟŠs็ฮแฤ‰ะิิฤO?„C‡กw๏8u๊ิีีฑx๑b์ทซWฏ†……EฉฑฎZต 2dฒฒฒ๐ำO?กUซVธpแฬฬฬ—.]‚งง'jืฎฑcวขZตj๘ใ?ะฉS'lผมมม*m6 5jิภไษ“‘ššŠ๙๓็c่ะกุฐaƒXgลŠ๘๓ฯakk‹qใฦกz๕๊ˆวž={&ึ{๚๔)ฺดiƒฮ;ฃ[ทnุดiพ๖[ุฃmถ*1ctuu1v์X\ฟ~?3455กฆฆ†งOŸ"<<งOŸฦŠ+`mmI“&‰๋๚๋ฏฐตตEPP444ฐs็N <JฅC† QูNJJ บw๏Ž hธq‘วvย„ ˜>}:/^Œ๛‹ห{๕๊…ฃG๚#๗บ|ดo฿Dhh(FŒŒŒ ์฿ฟ/^D๚๕!‚‚‚p๘๐a|๑ลpttฤฝ{๑๕ื_ใ๎ป˜7ožJ›วว–-[0x๐``ม‚่าฅ nบcccB__๑|}}Uึฐalmmล$๎Mฯ‹มƒรฤฤ“&MBff&ฺถm‹ซWฏbบu˜7o>๚่#€‰‰I‰วๅM………aฤˆx๖์๔๕๕‘——‡7b๔่ัศสส*SฤฆM›0t่Pุุุเษ“'8~8._พŒฆM›b๘๑HOOว;wฤc๚ 2฿=ดดด๐ีW_!;;ZZZลnฏ,็}ff&Zตj…๛๗๏cฤˆจUซึฎ]‹ร‡ซด•““ƒ€€dggcุฐaจUซ๎ฝ‹]ปv!-- FFFEฦPา>ฝx๑-Zดภ๕๋ื1t่PX[[cใฦ่ำงาาา0bฤˆR้๕๋ื‚/พ๘ฝ{๗ฦ๏ฟŽ>}๚ภููถถถฅฎ_\›aaa0`z๔่ูณgฃC‡ˆŒŒฤw฿}‡มƒx๙Yัญ[7คคคจ$Q๙๙๙hำฆ š7oŽ™3gbฯž=˜aศ!‚ ย˜1c555aลŠ…๊์Wi~w€0w๎Beวiถmbฟ*$$Dษdย๕๋ืUโำาาRY–˜˜(~๙gqY๗๎SSS!//O\v}AMMM˜2eŠธ์Mฯ ///•6Afอš%nธQ๊๑x]i๋๔วฟ+hii ซWฏAv๏-ศd2!55U˜>^ lธฑฤ๘฿dŸๆฯŸ/ึฌY#.หษษ}}}AกP”ุnม๏ัฑcวฤe=ดตต…1cฦˆห ๚็u็ิซ}_ะๆษ“'ลeŸบบบยอ›7ลๅ‹/.t{๗๎-† &.S*•B``  ฅฅ%ž#๙ง@ˆŠŠR‰iฯž=…–๗y1oผ2weฌ(๊xBั็W๏ฝU๚ดเoฑฑฑ๐๏ฟŠหทo฿.v๎).2dH™โฑตต|}}‹,“หๅ‚žžž งง' 6Lุผyณ0lุ0€Zjฏ*k<ๅมK๖T%ผ:?(77Ožz๔่!พืาาBณfอ๐๗฿ฺ—^ฝzฉŒLธนนA|๙็*๕p๛๖mไๅๅ‰ห^ํณ๔๔t<~พพพ๘๛๏ฟ ]ึดถถF@@@กํ/็ˆ :?๔ึฌYƒฝ{ชsไศ‘2xlผ}๔† Vจฌเ8EGGC]]ร‡W)3f A@LLŒสr???ิฏ__|/—หahhจr<๗ฟแัฃG*—๙6mฺฅR‰๏สw^๔๏฿๊๊๊ฅ๎๗ปVฃF ดiำ๋ึญ๐r$ศรร–––enฃz๕๊8sๆL™งมฅw๏ež;X–๓~ฯž=จ]ป6‚‚‚ฤe:::*ฃ๑ฤะฝ{๗โ๙๓็ๅŽUัััจUซบw๏..ำิิฤ๐แร๑์ูณ"ง|ผฮฦฦโ{4nธศ฿ํฒฒฑฑปปป๘ออ ะชU+|๑ว…–ตญWV0อ%''lธFFF๘๔ำOล๓๑ใวpvv†พพ~ก๊ข>/ชWฏุพ}{‰—ซห๚Y๑.๏Sนฉ oฆ?Š๒์ู3<ฝz๕ย‚ ะนsg,Xฐ ภ๚๕๋qํฺตwบฝ๒bBJUย‹/0iา$qN฿G}คฅฅ•8gซ@Aโ๖๚ฅ`---ิซWO,/0{๖lิฌY Xฐ`LMMหkร† -kิจ‘8้๚๕๋'N„‰‰‰สk๒ไษ^ฮ%{ีซฤน‚๙U๓ห2ฏN:…’ิ5jšซUิv ืญ[ทะrฅRฉา'Nœ€ŸŸชUซ†๊ีซรฤฤDœฯUTBZœUซVaัขE๘๙็ŸUX—ว_…ฦCCฃ๘ูL7o„……Eกy•S?^?W^?F@แใูฆMฉLฑุฐaัจQ#ๅ;/J:n๏[XX๖๏฿[ทnaถm*ำBสbๆฬ™ธx๑"๊ึญ‹fอš!<<Pฟษ—ๅผฟy๓&๊ืฏ_จ^ƒ mw๔่ัXถl>๚่#`ัขEe๚,*ฮอ›7ัฐaรBs‹;๏ŠR–s๑Mฝษg€BRSSCฝz๕T–œ๓Ÿ‰ืฎ]Czz:LMM ๛ฯž=+ำyฟžžž่ืฏฬฬฬŠ?๘ฃ\s)฿•า>ท฿•‚”ฝ๙X๐;y๊ิฉwบฝ๒โRช† †ๅห—cไศ‘pww‡‘‘d2BCC฿หN||ผ๘!xแย…ทN„^U๏W_}U์จเ๋‹+ฯ๔฿คญโ๊–ึฦ_…ึญ[ฃI“&˜;w.๊ึญ ---DGGcผy…๚ฌคQ.OOO$$$`แย…่ึญjึฌYl])”ๅxjkkฃSงNุบu+~๙ๅ<|๘'Nœภ๔้ำล:ๅ9/คผณ8((ฺฺฺ่ป7ฒณณัญ[ท7Zฟ[ทn๐๖๖ฦึญ[ฑo฿>ฬš5 ?๘#ถlูRh.sqd฿ๅ๏ฬ™3}๚๔ม๖ํฑo฿> >3fฬภ้ำงQงNrต๙ถสฒลค’ŸŸFmพหใฉT*ajjŠจจจ"ห_Ÿ]Tฟ๋๊๊โุฑc8|๘0v๏={๖`ร† hีช๖ํ๗ฦW๔8ๅ]ŸsลฑฐฐภฅK—ฤ{  คผ๋ธผ˜R•ฐiำ&๔๎sๆฬ—eeezึbq"—SRRTทž““ƒ7nภฯฯO\–™™‰พ}๛ยฦฦ˜9s&‚ƒƒแ๊๊ZฆX‹บใววแร‡฿๘w๊ีใ๔ชw}œล9๎์์Œ๛๗ใ๎ป*W ฆรผษM๏๓wŽ—์ฉJPWW/๔ฟสŸนะV žร๘๚‡ˆŸŸดดดฐ`ม•v~๛ํ7คงง#00P\๖ํท฿โึญ[Xนr%ๆฮ +++qจ,ถmฆ2ื๏์ูณ8sๆŒ๘Gึิิ-Zดภโล‹qB๋๕8งา๘๛๛รภภ3fฬ(t—๓5_๊U#ฏn;==ห—//W{rนัััธ|๙2:t่€/^จ”—๕Q.]บtมใวฑpแยBeฑถkื๙๙๙…๊ฬ›72™ฌฬฃwฏ๓๓๓Cอš5ฑaรlุฐอš5Sน๔๘ฎฮ‹โ~‡ฏพ๚ “'Oฦฤ‰฿hฝB—ทMMMaaaก๒{VญZตทบ ฆp๗๎]•วleeea้าฅ*๕ …ส|iเerชฆฆV๊็Dq๛ิฎ];พ๛B๋ๆๅๅ•้\๗฿ -stt•>)๋gEQว)??K–,)u7๑.~_ ฎN๖o*ห—-[ Rฟแ้]วSސR•ะพ}{ฌ^ฝFFFฐฑฑมฉSงpเภซิstt„บบ:~๑GคงงC[[[|ๆธqใ6mฺ (()))๘ๅ—_เ๊๊*์p่ะ!๒ห/˜สฅWฏ^XตjFณgฯย™™™8pเŒŽ;ขC‡hูฒ%ฦิิT888`฿พ}ุพ};FŽฉrำ›ะิิD็ฮฑ~zdffb๖์ู…๊ผ‹๓ยููภหG …††BSS:t(๖ก๙้้้โ3] ‘ณpแBTฏ^ีซWWน!ๅuppp(5ฆืedd N: ƒƒ๔๕๕qเภœ;wNๅ*ˆณณ36lุ€ัฃGรีี๚๚๚่ะกรoฏฌ €… ข{๗๎1bฬออ%(X0zt่ะ! :]ปvEฃF——‡ีซWC]]]บt)qลํำ—_~‰ล‹ฃOŸ>ˆ‹‹ƒ••6mฺ„'N`๙ๅพ*๐:|๑ว๘โ‹/๐๕ื_C]]ฟ;LLLp๋ึญwฒW้่่`ฯž=่ป7ƒปwใป๏พG๎|}}1`ภฬ˜1 ๐๗๗‡ฆฆ&ฎ]ป†7โงŸ~BHHH‰™2e Ž;†ภภ@XZZโัฃG๘ๅ—_PงNxyy‰๕ส๚Yakk‹ๆอ›cธq๘๗฿QณfMฌ_ฟพะDVม๏๋๐แรuuu„††x™ $ฤ๓233ลัw๑ศœœœ๐๙็Ÿใ๗฿G^^|}}qไศlธใฦ+ำใ หฯ[{/๗๎วž>}*๔ํW๘่ฃ}}}! @ธrๅŠ`ii)๔๎[ฅ๎าฅK…z๕๊ ๊๊๊…ฯฑpแBกI“&‚ฆฆฆ`ff& 4Hx๚๔ฉ ‚ P(KKKกiำฆBnnฎJ›ฃFิิิ„SงNcมฃ>fอš%ฬ™3Gจ[ทฎ ญญ-x{{ ‰‰‰…๊๕ื_Bฏ^ฝ„Zตj šššBํฺต…๖ํ ›6m๋๖ฉภ๖ํ แ๛Ÿ๘ฏฒ>สE^>Žj๘๑‚ตตต ฉฉ)ิชUK ๚๋/ฑNFF†0jิ(มยยBะิิ6l(ฬš5KๅZลลWฐOฏŸ—‚ ๛๗๏2™Lธ}๛v‘๑ฝอyQเ๛๏ฟjืฎ-จฉฉ•๚จ‚๓ถจื๋'*n_U–ว>egg _ตเเเ ีชU„_~๙Eฅณgฯ„ฐฐ0กz๕๊*๑w~พZ๖๚cŸสr ‚ ๗฿B``  ซซ+˜˜˜cฦŒ6o,NŸ>-ึ๙๓ฯ…๚๕๋ :::Bอš5…–-[ (๑ุ”ดO‚ >?็ดดด{{{a๙๒ๅฅถ)ล๙๚๚z\P\\œเๆๆ&hii ฑ0w๎b๛TT›Eฏ~่ปทPญZ5แฏฟ===มฬฬL˜ฅ๚พำE&คDDDDฐไไไRฟฆ๗]=ป8LH‰ˆˆˆHR|0>IŠ )Qw๛๖m่่่ˆถฏ Ž9™L†#GŽผu[-Zด€U4o\ๅK6ˆ* &คDDeฐbล ศd2ศd2?~ผPน จ[ท.d2ฺทoฏRVฐ^มซZตjฐฑฑมิฉS๑๙๓"ทwแยศd2œ={๖ญcŸ2e เ้้๙ึmQูLŸ>ถm+ดไษ“o_๚ํท฿bัขEx๐เม{iŸ่}aBJD๔tttฐvํฺBห=Š;w๎@[[ปศ๕>๔Sฌ^ฝซWฏฦœ9sเไไ„‰'ขw๏Eึ฿ฝ{7LMMแ๊๊๚V๑๓ฯ?Xนr%๘VํT4>>>x๑โ…๘๕ˆMI iDDฤ{KH;v์CCC๒ห/๏ฅ}ข๗…ฯ!%"zํฺตรฦฑ`มhh฿Gฺ่ตkแ์์Œวน^ฃFะฃG๑ภ‘““ƒ-[ถ ++K>๔ัััhถญ๘่ๅตfอhhhผื๏xS™™™จVญฺ[ตกฆฆV่˜}ศž?===จฉฉ!$$ซVญBDDฤ[Ÿ?Dސฝ๎ปใษ“'ุฟฟธ,''›6mBXXุตUซV-ศd2•ฤาาาp๒ไIŠหึฏ_gggภะะ๖๖๖๘้งŸJฦถmเๆๆ}}}•ๅ๓&“’’เ๋๋ ===4hะ›6m๐rฤืออ บบบhธ18Pจํ๘๘xดm†††ะืืG๋ึญq๚๔i•:SŽ=Šมƒริิu๊ิหcbbเํํjีชมภภธt้Rฉ๛UิาkืฎกK—.จUซtttPงN„††"==ฝิ๖ ..ะีี…ตต5"## ีษฮฮฦไษ“ั Ahkkฃnบ๘ๆ›o-ึ‘ษdศฬฬฤส•+ลi}๚๔Axx8พ๚k€ตตตX–šš*ฎปfอ8;;CWW5kึDhh(n฿พญCA฿ลลลมววzzz๘๎ป๏ฤ๒O?7oDBBB™๖›จ"`BJD๔ฌฌฌเ๎๎Žu๋ึ‰หbbbžžŽะะะbืหสสยใว๑๘๑cผykืฎลส•+V(!ปw/d2๛๗๏G๗๎QฃF ๘ใ๘แ‡ะขE‹RoRสออลนs็ะดiำ"หŸ>}Š๖ํรออ 3gฮ„ถถ6BCCฑaร„††ข]ปv๘แ‡™™‰dddˆ๋^บt HLLฤ7฿|ƒ‰'โฦhัขฮœ9Sh[ƒFrr2&Mš„ฑcวVฏ^ภภ@่๋๋ใวฤฤ‰‘œœ ///•$ญ,rrr€ำงOcุฐaXดhพ๒K๗฿eบ<๔้Sดkืฮฮฮ˜9s&๊ิฉƒAƒแ๗฿๋(•Ja๖์ู่ะก~๙gt๊ิ ๓ๆอSy0๊ีซกญญ oooqšฦ€ะนsgt๏0o<ฑฬฤฤ0mฺ4๔๊ี 6ฤนs1rไH>>…๖แษ“'hถ-1|ดlูR,svv€*u}""*ี๒ๅหยนs็„…  ย๓็ฯA„ฎ]ป -[ถA,--…ภภ@•u๙๊ิฉ“••Uh[={๖|}}ล๗#FŒ …ผผผ7Š๙๚๕๋แ็Ÿ.Tๆ๋๋+ึฎ]+.ปrๅŠ@PSSNŸ>-.฿ปwฏ@Xพ|นธฌSงN‚–––๐ื_‰ห๎ป'>>>โฒ‚ใๆๅๅฅFF†Pฝzuก*q=x๐@022*ดu‡‡AโใใยฦK>(E(8sๆฬ—egg ŽŽŽ‚ฉฉฉ““#‚ ฌ^ฝZPSS๓O•๕###ย‰'ฤeีชUz๗๎]h[ณfอ7nPYžšš*จซซ ำฆMSY~แยACCCeyAผ‘‘‘ล๎“–––0hะ R๗จขเ)ั๊ึญ^ผx]ปv!##ปvํ*๕r}วŽฑ~์฿ฟทoวธqใฐgฯ„……ฉ|%ŸRฉฤž={T.ืWฏ^™™™*ำสโษ“'€5jYฎฏฏฏ2ชธqcTฏ^Ÿ|๒ ฤๅ?๗฿€|์ท:uBฝz๕ฤzๆๆๆ ร๑ใวกP(Tถีฟจซซ‹๏๗๏฿ดด4t๏]9~๘1ิีีแๆๆ†ร‡ฟัพx9บ\“ Jขกกˆ๏ตดด0`ภA“&MTbnีชผqฬฏฺฒe ”J%บu๋ฆาvญZตะฐaรBmkkkฃo฿พลถWฃFb็3UDผฉ‰ˆ่ ™˜˜ภฯฯkืฎล๓็ฯ‘ŸŸืฉSงŽสW๏มุุ_}๕vํฺ%tt๎9๓ฯ?* ้เมƒ๑ว mถจ]ป6ัญ[7ดiำฆL๑ ล|!_:u ๔bdd„บu๋Zผผฌ ผผs๙๓็hธqก6?๙ไ(•Jพ}ถถถโrkkk•zืฎ]1™{กกaIปTˆตต5Fนs็"**  B=ฤ๘KbaaQ่FซFRSSัผys\ปv —/_/ฑฟ๎ัฃGo๓ซฎ]ปAะฐaร"ห555Uืฎ]ZZZลถ'ohขJ… )Q9„……กx๐เฺถm‹๊ีซฟqญ[ท;vLLHฃฃฃaeeฑžฉฉ)ฐw๏^ฤฤฤ &&ห—/Gฏ^ฝฐrๅสb766๐‰ไ๋^ฑ,ห๒โฒะีีUyฏT*ผœoYซVญB๕_ŸW[sๆฬAŸ>}ฐ}๛v์ทร‡วŒ3p๚๔i•ฉสKฉTยs็ฮ-ฒ๕DM–ษdˆ‰‰)๒๘ฟ~Sฺ๋ว๓uiii๘่ฃสั )Q9cภ€8}๚46lุPฎ6๒๒๒ฯž=—ํฝํฺต+TWKK :t@‡ T*1x๐`,^ผ'NDƒ Šlใ?†ฎฎ.nธQฎ๘Šcbb===คคค*ปrๅ ิิิJMฮ๊ืฏเeฒ๊ศ๑ฒทท‡ฝฝ=&L˜€“'Oยำำ‘‘‘˜:uj‰๋ปwฏะใจฎ^ฝ เๅl1'&&ขu๋ึฅŽ>W^๒๚๕๋CX[[‹#ณๅu๗๎]ไไไเ“O>yซvˆKœCJDT๚๚๚๘๕ื_^๎g|๎นเเเx๘๐!ฮŸ?ฏrน๘ฟน ิิิ —ห@ๅqCฏำิิ„‹‹ bccห_qิีีแ๏๏ํทซ ๐แCฌ]ป^^^ฅ^r€กก!ฆOŸŽBๅ๓ฯลคP(ฤฟ€ฝฝ=ิิิJ}+WฎDƒ ะณgO//ื๋่่จ<ย๚๕๋‡ญZตB:up๓ๆM๓ฯptt,uฌcวŽ?~< ลฯห,ษิฉSฑ~xyya๐เมะะะภโล‹‘™3g–บพกก!~๕W๔์ูM›6Ehh(LLLp๋ึ-์ฝžžžXธpa™ใ9t่†Šฎ]ปขQฃFศหหร๊ีซกฎฎŽ.]บ”บพ……~๑GคฆฆขQฃFุฐaฐdษqfฯž=๑ว`เภ8|๘0<==‘ŸŸ+Wฎเ?ภฝ{แโโเๅฃ—8€นs็ยยยึึึpss“๑ใว#44ššš่ะก๊ืฏฉSงbธqHMMEงN```€7n`๋ึญ๘๒ห/๑ีW_•้X์฿ฟ1œœœส|ˆ$' DD•วซ}*IY๛คฎฎ.ิฉSG๘๒ห/…‡Š๕BBB„vํฺjsำฆM‚ฟฟฟ`jj*hii ฑ0`ภแ๛ฅฦ๐แCACCCXฝzตสr___มึึถL๑์ร!CT–?^๔๕๕===กeห–ยษ“'U๊”v>,FFF‚ŽŽŽPฟ~}กOŸ>Blll‰๛๕๚cŸ๛oแ๓ฯ?๊ืฏ/่่่5kึZถl)8p ฤvแŽEllฌเ๎๎.่่่–––ยย… ีอษษ~๑GมึึVะึึjิจ!8;; BzzบX๏ส•+‚ ซซ+Pyิ๗฿/ิฎ][PSS+๔จอ›7 ^^^Bตjี„jีช Mš4† "คคคŠท(๙๙๙‚นนน0aย„R๗›จ"‘ ย[ฬR'"ขw"//ฦฦฦ˜1cNโ‹/p๕๊U๙็Ÿ๏ด]ชxถm†ฐฐ0๕ื_077—:ข2cBJDT"""ชA@FF,,, ฆV๒(Rช๐๎ปW๊๗bQลt๛๖mิฉSงฤ:LHฉย300ธq5kึ”8*Mnn.๖ํ๑+ฉโbU>์ณสๅC๎/…Bบu๋ŠวKย„”*ผ‚ห๔๏๔ปธ้ศออ…žž ?ธ฿สˆU๙ฐฯ*๖ส4Ž75‘ค˜‘ค˜‘ค˜‘ค˜‘ค˜‘ค˜‘ค˜‘ค˜‘ค˜‘ค˜‘ค˜‘ค˜‘ค˜‘ค4ค€จฌๆŸ€RK_๊0จZjฦู3!G)“:*๛ซ๒aŸU.ฝฟฮOl%u8BJDDDDcBJDDDD’bBJDDDD’bBJDDDD’bBJDDDD’bBJDDDD’bBJDDDD’bBJDDDD’bBJDDDD’bBJDDDD’bBZА4o?ๆ•+WะขE‹w^๗]x๑โZทn }}}Œ;Vฅ์๚๕๋๐๑๑ญญ-œœœณ˜ˆˆˆจrใwู—`PWWใ๕๒๓๓หต^E๐๔้SิจQฃุr Lš4 ษษษธy๓ฆJY฿พ}1gฮ4kึ =*s›DDD๔aใ้ทt้Rุรมม“'OFnn.ฆOŸŽ &”i#GŽภฯฯmฺดŸŸž={†ž={ยีีฎฎฎ8}๚4`ถmpssƒฃฃ#:v์ˆgฯžฎ^ฝ 888`ษ’%%nซธบลm๓ฝ{ „ƒƒœq๛๖m•๖๒๒๒ฐeห๘๛๛c่ะก€+VจŒ€ZYY!++ ššš๐๕๕…ฎฎฎJ/^„พพ>š5k055ห\\\ะทo_œ9sฆLว2;; …BๅEDDDURIIIXดhNœ8ฤฤDŒ1s็ฮE๏ฝa`` R722‘‘‘€ุุX๔๋ืO,‹‹‹รŠ+p๘๐aL:]บtมนs็ฐu๋V 2เ๋๋‹3gฮ !!žžž๘ํท฿#GŽฤคI“˜˜AJŒทธบลms๘๐แฺ่ต+q๘q|๔ัG€ทocาคIฐฑฑมฎ]ป0eสDEE•๋^ปv บบบ DำฆMฑpแBฑ,%%AAA‡‹‹ /^,&โE™1cŒŒŒฤWบuหUผd—ฃ›กกก044๐ržไพ}๛pเภB—ฅ(์โโ‚eห–‰๏ฝฝฝQซV-//๗วฤฤ <<๐ไษไๅๅแึญ[ฺ่ต+>|ˆ็ฯŸรฯฯ€   @๗๎_lผลี-n›งNยฦ@ู<{๖,<<<0rไHฤฦฦŠ๛^^๙๙๙8~8a``___x{{รมมFpp0nผ‰๛ใซฏพBFFF‘m7ฃG฿+ &ฅDDDUา"$$$ 99ึึึศหหร?ƒ   ์ุฑฃฤ๕๔๔๔ฤŸA@LL ,,,T๊ >hัข6mฺ„]ปvd2™X็ีŸ‹R\โถYน\Ž%K–`ษ’%่าฅ ๚๗๏N:AKK  ฎฎฅR)ึฯฮฮ.ฑ= 4kึ ๆๆๆ???$%%มมมภหไx๕๊ีXพ|9๊ีซ'&ศEัึึ†ถถvฉ๛@DDDU/ูhีชึฏ_/ฮUtwwว๛๗‘ššŠใวรษษฉิd๔u~~~Xดh‘๘>11ภหั>sss(•Jฌ^ฝZ,wpp“ำ 6”ุvqu‹ฆงง'Vฎ\ ศสสย‹/ ฃฃƒฯ?งOŸฦฌYณp่ะ!4iาsๆฬXZZŠ๋Ÿ={>,1ฆfอšแฝ{P(ศหหร‰'ะธqc@XXกP(ƒญ[ทขM›6%ถGDDD&ค์์์0t่Pxxxภมม ,(ถnIsH_5iา$ปwrน666โฅ‰'ขmถpssƒตตตX๙‡ƒƒCฉsH‹ซ[6๚้'๑วหๅ๐๒๒ย“'OTฺsttDdd$’’’เ่่๐๒๒‚พพ>lll๐oฟฉ\2—หๅ=z4~๙ๅิฉS๓4448::โำO?op ร•+W0iาค2ั‡E&”–ILกPภศศฮถCฉฅ/u8T -5ใ์žaฦE}ไ(Kž~BาcU>์ณสฅข๗ื๙‰ญ[ฟำำำKฝW…#คDDDD$)&คุ๒ๅหแ่่จ๒*i:Qeฤป์+ฐพ}๛ขo฿พR‡ADDD๔^q„”ˆˆˆˆ$ล„”ˆˆˆˆ$ล„”ˆˆˆˆ$ล„”ˆˆˆˆ$ล„”ˆˆˆˆ$ลป์ฉาุ;าฦฦฦR‡AฅศออEtt4ฦšššR‡Cฅ`U>์ณส…U6!%""""I1!%""""I๑ป์ฉย+๘.kNACฯH๊pจ๊ศG+ตฟpHY๙P—:*๛ซ๒aŸU.๏บฟ๒ข๚o๐ป์‰ˆˆˆจา`BJDDDD’bBJDDDD’bBJDDDD’bBJDDDD’bBJDDDD’bBJDDDD’bBJDDDD’bBJDDDD’bB*‘4oผ๋งฆฆbำฆM๏0ขฒนu๋<==กฃฃƒศศH•ฒs็ฮมลลถถถ่ะกรUNR๐!ฺฟ?ิี฿๎๋ร าwีKOŸ>E5Š-744ฤนsฑcว•ๅนนน่฿ฟ?6mฺ„ เัฃG€œœไๅๅAOO๏ฦIDDDUGH฿ณฅK—ย˜๛์3Lž<Ÿ~๚).\ธ€Ž;b๘๑ฅฦ—’’‚QฃFมฮฮ็ฯŸวาฅK1}๚๔rํ๋ตkืVญZมลลEœN`ff†K—.มลล €ฏฏ/ึฎ]‹์์์bสฮฮ†BกPyQีลK๖๏ั‘#G CCCภ‹/ฐo฿>8p7oTฉ;pเ@๑g,[ถ พ๙ๆ?~๊๊๊ธ~z‘:y๒$ยรร=z๔ภฯ?\bl›7oFhh(ฆM›†‹/BGGงผป ศฯฯว™3gp๊ิ)dggร>>>055…ฎฎ.z๕๊…^ฝzแโล‹่ีซfฬ˜ .ูึŒ3๑V๑QๅมาPBB’““amm ///ฤวว#((จฤuขขข““ƒ„„$$$ผ๑6ีีีกT*@eT๒ำO?ล์ูณ…๎ป#::ZฌWาzลฑฐฐ@ห–-ahh8;;#%%E,ฟ{๗.พ{tํฺvvvXฒdIฑm7้้้โ๋๖ํoผ฿DDDTy0!}Zตj…๕๋ื‹—œq}คฆฆโ๘๑ใprr*tsะ๋ LMMกฎฎŽM›6!33```€ŒŒ ฑž‡‡6lุXปv-ผผผ–––b"๛๊ถ 1bฤ$&&bิจQˆŠŠBใฦฑfอšื+Žฟฟ?ฮŸ?œœdff"11๕๋ืGzz:‚‚‚}}}œ๎๑f๔ฑฟ*๖Yๅ๒ฎ๛ka๐'๏ ชFม฿๏๔๔๔Rฏvr„”ˆˆˆˆ$ล„”ˆˆˆˆ$ล„”ˆˆˆˆ$ล„”ˆˆˆˆ$ล„”ˆˆˆˆ$ล„”ˆˆˆˆ$ล„”ˆˆˆˆ$ล„”ˆˆˆˆ$ฅ!uDe5ญMCK•"77ััav๛ฦะิิ”:*๛ซ๒aŸU.์ฏฒแ)IŠ )IŠ )IŠsHฉาุxบ™R‡AฅQๆฃ&€5็๏j๊RGCฅaU>์ณ7าื๕cฉC 2เ)IŠ )IŠ )IŠ )IŠ )IŠ )IŠ )IŠ )IŠ )IŠ ฉ„BBBะผy๓rฏŸššŠM›6ฝรˆสf๘๐แ033+๛‹/ะฃG4iาŸ|๒ .^ผ๘ŸวFDDD•R‰์฿ฟ๊๊o๗•o๏#!}๚๔iฉuBCC]h๙”)SะดiS\นr๑๑๑ฐดด,s›DDD๔แbB๚Xบt)์ํํแเเ€ษ“'#77ำงOว„ สดพBก@ซVญะดiS899แ๘๑ใ€๑ใวc๏ฝpttDTT๙็ดm๖๖๖ภร‡๑๔้S|๒ษ'ธ{๗.๒๓๓ัผysœ9sฆะ6NŸ>>}๚ภลลภหd๗ีะ>}๚`ฯž=jcร† 6l@GG€กC‡" [ทnE^^^ฉ๛› …Bก๒"""ขช‹ ้{–””„E‹แฤ‰HLLฤˆ#0w๎\๔๎[Lุ DFF"22‹~๚tuuฑ}๛vœ?;w๎ฤ˜1cำฆMC@@๐ูgŸa๒ไษ๘๔ำOqแยt์ุใวG50}๚t 8sๆฬ——ˆŒŒ„ณณ3"""ะฑcGคคค”k?Ÿ>} --- 6 NNN๔๎ปPbเภ,[ถ พ๙ๆุฃ}๛๖ธt้R‘:y๒$z๔่่ัฃNœ8†ŽŽ~๛ํ7|๗b} lูฒ[ถlALL ‚ƒƒกกกQฎฬฯฯGJJ BBBpyไ็็c๑โลby๓ๆอ๑๛๏ฟ#66ฯž=ƒ••ฮž=[d[ใฦCzzบ๘บ}๛vนb"""ขส ้,!!ษษษฐถถ†——โใใTโ:QQQศษษABBx›นนนธqใA@ffฆธ|ใฦจVญ‚‚‚0|ฯ?:::e>ŽDDDTu1!}ฯ์์์0t่Pxxxภมม ,(ถnqsHรยยp่ะ!ศๅr;v fffน\Ž/^ˆ75…‡‡#::rน[ถlมิฉSq้า%lผ“&MBฏ^ฝ๐๔้S์ฺตKeป˜4i._พ,&คZZZ9r$ ฑ€เ๎๎Ž๘๘xิฉSGLจgฮœ‰กC‡B.—ใ๏ฟฦ!CŽŽŽHJJBdd$฿อ%""ข*C&‚ uD%Q(022ยขƒ‰ะ5จ.u8Te>j>Hยฟตไ€ฺ=ฺŒ์ฏส‡}๖F๚บ~,้๖sssvํฺASSSาXkฟำำำK~วR""""’R""""’R""""’R""""’R""""’R""""’R""""’R""""’”†ิ•ีjรุุX๊0จ/„M๋|pฎŒุ_•๛Œช"ސ‘ค˜‘คxษž*ธT ž๒{›+:e~เ์฿้PS็GLEวช|ุg“{ƒ๊R‡Pฉq„”ˆˆˆˆ$ล„”ˆˆˆˆ$ล„”ˆˆˆˆ$ล„”ˆˆˆˆ$ล„”ˆˆˆˆ$ล„”ˆˆˆˆ$ล„”ˆˆˆˆ$ล„”ˆˆˆˆ$ล„”ˆˆˆˆ$ล„”ˆˆˆˆ$๕ม&ค!!!hผy™๊v๋ึ ˆŠŠzฯQญE‹ธrๅŠ$~]\\\\\ ฉฉ‰={๖จ”ลฤฤภฮฮถถถ8p DQe๓A~ ๎๛กฎ^ถ๏Dฟ>ฎ^ฝŠฤฤฤBe๙๙๙enG*oใำงOQฃFbหkีช…eห–a๎น*หŸ}๚`๐เมpuuล๙๓1|4iา9rdกmฆงงcแย…pppภ† ฤ6 F@SSSลัไฺตkรััjjชงฮบu๋€ฉฉ)เ๊ีซhาค ฦ›7o–้˜gggCกPจผˆˆˆจ๊ชา iRR-Z„'N 11#FŒภนsัปwoจิŒŒDdd$ 66VL7mฺ{{{$$$ภ`ee…„„hiiaวŽˆ‹‹รฝ{1lุ01)LJJBTTฮ;‡oฟึึึHJJ‚ฎฎ.ฤ่ัฃƒฤฤDฬœ9S,ำืืG\\z๔่!ฦ้๋๋‹3gฮ !!žžž๘ํท฿ฤ๚iii8{๖,ฦŒƒiำฆ!>>‰‰‰ˆˆˆ๋์งซซ+๔๎ปPŠษ˜‹‹ –-[Vlป]ปvœ>‹-‚]Y UqUz„ิฮฮC‡…‡‡ิีีŒ๐๐๐"๋ฬห8p bccYโe{hึฌแไไ555,Xฐ๚๚๚ๅŽืิิ๓ๆอC›6mnnnXฒdIฑ๕'NœˆถmยุุžžžHKK+T'??aaaศศศ€ ˜2eŠJนššฺตk‡vํฺแฮ;x๘๐!เ‹/พ@วŽฑqใF๘๛๛‹๕SRRะบuk<}๚ปw๏†ญญ-Ž9น\ŽฆM›ยึึXธp!455กกก9sๆ iำฆๅ>.DDDTตษAค‚จ$ …FFFุ๛7 ŒŠ$U ส<<พr5๑„šz•?o•ภช|ุg“{ƒ๊E.ฯออEtt4ฺตk๗ม=ฑเ๏wzzบx?Oqช๔%{""""ช๘๘_+‰ใฦ*หถm๖VwบUFLH%ฒu๋VฉC """ชxษžˆˆˆˆ$ล„”ˆˆˆˆ$ล„”ˆˆˆˆ$ล„”ˆˆˆˆ$ล„”ˆˆˆˆ$ลป์ฉาpถ2„ฑquฉร Rไๆๆ"๚ ะฌžั๗่สˆU๙ฐฯจ*โ)IŠ )IŠ—์ฉาx4ฐ1rd9R‡Aฅศืะท{ื†z^–ิแP)ุ_—๙ ฉC ๚ฯp„”ˆˆˆˆ$ล„”ˆˆˆˆ$ล„”ˆˆˆˆ$ล„”ˆˆˆˆ$ล„”ˆˆˆˆ$ล„”ˆˆˆˆ$ล„”ˆˆˆˆ$ล„”ˆˆˆˆ$ล„”ˆˆˆˆ$ล„”ˆˆˆˆ$๕Nา4oผLuปu๋DEEฝ‹Mฟฑ-Zเส•+’l;<<‘‘‘oีฦ‘#GZฎuCCCqไศ‘ทฺŒ3๐๑วฃVญZ*ห•J%FމฦฃI“&ุทo฿[m‡ˆˆˆ>o]๖๛๗๏‡บบz™๊ฟWฏ^Ebbbกฒ2ท#•สใx9444 ฅฅUlO?ฝ{๗FำฆMU–/]บJฅ)))ศฯฯGzz:เ้ำงจQฃฦ{›ˆˆˆ*ท7!]บt)์ํํแเเ€ษ“'#77ำงOว„ สด~‡pํฺ58::โย… ฐฒฒยธqใเ่่ˆSงNa๊ิฉฐณณƒ\.วฮ;ผ๔๗๗Gปvํ`ee…ศศHL›6 rนmถE^^^ฑฑcแเเ€~๚‰ห—/_ggg899แ๖ํ€mถมออ ŽŽŽุ่ฑ#ž={่ำง WWWฬŸ?๓็ฯG“&Mเเเ€‘#Gปํ+WฎภืืpssCvv6 ..^^^จ_ฟพ8Š˜——‡#FภีีŽŽŽโพ+ „……A.—รััฑฑฑ*ุณg|}}‘žžŽปwฃy๓ๆpttฤภกT*'NDใฦแ๏๏'Ož๋ฅK—0lุ0ฺฺุโ้ำง 2๚๊ศฎ‹‹ ,,, ตฑt้RŒ? ฎฎŽš5kfอšOOOฌZต YYYลฏWeggCกPจผˆˆˆจ๊*sBš””„E‹แฤ‰HLLฤˆ#0w๎\๔๎*u###ล&66VL7mฺ{{{$$$ภ`ee…„„hiiaวŽˆ‹‹รฝ{1lุ01)LJJBTTฮ;‡oฟึึึHJJ‚ฎฎ.ฤ่ัฃƒฤฤDฬœ9S,ำืืG\\z๔่!ฦ้๋๋‹3gฮ !!žžž๘ํท฿ฤ๚iii8{๖,ฦŒƒiำฆ!>>‰‰‰ˆˆˆ(๖x๕์ูแแแHLLฤพ}๛ ฉฉ ธy๓&Ž=Š?๘C\ูฒeฐถถฦนs็p์ุ1Œ;นนน˜2e 5j„คค$ฤฦฦขQฃFb๛{๖์มดiำฐ}๛vไๆๆb๙8rไ ฎฎŽ-[ถเ์ูณุฟ?.^ผˆๅห—ใ๔้ำโ๚ูููˆŠŠ‚WWW\พ|fff%ลบ>,Xggg„……!-- 0}๚t,Yฒqqqฐททว่ัฃ‘’’Rb[3fฬ€‘‘‘๘ช[ทnนb"""ขสกฬ—์ ๆ.^ผx}๛๖แภธy๓ฆJŠ?ปธธ`ูฒeลถตkWภษ“'mmm˜››ฃiำฆธt้ภรรCผ์kdd„๖ํ์์์p๋ึญ"=sๆ `nnโˆœœœฤฤ๓ึญ[ฺ่ต+>|ˆ็ฯŸรฯฯOฌ™LpvvF=ะตkWt๊ิฉศm+ ddd eห–bฬกฎฎ'''คฆฆx9ํ!99+Vฌdddเฝ{8t่ขฃฃโฑ?<ฎ^ฝŠƒขz๕ุ๊นs'’’’ฤyผ/^ผ€ฅฅ%๎นƒฮ;CSSตkื†ททท‡‹‹ ดดดฐrๅJุููนo"==ึึึˆ‹‹ร๔้ำ1eสฬ;`kk‹Ÿ~๚ ?๘#,X;;;ฌ_ฟ]บt)ฒญqใฦa๔่ั*ว“I)QีU๎›šœœ kkkxyy!>>^L๔„žž^ฉu^ำจฆฆ&พWSSC~~oS[[ปะ๚ร‡ว„ pแย๘ใโ%๖ืcฝ{7 „ฃGขM›6๏d‚ เท฿~CBBp๋ึ-XZZF:uŸŸห—/‹๋w์ุQ\?%%฿|๓ ˆ‰๔๋?/Yฒถถถฺ่ต+ฆNŠปw๏ชlใีบฏ‹โXXXˆ zppฐส๔ำbาึึ†กกกส‹ˆˆˆชฎ2'คญZตย๚๕๋ล๙|๎๎๎ธ>RSSq๘q899aวŽๅฤรร[ทnEnn.เ฿-ฑพBก€นน9”J%Vฏ^]dฅR‰;w๎ภฯฯsๆฬมีซW‹ฌghh###>|ภหัร‚9E๑๓๓รฏฟ*ึIHH—L)ศหหCFFภิิถmร—_~‰K—.กy๓ๆ8x๐ ๎นx๒ไ ๎นฃrL๏ป‡?Sฆปป;VญZ…'N Zตj@PPx3Rตjีp็ฮdgg—้Ž๙๖ํใ่ัฃ^Žฆ7iาฐfอ4nQQQ=zด8ƒI&(sBjgg‡กC‡ยรรXฐ`Aฑu‹›CZ’fอš!00NNN๐๗๗ว‚  ฏฏ_ึ๐ 155ลผy๓ะฆM888`์ุฑ%ึŸ8q"ฺถm 777X[[Y'??_ผษศออ SฆL)ถฝUซVa๒ไษppp@›6m››[lภฬฬ ฐตต8q"ฎ^ฝ {{{ธบบช$ภึึึXปv-BCC‘••…E‹กcวސหๅ๐๗๗วฃGะฌY3ดnvvv่ทo‘ๆชYณ&F…‹/ช\&ˆˆ€ฏฏ/ัธqcq๙ิฉSQงN๓ฯ?จSง~๙ๅ//ณ๚๋ฏหๅุบu+&MšเๅแำงO#**JeสQ™ ‚ิA•DกPภศศษ!ฦจ.ห‘:*Eพ†โทฮ๚C=ฏlOV ้ฐฟ*.๓?Š~ยHnn.ขฃฃัฎ];๑†Yชธ>ไ*๘๛žž^๊•Q~SI๊ญŒ_ใฦ*หถm++ซ๗พํiำฆaใฦ*ห&L˜€๗พm"""ขช J$ค[ทn•lใวODDDDoŽ—์‰ˆˆˆHRLH‰ˆˆˆHRLH‰ˆˆˆHRLH‰ˆˆˆHRLH‰ˆˆˆHRUโ.{๚0˜FฆภุุX๊0จนนน@t4ฬVเ]ฑฟˆจ"เ)IŠ )IŠ—์ฉาP.้ ฅถR๊0จJ™Po8” @)ไH•‚U๙ฐฯ[jฃ”:„GH‰ˆˆˆHRLH‰ˆˆˆHRLH‰ˆˆˆHRLH‰ˆˆˆHRLH‰ˆˆˆHRLH‰ˆˆˆHRLH‰ˆˆˆHRLH‰ˆˆˆHRLH‰ˆˆˆHRLH‰ˆˆˆHRU>!MKKรฒeหŠ-ฏUซVฉm=zถถถ๐๖๖~—ก•ู‘#G*ษถ‹2|๘p˜™™กy๓ๆ*ห_ผx=z I“&๘ไ“Op๑โE‰"$""ขสไƒOHหbํฺต˜6mS๕๛l๓๓๓฿ชย›ฦ๘๔้ำR๋„††"::บะ๒)Sฆ iำฆธrๅ โใใaiiYๆ6‰ˆˆ่รUๅา{๗๎มำำŽŽŽหๅ3f .\ธGGGฬš5 ™™™† Xj{ซVญยฦ1fฬ 2+Vฌ@HH|}}ัณgO\ฟ~หๅ่ึญ233-Zดภ˜1cเไไWWWฤฦฦขu๋ึจWฏv๏]์๖ ยยย —หแ่่ˆุุX/“บ: aร†˜6mšXฟ}๛๖pvv†ฝฝ=ถlูHMM…ฃฃ#บu๋›Bวไส•+…ถ{๚๔i๔้ำ...bฏŽ€๖้ำ{๖์xxxภุุธP6lภฐaร:::000 :ุบu+๒๒๒J=ๆูููP(*/"""ชบช\Bบn:๘๙๙!!!qqq˜:u*์ํํ‘€ฏฟ‹-‚ตต5’““ัถm[<|๘P\ืััQน_ฟ~ˆEฏ^ฝ„E‹aัขE€คค$์ฺต kืฎล๐แร1jิ($%%มสส ๓ๆอ066F||<ผผผ0t่P์ฝถmริฉS‹ส”)hิจ’’’‹Fโใใฑbล $&&"22RL|WญZ…ธธ8œ8q'N„ €K—.a๒ไษHII)tL F.322 gggDDD cวŽHII)ืq๚๔)ดดด0lุ0899a๐เมศฮฮDEE!"";w๎„ &OžŒ;w๎ึŒ3`dd$พ๊ึญ[ฎ˜ˆˆˆจrจr ฉซซ+Vฏ^ˆˆ\ปv บบบ*ๅ'Ož็cv์ุzzzbYBB‚๘๓ฒeหฤัยืตiำFKHH@็ฮ=z๔ภ‰'ฤzํทุรรร:::ฐณณรญ[ทŠะกCโศญ†† žžž066†žžฌญญq๏=ภผy๓เเเoooคฆฆโมƒ€O>๙ถถถ% lูฒ[ถlALL ‚ƒƒกกกQll%ษฯฯGJJ BBBpyไ็็c๑โลby๓ๆอ๑๛๏ฟ#66ฯž=ƒ••ฮž=[d[ใฦCzzบ๘บ}๛vนb"""ขสกส%ค>>>8v์LMMัฅKQๅภ„๔=บy๓&ฬออ1hะ „††"-- bน‡‡6lุุตkž?^j›™™™011AVV–ธ.ˆmปบบโเมƒP(x๖์bbbเๆๆฆาŽŽŽ>sœ>}ณfอยกC‡ะคIฬ™3`ii)Žpž={Ve:AQš5k†{๗๎AกP //'Nœ@ใฦaaapww‡Bก@LL ถnŠ6mฺ–ถถ6 U^DDDTuiH@Uvไศฬœ9ZZZ066ฦ๚๕๋ น\Žž={bศ!๘์ณฯ`kk ˜™™‰๋:::Š—ํ๛๕๋‡ยลลใวGำฆMaffฆ๒hฅ>}๚ gฯž011มŸ‰oฟ€QฃFมสสชศyคŠŒŒฤณgฯฤK๛^^^ะืื‡ ผฝฝU.›หๅrนsyyyXณf โใใabb‚ˆˆq›]ปvop รš5k ฆฦQa2Aฉƒ *‰Bก€‘‘ญc=ชผิ‚–^้ศออEtt4ฺตkMMอd›T~์ฏส‡}Vน|ศU๐๗;==ฝิซฒ"""""I1!%""""I1!%""""I1!%""""I1!%""""I1!%""""I1!%""""I1!%""""I1!%""""I๑koจาPk3 jฦฦR‡ADDD๏GH‰ˆˆˆHRLH‰ˆˆˆHRผdO•†2y3”†บR‡AฅP*ภส‹๋กฌคๅUs่)uDD”J๚็‚ˆˆˆˆช &คDDDD$)&คDDDD$)&คDDDD$)&คDDDD$)&คDDDD$)&คDDDD$)&คDDDD$)&คDDDD$)&คๅ”––†eห–[^ซVญrตปbล <~ธุ๒ูณg—ซ]8rไBCCหฝ>บu žžžะััAddคJูนs็เโโ[[[t่ะแญถCDDD&คๅTZBZ^ล%ค‚ @ฉTพUBZOŸ>-ฑะะs็ฮล˜1cT–็ๆๆขXฟ~=.]บ„฿~๛ ““ƒ็ฯŸฟทx‰ˆˆจ๒cBZF๗๎ƒงง'!—ห1fฬ\ธpŽŽŽ˜5k233  8ฐLm~๕ืhาค 0kึ,lบฑฑฑ†ทท7ภฬฬ ƒ ‚ฝฝ=พ๘โ ษษษe:.DDD๔aั:€สbบu๐๓๓CDDrssq๚uฝ{WLgฮœ kkklบทoวโล‹ลu‘่ืฏkkklฺด ๕ิิิžž###ธธธ 22Mš4ฮœ9ƒSงN!;;๎๎๎๐๑๑ฉฉ)tuuัซW/๔๊ี /^Dฏ^ฝ0cฦ \ธpกศถfฬ˜ˆˆˆทЇˆˆˆ*^ฒ/#;v ฆฆฆ่าฅ 5‚Bก€บบ:fฯž๋ืฏใฃ>B฿พ}แ่่555Œ3HOOว่ัฃัขE‹ท9DDDT…ษAค‚จ$ …FFFxtl1Œ uฅ‡J‘ซ๖2D›ะฌคื`ิzJย&77ัััhืฎ]กงgPลฤ>ซ\>ไ*๘๛žž^๊ีฮJ๚็‚ˆˆˆˆช &คDDDD$)&คDDDD$)&คDDDD$)&คDDDD$)&คDDDD$)&คDDDD$)&คDDDD$)~SUj6] fl,uT ต\เV4ิ์Bก๖=šˆˆส‡#คDDDD$)&คDDDD$)&คDDDD$)ฮ!ฅJ#`ห@(uฅู๖๙ฅู0ั€#คDDDD$)&คDDDD$)&คDDDD$)&คDDDD$)&คDDDD$)&คDDDD$)&คDDDD$)&คDDDD$)&คDDDD$)&คฃGยึึๅnใล‹hบ5๔๕๕1v์X•ฒ๋ืฏรววถถถprrzp‰ˆˆ่มฏ€ฌ]ปำฆMCงNŠญ๓๔้SิจQฃุr Lš4 ษษษธy๓ฆJY฿พ}1gฮ4kึ =*s›DDD๔aใit๏=xzzยััrนWฎ\มาฅKaooLž<0y๒dธบบยฮฮ฿}๗ธพ••&Ož ๘๘๘@กP`ีชUุธq#ฦŒƒ!C†จl///[ถlฟฟ?† Xฑb…สจ••ฒฒฒ ฉฉ ___่๊ช~ฉล‹กฏฏfอšLMMล2๔ํgฮœ)ำgggCกPจผˆˆˆจ๊bBZญ[ท~~~HHH@\\ฒณณฑhั"œ8q‰‰‰1b`ฤˆ8w๎’’’””„ฤฤDฑ  11ุฐaz๕๊…   ,Zด‹-พ}“&M‚ vํฺ…)Sฆ **ช\1_ปv บบบ DำฆMฑpแBฑ,%%AAA‡‹‹ /^ŒgฯžึŒ3`dd$พ๊ึญ[ฎ˜ˆˆˆจr`BZนบบb๕๊ีˆˆˆภตkืp๔่Q„††ยะะPณfMภมƒแ๊๊ GGGœ;wษษษbAAA'''คฆฆฺฦูณgamm็ฯŸ#66ฟ;š7o^๎˜๓๓๓q๘q,[ถ วŽร๒ๅหลYCCมมมˆ‰‰มๆอ›ฑy๓f˜››ึธqใžž.พn฿พ]๎ธˆˆˆจโcBZ๙๘๘เุฑc055E—.] Bก:YYY=z4v๏คค$tํฺูููbนถถ6@MM ๙๙๙…ึ—หๅXฒd Ž?Ž.]บเ?@NNŽXฎฎฎฅR)พตํขXXX Yณf077‡พพ>””$–?y๒๓็ฯGPPชUซ†7–ถถ6 U^DDDTu1!ญ€nผ sss 4กกกศศศภ๚๕๋ลน”๛/ฒฒฒ ฆฆ†5jเ฿ลฮ;฿h:::๘๓ฯq๚๔iฬš5 ‡B“&M0gฮ€ฅฅฅ8ยy๖์Y<|๘ฐฤ๖š5k†{๗๎AกP //'Nœ@ใฦaaapww‡Bก@LL ถnŠ6mฺผ้a!""ข*ŠwูW@GŽมฬ™3กฅฅcccฌ_ฟตjี‚‡‡ิีีŒ๐๐pt๏Ÿ|๒ ๊ิฉww๗roฯัั‘‘‘x๖์™xใ‘——๔๕๕accooo•yœrนw๎A^^ึฌYƒ๘๘x˜˜˜ ""€ฎ]ปŠ78………aอš5PSใˆˆˆจ0™Pิ๕`ข DกPภศศฮKB ิ-ฝ๛pพG๑S HUnn.ขฃฃัฎ];hjjJ•‚U๙ฐฯ*—นฟ ~งงง—:ŽCVDDDD$)&คDDDD$)&คDDDD$)&คDDDD$)&คDDDD$)&คDDDD$)&คDDDD$)&คDDDD$)~SU{;GยุุX๊0ˆˆˆ่ใ)IŠ )IŠ—์ฉา˜zn:4 *๎);ห๓GฉC ""ช”8BJDDDD’bBJDDDD’bBJDDDD’bBJDDDD’bBJDDDD’bBJDDDD’bBJDDDD’bBJDDDD’bBJDDDD’bBJDDDD’bB -- ห–-“:ŒJa๙๒ๅhุฐ!d2ฒฒฒTสfฬ˜ฦใ“O>มŠ+ค ˆˆˆ*&ค(9!อฯฯฃ‘nปนนนศฬฬ,ฑŽซซ+๖ํKKK•ๅ{๗๎ลนs็œœŒไไdxyl‰ˆˆˆJRๅา{๗๎มำำŽŽŽหๅ8y๒คส๛+Wฎ`๘๑ธpแ1kึ,ฌXฑ!!!๐๕๕Eฯž=๑๐แCt์ุ...๐๖๖ฦีซW‘‘‘puu…\.G฿พ}กT*-Zดภ˜1cเไไWWWฤฦฦขu๋ึจWฏv๏]lฌแแแ่ท/๑อ7฿เฺตk๘๔ำOแ์์Œ6mฺเแร‡+++qtrลŠ;v,เ๋ฏฟF“&Mเเเ€Yณf@ฑmผ*55฿}๗š4i"๎[qฐณณƒตตuก6–.]Šoฟ๊๊๊ษd011ฌ[ทXดh E™๚,;; …BๅEDDDUW•OHืญ[???$$$ ..‡Vyoii‰iำฆม ๘๚๋ฏIIIุตkึฎ]‹QฃFa๒ไษˆลนs1z๔h@ทnp๎9$%%AWW;w๎ทkllŒ๘๘xxyya่ะกุฝ{7ถm†ฉSง–๏_…cวŽaฮœ92d–-[†ธธ8|๑ล๘๛๏‹]๏ษ“'ุดi’““‘˜˜ˆ/ฟŠm#??;v์@ปvํะนsgิฎ]็ฯŸ‡““SนŽ๓ตkื WWWดo฿ทo฿ 4ทoว๛๗แโโ‚๛#..ฎฤถfฬ˜###๑UทnrลDDDD•ƒ†ิผoฎฎฎ่ำงิิิะตkWx{{ซผทฑฑ)rฝ6mฺภภภp่ะ!$''‹e๊๊๊€ฤฤDL˜0 …iiiจ[ท.:v์h฿พ=ภ2™ :::ฐณณรญ[ทJŒทSงNะิิDFFNœ8!ถ—ŸŸ๚๕๋ปž‘‘๔๕๕ัฏ_?t๊ิ %ถัฉS'\บt ซVญ‚——Wฉวฑ4๙๙๙ศฯฯวนs็ฐvํZŒ1[ถl๐rดu๊ิฉวš5kเใใƒ)Sฆ`ฬ˜1Eถ5n81้…Bมค”ˆˆจ ซ๒ ฉŽ;†;wขK—.Xธpaก๗E%zzzzโฯ2™ ็ฯŸ‡šš๊€rƒ† b๖์ูx๖์™XฆฅฅPSSS๙นดนกU*•จ]ป6 ีQWWงdgg444‹ฝ{๗"** [ถlมO?Tl3fฬภ/ฟ‚ฯ?มมม่ืฏ6lXโ6JbaaN:‚ƒƒ1qโD•๒?K–,All,พ๛๎;๔่ัฃุถดตตกญญ]๊6‰ˆˆจjจ๒—์oผ sss 4กกก8~ธส๛ .ภภภลถแํํ-๔คT*qแย@ff&LLL••… 6ผำธŒŒPฃF ์ทภหŽ._พ ฐดดDBB”J%vํฺx๖์าำำ„™3g"!!กฤ6์์์๐ห/ฟ >> 6DXXZถl‰ิิิbทQ’๖ํใ่ัฃ€#GŽ I“&€}๛๖มฮฮณgฯF๗๎q้า%Œ?fff๏๎`QฅVๅา#GŽ@.—รษษ ๙'ฌฌฌT๗่ัฦฦฦหๅหๅโอ@ฏ๚๙็Ÿุูู‰7&?M›6Eห–-ห=๗ฒ$QQQ˜5kเ่่ˆ3gฮ&L˜€^ฝzมรร€ŒŒ ยมม;v็ŠืFjีชก_ฟ~8w๎fฯž bทผผมฉN:ธs็4h€qใฦx9Z|๒ไIุcฺดi˜7o€—si๗์ูƒํทฃ]ปv…F™‰ˆˆˆd‚ RAT…B###ŒŒ ƒŠ;หd–็R‡P!ไๆๆ"::ํฺตƒฆฆฆิแP)ุ_•๛ฌr๙๛ซเ๏wzz: Kฌหแ*""""’Tลnชย๖๎‹oฟVeY›6m๐ร?H‘t˜J R‡ADDDT!๐’=IŠ )IŠ )IŠ )IŠ )IŠwูSฅ1ม๕;Kฝc!%""""I1!%""""I๑’=U›^':E–๕jิ๏?ކˆˆˆސ‘ค˜‘ค˜‘ค˜‘ค˜‘ค˜‘ค˜‘ค˜‘ค˜‘ค˜ViiiXถl™ิa”ษ‹/ะบuk่๋๋c์ุฑ*eืฏ_‡lmmแไไ$Q„DDDTู0!ญJJH๓๓๓ำXž>}Zbน††&Mš„Yณf*๋ท/fฯžK—.a๏ฝen“ˆˆˆ>lLH฿ณ{๗๎มำำŽŽŽหๅ8y๒คส๛+Wฎ`๘๑ธpแ1kึ,ฌXฑ!!!๐๕๕Eฯž=๑๐แCt์ุ...๐๖๖ฦีซW‘‘‘puu…\.G฿พ}กT*-Zดภ˜1cเไไWWWฤฦฦขu๋ึจWฏv๏](ฦผผlllเํํบu๋Š๕ๅr9๎นƒผผ<ฌYณ๑๑๑011ADD<<<]ปvop รš5k ฆฦQa2Aฉƒ *‰Bก€‘‘"ฯ ]#"๋๔jิ๏?ŽŠŠ“››‹่่hดkืšššR‡Cฅ`U>์ณสๅC๎ฏ‚ฟ฿้้้ฅ^ํไIŠ )IŠ )IŠ )IŠ )IŠ )IŠ )IŠ )IŠ )IŠ_J•FHฝ๎066–: """zว8BJDDDD’bBJDDDD’bBJDDDD’bBJDDDD’bBJDDDD’bBJDDDD’bBJDDDD’bBJDDDD’bBJDDDD’bBJDDDD’bBJDDDD’bBJDDDD’bBJDDDD’bBJDDDD’bBJDDDD’า:ขา‚ศศศ€ฆฆฆฤัPirss๑๙s( ๖W%ภช|ุg•ห‡_ …ภ/ Rช๐žƒกก!ชWฏŽ/พ๘ฯž=๛๗โร0cฦ ธบบยภภฆฆฆ่ิฉRRRT๊deeaศ!066†พพ>บt้‚‡ชินu๋กงงSSS|๕ืศหห๛/wๅƒ๑๋ฏฟB.—‹OwwwGLLŒXฮชธ~๘แศd2Œ9R\ฦzsLHฉBฐaFษ“'ใ๙๓ppp@@@=z$uhœฬฬL888`ัขEE–ฯœ9 ,@dd$ฮœ9ƒjีช! YYYbฯ>๛ —.]ย๛ฑkื.;v _~๙ๅต ŒฃGbศ!8}๚4๖๏฿\๘๛๛#33Sฌ3jิ(์น7nฤัฃGq๏=t๎Y,ฯฯฯG`` rrrp๒ไIฌ\น+VฌภคI“คุฅ*ฏN:๘แ‡‡ุุXดjี ;vฤฅK—ฐฟ*ชs็ฮa๑โลหๅ*หู_ๅ U`อš5† "พฯฯฯ,,,„3fHถn*พW*•BญZต„Yณf‰หาาาmmmaบu‚ Brrฒ@8w๎œX'&&Fษdยปwณุ?D=Gแe฿hjj 7n๋\พ|Y œ:uJAˆŽŽิิิ„ˆu~๕WมะะPศฮฮowเUฃF aูฒe์ฏ *##Chุฐกฐ~มืืW1b„ */ސR…•““ƒธธ8๘๙๙‰หิิิเ็็‡SงNIฝ๎ฦx๐เJ_มออM์ซSงNกz๕๊pqq๋๘๙๙AMM gฮœ๙ฯcคงงjึฌ ˆ‹‹CnnฎJ5iาฑJูรฬฬLฌ…B!Žฺั๛‘ŸŸ๕๋ื#33๎๎๎์ฏ jศ! T้€ฟ_ๅฅ!uDลy๘1๒๓๓U~aภฬฬ Wฎ\‘(**สƒ ศพ*({๐เLMMUส544PณfMฑฝ{Jฅ#GŽ„งง'์์์ผ์ ---Tฏ^]ฅ๎๋UT”ัปwแยธปป#++ ๚๚๚ุบu+lllภช`ึฏ_๓็ฯในs…ส๘๛U>LH‰ˆชฐ!C†เโล‹8~ธิกP)7nŒ„„คงงcำฆM่ป7Ž=*uX๔šทocฤˆุฟ?tttคงสเ%{ชฐ>๚่#จซซบ3๑แร‡จUซ–DQQQ ๚ฃคพชUซVก›ั๒๒๒๐๏ฟฒ?฿“กC‡bืฎ]8|๘0๊ิฉ#.ฏUซrrr––ฆR๕*ช? ส่ำาาBƒ เ์์Œ3fภมม?๔๛ซ‚‰‹‹รฃGะดiShhh@CCGล‚  กก333๖W90!ฅ KKK ฮฮฮ8x๐ ธLฉTโเมƒpww—02zตต5jีชฅาW …gฮœ๛สiiiˆ‹‹๋:tJฅnnnyฬU™ :t(ถnŠC‡มฺฺZฅููššš*•’’‚[ทnฉ๔ื… Tฑ~ยฦฦๆฟู‘œRฉDvv6๛ซ‚iบ5.\ธ€„„๑ๅโโ‚ฯ>๛L™UR฿UET’๕๋ื ฺฺฺยŠ+„ไไdแห/ฟชWฏฎrg"7222„๘๘x!>>^ ฬ;Wˆnผ)‚ ๐รB๕๊ี…ํท IIIBวŽkkkแล‹bmฺดœœœ„3gฮว6l(t๏]ช]ชฒ $ GŽ๎฿ฟ/พž?.ึ8p ๐๑ว ‡bccwwwม],ฯหห์์์!!!Aุณg`bb"Œ7NŠ]ช๒ฦŽ+=zTธqใ†””$Œ;Vษdยพ}๛A`Utฏe/์ฏ๒`BJฯ?,|๑ว‚–––ะฌY3แ๔้ำR‡๔A:|๘ฐ ะซw๏‚ ผ|๔ำฤ‰333A[[[hบต’’ขาฦ“'O„๎ป ๚๚๚‚กกกะทo_!##C‚ฝฉฺŠ๊'ย๒ๅหล:/^ผ,ิจQCะำำ‚ƒƒ…๛๗๏ซด“šš*ดmVะีี>๚่#aฬ˜1Bnn๎ผ7†ฯ?\ฐดดดดดกu๋ึb2*์ฏŠ๎๕„”๕ๆd‚ าŒอq)IŒ )IŠ )IŠ )IŠ )IŠ )IŠ )IŠ )IŠ )‰233accƒgฯžIŠ [[[œ:u๊ึฑฒฒย๑ใว฿SDoๆ๊ีซhผนิaUXLH‰ˆ*+++TซV ™™™โฒ็ฯŸรภภVVV*๕๔๔๔ ฏฏccct๋ึ OŸ>Ui+!!แ“ ศศHt์ุ๚๚๚oต๏ฺฅK—เ๎๎Ÿl๋ศ‘#hะ สฒ>}๚`๊ิฉๅnณQฃFจUซv๎๙ถแUILH‰ˆ*˜ฺตkcถmโ๛ํทรผPฝ}๛๖แูณgธu๋rrr๐๗฿ซ”๏ูณmฺดyฃm๖o่ฝ{นโ~yyy๏}Eมพv๏ห–-“8ขЉ )Qำฝ{wDEE‰๏ืฌYƒฯ>๛ฌุ๚ีชUCPP._พฌฒผ !}๑โบw๏Žš5kขfอš๐๖๖.ฒ[ทnแฝ{ฐทท—YYYaึฌY๘ไ“O```€I“&!%%...022ยภลบJฅ“'OFบuannŽแร‡#;;ฐbล ดlู €‘‘–/_Žaaa055Eฝz๕ฐrๅสb๗๑ีห๏ปvํBใฦลQใ๕๋ืปษ“'ัจQ#ใซฏพ‚Rฉห-Z„† โฃืฮ†4ีพqN]"ฌ9ำๆš[งฺ[†Yๅ๚ƒ93K)ฌ ฑ’zQ‰ฝะˆ‚„„ (* ฤj†จ/”Œ0อ„ะDlb$2ำใ7อ)9ปžโ!7๕yx`~^ŸW็น๏s]๗ู›‹s๎s!55ใใใ˜žžFll,::: P( P(PTT„โโbไไไ@กPHsniiATT?Jื–ษdศฯฯวฦฑ~@TT๊๊๊VT1ฮุ’cŒฑeCjhh NGิ฿฿O:ŽšššH„9ผyCDDvปโใใ้ึญ[า๙ััQาh44==M>ค๘๘xr8455E.cWWWSDDฤผ|L& ‘ลb!___ŠŽŽ&ซีJข(Rpp0ฝz๕Šˆˆ ศh4RWW า๎ปฅœ ษ› izzš>|˜233irr’, ญ[ทŽš››—ู๙SSS‰ขHญญญnวlถDQค๎๎n2๔ไษ""z๖์………Qgg'9:}๚4effQ}}= †9ืJMMฅœœฉ=66FZญ–สหหษ้tRee%้๕zš˜˜ ""t๔่Qฒํไp8คqJฅ’ฺฺฺ\ๆหุJฦOHcl™๑๖๖ฦ‰'PVV†ฒฒ2?~๓๚ลฦฦBฅR! ํํํธx๑ขtฎฎฎ&“ ^^^หๅBGG|||>!ตูl.ืŽ^พ|kึฌAhh(ยรรa6›กื๋กัh`2™ะ x๚๔)ฎ]ปN‡ภภ@ผyฅฅฅาu ฮž= ///ุํv444 77พพพ Err2***ฝ?rน‹?„Fฃัht๗ส•+ะh4ะjตศศศ@YY€™ฅ ููู~~~ธ~:สหห=ซบบ[ถl‘›„„จีjผ{๗N๊“••ฅR ???้ทีซWรnท/9c+คŒ1ถ 9s%%%(..v๛บ๙๓็ฐูlp8HHH@\\œt๎ฯ๕ฃ)))8x๐ !rss]^ฯ฿฿฿ๅื๕jตZ:๖๓๓›ืžำำำƒ๕๋ืK็A@OOิึ้tาฑีjลไไ$ึฎ] •J•J…วฃททwม๛ๅๅๅจฌฌ„NงƒูlžทTแOzฝ~ฮฑ(ŠR๔๔t)๖ž={000ฐh์?๓๚ต4^ฅRมbฑธ๏ฌฑฑ1๘๛๛/9c+คŒ1ถ m฿พรรรAddไ‚}}}}‘’’‚OŸ>appภฬO111€UซVแ๖ํhooว‹/๐เม444ฬปฮึญ[๑๛๗ณVซ…ีj•ฺVซZญVjหd2้8$$ …###ฐูlฐูlรฃGณs็Nิิิ ฏฏแแแsž ]WWืœใูรBBBPTT$ลถูlาฮๆ้*๗ู๑111๓ฦ'''ปำ งำ ƒมฐ่[iธ eŒฑeชขขbIฏฐงฆฆPRRตZภภ@ดตตAฉTJลW}}=Z[[๑๛๗o(•J๘๘๘ธ\ 4 ZZZUพ'Ožฤฝ{๗ะแแaไไไเิฉS.๛†„„`ืฎ]ธqใœN'>Œฏ_ฟ.ใืฏ_())ม่่(ไr9 …หนฬสหหC__DQฤ๛๗‘””8<๎น#เข(ขถถภฬแ9[oฉีjtvvJํ#GŽเห—/จชช‚ำ้ฤฤฤjkk|฿ุุˆภววgม92ถqAสcห”ัh\p}ไกC‡ P(„๚๚zTUUA&“อ๎IE$$$@ฉT"22้้้nื‘ฆฅฅอY๗๙Oคฅฅ!11;v์€ัhDxx8ฒณณ๖/..ฦ?ฐiำ&จีj\ฝz‹ฦ)**‚ ภห—/‘ŸŸ๏ถoRR๖๎‹ฐฐ0DGGในsfv2HKKC\\”J%L&“T oผวŽƒ^ฏ‡Jฅ0Sภพ*• —.]‚ฟฟ?jjj——ตZ 6   `มผKKKqแย…E็วุJ$#"๒tŒ1ฦ;fณYYYุทo฿?;>>ŽศศH|๘๐aูmŽฟ์ทoHIIมทo]. `lฅใ‚”1ฦฯฝ{หๅžN…1ฦ–„ RฦcŒ1ๆQผ†”1ฦcŒyคŒ1ฦcฬฃธ eŒ1ฦcล)cŒ1ฦ๓(.HcŒ1ฦ˜GqAสcŒ1ฦ<Š RฦcŒ1ๆQ\2ฦcŒ1โ‚”1ฦcŒyิ_ฝ:*.“&2๓IENDฎB`‚c4core-bm-charconv-atox-mega_bytes_per_second-u32.png000066400000000000000000001060271477602032300327110ustar00rootroot00000000000000c4core-0.2.6/doc/img/linux-x86_64-gxx12.1-Release‰PNG  IHDRคฺˆ 9tEXtSoftwareMatplotlib version3.5.1, https://matplotlib.org/ุa๒ฝ pHYsaaจ?งi‹„IDATxœ์wxี๛๗๑wา ˆtฆ‚ค‰ช@$ JSคŠ_‘Ž(JQTะ€จH้Uz‘")€‘T$ูH!™็žฬ% „,ฤฯ๋บ๖";sๆฬ=w–;gฮฬฺ†a """"b#๖ถ@DDDDTŠˆˆˆˆMฉ ›RA*""""6ฅ‚TDDDDlJฉˆˆˆˆุ” Rฑ)ค""""bS*HEDDDฤฆTŠไ'N`ggว๘๑ใmJ–ž}๖Y|||lFถูููัซW/[‡!7bggวฦmส^—.]pssณu\—.](SฆŒญรx่ฉ •”ƒ2bฤNœ8a๋PDlb๛๖ํŒ1‚ุุุlต?|๘0๚๕ฃFธธธ`gg—ๅ;;;์์์่ึญ[ฆ๋lถ๙๛๏ฟ๏๑ฯœ9s˜8qโฟ๎็a’I๎Š+1bDฆ๋๚๕๋G•*U(Xฐ y๓ๆๅ้งŸfฤˆ\นrลช๎ป้ีซไห—วœvํฺqไศ‘ปŽ็n฿?๎† R๙O9x๐ #GŽTA*Yทogไศ‘ู@ูฑcŸ}๖๑๑๑<๔ำwl๏โโย?Hrrr†u฿=...wr–๎ฅxซSงืฎ]ฃN:๗-Ž๛Ii๎๓ีW_q๘๐แ{ฺvลŠŒ92ำuปw๏ฆvํฺŒ9’O?”z๕๊๑แ‡าจQ#าาาฬv}๔?๘# 4เำO?ๅตื^c๓ๆอTฉR…๛๗฿Uวu๑โล๘๘๘เ์์Œทท7ซVญ2,Xฐ;;;6mฺ”!–)Sฆ`ggg๕๚ธ›ืลฆM›xใ7(\ธ0%K–dฤˆ 8€ฒeหšnwฦ `ม‚ธปปg+w%J” N:^Wณgฯฦืื7s”ใใใ้ท/eส”มูู™ย… ๓sฯ๑๋ฏฟ7ๆ;/_พœ“'Ošว‘>O/๕9w๎\† B‰%ศ›7/‹%ำ9ค้sง๏๔บ‡๏5aaaไห—ย… ำฏ_?Vฏ^กฯฃGาบukŠ-Š‹‹ %K–$<<œธธธ,๙vว๐็Ÿ๒ส+ฏPคH\\\๐๗๗็ป๏พหV>ำmบ•gžyส•+วŒ3ฌฺ1;;ป งฟฆn~ญค๗นqใF๓ฆฏฏฏ™‡… โ๋๋‹‹‹ UซVe฿พ}™ฦ๖วJพ|๙(^ผ8ฃFส๐)--‰'โํํ‹‹ EŠก{๗๎\พ|9ำใฬ์bํฺติชU‹๙๓ใๆๆF… x๗wญถฯ๎{Ef๙€ฬ็(฿:‡๔ๆ๋ ฆNJ๙๒ๅqvv&((ˆปw[m7y๒dเฆรd๖ปน๕๘ซฯญ5jXฃO>๙$>หn็^?๎†FH%Wุฝ{7ทo'<<œ’%Krโฤ พ๒Kž}๖Yใw฿5O?ฆ;bฤFŽIHHฏฟ:‡ๆห/ฟd๗๎lถ GGG>๔S~๙g:w๎ฬŽ;ppp`ส”)ฌYณ†™3gRผx๑;ฦ:cฦ โใใู้ณ'‰‰‰|๚้งิฏ_Ÿ˜˜Š)ภจYณ&%J”เw!_พ|๐รดhั‚‘–-[Z๕๙ๆ›oR @†ฮ‰'˜8q"ฝz๕bผyf›้ำง๓๒ห/ใํํอ AƒศŸ??๛๖ํcีชUt่ะมlw๙๒e5jDซVญhืฎ ,เ๛พพพ4nุjฟcฦŒมีี•wy‡฿ฯ?GGG์ํํน|๙2#FŒ`็ฮLŸ>ฒeห2lุ0s/ฟoooยยยศ“'K—.ๅ7 --ž={Zํ็๐แรดo฿ž๎ป๓๊ซฏRกB…Ls;dศ>๘เฆL™ยซฏพj.๏ิฉ›6mส๐!wซิิTžyึฏ_Oxx8}๚๔!>>žตkืฒ~ส—/a„……ฑaร^yๅXฝz5ไ์ูณ|๒ษ'V}nบ•… ๒ฦoเ๎๎ฮgŸ}F๋ึญ9u๊^^^4mฺ777~๘แ๊ึญkตํผy๓๐๖๖6‹ธป}]ผ๑ฦ*Tˆaร†‘@ใฦ9rไ฿=Ÿ|๒ =๖… บm^๎V‡่ำงWฎ\มออ๋ืฏ3|๚๗๏Obbbถ๚่ัฃ , Wฏ^TชT‰K—.ฑu๋V~๛ํ7ชTฉยเมƒ‰‹‹ใฬ™3fฮoฝ@ๆฝ๗รษษ‰ทz‹คคค ส7หฮ๋>!!๚๕๋sy๚๔้CัขE™3g6lฐ๊+99™ะะP’’’x๓อ7)Zด(gฯžeูฒeฤฦฦโ้้™i ท;ฆkืฎ๑์ณฯ๒๛๏ฟำซW/ส–-ห๙๓้าฅ ฑฑฑ๔้ำ็Ž9๗฿iำฆ ฏผ๒ ;wๆ›oพกK—.TญZoo๏;nŸUŸ:t {๗๎ผ๔าKŒ?žfอšมป๏พหoผxฏhืฎ‡ฦฦยRSSiิจีซWg์ุฑฌZตŠแร‡s๚uFeถ๋ฝ;ำงOงkืฎ๔๎›ใว3iา$๖ํgพ?งห์โภ<๓๘๙๙1jิ(œ๙๗฿ูถm›ี๑d๗ฝโ~˜3g๑๑๑t๏;;;ฦŽKซVญ๘ใ?pttค{๗๎œ;wŽตkื2sๆฬL๛ธ~:ฑฑฑ$''ณ~† ‚ปป;ฯ<๓ฬm๗m/^ผซ฿{ซVญ์๛‡!’ \ฝz5รฒ;v€1cฦ sู๙๓ ภุฐaƒU?ำprr26lhคฆฆšห'Mšdฦ7฿|c.[ฝzตฃG6๘ใรอออhัขลc<~ธฎฎฎฦ™3gฬๅฟ๒‹๚๕3—5hะภ๐๕๕5อeiiiF5Œ'Ÿ|า\๖ํท฿€bคฅฅ™ห๛๕๋g888ฑฑฑ†aFllฌแ๎๎nTซVอธvํšU\7oWทn 9KJJ2Š-jดnฺ\ถaร0|||Œไไdsy๛๖ํ ;;;ฃqใฦV๛6J—.mต,ณ฿YhhจQฎ\9ซeฅK—6cีชUฺFฯž= ร0Œ๖๖๖ฦ๔้ำ3ดK?ฎ;๙ๆ›o ภ๘๘ใ3ฌKฯำโล‹อ฿อฺดicุููฟปU|NNNVหขขข ภ๘๓ฯอeํท7 .l\ฟ~\vyร5j”น์n_ตjีฒ๊ำ0 cธq`?~Ž๙ธีถM}๓ฯ?†“““1sๆLร0 c๙๒ๅ†qโฤ c๘๐แ`๕ื_ท—งงง๙ปอJำฆM3ผฎ ใ^Ÿๅส•ห๐:K_w๓{@v_๗&L0c๑โลๆฒkืฎ+Vด๊s฿พ}`ฬŸ?ถ๑฿อ1Mœ8ัŒYณf™ห’““เเ`รอออฐX,ทํ7ัๆอ›อe๙งแ์์l 0ภ\–๛นU๚k๊ๆ฿}zŸทo7—ฅฟ?บบบ'Ož4—O™2%C;w๎lฦ›oพi.KKK3š6mj899™ฏ‘-[ถ€1{๖lซ˜VญZ•ayV๏Ÿ|๒Iถ^wู}ฏศ,†‘๙๋ซs็ฮVฟำ๔ฯ///ใŸ1—๔ำO`,]บิ\ึณgฯฦ“9—จPกB†ฯทฬฬœ9ำŒฏฟ๚Žmo๖o?๎Dง์%Wธy~PJJ —.]โ‰'ž ๆ)พYทnษษษ๔ํื๊ฏ๗W_}–/_n.kุฐ!ปwgิจQดjี —žBพU‹-(Qข„๙™gžกZตjฌXฑ€๙‡Ÿ™vํฺฯ฿อ฿อฅK— ๅ่ัฃœ={ึชฯื^{อ๊TNํฺตIMMๅไษ“ภSU๑๑๑ผ๓ฮ;ๆฯz ศออ—^zษ|๎ไไฤ3ฯ<ร‘แX:u๊d52QญZ5 รเๅ—_ถjWญZ5NŸ>อ๕๋ือe7ฮโโโ๘๛๏ฟฉ[ท.๑G†ำšeห–%444รแฦ_๚ฝz๕โำO?eึฌYt๎9C›7fkฤใวไฑวใอ7฿ฬฐ.=O+Vฌภมมฝ{[ญ0`†aฐrๅJซๅ!!!”/_|๎็็‡‡‡‡U>_xแ๓Oซำ| , --^xธทืลซฏพŠƒƒร๛~+P 5โ๛๏ฟnŒีจQƒาฅKgป๙๓๓ห/ฟd{Lf:w๎œํนƒูyฏZตŠ%Jf.sqqฑฬะีซWs๕๊ี{Žf+Vฌ hัขดo฿\ๆ่่H๏ฝนrๅJฆS>nUฉR%jืฎm>/Tจ*Tศ๔vvUชT‰เเ`๓yตjีจ_ฟ>?x†ๅ™ํ๋ๆ[ทฅOsINNfบuฬŸ?OOOž{๎9๓u๗฿SตjU2ŒPg๖~‘?~~๚้'ซ ~n•๗Š๛แ…^ @ๆ๓๔฿อ>*UชฤฺตkYผx1oฟ6๙๒ๅหp•ญ:Dฯž= ฮ๔าVTJฎpํฺ5† fฮ้{์ฑว(Tจฑฑฑทณ•.ฝpป๕Tฐ““ๅส•3ืง?~< $22’ฯ>๛Œย… g;ึ'Ÿ|2รฒงžzสœ‡๓๛๏ฟcC‡ฅPกBVแร‡7ๆ’์ๆ7~ภ|“KŸ_•>1;๓๗J–,™กH-P @†นZ™ํ7ƒธTฉR–งฅฅY.ถmFHH๙๒ๅ#*Tศœฯ•YAš•3f0y๒d>sซ๋{q์ุ1*Tจ@žŽ;Fƒ จXฑ"1ฅJ•ยษษ‰+V๐ษ'Ÿd๘n”ซfอšDFF2iา$ฺตkGม‚ณlk ูษงณณ3-Zด`ัขE|๑ล\ผx‘mถ๑ม˜m๎ๅuaห+‹รยยpvvฆs็ฮ$%%ัฎ]ปปฺพ]ปvิฎ]›E‹ฑfอฦวG}ฤย… 3ฬeฮส?0aยบt้ยO?ฤš5k่ป7cฦŒa็ฮ”,Y๒ž๚ทฒsŒY]4“ššzW}ฯ|ฆฅฅQธpafฯž้๚[็0f๖{wuue๓ๆอlุฐๅห—ณjี*ๆอ›G๚๕Yณfอ]fw›งฬ๏ื˜็ูฑcGๆฮ‹ฟฟฟีบธธ87nLll,[ถlษึ59Iฉไ , s็ฮL˜0ม\–˜˜˜แ^iYฝ‰คŸJ<|๘ฐี_๋ษษษ?~œsYBB]ปvฅRฅJิจQƒฑcวาฒeK‚‚‚ฒ๋ัฃG3,;rไˆyud๚ญ๖๛oคŸ2ฟ†ขล–.]JRRK–,ฑ%ธ๕ิ[v<๑ฤŒ;–gŸ}–Fฑ~๚ปบ*fๅห—็—_~!%%%ห[ต”.]šu๋ึoตŸ๔+s๏ๆด๔อ^xแพ๛๎;ึฏ_ฯoฟ†aๆ้zธฏ‹;]ฅ{ฟธบบาขE fอšEใฦอ ๎Fฑbลxใ7xใ7๘๓ฯ?ฉRฅ ๏ฟพYๆิฑค+]บ4ฤ0 ซ}๛๏™ถ๗๕๕ลืื—!C†ฐ}๛vjึฌIDDฃGฮrท{ŠŽŽ&--อj”๔฿พ๎n•>Jkžๆ†์ภ‹ดด4๘ใsT0oุžžXพ|yึญ[Gอš5ีY๖๖๖4hะ€ ๐๑ว๓ม0x๐`6lุpืงnฮำอ๎wž๎๖5ž”””แl๘ห”)S8|†ํ3ปำ4lุwwwฦŒ“แ*็œš/uณ๔‘›๗วท฿~{O๙๙๙ฑbล ~๛ํ7š5kฦตkืฌึg๗V.ญ[ทๆ๏ฟfาคIึฅวฺคIRSS3ด๙ไ“Oฐณณห๖่ญBBB(Xฐ ๓ๆอcผy<๓ฬ3Vง๏ื๋"ซย[oฝล๐แร:t่]m—šššแตpแย/^๊Yพ|๙ีi๐ปสูณgญnณ•˜˜ศW_}eีฮbฑXอ—†ลฉฝฝ฿'ฒ:ฆ&Mšpแยซiืฏ_็๓ฯ?วออ-ร๎U๚ฏ›7o6—%$$d๛๖R๗โๆK†a0iา$iะ pcด<55•๗{/รถ้W™฿ษ?“aY@@€ี๏$ป๏™ๅ)55•ฉSงqป‘ีืุุXRRR2ดŸ6mVqฝ๐ย ์ุฑƒ๙๓็[อ๙ฝ_๑!•\แ๙็Ÿgๆฬ™xzzRฉR%v์ุมบu๋๐๒๒ฒj€ƒƒ}๔qqq8;;›๗ย4h#GŽคQฃF„……q๘๐aพ๘โ ‚‚‚ฬ‹~๙gพ๘โ †N•*U€๗ำ|๖ูg:thฆ๗-ผีO๙„nบD‡(P QQQ\ฝz๕~ุdฆaร†899ัฌY3บw๏ฮ•+W๘๊ซฏ(\ธpฆลVvTฏ^Ÿ~๚‰&MšะฆM/^lŽrf๗V.:ubฦŒ๔๏฿Ÿ]ปvQปvmXทnoผ๑อ›7งYณfิซWมƒsโฤ Yณf ?๔}๛๖ตบ€้n8::าชU+ๆฮKBBใวฯะๆ~ผ.ชVญ ธลPxx8ŽŽŽ4kึ,ห›ๆวลล™๗tMฟEฮคI“ศŸ??๙๓็ทบ ๅVNfG||<%K–คM›6๘๛๛ใๆๆฦบuุ๋ฝ{ทีYชUซ2o<๚๗๏OPPnnn4kึ์ฎ๗—]ปwgาคIดo฿ž>}๚PฌX1fฯžm^(˜>z๔๓ฯ?ำซW/ฺถmหSO=ล๕๋ื™9s&ดn๚ถ๛ศ๊˜^{ํ5ฆL™B—.]ุปw/eส”aม‚lถ‰'๓Y[5lุวœW^y…โเเภ7฿|CกB…8u๊ิ}ูวอ\\\Xตj;wฆZตjฌ\น’ๅห—๓๎ป๏šงโ๋ึญK๗๎3f ‘‘‘4lุGGGŽ=ส๙๓๙๔ำOiำฆอm๗3jิ(6oLำฆM)]บ4๙'_|๑%K–คVญZfป์พWx{{Sฝzu ฤ?Cม‚™;wn†?Dญ๔ฏฝ{๗&44ยรรูธq#ฝ{๗ฆM›6<๙ไ“$''ณeห.\H`` ีz `ษ’%4kึŒ๙'ร๐on›xฒ๛qW๎๛u๛"6p๙๒eฃkืฎฦc=fธนนกกกฦกC‡ŒาฅK;wถj๛ีW_ๅส•32žcาคIFลŠ GGGฃH‘"ฦ๋ฏฟn\พ|ู0 รฐX,F้าฅ*Uช)))V}๖๋ืฯฐทท7v์ุ‘eŒ้ท๚7nœ1aยฃTฉR†ณณณQปvm#***C๛cวŽ:u2Š-j8::%J”0žycม‚f›๔[์ฝjฬn=b†ฑdษฃF†ซซซแแแa<๓ฬ3ฦ๗฿oฎฏ[ทฎแํํ!–[o[’ญทตษ*žฬn๕ณdษรฯฯฯpqq1ส”)c|๔ัGๆm—nฝตLำฆM3&ิฐพํSบŸ~๚ษศ“'๑ย /˜ท๐ส๎ญ\ ใฦํจl”-[ึptt4Š-jดiำฦ8v์˜ู&>>่ืฏŸQผxqรัััx๒ษ'qใฦYB+ซ๘า้ึืฅaฦฺตk ภฐณณ3NŸ>i|ๆu‘๎ฝ๗3J”(aุ฿๑.้ฏฬทž(ซใฝYvn๛”””d 8ะ๐๗๗7|๙๒ฦ_|aี๎ส•+F‡Œ๙๓[ล“ี๋๓ๆuท๖);ฏ{ร0Œ?๘รhฺดฉแ๊๊j*Tศ0`€๑ใ?€ฑs็Nณอห/ฟl”/_pqq1 ,hิซWฯXทnmssปc2 รธx๑ข๙>็ไไd๘๚๚฿~๛ํ๛4Œฌีญ[ืจ[ทฎีฒฝ{๗ีชU3œœœŒว๘๘ใณผํSf}f๖:ธ๙/]็ฮ|๙๒วŽ36lhไอ›ื(Rคˆ1|๘pซ๏ฅ›:uชQตjUรีีีpww7|}}ท฿~8w๎cZฟ~ฝัผysฃx๑โ†“““Qผxqฃ}๛๖ฦ‘#G2ไ#ป๏วŽ3BBB gggฃH‘"ฦป๏พkฮฮmŸnฮE:ภ>|ธ๙๚๕๋ฦ›oพi*Tศฐณณ3c๛๗฿N:ๅส•3\]] ร>|ธqๅส•L)ซวบ›๗ปag68_'""’KLœ8‘~๚qๆฬซ[บ‰H๖ฉ ษฆkืฎY]X“˜˜Hๅส•IMM5/ฦ‘ปง9ค"""ูิชU+qˆ‹‹cึฌY:t(ห[‰< ฎ\นrว๊*T่ทTฉˆˆH6…††2mฺ4fฯžMjj*•*Ub๎นVท่yิŒ?ž‘#Gถอ๑ใวอ[q=:e/"""๒๖ว๑›ะjีช•แซง๏'ค""""bSบ1พˆˆˆˆุ” R‘\๎๔้ำธธธ˜7ถฯ 6nˆ7nื}=๛์ณ๘๘๘๛ ีซWท๚’ ‘G… R‘l˜>}:vvvุููฑu๋ึ ๋ ร TฉRุูู๑๓ฯ[ญK฿.‘/_>*Uชฤ่ัฃนz๕jฆ๛‹‰‰มฮฮŽ]ปvุ๋GEตjีจYณๆฟ๎Kฒ็ƒ>`๑โล–o฿พ#F<ฐฏn฿วไษ“นpแย้_ไAQA*"r\\\˜3gN†ๅ›6mโฬ™38;;gบsฯ=วฬ™3™9s&&L rๅส :”ฮ;gฺ~๙๒ๅ.\˜   ๏_ลw฿}G=U?›:u๊pํฺ5๊ิฉc๋P2uป‚tไศ‘ฌ mผ9|๑ลค‘Eท}น Mš4a๙|๖ูgไษ๓oกsๆฬกjีช๗฿™n๗ิSOY}gt=HNNfแย…$&&fธzuลŠ4nุ~๔{5kึ,๒ไษ๓@ฟใn%$$๋๏พถทท W>jฎ^ฝJผyฑททงM›6ฬ˜1ƒ‘#G๋ืHNัฉˆศ]h฿พ=—.]bํฺตๆฒไไd,X@‡๎ชฏขE‹bgggUุฤฦฦฒ}๛vš6mj.›;w.UซVล|}}๙๔ำO๏ธล‹SญZ5ฌ–งฯ›ŒŽŽฆnบไอ›—'žx‚ 7F|ซUซ†ซซ+*T`บu๚ทo7ฦรร7774hภฮ;ญฺคOuุดioผ๑… ฆdษ’ๆ๚•+WRปvm๒ๅห‡ปป;M›6ๅภw<ฎฬๆ=z”ึญ[SดhQ\\\(Yฒ$แแแฤลลฑ?€ฝ{๗RฃF \]])[ถ,ฺ$%%1|๘pžxโ œ)Uชoฟ6IIIf;;;๘๎ป๏ฬi]บtaฤˆ 8€ฒeหš๋Nœ8an;kึ,ชVญŠซซ+ $<<œำงO[ลปปw/u๊ิ!oผผ๛๎ปๆ๚็ž{Ž“'O™ญใyจ น eส”!88˜๏ฟ\ถrๅJโโโฯrปฤฤD๛o๛oNž<ษœ9s๘๎ป๏่ะกC†‚t๕๊ีุููัฐaCึฎ]K๛๖ํ)P }๔~๘!ฯ>๛์/RJIIa๗๎TฉR%ำ๕—/_ๆ๙็ŸงZตjŒ;gggยรร™7oแแแ4iา„?„„ฺดiC||ผนํจ]ป6QQQผ๖ :”ใว๓์ณฯ๒ห/ฟdุืoผมมƒ6l๏ผ๓3gฮคiำฆธนน๑ัG1t่P1ื*T€๗฿ŸN:๑ไ“O๒๑วำทo_ึฏ_O:u2รฅK—hธ1Lœ8‘z๕๊™๋ชVญ ซ.b“CDD๎่oฟ5c๗๎ฦคI“ wwwใ๊ีซ†aFถmz๕๊†aฅK—6š6mjต-้ฃE‹Fbbb†}u์ุัจ[ทฎ๙ผOŸ>†‡‡‡q๚๕ปŠ๙๗฿7ใ๓ฯ?ฯฐฎnบ`ฬ™3ว\v่ะ!0์ํํ;wšหWฏ^mฦท฿~k.kัข…แไไd;vฬ\v๎9รจSงŽน,=oตjีฒŠ?>>ศŸ?ฟ๑๊ซฏZลuแยรำำ3ร๒[mุฐมŒ 6†a๛๖ํ3c๙ทOJ&าs1aยsYRR’`.\ุHNN6 ร0fฮœiุ[ถlฑฺ>""ยŒmถ™ห๒ๅหgt๎9รพฦgฦ๑ใวญ–Ÿ8qยppp0}ซๅ111Fžwrrข{๗๎๙็Ÿ์ป€๙๓็๓๔ำOSฑbEซ˜๋ืฏpื1฿lแย…คฅฅัฎ];ซพ‹-ส“O>™กogggบvํše ศr>ณศรH5‰ˆฅB… ยœ9sธz๕*ฉฉฉดiำๆถ”,Y’๓yXX^^^ผ๕ึ[,[ถฬผ่h๗๎๕ื_V้oผม?@ใฦ)Qข 6ค]ปv4jิ([๑Y|!_ษ’%3\๔โ้้IฉRฅ2,ƒงตแฦ•๛Wฏ^ฅB… ๚|๚้งIKKใ๔้ำx{{›หห–-kี๎่ัฃf1w+Reห–ฅ|๑วฬž=›ฺตkฦK/ฝdฦ;ล‹ฯpกีSO=ภ‰'จ^ฝ:Gๅท฿~3Oฑ฿๊ฯ?ผซ˜ov๔่Q รเษ'Ÿฬtฝฃฃฃี๓%Jเไไ”e†a่‚&yคจ น:tเีW_ๅย… 4n˜๙๓฿u 4`๓ๆอfAบbล ส”)CฅJ•ฬv… &22’ีซWณrๅJVฎ\ษท฿~KงN๘๎ป๏ฒ์฿หห ๘ฟB๒V7XfgyV…mvธบบZ=OKKnฬท,Zดh†๖ทฮซอŽ &ะฅK~๚้'ึฌYC๏ฝ3f ;w๎ดบ๊^ฅฅฅแ๋๋หวœ้๚[ ๙ปํฮฮŽ•+Wfš[/Jป5ŸทŠๅฑวป็xDrš R‘{ะฒeKบw๏ฮฮ;™7o=๕q๚uฎ\นb.[พ|9Mš4ษะึษษ‰fอšัฌY3าาาxใ7˜2e C‡ๅ‰'žศดวWWWŽ?~O๑eฅPกBไอ›—ร‡gXw่ะ!์ํํ๏Xœ•/_ธQl฿s๎8 ึผysŒลbน๋y™ท3z๔hึฎ]KญZตxใ7ศ“'SฆL!))‰ฑcวq{พ๒K:v์H•*UงPกBœ:uŠๅห—SณfM&Mš”ํx~๙gz๕๊Eถmy๊ฉงธ~:3gฮฤมมึญ[฿q๛โล‹๓ัGqโฤ žz๊)ๆอ›Gdd$SงN5็ov์ุ‘~๘=zฐaรjึฌIjj*‡โ‡~`๕๊ี7nฝดn:>๘cŠ/NูฒeฉVญšY<˜๐๐piึฌๅห—g๔่ั 4ˆ'NะขE 9~8‹-โตื^ใญทสV.ึฎ]หใ?Nๅส•ณ?›ณ""Ž›o๛t;ูนํ“ƒƒƒQฒdIใตื^3.^ผhถkำฆัคI“ }.XฐภhุฐกQธpaรษษษx๑ว๎ป็ฯŸฟc/^4๒ไษcฬœ9ำjyบu oo๏lลŸ~ ={๖ดZ๖๋ฏฟกกก†›››‘7o^ฃ^ฝzฦ๖ํญฺ)o6l0BCC OOOรลลล(_พผัฅKcฯž=ท=ฎ[o๛๔ว/ฟฒQพ|yรลลล(Xฐ Qฏ^=cบuทํว0/{๖์1‚ƒƒ ฃt้าฦคI“2ดMNN6>๚่#รpvv6 (`TญZี9rคgถ;t่QงNรีีีฌn๕{๏%J”0์ํํ3๊ว4jีชeไห—ฯศ—/ŸQฑbEฃgฯžฦแร‡3ฤ›™ิิTฃXฑbฦ!C๎x";ร๘ณิEDไพธ~:^^^Œ3†7xใพ๖ส+ฏpไศถlูr_๛•‡ฯโล‹้ะกวŽฃXฑbถG$TŠˆ<๓Oพ๘โ บw๏~฿ ‰SงN๑ิSOฑ~zjึฌy_๛–‡Kpp0ตkืฮึด ‘‡‰ Rฑ)]e/""""6ฅ‚TDDDDlJฉˆˆˆˆุ” Rฑ)_ziiiœ;www๗;~]Ÿˆˆˆ< ร >>žโล‹co๛1Pค๒ะ;w๎ฟ[DDDNงOŸฆdษ’ทmฃ‚Tz๎๎๎?~œ‚ ฺ8š/%%…5kึะฐaC๓+ๅมQพsžržณ”๏œ๕0ๅbฑPชT)๓svTสC/4ฝปป๛}.nษ\JJ y๓ๆลรรรๆofสwฮSฮs–๒ณฦ|ggบ.j›RA*""""6ฅ‚TDDDDlJฉˆˆˆˆุ” Rฑ)ค""""bS*HEDDDฤฆTŠˆˆˆˆMฉ ›RA*""""6ฅ‚TDDDDlJฉˆˆˆˆุ” Rฑ)ค""""bSyl€Hv…NFš“›ญรศ๕œ์ ๙@ํฑ›INณณu8นž๒๓”๓œฅ|็ฌปอ๗ฏC๋็@TwฆRฑ)ค""""bS*HEDDDฤฆTŠˆˆˆˆMฉ ›RA*""""6ฅ‚TDDDDlJฉˆˆˆˆุ” Rฑ)ค""""bS*H๏ M›6Tฏ^=G๗y่ะ!ž}๖ู๛๖~8y๒$UชT! –,Yภแร‡ฉYณ&>>>TฉR…M›6ๅXL"""๒hำwู฿ฦฺตkqppธ๋ํRSS๏iป‡มๅห—)P @–๋‹+ฦŽ;pvvๆโล‹†‹‹ ฿|๓ *TเะกC4kึŒฃGfซO๙oำ้๗ีW_แ๋๋‹ฟฟ?ร‡'%%…>๘€!C†dk๛7BฃF แส•+t์ุ‘   ‚‚‚ุนs'‹/ฆZตjะผysฎ\นภ‘#G ฤ฿฿ŸฉSงv_YตอjŸ็ฮฃiำฆ๘๛๛SตjUNŸ>mี฿๕๋ืYธp! 6คWฏ^LŸ>wyวlSฆLqrrยูู€ฤฤDาาา(]บ4*T B… X, ร 00ฎ]ป๒ห/ฟd+—IIIX,ซ‡ˆˆˆไ^*H่่h&OžฬถmˆŠŠขOŸ>|๑วt๎wwwซถDDDฐgฯบu๋fฎปw/ำงOgร† Œ=šึญ[ณ{๗n-ZDฯž=จ[ท.ฟ๒ ‘‘‘ิฌY“ฏฟ€พ}๛2lุ0ขขขฬB.+YตอjŸฝ{๗ฆmถDEEฑu๋V{์1NŸ>อฐaรจTฉห–-cิจQฬž=๛Ž๙:v์พพพx{{3iาค ๋—,YB•*Uฐณณnœฮ cฤˆ2eสณฯฬ˜1c๐๔๔4ฅJ•บcL"""๒่า){nŒn†‡‡ใแแภตkืXณf ๋ึญใไษ“Vm{๔่aศดiำฬ็ตkืฆhัขภำ+Wฎdฤˆ\บt‰๋ืฏs๊ิ)ฺถmหล‹นz๕*!!!DFF@๛๖ํูทo_–๑fี6ซ}๎ุฑƒ๙๓็เ๊๊ ภฎ]ปจQฃ}๛๖eฯž=ๆฑgG๙๒ๅ‰‰‰แ? SงN4jิเฦำฒbล ณ}ž๚่#’’’ฬัฤ[ฮLVmณฺgf˜:u*[ทnฅu๋ึ๐ร$''›๋ฬำ๑€็อส•+Gม‚‰‰‰nŽอ›7gาคI<๑ฤVm/]บฤฤ‰ #_พ|fœggg<<<ฌ"""’{ฉ ๊ืฏฯนsอนŠมมมœ?ž'Nฐu๋V*Wฎl^Mž]!!!Lž<ู|(ฺŠ+FZZ3gฮ4ื๛๛๛ณlู2ๆอ›wพณj›ี>kึฌษw฿}˜๗yํฺ5\\\x๙ๅ—ูนs'ใฦใ็ŸฆbลŠL˜0ธ1'4}๛]ปvq๑โEฮž=หตkืธpแััั”-[–ิิTฺตkG๗๎iุฐกUผ:t 88‹ลยส•+Yดh5สVEDD$๗SA ๘๘๘ะซW/jิจฟฟ?Ÿ}๖Y–mo7‡๔fร† ในs๘๙๙QฉR%๓ิะกCiธ1ีชUฃlูฒf๛‰'2bฤ๏8‡4ซถYํ๓ำO?ๅ‡~ภฯฯZตjq้า%ซˆˆˆ ::š€€jีช…››•*Uโ๋ฏฟ6O™"ž๒๓”๓œฅ|็ฌปอ๗ฏC๋?ฐXา?ฟใโโ๎8N#ค""""bS*Hb฿~๛ญy๚;qป้"""""๖้!ึตkWบvํj๋0DDDD(ŠˆˆˆˆMฉ ›RA*""""6ฅ‚TDDDDlJฉˆˆˆˆุ”nŒ/ฝ๔๋๗฿xyyู:œ\/%%…+VะคImNฎง|็<ๅ}๚๐๑วำนsgญฺFDD˜เž={่ึญฎฎฎ๔ำO๚๋ฏ,]บ”๐๛๏Jdd$/พ๘"ร‡็น็ž#&&†ๆอ›3x๐เ;ฦw๘๐a๚๕๋‡ฟ๚+_}๕|๐มทฒe •*UขqใฦLž<9ร๚3fะ AŠ)ย ค{๗๎ิญ[—9sๆ”””eIIIX,ซ‡ˆˆˆไ^*H 7އ‡ืฎ]cอš5t๎9C=zะฃG™6m†a๐๖oใ๋๋ห๓ฯ?ฯ2ื๖ํy้ฅ—x้ฅ—ุถmmc๛๑ว๑๑๑กXฑb์฿ฟŸO?oo๏lWํฺต9x๐ ซWฏf๘๐แV๋๖๎KDDฃG6—นบบาฉS'ถlูยไษ“?~<Y๖?fฬ<==อGฉRฅฒ—ˆˆˆ<šTๆ ศศHNŸ>}ืว-"""คP๚๕™;wฎyส988˜๓็ฯsโฤ ถnJๅส•Yฒdษm๛ฐX,.\,X@BB๎๎๎ฤวว›ํjิจมผy๓˜3gตjี t้าf!{๓พ<<<่ำงQQQ๔๋ืูณgSกBfอšuํŽ?ฮ๕๋ื๘ํท฿ˆลหห‹„„š7oฮ„ ๐๗๗7วลลFhh(nnnl฿พ3fœๅ1;;;ใแแa๕‘K้ไใใCฏ^ฝจQฃ|๖ูgYถอji‡๘๙็Ÿ๑๓๓c๓ๆอ)R???ฎ]ปf^ิ4bฤVฌXŸŸ .4O™ฟ๒ส+,\ธส•+๓๗฿gบ๏:u๊0{๖lv๎I™2ehีชGŽมฯฯ๛๗›mทlู‚ฟฟ?t้า…™3gbooฯท฿~หกC‡2dิจQรฆ์฿ฟŸ~๚Q @{OจˆˆˆไJv†aถBไv, žžžtŸตƒF”=5" oooF@ZZอš5ฃbลŠx{{๓๙็Ÿ็x\"""๒hRAj#kืฎลมแ฿}…ฺƒ(H/_พ|ว6๓็ฯ'22’จจ(VฌXALL ฝ{๗ๆะกC์ฺต‹/พ๘‚ใวgปO๙๏RAšพ๚๊+|}}๑๗๗g๘๐แคคค๐ม0dศlmoฑXจ_ฟ>UชTกrๅสlบ€มƒณz๕j˜={6๕7ฦืื—ะะP.^ผศๅห—y๚้ง9{๖,ฉฉฉTฏ^_~๙%ร>v๎I—.] nป7v้า…UซVเ๎๎@JJ )))ุ๓sฯ/_>žz๊)ฮŸ?@ฏ^ฝ eัขE\ฟ~Žว›””„ลbฑzˆˆˆH๎ฅ‚๔‹ŽŽf๒ไษlถจจ(๚๔้รวL็ฮอย.]DD์ูณ‡nบเ๊๊สO?ฤฏฟสาฅK0`๏ฟ>กกกDFF๒โ‹/2|๘pž{๎9bbbhผ9ƒฆ@|๐ม๔่ัƒ &PซV-ชUซ@||<TญZ•‘#Gาผys>œญใชWฏEŠ!$$___ซugฯž%::fฯžอศ‘#Yบt)•*Ub๘๐แœ9s&หพวŒƒงงง๙(UชTถb‘G“ าlใฦ„‡‡ใแแภตkืXณf ;wฮะถG๔่ั€ภภ@ฆM›€aผ๖๘๚๚๒๓ฯsเภL๗ต}๛v^z้%^z้%ถm@ห–-qqqแ๋ฏฟๆฝ๗3/^œ… ฒpแBVฎ\Iห–-ษ“'OถŽkร† œ;wŽ˜˜๖๏฿o.ONN&<<œฑcว’/_>sy๕๊ี๙ๆ›oุณgWฎ\กL™2์ฺต+ำพ D\\œ๙8}๚tถb‘G“ าษมƒ)[ถ,ตjีb฿พ}„……v›ูณg“œœLdd$‘‘‘wฝฯ””Ž?Ža$$$˜ห็ฯŸOพ|๙ cโฤ‰\บtษ\็เเ@ZZš๙<)))Cฟnnn„„„ฐrๅJsYทnจWฏmถตj›œœฬผy๓hีชถmc๊ิฉ๘๙๙eฏณณ3VษฝT>`๕๋ืg๎นๆ<ศเเ`ฮŸ?ฯ‰'ุบu+•+Wfษ’%ทํรbฑPธpaXฐ`YTบปปoถซQฃ๓ๆอ`ฮœ9ิชU ธq <44”!C†ะปwoณ}ฃFXดh+WฎฤbฑL‡(Rคgฮœ!!!ุุXถlูภ•+WธpแpฃH]ตj+V`๔่ั$''3rไHซ๘'L˜@ลŠูฐaใวg็ฮผ๒หธธธ[REDD$WQA๚€๙๘๘ะซW/jิจฟฟ?Ÿ}๖Y–mณšCฺกC~๙gุผy3EŠภฯฯkืฎ™51‚+Vเ็็วย… =z4เวdุฐat๊ิ‰ห—/ณlู2ซ/^œaร†๑oฟ™ฉ““}๛๖ล฿฿Ÿ๐๐ps>hBBอš5รฯฯชUซLณfอˆgุฐaDEEQนreXทnDGGA@@ภ}อฏˆˆˆ<๚์ ร0l„ศํX,<==™ผ> W๗ถ'๗KKฅเ…h)๊๖๎ึd’ สwฮSฮs–๒ณ๎2฿]ƒ`กค~วลลq๚FHEDDDฤฆTŠˆˆˆˆMฉ ›RA*""""6ฅ‚TDDDDlJฉˆˆˆˆุ” Rฑ)ค""""bSyl€Hvฝเ_///[‡‘๋ฅคคฐbE4/U)‰ฃฃฃญรษ๕”๏œงœ็,ๅ;g=ช๙ึฉˆˆˆˆุ” Rฑ)ฒ—Gฦ/๋{ดดิ๋์๚#{ฝEฤฦฦฒkื.์์์(TจงNยีี•ธธ8ณฯ๔ใผy3ํฺตใงŸ~ขL™2wฬ๋ผy๓2dืฎ]cใฦึฯ˜1ƒ Pนre~๕WfอšEห–-)Vฌ=z๔ I“&YŽR3†‘#G1ษr๕้ฦ วรร€kืฎฑfอ:w๎œกm=่ัฃL›6-ห~ถm ภ๖ํiำฆ ฮฮฮ+VŒ*UชpเภjิจA(Tจžžž<๓๘๘๘p๊ิฉL๛ๅ—_ กXฑbๆˆ#@XXpฃภ;qโงN"$$___ฆL™ยมƒอ๖mฺด1G/ซVญสK/ฝฤนsqvv`ย„ ิญ[—Zตjq๐เAFญbเ…^เ่ัฃ|๑ลผ๗{V๋–-[ฦถmฌFb===ู้ณ'ฟ๚+ƒ ขOŸ>f!™Aƒg>าG„EDD$wสี้ญ"##9x๐ eห–ฅVญZ์ทฯ,๔๎Fผy๏ุฦษษษู|nooOsOำ ษ›ท๏ป7C† !&&†>๚ˆคคคLc\พ|9ฏฟ:›6mขQฃFผ๔าK 4ˆ>๚ˆ—_~™-[ถXํฯมมดด4ซ~oฦš5kฬ็QQQ 0€… š๑ฆ;z๔(๛฿x๙ๅ—iธ1cฦŒนํฑzxxX=DDD$๗สีi๚๕™;wฎ9188˜๓็ฯsโฤ ถnJๅส•Yฒdษ=๗_ฃF -ZDJJ .\`฿พ}x{{฿sีซWgบuœ?ภ๊”}f, ลŠ#--™3gfฺ&--3gฮย„ 8rไEŠaศ!8p€๐๐pฦ‡Y`–.]šศศHซ;v ร0ุฐaล‹เย… ผ๐ย ฬž=›’%KšํOœ8Aฝz๕x๑ลy๒ษ'ูทo“'Oฦวว็2$"""นQฎžC๊ใใCฏ^ฝจQฃดlู’#Fdฺ6ซ9คท๓ฬ3ฯะดiS*WฎŒฝฝ=Ÿ}๖nnn๗oแย…๙ไ“OฬQฬjีช1u๊ิ,:”ฦใๅๅEอš5‰อะ&55•:aŒ5สjฝฝฝ=Mš4กI“&œ9s†‹/๐ส+ฏะผysๆฯŸOร† อ๖ ,`ฦŒ8::โ้้ษ๔้ำ?~</^4/ฤzโ‰'Xฐ`y๒ไaย„ TฉRๅž๓""""น›‘>%๒ฒX,xzzฒzฯธ{ฐu8น^Z๊u>ดว*ึฤ!Wอ๚PPพsžržณ”๏œuท๙~"‹%๓;..๎Žำ๏r๕){y๘้Oiูฒ%วทZถx๑โl_้."""’[จ ต‘E‹ู:‘‡‚Nู‹ˆˆˆˆMฉ ›RA*""""6ฅ‚TDDDDlJฉˆˆˆˆุ”ฎฒ—GFี2xyๅทuน^JJ +ม3ๅ|8)))|๐ม 2$[7kึŒฃG@LL eส”aะ AฐcวF~~~,]บธ1"ุฐaCš4iB™2eˆˆˆเ๗฿วฯฯฦs๚๕,๗ทdษ๐๗๗ง[ทnๆ๒oฟ–ชUซRนreNŸ> ภโล‹ฉVญ4oœ+WฎะฅKxใ ‚‚‚˜8q"'NคbลŠ๘๛๛ำทo฿,๗}่ะ!๊ึญ‹ฟฟ?ีชU#)) €ฝ{๗RซV-ส—/ฯš5kธ~:}๚๔!((ˆ€€๓ุ- :tภฯฯ€€๖์ูcตUซVQทn]โโโXพ|9ีซW' €=z˜#—C‡ฅB… 4lุK—.e๋x๓อ7๑๖๖6 ศขE‹š๋oูuwwn็IIIุูู๐sฯaggGž66–]ปv1`ภ}๖ํGTT#GŽฬ2_;vdฤˆDEEฑfอ8y๒$›6mโ‡~0ทŸ6meห–e๗๎lผ™wy‡””FลSO=Ett4{๖์แฉงž2๛_ตj๏ฟ>?๔)))Lœ8‘7‰ƒƒ .dืฎ]ฌ]ป–๛๗๓ํท฿ฒs็Ns๛คค$fฯžM:u่ัฃAAA๖o)Rไv/^|๑EŠ-Š››M›6ตZwๅสVฌXAํฺต๘เƒ˜:u*{๗๎ลืื—๛s๘๐แ๖?fฬ<==อGฉRฅ๎“ˆˆˆ<บ๒dทa๚Eฎ]ปฦš5kXทn'OžดjฃG๓็ภภ@ฆM›–eฟmถ`๛๖ํดiำgggŠ+F•*U8pเ5jิ @xzz๒๓ฯเใใรฉSง2ํ๗—_~!$$„bลŠPฐ`As]XX•+W6 ฯSงNัถm[.^ผศีซW 1ทiำฦ ฌZต*/ฝ๔mถฅE‹™๎bฑOฝz๕ฬ˜ำ5mฺ*Wฎฬ‰'€ำ<ศ๔้ำˆ็นs๓ฯฌXฑ€โณฯ>รวว‡นs็าบu๋L๛4h๛๗ทสงŠR‘๋ž็FFFr๐เAส–-KญZตุทoŸY่ผy๓ฑ“““๙ณฝฝฝ๙žๆu:;;gุพw๏ 2„˜˜>๚่#๓๛ญ1._พœื_M›6ัจQฃ๛ฒoร0๘๚๋ฏ‰ŒŒ$22’SงNQบt้,๛(Yฒ$ฉฉฉ๖oๆ๖อ›77ท?|๘0oฟ6€YH฿๚๓ิฉS๑๖๖ฆmถŒ=ฺ<ลžY›s‘ฮษษ‰–-[ฒx๑bsู๐แรqvvๆญทฒj›––ฦŠ+h฿พ=ณgฯf๘๑f›UŽ<<<ฌ"""’{eป ญ_ฟ>s็ฮ5็๓syNœ8มึญ[ฉ\น2K–,น็@jิจมขE‹HIIแย… ์ทoo๏{๎ฏz๕๊ฌ[ทŽ๓็ฯ๐ฯ?ถฝลbกXฑbคฅฅ1sๆฬLคฅฅqๆฬBBB˜0aGŽษด‡‡žžžlุฐ€ธธ8sNgfBBB๘๒ห/อ6‘‘‘ๆ๒๔)ืฏ_'>>€ย… ณx๑b^{ํ58@๕๊ีYฟ~=gฮœเาฅKœ9sฦ*ง็ฮcห–-ๆ>ƒƒƒ™1cถm#_พ|„††F\\๙๒ๅใฬ™3$%%™s] รเุฑcf.–-[FลŠ˜5k7nไซฏพฒ:ถYณfQกBfฯžMอ้*2EDD$]ถOู๛๘๘ะซW/jิจƒƒ-[ถdฤˆ™ถM/ขz๔่มž={ˆˆˆธํi{€gžy†ฆM›Rนre์ํํ๙์ณฯpssห‘ขpแย|๒ษ'ๆ(fตjี˜:uj–ํ‡Jใฦ๑๒๒ขfอšฤฦฦfh“ššJ‡ˆว0 F•e3fฬเีW_ฅo฿พไอ›๗ถท[๊ฝ;๑คฅฅQกB.\ศะกC้ฝ;พพพไษ“ว*‡eห–eฮœ9„‡‡ณ|๙r&OžL๓ๆอIIIมัั‘ฏพ๚Šgžy† เใใC™2e2ฝ5Wม‚้ืฏ๚๕ณŠqไศ‘ิญ[—’%KRกBเFAฺฉS', †aPปvmszF฿พ}๑๔๔คZตj๔๏฿ŸN:QฆLv๎‰——W–ว/"""mv†aถBไv, žžžlใE~ป฿–Jฝิ<.์}แ+ชฮ{‡ู๋ป3‚;ๅ;็)็9+7ๅปุ]_RRRXฑbMš41/จถ•๔ฯ๏ธธธ;žี75‰ˆˆˆˆMe๛”รฌeห–?~jูโล‹)Sฆฬ฿๗๛๏ฟฯ๙๓ญ– 2„6mฺ<๐}‹ˆˆˆไนข ]ดh‘อ๖=x๐`lณ‹ˆˆˆ<๊tส^DDDDlJฉˆˆˆˆุ” Rฑ)ค""""bS*HEDDDฤฆrลU๖๒฿P8โฐพ๑)คคคภŠ๙๎ฌอoช_ |็<ๅ[ถXpjj๊ฟ๊7'mŒ—/_พc›๙๓็ITT+Vฌ &&€ฝ{s่ะ!vํฺล_|ม๑ใวณงˆˆˆwๅบ‚๔นsิฌY“€€0`1110n8hูฒ%•*UขGw์oฦŒฬŸ?ŸะณgOฆOŸN›6mจ[ท.;vไ๗฿งvํฺ๘๙๙ัฎ];x๖ูg0`•+W&((ˆ={๖ะ Aส•+ว๒ๅหณŸลbกC‡๘๙๙ภž={€E]ณfอx๒ษ'y๗อ๖ฯ?žz๊)ฮŸ?@ฏ^ฝ eัขE\ฟ~Ž9OJJยbฑX=DDD$๗สu้๗฿OHH‘‘‘์ป—ัฃGใ๋๋Kdd$d๒ไษ”-[–ƒาธqc.^ผhn`ญ[7๖์ูCงN c๒ไษLž<€่่h–-[ฦœ9s่ป7๚๕#::š2eส๐ษ'Ÿ˜}xyyฑo฿>jีชEฏ^ฝXพ|9‹/f๔่ัYฦ?jิ(žz๊)ขฃฃูณgO=๕๛๖ํc๚๔้DEEaพ3fฬ`๏ฝlถกC‡b`๘๐แ>|8CNJ—. @||<TญZ•‘#Gาผys>œญ<ืซW"EŠ‚ฏฏฏีบณgฯฟฟ?ณgฯfไศ‘,]บ”J•*1|๘pฮœ9“e฿cฦŒมำำำ|”*U*[1‰ˆˆศฃ)ญธ฿‚‚‚่าฅ ๖๖๖ดm–ผy๓Zญ฿พ};๏พ๛.อ›7ทZi|ปำ52G ###iีช/ฝ๔๛฿ฬvฯ?<พพพุููแโโ‚งNสฒ๏Ÿ™+V'O<<<จYณ&^^^”-[–s็ฮ๑ไ“O๒ษ'Ÿฐdษเฦจๆ… x๚้ง๑๖๖ฮ4'•*U x๑โณpแBณHอฎ 6pๅสฺตkว๛๑๑๑ 99™๐๐pฦŽKพ|๙ฬ๖ีซWงz๕๊X,FŽI™2eุพ};ฯ<๓L†พ Dอ็‹EEฉˆˆH.–๋FH๋ิฉรๆอ›)\ธ0ญ[ทf๚๕ฺุููซ}Zไfลษษ ธq:๛ๆŸ๏e๎ฉณณณ๙sz6l`ืฎ]์ฺต‹จจ(ส–-KRRR†ณสษ๙๓ษ—/aaaLœ8‘K—.™888––f>O๏๗fnnn„„„ฐrๅJsYทnจWฏmถตj›œœฬผy๓hีชถmc๊ิฉ๘๙๙eyฌVษฝr]Az๒ไIŠ+ฦ๋ฏฟNxx8ฑฑฑฤวว›๋kิจมผy๓XถlWฏ^W๛ `้าฅภ‹Ÿjีช๕ฏ๚ !""€๋ืฏ[ล~+‹ลBม‚qvvfืฎ]๖o™ถป5'้!5jิˆE‹ฑrๅJ, มมมt่ะ€"EŠpๆฬˆ5/่บrๅŠ9 ›””ฤชUซจXฑ"ฃG&99™‘#GZํย„ TฌX‘ 60~xv๎ษห/ฟŒ‹‹หฟศ”ˆˆˆไนฎ ธq#~~~Tฎ\™-[ถะนsg๐๓๓cธq๔์ู“฿ooo–/_N‘"Eฬm3›Cz'Ÿ}๖cวŽลฯฯ?๘ƒพ}๛ซ๘‡ส‘#G๐๕๕%((ˆ#GŽdู644”K—.แํํอ'Ÿ|bฮูผีญ9y้ฅ—ฌึ/^œaร†๑oฟ™ฉ““}๛๖ล฿฿Ÿ๐๐pณ๏„„š5k†ŸŸUซV%88˜fอšฯฐaรˆŠŠขrๅสฐn:เF^ฃฃฃ‰ˆˆฐสฑˆˆˆ€‘~ŒศCสbฑเ้้ษŸิมห9ํฮศฟ’b็ฤชrฝi๔วg8ษถ'ืSพs5็๖ทนั’’ยŠ+hาค ŽŽŽ6‰แฟไaสw๚็w\\ง฿ๅบRyดไบซ์ซWฏถบ"nฬ้๐รm‘ˆˆˆˆmจ ต‘ะะPBCCm†ˆˆˆˆอ้”ฝˆˆˆˆุ” Rฑ)ค""""bS*HEDDDฤฆTŠˆˆˆˆM้*{ydุฟถ{//[‡‘ู๋งคภŠุ๗Z…ฝnbภ)฿9O9y๘h„TDDDDlJฉˆˆˆˆุ”Nูห##mี`า๒๊%{;๖-'ู:‘ปฆRฑ)ค""""bS*HEDDDฤฆTŠˆˆˆˆMฉ ›RA*""""6ฅ‚TDDDDlJฉˆˆˆˆุ” Rฑ)ค9(66–iำฆeนพhัข๗๗๔้ำ๙๛๏ฟoๆนst๊ิ้ž๗p๒ไIชTฉB@@,Yฒ€ร‡SณfM|||จRฅ ›6m๚W๛‘ค9่N้ฟ‘‚ดx๑โฬ˜1ใถm._พ|๕ลŠcวŽDFFฒfอz๕๊€‹‹ ฿|๓ ๛๗๏gฮœ9t๋ึ-}Šˆˆศ› า่นsิฌY“€€0`1110n8hูฒ%•*UขGู๊3""‚   ฺ่ต+iii,Zดˆ={๖ะฒeKjืฎ ภท฿~‹>>>L:€'NPฝz๕ }^ฟ~… าฐaCณภœ>}:๏ผ๓ŽูฆL™2$&&โไไ„ณณ3‰‰‰คฅฅPบti*Tจ@… ฐX,†@`` ]ปvๅ—_~น—4ŠˆˆH.ง‚๔๚๛๏ !22’ฝ{๗2z๔h|}}‰ŒŒdเภLž<™ฒeหr๐เA7nฬล‹อmฬŸปu๋ฦž={hืฎปw๏&::WWW–.]Jห–- dัขElูฒ…3gฮ๐๛๏ณu๋Vv์ุมวฬ‰'2ฤw๚๔i† FฅJ•XถlฃFb๖์ูw<ฎcวŽแ๋๋‹ทท7“&Mสฐ~ษ’%TฉR;;;เฦ้ฐฐ0FŒA`` SฆLแส•+Y๖Ÿ””„ลbฑzˆˆˆH๎ฅ‚๔ bๆฬ™Œ9’ฃGโ๊๊jต~๛๖ํ„‡‡ะผys๒ๆอkฎ‹ŒŒ4ž6mDEEQณfM|}}Yบt)ฬฐ฿={๖ะฐaC๒็ฯปป;Mš4ษ0:นkื.ส–-หีซWูณg฿|๓Mฆฃง™)_พ<111DGG3~xอu'Oždเภ|๙็ๆฒ$%%Sl~~~L:•ญ[ทาบuk~๘แ’““อ๕ๆ้x ำ”+WŽ‚ €ลbกy๓ๆLš4‰'žxยชํฅK—˜8q"aaaไห—๙๓็g Aƒˆ‹‹3งOŸพงc‘Gƒ า่ไษ“+VŒื_๐๐pbcc‰7ืืจQƒy๓ๆฐlู2ฎ^ฝzว>(Tจ‰‰‰ๆถ๎๎๎f฿AAAฌ_ฟ‹ลย•+WXนr%ีชUณ๊วลล…—_~™;w2n8~๙g*Vฌศ„ €sBฃขข€ฃฉ้ำ ฮž=หตkืธpแััั”-[–ิิTฺตkG๗๎iุฐกีพ:t่@pp0‹…•+Wฒhั"5j”ๅ1:;;ใแแa๕‘+ญศอ6nศุฑcqrrยหห‹นs็ฒgฯุ่ฑ#={๖ไล_ฤ›:u๊PคHs€€๓ด}ทn่ัฃ <˜*UชPคH*Wฎlถ๏าฅ ;vคPกBlูฒ…๏ิจQ€~๚QฆL™L็‘ฆ๏+""‚+Wฎ˜ง๖kีช…››•*Uขvํฺๆi๓ƒาฟ์ํํฑททgย„ <๖ุc,[ถŒ๕๋ืsแยฆL™b๙้ะกณfอย^ˆˆˆHFvF๚ฅะ")‹ล‚งง'ฮ๊ŽW^ u;๖-3^dvทRRRXฑbMš4มัั๑>D%ทฃ|็<ๅำฉˆˆˆˆุ” Rฑ)ฒ—GFฺมI๓pตuน^Z€i๛็’ฆ?Y({ŽถADไก ฑ)ค""""bS*HEDDDฤฆTŠˆˆˆˆMฉ ›RA*""""6ฅ‚TDDDDlJฉˆˆˆˆุ” Rฑ)ค๗(66–iำฆeนพhัข๗ิ๏๔้ำ๙๛๏ฟณ\?~๘{๊`ใฦ„‡‡฿๓๖ปvํ" €€€ูฑcถm#00___‚ƒƒ‰‰‰๙W๛‘ค๗่N้ฝสช 5 ƒดดดUfวๅห—oปวว‡ฝ{๗ษ๔้ำู้ณ'๙๓็g๑โลฤฤฤ๐{๏ัปwo’““นz๕๊YDDDm*Hณ้นsิฌY“€€0`1110n8hูฒ%•*UขGู๊sเภTฌXฦวขE‹ุณg-[ถคvํฺ)R„ื____^yๅ.]บD@@๚๕#--^ฝzแใใCีชUูนs'pฃจ}็wฬ”)S†ฤฤฤ,ใHLLไป๏พฃFŒ7€#FaถI๑อ›7/$$$`gg€ทท7%K– jีชœ={ธQเ๚๘๘ะปwo<˜ญผˆˆˆศK[๐จ๘๛๏ aไศ‘คคค๐๛๏ฟs๖์Yณ;v,eห–eัขE๔ำOL™2ล6 €ศศHบu๋F=([ถ, ,เุฑcุ‡งง'DDDPฑbE๓OZดhม—_~ ภส•+อพ~๘แฮœ9CLL ๛๗๏งmถ:t(วt๘๐a"""Xบt)M›6ๅซฏพย๛Žmูฒ…๎ปsแยVฌX‘aŒ3hะ pฃ >pเ๓็ฯง{๗๎ุำฝ{wZทnณณsฆ'%%‘””d>ทX,ู>&y๔h„4›‚‚‚˜9s&#GŽไ่ัฃธบบZญ฿พ}ป9?ณy๓ๆไอ›ื\—^@L›6ภภ@<==qssฃ[ทn,Yฒ77ทL๗๋๎๎Nhhhฆ๋ถo฿N‡ฐณณรืื—ผy๓r๑โลlฯ?ˆลŠc|๚้งู*FjืฎอมƒYฝz5ร‡ทZทw๏^"""=zดนฬีี•N:ฑeห&Ožฬ๘๑ใ ฬฒ1cฦเ้้i>J•*•ญธDDDไัค‚4›๊ิฉรๆอ›)\ธ0ญ[ทf๚๕ฺคŸพฮŽ>\_ฃF ๆอ›ภฒeห๎x!ฯ•+Wˆ‹‹#,,Œฑcวšฃจ๎๎๎Vส,kิจม๙๓1 ƒpํฺ5Š)B้าฅ‰ŠŠn\Ÿูจฉ‡‡}๚๔!**Š~๚1{๖l*TจภฌYณ(]บดำ’%KฬํŽ?ฮ๕๋ื๘ํท฿ˆลหห‹„„š7oฮ„ ๐๗๗7งchh(nnnl฿พ3fœๅ1:;;ใแแa๕‘KsHณiใฦŒ;'''ผผผ˜;w.{๖์มฯฯŽ;าณgO^|๑EผฝฝฉSงEŠ1ทอli‰% #99;;;{๏=บt้BวŽ)Tจ[ถlษวK/ฝ„ฏฏ/ 6dย„ lผ___œœœ๘๖oจUซnnnTชT‰ฺตk฿๑”w:uจSง—.]โท฿~ UซV|๓อ7๘๙๙ัฒeKณํ–-[๘่ฃpttฤูู™™3gbooฯท฿~หกC‡2dC† !oผl฿พ€๛๓์ณฯs๎EDD$wณ3 รฐu"ทcฑX๐๔๔ไฯอS๐๒pฝ๓๒ฏคคมชS4z‚ฃฮก๊ิฉƒลbaฦŒฬŸ?ŸะณgOซ]ฟ~… าฐaCz๕๊ภ๔้ำy็wฌ๚LLLฤษษ gggIKK t้าTจP€ *`ฑX0 €ภภ@บvํส/ฟ’ญใOJJยbฑX=DDD$๗RA๚๚๛๏ !22’ฝ{๗’””ฤไษ“ูถmQQQ๔้ำ€>}๚ฐ{๗nขฃฃ‰ŽŽ&**ส์ใ‰'ž ** ๆอ›GงN c๒ไษLž<€ำงO3lุ0*Uชฤฒeห5jณgฯพc|วŽรืืooo&Mš”a’%KจRฅ vvvภำ๙aaaŒ1‚ภภ@ฆL™ย•+Wฒ์ฬ˜1xzzšRฅJUDDDไัข‚๔!ฤฬ™39r$GeำฆM„‡‡ใแแ@ม‚Xฟ~=AAAฐ{๗n}:[q‰ˆˆศฃI้CจN:lผ™ย… ำบuk๓ิ๗อ้฿ฟ?ห—/'::šถm’””dฎO?ญnooOjjj†ํ˜:u*[ทnฅu๋ึ๐ร$''›๋ฬำ๑€U฿้ส•+Gม‚‰‰‰ภbฑะผys&MšฤOห€จ\น2AAA์ูณ‡ Pฎ\9–/_žeฌ#FŒ kืฎ๓๖os๔่Qž{๎9ชVญJฃFธx๑"eส”!11€้ำง๓ฮ;๏0pเ@*Vฌˆฟฟ?ใฦศฒ›8q‚w฿}—Š+šว–ี>0 ƒฤฤD์์์จ_ฟ>ŽŽŽTฉR…ณgฯ๐๗฿ใ๏๏ฯไษ“ฑX,ู๚%%%aฑXฌ"""’{ๅ๚‚๔๛๏ฟ'$$„ศศH๖๎ห† ฌž—.]š๗฿___"##8p ััั,[ถŒ9sๆะฏ_?†ฮž={๘๘ใ้฿ฟ?ํฺตc๗๎DGGใ๊๊สาฅKอzyyฑo฿>jีชEฏ^ฝXพ|9‹/f๔่ัท๗ุฑclผ™ &ะณgOฆM›ฦฝ{yๅ•Wx๏ฝ๗ฒ๎าฅK,Xฐ€ƒลkฏฝeฉฉฉ,Yฒ„&MšะชU+J”(มฏฟJๅส•๏˜ำRขD 8@ทnฌึฅฆฆ2gฮ4hภ๋ฏฟฮO?ฤ๙๓็ ไีW_e๏ฝทํฬ˜1xzzšRฅJ1&ytๅฑuZPP]บtมžถmRปvmซ็•*UสtปF™ฃ?34ื988ล!CฐX,ฤฦฦRชT)š7oภ๓ฯ?€ฏฏ/vvvธธธเใใรฉSงno‹-ptt$>>žmถ™ฅฆฆRพ|๙,ท๓๔๔ฤออnบัขE š6mz>Zดhม˜1cตjีบco6n8ฦŽหoฟอนsฺ้ตซนnะ ATซVjีช™หส”)ร่ัฃ1bณfอขN:Œ5Šdฺ Aƒฬขภbฑจ(ษลr}AZงN6oฬาฅKiบ5“&Mส๐<ณB/oผๆฯvvv๚๋ฏุ[(ฟ๚๊ซฌ\น’'Ÿ|’๑ใวsๅสs““๖๖๖V?฿inh๚~ำาา(Qข‘‘‘ฺ888˜ำ’’’ศ“'{๖์a๕๊ีฬž=›… ๒้งŸfูว˜1c๘โ‹/x๙ๅ—iูฒ%บuใษ'Ÿผํ>nfggG๛๖ํ:tจY~๕ื์ป—ีซWghฟeหฆNสž={x๗wy้ฅ—ฒฬณณ3ฮฮฮYฎ‘%ืŸฒ?y๒$ลŠใ๕ื_'<<œญ[ทZ=‰‰ม๘๘๘,๛จ]ปถy๑NZZ111$$$PจP!™7o}ำำ“ ฐfอเฦGฟ๖ฅK—&22’ดด4–-[ภ•+Wˆ‹‹#,,Œฑcวy>|||๘โ‹/ุทoO>๙$:t ^ฝzœ8q"ห}ภ9ฉ้–,YBลŠุฐaŸ~๚) , Ož๛;gอš5๘๘๘0~xฺทoฯnWฆฆฆๆh,—/_พํ๚bลŠฑcว"##Yณf ฝz๕ภลล…oพ๙†๛๗3gฮบu๛ฟฏํผSŸ"""๒฿ฆ‚๔;w๎5kึ$ ???ถo฿n๕ะกC <˜˜˜7nำงOงM›6ิญ[—Ž;r๑โEš7oN`` ตkืๆศ‘#DDD„ŸŸ]ปv%-- €gŸ}–Pนre‚‚‚ุณg 4 \นr,_พ`฿=!!!DFFฒw๏^6lุ`๕ผt้าผ๛๘๚๚ษภˆŽŽfูฒeฬ™3‡~๚1|๘p๖์ูรวLhืฎปw๏&::WWW–.]j๎ืหห‹}๛๖QซV-z๕๊ล๒ๅหYผx1ฃG6œ>}šaร†QฉR%–-[ฦจQฃ˜={๖ุ้ฑc๘๚๚โํํอคI“2ฌ_ฒd UชTมฮฮธq:?,,Œ#Fศ”)SธrๅJ–'%%aฑXฌ"""’{ๅฑuน]PP]บtมžถmRปvmซ็•*UสtปFแ๎๎ภฯ?ฬมƒอuDEE1dศ, ฑฑฑ”*UŠๆอ›๐๓ฯเ๋๋‹...๘๘๘p๊ิ)vํฺE5่ท/{๖์มรร#วTพ|ybbb๘ใ?่ิฉ5ยลลธ1วtเภฌXฑยlŸ'OZถlIห–-9y๒$ฏพ๚*oฝ๕๑๑๑™๖?fฬFŽ™ํxDDDไัฆาฌN:lผ™ย… ำบukRRRฌžฏ_ฟ>ำํ๒ๆอklggวฏฟJddค9ฒ ๐๊ซฏ2}๚tbbb่ำงIIIๆ6NNNุ[œ>'ีฯฯฉSงฒu๋VZทnอ?@rrฒนฝƒƒƒy:ฐ๊;]นrๅ(Xฐ 111X,š7oฮคI“xโ‰'ฌฺ^บt‰‰'Fพ|๙˜?~–94hqqqๆใ๔้ำYถ‘GŸ า์ไษ“+VŒื_๐๐pถnj๕<&&ww๗,G jืฎm^๔”––f€ *TˆฤฤDๆอ›wWqนธธ๐๒ห/ณs็Nฦวฯ?LลŠ™0apcNhTTpc4๕โล‹œ={–kืฎpแยขฃฃ)[ถ,ฉฉฉดkืŽ๎ปำฐaCซ}u่ะเเ`, +WฎdัขE4jิ(หุœ๑๐๐ฐzˆˆˆH๎ฅS๖ุฦ;v,NNNxyyัฑcGฬ็s็ฮลหห ???ุ่ฑ#… ฒ๊ใ๓ฯ?งGLž<™””:u๊„ฏฏ/ƒฆJ•*)R„ส•+฿sŒDDDpๅส๓ยฃZตjแๆๆFฅJ•จ]ป6ฅJ•เเมƒ๔๏฿{{{์ํํ™0a=๖ห–-c๚๕\ธp)Sฆ˜วž?~:t่ภฌYณฐทื฿?"""’‘‘~)ดศCสbฑเ้้Iฤฎฯq๕tษ๖vž๊v็F’AJJ +Vฌ I“&8::ฺ:œ\O๙ฮyสyฮRพsึร”๏๔ฯ๏ธธธ;žํิ•ˆˆˆˆุ” Rฑ)ค""""bS*HEDDDฤฆTŠˆˆˆˆMฉ ›RA*""""6ฅ‚TDDDDlJฉˆˆˆˆุ”พ:Tmสตวหหหึaˆˆˆศ}ฆRฑ)ค""""bS*HEDDDฤฆTŠˆˆˆˆMฉ ›RA*""""6ฅ‚TDDDDlJฉˆˆˆˆุ” Rฑ)ค""""bS*HEDDDฤฆTŠˆˆˆˆMฉ ›RA*""""6ฅ‚TDDDDl*ญนร0ˆวัััฦัไ~)))\ฝz‹ลข|็ๅ;็)็9K๙ฮYSพ- ๐Ÿใทฃ‚Tz—.] lูฒ6ŽDDDD๎V||<žžžทmฃ‚Tz เิฉSw|AgGPPปw๏ฮuฏพ, ฅJ•โ๔้ำxxx<1ฯ~๎g_สwฮ๖uฟ๚นŸ9ฯอyRพsถŸ๛ีืร”oร0ˆงx๑โwlซ‚Tz๖๖7ฆ:{zz—l‡\ูฯ๎หรรใก:พ‡1Oสwฮ๖u?c‚๛“๓œ'ๅ;g๛น฿}=,๙ฮ๎@’.j’œž={ๆส~๎w_๗Knฮ“๒ณ}ๅๆ|฿ฯพถ~๎งœ๏๛ื“๑ุู™i*bC‹OOOโโโ๎๋_๋’9ๅ;g)฿9O9ฯYสwฮzT๓ญRy่9;;3|๘pœmส‚๒ณ”๏œงœ็,ๅ;g=ช๙ึฉˆˆˆˆุ”FHEDDDฤฆTŠˆˆˆˆMฉ ›RA*""""6ฅ‚Tz“'OฆL™2ธธธPญZ5vํฺe๋I›7oฆYณf/^;;;/^lต0 † Fฑbลpuu%$$„ฃGZต๙็Ÿx๑ล๑๐๐ ผ๒ส+\นr%โั0fฬ‚‚‚pwwงpแยดhั‚ร‡[ตILLคgฯžxyyแๆๆF๋ึญนx๑ขU›SงNัดiS๒ๆอKแย…8p ืฏ_ฯษCyd|๙ๅ—๘๙๙™7fๅส•ๆzๅ๛ม๙๐รฑณณฃo฿พๆ2ๅ๛1bvvvVŠ+š๋sCพUสCmผy๔๏฿Ÿแร‡๓๋ฏฟโ๏๏Ohh(๙งญC{ไ$$$เ๏๏ฯไษ“3]?v์X>๛์3"""๘ๅ—_ศ—/กกก$&&šm^|๑E8ภฺตkYถl›7oๆตื^หฉCxdlฺด‰ž={ฒs็Nึฎ]KJJ 6$!!มlำฏ_?–.]ส๙๓ูดi็ฮฃUซVๆ๚ิิTš6mJrr2ทo็ป๏พc๚๔้ 6ฬ‡๔ะ+Yฒ$~๘!{๗๎eฯž=ิฏ_Ÿๆอ›sเภ@๙~Pv๏อ”)S๐๓๓ณZฎ|฿œ?|lบี\—+๒mˆ<ฤžyๆฃgฯžๆ๓ิิTฃx๑โฦ˜1clีฃ0-Zd>OKK3Š-jŒ7ฮ\k8;;฿ฝa†q๐เA0v๏mถYนrฅagggœ={6วb๙็Ÿ`lฺดษ0Œนutt4ๆฯŸoถ๙ํท฿ ภุฑc‡a†ฑbล รธpแ‚ูๆห/ฟ4<<<Œคคคœ=€GTŒiำฆ)฿H||ผ๑ไ“Okืฎ5๊ึญk๔้ำว0 ฝพ„แร‡™ฎห-๙ึฉ<ด’““ูปw/!!!ๆ2{{{BBBุฑc‡ #ห}Ž?ฮ… ฌrํ้้Iตjีฬ\๏ุฑƒ๙๓hถ มž_~๙%วc~”ฤลลPฐ`A๖๎KJJŠUพ+Vฌศใ?n•o___Š)bถ ลbฑ˜ฃ~’นิิTๆฮKBBมมมส๗าณgOš6mj•Wะ๋๛A9z๔(ล‹ง\นrผ๘โ‹œ:u ศ=๙ฮc๋Dฒ๒๗฿“ššj๕ H‘":tศFQๅN.\ศ4ื้๋.\ธ@แย…ญึ็ษ“‡‚ šm$ฃดด4๚๖ํKอš5๑๑๑nไาษษ‰๙๓[ตฝ5฿™>าืIF111“˜˜ˆ››‹-ขRฅJDFF*฿๗ูนs๙๕ื_ูฝ{w†uz}฿ีชUc๚๔้TจP๓็ฯ3rไHjืฎอ๛sMพUŠˆ<@={๖dV๓ฝไมจPก‘‘‘ฤลลฑ`ม:w๎ฬฆM›lVฎs๚๔i๚๔้รฺตkqqqฑu8 76๖๓๓ฃZตj”.]š~๘WWWFv่”ฝ<ด{์12\)x๑โEŠ-jฃจrง๔|.ืE‹อp1ู๕๋ื๙็Ÿ๔๛ศBฏ^ฝXถl6l dษ’ๆ๒ขE‹’œœLllฌU๛[๓ู๏#}dไไไฤO#Ož<)RD๙~ภ๒็ฯฯSO=ล๏ฟžk^฿*HๅกๅไไDีชUYฟ~ฝน,--๕๋ืlรศrŸฒeหRดhQซ\[,~๙ํ}LU๕๐7๒4๔rน<]žน izลQ4ZJF*d ฌ]Ce…บf9Z้-[ญVำ–9ฒBc‚ ้4Jm(C„R้š\E‹ภEๅแ๓๛รqๆ ๐กŸvI฿ฏํn็œ๏ำ็๛ี?>œ๓=็ุ1eญcbb`6›qโฤ ฅNuu5FFF0=ๆษLD๐ๆ›oขผผีีี ต*ŒŒ„ฃฃฃีzทดดภh4Zญwccฃี€Zญ†^ฏw&๒722‚7npฝฐธธ8466ขกกA๙EEE!==]9ๆz?\}}}8{๖,฿ถ~ซŠ่NJJJฤููYvํฺ%งOŸ–7xC4ี›‚toz{{ฅพพ^๊๋๋€|๖ูgR__/๙งˆˆ|๔ัGขัhd๏ฝr๊ิ)ILL”ะะPP๚ˆ—งŸ~ZŽ;&uuu2cฦ 1 ถšาคตvํZqss“ฺฺZ1™Lสฯbฑ(uึฌY#มมมR]]-ว—˜˜‰‰‰Qส‡††$<<\–,Y" RUU%’——g‹)Mzนนนr่ะ!9ผœ:uJrssลฮฮN๖๏฿/"\๏‡ํ๖ท์EธZNNŽิึึส๙๓็ๅ็Ÿ–_|QผผผคฃฃCD๕fBJ“ึญ[%88Xœœœdผyr๔่Q[‡๔ŸTSS#ฦ233EไึงŸ{๏=๑๑๑ggg‰‹‹“––ซ>:;;ล`0ˆJฅตZ-ซVญ’^ฬfroHAARg``@ึญ['๎๎๎2u๊TINN“ษdีO[[›$$$ˆ‹‹‹xyyINNŽ หณ๙oXฝzต่t:qrrooo‰‹‹S’Qฎ๗ร๖๗„”๋`ฅฆฆŠŸŸŸ899I@@€คฆฆสก”? ๋m'"b›{ณDDDDDCJDDDD6ฦ„”ˆˆˆˆlŠ )ูR""""ฒ)&คDDDDdSLH‰ˆˆˆศฆ˜‘M1!%""""›bBJDDŠ~่๕z๔๕๕ู:+sๆฬม‘#G๎ซMHH๊๊๊RD๗งตตฯ<๓Œญร šด˜M"!!!˜6m๚๛๛•k‹ฎฎฎ ฑช7u๊TจT*xzz"%%V}544wด}๛v$&&BฅR_๓xะššš๓ฏŒU[[‹'žxยฺ๊ส•+๑มใ>gฮœ ___|๗oxD$&คDD“L@@***”๓ฝ{๗ยฯฯoLฝ๛๗ฃฏฏFฃ7oD~~พUyUUโใใ๏k์oพ๙ƒแล}?†††๚“ล่\ v๎iใhˆ&'&คDD“Œม`@QQ‘rํท฿"==}ย๚ำฆMรŠ+ะlu}4!€ม`€‡‡<<<ฐ`ม‚q๛1hooวนs•k!!!๘ไ“O0{๖lธบบbำฆMhiiATTฐfอฅ๎ศศ6oŒ   ๘๙๙a๚๕ธqใ`ืฎ]Xดhฒณณแๆๆ†‚‚tuu!-- ZญำงOGaaแ„sผ๑{ee%ž|๒IๅฎqIIษ„ํ~๙ๅฬœ9žžžุธq#FFF”ฒ/ฟ3fฬ€——233ั฿฿แแa$$$เนsPฉTPฉT(,,DQQ๒๓๓กRฉ”9766bแย…pwwGdd$Ž?ฎ๔mgg‡mถ!44‹-,\ธ|ฌ’qข{&DD4i่t:ฉญญ•ภภ@้่่ŽŽ ”บบ:ั้tV๕~๚้'้้้‘ๅห—หๆอ›•๒kืฎ‰ฏฏฏ หW_}%ห—/‹ล"ƒƒƒr๘๐แqวฎฌฌ”ศศศ1๑ฤฦฦJggง477‹ณณณ,^ผXŒFฃ˜L&๑๑๑‘๊๊jูฑc‡่๕zนpแ‚\ฝzUž}๖Y%ฆ‚‚ฑทท—‚‚‹ล"/ฝ๔’ไไไศ๕๋ืฅนนYไไษ“ฎห่|}||คฎฎNDDL&“455Mุๆฉงž“ษ$/^ฝ^/;w๎‘๏พ๛NยรรฅญญM,‹ ษษษ‘šš ณ๊+33S๒๓๓•๓^๑๗๗—ฒฒ2’๒๒r ’ +VฌžžฑX,J;ตZ-gฮœ7^ขว๏M2๖๖๖x๕ีWQZZŠาาRผ๒ส+ฐททS/!!๎๎๎hmmลฺตk•ฒƒ"66SฆLฃฃ#:;;q๎9888Lx‡ิl6ปwt๚๕๐๐๐ภฌYณ๘๘xมืืฑฑฑ8y๒$ คค7nD`` <==ฑiำ&์ฝ[้',, +Wฎฤ”)SะำำƒฺฺZlูฒฮฮฮ˜5kาาาฐgฯžปฎฃฃ#š››ัืื___่๕๚ ๋พ๕ึ[๐๕๕…ฟฟ?6lุ€าาRทถ&ไๅๅAงำมลล๏ผ๓สสส๎:๖จสสJฬ™3G๙ทIJJ‚VซลัฃG•:นนนPซีpqqQฎนบบขงง็žว!z\0!%"š„าำำQ\\Œขขข ื๐ร0›อฐX,HJJยฒeห”ฒ๗fdd ..ษษษะ้tุฒeหธนนน๛vฝVซUŽ]\\ฦœถiooGppฐRฆำ้ะฎœ*วFฃืฏ_‡ทท74 4 พ๚k\บt้Ž๋eee(//G`` โใใวlUธ]PPีฑษdRฦฯฮฮVฦ~๎น็pๅส•ปŽ}{‡Rฺk4477O8฿Qฝฝฝpssป็qˆLH‰ˆ&กจจ(tuuกปปัััwฌ๋์์ŒŒŒ œ8qWฏ^p๋…งฅK—œœœ๐๛๏ฃตต?๘#พ๘โ ิึึŽ้g๎น8{๖์?Žู฿฿FฃQ97๐๗๗Wฮํ์์”ใ€€จT*twwรl6รl6ฃทททoฟ๋8๓็ฯวพ}๛p๙๒eDDDXป .Xพ€ยยBelณูฌ|ูเ๖8ว‹}ดาฅKวดOKK›ฐอฅK—044„ฐฐฐปฮ‘่qร„”ˆh’ฺณgฯ==ยDqq1ดZ-<==qๆฬจีj%๙ชฉฉASSFFF Vซแเเ0๎N___466ฃxSSS๑้งŸโโล‹่๊๊B~~>^{ํตq๋ &&๏พ๛., †††๐oฟแ๔้ำwใๆอ›(..ฦตkืเ่่•J5๎\Fmบ—/_†ษdย็ŸŽ””ภ๊ีซ๑แ‡* ธษdBUU€[w„ฏ\นb๕้-ญV‹ถถ6ๅๅ—_F}}=***044„TUU๑qแร‡๑ย /ภมมแŽs$z1!%"šค๔z๗G.Yฒ*• ^^^จฉฉAEE์์์ฦ|๎ษd2!)) jตัััศฮฮžpiVV–ีพฯ๛‘••…ไไdฬ›7zฝศหห›ฐ~QQ๚๋/LŸ>Zญoฟ6๎:Naa!t:qเภlถmยบ)))Xฐ`ยรรฑx๑bฌZต ภญ/deeaูฒePซีˆU’แูณg#11AAAะh4n%ฐวŽƒFฃมบu๋เๆๆ†}๛๖a๋ึญะjต มŽ;๎๗๎ป๑๚๋ฏ฿u~D#;[ADDN||เฬ™3‡ษ“'๋~'Oใ1ษ[นr%#FŒHw}\\๏ฟ>>>>8;;S @Zดhม?“๎6]บtมฮฮŽFs<๓๕ฉ‚Tž)Geไศ‘*Hๅ™ตcวFŽ™้‚t็ฮ|๙็ฤลลQฒdษปถwqqแ๛7oLตn๎นธธธkศ้บŸว๊ีซs๚uชWฏภโxT>}fฬ˜ม๑ใว๏k•+W2rไศ4ืลฤฤPญZ5๛฿าบukพ๚๊+z๗๎อ7ˆOs›๐๐pfอšu฿ฟ‡*HED?ร0ธ~บีa}šcวŽฅปอํnธมˆ#(Vฌ...ไห—ื^{_ีlsํฺ5 @กB…pvvฆx๑โ|๒ษ'†aำWสื%K–PฆLœ)]บ4ซWฏ6,\ธ;;;ถlู’*–iำฆaggg๓๚ธ—ืล–-[่ัฃ^^^,X#F๐{๏เใใcdtฦ Wฎ\dฯž=Sน(P ีซWO๕บ รืื7ำs”ใโโ่ท/8;;ใๅๅลซฏพส๛[๓WฌXมฉSงฬใH™ง—๒๚œ7oC† ก@dอš•ุุุ4็ฆฬพ๋nฝื“-[6ผผผ่ืฏkึฌIี็ษ“'iผ9y๓ๆลลล…‚ BLLLบวœั1\บt‰ทz‹>>ผy3Qัณgฯๆ๐แรŒ3ๆฎว—–ปฝ>ญ,ฌ' ํป—;vBม‚‰ŠŠโซฏพขfอš=z”ฌYณRฝzuz๗๎อ็Ÿฮ‡~hž~L๙wฤˆŒ9’ฺตkำฝ{wŽ?ฮW_}ลฝ{ูพ};ŽŽŽ|๖ูglธ‘:ฐs็N˜6mkืฎe๖์ูไฯŸฎฑ~๗wฤลลัณgOnธมgŸ}FญZต8t่๙W๋‘#GจRฅ  `เภdห–~๘ฆM›๒ฟfอšู๔๙ฮ;๏3gN†NTT“'OฆWฏ^ฬŸ?฿l3kึ,|๓MJ—.อ Aƒศ‘#`๕๊ีดiำฦlwๅส๊ีซวkฏฝFซVญXธp!|๐พพพิฏ_฿fฟใฦรีี•๒ห/ฟ๐ล_เ่่ˆฝฝ=Wฎ\aฤˆ์ฺต‹Yณfแใใรฐaรฬmฟ๚๊+J—.Mpp0Yฒdaูฒe๔่ัƒไไdz๖์iณŸใวำบukบvํJ—.](^ผxšน2dcวŽeฺดit้าล\พ}{ถlู’๊C๎NIII4jิˆ 6BŸ>}ˆ‹‹cบu>|˜"EŠ`มมมlฺด‰ทz‹€€ึฌYร{๏ฝวมงŸ~jำ็ถmXดh=z๔ {๖์|๙็4oœำงOใ้้Iร† qssใ‡~ F6ฮŸ?ŸาฅK›Eฝพ.z๔่A๎น6lืฎ]ฃ~๚œ8q‚นs็๒้งŸ๒sฯ;w๎ ๓rฏฺดiCŸ>}ธz๕*nnn$&&ฒ`ม๚๗๏ฯ72ีGทnXธp!ฝz๕ขTฉR\พ|™mถ๑๓ฯ?Sฎ\9LLL gฯž5s~็2}๔NNNผ๛๎ปฤววใไไ”๎2๓บฟvํตjีโ๙๓๔้ำ‡ผy๓2gฮ6mฺdำือ›7ฉ[ท.๑๑๑ผ๓ฮ;ไอ›—?๘ƒๅห—‡‡Gš1dtLืฏ_งfอš๒ห/๔๊ี ,X@วŽ‰ŽŽฆOŸ>wอ้/ฟB‹-x๋ญท่ะก๏ุ้ฑ#ๅห—งt้าw>ฝ>ดiCืฎ]iถ-Ÿ|๒ 7&44”?=zท+Zตjล๑ใวmFง“’’จWฏ•*Ub๘๑ฌ^ฝšแร‡“˜˜ศจQฃฬv]ปveึฌYt๊ิ‰ฝ{๓๛๏ฟ3eส8`พ?งH๋โศ‘#4jิ???F…ณณ3ฟ๒ ทoท9žฬพW<sๆฬ!..Žฎ]ปbggว๘๑ใyํตื๘ํท฿pttคkืฎœ;wŽu๋ึ1{๖l›mทmฦ7(Zด(-Zด`ษ’%$''ฤิฉS ฐiว|ภ‡~Hผy๏+ฬฮ+†ศSเŸIตl็ฮ`|๗wๆฒ €ฑiำ&›ถ—.]2œœœŒ:u๊IIIๆ๒)Sฆ€๑฿ื\ถfอ0Fm๖o†›››ัดiำปฦ๘๛๏ฟ€แ๊๊jœ={ึ\พ{๗n0๚๕๋g.{ๅ•W ___ใฦๆฒไไdฃrๅสฦ‹/พh.›9sฆตkื6’““อๅ๚๕3Œ่่hร0 #::ฺศž=ปQฑbEใ๚๕๋6qพ]5Rๅ,>>ศ›7ฏัผyssูฆM› ภ(SฆŒq๓ๆMsy๋ึญ ;;;ฃ~๚6๛ 2 .lณ,ญณบu๋/ผ๐‚อฒย… €ฑz๕๊Tํฃgฯž†aฦ€ {{{cึฌYฉฺฅื๗ฟ5cาคIฉึฅไiษ’%ๆํZดhaุููฟ๒‹M|NNN6ห"## ภ๘โ‹/ฬeญ[ท6ผผผŒฤฤDsู๙๓็ {{{cิจQๆฒ{}]TญZีฆOร0Œ &€๑๛๏ฟ฿5wบถ)ทแไไdฬž=0 รXฑb…agggDEEร‡7ใฯ?ฬp_ๆmz6l˜๊ue๗๚|แ…RฝฮRึูืฤ‰ ภXฒd‰น์๚๕๋F‰%l๚rไศม๎ป3= &-:tฐye$3ฏ๛ีซWS @‚ƒƒอe...6ฃ๑€9บfอš ฏvพ+Wฎ$oผดnฺ\ๆ่่H๏ฝนz๕jšS>๎TชT)ชUซf>ฯ;7ล‹O๓w;ณJ•*EPP๙ผbลŠิชU‹็Ÿ>ี๒ด๖u๛ญRฆนผy“๕๋ืฐ`ม<<}šoฟ–I“&แํํmŽeฦ’%KlD๖์ูร๎ปอY///jึฌษดiำ8|ชํำบำิฉS‡์ูณ3nธTW9?ช๙RทKธ}฿111ฬœ9๓พ๚๓๓๓cๅส•๓ฯ4n8ี}3{+—ๆอ›๓ื_1eส”T๋Rbmะ IIIฉฺ|๚้งุููez๔๎Nตkื&Wฎ\ฬŸ?Ÿ๙๓็๓าK/ูœz|Pฏ‹๔~†w฿}—แร‡3t่ะ{ฺ.)))ี้m///๒็ฯo๓{–-[ถu^ีญ[—?๘รๆ6[7n`ฦŒ6ํbccmๆKรญโิฎ๏้Sƒ ธpแ‚อดŽฤฤDพ๘โ Rกแ~ฅ๑บu๋Vsูตkื2}{ฉ๛q๛๏’aL™2GGG^yๅเึhyRR}๔Qชm3๕Z๛๏ฟS-Kน๖“ฬพWค•งคค$ฆOŸ~ืm๏Ezฟฏล‹ว฿฿Ÿัๆ[ฯึฎ]ห™3gx๕ีW[sy/^œ๊‘;wnYผx17พงxึ๏œFHๅฉะจQ#fฯž‡‡ฅJ•b็ฮฌ_ฟOOO›v888๐๑วƒณณณy/ฬAƒ1rไH๊ีซGpp0ว็ห/ฟคB… ๆล7nไห/ฟd๘๐แ”+Wธu?อš5k2t่ะ4๏[xงขE‹RตjUบw๏N||<“'Oฦำำ“๗฿฿l3u๊TชVญŠฏฏ/]บtแ…^เโล‹์น“ณgฯyO๙qww็ำO?ฅs็ฮTจP6mฺ3gN"##๙็Ÿ๊‡MZ๊ิฉƒ““7ฆkืฎ\ฝz•3fเๅๅ•fฑ••*UโวคAƒๆmPRF93{+—๖ํ๓w฿ัฟ๖์ูCตjีธvํ๋ืฏงG4iา„ฦ๓๒ห/3x๐`ขขข๐๗๗gํฺต๘ใ๔ํืๆฆ{แ่่ศkฏฝฦผy๓ธvํŸ|๒Iช6โu‘2ฒ2x๐`BBBpttคqใฦๆ฿bbbฬ{บฆ"gส”)ไศ‘ƒ9rุ\r'๏ำโโโ(Xฐ -Zดภ฿฿777ึฏ_ฯฝ{mฮ‚”/_ž๙๓็ำฟ*Tจ€››=}ธซฎ]ป2eสZทnMŸ>}ศ—/aaaๆ…‚)ฃG7nคWฏ^ดlู’bลŠ‘˜˜ศ์ูณqppธ๋<พ๔Ž้ํท฿fฺดit์ุ‘}๛๖แํํอย… ูพ};“'Oพ๏ณwชSงฯ?&L˜`Lœ8ั(Tจแ์์lTซVอˆŒŒLีื_5ฺทooไอ›ืptt4 (`4jิศXธpกู&ๅึ#{๗๎ตู6ญ[†a,]บิจ\นฒแ๊๊jธปป/ฝ๔’1w๎\s}5ŒาฅKงŠๅฮ–ค๔็mmา‹'ญ[,]บิ๐๓๓3\\\ oooใใ?6oปt็ญeาป= ท๖)ล?hdษ’ลx๕ือ[xe๖V.†q๋vTƒ6||| GGG#oผF‹-Œ_ีlg๔๋ืฯศŸ?ฟแ่่hผ๘โ‹ฦ„ lnก•^|)วt็๋า0 cบu`ุููgฮœI3พ๓บH๑ัG 0์ํํ๏z จ”ืmZ;o’๑.3ท}Š7{๏=ร฿฿฿ศž=ป‘-[6ร฿฿฿๘๒ห/mฺ]ฝzีhำฆ‘#G›xา{}พ๎ฮ>eๆuo†๑oฟ 64\]]นs 0๗ฟ€ฑkื.ณอ›oพi)Rฤpqq1rๅสeผ๒หฦ๚๕๋3ฬMFวd†q๑โE๓}ฮษษษ๐๕๕5fฮœyื> #฿ฃ5j5jิฐYถo฿>ฃbลІ“““๑๓ฯ“&MJ๗ถOi๕™ึ๋เ๖๗ฟ:t0ฒeหf๚๋ฏF:uŒฌYณy๒ไ1†ns๛ฝำงO7ส—/oธบบูณg7|}}๗฿฿ๆG้ลดaรฃI“&F๙ '''#F๋ึญ'NคสGf฿+~๕Wฃvํฺ†ณณณ‘'Oใร?4‡3sงs‘0†n>OLL4y็#w๎†]ชุึญ[gTชTษ|ตkืฮ8]cฟ฿>e๔๚ท์ ร‚๓u"""O‰ษ“'ำฏ_?ฮž=ksK7ษ<ค"""™t๚u› knธAูฒeIJJ2/ฦ‘{ง9ค"""™๔ฺkฏ๑๓ฯ@LL ฿=วŽK๗–D"O‚ฟ››7oฆปมมแล๐4B*""’I“'Oๆ๋ฏฟ&**Šคค$J•*ล๛๏ฟos‹.‘'Mอš53ถฏย… ว๔aPA*"""๒ ทo_†฿ๅ๊๊J•*Uj *HEDDDฤRบ1พˆˆˆˆXJฉˆศS๎ฬ™3ธธธ˜7ถlผ;;;6oฏ๛ชYณ&eส”๙๗A=*Uชd๓%"O ค""™0kึ,์์์ฐณณcถmฉึ†AกB…ฐณณฃQฃF6๋RถKydห–RฅJ1z๔h๙็Ÿ4๗w่ะ!์์์ุณgฯฟŽ}ิจQTฌX๑กฯ“3v์X–,Y’j๙Ž;1bฤC๛๊ึ>๘€ฉSงrแย…‡าฟศรข‚TDไธธธ0gฮœTหทlูยูณgqvvNsปW_}•ูณg3{๖l&NœHูฒe:t(:tHณŠ+๐๒๒ขB… *?“oฟ–nบซ~7ีซW็๚๕๋Tฏ^๊Pา”QA:rไศ‡V6iาwwwพ๒ห‡าฟศรข๛Šˆƒ ฐ`ม>sฒd๙ฟทะ9sๆPพ|y๚๋ฏ4ท+Vฌmถ5Ÿw๋ึ›7oฒhั"nธa~zŠ•+WRฟ~}๓๛ั๏ื๗฿O–,Y๊wผ฿ซkืฎ‘-[ถี‡ฝฝ}ชœ=ห๙็ฒfอŠฝฝ=-Zดเป๏พcไศ‘๚๕#๒จh„TDไดnšห—/ณn:sูอ›7Yธp!mฺดนงพ๒ๆอ‹Ma อŽ;hุฐกนlผy”/_ž์ูณใ๎๎Žฏฏ/Ÿ}๖ู]๗ฑdษ*Vฌˆ›››อ๒”y“คFdอš•ขE‹ฒpแBเึˆoลŠquuฅx๑โฌ_ฟ>U฿ ~๚ธปปใๆๆฦ+ฏผยฎ]ปlฺคLuุฒe =z๔ภหห‹‚ š๋WญZEตjีศ–-ูณgงaร†9rไฎว•ึา“'Oาผys๒ๆอ‹‹‹  $$$„˜˜˜ป๖ทn}Sนre\]]๑๑๑!444U›๘๘x†NัขEqvvฆPกBผ๛ฤวว›m์์์ธvํ฿~๛ญ9MฃcวŽŒ1‚๗{sํ๗w๛๏)_พ<ฎฎฎไส•‹ฮœ9cCสพ}๛จ^ฝ:Yณfๅร?4ืฟ๚๊ซœ:uŠˆˆˆLทศใ@ฉˆศ=๐๖๖&((ˆนs็šหVญZELL !!!้nwใฦ ๚๋/๚๋/N:ลœ9s๘๖oiำฆMช‚tอš5ุููQงNึญ[G๋ึญษ™3'1๙ฯจYณๆ]/RJHH`๏ฝ”+W.อ๕Wฎ\กQฃFTฌX‘๑ใวใ์์LHH๓็ฯ'$$„ ๐Ÿ‡kืฎัขE โโโฬm9BตjีˆŒŒไ๗฿g่ะก๛๏ิฌY“ปwงฺW=8z๔(ร† cเภฬž=›† โๆๆฦวฬะกC9z๔(UซVฝ็›p฿ผy“บu๋ฒkื.y็ฆNสoฟอoฟ–ฉำใWฎ\กAƒ”/_ž๑ใวSฐ`Aบw๏ฮ๛_ณMrr2มมม|๒ษ'4n˜/พ๘‚ฆM›๒้งŸฺ๖์ู8;;SญZ5sšFืฎ]yํตืhบ5Ÿ~๚ฉน.ๅpฦŒC๛๖ํy๑ล™4i}๛๖eร† Tฏ^=ี1\พ|™๚๕๋ภไษ“y๙ๅ—อuๅห—xช.b“g€!""w5sๆL0๖๎kL™2ลศž=ป๑ฯ?†a-[ถ4^~๙eร0 ฃpแยFร† mถา|4mฺิธqใFช}ตkืฮจQฃ†๙ผOŸ>†ปปป‘˜˜xO1๒ห/`|๑ลฉึีจQรŒ9sๆ˜หŽ;f†ฝฝฝฑkื.s๙š5k ภ˜9sฆนฌiำฆ†“““๑๋ฏฟšหฮ;gdฯžจ^ฝบน,%oUซVต‰?..ฮศ‘#‡ัฅK›ธ.\ธ`xxxคZ~งM›6€ฑiำ&ร0 ใภ`,Xฐ ใคค!%'N4—ลวว†———q๓ๆMร0 c๖์ู†ฝฝฝ๑ำO?ูljฦ๖ํอeูฒe3:t่j_&L0ใ๗฿ทYe888cฦŒฑY~่ะ!#K–,6หSโ M๗˜œœœŒ๎ป฿๕ุE!นGญZตโ๚๕๋,_พœธธ8–/_~ืำ๕Mš4aบuฌ[ทŽ‘Aƒฑz๕jฺดiƒq๗“$''ณz๕j›ำ๕9rไเฺตk6ำ2ใ๒ๅหไฬ™3อ๕nnn6ฃบล‹'GŽ”,Y’Š+šหS~ํท฿HJJbํฺต4mฺ”^xมl—/_>ฺดiรถmˆตูW—.]ppp0Ÿฏ[ทŽ่่hZทnmŽ๕ื_888PฑbE6mฺtOว๊แแ]N๏ฮษ’% ]ปv5Ÿ;99ัตkW.]บฤพ}๛Xฐ`%K–คD‰61ืชU เžcพขE‹HNNฆUซV6}็อ›—_|1U฿ฮฮฮt๊ิ)rๆฬ™๎|f‘ว‘.jนGนs็ฆvํฺฬ™3‡๙‡คค$Zดh‘แ6 คvํฺๆ๓เเ`<==y๗wYพ|นyััฝ{๙๓ฯ?m า=z๐ร?Pฟ~} (@:uhีช๕๊ีหTผF:_ศWฐ`มTฝxxxPจPกTห๓ซ๓O๙็Š/žชฯ’%K’œœฬ™3g(]บดนวววฆษ“'ฬb๎N๎๎๎R*>>>๔๏฿ŸI“&FตjีฆmถfษŸ?ช ญŠ+@TT•*Uโไษ“๓ฯๆ)๖;]บt้žbพษ“'1 ƒ_|1อ๕ŽŽŽ6ฯ (€““Sบ†ก šไ‰ข‚TDไ>ดiำ†.]บpแย๊ืฏOŽ9๎นW^y€ญ[ทš้ส•+๑๖๖ฆTฉRf;///"""Xณf ซVญbีชUฬœ9“๖ํ๓ํท฿ฆฟงง'@บ฿Q}๛ˆef–งWุf†ซซซอ๓ไไdเึ|หผy๓ฆj็ผฺฬ˜8q";vไวdํฺต๔๎›qใฦฑkื.› ฉ๎Wrr2พพพLš4)อ๕w๒๗ฺทซVญJ3w^”vg>๏อsฯ=w฿๑ˆฆท>ฝๅEŠม0 |||ฬ‘ู๛๕วp๓ๆMJ–,๙ฏ๚y”4‡TDไ>ธนน๑ีW_1bฤˆ๛พว็ฒeห๐๗๗เโล‹์฿ฟ฿ๆt=฿\ะ๖๖๖๘๙๙ุn่NŽŽŽ~_๑ฅวมม:u๊๐ใ?ฺ\ ๑โEๆฬ™CีชU๏zสฝnบธปป3v์XRญ๓ฯ?๏)ฆุุXณภOแ๋๋‹ฝฝ}†9J‘˜˜ศดiำฬ็7odฺดiไฮผjฝUซV๑วฬ˜1#ี๖ืฏ_็ฺตkๆ๓lูฒฅyuJม{็บื^{ FŽ™j$ฺ0ŒTฏŒคฬyญ\นrฆทฑšFHED๎Sz฿ฒ”–'N๐๗฿ทnbพkื.พ๖[Š-Jปvํ€[ง๋]\\lnแะนsg๛ojีชEม‚9u๊_|๑wkาค ƒ&66๖ž็efd๔่ัฌ[ทŽชUซาฃGฒdษยดiำˆg๘๑wฏพ๚ŠvํฺQฎ\9BBBศ;7งOŸfลŠTฉR…)Sฆd:ž7าซW/ZถlIฑbลHLLd๖์ู888ะผy๓ปnŸ?~>๘cขขข(Vฌ๓็ฯ'""‚้ำง›๓7ตkว?@ทnุดiUชT!))‰cวŽ๑ร?ฐfอ[ท^Zฟ~=“&M"๘๘๘PฑbEณธ!!.]บฐpแBŠ-สฅK—lึ8W_}๕ž๚‘g›FHฟ3fเ๋๋‹ฟฟ?ร‡'!!ฑcว2dศLmฟy๓fjืฎMฝz๕จ]ป6Wฏ^ฅ]ปvTจP *ฐkื.–,YBลŠ  I“&\ฝz€'Nˆฟฟ?ำงOฯp_้ตMoŸ็ฮฃaร†๘๛๛Sพ|yฮœ9cำ_bb"‹-ขN:๔๊ี €Yณf1pเ@ณทท77n`อš5QดhQผผผฬ6[ทnล___›้ิฉปw๏ฮT.ใใใ‰ตyˆˆˆศำK)p๐เAฆNส๖ํ‰ŒŒคOŸ>Lš4‰:={v›ถกกกๆ้่๐๐p:w๎lฎทoณfอbำฆMŒ=šๆอ›ณw๏^/^Lฯž=จQฃปw๏&""‚*Uช๐อ7฿ะทo_† Fdd$†adozmำg๏ฝiูฒ%‘‘‘lถ็ž{€3gฮ0lุ0J•*ล๒ๅห5jaaa๎๛ไษ“ฤววSซV-Yธp!pซจ6l#GŽLตอ๑ใว fฤˆ2mฺ4ณOหธqใ๐๐๐0… ส0&yฒ้”=ทF7CBBpwwเ๚๕๋ฌ]ป–๕๋ืs๊ิ)›ถบu3 ไ๋ฏฟ6ŸWซVผy๓ทN๗ฏZตŠ#Fp๙๒e9}๚4-[ถไโล‹๓ฯ?ิฎ]€ˆˆ‚ƒƒhบ5H7๔ฺฆทฯ;wฒ`ม\]]ุณg•+Wฆo฿พ„‡‡›ว~7III์ฝ›;wOPPีซWg๎นดlู’\นrฅฺ&K–,4kึŒfอšq๊ิ)บt้ยป๏พK\\\š๛4h๛๗7Ÿวฦฦช(yŠฉ MCDDGลวว‡ฤฤD๓O‚ƒƒYบti†eอšีู0 VญZE๙mฺ๔๎›‘#GRณfM.\ศ๒ๅหฐณณ3sZาk›>ำโ็็ว๔้ำ™>}:อ›7งK—.4mฺ'''HNN6ววว?~^~๙eณ€-_พ<วgฯž=lถ &ƒƒYณfฅ}๛๖ภญโx๖์ูฬœ9“^xม,ำโ์์Œณณ๓]ADDDž:eิชU‹y๓ๆ™sƒ‚‚8’““™={ถน฿฿฿,N็ฯŸŸa฿้ตMoŸUชTแoฟเฦ\ฟ~|๓Mvํฺล„ ุธq#%J”`โฤ‰.\ุ~ฯž=\ผx€:u๊ฐ~nผษตkืˆŒŒคH‘"„……q๊ิ)ขขข่ท/cฦŒ1‹ั6mฺDll,ซVญb๑โลิซW๏ž๒)"""O/ค@™2e่ีซ•+Wฦ฿฿Ÿฯ?<ถอ!ฝฐaร8w๎~~~”*Uส<ต?t่P๊ืฏOลŠ๑๑๑1Ož<™#Fเ๏๏ื9ค้ตMoŸŸ}๖?๐~~~TญZ•ห—/๔@hh($ €ชUซโๆๆFฉRฅ๘ๆ›oฬSๆฯ=๗:u" €Š+2`ภ€ปŽศถiำ†cวŽ1lุฐLŠˆˆศณลฮธ[๕#bฑุุX<<<(?ไG’ฌ็™แdo0จฬUฦvใfrฦำHไมPฮญกผ[Cy๔าส๙กตฺR>ฟcbb๎zญŠFHEDDDฤR*Hc3gฮ$ ภๆ‘ัt‘'‘ฎฒŒu๊ิ‰N:Y†ˆˆˆศCฅRฑ” Rฑ” Rฑ” Rฑ” Rฑ”nŒ/ฝ”๋๕ื_xzzZฮ3#!!•+Wา Aญ็™ œ[Cyท†๒่=๊œ๋ฦ๘""""๒ฤPA*""""–า๑ๅ‰1x๕Iฒdฝduฯ ’จe๏.?NV‡๓LPฮญกผ[Cyxฆ4+iu๗L#ค""""b)ค""""b)ค""""b)ค""""b)ค""""b)ค""""b)ค""""b)ค""""b)ค""""b)คiัข•*Uบ๏ํฃขขXธpแŒ(๓VญZE™2e(]บ4บuณYI–,YXฝzต%ฑ‰ˆˆศ“G_ju๋ึแเ๐๏พ&-ฅ mัขลŠ๊–+Wฎ3gฮtื_พ|™ฒiำ&r็ฮอฅK๗Už†a0hะ ^}๕Usูอ›7ILL$kึฌ4Nyzh„๔!›1cพพพ๘๛๛3|๘p;v,C† ษิ๖ฑฑฑิชU‹rๅสQถlYถmภเมƒYณf „……๑็ŸRฟ~}|}}ฉ[ท./^ cวŽๆheTTTšฃฒ7nเoฟฅrๅสL˜0€#Fjถษ›7/s็ฮฅM›6ไฮ///ณอ์ูณฉUซy๒ไ1—]นr…2eสะปwoŽ=š้ผ‰ˆˆศณC้Ct๐เAฆNส๖ํ‰ŒŒคOŸ>Lš4‰:={v›ถกกกfN็ฮpuuๅวd,[ถŒ0fฬ๊ึญKDDoผ๑ร‡็ีW_ๅะกC4iา„มƒ฿5พใวำฏ_?ส”)ร๛™1ccวŽอp›“'Or๖์YชVญJๅส•ูฒe 111|๕ื๔้ำวฆ}ž๘GGวTธบบาพ}{ฺทoฯแร‡i฿พ=ใฦใะกCi๎cธqŒ92S๑ˆˆˆศ“O#คPDDGลวว‡ชUซrเภ‚ƒƒ3&,,Œ›7oADDฤ=๏ำมมไไd›QษW_}•O>๙„ฐฐ0Zทnอส•+อvm—?~๊ืฏณณ3/พ๘"^^^œ?ž}๛๖ัณgOผฝฝYธp!:t`ใฦๆv๑}๔-[ถคL™2LŸ>=˜ DLLŒ๙8sๆฬ=ทˆˆˆ<9T>Dตjีbผyๆ)็   ฮŸ?OTTถmฃlูฒ,]บ4ร>bcc๑๒๒ยมม… rํฺ5ฒgฯN\\œูฎrๅสฬŸ?€9sๆPตjU .lฒท๏ห>}๚Iฟ~ ฃx๑โ|๗nืจQ#~๚้' รเย… \ธpผy๓ฒu๋VขขขˆŠŠขE‹|๛ํทิชU‹˜˜‚ƒƒฉ[ท.nnn์ุฑƒ๏พ๛Ž   tูููwww›‡ˆˆˆ<ฝT>Deส”กWฏ^Tฎ\>๓tฆ7‡ดM›6lธ???ถnj^0ไ็็ว๕๋ือ‹šFŒมส•+๑๓๓cัขEŒ=€ทz‹E‹QถlY๚๋ฏ4๗]ฝzuยยยุตkผ๖ฺkœ8q???>lถ๕๓๓ฃ\นr”.]š:u๊0eส”4Oำ฿ฎ>|˜~๚exฟˆˆˆ<›์ ร0ฌB$#ฑฑฑxxxะ๕๛dษ๊au8ฯ ’จe+“‹ฤฟปM™dŽrn ๅส๛ร3ฅYษ4—'$$ฐrๅJ4hpืมค!ๅ๓;&&ๆฎg;5B*""""–RA*""""–RA*""""–RA*""""–RA*""""–RA*""""–RA*""""–RA*""""–สbu"™5ฆ‹xzzZฦ3ใึ ”ๅ“Fลษ ”E9ทŠ๒n ๅ]nงRฑ” Rฑ” Rฑ”ๆสc~ไธfฟfuฯŽไ$r฿๏? ๖VG๓lPฮญกผ[Cy๔ฮG!Kฉ Kฉ Kฉ Kฉ Kฉ Kฉ Kฉ Kฉ Kฉ ตP‹-จTฉา}oลย… `D™๓็ŸาฐaCJ–,I้าฅ๙๋ฏฟฬuษษษTฌX‘G—ˆˆˆ<™TZdบu88ปฏJ{้•+W๎ฺฆw๏ผ๕ึ[๓ฯ์ุฑƒ์ูณ›๋พ๙ๆผฝฝ๏นOyvฉ }fฬ˜ฏฏ/ >œ„„ฦŽห!C2ต}ll,ตjีข\นr”-[–mถ0x๐`ึฌYC@@aaa๙็Ÿิฏ____๊ึญหล‹นrๅ %K–ไ? ))‰J•*ฑ{๗๎T๛ุตk;v$00ธU์>zฑcGVฏ^Mtt4‡ๆตื^ภรรggg๛oๆอ›วoฟmำwฏ^ฝจ[ท.‹/&11๑ฎวOllฌอCDDDž^*Hฒƒ2u๊Tถo฿Ndd$}๚๔aาคIt่ะมfd 44”ะะPยรร้น3ฎฎฎ๘ใ์฿ฟŸeห–1`ภฦŒCบu‰ˆˆเ7`๘๐แผ๚๊ซ:tˆ&Mš0x๐`rๆฬษุฑc้ึญ'NคjีชTฌX€ธธ8BCC)_พ<#GŽคI“&?~<รใ๙๗฿ษ•+ฏฟ:eห–ต)ชฬะกCS†……1rไH–-[FฉRฅ>|8gฯžMwใฦรรรร|*T(“ู‘'Qซxฺmผ™ธ~:kืฎe๚๕œ:uสฆmทnฬŸ๙๚๋ฏ0 ƒ๗฿Ÿmถแเเภ/ฟ’ๆพv์ุมˆ#hถ-_|๑อš5cฮœ9|๓อ7DDD˜ํ๓็ฯOPP‹-ขpแย™:žคค$vํฺล๛)VฌM›6e้าฅ*Tˆ+WฎPณfM6oœjปJ•*QฉR%bcc9r$์ุฑƒ—^z)UAƒัฟ๓yllฌŠR‘ง˜ าG,""‚ฃGโใใCbb"๙'มมม,]บ4mยยยธy๓&888เๆๆvO๛LHHเ๗฿ว0 ฎ]ป†ซซ+ ,`ฺดiำฉS'ฺตk‡งง'$''›}ฤววทŠุ_|‘าฅKะจQ#"##๙ใ?๘้งŸ๐๖๖ๆฦฤลลัฃGพ๒Knผษโล‹™1cWฏ^e๚๔้๘๙๙ฅฏณณณ9 @DDDž~:eีชU‹y๓ๆ™๓ ƒ‚‚8aืฎ]ผ๙ๆ›ธธธ<ˆ‹ˆˆศN้CVฆLz๕๊Eๅส•๑๗๗็๓ฯ?OทmzsHดiรฦ๑๓๓c๋ึญไษ“???ฎ_ฟn^ิ4bฤVฎ\‰ŸŸ‹-b๔่ั9r„๏ 6Œ๖ํsๅส–/_nณ฿๙๓3lุ0~๙gณ urrขo฿พ๘๛๛‚ฟฟฟู~โฤ‰ใ็็GŽ9hผy†9เเมƒ„††pฯ9‘ง›a†ีAˆd$66ฆnˆฤ5{ซรyv$'‘๋ยAฮ๋๖๎e’Iสน5”wk(๏ฯyƒ ptt|่ปK๙މ‰1ฏฅIFHEDDDฤR*HEDDDฤR*HEDDDฤR*HEDDDฤR*HEDDDฤR*HEDDDฤR*HEDDDฤR*HEDDDฤR๚.{ybผ๎_OOOซรxf$$$ฐrๅAฺ–+๘Hn ,สนU”wk(๏^JฮG!Kฉ K้”ฝ<1๖Eล’Šพ๏๘QINJ`ฯo1ุ;่ญโQPฮญกผ[Cy๔๎ฬyPัึtŠˆˆˆˆฅTŠˆˆˆˆฅTŠˆˆˆˆฅTŠˆˆˆˆฅTŠˆˆˆˆฅTŠˆˆˆˆฅTŠˆˆˆˆฅTŠˆˆˆˆฅTŠˆˆˆˆฅTŠˆˆˆˆฅžู‚ดE‹TชT)Sm[ตj…ฟฟ?aaa9ชดีฌY“cวŽYฒ๏ดฬš5‹’%KRชT)Fmณn๙๒ๅุูู=V๑Šˆˆศใํ™๒ุu๋ึแเน๏D?<'Nœ 222ีบคคคL๗c•{๑ส•+ไฬ™3๕?33fฬ`฿พ}dอš•K—.™๋nธมงŸ~สK/ฝd.ปvํNNN8::฿ˆˆˆศS๏ฉ!1cพพพ๘๛๛3|๘p;v,C† ษิ๖7ๆไษ“p่ะ!ผฝฝ4h์น“ัฃGSฆLXถl›7oฆN:4hะoooBCC3f ~~~ิฏ_Ÿฤฤฤt๗ทt้R๐๗๗งs็ฮๆ๒™3gRพ|yส–-ห™3gXฒd +V$ €&Mšp๕๊U:v์H=จPก“'Of๒ไษ”(Q๚๖ํ›jŸ111L™2ๆฯŸo๖ฑz๕jขขขฬัไoพ๙†ฝ{“5kVผผผฬ~ฦO๗๎quu5—8q‚%J0x๐`N:•ฉœวววk๓‘งืS]ึฌYร;๏ผc…$,,Œฝ{๗๒มเใใรมƒquueร† iฦ{๑โE๚๗๏ฯชUซˆŒŒd๘๑ๆ:777๖ํGถmอ8kิจม๎ป‰ˆˆ J•*|๓อ7f๛่่h๖์ูร€3f  22’‘#GšmRŽณB… \ธp‘nบe˜ำ“'Oฒ~*Uชฤห/ฟฬกC‡€[E๋ฎ]ปhัข…M๛ฒeหฒ~๒็ฯOณfอhุฐ!ห–-#)))}Œ7๓QจPก c‘'S]nผ™ธ~:kืฎฅC‡ฉฺv๋ึอ,ฦ๙๚๋ฏำํทeห–์ุฑƒ-Zเ์์Lพ|๙(WฎGŽ rๅสไฬ™“นsใแแAฃF(Sฆ งOŸNณ฿ปwSปvm๒ๅห@ฎ\นฬuมมมภญ/** €ำงOSปvm|}}™6mG5ทhั;;;ส—/Oถm™7oฮฮฮLœ8‘5jPตjUŽ=ส่ัฃ๑๖๖ฮ ›ท$%%qyv์ุม่ัฃุ้ฑ#๏พ๛.๙ฯาฦรรƒž={ฒ~ DŸ>}hฺดiบ๛4h111ๆ#eDXDDDžNฯิาˆˆŽ=Š‰‰‰๙็Ÿณt้า{๊'ๅtuFœœœฬŸํํํอ็๖๖๖Žฆ'ฅผ}๛ฝ{3rไHjึฌษย… Yพ|yš1ฎXฑ‚M›6๑ฟะะP6oLถmน~:17nคK—.TซVอฦมมไไdเึ)๔๙๓็งN:ุSฅJ.\ธ€a์฿ฟ฿,š/\ธภ+ฏผยฆM›(Vฌpkd๕๋ฏฟf๑โลิฏ_Ÿ๎ปgxฌ)ว+"""Oฟงz„ดVญZฬ›7ฯœƒฤ๙๓็‰ŠŠbถm”-[๖ž‹ัUฎ\™ล‹“ภ… 8pเฅK—พ๏*Uชฤ๚๕๋9<w†ํcccษ—/ษษษฬž=;อ6ษษษœ={–ฺตk3qโDNœ8@žด˜EDDไษwO#ค3fฬภืื†NBBcวŽeศ!™ฺพqใฦœsๆLส—/Oูฒe9sๆ K–,กbลŠะคIฎ^ฝ @วŽ้ัฃ*T`๒ไษLž<™%Jเ๏๏O฿พ}ำ๗ฑcวจQฃTฌX‘๘๘x๖ํGีชU)Rคkืฎ 11‘>}๚PกBฬcฅM›6๘๙๙@xxธอ>Vฏ^M5ˆ‰‰aลŠTชT‰€€บu๋Frr2C‡ฅx๑โิฉS‡ห—/ง๋‘#Gx็w(]บ4Wฎ\ oผๆ๚Gv็ฯŸฯ;๏ผ€‹‹ ูณgH๗ต0aยชTฉยw฿}ว7าอืํโใใ‰ตyˆˆˆศำ+ำ้มƒ™:u*ทo'22’>}๚0iา$:t่`%)BCCอ&<<,.\ˆฏฏ/๘๚๚เํํMDDNNN,]บ”}๛๖ฑfอy็ณ(๘<ˆซซ+6lH3‹/าฟVญZEdd$ใว7ืนนนฑo฿>ฺถmkฦYฃF v๏MDDUชTแ›oพ1GGGณgฯ ภ˜1c8pเ‘‘‘Œ92|ตkืŽ#FษฺตkqttเิฉSlูฒ…~๘ม๋ฏฟฦวว‡ฝ{๗ฒu๋VHBBฃFขXฑb|}}้฿ฟ?วOwใฦรรรร|*T(ร๖"""๒dห๔)๛”น‹๎๎๎ภญน„kืฎe๚๕œ:uสฆmทnฬŸ๙๚๋ฏำํทeห–์ุฑƒ-Zเ์์Lพ|๙(WฎGŽ rๅสๆi_5j@™2e8}๚tš๎ฝ›ฺตk“/_>rๅสeฎ  lูฒfแy๚๔iZถlษล‹๙็Ÿจ]ปถูพE‹ุููPพ|yฺถmKห–-iฺดiš๛Ž%..Ž—_~ูŒ9Eร† qpp lูฒDEEทNu=z”Yณfวนs็ุธq#+Wฎ K–,f๎๗๏฿ฯ‰'ุฐa9rไ`ูฒeU”Šˆˆ<ฝ๎๛ขฆˆˆŽ=ŠUซVๅภfกw/ฒfอzื6ทฯiดทท7Ÿ“””tฯ๛tvvNต}๏ฝ2d‡โใ?6G๎ŒqลŠt๏-[ถPฏ^ฝฒoร0๘ๆ›oˆˆˆ ""‚ำงOSธpแt๛(Xฐ III๓ฯๆ๖Mš41ท?~8๏ฟ>€YH฿๙๓๔้ำ)]บ4-[ถd๔่ั๑ว6๛ธฝmJ.<==ษ•+ตkืฦฮฮŽฆM›yืืBrr2+Wฎคu๋ึ„……๑ษ'Ÿ๐๊ซฏf˜#www›‡ˆˆˆ<ฝ2]ึชU‹y๓ๆ™๓๙‚‚‚8~xฺตkวตkื(^ผ8ร‡O๗ธเึแ]ปvแ้้™a;yvู†aX„HFbcc๑๐๐เh Orุด:œgFR๖ฝ>ƒ๒๓ปเ˜น;$ศฟฃœ[Cyทฦำ–๗|?EDDไู๕ิค็ฮฃJ•*เ็็ว€8t่L˜0kืฎัฌY3J•*Eทn๎ฺ฿w฿}ว‚ 0`={๖dึฌYดhั‚5jะฎ];~๙ๅชUซ†ŸŸญZตโฺตkิฌY“PถlY*Tจ@xx8ฏผ๒ /ผ๐+VฌHwฑฑฑดiำ???nu7ๆล_dฬ˜1f๛FQพ|y|}}YดhQQQะชU+J•*•*'วŽKต฿]ปvัฑcGอ>*Uชdฎ๏ุฑ#ซWฏ&::šร‡๓ฺkฏเแแณณ37๓ๆอใํท฿ถ้ปWฏ^ิญ[—ล‹“˜˜xืœวววk๓‘งืSWฮ;—ฺตkมพ}๛=z4พพพDDD๐{๏1u๊T|||8z๔(๕๋ื็โล‹ๆถๆฯ;w&<<œ๖ํฬิฉS™:u*d๙๒ๅฬ™3‡ฝ{ำฏ_?<ˆทท7Ÿ~๚ฉู‡งง' jีช๔๊ี‹+VฐdษFnฃFขXฑb|8gฯžMwใฦรรรร|*T(ร˜DDDไษ–ล๊ด *ะฑcG์ํํiูฒ%YณfตYฟcว>๐Cš4ibณ>""ย9ฃำ๕๊ี3OSGDD˜ฃ…mถๅƒ>05jิ___์์์pqqกL™2œ>}:พ7nศส•+ศ’% ๎๎๎TฉROOO|||8w๎/พ๘"Ÿ~๚)K—.nj^ธpภœ฿™VNJ•*@๙ bัขEf‘z7III์ฺต‹๛๗SฌX1š6mสาฅK)TจWฎ\กfอšlผ9ีv•*UขRฅJฤฦฦ2rไHผฝฝูฑc/ฝ๔Rชถƒ ขๆ๓ุุXฅ"""Oฑงn„ดz๕๊lบ///š7oฮ† Rตฑณณ๛W๛ธณศM““๖๖๖6?฿ฯำ”ำโท๗ฑiำ&๖์ูรž={ˆŒŒฤวว‡๘๘๘T1ฆ—“ -[6‚ƒƒ™sฦŸŸฟ๖}๛๖W๑:”'Nเ๋๋K… 8qโDบm๋ึญหๅห—)]บ4Ÿ~๚)iถป3'mถตYŸ?~† ฦฯ?lคNNN๔ํBBBl๚ž8q"มมม๘๙๙‘#Gš7ožแ1p๐เABCCmr,"""`gค\#๒˜ŠลรรƒKcซใ้œ|๗ ไHฐsb๕ ฝฉ๗็87ญ็™ œ[ใYอป}Ÿ๎่!JHH`ๅส•4hะGGGKcyV<๊œง|~วฤฤu๚S7B*""""O–ง๎*๛'ลš5klฎศ‡[s:๓ŸX‘ˆˆˆˆ5TZคnบิญ[ื๊0DDDD,งS๖""""b)ค""""b)ค""""b)ค""""b)ค""""b)]e/O ๛ทa๏้iuฯ ๛„Xน๛^ซฑืMซ ๅสปˆ๕4B*""""–RA*""""–า){yb$ฏLrVฝd3รพูซCษ4ŠˆˆˆˆฅTŠˆˆˆˆฅTŠˆˆˆˆฅTŠˆˆˆˆฅTŠˆˆˆˆฅTŠˆˆˆˆฅTŠˆˆˆˆฅTŠˆˆˆˆฅTŠˆˆˆˆฅT>Bััั|๕ื้ฎฯ›7๏}๗=kึ,๚๋ฏ DEEQฉRฅ๛GŠฝ{๗H้าฅiธฑอบ๓็ฯใ๎๎Nhh่ฟˆˆˆ<T>Bw+Hฬค™qๅส• ื'$$ะฅKๆอ›ว‘#G๘ๆ›olึ8W_}๕ž๚‘g› า‡่นsTฉR…€€0`‡" € &pํฺ5š5kFฉRฅ่ึญ[ฆ๚ ฅB… ๘๙๙ัฉS'’““Yผx1แแแ4kึŒjีช0sๆLส”)C™2e˜>}z†}&&&ฒhั"๊ิฉCฏ^ฝ€[๎ภอ6ธqƒ5kึDัขE๐๒๒2lบwww|}}m๚ คSงN์ฝ;Sว("""ฯคันsฉ]ป6์ทัฃGใ๋๋KDD๏ฝ๗SงNลวว‡ฃGRฟ~}.^ผhn`นsgยรรhีช{๗๎ๅเมƒธบบฒlู2š5kF`` ‹/ๆงŸ~โ์ูณŒ3†mถฑs็N&MšDTTTช๘ฮœ9รฐaร(Uชห—/gิจQ„……exL'Ož$>>žZตjศย… [Eํฐaร9rdชmŽ?Npp0#FŒ 00iำฆq๕๊ีt๗OllฌอCDDDž^YฌเiVกB:v์ˆฝฝ=-[ถ$kึฌ6๋w์ุม‡~@“&MlึGDD˜?฿~š?22’!C†Ktt4… ขI“&6†‡‡SงNrไศ@ƒ ุฝ{7+V4์ูณ‡ส•+ำทo_ยรรqwwฯิ1%%%ฑ{๗nv๎I||}๚_ฑ๙๙๙1}๚tถmF๓ๆอ๙แ‡ธy๓ฆนมมไไd๓yส~๒็ฯฯห/ฟŒปป;นs็ฆ|๙๒?~œ={๖0~xผฝฝ™๘€ส•+ะฏ_?ผฝฝำœGšฒฏะะPฎ^ฝj^xTตjU(UชีชUฃPกB<๗st๊ิ‰€€์ํํ0`๙๓็ฯ0mฺดแ๛๏ฟว^ˆˆˆHjv†aV!’‘ุุX<<<ธ๔}W<ณ๊oจฬฐo6ๅ_๗‘ภส•+iะ ŽŽŽ *นๅสป5”๗G๏Q็<ๅ๓;&&ๆฎg;5d%""""–RA*""""–RA*""""–RA*""""–RA*""""–RA*""""–RA*""""–RA*""""–RA*""""–าืศรพ์==ญCDDD0ŠˆˆˆˆฅTŠˆˆˆˆฅtส^žษGGฒปซีa<3’“I><d้๚Pู๛ทณ:K้cFDDDD,ฅ‚TDDDD,ฅ‚TDDDD,ฅ‚TDDDD,ฅ‚TDDDD,ฅ‚TDDDD,ฅ‚TDDDD,ฅ‚TDDDD,ฅ‚TDDDD,ฅ‚๔DGG๓๕ื_งป>oผ๗ี๏ฌYณ๘๋ฏฟา]ษ'ŸWฟ›7o&$$€#Fz฿}ฅ7nล‹งdษ’ฬš5หf”)Sฐณณใฦz?"""๒lPAz๎Vฏ๔ Rร0HNNW้ฝHNN&&&&ร6kึฌa๏ฝ=z”ฃGาฐaCsŸษŠ+x๙็อe111†๑ะb‘'Ÿ า œ;wŽ*Uช€ŸŸ เะกC0aยฎ]ปFณfอ(UชบuหTŸ๏ฝ๗%J”ภ฿฿Ÿ &ฐx๑bยรรiึฌีชU Ož๘์์์ศ;ทูฯ Aƒ9r$vvvๆฒŸ~๚‰’%K๒Ÿ‡K—.e*yถจ อภนsฉ]ป6์ทัฃGใ๋๋KDD๏ฝ๗SงNลวว‡ฃGRฟ~}.^ผhn`นsgยรรน|๙2 .ไ่ัฃDFF๒๖oำฌY3YผxฑY ^บt‰ฆM›r๘๐afฮœ‰งง'|๚้ง,\ธณgฯr่ะ!fอšEวŽ๏๛๘6mฺฤ๋ฏฟNอš5ฑณณc๋ึญ4jิ(รmNž<ษส•+ฉPก5โฬ™3์ฺต‹ไไd^z้%›๖5bห–-ภญ"7$$„อ›7gธ๘๘xbccm"""๒๔RAš *0{๖lFŽษษ“'quuตYฟcวsไฐI“&dอšี\a๕ื_ˆ‡‡nnnt๎™ฅK—โๆๆ–ๆ~ณgฯNบuำ\ทcวฺดiƒพพพdอšีฆฮฌwy‡VญZัถm[Ž9ยภษ“'ฯ]ทKJJ"))‰ฝ{๗าฆM๚๔้Crr2ƒ b์ุฑin“'Oศ‘#Gxใ7hูฒ%๏ผ๓Nบ๛7nๆฃPกB๗||"""๒ไPAš๊ีซณu๋Vผผผhผ96lHีๆ๖ำำw“%Kยรรiฺด)aaaผ๕ึ[iถปฝฐอ,’““อ็๑๑๑ถ0`oพ๙&๛๗งgฯž6๔W๙iฺด)อš5#22’ธธ8>LฅJ•๐๖๖ๆ์ูณ/^œ๙ว๎ภ๔์ู“๐ึ[o1`ภ€tc4h111ๆ#eVDDDžN*H3p๊ิ)๒ๅหG๗๎ !::šธธ8s}ๅส•™?>ห—/ท)ภาr๕๊Ubbbf๘๑f˜={v›~๏dooo‡•+Wfม‚†ม‘#Gธ~:y๒ไกpแยDFFฐgฯžปŽšz{{๓๑วsไศjิจAy้ฅ—ุฟ?… 6ใ[บtฉนํงเ7oL‰%๐๐๐เฯ?$**Šจจ( ,ศ๑ใวษš5+๛๗๏งB… 0€5jp๘๐a๓ŸเํํnlฮฮฮธปปCๆฬ™ร˜1chฺดiบmฎ\นBฮœ9ำ]Ÿ@—.]Xธp!E‹ๅาฅK6๋ศซฏพzO}ŠˆˆศณM#คกs็ฮQฅJ๐๓๓ใุฑcฬ˜1___>|8ร‡งB… ”)S†?ะ›แร‡ใ๏๏O๕๊ี‰ๅป๏พcม‚ 0€ž={ฺ์/11‘E‹QงNz๕๊ภฌYณ8p MŸ7n`อš5QดhQผผผฬ6[ทnล___›้ิฉปw๏ฮิ๑วววk๓‘ง— าวะนsฉ]ป6์ท๘๘xฆNส๖ํ‰ŒŒคOŸ>๔้ำ‡ฝ{๗r๐เA Dอ็ฑฑฑ*JEDDžb!} Uฏ^ญ[ทโๅๅE๓ๆอ1 #U›7nะฟVฌXมมƒiูฒ%๑๑๑ๆzggg์ํํIJJJตฝŸŸำงOgถm4oœ~๘›7oš๋HNN6Ÿง๔?~^~๙eษ;7ๅห—็๘๑ใ์ูณ‡๑ใวใํํอไษ“6mฺd๓ผpแยŒ3___"""x๏ฝ๗8x๐ ห—/gฮœ9๔๋ืแร‡ฮคI“่฿ฟ?ญZตb๏ฝ *”a{yฒeฑ:€‡ญB… t์ุ{{{ZถlIตjีlž—*U*อํ๊ีซG๖์ูุธq#G5ื988ษ!Cˆ%::šB… ัคI5j€ฏฏ/vvvธธธPฆLNŸ>aผM›6ลัั‘ธธ8ถo฿n๖—””D‘"Eาฮรร777:w๎LำฆMiุฐa†}4mฺ”#GŽ๐w฿Qตjีปๆ1ELL >>>์ทฑcว2jิ(>๚่#>sึฏ_Ÿๆ6Œ=š#F๐๗฿SฝzuFล€าl?hะ ณ่ˆUQ*""๒{๊ า๊ีซณu๋V–-[F๓ๆอ™2eJช็izYณf5ถณณcุ(w้า…UซV๑โ‹/๒ษ'Ÿp๕๊Us““๖๖๖6?฿mnhส~“““)P ฉฺ888˜ำโใใศ’% แแแฌYณ†ฐฐ0-ZฤgŸ}–nใฦให/ฟไอ7฿คYณft๎™_|1ร}ไฯŸŸฆM›ะฌY3z๕๊ลoฟฦ/ฟBษ’%๘๓ฯ?)Wฎ๛๗๏7ท๛้งŸ˜>}:แแแ|๘แ‡ดm68;;ใ์์œažDDDไ้๑ิŸฒ?u๊๙๒ๅฃ{๗๎„„„ฐm6›็‡"{๖์ฤลลฅGตjีฬ‹ž’““9t่ืฎ]#w๎ธqƒ๙๓็?ะธ=<<ศ™3งy{BB?3… &""‚ไไd–/_ภีซW‰‰‰!88˜๑ใว‘aeส”แห/ฟไภผ๘โ‹ดiำ†—_~™จจจt๗ทF~ทlูภๆอ›)Qขพพพ\ผx‘จจ(ขขขศ;ทYŒฎ]ป–2eส๐ษ'ŸะบukŽ9ยเมƒษ“'ฯอ—ˆˆˆ<นž๚าอ›73~xœœœ๐๔๔ค]ปv๘๙๙™ฯ็อ›‡งง'~~~๘๙๙ัฎ];r็ฮmำว_|Aทn˜:u* ดo฿___Lนrๅศ“'ฯ]็^ฐฐ0บw๏ฮ{๏ฝGbb"๏ฝ๗%K–dศ!ดo฿ž็ž{โโโๆๆอ›ุูู™sEำ๋#Eถlู่น3;wf฿พ}dษr๋%‘ึ>เึ้๔ึญ[3rไH๒ๆอห์ูณ3<OOOVฏ^Mม‚tzDDDไ)ag†au"‰ลรรƒพซ๚“%๛“7ิ„*[Bฆ$$$ฐrๅJ4h€ฃฃฃีแ<”sk(๏ึPฝG๓”ฯ๏˜˜3l๛ิŸฒ‘ว“?๔Zณf |๐อฒz๕๊๑ŸวขˆDDDDฌฃ‚ิu๋ึฅnบV‡!"""๒Xะ){ฑ” Rฑ” Rฑ” Rฑ” Rฑ”ฎฒ—'ฦ โ้้iu"""๒€i„TDDDD,ฅ‚TDDDD,ฅS๖๒ฤX๘\\/ปdบ}๛bb4"""๒ h„TDDDD,ฅ‚TDDDD,ฅ‚TDDDD,ฅ‚TDDDD,ฅ‚TDDDD,ฅ‚TDDDD,ฅ‚TDDDD,ฅ‚TDDDD,ฅ‚TDDDD,ฅ‚๔1อื_mu™ถw๏^)]บ47ถYwy ต(:yาจ } dT&%%=าXฎ\น’แ๚„„บt้ยผy๓8rไ฿|๓อ๚๒๊ซฏSŸ"""๒lSA๚;wŽ*Uช€ŸŸ;v์ฐy~์ุ1ฬกC‡`ย„ ฬš5‹-ZPฃF ฺตkวล‹iาค TซV'NJ… ๐๓๓ฃSงN$''PณfM @ูฒeฉPกแแแผ๒ส+ผ๐ย ฌXฑ"UŒ‰‰‰,Zดˆ:u๊ะซW/fอšลภอ6ธqƒ5kึDัขE๐๒๒2lบwww|}}m๚ คSงN์ฝ๛ม&WDDDž *Hฒนs็Rปvm"""ุทo›6mฒy^ธpaฦŒƒฏฏ/ผ๗{>žZตjศย… [Eํฐaร9rdชmŽ?Npp0#FŒ 00iำฆq๕๊ีt๗OllฌอCDDDž^YฌเiWกB:v์ˆฝฝ=-[ถคZตj6ฯK•*•ๆv๕๊ี#{๖์lธ‘ฃGš๋ˆŒŒdศ!ฤฦฦMกB…hาค 5ภืื;;;\\\(Sฆ งOŸ`ฯž=Tฎ\™พ}๛Žปป{ฆŽ'))‰ปwณs็Nโใใ ขz๕๊ฬ;—–-[’+WฎTdษ’…fอšัฌY3N:E—.]x๗w‰‹‹KsใฦKณฐ‘ง“FHฒ๊ีซณu๋Vผผผhผ9 6ฯ7lุๆvYณf5ถณณcDDD˜#ซ]บtaึฌY:tˆ>}๚onใไไ€ฝฝฝอฯ)sR˜>}:ถmฃy๓ๆ๐รผyำมมมœ˜}็ฯŸŸ—_~wwwr็ฮM๙๒ๅ9~8{๖์a๘๑x{{3y๒dฬw฿}gn๙๒e&OžLpp0ูฒecม‚้ๆlะ Aฤฤฤ˜3gฮd.ู"""๒DRA๚:uŠ|๙๒ัฝ{wBBBุถm›อ๓C‡‘={๖tG ชUซf^๔”œœฬกC‡ธvํนs็ๆฦฬŸ?žโrqqแอ7฿dืฎ]L˜07RขD &Nœ@แย…‰ŒŒnฆ^ผx€:u๊ฐ~nผษตkืˆŒŒคH‘"„……q๊ิ)ขขข่ท/cฦŒก}๛๖ดiำ†   bccYตj‹/ฆ^ฝz้ฦๆ์์ŒปปปอCDDDž^:emผ™๑ใวใไไ„งง'ํฺตรฯฯฯ|>o<<==๑๓๓รฯฯvํฺ‘;wn›>พ๘โ บu๋ฦิฉSIHH }๛๖๘๚๚2x๐`ส•+Gžฟcbb๎zถSCV""""b)ค""""b)ค""""b)ค""""b)ค""""b)ค""""b)ค""""b)ค""""b)ค""""b)}uจ<1ZผะOOOซร‘L#ค""""b)ค""""b)ค""""b)ค""""b)ค""""b)ค""""b)ค""""b)ค""""b)ค""""b)ค""""b)ค""""b)ค""""b)ค""""b)ค""""b)ค""""bฉ,V r7†a‡ฃฃฃลั<;๘็ŸˆUๅสป5”๗G๏Q็<66๘ฟฯ๑Œจ •วๅห—๐๑๑ฑ8นWqqqxxxdุFฉ<๖rๅสภ้ำง๏๚‚พ_*T`๏ฝ๊๛6ฑฑฑ*Tˆ3gฮเ๎๎ภ๛˜ฑ?์V฿;็๐dๆๅa๗ฏผ[ำทc}฿๚ตnqqqไฯŸฎฉ •วžฝญฉฮํศมมA}งรก์ใaว$็aๅž์ผ(๏OW฿)๔๓h๛†G๛Zฯ์@’.jz๖์ฉพฑ‡ป๒žถ'9/ส๛ำี๗ร๖$ฟŸลผ™™i*bกุุX<<<ˆ‰‰y่ฉหQ=ๅสป5”๗G๏qฮนFHๅฑ็์์ฬ๐แรqvvถ:”gŠ๒่)็ึPญกผ?zsฮ5B*""""–าฉˆˆˆˆXJฉˆˆˆˆXJฉˆˆˆˆXJฉˆˆˆˆXJฉ<๖ฆNŠทท7...TฌX‘={๖XาkธqTจP์ูณใๅๅEำฆM9~ธM›7nะณgO<==qssฃy๓ๆ\ผxัฆอ้ำงiุฐ!Yณfลหห‹๗{ฤฤฤGy(Oฌ็?ุููัทo_s™rp๑วดmOOO\]]๑๕๕%<<\oร† #_พ|ธบบRปvmNžจ~๙ๅ—Fฮœ9m_>๘เฃx๑โํXtส^[7od฿พ}ิฎ]\fooOํฺตูนsง…‘==bbbศ•+๛๖ํ#!!ม&็%J”เ๙็Ÿ7sพs็N|}}ษ“'ูฆnบฤฦฦrไศ‘G“ฅgฯž4lุะ&ท œ?,K—.%00–-[โๅๅEูฒe™1c†น๗฿็ย… 6y๗๐๐ bลŠ6yฯ‘#f›ฺตkcooฯ๎ปมRึๅฬ™๓วฎ‚TไีณgO>ฬถmฌๅฉvๆฬ๚๔้รบu๋pqqฑ:œgFrr2Œ;€ฒeหr๘๐aBCC้ะกƒลั=ฝ~๘แยยย˜3gฅK—&""‚พ}๛’?~ๅ]2คS๖๒ุz๎น็pppHuต๑ล‹ษ›7ฏEQ=z๕๊ล๒ๅหูดi 4—็อ›—›7omำ๖œ็อ›7อ“”ubk฿พ}\บt‰rๅส‘%Kฒdษย–-[๘๓ฯษ’% y๒ไQฮ‚|๙๒QชT)›e%K–ไ๔้ำภๅ-ฃ๗—ผy๓r้า%›๕‰‰‰๗฿ส{:{๏=HHHพพพดkืŽ~๚1n8@yุT~ญxฯQA*-'''ส—/ฯ† ฬeษษษlุฐ   #{r†Aฏ^ฝXผx17nLuJฆ|๙๒8::ฺไ๘๑ใœ>}ฺฬyPP‡ฒyC[ทn๎๎๎ฉ W^y…C‡a>yใ7ฬŸ•๓ฏJ•*ฉnivโฤ . €y๓ๆตษ{ll,ปw๏ถษ{tt4๛๖ํ3lธ‘ไไd*Vฌ๘Žโษ๓ฯ?`oo[Z888œœ (๏ƒสoPP[ทn%!!มlณn:Š/PNืบํ“<ๆอ›g8;;ณfฟ๖๎=ฆ๊๒๘Oเแœรลร‚4<โจ)M%s*d ฌFCc…๚‡ๆpMป่•ฎVซaห˜ ูก1ฤ‰‹j หห,$C—ฃcrผ‡มไ๒๙แ๘ฮ“€wxฟ6ถ๏ๅน|ž‡}๖>฿‡r๒ไIy๓อ7Eงำ9}mLทoๅส•ขีjฅบบZl6›๒ใp8”2+Vฌฐฐ09pเ€;vLโโโ$..Nน?ธั‚ ไ๘๑ใRYY)'NไDwเฦฏ์E8็ยัฃGลรรC>๚่#9sๆŒŠททท์นS)ณeหั้tฒgฯ๙ใ?$))iศํqž~๚i9rไˆิิิศคI“ธะ222ฤh4*>•••I@@€ผ๖Jฮ๛ฝ้์์”ฺฺZฉญญ๒๙็ŸKmmญ๗฿"rๆืnทK`` คงงหŸ)ลลลโํํอmŸhlหออ•ฐฐ0?~ผฬœ9S>์๊Y†ษฯฯWส๔๔๔ศชUซฤืืWผฝฝ%%%El6›S;MMM’˜˜(^^^ ูููา๛G๓่๚oBส90๖๎+ัััขRฉ$**J๒๒๒œ๎ ศ๛๏ฟ/ขRฉdผyr๚๔iง2---bฑXDญV‹Fฃ‘ๅห—Kgg็รฦ#ฅฃฃCึฌY#aaa๒ุcIDD„ผ๛๎ปNq๏MUUีว322Dไอo]]ฬš5KT*•Fูฒeห—›ศ >ˆˆˆˆ่!ใR""""r)&คDDDDไRLH‰ˆˆˆศฅ˜‘K1!%""""—bBJDDDD.ล„”ˆˆˆˆ\Š )นR""Rtwwรl6ฃซซหีก8™:u*:tGuยรรQSS๓€"บ3x๖ูg]ัจล„”ˆh ว„ ะญ\s8๐๑๑AxxธS9oooจีj๘๛๛#55mmmNm?~Ž“ mถ!)) jต๚žฦqฟีืื#..๎ก๔U]]'žxยฺ้ฒeห๐แ‡u›“'O†ม`ภฝ{๏5<ขKLH‰ˆFฃัˆ๒๒rๅ|ฯž= บฉ?ˆฎฎ.XญV\ปv 999N๗+++‘pG}๛ํทฐX,w๗่๋๋{เ}ŒƒcตX,ุพ}ป‹ฃ!˜2‹………ส๙ฮ;ฑt้าaหO˜0K–,ACCƒำ๕ม„ดงง‹~~~๐๓๓ร์ูณ‡lวjตขนนำฆMSฎ…‡‡ใำO?ล”)Sเใใƒ7โ๔้ำ˜1cดZ-VฌXก”ภฆM›Š   ฌ^ฝ๛/`วŽ˜;w.ฒฒฒ ีj‘ŸŸึึVคฅฅAฏื#""รŽ๑ฦื๏x๒ษ'•งฦลลลรึ๛๕ื_1y๒d๘๛๛cบuP๎}๕ีW˜4i‘‘๎๎n๔๗๗#11gฯž…Zญ†ZญFAA ‘““ตZญŒ๙ฤ‰˜3g|}}1}๚t;vLiออ [ทnลใ?Žนs็ๆฬ™ƒ๛๗ฉdœ่ถ &“Iชซซ%$$D.]บ$—.]’ฉฉฉ“ษไT๎—_~‘๖๖vYผxฑlฺดIน฿ัั!ƒA๚๛๛ๅ๋ฏฟ–ล‹‹รแ^9x๐เ}WTTศ๔้ำoŠ'>>^ZZZคกกAT*•ฬŸ?_ฌVซุl6 ”ˆˆH^^ž˜อf9w๎œ\นrEž{๎9%ฆ|qww—|้๏๏‡ร!/พ๘ขdggหีซWฅกกA‚‚‚คฎฎnุyo`` ิิิˆˆˆอf“๚๚๚a๋<๕ิSbณูไ๙๓b6›e๛๖ํ""๒w฿Ittด455‰รแ‹ล"ููู""RUU%‘‘‘NmeddHNNŽrูู)มมมRZZ*}}}ฒ{๗n •žž K–,‘๖๖vq8J=F#งN2^ขฑŒOH‰ˆFwwwผ๒ส+())AII ^~๙eธปป฿T.11:พพพhllฤส•+•{๛๗๏G||<ฦOOOดดดเ์ูณ๐๐๐๖ ฉnrํ่๊ีซแ็็‡จจ(ฤฤฤ !!กกก0 ˆG]] ธธ๋ึญCHHฑqใF์ฺตKi'22ห–-รธqใะŽ๊๊jlผ*• QQQHKKCYYู-็วำำ ่๊๊‚ม`€ูlถ์š5k`0Œตkืขคคภ๕ฅ 6l€ษd‚——y็”––ฒ๏A˜:uช๒ปINN†^ฏวแร‡•2๋ืฏ‡Fฃ———rอววํํํทัXม„”ˆhZบt)ŠŠŠPXX8์๋๚๏ฟvป‡ษษษXดh‘r๏ฦ๕ฃ้้้˜7oRRR`2™ฐy๓ๆ!ำjตC~]ฏื๋•c//ฏ›ฮ๋477#,,Lนg2™ะฌœ‡„„(วVซWฏ^ลฤ‰กำ้ ำ้๐อ7฿เย… #ฮ ”––b๗๎ ABBยMKn๊tlณู”ณฒฒ”พgอš…ห—/฿ฒ๏ใ๙็Ÿ•๚: รŽwPgg'ดZํm๗C4V0!%"…fฬ˜ึึVดตต!66vฤฒ*• ้้้๘ํท฿pๅสื?xZธp!`๘๑๘เƒะุุˆ~๘_~๙%ชซซojgฺดi๘๋ฏฟ๎:ๆเเ`XญVๅjต"88X9wssSŽF#ิj5ฺฺฺ`ทaทัูู‰mถฒŸgžy๛๖ํรล‹ใ๔d๘ฟฮ;็t<๘q˜ัhDAAาทnWv6ธ1ฮกbฌฟpแย›๊งฅฅ [็ย… ่๋๋Cddไ-วH4ึ0!%"ฅสสสn๋voo/ŠŠŠ ื๋แ๏๏SงNAฃั(ษWUU๊๋๋100F!—˜L& œ8qโฎโ}๕ีW๑ูgŸแ๙๓hmmENN^{ํต!หFฤลลแฝ๗ƒรแ@__~wœฎ]ป†ขข"tttภำำjตzศฑ สออลล‹aณู๐ล_ 55๐๚๋ฏใใ?Vp›อ†สสJืŸ_พ|ูi๋-ฝ^ฆฆ&ๅฅ—^Bmm-สหหัืื‡žžTVVŽ๘:เมƒxแ…เแแ1โ‰ฦ"&คDDฃ”ูlq}ไ‚  Vซ€ชช*”——รออํฆํžl6’““กัh‹ฌฌฌaื‘fff:ญ๛ผ™™™HIIมฬ™3a6›ƒ 6 [พฐฐ๓""" ื๋๑ึ[oกงง็–ภd2มืื?๔ถn:lูิิTฬž=ััั˜?>–/_เ๚N™™™Xดh4 โใใ•dxส”)HJJBhh(t:€๋ ์‘#G ำ้ฐjี*hตZ์ทนนนะ๋๕G^^ˆq๏ฺต oผ๑ฦ-วG4น‰ˆธ:""บฐ~z<๓w\ทปปฑฑฑ8z๔่จQvๆฬคงงใะกCC. ๋˜Ÿ๙ไ“OฐvํZxzzบ:"ขย„”ˆˆˆˆ\ŠkH‰ˆˆˆศฅ˜‘K1!%""""—bBJDDDD.ล„”ˆˆˆˆ\Š )นR""""r)&คDDDDไRLH‰ˆˆˆศฅ‰uำ..‘IENDฎB`‚c4core-bm-charconv-atox-mega_bytes_per_second-u8.png000066400000000000000000001057251477602032300326400ustar00rootroot00000000000000c4core-0.2.6/doc/img/linux-x86_64-gxx12.1-Release‰PNG  IHDRฆ/X9tEXtSoftwareMatplotlib version3.5.1, https://matplotlib.org/ุa๒ฝ pHYsaaจ?งi‹BIDATxœ์wtี๗๗๑wR€ RB‘ า0„. ก:”ฆ UชจาDQ:(i‚ ฝwiRค)ี ~ฅ$กคฯ๓Oๆว%…PsM>ฏต๎"wๆฬ™ฝgnูœ)ืฦ0 ‘Lf›ูˆˆˆˆˆ€ Sฑ*LEDDDฤ*จ0ซ ยTDDDDฌ‚ Sฑ *LEDDDฤ*จ0ซ ยTDDDDฌ‚ S‘งไ์ูณุุุ0v์ุฬ%M5kึฤ;ณรศ0z๖์™ูaศศึญ[ฑฑฑa๋ึญ™JถืกCœ3;Œ'ฎC‡xzzfv*L%[9v์ร† ใ์ูณ™ŠHฆุตkร† ใ๚๕๋jโฤ ๚๖ํKๅส•qrrยฦฦ&อ๗ 666t๊ิ)ี๙ƒ 2๛๏ฟ™ม™7o'N|ไ~ฌIVฬI๊ีซ6lXช๓bbb5j^^^ไส•‹"EŠะฒeKŽ=๚@๋ˆˆˆ`ุฐa„‡‡?zภ SษVŽ;ฦ๐แรU˜Jถตkื.†žแย๔ื_e๒ไษDGG๓โ‹/ทฝ““?3qqq)ๆ๘ใ899=hศiz˜"ฎz๕๊พ}›๊ีซ?ถ8'ฆYฯท฿~ห‰'jูีซW3|๘๐T็ฝ๑ฦ 2„š5k2y๒dบt้ยถm ไนs^GDDร‡Wa*"๒0 รเ๖ํ™ฦฮอ›7jนเเ`ฎ_ฟฮ‘#Gxใ7๎พ^ฝzDEEฑfอ‹้ปvํโฬ™34lุ๐กโxT111$%%akk‹““ถถ๚๚หฌแ๓ยGGววฺ็_ลโล‹้ำง_5:ubศ!ฬŸ?Ÿ่่h/^Xื๗4้)Yยนs็่ฝ;ฅK—&gฮœธปปำฒeK‹‘ั™3gาฒeK^yๅ๓โ็š}๕ื”-[GGG .L=,F–ฺทo““ฟปล๚ƒ‚‚ศ›7/Šwย„ /^œœ9sRฃF ~๛ํทmŽ?N‹-ศ—/NNNTจPๅห—[ด™9s&666์น“~๚‘?~r็ฮMำฆM๙฿—ขฯ5kึPฃF \\\puuฅbลŠฬ›7/EปcวŽ๑ส+ฏ˜‡‡Fm1?๙<ฝŸ~๚‰แร‡SคH\\\hัข‘‘‘ฤฦฦางO (€ณณ3;v$66ึข3fPซV- (€ฃฃ#^^^|๓อ7)b๑๔๔คQฃFฌ[ทŽ *3gNฆNšๆถ9r$ถถถ|๙ๅ—ๆด๓็ฯs๘๑4—น[LL ร† ฃTฉR899แแแAณfอ๘ใ?ฬ67oค+V GGGJ—.อุฑc1 รขฏไs`—.]Šทท7ŽŽŽ”-[–ตkืšm-Z„ ฟ๒KŠXฆNŠล๋ใA^ฟ๒ ปwง@-Z”aร†1`ภJ”(aพา;‚/_>\\\2ดํŠ)B๕๊ีSผฎๆฮ‹O†ฯaŽŽŽฆOŸ>xzzโ่่Hx๕ีW9pเp็|่UซVq๎93ไ๓๘’_Ÿ๓็ฯg๐เม)R„\นr•๊9ฆษ็V฿๏uw>k‚ƒƒษ;7  o฿พฌ[ท.EŸงNขy๓ๆ*T'''Š-JHH‘‘‘iๆœ^N๓oฟ6 ฤษษ ???~๘แ‡ mฯไ๗ัŽ;x๙ๅ—qrrโน็žcึฌYํ† †MŠๅ“_SwฟV’๛บuซ๙๔๑๑1ทรโล‹๑๑๑มษษ‰๒ๅหs๐เมTc๛๓ฯ? "w๎.\˜#Fคx/%%%1qโDส–-‹““ คK—.\ปv-ี๚่#‹ๅ3๚Y‘ฺ๖€ิฯaพ๗ำปฏ7˜6m%K–ฤัั‘Š+ฒo฿>‹ๅฆL™฿i2ษ๛&::€‚ Zฌ฿รร€œ9s7‡ไx+Vฌ@วŽอuฬœ93Cห? 92mอ"ัพ}๛ุตk!!!-Z”ณgฯ๒อ7฿PณfMŽ;Fฎ\นจ^ฝ:ฝz๕b๒ไษ|๔ัGๆaษไ‡ ฦ๐แรฉSงบuใฤ‰|๓อ7์ท;wbooฯคI“ุผy3ํท็ื_ลฮฮŽฉSงฒ~zfฯžMแย…๏๋ฌYณˆŽŽฆGฤฤฤ0iา$jีชล‘#Gฬ™ฃGRฅJŠ)ย‡~H๎น๙้งŸhาค ?3M›6ต่๓w฿%oผ :”ณgฯ2qโDz๖์ษ‚ ฬ63gฮไญทขlูฒ 8๘เ|||จ_ฟพลzGEฮœ9๙๐ร9}๚4_~๙%๖๖๖ฺฺุrํฺ5† ฦ๎ป™9s&%J”`ศ!ๆฒ฿|๓ eห–%88˜9rฐbล บw๏NRR=z๔ฐXฯ‰'hบ5]บtกs็ฮ”.]:ีm;x๐`>๛์3ฆNJ็ฮอ้ํฺตใ—_~I๑ewฏฤฤD5jฤฆM› กw๏DGGณaร~๛ํ7J–,‰aณeห~๛mYทn เฏฟbย„ }๎ุฑƒล‹ำฝ{w\\\˜'Ožไวdย„ <๓ฬ3ไฯŸ?ํ๒ ฺดiC๏ฝนqใฮฮฮ$$$ฐpแB๚๕๋GLLL†๚ฺ่ต+‹-ขgฯžxyyqๅสv์ุม๏ฟฮK/ฝฤ AƒˆŒŒไโล‹ๆ6ฟ๗BšO>๙{๏=bccqppHs}y฿ผy“Zตjq้า%z๗๎MกB…˜7o[ถlฑ่+..Ž   bccy๗w)Tจ๕+Wฎไ๚๕๋ธนนฅCz9พ}›š5kr๚๔iz๖์I‰%Xธp!:tเ๚๕๋๔๎๛พ๔๔้ำดhั‚ท฿~›๖ํ๓๗฿ำกCส—/Oูฒe๏ป|Z}ถiำ†.]บ๐ๆ›o2v์X^{ํ5BCC๙่ฃ่ฝ;p็ณขUซVœ8qยbด:11‘z๕๊QฉR%Fอฺตk:t( Œ1ยlืฅKfฮœIวŽ้ีซgฮœแซฏพโเมƒๆ็sฒิ>/Ž=JฃF๐๕๕eฤˆ8::r๚๔iv๎i‘OF?+‡y๓ๆM—.]ฐฑฑa๔่ั4kึŒ?{{{บt้BDD6l`๖์ูห–,Y’ขE‹2n8J—.Mนrๅˆˆˆเ๗฿งD‰„„„d(†_|‘#F0dศy็ชUซ@ๅส•{พfˆdทnJ1ํื_5cึฌYๆด… €ฑeห‹ถ๓แเเ`ิญ[ืHLL4ง๕ีW`|๗ๆดu๋ึ€1rไHใฯ?4œ&Mš7ฦ3gฮ€‘3gNใโล‹ๆ๔={๖€ัทo_sZํฺต #&&ฦœ–””dTฎ\ูxแ…ฬi3fฬ0ฃN:FRR’9ฝo฿พ†q๚uร0 ใ๚๕๋†‹‹‹`พ}"ฎป—ซQฃFŠmk*Tศhผน9mห–-`x{{qqqๆ๔ึญ[666F๚๕-ึh/^bZj๛,((ศx๎น็,ฆ/^Œตkืฆh=z๔0 ร0๚๗๏oฺฺุ3gฮLั.9ฏ๛๙๛๏ ภ?~|Šyษi้าฅๆฟ[‹- ใ๔้ำ๑988XL;t่_~๙ฅ9ญu๋ึFŒ„„sฺฅK— [[[cฤˆๆด}]TญZีขOร0Œ1cฦ€qๆฬ™๛n{oูไq๕๊Uรมมม˜={ถa†ฑjี*รฦฦฦ8{๖ฌ1t่P0๗ฟฅป.777s฿ฆฅaร†)^W†๑ฏฯ็ž{.ล๋,yŸ}7ฮŒฅK—šำn฿พm”)Sฦขฯƒ€ฑpแยtใœ&Nœhฦœ9sฬiqqqF`` แ์์lDEEฅo๒๛hถmๆด๙วptt4๚๗๏oNK?๗J~Mฝ๏“๛ตk—9-๙๓1gฮœฦนs็ฬ้SงNMฑทooฦป๏พkNKJJ26lh888˜ฏ‘ํท€1w๎\‹˜ึฎ]›bzZŸ&Lศะ๋.ฃŸฉmรH๕ีพ}{‹}š]เ๎๎n\ฝzีœพlู20VฌXaN๋ัฃGš๑์ูณว(Yฒค˜๒ๅห—.]บowทoŸ3fฬx ๅžส—,แ๎ร๑๑๑\นr…็Ÿž๙ๅ— `๕๊ี\ฝz•อ›7ำชU+ขฃฃ๙๗฿๙๗฿นrๅ AAAœ:uŠฟ๚หขฯwyวโ๐[ตjีHLL4O€฿ฐaััั|๘แ‡).>น๗ฐณณ3oพ๙ฆ๙มม—_~™?3E.ํฺตณฉภ0 z๋-‹v\ธp„„sฺ๛,22’—5j๐็Ÿฆ8YขD ‚‚‚Rฌ๎œCึณgO&Mšฤœ9sh฿พ}Š6[ทnอะศฯ?ฬ3ฯ<รป๏พ›b^๒vZฝz5vvv๔๊ีหb~1 #ลน•u๊ิกdษ’ๆs___\]]-ถ็๋ฏฟฮ?cq๘oัขE$%%๑๚๋ฏ๗บ่น3vvv๗อ๛qห›7/๕๊ีใว๎Œ Uฎ\™โล‹gธ›bzj๋บ๛–oษงฟฤลลฑqใF.\ˆ››ฏพ๚ช๙บ๗฿)_พ<ฮฮฮ)FฌS๛ผศ“'ห–-#)))อ|2๚Y๑8ผ๚๋ไอ›ื|žผo2บ?๒ๆอ‹ฟฟ?~๘!K—.e์ุฑœ={––-[f๘ศ„5Ra*Yยํท2dˆyฮ฿3ฯยรร™*๙ศŒœ฿WดhัลjผySœห•ฺz“ฟ‹+–bzRR’ลพุนs'u๊ิ!w๎ไษ“‡๙๓›็{ฅV˜ฆeึฌYL™2…/ฟาโK๛a๑ว”.]š9า>ห้นs.\8ลy—ษง„๛ZนwAสํYฏ^=,NฝXฐ`”*U xธืEzํIkำฆ 6lเ๙๓,]บิโt‘Œ=z4ฟ๖ลŠใๅ—_fุฐa\@=HyŸ;wŽ’%Kฆh๗๓ฯงXoฟ~˜>}:ฯ<๓ AAAL™2%CŸEi9w๎/ผ๐BŠ‹ถาzฅ&#ฏล๕ Ÿ@Šuฺฺู๒sฯYLK~อ'&ž:uŠศศH (โตใฦ ฝ๎_uชTฉBงN(Xฐ !!!๔ำO้ฉOฺ>ทำIตjี dิจQ4n˜๛๓๓ฯ?ณcวfฬ˜๑Db~tŽฉd ๏พ๛.3fฬ OŸ>โๆๆ† !!!Oไƒ็เมƒๆ‡แ‘#Gน บ[rผ๏ฝ๗^šฃ„๗~ฆ5*๖0๓พาj{ฟ>๘ใjืฎM™2e?~<ลŠรมมีซW3aย„๛,ฝQฏ*UชฮW_}EซVญศ—/_šm3CFถงฃฃ#Mš4aษ’%|๕ื\พ|™;w๒ูgŸ™mๆu‘ััย'!88GGGฺทoOll,ญZตz ๅ[ตjEตjีXฒd ๋ืฏgฬ˜1|๑ล,^ผ8ลนฮiy็{`ธqt่ะeห–ฑ~zz๕๊ลจQฃุฝ{7E‹}จ>UFrLํย'ธs.่ƒ๔๙8ทgRR `๎นฉฮฟ๗้ิ๖{ฮœ9ูถm[ถlaีชUฌ]ป– PซV-ึฏ_ภGt;ฅๆQถัฯ?ฬๅห—-F๏jิจซซ+;w๎ค[ทnŽลšจ0•,aัขEดo฿žqใฦ™ำbbbRซ1ญ“ไCŒ'Nœฐ๘฿{\\gฮœกN:ๆด›7oาฑcGผผผจ\น2ฃGฆiำฆๆ•๗s๊ิฉำNžŠไCษฟ๖[Šโ%3ฌXฑ‚ุุX–/_n1jp๏!นŒx๙็=z45kึค^ฝzlฺด้ฎ"ฟ[ษ’%ูณg๑๑๑ง(ญx๑โlธ‘่่h‹๕$_ษ๛ ‡ซ๏๖๚๋ฏ๓ร?ฐiำ&~w ร0ใรใ{]ค๕xrๆฬI“&M˜3g๕๋ื7/ดzt๏๎ป๓ฯ?๐าK/๑้งŸš…้ำส%Y๑โล9v์†aXฌ๛๔้ำฉถ๗๑๑มวว‡มƒณkื.ชTฉBhh(#GŽLs้}F>|ุผๅUฒG}+yิ๎๚๕๋ๆแoศุˆ์รHJJโฯ?4GIแฮ็!`~&–,Y’7RฅJ•G๚ฯ–ญญ-ตkืฆvํฺŒ?žฯ>๛ŒAƒฑeห–~Oฝ๎๖ธทSZฏ‡ห—/) aร0HLLด8m๊aื‘Yt(_ฒ;;ปห๒ห/Sผis็ฮ ค0ฉSงLž<ูขŸ๏พ๛ŽศศH‹{/~๐มœ?ž~๘๑ใวใ้้iŽ eฤาฅK-ฮปw/{๖์1ฟl (@อš5™:u*—.]Jฑ|jทบŸบu๋โโโยจQฃRœ{๔ดฮงบ[๒Hม๋ŽŒŒ|่รOพพพฌ^ฝš฿ื^{-ล} 3z ˜ๆอ›๓๏ฟ๒ีW_ฅ˜—kƒ HLLLัfย„ ุุุdx4๏^u๊ิ!_พ|,Xฐ€ ๐๒ห/[’|\ฏ‹ดOย{๏ฝวะกC๙๘ใhนฤฤฤ‡ฝ (@แย…-gนs็~ครใ*((ˆฟ๚หโ๖\111|๛ํทํขขขR>>>ฺฺุ๗s"ญœ4hภ฿mqบGBB_~๙%ฮฮฮ)๎่๐ฐ’ปm6sฺอ›73|[ช‡q๗{ษ0 พ๚๊+์ํํฉ]ป6pg๔<11‘O>๙$ลฒ z-_ฝz5ล4‹}’ัฯŠิถSbb"ำฆMป๏ฒ"ญ๗kr!?|‹้ห—/็ๆอ›”+W๎‘ื‘Y4b*YBฃF˜={6nnnxyy๑๋ฏฟฒqใF-ฺ๙๛๛cggว_|Add$ŽŽŽๆฝ4ศ๐แรฉWฏมมมœ8q‚ฏฟšŠ+šElผ™ฏฟšกC‡๒าK/w๎วYณfM>๘ใT๏{xฏ็ŸžชUซาญ[7bcc™8q"๎๎๎ผ๛f›)SฆPตjU|||่น3ฯ=๗—/_ๆื_ๅโล‹:t่ถซซ+&L SงNTฌX‘6mฺ7o^:ฤญ[ทž่—Nj๊ึญ‹ƒƒฏฝ๖]บtแฦ|๛ํท(P ีข+#*Uชฤฒeหhะ -Zด`้าฅๆจgFoำฎ];fอšEฟ~ุปw/ีชUใๆอ›lธ‘๎ปำธqc^{ํ5^yๅ ฤูณg๑๓๓c๚๕,[ถŒ>}๚X\่๔ ์ํํiึฌ๓็ฯ็ๆอ›Œ;6E›ว๑บ(_พหoฟอ€ฐณณใ๛๏ฟ'œ?ฑฌใnNNNฌ]ป–๖ํภš5kXตj}๔‘yˆพFt้า…QฃFNบuฑทท็ิฉS,\ธI“&ัขE‹tื3bฤถmFร† )^ผ8๓_5E‹ฅjีชfปŒ~V”-[–J•*1pเ@ฎ^ฝJพ|๙˜?TfD๒๛ตWฏ^aggGHHฏฝ๖eห–eฤˆœ;wŽJ•*q๚๔iพ๚๊+<<๙ฤ(Rคˆakk{฿[G%ฟnS{{[ฃด๒ฝ[Fnk 0ภ๐๓๓3\\\Œนs~~~ฦื_mั๎ฦF›6mŒใ•W^16n˜๎ถI/'ร0Œห—/›Ÿs†O†o๑“ึ๛จFF5,ฆํ฿ฟ฿0ŒgŸ}ึ?~|šท‹Jญฯิ^w%k฿พฝ‘;wnใ?0๊ึญkไส•ห(Xฐ 1t่P‹๖%›6mšQพ|y#gฮœ†‹‹‹แใใcผ๛FDDฤ}cฺดi“ัธqcฃpแย†ƒƒƒQธpaฃu๋ึฦษ“'SlŒ~V๑วF:u GGGฃ`ม‚ฦG}dพ‡3rปจปทE2ภ:tจ๙นs็’˜˜ˆ——๓็ฯทธต—ˆ5ุตkฏผ๒Jบmfฬ˜A‡žN@คC๙""""Yฬตkืุฟบmส–-‹‡‡วSŠ(cT˜ŠˆˆˆˆUะ ๖EDDDฤ*จ0ษ".\ธ€“““y#ฌ`๋ึญุุุฐu๋ึG๎ซfอšx{{?zPV RฅJ?ส!’Uจ0นหฬ™3ฑฑฑมฦฦ†;vค˜oลŠรฦฦ†FYฬK^.๙‘;wnผผผ9r$ทnJu}GŽมฦฦ†ฝ{๗>r์#FŒ €*Uชฎฎฎ8;;Sปvmv๏mั&๙ˆ_~๙…๎ปS @Š-jฮ_ณf ีชU#w๎ธธธะฐaCŽ=z฿ผR;ว๔ิฉS4oœB… แไไDัขE !22๒พ์฿ฟŸส•+“3gNJ”(AhhhŠ6ฑฑฑ :”็ŸGGGŠ+ฦ๛๏ฟOllฌูฦฦฦ†›7o๒ร?˜งot่ะaร†1`ภJ”(aฮ;{๖ฌน์œ9s(_พ<9sๆ$_พ|„„„pแย‹’๗๛ฉ^ฝ:นrๅโฃ>2็ฟ๚๊ซœ;wŽ๐๐๐ ๅ-๒_ ยTD$žžž๒ใ?šำึฌYCdd$!!!i.รฟหฟหนs็˜7o?๐mฺดIQ˜ฎ[ท๊ึญ ภ† hบ5y๓ๆๅ‹/พเ๓ฯ?งfอš๗ฝ˜)>>ž}๛๖๑าK/ฅ:ฺตk4jิˆ€€Fฃฃ#!!!,Xฐ€4hภ็Ÿฮอ›7iัขัััๆฒGฅZตj:tˆ๗฿Ÿ?˜3gฮPณfM๖์ู“b]ปw็ุฑc 2„?€ูณgำฐaCœ๙โ‹/๘๘ใ9v์UซVต(ึ2"..Ž   v๏อป๏พห”)Sx็w๘๓ฯ?3tฺุตk4hะ€๒ๅห3z๔hŠ-Jทn๘๛๏อ6III3v์X^{ํ5พ๒Kš4iย„ ,nค?{๖lฉVญšy๚F—.]hึฌญ[ท`ย„ ๆผ๙๓๐้งŸาฎ];^xแฦOŸ>}ุดiีซWO‘ร•+Wจ_ฟ>Lœ8ัโ†้ๅห—ศRป‰`ˆˆˆiฦŒ`์ทฯ๘๊ซฏ ใึญ[†aFห–-W^yล0 ร(^ผธัฐaC‹eTMš41bbbRฌซmถF5ฬ็ฝ{๗6\]]„„„Š๙๔้ำ`|๙ๅ—)ๆีจQรŒy๓ๆ™ำŽ?n†ญญญฑ{๗ns๚บu๋ ภ˜1c†9ญI“&†ƒƒƒ๑ว˜ำ""" ฃz๕๊ๆดไํVตjU‹๘ฃฃฃ฿ฐaืฏ_งu๋ึๆH๒ฟ‹lูฒๅruss๎Œ6งuงƒ๔ไศ‘ƒ.]บ˜ฯ่าฅ ๓๙+9 .ไล_คL™21ืชU เcพโล‹IJJขUซV}*Tˆ^x!E฿ŽŽŽt์ุ1อ๒ๆอ›ๆ๙ฮ"Eบ๘ID$ ๙๓็งN:ฬ›7[ทn‘˜˜H‹-า]ฆhัขิฉSว|Œปป;๏ฝ๗+Wฎ4/Nฺทo๛฿, ำ๎ป๓ำO?Qฟ~}Š)Bบuiีช๕๊ีหPผF?ไWดhัวธนนQฌXฑำเฮแnธsฅญ[ท(]บtŠ>_|๑E’’’ธpแeห–5ง—(QยขฉSงฬข๎^ฎฎฎ้ฅ”B‰%่ืฏใวg๎นTซVเเ`|๓M3๔.\8ลYฅJ•เ์ูณTชT‰SงN๑๛๏ฟ›‡๏๕ฯ?ีŸ}๖Yrๆฬษ™3g*พดไฯŸŸ\นrqโฤ‰๓Ž?Žญญํ}‹ด’%KwŠ๎ปG’•>>> <˜]ปvQฅJBCC9rdบหEDDคธีษ“';ผ%ว|่ะ!jืฎ}฿ัศดๆง5ฝdษ’†A‰%ฬ‘ฺ‡๕ื_ว‹/พ๘HˆXc*"’gggพ๙ๆ† ๖ะ๗]ฑb~~~\พ|™Xฦ‡;W4™ญญ-พพพท)บ—ฝฝ=*T ,,์กโK‹u๋ึeูฒeWฯ_พ|™y๓ๆQตjี๛Š ยีี•ฯ>๛Œ๘๘๘๓๗ฟ=PLQQQfกŸฬวว[[tทQฒ„„ฆNj>‹‹c๊ิฉไฯŸ฿ผสฝUซV๕ื_|๛ํท)–ฟ}๛67o4Ÿ็ฮ;ีป$พ๗ฮkึฌvvv ><ลศดa)^้I>'ถrๅส^FฤฺiฤTDไ>า๚ีฆิœ๙ไฃH‘"†ญญmŠ[G๓ฯFีชUนsนs็6ส”)c๔่ัร8qโDŠxS“˜˜hxxxƒพo"%6†๑gน‹ˆศIHHภQฃFัฝ{๗วฺ๗oฟอษ“'ูพ}๛cํWฌฯาฅKiำฆ ๑™ŽศcฃยTDไ)๚็Ÿ๘๚๋ฏ้าฅหc/(ฮŸ?OฉRฅุดiUชTyฌ}‹u คZตj:BไฟD…ฉˆˆˆˆX]•/""""VA…ฉˆˆˆˆXฆ""""bT˜ŠˆˆˆˆUะ ๖ลj$%%‹‹ห}PDDDฌƒaDGGSธpalmmฬS…ฉXˆˆˆ๛๎ถˆˆˆXง .PดhัG๊C…ฉX ฮœ9Cพ|๙29šง'>>ž๕๋ืSทn]๓'ณ:ๅœ=r†์™wvฬฒgู1gH™wTTลŠ3ฟว… Sฑษ‡๏]\\๋o}[ป๘๘xrๅส…ซซkถ๙`Sฮู#gศžygวœ!{ๆs†ด๓~งแ้โ'ฑ *LEDDDฤ*จ0ซ ยTDDDDฌ‚ Sฑ *LEDDDฤ*จ0ซ ยTDDDDฌ‚ Sฑ *LEDDDฤ*จ0ซ ยTDDDDฌ‚ Sฑ *LEDDDฤ*ไศ์D๎4q'Iฮ™ฦSใ`k0ะชF\’Mf‡๓T(็์‘3dฯผณcฮ=๓ถ–œ|\+ำึธiฤTDDDDฌ‚ Sฑ *LEDDDฤ*จ0ซ ยTDDDDฌ‚ Sฑ *LEDDDฤ*จ0ซ ยTDDDDฌ‚ Sฑ *L๏ฃE‹TชT้ฉฎ๓๘๑ใิฌY๓ฑท}\ €ทท7^^^Lš4้ฉฎ[DDDฒ.ฆุ้ฐavvvผ\bbโˆๆ้ธvํZบ๓รรรูฝ{7‡&,,Œฑcว•กeEDDDาฃย๔๛๖o๑๑๑มฯฯกC‡ฯgŸ}ฦเมƒ3ดึญ[ฉSง๕๊ีฃN:ธqƒถmRฑbE*Vฌศ๎ปXบt)๘๛๛ำธqcnธภษ“'ฉPก~~~L›6-uฅี6ญuFDDะฐaC(_พ<.\ฐ่/!!ล‹Sทn]z๖์ ภฬ™3๙๐รอ6žžžฤฤฤC||<ทo฿ฦลลGGG*Tจ@วŽูณgO†ถYll,QQQษพT˜‡fส”)์น“C‡ัปwoฦO๛๖ํqqqฑhJhh(aaat๊ิษœท~fฮœษ–-[9r$อ›7g฿พ},Yฒ„=zPฃF ๖์ูCxx8UชTแป๏พ OŸ> 2„C‡aFบ๑ฆี6ญu๖๊ี‹–-[r่ะ!v์ุม3ฯ<ภ… 2d^^^ฌ\น’#F0w๎tืํ๏๏O5(\ธ0žžž|๔ัGfazโฤ ‚ƒƒ6l*T`๊ิฉfแšQฃFแๆๆf>Š+–๎บEDD$kห‘ูXƒญ[ท‚ซซ+ทo฿f๚๕lธ‘s็ฮYดํฺตซ๙w… ˜>}บ๙ผZตj*Tธsภš5k6lWฎ\!!!๓็ฯำฒeK._พฬญ[ทจSงp็ypp0ญ[ทๆเมƒiฦ›Vดึ๙๋ฏฟฒpแBrๆฬ ภฝ{ฉ\น2}๚๔!,,ฬฬ~NŸ>อ๙๓็‰ˆˆเ๚๕๋ิจQƒ๚๕๋ใ๎๎NŽ9hฺด)M›6ๅนst๎™๗{่่่T๛8p ๚๕3ŸGEEฉ8ษฦ4bšŠ๐๐pŽ;F‰%จZต*4 ม๔ไส•ห0 ึฌYCxx8แแแ\ธp9rะซW/ฬ‘#G๘โ‹/ˆภฦฦฦ\๖๎ฟS“Vดึ™___ฆM›ฦŽ;hผ9?๔qqqๆ|;;;’’’ฬ็ษq.Yฒ„ภภ@)Xฐ ~~~=zิlwๅส&NœHpp0นs็6 โิ8::โ๊๊j๑‘์K…)PซV-ๆฯŸožใศฅK—8{๖,;v์ \นr,_พ๚ฌSงSฆL1Ÿ:tธ3*่แแARRณgฯ6็๛๙๙ฑrๅJ,Xn฿iตMkUชTแ‡~๎œz๛๖mœœœx๋ญทุฝ{7cฦŒa๓ๆอ”)S†qใฦPผxqs๙ฝ{๗r๙๒eŠ-สถmHJJ"::šPฒdIฺดiC`` QQQฌYณ†%K–Pฏ^ฝฺn"""’}ฉ0ผฝฝู้ณ'•+Wฦฯฯษ“'งู6ฝsL๏6dศ"""๐๕๕ลหหห<ไ๑วSฟ~}(Qข„ู~โฤ‰ 6 ??ฟ๛žcšVดึ9iา$~๚้'|}}ฉZต*Wฎ\ฑ่ฯ฿฿ŸะะP>Œฟฟ?UซVลูู///พ๛๎;๓{ห–-qssรวว‡J•*ัทo_Š))L?ฮ!C(\ธpบ9ˆˆˆˆหฦธ_$๒”DEEแๆๆF๙มหHrpฮ์pž[ƒ7๕›3qI้Ÿฦ‘U(็์‘3dฯผณcฮ=๓ถ–œ|\๋ฉฎ/>>žีซWำ A์ํํอ๏๏ศศศG>-O#ฆ""""bT˜Zฑ3fเ๏๏o๑H๏4‘2.สŠu์ุ‘Ž;fv""""O…FLEDDDฤ*จ0ซ ยTDDDDฌ‚ Sฑ *LEDDDฤ*่ช|ฑ:๋๚Tม=ณรxj’oTผุ๊gv8O…rฮ9C๖ฬ;;ๆ ู3๏์˜๓“ฆSฑ *LEDDDฤ*่PพXAkO‘#ื?™ฦScG"ตlแฝ•'Hฤ.ณรy*”s๖ศฒgู1gศžy'็,6งˆˆˆˆXฆ""""bT˜ŠˆˆˆˆUPa*""""VA…ฉˆˆˆˆXฆ""""bT˜ŠˆˆˆˆUPa*""""VA…ฉˆˆˆˆXฆ™คE‹TชT้ก—?{๖,‹-zŒeLBBmถลืืooo,X๐ิc‘ฌI…i&ุฐavv๖smOช0ฝvํZบ๓Wฎ\IRR‡f๓ๆอ๔ํ€ธธ8nบ๕ุใ‘์C…้๖ํท฿โใใƒŸŸC‡%>>žฯ>๛Œมƒgh๙จจ(jีชลK/ฝDนrๅุฑcƒ bบu๘๛๛3w๎\๗ฟQฟ~}||| โ๒ๅหt่ะตkืwŠูิFicbb๘แ‡จ\น2cฦŒ`ุฐa„††šm *d}๓ๆM’’’ธqใ ๎ด๔๊ี‹cวŽ=ฤ–‘์N…้t๘๐aฆL™ยฮ;9t่ฝ{๗f๘๑ดo฿‹ถกกกf!FงNศ™3'ห–-ใภฌXฑ‚๛๐้งŸDxx8oผ๑C‡ๅีW_ๅศ‘#4n˜Aƒ7พ'Nะทo_ผฝฝ9pเ฿~๛-Ÿ}๖Yบห4jิ''' .Œฟฟ?ใว `ม‚=z” *ะฅKjิจมผy๓ˆMณฏุุXขขข,"""’}ฉ0}‚ถnJHHฎฎฎพ}›๕๋ืำพ}๛mปvํJืฎ]จPกำงOภ0 }|||hิจGMu]ปvํโอ7฿เอ7฿d็ฮ้ฦ๖๓ฯ?ใํํ‡‡ฟ๖“&Mขlูฒ๗อiฯž=ธนนAXXปw'!!ธSDทkืŽํท3eสฦŽK… า์kิจQธนน™bลŠw"""’uฉ0}Šยรร9v์%J” jีช1ซ ยTDDDDฌ‚ Sฑ :วTฌฮ‚C‘ำๅff‡๑๔$%’˜sเ"ฺุev4O‡rฮ์hžž์˜wvฬฒ]+>›ู!dI1ซ ยTDDDDฌ‚ Sฑ *LEDDDฤ*จ0ซ ยTDDDDฌ‚ Sฑ *LEDDDฤ*จ0ซ ย4ตhั‚J•*=๔๒gฯžeัขE1ขŒ™?>>>>x{{ำพ}{žz """’๕จ0อ$6lภฮ๎ั~ฒํIฆืฎ]ปo›ฐm6~๛ํ7ขฃฃYณfM†—I‹ ำงเoฟลวว???†J||<Ÿ}๖ƒฮะ๒QQQิชU‹—^z‰rๅสฑcว ฤบu๋๐๗๗g๎น๏ฃ~๚๘๘๘ฤๅห—นvํ/พ๘"๕‰‰‰TชT‰={๖คXว๎ป้ะก*T๎ฝwๆv่ะตkื˜˜ศอ›7IHHเ๖ํ*T€ž={ฤ’%K24ŠKTT”ลCDDDฒ/ฆOุแร‡™2e ;w๎ไะกC๔๎›๑ใวำพ}{\\\,ฺ††† @XX:u gฮœ,[ถŒฐbล ๚๗๏ภงŸ~JPPแแแผ๑ฦ :”W_}•#GŽะธqc Dผy๙์ณฯฺ่ต+ใฦฃjีชMhh(ๅห—g๘๐แ4n˜'N7ง/ฟ’ฒeหโแแAฑbลจXฑ"s็ฮe๘๐แฌXฑ///†สล‹ำ์gิจQธนน™bลŠ=๘‘,C…้ถu๋VBBBpuuเ๖ํฌ_ฟž๖ํงhตkWบvํ @… ˜>}:†a๐๛๏ใใใCฃF8z๔hชฺ๋ตkoพ๙&oพ๙&;w๎ iำฆ899๑w฿๑ษ'Ÿ˜ํ .ฬโล‹Yผx1kึฌกiำฆไศ‘#|โใใ๙๎ป๏๘๗฿๙๋ฏฟ๘๋ฏฟXทn9ฟRฅJ|๗„……qใฦ <==ูปwoช} 8ศศH๓qแย…tื-"""Y› ำง,<<œcวŽQขD ชVญสมƒ Nw™นs็Gxx8แแแผฮ๘๘xฮœ9ƒaผyำœพpแBr็ฮMpp0'Nไส•+ๆ<;;;’’’ฬ็ฑฑฑf๖๖๖.\5jdqj@\\ , Yณf์น“iำฆแ๋๋›j\ŽŽŽธบบZ>žีซWำ A์ํํ3;คงๆผ“ฟฟ###๙ด<˜ŠˆˆˆˆUPa*""""VA…ฉˆˆˆˆXฆ""""bT˜ŠˆˆˆˆUPa*""""VA…ฉˆˆˆˆXฆ""""brdv"๗zฏ๎๎๎™ฦSs็Fล‡y๓ฅขูๆอส9{ไ ู3๏์˜3d฿ผๅ๑าˆฉˆˆˆˆXฆ""""bt(_ฌฮณQธ\ห๚ฟณœ,)1€ฝFbk—=’ส9{ไ ู3๏์˜3dฯผ5็ภ็๓<ๆˆ๛4b*""""VA…ฉˆˆˆˆXฆ""""bT˜ŠˆˆˆˆUPa*""""VA…ฉˆˆˆˆXฆ""""bT˜ŠˆˆˆˆUPa*""""VA…ฉˆˆˆˆX…l[˜ถhั‚J•*eจmซVญ๐๓๓c๎นO8ชิีฌY“ใวgสบ๏Eร† ๑๗๗ว฿฿Ÿ-[ถdvH"""’Edณฝว† ฐณหุoฑ_บt‰“'Or่ะก๓3Ofyะฏ]ปFผyำœ๗฿ใ๏๏ฯชUซ8t่oฝ๕๛๗๏็ๆอ›888`oo8ย‘l(ห˜~๛ํท๘๘๘เ็็วะกC‰็ณฯ>c๐เมZตื^ใิฉS๘๛๛sไศ<==8p ๚๋ฏŒ9ooo|}}Yฑb[ทnฅnบ4hะOOOBCC๙๔ำO๑๕๕ฅ~๚$$$คนพๅห—ใ๏๏ŸŸ:u2งฯ˜1ƒ๒ๅหSฎ\9.\ธภาฅK ภ฿฿Ÿฦsใฦ :t่@๗๎ฉXฑ"'Ndโฤ‰”)S???๚๔้“b‘‘‘|๕ีW๘๙๙ฑ`มณตkืp๖์Y‹ัๅ่่hเฮ่ฉ‡‡'OžคL™2 4ˆs็ฮehฦฦฦe๑‘์+K˜>|˜)Sฆฐs็N\]]นz๕*ใวง}๛๖ธธธXด  kืฎ„……ส๔้ำYดh!!!์ฝl๋้้Ixx8{๗๎e๙๒ๅ์฿ฟŸซWฏศ+ฏผbฎ๛๗฿'!!็Ÿžoพ๙†ร‡ำฌY36mฺDPPPŠx/_พLฟ~ุพ};\ฝzีœ็์์ฬ๛7nœY่ึจQƒ&Mš0z๔hพ๛๎;z๗๎ ภ๕๋ืูปw/666ไฯŸŸ๓็ฯ“3gN"##อ>“๓ถmญZตbูฒexzzฆปM;u๊DฃF(Rค111l฿พ€rๅสqเภๆฬ™CำฆM๑๐๐ kืฎ4hะ อQฃF1|๘๐tื'"""ูG–1บu+!!!ธบบp๛๖mึฏ_O๛๖ํSดํฺต+]ปv B… LŸ>=อ~[ถl ภฎ]ปhัขŽŽŽxxx๐าK/q๔่Q*WฎLผyษŸ??nnn4jิoooฮŸ?Ÿjฟ{๖์กN:ๆ(dพ|๙ฬyมมมภ๐์ูณœ?ž:u๊เใใริฉS9v์˜ูพE‹ุุุPพ|y|๓MๆฯŸฃฃ#ใฦฃFTญZ•cวŽ1rไศ๛ฅkึฌกF๕ื_,]บ”ฮ;›๓่ัฃ`เภ๔๎,œS3pเ@"##อG๒HฐˆˆˆdOYบ0ฝWxx8วŽฃD‰TญZ•ƒš฿ƒศ•+ื}888˜ฺฺšฯmmmILL|เu&”w/฿ซW/ฬ‘#G๘โ‹/ˆM5ฦUซVัญ[7~๙ๅ๊ีซภ›oพษภ๙โ‹/x๋ญทฬ‘ฯdvvv$%%X๔;sๆLณุฌVญgฮœม0 sฉSง๘เƒx๋ญทจ_ฟ>ฃFJ7'WWW‹‡ˆˆˆd_Yบ0ญUซ๓็ฯ7ฯ] ไาฅKœ={–;vPฎ\9–/_ะWฎ\™%K–ฯ฿อมƒ)[ถ์C๗WฉR%6nศฅK—,ๅง&๙ฯคค$fฯžj›คค$.^ผH:u7n'Ož `ม‚ <˜ฃGย˜1c๐๖๖f๚๕/^œ๐๐p‹mTดhQถn 9]!oผุุุp๖์Y^yๅxใ ^xแ<ศ”)S๐๖๖~่ํ!"""ูK–>วิ›ž={Rนre์์์hฺด)ร† KตmZ็˜ฆ็ๅ—_ฆaร†”+W[[[&OžŒณณ๓Cว[ @&L˜`Žj0mฺด4๑วิฏ_wwwชTฉย๕๋ืSดILLคM›6DGGc#FŒฐ˜okkKƒ hะ /^ไ๒ๅหผ๖4n˜… Rทn]ณเมƒiืฎ3fฬ GŽL:€9r0n8^z้ฅ‡ฮ_DDDฒ7ใ๎ใฐ"™(** 777ึ…‰‹[ฺทฌสj’๘๗๘Nž)S[ป,E“rฮ9C๖ฬ;;ๆ ู3๏Gอ9๐๙<?จง >>žีซWำ A์ํํอ๏๏ศศศG>-/Kส‘Ž์๑_+ิดiSฮœ9c1m้าฅบ2^DDD$+RašI–,Y’ู!ˆˆˆˆXสซ ยTDDDDฌ‚ Sฑ *LEDDDฤ*จ0ซ ซ๒ล๊”๗tล=Of‡๑ิฤววณ๚8ผœ๖๖๖™ฮSกœณGฮ=๓ฮŽ9C๖ฬ;;ๆคiฤTDDDDฌ‚ Sฑ :”/V็Ÿฎฅ‰ณ‰ห์0žšฤN๐๚ท\n_ป„˜ฬ็ฉPฮู#gศZy{•ู!ˆdy1ซ ยTDDDDฌ‚ Sฑ *LEDDDฤ*จ0ซ ยTDDDDฌ‚ Sฑ *LEDDDฤ*จ0ซ ยTDDDDฌยc)L[ดhAฅJ•2ิถUซV๘๙๙1w๎วฑ๊VณfMŽ?ž)๋6lกกกิวึญ[ yจeCBBุบu๋#ญ๓ๆอ”+W???6lHtt๔#๕'"""’์‘ ำ 6`gg—กถ—.]โไษ“:tˆ7xรb^bbโฃ†๒ฤb|ทn"..฿จ๏ืฏ?๔‡ขTฉRฬœ9€kืฎ=…EDD$+{ ย๔oฟลวว???†J||<Ÿ}๖ƒฮะ๒ฏฝ๖งNย฿฿Ÿ#GŽเ้้ษภ๑๗๗็ื_eไศ‘x{{ใ๋๋หŠ+€;#„u๋ึฅAƒxzzสงŸ~Šฏฏ/๕๋ื'!!!อ๕-_พ่ิฉ“9}ฦŒ”/_žrๅสqแย–.]J@@4n˜7nะกCบw๏NลŠ™8q"'NคL™2๘๙๙ังOŸ4ื}๘qjิจŸŸฤฦฦฐ~ชVญJษ’%Yฟ~= ๔๎›Š+โ๏๏oๆE›6m๐๕๕ล฿฿Ÿฐฐ0‹uฌ]ป–5jษชUซจTฉtํฺ•คค$>๘cJ—.MบuนrๅJชฑ=z”w฿}—ฒeหšfกB…ฬ๙๗Ž๔FEEaัััxxx0fฬชTฉยฌYณˆ‰‰Isป-66–จจ(‹‡ˆˆˆd_92ฺ๐๐แรL™2…;wโ๊๊สีซW?~<ํทวลลลขmrำตkWยยย e๚๔้,Zดˆv๏mถ๕๔๔$<<œฝ{๗ฒ|๙r๖๏฿ฯีซW ไ•W^1ื๛๏ฟ“ภ๓ฯ?ฯ7฿|รแร‡iึฌ›6m"(((Eผ—/_ฆ_ฟ~l฿พฎ^ฝjฮsvvfŒ7ฮ,tkิจA“&M=z4฿}๗ฝ{๗เ๚๕๋์ป๒็ฯฯ๙๓็ษ™3'‘‘‘inฏถm2z๔h^yๅ"##ฑททเนs๒ห/„‡‡ำซW/๊ึญห๔้ำ)Qข“&M"**Šภภ@๊ีซวˆ#(Uช๓ๆอ#!![ทnqเภเNQ๚้งŸฒbล โใใ™8q"[ทnลษษ‰=zฐx๑bž}๖Y6lุภoฟฦ?C™2eฬ๘bccYดhSงNล0 :w๎ฬ˜1cprrJ๗u๐ีW_„ฝฝ=พพพ4o€ฯ>๛ŒฃG2mฺ4>๙ไ^{ํ5บt้B้าฅำ์kิจQ ><๕‰ˆˆH๖‘แย4๙FWWWn฿พอ๚๕ู๋ธq#็ฮณhตkW๓๏ *0}๚๔4๛mูฒ%ปvํขE‹8::โแแมK/ฝฤัฃGจ\น2y๓ๆภออFเํํอ๙๓็Sํwฯž=ิฉSวัห—/Ÿ9/88€rๅส๑w฿pyZถlษๅห—นu๋u๊ิ1ทhัส—/ฯ›oพIห–-อB๖^QQQDGG›…ต›››9ฏaร†ุููQฎ\9ฮž= 9โุฑcๆa๑่่h"""ุผy3ซWฏ GŽๆถ?pเ'OždำฆMไษ“‡+Vp๘๐a๓<฿ทoSผxq.^ผHณfอฐททงH‘"TซVอŒฃB… 888๐ร?เํํjฉ™๘cบt้‚9rไฐุ†%J”`ผy„„„ฐjี*ฆL™Bใฦ‰วžoฟ–—_~™ฺตkใํํงงgชท๔ส—/}๛๖ฅo฿พ1>œ5jPดhQ๓<ั9r0y๒d๊ีซ‡ญญ-/ผ๐‚๙๐๔๔d๗๎ธปปง™งˆˆˆHzl ร02;ธ3jํๆๆฦฑ๎ไฑIถUYIb'๖ฟ-ๅtฦ.!cw4๘ฏSฮู#gศZy{”ฑ;‡ฤววณz๕j4h`^๘šdวผณcฮ2๏ไ๏๏ศศศG>Rช_~ซแC๙ึฌiำฆœ9sฦbฺาฅK๑๔๔|โ๋๔ำOYธpกลดมƒำขE‹'พn‘ฌ$KฆK–,ษดu4ˆAƒeฺ๚EDDDฒ สซ ยTDDDDฌ‚ Sฑ *LEDDDฤ*จ0ซ%ฎส—ฌฅ@่‰l๕ R๑๑๑ฐz5๘+ Y9gœ!๛ๆ-"G#ฆ""""bT˜ŠˆˆˆˆUะก|ฑ:Iำš‘ไ˜”ูa<5I6๐\/’พชG’—ูแ<ส9{ไ ู3๏์˜3dฯผK9๖žู!dˆFLEDDDฤ*จ0ซ ยTDDDDฌ‚ Sฑ *LEDDDฤ*จ0ซ ยTDDDDฌ‚ Sฑ *LEDDDฤ*จ0ซๅ ำ๋ืฏ3}๚๔4็*T่พ}๒ห/”-[–jีช=ฮะ2l๋ึญ„„„dสบS3||||๐๖๖ฆ}๛๖$$$dvH"""’d๛ย4#ๆอ›วงŸ~ส๖ํ–ฟ3›˜˜๘H> ใตkื๎fภ€lถ฿~๛่่hึฌY“แeEDDDา’ๅ ำˆˆชTฉ‚ฟฟ?พพพ๔๏฿Ÿ#GŽเ๏๏ฯ˜1cธy๓&M›6ลหห‹ฎ]ปทฟYณfฑpแB๚๗๏O=˜9s&-Zด Fดm–ำงOSญZ5|}}iีช7o fอš๔๏฿ŸrๅสQฑbEยยยจ]ป6ฯ=๗ซVญJs}QQQดiำ___ ๎}ฏฝ๖/ผ๐Ÿ~๚ฉูพQฃF”/_/^ ภูณg๑๗๗งUซVxyyฅุ&วOฑปwำกC*Tจ`๖QฉR%s~‡Xปv-pงุฝy๓& พ}u๎ูณ'AAA,Yฒ$CฃจฑฑฑDEEY๘เณ]ฃF๐๑๑มฦฦ'''ผฝฝ9|š}oผ™ีซW#G\]]จRฅ ๎๎๎”(Q‚ˆˆ^xแ&L˜ภ๒ๅห;ฃœ7/พ๘"eห–Mu›xyyPธpaYผxฑYฌO||<฿}๗ฟ;ฯ<๓ M›6eบuPฉR%*UชDTTร‡วำำ“]ปv๑๒ห/ง่kเภ๔๋ืฯ|ฅโTDD$หr#ฆีซWgถm(P€ๆอ›ณiำฆmllli๗ปiqppภึึึโ๏‡97ีััั;น-[ถฐw๏^๖๎หกC‡(Qขฑฑฑ)bLk›,\ธนsฬฤ‰นrๅŠนŒIIIๆ๓ไ~รรรฑททงpแย888ะจQ#๖์ูcถ‹‹‹cม‚4kึŒ;w2mฺ4|}}ำฬษีีีโ!"""ูW–+Lฯ;‡‡‡บu#$$„๋ืฏmฮฏ\น2 ,`ๅส•บu๋‘ึ็๏๏ฯŠ+€;IUญZ๕‘๚ซSงกกก$$$Xฤ~ฏจจ(๒ๅห‡ฃฃ#{๗๎ๅ๗฿Oตฝไศ‘#ภ‘฿%K–ฐfอขขข คM›6,X‹/r๓ๆMฎ_ฟn^๘Uธpa:DTT†aฐeห๓tƒqใฦQฆLถlูยุฑcูฝ{7oฝ๕NNNดMDDD${ศr…้ึญ[๑๕๕ฅ\นrl฿พ๖ํใ๋๋‹ฏฏ/cฦŒกGœ>}šฒeหฒjี* ,h.›ฺ9ฆ๗3y๒dFฏฏ/๙'}๚๔yค๘?๘cNž<‰+Vไไษ“iถ โส•+”-[– &เ็็—jป{ทษ›oพi1ฟpแย 2„฿,L่ำง~~~„„„˜})R„~๚€ฎฎฎดlูธณ>Lhhจลถษ#๙j‘L…››|Vwวค๛/Eฤ8ฐ๖น^ิ๛s2๖F\f‡๓T(็์‘3dฯผณcฮ=๓/ๅlo๛eP||<ซWฏฆAƒุ›฿฿‘‘‘|Z^–1‘ฆ,wUลบu๋,ฎเ‡;็|~๙็™‘ˆˆˆHๆRašI‚‚‚ฬ[,‰ˆˆˆˆๅ‹ˆˆˆˆ•Pa*""""VA…ฉˆˆˆˆXฆ""""bT˜ŠˆˆˆˆUะU๙bul฿YŒญป{f‡๑ิุฦวร๊ีุ๖\‹ญฝ}f‡๓T(็์‘3dฯผณcฮ=๓ฮŽ9?i1ซ ยTDDDDฌ‚ๅ‹ีIZ;ˆค\ู็ฅ™„ุึ"iๅ{$‘˜ูแ<šณmำฏžBT""’ู4b*""""VA…ฉˆˆˆˆXฆ""""bT˜ŠˆˆˆˆUPa*""""VA…ฉˆˆˆˆXฆ""""bT˜ŠˆˆˆˆUPa*""""VA…้St๚uฆOŸžๆB… =t฿3gฮไ฿MทMDDํฺต{่u$0`xyy1iาคG๎ODDDT˜>U๗+LEF ำย… 3kึฌt\ปv-๙แแแ์ฝ›ร‡ฦุฑc‰ŠŠสะฒ""""้Qa๚EDDPฅJ๑๕๕ฅ9rฦŒรอ›7iฺด)^^^tํฺ5C}†††RฑbE|}}ุ้ฑ#III,Yฒ„ฐฐ0š6mJตjี˜1cx{{3mฺ4ฮž=KฅJ•R๔™ภโล‹ฉ[ท.={๖๎บ~๘กูฦำำ“˜˜bbbˆ็๖ํธธธเ่่@… ุ่ฑ#{๖์y๘&"""ู– ำ'่วคN:„‡‡ณ~Fމแแแ 0€)SฆPขD Ž;F๚๕น|๙ฒนฌฟฟฟ๙wงN  UซV์ทร‡“3gNVฌXAำฆMฉPกK–,a๛๖ํ\ผx‘O?”;v๐๋ฏฟ2~xฮž=›"พ .0dศผผผXนr%#FŒ`๎น้ๆไ๏๏O5(\ธ0žžž|๔ัGfazโฤ ‚ƒƒ6l*T`๊ิฉธq#อพbcc‰ŠŠฒxˆˆˆH๖ฅย๔ ชXฑ"ณgฯf๘๐แœ:uŠœ9sZฬ฿ตk!!!4n˜\นr™๓ยรรอฟงOŸN… 8t่UชTมวว‡+Vp์ุฑ๋ ฃnบไษ“4hbs๏ฝ”(Q‚[ทnฦ๗฿Ÿ๊h๊ฝNŸ>อ๙๓็‰ˆˆเ๔้ำŒ9’+Wฎ#Gš6mสš5k๘๙็Ÿ๙๙็Ÿ๑๐๐HณฏQฃFแๆๆf>Š+v฿๕‹ˆˆHึฅย๔ ช^ฝ:ถmฃ@4oœM›6ฅhccc๓@}v๎™™3grไศz๗๎Mll์Cลๆ๋๋หดiำุฑcอ›7็งŸ~"..ฮœoggGRR’๙อ hัขlถคค$ขฃฃ9pเ%K– M›6ลš5kXฒd ๕๊ีK3GGG\]]-"""’}ๅศ์ฒฒญ[ท2z๔hpwwg๙„……แ๋๋Kถm้ัฃoผ๑eห–ฅz๕๊,Xะ\ึ฿฿฿<œ฿ฉS'บvํJ… 4h/ฝ๔ ค\นrf๛:ะถm[๒็ฯฯ๖ํ๙เƒจ\น2}๛๖ลำำ3ี๓L“ืส7ฬCUซVลูู///ชUซffoูฒ%๋ึญรววว์ปH‘"ภยtฮœ9ฺุ๊;"""๒เl ร02;€จจ(๘gNseŸ3ลcวZZิKฺŒ=‰™ฮS๑ 96๊)D๕dลววณz๕j4h€ฝฝ}f‡๓ิdวผณcฮ=๓ฮŽ9Cสผ“ฟฟ###๙่ง†ถDDDDฤ*จ0ซ ยTDDDDฌ‚ Sฑ *LEDDDฤ*จ0ซ ยTDDDDฌ‚ Sฑ *LEDDDฤ*dŸŸื‘ zŸb๋๎žูa<5ถ๑๑ฐz5ถฦb›M~9$;ๆ,""๗งSฑ *LEDDDฤ*่PพXคc?“ไš3ณรxj’’\I๚m>IูไฟŠส๙ฮ4[ฟถ™’ˆˆีษ&_ """"bํT˜ŠˆˆˆˆUPa*""""VA…ฉˆˆˆˆXฆ""""bT˜ŠˆˆˆˆUPa*""""VA…ฉˆˆˆˆXฆ""""bT˜>ค๋ืฏ3}๚๔4็*T่ก๚9s&๛oš๓วŽ๛Plบ•‡^ !!ถmโ๋๋‹ทท7 ,xคDDDD’ฉ0}H๗+LVZ…ฉa$%%=Rašืฎ]Kwส•+IJJโ๐แรlผ™พ}๛วญ[ทžhl"""’ตฉ0อ ˆˆชTฉ‚ฟฟ?พพพ๔๏฿Ÿ#GŽเ๏๏ฯ˜1cธy๓&M›6ลหห‹ฎ]ปfจฯPฆL3f K–,!,,ŒฆM›RญZ5 ,Hทn๐๑๑แํท฿ๆส•+๘๛๛ำทo_’’’ู่ณ'”/_žปwwŠ?ะ\งง'111iฦร?@ๅส•3f ร† #44ิls๗๐อ›7IJJโฦ,XธSะz{{ำซW/Ž;–มญ*"""๒rdv?๘#u๊ิa๘๐แฤววs๚๔i๚๋/ณ=z4%J”`ษ’%,[ถŒฉSงšห๚๛๛@งNฺ่ต+%J”`ัขE๑วฺฺุ‰››*T 44”2eส๐ฯ?ะคIพ๙ๆึฌYc๖๕ำO?q๑โEŽ9ยoฟFห–-9~x†s:qโกกกฌXฑ‚† ๒ํท฿Rถlูt—iิจ๓็ฯงpแยบu‹eห–w ่ฃGฒpแBบt้‚ญญ-]บtกy๓ๆ8::ฆฺWll,ฑฑฑๆ๓จจจ ว."""YFL3จbลŠฬž=›แร‡s๊ิ)rๆฬi1ืฎ]ๆ๙›7&Wฎ\ๆผไB`๚๔้TจP777œ้ิฉห—/วูู9ี๕บธธ”๊ผ]ปvัฆMlll๐๑๑!Wฎ\\พ|9C๙๓ฯx{{ใแแมoฟฦคI“๎[”์ูณ777""" ฃ{๗๎$$$3gNฺตkว๖ํ™2e cวŽฅB… i๖5jิ(ฬGฑbล2ปˆˆˆdM*L3จz๕๊lถ ะผys6mฺ”ขM†๛ห‘#aaa4iา„นs็๒๖oงฺ๎๎7ฃ์์์HJJ2Ÿ฿=*™์ีW_e์ุฑฬ;—ึญ[ณz๕j‹e๎๎ใ๎ๅ็อ›Gฝz๕ฐตตฅTฉRธบบaฮ๋ฏฟ๘ไ“Ohูฒ%L›6-อ8Hddค๙ธpแย็*"""Y‡ ำ :w๎t๋ึฎ_ฟNttด9ฟrๅสๆ๊+Wฎผ๏…@7n 22’เเ`FmŽชบธธX๔{/[[[ณ`ฌ\น2 .ฤ0 Ž=สํท)Xฐ ล‹็ะกC์ป7ีQTWWWz๗๎อกC‡่ท/s็ฮฅt้าฬ™3€โล‹›1-_พ\ฎhัขlบธsmDD… 2s ยูู™]ปv1kึ,ำฬลััWWW‹‡ˆˆˆd_:ว4ƒถnส่ัฃqppภ๙๓็†ฏฏ/mถฅGผ๑ฦ”-[–๊ีซ›A๊็˜)R„เเ`โโโฐฑฑแ“O> C‡ดm–๙๓ณ}๛๖qผ๙ๆ›๘๘๘Pทn]ฦวถm๐๑๑มมม3fPตjUœ๑๒๒ขZตj๗=D^ฝzuชWฏฮ•+W๘๗฿hึฌ฿=พพพ4mฺิlฃG3€I“&แเเภํท้ืฏ5kึ|่m,"""ู›aFf!w.~rssใŸmSqwอyฒˆ๘$X{•zฯFaŸMŽa(็;ำlฺfnPOA||<ซWฏฆAƒุgv8OEvฬฒgู1gH™w๒๗wddไ#ฬ&_ """"bํT˜ŠˆˆˆˆUPa*""""VA…ฉˆˆˆˆXฆ""""bT˜ŠˆˆˆˆUPa*""""VA…ฉˆˆˆˆX๒“X[ฏๆุบปgvOm|<œ_ญwถูไอส9{ไ,"๒ 4b*""""VA…ฉˆˆˆˆXฆ""""btŽฉX ล]Iส™ูQค๎ภ› 3;‘,K#ฆ""""bT˜ŠˆˆˆˆUPa*""""VA…ฉˆˆˆˆXฆ""""bT˜ŠˆˆˆˆUPa*""""VA…ฉˆˆˆˆXฆ""""bT˜f#ฟ๒ eห–ฅZตjิฯ€๐๖๖ฦหห‹I“&=ฆ่DDD$ปSašฬ›7O?”ํทงูๆฺตk้๖ฮ๎ป9|๘0aaaŒ;–จจจ -+"""’ฆV(""‚*Uชเ๏๏ฏฏ/ว็oฟลวว???† ภะกCฉXฑ"|๔ัGๆ๒žžž :???ชWฏNTTณfอbแย…๔๏฿Ÿ=zXฌ/!!ล‹Sทn]z๖์ ภฬ™3๙๐ร-๚Œ‰‰ &&†๘๘xn฿พ‹‹ ŽŽŽTจPŽ;ฒgฯž ๅKTT”ลCDDDฒ/ฆV่วคN:„‡‡ณ~bcc™2e ;w๎ไะกC๔๎€ฝ{ณo฿>>ฬแร‡9t่ูว๓ฯ?ฯกC‡๐๓๓cม‚ดkืŽเเ`ฆL™ย”)SธpแC† มหห‹•+W2bฤๆฮ›nlิจQƒย… ใ้้ษG}dฆ'Nœ 88˜aร†QกBฆNส7า์kิจQธนน™bลŠ=๊ฆ‘0ฆVจbลŠฬž=›แร‡s๊ิ)~๙ๅBBBpuu _พ|lฺด‰Š+โ๏๏ฯพ}๛8v์˜ูGpp0ๅส•ใ์ูณ)ึฑw๏^J”(มญ[ท ใ๛๏ฟงRฅJ๗ํ๔้ำœ?žˆˆNŸ>อศ‘#นrๅ 9rไ iำฆฌYณ†Ÿ™Ÿ4๛8p ‘‘‘ๆใย… F"""’๕จ0ตBีซWgถm(P€ๆอ›cFŠ6111๔๋ืUซVq๘๐aZถlIllฌ9?yำึึ–ฤฤฤห๛๚๚2mฺ4v์ุA๓ๆอ๙้งŸˆ‹‹3็ูู‘””d>O๎{ษ’%โ่่Hม‚๑๓๓ใ่ัฃfป+Wฎ0qโD‚ƒƒษ;7 .L3OGGG\]]-"""’}ฉ0ตB็ฮรรรƒnบBtt4๓็ฯ7ฯมผz๕*111ฺฺุ’7o^ฎ^ฝสŠ+hNNNผ๕ึ[์ฝ›1cฦฐy๓fส”)รธqใ(^ผธyjภฝ{น|๙2E‹eถm$%%อ(Yฒ$mฺด!00จจ(ึฌYร’%KจWฏใฺ,"""’ลๅศ์$ฅญ[ท2z๔hpwwg๙*Tˆส•+cggGำฆM6lญ[ทๆล_คhัข>๔๚ ๅฦๆ…KUซVลูู///ชUซfžูฒeKึญ[‡}๛๖ฅH‘"ภยtฮœ9ฺุ๊;"""๒เT˜Zก๖ํำพ}{‹i:uขSงNำ>s>๓ห฿}Ni‡ฬฟgฮœ™๎zฉ]ป6p็€Ÿ9ีvi๕ำจQฃt๛I†ถDDDDฤ*จ0ซ ยTDDDDฌ‚ Sฑ *LEDDDฤ*จ0ซ ยTDDDDฌ‚ Sฑ บมพXuอBqwwฯ์0DDDไ)ำˆฉˆˆˆˆXฆ""""bt(_ฌฮศ}Ÿ‘ร%๛ผ4ํ’์$€w%ั61ณรy*>{ydf‡ ""VH#ฆ""""bT˜ŠˆˆˆˆUPa*""""VA…ฉˆˆˆˆXฆ""""bT˜ŠˆˆˆˆUPa*""""VA…ฉˆˆˆˆXฆ""""bT˜ŠˆˆˆˆUPa \ฟ~้ำงgv ‡& jิจมล‹3;$ษ"T˜’~aš˜˜9ฟ]ž๋็ๆอ›้ถ2d#GŽ$<<œfอš1aยเฮ6yYพ0ˆˆ J•*๘๛๛ใ๋๋หฎ]ป,ž?~œAƒqไศ3f 3gฮคE‹ิจQƒถmr๙๒e7nL… จVญ'Ož 44”Š+โ๋๋KวŽIJJ fอš๔๏฿ŸrๅสQฑbEยยยจ]ป6ฯ=๗ซVญJ3ึaร†ัฑcGy๗9u๊ฏพ๚*ๅห—ง^ฝz\พ|OOObbb˜9s&~๘!  L™2๘๙๙1fฬ€4๛ธูณg๙่ฃ(SฆŒ™[Z๋ˆŠŠ2๕๐๐เวฤฯฯ)Sฆ˜๓๏'66–จจ(‹‡ˆˆˆd_Yพ0๑วฉSงแแแ์฿ฟŸ-[ถX>>„‡‡3`ภเฮ!๋•+W2o<๚๖ํหะกC c๘๑๔๋ื€VญZฑo฿>>Lฮœ9Yฑb…น^www>>ุุุเไไ„ทท7็ฯŸO7&Mš`ooOtt4;w๎4๛KLLคdษ’i.็ๆๆ†ณณ3:uขI“&4lุ0>š4iยัฃG™5kUซVฝ๏vL๖๕ื_๓๗฿SงN>๔S†ฮจQฃ€;ฃฌ#GŽdุฐaฬ™3‡๊ีซ3bฤ๚๗๏Ÿj_4‹|ธ3ซโTDD$๛ส๒…i๕๊ีูถm+Vฌ y๓ๆ|๕ีW)žงV๐ๅส•หฦฦ†`kk9ภนsgึฌYร /ผภุฑcนqใ†9ฯมม[[[‹ฟ๏w๎h๒z“’’(Rคแแแ)ฺุูู™ง ฤฦฦ#GยยยXทns็ฮe๑โลLš4)อ>Fลื_อ[oฝEำฆM้ิฉ/ผ๐Bบ๋Xดh“'O Yณf๔่ัรข฿ํท3mฺ4ยยย๘่ฃx๓อ7ำฬีััGGวtท‡ˆˆˆdYPนs็๐๐๐ [ทn„„„ฐcว‹็GŽมลล…่่่4๛จVญšyqTRRGŽเๆอ›ไฯŸŸ˜˜,X๐Xใvss#oผฌ_ฟธsaา๏ฟ@๑โล '))‰•+Wpใฦ "## f๔่ั„‡‡ง‡ทท7_5ไ…^ M›6ผ๒ส+œ={6อuธบบrเภ6mฺDฉRฅXฟ~=Œ;–ึญ[s๔่Q Dม‚๋v‘ฌ+ห˜nบ•ัฃGใเเ€ปป;mถลืืื|>|๑๕๕ลืื—ถm’?~‹>พ๒Kบvํส”)Sˆง]ปv๘๘๘0hะ ^z้% ,x฿s3ฦนs้ึญ !!๐โ‹/2x๐`ฺตkว3ฯ<ƒŸŸััั‡y.iZ}$ห;7:uขSงN์฿ฟŸ9๎ผ$R[ภ7฿|ร[oฝ…aไฯŸŸYณfwฮฉ]ปv-E‹}์ADDDฒร0ŒฬB๎œc๊ๆๆFŸ5ศแ’ๅฯdฒKฒ#๐jฟๆCขmๆž์i๛์ๅ‘ฌ^ฝš `ooŸูแ<๑๑๑ู.gศžygวœ!{ๆs†”y'GFFโ๊๊๚H}g๙C๙""""๒฿}†ฅฌศบu๋๘เƒ,ฆีซWฯ?<“"ษ|*L3APPAAA™†ˆˆˆˆUัก|ฑ *LEDDDฤ*จ0ซ ยTDDDDฌ‚ Sฑ บ*_ฌฮเŠแ๎๎žูa<5ษ7*คา๐lsƒๆ๘๘๘ฬADDฌFLEDDDฤ*จ0ซ C๙bu๙#9ฏ8ท]ปRžB4"""๒ดhฤTDDDDฌ‚ Sฑ *LEDDDฤ*จ0ซ ยTDDDDฌ‚ Sฑ *LEDDDฤ*จ0ซ ยTDDDDฌ‚ S+p๚uฆOŸžูadุ€๐๖๖ฦหห‹I“&ev8"""’Eจ0ต้ฆ‰‰‰O5–kืฎฅ;?<<œปws๘๐aยยย;v,QQQZVDDD$=*LŸฐˆˆชTฉ‚ฟฟ?พพพ์ฺตหโ๙๑ใว4hGŽม฿฿Ÿ1cฦ0sๆLZดhA5hถ-—/_ฆqใฦTจPjีชq๒ไIBCCฉXฑ"พพพt์ุ‘คค$jึฌI)Wฎ+V$,,Œฺตk๓sฯฑjีช1&$$ฐx๑b๊ึญKฯž=˜9s&~๘กูฦำำ“˜˜bbbˆ็๖ํธธธเ่่@… ุ่ฑ#{๖์yขTDDDฒ&ฆOุ?H:uglูฒลโy๑โล๙๔ำO๑๑๑!<<œp๘๐aVฎ\ษผy๓่ท/C‡%,,Œ๑ใวำฏ_?Zตjลพ}๛8|๘09sๆdลŠๆz9x๐ UซVฅgฯžฌZตŠฅK—2rไHณอ… 2d^^^ฌ\น’#F0w๎t๓๑๗๗งF.\OOO>๚่#ณ0=qโมมม 6Œ *0u๊Tnธ‘f_ฑฑฑDEEY|x†ึ+"""YŸFLŸฐ๊ีซณm6 (@๓ๆอ‰ทxพiำฆT—ห•+—๙ท  <<i่น33gฮไศ‘#๔๎›ุุXslmm-N>gีืื—iำฆฑcวš7oฮO?D\\œนผyj`๖ฝdษqttค`ม‚๘๙๙q๔่Qณ•+W˜8q"มมมไฮ›… ฆนmHddค๙ธpแBฦ6ชˆˆˆdI*LŸฐs็ฮแแแAทn aวŽฯ9‚‹‹KšฃŠีชU3/ŽJJJโศ‘#ผy“๙๓ร‚ (.'''z๋-v๏อ˜1cุผy3eส”aธq/^œC‡wFW/_พ @ัขEูถmIIIDGGsเภJ–, @›6m $**Š5kึฐdษ๊ีซ—f ŽŽŽธบบZaํทง}๛๖)ฆ๋วLณ‚ ฒdษ’ำ{๖์i^Eทญ[ทšw่ะมb฿ๆzœฉ]ป6p็ฐฯ?œjป™3gฆ:=๙ผV‘‡กก-ฑ *LEDDDฤ*จ0ซ ยTDDDDฌ‚ Sฑ *LEDDDฤ*จ0ซ ยTDDDDฌ‚ Sฑ ๚ๅ'ฑ:-žkปป{f‡!"""O™FLEDDDฤ*จ0ซ ยTDDDDฌ‚ Sฑ *LEDDDฤ*จ0ซ ยTDDDDฌ‚ Sฑ *LEDDDฤ*จ0ซ ยTDDDDฌ‚ Sฑ *LEDDDฤ*จ0ซ ยTDDDDฌBŽฬ@$™aDGGcooŸษั<=๑๑๑บu‹จจจl“ทrฮ9C๖ฬ;;ๆ ู3๏์˜3คฬ;** ๘ฟ๏๑GกยTฌฦ•+W(QขD&G""""*::77ทG๊C…ฉX|๙๒p๙ ฟฐ+Vฌศพ}๛h=บฬ“nEฑbลธpแฎฎฎVำ“ฎO#็‡YๆIถ˜œŸtLำA—ฑฦื๗“^GVูืYแณ์Iฏ#;~–Aสผ ร ::šย… gธดจ0ซak{็”g77ท ฟมํ์์่ƒa–yาํ“นบบ>ฑผŸFณฬ“ฬ๙a–y้Ar~1e…}mฏ ๘๏๏๋ฌ๐Y๖ดึ‘?หภ2๏G)Mฆ‹Ÿไ?ญGO|™'aXcO:oํk๋hฐห<ษญ๑ต๑0ฌm_g…œŸึ:žtYa_g”๑8ฮTy ขขขpss#22๒ก็๖_•๓Vฮู#gศžygวœ!{ๆs†'›ทFLลj8::2t่P3;”ง*;ๆญœณ์˜wvฬฒgู1gxฒykฤTDDDDฌ‚FLEDDDฤ*จ0ซ ยTDDDDฌ‚ Sฑ *LลjL™2OOOœœœ`๏ฝ™าc3jิ(*Vฌˆ‹‹   I“&œ8qยขMอš5ฑฑฑฑxtํฺ5“"~tร† K‘O™2eฬ๙111๔่ัwwwœiผ9—/_ฮฤˆOOฯyุุ˜๗ ฬ ๛yถmผ๖ฺk.\–.]j1฿0 † ‚‡‡9sๆคN:œ:uสขอีซWyใ7puu%Ož<ผ๖ธqใ)f๑เาห;>>ž>๘r็ฮMแย…iืฎ}ค๖๚๘๓ฯŸr&wฟ}กC‡๙ิซWฯขMVื@ช๏qฦŒcถ๙ฏํ๋Œ|Oeไs๛๙๓4lุ\นrQ @ @BBB†ใPa*Vaม‚๔๋ืกC‡rเภ โŸษ์ะ‹_~๙…=zฐ{๗n6lุ@||‹œ7lุ@ห–-อ6๕|๓ๆM˜2eJช๓Gอไษ“ eฯž=ไฮ›   bbbฬ6oผ๑Geร† ฌ\น’mถ๑ฮ;๏<ญJzy฿บu‹๐๑วsเภ/^ฬ‰'Nัvฤˆ๛w฿}แ?”๛ํk€z๕๊Yไ๓ใ?Zฬฯj๛ฐศ๗าฅK|๗ุุุะผys‹vฅ}‘๏ฉ๛}n'&&าฐaCโโโุตk?๐3gฮdศ!ฤฑ/ฟฒัฃG๓ybbขQธpacิจQ™ี“๓ฯ?€๑ห/ฟ˜ำjิจa๔๎;๓‚zฬ†j๘๙๙ฅ:๏๚๕๋†ฝฝฝฑpแBsฺ๏ฟnฦฏฟ๚”"|:z๗๎m”,YาHJJ2 #๋ํgภXฒd‰๙<))ษ(Tจ1fฬsฺ๕๋ื GGGใว4 ร0Ž;fฦพ}๛ฬ6kึฌ1lllŒฟ๚๋ฉล(๎อ;5{๗๎5ในsๆดโล‹&Lxฒม=!ฉๅพ}{ฃqใฦi.“]๖uใฦZตjYL๛/๏kรH๙=•‘ฯํีซWถถถฦ฿mถ๙ๆ›o WWW#666C๋ีˆฉdบธธ8๖๏฿O:uฬiถถถิฉS‡_5#{r"##ศ—/Ÿล๔นs็๒ฬ3ฯเํํอภนu๋Vf„๗ุœ:uŠย… ๓sฯ๑ฦopy๖๏฿O||ผล>/Sฆ ฯ>๛l–ฺ็qqqฬ™3‡ทz szVฯw;sๆ ทลพuss# ภทฟ๚+y๒ไกB… f›:u๊`kkหž={žzฬOJdd$666ไษ“วb๚็ŸŽปป;ๅส•cฬ˜1t˜ำmบ• Pบtiบu๋ฦ•+Wฬyูa__พ|™UซV๑๖oง˜๗_ื๗~Oeไs๛ื_ลวว‡‚ šm‚‚‚ˆŠŠโ่ัฃZoŽว•€ศร๚๗฿ILLดx!,XใวgRTONRR}๚๔กJ•*x{{›ำดiC๑โล)\ธ0‡ๆƒ>เฤ‰,^ผ8ฃ}xฬœ9“าฅKs้า%†Nตjี๘ํท฿๘๛๏ฟqppH๑…]ฐ`A๛๏ฬ ๘ Xบt)ืฏ_งC‡ๆดฌถŸ๏•ผR{?'ฯ๛๛๏ฟ)P €ล9r/_พ,ณcbb๘เƒhบตลO6๖๊ี‹—^z‰|๙๒ฑkื.ศฅK—?~|&F๛๐๊ีซGณfอ(Qข๑}๔๕๋ื็ื_ลฮฮ.[์๋~๘—ง"—๗uj฿S๙๛๏ฟS}๏'ฯหฆ"OY=๘ํท฿,ฮท,ฮน๒๑๑มรรƒฺตk๓วPฒdษงๆ#ซ_ฟพ๙ทฏฏ//^œŸ~๚‰œ9sfbdOฯw฿}G๚๕)\ธฐ9-ซํgI)>>žVญZa฿|๓ลผ~๚™๛๚๚โเเ@—.]5jิ๒g-CBBฬฟ}||๐๕๕ฅdษ’lบ•ฺตkgbdOฯ๗฿ฯoผ“““ล๔๒พN๋{๊iะก|ษtฯ<๓ vvv)ฎ์ป|๙2… สคจžŒž={ฒrๅJถlูBัขEำmภ้ำงŸFhO\ž๘เ‹้Ye?GGG4Oพyืฎ]ฦ„ Œ๐๐pใ?0ๆฬ™cไฯŸ฿hืฎ]&g–ถ๔rŽŽŽ6{๏=ใื_5ฮœ9clธัx้ฅ—Œ^xมˆ‰‰1๛ศj๛:Yddค‘+W.ใ›oพIฑq_฿๏{ส0๎น`x{{u๋ึ5ยรรตkื๙๓็7˜แ8T˜Šี๘๒ห/gŸ}ึppp0^~๙ec๗๎™าcค๚˜1c†a†qyฃz๕๊Fพ|๙ GGGใ๙็Ÿ7 `DFFfnเเ๕ื_7<<< ฃH‘"ฦ๋ฏฟnœ>}ฺœ๛๖mฃ{๗๎Fผy\นrM›65.]บ”‰?>๋ึญ3ใฤ‰ำณส~ฒeKชฏ็๖ํ†q็–QฑQฐ`Aรัััจ]ปvŠmqๅสฃu๋ึ†ณณณแ๊๊jt์ุัˆŽŽฮ„l2.ฝผฯœ9“ๆ๛|ห–-†aฦ๛€€รอออprr2^|๑Eใณฯ>ณ(โฌMz9฿บuหจ[ทฎ‘?~ร(^ผธันs็ Ym_'›:๕ตsฏ1MภฟHชฅ-kvญ2oUƒ‰2uQ™.N๐Š™A‹!^ˆA}ก3๘Bฃ‰MfL\t™ ’ C#fl‹๑ฏ1XลhHU๊Š@qR๘ํN์ โ.ญ๑๛yu.ฯsž฿ำ&๐อ9Oฯ~QฉTโrน:๕ฟ๋žO‰ผ฿ํ๊๊jIII•J%ััั’----๏\GะŠ!""""๒+ฎ1%"""ข€ภ`JDDDDม”ˆˆˆˆƒ)S""""  ฆDDDDL‰ˆˆˆ( 0˜Q@`0%"๚555มjตขฑฑั฿ฅx9r$.\ธะซ>‹REฝSUU… &๘ป ขƒ)‘X,๔๏฿MMMส1ท๐๐pX,ฏv๚๕ƒZญFTTาาาPWW็uญ7n๔: ํท๓ๆอƒZญ[๓๘งUVVbโฤ‰ษXๅๅๅ๘๔ำOฝŽ-]บถm{๏k:ƒงN๚ปๅ}”L‰ˆ$..ลลลสษ“'ำฉฏฟŠฦฦF8ผy๓999^็KKK‘œœซฑ:›อ๖^u๗†วใ๙ืวsตูl8x๐ Ÿซ!๚01˜๙‰อfC~~พฒำO?a๑โล>๗๏฿s็ฮ…n๗:L›››aณู‰ศศHLž<นห๋8ิิิ`๔่ัส1‹ล‚;wbฤˆวๆอ›q๗๎]Œ7Zญ+WฎTฺถตตaห–-0™Lˆ‰‰มš5k๐็Ÿ>ŒฉSง"++ ZญนนนจญญEzz:๔z=Œผผ<Ÿs|๛ฑ|II † ฆE>z๔จฯ~็ฯŸวะกC…๕๋ืฃญญM9๗ร?`ศ!ˆŽŽฦ’%Kะิิ„ึึVคคคเมƒPซีPซีศหหC~~>rrr Vซ•9฿บu SฆLADDฦŽ‹+Wฎ(ื ยฝ{1hะ L:0eสœ9sๆฃ ๅD!"ขœูl–๒๒r1๒์ู3y๖์™Fฉจจณู์ี๎?‘๚๚z™3gŽlูฒE9๊ี+1 าฺฺ*?๘ฃฬ™3Gnทดดดศนs็บปคคDฦŽฉžคค$y๙๒ฅุํv “้ำง‹รแงำ)”฿]DD8 VซU>|(/^ผฯ?\ฉ)77W‚ƒƒ%77WZ[[ลํvหฬ™3%;;[^ฟ~-vป]bbbไๆอ›>?—Ž๙8P***DDฤ้tJeeฅฯ>cฦŒงำ)?ซี*‘cวŽษจQฃคบบZnทุl6ษฮฮ‘ฒฒ2‰๗บึ’%K$''GูohhุุX)**ว#'Nœ“ษ$อออ""@ๆฮ+๕๕๕โvป•~F๎นำeฝDไ๏˜๙Ipp0,X€ยยBโ๋ฏฟFpppงv)))ะ้tˆˆˆ@UUVญZฅœ;sๆ ’’’ะงO„††โๅห—x๐เBBB|1uน\]ฎ-]ณf "##1|๘p$$$ 99&“ ƒIIIธy๓&เ่ัฃXฟ~=ŒF#ขขขฐy๓f9rDนN||<–.]Š>}๚ พพๅๅๅุฑcยยย0|๘pคงงใ๘๑ใ=~>กกกฐํhll„ม`€ีj๕ูvํฺต0 ˆลบu๋PXX }ษยฦa6›กRฉ๐ํท฿ขจจจวฑ;”””`ไศ‘สw“šš ฝ^‹/*m6lุF•Jฅ G}};CDํL‰ˆh๑โล(((@~~พฯว๘?3\.n7RSS1kึ,ๅ๋K322๐ๅ—_b๙0›อุฑcG—ืำjต]_ฏื+*•ชำ~GŸšš|๒ษ'ส9ณูŒšše฿h4*‡ฏ_ฟฦ€ ำ้ ำ้ฐ~??=ยเมƒกื๋๑อ7฿ นนนวq๒๒๒`6›฿~๛ {๗๎๕ู6-- “'OฦจQฃ0}๚t,[ถ @๛›2331kึ,h4$%%)กxฤˆ˜7oL&t:€๖ {้า%่t:ฌ^ฝZญงOŸฦž={ ื๋aฑXpเภn๋>rไVฌXัใˆจณ ADDฝ—œœŒ 6เ‹/พ่u฿ฆฆ&$&&โ๒ๅห๗’ูฝ{๗‘‘ .tนT€ˆบว`JD๔๚๎ป๏ฐn:„††๚ป"ขƒ)ฎ1%"""ข€ภ`JDDDDม”ˆˆˆˆƒ)S""""  ฆDDDDL‰ˆˆˆ( 0˜Q@`0%"""ข€๐–U€Ii1์IENDฎB`‚c4core-bm-charconv-ftoa-mega_bytes_per_second-double.png000066400000000000000000000746241477602032300335370ustar00rootroot00000000000000c4core-0.2.6/doc/img/linux-x86_64-gxx12.1-Release‰PNG  IHDR„R‡‹๐9tEXtSoftwareMatplotlib version3.5.1, https://matplotlib.org/ุa๒ฝ pHYsaaจ?งiyIDATxœํy\M๙ใ?๐ืmUฺˆ ฅ{{*$ษ’-;!L#ƒ‘ecฬุFฬุ†aฬุส๘ †์c†ฑฏ!ฦRŠ„ยLvZ”ึ๛แื๙บZญ•๓z>๗ก{ฮ๛ผ฿๏sง{_ฮ–B!@DDDDฒฅQึ """ขฒล@HDDD$s „DDDD2ว@HDDD$s „DDDD2ว@HDDD$s „DDDD2ว@HDDD$s „DDDD2ว@H๔มภภ ฌปQคˆˆ( lบตฌปR*ำงO‡Bกภƒสบ+$ญZต‚ƒƒCYwใฝฃP(0}๚๔ฒ๎ฦัชU+ดjี๊ญถ๑2฿%ๅi2Rนฑ{๗๎r๓‹ATVfฯž?๘ฃิๅ—/_Ž>}๚ vํฺP( *ด\~@ืะะภญ[ท ฬOMM…žž FŠฝง’ddd`๚๔้ˆˆˆx็mŸ}๚SงN};ขrƒˆจ๔๔๔ฒ๎B…#„ภำงO_iูฃGโมƒุณgtuuK,๏็็Wh \ฟ~=:w๎J}•J…ฬฬฬฒ๎ฦ[๗zVชTฉTู ŠชงOŸขaร†hุฐกฺฃGPฃF 4oyyy ยาฅK<ปฆ"•/==ใว‡••tuuั A|๗Bจตทjี*ดiำfffะีี…–/_R}พvํ:t่€ส•+ฃfอš๘ๆ›o ดฃRฉฐhั"ุฃRฅJ077ว๐แร๑๘๑cตr666่าฅ "##ัคITชT |๐~๕ืํ&''cธqฐฑฑฎฎ.,--๑ัGธOฅRaึฌYฐดดDฅJ•ะถm[๗฿je๒ฏฅŠ…๔๕๕Qทn]้๚รฃGขiำฆะำำCƒ p๐เAตๅoธ‘#GขAƒะำำƒฉฉ)๚๔้ƒฤฤDตrซWฏ†BกภัฃG1rไH˜™™มาาฒศm{ใฦ ิญ[ธ{๗.€gGLJ}ญแ้ำงแ็็‡*Uช rๅสprrย?จVๆ๐แร๐๖๖Fๅส•abb‚๎ปใาฅKje๒Oก๗฿ ‚‰‰ Œ1x๐`dddHๅะบu๋PฉTจUซีฆฝฬ~ฑo฿>ธปปCOOaaaP(HOOวš5kค฿ขN็ณถถV๛])ษ€ T*‘ Mปs็>Œ”บžSห๑ ซซ {{{์ปWญ\PPlll ,Ÿฟ ซsห–-ฐณณƒžž<== CบuQฉR%ดjีชภ˜/::อ›7‡žžlmmZ LVVBBBPทn]่๊๊ยสส _~๙%ฒฒฒ ํSxx8์ํํกซซ+ญใฦแๆๆCCCมััฑภพ๘ผฤฤDTฏ^0cฦ iŒŸฟTฆ4๛nQ/^ {{{่๋๋ฃJ•*pwwว๚๕๋<&LฺฺุJm็oรโึ๓ล>–๖wx๖๐ูgŸกZตj044Dทn๐฿จ3-- cวŽ•>ฬฬฬะฎ];œ;wN*๓ฒŸ+Vฌ@:u งง‡&Mšเ๘๑ใ…–ปw๏† sssTชT ฮฮฮXณfZ™kธ_<ฒ›˜˜…BีซWจท4฿%…๙๏ฟ๐๑วร\๚ฝ๚ๅ—_JตฮฏEฝeงNšššbธqาด€€กงง'._พ,„โไษ“ข]ปv€Xปvญ๔B•J%ฺดi# …:tจXฒd‰ฺ่ตซ ฦŽซึ–‡‡‡ ?๐ƒXผxฑh฿พฝ –,YRb? $*Uช$๊ีซ'ล’%KD—.]๑๕ื_ซ•:tจะาาร† กกกโซฏพ•+W";;[*gmm-4h ฬออลไษ“ล’%KDใฦ…Bก.\สฅฅฅ กฉฉ)† &–/_.พ๖[แแแ!ฮŸ?/„โศ‘#€puunnnโ‡~ำงO๚๚๚ขI“&j๓๑๑5kึVVVbย„ b๑โลยฮฮNhjjŠ7 1}๚tฑhั"QซV-all,RSSฅๅทlู"œลดiำฤŠ+ฤไษ“E•*U„ตตตHOO—สญZตJvvvยววG,^ผXฬ;W!DHHˆ ๎฿ฟ/„โ๏ฟตkื...าด็ื+$$คฤ1ฺฟฟะััึึึ"$$D,_พ\|๖ูgยืืW*sเภกฅฅ%๊ืฏ/ๆอ›'fฬ˜!ชUซ&ชTฉ"ฎ_ฟ.•ห๏Ÿซซซ่ีซ—Xถl™:tจ พ๒Kฉ7฿|#444ฤํที๚r๔่Q@lูฒๅ•๖‹บu๋Š*Uชˆ‰'ŠะะPqไศฑvํZกซซ+ผฝฝฅ฿“'O–ธ]๒Uฎ\Y 4จะy๙๋{๏=aiiฉถO/ZดH‹ฬฬL@Œ5ชฤถgggQฃF ๑ํท฿ŠE‹‰>๘@่๋๋‹Hๅ $ฌญญ‹์ฯ‹u:99 +++1w๎\1w๎\all,jืฎ-–,Y"์์์ฤ‚ ฤิฉS…ŽŽŽhบตฺ๒๙๛ฝ™™™=zด๘้งŸD‹-๑ฟO*———'ฺทo/๔๕๕ลุฑcEXX˜=zดะาาปw/ะงF‰๊ีซ‹3fˆฅK—Š๓็ฯ‹๛๗ ขmถb้าฅb้าฅb๔่ัขOŸ>Enณ'Ožˆๅห— ขgฯžาวฤฤ!Jฟ๏fลŠ€๐๗๗aaaโวC† Ÿ}๖™Bˆ˜˜ัฟ@๐รROž<)v=๓็=๛Yฺ฿!„่ทฏ ลาฅKE฿พ}…ณณs:  tttฤ็Ÿ.Vฎ\)พ๛๎;ัตkWฑn:ฉฬห|Vฌ\นRอ›7?๔“;vฌ011|๐๐๑๑‘สeddˆF mmm1n8๑ำO? ooo@,Zดจ@GŽQk็๚๕๋€Xตj•4ํeพK^\Ÿ;w๎KKKaee%พ๙ๆฑ|๙rัญ[7i&Bz'&Mš$444ฤฑcวฤ–-[ ฒ !ฤจQฃ |A!ฤ!ˆ™3gชM๗๗๗ …B๗฿าดŒŒŒหw่ะA|๐ม%๖qะ A€๘๔ำOฅi*•Jt๎Y่่่H!ๆ๘๑ใ€W[~๏ฝฆ[[[ โุฑcาด{๗๎ ]]]1~xiฺดiำฑmถRฉTBˆ๛@jิจ‘ศสส’ๆ๘ใ€ˆ‹‹“ฆ๙๘๘b๚๕าด„„@hhhˆSงNIำ๗ํWเญฐํ๘ื_ โื_•ฆๅย-Zˆ\ต๒ฯยK—.‰š5k ๑่ั#ตrฅฯออถถถยฺฺZ<~ธะm$„...ยฬฬL<|๘Pš#444ฤG}T ฑZ]={๖ฆฆฆา๛ห—/ b๑โลjๅFŽ) คm๕*๛ลฝ{ ฌgqกฎ$ฅ „๗๏฿_|๑…จ[ทฎ4ฯรรC ihhˆ‹/ช•3fŒ022*ฐ฿—ไ๛E๎๏ฅw ำฝ{waoo_l™๙๓็ุf๙ŠZฯy…ย’~wขฃฃ {PPP:K๏J๛Y‘-ฬฬฬ„‹‹‹ฺge~h~>.ZดHP žูููยำำSH๛หยา|—Qp2DิจQCํ?UB<;ˆbll\่g๓›ยSฦ๔NLŸ>๖๖๖4hFŽ |๖ูgฅZv๗๎ะิิ,P~๘๑B`ฯž=า4===้็””>>ธvํRRRJี๓wXๆŸFษฮฮ–Nซnูฒฦฦฦhืฎ|ธ๔^GGร‡วฝ{๗ เูX5jิ 6Tซ6mฺ@ฑ๒๑๑ฺ4คงงใภฏผฎฯ{•}๗ล๛๏ฟ8{๖์+๗กฐ๕,NIฟ;๙งœGŽฉV๎ำO?-P—‰‰ NŸ>คคค"+ํgETT๎ป‡เเ`ตฯส   ซ•ฝ{7,,,ะฟišถถ6>๛์3•b ๗ฯ?@ฑ)_hะ Ay5ยƒ ๔Ršํูฏ_?œ8q๗€gืปw๚๕“สผ์~Q6{\]]ัฐaCฌ_ฟแแแฐฐฐยะห(อพบuๆ๏Ÿฅูo fอšจ\นฒฺดย~‡/^ผX`œ๒ห•fฌFމ๚๕๋ฃSงNฐดดฤว\เ๚ษ—๑*๛๎๓พ๚๊+ I“&จWฏF…'NผT^vŸ,้w็ฦะะะ(Poบu ิ5o<\ธpVVVhาค ฆOŸสฑศ฿–๕๊ีS›ฎญญ]เ๓ฦจWฏ44ิใPa฿//ฃ4฿%/บ>’““ฑbลŠ๛ๆเมƒ7฿$6D๏ฬพ}๛™™™ธz๕๊B็Ÿะถm[4lุ .„••tttฐ{๗n๐รPฉToค•J333„‡‡:?ข๑|E9ฅธธธ0ฅญฏจrฅYำO?ลชUซ0v์Xxzzยุุ ……nว็(พจw๏Xณf ยรรีŽ”ฅู๚๕รคI“ฐeหŒ;›7o†ฑฑ1:v์(•yูขธm๖. 0ห—/‡กก!๚๕๋Wเ ฑ4JณํŠ๚_^^Kี๙&T*ฑpแยB็ฟ> +333(•J์ท{๖์มž={ฐjี*|๔ัGnHx5j„ห—/c็ฮุปw/~๛ํ7,[ถ ำฆM+๕ใผ^vŸ|“cาทo_x{{ใ๗฿ว๛1||๗wุถm:u๊๔า๕ฝi/ปฟŠฯึ?ƒ *ดŒ““ำk๏E „๔Nฤฦฦโ›oพมเมƒกT*1t่Pฤลลฉพ/๊ฮฺฺDZZšฺQยป$ญญญ๙'ฒฒฒฐcวตนพx๚ง8*• ืฎ]“'Wฎ\้4V:up๐เAxyyฝฑ/๕:u๊เย… oคฎ7a๋ึญ4h,X Mหฬฬ|ฅฺฮŸ?ZZZ9r$ _้ิ$้ิไ… เ๋๋[h™}แ๒ๅหๆ%$$ ZตjŽ•†ญญ-š4i‚M›6a๔่ัุถmz๔่ก๖˜—7ต_ผฬรฏcภ€˜6mn฿พตkืพตvชTฉR่~๓ชG^J’””„๔๔tตq.์w8&&mถ}ญํญฃฃƒฎ]ปขkืฎPฉT9r$ยยย๐๕ื_z (sxฝ}ทrๅส่ืฏ๚๕๋‡์์l๔๊ี ณfอยคI“PฉRฅwถoๅณถถ†Jฅย๕๋ืีŽึฝ๘T„|5jิภศ‘#1rไHปw7ฦฌYณ^:ๆoหซWฏช๙ฮษษม๕๋ืแ์์ฌV666*•Jํ?E/~ฟไ|q_.j?.อwษ‹ชWฏCCCไๅๅ๙๗6๑”1ฝu999 Bอš5๑ใ?b๕๊ีธ{๗.ฦงV.ร๎ล_8???ไๅๅaษ’%jำ๘แ( ้ร"ซฯ๏4%%ซVญzฉ>฿ŽK–,ถถ6ฺถm เูd๓๒๒๐ํท฿X677๗•BS๏ฝƒ฿ฝภผW=’๘:455 ดปx๑โW๚฿ฐBกภŠ+เ๏๏AƒaวŽj๓K๛(‰ฦรึึ‹-*ฐ๓๛ZฃF ธธธ`อš5je.\ธ€๛๗รฯฯ๏ฅ๛Ÿฏ_ฟ~8u๊~๙ๅ;;aaaจ^ฝ:<ซ๛?sๅŸ>}Zชgi>|๘Pํฝ†††t๔ๆลGืOž<มฯ? 333พ}ปT}ญTฉ๖๎‹Aƒกiำฆุณgvํฺ…ษ“'Kง|||0|๘pฬ™3Jฅํท‡ถถ6ฎ^ฝŠ-[ถเวT{6]iL˜0[ทnEŸ>}๐๑วรออ =ยŽ;ช๖?ฺwกK—.Xปv-Œagg‡ฟ๚ „ฉฉ้+ีงกกu๋ึกG่ท/v๏-ฯฬ™3hบ5BBBŠฝX\CCห—/Gืฎ]แโโ‚มƒฃFHHHภล‹ฅKๆฯŸN:มำำC† มำงOฑx๑bฟึŸF์ท/พ๘โ |๑ลจZตjมฟฉยออ ฤย… QณfMฺฺุช๔ข?111ž็+663gฮt๋ึญุSLcฦŒ)อชฟ–€€|๕ีWู่ณ'>๛์3ddd`๙๒ๅจ_ฟ[น@พfอš๘๎ป๏˜˜ˆ๚๕๋cำฆMP*•Xฑbดตตุผy3‚ƒƒqไศxyy!// ุผyณ๔|ศโ :=B›6m`ii‰7n`๑โลpqq‘ฎ?+Œžž์์์ฐiำ&ิฏ_UซV…ƒƒ^k฿m฿พ=,,,เๅๅsss\บt K–,A็ฮฅ3+๙ŸฑSฆLA@@ดตตัตkืW:j^nnn่ป7-Z„‡ขYณf8z๔จtค,ˆeZZ,--แ๏๏gggเเมƒ8{๖ฌฺYŠา~Vhkkcๆฬ™>|8ฺดiƒ~๚แ๚๕๋XตjU๋๚>๙ไ„……!((ัััฐฑฑมึญ[qโฤ ,ZดHฺvฦฦฦ่ำง/^ …B:u๊`็ฮE^ำWš๏’ยฬ;GŽAำฆM1lุ0ุููแัฃG8w๎<ˆG•jฟ’ทv2‘x๖ุ---ต๏…x๖QณfM้"นนนโำO?ีซW …Bํ‘iiibธqขfอšB[[[ิซWOฬŸ?_ํq#Bฑcวแไไ$*Uช$lllฤw฿}'~๙ๅ—"ต๐ผAƒ‰ส•+‹๙GzF™นนน yyyสฏXฑBธนน ===ahh(ล—_~)’’’ค2ึึึขs็ฮ–๕๑๑Q{๔B<|๘PŒ=ZิชUK่่่KKK1hะ ้๑๙=xนwBุŸBAQT๐ยฃF?~,,ชUซ& D‡DBB‚ฐถถV{ฌIcgฮž=[ ฮŸC(ฤณวู๘๘๘้ั7/๓l1!„ˆŒŒํฺต†††ขrๅสยษษฉภ#a<(ผผผ„žžž022]ปv๑๑๑%๖๏๙u*l๑๒๒ฤะกC‹์฿๋์B<{vฆด฿%…ญฯปwลจQฃ„•••ะึึขmถbลŠฅZ๏Wฅ๘""""z๋”J%\]]ฑn: 8ฐฌปCฏ!$""ขทขฐฟัฝhั"hhh eห–eะ#* ฏ!$""ขทbผyˆŽŽF๋ึญกฅฅ%=ข็“O>)๐x*[44T'NœฆUฎ\Y 4จ@[๓็ฯฤ๕๋ืีฆ'&& MMM1kึ,ต้qqqBKKKmz~CCC‹\'1bฤˆืจ<เB"ช๚๖ํ‹งOŸb็ฮHKKรฮ;K<]ฝ{w8pภ๖ํ1iา$์ป €x๎6ฉT*์ปWํtฑ‰‰ าำำีNS—ฦร‡UชT)tพฺQอ ภฤฤ5BำฆMฅ้๙?_ปv ——‡๛๗ฃG๘เƒคr5jิภ€‰ิิTตถ† MMM้œœŒ๛KGNทiำ^บฯฯถmT*๚๖ํซVท……๊ีซW n]]] <ธศ๚ชTฉRไ๕ฌDๅ o*!ข ฉz๕๊๐๕๕ล๚๕๋‘‘‘ผผ<๘๛๛ปŒฅฅ%|}}ฅ๗บuƒฉฉ)พ๘โ ์นSบ้ใ์ูณธพZ 9r$6oŒN:กVญZh฿พ=๚๖ํ‹Ž;–ชฟขˆฟjiiYเฆcccXYY˜<;ญ <ปs9## 4(PgฃF Rฉp๋ึ-ุKำmmmีส]ฝzค0๕"##ฃโVฉ[[[|๙็Xธp!ยรรแํํnบแร?”๚_œš5kธัฅ~๚€ฤฤD4kึ Wฏ^ลฅK—คSผ/บw๏K๕๙yWฏ^…๕๊ี+tพถถถฺ๛ZตjAGGงศ๚„ผก„* B"ชฐ €aร†แฮ;่ิฉLLL^บŽถmŽ;&ยปwรฦฦvvvR9333(•J์ท{๖์มž={ฐjี*|๔ัGXณfM‘๕›šš๘ฟ ๗ข็ุ•fzQมฒ4๔๔๔ิซT*ฯฎทณฐฐ(Pล๋*Kcม‚ ย๖ํฑ~|๖ูg˜3gN:ฅv#หซRฉTpttฤย… b~ูบ ๖์ูS่๖๑ฆ ท็‹’““QญZตW๎ัปฤ@HDVฯž=1|๘pœ:u ›6mzฅ:rssOž<‘ฆํฺต ~~~ส๊่่ kืฎฺ่ต+T*Fމฐฐ0|๕ืจ[ทnก๕ืฎ]zzzธ~๚+๕ฏ(ีซW‡พพ>._พ\`^BB444J Gu๊ิ๐,์>ไ๔u9::ยััSงNลษ“'แๅๅ…ะะPฬœ9ณุๅ’’’ <็ส•+žH”฿็˜˜ดmถฤฃoEอ/jz:u „€ญญญtd๒U๗฿ศฮฮFฃF^ซขw…ืQ…e``€ๅห—c๚๔้ฏŒฟ?เ์์ ธ{๗.ฮ;งvบ๘ฟk๓ihhภษษ ิw๒"mmmธปป#**๊•๚WMMMดo฿ทoWป๘๎ปXฟ~=ZดhQโ)฿:ภศศณgฯFNNN๙๗๏฿ฉ>ฅฆฆJ;Ÿฃฃ#444ŠF๙rss&ฝฯฮฮFXXชWฏ.ตทo_๗฿๘๙็Ÿ ,๔้SคงงK๏+Wฎ\่อ๙๓ลyฝz๕‚ฆฆ&fฬ˜QเHฌขภ>Pœk›7o^๊eˆสQ…Vิ_)ฬ•+Wฐn:ฯ"|๊ิ)ฌYณu๋ึE`` €gง‹+Uชค๖:t(=z„6mฺภาา7nภโล‹แโโRโQ ๎ปcส”)HMM}้๋๒Š3sๆL8p-Zดภศ‘#กฅฅ…ฐฐ0deeaผy%.odd„ๅห—#007F@@ชWฏŽ›7obืฎ]๐๒๒ย’%KJŸร‡c๔่ั่ำง๊ืฏ\ฌ]ปššš่ปw‰หืฌY฿}๗Qฟ~}lฺด Jฅ+Vฌฎ฿ ฤๆอ›Œ#GŽภหห yyyHHHภๆอ›ฑo฿>ธปปx๖่—ƒbแย…จYณ&lmmัดiS)\N™2ะึึFืฎ]QงNฬœ9“&MBbb"z๔่CCC\ฟ~ฟ;>๙ไ|๑ลฅฺ@ํฺตแ๊๊Z๊ํGTฆส๎g"ข—๓cgŠSšวฮhjj KKK๑ษ'Ÿˆปw๏Jๅ…ŸŸ_:ทn*ฺทo/ฬฬฬ„ŽŽŽจ]ปถ>|ธธ}๛v‰พ{๗ฎะาาkืฎU›๎ใใ#์ํํKีu5j”ฺดs็ฮ‰:กฏฏ/Zทn-Nž<ฉVฆคํvไศักCall,*Uช$๊ิฉ#‚‚‚DTTTฑ๋๕โcgฎ]ป&>๘cQงNQฉR%QตjUับukq๐เมb๋โถETT”๐๔๔•*Uึึึbษ’%สfgg‹๏พ๛Nุ ]]]QฅJแๆๆ&fฬ˜!RRRคr ขeห–BOOOP{อท฿~+jีช%444 <‚ๆท฿~-Zด•+W•+W 6ฃF—/_.ะ฿ยไๅๅ‰5jˆฉSง–ธDๅ…BˆืธB™ˆ่=’›› SSSฬ™3#GŽ|ฃu2Wฎ\ม๑ใว฿hฝT๑ว0`๙็ิจQฃฌปCT* „DD฿ฝ{๗ฐlู2 >‘฿ผy๕๋ืวกC‡เๅๅ๕F๋ฆ๒ลำำฅ:mOT^0ษ๏2&"""’9B""""™c $"""’9B""""™ใƒฉฉTT*’’’`hhศ?ึNDDTA!––†š5kBCฃ่ใ€ „T*IIIฏ๕Gใ‰ˆˆจ์บu –––Eฮg คR144\ฟ~UซV-ใPNN๖๏฿๖ํKา‹สวฃเX”/ฒ—šš +++้{ผ( „T*๙ง‰ ฿่฿bฅW“““}}}๑Cถเx”‹๒…ใQ~”tนo*!"""’9B""""™c $"""’9B""""™c $"""’9B""""™c $"""’9B""""™c $"""’9B""""™c $"""’9B""""™c $"""’9B""""™ำ*๋Pลาaั จt สบฒงฃ!0ษ๐žw ู*EYwG๖8ๅวข|แx”ฮนฏ”ux„ˆˆˆH๎‰ˆˆˆdށˆˆˆHๆ‰ˆˆˆdށˆˆˆHๆ‰ˆˆˆdށˆˆˆHๆ‰ˆˆˆdށˆˆˆHๆ‰ˆˆˆdށˆˆˆHๆ‰ˆˆˆdށˆˆˆHๆ‰ˆˆˆdฎยB4kึ์ฅ—kึฌ‘œœŒ•+Wพ…ž”™™ ›WZv๕๊ี˜8qb้xอž‘œU่@xเภhjjพVo+>~๘ื๙ช’““หบ DDDTŽU˜@๘๓ฯ?รััฮฮฮ ANNfฯžฉSง–j๙ผผ< 6 5‚ฟฟ?ฒฒฒSฆLA\\\\\0|ddd ptt„——ฎ\น๘๋ฏฟเ้้ WWWดiำทo฿.ะFff&ึฌYƒๆอ›c๙€ปw๏ขu๋ึpttฤŒ3คฒEต3}๚t„††Jๅ,,,คŸ๙็ดhั๕๋ืGXXX๖Ÿ*D ŒลาฅKqโฤ ฤฤฤ`ฬ˜1Xธp! CCCตฒกกกR ŠŠŠยะกCฟ๖=z„๘๘xL™2111€YณfมััJฅ&Lภ’%KPฝzuฤลลaส”)9r$ภ‘‘‘8<‚ƒƒ1o<ฉอห—/cธqpppภนs็๐๓ฯ?c๖์ู€3f gฯžˆ‹‹S wEตSœณgฯb๗๎ˆŠŠย‚ ””ค6ๆฬ™่ป7ฮž=‹฿ฃFŒ1ทoวํทแ๎๎Žaร†!::บุถฒฒฒššช๖"""ข๗S…„๙ืษž>}Š๛๗cะ Aส#88เ๎๎.>y๒$๚๕๋…BWWW4lุฐะถNž<‰?เ็็‡K—.xv ธgฯžpttDHHโใใ< šจQฃ.\ธ€๖๖๖j๕ๅ_ใืฟ)ŽŸŸŒŒŒ`dd___œ9sFmt้า๗๎Cnn.ภฦฦ3gฮD||<ผผผะฒeK,Xฐ ศถๆฬ™ccc้eeeUbˆˆˆจbช๐EJฅ๑๑๑ฐตตE‹-pyt๋ึญฤๅ Eก?—ฦดiำะซW/ฤลลaํฺตา)็vํฺแ๛๏ฟGxx8๚๗๏ปwCฅRฺniฺิิิ”–ฯoฃจฟXŸ{๖์Rฉ„Rฉฤญ[ท ฅฅ%อ?~8Œ๏พ๛“'O–ia&Mš„””้u๋ึญ๛NDDDS…„mฺดมฦฅำ–žžžธ}๛6 WWW์ุฑฃุ:š7oŽอ›7bbb044DZZšZนM›6๖๎ ;;;@jj*jิจเูฟ๙ŒŒŒ0fฬฤฤฤ`ธqGƒ ฐnบ๕ๅ[\;ึึึP*•P`๖์ูƒดด4คฅฅแะกC๐๐๐P›๏๋๋‹ฅK—J๏๓O‹๏฿ฟ๘๛๏ัฟ\ผxSฆLนนy‘KWWW:™"""ข๗S…„=z4š7oggg๔ำOE–-๊ยฝ{รุุ5ยฬ™3แไไ055…““œœœ0|Œ=IIIprrยท฿~+ฌ/พ๘Ÿ~๚)7n ƒBnูฒ%ยรรq๊ิ)้๑2!!!ุบu+ีฎ๙+ช^ฝzแส•+prrย… ิ๊wssCงNเๆๆ†qใฦกfอšj๓งM›&ีigg'.755ลฝ{ฑ}๛v๘๙๙ACฃB ;ฝ# !„(๋NP๙—šš cccธM•Nแ˜ IO0็‚ฒU/w๙ฝy๒ƒcQพp}Š1cฦเศ‘#ˆŒŒฤล‹ฅ~ีNq bbb0u๊TŒ;Vm^vv6&L˜€;vเนshาค –-[เูQะแร‡#,, ๘๛๏๑เมƒ"ษสสBjjชฺ‹ˆˆˆOZeาŠˆˆ@@@ŒŒŒOŸ>ล๛q๐เAธqCญlppฐ๔ณปป;Vฎ\)ฝ …FŒWWืํ$''CฅRมออ 0pเ@์ูณ~๘!:„y๓ๆ!++ w๏E||<œัฃG\ผxฟ๚+ZดhกV฿ๅห—agg‡Zตjz๗๎ŒŒŒb)N@@ {๗๎9rdถbccับukฯbถm< ’ํฺตCปvํp}Œ7–––ธvํjึฌY 9sๆ`ฦŒล๖…ˆˆˆ&พHฉT">>ถถถศออล๛๗ัญ[7์ุฑฃุๅกซซ‹ทoฟT{™™™๘๓ฯ 333Œ=YYYž…งeห–แใ?Fฯž=1t่PิซWOZVกP๚sQ455กRฉ@jฃ4u !เแแ๛๗Z๏“'Oฐiำ&ฌ\น•+Wฦฺตkann^hูI“&แ๓ฯ?—งฆฆยสสชฤพQลSaNทiำ7n”N]zzzโ๖ํHLLDdd$\]]K ƒYYY1b<ˆ[ทnIมษะะiiihjjJงƒ7lุ€-Z 33จRฅ =z„?Sชืมมห–-ร๙๓็Qฏ^= 0ญ[ทFbb"4h€๘๘x$%%!''ถm+ถฐถถ†Rฉ„Jฅยฮ;ีึaำฆM€;w8ยูฐaC\ฟ~qqq€๔๔t้:ร/พ๘NNNHHHภฺตkq๐เA๔้ำงศrtuuaddค๖"""ข๗S…9B่เเ€ัฃGฃy๓ๆะิิDฯž=‹||K๕ƒมมมˆŠŠBhh(Vฎ\‰oพ๙={๖„ƒƒVฌXฎ]ปโ๔้ำฺ่ต+ฑ~zlธฟ๒ † ‚ฌฌ,xyy! ššš่฿ฟ?5jKKKxzzhทrๅส:t(†Š่่hhiiAOO?๐Zทn ุKๅ kฆNŠ>๚ีชUƒณณณZyyypvv†ŽŽNkuttฐ~zใษ“'B`ผyจ[ท.|}}1{๖l่่่ผฮ0ั{H!xห)•Bjj*Œ1|_ะา7.๋๎ศž&๒ะFใVีA^๏ฑK๔๚8ๅวข|แx”ฮ’žZ๙฿฿)))ลžํซ0งŒ‰ˆˆˆ่ํ` $"""’9B""""™c $"""’9B""""™c $"""’9B""""™c $"""’9B""""™c $"""’9B""""™c $"""’9B""""™c $"""’9ญฒ๎U,ณ:ึƒฉฉiYwC๖rrrฐ{๗?๘พKhkk—uwdใQ~p,สŽGลม#„DDDD2ว@HDDD$s „DDDD2วk้ฅlŠ๙z†้e Rๅก*€u็44หบ7ฤ๑(?8ๅ วฃT{ิ.๋.๐!‘1ษ!‘ฬ1ษ!‘ฬ1ษ!‘ฬ1ษ!‘ฬ1ษ!‘ฬ1ษ!‘ฬ1ษ!‘ฬ•I ๔๗๗GณfอJ,—˜˜ˆญ[ทพฑvงOŸŽะะะ7V฿ซฐฐฐxฅๅ"""P`zbbbฉถ%QQy :u๊GGGt่ะw๏-rู„„๘๘๘ภููM›6EVV ::-Zด@:uฐ~ภ?ƒ-Z qใฦ๐๔๔ฤฅK—ซWฏ†ฟฟ?|||ˆ#GŽภัั...๐๒๒*ะfnn.ถm†๖ํc๔่ั€๔๔t๔์ูvvv–สชT*Œ=pssรฉSงค6'Nœ(•ณฑฑAff&เแร‡hืฎ4h€B3f <<<เโโ‚?p๘q4jิs็ฮลฝ{๗Jตํณฒฒššช๖"""ข๗ำ[ „ฑฑฑXบt)Nœ8˜˜Œ3 .ฤ Aƒ`hhจV644T:•…กC‡fอš…:@ฉTbเภ Aปvํ‡๎ปcส”)Eถˆ้ำง#&&๛๗๏‡ถถ6เฦ8z๔(6oŒ3fjิจC‡แนs๘๑ว1y๒dต๕ุนs'ึฏ_… โงŸ~‚Rฉฤ๎ปฅ2ทnยดiำ`gg‡;wโ›oพAxx8`้าฅฐตตE||<:u๊$…ุญ[ทโ฿E\\Vฏ^   ท้ฉSงฐz๕jฤลลa฿พ}ˆŠŠR›ฟrๅJฺฺุโ์ูณ8v์&Nœˆœœt้าGดjี ˆˆˆ(ถญ9sๆภุุXzYYY•ุ?"""ช˜Z ฬฟๆอศศ๐๔้S์฿ฟƒ *P688X:zๆ๎๎Ž•+WZ็ษ“'๑แ‡>๐Cœ8qขะrฉฉฉHKKC๋ึญฦฦฦะะxถช;w†ฆฆ&\]]‘˜˜เูัฐมƒรมมร† C||ผTWวŽฅผys|๙ๅ—Xฒd‰tฤ๑ฬ™3ฐตตEFFขขข๐ห/ฟจ]ำw๒ไIฺ้ฟ๎ปC___š>`ภ( 8::B__ฟุ#žเํํZตjAGGฝz๕Bddคฺ ,, ...hูฒ%าาา””077วฤ‰q๑โE 8}๚๔มงŸ~Zd[“&MBJJŠ๔บu๋Vฑ}#""ขŠ๋]CจT*[[[ดhั็ฯŸGทnU๓]]]€†††t]เขE‹ะ AฤลลแะกCRุ 8เYH๚๙็Ÿ๑๘๑c4mฺ>„““VฌXศศH๔๎›7oFvvถZ› …ขิำิิ„Jฅ’?฿—็๋Q(๊Bเ๛”J%”J%nผ kkki๙๓็1jิ(Œ?C† ม๘๑ใ‹์‡ฎฎ.ŒŒŒิ^DDD๔~zkฐM›6ุธqฃtํ™งง'n฿พฤฤDDFFยีี;v์(ถCCCคฅฅI๏›7oŽM›6ึฏ_-Zบœ‘‘Œqไศฯnชx>dฝ(55P(Xฝzu‘ๅฎ]ป|๕ืฐฑฑมญ[ทPฉR%|๑ว8u๊ๆฯŸร‡ฃaร†Xฐ`A>๏นา๔-[ถ@‹/โ้ำง077‡ตต5bbb<;๚๘Qรใว#)) 999ุถm[๋}}}ฑ|๙ri]•J%เนs๐๐๐ภ๘๑ใแใใƒ .`๎นฐฑฑ)r]‰ˆˆH>Z tppภ่ัฃัผys8;;ใงŸ~*ฒlQื:99แ้ำงาM%ำงOว๎ปแไไ„mถaๆฬ™Eึ๙๋ฏฟ"$$ฮฮฮุ่ฑ#rrrŠ,Œ%K–ภลลE-€พhแย…ฐทท‡““6lgggต๙... Ell,\\\ฃFย฿ {{{์ฺต ๆๆๆž=zวŽŽŽ ฤชUซ-Zด€์์์๐ฟOํฺฝฆM›"((h฿พ=ีฺ>|8ฬออแ์์ {{{|๓อ7žๅ วแร‡ัฏ_?่่่นŽDDD$? ม็‘P)คฆฆยุุKล@ฯะคฌปCชˆˆˆˆŠWแั๋a $"""’9B""""™c $"""’9B""""™c $"""’9B""""™c $"""’9B""""™c $"""’น ง๋่๊็\ ฆฆฆe ูหษษม๎ฑ๘ฐฑ%ดตตหบ;ฒว๑(?8ๅ วฃโเB""""™c $"""’9B""""™c $"""’9TB/%:1†5หบฒงสหœน– M—5ŽG๙มฑ(_8%๓ฌkRึ]ภ#„DDDDฒว@HDDD$s „DDDD2ว@HDDD$s „DDDD2ว@HDDD$s „DDDD2ว@HDDD$s „DDDD2ว@HDDD$s „DDDD2ว@HDDD$s „DDDD2ว@HDDD$s „DDDD2๗ึarr2Vฎ\Yไ| ‹๋Xฝz5•–mีช L ยฝ{_ณgDDD$geKใMยื‘——W๊ฒ999HOO‹ฝy9?.๋.Q9๖ฦaRRผผผเโโ'''Œ?qqqpqqม๙๓‘žžŽž={ยฮฮมมม%ึ๗๛๏ฟ#** ={๖„ทท7`ีชUppp€ƒƒVฌXQ์๒3fฬ€ƒƒœœœ&M3f ์ํํัฝ{w)ไ…„„ภรร˜ภอ›7๑้งŸโะกC066๐์ุ่ฑc1y๒dœ;wฃF’ๆ]พ|vvvจUซtttะปwoฯNงซT*ธนนˆ'N”ด‰ีถ฿๙๓็ีๆ]พ|ฑฑฑhบ5\\\ฐjี*ธqภณ ูฎ];lูฒP*•ฐดดDRRR‘mMš4 )))า๋ึญ[%๖ˆˆˆ*ฆ7[ถl‰cวŽมฬฬ ฝ{๗ฦกC‡ ”Q(oชนWขซซ+ฌกกผผBตjีเ์์ฌึF^^œกฃฃSเšCฌ_ฟมมมx๒ไ „˜7o๊ึญ ___ฬž=[:…NDDD๔<…(ํmง$kฉฉฉ066ฦพจk04ฎRึ‘=U^.$œ@ต†^ะะ|cฏฃWฤ๑(?8ๅ วฃdžuMj๙฿฿)))ล^ลฟTBDDD$s:ฎ?|๘mถU›VญZ50†ถถvYwG๖8ๅวข|แxTธธธ <<ำงOวเมƒแ้้‰/ฟำงOGhh( UซV๘๊ซฏเๆๆWWWบu pๅสธปปรููcวŽEซVญ ด™™‰5kึ y๓ๆ˜?>เ๎ปhบ51cฦ ฉlFF๚๗๏GGGxyyแส•+ ึ@h๊?ƒ-Z ~๚ +ะ“'OxxxเิฉS€ 6ภููK—.Ejjj‰ฒฒฒššช๖"""ข๗ำ „6l€ฏฏ/”J%ขฃฃ1sๆL8::BฉTbย„ Xบt)lmmN:แ๎ปาฒ...าฯC‡•‚ ปป;~w?~๛/fอš…ศศH๕ื_Xธp! ํหŠ+0z๔h(•Jœ8q˜5k:t่ฅR‰xฎŽ;† จรภภััั๘๐รฅp6v์XLŸ>111ะาาR+๙๒eŒ78w๎~๙gฬž=0cฦ ๔์ูqqqjแnษ’%จ^ฝ:โโโ0eสŒ9ฒฤํ|๖์Y์ฝQQQXฐ`’’’ิๆฯœ9ฝ{๗ฦูณg๑๛๏ฟcิจQ€#F`๛๖ํธ}๛61lุ0DGGึœ9s`ll,ฝฌฌฌJ์ULo$zxx`ํฺต˜1cฎ^ฝ ===ต๙'Ož”ฎs๋ฝ;๔๕๕ฅyJฅR๚yๅส•pww/PTTฺทoยฯฯงOŸ.ด/žžž˜?>ๆอ›‡๛๗๏o๙z๔่mmํB็u๋ึ เ๊๊*ฯ˜˜t้าะฏ_?ฉ์oฟิจQ.\ภ?{{๛Bืฝjำ?๐C€ŸŸ.]บTh_ž็็็###มืืgฮœQ›เภ„„„ภลล]บtมฝ{๗›› ฐฑฑมฬ™3///ดlูฒะ0œoาคIHII‘^๙GJ‰ˆˆ่๓Faห–-q์ุ1˜™™กw๏8t่P2 …โM4Uข`๛๖ํะาาB๋ึญ‹ Zฯ‡า้๊๊444——BZถ]ปv๘๛๏Ž๛c๗๎PฉTje๒ืฝ4@SSSZ>++ซะz๒~ฑ>!๖์ูฅR ฅR‰[ทnฉโใวc๐เม๘๎ป๏0y๒d)FWWW Ÿ๙/"""z?ฝ‘@xใฦ ิจQ#FŒ@@@’““‘––&อoผ96mฺุนs'222JฌำะะPชรรร‡Bjj*žF…ฟ๖๖๖ุตk—Z)์B B`` ผฝฝQซV-|๕ีWhผ9š5k†qใฦ๙๘–7ยมม...HKKCวŽแไไ„งOŸJ7•ผŠ~๘_5\\\๐ไษ“B˜ตlูแแแ8u๊”ิฟlบŽŽŽjื=IIIprrยท฿~+น^ฝzแส•+prrย… ิ๊wssCงNเๆๆ†qใฦกfอšj๓งM›&ีigg'้mjjŠฝ{๗b๛๖ํ๐๓๓ƒ†?IDDDG!Š:Jj222 งง…B™3g"77ำงO/๋nฝ3ฉฉฉ066Fผฟ)Lู๏ผ›y—๓๓rrrฐ{๗n๘๙๙y-,ฝ;๒ƒcQพp<ส^๗wJJJฑ—~วp๚๔iŒ7yyyฐตตลฏฟZึ]""""z#*l |๘๐!ฺถmซ6ญZตj8x๐เ[iฏu๋ึjwDฝ/*l 455e@#"""zxw‘ฬ1ษ!‘ฬ1ษ!‘ฬ1ษ!‘ฬ1ษ!‘ฬ1ษ\…ำuT6ฬB/ริิดฌปADDDoษ!‘ฬ1ษ!‘ฬ๑ฆz)ชฝ าU•u7$Ÿ/๋.Ux33mฺดซซ+Ž9๒RmMœ8ซWฏ~•nยฦฦ™™™ฆทjี ฏT'‘ฌก*• ,ถ‹๐๙๓022ย๙๓็ับu๋B—ษศศ@vv๖ํ๏๋x๘qYwˆˆˆสฉ๗&&%%มหห ...prrBBB\]]ัปwo4jิŸ|๒ T*ภ#FŒ€ฃฃ#nบ @DD:t่€ฎ]ปข^ฝz˜5k`ส”)ˆ‹‹ƒ‹‹ ๆฯŸภภ@=z...x๘๐กZ?.^ผˆO?๖๖๖R[พ|9๊ืฏooo๓ฯ?Rูปwรษษ ˜>}บ4=ฟ?0}๚t„††J๏CBBเเเ€6mฺเ๛ถรฎ]ปะฌY3ธธธ 88XZgwww <งOŸ~อLDDD๏ก๗&nุฐพพพP*•ˆŽŽ†ฑฑฑ๘๚๋ฏ`ถm€{๗๎กGธpแฌญญี๊9}๚`ๆฬ™๘๏ฟิๆฟุ’<_&++ซะyฯฏO>!บw๏ฅR ฅR‰ห—/ให/ฟ”ๆ?|๘‹-BทnPนrelูฒฅศ>Lš4 )))า๋ึญ[%๖›ˆˆˆ*ฆ๗&ธq5jิภˆ#€ดด4$$$ 66BlผนฤฃoE144,๒Hxzzโื_ล‰'Pนret่ะบuCJJ <<}๚+-ชU+$$$˜„ฝ{๗พfฯˆˆˆHฮY ฬหห{“M•ZYด›““ƒ๔๔๔wnQ?~\ึ] ""ขrฌิ0)) ^^^pqq““Nž<ฉ๖>!!SฆLA\\\\\0|ฌ^ฝ๐๑๑A`` ๎ฝ‹๎ปรธrๅ €gGฮ<<<เไไ„มƒCฅRxvTl๘๑puu…‡‡ขขขะถm[|๐มุตkW‘}>}: OOO|๙ๅ—ธz๕*ฺตk777t์ุw๏ุุุ 33ฐz๕jLœ80aย4lุฮฮฮ˜?>Yว๓1y๒d4lุPZทํทฃ~๚hาค ฮœ9#•={๖,แ่่ˆ#FHมตจ>@XXœแแแฟป@๛gฮœทท77nŒ>}๚ ##ะฃG๘๛๛ใเมƒB”8ึ••…ิิTตฝŸJ7lุ___(•JDGGใศ‘#j๏ญญญ1kึ,8::BฉTbย„ €ุุX์น๋ืฏวธqใ‚จจ(,\ธŸ9 o฿พ8{๖,bccกงง‡?Sjืิิ็ฯŸG‹-0z๔h์ฺต ๑fฮœYl๙็;v ,ภจQฃฐrๅJDGGcศ!๘๖o‹\๎แร‡ุบu+โใใƒO>๙Šฌ#//;v์€ŸŸz๕๊…ZตjแนspuuลำงO1fฬ9r‘‘‘ธx๑ขิฮเมƒ†ธธ8Œ๘๘xižฆฆ&H!'55ษษษฐฒฒB๗๎]บt8::BกP RฅJpppภอ›7‹ํo= ญญดด4œ8qBช///u๊ิ)r9ccc`่ะก่ัฃ:w๎\l=z๔ภล‹๑๋ฏฟขE‹ju]พ|vvvจUซ w๏ศศศ@rr2T*ฤž={๐แ‡ปN€๎ปcไศ‘ฺŠE๋ึญ< ˆmถ๐,Hถkืํฺตร๛๗1n8XZZโฺตkจYณfกmMš4I ์ššสPHDD๔ž*u lูฒ%Ž;†?ฝ{๗ฦ’%K ผ/,h้๋๋K?+ œ;w๊&‡ †={๖ ^ฝz๘๛๏๑ไษižŽŽ@CCCํ็’ฎ ฬoWฅRกVญZP*•สhjjJงงณฒฒZZZˆŠŠยพ}๛Žmถแว,ฒŽ9sๆ`ูฒe๘๘ใัณgO :๕๊ีS[็ย~.Ja}*M]Bxxx`…ึ๛ไษlฺด +WฎDๅส•ฑvํZ˜››ู]]]่๊๊–ุ_"""ช๘J}ส๘ฦจQฃFŒ€€DFFชฝ‹‹ƒกก!าาาŠฌร[บ้DฅR!..žžŽ๊ีซ#33›6mzอURgllŒ*UชHA)''—.]X[[CฉTBฅRa็ฮžง””t๋ึ ๓ๆอƒRฉ,ถ,[ถ ็ฯŸGฝz๕0`ภดn‰‰‰hะ โใใ‘””„œœlถ `bbMMMฤฤฤxv:>่ba}ส—ฟmv๎ WWWตy 6ฤ๕๋ืีถiu†_|๑…t็ฺตkq๐เA๔้ำG:BKDDD๒V๊#„˜7ottt`jjŠภภ@899I๏7nSSS899มษษ จ^ฝบZ‹/Fpp0–.]Šœœ|๔ัGpttฤ”)Sะธqc˜››:oBxx8FŒ & 77&L@ฃF0u๊T|๔ัGจVญœiii่ึญฒณณกP(คk‹ช#_ๅส•1t่P :ัััะาา‚žž~๘แดn&&&ฐทท—ส๒ห/2dฒฒฒเๅๅ%.ฌO๙๒๒๒เ์์ ื๊่่`๚๕ฦ“'O „ภผy๓Pทn]๘๚๚b๖์ูาV"""ข็)Dio;%YKMM…ฑฑ1๎ญSR?ขT4z.yฃ๕ษANNv๏ ???hkk—uwdใQ~p,สŽGูหNII‘‘Q‘ๅ๘—Jˆˆˆˆd๎อ๊yว๖ํ‡ฏพ๚JmZวŽ1w๎2๊QลSกa‡ะกC‡ฒ๎Q…ฦSฦDDDD2ว@HDDD$s „DDDD2ว@HDDD$s „DDDD2ว@HDDD$s „DDDD2ว@HDDD$s „DDDD2ว@HDDD$s๚Oืัปงัq4LMหบDDD๔๑!‘ฬ1ษ!‘ฬ1ษo*ก—ขŠ *#ฝbหh8พฃั›ภ#„DDDD2ว@HDDD$s „DDDD2ว@HDDD$s „DDDD2ว@HDDD$s „DDDD2ว@HDDD$s „DDDD2ว@HDDD$s „DDDD2ว@HDDD$s „DDDD2ว@HDDD$s๏U LNNฦส•+หบลฒฐฐxฅๅ"""P`zbb"š5k๖บ""""“M ฬหห{ง}y๘๑;mฏ8)))B”u7ˆˆˆจœช00)) ^^^pqq““Nž<ฉ๖>!!SฆLA\\\\\0|ฌ^ฝ๐๑๑A`` ๎ฝ‹๎ปรธrๅ 44prrยเมƒกRฉญZตย๘๑ใแ๊๊ DEEกmถ๘เƒฐkืฎ}ฬออลถmะพ}{Œ=žžŽž={ยฮฮมมมRY•J…ัฃGรมมnnn8u๊`๕๊ี˜8qขTฮฦฦ™™™€‡ข]ปvhะ BBB mฬ˜1๐๐๐€‹‹ ๓Oภ๑ใวัจQ#ฬ;๗๎{รADDD๏‘ 7lุ___(•JDGGใศ‘#j๏ญญญ1kึ,8::BฉTbย„ €ุุX์น๋ืฏวธqใ‚จจ(,\ธŸ9 o฿พ8{๖,bccกงง')055ล๙๓็ัขE Œ=ปvํย™3gJenบ…iำฆมฮฮ;w๎ฤ7฿|ƒ๐๐pภาฅKakk‹๘๘xt๊ิ w๏lบ๛/โโโฐz๕j•ธ N:…ีซW#..๛๖ํCTT”ฺ•+Wยึึgฯžลฑcว0qโDไไไ K—.8z๔(€g!7 ลถ•••…ิิTตฝŸดสบฅๅแแ   hhh OŸ>๐๖๖V{oggW่r;v„กก!เ๐แรˆ—ๆijjbbb0u๊Tคฆฆ"99VVV่ฝ; K—.GGG( TชT ธy๓&เฬ™3hผ9ฦŽ‹จจ(ฉต๒ไILž<ะฝ{w่๋๋Kำ …BGGG่๋๋Kaฑ(จUซ Wฏ^ˆŒŒD=ค๙@||} sssX[[#&&ภณฃฯ5<~8’’’““ƒmถมหหKญ/พพพXพ|น(•J%เนs๐๐๐ภ๘๑ใแใใƒ .`๎นฐฑฑ)rฝtuuaddค๖"""ข๗S…9ey๓ๆAGGฆฆฆ „“““๔~ใฦ055…““œœœˆ๊ีซซีฑx๑bc้าฅศษษมG}GGGL™27†นน9\]]_น... ล“'Op๚๔iภจQฃ0pเ@ุฃeห–077๘๛๛ใุฑcptt„ŽŽVญZhัข `ggoooXYYI๕7mฺAAAธqใเ๎๎ŽฤฤDi๐แรqํฺ58;;CฅRกAƒุถm๔๕๕Ž๚๕๋ฟ๒บั๛K!๘<*…ิิTใฑ0˜้[Vร9๐๕Jพrrrฐ{๗n๘๙๙A[[ปฌป#{๒ƒcQพp<ส^๗wJJJฑg๛*ฬ)c""""z;‰ˆˆˆdށˆˆˆHๆ‰ˆˆˆdށˆˆˆHๆ‰ˆˆˆdށˆˆˆHๆ‰ˆˆˆdށˆˆˆHๆ‰ˆˆˆdށˆˆˆHๆ‰ˆˆˆdށˆˆˆHๆ‰ˆˆˆdNซฌ;@‹†]oh˜š–u7ˆˆˆ่ โB""""™c $"""’9B""""™c $"""’9B""""™c $"""’9B""""™c $"""’9B""""™c $"""’9B""""™c $"""’9B""""™c $"""’9B""""™ำ*๋Pล „คฅฅA[[ปŒ{C999ศศศ@jj*วฃเx”‹๒…ใQ๖RSS฿๗xQฉT>|ฐตต-ใžัหJKKƒฑฑq‘๓ฉTชVญ ธy๓fฑ;ิ๋๒๐๐ภูณg฿Z๏Kฉฉฉฐฒฒยญ[ท`dd๔ึฺyถีปhใ}ŽE้ฝ๊]ดม๑(๛6„HKKCอš5‹-ว@Hฅขก๑์rSccใท๚Kญฉฉ๙V๋Ÿฺ###ŽG9iจ๘ใมฑ(ฝ๗e[q<ไัFiไ๐ฆ*WFล6ส‘๗e[q<สG๏ชwแ}ูV๙ตQ…(้*C"<;์ollŒ”””w๒ฟI*วฃ|แx”‹๒…ใQq๐!•Šฎฎ.BBB ซซ[ึ]!p<สŽG๙มฑ(_8ษษ!‘ฬ1ษ!•h้าฅฐฑฑAฅJ•ะดiSœ9sฆฌป๔^š3g<<<`hh333๔่ั—/_V+“™™‰QฃFมิิ่ป7๎ฝซVๆๆอ›่น3๔๕๕aff† & 77๗]ฎส{g๎นP(;vฌ4c๑n๗฿๘๐รajj ===8::"**Jš/„ภดiำPฃF ่้้มืืWฏ^UซใัฃG8p ŒŒŒ`bb‚!C†เษ“'๏zU*ผผผ<|๕ืฐตต…žž๊ิฉƒoฟVํOฃq<* ATŒ7 ๑ห/ฟˆ‹/Šaร† q๗๎ฒ๎ฺ{งC‡bีชUโย… BฉT ???Qปvm๑ไษฉLppฐฐฒฒ‡QQQขYณfขy๓ๆา\แเเ |}}ล๙๓็ล๎ปEตjีฤคI“สb• gฮœ666ยษษIŒ3Fšฮฑxw=z$ฌญญEPP8}๚ดธvํšุทoŸ๘๛๏ฟฅ2s็ฮฦฦฦโ?111ข[ทnยึึV<}๚T*ำฑcGแ์์,N:%Ž?.๊ึญ+๚๗๏_ซTกอš5K˜ššŠ;wŠ๋ืฏ‹-[ถ๑ใ?Je8!ซI“&bิจQา๛ผผsLž<gฯžลgŸ} 4Hฺž…m๏็วรฬฬLmพ––ชVญส๑xI'NDjj*6lMMMไๅๅaึฌY8p p<*(BขrhิจQธpแ"##หบ+ฒt๋ึ-Œ3@ฅJ•สบ;ฒงRฉเ๎๎Žูณg\]]qแย„††bะ Ae;๙ูผy3ยรรฑ~zุCฉTb์ุฑจYณ&วฃใ)c*Rตjี ฉฉYเฮษปw๏ยยยขŒz๕=z4v๎‰#GŽภาาRšnaa์์l$''ซ•~<,,, ฏyT:ัััธw๏7n ---hiiแ่ัฃ๘้งŸ ฅฅsssŽล;TฃF ุููฉMkิจnผ เถgqŸUธw๏žฺ\ [[[ต๙nnnะึึVห—/ใๆอ›าxxzz"..Nํƒ๖ภ022*๐…JEkถ-โโโ T*ฅ—ปป;(ฬฑxwผผผ <‚้ส•+ฐถถฺฺุยยยBm|(๚๗๏/ „‘‘‘EQตjUTญZ…ึs๓ๆM$%%มััQšfccƒ๙๓็ฃQฃF044ฤดiำp๙๒eธปปรุุมมมRY•J…XYYกF๘์ณฯ••Xฝz5Zทnแร‡รุุซVญยฃG0`ภ˜™™แƒ>ภš5kŠ\ว็O๎น 4ŽšnธฑศๅNž<‰๚๕๋ริิ_|๑T*•4o้าฅจWฏชUซ†Aƒ!==yyy่ิฉฎ]ป`อš5วท฿~ iใโโะฒeKTฉRnnnˆŠŠ’๊V(Xฒd lmmับuk@ห–-q่ะ!Y…aขRDDคฦฺฺZDDDKKKq๏=q๏=aii)"##…ตตตZนใว !„HII]ปv!!!าิิTaaa!๒๒๒ฤ๒ๅหEืฎ]EFF†ศษษวŽ+ดํ;w 77ท๑๑๑>—.]บบบข]ปvโๆอ›โ๖ํย\>|X!ฤŠ+„ธu๋–x๐เhผนิงUซV MMMฑjี*‘——'222„ŸŸŸ?~ผศฬฬ—.]5jิ111En—๕577‘‘‘B!n฿พ-.^ผXไ2...โ๖ํโฟvvvbๅส•B!6o,Dbbขศศศ๛๗ใวBqไศQงNตบ $พ๖[้}ZZšจYณฆุบuซศออฟปฐฒฒOŸ>B@t๋ึMคคคˆŒŒ i9###‘Ph‰ไŠG‰ˆ กฉฉ lฺด ›6mB๏ฝกฉฉY \งN`bb‚*Uชเส•+1b„4๏ะกC๐๑๑††ดตต๑๐แC\ปv ZZZE!LNN.๔ฺมฯ>๛ UซVEร† แ์์ŒŽ;ยสส ๐๑๑ALL `ใฦ๘โ‹/`ii SSSL›6 6l๊ฉSง‚‚‚ กก””DDD`ฮœ9ะีีEร† 1`ภlถญฤํฃญญK—.แษ“'ฐฐฐ€]‘eวŒ ิฌYใฦรฆM›<;5>iา$X[[COO“'Oฦึญ[Kl;฿ฮ;aoo/M=`ff†SงNIe&Nœ###่้้Iำ ‘’’R๊vˆไ€ˆจฤ๚๕๋^ไ้โ={๖ 99่ัฃ:w๎,อ{๚มภภ@ดm={๖„ตต5ๆฬ™Sh}ฦฦฦ…]lff&ฌงงWเ}2IIIจ]ปถ4ฯฺฺIIIา{KKK้็›7o"33ีซW‡‰‰ LLL†;w๎ป]`๋ึญ๘๗฿aii‰Ž;8U<+++ตŸo฿พ-ต?|๘pฉํ-Zเ๛%ถ|=*-obb‚K—.นพ๙าาา`ll\๊vˆไ€ˆจ๎๎๎x๔่?~ bห๊๊๊"00ัััx๐เ€g7œt่ะ ฃฃƒoพ๙Wฎ\มพ}๛๐ใ?"""ข@=ŽŽŽ๘็Ÿ^นฯ5kึฤอ›7ฅ๗7oDอš5ฅ๗ …B๚นVญZ000ภใว‘œœŒไไdคฅฅ!44ดฤvš6mŠ]ปvแ๎ปpvvV;2๚ข[ทnฉœsNญZตฐfอฉํไไd้ฮ๎็๛YX฿๓—๏ะกCๅ Pไ2w๎Ann.๊ิฉSโ:ษ !Q1ถmVชSจ999Xฟ~=ฬฬฬ`jjŠ„„Iแ็ศ‘#ธx๑"T*ŒŒŒ ฅฅU่)hkkkXXX ..๎•๚ฏ_?,Xฐ๗=z„oฟ…–ญUซ<==1u๊Tddd 77็ฮC|||ฑmdggc๚๕HMM…ถถ6 ]—|‹/ฦปwq๛๖m,Zด}๛๖|๑ว˜={ถ€o฿พฝ{๗xvD๔๛j133Cbbข๔พK—.8<๘ใไๆๆโ้ำงุปwoฑงƒ;†6mฺ@KKซุu$’B"ขbุูู{}\๛๖ํa``€jีชแศ‘#๘ใ? P( ฺื}๒ไI„‡‡#%%ๅตฏ๛uKLLฤภQฏ^=|๗Xฑbลk[๗๓พ‡_†<*wปvํยดiำสป ขr๕ผ ๆฬ™ƒC‡กiำฆะีี}f{lุฐกะ๔mถ=O™๔‚2331mฺดr yำฆM{๎๗่ั#|๙็ฏฆจWไ๐แระh4Xดhˆ>}๚ผถu3ไ‘ledd”w •Ž=zกe9‚{๗๎a๗๎000xf๛N:๒ึฏ_ฮ;ฟP U‰FฃAVVVy—๑ส=น†††ฅ๚DEr๗๎]NำVu y๔J `ooO>๙ูููEึดn:4mฺา6nธžžž055…™™\]] ฝŸ”””„ZตjฆM›&๑“—ฉ”ๆต[œล‹ฃiำฆ066F๕๊ีแๅๅ…๕๋ืxผฟ'L˜prr’ึ]ฐKฺฮงk,ํ{x7`๔่ัจYณ&LMMัตkW๓ฯ?…๚LOOวุฑcฅ฿VVVhถ-ฮž=+ต)ํ๏ GGGL:PซVญg^Sx๗๎] <ตkื†กก!ฑz๕๊BํๆฯŸๆอ›ราาFFF๐๔๔,t๔‹ผ‡_ A๔Šœ:uJ่่่ˆqใฦIำ‚‚‚„‘‘‘ธt้’Bˆ“'OŠถm bอš5าC!4hีช•P(bศ!bษ’%ขK—.€;vฌึบผฝฝลภล7฿|#/^,ฺตk'ˆ%K–<ณฮCCCั A"–,Y"y็@|๑ลZm‡ "tuuละกCEDD„๘๔ำOEตjี„ทททศษษ‘ฺ988ˆF‰ฺตk‹I“&‰%K–ˆ7฿|S( q๎9ฉ]zzบpqq:::b่ะกbูฒeโห/ฟ"66V!DTT” <<<„งงง๘ๆ›oDxxธ066oฝ๕–V}ยึึVุ‹ &ˆล‹ gggกฃฃ#6n(ฌญญExxธXธpกจSงŽ077iiiา๒[ถl๎๎๎bส”)bลŠbาคIขz๕๊ยมมAdddHํ"##แ์์,ฤโล‹ล์ูณ…BL:U๗ŸBˆ?Sิญ[WจT*iฺ“5u๊ิgŽัพ}๛„พพพpppSงNห–-ฃGmฺด‘ฺ์฿ฟ_่๊๊І Šนs็Šiำฆ‰š5kŠ๊ีซ‹kืฎIํ ๊๓๐๐๏พ๛ฎ๘๎ป๏ฤ!C๑ษ'ŸHํฆOŸ.”Jฅธ}๛ถV-GŽฤ–-[^่uQฟ~}Qฝzu๑ูgŸ‰ˆˆ%ึฌY# „ŸŸŸ๔8y๒ไ3๗Kjีช‰9ฏ`{๏ฝ+์์์ด^ำ .ๆๆๆ"++K#GŽ|ๆบwwwacc#พ๒KฑpแB๑ฦocccq๏=ฉ€„ƒƒCฑ๕<ง›››ฐททณgฯณgฯๆๆๆขnบbษ’%ยููY|๕ืโ๓ฯ?๚๚๚"00Pk๙‚ืฝ•••5j”๘๖o…ฏฏฏ ๗ฟIํ๒๓๓Eปvํ„ฑฑฑ;vฌXพ|น5j”ะีีบu+TS“&MDญZตฤดiำฤาฅKEllฌุทoŸ Zทn-–.]*–.]*F%z๗๎]์>{๘๐กXถl™ z๔่!q\\œข๔ฏขฌXฑBฝz๕ห—/‹-ƒฃGB'๚๕๋'ˆoพ๙FZ๗ร‡Kฮ‚yOพ?K๛Bˆ>}๚"$$D,]บT๔้ำGธปป๊388X่๋๋‹๑ใว‹•+WŠ9sๆˆ.]บˆตkืJmJ๛ปb๛๖ํขG€Xถl™ึ>RฬฬLัคIกงง'ฦ'พ๖[แ็็'ˆ… j๕kgg'FŒ!–,Y",X z๋-@์ุฑCj๓ฒ๏แW…!^ฉ‰' ฅR)Ž=*ถlูRไhไศ‘…~้ !ฤฯ?,ˆ3fhM๏ีซ—P(โฯ?”ฆeffZพ}๛๖โ7xf ฤ‡~(Mำh4ขs็ฮB___ &วŽฤบu๋ด–฿ณgOก้€8z๔จ4ํ๎ปยภภ@|๔ัGาด)Sฆbถm…๊าh4Bˆ๛ืคI‘-อ_ดh‘ คi€Xฟ~ฝ4-11QJฅRœ:uJšพw๏^@DFFJำŠฺฟป ~๑GiZAศ๓๕๕yyyZํŸ y/^ถถถย[ฟ_ซ]iq็ๅๅ '''แเเ B•J%ฌฌฌDrrฒ4-..N(•J๑๛๏ชoะ AZ}๕่ัCXZZJฯ/]บ$ˆล‹kต1b„011‘๖ี‹ผ.๖์ูSh;K jฯRš๗฿‰?Xิฏ__š็ํํ-BCC…โนBžพพพึ๛/..ฎะพzg`` h–/_.kkkญˆLœ8Qะj[๐บ๚๋ฏฅiูููาkข hฏYณF(•Jq์ุ1ญ๕GDDโฤ‰Z5)•JqyญถcฦŒfff…^๗ฯ๒฿๛z/ํkท(บuM›6-ฑอผy๓ ํณลmgมผขBณ;111Eg|เภ…๚477ๆ๋๎yC๘๔2 <๒.\(h…ษœœแใใ#LLLด^sO^ฬษษ...ขUซVZำ_ๆ=ช๐t-ฝRแแแhฺด) €#F ฃG.ีฒปvํ‚ŽŽNก๖}๔„ุฝ{ท4อศศH๚955๗๎C@@๚๋/คฆฆ–j}O~ฒฐเFNNŽtJsห–-077Gถmq๏=้แ้้ DEEi๕็์์ ???้yญZตะจQ#๕ื_าดŸ~๚ ๎๎๎่ัฃGกzž>ฅ }}}้yA฿O๖&&& ’ž7jิhาค š5k&M/๘๙ษๅŸนนนHNNF๚๕aaaกu๚คภะกCกฃฃSh:œ;wpttฤPฝzuญ๙-[ถ„โ™ŸฌŽลตkื0v์ุBืู์ฃทoCญVcเภจQฃ†4฿ออ mถลฎ]ป ๕ฆ๕ฯฯษษษHKK4lุ*• ›6m’ฺไ็็c๋ึญ่าฅ‹ดฏž๗uแไไ„๖ํ—ธอฏJpp0๓Oœ9sF๚๗yNีhำฆ ๊ีซ'=wssƒ™™Yกืโ๓hบตึ้‚ืgฯž=ajjZh๚ำ๋าีีลฐaรค็๚๚๚6l๎ฝ‹˜˜วชI“&hธฑึXตjี U@@œตฆYXX ##๛๗๏แm}า‹ผvŸฎ็๏ฟฦ™3g^ธ†ขถณ$ฯz๏œ๎1b„Vป?ฐP_8}๚4nบU์๚J๛ปโy์ฺต ึึึ่ืฏŸ4MOOฃGฦร‡qไศi๚“ฟ677‡ฝฝ}กiO/่ั#L™2EบฒfอšจUซRRRŠNNNลึฅK˜ššb๏ฝ033+ลํ๊ีซPโ~*x-4jิจะผ&Mšเฝ{…>Ršูทo_œ8q๓€วŸป{๗.๚๖ํ+ตyืEI๛์U๓๐๐@ใฦฑ~zฌ[ทึึึRภyฅymฟlŸฏฯาผnภึึีชUำšVิ{๘๙๓…ฦฉ ]iฦjฤˆhุฐ!:v์;;; 4จะ๕ˆฯใE^ปO๚๔ำOabb‚ทz 4ภศ‘#qโฤ‰็ชแy_“ฯz๏\ฟ~JฅฒPฟ๕๋ื/ิืนsq๎9ุใญทBxx๘Kgกดฎ_ฟŽ @ฉิŽAE}ูฑc~๛mขFจUซ–-[V๊ๅฉr}l†*ฅฝ{๗ฒฒฒpๅส•2#w๕๊Uดn7ฦ‚ `oo}}}์ฺต ฿|๓ 4M™ฌGฃัภสส ๋ึญ+r~ม…ีŠ;ย%ž๚0Gi•ถฟโฺ•f๙?‘‘‘;v,|||`nn…B   "๗ใ“ร}Zฯž=ฑz๕jฌ[ทN๋KEQšัทo_Lœ8[ถlมุฑcฑy๓f˜››ฃC‡R›็}]”ดฯ^‡เเ`,[ถ ฆฆฆ่ทoก?rฅQš}Wๆ๒๓๓Ÿซฯฒ|i4ธบบbม‚Eฮ:P5VVVVPซีุปw/v๏ปw#22๏ฟ~‘ํฟjMš4มฅK—ฐcว์ูณ?๔พ๛๎;L™2ฅิทฆzืdYŽIŸ>}เ็็‡ํทc฿พ}˜7oๆฬ™ƒmถกcวŽฯ_Y;v์บvํ |๗wฐฑฑžž"##ฅทTd y๔Jลววc๚๔้ …Zญฦ!C o(ƒƒ8€๔๔tญฃyŸtpp๖oศฮฮฦฏฟช๕?ฬงOฝ”Dฃัเฏฟ’G—/_้Rฝz๕pเภดhัขฬPืซW็ฮ+“พสยึญ[1`ภ|๕ืาดฌฌฌบ‰๊ผy๓ ซซ‹#Fภิิ๔…N N ž;wmฺด)ฒMมkแาฅK…ๆ%&&ขfอš…Ž๒”†““z๋-lฺด ฃFยถmะฝ{wญ[–”ี๋โy>)๛2‚ƒƒ1eสพ}kึฌye๋ฉ^ฝz‘ฏ›'”ฅ[ทn!##Ckœ‹zวลลกu๋ึ/ตฟ๕๕๕ัฅKt้า#FŒภ๒ๅห๑ล_yด (๙๗๐rฏjีชกo฿พ่ท/rrr๐๎ป๏bๆฬ™˜8q" _kซ€ƒƒ4 ฎ]ป† HำŸพ@Œ1#FŒภปw๑ๆ›obๆฬ™ฏ4ไ988 >>F๋?:O}๙้งŸ`hhˆฝ{๗jฝ๏### ๕๙บ๗si๐t-ฝ2นนน8p lmmฑhั"ฌZต w๎มธqใดฺ{๚BงNŸŸ%K–hMๆ›o P(ค_ซ|๒‘ฉฉฉEพ K๒ไz„Xฒd ๔๔๔ะบukว™ŸŸ/ฟฒะฒyyy/„z๖์‰ธธ8l฿พฝะผ=โ๗2ttt ญw๑โลล})‰BกภŠ+ะซW/ 0ฟ๚ซึาแอ7฿„““.\Xhิjcc•J…ีซWkต9w๎๖ํ‡N:=w๚๖ํ‹SงNแ‡~ภฝ{๗ดNีe๗บจVญฺk๙F‚z๕๊aแย…˜5kz๋ญWบžิิTฤววKำn฿พ]ไkฝ,ไๅๅa๙๒ๅา๓œœ,_พตjี‚งง'€วc๕ฯ?เ๛๏ฟ/ดฃGJuฏวไไdญ็JฅnnnP่6,O266P๘๗หพvŸฎG__ฮฮฮB 77@๑ฟc_•‚kNฟ๛๎;ญ้‹/ึzžŸŸ_่”ง••lmmต๖ๅ๓nฉ4:u๊„W๋šผผ<,^ผ&&&๐๘wขBกะ๚˜””TไM_ื{๘y๐Hฝ23fฬ€Zญฦมƒajj 777L™2Ÿ9z๕๊%๒*๘}๚`ืฎ]า5`๑1u๊ิ/จV*•Xถlบt้•J…ะะPุุุ 11็ฯŸ—.˜7o:v์ <=ยโล‹annRl๗้ำ1>๘cิจQฃะัฤฒz]xzzโภXฐ`lmmแไไค๕A™ง๖oˆ‹‹๐๘?T๑๑๑˜1c kืฎR๐(ส˜1cJณ้/%((Ÿ~๚)z๔่ัฃG#33ห–-Cร† _ษ๋ถถถ˜3g’’’ะฐaClฺด jต+Vฌ€žž $$›7oFXXขขขะขE ไ็็#11›7o–๎_X’!C†เ๛hีช์์์p๚u,^ผ*•Jบžซ(FFFpvvฦฆM›ะฐaCิจQ...pqqyฉืnปvํ`mm-Z vํฺธx๑"–,Y‚ฮ;Kg@ ~วNž<AAAะำำC—.]^่่vixzzขgฯžXธp!’““๑๖oใศ‘#า‘ี‚#^้้้ฐณณCฏ^ฝเ๎๎8pgฮœั:›Pฺ฿ฯใƒ>ภ๒ๅห1pเ@ฤฤฤภัั[ทnล‰'ฐpแBi฿u๎ ,@‡Œปw๏b้าฅจ_ฟพึ` ถ๛yรฏล๋@/U111BWWW๋ถ$B<พ†ทททฐตต•n‡‘——'>๐CQซV-กP(ดnฏžž.ฦ'lmm…žžžhะ ˜7ožึญ3„โื_nnnยะะP8::Š9sๆˆ~๘กุ๙DบuKjใเเ :w๎\hูง?ฦ/„ษษษbิจQขN:B___ุูู‰H๗+ธ}ภ“๗eBˆkืฎบJ@@@‘ทS(ฎ๗ยWd‡†Bกภแร‡_บฏ–-[ยลลๅๅ‹ช~๛m|๒ษ'ๅ]ัsaศ#ขrตjี*( ( ?~ผะ|!์ํํกP(๐ฮ;๏hอ+XฎเQญZ58;;cฦŒศฬฬ,r} P(๘ใ?^บ๖้ำงฃYณfhัขลK๗Eฅ๓ีW_๙•R'OžDxx๘+๛ZฉO?K—.ลฟ๛J๚'z๒ˆจB044ฤ๚๕๋ M?rไ๛oญ/RถmฑfอฌYณ_5<<<๐ล_`ภ€Eถ฿นs'ฌฌฌเํํR๕๗฿Xฝz5ยยย^ชŸŠฦ฿฿=ชฐ๗2+)ไM›6ํ•…ผnบมฬฬฌะ๗ฑUd3U:uย–-[๐ํท฿jba๚๕๐๔๔,๖หษ6lˆ๛Kฯรยย““ƒmถ!++ †††Zํwํฺ…Ž;J฿Ÿ๙ขึฎ] ]]]t้าๅฅ๚)K/}คJฅฒะ>ซส233all ฅR‰^ฝzแวฤดiำ^๚๕C๔:๐HU๚๕Crr2๖๏฿/Mหษษมึญ[\}Y[[CกPบWJJ Nž<‰ฮ;Kำ6nOOO˜ššยฬฬ ฎฎฎXดhั3ื๑๓ฯ?ฃYณf011ัš^pZ||<`llŒ๚๕๋c๋ึญ™lึฌŒŒŒะจQ#8p P฿ฑฑฑุ่ฑ#ฬฬฬ`bb‚ึญ[ใิฉSZm Ns9r#FŒ€••์์์ค๙ปw๏†ŸŸชUซSSSt๎็ฯŸๆvuM•+WะณgOX[[ระะvvv Bjj๊3๛€˜˜4oFFFprrBDDDก6ููู˜:u*๊ืฏุใ“O>AvvถิFกP ##ซWฏ–Nั8แแแ˜0aภษษIš—””$-ปvํZxzzยศศ5jิ@PPnผฉUCมุลฤฤภ฿฿ฦฦฦ˜4i’4ฟmถธ~:ิjuฉถ›จผ1ไQ…เ่่lุฐAšถ{๗nคฆฆ"((จุๅฒฒฒp๏=ปwืฏ_ว๚๕๋ฑz๕j y{๗๎…Bก@ปvํ<พakฟ~Pฝzuฬ™3ณgฯFห–-Ÿ๙AŠ\œ9soพ๙f‘๓}บะบFŒ .`ส”)๘์ณฯkึฌA็ฮabb‚9sๆเ‹/พภ… เ๋๋ซ|J#''ํทวฉSง๐แ‡b้าฅ๘เƒ๐ื_•๊ิ่ƒะฉS'xzzb๎นฐณณร๐แร๑ร?Hm4 บvํŠ๙๓็ฃK—.Xผx1บw๏Žoพ๙}๛๖•ฺญYณ๐๓๓“Nั6 ๏พ๛.๚๕๋๘ๆ›oคyตjีฬœ9๏ฟ>4h€ `์ุฑ8x๐ mCrr2:v์•J…… "00Pš็้้ ฒ๚  ษœ "*G‘‘‘€8sๆŒXฒd‰055™™™B!z๗๎-…B888ˆฮ;k-  ศG๗๎EVVVกu…„„ˆ€€้๙˜1c„™™™ศหห{ฎš๓O@,^ผธะผ€€@ฌ_ฟ^š–˜˜(ฅR)N:%M฿ปwฏ "##ฅiปw๚๚๚โ๊ีซาด[ทn SSSแ๏๏/M+ุoพพพZ๕งงง 1t่Pญบ๗_ann^h๚ำขขข%„"66V[ถl)yงก`_|๕ืาด์์lกRฉ„•••ศษษBฑfอกT*ลฑcวด–ˆˆฤ‰'คiีชU (ดฎy๓ๆ โฺตkZำ“’’„ŽŽŽ˜9sฆึ๔„„กซซซ5ฝ ˆˆˆbทI___ >™NT๐HU}๚๔มฃGฐcวคงงcวŽฯ๘c์ุฑC๚`ฤ™3g๐฿i…ผ#F`๓ๆอุ่ฑ#๊ิฉƒvํฺกOŸ>่ะกCฉ๊ล|+ค]ก ๓อออ }1{A€z๐เ€วŸุอฬฬDฃF ๕ูคIh4ผyM›6•ฆ;99iตปrๅ H้ifff%mR!NNN?~<,X€u๋ึมฯฯ]ปvEฅ๚Kbkk[่ร 6$%%แํท฿ฦ•+Wp๑โE้๔๊ำ๎ฝ๛\5?้ส•+B AƒEฮืำำำz^งN่๋๋Ÿ‚บ Jƒ!ˆ*”เเ` :๛/:v์ ‹็๎ฃu๋ึ€ฃGJ!oืฎ]ptt„ณณณิฮสส jต{๗๎ล๎ปฑ{๗nDFFโ๗฿ว๊ีซ‹ํ฿าาภ…ณง=ydญ4ำ‹ ‹ฅaddค๕\ฃัx|šตตuก๖/๒ๅ๐_5ˆ_~๙๛๖ํร่ัฃ1kึ,œ:uJ๋ร/Jฃัภีี ,(rำแ๘y๛V(ุฝ{w‘๛้ฮ<ฝ?Ÿ–’’‚š5kพp=DฏCU(=z๔ภฐaรp๊ิ)lฺด้…๚ศหห<|๘Pšถs็Nt๊ิฉP[}}}t้า]บtFฃมˆ#ฐ|๙r|๑ลจ_ฟ~‘ืญ[FFFธvํฺ ีWœZตjมุุ—.]*4/11Jฅ๒™ง^ฝzุ'pพ,WWWธบบโ๓ฯ?วษ“'ัขE DDD`ฦŒ%.w๋ึญBทvน|๙2€วถ)จ9..ญ[ท~ๆQฒโๆ7ฝ^ฝzBภษษI:‚๘ข๙็ไไไ I“&/ีั๋ยk๒ˆจB111มฒeหย๗ ๛ํท฿๎๎๎€;w๎เ์ูณZงjปถฎ€Rฉ„››hบใizzz๐๒๒Btt๔ ีWดkืฟ๒‹ึง`๏นƒ๕๋ืรืื๗™ง[ทo333|๕ีWศออ-4ฟ{ฎšาาาคะ\ภีีJฅฒฤ}T //ห—/—ž็ไไ`๙๒ๅจUซ–๔iี>}๚เŸม๗฿_h๙G!##Cz^ญZต"?ี["Ÿž๗๎ป๏BGGำฆM+tฤTQ่5P’‚k›7o^๊eˆสไQ…SทUๅ๒ๅหXปv-€ว7ฎ=u๊Vฏ^๚๕๋#$$ภใSต†††Zทร€!C†เ๛hีช์์์p๚u,^ผ*•๊™Gkบu๋†ษ“'#--ํนฏs+ษŒ3ฐ~๘๚๚bฤˆะีีล๒ๅห‘นs็>sy333,[ถ !!!x๓อ7„Zตjแฦุนs'Zดh%K–”บžC‡aิจQ่ป76lˆผผ<ฌYณ:::ู่ณ็3—ทตตลœ9s””„† bำฆMPซีXฑb…t=\HH6oŒฐฐ0DEEกE‹ศฯฯGbb"6oŒฝ{๗ยหห ภใ˜8p ,€ญญ-œœœะฌY3)0Nž<AAAะำำC—.]Pฏ^=ฬ˜1'NDRRบw๏SSS\ปv ทoว|€?ธT๛bจ[ท.<<ดkืN๚บ'*‹Š…ใQฑp<ส_ZZ์ํํฅฟใลaศซย Nัššš–้woา‹ษออ…ฑฑ1ฬฬฬ๘‹ณœq,*ŽGลย๑จ8žuฉ?xADDD$C yDDDD2ฤGDDD$C yDDDD2ฤGDDD$C yDDDD2ฤGDDD$C yDDDD2ฤGDDD$C yDDDD2ฤGDDD$C yDDDD2ฤGDDD$C yDDDD2ค[P๙kฟ๐4๚&ๅ]F•งฏ˜่๘อ=Šขผหฉา8 วฃbแx<ู/Z•w x$ˆˆˆH–๒ˆˆˆˆdˆ!ˆˆˆH†๒ˆˆˆˆdˆ!ˆˆˆH†๒ˆˆˆˆdˆ!ˆˆˆH†๒ˆˆˆˆdˆ!ˆˆˆH†๒ˆˆˆˆdˆ!ˆˆˆH†๒ˆˆˆˆdˆ!ˆˆˆH†๒ˆˆˆˆdHV!ฏWฏ^x๛ํทKีถOŸ>pwwวบu๋0WVSVVZตjDEEมฺฺ๚…๚Qซี8pเ@WGDDDrฅ[”•๛๗CGGงTmo฿พห—/#..`mm?ธL๋y๐เชWฏŽุุX˜™™แะกC/ีŸZญFbb"ฺดiHII……ETJDDDrT)ไ}๗puu…ปป;ฆNŠ\|๕ีW๘๓ฯKต|—.]pๅสจT*๔์ูษษษPฉT7n4 FxzzโิฉS€ซWฏยืืoพ๙&|||p๑โลBๆๅๅaถmhืฎF…””„„„เศ‘#PฉTHNN–ฺ>ฯz๒๓๓1eสDFFBฅR!** 6l€ปป;–.]Šดดด2ุซDDD$'•๎H^||<–.]Š'Nภฬฬ ๗๏฿ว‚ 0`ภ˜ššjตˆˆ„……!::Xนr%ถnŠ   )XY[[CญV6oŒฟ 8w๎z๗๎ฤฤDุุุเเมƒ000ภI“&a๛๖ํ€›7oโ๛๏ฟวฦแ๋๋‹้ำงKงWฎ\‰ˆˆlธQซถญ[ท>ืzฆOŸŽฤฤDฬž=ˆŽ;bๅส•๐๒๒B@@ยยยเ้้Y์พหฮฮFvvถ๔œแˆˆHพ*]ศ;|๘0‚‚‚`ffx๔่๖ํ‡เ๚๕๋ZmรยยคŸฝผผฐrๅสg๖๒ไICกPภีีฦฦฦธs็๔๕๕1rไHฤววCGGYYY€?๘อ›7วุฑc-ีUึ๋)Šฃฃ#fฬ˜๐๐pฌ]ป˜>}:>๚่ฃ"ฯš5 ำฆM+U}DDDTนUสำตORซีธpแœœœเ๋๋‹ุุXtํฺตฬืณpแB4jิ 8x๐ tDฬออ +Vฌภ๑ใวัณgOlผ999eพžโ;v กกก˜3g&Mš„๛vโฤ‰HMM•7o|แ:‰ˆˆจbซt!ฏUซVุธqฃtชัววทo฿FRRŽ?๚๋ฏฯีงRฉ„Fฃ4o[ถl็ฯŸวฃGPปvmคฅฅมฺฺ …ซVญ’–544ฤ Aƒp๊ิ)ฬ›7‡Bใฦ๑๕ื_—ธฮ็]ฉฉ)าำำฅ็๛๖ํƒ‹‹ ๆฯŸ~๚แ๙๓˜Ÿyฯz–.]Š[ทnกYณf่ท/ภหห กกก8}๚๔๓๏L"""’ตJ๒โใใฑt้Rœ8qqqq3f ,X€ภิิTซmDD„tJ4::C† !776lภฐaรฐbล ุ#,, “'O†ZญFฃFŠๅห—#!!๗๏฿ว† cฦŒม™3g๘๘xฤลล๒๓๓๑๋ฏฟขSงNx๗wQงNœ={๘์ณฯเๅๅ…ํทc๒ไษZu>ฯzFŽ [[[œ>}Z:"x้า%tํฺแแแ๐๒๒ย๒ๅห๑๐แรb๗avv6าาาดDDD$O•&ไ>|AAA033~๛ํ7ฉ_|๗wˆEƒ Œภภ@$%%[ห‹ฌ็ษ: 88>>>HKKร๎ปฑ}๛vt่ะกุuภฬฬL๋ADDD๒TiBž‹‹ F…ๆอ›ร฿~๛mฑm‹ป&o๚๔้่ัฃ\\\ฐbล Œ7>D—.]ฐfอxxxเาฅK๘แ‡0x๐`ธบบยAAAฐฐฐ@ฟ~ะคIผ๛๎ป๐๑๑)ดjีชaศ!8sๆ ๆฯŸ]]ท้yื3t่P๘๙๙IผFbb"ฆL™[[็งDDD$_ !„(๏"จ|คฅฅมรึ]ใ’ฏ!คWO๙hฅผŠCšzศวหˆ^วขbแxT,g[าฃษ+ํฟเ๏wjjj‰gๅ*อ‘<""""*=†<""""bศ#"""’!†<""""bศ#"""’!†<""""bศ#"""’!†<""""bศ#"""’!†<""""bศ#"""’!†<""""bศ#"""’!†<""""า-๏จอ์ะ–––ๅ]F•—››‹]ปฎb; งงWๅTi‹Š…ใQฑp<*ษ#"""’!†<""""bศ#"""’!^“Gุ๗ŒL3สป าไฃ€ตg”:ๅ]MีฦฑจX8 วฃTBฝ๋–w <’GDDD$G yDDDD2ฤGDDD$C yDDDD2ฤGDDD$C yDDDD2ฤGDDD$C yDDDD2ฤGDDD$C yDDDD2ฤGDDD$C yDDDD2ฤGDDD$C yDDDD2ฤGDDD$Cๅ๒z๕๊…ท฿~๛™ํ’’’ฐu๋ึ2[oxx8"""สฌฟาศสสBซVญเแแจจ(X[[ฟP?jต(ใ๊ˆˆˆHฎ^{ศฟ?tttJีถฌCหศฯฯฎ๖<ฤฦฦยฬฬ ฑฑฑ |แ๕?๒RRR^ธ/"""’ฟW๒พ{ธบบยSงNEnn.พ๚๊+|๙็ฅZ~๒ไษุปw/T*ึญ[‡๛;v„ซซ+ฺทo;w๎ปlbb"เ๎๎Žfอš!;;___ิซW๛๖ํ\ฝzพพพx๓อ7แใใƒ‹/VญZ…^ฝz! !!!ˆŠŠ‚ซซ+T*ZดhQhyyyุถmฺตk‡QฃF!%%!!!8rไT*’““ฅถฃF‚‹‹ <==q๊ิฉbkษฯฯว”)S •J…จจ(lุฐ๎๎๎Xบt)าาาJต?ณณณ‘––ฆ๕ """yา}Uวววc้าฅ8qโฬฬฬp},Xฐ €ฉฉฉV‚SจaaaˆŽŽFDDVฎ\‰™3g"""7nŒ1mถล๘๑ใ๑w฿a๒ไษXนre‘๋ มนsˆิิT่้้ฎ_ฟŽ#GŽ@ญVc๔่ัhืฎlllp๐เAเ?ภคI“ฐ}๛vi;bbb`jjŠ.]บเoฟ•๚,p๓ๆM|๗ุธq#|}}1}๚t้t๔ส•+ตถกภึญ[๑๗฿#!!็ฮC๏ฝ‘˜˜Xl-ำงOGbb"fฯž  DวŽฑrๅJxyy! aaa๐๔๔,vLfอš…iำฆ•z ‰ˆˆจ๒zeG๒>Œ   ˜™™=z„}๛๖aภ€…ฺ†……!,, เๅๅUlp;y๒$๚๗๏่฿ฟ?Nœ8Qdปดด4คงงKงGอออกT>ิฮ;CGGHJJ๐๘Whh(\\\0t่P\ธpA๊ซC‡R(mผ9>๙ไ,YฒD:2๘วภษษ ™™™ˆŽŽฦ?Pช๋ Ož<‰เเ`( ธบบยุุw๎)ฑ–ง9::bฦŒธpแZดh|๕ืลถŸ8q"RSSฅวอ›7ŸY'UNฏํš<ตZ .ภษษ พพพˆEืฎ]_ื๊%ฅR)]gทpแB4jิ 8x๐ เภุุX๚yโฤ‰๘๛๏๑เม4kึ ษษษpssรŠ+p๘q๔์ู›7oFNNฮ ืWR-E9v์BCC1gฮLš4I มลmป™™™ึƒˆˆˆไ้•…ผVญZaใฦาu_>>>ธ}๛6’’’p๘qxxxเื_-ฑSSSคงงKฯ›7oŽM›6ึฏ___฿"—333ƒนน9ขขขฉฉฉะh4ลฎ'-- ึึึP(XตjUฑํ๚๋/จT*|๑ลpttฤอ›7ahhˆAƒแิฉS˜7o:„ฦ—xDญ`[ถlู!ฮŸ?Gกvํฺลึ๒๔พุทo\\\0|๔๋ื็ฯŸวไษ“QปvํืKDDDUร+ y...5jš7owww|๛ํทลถˆˆฎห‹ŽŽฦ!Cnnnx๔่‘๔ม‹๐๐p์ฺต nnnุถmfฬ˜QlŸ?๘#ฆN wwwt่ะนนนลถ ร’%K Rฉด‚ิำ,X€ฆM›ยออ 7†ปปปึ|•J…ˆˆฤววCฅR๐๘62ตkื†ซซ+BBBYb-๘ใ?ค[ฑXZZbฯž=๘ๅ—_ะฉS'้t4(„ขผ‹ ๒‘––sss,=#S‹๒.‡4๙จ๑o<๎[ปสาfˆ^ŽEลย๑จX8ฅ๊]๗•๕]๐๗;55ตฤKฏx๘‡ˆˆˆH†*}ศ›9s&T*•ึฃข@™ˆˆˆจผผฒ๛ไฝ.“'Oฦไษ“หป """ข ฅาษ#"""ขย๒ˆˆˆˆdˆ!ˆˆˆH†๒ˆˆˆˆdˆ!ˆˆˆH†๒ˆˆˆˆdˆ!ˆˆˆH†๒ˆˆˆˆdˆ!ˆˆˆH†๒ˆˆˆˆdจาญฝผพ๎u`iiYeTyนนนุต+฿ดƒžž^y—Sฅq,*ŽGลย๑จVญZ…{๗๎•YMฅYgYดiš4i‚พ}๛"<</ิฯย… ‘——Wฦี‘\•[ศ+ฒy/#??ฟิmsss‘‘‘๘แ‡ฐaรlฺด้ฅึtศ{๐เมK๕GDDD๒Vf!๏ึญ[hัขT*๐ัG!!!*• ๓ๆอCFFz๔่ggg„……=ณฟํท#::=z๔€ŸŸ 22...pqqมŠ+J\~ฺดipqq››–/_.M3f š6mŠnบIมm๊ิฉ๐๖๖†‹‹ &Mš$ตuttฤฤ‰กRฉp๘q๔๏฿M›6…ซซ+ึฏ__hIII˜4i7nŒห—/c๖์ู8qโ๚๕๋‡™3gjต=sๆ ผผผเ๊๊Šแร‡—XหาฅKq๋ึ-4kึ }๛๖xyy!44งOŸ~ๆพ,ดด4ญษS™…ผ 6 M›6Pซีˆ‰‰มŒ3เ๊๊ ตZ &`้าฅprrย… ะฑcGนsGZVฅRI?2D w^^^ุพ};Ž;†ฟ3gฮฤ๑ใว๑๛๏ฟcม‚HJJ*ฒ–;vเฤ‰8{๖,โใใัปwoภ;wะณgOœ?‡๐8๘9s๑๑๑ˆG\\œิ—ฃฃ#ิj5LLLp๓ๆMœ? ่น3€วG๘~๕Wt๊ิ ๏พ๛.๊ิฉƒณgฯยรรŸ}๖™ด “'Oึช144ห—/GBB๎฿ฟ 6[หศ‘#akk‹ำงOKG/]บ„ฎ]ป"<<^^^Xพ|9>|Xโอš5 ๆๆๆารพ#KDDD•Q™… F ๘๛๛<<<คx๐เAx{{CฅRแฬ™3ธpแ‚ิWA@|ใ7pใฦ |๘แ‡8x๐ ฬออปwวุฑc1iา$œ={#GŽ”ๆ'%%žžž€๗{'Nœxf-OาีีE=ฐ{๗n๔ำO๘้งŸ`ccSโz'NœˆิิT้q๓ๆอQๅUf!ฯ฿฿G…••z๖์‰ƒjฃP(สju/ฤภภ@๚YฉT"??YYY?~>พพพ˜3gยรร<>:ึกC 4Ÿ~๚)ฎ\น๒ย๕=ซ–ง%''cแย…ฺ่ต+ชUซ†-[ถAAAHIIAzzบ4ฟy๓ๆาฉฦ;v 33๓™}šššJ}x{{ใเมƒHKKรร‡ฑ{๗n4kึฌศๅฺดiƒ~๘999€๛๗๏ปŽฌฌ,(•JTฏ^๗๏฿วoฟVdป{๗๎Aพ}๛b๒ไษาัG|๗wˆEƒ ŒภภภbO%(๊่่Hง…7lุ__฿kyr_@pp0|||––†ปwc๛๖ํ่ะกCฑ๋$""ขชEทฌ::|๘0ๆฮ }}}XZZbใฦˆŽŽ†››BBB0rไHผ๗{hฺด)QปvmiY•J%…ฆ!C† ,, ^^^8p BBBPซV-;v Ÿ~๚)š7o7n‹ฌฅSงNˆŽŽ†‡‡tuu1jิ( :ดศถ่ืฏš4i;;;๘๘๘ู๎๏ฟFhh(„ะีีล’%KดๆWซV C† ม!C]’wํ?€มƒ#;;-Zด@PPtttŠญe่ะก๐๓๓ƒปป;6mฺ„เเ`ฌ]ปJ%ouHDDD…)„ขผ‹ ๒‘––sss์ ฆๆีหปœ*O“Ÿ‡{‰'Pณq (uส์_๔8 วฃbแx”ŽO}‹Wึwม฿๏ิิิ/ฝโa """"ชิ<99ญ[ทึšVณfM8p œ*""""ช*uศณดดิบ =ฦำตDDDD2ฤGDDD$C yDDDD2ฤGDDD$C yDDDD2ฤGDDD$C yDDDD2ฤGDDD$C yDDDD2ฤGDDD$C•๚kอจlx:šมาาขผหจ๒rssฑ+x๋ s่้้•w9UวขbแxT,สƒG๒ˆˆˆˆdˆ!ˆˆˆH†๒ˆˆˆˆdˆืไ๎†5BŽ"็ตฎำfsฺk]QUร#yDDDD2ฤGDDD$C yDDDD2ฤGDDD$C yDDDD2ฤGDDD$C yDDDD2ฤGDDD$C yDDDD2ฤGDDD$C yDDDD2ฤGDDD$C yDDDD2ฤGDDD$C yDDDD2๔JB^JJ Vฎ\Y์|kk๋g๖ฑjี*ปwฏL๊IJJยึญ[‹Qโ—q๗๎]ผ๕ึ[๐๐๐ภฅK—๐๖oฟP?‡FtttWGDDDrU.!ฏ4^WศหฯฯGXXz๕๊U&๋*๐เมภมƒัผysฤฦฦยภภเ…๛{:ไ๔ODDDTฒ่ไึญ[่ป7222 ัhะ A$$$@ฅRแฝ๗รˆ#ะฟ\บt ฯ์o๛๖ํˆŽŽF=PณfM;v ‘‘‘๘๚๋ฏฃGฦ|Pไฒ 8p ๒๓๓กP(…ษ“'ใย… PฉT˜0aฎ\น‚๋ืฏ#11อ›7‡ฉฉ)ฌญญ†–-[ขYณf8pเ4 ~๕Wุใ๒ๅหFnn.กVซq๘๐aญugeeaำฆMXพ|9Zถl‰๛ใำO?Evv6~wlฺดIj›™™‰มƒในs033Cdd$6lˆ฿ใวGVVชWฏŽu๋ึ!//ะำำCDD6mฺ„ีซWใศ‘#6l๚๔้CCรg๎ื์์ldggKฯำาาžน UNer$oร† hำฆ ิj5bbb0cฦ ธบบBญVcย„ Xบt)œœœpแยt์ุw๎‘–UฉTาฯC† ‘ย——ถo฿ŽcวŽแ๏ฟฦฬ™3q๘q๛๏Xฐ`’’’ŠฌeลŠ5jิj5Nœ8ฬœ9ํท‡Zญฦ{๏ฝธz๕*Ž=*ว'™˜˜ &&๛๗GDD`์ุฑG\\tuตณ๑ฅK—0n8ธธธเ์ูณ๘๛๏๑ีW_มููำงOGhh(NŸ>ญตฬ’%KPซV-$$$`๒ไษ1b iำฆ8~8bcc†นs็ยaaa˜ณN"""ชœส$ไ๙๛๛ใ่ัฃฐฒฒBฯž=q๐เมBm EYฌ๊™‚ƒƒ๑ห/ฟ@WWRxzฺ“A๓iืฮ)•Jไ็็„Eถmถ-ๆฯŸu๋ึก_ฟ~ุตk4อ ื?eสผ๛๎ปHHHภš5kดNฏ>Mฃั`ืฎ]่ืฏึญ[‡๙๓็ฃmถ%n—™™™ึƒˆˆˆไฉLB๕๋ืaccƒแร‡#(()))HOO—ๆ7o\บmวŽศฬฬ|fŸฆฆฆR8x๐ าาา๐๐แC์ฝอš5+rนkืฎก~๚?~<p้า%ญพ^”ปป;vํฺุฒe‹4ฬฬ cฦŒA\\ฦ‡u๋ึกQฃFXปvm‰=นO๖์ูgggฏ“ณฑฑ๐๘ร'ž†ตkืขQฃFXทnฦธธ8Œ3†มˆˆˆ”Qศ;|๘0เแแcวŽaภ€pssƒ››ๆอ›‡‘#Gโฯ?DำฆMฑs็Nิฎ][Zถจk๒`เภ ŸŸ๊ิฉƒO?อ›7วoฟqใฦมััฑศZ6nจT*คงงฃC‡pssรฃG Rฉฐnบฺฦoพ๙_|๑T*>|Xd˜๒๗๗วบu๋p๊ิฉb๋+0jิ(บu nnn๘๒ห/ฑt้RภวŒ?oพ๙&LLLค๖]บtมš5kค[ฑ8::โิฉSXทn^h›ˆˆˆHพขธ๓ค%33FFFP(˜1c๒๒๒^eฝ”ดด4˜››ใB/KX(r^๋บm6๓“ฝOหออลฎ]ปะฉSงbฏฅืƒcQฑp<*ŽG๙+๘๛ššZโผ2น…JUp๚๔iŒ7๙๙๙prrย?X%ซา†ผไไdดnZkZอš5qเภWฒพ‚{ใU•6ไYZZ2tใ•|ญ•/†<""""bศ#"""’!†<""""bศ#"""’!†<""""bศ#"""’!†<""""bศ#"""’!†<""""ชด_kFeว*โ,--หป """*C<’GDDD$C yDDDD2ฤGDDD$C yDDDD2ฤ^4+…ฦ@SeH”ใ•w DDD•ไษC‘ 1ไษC‘ 1ไษC‘ 1ไษC‘ 1ไษC‘ 1ไษC‘ 1ไษC‘ 1ไhำฆM‰๓SRRฐrๅJ้yVVZตjDEE=ณoพ๙Mš4มธqใ0pเ@์ูณ็…๊œ? -GDDDUO•yBh48p ฤvO‡ผุุX˜™™!66E.“™™‰œœ@DD~w|๓อ7/U๏“!/''™™™/ีษ—lBญ[ทะขE จT*ธนน!11ู่ณ'š4i‚>๘Pปvm >ฎฎฎธy๓&ฌญญ‡F๛๖ํัฅK4hะ3gฮLž< PฉT˜7oBBBpไศจT*$''kีqy|๘แ‡hฺด)nผ‰+Wฎ fอš…๚022ย๛๏ฟ๗฿็ฮร๛๏ฟYณf!!!กศuฮš5 ำฆM+U}DDDTนษๆHžฟฟ?Ž= +++๔์ู„Bกๆ+ ้นฑฑqฑH?+•Jไ็็?s+Vฌ@ำฆMัปwoฬ˜1๓ฯ oว_…ๅห—ใ่ัฃˆG‹-J<:๗ฯ?เห/ฟD๏ฝแโโ‚+Vvโฤ‰HMM•7o|แ:‰ˆˆจb“Mศป~:lll0|๘p!==‰‰‰ˆ‡›7o†ฏฏ๏ ๕mjjŠ๔๔๔b็๛๘๘เวฤ‰'PญZ5ดo฿]ปvEjjjฑห4jิ/^ฤญ[ท——‡-[ถ E‹HOO‡ฉฉ)LLL””„#GŽHห(•J้บยิิTtํฺํท‡‰‰ Nž<‰>>>ลฎำภภfffZ"""’'ูœฎ=|๘0ๆฮ }}}XZZb๖์ูpssรดiำpy๘๛๛ฃG/ิทฅฅ%เๆๆ†x{{ูฎF7nฦ‡ร‡—ุง‘‘–.]ŠŽ;"??ฝz๕’Bhฝz๕ะธqcิซW-Zด–้฿ฟ?\]]ัฎ];„‡‡c๘๑hูฒๅ mษ›B!สปˆW!)) AAA8u๊Ty—Raฅฅฅมwฟ๒‡ฅฆผห‘(ว+๏สEnn.vํฺ…N:=๓:Pzต8 วฃbแx”ฟ‚ฟ฿ฉฉฉ%ž•“อ้Z""""๚?ฒ yŽŽŽ<ŠGDDDU–lCQUฦGDDD$C yDDDD2ฤGDDD$C yDDDD2ฤGDDD$C yDDDD2ฤGDDD$C yDDDD2ฤGDDD$C yDDDD2ฤGDDD$Cบๅ]•?ๅ ดด,๏2ˆˆˆจ ๑H‘ 1ไษC‘ ๑š<‚fฯdhŒห๎ฅ ์ฑคฬ๚"""ขร#yDDDD2ฤGDDD$C yDDDD2ฤGDDD$C yDDDD2ฤGDDD$C yDDDD2ฤGDDD$C yDDDD2ฤGDDD$C yDDDD2ฤGDDD$C yDDDD2ฤGDDD$C yDDDD2Tฆ!/%%+Wฎ,ห.+ฝM›6กI“&่ท/ยรร๑B,\ธyyye\ษีk y๙๙๙eนชR+๕ๆๆๆ"##๐ร?`ร† ุดiำK๕๙tศ{๐เมK๕GDDD๒V๊w๋ึ-ดhั*• nnn8y๒คึ๓ฤฤDLž< PฉT˜7oVญZ…^ฝz! !!!ธs็บu๋///๘๙๙แ๒ๅห€ˆˆx{{รออ กกกะh4€–-[โฃ>‚‡‡ผฝฝึญ[ใ7ภฮ;‹ญ5<<กกก๐๑๑ม'Ÿ|‚+Wฎ mถ๐๔๔D‡p็ฮ€ฃฃ#ฒฒฒซVญยgŸ}˜0a7n wwwฬ›7ŠํใIIII˜4i7nŒห—/c๖์ู8qโ๚๕๋‡™3gjต=sๆ ผผผเ๊๊Šแร‡Kat๊ิฉ๐๖๖†‹‹ &MšXบt)nบ…fอšกo฿พ///„††โ๔้ำฅBdgg#--M๋ADDD๒T๊ทaรดiำjต111ˆŠŠาz๎เเ€™3gยีีjต&LฤววcวŽXฟ~=ฦ‡ฉSง":: ,ภ๘๑ใ}๚๔ม™3g###๖oาz--- ___Œ5 ;w๎ฤฯ?Œ3f”X๏ีซWq๔่Q|๕ื9r$Vฎ\‰˜˜ <_~๙eฑห%''c๋ึญธpแโโโ๐ม@ฑ}ไ็็ใื_EงN๐๎ป๏ขN:8{๖,<<<๐ูgŸมหห ทoวไษ“ตึŠๅห—#!!๗๏฿ว† cฦŒ‘๖E||<โโโ0rไHฺฺุโ๔้ำามK—.กkืฎ‡——–/_އ–ธOfอšsss้aoo_b{"""ชผtKะ„RฉD๏ฝแ็็ง๕ููนศๅ:t่SSSภกC‡pแยižŽŽ ..Ÿ9าาา’’{{{t๋ึ ๐ฮ;๏\]]กP(`hhธqฃฤzปw๏===คงงใฤ‰R๙๙๙จWฏ^ฑห™››รฤฤC† A๗๎ันs็๛่ฝ;ฮŸ?พพพฯภใำฺžžž€๗{ปw๏Fq๐เAฬ;ูููธs็.\ธww๗B}่๊๊ขG่ัฃฎ_ฟŽกC‡โใ?Fzzzฑ๋8qขฌ --AˆˆHฆJ๒q๔่Q๖oู่ณ'–,YR่yQแษุุX๚YกPเ์ูณP*ต :ปw๏Fƒ 0|ญ#R๚๚๚ฅRฉ๕๓ณฎต+XฏFฃA:u Vซ ตััั‘N gggxžขฃฃฑw๏^ฌ[ทถmรขE‹ŠํcึฌY๘๎ป๏0hะ ๔่ัC† Aƒ Jฌญ8YYY?~š7o[[[@zz::w๎ wwwt๋ึMบ๖ฎธ> TซV C† ม™3g0|่๊–|๔‡~ภเมƒแ๊๊ sssมยย๚๕C“&M๐๎ป๏ยววGj?t่P๘๙๙IผFbb"ฆL™"ีNDDDT@!„ๅ]•ดด4˜››ใ๎ฺaฐ4.๕™๛gR๖XRf}U%นนนุตk:u๊==ฝ๒.งJใXT,Š…ใQ ~งฆฆยฬฬฌุvฦ """"*ปร7ๅ`๏ฝ๘๔ำOตฆu่ะณgฯ.งŠˆˆˆˆ*†J๒ฺทo๖ํ—wDDDDOืษC‘ 1ไษC‘ 1ไษC‘ 1ไษC‘ 1ไษC‘ U๊ฏ5ฃฒก์0JKห๒.ƒˆˆˆสไษC‘ 1ไษC‘ ๑ƒอ…Ÿ 13*vพา=ไ5VCDDDeG๒ˆˆˆˆdˆ!ˆˆˆH†๒ˆˆˆˆdˆ!ˆˆˆH†๒ˆˆˆˆdˆ!ˆˆˆH†๒ˆˆˆˆdˆ!ˆˆˆH†๒ˆˆˆˆdˆ!ˆˆˆH†๒ˆˆˆˆdˆ!ˆˆˆH†๒ˆˆˆˆdˆ!ˆˆˆH†d๒RRRฐrๅส๒.CKVVZตjDEEมฺฺ๚…๚Qซี8pเ@WGDDDrUeB^~~kญๅมƒ€ุุX˜™™!66/฿ำ!/%%ๅeK$"""ซ4!๏ึญ[hัขT*p๒ไIญ็‰‰‰˜ฆL™‚ศศHจT*DEEaร† pwwวาฅK‘––๖F€ˆˆˆ*“J๒6lุ€6mฺ@ญV#&&QQQZฯ0sๆLธบบBญVcย„ €๘๘x์ุฑ๋ืฏวธqใ0u๊TDGGcม‚?~< OŸ>8sๆ โใใadd„฿~๛MZฏฅฅ%bccแ๋๋‹QฃFa็ฮ๘๙็Ÿ1cฦ ฉออ›71eส8;;cวŽ˜>}:ึญ[ ฌ\นํท‡Zญ†ฅฅฅดฬึญ[๑๗฿#!!ซVญยภ6668x๐ ฮž=‹E‹aาคIะััม๔้ำ ตZภภ@ >ฟ๒ n฿พ /// :111%๎ร์์lคฅฅi=ˆˆˆHžtหป€า๒๖๖ฦภกT*ัปwo๘๙๙i=wvv.rน:ภิิp่ะ!\ธpAšงฃฃˆ‹‹ร็ŸŽดด4คคคภบuผ๓ฮ;WWW( ยลล7n๑วhผ9ฦŽ‹่่h˜™™•j{Nž<‰เเ`( ธบบยุุw๎พพ>Fމ๘๘x่่่ ++ซุ>1cฦ „‡‡cํฺต๐๗๗ว๔้ำ๑ัGู~ึฌY˜6mZฉ๊#""ขสญาษ๓๗๗วัฃGaee…ž={"77W๋๙มƒ‹\ฮุุX๚YกPเ์ูณPซีา@:t(VญZ…„„Œ3ูููา2๚๚๚ฅRฉ๕sม5~nnnXฑbŽ?Žž={b๓ๆอศษษyแํ\ธp!5j„„„>>ุฝ{ท4ŸcQพfฯž …BฑcวJำ8&•C^ดiำ&Œ?SงNลูณgแ๎๎Ž๖ํใ๎ปๅ]š์dddภK—.-rนs๑ํท฿"""งOŸFตjีะพ}{deeIm{๏=œ?๛๗๏วŽ;p๔่Q|๐มฏkdใศ‘#9r$N:…๛๗#77ํฺตCFF†ิfธq๘ํท฿ฐeห9rทnยป๏พ+อฯฯฯG็ฮ‘““ƒ“'Ob๕๊ีXตjฆL™R›Tฉูููa๖์ูˆ‰‰Att4Zตj…nบแ๙๓8ๅ้ฬ™3Xพ|9ดฆsL*!AUฮ[oฝ%FŽ)=ฯฯฯถถถbึฌYๅX•ทo—žk4amm-ๆอ›'MKIIbร† B!.\ธ ˆ3gฮHmv๏- …๘็Ÿ^[ํrt๗๎]@9rD๑x฿๋้้‰-[ถHm.^ผ(ˆ฿]!ฤฎ]ป„Rฉ๛ฏิfูฒeยฬฬLdggฟ ก๊ีซ‹•+Wr,สQzzบhะ ุฟฟcฦŒB๐QY๑H^“““ƒ˜˜ดiำFšฆT*ัฆM๛๏ๅXYีsํฺ5๛๏ฟZcannŽfอšIc๑๛๏ฟรยย^^^R›6mฺ@ฉTโ๔้ำฏฝf9IMM๐฿แƒ\ญ๑hธ1๊ึญซ5ฎฎฎจ]ปถิฆ}๛๖HKK“Ž@ั๓หฯฯวฦ‘‘‘ŽE99r$:w๎ฌต๏พ?*+~wms๏=ไ็็kฝ  vํฺHLL,งชชฆŠ‹‚y๛/ฌฌฌดๆ๋๊๊ขFRz~cวŽE‹-เโโเ๑พึืื‡………Vงวฃจ๑*˜Gฯ'!!>>>ศสส‚‰‰ ถo฿gggจีjŽE9ุธq#ฮž=‹3gฮšว๗GๅฤGDUฮศ‘#q๎9?~ผผKฉา5jตZิิTlบ ภ‘#Gสปฌ*้ๆอ›3f ๖๏฿CCร๒.‡สOืV15kึ„ŽŽNกODนsึึึๅTUีTฐฟK kk๋Bˆษหหร๛๗9^/hิจQุฑcขขข`gg'MทถถFNNRRRดฺ?=EWม๚๚๚จ_ฟ><==1kึ,ธปปcัขE‹rƒปw๏โอ7฿„ฎฎ.tuuqไศ|๛ํทะีีEํฺต9&•C^ฃฏฏOOO๘@XXXh}"ŠสFzzบˆฑฑฑ€Xฐ`ˆืฏ_B1{๖laaa!~๙ๅ/บu๋&œœœฤฃGค>:t่ <<<ฤ้ำงล๑ใวEƒ Dฟ~สk“*ญแร‡ sssq๘๐aq๛๖m้‘™™)ต u๋ึ‡ัััยววG๘๘๘H๓๓๒๒„‹‹‹hืฎPซีbฯž=ขVญZbโฤ‰ๅฑI•ฺgŸ}&Ž9"ฎ]ป&โใใลgŸ}& …ุทoŸ‚cQ<๙้Z!8&•C^ตx๑bQทn]กฏฏ/z๋-q๊ิฉ๒.I–ขขข€B!฿Fๅ‹/พตkืขu๋ึโาฅKZ}$''‹~๚ aff&BCCEzzz9lMๅVิ8‘‘‘R›G‰#Fˆ๊ีซ cccัฃGq๛๖mญ~’’’DวŽ…‘‘‘จYณฆ๘่ฃDnn๎kšสoะ AยมมA่๋๋‹Zตj‰ึญ[KOŽEE๐tศใ˜T> !„(ŸcˆDDDD๔ช๐š<""""bศ#"""’!†<""""bศ#"""’!†<""""bศ#"""’!†<""""bศ#"""’!†<""""bศ#"z 222เ์์Œ‡–w)Zš6mŠ฿น–qttฤ๑ใว_QEฯ็๒ๅหx๛ํทหป ข ‰!ˆชGGGTซV าดฬฬL˜ššยััQซฑฑ1LLL`ii‰>}๚เมƒZ}ฉี๊็่ึญLLL^j;สฺ๙๓็แใใ๓Zึu๘๐aิฏ__kฺภ1cฦŒ๎ณaร†ฐถถฦoฟ๖ฒๅษCUu๊ิมฯ?,=ๅ—_`ccSจพ}๛๐๐แCธq999๘๒ห/ตๆ๏ูณ:txฎu๏Cฟ~^จ๎็‘——๗สืQQlkฟ~ฐrๅสrฎ†จโaศ#ข*ฃ_ฟ~Xทn๔|ํฺตx๏ฝ๗Šm_ญZ5tํฺ/^ิš^๒=z„~๚กFจQฃŠ์็ฦธu๋\]]ฅiŽŽŽ˜7oš4iSSSL™2—.]‚——ฬออ&ตีh4˜:u*์ํํaccƒัฃG#;;ฐjี*bุฐa077Gdd$๎฿ฟเเ`XYYแ7ภ๊ีซ‹ฦ'Oฝ๎ุฑ5’ŽnnธฑุๅNž<‰† ยาา144o้าฅhะ jึฌ‰ ##๙๙๙ุ่ฑ#๚๋/˜˜˜ภฤฤซWฏฦบu๋๐ๅ—_ยฤฤDฺๆ„„๘๛๛ฃz๕๊๐๔๔DttดิทBกภ’%Kเไไ„ภภ@€ฟฟ?|Xุูู‰ปw๏Šปw๏ ;;;q๘qแเเ ี๎ุฑcB!RSSE—.]ฤิฉSฅ๙iiiยฺฺZไ็็‹eห–‰.]บˆฬฬL‘››+Ž=Zไบw์ุ!<== ี ’““ลล‹…hถญธqใ†ธ}๛ถจ]ปถ8t่Bˆ+Vgggq๓ๆMq๏=ัผysฉฆศศHกฃฃ#"##E~~พศฬฬ:u}๔‘ศสส/^666"..ฎุRฐฝตkืวBq๛๖mq๙b—QฉTโ๖ํโŸฮฮฮbๅส•B!6o,\\\DRR’ศฬฬ๚๕}๔‘Bˆจจ(Qฏ^=ญพ  พ๒K้yzzบฐตต[ทnyyyb๛๖ํย^ŒYณfมภภ7Fpp0ถm๖ฬฃงง‡‹/โแร‡ฐถถ†ณณsฑmวŒkkkฺฺุbธqุดi€วงฅ'NœaาคIุบu๋3ื]`วŽhฺดฉ46ปw‡••N:%ต๙์ณฯ`ff###išฉฉ)RSSKฝขช€!ˆช”๗{๋ืฏวบu๋Š=Uป{๗nคคค 33ปwG็ฮฅyO^‚ึญ[ฃGpppภฌYณŠ์ฯผศOีZYYI?z^ฐฬญ[ทPทn]ižƒƒnบ%=ทณณ“~พqใฒฒฒPซV-XXXภยยห—/วฟ[โ~€ญ[ทb๛๖ํฐณณC‡ ฆ~’ฝฝฝึฯทo฿–ึ?lุ0iพพพ๘๏ฟžน๎'๋?rไˆดผ…….^ผX์๖HOO‡นนyฉืCT0ไQ•โๅๅ…๛๗๏ใมƒ๐๖๖.ฑญBBBƒ{๗๎xกŒ๖ํ๔๕๕1}๚t\พ|{๗๎ลขE‹p๘๐แBธบบโ๊ีซ/\ณญญ-nธ!=ฟqใlmmฅ็ …B๚นN:011มƒ’’‚””คงง#""โ™๋iึฌv๎‰;w๎ภ]๋ๆำnผฉ๕sมX๊ิฉƒีซWK๋NII‘>ัdEี^ฐ|๛๖ํ -\์2๛/๒๒๒Pฏ^ฝgn#QUยGDUฮถmJu๚277๋ืฏ‡••,--‘˜˜333)ะDEEแ๙๓ะh4033ƒฎฎn‘ง`mm„„„ชทo฿พ๘๚๋ฏ๑ฯ?เ๛๘๒ห/Td:u๊ภววŸ9233‘——‡ณgฯโย… %ฎ#''๋ืฏGZZ๔๔๔`bbRไถXผx1๎นƒทocแย…่ำง`ะ A๘๊ซฏคP{๛๖m์ูณภใ#—๗Ÿึmlฌฌฌ””$=็w‹Ÿyyyx๔่๖์ูSโฉุฃGขUซVะีี-q‰ช†<"ชrœKผฌ]ปv011Aอš5…Ÿ …ขะญSn฿พ๎ปรฬฬ 6lXฑืๅ  Œ1ๆๆๆุนs'/^ +++8::bลŠ%ึฝaร :๔™GTี(„ขผ‹ "ช :t่€ฯ>๛ -[ถ|๎e322เํํ?๘ฃยน2ปrๅ BBB๐๛๏ฟy:˜จ*cศ#"*ฅนs็bธqะำำ+๏Rˆˆž‰!ˆˆˆH†xM‘ 1ไษC‘ 1ไษC‘ 1ไษC‘ 1ไษC‘ ?\ฐ‘F\1หIENDฎB`‚c4core-bm-charconv-xtoa-mega_bytes_per_second-i16.png000066400000000000000000000751701477602032300327030ustar00rootroot00000000000000c4core-0.2.6/doc/img/linux-x86_64-gxx12.1-Release‰PNG  IHDRrOีw.9tEXtSoftwareMatplotlib version3.5.1, https://matplotlib.org/ุa๒ฝ pHYsaaจ?งiyๅIDATxœํw|็?๐ื9Yฒ!ˆD’ฒG“ VจAB(YณTUkตh)ตชEลhิ๖ASb1K%ฒˆ %hํ‘!ศผ~๘ๅ:ฒ#ฤฏ็ใqr๎๛บฏ๛}_Nฮyๅ^G!„ """"ูQVvDDDDT> rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S r$k €žž^e—QคศศH( lถญฒK)•้ำงCกPเ๛•] ฝ#Zทn GGวส.ฃสQ(˜>}ze—Q& €••Ue—!; r๔Jยรรe๗fATัพ๛๎;์นณิํ—-[†ภภ@ิซW … (ด]~ฐV*•ธqใF๙iiiะึึ†Bกภ่ัฃหY=•ไษ“'˜>}:"##฿๘บOž<‰้ำง#%%ๅฏ[NŠ๛,ฺผy3๚๕๋( ดnบุพฮž= ???Tฏ^:::pttฤO?Ta๕T49z%แแแ˜1cFe—ATฉสไพ{:tPWW/ฑฝ––6nX`๚๖ํหR&•ำ“'O0cฦŒJ r3fฬ(s{๚๔)ฆN๚zŠzMVฎ\‰‹/–kูโ>‹–-[†฿066.ถŸ๛๗รหห w๏ลW_}…]บtมฟ[a๕Tด’฿Aˆจสหศศ€ฎฎne—!+B<{๖ ฺฺฺe^๖ศ‘#าธาœเใใƒ7โ‹/พP™พaร๘๚๚โ๛_™kx—ไๅๅ!++ ีชUซ์R^ซทSŽชกก๑Z๚ EบuกT*‹=ŒŸ––†>๚พพพุถm”Jy์๋’G•๔F=}๚ถถถฐตตลำงOฅ้>D:uะฌY3ไๆๆbภ€Xบt)€็็cไ?๒edd`๘๑ฐฐฐ€––5j„๙๓็CกฒพีซWใƒ>€ฉฉ)ดดด`ooeห–•ฉๆ+Wฎ cวŽะีี…™™พ๙ๆ›๋ษหหรขE‹เเเ€jีชกVญZ6l=zคาฮสส ]บtม๑ใวัธqcTซV ๏ฝ๗ึญ[W`ฝ)))7nฌฌฌ ฅฅsss|๔ัGฮ1หหหรฌYณ`nnŽjีชกmถ๘๛๏ฟUฺไŸ+ooo่่่ Aƒา๙uGŽA“&M ญญF!""Be๙kืฎaไศ‘hิจดตตabb‚ภภ@$''ซด[ณf  Ž9‚‘#GยิิๆๆๆEŽํตkืะ A8::โฮ;ž๏กHJJ*๕นtงOŸ†Œกซซ ggg๘ใ*m:„–-[BWWFFF่ึญ.\ธ า&Pใ฿ภศศ†††8p žทn {{{hkkรหห €ๅห—ฃAƒจVญZทn]เ๕˜/::อš5ƒถถ6ฌญญR Mff&ฆM›† @KK ๘โ‹/™™YhM๋ืฏ‡ƒƒดดดคmดiกฏฏ899x-พ(995kึฬ˜1C๚?~๑ฐYi^ปEYผx1 ฃฃcccxxx`ร† ž๗„ ึึึาบ๓วฐธํ|นฦา๎ฯ?ฦŒƒ5j@__~~~๘๏ฟ ๔™žžŽO?Tz355E๛๖ํq๖์YฉMY+^~%''CกP`๙Xฑb๊ืฏ---xzzโฬ™3*ห๗YdaaQชPถaรนsณfอ‚RฉDFF๒๒๒J\ฎฐํ(ฎž 'ˆ q๊ิ)กฆฆ&ฦ'M ฺฺฺโโล‹B!Nž<)ฺทo/ˆะะP้!„yyyโƒ> …B 2D,YฒDtํฺUŸ~๚ฉสบ<==ล€ฤ? /^,:t่ ˆ%K–”XgppฐจVญšฐฑฑ๛๗K–,]บtฤW_}ฅาvศ!B]]] :T„„„ˆ/ฟR่๊๊ OOO‘••%ตณดด5ตjี“'OK–,๏ฟพP(โนsRป๔๔tแ่่(ิิิฤะกCลฒeหฤท฿~+<==ELLŒBˆร‡ ยออMธปป‹~๘ALŸ>]่่่ˆฦซิ็ํํ-ฬฬฬ„………˜0a‚XผxฑฐททjjjbำฆMขvํฺb๚๔้bัขEขnบยะะPคฅฅIหoบUธธธˆฏฟZฌXฑBLž|X„†† ---ัฒeK้wเไษ“%ŽK>]]]\่ผํฝ{๗ฎ077WyM/ZดHŠgฯž bิจQ%ฎ €pqqu๊ิ฿~๛ญXดh‘x๏ฝ๗„ŽŽŽธพิ.88XXZZYฯห}:;; 1gฮ1gฮahh(๊ีซ'–,Y"์ํํล‚ ฤิฉS…ฆฆฆhำฆส๒๙ฏ{SSS1z๔h๑ำO?‰-Zโ—_~‘ฺๅๆๆŠ:๑้งŸŠๅห—‹ัฃG uuuัญ[ท5ููู‰š5kŠ3fˆฅK—Š˜˜ฑ~@ดmV,]บT,]บTŒ=Z9f?ห–-D๗๎ฅใธธ8!D้_ป…Yฑb… ฤ๒ๅหล?(,ฦŒ#„"..N๔้ำG?๐ƒด๎วป๙๓^,ํ๏ŽB๔๊ีK๛๗K—.ฝz๕...๚์ทฏะิิŸ}๖™Xตj•๘๛๏Eืฎ]ลoฟ&ต)ห{ลหฏปซWฏJ57hะ@|๗b๎นขFย\๚,๎ณ่eยปะy={๖โภขaร†€ะีีร‡OŸ>-ฑ|eฉง"0ศQ‘&Mš$”Jฅ8z๔จุบuซ -ZคาfิจQุ…b็ฮ€˜9sฆส๔€€กP(ฤ฿-M{๒ไIๅ;v์({๏ฝk ฤ'Ÿ|"MหหหพพพBSSS วŽฤ๚๕๋U–฿ปwo้–––€8z๔จ4ํ๎ปBKKKŒ?^š๖๕ื_ b๛๖ํ๊สหหB฿›˜ศฬฬ”ๆ๘ใ€HHHฆy{{ bร† าดคค$@(•Jq๊ิ)i๚พ}๛ฑz๕jiZaใ๘็Ÿ bบuาด ืขE ‘““ฃาล wแยaff&<==ลร‡Uฺ•๖อ9''GX[[ KKK๑่ัฃBวH!\]]…ฉฉฉx๐เ4-..N(•J๑ัGจoะ A*}u๏]˜˜˜Hฯ/^ผ(ˆล‹ซด9rคะำำ“ฦช<ฏ‹ฝ{๗ุฮโยXIJไ๎ป'>sั Aižงงง8p B”)ศijjชลลลซฒ9---•ะฒ|๙r@ิฎ][ๅI“& *m๓_๗ ,ฆeffJฏ‰๋ะะPกT*ลฑcวTึ"ˆ'NจิคT*ล๙๓็UฺŽ;Vx—ไฝ{EพK๛ฺ-Lทn„ƒƒCฑmๆอ›W`ฬ๒ต๙๓ r%๎DGG๚๗€ ๔ihhXโ๋ฎ"‚œ‰‰‰ส{ะ๏ฟ.ˆ?๘CšVิgัหŠ rฮฮฮBGGG่่่ˆO>๙D๏Ÿ|๒‰ ‚‚‚J์๛Eฅญง"๐ะ*i๚๔้ppp@pp0FŽ oooŒ3ฆTห†‡‡CMMญ@๛๑ใวC={๖Hำ^<ว(55๗๏฿‡ทท7ฎ\น‚ิิิRญ๏ล+๖๒7deeI‡ทn CCCดo฿๗๏฿—๎๎๎ะำำรแร‡U๚ณททGห–-ฅ็5kึDฃFpๅสiฺ๗?ธธธ {๗๎๊yy7๚ภกฉฉ)=ฯ๏๛ล@OOAAAา๓Fมศศvvvhาค‰4=็—qณณณ๑เม4hะFFF*‡:๒ :jjjฆภนs็เํํ +++DDD8Aธu๋ึB”xUVLL ฎ^ฝŠO?FFF*๓๒ว่ึญ[ˆล€Pฝzuiพณณ3ฺทo๐๐๐>\ๅyห–-๑เมคฅฅ6lWWWlผYj“››‹mถกkืฎาX•๕uammŽ;ปอฏK฿พ}๑๗฿ใฬ™3าฟe9ฌšฏ]ปvจ_ฟพ๔ูู^‹eัถm[•Cb๙ฏฯž={B__ฟภ๔—ืฅฎฎŽaร†Iฯ5551lุ0ฝ{ัััž_ูููมึึVๅ๊ƒ>€WฐททW™fdd„ŒŒ 8p ๚ข๒ผv_ฎ็฿U9LXV…mgqJ๚ษ?4;rไH•vŸ|๒IพŒŒŒp๚๔iผyณศ๕•๖ฝข8ฝ{๗Vy*๊๓U=~Ož<มG}„Ÿ~๚ =z๔ภO?„aร†aำฆMธ|๙r…ฎฏข0ศQ‘455๑๋ฏฟโ๊ีซHOOว๊ีซK}œฺตk033Sy;;;i~พ'N ]ปvา๙%5kึฤไษ“ TANฉTโฝ๗S™ึฐaCฮ%น|๙2RSSajjŠš5kช<?~Œปw๏ช,_ฏ^ฝ๋166V9o๊Ÿ)๕ฏ^๎/M้ๅ๓ฐฬออ Œฑกก!,,, L{y๙งOŸโ๋ฏฟ–ฮIฌQฃjึฌ‰”””Bวัฺฺบศzปvํ }}}์ทฅุยย๓ฯ?P์8ๅฟ5jT`ž๎฿ฟŒŒ •้ฅฯฝ{ใฤ‰๘๏ฟ<ฟง฿ปwัปwoฉMY_ลู๋ๆๆๆ[[[lุฐ๋ืฏGํฺตฅSฅymฟjŸ๙ฏฯาผnภฬฬฌภล6…Ÿ?พภS~ปา_9 6D็ฮannŽAƒ8?ฐ,ส๓ฺ}ั—_~ ===4n6665jNœ8Qฆส๚š,้w็ฺตkP*•๚mะ Aพๆฮ‹s็ฮมยย7ฦ๔้ำ+<\•ฆๆŠ’^Ÿ>}Tฆ็ม๔็ŸV่๚* ฏZฅbํท๐์ู3\พ|นย?ศ๙็ดmถถถXธp!,,, ฉฉ‰๐๐p๐รๅ:ัด0yyy055ล๚๕๋ Ÿ2sพข๖T‰—. (ญา๖WTปา,ษ'Ÿ`๕๊ี๘๔ำOแๅๅCCC( :Žล]mูณgOฌ]ป๋ืฏWูS๒ถ(อx๔๎“&Mยึญ[๑้งŸbห–-044DงNค6e}]”็ ีŠิทo_,[ถ ๚๚๚่ปwนฎช+อุ๕[nnn™๚ฌศ฿ฃผผ<899aแย……ฮ94๖ejjŠุุX์ท{๖์มž={ฐz๕j|๔ัGXปvm™kzUvvvธx๑"vํฺ…ฝ{๗โ๛~๙g|๕ืฅพuEY_“๙าซW/ดlู;v์ภ๛1o<|๗ุพ};:w๎\ๆŠRั๏วE133ร๙๓็QซV-•้ฆฆฆ*>8V9*R||<พ๙ๆ 8ฑฑฑ2dคฟชข฿๐---๔๔t•ฝr๙WYZZ๘ใdff",,Lๅฏฎ—“'//Wฎ\‘2€K—.€tธง~๚ˆˆˆ@๓ๆอ+์รธ~๚8w๎\…๔Uถm†เเ`,Xฐ@š๖์ูณrHtผyPWWวศ‘#กฏฏ_ฎCxคCx็ฮCปvํ m“Z(์QIIIจQฃFนnbmmฦc๓ๆอ=z4ถo฿hiiฉิWฏ‹ืzEฺ ๚๖ํ‹ฏฟทnBhh่k[ฑฑqกฏ›๗คWค›7oธNaฟรqqqhถํ+ทฆฆ&บvํŠฎ]ป"//#GŽฤ๒ๅห๑ีW_บื (}xตืฎฎฎ.z๗๎ฝ{#++ =z๔ภฌYณ0iา$TซVํฝถ๒YZZ"//Wฏ^…4ๅซ์๓ีฉS#GŽฤศ‘#q๗๎]ผ๛˜5kV…นาจˆqrwwว๐฿ฉ์eอ?t๒vฏปžาโกU*Tvv6 333๘ใXณf ๎นƒqใฦฉดห“z๙M฿ววนนนXฒd‰ส๔~๘ …B๚%ฯK๋ลฟฌRSSฑz๕๊2ี๛โz„Xฒd 444ะถm[ฯrฬออลท฿~[`ูœœœr…ž={"..;v์(0ฏขR, 55ต๋]ผxq‘{QŠฃP(ฐbล  88aaa*๓K{K๗฿ึึึXดhQ1ฮฏตN:puuลฺตkUฺœ;w๛๗๏‡O™๋ฯืปwoœ:u ฟ๚+๎฿ฟฏrXจธื…ฎฎ๎น๓~๚๕ฑhั"ฬž=7~ญ๋IMME||ผ4ํึญ[…พึ+BNN–/_.=ฯสสย๒ๅหQณfMธปปx๕฿aๅส•–๚๔iฑ‡0๓=x๐@ๅนRฉ„ณณ3ธ…ษ‹ttt|Ÿ{ีื๎ห๕hjjยBdgg(๚=๖uษ?๔็ŸV™พx๑b•็นนนNู055…™™™สX–๕VEๅUใิซW/ภ/ฟข2}ีชUPWW/๑!*บžาโ9*ิฬ™3‹ƒB__ฮฮฮ๘๚๋ฏ1u๊THoP๙oฒcฦŒAวŽกฆฆ†   tํฺmฺดม”)Sœœ ์฿ฟฟ;>๔SiOM‡คฟ‡ †วcๅส•055ลญ[ทJUkตjีฐw๏^ฃI“&ุณgv๏ษ“'KAy{{cุฐa˜={6bccักChhhเ๒ๅหุบu+~๑G•{‹•ฦ„ ฐm6bะ Apwwวร‡†ธธธ”ฉฟWีฅK„††ยะะ๖๖๖๘๓ฯ?“r๕งT*๑oฟม฿฿ฝz๕BxxธtNึ_…6mฺ`ฺดiลžฤฌT*ฑlู2tํฺฎฎฎ8p ๊ิฉƒคค$œ?^:t?o}Šล‹ระะ๐•N’๎ีซ>s|๙็จ^ฝzฝ‚๕บpwwGDD.\333X[[ซ\œ๒ฒ?๘qqqžั™3gคpQ˜ฑcว–fำ_IPPพ๒Kt๏cฦŒม“'Oฐlู24lุฐะ g^•™™พ{$''ฃaร†ุผy3bccฑbล ้&ฑ๛๗ว–-[0|๘p>|อ›7Gnn.’’’ฐeห้~ล2d>|ˆ>๘ๆๆๆธvํ/^ WWW้ยhkkร›7oFร† Qฝzu8::ยัั๑•^ป:t@ํฺตัผysิชU .\ภ’%Kเ๋๋+ษศ2e ‚‚‚ กกฎ]ปพถxปปปฃgฯžXดhไฟ๎ฃขข„———จVญšฐดด,๔>’YYYโ๛๏ฟBKKK www1cฦ ‘ššZโvnถMt่ะA˜šš MMMQฏ^=1lุฐ๗,ฬษ“'…ปปปะิิ,๐ฺ/อkท0ห—/ญZต&&&BKKKิฏ__L˜0Ae[„โoฟu๋ึJฅRๅu^๛ห5–ๅw'##CŒ5JTฏ^]่้้ ้–>๙๗œฬฬฬ&L...า๏ต‹‹‹๘๙็ŸU๚ฏˆผ:*l๛Š๛,ส฿๖ย/ื•••%ฆOŸ.,--…†††hะ ๘แ‡JฌeลีSัBTย1 """’ุุXธนนแท฿~ร‡~Xูๅะ xŽI^jฦ|‹-‚Rฉ”Cาƒ็ศ‘d๎นˆŽŽF›6m ฎฎ.ชๅใ?.p›—wMjjjกA๗Eตkื~Cี<วCซDDD$9pเfฬ˜ฤฤD<~๕๊ีC1eสจซฟ๛ Pโ=฿tฌb#"""*…ฤฤฤbฟ’ @‘๗ฬ|]ไˆˆˆˆdŠ;ษƒQ1nธjีช•๙หฬ฿f‘‘‘P(ˆŒŒ|ๅพZทn GGวW/๊-ะดiS|๑ล•]Q™0ศัkทfอ( ( ?~ผภ|!,,, P(ะฅK•y๙หๅ?tuuaoo™3gโษ“'…ฎ/!! …๕ื+ือ7฿ I“&hผ๙+๗Eฅ๓w฿a็ฮฆŸ>ะััAƒ ฐm6ฯ๗06iาฺฺฺhิจ""" ๔ƒฮ;รภภzzzhถ-N:ฅา&๔‘#G0rไH˜ššย\šฟgฯดlูบบบะืื‡ฏฏ/ฮŸ?_โvvŽๅห—ัณgOิฎ]ีชUƒนน9‚‚‚ššZbfอšA[[ึึึ )ะ&33ำฆMCƒ  ฅฅ |๑ลศฬฬ”ฺ( ddd`ํฺตาแ๔`๚๔้˜0aภฺฺZš—œœ,-๛oฟมฺฺฺจ^ฝ:‚‚‚pใฦ •๒๏ขฃฃัชU+่่่`๒ไษา๖ํใฺตkˆ-ีvU69"zcฌฌฌเๅๅ…7Jำ๖์ูƒิิTนณgฯp}ฟืฎ]ร† ฐvํZ๔ํท@ทo :t่เ๙อM๛๔้ccc|๗˜3gZทn]โล ููู8sๆ B็?z๔]บtA“&M0w๎\hii!((›7oFPP|||0gฮddd ้้้าฒ็ฯŸGห–-‡/พ๘_}๕ฎ^ฝŠึญ[ใ๔้ำึ5rไH$&&โ๋ฏฟฦฤ‰กกก๐๕๕…žžพ{|๕ีWHLLD‹-TยMideeกcวŽ8u๊>๙ไ,]บ1ฎ\นRชร˜=‚1w๎\˜››cฤˆ๘๕ื_ฅ6yyy๐๓๓ร๙๓ัตkW,^ผ๘แ‡ะปwoฉ]hh(ดดดะฒeK้p๚ฐaระฃG๔้ำ๐ร?H๓jึฌ ˜5k>๚่#ุุุ`แย…๘๔ำOq๐เAดjีชภ6|X!DLLŒ ถnZ ",,X MหฬฬฎฎฎยิิTdee !„ JฅR;vLe๙@œ8qBšฆซซ+‚ƒƒ ฌkผy€ธz๕ชส๔ไไdกฆฆ&fอšฅ2=!!AจซซซLฯฏ7$$คศmาิิ#FŒ(q‰#GDoTฏ^ฝ๐๔้S์ฺต ุ้้้ตkW‰‡Uปu๋†เภ๘๗฿1iา$์ป}๛๖U๙:œผผ<์ปWๅฐช‘‘222T็–ฦƒฦฦฦ…ฮืำำSู‹ุจQ#มฮฮMš4‘ฆ็|ๅส@nn.๖๏฿ผ๗{Rป:u๊ o฿พ8~8าาาTึ5t่PจฉฉIฯ8€””๔้ำGฺSy}จฉฉกI“&8|๘p™ถีะะภ๓ฝ™E] \uuu 6Lzฎฉฉ‰aร†แ๎ปˆŽŽlบvvvฐตตUฉ๙ƒ>€2ืขํท#//ฝz๕R้ปvํฺฐฑฑ)ะท––XdฦฦฦEžฏI๔ถแลD๔FีฌYํฺตร† ๐ไษไๆๆ"  ุeฬออUพ๖ฦฯฯ&&&๘๓ฯฑkื.้b„3gฮเฝ{*Anไศ‘ุฒe :w๎Œบu๋ขC‡่ีซ:u๊TชzE_~cnn^เdxCCร_*ž’=zเ๙•ฐOžฺถm 8z๔จไยรรaee{{{ฉฉฉ)bccฑo฿>์ูณ{๖์ม๊ีซ๑ัG๛ๅื&&&/€ฝ์ล=dฅ™^T , mmm•็yyyžŸOVปvํํห๓ลๆ ,ภ€๐๛๏ฟc3f fฯžSงNฉ\`Q^yyyprrยย… r.k฿ …{๖์)t_พXๅๅ๑|YJJ jิจQ๎zˆ$9"zใบw๏Žaร†แิฉSุผysน๚ศษษ<~Xšถ{๗n๘๘๘hซฉฉ‰ฎ]ปขkืฎศหหรศ‘#ฑ|๙r|๕ีWhะ AกืซWฺฺฺธz๕jน๊+Jอš5กฃฃƒ‹/˜—””ฅRYbจฉ_ฟ>€็!ต"ฟ ษษ NNN˜:u*Nž<‰ๆอ›#$$3gฮ,vน›7oธ-สฅK—<ฟภ%ฟๆธธ8ดmถฤฝ]Eอ/jz๚๕!„€ตตตด'ฐผ๛๏?deeมฮฮ๎•๚!zSxŽฝqzzzXถlฆOŸ^๎{ด๑วภ;wp๖์Y•รชภ๋–OฉTยููTn{๑2 xxx **ช\๕EMM :tภ๏ฟฎru้;wฐaรดhัขฤCฃ;v„พ๛๎;dgg˜๏ฝ2ี”––&ใ|NNNP*•ลŽQพœœ,_พ\zž••…ๅห—ฃfอšาU ฝz๕ย‡•+WX้ำงศศศž๋๊๊zตl~P|y^= ฆฆ†3fุ๓)„(๐(N9}อš5+๕2D•‰{ไˆจR๕ญ …นt้~๛ํ7ฯoz๊ิ)ฌ]ป 4@๓RลPฏ^=ธนน•zˆ*Uๅ]0KD๏Šo?Rœา~DMMM˜››‹?XนsGj ||| ๔นm6ักCajj*455Eฝz๕ฤฐaรฤญ[ทJฌ๛ฮ;B]]]„††ชL๗๖๖ฅช?Fฅ2ํ์ูณขcวŽBOOO่่่ˆ6mฺˆ“'Oชด)i>,:v์( EตjีD๚๕ล€DTTTฑ๕๒ํGฎ\น" $๊ืฏ/ชUซ&ชWฏ.ฺดi#"""ŠํGˆ‹จจ(แๅๅ%ชUซ&,--ล’%K ดอสส฿ฝpppZZZยุุXธปป‹3fˆิิTฉ]RR’hีช•ะึึTnE๒ํท฿Šบu๋ ฅRYเV$๛฿D‹-„ฎฎฎะีีถถถbิจQโโล‹๊-LnnฎจSงŽ˜:uj‰M๔ถP๑ gเฝrrr`bb‚ูณgcไศ‘ฺ๗เมƒq้า%;vฌB๛ฅทฯฮ;ัทo_๓ฯ?จSงNe—CT* rD${w๏ลฯ?Œaร†U๘๐๕๋ืัฐaCเัฃGoฎh"""’ r+Wฎ„““\\\0mฺ4dggใป๏พริฉSKตะกCq๘๐a€‹‹ ~๘แ@pp0Nž<‰5kึ ่฿ฟ?ึฌYƒ‰'โ๔้ำ รจQฃเ๊๊Š๔๔t๕ื_hูฒ%}โษ“'Eฎ๗ซฏพBฃFะกC|8๒๒๒ ฮ—%''c๒ไษฐตตลฅK—VVVx๖์ u๋ึRHห—’’‚s็ฮกGCCChii€ˆˆ!J5–™™™HKKSyQี๔สA.>>K—.ล‰'‡ฑcวbแย….ZBBBˆŠŠย!Cอ›7วษ“'‘––MMMœ}Š๛๗#""ืฎ]Si;|๘p้gฌZต ภ๓ 7v์Xxxxภ฿฿๛๖ํร;w`dd$ํ๊ิฉS`๘ฒ‹/">>mฺดdeeกmถ…ถ=y๒$z๔่ ิญ[-[ถ๙็Ÿˆ—ฮํ{๚๔),--q๓ๆM•ํฌ^ฝ:€็{อฮŸ?u๋ึกE‹ฅธ/77งNยูณgัฐaC๘๛๛#,, ~~~P(h฿พ=ฺทo{๗๎aธq077ว•+W`ffVh“&MยgŸ}&=OKKc˜#""ชข^9ศฝ,66‰‰‰ฐถถFNN๎ป???„……นŒ ๛o;v ํทวๅห—ŠfอšImtttJ\ทžžžุฟฉjU(~B [ทnXฑb…J‹+^6{๖l๓ฯ4hบw๏Ž!C†ภฦฦฆT๋333ุุุภมมะฅKฤลลมฯฯ๐๘๑clผซVญ‚ฎฎ.BCCQซVญ"๛ำาา’ย/Umฏ|h๕ƒ>ภฆM›คsฑผผผp๋ึ-$''ใ๘๑ใpss+6ฤๅณททว† ะธqc4o‹-B๓ๆอK\N__้้้[[[\ฝz €ŒŒŒ"/„hึฌv์ุ์์lผyวŽ4mฺฤฟ x๐เ๗฿๙๐แC€ฃฃ#~๙gฤฤฤภฦฦ}๛๖E›6mœœ\bํภ๓ gdd„7n@#GŽภึึ๐๙็ŸรููIII EDD_หE$DDD$?ฏไ1z๔h4kึ ...E๎นŠ>Gx~xตfอšะึึF๓ๆอ๑฿ฉ์‘+JPPฆM›WWWdffbร† >|8\\\เๅๅUdkธ1ฺถm GGG 8P:”jjjŠฅK—ข[ทnpvvF‡p๗๎ทSWWC† ม™3g0|จซู้๋๋‹ภภ@„……ม111€ ภฯฯฮฮฮ022Bฯž=ํฺตCRRๆอ›‡ ”8DDD๔nQˆา^Iฒ”––CCCธOyšz•]Žฌh*&9>ฦ์szศสS”ผI8vๅSธ๊ƒJชJฒณณhhhTv9ฒยฑ+ฟื9v๙Ÿ฿ฉฉฉา๙๙…แ7;ษT…_์๐6jาค 233Uฆ๕ื_าz‰ˆˆˆไ่rงOŸฎ์ˆˆˆˆ*ญษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘Lฝ7&`฿งอabbRูeศJw่๛ขฟฐŒ8vๅรq#ขฒโ9""""™b#"""’)9""""™โ9r๏ˆ){/C]็ne—!+jศลJเ๓]‘ ตส.GV8vๅSšq[า๎ WEDo3๎‘#"""’)9""""™b#"""’)9""""™b#"""’)9""""™b#"""’)9""""™b#"""’)9""""™b#"""’)9""""™ชRA. M›6-ฑ]TT&NœˆŒŒDTTิkซษววYYYR}ฦฦฦ Ris๏=๘๚๚ยฮฮธkซ‡ˆˆˆชŽ*ไ855ตRต๕๐๐ภœ9sผž —ŒŒ @xx8455ฃGฦบu๋ ด3f Œ .เไษ“ะืื>K—.ล‰'‡ฑcวbแย….’BBBเ๙แิ!C†จฬทฐฐภ๐แร1eสฤฦฦขQฃF8p –/_Ž„„<|๘7nŒ;gฮœA||<โใใศออEXX|||ะฃGิญ[gฯž…››[ฉถ็๊ีซจ^ฝ:z๗๎ 777•0‰aร†a๙๒ๅpttฤ๙๓K<์𙙉ดด4•UM๊•]@Yๅ๏M300<}๚๛๗๏GDDฎ]ปฆาv๘๐แาฯXตjUฑ}งคค //๎๎๎€?{๖์Aฟ~p๐เAฬ;™™™ธs็แโโœ?๋ึญC‹-สผ=นนน8u๊ฮž=‹† ย฿฿aaa๐๓๓ƒBก@๛๖ํัพ}{ปwใฦƒนน9ฎ\น33ณB๛›={6fฬ˜Qๆ:ˆˆˆH~dทG๎eฑฑฑHLL„ตต5Zดh˜˜๘๙๙U่:ž={†ฯ>๛ ปw๏F||<‘™™ เyp๊ิฉ „/ฟ—/_.S฿fffฐฑฑƒƒ444ะฅKio<~ฟ๒ p๛๖m„††ขVญZE๖7iา$คฆฆJ7n”oฃ‰ˆˆ่ญ'ป ๗ม`ำฆMา!C///บu ษษษ8~8V๊๔๕๕‘žž022‚šššค6nˆ-ZเูณgP*•066ฦร‡๑วHห;::โ็ŸFLL lllะทo_ดiำษษษฅZฟ™™ŒŒŒpใฦ !pไศฺฺุ>s8;;#)) กกกˆˆˆ@```ฑuhiiมภภ@ๅADDDU“์‚œฃฃ#Ffอšมลล?๔S‘mK:GบvํŠะะPธนนแโล‹๘๕ื_1x๐`899มะะAAA022BŸ>}`gg‡=zภหหซ@?บบบ2dฮœ9ƒ๙๓็C]ฝเQk___",, ๆๆๆˆ‰‰,Xฐ~~~pvv†‘‘z๖์ hืฎ’’’0o<4hะ \ใEDDDU—B๐rศ*--- †††๖ŸPื1ฌ์rdE น๘@๙ๅีG.JwkzŽcW>ฅท%ํpU๒๐๐p๘๘๘@CCฃฒห‘Ž]๙ฝฮฑหNMM-๖่š์๖ศัs rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ฅ^ูะ›1ซ“ LLL*ป Yyeศ`~—F"้2โุ•วˆสŠ{ไˆˆˆˆdŠAŽˆˆˆHฆxh๕ฑ9๎?h๋gTv๒’—‹๊~;๛/ Tซ์jไ…cW>ท๒ใุ•วฎ๚นึฉ์ธGŽˆˆˆHฎไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆชD @ำฆMหฝ|dd$ขขข*ฐ"U>>>ศสส๐ผVcccฉดนw๏|}}aggฟตีCDDDUƒ์ƒ ฆฆ๖J}ผŽ —ŒŒ @xx8455ฃGฦบu๋ ด3f Œ .เไษ“ะืืSฆLAll,5j„b๙๒ๅHHHภร‡ฑqใFภุฑcqๆฬฤวว#>>qqq€\„……มวว=z๔@บuq๖์Yธนน•jฎ^ฝŠ๊ีซฃw๏pssS ฆ‘‘‘6l–/_GGGฬŸ?ฟุรฎณgฯ†กกก๔ฐฐฐ( ‘ฌจWvฅ‰   ž>}Š๛๗#""ืฎ]Si;|๘p้gฌZตJz{{{Œ1ขะ •’’‚ผผ<ธปป>๐C์ูณ๚๕รมƒ1w๎\dffโฮ;HLL„‹‹ qyฌ[ท-Zด(๓ถๅๆๆโิฉS8{๖,6l„……มฯฯ …ํทG๛๖ํq๏=Œ7ๆๆๆธrๅ ฬฬฬ ๔5iา$|๖ูgา๓ดด4†9""ข*J6{ไ^‹ฤฤDX[[ฃE‹ˆ‰‰ŸŸ_‰ห%''CKK ทn*ำ๚ž={†ฯ>๛ ปw๏F||<‘™™ เ๙^ฐN:aะ A๘๒ห/q๙๒ๅ2๕mff888@CC]บt‘๖๖ภใว๑ห/ฟภฯฯทo฿Fhh(jีชUh_ZZZ000PyQี$› ๗ม`ำฆMา9_^^^ธu๋’““q๘qธนน!,,ฌุ>2331bฤDDDเฦุฟ?@__้้้###จฉฉIAjใฦhัขž={ฅR ccc<|๘๑‡ิฏฃฃ#~๙gฤฤฤภฦฦ}๛๖E›6mœœ\ชm333ƒ‘‘nธ!Ž9[[[ภ็Ÿggg$%%!44 |ๅ <ˆˆˆHdไ1z๔h4kึ ...๘้งŸŠl[ิ9r฿|๓ บw๏GGGฌXฑใฦรใวัตkW„††ยออ /^ฤฏฟŠมƒรษษ ††† ‚‘‘๚๔้;;;๔่ั^^^ึซซซ‹!C†เฬ™3˜?>ิี น๖๕๕E`` ยยย`nnŽ˜˜ภ‚ เ็็gggกgฯž€vํฺ!)) ๓ๆอCƒ ^y‰ˆˆจ๊Pˆา\ Iฒ•––CCC,=m}ฃส.G^๒rQv<ึv”Z&ป๒แธ•วฎ8vๅึฯตยรรแใใ  ํ;๓;55ตุำคdณGŽˆˆˆˆT1ศษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘LVwช’zปิ…‰‰Ie—!+ูููGฟ๗อ+;๔ช:Ž]๙pสcW~ป๒หฮฮฎ์ธGŽˆˆˆHฎไˆˆˆˆdŠAŽˆˆˆHฆxŽ;":9 ๚ิ*ป Yษหอu%J5ช”วฎ|8nๅวฑ+ฟ๒ŒWฃืX•๗ศษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษTฅน€€4mฺดฤvษษษุถm[…ญw๚๔้ ฉฐJ#,, ?๔`ฯž=prr‚RฉDRR’Jป5kึภฮฮ๖๖๖˜9sๆญ‘ˆˆˆไIMฏ๐ภPSS+U ๐šซ*Ynnnฉ๋€Gมุุ~~~า4lูฒ#FŒPi{แยฌ\นัััะััมปwฉฉฉ000€Bกจ˜ ""ข*ๅต๎‘[นr%œœœเโโ‚iำฆ!;;฿}๗ฆNZชๅงL™‚}๛๖มีี๋ืฏวฝ{๗ะนsg899กcวŽธs็N‘ห&%%ม...hาค 233ัััhัข๊ืฏ๛๗๙็ดhั๏ฟ>ผผผpแยฯ๗’ภ๛๗วแร‡แไไWWW4oผภ:srrฐ}๛vt่ะฃG–๚˜8q" Aƒฐณณ+ฐ/ฟ‚1cฦ@GG`jj 8v์์์์0gฮ)•$33iii*"""ชš^[‹วาฅKqโฤ ฤลลa์ุฑXธp!‚ƒƒกฏฏฏา6$$D:ไ…!C†fอš…Ž;"66~๘!ฆM›†๖ํ#!!บuร”)SŠ\1}๚tฤลลaะะะ\ปv GŽม–-[0cฦ @:up๐เAœ={?๘#&Ožฌฒปvํย† ฐpแB๔ำOˆExxธิๆฦ๘๚๋ฏaoo]ปvแ›oพม๚๕๋K=V—/_ฦูณgัดiSดiำ €.]บเศ‘#€ึญ[#((‘‘‘ล๖5{๖lJ ‹RืADDD๒๒ฺ‚\dd$‚‚‚```x๚๔)๖๏฿เเเm‡Žแร‡<<<ฐjีชB๛๙คศพ&Mš„ิิT้qใฦ2ีBDDD๒๑ฦ.vˆEbb"ฌญญัขE ฤฤฤจœ?๖ฆhii”J%rss‹-BฃF€ƒJ! €tธx’Vฎ\‰GกI“&x๐เœฑbล ?~={๖ฤ–-[••Uฆšฬฬฬเ็็ฅR‰ๆอ›ใ๖ํBH๓cbb0jิ(Œ?ƒฦ๘๑ใ‹>•UMฏ-ศ}๐มุดi“tŽ–——nบ…ไไd?~nnn +ถ}}}คงงKฯ›5k†อ›76lุ€-Zบœ q๘๐aฯ/ศหห+r=iiiจ]ป6 ึฌYSdป+Wฎภีี_}๕ฌฌฌpใฦ TซV ƒ ยฉSง0o<:tถถถXฐ`Aฑ๖ขกž;wีซW‡Bกภูณgแ้้‰๑ใวร็ฮรœ9s`eeU๊พ‰ˆˆจ๊zmAฮััฃGFณfอเโโ"‚ฃ0E#็์์ŒงOŸJ;LŸ>แแแpvvฦ๖ํ‹ฝMวบu๋0mฺ4ธธธ SงNศฮฮ.ฒํ๐แรฑdษธบบชว—-\ธpvv†ญญ-\\\Tๆปบบ"$$๑๑๑puu-ฐมƒannŽ?ญ[ทF<rูููpppภ€ฐrๅJฯ๗ฎ_ฟ‡B๏ฝกฉฉYdmDDD๔๎QˆแQ•“––CCC์‹บ}Cใส.GV๒rsp?้jุ6‡Rํ฿ฉGึ8vๅรq+?Ž]๙•g์ผฝขd";;แแแ๐๑๑‘.ชฌ(๙Ÿ฿๙ท"+ ฟูˆˆˆHฆdไfอšWWW•GE~ัJ๖๛ŸงL™R์ไˆˆˆˆช*ู๏‘#"""zW1ศษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษ”์oLฅใneฃส.CVฒณณž4~ฯฐยฟCฏชใุ•วญ8vๅวฑ“7๎‘#"""’)9""""™b#"""’)ž#๗Žธ;ผฒY•]†ฌไชWzฏฤเบPหyVูๅศ วฎ|8nๅวฑ+Z-i•]ฝF#GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$Sฏ-ศฅคค`ีชUEฮฏ]ปv‰}ฌYณ๗๏฿ฏฐšJณฮŠๆใใƒฌฌ,@@@Œคาๆฝ{๐๕๕…*t›‰ˆˆจ๊ชด Wไ^Ennnฉfgg###MMMภ่ัฃฑnบํวŒƒมƒใย… 8y๒$๔๕๕=ช€ส‰ˆˆจชชฐ w๓ๆM4oฎฎฎpvvฦ๘๑ใ‘WWWฬ›7่ฝ;์ํํ1|๘๐๛ฑcขขขะฝ{wดlูฐz๕j8::ยัั+Vฌ(v๙3fภััฮฮฮXพ|น4}์ุฑppp@ทnคp6mฺ4xzzยัั“'O–ฺZYYaาคIpuuล๑ใวัฏ_?888ภษษ 6l(ฐฮไไdLž<ถถถธt้’ิวณgฯญ[ท–BZพ””œ;w=z๔BKK เ๏๏€€DDD@Qโ˜@ff&าาาTDDDT5UXธq#ฺตk‡ุุXDGGcๆฬ™prrBll,&L˜€ฅK—ยฺฺ‰‰‰่น3๎น#-๋๊๊*>qqqR_VVVˆ…žžnธ๓็ฯ#!!พพพž๏ฉ ƒz๔่บu๋โ์ูณpss+ีธ]ฝzีซWG๏ฝแๆๆ†ฉSงJ๓"##1lุ0,_พŽŽŽ˜?~‰{(gฯž CCC้aaaQช:ˆˆˆH~ิ+ช#OOO 0JฅะััQ™๒ไIioWทnTๆวฦฦJ?u86** :t€‘‘€็็ž>}VVVฺ:tƒ ’iVฏ^`dd„VญZค x๐เAฬ;™™™ธs็แโโR|๏ฝ๗p๚u|๒ษ'๐๗๗Gถm<฿kvyฌ[ท-Zด(ํpIrssq๊ิ)œ={ 6„ฟฟ?ยยยเ็็…B๖ํฃ}๛๖ธw๏ฦsss\นrfff…๖7iา$|๖ูgา๓ดด4†9""ข*ชย๖ศตjี G…ฉฉ)z๖์‰ƒhฃP(*juๅ’ศ”J%rss๑์ู3|๖ูgุฝ{ทด๗.33Sj—8-Zเ๛๏ฟว๔้ำ<฿ึฉS' 4_~๙%._พ\ฆšฬฬฬ`cchhh K—.*{?~Œ_~๙~~~ธ}๛6BCCQซVญbทัภภ@ๅADDDUS…นkืฎกN:1b‚‚‚’’‚๔๔ti~ณfอฐy๓fฯ}>y๒คฤ>๕๕๕ฅ><==q๐เAคฅฅแ๑ใวุณgš4iR่rํฺตรฏฟ*]-๚๐แร"ื๑์ู3(•Jใแร‡๘ใ? mw}!ะปwoL™2Eฺ‹่่่ˆŸ111ฐฑฑA฿พ}ัฆM›"๛พฬฬฬ FFFธqใ„8rไlmmŸ9œ‘””„ะะPDDD 00jjjฅ๊›ˆˆˆชถ ;ด‰นs็BSS&&&ุดiขขขเ์์Œ๛cิจQ๘๐รแเเ€VญZฉ์Uruu•‚ั!C0|๘pxxx`ภ€่฿ฟ?jึฌ‰cวŽแห/ฟDณfอใฦ+๔ฐ*๐ฐkTT ฎฎŽัฃGc่ะก…ถ522BŸ>}`ggsssxyyฺ๎฿ลภ!„€บบ:–,Yข2_WWC† ม!C u๕‚C๋๋๋‹ฟ๚ 077ว777,Xฐ~~~ศษษA๓ๆอัณgOฯ้w฿}'"&"""z‘B”๖rH’ฅดด4"1ภFŠฌส.GVrีซ!บ๗Jธo ตœg•]Žฌp์ส‡ใV~ปขีูR ฒณณhhhผกชช†ื9v๙Ÿ฿ฉฉฉลž&ลov """’ฉ ;ดZ}Žผผผ2ีlff@๗๎ง2ุฑc8p พ{Lž<๚๕+ถv•UMไฎ]ป†:u๊`ฤˆ BJJ าำำฅ๙อš5รๆอ›ปvํย“'OJ์S___๊รำำDZZ?~Œ={๖ I“&….w๕๊U4hะŸ}๖ผฝฝq๑โE•พสหลลแแแ€ญ[ทJำ 0v์XฤลลaธqXฟ~=5j„฿~๛ญิ}w้าGŽDFFยึึฐ~8::b๙่ำงฮŸ?)Sฆ VญZฏด-DDDT5TH‹ŒŒ„ณณ3p์ุ1รููฮฮฮ˜7oF…ฟุฝ{ทJ)์90`๚๗๏–-[ขnบ๘๒ห/ัฌY34mฺใฦƒ••Uกตlฺด ŽŽŽpuuEzz::u๊ggg<}๚ฎฎฎXฟ~}นถ๑‡~ภW_}WWW<~ธะ=]ญZตย๚๕๋q๊ิฉB๋[ณf ฬออ๑๏ฟขAƒ˜4i`่ะก8y๒$œœœ0kึ,๐ร์ปฟ;||| T๒ถDDD๔ขจc†คโษ“'ะึึ†Bกภฬ™3‘““ƒ้ำงWvY%JKKƒกก!๎~ื &Ze;ไ๛ฎหVhb๏{cะ้สOะY•]ฮ[A๙ูฑRตหฮฮFxx8|||Š<• โธ•วฎ8vๅ๗:ว.๓;55ตุำค*ไ๖#๏‚ำงOcธqศออ…ตต5ึญ[Wู%ั;NถA๎มƒhถญสด5j ""โตฌ/qDDDDo ู9+"""zง๑์y""""™b#"""’)9""""™b#"""’)9""""™b#"""’)9""""™b#"""’)ู˜สF๙๑v(ML*ป YQfgแแPŽ %ฟˆˆB#GDDD$S rDDDD2ลCซ๏ˆผฝSง๓vw+ป/ฉ์ˆˆˆช๎‘#"""’)9""""™b#"""’)9""""™b#"""’)9""""™b#"""’)9""""™b#"""’)9""""™b#"""’)9""""™b#"""’)9ํฺต+v~JJ VญZ%=๖์>๘เธนนแ๐แรฅ๎้ำงhถ-๔๔๔0qโD•67Zตjธนน•c+ˆˆˆ่]ฃ^ูT&!„ˆˆˆ(ถ]~2d &&8t่P‘ห๙x๔่Hkhhภฺฺฺ*หœ;wzzzhธ1ภิิTš็แแโ๔้ำฅ‡ฬฬLคฅฅฉ<ˆˆˆจjช2Anใฦhืฎbcc !โใใ๑ีW_!11๗๏฿ว๖ํw๏…ฟฟ?ฮ;KKK•~bbbฐfอฤลล!$$˜5kœœœ‹ &`ีชUุ่ฑ#bccabb‚ฬฬLฌ_ฟญZตย๐แรแ้้‰ . VญZฅช๒ๅหะึึ†ฏฏ/},YฒDšw๑โE๘๙๙a๚๔้๐๐๐ภ๒ๅห๑๘๑ใ"๛š={6 ฅ‡……E9F“ˆˆˆไ สZ๕๔๔ฤ€ T*4jิฎฎฎ€   ?~ะืืGวŽ ํงy๓ๆ011X[[ใๆอ›ะะะ(vะิิฤฺตkแ่่Xๆฺsssq๘qฤลลA__hูฒ%\\\ ฎฎŽ๎ปฃ{๗๎ธvํ†Šฯ?้้้…๖5iา$|๖ูgา๓ดด4†9""ข*ชส์‘kีชŽ= SSS๔์ู„Bกๆ+ ้นŽŽN‘hiiI?+•Jไๆๆ–ธ๎+Vภมม˜9s&๛๏ฟ2ีnff†ฦฃN:ะำำCปvํ/อ๐เ-Z???่๊๊b๋ึญลึo`` ๒ ""ขชฉสนkืฎกN:1b‚‚‚žžŽคค$ฤววC-[ถ E‹ๅ๊[__ฟศ=`เๅๅ…u๋ึแฤ‰ะีีEวŽแ็็‡ิิิR๕฿ธqcผyiiiศษษม‰'ะจQ#@฿พ}แๅๅ…ดด4์ูณ;v์@งNสตDDDTตT™Cซ‘‘‘˜;w.455abb‚9sๆภูู3fฬภ๙๓็ัชU+t๏ฝ\}›˜˜ภููฮฮฮ่฿ฟ?<== mWฝzuŒ7ใฦCdddกmœ๑๏ฟ"''ฟ๖bbbPณfMฬ˜1อš5J>๔ํฟ๖”ส*“น‰ˆˆจ‚T™ Œเเ`้yrr2ดดด๐ฟฏ@ทo๚ผu๋ึhบต4ล0ถqใF•e^lW˜็ฟธพ™พจkืฎฺ่ตk้]บt)v=DDD๔๎โn""""™ชฒAฮสส งNช์2ˆˆˆˆ^›*ไˆˆˆˆช:9""""™b#"""’)9""""™b#"""’)9""""™b#"""’)9""""™b#"""’ฉ*๓]ซT>ปvํย† 0n8L›6 QQQXธp!>๛์3@ฏ^ฝpๆฬฤววC[[๑‡ด^ฤฤฤ E‹=z4v๏;wbๆฬ™ลึ๛ฯ?เ่ัฃXฐ`F…UซV!::ƒฦท฿~[ไr<ภถm˜˜ˆธธ8|๑วPdนนน ƒz๔่บu๋โ์ูณpss+ีธ^ฝzีซWG๏ฝแๆๆ†ฉSงJ๓"##1lุ0,_พŽŽŽ˜?~‰‡]gฯž CCC้aaaQช:ˆˆˆH~ิKะำำ €RฉD`` Zถlฉ๒พะๅ:u๊$ํ…:t่ฅyjjj€ธธ8L:iiiHII……บu๋่าฅ ภษษ …ีชUƒฃฃ#ฎ_ฟ^lฝะะะ@zz:Nœ8!๕—››‹๚๕๋นœกก!๔๔๔0dศ๘๛๛รืืทุ>qyฌ[ท-Zด(q_–››‹SงNแ์ูณhุฐ!???( ดo฿ํทวฝ{๗0n8˜››ใส•+033+ดฟI“&IาาาๆˆˆˆชจRนVญZแ่ัฃ๘ใ?ะณgO,Yฒคภ๓ย’ŽŽŽ๔ณBกภูณgกTช๎:t(๖์ูฬŸ??–ๆๅŸ_ฆT*U~.้ท๕ๆๅๅกnบˆ-ะFMMM:Œ›™™ PWWGTT๖ํ‡๕๋ืc๛๖ํ๘๑ว‹์c๖์ู๘๙็Ÿ1hะ t๏C† Mฑตฝศฬฬ 666ppp๐<ธฦลลมฯฯ๐๘๑clผซVญ‚ฎฎ.BCCQซVญ"๛ำาา’อQีV๊Cซืฎ]C:u0bฤแ๘๑ใ*ฯ ฏฏ๔๔๔"๛hูฒฅt1D^^จYณ&ž={†อ›7ฟโ&ฉ244„ฑฑ1๖๏฿เ๙….\XZZ"66yyyุตk€็ม)55~~~˜;w.bcc‹ํรัั?3bbb`ccƒพ}๛ขM›6HNN.U}fff022ย7 „ภ‘#G`kk ๘๓ฯฅ๓CCCภภ@iO&ฝJไ"##แ์์ 777;v VVV*ฯ๛๕๋8;;รููYบHเE‹/ฦž={เโโGGG้‚…)Sฆเ๗฿G›6mJ}nYYฌ_ฟ๓ๆอƒ‹‹ \]]q๚๔iภิฉS๑ัGกYณfากส๔๔t๘๚๚ยลลบu“ฮ…+ช|บบบ2dฮœ9ƒ๙๓็C]ฝเฮN___",, ๆๆๆˆ‰‰,Xฐ~~~pvv†‘‘z๖์ hืฎ’’’0o<4hะ ยว…ˆˆˆไM!J{9$ษRZZ q๗่r˜hWv9ฅKส.กDููู‡444*ปYแุ•วญ8vๅวฑ+ฟื9v๙Ÿ฿ฉฉฉ000(ฒฟูˆˆˆHฆJ}ฑรh฿พ}๘๒ห/Uฆu๊ิ sๆฬฉคŠˆˆˆˆYนŽ;ขcวŽ•]QฅเกU""""™b#"""’)9""""™b#"""’)9""""™b#"""’)9""""™b#"""’)Y฿˜JOi฿J“ส.ƒˆˆˆ*๗ศษƒ‘L1ศษฯ‘{Gt>yฺชำฮ๖Z9ลQ…เ9""""™b#"""’)9""""™b#"""’)9""""™b#"""’)9""""™b#"""’)9""""™b#"""’)9""""™b#"""’ฉ*ไRRRฐjีชส.CEXX~๚้'ภž={เไไฅR‰คค$•vkึฌ์ํํ1sๆฬส(•ˆˆˆdFฝฒ จH๙Anศ!ๆๅๆๆBMMํี๒่ั#รฯฯOšfccƒ-[ถ`ฤˆ*m/\ธ€•+W":::::ธ{๗. 55P(oฌn"""’ู์‘ปy๓&š7oWWW8;;ใไษ“*ฯ“’’0eส$$$ภีี๓ๆอรš5kooo๔๏฿w๎Aทnเแแ–-[โาฅK€xzzยููD^^ u๋ึ?~<เ้้‰จจ(ดm๏ฝ๗v๏] ฦœœl฿พ:tภ่ัฃ<฿ำ6qโD@ƒ `ggW`น_~๙cฦŒŽŽภิิp์ุ1ุููaฮœ9Rธ#"""ส'› ทqใFดkืฑฑฑˆŽŽฦแร‡Už[ZZbึฌYprrBll,&L˜ˆวฎ]ปฐaรŒ7ำฆMCTT.\ˆฯ>๛ ะซW/œ9s๑๑๑ะึึฦ!ญืฤฤ111hัขFปwc็ฮ*‡?oธฏฟ๖๖๖ุตkพ๙ๆฌ_ฟพิv๙๒eœ={M›6E›6m่าฅ Ž9เyจ Bdddฑ}eff"--MๅADDDU“lญzzzbภ€P*• Dห–-Užบ\งN ฏฏ8t่ฅy๙‡Zใโโ0u๊Tคฅฅ!%%่ึญ€็a œœœ P(PญZ58::โ๚๕๋€ฟ๚ อš5รงŸ~Šจจ(”yrssq๋ึ-œZถl)]ีš——'ยฬศศ@อš5๑์ู3lผนLuUซV ƒ ยฉSง0o<:tถถถXฐ`Aฉ๛x๑๊นs็Pฝzu)tzzzb๘๑๐๖๖ฦนs็0gฮXYYู—–– TDDDT5ษๆะjdd$ๆฮ MMM˜˜˜ pvv–žoฺด &&&pvv†ณณ3๚๗๏š5kช๔ฑx๑b >K—.Evv6>๚่#899aส”)x๗QซV-ธนน•ปFWWW„„„เ๑ใว8}๚t๙Dpp0๎ป‡ึญ[ฃ}๛๖ E—.]hkkcๅส•ž๏M\ฟ~=6lX๎šˆˆˆจ๊RˆแQ•“––CCCธฏ@žถ๊ผณถVNQ2‘๐๐p๘๘๘@CCฃฒห‘Ž]๙pสcW~ป๒{c—๙+ฒขศๆะ*ฉb#"""’)9""""™b#"""’)9""""™b#"""’)9""""™b#"""’)9""""™b#"""’)9""""™b#"""’)๕ส.€Œ}=B`bbRูeQโ9""""™b#"""’)9""""™b#"""’)9""""™b#"""’)9""""™b#"""’)9""""™b#"""’)9""""™b#"""’)9""""™b#"""’)9""""™Rฏ์่๕BาำำกกกQษีศKvv6ž-- ธqใ ่บๅพ<วฎ|หฟ๊ธฝสบ฿†ๅ+๓5๗ช๋ีๅๅ๛๚ช๋ีๅซุ๊ !žž33ณb—gซโ”ส็งA–๛EฆฆฆV)หพ ห€Aน๚จ์ฺ+{y€cW^ๅทŠXwe._™ฏนŠXฟœ฿+Žซx]cWš0ผุJ4jิจJY๖mXพ2ื-๗ๅ+sr_พ2ื]™หWๆธUฤ๚ๅ^๙ช8v•ท~…(้,:’ตดด4"55๕•โxืp์สcW>ท๒ใุ•วฎ†ฑใน*NKK ำฆMƒ––Ve—";ป๒ใุ•วญ8vๅวฑ+ฟทa์ธGŽˆˆˆHฆธGŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAฎ [บt)ฌฌฌPญZ54iา๕We—T้Ž=Šฎ]ปยฬฬ …;w๎T™/„ภื_:u๊@[[ํฺตรๅห—Uฺ<|๘~๘! `dd„มƒใ๑ใวop+ผูณgรำำ๚๚๚055…ฟฟ?.^ผจาๆูณg5jLLL งง‡ž={โฮ;*mฎ_ฟ___่่่ภิิ&L@NNฮ›”7nูฒepvv–n๊ๅๅ…={๖H๓9nฅ7gฮ( |๚้งา4Ž_แฆOŸ…Bก๒ฐตต•ๆsŠ๗฿ก_ฟ~011ถถ6œœœ%อซ>+UI›6mšššโื_็ฯŸC‡FFFโฮ;•]Zฅ SฆLทoฤŽ;Tๆฯ™3GŠ;wŠธธ8แ็็'ฌญญลำงOฅ6:u...โิฉSโุฑcขAƒขOŸ>oxKฌŽ;ŠีซW‹s็ฮ‰ุุXแใใ#๊ีซ'?~,ต>|ธฐฐฐQQQขiำฆขYณfาœœแ่่(ฺตk'bbbDxxธจQฃ†˜4iRelา&v๏-.]บ$.^ผ(&Ož,444ฤนs็„ทา๚๋ฏฟ„•••pvvcวŽ•ฆs 7mฺ4แเเ nบ%=๎ป'อ็ธํแร‡ยาาR 0@œ>}Z\นrE์ทO๗฿R›ท้ณ‚AฎŠjธฑ5j”๔<77W˜™™‰ูณgWbUo——ƒ\^^žจ]ปถ˜7ož4-%%Ehii‰7 !„HLLฤ™3gค6{๖์ …B๗฿oฌ๖สv๗๎]@9rD๑|œ444ฤึญ[ฅ6.\ฤŸ)„xข•Jฅธ}๛ถิfูฒeยภภ@dffพู จdฦฦฦbีชUทRJOO666โภย[ rฟขM›6Mธธธ:ใVผ/ฟRดhัขศ๙ogญVAYYYˆŽŽFปvํคiJฅํฺตรŸY‰•ฝฎ^ฝŠทoซŒ›กก!š4i"Ÿ ###xxxHmฺตkฅR‰ำงOฟ๑š+Kjj* z๕๊€่่hdggซŒญญ-๊ีซง2vNNNจUซ–ิฆcวŽHKKร๙๓็฿`๕•'77›6mBFFผผผ8nฅ4jิ(๘๚๚ชŒภื]I._พ 333ผ๗{๘๐รq๚uท’„……มรร055…››Vฎ\)อ>+ไช ๛๗๏#77Wๅjีช…ทoWRUoฟฑ)nn฿พ SSS•๙๊๊๊จ^ฝ๚;3ถyyy๘๔ำOัผys8::x>.ššš022Ri๛๒ุ6ถ๙๓ชฒ„„่้้AKK ร‡วŽ;`ooฯq+…M›6แ์ูณ˜={vyฟข5iาkึฌมฝ{ฑlู2\ฝz-[ถDzz:วญWฎ\มฒeห`ccƒ}๛๖aฤˆ3f ึฎ] เํ๛ฌPฏะˆจส5jฮ;‡ใวWv)ฒัจQ#ฤฦฦ"55ถmCpp0Ž9Rูeฝ๕nธฑcวโภจVญZe—#+;w–~vvvF“&M`ii‰-[ถ@[[ป+{๛ๅๅๅมรร฿}๗ภออ ็ฮCHH‚ƒƒ+นบ‚ธGฎ ชQฃิิิ \t็ฮิฎ]ป’ชz๛ๅMqใVปvmฝ{We~NN>|๘NŒํ่ัฃฑkื.>|ๆๆๆา๔ฺตk#++ )))*ํ_ปยฦ6^Uฆฉฉ‰ ภณgฯ†‹‹ ~๑GŽ[ ขฃฃq๗๎]ผ๛PWW‡บบ:Ž9‚Ÿ~๚ ๊๊๊จUซวฏ”ŒŒŒะฐaC๗฿|• N:ฐททW™fgg'š~>+ไช MMMธปปใเมƒาดผผ<}Z7///คคค ::Zjs่ะ!ไๅๅกI“&oผๆ7EัฃGcวŽ8t่ฌญญUๆปปปCCCCe์.^ผˆ๋ืฏซŒ]BB‚ส›```PเMณชหหหCff&วญmถEBBbccฅ‡‡‡>๐C้gŽ_้<~๓๊ิฉรื] š7o^เ๖J—.]‚ฅฅ%€ท๐ณขB/ ทฦฆM›„–––XณfHLLฑ022Rน้]”žž.bbbDLLŒ .\(bbbฤตkื„ฯ/)722ฟปˆบu+๔’r777q๚๔iq๘qaccSๅo?2bฤahh("##Ung๐ไษฉอ๐แรEฝz๕ฤกC‡DTT”๐๒๒^^^าt่ะAฤฦฦŠฝ{๗Šš5kV๙Lœ8Q9rD\ฝzUฤวว‹‰' …B!๖๏฿/„เธ•ี‹Wญ ม๑+ส๘๑ใEddคธz๕ช8qโ„hืฎจQฃ†ธ{๗ฎ‚ใVœฟ๚Kจซซ‹Yณf‰ห—/‹๕๋ื ๑oฟImฆฯ น*l๑โลข^ฝzBSSS4nXœ:uชฒKชt‡ <‚ƒƒ…ฯ/+๊ซฏDญZต„–––hถญธx๑ขJ<}๚๔zzzยภภ@ 8PคงงWยึผ9…ฑz๕jฉอำงOลศ‘#…ฑฑฑะััปwทnR้'99Yt๎Yhkk‹5jˆ๑ใว‹์์์7ผ5oึ Aƒ„ฅฅฅะิิ5kึmถ•Bœทฒz9ศq ืปwoQงNกฉฉ)๊ึญ+z๗๎ญr4Ž[๑๘ใแ่่(ดดด„ญญญXฑb…สท้ณB!„ปˆˆˆˆž#GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDTA222`ooวWv)*๐็Ÿ–i+++?~5UT6—.]BำฆM+ป ขทƒUVVVะีีEFF†4ํษ“'ะืื‡•••J;่้้มฤฤฝz๕ยฃGT๚Š-sx Aทn งง๗JQัฮŸ?/}™๗๋‰ จL0`fฮœY๎>6lˆฺตkใ?xี๒ˆช9"ชR๊ึญ‹;wJฯwิฉSง@ป๛๗ใ๑ใวธ~:ฒฒฒ๐ํท฿ชฬ฿ปw/:u๊Tฆu๒ห/่ำงOน๊.‹œœœืพŽทEถ๖้ำซVญชไjˆ> rDTฅ๔้ำ๋ืฏ—ž๖o๘๐ร‹lฏซซ ???\ธpAez~{๚๔)๚๔้ƒ๊ีซฃz๕๊hูฒeก\ฟ~7o„“““4อสส ๓ๆอƒ๔๕๕๑๕ื_ใโล‹๐๐๐€กก!†.ตอหหรดiำ`aa:u๊`ฬ˜1ศฬฬฌYณmฺดมฐaร`hhˆีซWใแร‡่ท/LMM๑{๏aํฺตEnใ‹‡Iwํฺ…FI{)7mฺTไr'OžDร† abb‚ฯ?yyyาผฅK—ยฦฦ5jิ@pp0222››‹ฮ;ใส•+ะำำƒžžึฎ]‹๕๋ืใoฟ…žžžดอ hีชŒแ๎๎Žจจ(ฉo…B%K–ภฺฺmฺดดjี |งB,Qฉ"ข*ยาาRDFF sssq๗๎]q๗๎]ann.Ž?.,--Uฺ;vL!Djjชฺ่ตซ˜6mš4?--Mิฎ][ไๆๆŠeห–‰ฎ]ปŠ'Ožˆ์์lq๔่ัBืฝkื.แ๎๎^ ooo๑เมqแยกฅฅ%ฺทo/ฎ_ฟ.nบ%jีช%:$„bลŠย^ธqCฟ_4kึLชi๕๊ีBMMMฌ^ฝZไๆๆŠ'Ož1~x๑์ู3qแยQงNWไธไooญZตฤ๑ใว…BบuKœ?พศe\]]ลญ[ทฤ'์ํํลชUซ„BlูฒE8::Šไไd๑ไษังO1~x!„‡๕๋ืW้+88X|๛ํทา๓๔๔taff&ถm&rrrฤŽ;„………x๚๔ฉBยฯฯOคฆฆŠ'OžHหˆคคคB๋%zWqU)jjjภๆอ›ฑy๓f๔์ูjjjฺu๎FFF066ฦฅK—0bฤiมƒแํํ ฅR ฤฃGเ้้Yl[---๔๏฿ัััธ>€็Bt์ุ ฉฉ‰oพ๙—.]ยพ}๛๐ใ?"22ฒ@?NNN๘็Ÿส]ณ™™ฎ_ฟ.=ฟ~:ฬฬฬค็ …B๚นnบะำำรฃG’’‚””คงง#$$คฤ๕4iาปw๏ฦ;wเโโขฒ'๒e7nP๙9ข‘บu๋bํฺตาบSRRค+…_ฌณฐฺ๓—๏ุฑcๅ๛๖ํ[ไ2ทo฿FNN๊ืฏ_โ6ฝKไˆจJฺพ}{ฉ5fggcร† 055…‰‰ ’’’``` …–ร‡ใ๙๓ศหหƒิีี =Tkii‰ฺตk#!!ก\๕๖๎ ,ภ‡‡โoฟEPPPกm๋ึญ ///L:Ož}Šฝ{๗{ุ๔่ัฃ๘เƒ ฎฎ^์6ฝkไˆจJฒทท/๖ฏ:@OO5jิภแร‡ฑs็N(Šทนu๋a``OOO 6ฌศ๓ไฌr^[Y <ปwGใฦaooLš4ฉศ๖๋ืฏวฟ‹๗{ฆฆฆ๘๔ำO๑๔้ำืณvํZXZZยุุภ’%KŠlซW/ดlูŽŽŽh฿พ=เ๙•มƒ†ฏฏ/ เํํ-…H;;;t๋ึ 022๐<๘>}FFF9r$ ฑ{๗n,^ผฆฆฆฐฒฒยŠ+Šญ{ใฦ:th‰G๔ฎQ!DeAD๔ถ่ิฉ&Nœˆึญ[—yูŒŒ xzzโฏฟz๋n ,g—/_F๑็Ÿz่–่]ฦ GD๔‚นs็bธqะะะจ์RˆˆJฤ GDDD$S}ร‡G:u`llŒ*Uช {๗๎ธt้าืS”ฏƒฝ“ปwc๊ิฉล]Qฑzำ 7kึ,:tu๊ิฎฎ๎k`ร† 9ฆoบ๕Mสคท๔๔้SL:ตุ‚ิฉS฿8<{๖ _๕๛)๊=Yฑb.^ผ๘Vหๆ๗ท่๔้ำhธ1ฆNŠ  Yณf˜9s&ฺถm F#ต›5k~wดhั ,ภgŸ}†#GŽ nบ8w๎ี๓ถฏx'•xฉฉฉ066.๎2dEดด4ฝ๑ฒ‡–๖ฦไิ___lุฐ_~๙ฅึ๔๕๋ืฃ}๛๖๘๗฿฿ธ†าDฃั ##†††ล]ส{๕๒8ๅ8V==ฝ๗า๏ฑcวrLซVญฦŽ‹ฟ}๔เ‹/พภ๚๕๋กฏฏ/ต๋ัฃ\\\0sๆLฌ]ป๖ฝิ๗ฎธGŽrx๖์jีช…Zตjแูณgา๔GกRฅJ๐๖๖FVV๚๕๋‡ล‹xq>F๖#[jj*ฦŒ;;;ภษษ s็ฮ…Bk}ซVญB๓ๆอamm 8;;c้าฅoT๓•+WะฆMรฦฦ฿}๗]Ž๕h4ฬŸ?u๊ิกก!*Tจ€มƒใ๑ใวZํะกC;v ๕๋ื‡กก!ชVญŠ_5วz1z๔h888ภภภถถถ่ทoŽsฬ4 ฆOŸ[[[ขE‹๘็ŸดฺdŸ+”)SีซW—ฮฏ;|๘04h###899!44Tk๙kืฎa่ะกprr‚‘‘ฌฌฌะญ[7$$$hต[ฝz5 >ŒกC‡ยฺฺถถถynkืฎกz๕๊PฉTธ{๗.€{(โใใ |.ฉSงเ๋๋ KKKรีี ,ะjs่ะ!4nฦฦฦฐฐฐ@็ฮqแยญ6ู‡๙็๔๋ื077G๑๔้SฉJฅBณfอrิกัhPนre๘๛๛kM{“๗ลพ}๛เแแ###,[ถ …ฉฉฉXณf๔;ืกาl๖๖๖Zฟ+ฏำซW/DEE!>>^šv็ฮ:tฝz๕*p?ู‡`ทo฿•JิฉS{๗๎ีj—ืนJู?ท>7o gggมหห ฑฑฑ€eห–กz๕๊044DำฆMsผณ9s022‚ฃฃ#‚ƒƒsดIOOวไษ“Qฝzuภฮฮ_~๙%าำำsญiบuจSง ค1nธ๕๊ีƒฉฉ)ฬฬฬเโโ’ใฝ๘ฒ„„”/_0u๊T้5~๙0^AปyYธp!๊ิฉƒ2eสภาาXฟ~=€{ธqGGGiู0ฟqพZcAw€FŒrๅสมิิ:uยอ›7s๔™’’‚QฃFIŸึึึhีชฮž=+ตy“ฯŠW฿w P(˜;w.–/_Žjีชมภภžžž8}๚ดึr๙-สM๖z^cๆํํญโ FจSงN_Oเ๕ฏ[กDน8y๒คะััฃG–ฆ###q๑โE!„'NœญZตDHHˆ๔BF#š7o. …8p Xดh‘ุ่ฑฃ Fฅต.OOOัฏ_?๑ำO?‰… Šึญ[ bัขEฏญ300PŠ5jˆ>}๚ˆE‹‰:โ›oพัj;pเ@กซซ+ $‚ƒƒลW_}%Œ…งงงศศศฺู '''QกB1qโDฑhั"Qทn]กP(ฤนs็คv)))BฅR 1hะ ฑt้R๑๗฿ OOO)„",,L๎๎๎ข^ฝzโงŸ~SฆLeส”๕๋ืืชฯววGุุุ;;;1n8ฑpแBแ์์,tttฤฦEลŠล”)Sฤ๙๓Eๅส•…นนนHNN––฿ผyณpss฿~๛ญXพ|น˜8qขฐดด๖๖๖"55Ujทjี*@8;; ฑpแB1sๆL!„“'Oฤ๛๗…B๓ฯ?ขJ•*BญVKำ^ืไษ“_๛ํ฿ฟ_่๋๋ {{{1y๒dฑt้R1bฤัฒeKฉอ„ฎฎฎจYณฆ˜={ถ˜:uช(WฎœฐดดWฏ^•ฺeื็๎๎.>๘cฑdษ1pเ@@|๙ๅ—Rป๏พ๛N(•Jq๛๖mญZ>,ˆอ›7ฟี๛ขz๕๊ยาาRŒ?^‹ฐฐ0" Dใฦฅ฿'Nผvปd366นฮห๏ฝ{๗„ญญญึ{z๙ย\คฅฅ bุฐaฏ]แๆๆ&*Uช$พ{1|QตjUQฆL๑เมฉ]`` ฐททฯณžW๛tuuvvvbๆฬ™bๆฬ™ย\TฉRE,ZดH8;;‹Q|๕ืB___4kึLk๙์๗ฝตตต>|ธ๘๙็ŸEฃF๑ฟOj—••%Zทn-ส”)#F%–-[&†.tuuE็ฮsิTปvmQพ|y1u๊Tฑx๑b)๖๏฿/ˆ-Zˆล‹‹ล‹‹แร‡‹nบๅนอž}ฤโล‹E๗๎…››[Ž>{๕๊%๔๕๕ล_|!Vฎ\)fอš%:v์(ึฎ]+ตy“ฯŠW฿wWฏ^•jฎ^ฝบ˜5k–˜={ถ(Wฎœฐตต•~?๓๛[”-33Sฟ_ผyS์ทOิชUK˜ššŠ‡ๆ[“Fฃ•+Wญ[ท~mู^๗บ69สำ„ „RฉGŽ›7oฤ๙๓ตฺ 6,วปBl฿พ]ำฆMำš๎๏๏/ …๘็ŸคiOŸ>อฑ|›6mDีชU_[c``  >sišFฃํท๚๚๚R๘8z๔จ ึญ[งตฝ{sLทททฤ‘#Gคi๗๎bฬ˜1าดoฟV[ทnอQ—FฃB‡XํฺตEzzบ4ม‚€ˆ•ฆ๙๘๘b๚๕าด๘๘x@(•Jq๒ไIi๚พ}๛ฑjี*iZn๑ฏฟฤฏฟ*Mหr5ฯŸ?ืjrปpแ‚ฐฑฑžžžโัฃGZํ ๚แ๙sแ่่(์ํํลใวsFBกVซ…ตตตึ‡jttดP*•ขo฿พ9๊0`€V_]บtVVVา๓‹/ bแย…Zํ†*LLLคm๕6๏‹ฝ{๗ๆg~a์u ไ๎฿ฟ/ฦŽ+ชWฏ.อ๓๔๔๛๗Bˆ7 r๚๚๚Zฟััั9ถี›9ญะฒlู2@TฌXQ๋?&Lดฺfฟ๏๑GiZzzบ๔žศc"”Jฅ8z๔จึ๚ƒƒƒq๘qญš”Jฅ8ผV‘#G 33ณ๏๛ืน~ž๏๗‚พwsำนsgQงN|ฬ™3'ว6ห–ื8ณ็ๅไ^๗ปsๆฬ™\รฏ_ฟ}š››ฟ๖}WAฮสสJ๋3่?ฤŸ)Mห๋oQถ์ฯย์‡“““ {mM!!!9SQ๙ฝn…‡V)OSฆLA:uˆกC‡ยวว#FŒ(ะฒปw๏†ŽŽNŽ๖cฦŒ{๖์‘ฆฝ|ŽQRRป๏—๛Hฯœœ`aaฺตkฃAƒา๔์Ÿ_^ๅํ˜™™‰‡ขz๕๊ฐฐฐะ:ิ‘mะ Aะััษ1ฮ;888 44–––Z๓›6m !ฤkฏXŽŒŒฤีซW1jิ(XXXhอหFทo฿FTT๚๕๋‡ฒeหJ๓]]]ัชU+์ฝ;GฟAAAZฯ7nŒ‡"99PณfMจีjlฺดIj“••…-[ถ cวŽาถzำ๗…ฃฃ#ฺดi“๏˜฿—^ฝzแŸม้ำงฅ฿ไฐjถ–-[ขZตjาsWWW˜™™ๅx/พ‰-Zhห~vํฺฆฆฆ9ฆฟบ.]]] ฆL™๒N!xš ยฬฬ -[ถD็ฮ1kึ,Œ3;wFtttฎํ๏นƒ๖ํร[ถlษ๓?ฝ^ตJ๙ฺทo -- —/_.๔?d๛/ZดhZตjaผyฐณณƒพพ>v๏Ÿ~๚I๋า๐wกัh`mmu๋ึๅ:?๛dๆlyาŠW. (จ‚๖—Wป‚,๙็ŸcีชU5jผผผ`nn…B€€€\ทc~W[vํฺkึฌมบu๋ด๖”|( ฒ=z๔่ &`๓ๆอ5j~๛ํ7˜››ฃmถR›7}_ผอช…ฉWฏ^Xบt)LMMัฃG(•o๑‚lปผร–••๕F}ๆ๏‘Fฃ‹‹ ๆอ›—๋WCcnฏ•ตต5ขขขฐo฿>์ูณ{๖์มชUซะทo_ฌYณๆkzWตkืฦล‹ฑs็N์ปฟ;–,Y‚oฟถภทuzำ๗daพ&ปwGใฦฑm6์฿ฟsๆฬมฌYณฐu๋Vดkื๎๛หKaภวŒ>}๚`ใฦpssำš—””„vํฺ!11G…อ[ฏง(0ศQžbbb๐w฿กˆŠŠยภ+ฏศ๛฿กกกHIIัฺ+—}ีฝฝ=เฯ?Dzz:v์ุก๕ฟฎW“ไGฃัเส•+าฬH7pฬ>SญZ5„††ขaร†…๖วธZตjo|oก๗iห–- ฤ?(MKKK{ซ๛อ™3บบบ:t(LMM฿๊้นs็ะฒeห\dฟrปT||<ส•+๗VทFqttD๚๕ฑiำ& >[ทn…ŸŸ ด๊+Œ๗ล›\๚.z๕๊…oฟทo฿FHHศ{[ฅฅeฎ๏›—๗คฆ[ทnๅธNnฟรัััhัขล;mo}}}t์ุ;v„FฃมะกCฑlู2|๓อ7น๎u๒œํฝkllŒ=z GศศศภวŒ้ำงcย„ 044,ฒ๗V6{{{h4\ฝz5jิฆฟz•}ถJ•*a่ะก:t(๎ป‡บu๋b๚๔้…ไ โMทSzz:4MŽฃiiiุ่ฑ#.]บ„ะะะ7:l.๕ผ Zฅ\effข_ฟ~ฐฑฑม‚ ฐz๕jฝ{ฃGึj—!๕๊‡พฏฏ/ฒฒฒฐhั"ญ้?๔ …๔Kž?ญ—g•””„UซVฝQฝ/ฏGE‹AOO-Zด๐โŽYYY๘๛๏s,๛๙๓ท ;]ปvEtt4ถm–cปO๑m้่่ไX๏ย… ๓‹’…Bๅห—ร฿฿ุฑc‡ึ‚R nบpttฤ๙๓slใ์Z+UชตZ5kึhต9w๎๖๏฿__฿7ฎ?[=p๒ไI๒ห/x๐เึaU ๐ฦฦฦErใฯjีชa๙˜1c๊ืฏ^ื“””„˜˜iฺํทs}ฏ†็ฯŸcูฒeา๓ŒŒ ,[ถ ๅห—Gฝz๕ผxญnผ‰+VไXูณg๙ยฬ๖๐แCญ็Jฅฎฎฎใ&/+Sฆ €œŸs๏๚}ต}}}8;;CฬฬLyฦพ/ู็€.YฒDk๚ย… ตžgeeๅAึึึฐฑฑัฺ–ozซขท•ืvJLL”ถๅหVฎ\ ๐๐๐ฆeeeกG๘๋ฏฟฐy๓fxyyz=๏๗ศQฎฆM›†จจ(ญuT  Ÿ…Q7๓oQxx8FŒิจQ8z๔(ถn |๒ษ'RcฦŒมŽ;ะฑcGsQพ|yกP(ด.NIIฃG666BOOOิจQCฬ™3G๋ถBฑcวแ๊๊* …ƒƒƒ˜5k–๘ๅ—_ t้v`` 066๛ฏtฉ *ˆษ“'‹ฌฌฌํ—/_.๊ีซ'ŒŒŒ„ฉฉฉpqq_~๙ฅธu๋–ิฦ^ดo฿>วฒ>>>ยววGkฺร‡ล๐แรEๅส•…พพพฐตตา=นฒ/ฝ๙พeBe๕/฿>ฤวว'ื[ไU^นๅฤใวEEนrๅ„‰‰‰hำฆˆ๖๖๖Zททศพศ้ำงs๔๙๊}ไ„xq[abb"ๅMn) „วŽญZตฆฆฆยุุXธบบๆธ5Hhhจhุฐก022fffขcวŽ"..๎ต๕ฝ<ฆ/ 6ฤภ๓ฌ๏]BผธML“&M„‘‘‘๐ฺ[‘d฿6'ทวห๏‰ผฦ๛ชW฿ oฺ๎ี๗ˆ/๎งRฉ„พพพprrkืฎอ๓๖#ฏ๖™ž3gŽึ๔~ฒ฿๗ยหหK {{๛\๏#™‘‘!fอš%๊ิฉ# „ฅฅฅจWฏž˜:uชHJJzํ8ทlู"Zทn-ฌญญ…พพพจRฅŠู๗œLOOใฦnnnา๏ต›››Xฒd‰V…q๛‘W฿Gน/ฏฟE๓่ทฏจZตช022†††ขN:b๒ไษ9๎๋–}+œผo*ฏืญฐ)„(†c@DDD$QQQpwwวฺตkัปw๏โ.‡^ยsไˆˆˆH๒๒W3f›?>”J%š4iR Q~xŽIfฯž3gฮ Yณfะีี•nี๒ูgŸๅธอKi๓ไษ“ืHธ|๙๒Ez฿9Z%"""ษ0u๊Tฤลลแษ“'จRฅ ๚๔้ƒI“&AWทt๏™2eสk๏๑w๕๊Uญo:y฿ไˆˆˆˆ เส•+ฏ๖ŠFมะะฐˆ*b#"""’-^์@DDD$S rDD๙ธqใ ฿๘หฬ?dแแแP(็พš6m •J๕๎E}>๚่#|๙ๅ—ล]ัa#ข๗n๕๊ีP(P(8v์XŽ๙BุููAกP C‡Z๓ฒ—ห~รููำฆMรำงOs]_ll, ๛๏wฎป๏พCƒ ะฐaรw๎‹ ๆ‡~ภ๖ํsL?qโฆL™๒พ๖่ซฏพยโล‹q็ฮ๗า?ั๛ภ GDEฦะะ๋ืฏฯ1๐แร๘๏ฟดพะeญZตBHHBBB๐ใ?ย฿|๓ smฟkื.X[[รำำ๓๊ฝ>ึฌYƒ   w๊็CำคI<{๖์ƒฝ'X~An๊ิฉ๏-ศu๎fff9พg”่CVบฏ#&ข"ๅ๋๋‹อ›7ใ็Ÿึบม๚๕๋Qฏ^ฝ<ฟXปfอšZ฿s„ŒŒ lบiii9ฎฝ{7ฺตk'}/ไZปv-tuuัฑcวw๊ง0ฅฆฆพ๓๗5*•ส"ฝช๎C๗๔้S”)SJฅ๘๕ื_1u๊ิw~๎‘#ข"ำณgO<|๘ฆedd`ห–-่ีซื๕UฑbE(Š๗ตJLLฤ‰'ะพ}{iฺฦQฏ^=˜ššยฬฬ ...Xฐ`มkืฑ}๛v4hะ&&&Zำณฯ ‹‰‰ส”)ƒ๊ีซcห–-^์alะ ŒŒŒเไไ„ะะะ}GFFข]ปv033ƒ‰‰ Zดh“'Ojตษ>$}๘๐a :ึึึฐตต•ๆ๏ูณ7†ฑฑ1LMMัพ}{œ?ตใสํนห—/ฃkืฎจXฑ" akk‹€€$%%ฝถ?8sๆ ผฝฝaddGGG็h“žžŽษ“'ฃz๕๊000€พ๒KคงงKm RSSฑfอ้pzฟ~0eสŒ7เ่่(อKHH–]ปv-๊ีซ###”-[ธqใ†V ูฏ™3gะคI”)S'N”ๆทjี ืฎ]CTTTฦMTไˆจศ888ภหห 6lฆํูณIIIศsนดด4๛์3\นrฅ@‡1?~ ___ิซWณgฯ†ญญ-† ‚_~๙EjฃัhะฉS'ฬ;;vฤย… แ็็‡Ÿ~๚ =z๔ฺ…„„ภภภ7–ง<1z๖์ ๘้งŸคyๅห—LŸ>}๛๖E50o<Œ5 D“&MrŒแแร‡hืฎิj5ๆฯŸfอšI๓๊ีซ%๊โ*แั{ถjี*@œ>}Z,ZดH˜ššŠงOŸ !„่ึญ›hึฌ™B{{{ัพ}{ญeไ๚๐๓๓iii9ึีงOแใใ#=9rค033ฯŸ?ฃš๙็@,\ธ0ว<@ฌ_ฟ^š/ฅR)Nž<)M฿ทoŸ VญZ%M๓๓๓๚๚๚โ฿•ฆบuK˜ššŠ&MšHำฒท[ฃFด๊OIIbะ AZuนsG˜››็˜ชฐฐ0@„…… !„ˆŒŒฤๆอ›๓฿(นศ?๘ฃ4-==]จีjamm-222„B„„„ฅR)Ž=ชต|ppฐ Ž?.M3669ึ5gฮ@\ฝzUkzBB‚ะััำงOืš+tuuตฆgืœ็˜๔๕๕ล!C^;vข๗ศQ‘๊ฝ;ž={†;w"%%;w๎|ํaีฮ;ใภ8pเ๘ใL˜0{๗๎Eฏ^ฝ ^บงนFฃมฝ{ตซZXX 55U๋pnA<|๘`ii™๋|ญฝˆNNNฐฐฐ@ํฺตั Aiz๖ฯูwƒฯสสย๛แ็็‡ชUซJํ*Uช„^ฝzแุฑcHNNึZื Aƒดพป๑ภHLLDฯž=ฅ=•<€ŽŽ4h€ฐฐฐ7ซนน9€{3๓บ8?บบบ>Jฅ๒ตกฆZตj^„ิ—๗Tพ+ธธธเ๋ฏฟฦ‰'ะฐaCcฺดi๙.w๋ึญทEนt้€ธdื-ZผvoW^๓๓š^ญZ5!เ่่(ํ |[7oDFFjืฎNž#GDEฮฤฤK—.ล”)S๚m๙'ภออ p๗๎]œ={V๋ฐ*๐็บeS*•puuญ^ผJOOˆˆˆxซ๚๒ขฃฃƒึญ[ใ?ะบบ๔๎ปXฟ~=5j๔ฺCฃmฺด™™~๘แdffๆ˜7ช)99Y ฦู\\\ T*๓Fูž?Žeห–Iฯ322ฐlู2”/_^บ ด{๗๎ธy๓&VฌX‘c๙gฯž!55Uznllœ๋ีฒูA๑ีy1ttt0u๊ิ{>…9๙ษ>งฯปภห'๎‘#ขb‘ืท2ไๆาฅKXปv-€7o=y๒$ึฌYƒ๊ีซฃOŸ>^V544ิบ• 8=B๓ๆอakk‹kืฎaแย…Pซีฏ๋านsgLš4 ษษษo|Y~ฆM›† QฃF:t(tuuฑlู2คงงc๖์ูฏ]ฬฬ K—.EŸ>}Pทn] |๙๒ธ~:vํฺ…† bัขEฎ็ะกC>|8บu๋†š5kโ๙๓็ ŽŽบvํ๚ฺๅmll0kึ,$$$ fอšุดiขขขฐ|๙r้ด>}๚เท฿~CPPยยยะฐaCdee!>>ฟ๖๖ํ/nŠy๓ๆมฦฦŽŽŽhะ  'Mš„€€่้้กcวŽจVญฆM›† & !!~~~055ลีซWฑm6|๖ูg;vlถลPฅJธปปx๛ซโป`–ˆJ‹—o?’Ÿ‚~DGGGฺฺุŠฯ>๛Lฝ{Wj็๏๏/|}}s๔นeหับukamm-๔๕๕E•*Uฤเมƒลํท_[๗ปw…ฎฎฎ ัš๎ใใ#๊ิฉS ๚ณว0lุ0ญigฯžmฺด&&&ขL™2ขYณfโฤ‰Zm^ทยยยD›6m„นนน044ีชU๚๕๙Ž๋ี\นrE 0@TซVMŠฒeหŠfอš‰ะะะ|๛โทEDD„๐๒๒†††ย^,Zด(GŒŒ 1kึ,QงNa`` ,--Eฝz๕ฤิฉSERR’ิ.>>^4iาD Zท"๙๛๏Eๅส•…Rฉฬq+’฿]4jิH cccQซV-1lุ0q๑โล๕ๆ&++KTชTI|๕ืฏ7ั‡B!ฤ;œKD๔x9ฌฌฌ0cฦ :ดP๛๔ำOq้า%=zดP๛ฅฯ๖ํัซW/๛๏ฟจTฉRq—CT rD${๗๎ร’%K0x๐เB|๚uิฌYDร† ตo๚ฐxyyกqใฦ:ผM๔ก`#"""’)^ตJDDD$S rDDDD2ล GDDD$S rDDDD2ล—pทn‚ฉฉ)ฟšˆˆH&„HII ”สผ๗ป1ศ•pทnzง/ฃ&""ขโsใฦ ฺฺุๆ9ŸAฎ„355\ฝzeห–-ๆjŠ^ff&๖๏฿ึญ[K_Tšpi?ภmภ๑หwษษษฐณณ“Ž็…Aฎ„ห>œjjjZจ฿)™™™(Sฆ ฬฬฬd๗K\8~Žฟ4เ6เ๘ๅ?ืล‹ˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆt‹ป*mๆ‡F฿คธห(r๚J * ๑์#ศะ(Šปœ"ว๑sฅyทม‡0ณ฿4/–๕–#GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S๏5ศ๙๛๛ใฃ>*๔~w์ุŸฐ}๛v๓ฯ?๏g@@ยรร฿นŸW๙๚๚"##iiiจ_ฟ>ิj5T*VฌXx๘๐!Zดhgggธธธ`๓ๆอ…^•Lบ๏ซใ@GGงะ๛อสสBงNค็ทo‡กก!ชWฏ^่๋z[™™™ศศศ€ฑฑ1v๏ B ,, ฦฦฦHMM…‹‹ บu๋ฅR‰™3gยำำ๗๎CบuักCแ๑ใวฐดด,ๆัั‡ชP๖ศญXฑ...pssรไษ“‘™™‰~๘_u–4hยยยnnn๘้งŸ8qโVฏ^ ๘๘๘ OŸ>Xฝz5ฦSงNaวŽ6lิj5RRR๐๗฿ฃqใฦจ[ท.บu๋†งOŸๆนoพ๙NNNhบ5>|(M฿ตk>๚่#จีjAฃัไ:ฮW%$$`โฤ‰จUซ.]บppp@ZZ Œ้้้ะh4ะh4ฐดด„งง'ภฺฺVVVx๘1ภฯฯ …ข@2==ษษษZ"""*™9ศลฤฤ`๑โล8~8ขฃฃ1rไHฬ›7055ีjŒเเ`@DDhุฐ!Nœ8ไไd่๋๋ใฤ‰€3gฮ ^ฝzาzv๎‰๕๋ืK5hะ:uยโล‹Œ7;v์ภูณgQฟ~},Yฒ$ืบ๛o8p็ฮรชUซp๒ไIภƒ0|„‡‡#** :::ุบukฎใ^์!ฑc|}}๑๑วฃrๅส8{๖,sฌ๓ูณgpssƒฦ‡ฒeหjอŒŒDVVlllแแแยมƒ๑฿xqU้—cœ=จT*,Yฒ‘‘‘จQฃz๕๊…fอš!!!Ak}๗๏฿Gbb" %%แแแprr :0`€ึ2cวŽ…ซซ+โใใ‚ะะPt๋ึํฝ\DBDDD๒๓ฮANฅRa๘๐แ๐๖๖†››[ž{ฎ€ผฯ‘^^-_พ<ŒŒŒะฐaCผy3วฉ`๒ไษPซีHOOว๚๕๋777xyyๅไ๊ืฏ-Z@ฅRกากTkkk,^ผ;w†ซซ+Zทn{๗๎ฝvœฦฦฦ8p NŸ>นs็BWW{g็ํทัฌY3ธนนมC† ซซ+ฮ;‡•+Wb๏ฝPซีPซีˆ‹‹ดlู๑๑๑˜3gฮuU.}ข —C’,%''ร๕พ}“โ.งศ้+&จž`ฦ9dhฏ_ „แ๘9า<~€เCูošหzทฝ{7|}}กงงWluผ์ฟ฿IIIา๙๙นแ7;ษิ{ป!๐‡คAƒHOOืš๖๗฿C__ฟ˜*""""zwฅ"ศ:uชธK """*t<ดJDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2U*nLภพQ aeeUeน์๏ู;๚eู}ฯ^aเ๘9า<~€ ดฟ4เ9""""™b#"""’)9""""™โ9rฅฤคฝ—ก[ๆ^q—Qไt…ๆJ`์ฮ‹ศ‚Nq—Sไ8~Žฟ4เ6๘ฉC๕โ.3๎‘#"""’)9""""™b#"""’)9""""™b#"""’)9""""™b#"""’)9""""™b#"""’)9""""™b#"""’)9""""™*QAฮ฿฿}๔ัkEDD`๘๑€๐๐pDDDผทš|}}‘‘‘ดด4ิฏ_jต*• +Vฌ<|๘-Zด€ณณ3\\\ฐy๓ๆ๗V •,บล]@a9pเttt ิึรร^นŠ+Jฯ Cff&222`llŒปw„ ƒฑฑ1RSSแโโ‚nบAฉTbๆฬ™๐๔๔ฤฝ{๗Pทn]t่ะFFFx๘1,-- ญ."""*YdนGnลŠpqq››&OžŒฬฬL๐ร๘๚๋ฏ ด|xx8pใฦ c๚๔้Pซีธx๑"NŸ> ธธธ`ศ!ศสสLž<žžžPฉT˜8qbฎ&$$`โฤ‰จUซ.]บppp@ZZ Œ้้้ะh4ะh4ฐดด„งง'ภฺฺVVVx๘1ภฯฯ …โถ•<ฒ r111Xผx1Ž?Ž่่hŒ9๓ๆอC`` LMMตฺ#88ภ‹รฉิšogg‡   Lš4 QQQprrBฑlู2ฤฦฦโัฃGุฐa`ไศ‘8}๚4bbbƒ่่h@VVv์ุ___|๑วจ\น2ฮž= ww๗ต?{๖ nnnฐณณรธqใPถlYญ๙‘‘‘ศสส‚ €s๐เมXถlT*ๆฮ‹ไป}าำำ‘œœฌ๕ ""ข’IvA.{o𙙀แh ฬั6((AAA^N]นreพ}'&&Bฃั ^ฝz€ฝ{ใ๘๑ใ€ƒยำำjตงOŸF\\€{อF…‰'โ์ูณ6lฬออsํ฿ศศัััHHHภฆM›p๗๎]ญu๗ํห—/—ฆ) ดjี ›7oFxx8ขขข`kk‹[ทnๅ9†3fภ\zุููๅ;f"""’/ูนWEEE!..ŽŽŽhิจ"##ัฉSงB]GZZพ๘โ ์ฺต 111่ึญาำำผNmถล€๐ีW_แ๒ๅหฏํฏ|๙๒Pซี8rไ€็ิuํฺฃG†ทททV'Ožเ๛:u๊„;w๎ $$*Tศณ๏ & ))IzธqใFNDDD2ูนๆอ›cใฦา!C///พ} 8v์ฑcวŽ๗gjjŠ””€……tttครฆ6l@ฃF––ฅR KKK>!!! Eทn๒ฝจรภภfffZ"""*™dไT*†oooธนนแ็Ÿฮณํ๋ฮ‘€Ž;"$$๎๎๎ธx๑"~๙ๅ|๚้งpqqนน9`aaž={ขvํฺ๘๘ใแๅๅ•ฃccc 8งOŸฦนsกซซ}A๐ํทัฌY3ธนนมC† ซซ+ฮ;‡•+Wb๏ฝPซีPซีาa–-[">>sๆฬA๕๊ี฿eณQ คผฒDKNN†นน9ฏ บer?wฏ$ำAš+ล!M5dก`ทง)I8~Žฟ4เ6๘ฉCu์ฝพพพะำำ+๎rŠ\ffฆlวŸ๗;)))฿ฃkฒ#GDDDD/0ศษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษ”nq@Eczฐฒฒ*๎2Š‹/Ls;8ษ๎ “ วฯ๑—ๆ๑™™™ล]ฝg#GDDD$S rDDDD2ลCซฅฤฆ่›02M-๎2Šž& eฌ=๛ ิ)๎jŠวฯ๑ฃเ6เ๘฿x=ซผ฿š ๗ศษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษT‰r๘่ฃz๙๐๐pDDDbEฺ|}}‘‘‘ดด4ิฏ_jต*• +Vฌ<|๘-Zด€ณณ3\\\ฐy๓ๆ๗V •บล]ภป:pเtttฉ๐๐pTฌX…T™™‰ŒŒ c๗๎!ยยย`llŒิิTธธธ [ทnP*•˜9s&<==q๏=ิญ[:t€‘‘?~ KKหBซ‹ˆˆˆJYํ‘[ฑb\\\เๆๆ†ษ“'#33?๐พ๚๋-ฟqใF๘๛๛ฮœ9OOOธqมมม˜>}:ิj5.^ผˆำงOรรร...2dฒฒฒ“'O†งง'T*&Nœ˜๋:0qโDิชU —.]888 -- …ฦฦฦ€๔๔th4h4XZZยำำ`mm +++<~เ็็„††B๑ฺ1ฆงง#99Y๋ADDD%“l‚\LL /^Œใว#::#GŽฤผy๓SSSญถมมมDDD`เภ€€€dffbร† tฒ rแแแ€™™€h ฬั6((AAAฌ\นRšŒกC‡ขu๋ึนญฤฤDh4ิซWะปwo?~p๐เAxzzBญVใ๔้ำˆ‹‹๐bฏูจQฃ0qโDœ={ร† ƒนนyฎใ022Btt4ฐiำ&ฝ{Wk}๛๖ล๒ๅหฅi …ญZตยๆอ›Žจจ(ฺฺุโึญ[น๖?aย$%%I7nไฝQ‰ˆˆHึdไ^…ธธ88::ขQฃFˆŒŒDงN^ป\BB p๛๖ํ7Z_ZZพ๘โ ์ฺต 111่ึญาำำผุ ึถm[ 0_}๕._พฺส—/ตZ#GŽxqN]ืฎ]1z๔hx{{kต}๒ไ ๗ฟกSงNธs็BBBPกB…\๛500€™™™ึƒˆˆˆJ&ูนๆอ›cใฦา9_^^^ธ}๛6p์ุ1ธปปcวŽ๙๖‘žžŽ!C† 447nภ๛ฆฆฆHIIXXX@GGG:lบaร4jิiiiP*•ฐดดฤฃG๐็ŸJชT*,Yฒ‘‘‘จQฃz๕๊…fอš!!!Ak๗๏฿Gbb" %%แแแprr :0`€ึ2cวŽ…ซซ+โใใ‚ะะPt๋ึํ/๐ """๙“MSฉT>|8ผฝฝแๆๆ†Ÿ9ฯถy#๗w฿กK—.PฉTXพ|9F'Ož cวŽ ปป;.^ผˆ_~๙Ÿ~๚)\\\`nnŽ€€XXX gฯžจ]ป6>๘cxyyๅXฏฑฑ1ˆำงOc๎นะีีพ(๘๖ํhึฌเํํ!C†ภีี็ฮรส•+ฑw๏^จีjจีj้ฐmห–-9sๆ z๕๊…ต9‰ˆˆจPˆ‚\ Iฒ•œœ sss,> #S‹โ.ง่iฒP๖N Ut”ฅp/&วฯ๑—ๆ๑ฟฟg•๗\TมdNJJส๗4)ู์‘#""""m rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$SบฏoB%Aทสฐฒฒ*๎2Š\ff&v๏Žม'umกงงWๅ9ŽŸใ/อใธ 8’?~๎‘#"""’)9""""™b#"""’)ž#WJœIH†้cโ.ฃศiฒžพ’ฅN้{ปs?Pzวpp๏w^ี- ฝฯ7ล=rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2U,Aฮ฿฿}๔ัk%$$`ห–-…ถ)Sฆ 88ธะ๚+ˆ;vเ็Ÿ,]บฎฎฎPซีhบ5๎ฝ F:uเ๊๊ ???$''iDDD$OEไ8ต-์ ๗.ฒฒฒจใว:uยˆ#Ÿ|๒ bbb…N:aึฌY•J…ำงO#&&*• ?๔ )) BˆB•$๏5ศญXฑ...pssรไษ“‘™™‰~๘_u–Ÿ4i๖ํตZu๋ึแ๛hืฎ\\\ะฆMiVnโใใแใใ7774hะ้้้€3gฮ QฃFจVญ๖๏฿๘๗฿ัจQ#ิญ[^^^ธpแ`๕๊ี๐๗๗‡๚๔้ƒฐฐ0ธธธ@ญVฃaร†9ึ๙๙slบญ[ทฦ๐แรฅ>ฦ055•ฺ>}๚ …ะจQ#”)SPฏ^=ผyp๔่Qิฎ]3gฮฤฝ{๗ ดอาำำ‘œœฌ๕ ""ข’้ฝน˜˜,^ผวGtt4Fމy๓ๆ!00P+ะ/-f๒ŒˆˆภภำงOG›6m…ฝ{c๒ไษhีชbccันsgLš4)ฯ๕๗้ำSฆLAtt4๖๏฿===ภตkืp๘๐a๖o˜:u* RฅJ8x๐ ฮž=‹ `โฤ‰Zใุนs'ึฏ_y๓ๆแ็ŸFTTv๏-ตนqใพ๖[8;;c็ฮ๘๎ป๏ฐnบ\๋๚้งŸเเเ€5kึ`ย„ 9ๆ๚๋ฏhัข C‡8|๘0 iำฆ@xxxพ}ฦŒ077—vvv๙ถ'"""๙zoA.<<033<{๖ ๛๗๏G```ŽถAAA xxx`ๅส•น๖yโฤ |๒ษ'^ฆ<~xฎํ’““‘’’‚fอšฬออกTพj๛๖ํกฃฃwww$$$xฑซPฉT4hโโโคพฺถm+Oooo|๙ๅ—Xดh‘ด‡๏๏ฟ†ฃฃ#ž>}Šˆˆ๒ห/๙ž7z๔h$$$`๐เมXธpกึผ%K–เ๙๓็่ัฃ‡4ญB… ?~<ฮŸ?ฝ{ฃ[ทn๘๓ฯ๓์ย„ HJJ’7nศณ-ษ[‘#…ธธ88::ขQฃFˆŒŒDงNŠj๕€Rฉ”ฮ{›?>œœœ‹ƒJ! €tศx’VฌXวฃAƒx๘๐!\]]ฑ|๙r;v ]ปvลoฟ†ŒŒŒืึ๑ษ'Ÿhท~,_พ<ื=y‘‘‘6lฦŒƒO?cฦŒษw|fffZ"""*™[kผ96n(ฃๅๅๅ…ทo#!!วŽƒปป;v์ุ‘oฆฆฆHII‘ž{{{cำฆM€๕๋ืฃQฃFน.gffsss„……xqั€Fฃษs=ษษษจXฑ" Vฏ^gป+Wฎ@ญVใ›oพƒƒnธCCC 0'Ožฤœ9sp่ะ!ิชU ?๘cŽๅ/_พ,ว VญZ€ธธ8 >ทoื ^gฯž…งง'ฦŒœ;w3gฮ„ƒƒCž5Q้๑‚œJฅย๐แรแํํ 777้นษ๋9WWW<{๖Lบุaส”)ุฝ{7\]]ฑu๋VL›6-ฯ>๕WLž<nnnhถ-233๓l„E‹AญVkวWอ›7OบMHญZตเๆๆฆ5_ญV#88111Pซี9–_ธp!T*ิj56oŒ๙๓็พ๖[$%%มฯฯjตZบสตL™2Xทn:„=z@__?ฯฺˆˆˆจ๔Q฿ขDKNN†นน9๖E\ฉนeq—Sไ4Yฯ๑ 8สีjฅŽnq—Sไ8~Žฟ4เ6เ๘฿๏๘ฝช[zŸูฒ~'%%ๅ{šฟูˆˆˆHฆdไฆOŸตZญ๕๘Pn"LDDD๔>ษ~?๋คI“๒ฝŸQI%๛=rDDDDฅƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘Lษ†ภT0๕ฬ`eeQeนฬฬL์Ž๊W5‡žž^q—Sไ8~Žฟ4เ6เ๘K๘นGŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆxŽ\)q/ศ ŠŒโ.ฃศe้=Vเn`e่|ˆ-Zภูู...ุผys‘ืHDDD๒TlAฎ ;ศฝ‹ฌฌฌทอฬฬDjj*`๗๎ะืื‡ยยย…SงNaฦŒHLL„Rฉฤฬ™3‡ƒb๔่ัx๖์เ๑ใว๏e,DDDT2Zปu๋6lตZ WWWŒ3ฑฑฑPซี˜3gRSSัฅK8;;#((่ตmถ ่าฅ 7n XตjT*T*–/_ž๏๒SงN…Jฅ‚ซซ+–-[&M9r$๊ิฉƒฮ;Kแl๒ไษ๐๔๔„Jฅยฤ‰ฅถ˜0aิj5Ž;†O>๙u๊ิ‹‹ ึฏ_Ÿc ˜8q"jีช…K—.I}คฅฅAกPภุุžžFFKKKxzzฌญญaee%8???๘๛๛#44Bˆืnณ์พ“““ตDDDT2ZฐaZถl‰จจ(œ9sำฆMƒ‹‹ ขขข0n8,^ผŽŽŽˆ‹‹Cปvํp๗๎]iYตZ-วŽร_…y๓ๆ!!!!ืZv๎‰ใวใ์ูณˆ‰‰Aทnw๏Eืฎ]qyh4:tภ‹pw๚๔iฤฤฤ &&ัััR_ˆŠŠ‚‰‰ nธ๓็ฯ#66ํท๐bOŽ;เ๋๋‹?•+Wฦูณgแ๎๎žฃฎgฯžมออ vvv7nส–-ซ5?22YYYฐฑฑ„‡‡c๐เมXถlT*ๆฮ๛ฺ=”3fฬ€นนน๔ฐณณหท=ษWก9OOO„„„`๊ิฉธ|๙2ŒŒŒดๆŸ8q€ฮ;ฃL™2าผจจ(้็•+Wยรร#Ghบ5,,,`jj ___œ:u*ืZ:„@__คภdaa&Mšฅ x๐เAxzzBญVใ๔้ำˆ‹‹“๚สUซVล๕๋ื๑๙็Ÿใเมƒ077๐bฏูจQฃ0qโDœ={ร† “ๆฝสศศัััHHHภฆM›ดยlbb"๚๖ํซตงQกP UซVุผy3ยรร[[[บu+ื`ย„ HJJ’7nศณ-ษ[กน&Mšเศ‘#ฐถถFืฎ]q๐เมm Eaญ๎ญH?+•Jdee!-- _|๑vํฺ%ํฝKOO—ฺeNKKKฤฤฤ QฃF˜5kฆL™เลฐถmbภ€๘๊ซฏp๙๒ๅืึQพ|yจีj9rภ‹s๊บvํŠัฃGร[ซํ“'O๐ฟ:uย;w‚ *ไ;F333ญ•L…ไฎ]ป†J•*aศ!@bb"RRRค๙ุดi€‡>Ÿ>}๚ฺ>MMMฅ><==q๐เA$''ใษ“'ุณg4h๋r-[ถฤ/ฟ‚ŒŒ ภฃG๒\GZZ”J%,--๑่ั#๙็Ÿนถ{๐เ„่ัฃ&Mš$ํETฉTXฒd "##QฃF ๔๊ี อš5หqุ๗๛HLLคคค <<NNN€กC‡ยรร ะZf์ุฑpuuE||}๚`ุฐa่ป7๊ิฉƒ&MšhํURซีR08p ‚‚‚เแแ~๚กOŸ>(_พ<Ž=Šฏพ๚Jฺc5z๔h888ไZ‹ฏฏ/"""เ๎๎]]] >ƒ สตญ……z๖์‰ฺตkรึึ^^^นถ๛๏ฟะฟ! ซซ‹E‹iอ766ฦภ1pเ@œ9sบบฺ›๖๖ํ ”.r:t(\]]q๎9ฌ\นฎฎฎุทo`๚๕pvvFห–-๑ร?H‡ˆ‰ˆˆˆ^ฆฝ’d)99ๆๆๆˆ๓ท‚…"ฃธห)rYบ†8ำc๊m็iล]N‘ใ๘9า<~€ บ‡ุฝ{7|}}กงงWๅนฬฬLูŽ?๛๏wRRRพงI๑›ˆˆˆˆdชะญ‡์oExYนrๅZLY9+++ญ[—•&<ดJDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2%๋SมY_„••Uq—Qไ233ปQaอMู}ฯ^aเ๘9า<~€ 33ณธK ๗Œ{ไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠ็ศ•šๅCc )๎2ŠœFกTอขถะˆŒโ.งศqน_๙ลัbฌŠˆจ๐p‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘Lฝ— —˜˜ˆ•+Wๆ9ฟbลŠฏํc๕๊ีx๐เAกิ“€-[ถไ9?888฿๙๏โๅพฟ๙ๆธนนมีีบuรำงOSฆLAญZต Rฉะฟ<ฝิBDDD%Kฑน‚(ช —••…   ๘๛๛สบฒ=~ด๚๒ห/˜˜TฉREฺFMš4All,ฮ;‡็ฯŸcบu^lG"""ขผ่F'ทnBทnšš Fƒ5j 66jตฝ{๗ฦะกC๑ษ'Ÿเโล‹hาคษk๛ถm"""ะฅK”+WGลชUซ๐ใ?FŒฯ>๛,ืecccัฏ_?deeAกP ,, “&MB\\ิj5ฦ‡ห—/ใฺตkˆ‡ทท7LMMQฑbEกiำฆhะ BCCกัhฐcวุููแาฅK่ีซ233ัฌY3DEE!<<\kiiiุดi–-[†ฆM›โ‡~ภ”)SคพMMMBคฅฅAกPš7o.๕Qทn]ผyฐaรใณฯ>CŸ>}`ff๖ฺm—žžŽ๔๔t้yrr๒k—!"""y*”=r6l@ห–-…3gฮ`ฺดipqqATTฦ‡ล‹รััqqqhืฎ๎ฝ+-ซVซฅŸ(8lถ Gล‡้ำงใุฑc๘๋ฏฟ0o<$$$ไZห๒ๅห1|๘pDEEแ๘๑ใ011ม๔้ำัฆMDEEกw๏€GŽ‘ยแหLLLpๆฬ|๒ษ'Œ5 SฆLAtt4tuต๓๏ล‹1z๔hจT*œ={+Vฌภ?k}ใฦCๅส•qy 8Pk^VVึฏ_-Z† ‚?๘ทo฿†‡‡ „3gฮไ๛Zฬ˜1ๆๆๆารฮฮ.฿๖DDD$_…ไ<==‚ฉSงโ๒ๅห022าšโฤ :w๎Œ2eสH๓ขขขคŸWฎ\ GDD u๋ึฐฐฐ€ฉฉ)|}}q๊ิฉ\k๑๒๒ยœ9s0{๖lฟ?G่สๆ็็==ฝ\็u๊ิ เ๎๎.ฦ่่ht่ะะฃGฉํ๏ฟ•J…J•*แนsXฐ`๊ิฉ“kฟ0gฮผyžžžุธqฃึผ & Aƒhะ 4อมมำฆMC\\6lˆ&Mšไ>_๎#))Izธq#ฯถDDD$o…ไš4i‚#GŽภฺฺ]ปvลมƒsดษ>Œ๘พ๕๊ี ๑tuuัฌY3\ธp!ืv/‡ษW”J%ฒฒฒผ8š›VญZa๎นXทnz๖์‰ปwCฃัไ[ฃBก@ฯž=ตฮ๛฿‡3gฮ`๙9ฺ=z๛๗วฌYณ0qโD|๒ษ'๙ึnffฆ๕ ""ข’ฉP‚ตkืPฉR% 2HLLDJJŠ4฿›6m์นSบZ3?ฆฆฆRžžž8x๐ ’““๑ไษ์ูณGkฏีหฎ^ฝŠ๊ีซใ‹/พ€.^ผจีืrssร๎ป›7o–ฆ›™™aไศ‘ˆŽŽฦ่ัฃฑn:899aํฺต9๚ธ|๙ฒ๔๓Ž;PซV-@XX,X€-[ถhํAฟ?T*ๆฮ‹ž={โ๙๓˜4i*Tจ๐Nc!""ข’กP.vว์ูณกฏฏ+++lธpuuEŸ>}0lุ0๔๎u๊ิA“&Mด‚ˆZญ–ฏ8AAA๐๐๐@ฟ~ะงO”/_GลW_}oooภ่ัฃแเเk-7nฤฺตkกงง‡๊ีซฃmถะััมณgฯค‹ฦO?„ฝ{cโฤ‰๐๖๖ฮuOW“&MะคI<|๘0ื=ใววล‹กT*แ์์Œeห–xqใวัฌY3@@@ฦ+++์ปถถถoU3•l ‘ื1Cา๒๔้SAกP`ฺดix9ฆL™ReฝVrr2ฬออq๏‡&ฐ2ศoI”ฉะวช#ะ๖สฯะล]N‘ใ๘sฟ๒‹ฃลXUัษฬฬฤ๎ปแ๋๋›็9ม%]i฿ฟ|วŸ๗;)))฿ำค e\ip๊ิ)Œ=YYYpttฤฏฟZ%Q)' ๗๐แC้6ูส•+‡ะะะ๗ฒพ์{ว}(dไฌฌฌฌˆˆˆจT{/_ัEDDDD๏ƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘Lษ๖†ภ๔f”Ÿm…าสชธห(rสฬL`๗n(‡๏…Rf฿ณW8า=~"*๙ธGŽˆˆˆHฆไˆˆˆˆdЇVK อIะ”)/ทฒหขโ.ˆˆ่ƒภ=rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ล  eห–๙ฮOLLฤส•+ฅ็iiihผ9Vเฏ]ป†บu๋BญVรออ ;v์\ผx 6„JฅBบuq๘๐แw •บล]@qB@ะะะ|eน"##aff†C‡ๅนฬำงOกซซ }}}ฉJ•*แฏฟ‚๎ฝ OOOt๊ิ †††๘ๅ—_เไไ„๘๘xt์ุ—/_<~–––…4b"""*IJฬน[ทnกaร†PซีpuuE||<ัตkWิฎ]Ÿ}๖4  B… 2d\\\pใฦ TฌXŽ6mฺ cวŽจQฃฆOŸ˜4ibccกVซ1gฮ๔้ำ‡†Zญฦร‡ต๊8<>sิฉS?ฉ}}}xฑW/ป{{{899œœœœœ !ภรร๛๗วฉSง ดาำำ‘œœฌ๕ ""ข’ฉฤน 6 eห–ˆŠŠย™3g „@LL พ๙ๆฤลลแมƒุบu+เฝ{๐๓๓รนs็`ooฏีOdd$Vฏ^่่h#55ำงO‡‹‹ ขขข0n8ฌ\นmฺดATTฌฌฌžžŽu๋ึกI“& ‚งง'.\ธ€ *ไจ๓฿…‹‹ ๊ิฉƒE‹ๅ˜ฟcวิญ[ …ภ‹รฎ:uย”)Sเแแeห–แษ“'yn‡3fภ\zุููฝหf%""ขX‰9ด๊้้‰~๚AฉTข[ทn(Sฆ œœœ Vซ8v์ajjŠ6mฺไฺOร† aeepttฤญ[ท งง—๏บ=<< ฏฏ5kึ@ฅRๅถZตjˆล•+Wะทo_ดm†††^œC7n8์ฝ[jฏซซ‹.]บ K—.ธvํ „ฑcว"%%%ื'L˜€/พ๘Bzžœœฬ0GDDTB•˜=rMš4ม‘#G`mmฎ]ปโเมƒา^-P(า๓2eสไูO๖กOP*•ศสสzํบ—/_Ž:u๊ [ทn˜6mnผ๙ฺeชVญŠฒeห"66ภ‹ภีนsg,ZดีซWืj๛๐แCฬŸ?:u‚ฑฑ16oœofffZ"""*™JLปvํ*Uช„!C† )))ˆGLL „๘ํท฿ะจQฃท๊ิิ4ฯ=`เๅๅ…_ว‡ฑฑ1ฺดiƒN:!))Iซอ›7๑์ู3ภ;wGGGdeeก{๗๎...ˆŠŠยธqใ111ุนs'ึฏ_ัฃGc๒ไษˆˆˆภผy๓๐ล_บw๏ŽำงO#&&FFF๘๓ฯ?ฅ๕ZYY!225ย๐แรฑkื.l฿พำฆMหทGŽม?ˆaร†aๅส•8sๆ >๔S|๗y.๗๐แClูฒqqqˆŽŽฦgŸ}y๖‘••…;vภืื1*WฎŒณgฯย=G฿ฯž=ƒ››์์์0n8”-[Vk~dd$ฒฒฒ`ccวเมƒฑlู2จT*ฬ;<ศw3fฬ€นนน๔ฐณณหท=ษ—nAzzzข_ฟ~P*•่ึญ7nฌ๕ูู9ืๅฺถm SSSภกC‡'อำััDGGใ๋ฏฟFrr2agg‡ฮ;:t่pqqBก€กก!T*ฎ_ฟžoฝ~~~ะำำCJJ Ž?.๕—••…jีชๅนœนน9LLL0pเ@๘๙๙ก}๛๖๙๖แ็็‡๓็ฯใื_EฃF๒ญษศศัััธ>บvํ TจPภ‹รา}๛๖ล๒ๅหฅ๖ …ญZตBซVญp}Œ=ถถถธrๅŠ๖^5aย) @rr2รQ Uเ ืคI9r๙'บvํŠE‹ๅxž[@*SฆŒ๔ณBกภูณgกTj๏4h๖์ูƒ5j`๎นx๒ไ‰4O__ T*ต~~นoู๋ีh4จ\น2ขขขrดััั‘ใฆงงtuu}๛๖aบuุบu+,Xg3fฬภ’%K0`ภt้าD5๒ญญ|๙๒Pซี8rไบu๋†ฬฬLtํฺฃG†ทททV'Ož`ำฆMXนr%Œ"…ฟภภภ ฿๕QษPเCซืฎ]CฅJ•0dศเุฑcZฯcccajjŠ”””<๛hธฑt1„FฃAll, 55ๅห—GZZ6mฺ๔ŽCาfnnKKK์฿ฟภ‹ .\ธฐททGTT4 v๎ เEpJJJBงN0{๖lDEEๅ‡Jฅย’%K‰5j Wฏ^hึฌด๊ธ>)))‡““`่ะก๐๐๐ภ€ด–;vฌtaHHBCCัญ[7iO&•nrแแแpuu…ปป;Ž= ญ็Ÿ|๒ ฌฌฌเ๊๊ WWW้"—-\ธ{๖์››T*•tมยคI“Pทn]4kึ,ืsหีบu๋0gฮธนนAญVใิฉS€ฏฟ}๛๖…ทททtจ2%%ํท‡››:w๎, —WูŒ1pเ@œ>}s็ฮ…ฎฎ๖ฮฮทoฃYณfpssƒทท7† WWWœ;w+Wฎฤฝ{กVซกVซฅรฯ-[ถD||<ๆฬ™ƒ๊ีซ๚v!"""ySˆ‚^Iฒ”œœ sss;ฒ VfFล]ฮ{ฃt๋“๋๔ฬฬL์ฝพพพะำำ+โชŠวฯ๑—ๆ๑ฟ|วŸ๗;)) fffyถใ7;ษT/v๘ํท_}๕•ึดถmbๆฬ™ลTQั‘ukำฆ ฺดiSe Z%"""’)9""""™b#"""’)9""""™b#"""’)9""""™b#"""’)9""""™’๕ ฉเ”ฮ]กดฒ*๎2ˆˆˆจq‘L1ศษƒ‘L๑นRขอึ hŒ๒ž๖“อEW  ๎‘#"""’)9""""™b#"""’)9""""™b#"""’)9""""™b#"""’)9""""™b#"""’)9""""™b#"""’)9""""™*QA.11+Wฎ,๎2ด์ุฑ?3`้าฅpuu…ZญF๋ึญq๗๎]@pp0๊ิฉWWW๘๙๙!99น8K&"""™(5A.++ซHky๘1 SงN1bเ“O>ALL ขขขะฉS'ฬš5  Rฉp๚๔iฤฤฤ@ฅRแงŸ~$%%AQคu‘|ศ&ศบu 6„Zญ†ซซ+Nœ8ก๕<>>“&MBll,ิj5ๆฬ™ƒีซWร฿฿>>>่ำง๎ฝ‹ฮ;รรร7ฦฅK—ผุ#ๆ้้ WWW๔๏฿ะดiSŒ3๎๎๎๐๔๔DDDZดhชUซbืฎ]9j|9ถnŠึญ[c๘๐แ€ีซWc๘๑SSSฉํำงOกP(5B™2e๕๊ีรอ›7GEํฺต1sๆLปw๏=mY"""’+ูน 6 eห–ˆŠŠย™3gฆ๕ำงO‡‹‹ ขขข0n8@LL v๎‰๕๋ืc๔่ั˜|8ถo฿333ฉอูณgแ้้‰1cฦภวว็ฮรฬ™3แเเg=033ำzQษค[Txx8fฯž }}}XYYกOŸ>puu•žoธVVVpuu…ซซ+๚๔้ƒ๒ๅหk๕ฑpแBa๑โลศฬฬD฿พ}แโโ‚I“&กnบจPก฿บFตZเเ`\บส๔e/_Xะฏ_?ญyw๎ษs=&&&า //—}?นWฝ|ˆ๕eู{์ˆˆˆˆr#›CซDDDDคAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆt‹ป*๛>†••Uq—ADDD…ˆ{ไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdJทธ  ๗KHIIžž^1WS๔233๑๔้S$''sq—SไJ๛๘nŽ_พใONN๐ว๓ย Wย=|๘เ่่Xฬ•ั›JIIนนyž๓ไJธฒeหฎ_ฟž๏แUžžž8}๚๔ญ๋M—)Šu$''รฮฮ7n€™™ูU[i,Sฺวฆห”๖๑oท >ิฑผอ2E๕(ํใ›e^ื^””ุุุไƒ\ งTพ8 าฤ:::oิm–)Šud333๛เj+ํใ›eJ๛๘฿v™า>~เอถม‡<–๕w ดm–)H๛‚์€แล”ซaร†ฝ๗eŠbo‹ใ/šฺŠb›ฝuoปLQฌใC^ฆ(ึ๑!/๓6>ิฯณuoณLaE!^wษZrr2ฬออ‘””๔V‹‘;ŽŸใ็๘K๏๘nŽฟไŸ{ไJ8Lž<ล]Jฑเ๘9~Žฟ๔Žเ6เ๘K๘นGŽˆˆˆHฆธGŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAฎ[ผx1`hhˆ เ๏ฟ.๎’ ล‘#GะฑcGุุุ@กP`๛๖ํZ๓…๘๖oQฉR%กeห–ธ|๙ฒV›Gกw๏033ƒ……>๔Sฝผผฐgฯi~I{nfฮœ …BQฃFIำJ๚6˜2e  …ึฃVญZา’>~ธy๓&>๙ไXYYมศศ...ˆˆˆๆ—ไฯA‡ฏฟBก๎หV^-‚Jค7 }}}๑ห/ฟˆ๓็ฯ‹Aƒ q๗๎โ.ํํฝ[Lš4IlบUถmำš?sๆLann.ถo฿.ขฃฃEงN„ฃฃฃx๖์™ิฆmถยออMœ>>R+ `๒ไษยออ-ืyฅa_}๕•hิจQž๓K็เศ‘#Eตjี„Fฃ)ฏซxhตสศศภ™3gะฒeKišRฉDห–-๑ื_ce๏฿ีซWq็ฮญฑ›››ฃAƒาุ๚๋/XXXภรรCjำฒeK(•Jœ:uชศk~WIII€ฒeหฮœ9ƒฬฬLญmPซV-TฉREkธธธ B… R›6mฺ 99็ฯŸ/ย๊฿MVV6nˆิิTxyy•ชฑ6 ํทื+Pz^ห—/รฦฦUซVE๏ฝq๚uฅc;v์€‡‡บu๋kkkธปปcลŠาา๔9˜‘‘ตkืbภ€P(ฅโ๕ƒ\ ๔เมdeeiฝI B… ธs็N1UU4ฒว—฿ุ๏นkkkญ๙บบบ([ถฌ์ถFฃมจQฃะฐaCจT*/ฦงฏฏ ญถฏnƒถQ๖ผ]ll,LLL```€   lถ ฮฮฮฅb์ฐqใFœ={3fฬศ1ฏ4lƒ `๕๊ีุปw/–.]ŠซWฏขqใฦHII)ใฟrๅ –.]Š5j`฿พ}2dFŒ5kึ(]ŸƒทoGbb"๚๕๋ tผ_ฅ[ั6lฮ;‡cวŽw)Eสษษ QQQHJJย–-[ˆร‡wYEโฦ9r$8CCรโ.งXดkืN๚ูีี 4€ฝฝ=~๛ํ7ceECฃัภรร?๐ภ็ฮCpp0‹นบข๕ฟํฺตƒMq—RlธGฎ*Wฎtttr\ฅs๗๎]TฌXฑ˜ช*ูใหo์+Vฤฝ{๗ดๆ?=’ี๖>|8v๎‰ฐฐ0ฺฺุJำ+VฌˆŒŒ $&&jตuไถฒ็}่๔๕๕QฝzuิซW3fฬ€››,XP*ฦ~ๆฬปwu๋ึ…ฎฎ.tuuq๘๐a๓ฯะีีE… J6x•……jึฌ‰๙งTผ*Uชgggญiตkื–/—–ฯมkืฎ!44”ฆ•†ืU r%พพ>๊ีซ‡ƒJำ4 <//ฏbฌ์sttDลŠตฦžœœŒSงNIc๗๒๒Bbb"ฮœ9#ต9t่4 4hPไ5ฟ)!†ŽmถแะกCpttิš_ฏ^=่้้imƒ‹/โ๚๕๋Z 66V๋ƒภ033ห๑B4 าำำKลุ[ดhุุXDEEI๔๎[๚นคoƒW=y๒๛/*UชT* 6ฬqหกK—.ม@้๘€UซVมฺฺํท—ฆ•†ื?‡โพฺ‚7 ฑz๕j'>๛์3aaaกu•Ž\ฅคคˆศศH)ˆy๓ๆ‰ศศHqํฺ5!ฤ‹ห๎-,,ฤ!bbbD็ฮsฝ์]œ:uJ;vLิจQC— !ฤ!C„นนนืบ้ำงR›   QฅJq่ะ!!ผผผ„———4?๛๒๛ึญ[‹จจ(ฑw๏^Qพ|yY\~?~xq๘๐aq๕๊U#ฦ/ …ุฟฟขd=//_ต*Dษ฿cฦŒแแแโ๊ีซโ๘๑ใขeห–ข\นrโฝ{Bˆ’?ฟ[่๊๊Š้ำง‹ห—/‹u๋ึ‰2eสˆตkืJmJ๚็`VV–จRฅŠ๘๊ซฏrฬ+้ฏซไJฐ… Š*Uช}}}Qฟ~}q๒ไษโ.ฉP„…… 9Bˆ—๓อ7ขB… ยภภ@ดhัB\ผxQซ‡Šž={ aff&๚๗๏/RRRŠa4o.ทฑซVญ’ฺ<{๖L :TXZZŠ2eสˆ.]บˆทok๕“ ฺตk'ŒŒŒDนrๅฤ˜1cDfffๆอ 0@ุ }}}Qพ|yัขE )ฤ Qฒวž—Wƒ\I฿=z๔•*U๚๚๚ขrๅสขGZ๗P+้ใBˆ?SจT*a`` jีช%–/_ฎ5ฟค๎ทOศ1&!Jว๋2…Bหฎ@""""z'Lบs็N899I{)7n˜็r'Nœ@อš5aee…ฑcวBฃัH๓/^Œ5j \นr Djj*ฒฒฒะฎ];\นr&&&011มš5kฐn:|๗011‘ฦ‹&Mšภาา๕๊ีCDD„ิทBกภขE‹เ่่ˆfอšš4i‚ƒ–ชKT ‚ˆจ„ฐททแแแยึึVปwOปwOฺฺุŠcวŽ {{{ญvGB‘””$:v์(&Ož,อONN+VYYYb้าฅขcวŽโ้ำง"33S9r$ืu๏นSิซW/G=>>>โแร‡โย… ยภภ@ดjีJ\ฟ~]พ}[TจPA:tH!ฤ๒ๅห…ณณณธqใ†x๐เ๐๖๖–jZตj•ะััซVญYYYโ้ำงยืืWŒ3Fคฅฅ‰ .ˆJ•*‰่่่<ทK๖x+Tจ Ž;&„โ๖ํโ๙๓y.ฃVซลํทลอ›7…ณณณXนrฅBˆ฿~๛MจT*‘ ž>}*z๖์)ฦŒ#„",,LTซVMซฏภภ@๑๗฿KฯSRR„ุฒe‹xนุถm›ฐณณฯž=B@t๊ิI$%%‰งOŸJห™™™‰๘๘๘\๋%*ญธGŽˆJ๘๛๛cำฆMุดiบvํ ํฺตk XZZโาฅK2dˆ4๏เมƒ๐๑๑Rฉ„žž>|ˆ+Wฎ@WW7ฯ=r‰‰‰นž7bฤ”-[ตjี‚››ฺถm ;;;TฌX>>>ˆŽŽlธcวŽ…ญญ-ฌฌฌ๐ํท฿bร† R?ีชUCฟ~ T*‘””„๐๐pฬ˜1จUซz๕๊…ญ[ทพv๛่้้แย… x๒ไ *Vฌgg็<Ž9+V„ FM›6xqyย„ ฐทท‡‘‘&Nœˆ-[ถผvูv๎‰:u๊HฏŸŸฌญญq๒ไIฉอ๘๑ใaff###išฉฉ)’’’ ผขา€AŽˆJœฝ{c๚๕Xทn]ž‡U๗์ูƒฤฤD<}๚~~~h฿พฝ4๏ๅ๓ใ๚๔้ƒ-Z K—.ฐททวŒ3rํฯ<ืซUญญญฅŸŒŒr<ฯ^ๆึญ[จRฅŠ4ฯทn’žฺฺJ?_ฟ~iii(_พ<,,,`aaeห–แฮ;๙nุฒe ถm[[[ดm6ว!ๅ—ูููi|๛๖miƒ–ึจQ#ฟต๋~นร‡Kห[XXเย… yŽ7[JJ ฬออ ผขา€AŽˆJ}๚เฏฟส๕ะ-Qiฦ GD๔’ูณgc๔่ัะำำ+๎Rˆˆ^‹AŽˆˆˆHฆxŽ‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘LษzmLVlIENDฎB`‚c4core-bm-charconv-xtoa-mega_bytes_per_second-i64.png000066400000000000000000000770501477602032300327050ustar00rootroot00000000000000c4core-0.2.6/doc/img/linux-x86_64-gxx12.1-Release‰PNG  IHDRrOีw.9tEXtSoftwareMatplotlib version3.5.1, https://matplotlib.org/ุa๒ฝ pHYsaaจ?งi}•IDATxœํy\N้?๐ืพ/"IฉฦRดSQT–ฒ/!di0รXวnl3ƒdcฦ–ๅ;˜ฦ6|0ฦ.dFQก‰ aฦพดI๋}๐่Z„ิœผžวะ9็:ืyฟOง๛~ปฮr+„DDDD$;jฝrDDDD2ลBŽˆˆˆHฆXศษ 9""""™b!GDDD$S,ไˆˆˆˆdŠ…‘Lฑ#"""’)r$k €AE‡Qฌจจ(( lถญขC)•3f@กPเัฃG } š7o''งŠฃาQ(˜1cFE‡๑F [[ŠCvXศั;ูปwฏ์,ˆสฺœ9sฐs็ฮRท_ฑbz๔่ZตjAกP`ภ€Eถ+(ฌีิิp๛๖ํBหำาา ซซ …B‘#Gพe๔๔:™™™˜1cขขขส}งOŸฦŒ3’’R๎–“ื}ฅงงใ‹/พ€ดตตQณfM#33ณุu …BŽ;พq<7nฤโล‹฿xฝทมBŽษฝ{1sๆฬŠƒจBฝi!7o<9rŽŽŽะะะxm{mmmlฺดฉะํทฟI˜๔–2331sๆฬ +ไfฮœ๙ฦ…๓็ฯ๑ๅ—_พŸ “ีซWใส•+oตnIŸEฉฉฉ๐๕๕ลO?„ฝ{cลŠ5jฒฒฒ]ไ:ัััXทnttt*ž๒,ไ^BD•ณgฯ ฏฏ_ัaศŠYYYะีี}ใu;&ฦ•ๆา€๖ํcำฆM๘โ‹/Tๆoธ:tภ๗ฟ7ŽแCขT*‘““๓ึสr๑ržrฬUSS๓ฝ๔;eสผy็ฯŸ‡4าคIEถB`ิจQ๘๘ใq๘๐แ๗SYโˆ๒๙s888ภมมฯŸ?—ๆ?y๒5jิ€๒๓๓1`ภ,[ถ ภ‹๋1 ^ž={†๑ใวรฺฺฺฺฺฐททวย… !„PฺูตkัฒeK˜››C[[ 4ภŠ+(ๆ๋ืฏฃM›6ะืื‡ฅฅ%พ๙ๆ›BQ*•Xผx1กฃฃƒ๊ีซcศ!x๚๔ฉJ;[[[t์ุ'Ož„——ttt๐ัGแ็Ÿ.ด””Œ;ถถถะึึ†••>๘ใBื˜)•Jฬž=VVVะััAซVญpํฺ5•6ื ลววร฿฿zzzจSงŽt}ฑcวะธqc่๊๊ย‘‘‘*๋฿ผyร‡‡ฝฝ=tuuaff†=z 99Yฅบu๋ P(p์ุ1 >ๆๆๆฐฒฒ*v฿ผyu๊ิ““๎฿ฟเลEbbbฉฏฅ;{๖,ฺทoSSS่๋๋รลล?๐ƒJ›#GŽภืื๚๚๚011A—.]๐ื_ฉด)8ีxํฺ5 0&&&066ฦภUN‘899กE‹…โP*•า)•—็ฝษqqเภxxx@WW+Wฎ„Bกภณgฯฐ~z้o ธSฅlllTV^งOŸ>ˆEbbข4๏ฝ{8rไ๚๔้S๊~ Nม๎นNNNะึึ†ฃฃ#๖๏฿ฏาฎธk• ๖Q}nบ 4€ฎฎ.ผฝฝq๑โEภส•+QงN่่่ y๓ๆ…Žว111๐๑๑ฎฎ.์์์^จMvv6ฆOŸŽ:u๊@[[ึึึ๘โ‹/ ชฤดaร8::B[[[สq๓ๆอhิจ addgg็Bวโห’““QญZ5ภฬ™3ฅ฿๑หง๑Js์gษ’%ptt„žžLMMแแแ7xฑฟ'Nœฐณณ“ถ]ฐKส๓ีK๛ทผ๘ 5jชVญ CCCt๎๛oก>ำำำ1fฬ้ฯ8ผิๆM+^=๎’““กP(ฐpแBฌZต ตkื†ถถ6<==q๎9•๕Š๛,JIIมฺตk๑ูgŸมฮฮ999ลŽยˆˆˆภฅK—0{๖์ืฦ\”ๆอ›cฯž=ธy๓ฆห{ฝ๖Oแฬ™3B]]]Œ;Vš"tuuล•+W„Bœ>}Z """Bz !„Rฉ-[ถ …B 4H,]บTt๊ิIcฦŒQู–งงง0`€๘๛๏ล’%KD๋ึญฑt้าืฦูฟกฃฃ#๊ึญ+BCCลาฅKEวŽ๑ีW_ฉด4hะะะƒแแแbาคIB___xzzŠœœฉฐททีซWSงNK—. 6 …B\บtIj—žž.œœœ„บบบตฟฃƒ ---acc#ฆOŸ.VฌX!F%ค6‡ข^ฝzb๙bๆฬ™ขjีชยิิTธqCjWŸปปป่ึญ›Xพ|น4h พ๘โ ฉ7฿|#ิิิฤปwUb9v์˜ ถn๚VวE:u„ฉฉฉ˜หศศ+VฌDืฎ]ฅ฿q\\œข๔วnQVญZ%ˆเเ`ฑrๅJ๑ร?ˆO?TŒ5J!D\\œ่ปท พ{i%ๆYฐ์ๅฟฯาํ!Dฯž=*–-[&z๖์)\]] ๕ูงOกฅฅ%ฦ'ึฌY#ๆอ›':u๊$~๙ๅฉอ›ผWผzธqCŠนN:bผyb๙ขjีชยสสJ๚๛,้ณ่๗฿ฤชUซD๗๎…บบบP(ยววGฺW/KKK",,L๑โ๏พC‡ฏennnขjีชR,;v์xฃ> 9*ึ”)S„ššš8~ธุบuซ /^ฌาfฤˆ…ุ…b็ฮ€˜5k–สเเ`กP(ฤตkืคy™™™…ึoำฆ๘่ฃ^c๑๙็ŸK๓”Jฅ่ะกƒะาา’Š'Nbร† *๋๏฿ฟฟะ|@?~\š๗เมกญญ-ฦ/อ๛๚๋ฏฑ}๛๖Bq)•J!ฤซ_ฟพศฮฮ––๐ร€ธx๑ข4ฯ฿฿_7n”ๆ%&& BMMMœ9sFšเภ@ฌ]ปVšWิ~ใ?๑๓ฯ?K๓ นfอš‰ผผ<•๖/r๕—ฐดดžžžโษ“'*ํJ๛ๆœ——'์์์„x๚๔i‘๛H!„นนนx๘ฑ4/..Nจฉฉ‰?ธP|Ÿ|๒‰J_]ปvfffา๔•+Wฑdษ•vร‡าพz›ใb…๒,ฉ{าr>&Lu๊ิ‘–yzzЁ !ฤrZZZ*qqq…๖ี›rฺฺฺ*Eหส•+aaaก๒Ÿ)Sฆ*m Ž๛๏พ๛Nš—-ึBMMMœ8qBe๛แแแ€8u๊”JLjjjโ๒ๅห*mG-ŒŒŒ ๗ฏ๓๐แรb๗าปE้าฅ‹ptt,ฑอ‚ ํณลๅYฐฌจB๎u;111E‡{ภ€…๚466~ํqW…œ™™™ส{ะoฟ&ˆ฿]šWgัขE‹ค>ผผผฤ† ฤ๒ๅหE๕๊ี…ฉฉฉธs็ŽJ๛ &;;;‘••%„xปBN!:t่Pไ฿ะ๛ภSซTฌ3fภัั๛๗ว๐แรแ๏๏QฃF•jฝ{๗B]]ฝP๛๑ใวC}๛๖I๓^พฦ(55=‚ฟฟ?ฎ_ฟŽิิิRm๏ๅ;๖ N7ไไไHงทn cccโัฃGาซQฃF000ภัฃGU๚kะ |}}ฅ้jีชมืฏ_—ๆ๏ƒซซ+บvํZ(žWO? 8ZZZาtA฿/๗ ‘ฆํํํabb‚๚๕๋ฃqใฦา‚Ÿ_^ๅ˜››‹วฃN:011Q9ีQ`๐เมPWW/4.]บฺฺุ"22ฆฆฆ*ห›7o!ฤk๏Xพpแnธ1cฦภฤฤDeYม>บ{๗.bcc1`ภTฉREZ๎โโ‚ภภ@์ปทPฟC‡U™๖๕๕ลใว‘––จWฏฐeหฉM~~>ถm†N:I๛๊M ;;;ดiำฆฤœ฿—>}๚เฺตk8w๎œ๔๏›œV-€ฺตkKำ...022*t,พ‰VญZฉœ:*8>ปw๏CCรB๓_–††† "Mkiiaศ!x๐เbbbผ๘]ีฏ_*ฟซ–-[@ก฿•ฟฟ?4h 2ฯฤฤฯž=รกC‡:ื—ฝอฑ๛j<๓สiย7UTž%y฿Nมฉูแร‡ซด๛๓ฯ ๕ebb‚ณgฯโฮ;ลnฏด๏%้ีซ—ส{Pq๏ŸEษศศ๐โๆ๐แร่ำง† †;wโ้ำงา)Yธz๕*~๘แ,Xฐฺฺฺooyc!GลาาายO?„7n ==kืฎ-๕u=7o„ฅฅฅส›8ิฏ__Z^เิฉSฎ/ฉVญฆN ฅ*ไิิิ๐ัGฉฬซWฏHื’$%%!55ๆๆๆจVญšส+##>>่ฝ{Y„]nxื*•่ภ€ฌฌ,$%%•๙ู฿VญZมมม‹-‚ตต5ดดดฐw๏^|๗P*•eฒฅR ssslุฐกศๅ3(nคJผrEi•ถฟโฺ•fฯ?kืฎล˜1cเํํ ccc( „„„นKบฒ{๗๎Xฟ~=6lุ 2R๒_QšัซW/L™2[ทnล˜1c๐๋ฏฟยุุmถ•ฺผ้q๑6wจ–ฅ>}๚`ลŠ044Dฏ^ฝ ฆ๖ๆ/อพ+๎?l๙๙๙oิgY)•J8;;cัขEE.ตh,๊wennŽุุX8p๛๖ํรพ}๛ฐvํZ|๑วXฟ~ว๔ฎ๊ืฏ+Wฎ`๗๎ุฟ?๗ฟa๙๒ๅ๘๚๋ฏKXง7=&ห๒wาณgO๘๚๚bวŽ8x๐ ,X€y๓ๆa๛๖ํhืฎ๗Wœw‰ูาาPฝz๕Bหฬออฅb๐ศ‘#ุฟ?ถo฿ฎrCN^^ž?ŽไไdTฉRๅc๛พฐฃbลววใ›oพมภ‹Aƒแโล‹าชโ฿๐mll‰๔๔t•Qน‚ป๎lllฟ;ฒณณฑkื.•uฝzšค$Jฅืฏ_—gผ" ๎ฉ]ป6"##ัดiำ2๛0ฎ]ป6.]บT&}•…mถก๘๎ป๏คyYYYo๕ ั @CCร‡‡กกแ[ย ยปt้ŠlSp,๕จฤฤDTญZ๕ญbgg///lูฒ#GŽฤ๖ํคrสคฌŽ‹7น๕]๔้ำ_5๎ฝ‹ˆˆˆ๗ถSSำ"›—Gาหา;w =งจฟแธธ8ดjี๊๖ท––:u๊„N:AฉTb๘๐แXนr%พ๚๊ซ"G€’฿็€w;v๕๕๕ัซW/๔๊ี 999่ึญfฯž)Sฆ@GGงŽญ666P*•ธqใ๊ึญ+อ๕.๛5jิภ๐แร1|๘p–.]ช2๛๏ฟ‡Bกศ ง๕๒ฌRSSฑvํฺ7Š๗ๅํ!ฐt้RhjjขUซV^ฯ1??฿~๛mกu๓๒๒ชุ้ฝ;โโโฐcวŽBหvไ๎]จซซฺ๎’%KŠE)‰BกภชUซŒ๛cืฎ]*หK๛H† ยฮฮ‹/.ด bญQฃฐ~z•6—.]ยมƒัพ}๛7Žฟ@ฏ^ฝpๆฬ๔ำOx๔่‘สiU ์Ž }}ry๒~ํฺตฑx๑b„……มหห๋ฝn'55๑๑๑าผปw๏yฌ—…ผผ<ฌ\นRšฮษษมส•+QญZ5้ƒธgฯž๘๗฿ฑz๕๊B๋?ผฤS˜?~ฌ2ญฆฆ(๑‘zzz ฟฯฝ๋ฑ๛j|†††pqqมื_/ฟมมมาTม›์จQฃะฆMจซซ#$$:uB‹-0mฺ4$''รีีฤoฟ†1cฦH#5ญ[ท–‡๙ไ4jิOž<มฎ]ปWWื7๊๏]u์ุ066Fƒ ๐ว 22fffoีŸšš~๙ๅกgฯžุปwฏtMึŸ‰-Z`๚๔้%^ฤฌฆฆ†+V SงNpssรภQฃF $&&โ๒ๅหาฉ๛  ]ปv๐๖๖ฦงŸ~Š็ฯŸcษ’%066~ง‹ค{๖์‰ &`ย„ จRฅJกQมฒ:.5j„ศศH,Zด–––ฐณณSน9ๅUฟ;โโโผ๘OS||UซVขM›6"11Qุุุจ<ขเ๑#็ฮ+ิ็ซฯ‘โลcM…๔”7yค€BœG2''Gฬ›7O8:: mmmajj*5j$fฮœ)RSS_›็ถmD๋ึญ…นนนะาาตjีC† )๔ผมขœ>}Z4jิHhii:๖Ks์eๅส•ยฯฯO˜™™ mmmQปvm1qโD•\„โoฟ5kึjjj*วyIฟ๗Wc|“ฟgฯž‰#Fˆ*Uช$=างเ™“ูููbโฤ‰ยีีU๚ปvuuห—/W้ฟ,?๒๊qTT~%} ๑โyMš4:::ขJ•*"44ดTฟ๗ท}HFF†่ำง011๋ฃHBTภ9 """’ุุXธปปใ—_~A฿พ}+:z ฏ‘#"""ษห_อX`๑โลPSSƒŸŸ_DD%แ5rDDD$™?>bbbะขE hhhHj๙์ณฯ =ๆๅC๓ไษไไไป\]]ฝะc‹7žZ%"""ษกC‡0sๆL$$$ ##ตjีBhh(ฆM› {งy๓ๆ8v์XฑหmllTžCWXศ•BLLL‰฿(กซซ‹ฆM›–cD,ไˆˆˆˆd‹7;ษ 9"ขพ}:::oeๆeQQQP(ˆŠŠz็พš7o''งw๊? I“&๘โ‹/*: ข7ยBŽˆปu๋ึAกP@กPเไษ“…– !`mm …BŽ;ช,+Xฏเฅฏฏ `ึฌYศฬฬ,r{/^„BกภŸ๙ฮฑ๓อ7hธqน_๗๒!›3gv๎Yh้ำง1cฦŒ๗๖uU“&Mยฒeหp๏ฝ๗า?ั๛ภBŽˆสŽŽ6nXhฑcว๐ฯ?จ|กหˆˆ|๗wpwwวW_}…๛ู~ฯž=077‡งง็;ล๛๐แCฌ_ฟC‡}ง~k๐๙๓์3มJ*ไfฮœ๙ น.]บภศศจะ๗Œ—}ุ๗Qนj฿พ=ถnŠQๅ17nDฃFŠbํz๕๊ก_ฟ~า๔ะกC‘““ƒํท#++ :::*ํ๗๎‹vํฺI฿ ๙ถ~๙ๅhhhผฟ๏H| ฯž={็๏ูTSS+ดฯ>d™™™ะำำƒšš‚ƒƒ๑๓ฯ?cๆฬ™๏|•ŽศQน้ป7?~ŒC‡I๓rrrฐm6๔้ำ็๚ฒฐฐ€Bก(๔\ซ””œ>}:tๆmผ5‚กก!ŒŒŒเ์์Œ~๘แตุนs'7n •๙ื…ลววร฿฿zzzจSงถmเลcใฦกซซ {{{DFF๊๛ย… hืฎŒŒŒ```€VญZแฬ™3*m NI;v ร‡‡นน9ฌฌฌคๅ๛๖ํƒฏฏ/๔๕๕ahhˆ:เ๒ๅหฏอซจkไ’’’ะฝ{wXXX@GGVVV Ajj๊k๛^<–มววบบบฐณณCxxxก6ููู˜>}:๊ิฉmmmX[[ใ‹/พ@vvถิFกPเูณgXฟ~ฝt:}ภ€˜1c&Nœฐณณ“–ฝฬฎ_~๙5‚ฎฎ.ชTฉ‚พ}[%†‚฿]LL  งง‡ฉSงJหq๓ๆMฤฦฦ–*oขŠฦBŽˆสญญ-ผฝฝฑiำ&iพ}๛ššŠbืหสสยฃG๐่ั#ผy7nฤ๚๕๋ังOŸB… P(ะบuk/nฺปwo˜ššbผy˜;w.š7oฺ›rssq๎94lุฐศๅOŸ>EวŽัธqcฬŸ?ฺฺฺ ม–-[‚๖ํc๎นx๖์‚ƒƒ‘žž.ญ{๙๒e๘๚๚".._|๑พ๚๊+ธqอ›7วูณg mk๘๐แHHHภื_ษ“'"""ะกC`ผy๘๊ซฏ€fอšฝ๑IsrrะฆMœ9sŸ9–-[†ฯ>๛ ืฏ_/ีiฬงOŸข}๛๖hิจๆฯŸ+++ 6 ?๔“ิFฉTขs็ฮXธp!:u๊„%K– ((฿=z๕๊%ต‹ˆˆ€ถถ6|}}ฅำ้C† Aทnะปwoภ๗฿/-+xŠ์ูณ๑๑วฃnบXดhฦŒƒร‡รฯฯฏP?Fปvํเๆๆ†ล‹ฃE‹าฒF@ฅบน…*9AD๔žญ]ปV็ฮK—.†††"33S!D=D‹-„Bุุุˆ:จฌ  ศWPPศสส*ดญะะPแ๏๏/M=Z‰ผผผ7Š๙ฺตk€XฒdIกe€ุธqฃ4/11Qjjjโฬ™3าbํฺตาผ   กฅฅ%๛oi;w„กกก๐๓๓“ๆ์ทfอšฉฤŸžž.LLLฤเมƒUโบw๏ž066.4UGฤัฃG…B\ธpA[ทn-yงก`_|๗wาผ์์lแๆๆ&ฬออENNŽBˆˆˆกฆฆ&Nœ8กฒ~xxธ N:%อำืื๛๗/ดญ โฦ*๓“““…บบบ˜={ถส‹/ •๙๑†‡‡›“–––6lุks'๚/เˆ•ซž={โ๙๓็ุฝ{7าำำฑ{๗๎ืžVําฅ :„C‡แท฿~ร”)Sฐ~๔้ำโฅgš+•J์฿ฟ_ๅดช‰‰ ž={ฆr:ท4?~ 055-rนส(ขฝฝ=LLLPฟ~}4nXš_๐๓๕๋ื๙๙๙8x๐ ‚‚‚๐ัGIํjิจ>}๚เไษ“HKKSูึเมƒกฎฎ.M:t)))่ปท4R๙่ั#จซซฃqใฦ8z๔่ๅjll เลhfqw—DCCC† ‘ฆตดด0dศ+WฎฤW_}…:uู๊ญZต ซซ‹7nผU|ลฉVญ๔๔๔pๅส•Bหกฆฆ๖ฺขฆvํฺ^ฉ/Tพ+ggg8;;ให/ฟฤ้ำงัดiS„‡‡cึฌY%ฎw็ฮBEนz๕*€7ธฤ‡VญZฝvดซธๅลอฏ]ป6„ฐณณ“F฿ึฟ‹œœิฏ_๚!*/ผFŽˆสVฌX3fผ๕3ฺ~w€ซซ+เ๛8ผสiUเ_๋V@MM ... ๒ุ‹Wijjยรรัััo_qิีีับuk๖o*w—ฟ7nDณfอ^{jดM›6022ยœ9s››[h๙ร‡฿(ฆดด4ฉ0.เ์์ 55ต๗Qผผ<ฌ\นRšฮษษมส•+QญZ5้.ะž={โ฿ล๊ีซ ญ๙s<{๖Lšึืื/๒nู‚B๑ีeบuƒบบ:fฮœYhไSQ่(Iม5}>>>ฅ^‡จ"qDŽˆ*Dq฿สP”ซWฏโ—_~๐โแญgฮœม๚๕๋QงN„††xqZUGGGๅQ0hะ -44ฟ๚+†ŠฃGขiำฆศฯฯGbb"~๕W8p^<$22‹-‚ฅฅ%์์์ะธqcฉ(œ6mBBB ฉฉ‰N:กvํฺ˜5kฆL™‚ไไdมะะ7nภŽ;๐ูgŸaย„ ฅฺ‡BญZตเ๎๎^๊GTก*๎†Y"๚Pผ๘‘’”ๆ๑#๊๊๊ยสสJ|๖ูgโ๛Rปเเ`ัพ}๛B}nถMดnZ˜›› ---QซV-1dศq๗๎ืฦ}}กกก!"""Tๆ๛๛๛ GGวRล_รˆ#Tๆ?^ดiำF===ัขE q๚๔i•6ฏoGmฺดฦฦฦBGGGิฎ][ 0@DGG—˜ืซน~บ๘ไ“ODํฺต…ŽŽŽจRฅŠhัข…ˆŒŒ,ฑ!พˆŽŽBGGGุุุˆฅK—j›““#ๆอ›'…ถถถ05553gฮฉฉฉRปฤฤDแ็็'tuu•G‘|๛ํทขfอšBMMญะฃH๗ฟ‰fอš }}}กฏฏ/ฤˆ#ฤ•+W ล[”|QฃF ๑ๅ—_พ6oข …๏p.ั@^^ฬฬฬ†แร‡—i฿Ÿ~๚)ฎ^ฝŠ'N”iฟ๔฿ณs็N๔้ำ7jิจQัแ• 9"’ฝ`๙๒ๅ2dH™฿บu ๕๊ีรแร‡ัดiำ2ํ›[ผฝฝแ๋๋[ชำD,ไˆˆˆˆdŠwญษ 9""""™b!GDDD$S,ไˆˆˆˆdŠฎไ”J%๎นCCC~ 4‘L!žžKKKจฉ?๎ฦBฎ’ปs็ฮ;}5Uœทoรสสชุๅ,ไ*9CCCภ7PฅJ• Žฆ|ๅๆๆโเมƒhบต๔5A ๆฮ™๛‡ƒนWฮำาา`mm-}އ…\%Wp:ีะะฐLฟ+Rrssกงง##ฃJ๗:ฬน3๗sฏนฟ๎ฒ(์@DDD$S,ไˆˆˆˆdŠ…‘Lฑ#"""’)rDDDD2ลBŽˆˆˆHฆXศษ 9""""™b!GDDD$S,ไˆˆˆˆdŠ…‘Lฑ#"""’)rDDDD2ลBŽˆˆˆHฆ4*:*mŸ‚Rห ขร(WZjSœ฿๙ว‘ฃTTt8ๅŠน3wๆœชeGE๔qDŽˆˆˆHฆXศษ 9""""™b!GDDD$S,ไˆˆˆˆdŠ…‘Lฑ#"""’)rDDDD2ลBŽˆˆˆHฆXศษ 9""""™b!GDDD$S,ไˆˆˆˆd๊ฝrมมมhาคI™๗ปkื.๘ใ€;wโฺตk๏gHHขขขนŸWตo฿999€kืฎมฯฯŽŽŽpwwWi—™™ Lž<นฬc ""ขสIใ}u|่ะ!จซซ—yฟ๙๙๙่นณ4ฝs็N่่่ N:eพญท•››‹œœ่๋๋c๏ฝาโป๏พƒ——…ฉฉiนฤLDDD๒S&#rซWฏ†ณณ3\]]1}๚tไๆๆbฮœ9๘๒ห/Kตเมƒq๔่Q€ซซ+พ{@q๚๔iฌ[ทมมม๐๗๗Ghh(ึญ[‡ษ“'ใ์ูณุตkFŒ777คงงใฯ?„ฏฏ/6lˆ=z 33ณุํ~๕ีWฐททG๋ึญ๑๘๑ciž={ะคIธนนa่ะกP*•Eๆ๙ชไไdL:ธz๕*ภึึYYYธt้ เๅๅ077—ึKJJBbb"ฺตkงา_PP‚ƒƒ !Dฉ๖evv6าาาT^DDDT9ฝs!eห–แิฉSˆ‹‹ร่ัฃฑhั"๔๏฿†††*mรรรˆŽŽฦ AƒM›6ล้ำง‘––---œ>}ƒFIูฝ{76n(๕ืธqct๎ห–-Cll,ดตต1qโD์ฺต ็ฯŸ‡——–/_^d๙':„K—.aํฺต8sๆ เัฃGXผx1ขขข uuul฿พฝศ<#„ปvํB๛๖ํัญ[7ิฌY็ฯŸ/t๊4)) บบบ่ะก6lˆฅK—Jห&L˜€ฐฐฐB1FEEaศ!Xนr%œœœฐpแB}บuƒฆฆ&jึฌ ___ภ๘๘x้4็๓็ฯaccƒ;w๎จไYฅJ/Fอ._พŒŸอš5+6ถ|œ๙]ปvล AƒPทnBํ,--แๅๅ…5j„„lผ[ทnEFFrssadd„ฉSง222ฐeหฌYณ๚๚๚ˆˆˆ@๕๊ี‹อI[[[*~‰ˆˆจr{็Sซ-[ถฤๆอ›ฅkฑผฝฝq๗๎]$''ใไษ“pww/ฑˆ+ะ Alธ^^^hฺด)/^ŒฆM›พv=CCCคงงpใฦ \ผx๐์ูณb๏h๕๑๑มŽ;››‹;w๎เฤ‰€&Mšเ๐แร๘็Ÿ?ฦ?S(ฯ'Ožœœœฐ|๙r\ธpu๋ึEŸ>}ะขE $''ซlฯหห w๎AZZ๒๒๒p๊ิ)ุ#,, ทo฿Frr2.\ˆaร†IE„ เโโ‚ฤฤDDDD 22=z๔x/7‘‘ผs!็ไไ„‘#GยววฎฎฎลŽ\ล_#ผ8ฝZญZ5่๊๊ขiำฆ๘๗฿UFไŠ‚้ำงรออ ูููุธq#† WWWx{{[ศyyyกUซVprrยภฅSฉๆๆๆXถlบt้ดn ‘#"""’)rDDDD2ลBŽˆˆˆHฆBQัAะ๛“––ccc ๙ๅh่Wt8ๅJ๙hฉ๖7Ž(k#๊Nนb๎ฬน8˜{้s_ฺต~9DU6 >ฟSSSaddTl;Žศษ 9""""™b!GDDD$S,ไˆˆˆˆdŠ…‘Lฑ#"""’)rDDDD2ลBŽˆˆˆHฆXศษ 9""""™b!GDDD$S,ไˆˆˆˆdชRrมมมhาคษkEGGc๒ไษ€จจ(DGGฟท˜ฺทoœœภตkืเ็็GGGธปปซดหฬฬ„ั๋hTteๅะกCPWW/U[xxxxQศYXXHำe!77999ะืืวฝ{ฅ๙ฤw฿}///} SSำ2‹‹ˆˆˆ*YŽศญ^ฝฮฮฮpuuล๔้ำ‘››‹9sๆเห/ฟ,ี๚QQQ มํทŽูณgรออ Wฎ\มนs็เแแggg 6 ๙๙๙€้ำงรำำNNN˜:uj‘&''c๊ิฉpppภีซWถถถศสสยฅK—```///€นนนด^RRัฎ];•‚‚‚ŒศศH!x?Qๅ&ปB.>>ห–-รฉSง‡ัฃGcัขE่฿ฟ? Uฺ†‡‡#<<ภ‹ำฉƒ RYnmmกC‡bฺดiˆ…ฝฝ=ˆ•+Wโโล‹x๒ไ 6mฺ=z4ฮ;‡๘๘xฤวว#..ŸŸ]ปvก}๛๖่ึญjึฌ‰๓็ฯ:uš””]]]t่ะ 6ฤาฅKฅe&L@XXXก\ฃขข0dศฌ\นNNNXธp!=zTโษฮฮFZZšส‹ˆˆˆ*'ูZ-M322<Ddd$nผฉาv่ะกาฯXณfM‰}งคค@ฉTขQฃF€พ}๛b฿พ}่ืฏ>Œ๙๓็#;;๗๏฿GBB\]]„ห—/ใ็ŸFณfอŠํ;??'OžD\\ แ๏๏___$''ฃ^ฝzจWฏNŸ>ญฒŽBก@`` ๑๐แCŒ;VVVธ~:,--‹NXXfฮœYbžDDDT9ศฎ{Ull,`gg‡ผผ<<|๘;wฦฎ]ปสlYYY7nbbb`nnŽ‘#G";;ภ‹ยi๙๒ๅ๘ไ“OะตkW 4u๋ึ-ิ‡ฅฅ%ผผผPฃF @@@โใใ‘€อ›7c๋ึญศศศ@nn.ŒŒŒคำทุฒe ึฌY}}}DDD z๕๊ลฦ:eสŒ7NšNKKƒตตu™ํ """๚๏ฉี–-[b๓ๆอา)Coooฝ{ษษษ8y๒$฿จˆ344Dzz:ภฤฤ๊๊๊าiำM›6กYณfศสส‚ššLMM๑ไษ๛๏า๚NNNXพ|9.\ธ€บu๋ขOŸ>hัข’““Uถใๅๅ…;w๎ -- yyy8u๊์ํํ†ทo#99 .ฤฐaรค"nย„ pqqAbb""""‰=z”xS‡ถถ6ŒŒŒT^DDDT9ษฎsrrยศ‘#แใใWWW๘ใลถ}5rะฉS'DDDภWฎ\มO?„O?ฮฮฮ066FHHLLLะปwoิฏ_บuƒททwก~๔๕๕1hะ œ;w .„††๊`ง††fฮœ ธนน!00Pบ๑ก8HLLฤ‚ PงNา์"""๚€(o‡ฌิาาา`llŒ!ฟ =ใŠง\ฉ#-ีฦemไฃtฆฉ,˜;sg๎ๆ^๚—vญ_Q•‚ฯ๏ิิิฯฎษnDŽˆˆˆˆ^`!GDDD$S,ไˆˆˆˆdŠ…‘Lฑ#"""’)rDDDD2ลBŽˆˆˆHฆXศษ 9""""™b!GDDD$S,ไˆˆˆˆdŠ…‘LiTtT>fทญ 33ณŠฃ\ๅๆๆb๏ฟฑฐฃ=455+:œrล™;sp0๗3๗‘#"""’)rDDDD2ลSซˆ-qBื๐YE‡Qพ”๙จเ—๓j๊M๙b๎ฬน8˜{‘น๔ฌU11•3Žศษ 9""""™b!GDDD$S,ไˆˆˆˆdŠ…‘Lฑ#"""’)rDDDD2ลBŽˆˆˆHฆXศษ 9""""™b!GDDD$S,ไˆˆˆˆdŠ…‘LUŠB.88Mš4y๋๕ฃขข]†ฉj฿พ=rrrืฎ]ƒŸŸแ๎๎ฎา.33666˜ น\<{๖ ฐw๏^hiiˆ… โ๒ๅห8pเ€ส:ณgฯ.T>}๚ดLใ"""ขสCV…๊ีซแ์์ WWWLŸ>นนน˜3gพ๒หRญฟy๓fbbbเ้้‰ทo#<<ณgฯ†››ฎ\น‚s็ฮมรรฮฮฮ6l๒๓๓ำงO‡งง'œœœ0u๊ิ"ท‘œœŒฉSงยมมWฏ^ฺฺุ"++ —.]‚ผผผๆๆๆาzIIIHLLDปvํT๚ Bpp0"##!„xmŽูููHKKSyQๅ$›B.>>ห–-รฉSง‡ัฃGcัขE่฿ฟ? Uฺ†‡‡#<<AƒBBB››‹M›6aศ!Xตjฌญญ1t่PL›6 ฑฑฑฐททวภฑrๅJ\ผxOž<มฆM›ฃGฦนs็๘๘xฤลล๒๓๓ฑkื.ดo฿บuCอš5q๙BงN“’’ ซซ‹: aร†Xบtฉดlย„  +”wTT† ‚•+Wยษษ .ฤฃGŠOaaa066–^ึึึoฑท‰ˆˆH4*:€าŠŠŠBHHŒŒŒฯŸ?วมƒ‰›7oชด:tจ๔ณ‡‡ึฌY#M‡‡‡ฃAƒ6lXกB RRR T*ัจQ#@฿พ}ฑo฿>๔๋ื‡ฦ๙๓‘๛๗๏#!!ฎฎฎ ยๅห—๑๓ฯ?ฃYณfลๆŸŸ“'O"..†††๐๗๗‡ฏฏ/’““Qฏ^=ิซWงOŸVYGกP 00x๘๐!ฦŽ +++\ฟ~–––…ถ1eสŒ7NšNKKc1GDDTIษฆ{Ull,`gg‡ผผ<<|๘;wฦฎ]ปJ\/99ฺฺฺธ{๗๎m/++ ใฦCLL ฬออ1rไHdggx1 ถ|๙r|๒ษ'ฺ่ต+ „บu๋๊ราา^^^จQฃ ๑๑๑HHHภๆอ›ฑu๋Vddd 77FFFา้ŒŒ lูฒkึฌพพ>"""Pฝz๕"ใิึึ†ถถ๖ๅFDDD๒$›Sซ-[ถฤๆอ›ฅkพผฝฝq๗๎]$''ใไษ“pwwm—aร†!22ทo฿ฦมƒ†††HOO˜˜˜@]]]:mบiำ&4kึ YYYPSSƒฉฉ)žะณVU6 >ฟSSSฅ๛Š"›9""""RลBŽˆˆˆHฆXศษ 9""""™b!GDDD$S,ไˆˆˆˆdŠ…‘Lฑ#"""’)rDDDD2ลBŽˆˆˆHฆXศษ”ฦ๋›Peะหต&ฬฬฬ*:Œr•››‹ฝ{ใัฏก455+:œrล™;sp0๗3๗‘#"""’)rDDDD2ลBŽˆˆˆHฆx"&9 †Oี+:Œrฅฬฯy=j๊ึกฮ™;sp0๗ŠหปŽIนo๓U‘#"""’)rDDDD2ลBŽˆˆˆHฆXศษ 9""""™b!GDDD$S,ไˆˆˆˆdŠ…‘Lฑ#"""’)rDDDD2ลBŽˆˆˆHฆXศษ 9""""™ชB.88Mš4ymปไไdlถญฬถ;cฦ „‡‡—Yฅฑkื.๘ใาtXX์ํํQฟ~}ฌ[ทNฅําฅKกP(••Uฎ1‘&Ož,ํI“&A]] …ีชU“ึ2e fฮœฉRด8q๕๋ืวนs๑เมƒRํณ์์lคฅฅฉผˆˆˆจrzo…\||<–-[†SงN!..ฃGฦขE‹ะฟชด —NyFGGcะ A€ูณgฃM›6ˆE฿พ}1}๚tโโล‹่าฅ ฆM›V์๖CCC1cฦ ฤลลแเมƒะิิผyวŽรฏฟŠ™3gjิจร‡ใ๙๓๘แ‡0u๊T•ฮ;‡>}๚`๔่ัP*•˜2e ๆฬ™Sไ:ีซWวไษ“q๙๒e๔ํ=z๔ภ็Ÿ^d[เลศ^jjช๔*(‰ˆˆจ๒)ท›bcc‘;;;4kึ .\Pน~ฌผhkkิิิŸŸXผx1์ํํq๑โE>|X*า@OOO๚yส”)Xฝz5ž>}Šฦใ๑ใวpqqมชUซp๒ไIt๏ฟ๚+rrrŠถฅฅ%‚‚‚]ปvE\\าำำq้า%4iาถถถ๘็Ÿ`ooฬฬLiฝ .`ฤˆ?~<>๔SŒ?พฤŒŒŒT^DDDT9ฝทBฎeห–ุผyณt–ทท7๎ฝ‹ไไdœ๙gLŸ>ฎฎฎhถ-rss‹m;t่P,]บnnn*…ใซ-ZGGGธธธภมมฎฎฎ*หŽ๘๘xธนนZ๐เม8}๚4œ1{๖l|๗ลn x1ธaร9rฝz๕‚––V‰ํ‰ˆˆ่รขBˆŠ‚Ÿดด4ใ@๔u›Vt8ๅJ™Ÿ‡G‰งPีก)ิิหI;Šน3wๆแ`๎—ปw“๗ึwม็wมฃศŠรov """’)ูrณgฯ†›››สซ,ฟ ‚ˆˆˆ่ฟJ๖cฐำฆM+๑yrDDDD••์Gไˆˆˆˆ>T,ไˆˆˆˆdŠ…‘Lฑ#"""’)rDDDD2ลBŽˆˆˆHฆXศษ 9""""™’ฉtูมฬฬคขร(Wนนนุ›x}d MMอŠง\1wๆฮ?ฬรฬฝGไˆˆˆˆdŠ…‘Lฑ#"""’)^#๗x0ิ9ŠœŠฃ\ๅk่ฝVใ~šPฯหช่pสsฏนื๘5ญขC ข8Žศษ 9""""™b!GDDD$S,ไˆˆˆˆdŠ…‘Lฑ#"""’)rDDDD2ลBŽˆˆˆHฆXศษ 9""""™b!GDDD$S,ไˆˆˆˆdŠ…‘LฝทB.%%kึฌ)vน……ลk๛Xทn=zTf1•f›eญ}๛๖ศษษ\ปv ~~~ptt„ปปปJปฬฬLุุุ`๒ไษๅ#ษS…rฅQึ…ปศฯฯ/u\<{๖ ฐw๏^hiiˆ… โ๒ๅห8pเ€ส:ณgฯF“&MTๆ=}๚๔ฃ&""ขสฌฬ น;w๎ iำฆpssƒ‹‹ ฦ‹/ยออ ,ภณgฯะตkW4hะC‡}m;v์@tt4บvํ ___ภฺตkแไไ'''ฌZตชฤ๕gฮœ '''ธธธ`ๅส•าัฃGรัั]บt‘Šณ้ำงรำำNNN˜:uชิึึึSฆL››Nž<‰~๚มััฮฮฮุธqcกm&''c๊ิฉpppภีซWฅ>ฒฒฒp้า%ภหห `nn.ญ—””„ฤฤDดkืNฅฟ   #22Bˆื๎3ศฮฮFZZšส‹ˆˆˆ*ง2+ไ6mฺ„€€ฤฦฦ"&&ณfอ‚ณณ3bcc1qโD,[ถ vvvHHH@ปvํp}i]777้็AƒIœ‡‡v์ุ'NเŸม์ูณq๒ไI๑วXดh’““‹Œe๗๎8u๊ฮŸ?๘๘x๔่ัp}t๏—/_†Rฉฤ‘#Gผ(๎ฮ;‡๘๘xฤวว#..N๊หึึฑฑฑ000ภํทq๙๒e\ผx:t๐bคnืฎ]h฿พ=บu๋†š5kโ๙๓…N&%%AWW:t@ร† ฑt้Riู„ V(จจ( 2+Wฎ„““.\๘ฺสฐฐ0K/kk๋‘|i”UGžžž0`ิิิะฃG่้้ฉ,?}๚ด4ฺีฅK•ๅฑฑฑาฯลŽŽŽF๋ึญabbเลตggฯž…ญญmกถGŽม'Ÿ|"าฌRฅ ภฤฤ~~~wwwฉ<|๘0ๆฯŸ์์lฟ puuฉ่ฃp๋ึ-|๙็ BซVญผ5ป|๙2~๙g4kึฌุ“ŸŸ“'O"..†††๐๗๗‡ฏฏ/’““Qฏ^=ิซWงOŸVYGกP 00x๘๐!ฦŽ +++\ฟ~–––Engส”)7nœ4––ฦbŽˆˆจ’*ณ9????~ๆๆๆ่ฝ;>\จBก(ซอฝmmm้g555ไ็็#++ ใฦรž={คัป์์lฉ]AมijjŠ๘๘x4kึ ๓ๆอรŒ3ผkถ->๙ไLš4 IIIEnาา^^^จQฃ €๘๘xœ9s›7o†ญญ-&L˜€+V`ฮœ9าz๘ฟ๛?t๎๗๎CDDชWฏ^bŽFFF*/"""ชœสฌปy๓&jิจaร†!$$)))HOO—–๛๘๘`ห–-^œ๚ฬฬฬ|mŸ†††Ržžž8|๘0าาา‘‘}๛๖กqใฦEฎ€Ÿ~๚Iบ[๔ษ“'ลn#++ jjj055ล“'O๐๛๏ฟู๎ัฃGB Wฏ^˜6mš4Š่ไไ„ๅห—ใย… จ[ท.๚๔้ƒ-Z:ํ๋ๅๅ…;w๎ -- yyy8u๊์ํํ†ทo#99 .ฤฐaรค‘ห &ภลล‰‰‰ˆˆˆ@dd$z๔่uu๕ื๎;"""ชส์ิjTTๆฯŸ---˜™™a๓ๆอˆŽŽ†‹‹ BCC1bฤ๔ํŽŽŽ๐๓๓SUrss“ ฃAƒa่ะก๐๐๐ภ€Šjีชแฤ‰˜4i|||cวŽ-๒ด*๐โดktt4กกก‘#Gb๐เมEถ511A๏ฝQฟ~}XYYมปศv๓!444Tฎq}}} 4ƒ BLL 44Twญ††fฮœ)ล฿ฃG้ฦ‡โ`ฮœ9า)b"""ข—)Dio‡$YJKKƒฑฑ1‚อ`ขศฉ่pสUพ†bzญFฃ-ƒกž—Uัแ”+ๆ^9rฏ๑๋›už››‹ฝ{๗ข}๛๖ะิิ|OQ71wๆ^ูr/๘NMM-๑2)~ณ‘L•ูฉีŠ๐๘๑c้๎ัUซVEdddEDDDDT~d]ศ™™™ฉ<บ„ˆˆˆ่CยSซDDDD2ลBŽˆˆˆHฆXศษ 9""""™b!GDDD$S,ไˆˆˆˆdŠ…‘Lฑ#"""’)Y?˜Jฯ< ฬฬฬ*:Œr•›› ์‹๊๋ญt฿ม๗:ฬรฬˆ><‘#"""’)rDDDD2ลBŽˆˆˆHฆxBนช”ฺสŠฃ\)ZภGฃ \ฺJ‘Sัแ”+9็ฎ6๎DE‡@D$‘#"""’)rDDDD2ลBŽˆˆˆHฆXศษ 9""""™b!GDDD$S,ไˆˆˆˆdŠ…‘Lฑ#"""’)rDDDD2ลBŽˆˆˆHฆXศษ 9""""™z/…\JJ ึฌYS์r ‹ื๖ฑn:}››‹-Z 66QQQ*ฮสสย–-[ฐrๅJ4osๆฬมŒ3คพWฏ^={๖ิีีQฅJi/พ๘ห—/Gddค4oำฆMวgŸ}†ะะPฝv฿egg#;;[šNKK{ํ:DDD$Oe2"ทiำ& 66111˜5kœ‹‰'bูฒeฐณณCBBฺตk‡๛๗๏K๋บนนI?4H*เ<<<ฐcวœ8q๓fฯž“'Oโ?ภขE‹œœ\d,ซVญยศ‘#‹SงNมภภณgฯF›6m‹พ}๛๛o?~\*_f``€˜˜๔๋ืแแแ€1cฦ`ฦŒˆ‹‹ƒ††j{ๅสŒ;NNN8 L™2ฉฉฉา๋๖ํลถ%"""y+“Bฮฯฯว‡นน9บw๏Žร‡jฃP(สbSฏีงO๖oะะะ@‹-๐ื_ู๎ๅb๒Uฺฺฺ555ไ็็„Eถ ฤย… ฑaร๔๎{๗๎…Rฉ,ฒญฅฅ%‚‚‚]ปvE\\ฎ_ฟŽkืฎก~๚ฐตตลร‡ัฐaC•๕Nœ8bผy˜:u*๚๕๋Wb์FFF*/"""ชœสคปy๓&jิจaร†!$$)))HOO—–๛๘๘`ห–-€ปw#33๓ต}J}xzzโ๐แรHKKCFF๖ํ‡ฦน7PงNŒ7ธrๅŠJ_oหีี{๗๎lบUšodd„ัฃG#..cวŽล† `oo_~๙ฅP;vฤฑcวQQQppp€ณณ3๎฿ฟไไd$''ฃZตj8<เเมƒprrยย… ัปwo\พ|ำฆMC๕๊ี฿)"""ชสไf‡จจ(ฬŸ?ZZZ033รๆอ› „††bฤˆ่ท/แ็็งRˆธนนIงW „กC‡ยรร @hh(ชUซ†'N`าคI๐๑๑Œ;ถถถEฦฒy๓f๒ห/ะิิD:uะถm[จซซใ๙๓็าอoใ๛๏ฟG฿พ}1u๊T๘๘๘9าๅ็็???<~ธศ‘ภ)Sฆ w๏˜9s&,,,Qโ6อฬฬฐ~XYYฝUฬDDDTน)Dq็ IEff&tuuกP(0kึ,ไๅๅaฦŒึkฅฅฅมุุๆ๘มLป่Sพ•UฎB ๛?…ถื„ฆศฉ่pส•œsWwโึฯออลฝ{ัพ}๛bฏƒญฌ˜;sg๎•Gม็wjjj‰—I•ษˆ‡เ์ูณ;v,๒๓๓agg‡ŸนขC"""ขœl นวฃUซV*๓ชVญช๒ถฒT๐์8"""ข ูrfff,ฌˆˆˆ่ƒ๖^พข‹ˆˆˆˆ?rDDDD2ลBŽˆˆˆHฆXศษ 9""""™b!GDDD$S,ไˆˆˆˆdŠ…‘Lษ๖ภ๔fิ>53ณŠฃ\ฉๅๆ{๗Bmไ~จUฒ๏เ{9w"ข GไˆˆˆˆdŠ…‘L๑ิ๊Bน”z๒uซu]Zั!งpDŽˆˆˆHฆXศษ 9""""™b!GDDD$S,ไˆˆˆˆdŠ…‘Lฑ#"""’)rDDDD2ลBŽˆˆˆHฆXศษ 9""""™b!GDDD$S,ไˆˆˆˆdŠ…€€€€—งคค`อš5าtVVZถl www=z๔๚?w๎<<<เ่่ˆN:ฉดป{๗.ŒŒŒ†ั‡HฃขจHB!Ybป‚Bnะ A€ .ภศศGŽ)vฬฬLhhh@KKK๊?77ƒฦถmPงNƒRฉTฏ^ร† ƒณณ3n฿พ @TTฺดiƒN:กnบ˜={6`ฺดiธx๑"ฐ`ม„††โุฑcpssรใวUโธ|๙2>s8::โ้ำง ๕เภx{{ฃN:sssiฝใวรศศฮฮฮ*yxx`เภ8{๖lฉ๖Cvv6าาาT^DDDT9UšBnำฆM@ll,bbb „@||<พ๚๊+$$$เัฃGุพ};เมƒ ยฅK—`ccฃาฯ… ฐn:ฤลล!<<ฯž=ร์ูณแ์์ŒุุXLœ8kึฌA›6m 333dggcร† ๐๓๓ระกCแ้้‰ฟ๚ ีซWW้;)) ูููhูฒ%<<<ฐm6@^^พ๚kฬœ9ณP^Wฎ\A็ฮ1cฦ xxx`ๅส•ศศศ(v?„……มุุXzY[[ฟ๋ฎ%""ขจJsjีำำ €ššz๔่===ุรออ ‚“'O"88†††hำฆM‘4mฺfff;;;นsššš%nรรZZZXฟ~=œœœŠm—ŸŸณgฯโ?@vv6ผฝฝแ็็‡M›6กGจRฅJกu444ะตkWtํฺ7oฤเมƒ1aยคงงน)Sฆ`ธqาtZZ‹9""ขJชาŒศ๙๙๙แ๘๑ใ077G๗๎q๘๐a( iนBกฆ๕๔๔ŠํG[[[๚YMM ๙๙๙ฏ๖ชUซเ่่ˆ=z`ึฌY๘๗฿‹lgii‰-ZภศศีชUCฃFpๅส๙็Ÿ˜?>lmmฑx๑bL›6 ?ณดใวฑx๑bt๎๚๚๚ุบuk‰๑ฉผˆˆˆจrช4#r7o„••† † ==‰‰‰ˆ‡ณณ3~๕W„„„ผU฿†††ลŽ€€ทท7ผฝฝ๑ไษฌ_ฟmฺดมG}„ˆˆKํZทnฅK—"''นนนˆ‹‹CํฺตฑaรฉอŒ3`aa?ะงODGGฃ_ฟ~ุทo,--฿*"""ช|*M!…๙๓็CKK fff˜;w.\\\0sๆL\พ|~~~ฺ่ต๋[๕mffธธธ 44žžžEถซRฅ ฦŽ‹ฑcว"**ชะ๒ชUซbเภpssƒššฦฺยฌOŸ>๘ๅ—_ ฆViO‰ˆˆจŒTšBฎ่฿ฟฟ4œœ mmm๏+ิ๖ฝ{EN7oอ›7—ๆฟ\ŒmฺดIe—ๅๅๅ/oo๐เม\ๆ!"""’ฉJ[ศฺฺูโฬ™3ั{Si 9"""ขสŽ…‘Lฑ#"""’)rDDDD2ลBŽˆˆˆHฆXศษ 9""""™b!GDDD$S,ไˆˆˆˆdชา|ื*•Lญํlจ™™UtDDDT†8"GDDD$S,ไˆˆˆˆdŠ…‘L๑น„2แP้Vt๏•škhE‡@DDTฎ8"GDDD$S,ไˆˆˆˆdŠ…‘Lฑ#"""’)rDDDD2ลBŽˆˆˆHฆXศษ 9""""™b!GDDD$S,ไˆˆˆˆdŠ…‘Lฑ#"""’)rDDDD2Uฆ…\JJ ึฌYS–]ส^๛๖ํ‘““ธvํเ่่www•v™™™ฐฑฑมไษ“+"L"""’กr+ไ๒๓๓หrSฅVอออลณgฯ{๗๎…––`เภXธp!._พŒจฌ3{๖l4iาDeำงOห'`"""’ฅRrw๎AำฆMแๆๆœ>}Ze:11ำฆMรล‹แๆๆ† `บu†ฟฟ?BCCq}t้า๐๕๕ลีซWแแแ๐๔๔„‹‹ ฅR hผ9ฦwwwxzz"::ญZตยG}„={๖๋Œ30pเ@x{{ใ‹/พ@RRัจQ#ดm๗๏฿ฺฺุ"++ ฐn:i4lโฤ‰ppp€ซซ+,Xล๖๑ฒไไdL:Rnธt้ เๅๅ077—ึKJJBbb"ฺตkงา_PP‚ƒƒ !Dฉ~OูููHKKSyQๅT๊BnำฆM@ll,bbbp๔่Q•iฬž=ฮฮฮˆลฤ‰๑๑๑ุฝ{76nˆฑcวb๚๔้ˆŽŽฦขE‹0n8@ฯž=q๎9ฤววCWWฟปด]333\ธpอš5รศ‘#ฑgฯ์นณfอ*1ฟววw฿}‡#F`อš5ˆ‰‰มงŸ~Šoฟถุ๕?~Œmถ!!!qqq๘์ณฯ ุ>๒๓๓ฑkื.ดo฿บuCอš5q๙BงN“’’ ซซ‹: aร†Xบtฉดlย„  +KTT† ‚•+Wยษษ .ฤฃGJฬ;,, ฦฦฦาหฺฺบฤ๖DDD$_ฅm่้้‰@MM =z๔€ฏฏฏสtƒ Š\ฏmถ0449r า2uuu@\\พ๒Kคฅฅ!%%ึึึ่าฅ  cวŽggg( ่่่ภษษ ทn*1   hjj"==งN’๚หฯฯGํฺต‹]ฯุุ4h‚‚‚ะกC‡๛ ยๅห—๑๓ฯ?ฃYณfล๖›ŸŸ“'O"..†††๐๗๗‡ฏฏ/’““Qฏ^=ิซWงOŸVYGกP 00x๘๐!ฦŽ +++\ฟ~–––Engส”)R iii,ๆˆˆˆ*ฉRr~~~8~8~wt๏K—.-4]Tคงง'ฌP(pyจฉฉ<๛๖ํCบuฑpแBdddHห ฎ/SSSS๙๙uืพlWฉTขfอšˆ-ิF]]]:› ะะะ@tt48€ 6`๛๖ํ๘แ‡Šํ#,, ห—/ว'Ÿ|‚ฎ]ปbะ Aจ[ทnกv–––๐๒๒B5ˆGBB6oŒญ[ท"##นนน022ยิฉSุฒe ึฌY}}}DDD z๕๊ลๆญญญ mmํ๗ Uฅ>ตz๓ๆMิจQร† CHHNž<ฉ2}๑โE"==ฝุ>|}}ฅ›!”J%.^ผx๖์ชUซ†ฌฌ,lูฒๅSRell SSS}๚ E‹HNNV‰รหห w๎AZZ๒๒๒p๊ิ)ุ#,, ทo฿Frr2.\ˆaร†IE„ ค๋#""‰=zH#™DDD๔a+u!ธปปใฤ‰ฐตตU™๎ืฏฬฬฬเโโ้&—-Yฒ๛๖ํƒซซ+œœœคฆM›†† ขE‹…ฎ-+ 6lภ‚ เ๊๊ 777œ={๐ๅ—_โใ?†tช2==:t€ซซ+บt้"] W\๔๕๕1hะ œ;w .„††๊`ง††fฮœ ธนน!00Pบ๑ก8HLLฤ‚ PงNฒฺDDDTI(Dio‡$YJKKƒฑฑ1_ 3#Š็ฝRs U™ฮออลฝ{ัพ}{hjjVPTƒน3wๆแ`๎•3๗‚ฯ๏ิิTŽ฿์@DDD$Sฅพูแฟ่ภ˜4i’สผถmb๎นQ๙‘u!ืฆMดiำฆขร """ช<ตJDDD$S,ไˆˆˆˆdŠ…‘Lฑ#"""’)rDDDD2ลBŽˆˆˆHฆXศษ 9""""™’๕ฉ๔ิt‡š™YE‡ADDDeˆ#rDDDD2ลBŽˆˆˆHฆXศษฏ‘๛@ดู>J’œ๏ทต|‚!""ข2ม9""""™b!GDDD$S,ไˆˆˆˆdŠ…‘Lฑ#"""’)rDDDD2ลBŽˆˆˆHฆXศษ 9""""™b!GDDD$S,ไˆˆˆˆdŠ…‘LUชB.%%kึฌฉ่0T์ฺต ?๘ฃ4{{{ิฏ_๋ึญSiปt้R( dee•s”DDD$G@Y*(ไ ThY~~>ิีีห-–งOŸยิิ;w–ๆ8p็ฮCBBิิิ๐่ั#iูร‡ฑgฯิชUKš—šš ###(Šr‹›ˆˆˆไC6#rw๎AำฆMแๆๆœ>}Ze:11ำฆMรล‹แๆๆ† `บu†ฟฟ?BCCq}t้า๐๕๕ลีซWแแแ๐๔๔„‹‹ ฅR hผ9ฦwwwxzz"::ญZตยG}„={๖Š1//ทoG๋ึญ1rไHภบu๋0y๒dภ๊ีซ1iา$จซซCกP ZตjาบSฆLมฬ™3UŠถ'N ~๚˜;w.>>3f ขฃฃaddTl๙๙๙ศฯฯวนs็ฐqใFŒ=ถmร”)Sฐiำฆ"ืฉ^ฝ:&OžŒI“&a๗๎่ัฃBBBฐdษ’"‡……aๆฬ™%ํJ"""ช$d3"็็็‡ใวรปwGnnฎส๔แร‡‹\OOOO๚YกPเ๙๓ˆ•F๒`๐เมXทn.^ผˆัฃG#;;[ZGKK  ฆฆฆ๒s~~>ภลลซVญยษ“'ัฝ{w๚๋ฏศษษ)2KKKบvํŠธธ8คงงใาฅKhาค lmm๑ฯ?ภ™™™าz.\ภˆ#0~x|๚้ง?~|ฑ๛iส”)HMM•^ฃ~DDDT๙ศฆปy๓&jิจaร†!$$'OžT™พx๑" ‘žž^lพพพา]ญJฅ/^<{๖ ีชUCVVถlู๒Fq้่่เ“O>ม™3gฐ`ม9r๘๎ป๏ ต}๙TiTT`llŒ‡"99ษษษฐฒฒย•+W งง‡๓็ฯรำำใว‡ฟฟ?.]บ„นs็ยึึถุxดตตaddค๒"""ขสI6งVฃขข0|hiiมฬฬ กกกpqq‘ฆ7o 333ธธธภลลกกก*7ภ’%K0t่P,[ถ นนน๘๘ใแ์์Œiำฆกaร†จ^ฝ:฿:F777„‡‡###gฯž-ด|๐เม่ืฏึญ[ccc๔ำO%๖งงง‡ 6 ^ฝzoU^ฒ)ไ๚๗๏๛š๗ชโฎ5^\oถcวŽB๓GŽ)e๚ฒ—o,0`€สฒ{๗๎ปดjีชะzบบบ๘฿W์zœœ,์เเPb["""๚ฐษๆิ*ฉb!GDDD$S,ไˆˆˆˆdŠ…‘Lฑ#"""’)rDDDD2ลBŽˆˆˆHฆXศษ 9""""™b!GDDD$S,ไˆˆˆˆdŠ…‘LiTtT>t ‡™™YE‡ADDDeˆ#rDDDD2ลBŽˆˆˆHฆXศษ 9""""™b!GDDD$S,ไˆˆˆˆdŠ…‘Lฑ#"""’)rDDDD2ลBŽˆˆˆHฆXศษ 9""""™b!GDDD$S,ไˆˆˆˆdŠ…‘LiTt๔~ !้้้ะิิฌเhสWnn.233‘––ฦ? ฬน3๗Geฮ=-- ภ/ นJ๎๑ใว;;ป Ž„ˆˆˆTzz:Œ‹]ฮBฎ’ซRฅ เึญ[%%๑๔๔ฤนs็ส}w]?-- ึึึธ}๛6ŒŒŒส}๛r๎๏บ>s0s—๕™;sฏlน !žžKKหืg!Wษฉฉฝธ าุุ๘ญruu๕ Yท,ึ###ๆ^ฏศ}0w9ๆ^๋3wๆ^~Ÿ๋—f†7;ะk1ขBึ-‹๕฿sฏ˜๕™{ลฉ่ใถ"๓ฏุ่™{ลจุ่฿u}…xUt$kiii066Fjj๊;/_n˜;sg๎ๆฮ?ด pDฎ’ำึึฦ๔้ำกญญ]ัก”;ๆฮ?4ฬนh>ไ pDŽˆˆˆHฆ8"GDDD$S,ไˆˆˆˆdŠ…‘Lฑ#"""’)r•ุฒeห`kk 4n๙gE‡๔ฮยยยเ้้ CCC˜››#((Wฎ\Qi“••…#Fภฬฬ ่ฝ;๎฿ฟฏาๆึญ[่ะก๔๔๔`nnމ'"//ฏ๔Sddd”w*o$??_}๕์์์ ซซ‹ฺตkใoฟU๙ลส’๛๑ใวัฉS'XZZBกP`็ฮ*หห*ฯ๘๘x๘๚๚BGGึึึ˜?๛NํตJส=77“&M‚ณณ3๔๕๕aii‰?w๎Q้ฃ2ๆชกC‡BกP`๑โล*๓ๅš{™T)mผYhii‰Ÿ~๚I\พ|Y iา$aoož3*ฝ’Š™๙ง nผ)„จน๓ฯ?ขfอšโาฅKยฦฦFฅซ,นฟ-žZญ„rrrƒ€€ižšš๐วT`de/55PฅJ@LL rssUrwpp@ญZตค๘ใ8;;ฃz๕๊R›6mฺ -- —/_.ว่฿ฮˆ#ะกC•ส๛ฎ]ปเแแ=zภ๎๎๎Xฝzตดฦธw๏žJ๎ฦฦฦhธฑJ๎&&&๐๐๐ฺ@MM gฯž-ฟd>ŒซWฏโโโp๒ไIดkื@ๅฮee•็???hiiImฺดiƒ+Wฎเ้ำงๅ”อปKMM…Bก€‰‰ €สปRฉDhh(&NœGGวBห+s๎ฅมBฎz๔่๒๓๓U>ฌ z๕๊ธw๏^EU๖”J%ฦŒƒฆM›ยษษ p๏=hiiIon^ฮฝ{E๎›‚ee›7oฦ๙๓็VhYeฮ๚๕๋Xฑb๊ึญ‹`ุฐa5jึฏ_เว^า1๏=˜››ซ,ืะะ@•*UำนOž<!!!ppp€ฆฆ&1fฬ๔ํ@ๅฮee•ง\^–••…I“&กw๏าืRUๆ็อ› Œ5ชศๅ•9๗าะจ่ˆึˆ#p้า%œ|ูปB`ไศ‘ุฑcŽ9;;;•ๅ5‚ฆฆฆJ๎Wฎ\มญ[ทคฝฝฝq๑โE•?‚7ลW‹…’VญZแโล‹ˆ•^่ทฏ๔seอฝiำฆ…3s๕๊Uุุุ์์์`aaก’{ZZฮž=ซ’{JJ bbbค6GށRฉDใฦห!‹ท“™™ 55ีทjuuu(•J•;๗—•Už8~8rssฅ6‡‚ฝฝ=LMMห)›7WPฤ%%%!22fff*ห+k๎กกกˆWy฿ณดดฤฤ‰qเภ•7๗Rซ่ป-ุ่ผyณะึึ๋ึญ โณฯ>&&&*w+สัฐaร„ฑฑฑˆŠŠw๏•^™™™R›กC‡ŠZตj‰#GŽˆ่่hแํํ-ผฝฝฅๅเhบตˆ๛๗๏ีชU๛ฯ?‚ฃ(/฿ต*Dๅอฯ?b๖์ู"))IlุฐA่้้‰_~๙Ej3w๎\abb"~๛ํ7/บt้Rไฃ)ลูณgลษ“'EบusเxUEอš5ฅวl฿พ]TญZU|๑ลR›ส’{zzบธpแ‚ธpแ‚ -Z$.\ธ ™Yyฆคคˆ๊ีซ‹ะะPq้า%ฑy๓fกงงWแก()๗œœันsgaee%bccU๛^พ ณ2ๆ^”W๏ZBพน—r•ุ’%KDญZต„–––๐๒๒gฮœฉ่€"_kืฎ•ฺ<\ >\˜šš ===ัตkWq๗๎]•~’““Eปvํ„ฎฎฎจZตช?~ผศออ-็lซ…\eฮ๗฿NNNB[[[888ˆUซVฉ,W*•โซฏพีซWฺฺฺขUซVโส•+*m?~,z๗๎- „‘‘‘8p HOO/ฯ4XZZš=zดจUซ–ะัั}๔‘˜6mšสxeษ่ัฃE}๗๏฿_Qvyฦลล‰fอš mmmQณfM1w๎๒JฑX%ๅ~ใฦb฿๛Ž=*๕Qs/JQ…œ\s/ !^z<8ษฏ‘#"""’)rDDDD2ลBŽˆˆˆHฆXศษ 9""""™b!GDDD$S,ไˆˆˆˆdŠ…‘Lฑ#"*#ฯž=Cƒ ‘‘Qักจpttฤ๑Fฺฺุ๋โไษ“๏)ข7s๕๊U4iาคขร ๚Ob!GD•†ญญ-๔๕๕๑์ู3i^ff& akkซาNOO033Cฯž=๑๔้S•พbcc฿ธxG—.]```๐Ny”ตห—/K_,พEEEกN:*๓ €YณfฝuŸ๕๊ีƒ……~๗w จาa!GD•Jอš5ฑs็Ni๚ท฿~C5 ต;x๐ 222p๋ึ-ไไไเoฟUYพ~ดm๖ถ๗่ป๗[ล&๒๒๒๛6+ rํป7ึฌYSมั๗ฐ#ขJฅw๏ุฐaƒ4ห/ฟ o฿พลถืืืG็ฮ๑ื_ฉฬ/(ไž?Žฝ{ฃJ•*จRฅ |}}‹์็ึญ[ธs็œฅyถถถXฐ`๊ืฏCCC|๕ืธrๅ <<<`llŒกC‡Jm•J%ฆOŸkkkิจQฃFBvv6`บuhัข† cccฌ]ปOž}`nnŽ>๚๋ืฏ/6ว—O“๎ฝ๖๖๖า(ๅๆอ›‹]๏๔้ำจWฏฬฬฬ0aย(•JiูฒeหPทn]TญZ๛๗วณgฯŸŸvํฺแ๚๕๋000€ึฏ_ 6เoฟ…”๓ล‹แ็็SSS4jิัััR฿ …K—.…Zดh๐๓๓รแร‡?จ"–จTQ%acc#ขขข„•••x๐เx๐เฐฒฒ'Ož666*ํNœ8!„"55Ut๊ิILŸ>]Zž––&,,,D~~พXฑb…่ิฉ“ศฬฬนนนโ๘๑ใEn{๗๎ขQฃF…โ๑๗๗?๕—ะึึโึญ[โ๎ปขz๕๊โศ‘#B!VญZ%4h n฿พ-=z$|||ค˜ึฎ]+ิีีลฺตkE~~พศฬฬํทใวYYYโฏฟ5jิqqqล๎—‚|ซWฏ.Nž<)„โ๎ปโ๒ๅหลฎใๆๆ&๎ฝ+๗_ั Aฑfอ!„ฟ๚ซprrษษษ"33S๔๎[Œ?^!ฤัฃGEํฺตU๚๊฿ฟฟ๘๖oฅ้๔๔taii)ถm&๒๒๒ฤŽ;„ตตตxนBขs็ฮ"55UdffJ๋‰ฤฤฤ"ใ%๚PqDŽˆ*uuucห–-ุฒe บw๏uu๕Bํฺตk˜ššโ๊ีซ6l˜ด์๐แร๐๗๗‡šš455๑๘๑c\ฟ~ลŽศฅคคymจQฃPฅJ888ภีีmถ…ตต5,,,เ๏๏ธธ8ภๆอ›1aยXYYมฬฬ _56mฺ$๕Sปvm 0jjjHMMETTยยย ญญ ๔้ำทoํัิิฤ_…ŒŒ XXX Aƒลถ=z4,,,`ii‰ฑcวbห–-^œBž2e lll ซซ‹ฉSงbถmฏvปwรััQ๚มgฮœ‘ฺLž<FFFะีี•ๆ"55ติ!๚ฐ#ขJงo฿พุธq#6lุP์iี}๛๖!%%™™™ B‡คe/_ŠVญZกkืฎฐฑฑAXXX‘yทชนนน๔ณฎฎnก้‚u๎นƒZตjIหlllp็ฮiฺสสJ๚๙ึญ[ศสสBตjี`bbฌ\น๗๎+qฟภถmฐcวXYYกmถ…N)ฟฬฺฺZๅ็ปw๏J2dˆดํfอšแแร‡ฏ๖ห๑;vLZ฿ฤฤ๕Wฑ๙HOO‡ฑฑqฉทC๔!`!GD•އ‡ž}Š]็ฝ{ศหหCํฺต_›#ั‡„…UJทo/ีฉฦ\lธๆๆๆ033Cbb"ŒŒŒคขๅ่ัฃธ|๙2”J%ŒŒŒ กกQไฉZXXXเโล‹ooฏ^ฝ๐w฿แ฿ล“'O๐ํท฿"$$คศถ5kึ„ทท7พ๒Kdff"//็ฯŸGBBB‰ศษษมฦ‘––MMM™K%K–เ๛ธ{๗./^Œž={>๙ไฬ™3G*\๏ฝ‹๛๗x1๙๐แC•Gภ˜››#99Yš๎ุฑ#.\ธ€;w"//ฯŸ?ว๛Kบt้kkk˜˜˜xQ๘={&&&>|8Œฑgฯ,YฒๆๆๆฐตตลชUซJŒ{ำฆM๙GEํฺตกฏฏ>๚ฟ๒Kž๕&''cฤˆppp€žžlmm๑ฟ/ฯ9`*• 3fฬ€ญญ-๔๕๕ัคI๗฿jmrฯๅ‰G@@ แไไ$v่ะ!ิฉSจQฃ"##ี–ฟ~: „5jภภภ––– ARR’Zป•+WBกPเะกC4hฌฌฌ`kk[เถฝ~:œœœเ๊๊Šปw๏xฑว!11ฑศ็บ:u AAAฐฐฐ€‘‘๑๗฿ซต9pเ4h###˜››ฃ]ปvธx๑ขZ›C„7z๕๊sss˜™™กw๏x๚๔ฉิฮีีy๊PฉTจ\น2‚ƒƒีฆฝษ๛bฯž=๐๑๑–.] …B๔๔tฌZตJ๚(่g.{{{ต฿•ื้ึญโโโ˜˜(Mปs็8€nบนŸCง[ทn…ซซ+๔๔๔เโโ‚ปwซต+่\ขํŸ_Ÿ7n„ณณ3 เ็็‡„„ภาฅKแไไ}}}4jิ(ฯ๛1WLL ๊ีซ8::""""O›ŒŒ L™2NNNะำำƒฦŽ‹ŒŒŒ|kZณf \\\ งง'q๚๕๐๖๖†‰‰ LMMแๆๆ–็ฝ๘ฒคค$TจP0mฺ4้5~๙๐[QปYฐ`\\\`hh ๘๘๘`ํฺต^l๏1cฦฅu็nรยฦ๙jE^ :t(ส—/ดm๗_ž>ำาา0|๘p้๓ฯสส อš5ร™3gค6o๒Y๑๊๛.)) …s็ฮลฒeหPตjU่้้มืืงOŸV[ฎ ฟEiii€Š+ชญหฺฺ```๐ฺบ€็#๛๚๚z๗๎-ญcๅส•EZพุขWœ|ธฺบ|}}Eฏ^ฝฤw฿}',X š7o.ˆ… พถฮฐฐ0กฏฏ/ชUซ&z๖์).\(>๙ไ@|๑ลjm๛๕๋'ดตตEEDD„๘๓ฯ…‘‘‘๐๕๕™™™R;{{{QฃF QฑbE1aยฑpแB๑๑ว …B!ฮ;'ตKKKฎฎฎBKKK๔๏฿_,YฒD|๕ีWยืืWฤฦฦ !„8x๐  ผผผ„ททท๘๎ป๏ฤิฉS…กกกจ]ปถZ}ยฦฦFุูู‰1cฦˆ gggกฅฅ%ึฏ_/*Uช$ฆN*ๆฯŸ/*Wฎ,ฬฬฬDjjชดฦ…‡‡‡˜///ัฑcGฑx๑bัฏ_?@Œ;Vj๗ๅ—_ ฅR)n฿พญVหกC‡ฑqใฦทz_899 1n8!<(Vฏ^-๔๔๔Dƒ ค฿ใวฟvปไ222aaa๙ฮห๏ฝ{๗„ญญญฺ{z๙ยฬฬL<\ƒ~ํบamm-พ๚๊+1|๑ัG CCC๑เมฉ]XX˜ฐทท/ฐžW๛twwvvvbึฌYbึฌYยฬฬLTฉRE,\ธP8;;‹oฟVLš4I่๊๊Šภภ@ตๅs฿๗VVVbศ!โ‡~€๘้งŸคv999ขy๓ๆยะะP >\,]บT 2Dhkk‹vํฺๅฉฉVญZขB… bฺดibัขE"66V์ปWMš4‹-‹-C† !!!nณ'Ožˆ%K–ขC‡าk|๖์Y!Dั฿ป๙Yถl™ ‚ƒƒลาฅKล๗฿/๚๖ํ+†*„โ์ูณขkืฎ€๘๎ป๏คu?y๒คะqๆฮ{๙๗ณจฟ;Bันsg@๔์ูS,ZดHt๎Yxxxไ้ณ[ทnBWWWŒ9R,_พ\|๓อ7ขM›6โื_•ฺผษgลซ๏ปkืฎI5;99‰oพ๙Fฬž=[”/_^ฺฺุJฟŸ…-สฬฬถถถขRฅJbถmโๆอ›โิฉS" @8::Šวฟถ.!„ธs็Ž๘๒ห/๑้งŸJ๋๘็ŸŠด|qa`ฃ|?^(•Jq๘๐aฑqใF@ฬŸ?_ญอเมƒ๓|€ !ฤึญ[1}๚tต้มมมBกPˆฟ[š๖๔้ำ<หทhัB|๔ัGฏญ1,,LŸ}๖™4MฅR‰ึญ[ ]]])d9rDkึฌQ[~๗๎yฆ โ๐แราด{๗๎ ===1jิ(iฺไษ“ฑy๓ๆ”ฆ={V(•J๑ฟ/O}}๚๔Q๋ซC‡ยาาRz~้า%@,Xฐ@ญ Aƒ„ฑฑฑดญๆ}ฑ{๗๎<ใ,,tฝNQ๛๗ล่ัฃ…“““4ฯืืW๔๎[!(ฐ้๊๊ช={6ฯถzำภฆงงงN–.]*ˆJ•*ฉงb๘๑€Z๗ท฿~+Mหศศน”Wฏ^-”Jฅ8rไˆฺ๚#""q์ุ1ตš”Jฅ8ผZaร† SSำ<๏๛ืน~๏๗ขพw๓ำฎ];แโโRh›9sๆไูfน g๎ผ๋~wbbb๒uฏ^ฝ๒๔iff๖ฺ๗]q6KKKตฯ ?๘C๙ง4ญ ฟEBq๊ิ)QตjU@zx{{็๙๋œ>}:ฯ็๎๛ฦCข”ฏฉSงยลลaaa4h0t่ะ"-ปs็Nhiiๅi?jิ(!ฐkื.iฺหปคSRR๐เมเ๊ีซHII)า๚^พB.๗0Affฆtุpใฦ033Cณfอ๐เม้แํํ ccc|'''˜››ซขศีฟhiiๅ™็ฮC@@ ต๙5‚โตWวฦฦโฺตk>|8ฬออีๆๅnฃทo#..ฝz๕Bนrๅค๙๎๎๎hึฌv๎™ง฿๐๐pต็ 4ภร‡‘šš จ^ฝ:<==ฑaรฉMNN6mฺ„6mฺH๊M฿ŽŽŽhัขEกc.)บuร฿ำงOKพษแะ\M›6EีชUฅ็๎๎๎055อ๓^|Mš4Q;”•๛์ิฉLLL๒Lu]ฺฺฺ0`€๔\WW ภฝ{๗เลkUซV-ิฌYSํตjธ1ไyญเ์์ฌ6อุ้้้ทo฿[๕eo๓}ตžWํ๐›สoœ…y๏N๎!ีAƒฉต๛์ณฯ๒๔ennŽSงNแึญ[ฎฏจŸ…้าฅ‹ฺgPAŸŸฑฐฐ€งง'ฦ‡ญ[ทb๎นHJJBHHH™;ท‘๒ฅซซ‹Ÿืฎ]CZZVฌXQไ๓nฎ_ฟตkจUซ–4?ืฑcวะดiS้ *`ย„ PคภฆT*๑ัGฉMซ^ฝ:H็z\นr)))ฐฒฒB… ิOž<มฝ{๗ิ–ฏRฅJž๕XXXจื๔ฯ?๙Qฏ๖—๛แ๓๊yRถถถyถฑ™™์์์๒L{u๙gฯža๒ไษา9ƒๅห—G… œœœ๏vttt,ฐ6mฺภฤฤ{๖์ฉฉiF˜ฟ๙ Nน๏…5jไ™WซV-~~~033ƒBก@hhhพฑฐ“m;u๊„UซVaอš5j{>ไข(ฃK—.?~<6nˆแร‡ใท฿~ƒ™™Zถl)ตyำ๗EQOP.)บuร’%K`bb‚.]บ@ฉ|๓oe๔ณœœœ7๊ณ8T*0oผ|็ฟ๓{ญฌฌฌ‡={๖`ืฎ]ุตkVฌX๏Xตjีื๔ฎjีช…K—.a๛๖ํุฝ{7~w,^ผ“'O.๒ํ’๔=YœฏI็ฮั Alูฒ{๗๎ลœ9s๐อ7฿`๓ๆอhีชี๗Wwฉ๙๗฿วปwัถm[ต้055ลฑcว0pเภbฉ๓}``ฃ|ลววให/ฟD๏ฝ‡~๚!!!A๚_2P๐ปฝฝ="##‘––ฆถ—-๗*7{{{ภŸ‰ŒŒ lถMํQฏ(ŒJฅยีซWฅiภๅห—@:LSตjUDFFข~๚ล๖Gทjีช8w๎\ฑ๔U6mฺ„ฐฐ0|๛ํทาด็ฯŸฟี 7็ฬ™mmm 4&&&ou่ €t่ํนshฺดiพmr฿ ๙)11ๅห—ฯณ๗ฅ(QปvmlุฐC† มๆอ›ัพ}{ตื๛โMฎ๘|บuรไษ“q๛๖mฌ^ฝบฤึcaa‘๏๛ๆM๎Y๕&nบ…๔๔tตื9ฟ฿แณgฯขI“&๏ดฝuuuัฆMดiำ*• ƒ ยาฅK๑ล_ไป (sxท๗ฎ‘‘บt้‚.]บ 33;vฤŒ30~x่๋๋ฟท๗V.{{{จT*\ปv ีชU“ฆฟzU{.kkk 4ƒ ยฝ{๗๐๑วcฦŒลุŠข ํ”{e๛ซูB ''ููู๏ผŽ๗‰‡D)ฌฌ,๔๊ี 666๘๛๏ฑrๅJฝ{#FŒPk—๛a๔๊‡{PPrrrฐpแBต้฿}๗ …๔หœ๛?ง—ง”’’๒ฦปฉ_^ .„ŽŽš4iเลsrr๐ีW_ๅY6;;๛ญBMงNp๖์Ylูฒ%ฯผท๗.ดดด๒ฌwม‚๎)ŒBกภฒeหŒฐฐ0lถMm~Q/ี๘ใแ่่ˆ๙๓็็ูฦนตZ[[รำำซVญRks๎9์ปAAAo\ฎ.]บเไษ“๘๙็Ÿ๑เมตรก@๑ฝ/ŒŒŒห่ซVญŠ๙๓็cๆฬ™จ]ปv‰ฎ'%%๑๑๑าดทo็๛^/ูููXบtฉ๔<33K—.E… เํํ เลk๕฿แวฬณณgฯŠt/ม‡ช=W*•pww€<ทy™กก!€ผŸs๏๚}ต]]]8;;Cฌฌ,ฦ–”s4/^ฌ6}ม‚jฯsrr๒œjaeeตm๙ฆทz[mงศฏ_ฟ^m๚ถmžž//ฏw^ว๛ฤ=l”ว๔้ำ‡๛๗รฤฤ๎๎๎˜|ธด็ฅy๓ๆาx €'Ožเว„••n฿พ]คZ๕๕๕ฑ{๗n„……กN:ุตkv์ุ &H‡ด0`ภฬœ9qqqhผ9tttpๅสlธ฿ฝฺฝนŠbฬ˜1ุดiBBBะงOx{{ใัฃGุถm"""เแแ๑FฝซO>๙ซWฏ†™™œqโฤ DFFยาา๒ญ๚S*•๘๕ื_ัพ}{t๎;w๎”ฮ™๚๋ฏฟˆ)Sฆz2ฑRฉฤ’%KะฆMxzzขw๏ฐถถFbb"ฮŸ?/rŸ3gZตj???๔ํฯž=ร‚ `ff๖N'+w๎ฃGฦ่ัฃQฎ\น<{๙Š๋}แํํศศHฬ›7666pttTปHไU๙'ฮž= เลŽโใใ1}๚t@ถmฅ‘Ÿaร†e่๏$44Ÿ9:t่€กC‡โ้ำงXฒd ชWฏž๏,๏สฦฦ฿|๓ ’’’PฝzulุฐqqqXถlttt={๖ฤoฟ†๐๐pC† •+WบบบยึึV„……I๗ดสฝคๅ๛~ ๑—ซฟ|yx@@@พ—๘T^น•รใวE๏ฝE๙๒ๅ…ฑฑฑhัข…HLL๖๖๖jทศฝญว้ำง๓๔๙๊}ุ„xqป€€all,ZไM.ีBˆฃGŠfอš add$๓r#22Rิฏ__SSSัฆMqแย…ืึ๗๒˜๒{ฟิฏ__๚๕+ฐพwy_๑โ๖+ 6ภko๑‘{;š/ฟ' ๏ซ^}/ผiปW฿#Bผธžซซซะีี5jิฟ๚kท๕xตฯ๗๗œ9sิฆ็๗๛๛พŽŽ~~~B___ุ็{ฦฬฬL๑อ7฿กงง',,,„ททท˜6mšHIIyํ87mฺ$š7o.ฌฌฌ„ฎฎฎจRฅŠ0`@‘n๏p๘qแํํ-tuu๓ผ๗‹๒อฯาฅKEร† …ฅฅฅะำำUซVcฦŒQ‹B|๕ีWขrๅสBฉTชฝฯ {_ญ๑M~wาำำลเมƒEนrๅ„ฑฑฑh฿พฝtซœ{6fddˆ1cฦ้๗ฺรรC,^ผXญโธญวซ๏ฃฦWุ฿ขG‰#Fˆ๊ีซ ===Qพ|y*ฎ^ฝ๚ฺš^๕วgggกญญ]*ท๘PQ วoˆˆˆจLˆ‹‹ƒ——~๕Wt๏ฝดห๙`๑6"""€|ฟ#w๙P*•hุฐa)TDนxxqต˜˜B[[[บสงŸ~š็๖)š 33=*ด™™Yฉ฿ึxH”ˆˆˆ๛๖ํรดiำpแยžจจ(ฺfลŠ่ีซื๛)จ lDDD๔Az๘ฑ๔hqqqตต๕{ชจ` lDDDD2ว‹ˆˆˆˆdށˆภอ›7กฏฏฦ_ภ-gQQQP(ˆŠŠz็พ5jWWืw/J๊ึญ‹ฑcว–vDo„ˆŠอส•+กP( P(p๔่ั<๓…ฐณณƒBกภ'Ÿ|ข6/wน‡‘‘œ1}๚t<}๚4฿๕%$$@กPเฏฟz็ฺฟ๒KิฉS๕๋ื็พจhพ๚klบ5ฯ๔ใวc๊ิฉ%๖5@Ÿ9-Z„;w๎”HD%ˆŠพพ>ึฎ]›g๚กC‡๐๏ฟช} ๛หš5k†ีซWc๕๊ี๘๖oแๅๅ…/พ๘aaa๙ถ฿ฑcฌฌฌเ๋๋๛N๕ฟซVญBxx๘;๕#7 6ฤณgฯd{ฌยดiำJ,ฐตkืฆฆฆyพ3“Hฮ4๏]"*uAAAุธq#~๘แต[ฌ]ป~t๕๊ีัฃG้yxx8233ฑy๓f<๚๚๚jํw๎‰VญZI฿q๘ถ~๕WhkkฃM›6๏ิOqJOO็๏ŒT*•yถู‡์้ำง044„RฉDpp0~๙ๅL›6ํ฿?D๏๗ฐQฑฺ๋ต+>|ˆ}๛๖Iำ233ฑiำ&t๋ึํ๚ชTฉ Ež{@%''ใ๘๑ใhบต4m๚๕๐๖๖†‰‰ LMMแๆๆ†๏ฟตุ๋บu+๊ิฉcccต้น็mลวว# †††prrยฆM›ผุcXงN FˆŒŒฬำwll,ZตjSSSฃI“&8y๒คZ›Cษ‡ย Aƒ`ee[[[iฎ]ปะ Aมฤฤญ[ทฦ๙๓็_;ฎฮaปrๅ :u๊„J•*A__ถถถ EJJสk๛€˜˜ิซWpttDDDDž6˜2e œœœ งง;;;Œ;R…B๔๔tฌZตJ: ซW/L:cฦŒ8::J๓’’’คe๕Wx{{รภภๅส•Chh(nผฉVC๎kƒ† ยะะ&Lๆ7kึ ืฏ_G\\\‘ฦMTฺุˆจุ988ภฯฯ๋ึญ“ฆํฺต ))) -pน็ฯŸใมƒx๐เฎ_ฟŽตkืbีชU่ึญ[žภถgฯ( 4oภ‹~vํฺ๘ๆ›o0kึ,4jิ่ตdeeแ๔้ำ๘๘ใ๓๘๑c|๒ษ'จSงfฯž ===„††bร†  EPPfอš…๔๔t#--MZ๖๙๓hะ ฮž=‹ฑcวโ‹/พภตkืะจQ#œ:u*ฯบ „ .`๒ไษ7n`๕๊ีhบ5Œ๑อ7฿เ‹/พภ… เ๏๏ฏbŠ"33-Zดภษ“'๑ูgŸaัขE๘๔ำOq๕๊ี"~|๘1‚‚‚เํํูณgรึึฤฯ?,ตQฉThถ-ๆฮ‹6mฺ`ม‚h฿พ=พ๛๎;t้าEjทz๕j่้้กAƒาa๐ cวŽฺ่ต+เป๏พ“ๆUจP0cฦ ๏Cตjี0o< >๛๗๏Gร† ๓Œแแร‡hีช<==1|ตคz{{€F]dB๎ฝ~ี<iด+Vโ๔้ำbแย…ยฤฤD<}๚T!DHHˆ Baoo/Zทnญถ,€|ํทฯŸ?ฯณฎž={Š€€้๙ฐaร„ฉฉฉศฮฮ~ฃš๛o@,Xฐ ฯผ€€@ฌ]ปVš–˜˜(ฅR)Nž<)M฿ณg VฌX!Mk฿พฝะีี๓4ํึญ[ยฤฤD4lุPš–ปี๊OKKๆๆๆขjuนsG˜™™ๅ™ชƒ โเมƒB!bccฑqใฦย7J>rทลท฿~+MหศศžžžยสสJdff !„XฝzตP*•โศ‘#jหGDDโุฑcา4###–g]sๆฬฤตkืิฆ'%% ---1cฦ ต้ B[[[mznฝŽIWWW 8๐ตc'’๎a#ขันsg<{๖ ทoGZZถo฿ฺรกํฺตรพ}๛ฐo฿>๑ว?~’ฺY[[ฃ[ทn8z๔(RSSีึีฟhiiIฯ๗ํ‡ไไdtํฺUฺ๓๘เมhiiกN:8x๐เีฬฬ ภ‹ฝ“]y[mmm 0@zฎซซ‹เฝ{าโ7nˆZตjกfอšj57nธๆ—mผ*• ;wV๋ปRฅJจVญZžพ๕๔๔ะปw๏๛ณฐฐ(๐|J"นแEDT"*Tจ€ฆM›bํฺตx๚๔)rrr\่2ถถถhฺดฉ๔ผmถฐดดฤ่ัฃฑ}๛v้ข€ำงOใ๛jmะ A๘ํท฿ะชU+Tฎ\อ›7G็ฮัฒeห"ี+ ๘า[[<'ฅ›™™ๅ๙"์0๔๘๑c/ฎ<}๚๔)jิจ‘งฯZตjAฅRแๆอ›pqq‘ฆ;::ชตปrๅ Ha็Uฆฆฆ… )GGGŒ9๓ๆอรš5kะ Aดm=z๔๊/ŒMž !ชWฏHJJBบuqๅส\ผxQ:„๙ช{๗๎ฝQอ/ปrๅ „จVญZพ๓uttิžWฎ\บบบ๖'„เTf0ฐQ‰้ึญ๚๗๏;w๎ UซV077ใ>š4i8|๘ฐุv๎ 8;;Kํฌฌฌ‡={๖`ืฎ]ุตkVฌX๏XตjU[ZZ๘ ๕ช—๗xezAมฏ( ิžซT*/ฮ๗ชTฉRž๖o๓e฿~๛-z๕๊…?๘{๗๎ละกC1sๆLœ>>^Z#22๓ๆอƒ QงN)Mœ8กกกะััA›6mPตjULŸ>ใวGRRฺทo\ปv [ถlมงŸ~ŠัฃGi[์ทUชT——W‘ทQฉ*ฝ T‰Hำผ|[ยๅถZZZยึึV|๚้งโ๎ปRปเเ`”งฯM›6‰ๆอ› +++กซซ+ชTฉ"  n฿พฺบ๏ฝ+ดตตล๊ีซีฆ—"ีŸ;†มƒซM;sๆŒhัข…066†††"00P?~\ญอ๋ถมƒE‹-„™™™ะืืUซVฝz๕ััั…Ž๋ีz\ฝzU๔้ำGTญZU่๋๋‹rๅส‰ภภ@Yh?BถˆŽŽ~~~B___ุ‹… ๆi›™™)พ๙ๆแโโ"๔๔๔„………๐๖๖ำฆM)))RปฤฤDัฐaCa`` จโใซฏพ•+WJฅ2ฯ->~wแ๏๏/ŒŒŒ„‘‘‘จYณฆ-pฝ_|๑jิจๆอ›ใแร‡า๔;v nบ๐๔๔Dxx8T*Uพใ|URR&L˜€š5kโ๒ๅห<Bdgg###™™™PฉTฐดดดo฿มมมˆŒŒ„ขH,##ฉฉฉj"""าL๏ุโใใฑhั";v gฯžลฐaร0o<„……มฤฤDญmDD"""ััั่ืฏ ~๚8~8RSSกซซ‹ใวbbbเํํ-ญg๛๖ํXปvญิ_:uะถm[,Zดqqqะำำร˜1cฐm6œ9sตkืฦโล‹๓ญ๛ฏฟยพ}๛p๎9ฌXฑ'Ož่ะก๚๕๋‡jีชๅi '''˜™™ภ“'Oฐaร,_พFFFXฝz5*VฌX`ํzzzR˜%"""อ๖ฮ‡D7nŒ๕๋ืK็P๙๙๙แ๖ํHJJยัฃGแๅๅUhXหๅ์์Œตkืขvํฺจ_ฟ>ๆฯŸ๚๕๋ฟv9คฅฅjึฌ‰kืฎ!!!žž^เค๕๊ีร–-[••…[ทnแศ‘#€บu๋b๘๗฿>ฤฟ›gœ=ธบบb๑โลˆEตjีะญ[7"))Im}ถถถ8qโ„t‘#GPฝzuภ่ัฃแ๎๎ŽฤฤDฌ^ฝ‘‘‘ )‘‹6ˆˆˆจ์y็ภๆ๊๊Š!C† ^ฝz๐๐๐(pOP๐9lภ‹รข*T€๊ืฏ๛Om[ABCC1eสxzz"##kืฎExx8<<<เ็็W``ซ]ป6š4iWWW๔๎[:jee…E‹ก]ปvpwwG๓ๆอq๏ฝืŽำศศ๚๕ร้ำง1w๎\hkซ๏ผ๔๓๓Cใฦแ้้ OOO4nXZgำฆM‘˜˜ˆ9sๆศ๊jW"""’…(๊e‰$kฉฉฉ033ƒ๗ค? า5.ํrJœฎR`ผ๋ฬ?ฆ""""™+ฑ็สI:u‘‘ก6ํฏฟ‚ฎฎn)UDDDDTtD`;u๊Ti—@DDD๔ึxH”ˆˆˆHๆุˆˆˆˆdށˆˆˆHๆุˆˆˆˆdށˆˆˆHๆุˆˆˆˆdށˆˆˆHๆุˆˆˆˆd๎ƒธq๎‡dฯ๐๚ฐดด,ํ2J\๎wท๐ญพปญฌแx5วซู8^*รFDDD$s lDDDD2วภFDDD$s<‡MรL}ฺ†๗JปŒง…4Vฃท_BดJปœว๑j6ŽWณqผeวยตJป„q‘ฬ1ฐษ‘ฬ1ฐษ‘ฬ1ฐษ‘ฬ1ฐษ‘ฬ1ฐษ‘ฬ1ฐษœFถเเ`ิญ[๗ตํขฃฃ1n8@TTขฃฃKฌฆ   dffๆฯŸ8;;c์ุฑ%ถN"""า,ฺฅ]@qูทoดดดŠิึวว>>>^ถJ•*Iฯ‹CVV233add„;w=z„… โ๙๓ะึึFบu‘777<~ลถ~"""า,er?777xxx`ส”)ศสสยื_I“&i๙จจ(„††โๆอ›ˆˆˆภŒ3เ้้‰K—.แ๔้ำ๐๑๑››ˆœœภ”)Sเ๋๋ WWWL˜0!฿~“’’0aยิฌY—/_888เ๙๓็B ;;ศฬฬ„Jฅ‚ฅฅ% }๛๖Fdd$„ลฐ…ˆˆˆH“”นภE‹แุฑc8{๖,† †y๓ๆ!,, &&&jm#""เลaะ~๚ฉอทณณCxx8&Nœˆธธ8ิจQฝ{๗ฦาฅK‘€Gaบu€aร†แ๔้ำˆG||<ฮž= ศษษมถm„Ž;ขrๅส8sๆ ผผผิึeii‰‘#Gยฮฮึึึ่ิฉlllผ ภาฅKแ๊๊Šนs็โมƒ…n‡ŒŒ คฆฆช=ˆˆˆH3•นCขน{วLMMฯž=รฝ{‰๋ืฏซต —~๖๑๑ม๒ๅห ํ;99*• €๎ปcืฎ]่ัฃ๖๏฿ูณg###w๏ล… เแแ๖ํใ๙๓๘ๅ—_เ๏๏_`฿?ฦž={pใฦ (•J4iาํฺตƒ‹‹  š5k†fอšแ๛1blmmq๕๊U)ิฝjๆฬ™˜6mZ‘ถ•menซโโโpแย8::ย฿฿ฑฑฑhถmฑฎใ๙๓็9r$v์ุ๘๘x„„„ ##ภ‹เิฒeK๔้ำŸ9ฎ\น’o‘‘‘prr‚™™LLLˆ˜˜i“'O๐ำO?กmถธs็Vฏ^Š+Xำ๘๑ใ‘’’"=nผYฌc&"""๙(sญqใฦXฟ~ฝtะฯฯทo฿FRRŽ= ///lถญศ™˜˜ -- `nn---้p็บu๋เ๏๏็ฯŸCฉTยยย=ยŸ)-๏๊๊Šล‹#66ีชUCทnˆคค$ต๕ฺฺุโฤ‰า9lGŽA๕๊ีฃG†ปป;ฑz๕jDFF"$$คะ‹(๔๔๔`jjช๖ """อTๆ›ซซ+† ‚z๕๊มรร?๐Cm_wดiำซWฏ†——.]บ„Ÿ}๛๖…››ฬฬฬ ssstํฺตjีBวŽแ็็—ง###๔๋ืงOŸฦนsกญญ~ดูฯฯ7†งง'<==ัธqc้$M›6Ebb"ๆฬ™''งwู๎a#"""’96""""™c`#"""’96""""™c`#"""’96""""™c`#"""’96""""™c`#"""’96""""™c`#"""’96""""™c`#"""’9lมมมจ[ท๎[/…่่่bฌH]PP233๓็ฯ‡‹‹ œ1v์ุ['iŽ2ุ๖ํ--ญw๊ฃ$[VVาำำ;w๎„ฎฎ.=z„… โฬ™3HHHภมƒ‘x๘qฑฎŸˆˆˆ4G™ l?๘#เแแ)Sฆ ++ _5&MšTคๅืฏ_เเ`@LL |}}q๓ๆMDDD`ฦŒ๐๔๔ฤฅK—p๚๔i๘๘๘ภออ DNN`ส”)๐๕๕…ซซ+&L˜๏:’’’0aยิฌY—/_888เ๙๓็B ;;ศฬฬ„Jฅ‚ฅฅ% }๛๖Fdd$„ฏKFFRSSีDDDค™สL`‹วขE‹p์ุ1œ={ร† รผy๓ตถˆˆˆDGGฃ_ฟ~€ะะPdeeaบu0`–-[;;;„‡‡cโฤ‰ˆ‹‹C5ะปwo,]บ x๔่ึญ[6lNŸ>๘๘xฤววใ์ูณ€œœlถ AAAุ่ฑ#*WฎŒ3gฮภหหKญ.KKKŒ9vvvฐถถFงN`ccเล^พ`้าฅpuuลนs๑เมƒทวฬ™3aff&=์์์ŠgC‘์h—vE…ะะP˜ššž={†ฝ{๗"22ืฏ_Wk.์ใใƒๅห—Kฯ#""เ์์Œๆ Tœœ •Jooo@๗๎ฑkื.๔่ั๛๗๏ว์ูณ‘‘‘ปw๏โย… ๐๐๐@๛๖ํqy๒ห/๐๗๗/p ?ฦž={pใฦ (•J4iาํฺตƒ‹‹  š5k†fอšแ๛1blmmq๕๊U)ิฝl๘๑9rค๔<55•กˆˆHC•™=lฏŠ‹‹ร… เ่่ฤฦฦขmถฏ].)) zzzธ}๛๖ญ๏๙๓็9r$v์ุ๘๘x„„„ ##ภ‹ฝ]-[ถDŸ>}๐๙็Ÿใส•+๙๖ '''˜™™มฤฤˆ‰‰‘ๆ?y๒?๔ฺถm‹;w๎`๕๊ีจXฑbพ}้้้มิิTํADDDšฉฬถฦc๚๕านZ~~~ธ}๛6’’’p๔่Qxyyaถm…๖‘‘‘"227oฤฝ{&&&HKK˜››CKKK:นn:๘๛๛ใ๙๓็P*•ฐฐฐภฃG๐็ŸJบบบb๑โลˆEตjีะญ[7"))Imถถถ8qโ„t‘#GPฝzuภ่ัฃแ๎๎ŽฤฤDฌ^ฝ‘‘‘ y็ *ˆˆˆจ์+3อีีC† Aฝz๕เแแ~๘กภถร๖ๅ—_ขC‡puuลฒeห0bฤT lDDDD2วภFDDD$s lDDDD2วภFDDD$s lDDDD2วภFDDD$s lDDDD2วภFDDD$s lDDDD2วภFDDD$sฺฏoBeIสฐดด,ํ2J‹๏n‹Gm? ๏ชใx5วซู>ด๑Rษเ6""""™c`#"""’96""""™ใ9l&&)&ตJปŒงสษu5J-อsผšใีloู็็d^ฺ%p‘1ฐษ‘ฬ1ฐษ‘ฬ1ฐษ‘ฬ1ฐษ‘ฬ1ฐษ‘ฬ1ฐษ‘ฬ•J` Fบu_.)) ›6m*ถ๕N:ลึ_Qlถ ?๐เๆอ›€——jืฎ๘๘๘๗Z •M๏=ฐํทZZZEj[ํ]ไไไผQ๛วฺถm‹กC‡พ๖[๔่ัฑฑฑ˜8q"ฆM›HIIขx &"""Qขํว„››<<<0eสdeeแ๋ฏฟฦคI“Šดฤ‰ฑgฯxzzbอš5ธ>Zตj777ดhัw๏-pูฤฤDภรรu๊ิAFF &&จZต*๖๎ ๘็Ÿเ๏๏?~~~ธx๑"`ๅส•F@@z๖์‰ƒยออ žžžจ_ฟ~žufggc๓ๆอhผ9† "๕1n8ฉMjjช๔ฏตต5เศ‘#จUซfอš…{๗๎iddd 55UํADDDšIปค:ŽวขE‹p์ุ1˜ššโัฃG˜7oยยย`bbขึ6๗0exx8ขฃฃๅห—cฦŒˆˆˆภ๚๕๋ƒ Bณfอ0rไH,^ผ'Nฤ๒ๅห๓]ฯž=1{๖l"%%:::€๋ืฏใะกCˆ‹‹ระกCัผysX[[cะำำร_… &`ห–-า8bbb`bb‚6mฺเ‡~๚ฬu๓ๆM๘ใXฟ~=๑ๅ—_ๆ{ศwธqhฺด)ๆฯŸ…BำงO>๙ไ๘๚๚bลŠhิจŽFธ}gฮœ)ํก#"""อVb{ุขขข SSSภณgฯฐw๏^„……ๅiŽ๐๐p€O!์๘๑ใ่ัฃ G8v์XพํRSS‘––†ภภ@€™™”สCmบ5ดดดเๅๅ…คค$/๖V๕๎ฎฎฎ่฿ฟ?.\ธ ๕ีฒeK)`ึซWcวŽลย… ฅ=v๕๑๔้SDGGใ็Ÿ.๐ผตkืbฤˆธy๓&fฮœ‰แร‡K๓*Vฌˆqใฦแ๙๓่ฝ;BBB๐ูgŸๅŒ?)))าใๆอ›ถ%""ขฒํฝร‡ .ภััˆEถm฿ื๊%zzzฅR)—6|ิจQ ุฟฟฦภะะP๚y๘๑๘๑ว๑๘๑cิฉS>„ปป;–-[†ฃGขSงN๘ํท฿™™™๏บ๚้'t์ุะฑcGœ:uJm~ll,ŒQฃFกo฿พ5jTกใ055U{‘f*ฑภึธqcฌ_ฟ^:ทสฯฯทo฿FRRŽ= ///lถญะ>LLL––&=ฏWฏ6lุเล*|—355…™™<เลI*•ชภ๕คฆฆขRฅJP(Xนreํฎ^ฝ OOO|๑ลpppภอ›7กฏฏ>}๚เไษ“˜3g8€š5kโoฟอณผญญ-ขขข๛๗๏G๕๊ีgฮœฏฏ/F…€€œ;wณfอ‚ƒƒCa›‡ˆˆˆ>%ุ\]]1dศิซWาญ-๒!ว~๚๑์ู3้ขƒฉSงb็ฮpwwวๆอ›1}๚๔๛ๅ—_0eสxxx eห–ศสส*ฐmxx8.\OOOต€๘ชy๓ๆมลล๎๎๎จYณ&<<<ิๆ{zz"""๑๑๑๐๔๔ฬณœ9s0kึ,xxx`ฦŒ˜7o€{๑ึฌYƒ K—.ะีี-ฐ"""๚๐(๏'กRSSaff†=ัWabfQฺๅ”8UN6$C๙š๕กิ*ฑkgdƒใีlฏfใxห>?'๓็eeea็ฮ ’.p|นฟSRR =ฝ‰฿t@DDD$se>ฐอ˜1žžžjนl—ˆˆˆจ8”๙}•'Nฤฤ‰Kป """ขSๆ๗ฐi:6""""™c`#"""’96""""™c`#"""’96""""™c`#"""’96""""™+๓7ฮ%uฆฐด4/ํ2J\VVv&ต?2{ซ๏n+k8^อฦ๑j6Ž—Š๗ฐษ‘ฬ1ฐษฯaำ0๗ยk S‘Yฺe”ธm} หธVZูฯKปœว๑jถmผๅื<,ํˆส๎a#"""’96""""™c`#"""’96""""™c`#"""’96""""™c`#"""’96""""™c`#"""’96""""™c`#"""’96""""™c`#"""’น lษษษXพ|y๓+Uช๔ฺ>Vฎ\‰[MEYgq Bff&`๙pqqณณ3ฦŽ๛k!""ขฒฉิ[Qw`{999En›••…๔๔tภฮ;กซซ‹Gaแย…8sๆ p๐เA$$$?~\"5‘f(ถภv๋ึ-ิฏ_žžžpwwวจQฃOOOฬ™3้้้่ะกœฺถlู‚่่ht่ะ 4ฌXฑฎฎฎpuuลฒeห ]~ฺดipuu…ปป;–.]*M6l\\\ะฎ];)„M™2พพพpuuล„ คถ?~<<==q๔่Q๔่ั...pssรฺตk๓ฌ3)) &L@อš5q๙๒eฉ็ฯŸC์์lddd 33*• –––€๖ํ#88‘‘‘Bผv@FFRSSีDDDค™Š-ฐญ[ทM›6E\\bbb0}๚tธนน!..cฦŒมขE‹เ่่ˆ . UซVธ{๗ฎดฌงงง๔sฟ~ค ๆใใƒ-[ถเศ‘#๘๗฿1cฦ =z'Nœภผy๓”””o-ทoวฑcวpๆฬฤวว#$$p๗๎]t๊ิ ็ฯŸ‡JฅยผqงOŸF||<โใใq๖์Yฉ/ฤลลมุุ7oฤ๙๓็‘€ึญ[xฑ็mถm BวŽQนreœ9s^^^j5YZZbไศ‘ฐณณƒตต5:u๊@TT €ฅK—ยีีs็ฮ}ํžล™3gยฬฬLzุููํ…"""ข2Gปธ:๒๕๕Eฏ^ฝ T*CCCต๙ว—๖^ตkืNm~\\œ๔sA‡Qฃฃฃัผys˜››xqnุฉSงเเเงํะงO่๊๊ส•+077Gร† ^^^Rเฟ?fฯžŒŒ ฝ{.\€‡‡Ha๏ฃ>ย7๐ูgŸก}๛๖hาค €{วฮŸ?_~๙nŸวcฯž=ธqใ”J%š4i‚vํฺมลล …อš5Cณfอp}Œ1ถถถธz๕ช๊^5~xŒ9RzžššสะFDDคกŠm[ร† q๘๐aXYYกSงNุฟž6 …ขธV๗V๔๔๔คŸ•J%rrr๐๙sŒ9;v์๖ฦeddHํrƒฅ……โใใแ๏๏oพ๙SงN๐bOWห–-ังO|๙็ธrๅJพ๋ŽŒŒ„““ฬฬฬ`bb‚ภภ@ฤฤฤH๓Ÿnnnˆ‹‹ร˜1cฐhั"8::โย… hีช๎ฝ+-๋้้)ฏ_?)จ๙๘๘`ห–-8rไ๗_ฬ˜1Gล‰'0o<$%%ๅ[หฒeห0dศฤลลแุฑc066ฦŒ3ะขE ฤลลก{๗๎€๙‡–BเหŒƒ=z ""0|๘pL:gฯž…ถถzฮฝt้FŒWWWœ9s?๘#พ๚๋<ฮš5 #FŒ€ญญ-6mฺ„!C†ˆ?๘ทo฿†๚๗๏˜˜˜Bท๙ฬ™3aff&=์์์ mODDDeWฑ6___ฌ^ฝำฆMร•+W``` 6๘๑ใ ดkื†††าผธธ8้็ๅห—รวว'Oัััhผ9ฬออabb‚   œ:u*฿Z0gฮฬž=๗๏฿ฯฎrตo฿:::๙ฮkถ-ภหหK †gฯžล'Ÿ|่าฅ‹ิ๖๗฿‡ซซ+ฌญญq๎9|๗pqqษท฿ล‹ใ็Ÿฦฟ‹ฮ;cฺดiา<LŸ>.\@๚๕ัฐaร|รdฎ๑ใว#%%EzผyณภถDDDTถK`kุฐ!> +++t๊ิ ๛๗๏ฯำFกPวช^ซ[ทn๘ใ? ญญภภ@\ผx1฿v/‡ฦW้้้”J%rrrBˆ|6kึ s็ฮลš5kะตkW์น*•*฿ถ›6mBำฆM;vฬ:9‚ฝ{ใ›oพม„ ะฃGBk455U{‘f*–ภv๚uX[[cเภ Err2าาาค๙๕๊ีร† ทoวำงO_ง‰‰‰ิ‡ฏฏ/๖๏฿ิิT>>่ีซz๖์‰ *เศ‘#๘๓ฯQฏ^=ภˆ#เเเo-๋ืฏวฏฟ 899กeห–ะาายณgฯค‹ฦw฿}‡๎ปcย„ จWฏ^พ{ด6lˆ† โแร‡๙๎ู[ฒd ๚๔้!*Tจ€_~๙`ii‰ปwรึึ๖ญj#"""อฆ๋#5OŸ>… ฆOŸŽ์์lL:ตดห’คฆฆยฬฬ ๗พnKฝษj’,….v4-ฏ‘Y`;ๅศ#๏ฑช’“••…;w"((จภs/5 วซู8^อฦ๑พ™ฟ฿)))…žT,{ุ>งNยˆ#““GGGi๏QI+ณํแร‡hาค‰ฺด๒ๅห#22ฒDึ—{๏5"""ข๗ญฬ6KKK("""๚ ๐ห฿‰ˆˆˆdށˆˆˆHๆุˆˆˆˆdށˆˆˆHๆุˆˆˆˆdށˆˆˆHๆุˆˆˆˆdށˆˆˆHๆส์s)สO7CiiYฺe”8eVฐs'”CvC๙|W}ุธ‡ˆˆˆHๆุˆˆˆˆdއD5Œj๗Dจ ‹ฒ*;,,มjˆˆˆจ8p‘ฬ1ฐษ‘ฬ1ฐษ‘ฬ1ฐษ‘ฬ1ฐษ‘ฬ1ฐษ‘ฬ1ฐษ‘ฬ1ฐhฺดiก๓“““ฑ|๙r้๙๓็ฯัธqcxyyแเมƒoิ˜1cเ๊๊ ggg|๗o_4}0>่ภ&„€JฅBdddกํ^ lฑฑฑ055Ell,๓]ๆ้ำงศฬฬฉธธ8œ>_|๑.\ธ€`๓ๆอ€{๗๎ก}๛๖8w๎์ํํี๚‰ลส•+q๖์YDDD ==3fฬ€››โโโ0fฬ,_พ-Zด@\\,--‘‘‘5kึ aร†‡ฏฏ/.^ผˆŠ+ช๕ํ้้‰€€ุุุภมม&LฅK—ะถm[L:>>>Xบt)ž)ด?"""๚piฬ6""""Mฅฑอมม'Ož,ํ2ˆˆˆˆ™ฦ6""""MมภFDDD$s lDDDD2วภFDDD$s lDDDD2วภFDDD$s lDDDD2วภFDDD$s lDDDD2ง1฿%J/([ฮ€าาฒดห ""ขbฤ=lDDDD2วภFDDD$s lDDDD2วsุ4Œ๊ย๏P™”่:”=Kด"""Rว=lDDDD2วภFDDD$s lDDDD2วภFDDD$s lDDDD2วภFDDD$s lDDDD2วภFDDD$s lDDDD2วภFDDD$s lDDDD2วภFDDD$s lDDDD2Wฌ-99ห—//ฮ.หผ   dffๆฯŸ8;;c์ุฑฅ\•๏-ฐๅไไ็ชŠฌ4ึ›••…๔๔tภฮ;กซซ‹Gaแย…8sๆ p๐เA$$$?~k$""ขฒฃศํึญ[จ_ฟ><==แ๎๎Žใวซ=OLLฤฤ‰‘OOOฬ™3+WฎDpp0ะณgOฝ{ํฺตƒ4h€ห—/"""เ๋๋ www๔๎*• ะจQ#Œ5 ^^^๐๕๕Ett4š4i‚>๚;v์(ฐึฉSงขw๏๐๓๓รุฑcqๅส4kึ hูฒ%๎ฝ pppภ๓็ฯ+WฎฤธqใcฦŒAอš5แแแ9sๆ@}ผ,)) &L@อš5ฅฑๅฎC์์lddd 33*• –––€๖ํ#88‘‘‘B้๕ศศศ@jjชฺƒˆˆˆ4S‘บu๋ะดiSฤลล!&&T{noo3fภออ qqq3f >>ทoวฺตk1bฤL™2ััั˜7oFŽ ่น3NŸ>๘๘xเฯ?”ึkii‰ุุX๘๛๛cศ!ุฑcถnŠ้ำงZ๏?ƒร‡ใoฟลเมƒฑ|๙rฤฤฤ o฿พ๘๊ซฏ \๎แร‡ุดi.\ธ€ณgฯโำO?€๛ศษษมถm„Ž;ขrๅส8sๆ ผผผิ๚ตดดฤศ‘#aggkkkt๊ิ 666€จจ( 0K—.…ซซ+ๆฮ‹:พ™3gยฬฬLzฺุููžˆˆˆส.ํข6๔๕๕Eฏ^ฝ T*‚ จ=wvvฮwน–-[ยฤฤpเภ\ธpAšงฅฅ8{๖,&Mš„ิิT$''รฮฮํฺต|๒ษ'777( ่๋๋รีี7n(ด๖ํCGGiii8v์˜ิ_NNชVญZเrfff066Fฟ~ะพ}{ดnบะ>ฺทo๓็ฯใ—_~ฟฟ>~{๖์ม7 T*ัคIดkื...P(hึฌš5k†๛๗๏cฤˆฐตตลีซWฅP๗ช๑ใวKRSSฺˆˆˆ4T‘[ร† q๘๐a๙็Ÿ่ิฉ.\˜็y~AศะะP๚YกPเฬ™3P*ีw์๕๏฿ปvํBตjี0w๎\}ะกC๔๋ืีชUหำ.22NNN033"&&...€'Ož`ร† Xพ|9ŒŒŒฐz๕jTฌXฑภ๑้้้AOOฏะm@DDDšกศ‡Dฏ_ฟkkk 8กกก8z๔จฺ๓„„˜˜˜ --ญภ>4h ]” Rฉค“๎ำำำQกB<6lxว!ฉ333ƒ……๖๎ เล/^ุ#..*• ทo๐"8ฅคค mถ˜={6โโโ ํรีี‹/Fll,ชUซ†nบ!00IIIjuฺฺุโฤ‰า9lGŽA๕๊ีฃG–ฮ\ฝz5"##"ํ$""ข[‘[TTแๅๅ…#GŽภมมAํy=`ii wwwธปปK'๋ฟlม‚ุตk<<<เ๊๊*]80qโD|๑ว ฬs๎WqXณf ๆฬ™xzzโิฉS€I“&แ๛๊ีซ'zLKKC๋ึญแแแvํฺI็ชิG.###๔๋ืงOŸฦนsกญญพ๓าฯฯ7†งง'<==ัธqcิญ[ะดiS$&&bฮœ9prr*๖๑QูฆEฝ,‘d-55fffธwx),M Jt]Jž%ฺQdeea็ฮ ‚ŽŽNi—Sโ8^อฦ๑j6ŽWณฝ๋xs~งคคภิิดภvฆ""""™+๒Erดgฯ|๙็jำZถl‰Yณf•REDDDDลฏLถ-Z E‹ฅ]Q‰โ!Q""""™c`#"""’96""""™c`#"""’96""""™c`#"""’96""""™c`#"""’น2}ใ\สK้ JKหา.ƒˆˆˆŠ๗ฐษ‘ฬ1ฐษ›†iฑ9ผดK ""ขbฦภFDDD$s lDDDD2วภFDDD$s lDDDD2วภFDDD$s lDDDD2วภFDDD$s lDDDD2วภFDDD$s lDDDD2วภFDDD$s lDDDD2งQ-99ห—//ํ2ิlถ ?๐เๆอ›€——jืฎ๘๘๘RฎŽˆˆˆส‚&ฐๅไไผืZ?~ hถ-† ๘๖oัฃGฤฦฦbโฤ‰˜6m %%Bˆ๗Z•e&ฐบu ๕๋ื‡งง'q๘qต็‰‰‰˜8q"เ้้‰9sๆ`ๅส•F@@z๖์‰ปw๏ข]ปv๐๑๑Aƒ p๙๒e@DD|}}แ๎๎Žฝ{CฅR5j„QฃFมหห พพพˆŽŽF“&M๐ัGaวŽyjฬฮฮฦๆอ›ัผys 2ฐrๅJŒ7Nj“šš*kmm 8rไjีช…Yณfแฝ{%บ‰ˆˆจ์)3mบuhฺด)โโโƒƒช=ทททวŒ3เๆๆ†ธธ8Œ3ํทcํฺต1bฆL™‚่่hฬ›7#GŽt๎งOŸF||< ๐็ŸJ๋ตดดDll,1dศ์ุฑ[ทnล๔้ำฅ67oฤไษ“แ์์Œํทให/ฟฤš5k๒ŒaธqXฑb์์์0qโD|๑ล€O>๙‡๐"$†††"**ชะํ‘‘‘ิิTตi&ํา. จ|}}ัซW/(•J„„„ Aƒjฯ๓]ฎeห–0118p.\ๆiiiฮž=‹I“&!55ษษษฐณณCปvํผSเๆๆ…B}}}ธบบโฦ€ฟ๚ ๕๊ีร๐แร SSำว๛๖ํ‹5kึ`๘๐แXทn bลŠ7n>sl฿พ!!! ล‚ ๒ํkๆฬ™า!U"""าlef[ร† q๘๐aXYYกSงNศสสR{พ|—344”~V(8sๆ โโโค=sะฟฌ\น 6l222คetuuJฅRํ็sโฑlู2=z:uยoฟ†ฬฬฬ|k๙้งŸะฑcG@วŽq๊ิ)ต๙ฑฑฑ8y๒$ๆฬ™ƒ fอš๘๖o๓ดตตต•u๎฿ฟีซWœ9sพพพ5jp๎9ฬš5 ฎWOOฆฆฆj"""าLeๆhTTfฯž ]]]XZZขgฯžpww—žฏ_ฟ–––pww‡ปป;z๖์‰ *จ๕ฑ`ม„‡‡cัขEศสสย๗?ธนนaโฤ‰๘๘ใQฑbExyyฝužžžˆˆˆภ“'O๒์=€9sๆ ˜:u* ๑ำO?xฑpอš5R€#"""zY™ laaa ห3ํUน็„ๅงbลŠุฒeKž้C† ‘ฎ๊|ูห'๗๊ีKm;w \ฑฑ1š4i’g9ww๗|ƒ\อš5 ์‹ˆˆˆจฬ%"""๚P1ฐษ‘ฬ1ฐษ‘ฬ1ฐษ‘ฬ1ฐษ‘ฬ1ฐษ‘ฬ1ฐษ›†ูำ1ขดK ""ขbฦภFDDD$s lDDDD2วภFDDD$s lDDDD2วภFDDD$s lDDDD2วภFDDD$s lDDDD2วภFDDD$s lDDDD2วภFDDD$s lDDDD2วภFDDD$s lDDDD2วภFDDD$sฺฅ]! -- :::ฅ\MษหสสยำงO‘ššส๑j ŽWณqผšใ}3ฉฉฉ๏xAุ4ฤร‡ŽŽŽฅ\ ฝฉดด4˜™™8ŸMC”+WpใฦB_๐—๙๚๚โ๔้ำE^‡œฺงฆฆยฮฮ7o„ฉฉiฉืSาํ9าญงคsผฅ[OIท็xKทž’nฎใB -- 666….รภฆ!”สง#š™™๙ ฃฅฅUไถrlฆฆฆo)ีร๑o{€ใ-อz8โmpผoาQvด๐ขƒุเมƒหt๛7%ท๚9โ%ท๚9โ%ท๚9โ%ท๚ๅ6^PˆืๅFeBjj*ฬฬฬ’’๒ฦ+(‹8^อฦ๑j6ŽWณqผ%ƒ{ุ4„žžฆL™==ฝา.ๅฝเx5วซู8^อฦ๑– ๎a#"""’9๎a#"""’96""""™c`#"""’96""""™c`ำ‹-‚ƒƒ๔๕๕QงN๕ื_ฅ]า[9|๘0ฺดi( lบUmพ“'O†ตต5 ะดiS\นrEญอฃGะฝ{w˜ššย}๛๖ล“'Oใ(Šnๆฬ™๐๕๕…‰‰ ฌฌฌะพ}{\บtIญอ๓็ฯ1x๐`XZZยุุ:uยปwีฺธqญ[ท†กก!ฌฌฌ0fฬdggฟฯกษ’%Kเ๎๎.\าฯฯปvํ’ๆkาX๓3kึ,( >\šฆIcž:u* …ฺฃfอšา|Mkฎ๛=z๔€ฅฅ% เๆๆ†่่hiพ&}f988ไy} …t?1M{}srr๐ล_ภััจZต*พ๚๊+ต๏๛|๏ฏฏ 2m๚๕BWWW๓ฯโ๙๓ขย\ฝ{ทดK{c;w๎'N›7oฤ–-[ิๆฯš5K˜™™‰ญ[ทŠณgฯŠถm GGG๑์ู3ฉMห–-…‡‡‡8y๒ค8rไˆprr]ปv}ฯ#)š-Zˆ+Vˆs็ฮ‰ธธ8$ชTฉ"ž 6M๓”)S„‡‡Gพ๓4mฌB๑๙็Ÿ ็k๚gึฐaรDีชU…Jฅาศืทu๋ึขOŸ>jำ:v์(บw๏.„(ื—‡DหฐฬฬLฤฤฤ iำฆา4ฅR‰ฆM›โฤ‰ฅXY๑ปvํ๎นฃ6V333ิฉSG๋‰'`nnฉMำฆMกT*q๊ิฉ๗^๓›JII”+Wƒฌฌ,ต1ืฌYUชTQณ››*Vฌ(ตiัขRSSq๙๗X›ษษษม๚๕๋‘žž???๋เมƒับukตฑš๙๚^นr666๘่ฃะฝ{wธq€fŽuถm๐๑๑AHHฌฌฌเๅๅ…QšฏษŸY™™™๘๕ื_ังO( |}๋ีซ‡๛๗ใ๒ๅห€ณgฯโ่ัฃhีช€าy}๙ๅ๏eุƒ““ฃ๖ +VDbbb)UU2๎น๙Ž5w;w`eeฅ6_[[ๅส•“ฺศ•Jฅย๐แรQฟ~}ธบบx1]]]˜››ซต}uฬ๙m“yr“???<ฦฦฦุฒe œงqc€๕๋ืใฬ™38}๚tžyš๖๚ึฉS+WฎD5p๛๖mL›6 4ภนs็4nฌp๕๊U,Yฒ#GŽฤ„ p๚๔i :บบบ ำ่ฯฌญ[ท"99ฝz๕ y๏e7nRSSQณfMhii!''3fฬ@๗๎”ฮ฿$6"่๋๋—v9%.wฯธปปฃN:ฐททวoฟƒRฌฌdจT*๘๘๘เ๋ฏฟxyyแนsˆˆˆ@XXX)WWฒ~๚้'ดjี 666ฅ]J‰๙ํท฿ฐfอฌ]ป...ˆ‹‹ร๐แรaccSjฏ/‰–aๅห—‡––Vž+q๎ฝ‹J•*•RU%#w<…ตRฅJธw๏žฺ์์l๘chkkC[[‡ย?mmmTฌXQใฦ2sssTฏ^ทFพพึึึpvvV›VซV-้0ฐฆ~f]ฟ~‘‘‘่ืฏŸ4M_฿1cฦ`ธq …››z๖์‰#F`ๆฬ™J็๕e`+รtuuแํํ๛๗KำT*๖๏฿??ฟRฌฌ๘9::ขRฅJjcMMMลฉSงคฑ๚๙๙!99111R›@ฅRกN:๏ฝๆืB`ศ!ุฒe 8GGGต๙ะััQ๓ฅK—pใฦ ต1'$$จ}(์ทฆฆฆy˜ศ‘JฅBFF†FŽตI“&HHH@\\œ๔๐๑๑A๗๎ฅŸ5mฬ/{๒ไ ๙็X[[kไ๋[ฟ~<ทแน|๙2์ํํhๆgฌXฑVVVhบต4M_฿งOŸBฉTHZZZPฉTJ้๕}‹‹'HFึฏ_/๔๔๔ฤส•+ล… ฤงŸ~*ฬออีฎฤ)+าาาDllฌˆฤผy๓Dllฌธ~บโล%ิๆๆๆโ?๑๑๑ข]ปv๙^Bํๅๅ%N:%Ž=*ชUซ&หKไ…bเภยฬฬLDEEฉ].๔้SฉMxxธจRฅŠ8pเ€ˆŽŽ~~~ยฯฯOšŸ{ฉ|๓ๆอE\\œุฝ{ทจPก‚,/•7nœ8t่ธvํšˆใฦ …B์ปWกYc-ศหW‰ กYc5j”ˆŠŠืฎ]วŽM›6ๅห—๗๎BhึX…xqซmmm1cฦ qๅสฑfอahh(~๕Wฉฆ}fๅไไˆ*Uชˆฯ?<ฯ}„ฝฝฝะีี*TMš4‘ยšš5ึ‚ผุ4iฬ]บtึึึBWWWTฎ\Yt้าEํždš4ึ\๙งpuuzzzขfอšbูฒej๓5ํ3kฯž=@ž1กyฏojjช6l˜จRฅŠะืื}๔‘˜8qขฺ-H๗๋ซโฅ๖‘์๐6""""™c`#"""’96""""™c`#"""’96""""™c`#"""’96""""™c`#"""’96"ข7”žžggg}๚[๗YฝzuTชT ๙็ป–GคqุˆจLช\น2ถn*=ใ?`mmงฝ{๑ไษธq™™™๘๊ซฏิๆ๏ฝ-[ถ|ฃu๔ำOฺ่ต๋[ี&ฒณณK|r‘;ึฎ]ปb๙๒ๅฅ\ ‘0ฐQ™ิตkWฌYณFz๋ฏฟข{๗๎ถ722Bถmq๑โEต้นํูณgฺ่ต+ส•+‡rๅสกAƒ๙๖sใฦ บu nnnา4ฬ™3ตjี‚‰‰ &OžŒK—.มววfff—ฺชT*L™2vvvฐถถฦะกC‘‘‘Xนr%1`ภ˜™™aลŠx๔่บu๋+++|๔ัGXตjUc|๙๐ๆ๖ํQฃF iฏใ๚๕๋ \๎๘๑ใจ^ฝ:,--1z๔hจT*iขE‹PญZ5”/_aaaHOOGNNZตj…ซWฏยุุฦฦฦXตjึฌYƒฏพ๚ ฦฦฦา˜ะฐaCXXXภัััR฿ … .„ฃฃ# 6ฤ๛?จฐJT$๏๐e๖DDฅย^DEE [[[q๏=q๏=akk+Ž=*์ํํีฺ9rD!DJJŠhำฆ˜2eŠ4?55UTชTIไไไˆ%K–ˆ6mฺˆงOŸŠฌฌ,q๘๐แ|ืฝ}๛vแํํงž€€๑๐แCq๑โEกงง'š5k&nธ!n฿พ-*Vฌ(8 „bูฒeยููYผySTรFDe’––‚ƒƒฑaรlุฐ:u‚––VžvญZต‚นน9,,,p๙๒e 8Pšท~@ฉTBGG>ฤีซWกญญ]เถไไไ|ฯ]:t(ส•+‡š5kยรร-[ถ„*Uช„€€œ={ฐ~zŒ=ถถถฐดดฤไษ“ฑn:ฉŸชUซขWฏ^P*•HIIATTfฮœ ===ิฌYบuรๆอ›_ป}tttp๑โE}Š์์lœ9s.\(t™™™Xปv-RSSกฃฃccใ|ว’kม‚ธ{๗.n฿พ๙๓็ฃs็ฮ€>}๚เ๋ฏฟ–๊ํทฑ{๗n/๖(ฟ_ํึ*VVVHJJ’ž๒ษ'ˆลึญ[‘gฯža๗๎…๎<|๘07n mmํBวH๔กa`#ข2อููนะ๓ณš7occc”/_ฤึญ[กP(๒ฮใ๖ํh฿พ=LMMแ๋๋‹x[฿พ}ีฮ;{}๛๖E‡Pปvm8;;รรรใว/ฐš5k๐๏ฟโฃ>‚••†Žgฯžฝv=ซVญ‚ฝฝ=,,,ฐo฿>,\ธฐภถ;wFƒ เ๊๊Šfอšกw๏^\‰ทo_ดnฆฆฆยbญZตะฎ];ุููมภ‹€w๊ิ)˜››cะ A033รŽ;ฐ`มXYYมมมห–-+ด๎u๋ึกฏั‡F!„ฅ]ั๛ึฒeKŒ75zใeำำำแ๋๋‹ฟ๚Kv7ฯ-หฎ\น‚ž={โฤ‰๙r%๚1ฐัi๖์ู1btttJป"ขืb`#"""’9žรFDDD$s lDDDD2วภFDDD$s lDDDD2วภFDDD$s lDDDD2วภFDDD$s lDDDD2วภFDDD$s๊‡ำฤŸžcgIENDฎB`‚c4core-bm-charconv-xtoa-mega_bytes_per_second-u16.png000066400000000000000000000760251477602032300327170ustar00rootroot00000000000000c4core-0.2.6/doc/img/linux-x86_64-gxx12.1-Release‰PNG  IHDRบ+ž9tEXtSoftwareMatplotlib version3.5.1, https://matplotlib.org/ุa๒ฝ pHYsaaจ?งi{‚IDATxœํwTื฿๐g้HUA N  `/X‰ ฑX[Œ5–D%ึ˜ุฐ"ฦ-ŠŠ k4‚Rk"๖ุ)Šา๖พx˜ื•ชฎ"ฮ๓9g์ฬ;฿น ๐8mB""""’า.€ˆˆˆˆ†?""""a๘#"""’†?""""a๘#"""’†?""""a๘#"""’†?""""a๘#"""’†?*“z๗๎ CCรา.ฃPัััP(ุดiSi—R"“'O†BกภƒJป’‰ ภููนดห๘่( Lž<นดหx'’““กP(Qฺฅ”y ๔F"##?ฺ_0D%5}๚tlบตฤํ/^ŒN:กZตjP(่ปwํ๒ยธ††nธ‘o~ZZ๔๕๕กP(0dศ7ฌžŠ“‘‘ษ“'#::๚ฝฏ๛๘๑ใ˜D… ฐiำ&t๊ิฉะถ?๔:„ฃGขN:jฏๅ}แ‘?’<{๖ pppภณgฯค้=B•*Uเ๋๋‹\๔๎ .๐โ‡1๏•็้ำง9r$ฌญญกซซ {{{ฬž=B•๕ญXฑ5‚……tuuแ่่ˆล‹ฟVอ๛/š7oXZZโ๛๏ฟฯทฅR‰y๓ๆมษษI:D?`ภ<~Xฅญญ-Zทn-P๋้้แ“O>มoฟ–oฝ)))>|8lmmกซซ +++๔์ู3฿5sJฅำฆMƒ••๔๔๔ะธqc\นrEฅMตO @นrๅPฃF ้zมC‡กnบะืื‡ฝฝ=๖ํงฒตkื0hะ ุC__fff่ิฉ’““UฺEDD@กPเะกC4h,,,`eeUุ่^ปv 5jิ€ณณ3๎ฝ เลV/\ธPโkOž<‰ภภ@”/_puuลฯ?ฌาๆภจ_ฟ> `jjŠvํฺแ๙๓*m๒Nƒ^นrฝ{๗†ฉฉ)LLLะงOdddHํœัฐaร|u(•JTญZ;vT™๖:๛ลž={เๅๅ}}},Yฒ …OŸ>ลส•+ฅŸยNใๆฑฑฑQ๙Y)NHHโโโpแยiฺ‡ $$คฤไบu+œกซซ '''์ฝ[ฅ]๏ฝakk›o๙ผ๑/จฯ7ยัั๚๚๚๐๑๑Abb"`ษ’%จQฃ๔๔๔ะ Aƒ|๛cžุุX๘๚๚B__vvvฯื&33“&MB5 ซซ kkk|๛ํทศฬฬ,ฐฆ5kึภษษ บบบา6ฎ_ฟžžž022‚ฑฑ1\\\๒ํ‹/KNN†นน9`ส”)า๗๘ๅห]Jฒ๏f๙prrBนrๅPพ|yxyyaํฺต^Œ๗จQฃvvvาบ๓ฦฐจํ|ตฦ’์/|๕ืจXฑ"ŒŒŒะถm[บu+_Ÿ้้้6l˜๔๛ฯยยM›6ล้ำงฅ6ฏ๓ปยึึถภŸ  Aƒา๛‚ฎ๙หป๛ึญ[h฿พ= annŽoพ๙นนนาrE}/ŒŒPกB…b๋T*•๘๙็Ÿ„:u๊ '''฿–DI๖ญwNฝไฤ‰BSSS >\š,๔๕๕ลล‹…B?~\4mฺTซVญ’^BกT*EฃF„Bก๚๕ ,mฺดฤฐaรTึๅํํ-z๗๎-~๚้'1|ัฌY3@,Xฐ ุ:{๕๊%๔๔๔Dอš5E=ฤ‚ D๋ึญ๑w฿ฉดํืฏŸะาา๛๗แแแb๔่ัยภภ@x{{‹ฌฌ,ฉฐทท•*Uใฦ ,Ÿ~๚ฉP(โ์ูณRป๔๔tแ์์,455Eลโล‹ล? ผฝฝล™3g„B๙ไQฎ\9๑เมฉ]ฏ^ฝ„Mก๕ผฺงซซซฐถถ?๘ฃ๘๑ว…‰‰‰จVญšXฐ`pttsๆฬ&L:::ขaร†*ห็ํ๗bศ!โ—_~๕๊ีฤ๗?ฉ]nnฎhึฌ™(Wฎœ6l˜Xฒd‰2dˆะาาํฺตหWSํฺต…นนน˜2eŠXธpก8sๆŒˆŠŠDใฦลย… ลย… ล!CDงN ณ'Ožˆล‹ "((H๚ววว !Jพ๏d้าฅ€ุ่ฑฃXฒd‰๘๙็Ÿล_|!พ๚k!„๑๑๑ขkืฎ€๘้งŸคu?y๒คศํฬ›๗๒ฯgIv„ขs็ฮ€่ัฃ‡Xธpก่นณpssหืgHHˆะัั#FŒห—/3fฬmฺดซWฏ–ฺผฮ๏ ›D@@€๔๊ีซ€Xฑb…4-๏o“““่ทฏXผxฑ่ะกƒ -Z$„({๙ฒ7 โเมƒ๙ๆ%&& b๊ิฉขBGGG...โภลngžืฉ็]a๘ฃ|ฦŽ+444ฤแร‡ฅ„y๓ๆฉด๙คุ{๕๊%ˆฏพ๚JšฆT*EซVญ„ŽŽŽXŽ9"ˆ5kึจ,ฟ{๗๎|ำmllq๘๐aiฺฝ{๗„ฎฎฎ9rค4mโฤ‰€ุผysพบ”Jฅโ๑ีฎ][dffJ๓๙g@$&&JำฑvํZiฺ… กกก!Nœ8!M฿ณgOพ_~ใ_%ˆ฿~๛Mš–๊ีซ'rrrTฺฟฮŸ?/,--…ทททx๔่‘Jป’BฯษษvvvยฦฦF<~ธภ1Bwwwaaa!>|(M‹ขgฯž๙๊๋ทฏJ_AAAยฬฬLz๑โE@ฬŸ?_ฅ Aƒ„กกก4Voฒ_์ฝ;฿vเŠS’๐w}๑อ7฿ˆ5jH๓ผฝฝEŸ>}„โตยŸŽŽŽสฯ_|||พฑz๐งซซซt–,Y"ˆส•+ซe์ุฑ€Jผ~ฮœ9าดฬฬLiŸศ เซVญโศ‘#*๋ฤฑcวTjาะะ็ฮSi;t่Pallœoฟ/ฮ๛๗ ฿Kบ๏ค]ปvยษษฉศ6ณfอส7fy ฮผy…ฟโ~vbcc Oz๏ฝ๓๕ibbR์~๗>ร๑๗฿ซ,›๗๏ลฝ{฿x[_๖&๛๎ซ๕ผyงNzใ ฺฮข๗ณ“wฺxะ A*ํพ๚๊ซ|}™ššโไษ“ธ}๛vก๋+้๏ u)h๛f฿.ศ“'Oผ8ํฝ~๔๎ฝ{๗ฦพ}๛ „ภฬ™3ีบพw‰แ๒ัััมฏฟŠซWฏ"==+Vฌ(๑uJืฎ]ƒฅฅฅส/~จ]ปถ4?ฯฑcวะคI้zsssŒ7J444๐ษ'ŸจLซUซHืฦ\พ|ฉฉฉฐฐฐ€นนนส๋ษ“'ธw๏žส๒ีชUหทž๒ๅหซ\๖ฯ?”๘๙dฏ๖—ฆ^ฝฎฬสส*฿›˜˜ภฺฺ:฿ดW—๖์&Nœ(]cYฑbE˜››#%%ฅภqดณณ+ด6mฺภศศ{๖์ฑฑq ถฐ`๓9Ny๛‚ฝฝ}พyตkืฦƒ๐๔้S•้%ฯ.]บเุฑcธu๋€ฯ\ผw๏บt้"ตyขจ1{ื<<<เเเ€ตkืbอš5จ\นฒ|^GI๖ํทํ3o,ษ~ –––๙n8*่g๘นs๙พOyํJ๒ฝ4hjีช…–-[ยสส }๛๖อwฝใ๋x“}๗eฃG†กก!๊ิฉƒš5kb๐เม8v์ุkี๐บ๛dq?;ืฎ]ƒ††Fพ~kิจ‘ฏฏ™3gโ์ูณฐถถF:u0y๒dตญืกงง']C—็m๗ํ‚ไ็ัฯฯOeฏVญ๊ีซ‡ใวซu}๏๏๖ฅํูณ๐๙s\พ|Yํ๙็4n˜;w.ฌญญกฃฃƒศศH๔ำOP*•jYRฉ„……ึฌYSเWavDLผrII•ดฟยฺ•d๙ฏพ๚ +Vฌภฐaรเใใ( 8ŽEฅฺกCฌ\นkึฌQ9"๓ก(ษxt้าcวŽลฦ1lุ0๛๏011A‹-ค6ฏป_ผษฝ๊‚ล‹รศศ]บt†ฦ๋ฟฝ$cWุ๒๒.œ/iŸ๊9R*•pqqมนs œjะ,่{eaaธธ8์ูณปvํยฎ]ปฐbล ๔์ู+Wฎ|ํšVํฺตq๑โE์ุฑปw๏ฦE‹aโฤ‰%~„ึ๋๎“๊žt๎๕๋ืว–-[…YณfaฦŒุผy3Zถl๙ฺต฿V๗หJาF,--•*Uส7ฯยยgฮœy/uจรๅ“€๏ฟ}๚๔A\\๚๕๋‡ฤฤD้๏@แ?ฌ666ุทoาำำUŽๅญhcc๘๓ฯ?‘™™‰ํทซ๔ีS8EQ*•๘๗฿ฅ#p้า%NEUฏ^๛๖ํƒŸŸŸฺ€Wฏ^gฯžUK_๊ฐiำ&๔๊ี sๆฬ‘ฆ=;kึ,hiiaะ A022zฃำ‹คำ‹gฯžE“&M l“ท/\ผx1฿ผ . bลŠo๔;;;ิฉS6lภ!Cฐy๓fดo฿บบบ*๕ฉcฟx;w฿FHH&Nœˆ;w๎`ีชU๏l=ๅห—/pฟy๙ˆฝ:พ};฿ใ† ๚ŽGใฦ฿jผuttะฆMดiำJฅƒ ย’%K๐w฿xt (๚๗๐v๛ฎบt้‚.]บ ++ Ÿ9ฆM›†ฑcวBOO๏ฝํ[ylll T*q๕๊UิฌYSš๊ำ ๒TฉRƒ ย Aƒp๏=|๚้ง˜6mฺ…ฟข๖ปWฯ๎ผ)uŒง‹‹ ดตตฅณ /ป}๛vพ4พ๋zO๛’Š์์l๔๎–––๘๙็Ÿปw๏b๘๐แ*ํ๒~ฑฝ๚ˆ\,Xฐ@e๚O?…B!bศ๛Ÿฺห๋LMMลŠ+^ซ—ื#„ภ‚  ญญฦx๑?ิ\๐ร๙–อษษyฃ€ิกCฤววcห–-๙ๆฝ้ยทกฉฉ™oฝ๓็ฯ/๔hMQ –.]ŠŽ;ขWฏ^ุพ}ปส’>พแำO?…ๆอ›—oŒ๓jญRฅ ฑrๅJ•6gฯžETT_ป<]บtม‰'๐๋ฏฟโมƒ*ง|๕ํ๏ๅชWฏŽy๓ๆ!,,์>[ฌz๕๊HMMEBB‚4ํฮ;๎๋๊““ƒ%K–H๏ณฒฒฐdษ˜››รำำภ‹๏ีญ[ทฐlูฒ|ห?{๖ฌศำซy>|จ๒^CCฎฎฎ๏q1/+Wฎ€ฟ็v฿}ต8::B์์l…Ž}W๒ฎi]ดh‘ส๔๙๓็ซผฯอออw9‰……,--Uฦ๒u๕Rฝzuœ8qYYYาด;v๘้6oชฐ๏ๅ๋022B`` Ž?ฎ๒๘ฅ๓็ฯใ๘๑ใhฺด้{ญ็m๐ศฉ˜:u*โโโฐ~มีี'Nฤ„ ะฑcG้—Z/ๆฏฟอ›7‡ฆฆ&‚ƒƒัฆM4lุใวGrr2…mถaุฐaากfอšI0`žฅ๋‘ ขฏฏGGGlุฐตjีB… เ์์ gg็ทฺw›5k†ส•+รฯฯ•*Uย๙๓็ฑ`มดjีJ:c’๗;v๘๑†ถถ6ฺดi๓ฮส๎้้‰:`ผyx๘๐!>๛์3:tH:›wค*==VVVุ่ฑ#`hhˆ}๛๖แิฉS*gJ๚ปx๑ูดiZดhฮ;ใŸม๊ีซUnPz[E}/H?‡็ฮฌZต G•OL™>}:๖๏฿FI76๒ห/จPก‚tอบ:๊y็๛ล๔มŠZZZ*Oโลc;ผฝฝ…ฅฅฅ๔ุŽœœ๑ีW_ sssกP(T‘žž.†.,--…ถถถจYณฆ˜5k–ส#>„b๛๖ํยีีU่้้ [[[1cฦ ๑๋ฏฟ๚xƒ—๕๊ีKˆ๙GzXฅJ•ฤคI“Dnnnพ๖K—.žžžB___ ๑ํท฿ŠทoKmlllDซVญ๒-๛๊ใ„โแร‡bศ!ขjีชBGGGXYY‰^ฝzIฯLห{ฬมหฯ•ขเG๘ุ‡ย๊ม+๗x๘ฑ่ำงจXฑข044อ›7.\ศ๗๘„ผGฝœ:u*_Ÿฏ>็Oˆ †††าใf^็๑ Bq๔่QัดiSadd$ „ซซkพวฐ์ทO๘๙๙ }}}all,ฺดi#’’’Šญ๏ๅm*h๑๓๓Dฟ~ ญ๏m๖ !^<’ว฿฿_่๋๋ ล>๖%๏ฑฝ^' Wฝบ/ผnป‚ฑ%œ…ŽŽŽฐททซWฏ.๔Q/ฏ๖™ทฯš5KezA?y๛}LLŒ๐๑๑zzzยฦฦฆภ็|fee‰3f'''กซซ+ส—//<==ล”)SDjjjฑนiำ&ัฌY3aaa!tttDตjีฤ€๒=ฒ วžžžา3^๗Kฒ๏dษ’%ย฿฿_˜™™ ]]]Qฝzu1jิ(•mBˆ~๘ATญZUhhhจ์็E}฿_ญ๑u~vž>}*,*Tจ E๛๖ํฅว'ๅ=433SŒ5JธนนI?ืnnnา3๕๒ผ๎๏Š9sๆˆชUซ ]]]แ็็'bbbJจƒ|ดฯ๕ฝ,์็ฒ ˜+š4i" „‘‘‘hืฎธt้R‰ถณค๕ผk !Jแ<}๐โโโเแแีซWฃ[ทnฅ]ฉ ฏ๙#"""•๕ฬ3oVฎ\‰ะะะท๊็Cใ๏๏gฯž}ฐฯq+*M™2ๅ…ฟvํฺมุุ8฿g} x๏6•Šภภ@lธฟ๒‹สc$ึฎ] OOฯB?พVญZ่ฝป๔>44YYYุผy3ž?===•๖‘‘‘hูฒฅ๔ูคoj๕๊ีะาาB›6mชuz๚๔้[ึซ††Fพ1“ณŒŒ ”+Wุ่ฑ#~๛ํ7L™2ๅญ๗ข Qฉฺ่ต+>|ˆฝ{๗Jำฒฒฒฐiำ&„„„ผV_•+W†Bกศ๗,ฒ””?~ญZต’ฆญ_ฟžžž022‚ฑฑ1\\\๐๓ฯ?ปŽญ[ทขnบ๙ฮšw[BBPฎ\9ิจQ›6m๐โHfบuกฏฏ{{{์ท/_฿gฮœAห–-all CCC4n'NœPi“wบะกC4h,,,`ee%อ฿ตk๊ืฏกUซVา‡ิฅ k._พŒ: rๅสะำำƒ••‚ƒƒ‘ššZl ___่๋๋รฮฮแแแ๙ฺdffbาคIจQฃtuuammoฟ™™™R…BงOŸbๅส•าฉฝ{c๒ไษ5jภฮฮNš—œœ,-ปz๕jxzzB__*T@pp0nธกRC๗.66(Wฎฦ'อoฺด)ฎ]ป†ธธธm7QYม๐GDฅยึึ>>>Xทn4mืฎ]HMMEpppกห=<ภƒpํฺ5ฌ]ป+WฎDHHHพ๐ทgฯ( 4kึ ภ‹‡ุvํฺๅห—วŒ3๐ใ?ขAƒลภ‘SงNแำO?-pใวับukิญ[3gฮ„ฎฎ.‚ƒƒฑaร#00?๘#ž>}ŠŽ;"==]Z๖นsจ_ฟ>โใใ๑ํท฿โป๏พรีซWั Aœ…๖Wพ|๙Bฏ?%*ซxร•sss4iาkืฎEFFrssัฑcว"—ฑฒฒB“&Mค๗mถ…™™พ๙ๆ์ุฑCบ!ใิฉSธพJ๘4h~wดlูUซVEณfอะนsgดhัขD๕ŠB>ษสส*฿ &&&ฐถถฮ7 xqjxqqFF์ํํ๓๕Yปvm(•JธqNNNา๔W?7๔๒ๅห งWตI๙ุููaฤˆ˜;w.ึฌYƒ๚๕๋ฃmถ่ฝปTQ,--๓„RซV-/>๗๔ณฯ>รๅห—qy้4ํซ๎ป๗Z5ฟ์๒ๅหB fอšฮืึึVy_ตjUฺ่่่Ÿ‚7{ะG‡แˆJUHH๚๗๏๛-[ถ„ฉฉ้k๗ัธqcภแร‡ฅ๐ [[[8::Jํ,,,‡={๖`ืฎ]ุตkVฌXž={bๅส•…๖offเCซ^>W’้……ศ’ะืืWyฏT*ผธ>ฎrๅส๙ฺฟzdIฬ™3ฝ{๗ฦถm…ฏฟaaa8qโ„สM&oJฉTยลลs็ฮ-pซก๙u๛V(ุตkWใ๊ ;ฏŽ็ซRRRPฑbล7ฎ‡่Cฤ๐GDฅ*(( ภ‰'ฐaร†7๊#''๐ไษiฺฮ;˜ฏญŽŽฺดiƒ6mฺ@ฉTbะ AXฒd พ๛๎;ิจQฃภซUซ}}}\ฝz๕๊+Œนน9ส•+‡‹/ๆ›wแยhhh„ชWฏเEฐ}๙ˆ่rqq‹‹ &L˜€ใวรฯฯแแแ˜:uj‘หพ};฿#h.]บเลM>y5วววฃqใฦลU+l~aำซWฏ!์์์ค#Žo๊ึญ[ศสสBํฺต฿ชข ฏ๙#ขRehhˆล‹c๒ไษo ฝ?เๆๆธ{๗.NŸ>ญrส๘k๗๒hhhภีีT1๒*mmmxyy!&&ๆ๊+Œฆฆ&š5k†mถฉ•{๗๎]ฌ]ป๕๊ี+๖ดm๓ๆอallŒ้ำง#;;;฿๛๗๏ฟVMiiiR˜ฮใโโ "ว(ONN–,Y"ฝฯสสย’%K`nn.=นsgบu ห–-หทณgฯ๐๔้S้ฝAw็…หW็}๙็ะิิฤ”)S๒aBไŠ’wขฏฏo‰—!* xไˆJ]aŸฮQK—.a๕๊ี^<๗ฤ‰Xนr%jิจ=zxqสWOOOๅฑะฏ_?,>>>จ_ฟ~‰Nฝ•5 DDDD2ยป}‰ˆˆˆd„แˆˆˆHFˆˆˆˆd„แˆˆˆHF๘gQ*•ธ}๛6ŒŒŒ๘AๅDDDe„้้้ฐดด„†ฦทc๘“‘ทoฟีฆQ้นqใฌฌฌบ†?122\ฝz*T(ๅjสฎ์์lDEEกYณfาวUั๋ใ8ชวQ=8Ž๊มqTWว1-- ึึึา฿๑ทล๐'#yงzŒŒิ๚ูคr“rๅสมุุ˜ฟวQ=8Ž๊มqTŽฃz6Ž๊บd‹7|ษร‘Œ0ษร‘Œ0ษร‘Œ0ษร‘Œ0ษร‘Œ0ษร‘Œ0ษร‘Œh•v๔5Ÿw Jรา.ฃฬาั๋ ิŸyYJEi—SfqีƒใจG๕89ฆ~i—@%ภ#DDDD2ย๐GDDD$# DDDD2ย๐GDDD$# DDDD2ย๐GDDD$# DDDD2ย๐GDDD$# DDDD2ย๐GDDD$# DDDD2ย๐GDDD$# DDDD2๒Nร_วŽ๑ูgŸฉฝ฿ํทใ—_~lบWฎ\y๋>ƒƒƒึ”ิŠ+PณfM( <\e^XX์ํํQปvmDDDผทšˆˆˆ่ใง๕ฎ:ปw/455ีonn.ฺถm+ฝ฿บu+๔๔๔PฃF ตฏ๋Megg#++ …ถ๑๖๖FTT6lจ2}ฯž=8u๊’’’ กกRRR`jj๚.ห&"""Pห‘ฟeห–มลลnnn˜4iฒณณ1}๚tL˜0กDห๗๏฿ธนนแงŸ~๔๊ี วGDD:v์ˆ€€๔่ั3f Nž<‰ํทc๐เมpwwGzz:๛oิฏ_Ÿ~๚):u๊„ŒŒŒBื๛w฿มอš5รร‡ฅ้;w๎ฤgŸ}www„††BฉTธฏJNNฦธqใเเเ€K—.lmmฅ#{yu€ณณ3์์์ หัฃGCSS …ๆๆๆ€u๋ึมออ .DZZZ‰ฦ533iii*/"""’ทท Xธp!Ž;†๘๘x :s็ฮEฏ^ฝ`ddคา6<<แแแ€˜˜๔๋ืเ็็‡ใว#-- :::8~8 66žžžาzv์ุตkืJีญ[mถลย… ]]]Œ5 ทoว้ำงQงN,Zดจภบ๛o์ปgฯžลŠ+pโฤ ภƒ0o{๖ 666ธ}๛ถสvVจPะพ}{œ;wฟ๖๊ีซW๒+Dnn.rssq๊ิ)ฌ]ปC‡ลๆอ›ผ8Š8u๊TLž<ซWฏ†ฟฟ?พ{Œ9ฒภพฦŽ‹#FH๏ำาา‰ˆˆdNํืลลล!)) vvvศษษม๛๗ัถm[l฿พฝะejึฌ‰+Wฎเศ‘#hฺด)._พŒUซVมืืWjSฎ\นbื-„ฎฅ+ …B‘๏k!ฺตk‡ฅK—ชดอปมไUaaaXดh๚๖ํ‹   ๔๋ื5kึ”ๆkjjJง333‹ญษาาํทแป๏พS™ไศ,]บ1117nบw๏^h_บบบRx&"""ิpฺทQฃFXฟ~ฝt=™๎นƒไไd=zEฟ<ŽŽŽXปv-๊ิฉ???ฬ›7~~~ล.gdd„๔๔t€ƒƒฎ^ฝŠฤฤDภำงO ฝุืื[ถlAvv6n฿พ#GŽ>๛์3์฿ฟ7o<|๘7oฬท=๐โฺฝE‹แฬ™3จYณ&BBBะฐaC$''lllฅR‰;vป=ญ[ทฦกC‡ผ8ช๊เเˆŠŠ‚ณณ3fฯžฎ]ปโนs?~<*UชTlŸDDDDy:9;;cศ!๐๕๕…››[กGศ€ยฏ๙^œ๚577‡พพ>p๋ึ-•#… ฦคI“เ๎๎ŽฬฬLฌ]ปกกกpssƒOกแฏN:hธ1œังO้4ฏ…….\ˆvํฺมีีอš5รฝ{๗ŠN๔๋ืงNย์ูณกฅ๕โ ๊„ ะณgO๘๚๚ยาาRj+++ผy5jิภุฑcผธ๙ๅ๘๑ใpqqมดiำค›_ฬฬฬฐ{๗nlถ ะะเ#‰ˆˆ่๕)„ขด‹ ๗#-- &&&๐œฐ Jรา.งฬาั๋ag ‘ฅTฟˆใจG๕เ8ชวษ1๕‰ภภ@hkk—v9eVvvถส8ๆNMM•๎=x<|DDDD$#๏์!ฯ’บu๋ๆปูโ๏ฟ†ŽŽN)UDDDDT:dNžs๑ศท์สทภqTŽฃzpี#;;ปดK เ‘?""""a๘#"""’†?""""แ524~๗eh•ปWฺe”YšศE# เ›‘ อา.งฬโ8ชGIฦqAPํ๗\}ศxไˆˆˆHFˆˆˆˆd„แˆˆˆHFˆˆˆˆd„แˆˆˆHFˆˆˆˆd„แˆˆˆHFˆˆˆˆd„แˆˆˆHFˆˆˆˆd„แˆˆˆHFˆˆˆˆdคฬ‡ฟŽ;โณฯ>{ใๅSRRฐ|๙r5VT2ืฏ_‡ŸŸ๔๔๔ฎ2๏ิฉS๐๒๒‚““ฺดi๓k#""ข—Vi๐6๖๎ MMอท๊#/๕๋ืOMUฝ๐๘๑c”/_พะ๙ฦฦฦ˜;w.ถo฿ฎ2=;;๛๗วฆM›PฃF ปw••…œœ”+WNญu‘ผ”™#ห–-ƒ‹‹ 0iา$dggc๚๔้˜0aB‰–ŽŽFppฐ๔พAƒธpแฦฤฤDธปปcึฌYศศศ@ืฎ]แโโ???\บt ๐ื_มววhิจ๎น“oฯŸ?วส•+แ๋๋‹Yณf&OžฌrdฏrๅสSSSิญ[ฺฺฺ*}์ูณ>>>จQฃภยยภ‹0้์์ŒฏฟIII%6""""e"%$$`แย…8v์โใใ1t่Pฬ;ฝz๕‚‘‘‘J๐๐p)lลฤฤ{DoฺดipqqA\\F… ภ‰‰‰?~< prrยัฃGqๆฬ„††bๆฬ™R/^ฤ๐แรแ์์ŒำงOcูฒe˜>}๚m๋ๅห—‘™™‰Fมหห ›6mTชT ็ฮƒ—— €€€ฌ]ป™™™…๖•™™‰ดด4•ษ[™8ํ›wิฮุุ๐์ู3DEEa฿พ}ธvํšJะะP้k//ฏืพž๏๘๑ใ7n 00๛๗๐โศ[๗๎q๕๊Uไไไ Zตj€?๘มมม˜6mฮž= ==ฝ7Nศออลษ“'๑ื_!33>>>๐๗๗‡……๔๕๕ัณgO๔์ูgฯžEฯž=†ฤฤฤ๛ ร”)Sช"""๚ธ”‰#ฏŠ‹‹CRR์์์Pฏ^=œ9smถ-rMMM(•J้}QGฬ 2qโD|๙็HLLฤชUซคๅ›6mŠูณgcอš5ฺ่ต+"##Uึ๓๒zKฒNKKK4lุฦฦฦ077‡งง'.^ผ(อฟu๋~๘แt๊ิ ฮฮฮXบtiก};ฉฉฉา๋ฦฏตอDDD๔๑)แฏQฃFXฟ~ฝtฺาววw๎Arr2Ž= |7NผชZตj8w๎rrrpํฺ5$$$ŒŒŒžž.ต๓๕๕ล† ปw๏†ฃฃ# -- UชTDDDHํ1t่Pฤววc๘๐แXณf ์ํํฑz๕j€ โโโ ุ Yณf8}๚4ฒฒฒ๐๔้Sฤววฃz๕๊HMMEถmัผysโ๘๑ใ๘ํท฿เใใSh_บบบ066Vy‘ผ•‰ำพฮฮฮ2d|}}กฉฉ‰   Lž<นภถyื๛…††"&&แแแXพ|9lllะธqc899มีีฮฮฮ333ธบบยีี=z๔ภ!C๐ล_ภีีFFFXฑbเ›oพAŸ>}`hhˆfอšธn๘๛๛ใแร‡8<เ๓ฯ?วฏฟ WWWIm322PซV-คฅฅASSณgฯฦ•+WPฑbE๔้ำ๎๎๎ะะะภศ‘#aii‰ิิTŒ1 4Pำจ‘)„ขด‹ ๗#-- &&&ฐ๚/h•3)ํrส,Mไข‘ฦ?8 ฌŽ\ผฃ†ไŒใจ%วAต฿sUeOvv6"##˜๏) TrG๕xu๓~งฆฆชๅ,^™8ํKDDDD๊ม๐GDDD$# DDDD2ย๐GDDD$# DDDD2ย๐GDDD$# DDDD2ย๐GDDD$# DDDD2ย๐GDDD$# DDDD2ย๐GDDD$#Zฅ]ฝำZิ„™™Yi—Qfฝ๘ภํ0ปต=?ธ-pีƒใHDฏ‹Gˆˆˆˆd„แˆˆˆHFxฺW†6ฤ฿‚พัำา.ฃ์Rๆข€ีงošฅ]MูลqTt๛xW+ํˆจ<๒GDDD$# DDDD2ย๐GDDD$# DDDD2ย๐GDDD$# DDDD2ย๐GDDD$# DDDD2ย๐GDDD$# DDDD2ย๐GDDD$# DDDD2ย๐GDDD$#E๘ุ๋ฑ#>๛์ณ7^>::111jฌจdVฌXš5kBกPเ๙๓็*๓ยยย`ooฺตk#""โฝืFDDD'ญา.เmํปšššoีGtt4*Wฎ ///5Udgg#++ …ถ๑๖๖FTT6lจ2}ฯž=8u๊’’’ กกRRR`jjชถ‰ˆˆH~สิ‘ฟeห–มลลnnn˜4iฒณณ1}๚tL˜0กDหฏ_ฟ;vฤฦฦย7n@xx8ฆM›www\ผxงN‚——\\\0pเ@ไๆๆ&Mšooo8;;cธqฎ#99ใฦƒƒƒ.]บฐตต•Ž์EDD`ฬ˜1gggุููธฃG†ฆฆ& ฬออ๋ึญƒ››.\ˆดดดbท733iii*/"""’ท2ฐpแB;v ๑๑๑:t(ๆฮ‹^ฝzมศศHฅmxx8ยรร111่ืฏ 88ูููXทn €ฅK—ยฺฺกกก?~<โโโ`oo>}๚`ษ’%HLLฤฃGฐn:ภะกCq๊ิ)$$$ !!๑๑๑€\l฿พ๘๓ฯQตjUœ>}oดญ—/_Fdd$ผฝฝับukธq0pเ@lถ w๎——๚๗๏ุุุB๛ ƒ‰‰‰๔ฒถถ~ฃzˆˆˆ่ใQfย_tt4‚ƒƒall x๖์ขขขะซWฏ|mCCC ๐๒๒ย๒ๅหฅyแแแ4hš5kV`8KIIRฉ„งง' [ทn8v์`๐๖๖†ปปปtZฺทoaร†aธq8}๚4 “7ึ\ไๆๆโิฉS มะกCฅyถถถ˜:u*’’’เ็็ฬ™3งภ~ฦŽ‹ิิT้•"‰ˆˆHพสL๘{U\\’’’`gg‡z๕๊แฬ™3hถmฑห%''CWWw๎yญ๕=#FŒภฮ;‘€N:!33ภ‹#l-Zด@฿พ}1z๔h\พ|YeYMMM(•J–)Šฅฅ%ฺทo ’Ž0ๆ9rไ๚๔้ƒ3f`ธq่ฝ{่๊๊ยุุXๅEDDD๒Vfย_ฃFฐ~z้บ5นsษษษ8z๔(<<<ฐ}๛๖"๛ศฬฬฤภฑo฿>ธqQQQ###คงงLMMกฉฉ)ฎu๋ึก^ฝzx9444Pพ|y}๚เไษ“%ฟฬฬLคฅฅฉผˆˆˆHY๘KHHภย… q์ุ1ฤววc่ะก˜;w.z๕๊###•ถแแแาุ้˜˜๔๋ื0mฺ44oqqq่ึญ&Mš„ฆM›"11ํฺตร๘๑ใ ]=0y๒dฤวว#** ฺฺฺ€kืฎแะกC๘๗฿1eส@•*Uฐ~œ>}?3ฦงฒ;v์ภฺตk1w๎\๒ห/ˆ‹‹Cddคิๆฦ˜8q"ฑcว|๗Xณfอๅห—กฏฏVญZแำO?ล‚ คy/^Dถm1y๒dxyyaษ’%x๒ไIก}………มฤฤDzY[[ฟQMDDD๔๑xgแ/::มมม066๐โทจจ(๔๊ี+_ะะP„††xqtk๙๒ๅ๖y๘qt๏ะฝ{w;vฌภviiiHOOGร† &&&ะะxฑฉญZต‚ฆฆ&<<<œœ เลฒ>}๚ภูู๛๗GRR’ิW‹-คฐ๊๋๋‹oฟ ,Ž$๗฿ฐณณCFFbbb๐๋ฏฟ–่zฦยไๆๆโ่ัฃXพ|9>Œ+V >>ภ‹SลAAAุตk๘ใ๑วจRฅJก};ฉฉฉา๋ฦo\}5qqqHJJ‚๊ีซ‡3gฮ mถ๏k๕]]]€†††t฿ผy๓`ooฤฤD์฿ฟ_ vPฎ\9้๋ฑcวbูฒex๘1๊ึญ‹‡ยีีK—.ลัฃGักC๛๏ศสส’–ัิิ„Rฉ”ฟwA,--QงNTฉR†††hาค ค๙>ฤผy๓ะถm[`ใฦEnซฑฑฑส‹ˆˆˆไํ…ฟFa๚๕าuf>>>ธs็’““q๔่Qxxx`๛๖ํE๖add„๔๔t้ฝฏฏ/6lุXปv-๊ีซWเrฦฦฦ011มมƒฉฉฉ*์Uiiiจ\น2 """ m๗๏ฟย฿}๗lmmqใฦ ่้้กo฿พ8qโfอš…ภมมsๆฬุุุHG๎๛๏"ฏS€:u๊เ๖ํHKKCNNŽ;{{{@HH|||––†]ปvaห–-hัขE‘ฝ์…?ggg 2พพพpssร/ฟRhยฎ๙suuลณgฯค>&OžŒศศHธบบb๓ๆอ˜:ujก}๖o˜4iะขE dggฺ644 ,€ปปปJุ|ีนsแไไWWW888ภออMeพปป;ยรร‘www@ฝz๕`hhGGG๏Sน๎ฮีี#FŒภขE‹`ee…๛๗๏CKK SฆLฏฏ/ัดiS้ๆ\ธp'N„ฅฅeกuF!„ฅ]ฝiii011มž˜adRพดห)ณ”น9xpแ*:๘ACSซดห)ณ8Ž๊มqTŽฃzศ}}j˜ชฅŸ์์lDFF"00ฺฺฺา฿๏ิิTต\ยลO๘ """’‘2ฆM›www•ื‡๒`h"""ขM™?&;~๘"Ÿ๗GDDDDฏฬ๙#"""ข’c๘#"""’†?""""a๘#"""’†?""""a๘#"""’†?""""a๘#"""’‘2gz}žถฦ033-ํ2สฌ์์lD^๊|bmmํา.งฬโ8ชวQ=8Ž๊มq,xไˆˆˆHFˆˆˆˆd„แˆˆˆHFxอŸ ตG–"ซดห(ณrต๔€.หpทWUhๆ-ฒทท7ขขข`ccฃ2}ฯž=8u๊’’’””„VญZx1žDDDDoKmแ๏๖ํ๐๓๓ƒปป;\]]1rไH$&&ยณfอยำงOGGG„††฿–-[ƒ   ิฏ_ภ‹ฃeฮฮฮpvvฦาฅK‹\~ส”)pvv†ซซ+–,Y"M:t(œœœะฎ];)ะMš4 pvvฦธqใคถถถถ;v,q๔่Qt๏NNNpqqมฺตk๓ญ399ใฦƒƒƒ.]บ$๕‘wd/""cฦŒ8;;รฮฮ._ห–-ร่ัฃกฉฉ …Bsssภบu๋เๆๆ†… "--ญุ๑€ฬฬLคฅฅฉผˆˆˆHิึญ[‡&Mš ..ฑฑฑ˜:u*\\\‡QฃFaแย…ฐณณCRRZถl‰ปw๏JหบปปK_๗๋ืO }^^^ุฒe Ž9‚›7obฺดi8z๔(๚๋/ฬ;ษษษึฒcว;v งOŸFBB:u๊ธ{๗.:t่€s็ฮAฉTโภ^ยSงN!!! ˆ—๚ฒตตE\\ qใฦ œ;w‰‰‰าน\l฿พ๘๓ฯQตjUœ>}o4Ž—/_Fdd$ผฝฝับukธq0pเ@lถ w๎——๚๗๏ุุุ"๛ ƒ‰‰‰๔ฒถถ~ฃšˆˆˆ่ใกถ๐็ํํUซVaส”)ธ|๙2๔๕๕Uๆ?~มมม€vํฺก\นrาผธธ8้๋ๅห—รหห+_111hึฌLMMadd„ภภ@œ|่ะก๖๏฿ŸฏBกPื๊ˆฎฎฎ๔ต††rss๑๙sŒ1;w๎”ŽfffJํ๒Bj๙๒ๅ‘€z๕๊aฦŒ˜|ˆฦซLซXฑ"๖ํWJ}ุสt๘333SyL ง}‰ˆˆˆd„แˆˆˆHFˆˆˆˆd„แˆˆˆHFˆˆˆˆd„แˆˆˆHFˆˆˆˆd„แˆˆˆHFส๔Cž้อX„_„™™Yi—Qfegg‘‘จด๒?ป๒-pีƒใจG’๙#"""’†?""""a๘#"""’^๓'CสฅŸCฉซ,ํ2ส,ฅB๘ไk(ด€Rd•v9eืWJป""Yโ‘?""""a๘#"""’†?""""a๘#"""’†?""""a๘#"""’†?""""a๘#"""’†?""""a๘#"""’†?""""a๘#"""’†?""""y'แ/%%ห—//t~ๅส•‹ํ#""nฅJโ}…ฟ\„††ขcวŽjYWžว9฿ุุs็ฮลศ‘#UฆgggฃXฟ~=ฮ;‡๏€ฌฌ,dddจตF"""’-utr๛๖mt๊ิ OŸ>…RฉDอš5‘˜˜wwwt๋ึ ƒ B๗๎q๑โE๘๛๛฿–-[ƒ   TฌXGŽมŠ+0gฮภื_/ฟฒภeัปwoไๆๆBกPเเมƒ?~<’’’เ๎๎ŽQฃFแ๒ๅหธvํ.\ธ___กrๅส Eƒ Pทn]์ทJฅทo‡ตต5.]บ„dggฃaร†ˆ‹‹CttดสบŸ?Ž 6`ษ’%hะ ฆOŸŽษ“'K}/Žz๗฿055Eบuฑkื.•>๖์ูิจQ`aaเE˜๔๑๑A๋ึญ GGวbว133™™™า๛ดดดb—!""ข›ZŽญ[ทMš4A\\bcc1u๊Tธธธ ..ฃFยย… agg‡คค$ดlูw๏•–uww—พ๎ืฏŸ๚ผผผฐeห9r7oฤดiำp๔่Q๕ื_˜;w.’““ ฌe้าฅ2dโโโp์ุ1bฺดihผ9โโโะญ[7ภ?ƒร‡K๒e†††ˆE๗๎ฅSฒร† รไษ“--ีฬ|๑โE >ฮฮฮ8}๚4–-[†้ำงฟัX^พ|™™™hิจผผผค#–•*Uยนs็เๅๅ… kืฎU wฏ ƒ‰‰‰๔ฒถถ~ฃšˆˆˆ่ใก–๐็ํํUซVaส”)ธ|๙2๔๕๕Uๆ?~มมม€vํฺก\นrาผธธ8้๋ๅห—รหห+_111hึฌLMMadd„ภภ@œขฃฃ1sๆL่่่ภฬฬ ๋ืฏGLL \]]ัฃG <บuƒ““QฉR%iYwww)๕๋ืกกก๐๒๒B๏ฝัฃG˜››ใศ‘#=z4|}}ร‡‡ญญmตฌ_ฟซWฏ†ถถ6jิจ-Z@SSฯž=“n๘x?๔บu๋†qใฦมืืทภฃh๐๗๗วร‡ฅ#ŽŸ9~๕Wธบบ"((Hj›‘‘Zตj!-- ššš˜={6ฎ\น‚Š+ขOŸ>pww‡††FŽ KKKคฆฆbฤˆhะ มีODDD Qุ๙LR‘‘‘}}}( L:999˜œoฝFะ‚า.ˆˆH6xไˆˆˆHFˆˆˆˆd„แˆˆˆHFˆˆˆˆd„แˆˆˆHFˆˆˆˆd„แˆˆˆHFˆˆˆˆd„แˆˆˆHFˆˆˆˆd„แˆˆˆHFˆˆˆˆd„แˆˆˆHF4iาคศ๙)))Xพ|น๔๙๓็hิจ<<ฒ7y๒d„‡‡ผผผ`ii™o[–-[†๑ใว455QกBภฌYณเ็็‡฿~๛ ฯŸ?/vL233‘––ฆ๒""""y๛hย฿บu๋ะคIฤลล!66B$$$เป๏พCRRš๐็๏๏ร‡รยย:tภ๛กP(ค๙ …Bz_ฎ\นB๛ัีี•พึะะ@nnnฑ๋^บt)œœœะฉS'L:ทnR™r™™™ล๖gii‰๖ํ‚‚‚/อS*•ˆŒŒDืฎ]ฑfอฬž=M›6-t[ŒU^DDD$oM๘ปvํชTฉ‚"88้้้ธpแ „ภ๏ฟŽz๕๊ฝQ฿FFFHOO/tพ~๛ํ7;v hผ9ฺถm‹ิิT€nผ‰ฬฬฬนบuk:tภ‹๋ซWฏ†ฝฝ=ึฌYƒ#F >>C‡eจ#""ข๛hย_tt4\]]แแแ#GŽ ^ฝzpuuล”)SPปvm”/_AAAoิท™™\]]แ๊๊ŠYณfฺฎB… >|8ฮž=‹#FHำงL™‚€€4kึ ๖๖๖า๔ฉSงยสส ๗๏฿‡••-Zเลฺ้ล‹รีี[ถlมฤ‰ถถถ8qโึฌYƒ๚๕๋ฟัถ‘ผi•v๊าซW/๔๊ีKzŸœœ ]]ฏ‡๛๏ฟ |฿ A4hะ@š-}ฝn:•e^nW—็w๋ึ บuหืfย„ ˜0aBพ้ๆๆๆ>~ๆM\ๅ๙hŽQ๑>ฺ๐—wŠ”ˆˆˆˆ฿Gˆˆˆˆ(?†?""""a๘#"""’†?""""a๘#"""’†?""""a๘#"""’†?""""a๘#"""’‘ๆณ}ฉไ4ZLƒ†™Yi—ADDDฅ€Gˆˆˆˆd„แˆˆˆHFˆˆˆˆd„ืษ2้(๕KปŒiธ๕(ํˆˆˆ>j<๒GDDD$# DDDD2ย๐GDDD$# DDDD2ย๐GDDD$# DDDD2ย๐GDDD$# DDDD2ย๐GDDD$# DDDD2ย๐GDDD$# DDDD2ย๐GDDD$#j )))Xพ|น:ปhญXฑ5kึ„Bกภ๓็ฯUๆ………มตkืFDDD้HDDDฅ๗rssีนช+๕fggใ้ำงEถ๑๖๖FTTlllTฆ๏ูณงNBRR’’’ะชU+/ฦ–ˆˆˆ่m•8พ}~~~pww‡ซซ+Ž?ฎ๒ย… ?~<แ๎๎ŽYณf!"";vD@@z๔่ปw๏ข]ปv๐๒๒B๚๕q้า%@xx8ผฝฝแ๊๊Š>}๚@ฉT4h€‘#Gยรรˆ‰‰Aใฦ๑ษ'Ÿ`็ฮ…ึ:y๒d๔้ำ>>>๘๖oq๙๒e4mฺžžžhัข๎ฝ ฐตต•ŽบEDD`ฬ˜1€QฃFมมมnnn˜5kฺวห’““1n8888HVุ:œagg—ฏeห–a๔่ัะิิ„Bก€นน9`บupssรย… ‘––Vข๏Yff&าาาT^DDD$o%๋ึญC“&M‡ุุXsTญZงOŸ†‡‡GI‡Vลๅห— oooดn7n 8ถmร;wเๅๅ…๛#66ถศพยยย`bb"ฝฌญญ฿จ&"""๚xh•ดกทท7z๗๎ t๊ิ ๕๋ืWy๏่่Xเr-Zด€‘‘เภHJJ’ๆijjโใใ1aยคฅฅ!%%ึึึhืฎ u๋ึ( ่้้มููืฏ_/ฒ๖ํC[[้้้8v์˜ิ_nn.ชWฏ^่r&&&044Dฟ~ะพ}{ดjีชศ>ฺทos็ฮแท฿~Cฝz๕Šวโไๆๆ"77งNยฺตk1t่Plผภ‹ฃˆSงNลไษ“ฑz๕j๘๛๛ใ๛๏ฟวศ‘# ์k์ุฑRภ€ดด4@"""™+q๘๓๗๗วแร‡๑็ŸขC‡Xฐ`Aพ๗…ชrๅสI_+ œ>}ช๛๗๏]ปvกfอš˜={6žJ|ฺ๗ฺตkจRฅ ˆเเ`=zTๅ}bb"ŒŒŒžž^h๕๋ื—nQ*•HLL<}๚ๆๆๆx96lุ๐–›คสฤฤๅห—GTT€7cœ?`ccƒธธ8(•J์ุฑ๐ไษคฆฆขmถ˜9s&โโโŠ์รูู‹-ย™3gPณfM„„„ aร†HNN.tEiบ5:ˆŽŽ†ƒƒ ** ฮฮฮ˜={6บvํŠs็ฮa๘๑จTฉ’๚‹ˆˆˆ>z%ัััpuu…‡‡Ž9[[[•๗ปw‡™™\]]แ๊๊*(๑ฒ๙๓็cืฎ]pssƒณณณtำฦ๘๑ใ๑้งŸขaร†o|ญ\QึฌYƒYณfมออ ๎๎๎8y๒$`ย„ ู่ณ'|}}aii HOOGซVญเๆๆ†vํฺIื๖ึG๔๋ืงNย์ูณกฅฅU่:€7XYYแๆอ›จQฃฦŽ เลQะใวรลลำฆMรO?เลตปw๏ฦถm˜๏่)QI(„ขด‹ ๗#-- &&&ธwx ฬŒ๕Kปœiธ๕(ํŠ•ศศHB[[ปดห)ณ8Ž๊มqTŽฃzpีใีqฬ๛๛šš ccใท๎Ÿ‡ˆˆˆˆdคฤ7||ˆ๖์ูƒัฃGซLkัข~๑วRชˆˆˆˆ่รVฆร_๓ๆอัผy๓า.ƒˆˆˆจฬเi_""""a๘#"""’†?""""a๘#"""’†?""""a๘#"""’†?""""a๘#"""’‘2gz3Ž afVฺeQ)เ‘?""""a๘#"""’†?""""แ52ิ|s(”๚๙งŸ๎พ๑CDDD๏ษร‘Œ0ษร‘Œ0ษร‘Œ0ษร‘Œ0ษร‘Œ0ษร‘Œ|Tแ/%%ห—//ํ2Jไูณghธ1 1fฬ•yWฎ\ฟฟ?œœœเแแQJัวH6แ/77๗ฝึ๒๘๑ใ"็kiiaโฤ‰˜5kVพy}๚๔ม์ูณq๎9์ูณงฤ}งฬ„ฟทoรฯฯ๎๎๎puuล๑ใวU_ธpใวGbb"1kึ,DDD cวŽ@=p๗๎]ดkื^^^จ_ฟ>.]บ‡ทท7\]]ังO(•J@ƒ 0rไHxxxภ111hธ1>๙ไ์น3_999ุผy3š5k†!C†"""TŽ์ฺฺูโ๙๓็ะึึF@@๔๕๕U๚8{๖, QงN€………4ฯหห }๚๔มษ“'ี;ธDDD$e&ญ[ทMš4A\\bccq๐เA•๗666˜6m\\\‡QฃFฐcวฌ]ปร‡วคI“ƒนs็bฤˆ€ฮ;ใิฉSHHH€พพ>๓Oiฝfff8sๆ ๊ีซ‡!C†`็ฮุบu+ฆN*ตนqใ&NœGGG์ุฑ฿=ึฌY๓Fy๙๒e่๋๋ฃUซV๘๔ำOฑ`มiล‹ัถm[Lž<^^^Xฒd ž|่ะกฒณณU๏฿ฟฟภๅส•+'}ญP(p๚๔iฤลลIG  ˆˆˆ@bb"†ŠฬฬLi€†††สืyืบบบb้าฅ8z๔(:t่€฿YYYา๒šššาid*}ฤาาu๊ิA•*U`hhˆ&Mš !!Aš๐แCฬ›7mถ…6nXh_cวŽEjjช๔บqใF‘๋&""ข_™ ืฎ]C•*U0pเ@ใ่ัฃ*๏addT่Q0จ_ฟพtCˆRฉDbb"เ้ำง077ว๓็ฯฑaร†ืชKOO}๛๖ล‰'0kึ,8p˜3gภฦฦ๑๑๑^%ผ{๗n‘ีฉSทo฿FZZrrrp์ุ1ุBBBเใใƒดด4์ฺต [ถlA‹- ํKWWฦฦฦ*/"""’ท2sฺ7::3gฮ„ŽŽฬฬฬะฃGธบบJ๏ืฏ_333ธบบยีี=z๔€นนนJ๓็ฯGhh(.\ˆ์์l๔์ู...?~<>๔STชT้ญญโ๎๎Ž๐๐p|ฐณณ+ๅJˆˆˆ่uฅงงรฤฤไญ๛a๘“‘ *ฎ_ฟV;ทท7N:Uf—>าาา`mm7nภุุธTj๘–>8Ž๊้ƒใจž>ิ1Žฅฝ B G๕๔๑๊8 !žžKKหทช)รŸŒhhผธฤำฤฤไญHhjj–้ๅีี‡ฑฑq™Žใ‡ฑผบ๚เ8–8~๐!ิpีีวหใจŽ#~yxรฝถมƒ—้ๅีีGiืPฺหซซาฎกด—WWฅ]Ci/ฏฎ>J{วc>„%…Pืีƒ๔มKKKƒ‰‰ RSS฿๚#rฦqTŽฃzpีƒใจG๕xืใศ#2ขซซ‹I“&AWWทดK)ำ8Ž๊มqTŽฃzpีƒใจ๏zyไˆˆˆHFxไˆˆˆHFˆˆˆˆd„แˆˆˆHFˆˆˆˆd„แOF.\[[[่้้กnบ๘๛๏ฟKปคสแร‡ัฆMXZZBกP`๋ึญ*๓…˜8q"ชTฉ}}}4iา—/_Vi๓่ั#t๋ึ ฦฦฦ055ล_|'Ožผวญ(]aaa๐๖๖†‘‘,,,ะพ}{\ผxQฅอ๓็ฯ1x๐`˜™™มะะ:tภปwUฺ\ฟ~ญZตBนrๅ`aaQฃF!''็}nJฉZผx1\]]ฅผ๚๘๘`ืฎ]า|Žแ›๙๑วกP(0lุ0iวฒx“'O†BกPy988H๓9†%w๋ึ-t๏fffะืื‡‹‹ bbbค๙๏ํ๏Œ YXฟ~ฝะััฟ๚ซ8w๎œ่฿ฟฟ055w๏-ํา>‘‘‘b๘๑b๓ๆอ€ุฒe‹สQ˜˜˜ˆญ[ทŠ๘๘xัถm[agg'ž={&ตiัข…pss'NœGŽ5jิ]ปv}ฯ[Rzš7o.VฌX!ฮž=+โโโD`` จVญšx๒ไ‰ิ&44TX[[‹๛๗‹˜˜๑ูgŸ ___i~NNŽpvvMš4gฮœ‘‘‘ขbลŠb์ุฑฅฑIฅb๛๖ํb็ฮโาฅKโโล‹bธqB[[[œ={Vม1|ทฐตตฎฎฎb่ะกาtŽe๑&Mš$œœœฤ;wคื๛๗ฅ๙ร’y๔่‘ฐฑฑฝ{๗'Ož๛ฏุณgธrๅŠิๆ}a๘“‰:u๊ˆมƒK๏sss…ฅฅฅ +ลช>\ฏ†?ฅR)*Wฎ,fอš%MKIIบบบbบuB!’’’q๊ิ)ฉอฎ]ป„BกทnzoตH๎ป'ˆC‡ !^Œ™ถถถุธqฃิๆ๙๓€๘๋ฏฟ„/Bธ†††๘๏ฟค6‹/ฦฦฦ"33๓nภค|๙๒b๙๒ๅร7žž.jึฌ)๖๎+ค๐วฑ,™I“& 77ท็q Kn๔่ัข^ฝz…ฮŸgxฺWฒฒฒ‹&MšHำ444ะคI๕ื_ฅXYูq๕๊U๗฿*chbb‚บu๋Jc๘ื_มิิ^^^R›&Mš@CC'Ož|๏5RSS*Tฤฦฦ";;[ePญZ5•qtqqAฅJ•ค6อ›7GZZฮ;๗ซ0ไๆๆb๚๕x๚๔)|||8†o`๐เมhีช•ส˜_วๅห—aii‰O>๙บuร๕๋ืp _ว๖ํแๅๅ…N:มยยXถl™4}a๘“ 77Wๅ*Uช„๛ฏ”ช*[๒ฦฉจ1๏ฟ`aaก2_KK *Tๅ8+•J 6 ~~~pvv๐bŒttt`jjชา๖ีq,hœ๓ๆษEbb" กซซ‹ะะPlูฒŽŽŽรืด~zœ>}aaa๙ๆq,Kฆnบˆˆˆภ๎ปฑx๑b\ฝz๕๋ืGzz:ว๐5๛๏ฟXผx1jึฌ‰={๖`เภ๘๚๋ฏฑrๅJ๏๗๏ŒึlQaŒณgฯโ่ัฃฅ]J™dooธธ8คฆฆbำฆM่ีซ:Tฺe•)7nภะกCฑw๏^่้้•v9eVห–-ฅฏ]]]Qทn]ุุุเ๗฿‡พพ~)VVถ(•Jxyya๚๔้œ={แแแ่ีซื{ญ…Gd bลŠะิิฬw๗ีปwQนrๅRชชlษงขฦฐrๅสธw๏žสœœ>>ฅXYูagg‡ส•+ซŒaZZNž<)กRRR+ต9pเ”J%๊ึญ๛k. B 2[ถlม`ggง2฿ำำฺฺฺ*ใx๑โE\ฟ~]eU~มํปฦฦฦ๙~qส‰RฉDff&ว๐54n‰‰‰ˆ‹‹“^^^^่ึญ›๔5ว๒๕=y๒๓ชTฉย๑5๘๙๙ๅ{๔ีฅK—`ccเ=y๛Uจ,Zฟ~ฝะีี"))I|๙ๅ—ยิิTๅ๎+นKOOgฮœgฮœฤนsล™3gฤตkื„/nม755ถm ข]ปv‚๏แแ!Nž<)Ž=*jึฌ)ซGฝ 8P˜˜˜ˆ่่h•วBdddHmBCCEตjีฤDLLŒ๐๑๑>>>าผวB4kึLฤลล‰ปw sssY=bฬ˜1โะกCโ๊ีซ"!!AŒ3F( %„เพ—๏๖‚cY#GŽัััโ๊ีซโุฑcขI“&ขbลŠโฝ{BŽaI๗฿BKKKL›6M\พ|YฌYณF”+WNฌ^ฝZj๓พฮ0ษศ๙๓Eตjี„ŽŽŽจSงŽ8qโDi—๔A9x๐ ๏ีซW/!ฤ‹๐ฟ๛๎;QฉR%กซซ+7n,.^ผจาวร‡Eืฎ]…กกก066}๚๔้้้ฅฐ5ฅฃ ๑ VฌX!ตy๖์™4h(_พผ(Wฎœ w๎Q้'99YดlูR่๋๋‹Š+Š‘#GŠ์์์๗ผ5ฅงo฿พยฦฦF่่่sssัธqc)๘ ม1|ฏ†?Že๑บt้"ชTฉ"tttDีชUE—.]TžMว1,น?S8;; ]]]แเเ –.]ช2}Q!ฤkน$"""ข2Šืษร‘Œ0ษร‘Œ0ษร‘Œ0ษร‘Œ0ฝ#OŸ>…ฃฃ#žyฺตkW,_พผ”ซ!*›ˆ่ฃึตkWฌYณFzฟz๕jt๋ึญะ๖hถ-ฮŸ?ฏ2=/={๖ ]ปvE… PกBิฏ_ฟภ~ฎ_ฟŽทoรลลEšfkk‹Yณfกvํฺ022ยฤ‰q๑โExyyมฤฤกกกR[ฅR‰I“&มฺฺUชTมื_ฬฬL@DD6lˆภฤฤ+VฌภฃG |๒ษ'Xนreก๘๒);vภ^:บ~๚B—;~8jีช333|๓อ7P*•าผ… ขfอšจXฑ"z๕๊…งOŸ"77-[ถฤฟ CCCbๅส•Xณf ~๘แJœ˜˜”/_žžžˆ‰‰‘๚V(Xฐ`์์์ะฐaC€ฟฟ?๖๏฿/ซเKค6‚ˆ่#ecc#ขฃฃ…•••ธw๏žธw๏žฐฒฒG666*ํŽ9"„"55UดiำFLš4IšŸ––&*Wฎ,rssลโล‹E›6mDFF†ศฮฮ‡.p;v์žžž๙๊ >็ฯŸบบบขiำฆโ๚๕๋โฮ;ขRฅJโภB!–.]*ล7ฤƒ„ฏฏฏTำŠ+„ฆฆฆXฑb…ศออ"00PŒ9R<\œ?^TฉREฤวว:.y[ฉR%q๔่Q!„w๎็ฮ+twwwq็ฮq๋ึ-แ่่(–/_.„โ๗฿ฮฮฮ"99Ydddˆฎ]ปŠ‘#G !„8x๐ จ^ฝบJ_ฝz๕?๐ƒ๔>==]XZZŠM›6‰œœฑeหamm-ž={&„€hถญHMMาrฦฦฦโย… ึKD…ใ‘?"๚จijjขcวŽุฐa6lุ€:@SS3_ป–-[ยิิๅห—วฅK—0pเ@i๛ hkkใแร‡๘๗฿กฅฅU่‘ฟ”””ฏ๕๛๚๋ฏQกB888ภออ -Zด€ตต5*WฎŒ€€ฤววึฏ_oพ๙VVV033รฤ‰ฑn:ฉŸ๊ีซฃw๏ะะะ@jj*ขฃฃ]]]888 $$›7o.v|ดตตqyo™ทoฃZตjา<พ}[zoee%}}๚u<ๆๆๆ055…ฉฉ)–,Y‚๛ฏศq€M›6aห–-ฐฒฒB‹-๒๎~™ตตตสืw๎‘ึ?`ภi๕๊ีร๛๗‹]๗ห๕:tHZิิ็ฯŸ/t{๓คงงรฤฤคฤ๋!ขˆ่ฃ็ๅๅ…Gแ๑ใว๐๖๖.ฒญฎฎ.z๔่ุุX}ผธฃ๚‹/พ@ซVญ`llŒ€€)xึฎ]ํฺตƒตต5LMMผ‹'Ož„ฉฉ) ์น๓็ฯ‡……lmmฑt้า"๋^ทn๚๗๏_์๖Q~ !„(ํ"ˆˆ>T-Zดภ˜1cะ Aƒื^๖้ำง๐๖๖ฦ฿ม=่น,ป|๙2z๔่ฟ๚ซภำสDT4†?"ข"ฬœ9ร‡‡ถถvi—BDค DDDD2ยkˆˆˆˆd„แˆˆˆHFˆˆˆˆd„แˆˆˆHFˆˆˆˆd„แˆˆˆHFˆˆˆˆd„แˆˆˆHFˆˆˆˆdไคฬ‡P๚:ŠIENDฎB`‚c4core-bm-charconv-xtoa-mega_bytes_per_second-u32.png000066400000000000000000001000301477602032300326750ustar00rootroot00000000000000c4core-0.2.6/doc/img/linux-x86_64-gxx12.1-Release‰PNG  IHDRvF>ืT9tEXtSoftwareMatplotlib version3.5.1, https://matplotlib.org/ุa๒ฝ pHYsaaจ?งi…IDATxœํwTื฿๐gคISQAภŠtB{ฝกQƒKl‰ฦ.FฑF6,‰55ฦ{ฅ(ถจจฑ7Š u๏๛‡‡y]้Š"ใ๓9g์ฬ;฿;ป,ำV!„ """ขOYQั`ฐ#"""’ ;""""™`ฐ#"""’ ;""""™`ฐ#"""’ ;""""™`ฐ#"""’ ;""""™`ฐฃฉw๏ะืื/๎2ru๘๐a( lฺดฉธK)   ( <}๚ดธKกฯDƒ `oo_eศŽBก@PPPq—๑AฤฦฦBกP`ีชUล]ส'มŽษฮ;e๛แATP?3ถnZเ๖K–,A—.]PฅJ( ๔๎;วvYA[ฉTโ๎ปูๆ'$$@WW …ƒ~ว๊)?ษษษ ยแร‡?๚บOž<‰   ฤลล}๔uหQ^ฏๅัฃGัถm[XXX@GGfffhัขNœ8‘ญE‹กYณfจXฑ" เโโ‚%K– 33ณะ5๖๓ฃ ์่์น“'O.๎2ˆŠUa?˜gฬ˜ƒยฮฮššš๙ถืึึฦบu๋ฒM฿ผysaสคw”œœŒษ“'[ฐ›|ooo์ฝ[jw๓ๆM|๗wB`ฤˆ˜={6ฌญญ1pเ@๔ํทะ5}จ`—' ษVRRJ—.]e”(Bคคค@WWทะห9rDฺ[WS Zตj…u๋ึaิจQjำCCCับuk๕ื_…ฎแsขRฉ––โ.ๅƒzsœrซBก๘ ใ @@@€ฺดขjีช˜7oZดh033Ctt4์์์คv๛๗G฿พ}ฑrๅJL˜0ีซW/๒๚ ‹{์H๒๊ี+ุุุภฦฦฏ^ฝ’ฆ?+VDฝz๕™™‰ฝ{cัขE^ขe=ฒ$%%แ๛๏ฟ‡……ดตตQซV-ฬž=Bต๕ญ\น5‚ฉฉ)ดตตakk‹%K–ชๆ›7oขy๓ๆ(]บ4*Uช„Ÿ~๚)zT*ๆอ›;;;่่่ B… ่฿ฟ?^ผxกึฮสส _}๕Ž?Ž/พ๘:::จZต*๘ใl๋‹‹ร๐แรaeemmm˜››ฃWฏ^ูฮQSฉT˜6mฬออกฃฃƒฦใ฿Uk“uฎQTT||| งง‡๊ีซK็็9r๎๎๎ะีีEญZตฐ~ตๅo฿พขVญZะีี…‰‰ บt้‚ุุXตvซVญ‚Bกภ‘#G0pเ@˜ššย<ืm{๛๖mTฏ^๖๖๖x๔่€ื๋ฝrๅJฯล;sๆ Zตj…2eส t้าpttฤ๙๓ีฺQฉR%aaa!FŽ),X lmm…†††Xฟ~ฝ033AAAbผyขrๅสยศศH$$$HหoธQ899‰‰'Šeห–‰ฑcวŠ2eสKKK‘””$ต[นrฅ lmm…Xฐ`๘ๅ—_„BLš4IOž<B๑๏ฟŠ*Uชgggiฺ›ใš4iRพฏัฝ{…–––ฐดด“&MK–,C† Mš4‘ฺ์ทOhjjŠš5kŠ™3gŠษ“'‹rๅส‰2eสˆ[ทnIํฒ๊sqq;v‹/€5j”ิ๎งŸ~JฅR-M฿ณgOถถœถใฉSง๑วHำฒ‚]๚๕EFF†Z๛7ƒๅห—EฅJ•„›››xนZป‚~Xgddkkkaii)^ผx‘ใ6Bgggajj*ž={&M‹ŒŒJฅR๔๊ี+[}}๛๖U๋ซC‡ยฤฤDz~๕๊U@,Xฐ@ญภ…พพพดญๅ}ฑ{๗๎lใฬ+œๅง ม๎ษ“'โ‡~ีซW—ๆนนน‰>}๚!Dก‚–––ฺ๏_dddถmUุ`งญญญb–.]*333ต|d‘|ณmึ๛~ฮœ9าดิิT้=‘ฎืฌY#”Jฅ8v์˜ฺ๚ƒƒƒqโฤ ตš”Jฅธt้’ZกC‡ CCรl๏๛>>ธy๓&โใใ ดพ7ฏฬ:<‘––&ฎธq#ŒŒŒะดiS<}๚Tzิญ[๚๚๚8t่Zถถถ๐๒๒’ž—/_ตjียอ›7ฅi๕œœœค๏oz๛pUŸ>} ฅฅ%=ฯ๊๛อ@__พพพา๓Zตjมุุตkื†ปปป4=๋็7—s;ฆงงใูณgจ^ฝ:Œีd้ืฏ444ฒM€‹/ยววVVVุฟ?ส”)ฃ6ฟAƒBไ{E๔… p๋ึ- 6 ฦฦฦj๓ฒถัƒฝ{ฃlูฒา|GGG4mฺ;w๎ฬึo`` ฺs///<{๖ €š5kยูู6lฺdffbำฆMhำฆดญ ๛พฐถถF๓ๆอ๓๓‡าฃG๛๏ฟ8w๎œ๔oaรfiาค ชUซ&=wtt„กกaถ๗ba4nXํะmึ๛ณSงN000ศ6ํuijjขาs---๔๏฿?Fxx8€ืฏUํฺตaccฃ๖Z5jิฒฝV>>>ฐตตU›fllŒคค$์ท๏ว๚ฆwy๏พ]ฯ‡s็ฮฝs 93/๙๎dส8p Zป๏พ๛.[_ฦฦฦ8sๆ ๎฿ฟŸ๋๚ ๚YQTr_a฿ฟ๒ ๖๎‹฿~๛ _~๙%าาา‘‘‘็2ƒFLL .\X  ข>;สFKK ฟ;nบ…ฤฤDฌ\นฒภ็พ}•*UR๛P€ฺตkK๓ณœ8qMš4‘ฮO)_พ<ฦŽ  vJฅUซVU›VณfMฮEน~:โใใajjŠ๒ๅหซ=^พ|‰วซ-_ฅJ•l๋)SฆŒฺyW7n(๐ท๎/+(ฝ}—นนyถmldd ‹lำ^ีซW˜8qขtNcนrๅคsCrฺŽึึึนึฆM`ฯž=044,ภsvใฦ ศs;eฝjีช•m^ํฺต๑๔้S$%%ฉM/ศ๖์ึญNœ8{๗๎x}Oมวฃ[ทnR›ยพ/๒ฺfš‹‹ lllА˜™™Iกฆ0 ๒~฿>ณŸy฿@ฅJ•ฒ]ผ“ำ๏๐ฅK—ฒฝNYํ ๒Z 85kึDห–-annŽพ}๛f;ฟฐ0ๅฝ๛ฆ๚๚๚๘โ‹/PฃF 4(ญ5๒Sุ๗d~ฟ;ทo฿†RฉฬึoNฬœ9/^„……พ๘โ ฝื—ŽŽŽt]–wyo;;;ฃiำฆ่ท/๖ํ‡ณgฯๆyฌYณฐ|๙rL™2ญZตz—า?ˆO#^า'gฯž=€””\ฟ~ฝศฐธq7† ๆฮ hiia็ฮ๘๕ื_กRฉŠd=*• ฆฆฆ ษqนํษo]QPํ/ทvYป๏พรส•+1lุ0xxxภศศ …พพพ9nวผฎๆ์ิฉVฏ^ต=)ŸŠ‚lnบaฬ˜1ุธq#† †?FFFา•m@แ฿๏rlQ๊ัฃ–,Yt๋ึ JeแO^m—เrปGื๛ผo JฅRมมมs็ฮอq!2งืสิิุณgvํฺ…]ปvaๅส•่ีซVฏ^]่šWํฺตq๕๊Ul฿พปw๏ฦ_…ล‹cโฤ‰พTa฿“E๙štํฺ^^^ุฒe ๖๎‹YณfaฦŒุผy3ZถlY่๒z฿ๅV๗› าฆฐดดดะถm[๒ห/x๕๊Uถํฝjี*๘ใ ไn/ร`GูDEEแงŸ~BŸ>}€€DGGK๋rEดดดฤ๛‘˜˜จถื.๋ช>KKKภ?ƒิิTlถMํ’oVษ‹Jฅยอ›7ฅนฏ๏G@:ข\นrB___4o\\นr%-ฒnwr๎นl}พ};!^฿FลววG่๋๋Kท\)ฬ- „โ๘๑ใขiำฆยภภ@”.]Z8::fปษ๛…งงงะีี†††ขM›6"&&&฿๚SN๏OOO@ไZ฿๛ผ/„x}[oooกซซ+ไ{๋‚ฌ[3ไ๔x๓=‘x฿๖๖{กฐํrบอฤฝ{…ฝฝฝะาาตjีkืฎอ๕v'o๗™๕ž5k–ฺ๔œ~ฒ๗aaaยรรC่่่KKห๏c™––&fฬ˜!์์์„ถถถ(SฆŒจ[ทฎ˜_~๙%FUeƒ}TซVญ‚Bก€Bกภ๑ใวณอBภยย …_}๕•ฺผฌๅฒฅK—†ญญ-ฆNŠไไไื …Bณgฯพwํ?๔แ้้๙}Qม๓ฯุบukถ้'OžDPPะ๛สญ‹-ส๗ GขO ƒ „††f›~ไศ๗฿ะึึฮqนฆM›bอš5Xณf ๆฬ™L˜09ถ฿ฑcLMMแๆๆ๖^๕>y๒ซWฏF``เ{๕๓ฉ๑๖๖ฦซWฏ>ู๛”ๅ์&Ožม‚]ปvํ`hh˜ํปS‰>uผ~™ˆŠEซVญฐqใF๏Sป•Bhh(๊ึญ›๋—‡ืฌY_ต๔<00iiiุผy3RRR ฃฃฃึ~็ฮhูฒeพท ศฯฺตkกฉฉ‰6mฺผW?E)))้ฝฟ;TฉTffŸณไไd่้้AฉTขs็ฮ๘ใ?0y๒ไ๗~},cGDลข{๗๎x๖์๖ํ'MKKKรฆM›ะฃGB๕eff…B‘ํ^[qqq8y๒$Zทn-M[ฟ~=๊ึญ ยมม๓็ฯฯw[ทn…ปป;๔๕๕ีฆgW่้้กz๕ุ๊ดi€ื{ กซซ‹Zตjๅx+„ . eห–044„พพ>7nŒำงOซตษ:„}ไศ 8ฆฆฆ077—ๆ๏ฺต ^^^(]บ4 ะบuk\บt)฿qๅtŽ๕๋ืัฉS'˜™™AGGๆๆๆ๐๕๕E|||พ@xx8๊ีซ]]]X[[#888[›ิิTLš4 ีซW‡ถถ6,,,0jิ(คฆฆJm ’’’ฐz๕j้๐{๏ฝ„‘#GฌญญฅyฑฑฑาฒkืฎEบuกซซ‹ฒeหยืืw๏Uซ!๋ต ‡ทท7๔๔๔0v์Xi~ำฆMq๛๖mDDDhDŸ;"*VVV๐๐๐ภบu๋คiปvํB||<|}}s].%%OŸ>ลำงOq๛๖m„††b๕๊ี่ัฃGถ`ทgฯ( 4kึ ภ๋ฐv๏eส”มŒ3๐ห/ฟ Aƒ๙^ ‘žžŽs็ฮกN:9ฮ๑โพ๚๊+ธปปcๆฬ™ะึึ†ฏฏ/6lุ___ดjี ฟ๒ ’’’ะนsg$&&Jห^บt ^^^ˆŒŒฤจQฃ0aยบu 4ภ™3gฒญkเภˆ‰‰มฤ‰1z๔hภš5kะบuk่๋๋cฦŒ˜0abbbPฟ~}ตฐSiiihผ9NŸ>๏พ๛‹-ยท฿~‹›7o่ฐ็‹/ะชU+ิญ[3gฮ„นน9 €฿]jฃRฉะถm[ฬž=mฺดม‚ ะพ}{๚๋ฏ่ึญ›ิnอš5ะึึ†———t๘ฝุ่ฑ#บw๏๘๕ื_ฅyๅห—L›6 ฝz๕B50w๎\ 6 €ททwถ1<{๖ -[ถ„ณณ3ๆอ›‡† J๓๊ึญ ฒบX†>‚ˆ่#Zนrฅ ฮ;'.\( DrrฒBˆ.]บˆ†  !„ฐดดญ[ทV[@Ž๖ํ‹”””l๋๒๓๓>>>า๓กC‡ CCC‘‘‘Qจš๗_@,Xฐ <@„††Jำฎ\น"ฅR)NŸ>-M฿ณg Vฎ\)Mk฿พฝะาา7nฆฟ_oooiZึvซ_ฟพZ‰‰‰ยุุX๔๋ืOญฎ‡ ##ฃlำ฿v่ะ!@:tH!ฤ… ฑqใฦผ7Jฒถลœ9sคiฉฉฉยููY˜ššŠดด4!„kึฌJฅR;vLm๙เเ`@œ8qBšVบtiแ๏๏Ÿm]ณfอฤญ[ทิฆวฦฦ 1mฺ4ต้ัััBSSSmzVฝมมมนŽIKKK 0 ฿ฑ}*ธวŽˆŠMืฎ]๑๊ี+l฿พ‰‰‰ุพ}{พ‡aตk‡}๛๖a฿พ}๘๛๏ฟ1fฬ์ฝ=z๔€xใ~๋*• ปw๏V; kllŒคค$ตรฟ๑์ู3@™2erœฏฏฏฏถ—ฑVญZ066Fํฺตแ๎๎.Mฯ๚๙ๆอ›€ฬฬL์ปํทGีชUฅv+VD=p๘q$$$จญซ_ฟ~ะะะž๏ทqqq่ฝปด'๓้ำงะะะ€ปป;:Tจฑf}‡ๅž={rฝา8/ššš่฿ฟฟ๔\KK ๛๗วใวุธq#jืฎ ตš5j…ฎ๙M›7o†JฅBืฎ]ี๚633C5ฒ๕ญญญ>}๚ไฺ_™2er=฿“่Sฤ‹'ˆจุ”/_Mš4Ahh(’““‘™™‰ฮ;็นŒนน9š4i"=oถ-LLL๐ร?`๛๖ําล ็ฮร“'Oิ‚ภ๑็Ÿขeห–จ\น2š5k†ฎ]ปขE‹ชWไ๒E=ๆๆๆูNฎ722ส๖ล้Yก้ล‹^_i›œœŒZตje๋ณvํฺPฉTธ{๗.์์์ค้ึึึjํฎ_ฟR(z›กกa^Cสฦฺฺ#FŒภนs///ดm_uพธผRฅJู.่จYณ& 66_~๙%ฎ_ฟŽห—/K‡N฿๖๘๑ใBีฆ๋ืฏC5jไ8ฟTฉRjฯ+Wฎ --ญ\๛B๐ย *Q์ˆจX๕่ั๚๕รร‡ัฒeKบฦŽ=*ป;wยสสJํ;MMM={๖`ืฎ]ุตkVฎ\‰^ฝza๕๊ีน๖obbเูƒV้นฤ‚ะีีU{ฎRฉผ>อฬฬ,[๛w๙๒๖9sๆ w๏๘๛๏ฟฑw๏^ 2ำงOว้ำงี.ุxW*• ˜;wnŽ๓฿ฤ…ํ[กP`ืฎ]9nท/~y{{พ-..ๅส•{็zˆ>6;"*V:t@q๚๔ilุฐแ๚ศศศผ|๙Ršถcวดjี*[[---ดiำmฺดJฅยภฑt้RL˜0ีซWฯฑ*Uช@WWทnzง๚rSพ|y่้้แ๊ีซูๆ]นrJฅ2฿SญZ5ฏC๋›{2฿—ƒƒ0~xœ–,Y‚   wพG?prr ซฃฃฃv๋ ภ๓็ฯัจQ#˜››ใ๖ํXฐ`œ๓+ำฎ];Œ7 …>o-/SงNลพ}๛Pฟ~} 8šššXบt)RSS1sๆฬ|—744ฤ’%Kเ็็‡:u๊ภืืๅห—ว;wฐcวxzzbแย…ฎ็เมƒTฉR...~Dลฎ๘.ศ%ขฯั›ท;ษKAnwขกก!ฬออลท฿~+=z$ต๋นณhีชUถ>7mฺ$š5k&LMM…–––จRฅŠ่฿ฟฟx๐เAพu?z๔HhjjŠ5kึจM๗๑๑vvvช?k ƒ R›vyัผysกฏฏ/๔๔๔Dร† ลษ“'ีฺไท:$š7o.ŒŒŒ„ŽŽŽจVญš่ปท หs\o฿๎ไๆอ›ขo฿พขZตjBGGG”-[V4lุP์฿ฟ?ฯ~„๘m&<<<„ŽŽŽฐดด .ฬึ6--Mฬ˜1Cุูู mmmQฆLQทn]1y๒d/ตปrๅŠ๐๖๖บบบ€ฺญOฆL™"*Wฎ,”Jeถ[Ÿ๕ื_ข~๚ขt้าขt้ายฦฦF 4H\ฝz5[ฝ9ษฬฬ+VใวฯwDŸ…๏q/ั'&##&&&˜>}:Xค}๓อ7ธvํŽ;Vคางg๋ึญ่ัฃnธŠ+w9Dฦ`GDฒ๒๘๑c,^ผ๛๗/๒?ศw๎Aอš5qเภxzzi฿๔i๑๐๐€——W‡}J์ˆˆˆˆd‚Wลษƒ‘L0ุษƒ‘L๐ลŸ•J…๛๗๏รภภ€_jMDDTB!˜˜ˆJ•*Aฉฬ{Ÿƒgไ๛๏๕ๅฺDDDT|๎ฝ ss๓<0ุ}F ทnBูฒe‹นšข•žžŽฝ{๗ขYณfาืษ‰œววฑ•Lr ๏๑ql%OBB,,,คฟใyaฐ๛Œd~500(า๏บคงงCOO†††ฒ๚eฮ"็๑ql%“œวศ{|[ษUำจx๑‘L0ุษƒ‘L0ุษƒ‘L0ุษƒ‘L0ุษƒ‘L0ุษƒ‘L0ุษƒ‘L0ุษ„fq@_๓y' าา/๎2Š”–R`Œ=เ5๓(าTŠโ.งศษy|[ษ$็ฑ%{|็'4*๎จq‘L0ุษƒ‘L0ุษƒ‘L0ุษƒ‘L0ุษƒ‘L0ุษƒ‘L0ุษƒ‘L|ะ`ืนsg|๙ๅ—E๏ถm๐ฟฐu๋V๛๏ฟ๏งฏฏ/>ิ„ เไไGGGt้าษษษ€   ุุุภ}๚๔AFFฦGซ‰ˆˆˆJถ์๖ํ "๏733mถล!C]ฐ+J้้้HJJสณอจQฃ‰จจ(TฉR+Vฌx{{#::/^DFFBBBqqqบl"""*แŠ$ุ-_พprrยคI“žžŽŸใว/ะ๒๚๕รกC‡NNN๘๕ื_8y๒$VญZ…ฮ;รวว~~~XตjF3gฮ`ถm4hœ‘˜˜ˆณgฯยหห u๊ิQ–“ & VญZhึฌž={&M฿ฑcพ๒K8;;#00*•*วqพ-66cวŽ… ฎ]ปฐฒฒBJJ Hu€@””( @ฃFPชT)@:up๏=ภบu๋เไไ„E‹!!!ก@555 j"""’ฏ๗vQQQXดhNœ8ศศH :s็ฮ…ฟฟฟ^ฒ#88†€€€งง'Nž<‰„„hiiแไษ“€๐๐pิญ[WZฯ๖ํ*๕็๎๎ŽถmbัขEˆˆˆ€ถถ6Fމmถแ๙๓๘โ‹/ฐx๑โ๋>{๖,๖ํ‡‹/bๅส•8}๚4เ้ำง˜7o>Œˆˆhhh`๓ๆอ9Žxฝqถmhีช:v์ˆส•+ใ๙๓pqqษw9•+WฦฅK—คm‘%33กกกhธ1`ภ€๘๛๏ฟ๑เมธบบข_ฟ~ฯณ้ำงรศศHzXXXไ[•\๏์> ___^ฝz…ฝ{๗ย฿฿?[ภภ@\]]ฅรžžž8qโN:…๖ํใัฃGx๔่Œกญญ hัขEถ ๘ถซWฏ"** 6„ณณ3Vฎ\‰ทo็ุ๖ไษ“ุ่ฑ#J•*…ส•+รหห p๊ิ)DEEI{์๖๏฿›7ofgูฒeํทวฐaร0v์Xœ?ƒ ‚‘‘QถฌYณp๏=ธนนa๚๕j๓ฦŒwwwธปปKำฌฌฌ0u๊Tฤฤฤภำำ˜3gNฎ3๑๑๑าใ๎ปช‹ˆˆˆJ&อข๎0""111ฐถถFFFžDDDD2QไO|Šณ]ธp๖์YhiiSEDDDDE๏ณvgฮœ)๎ˆˆˆˆ>8Š%"""’ ;""""™`ฐ#"""’ ;""""™`ฐ#"""’ ;""""™`ฐ#"""’ ;""""™๘,nPL๊๖ ๓„‰‰Iq—Qคฒพ๐ุ(oY}?`9c+™ไ<6@ใ#๙โ;""""™`ฐ#"""’ ;""""™P!DqAGBBŒŒŒะํ)h๊w9EJ™hคผƒชjศ„Fq—Sไไ<>Žญd’๓ุycvจซzYฟใใใahh˜g[๎ฑ#"""’ ;""""™`ฐ#"""’ ;""""™`ฐ#"""’ ;""""™`ฐ#"""’ ;""""™`ฐ#"""’ ;""""™`ฐ#"""’ ;""""™(๑มฎs็ฮ๘๒ห/฿y๙ธธ8ฌXฑข+*˜ณgฯยููฮฮฮpuuลฉSง'Nœ€ซซ+เแแ่่่^•L%:ุํท๏ีว‡ v/^ผศsพฝฝ=ยรรUซVaะ Accclบััั˜2e † HKKCrrr‘ืIDDD๒Qb‚๒ๅหแเเ'''Lš4 ้้้๘๙็Ÿ1~๘-๘๐a๘๚๚Jฯ4h€+Wฎ`ธqˆŽŽ†ณณ3fอš…ไไdt๏๐๔๔ฤตkืงN‚‡‡\\\ะจQ# ˜9s&ส—/่่h์นฤ๛agg‡ใวCCC๙'fฮœ‰_p๕๊UใŸA๋ึญฑ|๙rุููๅ;ฎcวŽกx๘๐!v๎™mฦ*Tจ€K—.aใฦ่฿ฟ?”J%๚๗๏N:A[[;วSSS‘šš*=OHHศท&"""*นJDฐหฺfhhx๕๊๖๎‹๛๗ใ๖ํjmฅŸ]]] }˜๕ไษ“;v, UซV่ืฏ€ื{ฬพ๚kบu จRฅ เฏฟ‚ฏฏ/ฆM›†‹/BGGงภ๋๒๒๒BLL ฮ;‡๑ใวcฯž=าผ๐๐pใ๘๑ใา4]]]๔๊ี ฝz๕ยล‹ัซW/LŸ>=ื๓๐ฆOŸŽษ“'jDDDTr•˜CฑoŠˆˆ@LL ฌญญQฟ~}\ธpmถอs จT*้๙›{ฒ bโฤ‰ุ่ฑ#ขฃฃฑfอi๙ฆM›b๖์ู A๗๎ฑs็Nต๕ผนึ้ๆๆ†เษ“'€๛=z๔ภ๚๕๋abbขึ๖ฝ{˜2e บt้{{{,[ถ,ืšวŒƒ๘๘x้q๗๎B™ˆˆˆJ–์5j„๕๋ืK‡=<<๐เมฤฦฦโ๘๑ใpqqมถm๒์ฃJ•*ธt้222p๛๖mDEE ˜˜(ตซWฏ6lุุฝ{7lmmผ>ŒYฑbEภชUซค๖†††:t("##1|๘p„„„ VญZXปv-ภาา Vcึž?ธ|๙2โโโ`bb‚คค$ดkืsๆฬ“““ิ>>>mถE๓ๆอกฏฏ“'Oโ?€‡‡Gฎcึึึ†กกกฺƒˆˆˆไซDŠตททวเมƒQฏ^=hhh C‡ สฑmn็ุYZZขqใฦฐณณƒฃฃ#์ํํ&&&ptt„ฃฃ#0x๐`|๓อ7ptt„Vฎ\ ๘แ‡ะงO่๋๋ฃYณf9ฎx๖์._พ ุ่ฑ#~w8::ขC‡RcวŽaฦŒ(Uชดตตฑfอ(•Jฌ\นWฎ\ม๘๑ใ1~x่้้แไษ“€#F AƒEฑI‰ˆˆH†BQEะว‘###๔_{ šzFล]N‘า@&)oเ ช2๑~ทภ๙ษy|[ษ$็ฑ๒ว,์P๛#V๕ฒ~ววว็{๔ญDŠ%"""ข1ุษƒ‘L0ุษƒ‘L0ุษƒ‘L0ุษƒ‘L0ุษƒ‘L0ุษ„fq@฿ด5`bbReฉ๔๔t์yณฟช…RฅJw9ENฮใใุJ&9 ๗๘86yใ;""""™`ฐ#"""’ Š mˆผ]ƒคโ.ฃhฉ2Qภฺ๓Jโฎฆ่ษy|[ษ$็ฑ๒ว๖ม๔qซ๒ัื๙6๎ฑ#"""’ ;""""™`ฐ#"""’ ;""""™`ฐ#"""’ ;""""™`ฐ#"""’ ;""""™`ฐ#"""’ ;""""™`ฐ#"""’ ;""""™`ฐ#"""’ Yปฮ;ให/ฟ|็ๅ>Œฐฐฐ"ฌจ`&L˜'''8::ขK—.HNNมฦฦ๖๖๖่ำง222>zmDDDT๒”๘`ทo฿>hhhผW"ุฅงง#)))ฯ6ฃFBdd$ขขขPฅJฌXฑเํํ่่h\ผx ฤลลiDDD$/%*ุ-_พprrยคI“žžŽŸใว/ะ๒๋ืฏG็ฮแแแpssรปwŒiำฆมููWฏ^ลนs็เ๊๊  0™™™€I“&มออ ๖๖๖;vlŽ๋ˆลุฑcaccƒkืฎฌฌฌ’’XตjF 000!’’…BhิจJ•*จSง๎ปXทnœœœฐhั"$$$ไ;ิิT$$$จ=ˆˆˆHพJLฐ‹ŠŠยขE‹pโฤ DFFb่ะก˜;w.ฅ€”%88มมม€ฐฐ0|}}‘žžŽu๋ึกXถl,,,ˆqใฦ!""ตjีBŸ>}ฐt้RDGGใ๙๓็Xทn`่ะก8w๎ขขข…ศศH@ff&ถm†VญZกcวŽจ\น2ฮŸ?—|ว5rไHTฎ\—.]’๊ฬ’™™‰ะะP4n0`ภ๗฿x๐เ\]]ัฏ_?„‡‡็ฺ๗๔้ำadd$=,,, ธต‰ˆˆจ$*1ม๎๐แร๐๕๕…กก!เีซWุปw/ณต D`` ภีีU:ฤ ผ}Dณfอr ^qqqPฉTจ[ท. gฯž8qโเภpssƒณณ3ฮ;‡˜˜@๛๖ํ1lุ0Œ;็ฯŸว Aƒ`ddT qอš5 ๗๎ƒ››ึฏ_ฏ6oฬ˜1pww‡ปปป4อสส SงNELL <==แํํ9sๆไุ๗˜1c/=๎ฝ[ šˆˆˆจd*1ม๎mˆ‰‰ตต5๊ืฏ . mถ๙. mmm}0cฦ Œ;_uŽ5kkkระะPํADDD๒Ub‚]ฃFฐ~z้<1Žํƒ้ใVๅƒ๔›๕๗;>>>฿ำชJฬกX""""สƒ‘L0ุษƒ‘L0ุษƒ‘L0ุษƒ‘L0ุษƒ‘L0ุษ„fq@_7งส011)๎2ŠTzz:v๎ŒยืuฬQชTฉโ.งศษy|[ษ$็ฑ๒ว&ocGDDD$ vDDDD2ม`GDDD$<ว๎3›ƒล]F‘RefฮŒ‡RC~ok9c+™ไ<6@^ใ๓จn\%ะGฤ=vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2Q,มฎs็ฮ๘๒ห/๓m‹M›6ูzƒ‚‚\dฝทoฃN:pvv†““ถmธz๕*<==aoo:u๊เศ‘#ล\)•=ุํทj[ิม๎}dffช‹/๒œ_ฑbEœ:u ุปw/ ะััม๏ฟŽ‹/"44๎“ˆˆˆ>o4ุ-_พprrยคI“žžŽŸใว/ะ๒ใฦรž={เ์์Œ๊ิฉ\พ|ฐjี*t๎>>>๐๓๓รกC‡เเเgggxzzf[gFF6oŒfอšIAmีชU=zดิฦสส )))ะาา‚ถถ6 %%*• `ii‰Zตjjีช…„„!ฎฎฎ่ำงฮœ9S ํ—ššŠ„„ตษ—ๆ‡๊8** ‹-ย‰'`hhˆ็ฯŸc๎น๐๗๗‡Zฌรฃ Cpp0VฌXiำฆ!88๋ืฏ 8M›6ลˆ#ฐx๑bŒ7+Vฌศq~~~˜9s&6lˆ๘๘x”*U ภ๋C GŽADD† ‚fอšกbลŠ8pเดตตq๖์YŒ;[ถl‘ฦดiำ๛฿ค>ณฝ{ห—/ว๚๕๋Qฟ~}๔ำO:ิ|ใฦ ดo฿ทnยฺตkณอ฿ถm๊ิฉ…Bเ๕aฺ๙AAAx๒ไ ๚๕๋‡ž={B__?วงOŸŽษ“'็[ษรcw๘๐a๘๚๚ยะะ๐๊ี+์ปฺู"00ภ๋ฝRน…ต“'Oโ๋ฏฟ|๕ื8qโDŽํ˜˜ˆ† ŒŒŒ Tพj๋ึญกกกฤฦฦxฝgซOŸ>ฐททGฟ~#๕ีขE )ˆึซWฃFยย… ฅ=€gฯž…ตต5’““†฿ฝ@กชUซ†่่hDEEa๖์ูHII‘ๆพ}#GŽฤ‚ คiššš่ะกvํฺ…ฟ๚ ๕*Vฌ˜kcฦŒA||ผ๔ธ{๗n๊"""ข’้ฃc˜˜X[[ฃ~๚ธpแฺถm๛ฑV/ษ:ฉT*ฅ๓ๆๆอ›‡Zตj!::B่้้I?3ห—/ว‹/เ๎๎Žgฯžมััห–-ร๑ใวัฉS'๙็ŸHKK“–ัะะณP๋;KีชUQถlYDGGxLตk‡… ขz๕๊jmŸ={†y๓ๆกmถ(]บ46n˜็X ีDDD$_,ุ5jิ๋ืฏ—ฮ๋๒๐๐ภƒ‹ใวรลลEบ47HLL”žืซW6l„††ข~๚9.ghh###:tฏฎ–333( ฌZต*ืv7o„ณณ3&L˜+++ฝ{:::่ท/NŸ>Yณfแเมƒฐฑฑมœ9sผ>g.22ภ๋ฝ{Y็ปwฏ^ฝ<|๘QQQฐถถFff&บvํŠ๛ฃYณfj๋๏ัฃ<<<€]ปvaห–-hัขE^›ˆˆˆ>#,ุูc๐เมจWฏœœœ๐ฟ/ืถมมมาyvaaaา• ŽŽŽx๕๊•t๑DPPv๎ GGGlผSงNอตฯ?๘“&M‚““Zดh๔๔๔\bแย…pvvV ’o›;w.์์์เ่่899ฉอwvvFpp0ขขขเ์์ จ_ฟ>๔๕๕akk‹฿~๛ €˜˜|๑ลprrBห–-1gฮ”+Wปvํยฐt้R8;;รููqqq^ป+Wฎ`โฤ‰จTฉRฎuั็I!ฒ.น$ูKHH€‘‘๖„„Q™โ.งHฉ23๐๔ส ”ณ๑„Rใƒ]Tlไ<>Žญd’๓ุyฯฃบฑฺ๓๔๔t์นญZต’.,” นŽ-๋๏w|||พงU๑›'ˆˆˆˆdขฤปiำฆI‡,ณŸสM‰ˆˆˆ>ฆ’ฝฏobŽญd’๓ุ€ยฏโŸ ฉ*ขq‘L0ุษƒ‘L0ุษƒ‘L0ุษƒ‘L0ุษƒ‘L0ุษƒ‘L0ุษƒ‘L|ฐ`‡+Vไ:฿ฬฬ,฿>VญZ…งOŸYMY็ว2aย899มัั]บtArr2 ((666ฐททGŸ>}‘‘Qฬ•QIQlมฎ Š:ุฝฬฬฬทMOOGRRRžmF…ศศHDEEกJ•*าถ๒๖๖Ftt4.^ผˆŒŒ „„„xฝ=‰ˆˆˆ๒Rdม๎๛๐๔๔„ณณ3๑๗฿#::ฮฮฮ˜5k’’’ะกCฺฺุ"000฿ถlู‚ฐฐ0t่ะ^^^€•+Wย๖๖๖XถlYžหOž<๖๖๖pttฤาฅKฅ้C‡…ฺตk'…ตI“&มออ ๖๖๖;vฌิึสส cฦŒณณ3Ž?Žฏฟvvvppp@hhhถuฦฦฦb์ุฑฐฑฑมตkืค>RRRผชฃG„HIIBก4jิฅJ•ิฉS๗๎ฌ[ทNNNXดh๒~ššŠ„„ตษW‘ปu๋ึกI“&ˆˆˆ@xx8ฆN DDD`ไศ‘Xดhฌญญƒ–-[โัฃGาฒฮฮฮาฯR suuล–-[p์ุ1๗฿˜6mŽ?ŽSงNa๎นˆอฑ–ํทใฤ‰8<ขขขะฅKภฃGะฉS'\บt *• ๐:์;wQQQˆŠŠBddคิ—••""" ฏฏปw๏โาฅKˆŽŽF๋ึญผ“ทm6ดjี ;vDๅส•qyธธธไปอFމส•+ใาฅKP›—™™‰ะะP4n0`ภ๗฿x๐เ\]]ัฏ_?„‡‡็ู๔้ำadd$=,,,๒ญ‰ˆˆˆJฎ" vnnnXณf &OžŒ๋ืฏCWWWmษ“'แ๋๋ hืฎ๔๔๔คyาฯ+Vฌ€ซซkถรยยะฌY3รภภญZตย™3grฌๅเมƒ่ท/ดดดeห–รเโโ"รภออ ฮฮฮ8w๎bbbคพฒBaีชUq็ฮ|๗w8pเŒŒŒํทวฐaร0v์Xœ?ƒ ’ๆๅgึฌYธw๏ฐ~zตycฦŒปป;ฅiVVV˜:u*bbbเ้้ oooฬ™3'ืวŒƒ๘๘x้q๗๎ีEDDD%S‘;ooo=zฆฆฆ่ิฉ8ญMึแฦโขญญ-ฌT*‘™™‰””Œ1;v์๖๎ฅฆฆJํฒh™2e…๚๕๋cฦŒ ๐zฏX‹-ะทo_๘ใธ~บฺ:544 Rฉ@ญ฿, …ปwวฆM›คiฟ๖ยรร1oผlํ;†>}๚`ฦŒ;v,พ๚๋<วkhhจ๖ """๙*ฒ`w๛๖mTฌX €ฏฏ/โโโ˜˜(อฏWฏ6lุเ๕กาฌซ@๓b`` ๕แๆๆ† !!/_พฤฎ]ปิ๖fฝฉI“&๘๗฿‘––xyฎ๋HIIRฉD™2e๐๙s๓ฯ?9ถ{๚๔)„่ึญฦ'ํeดททวโล‹qแยิจQ=z๔@ร† ฅฝ–––ˆˆˆ€Jฅย๖ํฅ €ถmƒ เะกC˜?>6mฺMMMฉอฝ{aooูณgฃ{๗๎ธt้ฦ‡ *ไณ‰ˆˆ่sก™“‚9|๘0fฮœ ---˜˜˜`๚๕ ƒฃฃ#0hะ ๔์ูvvv๐๖๖V $ฮฮฮRP @`` \]]ัปwo๘๙๙ก|๙๒8v์~๑GิซW0|๘pXYYๅXKซVญhjjb๐เม่ืฏ_Žmัฝ{wิฎ]ๆๆๆ๐๐๐ศฑ‡>}๚@MMM,\ธPm~้าฅ€€€„‡‡Kกl๘๑่ีซส•+'''ฉ่ัฃq๕๊U(•JฺฺุJxŒ9/^ผ@ร† พพพ=z4LLLฐ{๗n˜››็๓Jั็J!„ล]} 022BLg+าŠปœ"•ฉฉƒ๐nหQwC?hdคw9ENฮใใุJ&9 (๘*Yฒ๎8žžŽ;wขUซVา]ไBฎcห๚๛Ÿ๏iUๆ """"™(ฒCฑลแูณgาํ@ฒ”+W๛๗๏/ฆŠˆˆˆˆŠO‰v&&&jทJ!"""๚œ๑P,‘L0ุษƒ‘L0ุษƒ‘L0ุษƒ‘L0ุษD‰พA1ฝำเซ011)๎2ŠTzz:ฐs'*ฌพ'ซ๏ฬ"็๑ql%“œวศ|$_cGDDD$ vDDDD2ม`GDDD$<ว๎3คZึ*mUq—QคT - ๊จถ€Jคw9ENฮใ+ฬุ”#Ž}คชˆˆJ&๎ฑ#"""’ ;""""™`ฐ#"""’ ;""""™`ฐ#"""’ ;""""™`ฐ#"""’ ;""""™`ฐ#"""’ ;""""™`ฐ#"""’ ;""""™`ฐ#"""’‰์โโโฐbลŠ\็›™™ๅวชUซ๐๔้ำ"ฉ'66›6mสu~pppž๓?„ณgฯยููฮฮฮpuuลฉSง'Nœ€ซซ+เแแ่่่Z•\ล์ โcปฬฬLขs็ฮEฒฎ,/^ผศsพฝฝ=ยรรUซVaะ Accclบััั˜2e † HKKCrrr‘ึHDDD๒ขYฟ]บtARRT*jิจ่่h8;;ฃgฯž8p พ๚k\ฝz๙๖ทeห„……กC‡(WฎŽ;†•+Wbฮœ9€!C†เoฟอqู่่h๔๎™™™P(8t่ฦ‡˜˜8;;cไศ‘ธ~:n฿พ+Wฎ ^ฝz000€™™ั AธปปcPฉTุถm,,,pํฺ5๔่ั้้้hุฐ!"""p๘๐aตuงคค`ร† Xบt)4h€ŸAAAR฿ภ๋ฝ•>„žžžด\RR ภฮฮNš^ทn]ปwภ๋ ่แแฏพ๚ ฐตตอw;ฆฆฆ"55Uzž๏2DDDTrษปu๋ึกI“&ˆˆˆ@xx8ฆN DDD`ไศ‘Xดhฌญญƒ–-[โัฃGาฒฮฮฮาฯR suuล–-[p์ุ1๗฿˜6mŽ?ŽSงNa๎นˆอฑ–eห–a๐เมˆˆˆภ‰' ฏฏiำฆกy๓ๆˆˆˆ@ฯž=7nภัฃGฅฐ๘&}}}„‡‡ใ๋ฏฟFpp0`ุฐa Bdd$45ี๓๐ีซW1|๘pุใ๙๓Xพ|9~๙็|ทฑcว`kk‹–-[bัขEูๆ๑วhธ1 B… ธt้\]]ัฟ๘๘๘ 44T-ธฝm๚๔้022’๙ึDDDD%W‘;777ฌYณ“'Oฦ๕๋ืกซซซ6ไษ“๐๕๕ดkืNmoUDD„๔๓Š+เ๊๊šญฐฐ04kึ ฦฦฦ000@ซVญpๆฬ™k๑๐๐ภฌYณ0sๆL|8ฌฌฌrฌe๚๕ฐทท‡ณณ3ัขE 8::โีซWpvvFHHศ;๑ื_ล„ เ์์Œ—/_ๆธ๗ห!!!8}๚ดT_วŽqํฺ58::โโล‹RcวŽมษษ ฮฮฮ่ป7ึฌYฅR‰•+Wโส•+?~<œQฏ^=i™#Fเโล‹>|8ส”)๓Nใ """๙RˆŽ1’šไไd่๊๊BกP`๊ิฉศศศ@PPPq—U( 022ยใŸฝaขญส$]ก…U‡ ลอก”H+๎rŠœœวW˜ฑ)G๛HU๔๔t์นญZตส๕œ’Jฮcไ=>Žญไษ๚๛Ÿ๏iUErป“ฯม™3g0|๘pdffยฺฺ๑Gq—DDDDคฆฤปgฯžIทษRฎ\9์฿ฟƒฌ/๋uDDDDŸช์LLLดˆˆˆˆ๐AพRŒˆˆˆˆ>>;""""™`ฐ#"""’ ;""""™`ฐ#"""’ ;""""™`ฐ#"""’ ;""""™(ฑ7(ฆwงv3”&&ล]F‘Rฆง;wB9x7”2๚~ภ,rŸœวFD๔ฑq‘L0ุษล~†TปวAฅW2^ze‡…ล]Q‰ม=vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2ม` I“&yฮ‹‹รŠ+ค็)))hิจ\\\p่ะกw^๏7฿|gggุcภ€PฉT€oฟตjี‚ฦŒ๓ฮั็ๅณvBจT*์฿ฟ?ฯvoป .ภะะ.\@ร† s\&99iiiy๖;oล๖ํ]บtม•+W‰ำงOใศ‘#€/^fxDDD๔™‘Mฐป><==แ์์ GGG\นr...่ิฉjืฎoฟVฺ#VกB 0ธ{๗.ฬฬฬ‡F๓ๆอัฆMิจQำฆMŒ7ัััpvvฦฌYณเ็็‡#GŽภููฯž=SซใาฅK๘๎ป๏`gg'ฑฌ ((มมม@ff&RSSกP(M›6…Bก€ฆฆ&q๏=ภฌYณเ้้‰?๘)))๙n“ิิT$$$จ=ˆˆˆHพd์ึญ[‡&Mš ""แแแB ** &L@LL ž>}Šอ›7?~Œ๖ํใโล‹ฐดดT๋็ย… Xตj"##Œคค$L›6 ˆˆˆภศ‘#ฑbล 4o011Ajj*BBBเํํภภ@ธนนแ๒ๅหจPกBพu๗์ูfffะืืG๋ึญีๆฝ|๙;w๎„——เ็ŸฦฒeหŒ1Wฏ^อต๏้ำงรศศHzXXXvณQ "›`็ๆๆ†5kึ`๒ไษธ~:tuuQซV-8;;CกPภืืว๐zOY๓ๆอs์วำำ&&&ะำำƒตต5๎฿ฟŸ๏บ]]]1w๎\,^ผวŽCฏ^ฝ ฃฃS บCBBp}hhhเภาt!พ๙ๆ๔๏฿_-ูููa๙ˆŽŽ†™™์ํํ๑ื_ๅุ๗˜1c/=๎ฝ[ šˆˆˆจd’Mฐ๓๖๖ฦัฃGajjŠN:แภากMP(าs==ฝ\๛ัึึ–~V*•ศฬฬฬwห–-ƒบt้‚ฉSงJ‡N฿\w–ิิิlหkiiกC‡ุบuซ4mาคIะึึฦ? ึVฅRa็ฮ่ฝ;BBB0{๖l4mฺ4ืฑช=ˆˆˆHพd์n฿พŠ+bภ€๐๕๕Ebb"ฎ\น‚จจ(!๐็Ÿข~๚๏ิทs๏แแ?๘'Nœ@้าฅัผysดm๑๑๑€าฅKใฟCjj*๖๎ เ๕น7nxึถo฿ภฺตkq๘๐a,_พ\m=kืฎEญZต‚#F 22C‡e`#"""€fqPT>Œ™3gBKK &&&๘ๅ—_เ่่ˆษ“'ใาฅK๐๖๖F‡ฉo8::ยัั~~~pssหฑ]ูฒe1|๘p >‡–ฆOž<>>>077GญZตผvฝz๕BBB„๐๒๒B`` `ุฐa022‚ปป;`ฤˆ่ีซฌฌฌp๚๔i˜˜˜ผำ8ˆˆˆHd์แ๏๏/=…ถถvŽ็Ÿ=|๘0ว็ 4@ƒ ค้o†ณu๋ึฉ-๓fปœผ9ฟgฯžู่ณgถ6'NœศqูงOŸๆ8]๗8ั็A6‡b‰ˆˆˆ>wฒ vY‡-‰ˆˆˆ>ฒ vDDDDŸ;""""™`ฐ#"""’ ;""""™`ฐ#"""’ ;""""™`ฐ#"""’ ;""""™`ฐ#"""’ ู|W,œฒล4(MLŠป """*bcGDDD$ vDDDD2ม`GDDD$<ว๎3คŠ๙ *Cโ.ฃH(Šป""ขO๗ุษƒ‘L0ุษƒ‘L0ุษƒ‘L0ุษƒ‘L0ุษƒ‘L0ุษƒ‘L0ุษD‘ปธธ8ฌXฑข(ป”ญ &ภษษ ŽŽŽ่าฅ ’““AAAฐฑฑฝฝ=๚๔้ƒŒŒŒbฎ”ˆˆˆJŠ์233‹rUV๋MOOGRRRžmF…ศศHDEEกJ•*าv๓๖๖Ftt4.^ผˆŒŒ „„„xฝm‰ˆˆˆ๒Rเ`w}xzzยููŽŽŽ8y๒คฺ๓+Wฎ`ธqˆŽŽ†ณณ3fอš…UซVกs็ฮ๐๑๑ŸŸ=z„vํฺมีี^^^ธvํ 88nnnpttDŸ>} Rฉ 4ภ๗฿ธนน!,, 7FีชUฑcวŽ\k BŸ>}เแแQฃFแ๚๕๋hฺด)๊ึญ‹-ZเัฃG+++คคคVญZ…ัฃGFŽ 899aึฌYkoŠลุฑcacc#-ทu„HIIBก4jิฅJ•ิฉS๗๎ฌ[ทNNNXดh ๔šฅฆฆ"!!AํADDD๒Uเ`ทn:4iาวกC‡ิž[ZZbฺดippp@DDFŽ ˆŠŠย๖ํŠแร‡cาคI รนs1bฤ@ืฎ]q๎9DEEAWW๓ด^\ธp๕๋ืวเมƒฑcวlบSงNอณ7nเ่ัฃ˜3g „+V <<฿|๓ ฆL™’๋rฯž=รฆM›ƒศศH|๛ํทk™™™ุถmZตj…Ž;ขrๅส8<\\\๒ฆ#GŽDๅส•q้า%จอหฬฬDhh(7n 0`๛o}:/^Œพ}๛ขC‡@5๒\ว› บw๏Ž &Hม๎ท฿~Cxx8๖์ู“ญฑcวฐlู2„……a์ุฑ๘๚๋ฏsฺฺฺะึึฮu>ษKลพ}+Vฤ€เ๋๋‹ใวซ=ŽŽ†sํรหหKบH@ฅR!::””„๒ๅห#%%6lxฯ!ฉ322B™2eฐw๏^ฏ/lธ|๙2ภาาPฉTุพ};เๅห—ˆGถm1sๆLDDDไู‡ฝฝ=/^Œ . F่ัฃ6lˆุุุ\ืผ>g/หถm`cc8t่ๆฯŸM›6AS๓s๗ฝ{aooูณgฃ{๗๎ธt้ฦ‡ *้๖"""ข’ซภ{์>Œ™3gBKK &&&๐๓๓ƒฃฃฃ๔|๚๕011ฃฃ#แ็็‡๒ๅหซ๕ฑ`มbัขEHOOGฏ^ฝเเเ€qใฦกN:จPกBฮM+ฌ 0#GŽDFFFމฺตkc๘๑่ีซส•+'''@bb"ฺถm‹ดด4( ้\บ๚ศRบti แแแR(หi0z๔h\ฝzJฅถถถXบt)€ื็ฝx๑ 6๘๚๚b๔่ั011ม๎ปann^ไ‡ˆˆˆไA!„ล]} 022ยใฃKabจ[ๅ ฅ“€ื{Qw๎‰VญZIWห‰œววฑ•Lr ๏๑ql%Oึ฿๏๘๘xๆู–฿๛)ฺณg~๑Gตi-Zดภ/ฟRLŸ์š7oŽๆอ›wDDDDŸŠ%"""’ ;""""™`ฐ#"""’ ;""""™`ฐ#"""’ ;""""™`ฐ#"""’ ;""""™(ั7(ฆwฃดํฅ‰Iq—ADDDEŒ{์ˆˆˆˆd‚มŽˆˆˆH&์ˆˆˆˆd‚็ุ}†šo„J7๗๙็ฟ๘๑Š!""ข"ร=vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ฒ vqqqXฑbEq—Q ทo฿F:uเ์์ '''lถ p๕๊Uxzzยu๊ิม‘#GŠนR"""*)>›`—™™๙Qky๑โEž๓+VฌˆSงN!""{๗๎ลเมƒ:::๘๗฿q๑โE„††"  ภ}ั็ญฤป๛๗๏รำำฮฮฮpttฤษ“'ีž_นrใฦCtt4œ1kึ,ฌZต ;w†๐่ั#ดkืฎฎฎ๐๒๒ยตkืมมมpssƒฃฃ#๚๔้•Jhะ พ{ธธธภออ aaahธ1ชVญŠ;vdซ1##›7oFณfอค ถjี*Œ=Zjcee…””hiiA[[’’"ญำาาตjีิชU B\]]ังOœ9sๆme"""*ษJLฐ[ทnš4i‚ˆˆ„‡‡ใะกCjฯ---1mฺ4888 ""#GŽDEEa๛๖ํ ล๐แร1iา$„……a๎น1b kืฎ8w๎ขขข ซซ‹๙GZฏ‰‰ .\ธ€๚๕๋c๐เมุฑcถnŠฉSงJm๎ฝ‹‰'ยึึทoวO?„|วtใฦ 888ภฮฮ .ฬ6ถmจSง €ื‡iถm‹   ธบบb้าฅx๙๒eฎงฆฆ"!!AํADDD๒ฅY”››z๗๎ ฅR‰.]บภหหKํนญญmŽหตhั€ƒ"&&FšงกกˆŒŒฤ๘๑ใ‘€ธธ8XXX ]ปv€ฏพ๚ เเเ…Bุใฮ;€ณgฯข^ฝz6lยยย`hhXเ1UซV ัััธy๓&z๕๊…-Z@GGภ๋s๐Fމ;wJํ555ักCt่ะทo฿Fฟ~๐ร? 111วงOŸŽษ“'ธ"""*ูJฬ;ooo=zฆฆฆ่ิฉาำำีž8p วๅ๔๔๔คŸ ฮŸ?ˆˆiO๔๋ืซVญBtt4†ŠิิTi---€RฉT๛9๋œ=GGG,[ถ วGงN๐็Ÿ"--MZ^CCC:ฬ @ญ๏,UซVEูฒe HHH@ปvํฐpแBTฏ^]ญํณgฯ0o<ดmฅK—ฦฦsfcฦŒA||ผ๔ธ{๗nฎm‰ˆˆจไ+1ม๎๖ํจXฑ" ___?~\ํytt4 r{^^^าล*•J RIII(_พ,X€ภภ@,Zด้้้่ีซ0n8ิฉS*T€‹‹ห;ื่์์Œเเ`ผ|๙Rบภก~๚ะืื‡ญญ-ผผผ`aaˆ‰‰มˆ# T*กT*1gฮ”+Wทoว๐๐แC,]บTปฑฑ1z๔่ตkืBฉ,1yœˆˆˆ>ข์แ๏๏Ÿmฺึญ[—k*Tภ–-[ฒM,ปwoตy>ฬu=๚๚๚hธ1€ื‡m๚๋ฏlmš6m*ํ1|ำW_}…๔๔๔๛อ:฿ˆˆˆ('๕CDDD$ vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2กYะวทงc0LLLŠป """*bcGDDD$ vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2ม`GDDD$šล]}Žญd’๓ุyc+y฿๑ผ0ุ}Fž={ฐถถ.ๆJˆˆˆจฐadd”gปฯHูฒew๎ษ๗nnn8w๎\๚.๎ถ ฐฐฐภปwahhXlu|จถ…_qื[˜ถ‡ญแCตๅ๏‡ฏแCตๅุ>l ขญ‰‰‰จTฉRพ1ุ}F”สืงT่ ฏกกQเ์Oก-{Ÿย๘>…z9ถวฑ}ุ:>…๑} ๕rlOŽc+ศ€OP TขฺึงP๓‡฿งP/วVxŸBฝ{7ŸBฝ[แ} ๕๕ุข gโ‘,$$$ภศศ๑๑๑…๚ŸOI ็ฑ๒วV2ษyl€ผววฑษ๗ุ}Fดตต1iา$hkkw)ENฮcไ=>Žญd’๓ุyc“7๎ฑ#"""’ ๎ฑ#"""’ ;""""™`ฐ#"""’ ;""""™`ฐ๛Œ,ZดVVVะััปป;ฮž=[%ๅ๋่ัฃhำฆ *Uช…Bญ[ทชอB`โฤ‰จXฑ"tuuัคI\ฟ~]ญอ๓็ฯัณgOยุุ฿|๓ ^พ|๙G‘ณ้ำงรออ 055E๛๖ํq๕๊Uต6)))4hLLL ฏฏN:แัฃGjm๎นƒึญ[COOฆฆฆ9r$222>ๆPฒYฒd ฅ›„zxx`ืฎ]า’:ฎœ๒ห/P(6l˜4ญคŽ/(( …Bํacc#อ/ฉใzำฝ{๗๐๕ื_รฤฤบบบppp@XX˜4ฟค~ฆXYYe{ํ …tด’ฺeffbย„ ฐถถ†ฎฎ.ชUซ†)Sฆจ}ojI}>AŸ…๕๋ื ---๑๛๏ฟ‹K—.‰~๚ ccc๑่ัฃโ.-O;w๎ใฦ›7oฤ–-[ิๆ๒ห/ยศศHlบUDFFŠถm kkk๑๊ี+ฉM‹-„“““8}๚ด8v์˜จ^ฝบ่ฝ๛GIvอ›7+Wฎ/^ขUซVขJ•*โๅห—R›ภภ@aaa!8 ยยยฤ—_~)๊ีซ'อฯศศ๖๖๖ขI“&โย… b็ฮข\นrbฬ˜1ล1$ษถmฤŽ;ฤตkืฤีซWลุฑcEฉRฅฤล‹…%w\o;{๖ฌฐฒฒŽŽŽb่ะกา๔’:พI“& ;;;๑เม้๑ไษi~IW–็ฯŸ KKKัปwoqๆฬq๓ๆMฑgฯ๑๏ฟJmJ๊gสใวี^ท}๛๖ โะกCBˆ’ฺM›6M˜˜˜ˆํท‹[ทn‰7 }}}1|ฉMI}>ปฯฤ_|! $=ฯฬฬ•*UำงO/ฦช ็ํ`งRฉ„™™™˜5k–4-..Nhkk‹u๋ึ !„ˆ‰‰ฤนs็ค6ปvํ …Bปw๏ฃี^?ฤ‘#G„ฏวRชT)ฑqใFฉอๅห—q๊ิ)!ฤ๋เซT*ลร‡ฅ6K–,†††"55๕ใ eส”+VฌอธE5ฤพ}๛„์J๒๘&Mš$œœœrœW’ว•ๅว๕๋ืฯuพœ>S†*ชUซ&T*U‰ํZทn-๚๖ํซ6ญcวŽขgฯžByฝnE‡b?iiiG“&MคiJฅMš4มฉSงŠฑฒ๗s๋ึ-<|๘Pm\FFFpww—ฦu๊ิ)รีีUjำคI(•Jœ9sๆฃืœ—๘๘x@ูฒeแแแHOOWŸ ชTฉข6>TจPAjำผys$$$เาฅKฑ๚effb๚๕HJJ‚‡‡‡lฦ5hะ ดnZm@ษฎ_ฟŽJ•*กjีชู่ณ'๎น ไ ถmWWWt้าฆฆฆpqqม๒ๅหฅ๙r๙LIKKรฺตkัทo_(ŠฺีซWภตkื‘‘‘8~8Zถl @>ฏ[Qั,๎่ร{๚๔)233ี~a B… ธrๅJ1U๕>|9Ž+kร‡ajjช6_SSeห–•ฺ| T*† OOOุx]ป––Œีฺพ=พœฦŸ5ฏ8EGGรรร)))ะืืว–-[`kk‹ˆˆˆ=.Xฟ~=ฮŸ?s็ฮe›W’_7wwwฌZต ตjียƒ0y๒dxyyแโล‹%z\Ynผ‰%K–`ฤˆ;v,ฮ;‡!C†@KK ฒ๙Lูบu+โโโะปwo%๛= ฃGFBBlll กกฬฬLL›6 ={๖TซฏคฟnE…มŽ่0hะ \ผxว/๎RŠLญZต๘๘xlฺด 8rไHq—๕๎ฝ‹กC‡b฿พ}ะัั)๎rŠTึptt„ปป;,--๑็ŸBWWท++*• ฎฎฎ๘๙็Ÿ...ธx๑"‚ƒƒแ๏๏_ฬี฿~๛ -[ถDฅJ•Šป”"๑็Ÿ"$$กกกฐณณCDD† †J•*ษ๊u+*<๛(Wฎ444ฒ]๕่ั#˜™™SU๏/ซ๖ผฦeff†วซอฯศศภ๓็ฯ?™ฑ<ทoวกC‡`nn.M733CZZโโโิฺฟ=พœฦŸ5ฏ8iiiกz๕๊จ[ท.ฆOŸ'''ฬŸ?ฟฤ+<<?F:u ฉฉ MMM9r๛฿ ฉฉ‰ *”่๑ฝษุุ5kึฤฟ[โ_7จXฑ"lmmีฆีฎ][:,‡ฯ”ทocฆ•๔ืnไศ‘=z4|}}แเเ??? >ำงOWซฏ$ฟnE‰ม๎3 ฅฅ…บu๋โภา4•J…ภรรฃ+{?ึึึ033SWBBฮœ9#หรรqqq—ฺ,nบ%Nœ8!š4i"ส•+'?~,„(นใสr๖์Yกฉฉ)ฆM›&ฎ_ฟ.BBB„žžžXปvญิฆ$ฆdffŠ*Uชˆ1ผ’ฺ๙๛๛‹ส•+Kท;ูผyณ(Wฎœ5j”ิฆ$ฟnEม๎3ฒ`มQฅJกฅฅ%พ๘โ q๚๔้โ.)_‡ฒ=…ฏ/sŸ0a‚จPก‚ะึึ7Wฏ^U๋ใูณgข{๗๎B___Š>}๚ˆฤฤฤbบœฦ@ฌ\นRj๓๊ี+1pเ@QฆLกงง':t่ คiVVV˜5kjืฎ Lœ8Wฏ^…ซซ+ŒŒŒ(ตUฉT˜4i,,,PฑbE 2ฉฉฉ€UซVกaร†่฿ฟ?ŒŒŒฐrๅJ<=z๔€ฉฉ)ชVญŠีซW็:ฦ7ซn฿พตjี’๖bฎ_ฟ>ืๅNž<‰š5kยฤฤ?๐T*•4oัขEจQฃส•+$%%!33-[ถฤอ›7กฏฏ}}}ฌ^ฝ!!!˜2e ๔๕๕ฅ1GGGรeส”Aบu&๕ญP(ฐpแBX[[ฃaร†ooo8pเณ ตD"ˆˆdสาาR>|X˜››‹ว‹ว sssq๘qaiiฉึ๎ุฑcB!โใใE›6mฤคI“ค๙ ยฬฬLdffŠ%K–ˆ6mฺˆไไd‘žž.Ž=šใบทo฿.๊ึญ›ญ๑์ู3q๙๒eกญญ-š6m*๎น#>^$''KหŠ+WฎไX/ั็Š{์ˆHึ444ะนsglุฐ6l@งN กก‘ญ]ห–-allŒ2eสเฺตk0`€4๏ภ๐๑๑RฉDฉRฅ๐์ู3ผyšššน๎ฑ‹‹‹ห๑บ!C† lูฒฐฑฑ““Zดh ˜™™มวว‘‘‘€๕๋ืใ‡~€นน9LLL0qโDฌ[ทN๊งZตj่ป7”J%โใใq๘๐aLŸ>ฺฺฺฐฑฑA=ฐy๓ๆ|ทOฉRฅp๙๒eผ|๙fffฐตตอตํะกCaff†J•*a๘๐แุฐa€ื‡œวŒKKK่๊๊b์ุฑุดiSพ๋ฮฒ}๛vุููIฏM๛๖ํajjŠำงOKmF CCC่๊๊Jำ _เ๕}์ˆH๖z๖์‰ะะP„„„ไzvืฎ]ˆ‹‹Crr2ฺทoึญ[K๓<ฟฮฯฯ7F‡`ii‰้ำง็ุŸ‘‘QŽWรšššJ?๋๊๊f{žตฬ๛๗QฅJižฅฅ%๎฿ฟ/=777—~พs็RRRPพ|yรุุK—.ลร‡๓.ฐiำ&lูฒๆๆๆhัขEถCะoฒฐฐP๛๙มƒา๚๛๗๏/ญป~๚x๒ไIพ๋~ณ#GŽHหใ๒ๅหนŽ7Kbb"ŒŒŒ ผขฯƒษžซซ+ž?Ž/^ภออ-ฯถฺฺฺ๐๓๓Cxx8ž>} เ๕…อ›7hiiแงŸ~ยตkืฐgฯฬŸ?‡ฮึƒƒnธ๑ฮ5WชT w๎‘ž฿นs•*U’ž+ ้็ส•+C__/^ผ@\\โโโ˜˜ˆเเเ|ืใ๎๎Ž;vเัฃGprrRS๙ถปw๏ชœuJๅส•ฑz๕jiqqqา•ศoึ™SํYห7o<๒=z๔ศu™‡"##ีชUหwŒDŸ;"๚,lผน@‡&ำำำ SSS˜˜˜เส•+044”BฬกC‡p้า%จT*BSS3วCป–––033Ctt๔;ีญ[7ฬ™3๗๎ร๓็ฯ1eส๘๚๚ๆุถrๅส๐๐๐ภ๘๑ใ‘œœŒŒŒ œ?111yฎ#-- กกกHHH@ฉRฅ ฏฏŸใXฒ,Xฐ=ยƒ0o}๚x}ๅ๑7฿|ƒึญ[ระะ>>>Rจฌ]ป6ฺตk xฯœ9ccc 8FFFุฑc,XSSSXYYaูฒeyึฝn:๔๋ื/฿๑}nBQE}ชZดhัฃGฃAƒ…^6)) nnn8{๖์'w“โ’์๚๕๋๐๓๓รฉSงr<ิK๔9cฐ#"สรฬ™31|๘p”*UชธK!"สƒ‘L๐;""""™`ฐ#"""’ ;""""™`ฐ#"""’ ;""""™`ฐ#"""’ ;""""™`ฐ#"""’ ;""""™๘?2ฮ7โฏfIENDฎB`‚c4core-bm-charconv-xtoa-mega_bytes_per_second-u64.png000066400000000000000000000775331477602032300327270ustar00rootroot00000000000000c4core-0.2.6/doc/img/linux-x86_64-gxx12.1-Release‰PNG  IHDRvF>ืT9tEXtSoftwareMatplotlib version3.5.1, https://matplotlib.org/ุa๒ฝ pHYsaaจ?งi~ศIDATxœํwTื๐/EŠTEb้ฤ ๖[Eิhฤ’จ‰ฃุฦXฑขFฑDฃฦุ+v€ลEb—"J๛แa^Wบขศ๘œณGvๆฮgž}ผSVE!@DDDDๅžjY@DDDDฅƒ…‘Lฐฐ#"""’ vDDDD2มยŽˆˆˆH&Xุษ ;""""™`aGDDD$,์ˆˆˆˆd‚…•K}๛๖…ฎฎnY‡Q ๐๐pจจจ`ห–-eJฑ„„„@EE?.๋P่ัธqc888”uฒฃขข‚ฒใฝHHH€ŠŠ Vฏ^]ึก|ิXุั[ูฝ{ทl?<ˆŠkๆฬ™ุพ}{ฑ/]บ=z๔@5 ขข‚พ}๛ๆ.ทะVUUล;w๒ฬOIIถถ6TTT0lุฐทŒžŠ๒โล „„„ <<ƒฏ๛ิฉS ARRา_ท็ตฝิczฑ#ษห—/akk [[[ผ|๙Rš๔้STซV 4@NN๚๖ํ‹ล‹x๕Fห}ไJKKร๗฿ hjjยฦฦ?3„J๋[ตjš6m hjjยฮฮK—.-Qฬ7n@ซVญ ฃฃ333L:5ฯz ๆฯŸ{{{hiiกjีช4hž={ฆิฮสส ํทว‰'๐๙็ŸCKK Ÿ}๖~๗<๋MJJยศ‘#aeeMMM˜››ฃOŸ>yฮQS(˜1cฬออกฅฅ…fอšแ๚๕๋Jmrฯ5Š…*VฌˆZตjI็็=z๕๋ื‡ถถ6lllp๐เAฅๅoบ…!C†ภฦฦฺฺฺ022B= ิn๕๊ีPQQมัฃG1dศ˜˜˜ภผภบu ตjี‚ƒƒ>>ยฬฬLXXXˆัฃG‹…  ;;;กฆฆ&6n(LMMEHHˆ˜?พจ^ฝบ000)))า๒›7oฮฮฮbาคIb๙๒ๅbย„ ขRฅJยาาRคฅฅIํVญZ%;;;แใใ#.\(~๑G!„“'OฤฃG„B\ฟ~]ิจQCธธธHำ^฿ฎษ“'๙ํ฿ฟ_hhhKKK1y๒dฑt้R๑ํท฿Šๆอ›Km8 ิีีE:uฤ์ูณล”)SD•*UDฅJ•ฤอ›7ฅvน๑นบบŠฎ]ปŠ%K–ˆbฬ˜1RปฉSง UUU‘˜˜จหัฃGฑy๓ๆทฺ/jีช%*Uช$ฦ'BCCล‘#Gฤฺตk…ฆฆฆhิจ‘๔8u๊T‘yษฅฃฃ#๓—ปฝ>ๆๆๆJ๛๔๙๓…HOOฤะกC‹\แ์์,ชUซ&ฆM›&ๆฯŸ/>๛์3QฑbE๑๘๑cฉ]`` ฐดด,0ž7๛trrโว?๘ฃ0005jิ‹-vvvb๎นbโฤ‰BCCC4iาDi๙ฤฤD 6L,Xฐ@4lุP๛฿คv999ขeห–ขbลŠbฤˆbูฒebุฐaB]]]t๊ิ)OLu๋ึฦฦฦbส”)b๑โลโ๙๓b€hึฌ™XผxฑXผxฑ6l˜่ัฃG9{นXบtฉ บt้"ฝฦ111Bˆโ๏ป๙Yพ|น บw๏.–-[&~๕W๑ีW_‰oฟV!DLLŒ๐๓๓ฤ/ฟ"ญ๛๙๓็…ng๎ผื฿Ÿล}๏!Dฯž= /^,z๖์)œ๓๔้๏๏/444ฤw฿}'Vฎ\)~๚้'ักCฑn:ฉMI>+,--๓}/๘๘๘้๙อ›7ฑjี*iZ๎wฝฝฝ่฿ฟฟXบtฉ่ึญ› –,Y"„(๚ตtssNNNb๚๕ขz๕๊€จTฉ’˜8qขศษษษื์ูณ…‰‰‰HNN–>Wฯ;Wไvๆบพ˜:uช พ๚k)žทุ}†…ๅ1~xกชช*Ž;&6o,ˆ๙๓็+ต:thžz!„ุพ}ป ฆOŸฎ4ฝ{๗๎BEEE\ฟ~]š๖โล‹<หทjีJ|๖ูgEฦ(ˆoพ๙FšฆP(Dปvํ„†††TŒ?~\aaaJห๏ป7ฯtKKK@;vLš๖๐แCกฉฉ)พ{iฺคI“ฑu๋ึ/่ึญ[033S๚P€บu๋J๓s๛์3ฅiu๊ิ้\”kืฎ!99&&&066Vz<>TZพFyึSฉR%ฅ๓ฎ๗฿b฿๋อr ฅ7ฯใ277ฯ“cXXXไ™๖ๆ๒/_พฤคI“คsซTฉccc$%%ๅ›Gkk๋ใํะก๔๔๔ฐo฿>่๋๋c ๓๗๏ฟ@กyสlll๒ฬซ[ท.?~Œดด4ฅ้ลษ็—_~‰“'Oโ๎ป^ฯ๒๐แC|๙ๅ—R›’๎…ๅ์}suu…ญญ-ึฏ_ฐฐ0˜ššJEMIg฿~ื>s๗ฯโ์ท`ff–็โร/^ฬ๓:ๅถ+ฮk5dศิฉSmฺดนน9๚๗๏Ÿ็ย’x›}๗ucวŽ…ฎฎ.>sิฎ]C‡ลษ“'KCI๗ษข;ทn‚ชชjž~kีช•งฏูณgใย… ฐฐฐภ็Ÿސw๚ยปาาา’ฮกหU’};๗?|~~~Jำ๐๒ๅKœ?pๆฬฌ]ปฟ๒ TU?๒‰WลRพ๖ํHOOวตkืJ‹ํ฿Eณfอ`kk‹y๓ๆมยยุฝ{7~๙ๅ(ŠRYBก€‰‰ ยยย๒ๆ‡AA#Yขi S jWœๅฟ๙ๆฌZต #FŒ€งง'  ขข__฿|๓Xุีœบuรš5kฆ4’๒ฑ(N>พ๒KŒ?›7oฦˆ#๐วภภภญ[ท–ฺ”tฟx›+`K“ฟฟ?–.] ===|๙ๅ—o๕ฅRœ๔ธ“ะ‹giพ 1oผ|็ฟYDๆ๗Z™˜˜ ::๛๖ํรž={ฐgฯฌZต }๚๔มš5kJำปช[ท.ฎ\น‚;wb๏ฝ๘๓ฯ?ฑdษLš4ฉุท‘*้>YšฏIฯž=ัจQ#lถ ๛๗๏วœ9s๐ำO?a๋ึญhำฆM‰๛+lฟ+(๎ืงMaฬฬฬpํฺ5TญZUiบ‰‰ €/~วŒƒFมฺฺZ๚G๎ล!‰‰‰ธ}๛vพ๚ะXุQฑฑฑ˜:u*๚๕๋‡่่h 0qqqาบ‚฿ˆ–––8x๐ RSS•Fํrฏ๊ณดด๗฿ศศศภŽ;”oV)ŒBกภ7คนภีซW@:Dฝz๕0cฦŒท*์ ๏<*๓ถ หง››ฎ]ป†ปw๏*ญ/๗Ps๎๔n฿พ[ทnๅ;ะัฑcG๛s๗}พพ๏X"•‰ฌฌ,๔ํfff๘๕ื_ฑz๕j>>4hfอš…่่h้ฮโืฎ]รๆอ›๑๋ฏฟ*ฌ8F-[ถ G่฿ฟ?๐๔้S์ุฑกกกpvv.Q๏ช}๛๖Xปv- `gg‡ำงOใเมƒ022zซTUUฑn:t๎={๖ฤ๎ปฅsบ๙็4iา“'O.๔คhUUU,]บ:t€‹‹ ๚๕๋‡jีชแ๒ๅหธx๑ขtจฮœ9hำฆ <==๑ีW_แๅห—Xธp! ้ค๋ž={bิจQ5j*Wฎœgิฐด๖ 777–™™™โงŸ~๖๖๖BSSSTชTIธนน‰)Sฆˆไไไ"ทsห–-ขeห–ยฤฤDhhhˆ5jˆAƒๅน฿a~N:%„††Fž}ฟ8๛n~–-[&ผฝฝ…‘‘‘ะิิ5kึฃGVฺ!„˜6mšจ^ฝบPUUUฺฯ {฿Œฑ$๏ดด41t่PQนreกซซ+:w๎,B(๗ž—b๔่ัยููYz_;;;K๗ŒหUาฯŠนs็Š๊ีซ MMMแๅๅ%"""Š}ป<ๅทฯ๖ZฆฆฆŠแร‡ SSSกกก!•๎หWทฝ‰B๕ื_ยฮฮNจซซ—๊ญOT„(ƒcGDDD๔ั‹ŽŽ†ซซ+ึญ[‡^ฝz•u8T <วŽˆˆˆ”~J2ื๙๓กชช oo๏2ˆˆฯฑ#"""ฬž=‘‘‘hาค ิีีฅ[ร|๕ืyn+C๙หฬฬฤำงO mc``๐^oกฤCฑDDD„`ส”)ˆว๓็ฯQฃF  88๊๊*Ž๐๐p4iาคะ6ซVญB฿พ}฿[ ,์ˆˆˆˆJมณgฯคŸร+ˆฝฝ=ชUซ๖b`aGDDD$ผx‚ˆˆˆH&Xุำ;w ฅฅUโl˜…‡‡CEEแแแ๏Wใฦแเเ๐๎A}พ๘โ Œ3ฆฌร *1vD๔Aญ^ฝ***PQQม‰'๒ฬBภยย***h฿พฝาผๅr:::ฐณณร๔้ำ๑โล‹|ื๓ฯ?๏๛ิฉSQฟ~}xyyฝs_T<3gฮฤ๖ํ๓L?u๊BBBOn;‹/ฦ๛๗฿KD๏ ;"*ZZZXฟ~}ž้Gล'Œฯ›Zดhตkืbํฺต˜;w.\]]๑ร? 000฿๖ปvํ‚‰‰ <<<)Gaอš5 zง~>6x๙๒ๅG{Ÿฒย ป)SฆผทยฎSงNะืืฯ๓ฉD;^ฟLDeขmถุผy3,X t+…๕๋ืรออญภฏSงz๗๎-= Bff&ถnŠ๔๔thii)ต฿ฝ{7ฺดi#ึๅZทnิีีักC‡w๊ง4ฅฅฅฝ๓o‡ชชชๆษูง์ล‹จXฑ"TUUัฝ{w๛๏˜2eส;๏?D G์ˆจL๘๙๙แษ“'8pเ€4-33[ถlฟฟ‰๚255…ŠŠJž{m%%%แิฉShืฎ4mใฦpssƒžž๔๕๕แ่่ˆ_ตศul฿พ๕๋ื‡ฎฎฎา๔๓สbccแใใƒŠ+ขVญZุฒe €W#๕๋ื‡ถถ6lllp๐เม<}Ÿ?mฺดพพ>tuuัฌY3œ9sFฉM๎!์ฃGbศ!011นนน4ฯž=hิจttt งง‡vํฺแโล‹EnW~็ุ]ปv บuƒฉฉ)ดดด`nn___$''ูDFFขAƒะึึ†ตต5BCC๓ดษศศภไษ“QซV-hjjยยยcฦŒAFF†ิFEEiiiXณft๘ฝo฿พ ม่ัฃึึึาผ„„iูu๋ึมออ ฺฺฺจ\น2|}}q็ฮฅr_ปศศHx{{ฃbลŠ˜0a‚4ฟE‹ธu๋ขฃฃ‹ตDvDT&ฌฌฌเ้้‰ 6Hำ๖์ูƒไไd๘๚๚ธ\zz:?~Œวใึญ[Xฟ~=ึฌY<…พ}๛ ขข‚–-[xuV???TชT ?๔~๑G4nธศ‹!ฒฒฒp๎9ิซW/฿๙ฯž=C๛๖ํQฟ~}ฬž=ššš๐๕๕ลฆM›เ๋๋‹ถmโวDZZบw๏ŽิิTiู‹/ขQฃFˆ‰‰ม˜1c๐ร?เๆอ›hธ1ฮž=›g]C† A||<&Mš„qใฦึฎ]‹vํฺAWW?๔~๘แฤววฃaร†JลNqdffขUซV8sๆ พ๙ๆ,^ผ_5nธQฌรžฯž=Cถmแๆๆ†ูณgรƒฦoฟ&ตQ(ุ่ฑ#~๙gt่ะ .D็ฮ๑ห/ฟเห/ฟ”ฺญ]ปšššhิจ‘t๘}ะ Aฺ่ต+ฟ๒‹4ฯุุ0cฦ ๔้ำตkืฦผy๓0bฤ:tyถแษ“'hำฆ \\\0|ฅ›หบนน€ฌ.–กO€ "๚€VญZ%ˆs็ฮ‰E‹ ===๑โล !„=z๔Mš4Baii)ฺตkงด,€|;w้้้yึ |||ค็ร‡๚๚๚";;ปD1_ฟ~] .ฬ3ฯววG๋ืฏ—ฆ]พ|Yชชชโฬ™3า๔}๛๖ bีชUาดฮ; ๑๏ฟJำ๎ป'๔๔๔„ททท4-7o 6TŠ?55UЁ*ลu}a``g๚›Ž9"ˆ#GŽ!„8ผ 6o\xR๒‘›‹นs็Jำ222„‹‹‹011™™™B!ึฎ]+TUUล๑ใว•– ฤษ“'ฅi:::"000ฯบๆฬ™#ˆ›7o*MOHHjjjbฦŒJำใโโ„บบบา๔xCCC & 1x๐เ"ท่cม;"*3={๖ฤห—/ฑs็Nคฆฆb็ฮE†ํิฉ8€เฏฟย๘๑ใฑw๏^๘๛๛Cผvฟu…Bฝ{๗*†544DZZšาแ฿โx๒ไ  RฅJ๙ฮืีีUeดฑฑกก!๊ึญ‹๚๕๋Kำsพqใ ''๛๗๏G็ฮ๑ูgŸIํชUซœ8q)))J๋8p ิิิค็@RRค‘ฬวCMM ๕๋ืว‘#GJดญ^vtฅqaิีี1hะ ้น†† „‡Jwไ฿ผy3๊ึญ [[[ฅ˜›6m %Ž๙u[ทn…Bก@ฯž=•๚655Eํฺต๓๔ญฉฉ‰~๚ุ_ฅJ• <฿“่cฤ‹'ˆจฬฃy๓ๆXฟ~=^ผxœœt๏ฝะeฬออัผys้yวŽadd„QฃFa็ฮาล ็ฮรฃG” ป!C†เ?@›6mPฝzuดlู={๖D๋ึญ‹ฏ(เ‡zฬออ๓œ\o``็‡ำs‹ฆgฯžxuฅํ‹/`cc“งฯบu๋BกPเฮ;ฐทท—ฆ[[[+ตปvํHEั›๔๕๕ ค<ฌญญ๑w฿aผy CฃFะฑcG๔๎[Šฟ0fffy.่จSง !!_|๑ฎ]ป†K—.I‡N฿๔๐แรลบkืฎAฺตk็;ฟB… JฯซWฏ ๛B๐ย *WXุQ™๒๗๗วภq}ดiำ†††%๎ฃYณf€cวŽI…๎ปaee;;;ฉ‰‰ ขฃฃฑo฿>์ูณ{๖์มชUซะงOฌYณฆภŒŒA๖ฆืGะŠ3ฝ ฑ8ดตต•ž+ ฏฮG355อำm~ผ}๎น่ท/๚๋/์฿ฟ฿~๛-fอš…3gฮ(]ฐ๑ถ 1oผ|็ฟY—ดo์ูณ'฿ฟy๑ห›๙|SRRชTฉ๒ึ๑}h,์ˆจLu้าƒ ย™3gฐiำฆท๊#;;๐๙siฺฎ]ปะถm$žcGDeJWWK—.EHHศ[฿#๎๏ฟ8;;oญ0ำงOวะฐaC 2๊๊๊Xถl2220{๖์"—ืืืวาฅK€z๕๊มืืฦฦฦธ}๛6vํฺ///,Zดจุ๑>|ร† C=PงNdggcํฺตPSSCทnŠ\ฬฬ ?๔PงNlฺด ัััXพ|นt~[@@๘ใแศ‘#๐๒๒BNN._พŒ?๘๛๖ํƒปป;€Wท9x๐ ๆอ›333X[[ฃ~๚R‘ ___TจP:t@อš51}๚tŒ? ่น3๔๔๔p๓ๆMlถ _5FUฌ\8p5jิ€ซซkฑ๓GTๆส๎‚\"๚ฝ~ป“ย็v'jjjย\|๕ืโมƒRป๎ป‹ถmๆ้sห–-ขeห–ยฤฤDhhhˆ5jˆAƒ‰ฤฤฤ"ใ~๐เPWWkืฎUš๎ใใ#์ํํ‹๎6 :TiZTT”hีช•ะีี+VMš4งNRjSTŽ9"Zตj% „–––จYณฆ่ทฏˆˆˆ(tปผษ7DEอš5…–––จ\นฒhาค‰8x๐`ก๑นˆˆˆžžžBKKKXZZŠE‹ๅi›™™)~๚้'aoo/455EฅJ•„›››˜2eŠHNN–ฺ]พ|Yx{{ mmm@้ึ'ำฆMีซWชชชyn}๒็ŸІ  กฃฃ#lmmละกCล•+W๒ฤ›ŸœœQญZ51qโฤ"ท›่cข"ฤ;œลKD๔‘ษฮฮ†‘‘fอš…!C†”j฿_}๕ฎ^ฝŠใว—jฟ๔๑ูพ};๑๏ฟขZตjeQฑฑฐ#"Yy๘๐!–,Y‚Aƒ•๚๒ํทQงN:t^^^ฅฺ7}\<==ัจQฃb'๚˜ฐฐ#"""’ ^KDDD$,์ˆˆˆˆd‚…‘Lฐฐ#"""’  ๘ขP(p๏=่้้๑Gญ‰ˆˆส !RSSaffUียวไXุ}B๎ป๗N?ฎMDDDe็ฮ;077/ด ปOˆžžเๆอ›จ\นrGS>deeahูฒฅ๔sHT0ๆซd˜ฏ’aพJŽ9+™5_)))ฐฐฐพว รย๎’{๘UOOฏT๋RฮฒฒฒPฑbE่๋๋To๒๓U2ฬWษ0_%วœ•ฬวžฏโœFล‹'ˆˆˆˆd‚…‘Lฐฐ#"""’ vDDDD2มยŽˆˆˆH&Xุษ ;""""™`aGDDD$,์ˆˆˆˆd‚…‘Lฐฐ#"""’ vDDDD2มยŽˆˆˆH&Xุษ„zY@^ซ๙'กะะ-๋0ส U๑@ฃูวฉP)๋p>zฬWษ0_%ร|•sVธจš–uฅŽ#vDDDD2มยŽˆˆˆH&Xุษ ;""""™`aGDDD$,์ˆˆˆˆd‚…‘Lฐฐ#"""’ vDDDD2มยŽˆˆˆH&Xุษ ;""""™`aGDDD$๏ตฐ๋ฝ;พ๘โ‹R๏wวŽXฐ``๛๖ํธ~๚;๗้๋๋‹๐๐๐w๎งธ FŒฺฺุbJ๓GSSำ•๊๏ซใ@MMญิ๛อษษAวŽฅ็ทo‡––jีชU๊๋z[YYYศฬฬ„ŽŽNmVฌX…B+Wฎ ''ษษษาผ๘๘xฟ_ฉ}RR ฿WศDDD$ฅ2bทbล 8::ยูู“'OFVVfฮœ‰‰'k๙โศ‘#ggg๒ห/€ภภ@œ:u ซWฏF๗๎แใใƒ€€ฌ^ฝใฦรูณgฑcว :...HMMล?ƒFก^ฝz่ัฃ^ผxQเz๘แุุุ eห–x๒ไ‰4}ืฎ]๘โ‹/เโโ‚   (Š|ท๓M ˜0almmq๕๊U€••าำำ@Š;ทฏเเ`€šš*Wฎ,๕3fฬฬœ9Sฉ๏ 6ภูู‹/FJJJฑ๒𑑁””ฅษื;vฑฑฑXผx1Nž<‰˜˜ >๓ๆอC`` ๔๔๔”ฺ†††"44ผผผp๊ิ)คคค@CCงNDFFยออMZฯฮ;ฑ~zฉฟ๚๕๋ฃcวŽXผx1ขฃฃกฉฉ‰ัฃGcวŽˆŠŠย็ŸŽ%K–ไ๗?ƒเย… Xตjฮœ9x๘1ๆฯŸ๐๐pDGGCMM [ทnอw;W#ˆ;v์@ถmัตkWTฏ^QQQpuu-4o‰‰‰Xฐ`เ๏๏คค$ภฆM›เ๎๎Ž5j(ตผผผŠ\NOOฉฉฉ[[[ผyqqq€ดดดฏ˜mะ ถm†ฌฌ,ปwว|๑ล8t่๛๏?ภ“'O๐฿ๅูฮงOŸฐdษœ?ตkื†ฟฟ?š4i‚„„€ฅฅ%ขฃฃกP(ฐs็NiํทวัฃGผ๕ดตต…ฃฃ#s4kึ ่ืฏŸt[,^ผ:u‚““Zถl‰‡น:::0`ฮ;‡Ÿ๊๊ฏC'Nœˆ>}๚ Aƒ033“ฺ?K—.…““ถm†I“&บFFFุปw/๚๋/ดmชชผ!)SBˆฒ‚>Œ””ภmโ_Ph่–u8ๅ‚†ชภx‡็˜uA™ •ข๘ฤ1_%ร|• ๓UrฬYแข~hช๔<++ ปw๏FถmQกB…2Š*ฏ๏๏ไไd้\‚pุ‡ˆˆˆH& Š?&๕๋ืWบpxuป 2Šˆˆˆˆจ๔}…ูณgห:"""ข๗އb‰ˆˆˆd‚…‘Lฐฐ#"""’ vDDDD2มยŽˆˆˆH&Xุษ ;""""™`aGDDD$Ÿฤ ŠIูพ^022*๋0ส…฿ <>ฦ๛ฃ๚ภ๓U2ฬWษ0_%วœ}z8bGDDD$,์ˆˆˆˆd‚…‘L๐ปOP๐kPฏ๘ฐฌร(ิƒฆชภจWตฒ็ฃว|• ๓U2ฬWษ1g%๓K๛Zeย;ใˆ‘Lฐฐ#"""’ vDDDD2มยŽˆˆˆH&Xุษ ;""""™`aGDDD$,์ˆˆˆˆd‚…‘Lฐฐ#"""’ vDDDD2มยŽˆˆˆH&ส}aืฝ{w|๑ลoฝ|RRVฎ\YŠ฿ž={เเเ{{{)อ‹‰‰บบ:๖๎[&ฑQ๙ฃ^ึผ‹@MMํ๚ศ-์ PJQฝ๒์ู3TชTฉภ๙Ož<มธqใpไศใแร‡า>พธi#""ขOHน(์bccฑx๑bœ|8ๆอ›‡ภภ@่้้)ต • ฉˆˆˆ"Gโfฬ˜GGGDGGc๔่ัXดhŒ‡เเ` 2`oo'Nเ๙๓ ย์ูณฅ>ฎ\น‚‘#GยมมQQQXฑbfฮœY่zฏ]ป†๛ 6Dƒ p๔่Q@rr2Vฎ\‰แร‡+ตฏZต*.^ผwww 4>>>Xฟ~=222 \GFFRRR”DDD$_ๅโPl๎h›พพ>เๅห—ุฟ?<ˆ[ทn)ต}\5ww๗Ÿ?w๊ิ)L˜0ะถm[ 8ภซณฝ{ใๆอ›ศฮฮF5๙'|}}1cฦ \ธpZZZลZONN.]บ„C‡แ๖ํhูฒ%ฎ]ป†Œ;*TศณŒถถ6๚๔้ƒ>}๚เย… ่ำงfอš…ธธธ|ื1kึ,L™2ฅDODDDๅWนฑ{Stt4โใใamm† โ๙๓ุ่ฑcกหจฉฉAกPHฯ ้สฯคI“ะตkWฤลลaํฺตา๒-Zดภฯ?Œฐฐ0๘๙๙a๗๎J๋y}ฝฏฏำฬฬ mฺดฆฆ&jืฎ $&&"22C‡…••ถlู‚ภภ@>|XZ๎๎ป˜6mz๔่,_พผภ˜วไไd้q็ฮm3•/ๅขฐkฺด)6n(J๔๔๔Dbb"pโฤ ธบบbวŽ…๖QฃF \ผxูููธu๋bcczzzHMM•ฺ5hะ›6m์ปvvv€””TซV ฐz๕jฉฝพพ>†Ž˜˜Œ9aaaฐฑฑมบu๋–––ˆŽŽฅทoใวC๛๗๏ใ๛055ลฑcว€„„t๏kึฌAำฆM‘œœŒŽ;ขUซVะีีลฉSง๐๛๏ฟรำำณภmึิิ„พพพาƒˆˆˆไซ\Šuppภฐaระ AจฉฉกK—. ษทm๎๙uAAAˆˆˆ@hh(Vฎ\ KKK4kึ ๖๖๖prr‚ƒƒภศศNNNprrB@@† †ฏพ๚ NNNะำำรชUซฃFBฟ~ ซซ‹–-[ๆปnooox{{ใษ“'ธt้ kืฎ๘ํท฿เไไ„.]บHmœœPฏ^=ุC]]‹-ส๗๐๋๋พ๛๎;4nธ$ฉ#""ขOˆŠB”u๔aคคคภภภƒึ†zEƒฒง\PCšช‹รŠšศมปZ็Sภ|• ๓U2ฬWษ1g%๓K๛Zุฝ{7ฺถm[ไ`ห‡”๛œœ\ไัทrq(–ˆˆˆˆŠฦยŽˆˆˆH&Xุษ ;""""™`aGDDD$,์ˆˆˆˆd‚…‘Lฐฐ#"""’ vDDDD2มยŽˆˆˆH&Xุษ ;""""™P/๋่ร›ับ6ŒŒŒส:Œr!++ ปw‹Ÿ|T?ฑbพJ†๙*ๆซไ˜ณ’ษสส*๋G์ˆˆˆˆd‚…‘L๐P์'hSฬ]h๋ฅ•uๅƒ"•ฌ‹๚PU+๋h>~ฬWษ0_%ร|•sV2๏˜ฏ~5J?ฆโˆ‘Lฐฐ#"""’ vDDDD2มยŽˆˆˆH&Xุษ ;""""™`aGDDD$,์ˆˆˆˆd‚…‘Lฐฐ#"""’ vDDDD2มยŽˆˆˆH&Xุษ„, ป๎ปใ‹/พx๋ๅรรรQŠBกภˆ#`cc[[[์฿ฟ_iจQฃ`jj๚มใ"""ข๒IฝฌxW€ššฺ;๕SSSธปป—RT@VV233กฃฃS`›+V@กPเส•+ศษษArrฒ4/>>๗๏฿WjŸ””CCรR‹‘ˆˆˆไฅ\ุญXฑŽŽŽpvvฦไษ“‘••…™3gbโฤ‰ลZ~ใฦ่ฝ; 22ธs็BCC1cฦ ธธธเส•+8w๎แ่่ˆมƒ#''0y๒dxxxภมม&Lศw ˜0almmq๕๊U€••าำำซWฏฦธqใคํ จฉฉกrๅสR?cฦŒมฬ™3•๚ฐaœฑx๑bคคคนฝHIIQz‘|•›ย.66‹/ฦษ“'ƒแร‡cผy „žžžRะะP„††"""0`ภ€ฏฏ/ฒฒฒฐaร 4ห—/‡……‚‚‚Œ่่hุุุ _ฟ~Xถlโโโ๐๔้Slุฐ0|๘pœ;wฑฑฑˆELL '';v์@ถmัตkWTฏ^QQQpuu-t›ฑ`มธนนม฿฿III€M›6ม5jิPj?x๐`๕ื_HLL„ปป;ˆศศศ๛Ÿ5k ค‡……E๑NDDDๅNน)์ยรรแ๋๋ }}}ภห—/ฑ~ๆi„   €ปป;Vฎ\)อ ล!Cะฒeห| ฏคค$( ธนนz๕๊…“'O:ธธธเนsˆt๎#FŒภ„ …กC‡ยภภ ศmJNN†ตต5"##แเเ€ฉSง"-- ,ภุฑc๓]ฦสส ำงOG||<ผผผเํํนs็ๆv๘๑HNN–w๎)2&"""*ฟสMa๗ฆ่่hฤววรฺฺ 6ฤ๙๓็ัฑcว"—KHH€ฆฆ&Kดพ๔๔t|๗wุตkbccัฃGdddx52ึบuk๔๏฿cวŽลตkื”–USSƒBกi033C็ฮ]บtALL nธ๋ืฏฃnบฐฒฒยฃGPฏ^=ฅŽ?Ž~๚แงŸ~ย„ ะปw๏|cึิิ„พพพาƒˆˆˆไซvM›6ลฦฅ๓ฤ<==‘˜˜ˆ„„œ8qฎฎฎุฑcGก}ddd`๐เม8x๐ ๎น#]…ชงง‡ิิT€กก!ิิิครฌ6l@ร† ‘žžUUUTชT OŸ>ล฿-๕๋เเ€%K–เ๙๓จ]ป6ัคI$$$,-- …B;wJหตo฿G๐jDาึึŽŽŽx๐เcccDEE๖๏฿๓ฯ๐๓๓รล‹ŒชUซ–B†‰ˆˆจผ+7Wล:88`ุฐahะ ิิิะฅK„„„ไ6๗บ   DDD 44+WฎฤิฉSัฅK888`๙๒ๅ่ะกฮž=‹: {๗๎Xฟ~=6nˆ฿~๛ _}๕222เๅๅ___จฉฉมฯฯu๋ึ…นน9<==๓ฌWGG ภ€ u๕W้8q"๚๔้ƒ*UชภููYj?~x๘๙๙aส”)055ลฺตk อ‘‘๖๎ ss๓ทฬ"ษ™ŠB”u๔aคคคภภภ‹ล@[ฯฐฌร)9จ|?OMีwปญฮ'๙*ๆซd˜ฏ’cฮJๆ๓ีฯฃFัB๎๗wrrr‘งU•›CฑDDDDT8vDDDD2มยŽˆˆˆH&Xุษ ;""""™`aGDDD$,์ˆˆˆˆd‚…‘Lฐฐ#"""’ vDDDD2มยŽˆˆˆH&ิห:๚๐พtฎ##ฃฒฃ\ศสสย๎ฑ่]ฯ*T(๋p>zฬWษ0_%ร|•sV2rศG์ˆˆˆˆd‚…‘Lฐฐ#"""’ žc๗ ŠLH3ตฒฃ\Pไdน‘ U5พ]Šย|• ๓U2ฬWษ1g๙๓ฌeXึ!ผ7ฑ#"""’ vDDDD2มยŽˆˆˆH&Xุษ ;""""™`aGDDD$,์ˆˆˆˆd‚…‘Lฐฐ#"""’ vDDDD2มยŽˆˆˆH&Xุษ ;""""™(“ยฎ{๗๎๘โ‹/Šl—€-[ถ”ฺzCBBZjฝซs็ฮม๖๖๖่ะกƒาผฤฤD่๋๋T๑ัวํƒv€ššZฑฺ–va๗.rrrJิูณg…ฮฯสสยภฑqใF\ผx๛฿”ๆ7-Zด(QŸDDD๔i{ฏ…Š+เ่่gggLž<YYY˜9s&&NœXฌๅƒƒƒฑo฿>ธธธ ,, =B›6mเ่่ˆVญZแมƒ.{๙๒e๘๘๘ภูู๕๋ืGFF 22 6Dอš5ฑ~ภฟ‹† ข^ฝz๐๔๔ฤฅK—ซWฏF๗๎แใใƒ€€9rŽŽŽpqq——Wžufggc๋ึญhูฒ%† &๕1n8ฉ••าำำฑo฿>xzzขVญZฉอฑcว ฏฏGGGฅัฏ_?œ={ถX๙หศศ@JJŠาƒˆˆˆไ๋ฝvฑฑฑXผx1Nž<‰˜˜ >๓ๆอC`` ๔๔๔”ฺ†††J‡#""0`ภภŒ3ะชU+DGGฃWฏ^˜>ึึึhุฐ!ฮŸ?Ž;~จีK455ชชชาys๓็ฯ‡ โโโp่ะ!้ฐ-TฌXQ๚{๘๑Xฑbž={†๚๕๋ใษ“'prrย๒ๅหqโฤ t๋ึ ๑233ฅeิิิ P(ค็น}›™™กI“&ะืื‡ฑฑ1pๅส๓ฯ?˜={6ฌฌฌ0|ใ๗฿—–๒ไ ๆฯŸŽ;BGG›7o.t[๕๕๕•DDD$_๏ญฐkฺด)6n(ืๅ้้‰ฤฤD$$$เฤ‰puuลŽ; ํCOOOi4ชAƒุดi`๚๕hุฐaพห้๋๋รภภGŽ$''+WoJIIฉฉ)TTTฐz๕๊ธq...๘แ‡`ee…;w๎@KK ๛๗ว™3g0gฮ>|ถถถ˜;w.ภาา111^๎ๅžุฒeKDEE!33iiiˆ‰‰Aอš5†[ทn!!!#FŒภŒ3ะงO€ฟฟ?<==‘’’‚={๖`ถmhบuก9$""ขOว{+์0lุ04hะฮฮฮXฐ`Am :วฮษษ /_พ”.ž ม๎ปแไไ„ญ[ทb๚๔้๖๙๛๏ฟc๒ไษpvvF๋ึญ‘••U`   ,Zด...ึ€y๓ๆมNNNฐตต…ณณณา|„††"66...€† BWWvvv๘฿' ญRฅ ๚๕๋ิฏ_฿=ฬฬฬ \7๐ชฐป|๙2&MšTd["""๚๔จ!DYAFJJ ฐ/โ๔ *•u8ๅ‚"'/ŸD[/จชฝทSReƒ๙*ๆซd˜ฏ’cฮ๒็Yห0฿้YYYุฝ{7ฺถm+]t๙1ศNNN.๒ด*๒‘L”๛ยnฦŒpqqQz|,75&"""๚สธlpppก๗ณ#"""๚T”๛;""""z……‘Lฐฐ#"""’ vDDDD2มยŽˆˆˆH&Xุษ ;""""™`aGDDD$ๅลTrnV๚022,๋0ส…ฌฌ,์พ |™มG๕ป+ๆซd˜ฏ’aพJŽ9๛๔pฤŽˆˆˆH&Xุษ ;""""™เ9vŸ ‡A6ศTษ,๋0ส…u-เหxXjู้eฮG๙*ๆซdŠ›ฏjค|ภจˆ>.ฑ#"""’ vDDDD2มยŽˆˆˆH&Xุษ ;""""™`aGDDD$,์ˆˆˆˆd‚…‘Lฐฐ#"""’ vDDDD2มยŽˆˆˆH&Xุษ ;""""™xo…]RRVฎ\Yเ|SSำ"๛Xฝz5?~\j1gŠBกภˆ#`cc[[[์฿ฟ_iจQฃ>ชx‰ˆˆ่ใWf…]q”va๗.rrrŠ6++ iii…ถYฑb ฎ\น‚‹/ย]š๛๗๏+ตOJJ*QผDDD๔้)ตย๎ฝ{๐๒๒‚‹‹ œœœ๐๗฿#.....˜3gาาาะฅKุูู!((จศถm†ˆˆt้า5ฌZต pppภ๒ๅห ]~ส”)ppp€““–-[&M>|8์ํํัฉS'ฉX›>^๊+ท(์ณฯp๛๖m|๓อ78t่ ;wฦˆ#0aยDEEa่ะกาผย$''รฺฺ‘‘‘pppภิฉS‘––† `์ุฑ๙.cee…้ำง#>>^^^๐๖๖ฦนs \ว๘๑ใ‘œœ,=๎นSd\DDDT~•Za็ํํcวŽมฤฤบuรกC‡๒ดQQQ)ญีฝMMM้oUUUไไไ ==฿}๗vํฺ%๎eddHํr ะJ•*!66 6ฤO?„ฏFลZทn๛c์ุฑธvํšา:ีิิ P(@ฉ_333t๎ะฅKฤฤฤเฦธ~:๊ึญ +++}Zเ:าำำกชชŠJ•*แ้ำง๘๛๏ฟ๓m๗๘๑c!๐ๅ—_"88Xetppภ’%Kpyิฎ]hาค‰4hii‰่่h( ์นS๊ฏ}๛๖8z๔( <<ถถถpttฤƒ€„„#** ฐ~888เ็Ÿ†ŸŸ.^ผˆเเ`TญZตศ<ังAฝด: ว์ูณกกก###lธprrB@@†Š^ฝzมJ‰‹‹‹T( 0AAApwwG฿พ}ccc?~cวŽEƒ #GŽ„••Uพฑดmpuu…บบ:† †ๆึะะ~~~จ[ท.ฬออแ้้™oป๛๚๕ƒ๊๊๊Xดh‘า| 0 @dd$ิี_ฅvโฤ‰่ำงชTฉgggฉ๘๑ใแ็็‡)Sฆภิิkืฎ-4ฟFFFุปw/ฬออ mGDDDŸ.!„(๋ ่รHIIโปมP%ณฌร)rิต๙ๅ ธmต์๔ฒ็ฃว|• ๓U2ลอWต?x€\YYYุฝ{7ฺถm‹ *”u8ฝ5_น฿฿ษษษEžVล_ž """’‰R;[žzŸjพTฟ;^ึ!เˆ‘lฐฐ#"""’ vDDDD2มยŽˆˆˆH&Xุษ ;""""™`aGDDD$,์ˆˆˆˆd‚…‘Lฐฐ#"""’ vDDDD2มยŽˆˆˆH&Xุษฤ{)์’’’ฐrๅส็›ššูว๊ีซ๑๘๑ใR‰'!![ถl)p~hhhก๓฿—={๖ภมม๖๖๖ Ršuuu์ป๗ƒวEDDDๅS™vล๑ก ปœœก{๗๎ฅฒฎ\ฯž=+t“'O0n89r/^ฤิฉSฅyBŒ?-Zดฆeffโล‹ฅ#ษ‹zitr๏=๔่ัiiiP(จ]ป6โโโเโโ‚^ฝzaศ!่ป7ฎ\นoo๏"๛ถm"""ะฅKTฉRววชUซ0w๎\ภท฿~‹ฏฟ:฿eใโโะทo_ไไไ@EEGŽApp0โใใแโโ‚ัฃGใฺตkธu๋._พŒ @OOฆฆฆ BใฦQฟ~}6lุLLLค~ึฎ]‹ฆM›โย… าดgฯžมำำํทGPP์์์ŠฬcFF222ค็)))E.CDDDๅWฉŒุmุฐอ›7Gtt4"##1}๚t8::"::ฃGฦโล‹amm๘๘xดiำ<–uqq‘0`€Tะนปปcถm8~8๛๏?ฬ˜1'Nœภ้ำง1o<$$$ไห๒ๅห1lุ0DGGใไษ“ะีีลŒ3ะชU+DGGฃWฏ^€วŽ“Šลื้๊๊"22ฝ{๗Fhh(`ฤˆ ‘‘พ๎ส•+9r$…+V`ๆฬ™…ๆ์ฺตk๘๏ฟะฐaC4hะG$''cๅส•>|ธR๛ชUซโโล‹pwwว Aƒเใใƒ๕๋ื+noš5k ค‡……Eก1Q๙V*…‡‡ึฎ]‹)SฆเฺตkะึึVš๊ิ)๘๚๚:u๊„Š+J๓ขฃฃฅฟWฎ\ ww๗฿~_—““ƒ๘๘x:tkึฌA฿พ}‘Œ;6฿ุดตตังO?~‹/ฦฯ?œoพr?ษษษาใฮ;EฦEDDDๅWฉv8v์LLLะญ[7:t(O•าXU‘๑ื_A]]Mš4มฅK—๒m๗zq๙&MMM€ชช*rrrผ:๏-?-Zดภฯ?Œฐฐ0๘๙๙a๗๎P(า|555้๙๋ฃkfffhำฆ 455Qปvm˜˜˜ 11‘‘‘:t(ฌฌฌฐeหโ๐แราrw๏ลดiำะฃG888`๙๒ๅ…n‡พพพาƒˆˆˆไซT ป[ทnกZตj†Ž˜˜Œ9aaaฐฑฑมบu๋–––าจไŽ;คๅฺทoใวC๛๗๏ใ๛055ลฑcว€„„t๏kึฌAำฆM‘œœŒŽ;ขUซVะีีลฉSง๐๛๏ฟรำำ๓ถ‹ˆˆˆไฃT ป๐๐p899มีีวG`` œœœเไไ„9sๆ`่ะกธ~:์ํํฑkื.TญZUZ6ฟs์ o฿พ@ฃFPฝzuŒ; 4ภ_|‘#Gยสส*฿X6nธธธ 55ญ[ท†““^พ| „……ฝี6๒ห/๘แ‡เโโ‚็ฯŸ็;๚ๅํํฐฐ0œ9sFŠฏkืฎธz๕*œœœ”.†prrBฝz๕`oo–-[bัขEฮ๕w฿แย… 9r$*Uช๔VADDD๒ฅ" :ฦHJ^ผxmmmจจจ`๚๔้า๙pๅIJJ ๐pฆ7Œ4E/@ศRัภฯพE๋ PAd–u8ฝO5_ช฿ซๅฒฒฒฐ{๗nดmถศุ๓๕6˜ณ’๙X๓•๛œœ\ไiUฅrป“Oมูณg1rไHไไไภฺฺฟ{Y‡DDDDคคvOž<vDDDD2มยŽˆˆˆH&Xุษ ;""""™`aGDDD$,์ˆˆˆˆd‚…‘L”ำSz+TŒส:ŒrA5+ ุฝชร๖B๕#๚ภ๓EDTถ8bGDDD$,์ˆˆˆˆd‚‡b?AŠฝมPTt^zี.‹ส:""ข‚#vDDDD2มยŽˆˆˆH&Xุษ ;""""™`aGDDD$,์ˆˆˆˆd‚…‘Lฐฐ#"""’ vDDDD2มยŽˆˆˆH&Xุษ ;""""™`aGDDD$,์4oผะ๙IIIXนrฅ๔<==M›6…ซซ+Ž9๒ึ๋}๙๒%z๗๎ [[[ิญ[.\Pš฿ฝ{w|๑ลo?}Z>้ยN…Bƒฺ๎อย๎๙๓ะืืว๙๓็ัคI“|—y๑โ233 ํw๊ิฉจWฏ._พŒ๓็ฯราาRšwเภจฉฉ)ต๖์YQ›DDDDŸ0ูv๗๎ƒ——\\\เไไ„ห—/รีีบuCบu๑๕ื_CกPชVญŠมƒรััw๎ฉฉ) <<ญZตB‡Pปvmฬ˜1Œธธ8ธธธ`ฮœ9ภัฃGแโโ‚'Ož(ลq๑โE|๓อ7ฐทท— ฑ $$กกก€M›6แ›oพhiiAOO••…™3gbโฤ‰J}ฯ™3^^^๘๗฿‘žž^dN222’’ข๔ """๙’Maทaร4oัััˆŒŒ„ฑฑฑ๘แ‡วc๋ึญ€‡ขs็ฮธpแ‚า(๐j4n๕๊ีˆ‰‰Ahh(าาา0cฦ 8::"::ฃGฦส•+ัชU+DGGรศศ ƒทท7‚‚‚เแแK—.กjีชฦ๛์ู3hhhเ›oพซซ+† ‚ŒŒ ภผy๓(zนfฮœ‰ๅห—#22ŽŽŽ๘๎ป๏pๅส•ื1kึ,H ‹ทM/•ฒ)์<<<ฐvํZL™2ืฎ]ƒถถ6lllเโโ๘๚๚โฤ‰===ดjี*฿~ผผผ`dd„Š+ยฺฺ๗๎+r๎๎๎˜7o–,Y‚ใวฃOŸ>ะาา*t™œœ\นrปwGTTrrrฐlู2ฝ{๛๗๏G```พหูใื_E\\LMMแเเ€?3฿ถใวGrrฒ๔ธs็N‘BDDDๅ—l ;ooo;v &&&่ึญ:iพŠŠŠ๔ผbลŠ๖ฃฉฉ)ญชชŠœœœ"ืฝ|๙rุฃG˜>}:๎ฝซ4๕8rGๅŒŒŒPนre4o***่น3bbb๘๘xX[[ฃaร†8<:v์(-ฏP(ฐ{๗n๘๙๙!,, ?3ZดhQเถ่๋๋+=ˆˆˆHพdSุบu ีชUรเมƒแ๋๋‹ิิT\พ|ฑฑฑBเ?@ร† ฿ชo===คฆฆ8฿ำำฟ;Nž< ดjี ;vDrr2@GG๗222ฐ~ฏŠ=DFFxu~Ÿญญ-ฺตk‡ฤฤD$$$เฤ‰puuลŽ;๋ึญƒ ยยย๐w฿!&&ร‡gมFDDD๕ฒ ด„‡‡c๖์ูะะะ€‘‘~๑G899aส”)ธx๑"ผฝฝัฅK—ท๊ศศNNNprrB@@<<<๒mWนreŒ9#GŽDxxธ4}ส”)๐๑๑นน9lllค้ณgฯF@@าาา`ccƒษ“'‡••ฮœ9##ฃทฺ"""’7ูvJ็ฅ%$$@SS3฿๓ฯ๎฿ฟŸ๏๓ฦฃqใฦา๔ื‹ณ 6(-๓zปผ>ฟWฏ^่ีซWž6ตjีย้ำง ์#ทห๕ถ#ŽDDD๔iอกX"""ขOl ป7GปˆˆˆˆไNถ…ัง†…‘Lฐฐ#"""’ vDDDD2มยŽˆˆˆH&Xุษ ;""""™`aGDDD$,์ˆˆˆˆdB6ฟKลงฺzTŒส: """*eฑ#"""’ vDDDD2มยŽˆˆˆH&xŽ'H'๚ฺeฦGGี9 ฌC ""z'ฑ#"""’ vDDDD2มยŽˆˆˆH&Xุษ ;""""™`aGDDD$,์ˆˆˆˆd‚…‘Lฐฐ#"""’ vDDDD2มยŽˆˆˆH&Xุษ ;""""™(ีย.)) +Wฎ,อ.eKกP`ฤˆฐฑฑญญ-๖๏฿ฏ4ิจQ055-ฃ่ˆˆˆจ<๚`…]NNNiฎชุสbฝYYYHKK+ดอŠ+ P(pๅส\ผx๎๎๎าผ๘๘xฟ_ฉ}RRา๛•ˆˆˆdคุ…ฝ{๗เๅๅ899แิฉSJฯ/_พŒเเ`ฤลลมลลsๆฬม๊ีซัฝ{w๘๘๘ <@งNเ๎๎ŽFแ๊ีซ€ะะPxxxภษษ ๚๕ƒBก4n฿=\]]แแแˆˆ4kึ Ÿ}๖vํฺU`ฌ!!!่ืฏ<==1fฬ\ปv -Zด€››ZทnฌฌฌžžXฝz5ฦ=z4lmmแ์์Œ9sๆ@}ผ.!!&L€ญญญดmญcลŠจฉฉกrๅสR?cฦŒมฬ™3•๚ฐaœฑx๑bคคค๋5หศศ@JJŠาƒˆˆˆไซุ…† ะผysDGG#22GŽQznii‰3fภััััั=z4 66;w๎ฤ๚๕๋1rไHLž<˜7oพ๛๎;@ฯž=q๎9ฤฦฦB[[ทด^###œ? 6ฤฐaรฐkื.l฿พำงO/4วŽรนs1t่Pฌ\น‘‘‘๘๊ซฏ0mฺด—{๒ไ ถlู‚๘๘xฤฤฤเ๋ฏฟ€๛ศษษมŽ;ะถm[tํฺีซWGTT\]] /11 ,€››ฅนM›6ม5jิPj?x๐`๕ื_HLL„ปป;ˆศศศBื1kึ,H ‹BQ๙ฆ^†่ท/TUUัฃG4jิH้น]พหตnzzz€ร‡#>>^šงฆฆˆ‰‰มฤ‰‘’’‚คค$XXX SงN€๖ํกขข---888เ๖ํ…ฦนsgTจPฉฉฉ8y๒คิ_NNjึฌYเrะีีล€ะนsgดkืฎะ>:w๎Œ‹/โ๗฿Gร† ‹ฬcฎไไdX[[#223gฮฤิฉS1mฺ4,Xฐฬw+++LŸ>!!!Xทnผฝฝ1u๊T|๗๙ถ?~ผT<@JJ ‹;"""+va็ํํcวŽแ๏ฟFทnฐhัข<ฯ๓+˜*Vฌ(ญขข‚จจ(จช*8{๖์Aํฺต๑๓ฯ?ใ๙๓็า< €ชชชา฿E;—ป^…B๊ีซ#:::O555้ฐoFF@]]ุทoยยยฐu๋V๚๋ฏ๖1kึ,,Yฒ๛๗G—.]0`ภิฎ]ปะu€™™:w๎ ่าฅ † †7nเ๚๕๋จ[ท.เัฃGจWฏขขขคๅŽ?Žๅห—#""&L@๏ฝ ฬฆฆ&455 อษGฑลบu ีชUรเมƒแ๋๋‹'N(=‹‹ƒžžRSS ์ฃQฃFาล …qqq€ดด4#==›6mzวMRf``€J•*IWfeeแาฅKKKKDGGCกP`็ฮ€็ฯŸ#99;vฤ์ูณ]hXฒd ฮŸ?ฺตkร฿฿Mš4ABBB๋^D=z[[[8::โมƒHHH@BBŒฅขnpppภฯ? ???\ผxมมมจZตjฉๆ‹ˆˆˆสฏbุ…‡‡c๖์ูะะะ€‘‘เไไ$=฿ธq#ŒŒŒเไไ'''ภุุXฉ… "((‹/FVV๚๔้GGGฃ^ฝzจZตj‘็ฆฝฐฐ0 <ฃGFvv6Fบu๋bโฤ‰่ำงชTฉggg@jj*:v์ˆฬฬLจจจH็าิG. 0 @dd$ิี_ฅ6ฟuฏ“๚๙๙aส”)055ลฺตk ###์ปๆๆๆฅ"""’ !„(๋ ่รHII[#}ํฒ็ฃฃ๊gZVVv๏ถmขB… eU๙ย|• ๓U2ฬWษ1g%๓ฑๆ+๗๛;99๚๚๚…ถๅ/OษDฑล~Œ๖ํ‡ฑcว*Mkบ5~๑ว2Šˆˆˆˆจ์”๋ยฎUซVhีชUY‡ADDD๔QเกX""""™`aGDDD$,์ˆˆˆˆd‚…‘Lฐฐ#"""’ vDDDD2มยŽˆˆˆH&XุษDนพA1ฝUปnP52*๋0ˆˆˆจ”qฤŽˆˆˆH&Xุษ ;""""™เ9vŸ V[ƒ ะ.^จ›฿o0DDDTj8bGDDD$,์ˆˆˆˆd‚…‘Lฐฐ#"""’ vDDDD2มยŽˆˆˆH&Xุษ ;""""™`aGDDD$,์ˆˆˆˆd‚…‘Lฐฐ#"""’ YvIIIXนreY‡Ql็ฮƒปป;์ํํักCฅy‰‰‰ะืืGhhhEGDDDๅอ'Sุๅไไ|ะXž={V่ฌฌ, 87nฤล‹๑ฟOiธqใะขE‹๕IDDDŸถrSุปw^^^pqq““N:ฅ๔๒ๅหF\\\\\0gฮฌ^ฝปw‡๐เมt๊ิ ๎๎๎hิจฎ^ฝ  …‡‡œœœะฏ_?( @ใฦ๑๗฿รีีˆˆˆ@ณfอ๐ูgŸaืฎ]ybฬฮฮฦึญ[ัฒeK 6 ฐz๕jŒ7Njcee…๔๔t์ทžžžจUซภฤฤDjs์ุ1่๋๋รััQฉwww๔๋ืgฯž-ไ‘,”›ยnร† hผ9ขฃฃ‰#GŽ(=ทดดฤŒ3เ่่ˆ่่hŒ=‹;wb๚๕9r$&OžŒˆˆฬ›7฿}๗ gฯž8w๎bccกญญฟ[Zฏ‘‘ฮŸ?† bุฐaุตkถo฿Ž้ำงKm๎นƒI“&มฮฮ;w๎ฤิฉSV่๖\ปv hฺด)ฑeหฏŠรI“&aส”)y–นrๅ :v์ˆธปปcูฒexy๋ศศศ@JJŠาƒˆˆˆไKฝฌ(.๔ํชชช่ัฃ5jค๔ฮฮ.฿ๅZทn ===ภแร‡/อSSSฤฤฤ`โฤ‰HIIARR,,,ะฉS'@๛๖ํŽŽŽPQQ––p๛๖mภ?ƒ `ฤˆˆˆˆ€พพ~ฑถ'''gฯžล้ำง‘‘‘OOOx{{cร† ่ัฃ*Wฎœguuut้า]บtมญ[ท0pเ@Œ5 ฉฉฉ๙ฎcึฌY๙ˆDDD$OๅfฤฮวŽƒ‰‰ บu๋†ฌฌ,ฅ็‡สwนŠ+Jซจจ ** ัััาH 8ซWฏF\\†ŽŒŒ i €ชชชา฿น็์999a๙๒ๅ8qโบu๋†?๘™™™า๒jjjาก]R฿fffhาค ๔๕๕all 777\นr๓fฯž +++ฬŸ?มมม๘๗฿ฅๅŸ [[[ฬ;`ii‰˜˜ฏF๗ิ๛)ศสสย๎ปัถm[TจPกฌร๙่1_%ร|• ๓UrฬYษ|ฌ๙สNNN.๒่‡~ˆˆˆˆd‚…‘Lฐฐ#"""’ vDDDD2มยŽˆˆˆH&Xุษ ;""""™`aGDDD$,์ˆˆˆˆd‚…‘Lฐฐ#"""’ vDDDD2ก^ึะ‡ทฏk(ŒŒŒส: """*eฑ#"""’ vDDDD2มยŽˆˆˆH&Xุษ ;""""™`aGDDD$,์ˆˆˆˆd‚…‘Lฐฐ#"""’ vDDDD2มยŽˆˆˆH&Xุษ ;""""™`aGDDD$,์ˆˆˆˆdBฝฌ GHMME… ส8š๒!++ /^ผ@JJ sV ฬWษ0_%ร|•sV2kพRRR๗xaXุ}Bž…œ}Œ}}ฌ๙Bภออ fffEถea๗ QU}uJฅAฉ์ฐjjjฅาฯวW.}}}ๆฌ˜ฏ’aพJๆcฬWi๗๗)ไ์cํ ๘8๓ฅกก!}†Oะ[:tจ์๛*m๋v~ฌ9๛Xท‘๙*ปพJSiวลœษฃฏาTจ"Šs&ษBJJ œœ\๊#Zrลœ• ๓U2ฬWษ0_%วœ•Œ๒ลปOˆฆฆ&&Ož MMอฒฅ`ฮJ†๙*ๆซd˜ฏ’cฮJF๙โˆ‘LpฤŽˆˆˆH&Xุษ ;""""™`aGDDD$,์>!‹/†••ดดดPฟ~}๓ฯ?eา7kึ,xxx@OO&&&่น3ฎ\นขิ&==C‡…‘‘tuuัญ[7}๚เฝ{J}”๋| ๚$lธQhhhˆ฿~๛M\ผxQ 8PŠ”uhTซVญฤชUซฤ… DttดhถญจQฃ†xนิ&((HXXXˆC‡‰ˆˆ๑ล_ˆ H๓ณณณ…ƒƒƒhผน8ผุฝ{ทจRฅŠ?~|Ylา๓ฯ?+++แไไ$†.Mgพ”=}๚TXZZŠพ}๛ŠณgฯŠ7nˆ}๛๖‰๋ืฏKm~๑Ga`` ถo฿.bbbDวŽ…ตตตx๙๒ฅิฆu๋ึยููYœ9sF?~\ิชUK๘๙๙•ล&ฝW3fฬFFFb็ฮโๆอ›b๓ๆอBWWW๚๋ฏR›O=_ปw๏มมมb๋ึญ€ุถm›าาศOrrฒจZตช่ีซ—ธpแ‚ุฐaƒะึึห–-๛P›Yj หWRR’hผนุดi“ธ|๙ฒ8}๚ด๘๓ฯ…›››Rๅ9_,์>Ÿน:tจ๔<''G˜™™‰Yณf•aTe๏แร‡€8z๔จโี›พB… b๓ๆอR›K—. โ๔้ำBˆWชชชโ๛R›ฅK— }}}‘‘‘๑a7เIMMตkื>>>Raว|ๅ5v์Xัฐaร็+ ajj*ๆฬ™#MKJJšššbร† B!โใใq๎9ฉอž={„ŠŠŠธ{๗๎๛ พ ดkืN๔๏฿_iZืฎ]Eฏ^ฝ„ฬื›,TJ+?K–,•*URzOŽ;Vุุุผ็-zฟ๒+„฿๔ฯ?โึญ[Bˆ๒Ÿ/Šdff"22อ›7—ฆฉชชขy๓ๆ8}๚tFV๖’““•+WDFF"++K)WถถถจQฃ†”ซำงOรััUซV•ฺดjี )))ธx๑โŒร:t(ฺตkง”€๙สฯŽ;เ๎๎Ž=zภฤฤฎฎฎXฑb…4ๆอ›ธพRฮ Pฟ~}ฅœย]jำผysจชชโ์ูณnc>€ เะกCธz๕* &&'Nœ@›6m0_E)ญœ>}ะะะฺดjี Wฎ\มณgฯ>ะึ”ไไdจจจภะะ@๙ฯ—z™ฎ>ˆว#''G้‹ชVญŠห—/—QTeOกP`ฤˆ๐๒๒‚ƒƒเ๛ะะะเนชVญŠ๛๗๏Km๒หe๎<นูธq#ขขขp๎น<๓˜ฏผnธฅK—โป๏พร„ p๎9|๛ํทะะะ@`` ดอ๙ๅไ๕œ™˜˜(อWWWGๅส•e—ณqใฦ!%%ถถถPSSCNNfฬ˜^ฝz๓U„าสฯ๛๗ammงy•*Uz/๑—ต๔๔tŒ;~~~าOˆ•๗|ฑฐฃOึะกCqแยœ8qขฌC๙hนsร‡ว ฅฅUึแ” …๎๎๎˜9s&ภีี.\@hh(ห8บฯฐฐ0ฌ_ฟ๖๖๖ˆŽŽฦˆ#`ffฦ|ั{•••…ž={BฅK—–u8ฅ†‡b?UชTššZž+Œ7 MMMฑz๕j/พ๚kahhจtฅโง`๐เมยภภ@„‡‡‹ฤฤD้๑โล ฉMPPจQฃ†8|๘ฐˆˆˆžžžยำำSšŸ{๛Ž–-[Š่่hฑw๏^all,wผ้๕ซb…`พ๔ฯ?uuu1cฦ qํฺ5&*Vฌ(ึญ['ต๙๑ว…กกก๘๋ฏฟDllฌ่ิฉSพทงpuugฯž'Nœตkื–อํ;^(ชWฏ.๎d๋ึญขJ•*bฬ˜1R›O=_ฉฉฉโ๙๓โ๙๓€˜7ož8ผtgiไ'))ITญZUˆ .ˆ7ŠŠ+~ท๏(ฉย๒•™™):v์(ฬออEttดา๗ภ๋Wธ–็|ฑฐ๛„,\ธPิจQChhhˆฯ?\œ9sฆฌC๚เไ๛Xตj•ิๆๅห—bศ!ขRฅJขbลŠขK—."11QฉŸ„„ัฆMกญญ-ชTฉ"พ{‘••๕ทฆlผYุ1_y๗฿ยมมAhjj [[[ฑ|๙rฅ๙ …B๐รขjีชBSSS4kึL\นrEฉอ“'O„ŸŸŸะีี๚๚๚ข_ฟ~"55๕Cnฦ‘’’"†.jิจ!ดดดฤgŸ}&‚ƒƒ•พd?๕|9r$฿ฯญภภ@!D้ๅ'&&F4lุPhjjŠ๊ีซ‹๑Cmbฉ*,_7o,๐{เศ‘#Rๅ9_*Bผv{o""""*ทxŽ‘Lฐฐ#"""’ vDDDD2มยŽˆˆˆH&Xุษ ;""""™`aGDDD$,์ˆˆˆˆd‚…ั{’––;;;<ผฌCQbooำงO—h+++œ8qโ=ET2Wฏ^ล_|Qึa}”Xุ‘lYYYAGGiiiาด/^@OOVVVJํ*Vฌ]]]กgฯžx๖์™R_ััั%.&BCCัฉS'่๊๊พำv”ถ‹/J?พ…‡‡ฃVญZJำ๚๖ํ‹้ำงฟuŸu๊ิฉฉ)๛๏w HvXุ‘ฌUฏ^ทo—ž๕ื_จVญZžv๛๗๏ว๓็ฯq๛๖mdffbฺดiJ๓๗๎‹ึญ[—h๛฿เ็็๗Vq—Dvv๖{_วว"w[ฐrๅส2ކ่ใรยŽˆdอฯฯaaaา๓u๋ึกWฏ^ถืััAวŽq้า%ฅ้น…ห—/แ็็‡ส•+ฃrๅสhิจQพพ}๗๎ƒฃฃฃ4อสส sๆฬAบuกงง‡I“&แส•+pww‡‚‚‚คถ …“'O†……ชUซ†oฟ€ีซWฃI“&4h ฐjี*<}๚011มgŸ}†5kึธฏVนs'lllคQฬ7ธฉSงPงNaิจQP(าผล‹ฃvํฺจRฅ ‘––†œœดiำ7n€ฎฎ.tuuฑfอ„……aฺดiะีี•ถ9..จTฉ!๕ญขข‚E‹มฺฺMš4x{{ใะกCŸTQKT,‚ˆHฆ,--Exxธ077>>ๆๆๆโฤ‰ยาาRฉ๑ใว…B$''‹:ˆษ“'K๓SRR„ฉฉฉศษษK—.:t/^ผYYYโุฑc๙ฎ{็ฮยออ-O<>>>โษ“'โาฅKBSSSดhัBพ}[$&&ŠชUซŠร‡ !„Xพ|นฐณณw๎? 4bZตj•PSSซVญ999โล‹ขmถโ๛๏ฟ้้้โาฅKขZตj"&&ฆภผไnoีชUล‰'„B$&&Š‹/ธŒ‹‹‹HLLw๏vvvbๅส•B!๘ใแเเ ฤ‹/„ŸŸŸ๘๛๏…B9rDิฌYSฉฏภภ@1mฺ4้yjjช033[ถlูููbถmยยยBผ|๙R!ัฑcG‘œœ,^ผx!-งฏฏ/._พœoผDŸ*Žุ‘ฌฉฉฉก{๗๎ุดi6mฺ„nบAMM-Oป6mฺภะะ•*UยีซW1x๐`iกC‡เใใUUUTจPOž<ม7 ฎฎ^เˆ]RRRพ็ึ}๛ํทจ\น2lmmแ์์Œึญ[รยยฆฆฆ๐๑๑ALL `ใฦ5jฬออadd„I“&aร† R?5kึD฿พ}กชชŠไไd„‡‡cึฌYะิิ„ญญ-ฑu๋ึ"๓SกB\บt ฯŸ?‡ฉฉ)์์์ l;|๘p˜ššยฬฬ #GŽฤฆM›ผ:ไ<~xXZZB[[&Lภ–-[Š\wฎ;wย^zm:w๎ œ9sFj3n8่๋๋C[[[šฆงง‡ไไไbฏ‡่SภยŽˆdฏWฏ^Xฟ~=ยยย < ปgฯ$%%แล‹่น3ฺตk'อ{บ€€4kึ ]บtฅฅ%fอš•o๙^ kbb"ญญญ็y๎2๗๎C5คy–––ธw๏ž๔\๚๛๖ํHOO‡ฑฑ1 ahhˆeห–แ๛…ๆถlู‚mถมญ[ทฮs๚uJ'&&J๋4hด๎† โัฃGEฎ๛๕๘=*-ohhˆK—.ธฝนRSSa``P์๕} Xุ‘์นปปใ้ำงx๖์<<< mซฉฉ‰€€DFFโ๑ใว^]XัชU+€††ฆNŠซWฏb฿พ}๘๕ื_žงGGG๛๏ฟoณ™™n฿พ-=ฟ}๛6ฬฬฬค็***า฿ีซW‡ฎฎ.ž={†คค$$%%!55กกกEฎง~๚ุตk%,์ˆ่“ฐu๋ึbšฬสสย๚๕๋abb###\พ|๚๚๚Rsไศ\ผx …๚๚๚PWWฯ๗ะฎฅฅ%LMM๗V๑~๙ๅ—˜;w.๎ฝ‹งOŸbฺดi๐๕๕อทm๕๊ีแ้้‰‰'โล‹ศฮฮFTTโใใ ]Gff&ึฏ_””TจPบบบ๙nKฎ… โมƒHLLฤ๙๓ัณgO@1sๆLฉMLLฤฝ{ผก|๔่‘า-gLLL =o฿พ=ฮŸ?ํท#;;/_พฤฝ{ =ฬz์ุ14mฺ๊๊๊…n#ัง†…}์์์ =ฌeห–ะีีE•*Upไศl฿พ***yns’˜˜ˆฮ;C__4hP็ู}๕ีWJ็ล•ฤW_}….]บเ๓ฯ?‡œ1~๘‡……แฟรgŸ}Œ1/_พ,r=kึฌฅฅ%*Uช„`ัขEถํูณ'5jดhั๚๕๐๊สใฏพ๚ ํฺตƒพพ>|||คขฒnบ่ิฉ,,,`hhเU!x๖์Ybศ!000ภฎ]ปฐpแB˜˜˜ภสส ห—//4๎ 6`เภEnังFE!ส:"ขU๋ึญ1n84nธฤหฆฅฅมรร๓ฯGw“โ๒์ฺตkภ้ำง๓=ิK๔)caGDTˆูณgcไศ‘จPกBY‡BDT$vDDDD2มs์ˆˆˆˆd‚…‘Lฐฐ#"""’ vDDDD2มยŽˆˆˆH&Xุษ ;""""™`aGDDD$,์ˆˆˆˆdโ%kM(ก?บ๕IENDฎB`‚c4core-bm-charconv-xtoa-mega_bytes_per_second-u8.png000066400000000000000000000753321477602032300326400ustar00rootroot00000000000000c4core-0.2.6/doc/img/linux-x86_64-gxx12.1-Release‰PNG  IHDRpK ง9tEXtSoftwareMatplotlib version3.5.1, https://matplotlib.org/ุa๒ฝ pHYsaaจ?งizGIDATxœํwXื๛6๐{้HUA vคFA์5๖†FDF,ฑ%~KhlX~ฑwฃฦุ+ึh]ภ^ฑa์A๊ž๗^FWบข›๛s]{ษฮœ9sๆa€iซB‘lhizDDDDT4 pDDDD2รGDDD$3 pDDDD2รGDDD$3 pDDDD2รGDDD$3 pDDDD2รGDDD$3 p$Kฝ{๗†ฑฑฑฆ‡‘งฐฐ0( lูฒEำC)”( <}๚TำCกRขAƒpvvึ๔0J…BMใƒˆ‰‰BกภŠ+4=”8z'ปw๏.ฑฟ$ˆ ๋—_~ม๖ํ ~ัขE่าฅ *Wฎ …Bฝ{็ฺ.;Pkiiแฝ{9ๆ'$$ภะะ …C† yวัSA’““‚ฐฐฐพ๎SงN!$$qqq}%QA฿หˆˆ|๑ลฐฒฒ‚ฑฑ1\]]๑oฟ!33ณH๋Yทnๆฬ™๓.8z'ปw๏ฦฤ‰5= "*j€›6m>ŒฺตkCGGงภ๖๚๚๚Xฟ~}Ž้[ทn-ส0้%''cโฤ‰ p'N,r€{๕๊ฦ๗aฅa๖๖๖x๕๊‹ผl~฿หˆˆิญ[111๘๛๏1kึ,|๒ษ'6lFŽYค๕0ภัG‘””ค้!ศŽฏ^ฝzงe=ŠงOŸbฯž=ะืื/ฐ}ซVญr p๋ึญC๋ึญ฿i ฅ‰JฅBJJŠฆ‡๑มฝน…๚ฯ) @[[ปX๛]ผx1เุฑc1b €ํทรฯฯ๏?}บ–Ž$ฏ^ฝBอš5QณfMต?PฯŸ?‡ตต5๊ึญ‹ฬฬL๔๎ ,๕•ส–””„oฟvvvะืืG50sๆL!ิึท|๙r4jิ–––ะืื‡““-ZTค1฿บu อ›7‡‘‘lll๐ำO?ๅXJฅยœ9sPปvm bลŠ0`^ผxกึฮมม_|๑Nœ8ฯ>๛ ๘ไ“Oฐjีช๋‹‹รˆ#เเเ}}}ฺฺุขWฏ^9ฎ!SฉT˜-ดตตลˆ#คiยะะP\ฝzU!ฤฉSงDำฆMฑz๕j้%„*•J4jิH( ัฏ_?1|ัฆM@ >\m]^^^ขw๏โื_๓ๆออš5ฤ๙๓ gPP000ีชUb๙โ‹/พฤ?จึถ_ฟ~BGGG๔๏฿_„††Š๏ฟ^ ///‘––&ตณทท5jิ+VcฦŒ๓็ฯŸ~๚ฉP(โย… RปฤฤDแ์์,ดตตEลขE‹ฤฯ?,ผผผฤ๙๓็…B9rDขN:โื_!!!ขL™2โณฯ>SŸฟฟฟฐฑฑvvvbิจQbผyยษษIhkk‹ 6+++"ๆฬ™#*Uช$ฬฬฬDBB‚ดๆอ›…›››?~ผXฒd‰3fŒ([ถฌฐททIIIRปๅห— ยษษI๘๛๛‹y๓ๆ‰ฉSง !„˜0a‚ ž{ฟทดดC† ฟ๖›จWฏž ๏Oj—™™)š5k&ส”)#†./^,† "tttDปvํrŒฉVญZขB… bโฤ‰bม‚โ๙๓b€hธฑXฐ`Xฐ`2dˆ่าฅKž5{๙๒ฅXดh‘ :t่ }###……฿wsณdษ@t๎Y,^ผXฬ;W|๕ีWb่ะกB!"##E๗๎๑๋ฏฟJ๋~๙๒eพ™=๏อŸฯย์!Dืฎ](,X บvํ*r๔ูฃGกงง'FŽ)–-[&ฆM›&ฺดi#ึฌY#ต)ส๏ {{๛\…ฟฟฟ๔๖ํ€Xพ|น4-๛oAํฺตE฿พ}ลขE‹DงNฑpแB!Dม฿ห์y๚๕—.]111bัขEBWWWฬ™3งภ๑gฟฟpwwๅห——ึฑmถB/_T p”ร่ัฃ…–––8v์˜ุผyณc')pŒAAA€๘ๆ›oคi*•JดnZ่้้Iกใ๘๑ใ€Xปvญฺ๒{๗๎อ1^วŽ“ฆ=~X่๋๋‹oฟVš6~x@lบ5วธT*•โ๕/ฏZตj‰ิิTiนs-M๓๗๗ฤบu๋คiWฎ\„–––8}๚ด4}฿พ}9~ๅVวฟ[ซVญ’ฆeธz๕๊‰ŒŒ ต๖oธห—/ แๅๅ%ž?ฎึฎฐฟ”322„ฃฃฃฐทท/^ผศตFBแ๎๎.,--ลณgฯคi‘‘‘BKKK๔๊ี+ว๘๚๖ํซึW‡„………๔๊ีซ€˜7ožZปAƒ cccฉV๏ฒ_์ป7วvๆย R˜๗ไษ๑w฿‰ชUซJ๓ผผผDŸ>}„ขHNOOOํ็/222GญŠเ๔๕๕ียสโล‹aeeฅ๖ŸŒัฃG jmณ๗๛YณfIำRSSฅ}";Dฏ^ฝZhii‰ใวซญ?44T'OžT“–––ธx๑ขZaร† SSำ๛}Ažอฬฬ ๏>f€ ~๚้'ตeณ๓œ-ฟ๏eFF†2dˆะีีกญญ--ZTเุ฿ึบu๋\†>žBฅBBBPปvmaะ A๐๗๗วะกC ต์๎ปกญญฃท฿~ !๖์ู#M{๓ะt||<ž>} บu ๑๑๑…Z฿›wเeŸVHKK“N3nผfffhฺด)ž>}*ฝ๊ิฉccc9rDญ?'''ิฏ__z_กBิจQทn’ฆ๑วpssC‡rŒ็ํำL}๚๔žžž๔>ป๏7๛cccH๏kิจsssิชU า๔์ฏ฿\อ:ฆงงใูณgจZต*ฬออีNid๋฿ฟžื\ธppppภมƒQถlYต๙ 4€ขภ;ฯŸ?ทoc๘๐แ9NKdื่แร‡P*•่ป7ส•+'อwuuEำฆMฑ{๗๎ซฝฏ_ฟ>ž={†„„@๕๊ีแ๎๎Ž7Jm233ฑeหดiำFชUQ๗ GGG4o<฿mPz๔่7nเ์ูณาฟE9}šญI“&จRฅŠ๔ีีฆฆฆ9๖ลขhธฑฺ)ข์ณSงN011ษ1ํu้่่`ภ€า{=== 0?FDD€ฌ๏UญZตPณfMต๏UฃF ว๗ส฿฿NNNjำฬออ‘””„ผ๓ถพ้]๖ทวs}œ={๖วvๆง Ÿ์Sฐƒ Rk๗อ7฿ไ่หgฮœAlllž๋+์๏Šโ’๖v฿ึึึF•*Uะผysฌ\น7nD›6m๐อ7฿้&ฅŽrะำำร๏ฟŽทo#11ห—//๔u;w๎ฺ/oจUซ–4?ษ“'ัคI้๚‘ *`ฬ˜1Pจงฅฅ…O>๙DmZ๕๊ี@บVไ๚๕๋ˆ‡ฅฅ%*Tจ ๖z๙๒%?~ฌถ|ๅส•sฌงlูฒjืEผyณะฯฏzปฟ์@๔๖uVถถถ9jlff;;ปำ^ีซW?~ผtอa๙๒ๅQกBฤลลๅZGGGว<วฆM˜˜˜`฿พ}055-ฤๆ๎ๆอ›oฒ๗…5jไ˜WซV-<}๚4วM…ฉgทnp๒ไI๛ ีชUรเมƒq๒ไษ"กจ๛dA?;w๎––VŽ~ซVญšฃฏ้ำงใย… ฐณณรgŸ}†๗๚ภ๛200ฎqหV”}{๊ิฉ˜6mึฏ_^ฝzกkืฎุถm๊ีซ‡มƒ###ใC ๛ฝ•ฬ[U่ฝํท’’‚๋ืฏ๛ฐ›7oขqใฦจYณ&fฯž ;;;่้้a๗๎๘๕ื_กRฉŠe=*• –––Xปvmฎ๓฿กฯ๋ศ”x๋ฦˆย*lyต+ฬ๒฿|๓ –/_Žแร‡รววfffP(ศตŽ๙]”ฉS'ฌ\นkืฎU;2๒_Q˜zt๋ึ ฃGฦๆอ›1|๘plฺด fffhัข…ิฆจ๛EQ.dz๔่E‹มฤฤบuƒ–Vั๏]˜ฺๅ๕ตผž…๕>๛maฉT*ธธธ`๖์ูนฮ;,ๆ๖ฝฒดด„Rฉฤพ}๛ฐgฯ์ูณห—/Gฏ^ฝฐrๅส"้}ีชU Wฏ^ลฮ;ฑw๏^๑วXธp!ฦ_่ว3uŸ,ฮ๏Iืฎ]Qฟ~}lถ ๛๗๏วŒ30mฺ4lบ-[ถ,r๙ํw…นใ๔}๏J]ธp!5j”ใแ๐mถลศ‘#“kี48ส!** ?๔๚๔้ฅR‰~๚!::Z๚_4๗œฝฝ=<ˆฤฤDตฃpูwัู๚๋/คฆฆbวŽj3|๛tH~T*nบ%Oฎ]ปาi*Uชเเมƒ๐๕๕-ถ?ยUชTม… ŠฅฏโฐeหaึฌYาด”””wz่Œ3 ฃฃƒAƒมฤฤไNีNี]ธpMš4ษตM๖พp๕๊ี๓ฎ\น‚๒ๅห็8:SŽŽŽ๘์ณฯฐqใF 2[ทnE๛๖ํีQ\๛EQ๎(}=z๔ภ๘๑ใ๑๐แCฌ^ฝ๚ƒญงlูฒน๎7o9/NฑฑฑHJJR๛>็๖3‰ฦฟWฝ๕๔๔ะฆMดiำ*• ƒ ยโล‹๑ใ?ๆ๙ว9ฟ฿sภ๛ํปFFF่ึญบu๋†ดด4t์ุ“'Oฦ่ัฃa``๐ั๖ญl๖๖๖PฉTธ}๛6ชUซ&M๛ฎ๙lึึึ4h „วใำO?ลไษ“฿)ภๅท฿ฝ}–ๅ]ๅWฯGๅ๚Ÿ”๔๔t(าธ๙}ใ)TR“žžŽฝ{รฦฦs็ฮลŠ+๐่ั#Œ1Bญ]๖/งท่Zตj…ฬฬLฬŸ?_m๚ฏฟ …B!pg้อลววc๙๒ๅE๏›๋B`๙ะีีEใฦdO133?sŽe322)ไt๊ิ ‘‘‘ุถm[Žy๏zค๎}hkk็X๏ผy๓Šq ๋—ฯ’%KะนsgaวŽj๓ ๛h€O?ŽŽŽ˜3gNŽgีฺฺ๎๎๎XนrฅZ› .`hีชU‘วŸญ[ทn8}๚4~w<}๚Tํ๔)P|๛…‘‘ัGyR~•*U0gฮL™2Ÿ}๖ู]O||<ขขขคi>ฬu_/า3ธ -- ‹/F… PงNY฿ซ`้าฅ9–๕๊Uกže๘์ู3ต๗ZZZpuu€"yS™2eไ=๗พ๛๎ใัำำƒ““„Rhศ๋w์‡’}็ย… ีฆฯ›7Oํ}fffŽK3,--accฃVหข|ธ๔ƒะฌY3้ฤ ภห—/ฑt้RXZZโแร‡…ซ๖๎‹   x{{cฯž=ุตkฦŒ#๓๗๗ว€0eส(•J4kึ บบบธ~:6oŒนs็ช=ฌ0F…-[ถ K—.่ท/๊ิฉƒ็ฯŸcวŽ …››[‘๚{__|๑Vฏ^ 333899แ๏ฟฦมƒaaa๑Niiiaอš5h฿พ=บvํŠปwKื\๓ฯ?hุฐ!&L˜๏ลษZZZXดhฺดiwww๔้ำึึึธrๅ .^ผ(ขŸ1cZถl |๕ีWx๕๊ๆอ›33ณ๗บ๘นkืฎ๘๎ป๏๐w฿ก\นr9Žื~QงN_~๚๕๋‡็ฯŸฃQฃFฐตตล;w0o<ธปปKื็ๆฦะะNNNุธq#ชWฏŽrๅสมููฮฮฮ๏ต๏6kึ VVV๐๕๕EลŠq๙๒eฬŸ?ญ[ท–ฮ\dŽ;v, ซซ‹6mฺผำQ้ยจSง:u๊„9sๆเูณg๘๓ฯq๔่Q้ˆh๖‘ฅฤฤDฺฺุขs็ฮpssƒฑฑ1<ˆณgฯช(์๏ ๋๛ณeหดhั]ปvลอ›7ฑfอš"ง‚ไ๗ฝแ‡ะณgOx{{ใ๋ฏฟ†กก!ึฏ_ˆˆLš4Iฺ ฃN:ุธq#FŽ ///ฃM›6ลถj>สฝฎ$ BGGGํัBdbํๅๅ%lllคGBdddˆoพ๙FTจPA( ตG $&&Š#Fกซซ+ชUซ&fฬ˜ก๖๘!„ุฑc‡puuยมมAL›6M๛๏y:ฆ   add$nผ)=#ชbลŠbย„ "333G๛%K–ˆ:u๊CCCabb"\\\ฤ๗?+ตฑททญ[ทฮฑ์ทฒ !ฤณgฯฤ!CDฅJ•„žžžฐตตAAAา3ตฒoก๓นcBไ~ผฟฟฎศkRD!„ฮ๙ัžRฉ„‡‡ึฌYƒ/ฟRำรก7๐8"""ส๕3~็ฬ™---๘๙๙i`D”^GDDD˜>}:"""ะฐaC่่่H\๙๚๋ฏs<ฎฅดyนฺMoำึึฮ๑๘กงP‰ˆˆภฤ‰q้า%ผ|๙•+WF`` ฦŽ า}ผงAƒ8z๔hž๓ํํํฅ‡O, pDDDD๙ˆˆˆศ๗“ แ๋๋๛GฤGDDD$;ผ‰ˆˆˆHfเˆˆr๏=๙ฦหยยย P(๖}5hะฮฮฮ๏?จ€ฯ?๛฿4= ข"c€#ขbลŠP(P(8qโDŽ๙BุููAกPเ‹/พP›—ฝ\๖หศศNNN˜4i’““s]_tt4 ๙็Ÿ๗๛O?oo๏~MKi๖ห/ฟ`๛๖ํ9ฆŸ:u !!!์#ฅพ{,Xฐ๛๏้Ÿ่Ca€#ขสภภ๋ึญห1่ัฃธพฺ‡ฬฟฉiำฆXฝz5Vฏ^Yณfมรร?๘#‚‚‚rmฟkื.XZZยหห๋ฝฦ๛ไษฌ\นมมม๏ีฯŸŸ^ฝz๕Ÿ}žW~nโฤ‰,ภตkืฆฆฆ9>”่ฟฎt฿LD\ซVญฐy๓f๖oj"Xทn๊ิฉ“็‡]Wฏ^={๖”#-- [ทnEJJ ิฺ๏ฝ-[ถ”>ณ๑]ญYณ:::๎๓ ฿ARRา{ฆ––VŽš•fษษษ(Sฆ ดดดะนsgฌZต 'N|๏‡่cแ8"๚ บw๏Žgฯžแภาดดด4lูฒ=z๔(R_VVVP(9žI‡SงNกu๋ึาด 6 N:011ฉฉ)\\\0w๎ืฑ}๛vx{{รุุXmz๖u_QQQ๐๗๗G™2ePตjUlูฒ@ึEoooขF8x๐`ŽพฯŸ?–-[ยิิฦฦฦhธ1NŸ>ญึ&๛ิ๓ัฃG1hะ XZZยึึVšฟgฯิฏ_FFF011A๋ึญq๑โลท+ทkเฎ_ฟŽN:มสส ฐตตE@@โใใ ์ศzดBบuahhGGG„††ๆh“ššŠ & jีชะืื‡๗ฟ!55UjฃP(””„•+WJงอ{๗๎Œ5 เ่่(อ{๓y[kึฌA:u`hhˆrๅส! ๗๎SC๖๗.""~~~(Sฆ ฦŒ#อoฺด)๎นฅRYจํ&๚/`€#ขสมม>>>Xฟ~ฝ4mฯž=ˆG@@@žหฅคคเ้ำงx๚๔)๎นƒu๋ึaๅส•่ัฃGŽทo฿>( 4kึ @ึIปw๏Žฒeหbฺดi˜:u*4hPเM ้้้8{๖,>๔ำ\็ฟx๑_|๑ผฝฝ1}๚t่๋๋# 7nD@@Zตj…ฉSง")) ;wFbbขด์ล‹Qฟ~}DFFโ๛~๑Gพ} 4ภ™3grฌkะ Aธt้ฦ~๘ฐz๕jดnฦฦฦ˜6m~๑G\บt ๕๊ี+๒CDำาาะผysœ>}฿|๓ ,X€ฏฟทn*ิ้ส/^ UซVจSงฆOŸ[[[ 8ฟปิFฅRกmถ˜9s&ฺดiƒy๓ๆก}๛๖๘๕ื_ัญ[7ฉ๊ีซกฏฏ๚๕๋Kงอ €Ž;ข{๗๎€_Uš—ฤ๛ษ“'ฃWฏ^จVญfฯžแร‡ใะกC๐๓๓หฑ ฯž=Cห–-แ๎๎Ž9sๆ aร†าผ:u๊@‰บi…J"|๐=Qก-_พ\gฯž๓็ฯ&&&"99Y!D—.]Dร† …Bุ‹ึญ[ซ- ืW๛๖ํEJJJŽu ้ฐaร„ฉฉฉศศศ(า˜oธ!ˆy๓ๆๅ˜็๏๏/ˆu๋ึIำฎ\น"---q๚๔ii๚พ}๛ฑ|๙riZ๛๖ํ…žžžธy๓ฆ4-66V˜˜˜???iZv๊ีซง6ฤฤDann.๚๗๏ฏ6ฎW˜™™ๅ˜ถ#GŽโศ‘#B!ฮŸ?/ˆอ›7็_”\dืbึฌYาดิิTแ๎๎.,--EZZšBˆีซW ---q๘qตๅCCCq๒ไIiš‘‘‘ สฑฎ3fโ๖ํjำcbb„ถถถ˜} mmmx{{ใศ‘#EฺV333YG/๓บณ7?:::0`€๔^OO ภใวุผy3jีช…š5kชนQฃFPไ1ฟi๋ึญPฉTฺ่ตซZ฿VVVจVญZŽพ๕๕๕ังOŸ<๛+[ถlžืc๑&"๚เ*Tจ€&Mš`บuHNNFff&:w๎œ๏2ถถถhาค‰๔พmถฐฐฐภw฿}‡;wJ7œ={OžŠ=z ๘๗฿ัฒeK˜››นฦŽ;&ธปwรมมNNNR;KKK(•J์ท{๖์มž={ฐ|๙r๔๊ี +Wฎฬณ ศ๓3฿<"V˜้yมย044T{ฏRฉd]/fee•ฃป|ุ๘ฌYณะปwo๙็Ÿุฟ?†Š)Sฆเ๔้ำj7Nผ+•Jฬž=;ื๙o฿ข๖ญP(ฐgฯž\๋๖M(oื๓mqqq(_พ;‡่cc€#ขขC‡0`NŸ>7พS€—/_Jำvํฺ…VญZๅhซงง‡6mฺ M›6PฉT4h/^ŒUซVอตส•+ระะทo฿~ง๑ๅฅB… (Sฆ ฎ^ฝšc•+W ฅฅU`˜ฉRฅ €ฌp๚ๆ‘ษ๗ๅโโŒ7งN‚ฏฏ/BCC1iาค|—‹อ๑x“kืฎศบq%{ฬ‘‘‘hธqGท๒šŸื๔*Uช@GGG้ศ฿ปz๐เาาาPซVญ๗๊‡่cโ5pD๔QcัขE y็gฌ๕ื_777ภฃGp๎9ตำงภ๋kูฒiiiมีีิ_๑6]]]xzz"<<ฦ—mmm4kึ ๙งฺข=ยบu๋Pฏ^ฝO6oฆฆฆ๘ๅ—_žžžc“'OŠ4ฆ„„)gsqq––Vพ5ส–‘‘ล‹K๏ำาาฐx๑bTจPAบซณkืฎx๐เ–.]šc๙Wฏ^!))Izodd”๋ฏู๑ํy;v„ถถ6&Nœ˜ใHง"ว>Ÿ์k๖๊ึญ[่eˆ4Gเˆ่ฃษ๋Srsํฺ5ฌYณ@ึCWOŸ>•+Wขjีช u๚ิภภ@ํ‘ะฏ_?<5‚ญญ-๎นƒy๓ๆมฝภฃ,ํฺตรุฑc‘Pไ๋ส๒3iา$8p๕๊ีร Aƒ ฃฃƒล‹#55ำงO/pySSS,Zด๘๔ำO€ *เ๎ปุตk|}}1B็๐แร2dบt้‚๊ีซ###ซWฏ†ถถ6:u๊Tเ๒666˜6mbbbPฝzulธJฅK–,‘ฎ? ฤฆM›Œ#GŽภืื™™™ธrๅ 6mฺ„}๛๖มำำ@ึฃ<<ˆูณgรฦฦŽŽŽ๐๖๖–ยเุฑc]]]ดiำUชTมคI“0z๔hฤฤฤ }๛๖011มํทฑm6|๕ื๘๎ป๏ U‹ rๅส๐๐๐(tˆ4Ns7ภQI๖ๆcD๒S˜วˆhkk [[[๑๕ื_‹GIํ:w๎,Zตj•ฃฯ-[ถˆfอš KKKกงง'*Wฎ,  >|Xเธ=z$tttฤ๊ีซีฆ๛๛๛‹ฺตkjู0x๐`ตi็ฮอ›7ฦฦฦขL™2ขaร†โิฉSjm ช‘#GD๓ๆอ…™™™000UชTฝ{๗แแแ๙nืนu๋–่ทฏจRฅŠ000ๅส• 6ฬท!^ื"<<\๘๘๘aoo/ๆฯŸŸฃmZZš˜6mšจ]ปถะืืeห–u๊ิ'N๑๑๑Rป+Wฎ???ahh(จ=Rไ็Ÿ•*UZZZ9)๒วˆz๕๊ ###add$jึฌ),ฎ^ฝšcผนษฬฬึึึbธqn7ั‰Bˆ๗ธส–ˆHC222`aa)Sฆ`ะ Aลฺ๗W_}…kืฎแ๘๑ใลฺ/๗l฿พ=z๔ภอ›7ammญ้แษาใวฑpแB 0 ุ๐ฝ{ีซWวกC‡เ๋๋[ฌ}ำ‹๊ืฏ_จำุD% pDDDD2รปP‰ˆˆˆd†ŽˆˆˆHfเˆˆˆˆd†ŽˆˆˆHf๘ ฿HฅR!66&&&pf"""™B 11666ะาส\ ๛^MDDDšs๏=ฺฺุๆ†ฎ211พ}ๅส•ำ๐h4+==๛๗๏Gณfอค๗)X‡ืX‹,ฌรkฌEึแ5Mี"!!vvvา฿๑0ภ•@ูงMMLLŠ๕ณๅ(==eส”ฉฉiฉ…ฤ:ผฦZda^c-ฒฐฏiบ…น‰71ษ ‘ฬ0ภษ ‘ฬ0ภษ ‘ฬ0ภษ ‘ฬ0ภษ ‘ฬ0ภษ ‘ฬ0ภษ ‘ฬ(„Bำƒ โ•333ิ๗'TzฦšŽF้i Œv~‰)Œ‘ฆRhz8ร:ผฦZda^c-ฒฐฏๅW‹s?6๚`๋อ๛SSำ|๒‘ฬ0ภษ ‘ฬ0ภษ ‘ฬ0ภษ ‘ฬ0ภษ ‘ฬ0ภษ ‘ฬ0ภษ ‘ฬ|ะืนsg|๙็ล๏Ž;๐oฟถo฿Ž7nผwŸ {๏~ +** pww‡ฟฟ?๎฿ฟัึMDDD๒๖ม ญญ]์fffขmถ:t(€โ pล)==III๙ถ?~<&MšฅR‰Ž;โื_ฤลล}„‘œK€[บt)\\\เๆๆ† & ==ฟ๒ ฦWจๅ๛๗๏#GŽค0„SงNaลŠ่น3ˆ+Vเ‡~ภ™3gฐcว <๎๎๎HLLฤ?ƒ๚๕๋ใำO?E—.]œœœ็z๑GิจQอš5รณgฯค้ปvํย็ŸwwwCฅRๅบo‹‰‰ม˜1cPณfM\ปv เเเ€””ฦ-!!A๚ืฺฺฐ~zธนนaม‚า‚คฆฆ"!!AํEDDD%ื{ธจจ(,Xฐ'OžDdd$† †ูณg#((&&&jmCCC Gฟ~พพพ8u๊ งง‡SงN"""PงNi=;w๎ฤบu๋คผฝฝัถm[,XฐJฅ๚๚๚5jv์ุs็ฮแณฯ>รย… s๗?ƒเย… Xพ|9NŸ> x๚๔)ๆฬ™ƒฐฐ0(•Jhkkc๋ึญนn'uDpวŽhีช:v์ˆJ•*แนs๐๐๐ศทnSงNลˆ#`kk‹-[ถ`ศ!€โฯ?ฤร‡แ้้‰๛#"""฿พฆL™333้egg—o{"""’ท๗paaa€ฉฉ)เีซWุฟ?‚‚‚rด Fpp0ภำำห–-เNž<‰ฟํทวฃG๐่ั#˜››C__ะขE‹๐mWฏ^ETT6lwww,_พw๎ษตํฉSงะฑcG่๊๊ขRฅJจ_ฟ>เ๏ฟFTT”t๎เมƒธu๋VŽํ,Wฎ }๛๖>|8ฦŒƒs็ฮa๐เม033+ฐn .ฤ๏ฟŽ๛๗๏ฃkืฎ˜8qข4ฯมม“&MยฅK—เ๋๋ ???ฬš5+ฯพF๘๘x้u๏ฝืODDD๒ฅS*•J\บt ŽŽŽศศศภ“'Oะถm[์ุฑ#ฯeชUซ†7nเ๘๑ใhฺด)ฎ_ฟŽีซWฃnบR›2eสธn!ผผผฐBUกPไ๘Zvํฺaษ’%jmณošx”)SฐpแB๔ํ:t@ฟ~PญZ5iพถถถt 655UšพeหฉฯŽ;b๐เมj?~K–,Axx8ฦŒƒž={ๆน๚๚๚Rะ%""ข’๏ฝภ5jิ6lฎป๒๑๑มร‡ƒ'Nภรร#฿๐–อษษ ๋ึญรgŸ}___ฬ™3พพพ.gbb‚ฤฤD@อš5q๛๖mDGG’’’๒ผมกnบุถmาำำ‹ใว>s:tHบ+๔ูณgธ~Žํ|9ภูู .ฤ๙๓็QญZ5๔่ั 6DLL ภJฅ*• ;w๎”ึojjŠs็ฮ:„๊ีซ๖๏฿gggฬœ9ปwวล‹1v์XTฌXฑภZQ้๐Gเœ1dศิญ[ฺฺฺ่ะกBBBrm›}[pp0ยรรชv๕แร‡044„ฏฏ/•J !„ะ๔ จx%$$ภฬฬ uฦ •žฑฆ‡ฃQzZฃ_bสcคฉ/PBฑฏฑYX‡ืX‹,ฌรk๙ีโ>ุzณ~วววKื็…Ÿฤ@DDD$3ล~ร‘ทททฺ @ึcD๔๔๔44""""ขwW*™3g4="""ขbรSจDDDD2รGDDD$3 pDDDD2รGDDD$3 pDDDD2รGDDD$3 pDDDD2รGDDD$3,ิ(๛ณิž>} MGฃาำำฑ{๗nดjี บบบšŽฦฐฏฑYX‡ืX‹,ฌรkšช? •ˆˆˆจc€#"""’8""""™แ5p%P๖9๔k†N3MGฃด‘‰FZ7qXU™ะึ๔p4†uxตศย:ผฦZda^+จ๓;ิ๚ ๋ๅ5pDDDD%‘ฬ0ภษ ‘ฬ0ภษ ‘ฬ0ภษ ‘ฬ0ภษ ‘ฬ0ภษ ‘ฬศ>ภu๎Ÿ๙;/‡eห–ใˆ '##puu…ณณ36n๘ัว@DDD๒$๋wเภhkkฟW*ภฝx๑"฿๙;w๎„JฅBTT>Œ#Fาาาœœ\์ใ!""ข’C6n้าฅpqq››&L˜€๔๔t๒ห/7n\ก– C@@€๔พAƒธrๅ ฦŽ‹่่hธปปcฦŒHNNF๗๎แโโ___\ปv ๐๗฿รววhิจ>|˜c)))Xนr%๊ึญ‹3fBBB*ตฑฒฒ’พNJJ‚Jฅยห—/QฑbEYมฯููC‡ลฅK—Š^("""*๑t4=€ยˆŠŠย‚ p๒ไI˜ššโ๙๓็˜={6‚‚‚`bbขึ6;,#<<กกก๙a›|8ฦŒƒs็ฮa๐เม033+p›.\ˆ฿๗๏฿Gืฎ]1qโDižƒƒ&Mš„K—.มืื~~~˜5kVฎŒ=๑๑๑า๋ฝ{ฎ›ˆˆˆไK6๎mJฅ—.]‚ฃฃ#๊ีซ‡๓็ฯฃmถ.}}}<|๘ฐH๋KIIมศ‘#ฑkื.DEEกK—.HMMuฌE‹่ท/พ{\ฟ~]mYmmmจT*–€-[ถ I“&€Ž;โฬ™3jห?~}๚๔มดiำ0fฬ๔์ู3ืฑ้๋๋ริิTํEDDD%—l\ฃFฐaร้๚.<|๘1118qโ<<<ฐcวŽ|๛HMMลภq๐เAปw๛๗๏˜˜˜ 11`nnmmm้๔่๚๕๋Qฏ^=คคค@KK eห–ล๓็ฯ๑ื_I:;;cแย…8<ชUซ†=z aร†ˆ‰‰ุCฉTBฅRa็ฮาrฆฆฆ8w๎€ฌฃ{ีซW์฿ฟฮฮฮ˜9s&บw๏Ž‹/b์ุฑจXฑb1T’ˆˆˆไNGำ(,ggg 2u๋ึ…ถถ6:t่€\f_Œ๐๐p„††bูฒe๘้งŸะกC8;;cษ’%hำฆ ฮœ9ƒ6mฺ s็ฮXทn6lุ€฿_}๕RSSแ๋๋‹€€hkkฃ{๗๎จUซlmmแใใ“cฝFFF่ืฏ๚๕๋‡ˆˆ่่d•wธq่ีซส—/777ฉขE‹ะทo_!PกBฌZต `aaฝ{๗ยึึถ˜ซHDDD%B!4=*^ 033ร‚C‘041ื๔p4K•‰rFแน•+ ๕~›‘5ึแ5ึ" ๋ ้้nปwฃUซVะีีี๔p4&==u๘4U‹์ฟ฿๑๑๑^%›SจDDDD”…ŽˆˆˆHfเˆˆˆˆd†ŽˆˆˆHfเˆˆˆˆd†ŽˆˆˆHfเˆˆˆˆd†ŽˆˆˆHfเˆˆˆˆd†ŽˆˆˆHfเˆˆˆˆdF6fOEือญ,,,4= ส๚<ป(๔ิถTถ๋๐k‘…ux-==]ำC *2#"""’8""""™a€#"""’^W‚Eฤ$ภไ…ถฆ‡กQชฬ ภ?ทโกฅ]zwwึแ5ึ" ๋๐k‘…ux-ฟZ๘T5ืภˆrโ8""""™a€#"""’8""""™a€#"""’8""""™a€#"""’8""""™a€#"""’8""""™a€#"""’8""""™a€#"""’8""""™ัH€๋น3>๓ลฤฤ`ห–-ลถ„††[๏kิจQpvv†““ๆฮซ้แ‘L|๔wเภhkkชmqธ๗‘™™Yค๖/^ผศwพRฉฤ้ำง…๐๐pฬœ9 …Z–ˆˆˆJทเ–.] ธนนaย„ HOOว/ฟ‚qใฦj๙ฑcวb฿พ}pwwวฺตk๑ไษดlู...hผ9=z”็ฒWฎ\ฟฟ?เํํิิT@DD๊ีซ‡*Uช`€›7oข^ฝz๘๔ำOแใใƒห—/VฌXฮ;ร฿฿8rไ\\\เ๎๎__฿๋ฬศศภึญ[ัฌY3 2D๊ใ‡~ฺ888 %%’’‚๔๔tผz๕ &&&ะืืxzzขOŸ>8sๆLก๊”ššŠ„„ต•\:ชใจจ(,Xฐ'Ož„ฉฉ)ž?Žูณg#((&&&jmณOk#<<กกกXถl&OžŒะะPlุฐ0hะ 4mฺ#GŽฤย… 1v์X,[ถ,ื๕b๚๔้hุฐ!โใใกซซ ธs็Ž= ฅR‰กC‡ขYณfฐถถฦกC‡ ฏฏ๙cฦŒมถmคํˆˆˆ€‰‰ ฺดiƒ฿~๛M๊3ฝ{๗ฐt้Rlุฐ๕๊ีรO?Tเ)bwww๘๛๛รฦฦiiiXดh‘เฎ^ฝŠฟ๚ !!!x๒ไ ๚๗๏/ฟฦฦฦน๖5eสLœ8ฑ o •์\XX`jj x๕๊๖๏฿   mƒƒƒ ๋่S^ก์ิฉSู่ณ' gฯž8y๒dฎํ˜˜ˆ† ฬฬฬ ฅ•ตฉญ[ท†ถถ6<<< ๋VŸ>}เ์์Œ๛ใาฅKR_-Zดgบu๑ฟ๓็ฯ—Ž่๓ฯ?pttDrr2ยรร๑๛๏ฟ๊๚พ7nเ๎ปˆล70iา$<{๖  ฃฃƒ:`ฯž=๘ใ?๐วภฺฺ:ฯพF๘๘x้u๏ฝืODDD๒๕ัฎS*•ธt้Qฏ^=œ?mถXซ—dๅาาา’ฎk›3gjิจ่่h:tH gPฆL้๋ัฃGc้าฅx๑โผฝฝ๑์ู3ธบบbษ’%8qโ:u๊„M›6!--MZF[[*•JzŸ๗ถmเใใ}}}TฌXnnnธx๑ขิ๎ูณg˜3gฺถm ###lผ9฿m255U{Qษ๕ม\ฃFฐaร้z,<|๘1118qโ<<<ฐcวŽ|๛011Abbข๔พnบุธq#`บuจWฏ^ฎห™ššยฬฬ GŽฤววซ…จท%$$ภสส …+Vฌศณญ[ทเ๎๎Žธw๏ ะทo_œ>}3fฬภแร‡QณfMฬš5 `ooศศHYG๋ฒฏณตตลฑcว Rฉ˜˜ˆs็ฮกJ•*€=zภวว ุณgถm†-Zไ[+"""*=>X€svvฦ!CPทn]ธนนแท฿~หณmhhจt\xx8๚๕๋puuลซWฏค›BBBฐ{๗nธบบb๋ึญ˜4iRž}ฎZต &L€››Zดh๔๔๔<c๙pwwW Œo›={6jืฎ WWWิฌYnnnj๓Šจจ(ธปป๊ีซccc899แ๏`gg่าฅ ฬฬฬเโโ‚ฯ?#FŒ@ฅJ•dธ+Wฎ`๘๑ฐฑฑษsภMž<๎๎๎jฏสร‰ˆˆˆ>ู#;v,ฦŽซ้a}4ฒ?GDDDTฺ0ภษ ‘ฬ0ภษ ‘ฬ0ภษ ‘ฬ0ภษŒ์ไKyซใ` sMCฃาำำฑ๛ ๐ู'fะีีี๔p4†uxตศย:ผฦZda^“C-xŽˆˆˆHfเˆˆˆˆd†ŽˆˆˆHfx \ ๖8ธาiš†Fe๊–โQP%hgคhz8ร:ผฦZda^c-ฒ”_๛LำC "เ8""""™a€#"""’8""""™a€#"""’8""""™a€#"""’8""""™a€#"""’8""""™a€#"""’8""""™a€#"""’8""""™๙`...ห–-หsพ••U}ฌXฑOŸ>-ถ1fKTTผฝฝแ๎๎ฟ_ำC""""™ะX€+Œโp๏#33ณะmำำำ‘”””o›๑ใวcาคIP*•ุ่ฑ#~๕WYu#"""สOฑธุุX๘๚๚ยฎฎฎ๘๖o wwwฬ˜1III่ะกœœœ\`ถmCxx8:t่€๚๕๋–/_ggg8;;cษ’%๙.?qโD8;;รีี‹/–ฆ6 ตkืFปvํคP6aยxyyมููcฦŒ‘ฺ:88`๔่ัpwwว‰'ะณgOิฎ]...Xทn]Žuฦฤฤ`ฬ˜1จYณ&ฎ]ป&๕‘’’ +๐รR๛„„้_kkkภ๚๕๋แๆๆ† H๓ ’ššŠ„„ต•\ลเึฏ_&Mš@ฉT"""“&M‚‹‹ ”J%F… ภัั—.]Bห–-๑่ั#iYwww้๋~๚Iมอำำถmร๑ใวq}Lž<'Nœภ฿ูณg#&&&ืฑ์น'Ožฤนs็….]บ=z„N:แโล‹PฉT8|๘0€ฌPw๖์YDEE!** ‘‘‘R_P*•066ฦฝ{๗p๑โEDGGฃu๋ึฒŽฬํุฑญZตBวŽQฉR%œ;w๙ึk๊ิฉ1blmmฑeห 20pเ@๙็Ÿx๘๐!<==ัฟDDDไื”)S`ff&ฝ์์์๒mODDD๒Vlฮหห ซWฏฦฤ‰q๚uชอ?u๊ํฺตC™2eคyJฅR๚zูฒe๐๔๔ฬัxx8š5ksss˜˜˜ UซV8sๆLฎc9|๘0๚๖ํ ===@นrๅๆๆๆ๐๓๓xxxH๐ะกC๐๒๒‚ปป;ฮž=‹K—.I}e‡ฟO>๙w๏ล7฿|ƒC‡มฬฬ ะพ}{ >cฦŒมนs็0x๐`i^~.\ˆ฿๗๏฿Gืฎ]1qโDižƒƒ&Mš„K—.มืื~~~˜5kVž}=๑๑๑า๋ฝ{ฎŸˆˆˆไซุœŸŸŽ;KKKt๊ิ ‡สัFกPื๊‰พพพ๔ต––233‘’’‚‘#Gbืฎ]าับิิTฉ]vะ,[ถ,ขขขPฏ^=L›6 !!!ฒŽ~ตhั}๛๖ล๗฿๋ืฏซญS[[*• ิ๚ฒe š4iุ่ฑcŽ0z๘q๔้ำำฆMร˜1cะณgฯ|ทหิิTํEDDD%Wฑธ;w๎ภฺฺD@@โโโ˜˜(อฏ[ท.6n ๋grrr}š˜˜H}xyyแะกCHHHภห—/ฑgฯx{{็บ\“&M๐๛๏ฟ#-- ๐๙๓<ื‘’’---”-[ฯŸ?ว_•kปงOŸBnบa์ุฑาQCggg,\ธ็ฯŸGตjีะฃG4lุP:บgooฅR •J…;wJ™ššโนsฒŽVฏ^ฐ~8;;cๆฬ™่ฝ;.^ผˆฑcวขbลŠึ‹ˆˆˆJโ๊(,, ำงO‡žž,,,ฐaร„‡‡รีีB@GG๓็ฯW›odd„~๚ก_ฟ~ˆˆˆ€ŽNViว‡^ฝzก|๙๒pss“ฺ/Zด}๛๖…*TภชUซุปw/lmm .:•J !„ะ๔ จx%$$ภฬฬ —:[ภ\‘ฆ้แhTฆŽ"บ-Eก‘ข้แh ๋๐k‘…uxตศR~ํ3์ฝญZต‚ฎฎฎฆ‡ฃQ้้้ฉE๖฿๏๘๘๘/‡โ'1ษLฑBี„gฯžกqใฦjำส—/ƒjhDDDDDžฌœ………ฺ#HˆˆˆˆJžB%"""’8""""™a€#"""’8""""™a€#"""’8""""™a€#"""’8""""™‘๕ƒ|)–กWaaaก้ahTzz:ฐ{7*ฎ|Pช?uxตศย:ผฦZdIOOื๔จxŽˆˆˆHfเˆˆˆˆd†ŽˆˆˆHfx \ ฆZา*}•ฆ‡กQ*…๐ษPจๆท€JคiYญ‘ว?ะจˆˆˆภษ ‘ฬ0ภษ ‘ฬ0ภษ ‘ฬ0ภษ ‘ฬ0ภษ ‘ฬ0ภษ ‘ฬ0ภษฬ pqqqXถlYž๓ญฌฌ ์cลŠx๚๔iฑŒ'&&[ถlษs~hhhพ๓?„ŒŒ ยีีฮฮฮุธqใG]?ษ—F\a|ฌ—™™‰เเ`t๎นXึ•ํล‹๙ฮ฿นs'T*ขขขp๘๐aŒ1––†ไไไb •,:ลัIll,บt้‚คค$จT*TซV ัััpwwว—_~‰Aƒกgฯžธz๕* ์oถmG‡Pพ|y?~ห—/วฌYณC‡ลื_๋ฒััั่ป7233กP(pไศŒ;—.]‚ปป;F…๋ืฏใฮ;ธrๅ ๊ึญ XYY!88 4€ทท7<•J…;vภฮฮืฎ]C=žžŽ† BฉT",,Lm)))ุธq#/^Œ เ—_~AHHˆิ7u๔๑฿ฉ^/_พDลŠd?|๑ล†““S๕JMMEjjช๔>!!กภeˆˆˆHพŠๅ๚๕๋ัคI(•JDDD`าคIpqqRฉฤจQฃฐ`ม8::โาฅKhูฒ%=z$-๋๎๎.}ฏ_?)ธyzzbถm8~8๎฿ฟษ“'ใฤ‰๘๛๏ฟ1{๖lฤฤฤไ:–%K–`ศ!P*•8y๒$Œ1y๒d4oJฅ_~๙%เๆอ›8v์˜ ฿dllŒˆˆ๔์ูกกก€แร‡#$$‘‘‘ะัQฯฝWฏ^ลˆ#เ์์Œs็ฮa้าฅ๘ๅ—_๒ญู_|ุุุภณgฯTฌX/^„งง' ฌ[ทN- ฝmส”)033“^vvv๙ฎ›ˆˆˆไญXœ——Vฏ^‰'โ๚๕๋044T›๊ิ)ฺตk‡2eสH๓”Jฅ๔๕ฒeหเ้้™ฃ๐๐p4kึ ๆๆๆ011AซVญpๆฬ™\วโใใƒ3f`๚๔้x๒ไIŽฐ•ญ}๛๖ะีีอu^ถmRPŒŒŒฤ_|่ึญ›ิ๖?€ณณ3ฌญญqแยฬ;ตkืฮต฿79sfffˆExx8 „ŒŒ €กก!z๕๊…ใวcม‚˜9sfฎuษ6z๔hฤววKฏ{๗๎ธ~"""’ฏb p~~~8v์,--ัฉS':t(G…BQซ*P=๐็ŸBGG 6ฤๅห—sm๗fˆ|›พพ>@KK ™™™!Dฎm›6mŠ™3gbํฺต่ฝ;v๏ •J%อืึึ–ฟymบuhัขดดดPฝzu˜šš"66Všเม๓ฯ่าฅ œฑdษ’|วkjjช๖"""ข’ซX;w`mm" qqqHLL”ๆืญ[Wบหr็ฮ…บH฿ฤฤD๊รหห ‡BBB^พ|‰={๖ภ;ืๅn฿พชUซbไศ‘๐๗๗วีซWี๚zWnnnุฝ{7`๓ๆอาtSSS 6 ‘‘‘1bึฎ]‹5j`อš5{{{้(ใŽ;คๅlmmฅk่bcc +++ฤววฃmถhผ9Œq๊ิ)ฌZต >>>๏5~"""*9Š%ภ………มีี8~8‚‚‚เ๊๊ WWWฬ˜1ƒฦ7Pปvm์ฺตKบ`ศ8่ป7Qฟ~}TชT ฿=๊ึญ‹ฯ?#FŒ€ƒƒCฎcูฐaœแ๎๎ŽฤฤDดhัฎฎฎx๕๊ฑvํฺwฺฦ_?๘#๑๒ๅห\r๙๙๙aํฺต8}๚ด4พŽ;โฺตkpuuล… คถƒฦํทแโโ‚ๆอ›c๎นะำำŒ9.\ภˆ#Pถlูw/•\ ‘ืนAR“œœ CCC( Lš4  ั๔ฐr•333<ล๚ช‚(มาzุ๛ษPดธ๕tEZ‘–ีy๊ใKOOว๎ปัชUซ<ฏ,-X‹,ฌรkฌEึแ5Mี"๛๏w|||—CหcDJƒ3gฮ`ฤˆศฬฬ„ฃฃ#VญZฅ้!Q)%๗์ู34nXmZ๙๒ๅq๐เมฒพ์gฟišlœ……•J0{""""™a€#"""’8""""™a€#"""’8""""™a€#"""’8""""™a€#"""’ู>ศ— ฆ๕๕VhYXhzฅ•ž์ ญ!{กUส?ˆˆJ#"""’8""""™แ)ิLตw,Teํ[ฌีa~1†ˆˆˆŠ ภษ ‘ฬ0ภษ ‘ฬ0ภษ ‘ฬ0ภษ ‘ฬ0ภษ ‘ฬ0ภษ ‘ฬ0ภษ €&Mšไ;?..ห–-“งคค QฃF๐๐๐ภ‘#Gyฝ‡†‡‡ะบuk$&&พs_DDDTz”๊'„€Jฅยมƒ๓m๗v€;š7oปw:u๒ห/Xฒd """เโโ‚‘#Gโ๊ีซy๖3eส˜™™I/;;ป๗ฌ&—•˜็ๅๅ…ีซWcโฤ‰ธ~: QฃF ธปปCกP 'Nœ˜˜˜ y๓ๆน๖ใ๋๋ ”)SŽŽŽˆ-pžžž˜={6.\ˆใวฃWฏ^000(pน฿~๛ aaaˆ…ฝฝ=–,Y"อซ]ป6ๆฮ‹่่hXYYมูู๑GฎŒ=๑๑๑า๋ฝ{ฎ›ˆˆˆไซฤ8???;v –––่ิฉ:…B!อW(า๛2eสไูพพพ๔ต––233 \๗’%KPปvmt้า“&Mยƒิๆฟ9ŽิิTภ“'Op๕๊U8;;CกP C‡8sๆŒิNฅRa๗๎่ฝ;ึฎ]‹™3gขiำฆyŽูิิTํEDDD%W‰ pw๎ตต5ˆ€€$&&โส•+ˆŠŠ‚›6mBฝz๕ฉo“|๏๕๑๑มชUซp๒ไIกy๓ๆhถ-โใใFFFธ>RSSฑ~@ูฒe๑่ั#้hูกC‡Pฝzuภš5kPฃF ฌ]ป#GŽDdd$† ฦ`FDDDM ธ„……a๚๔้ะำำƒ……ฆN WWWLœ8/^„ŸŸ:t่๐N}[XXภีีฎฎฎ „——Wฎํส•+‡#F`ฤˆ “ฆOœ8ฐตตE5:::๘ํท฿ะขE hiiกZตj 888เ๔้ำฐฐฐxง๑QษVb\PP‚‚‚ค๗111ะืืฯ๕บฑ7ื๗ 4@ƒ ค้o†ฐ๕๋ืซ-๓fปผ9ห/ฟฤ—_~™ฃMืฎ]ัตkืำ฿๕H!•%ๆ*QiQb\๖iH"""ข’ฆฤ8"""ข’ŠŽˆˆˆHfเˆˆˆˆd†ŽˆˆˆHfเˆˆˆˆd†ŽˆˆˆHfเˆˆˆˆd†ŽˆˆˆHfเˆˆˆˆdฆฤ|*ๅคีb2ด,,4= """*f<GDDD$3 pDDDD2รGDDD$3ผฎS]๚*Sรถ>-ทภถ.""ขาŒGเˆˆˆˆd†ŽˆˆˆHfเˆˆˆˆd†ŽˆˆˆHfเˆˆˆˆd†ŽˆˆˆHfเˆˆˆˆd†ŽˆˆˆHfเˆˆˆˆd†ŽˆˆˆHfเˆˆˆˆd†ŽˆˆˆHfเˆˆˆˆdฆX\\\–-[Vœ]–XQQQ๐๖๖†ปป;q}M‰ˆˆˆdโฃธฬฬฬโ\Uกibฝ้้้HJJสทอ๘๑ใ1iา$(•Jt์ุฟ๚+€ฌๅงะ.66พพพpww‡ซซ+N:ฅ๖ส•+;v,ขฃฃแ๎๎Ž3f`ลŠ่น3ˆGก]ปv๐๔๔D๚๕qํฺ5@hh(ผผผเ๊๊Š>}๚@ฅR4h€oฟ๐๒๒Bxx87nŒO>๙ปvํสsฌ!!!่ำง|||๐ฟืฏ_GำฆMQงNดhั=888 %%ฐbล ๐ร€QฃFกfอšpssรŒ3 ฯ>ƒ1cฦ fอšาถๅตHHHตถถฌ_ฟnnnXฐ`4ฟ ฉฉฉHHHP{QษU่ท~z4iาJฅ8rไˆฺ{{{{Lž<...P*•5j€ฌS…;w๎ฤบu๋0bฤL˜0แแแ˜={6FŽ ฺ่ต+ฮž=‹จจ(โฏฟ’ึkaa๓็ฯฃ^ฝz2dvํฺ…ํทcาคI๙Ž๗ๆอ›8v์fอš…มƒcูฒeˆˆˆภW_}…Ÿ9ฯๅž={†-[ถเาฅKˆŒŒฤื_ y๖‘™™‰;v UซVุ่ฑ#*Uช„s็ฮมรร#฿๑M:#FŒ€ญญ-ถlู‚!C†ˆ?>„งง'๚๗๏ˆˆˆ|๛š2e ฬฬฬค—]พํ‰ˆˆHt ะหห ฝ{๗†––บt้‚๚๕๋ซฝwrrสuน-Zภฤฤp๘๐a\บtIšงญญ ˆŒŒฤธqใ€ธธ8ุููก]ปv€/พ๘เโโ…B8;;ใ๎ป๙Žท}๛๖ะีีEbb"Nž<)๕—™™‰*Uชไนœ™™Œัฏ_?ดo฿ญ[ทฮท๖ํใโล‹Xตj๊ีซW`ณ-\ธฟ;š4i‚ษ“'cโฤ‰˜2e €ฌฃv“&MBHHึฌY???๔ำO๘๖osํk๔่ัRฒŽ่1ฤ•\…p~~~8v์๚๋/t๊ิ ๓็ฯฯ๑>ท`TฆL้k…Bs็ฮAKKภ_ฑgฯTซV 3gฮฤห—/ฅyzzz---ตฏ บถ-{ฝ*• •*U‚RฉฬัF[[[:]›šš ะััAxx8๖ํ‡ตkืb๋ึญ˜;wnž}L™2 .D฿พ}ักC๔๋ืีชUหwฐeห๖o€Ž;b๐เมj?~K–,Axx8ฦŒƒž={ๆนญ๚๚๚ะืืฯทDDDTr๚๊;w`mm" 'NœP{ $&&ๆูG๚๕ฅ›T*ขฃฃIIIจPกRRRฐqใฦ๗$ufff([ถ,๖๏฿ ๋ƒห—/์ํํกT*กRฉฐs็Nภห—/ถmb๚๔้P*•๙๖แ์์Œ… โ๙๓จVญz๔่† "&&&ฯu€ฉฉ)ฮ;8t่ชWฏุฟ?œ1sๆLt๏/^ฤุฑcQฑbลbญ ษWกภ………a๚๔้ะำำƒ……แ๊๊*ฝ฿ฐa,,,เ๊๊ WWWขB… j}ฬ›7มมมXฐ`าำำัซW/ธธธ`์ุฑ๘๔ำOQฑbลฏ{kืฎลภ1jิ(ddd`ิจQจUซฦ‡^ฝzก|๙๒pss$&&ขmถHKKƒBกฎuหซlFFF่ืฏ๚๕๋‡ˆˆ่่d•6ทuภขE‹ะทo_!PกBฌZต @ึ5{๗๎…ญญmฑืˆˆˆJ…BhzTผ`ff†ววรยิ๐ฃญWห-๐ฃญซฐาำำฑ{๗nดjี บบบšŽฦฐฏฑYX‡ืX‹,ฌรkšชE๖฿๏๘๘x˜ššๆ–Ÿฤ@DDD$3…>…๚_ดo฿>|๗jำZดhฉSงjhDDDDDžฌ\๓ๆอัผysMƒˆˆˆ่ฃโ)T""""™a€#"""’8""""™a€#"""’8""""™a€#"""’8""""™a€#"""’Y?ศ—๒งๅิ Zš3#"""’8""""™a€#"""’ธฌ๙ึ`|บฆ‹ฆ‡ADDDลŒŽˆˆˆHfเˆˆˆˆd†ŽˆˆˆHfเˆˆˆˆd†ŽˆˆˆHfเˆˆˆˆd†ŽˆˆˆHfเˆˆˆˆd†ŽˆˆˆHfเˆˆˆˆd†ŽˆˆˆHfเˆˆˆˆdฆDธธธ8,[ถLำร(ดQฃFมููNNN˜;wฎฆ‡CDDD2Qj\ffๆGห‹/๒ฏT*q๚๔iDEE!<<3gฮDBBBก–%""ขาM6.66พพพpww‡ซซ+N:ฅ๖ส•+;v,ขฃฃแ๎๎Ž3f`ลŠ่น3ˆGก]ปv๐๔๔D๚๕qํฺ5@hh(ผผผเ๊๊Š>}๚@ฅR4h€oฟ๐๒๒Bxx87nŒO>๙ปvํส1ฦŒŒ lบอš5ร!C+Vฌภ? ตqpp@JJ %%้้้x๕๊LLL ฏฏ๐๔๔DŸ>}pๆฬ™ZS"""’'ูธ๕๋ืฃI“&P*•ˆˆˆภ‘#Gิc๒ไษpqqRฉฤจQฃQQQุนs'ึญ[‡#F`ย„ ว์ูณ1rไH@ืฎ]q๖์YDEEมะะ๕—ด^ œ?๕๊ีร!Cฐkื.l฿พ“&M’ฺปwใว‡““v๎‰Ÿ~๚ kืฎอw{แ๏๏888`ฬ˜1R€ปz๕*ฺถm‹xzzb๑โลx๙๒ež}ฅฆฆ"!!AํEDDD%—ŽฆPX^^^่ป7ดดดะฅKิฏ__ํฝ““Sฎหตhั&&&€ร‡ใาฅKาธธธFŒJ•*ศ pkึฌ––l๒5}Dฒ pAAA ส1ํm๋ืฏฯณŠ+bถm9ฆ2Dบk๔Maaaาืฝ{๗V›๗๏ฟๆนccc4n@ึ้ึ?๘#ืv+Vฌศuz๖uwDDDDนแ!""""™a€#"""’8""""™a€#"""’8""""™a€#"""’8""""™a€#"""’8""""™a€#"""’8""""™a€#"""’ู|˜=พŽกฐฐฐะ๔0ˆˆˆจ˜๑‘ฬ0ภษ ‘ฬ0ภษ ‘ฬ0ภษ ‘ฬ0ภษ ‘ฬ0ภษ ‘ฬ0ภษ ‘ฬ0ภษ ‘ฬ่hzT„€ฤฤD่๊๊jx4š•žžŽไไd$$$”๊ZฐฏฑYX‡ืX‹,ฌรkšชEBB€ืว๓รW={๖ เ่่จแ‘QQ%&&ยฬฬ,฿6 p%Pนrๅw๏-px›——ฮž=[b–IHH€๎ปSSำ๘>ึบตk|s๎YธOผฦ}" ๗‰ื4ตO!˜˜›—c€+ดดฒ.m433+๒กถถv‰Z&›ฉฉi‘–˜ใ๛˜๋*ju]ๅeฒqŸศย}โ5๎YธOผฆ‰}ขฐ^xฉ|ธ4ญดิ"$$ …BํUณfMi~iฉ>>ฅฒƒF๋ึญีถ(}๛ฤ๕๋ืaccƒO>๙_~๙%๎ฝ  tีaวŽ๐๔๔D—.]`ii ,]บTš_Zgฆฅฅaอš5่ท/ …,๗ ธไ้ำงศฬฬTน bลŠ๘๗฿54ช+{;๓ซมฟ KKKต๙:::(Wฎœl๋คRฉ0|๘p๘๚๚ยูู@ึv๊้้ม\ญํตศญVู๓ไ$::ฦฦฦะืืGpp0ถm''งRW‡ 6เนs˜2eJŽyฅฉXฑb๖๎‹E‹แ๖ํจ_ฟ>KUnบ…E‹กZตjุทoˆกC‡bๅส•J๏๏ฬํท#..ฝ{๗ ฯŸ พF"*vƒฦ… pโฤ MEcjิจฅR‰๘๘xlูฒAAA8z๔จฆ‡๕Qปwร† ร``` ้แhTห–-ฅฏ]]]แํํ {{{lฺด †††ูวฅRฉเ้้‰_~๙เแแ . 44AAAๆ฿Zถl Mๅ๑\ Rพ|yhkk็ธkๆัฃGฐฒฒาะจ>ฎ์ํฬฏVVVx๘ฑฺŒŒ <\–u2dv๎‰#GŽภึึVšnee…ดด4ฤลลฉตปนี*{žœ่้้กjีชจSงฆL™777ฬ;ทTี!""?ฦงŸ~ ่่่เ่ัฃ๘ํท฿ ฃฃƒŠ+–šZผอีซWว7Jี>amm '''ตiตjี’N'—ฦ฿™w๎มมƒัฏ_?iš๗ ธDOOu๊ิมกC‡คi*• ‡‚G๖๑8::ยสสJญ 8sๆŒTฤลล!""Bjs๘๐aจT*x{{๔1ฟ+!† ‚mถแ๐แรpttT›_งN่๊๊ชีโ๊ีซธ{๗ฎZ-ขฃฃี~98pฆฆฆ9~้หJฅBjjjฉชCใฦ ฅR)ฝ<==๑ๅ—_J_—–Zผํๅห—ธy๓&ฌญญKี>แ๋๋›ใ๑Bืฎ]ƒฝฝ=€า๕;3๒ๅหaii‰ึญ[KำdนO|๔&่ƒฺฐaƒะืื+Vฌ—.]_ต077WปkF๎ล๙๓็ล๙๓็1{๖lqyq็ฮ!Dึ-๑ๆๆๆโฯ?QQQข]ปvน๏แแ!ฮœ9#Nœ8!ชUซ&ป[โ(ฬฬฬDXX˜ฺญ๑ษษษR›เเ`Qนreq๘๐a.|||„4?๛ถ๘fอš ฅR)๖๎+*Tจ ปG%๐รโ่ัฃโ๖ํ"**J๐รBกPˆ๛๗ !JOr๓ๆ]จB”žZ|๛ํท",,Lพ}[œงOŸึ๔Šี‘#G€ฏ   !Dึm๑?๘ฃจXฑขะืื7Wฏ^U๋ใูณgข{๗๎ยุุX˜ššŠ>}๚ˆฤฤD lอปหญฤ๒ๅหฅ6ฏ^ฝƒ eห–eส”:t>T๋'&&FดlูRŠ๒ๅห‹oฟVคงงไญy?}๛๖๖๖๖BOOOTจPA4nX oB”ž:ไๆํWZjัญ[7amm-๔๔๔DฅJ•Dทnิž}VZ๊ „๕—pvv๚๚๚ขfอšbษ’%j๓Kห๏L!„ุทoŸc๛„฿>กBˆˆˆˆˆฏ#"""’8""""™a€#"""’8""""™a€#"""’8""""™a€#"""’8""""™a€#"zOIIIprrยห—/5=5ตkืฦ฿]คepโฤ‰4ขขนvํ>sMƒ่?‰ŽˆdฯมมFFFHJJ’ฆ%''รฤฤjํส”)cccXXX kืฎx๑โ…Z_Jฅฒศก!44ํฺตƒฑฑ๑{mGqปx๑ข๔AZXXชVญช6ญw๏˜4iา;๗YฝzuXYYแฏฟz฿แ•8 pDT"TชT ทo—๙็Ÿฐถถฮัnx๙๒%๎ฝ‹ดด4๓ฯj๓๗๎‹-Zi๗‡๎ปฟำธ‹"##ใƒฏใฟ"{[ปw๏Žeห–ix4D= pDT"t๏kืฎ•ฏYณ_~๙ežํŒŒะถm[\พ|Ymzv€{๕๊บw๏Žrๅสก\นrจ_ฟ~ฎฝ{ฑฑฑpqq‘ฆ988`ฦŒจUซLLL0~x\ฝzžžž033CppฐิVฅRaย„ ฐณณƒตต5†ŠิิTภŠ+ะฐaC 0fffXพ|9ž?Ž=zภาาŸ|๒ Vฎ\™็6พy:t็ฮจQฃ†tTrร† y.w๊ิ)Tฏ^๘๎ป๏ Rฉคy ,@ตjีPพ|y!)) ™™™hูฒ%nบccccๅส•Xปv-~๙gK ???”-[u๊ิAxxธิทBกภ๙๓แ่่ˆ† p่ะกR^‰ ฅ|OD๔Ÿdoo/ยยย„ญญญx๘ฑx๘ฑฐตต'Nœ๖๖๖jํŽ?.„">>^ดiำFL˜0AšŸ ฌฌฌDffฆXดh‘hำฆHNN้้้โุฑcนฎ{็ฮขN:9ฦใ๏๏/ž={&._พ,๔๕๕EำฆMลปwลร‡EลŠลแร‡…B,YฒD899‰{๗๎‰งOŸŠบu๋JcZพ|นะึึห—/™™™"99YดjีJ|๛ํท"%%E\พ|YX[[‹ศศศ<๋’ฝฝ+V'NœB๑๐แCq๑โล<—qww><NNNbูฒeB!6mฺ$œELLŒHNNปw฿~๛ญBˆ#GŽˆ*Uชจ๕$~๙g้}bbขฐฑฑ[ถlbถmยฮฮNผz๕J!ัถm[/’““ฅๅLMMล•+Wr/Qiล#pDT"hkkฃs็ฮุธq#6nˆN:A[[;Gป–-[ยeห–ลตkื0pเ@iกC‡เ๏๏---่๊๊โูณgธu๋ttt๒<—๋ตoC‡EนrๅPณfMธนนกE‹ฐณณƒ•• ุฐaพ๛๎;ฺฺุยยยใวว๚๕๋ฅ~ชTฉ‚ฝ{CKK ๑๑๑ ร”)S ฏฏš5kขGุบuk๕ัีีลๅห—๑๒ๅKXYYมษษ)ฯถร† ƒ••lll0bฤlธ@ึฉโัฃGร†††3f ถlูRเบณํนตkื–พ7ํท‡ฅฅ%NŸ>-ต๙แ‡`jj CCCiš‰‰ โใใ ฝขา€ŽˆJŒ/ฟ๋ึญรฺตk๓<}บgฯฤลล!99ํทG๋ึญฅyo^ˆฦฃC‡ฐททว”)Srํฯฬฬ,ืปO---ฅฏ sผฯ^&66•+W–ๆู#66Vzokk+}}๗๎]คคค B… 077‡นน9/^Œ7฿บภ–-[ฐm6ฺฺุขE‹9NฟษฮฮNํ๋‡J๋0`€ด๎z๕๊แษ“'ฎ๛อ๑=zTZ—/_ฮs{ณ%&&ยฬฬฌะ๋!* เˆจฤ๐๔๔ฤ๓็ฯ๑โล xyyๅV__ˆˆˆภำงOdเะผys€žž~๚้'\ปv ๛๖ํรนs–ฃผy๓วlccƒปw๏J๏๏ฝ ้ฝBกพฎTฉŒ๑โล ฤลล!..‰‰‰ -p=ุตk=z777ต#oปw๏žฺืู7ƒTชT +Wฎ”ึ'๙๛ๆ8s{๖๒อ›7ฯฑ|=๒\ๆ฿EFFชTฉRเ6•& pDTขlบตPงำำำฑn:XZZยยยWฎ\ฉฉฉVŽ9‚‹/BฅRมิิ:::นž’ตทท‡••ขฃฃ฿iผบuรฌYณ๐เม<?3rm[ฉR%๘๘๘`ธqHNNFFFฮ;‡K—.ๅปŽดด4ฌ[ท ะีี…ฑฑqฎ’mผyx๔่>|ˆ9sๆ kืฎ€พ}๛โ—_~‘๋ร‡ฑw๏^YGŸ}d้๛ีW_กu๋ึ055…ฟฟฟkีช…vํฺมฮฮๆๆๆฒ฿™3g`nnŽAƒมฬฬ ปvํยผy๓`ii ,Yฒ$฿qฏ_ฟ๛๗/p๛ˆJ…BhzDDšึขE ๐รhะ A‘—MJJ‚——๙็Ÿร|ๅ์๚๕๋ ฤ฿๋)ZขาŒŽˆภ๔้ำ1bฤ่๊๊jz(DDb€#"""’^GDDD$3 pDDDD2รGDDD$3 pDDDD2รGDDD$3 pDDDD2รGDDD$3 pDDDD2รGDDD$3”๑ฤะ"ถ๑IENDฎB`‚windows-x86_64-vs2019-Release-c4core-bm-charconv-atof-mega_bytes_per_second-double.png000077700000000000000000000000001477602032300534472windows-x86_64-vs2019-Release/c4core-bm-charconv-atof-mega_bytes_per_second-double.pngustar00rootroot00000000000000c4core-0.2.6/doc/imgwindows-x86_64-vs2019-Release-c4core-bm-charconv-atof-mega_bytes_per_second-float.png000077700000000000000000000000001477602032300531352windows-x86_64-vs2019-Release/c4core-bm-charconv-atof-mega_bytes_per_second-float.pngustar00rootroot00000000000000c4core-0.2.6/doc/imgwindows-x86_64-vs2019-Release-c4core-bm-charconv-atox-mega_bytes_per_second-i16.png000077700000000000000000000000001477602032300517652windows-x86_64-vs2019-Release/c4core-bm-charconv-atox-mega_bytes_per_second-i16.pngustar00rootroot00000000000000c4core-0.2.6/doc/imgwindows-x86_64-vs2019-Release-c4core-bm-charconv-atox-mega_bytes_per_second-i32.png000077700000000000000000000000001477602032300517612windows-x86_64-vs2019-Release/c4core-bm-charconv-atox-mega_bytes_per_second-i32.pngustar00rootroot00000000000000c4core-0.2.6/doc/imgwindows-x86_64-vs2019-Release-c4core-bm-charconv-atox-mega_bytes_per_second-i64.png000077700000000000000000000000001477602032300517732windows-x86_64-vs2019-Release/c4core-bm-charconv-atox-mega_bytes_per_second-i64.pngustar00rootroot00000000000000c4core-0.2.6/doc/imgwindows-x86_64-vs2019-Release-c4core-bm-charconv-atox-mega_bytes_per_second-i8.png000077700000000000000000000000001477602032300516272windows-x86_64-vs2019-Release/c4core-bm-charconv-atox-mega_bytes_per_second-i8.pngustar00rootroot00000000000000c4core-0.2.6/doc/imgwindows-x86_64-vs2019-Release-c4core-bm-charconv-atox-mega_bytes_per_second-u16.png000077700000000000000000000000001477602032300520152windows-x86_64-vs2019-Release/c4core-bm-charconv-atox-mega_bytes_per_second-u16.pngustar00rootroot00000000000000c4core-0.2.6/doc/imgwindows-x86_64-vs2019-Release-c4core-bm-charconv-atox-mega_bytes_per_second-u32.png000077700000000000000000000000001477602032300520112windows-x86_64-vs2019-Release/c4core-bm-charconv-atox-mega_bytes_per_second-u32.pngustar00rootroot00000000000000c4core-0.2.6/doc/imgwindows-x86_64-vs2019-Release-c4core-bm-charconv-atox-mega_bytes_per_second-u64.png000077700000000000000000000000001477602032300520232windows-x86_64-vs2019-Release/c4core-bm-charconv-atox-mega_bytes_per_second-u64.pngustar00rootroot00000000000000c4core-0.2.6/doc/imgwindows-x86_64-vs2019-Release-c4core-bm-charconv-atox-mega_bytes_per_second-u8.png000077700000000000000000000000001477602032300516572windows-x86_64-vs2019-Release/c4core-bm-charconv-atox-mega_bytes_per_second-u8.pngustar00rootroot00000000000000c4core-0.2.6/doc/imgwindows-x86_64-vs2019-Release-c4core-bm-charconv-ftoa-mega_bytes_per_second-double.png000077700000000000000000000000001477602032300534472windows-x86_64-vs2019-Release/c4core-bm-charconv-ftoa-mega_bytes_per_second-double.pngustar00rootroot00000000000000c4core-0.2.6/doc/imgwindows-x86_64-vs2019-Release-c4core-bm-charconv-ftoa-mega_bytes_per_second-float.png000077700000000000000000000000001477602032300531352windows-x86_64-vs2019-Release/c4core-bm-charconv-ftoa-mega_bytes_per_second-float.pngustar00rootroot00000000000000c4core-0.2.6/doc/imgwindows-x86_64-vs2019-Release-c4core-bm-charconv-xtoa-mega_bytes_per_second-i16.png000077700000000000000000000000001477602032300517652windows-x86_64-vs2019-Release/c4core-bm-charconv-xtoa-mega_bytes_per_second-i16.pngustar00rootroot00000000000000c4core-0.2.6/doc/imgwindows-x86_64-vs2019-Release-c4core-bm-charconv-xtoa-mega_bytes_per_second-i32.png000077700000000000000000000000001477602032300517612windows-x86_64-vs2019-Release/c4core-bm-charconv-xtoa-mega_bytes_per_second-i32.pngustar00rootroot00000000000000c4core-0.2.6/doc/imgwindows-x86_64-vs2019-Release-c4core-bm-charconv-xtoa-mega_bytes_per_second-i64.png000077700000000000000000000000001477602032300517732windows-x86_64-vs2019-Release/c4core-bm-charconv-xtoa-mega_bytes_per_second-i64.pngustar00rootroot00000000000000c4core-0.2.6/doc/imgwindows-x86_64-vs2019-Release-c4core-bm-charconv-xtoa-mega_bytes_per_second-i8.png000077700000000000000000000000001477602032300516272windows-x86_64-vs2019-Release/c4core-bm-charconv-xtoa-mega_bytes_per_second-i8.pngustar00rootroot00000000000000c4core-0.2.6/doc/imgwindows-x86_64-vs2019-Release-c4core-bm-charconv-xtoa-mega_bytes_per_second-u16.png000077700000000000000000000000001477602032300520152windows-x86_64-vs2019-Release/c4core-bm-charconv-xtoa-mega_bytes_per_second-u16.pngustar00rootroot00000000000000c4core-0.2.6/doc/imgwindows-x86_64-vs2019-Release-c4core-bm-charconv-xtoa-mega_bytes_per_second-u32.png000077700000000000000000000000001477602032300520112windows-x86_64-vs2019-Release/c4core-bm-charconv-xtoa-mega_bytes_per_second-u32.pngustar00rootroot00000000000000c4core-0.2.6/doc/imgwindows-x86_64-vs2019-Release-c4core-bm-charconv-xtoa-mega_bytes_per_second-u64.png000077700000000000000000000000001477602032300520232windows-x86_64-vs2019-Release/c4core-bm-charconv-xtoa-mega_bytes_per_second-u64.pngustar00rootroot00000000000000c4core-0.2.6/doc/imgwindows-x86_64-vs2019-Release-c4core-bm-charconv-xtoa-mega_bytes_per_second-u8.png000077700000000000000000000000001477602032300516572windows-x86_64-vs2019-Release/c4core-bm-charconv-xtoa-mega_bytes_per_second-u8.pngustar00rootroot00000000000000c4core-0.2.6/doc/imgc4core-0.2.6/doc/img/windows-x86_64-vs2019-Release/000077500000000000000000000000001477602032300211715ustar00rootroot00000000000000c4core-bm-charconv-atof-mega_bytes_per_second-double.png000066400000000000000000001076211477602032300337200ustar00rootroot00000000000000c4core-0.2.6/doc/img/windows-x86_64-vs2019-Release‰PNG  IHDR‰งy@9tEXtSoftwareMatplotlib version3.5.3, https://matplotlib.org/อ+นา pHYsaaจ?งiŽIDATxœ์wXื๛6๐{Aช•*ภ.ฐ XbAPT[ฐcิXEcข1‰’hL์‰bฐ|ฃQฑDƒ์+**ˆb‹Š%$ฐˆRdฯ๛‡/๓s@@#b๎ฯuํuฑ3gฮyๆaุ}83;ซB=Cงผ """ข7‹D""""’a‘HDDDD2,‰ˆˆˆH†E"ษฐH$""""‰DDDD$ร"‘ˆˆˆˆdX$‘ ‹Dข"คฆฆBกP`๖์ูๅJ‘Zทn GGว๒ฃฤ F]aP…Bธธธ๒ๅ?/44&&&ๅฦ+๕:Žฏาผ—L: …โ_‹ฅดX$า-%%SงNEjjjy‡BT.Ž=ŠฉSง"==ฝDํ/]บ„ฐฐ0xxxภะะ …ขศฟ…B…B!C†บ~๒ไษR›{๗๎•qฯš5k0—๎็M๒6๎Q‰๔FKIIAxx8‹D๚ฯ:z๔(ยรรK\$;v ?๐233ัคI“ถ744ฤฏฟŠ\ูบตkืยะะฐด!ฉ,•ทท7?~ oo๏Wวซฤ"‘f,‰่_%„ภใวห;Œ '++ซL"==ษษษ่ท๏ w่ะjตฑฑฑZห=Š๋ืฏฃSงNeŠใeeggCฃั@GG†††ะัแี_/,ซฃrqใฦ Œ95‚‘‘,,,ะณgOญร+V gฯž€6mฺHงฝžฝvdัขEppp€jีช…QฃFiอธ 8†††ธpแ‚ึ๘จZต*าาาJ๏ผy๓`cc###๘๘๘เนsฒ6/^D=PญZ5ยออ [ทnีjณbล ( 9rใฦC๕๊ีQนreใ๏ฟ–๕ ˜ššยฬฬ ๎๎๎Xณfฌ]JJ ฺดicccX[[cๆฬ™Z๋ ฎป๙ๅ—_kkk˜ššขGศศศ@NNฦŽ KKK˜˜˜`ะ Aศษษั๊c๙๒ๅhถ-,--a``{{{๘ใฒXlmmันsg์ฺต nnn022ยโล‹‹ฬํดiำ ฃฃƒ Hหnผ‰‹/นอณฒณณ1u๊T4lุ†††จYณ&บu๋†ซWฏJmฒฒฒ0~xิฉShิจfฯž !„V_ืLnผŽŽŽ000€ƒƒv๎)ตูธq# ~๛ํ7Y,‹/†Bกะ:>Js\๖o9r$,--QปvmL:&LุููIลอฌWซV ฆฆฆ%สX[[ร[v\EEEAฉT–๘šืฬฬLŒ;ถถถ000€ฅฅ%ฺทoำงOxz์Ž;pใฦ i?lmm฿๑นn:|๙็ฐถถ†ฑฑ1ิjuกืŒ\‹๛ขใx๚Zˆส•+ราาaaaุตk—ฌฯ+Wฎ {๗๎จQฃ Qปvm„„„ ##ฃศ}.nŸเ๎ป๛์3ญํK๓Zq๛๖mtํฺU๋Xxuฎภ† เ๊๊ ###ผ๓ฮ;่ืฏ๘ใญ6ญ[ทF๋ึญe†††jฯ*ษ{IaVฏ^-ลSญZ5„„„เึญ[%ฺ๖ฅขrฐaรแไไ$พ๒Kฑdษ๑ูgŸ‰ชUซ ‘••%„โ๊ีซโฃ>ฤgŸ}&VญZ%VญZ%๚๋/!„SฆL„ฏฏฏXฐ`=zดะีี๎๎๎"77W!ฤƒDํฺต…ปปปx๒ไ‰BˆศศH@ฌZตชุฏ_ฟ.ฅR)lmmลw฿}'ยรรEตjีD๕๊ีฅ8„โนsย\ุ‹๏พ๛N,\ธPx{{ …B!ขฃฃฅvห—/„‹‹‹hถญXฐ`?~ผะีีฝz๕า๙๒ๅBกPGGG1}๚t!† "๚๗๏/ต๑๑๑ตjีu๊ิcฦŒ‹-mถDLLŒิ๎ภ€pvv-[ถ?๐ƒ๘่ฃ„Bก!!!ขOŸ>ขcวŽ"""B๔๏฿_แแแZ๑ธปป‹ะะP1o<ฑ`มแ็็'ˆ… jตณฑฑ๕๋ืUซV'N‘‘‘โภB!ˆQฃFIm'Ož, …Xฒd‰V>>>ข$/OOž<ํฺตDHHˆXธpก˜1c†hถญุผyณBF#ฺถm+ …2dˆXธpก่าฅ‹ ฦŽซีแไไ$jึฌ)พ๚k1|Qทn]all,๎ป'„โัฃGยฤฤDŒ9RO›6m„ƒƒƒ๔ผดว…ฝฝฝ๐๑๑ ,฿~๛ญHJJฝ{๗ฤผy๓คฟ‡พ07B1kึ,@\ฟ~ฝะ๕ฟ%K–###‘™™)„"//OTฏ^]ฬ˜1C๚;๛๛๏ฟ‹ซOŸ>B___Œ7N,[ถL|๗wขK—.b๕๊ีB!v๏-œล;๏ผ#ํวฆM›„w|ฺ ggg1w๎\1cฦ ‘••%ญ+8†„(๙q๐แCQทn]add$&Nœ(ๆฯŸ/š5k&œœœด๚ฬษษvvvขVญZbฺดibูฒe"<<\ธปป‹ิิิ"๗นธ}z๔่‘hาค‰ะำำaaaโ‡~^^^€˜?~ฑนโ้฿QฃF„•••๘์ณฯฤย… EำฆM…Bก็ฮ“ฺ~žWpL=๛ป/่ณfอšb๊ิฉbผyยฺฺZ˜˜˜ˆีซW‹w฿}W|๛ํทโoฟๆๆๆข~๚"??_ฺ~เภยะะP4hะ@๔๏฿_,\ธPt๎Y_|๑…ึ๘C† •*UC‡‘‘‘โำO?•+Wึz}.ˆฉฐื‹s็ฮ }}}แๆๆ&พ{)>๘cแํํญ5NI_+=z$6l( ล'Ÿ|"ๆฯŸ/\]]…Jฅ’_นsww๓ๆอ'NFFFยึึV‰7nHห/^,ห๛ภ๑แ‡Jห4่ิฉ“ะืื—Ž‘C‡ "**J+ฆ;wส–๕z1oผw%}ญ(๘}๒ห/าฒฌฌ,Qฟ~}ญฬออ–––ยััQ๋ตw๛๖ํ€๘๒ห/ตฦ.M‘X’๗’็ŸฉฉฉBWWWLŸ>]kŒไไdQฉR%ู๒Wง›ฉ\I?็ๅๅแ๛จ_ฟ>ชTฉ"ž*ฮฝ{‘››‹ฑcวj]ซ4t่P˜™™aวŽา2??? 6 _}๕บu๋CCรbO>ฏkืฎฐถถ–ž7kึ อ›7GLL เŸม๛ัซW/dffโฝ{ธw๏๎฿ฟ\นrEvšโƒ>ะ:Eไๅๅ…|ธqภำำ,™™™˜8qข์ƒฯŸZ211Aฟ~ค็๚๚๚hึฌฎ]ป&—@OOOzผys!๐๛๏kตkผ9nบ…'OžHหžeddเฝ{๐๑๑มตkืdงไ์์์เ๏๏/xzอั่ัฃ๑๗฿c๕๊ี8p ฌM\\œ์๔Ua~๕Wผ๓ฮ;๘๐รe๋ ๒]]]|๔ัGZ๋ว!„์Z<___ิซWOzฎRฉ`ffฆ•ฯ๗{w๏ี:]นqใFh4ผ๗{สv\ :บบบ/๏Wญjีช่ะกึฎ] เ้‡1<<<`ccSโ>ชTฉ‚ใว—๘Žย 8P๋8+NIŽ๛;wยฺฺา2CCC :Tซ/sssภฎ]ป๐่ัฃ2วฌ˜˜ิจQฝ{๗––้้้แฃ>ยร‡ ฝ\แy๖๖๖๐๒๒’žWฏ^5*๔oปค์ํํัฒeK้y๓ๆอmถลป๏พ+[^ุXฯฦชเ\์ปภำSตๆๆๆh฿พฝt฿ปwฎฎฎ011มด๚+์๕ขJ•*€-[ถ@ฃัน?%}ญˆ‰‰Aอš5ัฃGi™ฑฑ1>๘เญv ธ{๗.FŽฉ๕ฺฉS'4nX๋ฝฅด^๔^R˜่่hh4๔๊ีK+—5jิ@ƒ dน|ีX$Rนx๘1พ๒K้ฑwyีซWGzzzฑื((ฆ5jคต\__u๋ึ•ึ˜={6ชUซ†ฤฤD๐รฐดด,qฌ 4-kุฐกtญฯ๏ฟ!พ๘โ Tฏ^]๋1eสOฏMzึณ/ฦภำ7iา๕:ืำ•ไzฐฺตkห วชUซสฎ)l‚7ว:u๊ศ–k4ญ฿ล‘#Gเ๋๋‹ส•+ฃJ•*จ^ฝบt}PaEbQVฎ\‰ˆˆ,Xฐ@๋ ด,ฎ^ฝŠFกRฅJEถนqใjีช%ปNฏเ“ฟฯ+ฯ็็ณC‡077ว๚๕๋ฅe๋ืฏ‡ณณ36l lวEqy๛ท๕้ำ{๖์มอ›7ฑy๓f๔้ำงTฯœ9็ฮC:uะฌY3L:ติลLi๖ฟ$ว7Pฏ^=Yป๚๕๋หฦ7n–-[†wyˆˆˆ(ัkQQnธ ศ>pSิqW˜’‹ฅUšืฒฑtttPทn]ญeว|มkโ•+W‘‘KKKูฑ๐แร๗๏ฝ๗Zตj…!C†ภสส !!!๘ๅ—_Š-‹sใฦ ิฏ__v,<Rิ{ 4nธDฟทขผ่ฝค0Wฎ\ 4ๅ๒ย… ฒ\พjEฟฒ‹>๐C,_พcวŽEห–-ann…B2ฟ็ฬ™3าSrr๒K'ฯ*ˆ๗ใ?.r๖์๙7ฅขf‹J๒๑๓JำWQm_ิวีซWัฎ];4ns็ฮE:u ฏฏ˜˜ฬ›7O๖;+n6จUซVHLLฤย… ัซW/TซVญศถๅก$๙400@ืฎ]ฑiำ&,Zดw๎ม‘#G๐อ7฿Hmสr\”tํ฿ 8999่ีซWฉถ๏ีซผผผฐiำ&์ฝณfอยw฿}‡่่ht์ุฑD}”f_ๅ฿ฬ™3กกกุฒe v๏>๚3fฬ@||_VI๖ฑจ/็็็—ชฯW™OFKKKDEEบพz๕๊Zฯ ๛ฝแเมƒ8pเv์ุ;wb๚๕hถ-v๏].3๎ฯS(…ๆงจ—…FฃBก@lllก๛o฿œE"•‹7bเภ˜3gŽด,;;[v/ธข^ Nƒ]บtI๋ฟฺ\\ฟ~พพพาฒฌฌ, 4๖๖๖๐๐๐ภฬ™3 ww๗ลzๅสูฒห—/KŸ^+_OOOk—Qpบ๓นsฒBขYšSชฯz๏ฝ๗๐๓ฯ?c฿พ}ธpแ„าฉfเีฏ๋ŒŒŒะตkWฌ^ฝ;vฤ;๏ผS๊>jึฌ‰‘#Gbไศ‘ธ{๗.š6mŠ้ำงKEโ๋& คคค@ก5๖๏ฟ^h{ฅR ฅR‰ฯ?GEซVญ‰iำฆ9FqฏQgฯž•nใSเeป็œ…HOO—Nั%›ฉ, FƒkืฎIณ‡ภำืCาkbฝz๕ฐw๏^ดjี๊ฅ๑ัััAปvํะฎ];ฬ;฿|๓ &OžŒ”๚oสฦฦ็ฮ“ —.]’ต+Xถm[ญu—.]า๚ฝUญZตะู๒ขrข๗’ยิซWBุููiๅuแ้f*บบบฒภ,X ๛ฌrๅส +}}}กฏฏ~๘AซŸ๏ศศศะบทงŸ~Š›7oโ็Ÿฦนsakk+อ–”ฤๆอ›ตฎ;qโŽ?.ฝ๑YZZขu๋ึXผx1๓Oู๖…ฺๆE`jjŠ3f ;;[k]YgJ^FมฐฯŽ‘‘ๅห——ฉ?•J…˜˜\ธp]บt‘ญคทต่ฝ;๎ป‡… สึฤ€|Y›y๓ๆAกP”x–๋yพพพจVญึฏ_๕๋ืฃYณfZงอ^ีqQิ฿ภฟแใ?ฦ”)S๐ล_”jป|ูฉYKKKิชUK๋๏ฌrๅส/u ทด๑วhr(;;K—.ีjงVซตฎฟžŒ:::/|(jŸ๐ื_i]’๐ไษ,Xฐ&&&๐๑๑)ห.ษCy๐เAiYVVV‰oตSฯ- !ฐpแB่้้ก]ปvžฮ*็็็ใ๋ฏฟ–m๛ไษ“ห๓l™ณณ3hNJ๚Z€ดด4lธQZ๖่ั#,YฒDซ››,--ฉ5Nll,.\ธ ๕Rฏ^=\ผxQ๋o9)) GŽ)4†ฝ—ฆ[ทnะีีExxธ์ต_๛๗๏ฟ`ฯ_gฉ\t๎ซVญ‚นน9์ํํq์ุ1์ปZํœกซซ‹๏พ๛000๎ี7iา$„‡‡ฃC‡ ฤฅK—ฐhั"ธปปKด๏฿ฟ‹-ย”)SะดiSO๏๗ืบuk|๑ล…Wํy๕๋ื‡งง'FŒœœฬŸ?๘ไ“Oค6๐๔๔„RฉฤะกCQทn]นsวŽรํท‘””Tช˜™™aผy2dังOTญZIIIx๔่ัฟ๚P???่๋๋ฃK—.6l>|ˆฅK—ยาาฒะจ$Zดh-[ถ =z๔ภๆอ›ฅูภเท฿~{aA<`ภฌ\นใฦร‰'เๅๅ…ฌฌ,์ป#GŽDPPบt้‚6mฺ`๒ไษHMM…““v๏-[ถ`์ุฑZR) ===t๋ึ ๋ึญCVVVก฿ห๚*Ž WWWOฟ"/$$zzz่าฅ‹T<>/##Cบ็dม›ีย… QฅJTฉRฅุ๏ฮvrr‚““ำ cz^ff&jืฎ=zภษษ &&&ุปw/Nž<ฉuถภีี๋ืฏวธqใเ๎๎t้าฅิใ•ิฐaรฐpแB๔๎cฦŒAอš5%} ก`Fi=z4z๖์‰† โษ“'Xตjtuuัฝ{๗bว(jŸ>๘เ,^ผกกก8u๊lmmฑqใF9r๓็ฯ/๓์๙๓๐๎ป๏b๐เม˜0atuu๑ำO?กz๕๊ธy๓ๆ+ใY†††ุนs'ˆๆอ›#66;v์ภgŸ}&F๖๑๑มฐaร0cฦ $&&ยฯฯzzzธrๅ 6lุ€๏ฟ^๋$…๙๊ซฏp๐เAt๊ิ 666ธ{๗.-Z„ฺตkรำำSjWาืŠกC‡bแย…0`N:…š5kbีชU066ึjงงง‡๏พ๛ƒ ‚z๗๎;w๎เ๛๏ฟ‡ญญ-ยยยคถ๏ฟ>ๆฮ  <w๏Edd$ Vซe1”ไฝไy๕๊ีรดiำ0iา$คฆฆขkืฎ055ล๕๋ืฑiำ&|๐ม๘๘ใ‹๗—๒ฏ~všจ<ƒ ๏ผ๓Ž011โโล‹ยฦฦF 8PซําฅKEบu…ฎฎฎ์– .7zzzยสสJŒ1Bบo”Zญ666ขiำฆ"//Oซฯฐฐ0กฃฃ#Ž;VdŒท-˜5k–˜3gŽจSงŽ000^^^"))Iึ๊ีซbภ€ขFBOOOX[[‹ฮ;‹7Jm nKq๒ไIญm ปอ‡BlบUxxx###aff&š5k&ึฎ]+ญ๗๑๑ับ/_็oมPะ๓ท๘(*žยn{ฒu๋VกRฉ„กกกtฏฏ‚[ะ<›N:ษ*ไ๗IBˆ-[ถˆJ•*‰๗{OบQIok!ฤำ[๓LžJ๚Zqใฦ (Œล;๏ผ#ฦŒ#–็๙ื๕๋ื a`` ชUซ&๚๖ํซu๛šซWฏu๋ึ๚๚๚ยููY์ฺตซศ[เ”ไฝคจ[๚๋ฏยำำSTฎ\YTฎ\Y4nXŒ5J\บtฉD๛^V !สแQ9™?>ยยยp๛๖mญ[’‘6‰DD๔ึz๘ฑึ‡'ฒณณแโโ‚|้DT8^“HDDoญnบแw฿…ณณ3222ฐz๕j\ผxฑศณัa‘HDDo-,[ถ QQQศฯฯ‡ฝฝ=ึญ[งuป""*O7‘ ๏“HDDDD2,‰ˆˆˆH†E"Q9นu๋ ‹††Š(.. …qqq/W๋ึญแ่่๘๒AฝZดhQ์M“‰D,‰จB[ฑb  >,[/„@:u P(ะนsgญu<*Wฎ {{{L›6 =*tผไไd( œ8qโฅc๊ซฏะผysดjี๊ฅ๛ข’๙ๆ›oฐy๓fู๒ฃGb๊ิฉฺื~๚้งˆˆˆภ_๕ฏ๔O๔o`‘HDoCCCฌYณFถท฿~รํทa``P่vํทวชUซฐjี*ฬ™3...๘โ‹/0pเภB๏ุฑ–––pwwฉx๛o๓ฯ>|๘K๕๓ฆ๑๖๖ฦใวแํํ]กชธ"1<<_+ƒ‚‚`ff†E‹+x "z+`ร† ๘แ‡PฉาฝดญYณฎฎฎธw๏^ก5lุP๚ฎo>|8rss์์l้{~ ฤฤฤ cวŽา๗–ี๊ีซQฉRฅ๕ป‹K+++ซศ๏„.)Yฮห=zccc่่่ GXนr%ยรร_๚๘!z8“HDo…ฝ{ใ๛ุณgด,777nDŸ>}JีW5 P(ดŠMHOOวัฃGัฉS'iูบu๋เ๊๊ SSS˜™™AฉTโ๛๏ฟแ›7oF๓ๆอabbขตผเ:ผณgฯยววฦฦฦจ_ฟ>6nเ้ฬh๓ๆอadd„Fa๏ฝฒพฯœ9ƒŽ;ยฬฬ &&&hืฎโใใตฺœฆํท฿0rไHXZZขvํฺา๚ุุXxyyกrๅส055EงNp๙๎Waื$^นrปwG5`hhˆฺตk#$$/์N:มฮฮ‘‘‘ฒ6999˜2e ๊ืฏิฉSŸ|๒ rrrค6 …YYY๘๙็ŸฅK BCC1u๊TL˜0`gg'ญKMM•ถ]ฝz5\]]add„jีช!$$ทnาŠกเww๊ิ)x{{รุุŸ}๖™ดพ}๛๖ธqใKด฿DๅE"ฝlmmัฒeKฌ]ปVZ‹ŒŒ „„„น]vv6๎ป‡{๗๎แฦXณf ~๙g๔้ำGV$๎ฺต …~~~€={๖ w๏จZต*พ๛๎;|๛ํทhบ๕ ?ˆ’——‡“'Oขiำฆ…ฎ๐เ:w๎Œๆอ›cๆฬ™000@HHึฏ_เoฟEVVz๔่ฬฬLi๓็ฯรหห III๘ไ“O๐ล_เ๚๕๋hบ5Ž?.kไศ‘HIIม—_~‰‰'VญZ…N:มฤฤ฿}๗พ๘โ คคคภำำSซp*‰\๘๛๛#>>~๘!"""๐มเฺตk%:ต๛เมภีี3gฮDํฺต1bฤ๔ำORFƒภภ@ฬž=]บtม‚ ะตkWฬ›7O๋ฆูซVญ‚ผผผคK † †nบกw๏€y๓ๆI๋ชWฏ˜>}: € `๎น;v,๖ํoooู>ฟ;v„ณณ3ๆฯŸ6mฺH๋\]]เญ๚ ฝๅQถ|๙r@œ)…(ศลœ9sคe999ยููYXZZŠ\!„ซVญ:::โะกCZGFF โศ‘#าฒส•+‹สฦš5k– ฎ_ฟฎต<55U่๊๊Š้ำงk-ONN•*UาZ^oddd‘๛คฏฏ/FŒ๑ย}'zp&‘ˆฝz๕ยใวฑ}๛vdffb๛๖ํ/<ี„={๖`ฯž=ุฒe &Mš„;wขOŸ>ฯ|!•Fฃมฮ;ตN5WฉRYYYZงธKโ๛€ชUซบฤฤDk๖ณQฃFจRฅ š4i‚ๆอ›Kห ~พvํ ??ปw๏Fืฎ]Qทn]ฉ]อš5ังO>|jตZkฌกC‡BWWWzพgฯคงงฃw๏า ๋ฝ{๗ ซซ‹ๆอ›ใภฅฺWsssOga‹๚ฤxq*Uช„aร†Iฯ๕๕๕1lุ0ฝ{งNlุฐMš4Aใฦตbnถ-”:ๆgEGGCฃั Wฏ^Z}ืจQ 4๕m``€Aƒู_ีชU‹ผ>–่Mรฎั[ฃz๕๊๐๕๕ลš5k๐่ั#ไ็็ฃGลnSปvm๘๚๚Jฯaaa?ทo—>Xr๒ไI๗฿ZEโศ‘#๑ห/ฟ cวŽฐถถ†ŸŸz๕๊…:”(^Qฤทขึฎ][๖มsssิฉSGถ xzJx๚‰้GกQฃFฒ>›4iFƒ[ทnมมมAZnggงี๎ส•+ Xฯ333+n—d์์์0n8ฬ;QQQ๐๒๒B`` ๚๕๋'ล_œZตjษ>LำฐaC@jj*Zดh+Wฎเย… า้แ็ฝ{ทT1?๋ส•+B Aƒ…ฎืำำำznmm }}"๛B๐C+TaฐH$ขทJŸ>}0t่P๕ื_ุ่ฑ#ชTฉR๊>ฺตk8x๐ T$ฦฤฤภึึ๖๖๖R;KKK$&&bืฎ]ˆEll,–/_Žเ็Ÿ.ฒ W=๏ู™ฝ’,/ชุ, ###ญ็ภำ๋๗jิจ!kuš%1gฮ„††bห–-ุฝ{7>๚่#ฬ˜1๑๑๑Z–)+FฅR‰นs็บ๙โบด}+ ฤฦฦš็?x๔|>Ÿ—žžŽwyงฬ๑ฝN,‰่ญŒaร†!>>๋ืฏ/SOž<<|๘PZถcวศฺ๊๋๋ฃK—.่าฅ 4 Fމล‹ใ‹/พ@๚๕ ํw฿…‘‘ฎ_ฟ^ฆ๘ŠRฝzuใาฅKฒu/^„ŽŽฮ ฆz๕๊xZ?;ร๚ฒ”J%”J%>s=zญZตBdd$ฆM›V์viiiฒ[๓\พ|ภำ+ฤœ””„vํฺฝp–ฎจ๕E-ฏWฏ„ฐณณ“f0ห๊?@nn.š4i๒Rฝ.ผ&‘ˆ*&&&๘๑ว1u๊ิ2฿ƒpถm'''ภ;wp๚๔iญSอภ][X@GG*• ดnฝ๒<===ธนน!!!กL๑EWW~~~ุฒe‹ึง๏นƒ5kึภำำ๓…ง‹aff†oพ๙yyyฒ๕wฉbRซีRั]@ฉTBGGงุx๒ไ /^,=ฯออลโล‹Qฝzu้ำยฝz๕ยฅK—สถ๘1ฒฒฒค็•+W.๔SีE่๓๋บu๋]]]„‡‡หfl…ฒc 8ืPzxx”xข๒ฤ™D"z๋๕m)…น|๙2Vฏ^ เ้ใใใ๑๓ฯ?ฃ~๚่฿ฟ?€งงš ตngC† ม?ƒถmขvํฺธqใ,Xgg็ฮa๒ไษPซีฅพฮฏ8ำฆMรž={เ้้‰‘#GขRฅJXผx1rrr0sๆฬnoff†๛๗GำฆM‚๊ีซใๆอ›ุฑcZตj…… –8ž๛๗c๔่ัู่ณ'6lˆ'Ož`ีชUะีีE๗๎_ธ}ญZต๐w฿!55 6ฤ๚๕๋‘˜˜ˆ%K–Hื๖๏฿ฟ๒ †Ž UซVศฯฯวล‹๑ห/ฟ`ืฎ]pss๐๔64{๗๎ลนsQซV-ุููกy๓ๆRม9y๒d„„„@OO]บtAฝz๕0mฺ4Lš4 ฉฉฉฺ่ต+LMMq๚ulฺด |๐>๘ใๅbฯž=x๗wแโโRโ•ซ๒๛`5ัห{๖8ล)ษ-ptuuEํฺตล| ๎น#ต๋ัฃ‡๕นqใFแ็็',--…พพพx๗wลฐaรฤŸ๙ยธ๏น#*Uช$VญZฅตววG888”(‚}5j”ึฒำงO abb"ŒE›6mฤัฃGตฺผ(oย\Šz๕๊‰ะะP‘P์~= œkืฎ‰๗฿_ิซWOŠjีช‰6mฺˆฝ{๗—‹„„ัฒeKahh(lllฤย… emsssลw฿}'„จZตชpuuแแแ"##Cjw๑โEแํํ-ŒŒŒญแ|๕ืยฺฺZ่่่ศn‡๓๋ฏฟ OOOQนreQนreัธqc1jิ(q้า%Yผ…ษฯฯ5kึŸ๙ ๗›่Mกโ%ฎx&"zห=y๒˜1cFŽ๙J๛‰ˆˆˆ€ทฐHณgtuu_ชฒ‰%๑เมƒWgYฅงง—wDDD๔ซะEโาฅKกT*แไไ„)Sฆ //฿|๓ >๓mฏVซัถm[4mฺ...8|๘0`๒ไษุตkœ…ฟ;v„Rฉ„ฟฟ?๎นธ|๙2เไไ„%K–:Fvv6~๙gxxx`ึฌY€;w๎ M›6P*•—ฺ>z๔ฝ{๗†RฉDซVญp๙๒eภิฉS)ตซQฃ†๔๓ีซWแ้้‰† b๑โลฒ๑>|ˆ๛ร๎๎๎ˆฌ]ปNNNˆˆˆ€Zญ.Qพˆˆˆ่ฟฃย‰gฯžEDDŽ9‚คค$Œ3s็ฮลภajjชี622R*ฒ0dศ€‘‘ถlู‚ำงOcถm?~<`๚๔้๐๗๗Gbb"๚๖ํ‹)Sฆ }๛๖HNNFPP&Ož ;v,พ๒K$%%Aก5ๆฅK—GGGœ>}K—.ล7฿|Gpp0’““ต พ… ขz๕๊HNNฦไษ“1rไศๆแไษ“ˆ‰‰ABBๆฬ™ƒดด4ญ๕ำฆMC๗๎q๒ไIlฺด ฃFŒ1[ถlมŸ 777 :งN*vฌœœจีjญฝ*l‘Xp™™เ๑ใวุฝ{7(k;|๘p >เๆๆ†eห–„๘ไ“O T*ันsgœ?พะฑŽ=Š~๚๚๕๋‡#GŽ่ปทิื_…ฃฃ#jึฌ‰s็ฮแ๛๏ฟ‡ƒƒƒVื >ปณใเย… /ฬC@@ฬฬฬ`ff___œ8qBkž={0eส8;;ฃs็ฮธ{๗.ž —b Dเi‘cii ]]]lธYYYSSSdffJํ<<<ฐ~zภš5kเ้้ prrย๖ํ@Zfff3f ’’’†จจ(4jิซWฏ–๕๗์vฯ.฿นs'์ํํ666HLLู>ลฦฦ"33™™™ุทoตึ๛๚๚"""Bzž””ุฝ{71{๖l๔๎็ฯŸวไษ“aeeUdพ คYห‚ฝ*l‘่่่ˆัฃGรรรNNN๘แ‡Šl[ิ5‰}๚๔ม๛กRฉp๐เAฉ@RฉTx๘ฑ๔ม•ฉSง"&&*• ััั˜6m`๙˜:u*œœœdื$๐๖๖FTTโใใฅ[L™27n„Rฉิบ†p๔่ัHKKƒJฅยื_-wบuรๅห—กRฉp๎9ญ]]]ัฑcGธบบ",,L6c๘ๅ—_J}ฺKงฺ-,,ฐs็NlูฒZณœDDDD QTuC๔jตๆๆๆp| 4๚ฅ;Uถาื˜ไ๘3ฮ™ W๓โK vฬ‡s"วœศ1'rojNNัถฦฮหหCLL  งงWโํ ฟ322Š=+ศ้#""""’a‘HDDDD2,‰ˆˆˆH†E"ษฐH$""""‰DDDD$ร"‘ˆˆˆˆdX$‘ ‹D""""’ฉTPลทkl+XXX”wo„‚ป฿๚ฤปTwฟ[1rฬ‰s"วœศ1'ฏg‰ˆˆˆH†E"ษ๐t3ฝดษ;ฏ ’๑๒ใ ‹|ดี>~ ๙ะ-๏pส๓!วœศ1'rฬ‰›”“…มMสuื…3‰DDDD$ร"‘ˆˆˆˆdX$‘ ‹D""""’a‘HDDDD2,‰ˆˆˆH†E"ษฐH$""""‰DDDD$๓V‰=z๔@‹-สผ}jj*6n๘ #*ZHHโโโสดm5 ]nkk‹์์์—ˆŠˆˆˆ๋บ"qฯž=ะี}นฏ๋๙7Šฤผา^Fnn.=zTaัฌB‰K—.…Rฉ„““ฆL™‚ผผ<|๓อ7๘๓ฯKดฝZญFถmัดiSธธธเ๐แร€ษ“'cืฎ]pvvFTT๛ot์ุJฅธs็ZดhใวหฦˆGhh(คe_|๑5j???ฟ_Zพ|๙r8::ยััK–,๐ด`}vV444;w๎!0lุ0ุฃ[ทn…~?๔แไไ„๐๐pO VGGG|๔ัGHII)Qฎˆˆˆ่ฟฅย‰gฯžEDDŽ9‚คค$Œ3s็ฮลภajjชี622‘‘‘€„„ 2`dd„-[ถเ๔้ำุถmฦ˜>}:‘˜˜ˆพ}๛bส”)h฿พ=’““„ษ“'ฃjีช๘ๆ›o0|๘pฬ™3žžžhผ9 33‘‘‘puuExx8‚‚‚p้า%ภ‰'ฐgฯœ;wห—/G||<เ๖ํ˜>}:>ŒcวŽa๎นHMM-6w๏EงN’’,ZดHk}JJ v๎‰๘๘xœ9sงNBBBฌฌฌpyธนนaุฐa๐๑๑มš5k““S์x999PซีZ"""z;Uุ"1..!!!033<~ปw๏ฦภem‡Žแร‡ฐlู2Ogโ>๙ไ(•Jt๎็ฯŸ/tฌฃGข_ฟ~€~๚แศ‘#€เเ`โ๛พ๚kฉ}ญZต่่hฤฦฦ"88•*U’๚๊ึญ๔๔๔`mm ///O‹W???TฉRฆฆฆ(tf๒Yฦฦฦ ๔๎[š -ฐo฿>;v ฎฎฎhฺด)RRRpๅสO ไเะกCˆˆˆภ์ูณตf; 3cฦ ˜››K:u๊žˆˆˆ*ฎ [$>/11)))ฐณณƒงง'ฮœ9#PE‰ŠŠBnn.‘˜˜X๊1๓๒๒p๚u!••%-฿ฐa*WฎŒภภ@ฬŸ?_๋”2(ŠB.Œฎฎ.4๔ผจู>…B!๋K#FH๛๗๛๏ฟฃw๏า๚?๘_5z๖์ฉuŠป(“&MBFF†๔ธu๋Vฑํ‰ˆˆจโชฐEbถmฑn:้”gห–-๑็Ÿ"55‡†‹‹ ถnZljต–––ะีีลฦฅBฯิิ™™™R;ฌ_ฟฐfอxzzx:ณๆ๏๏ฯ?}๔‘ิพC‡ุดibccกVซัฒeK๔้ำG๊kำฆMศหหCZZ:pwwวพ}๛ Vซ๑๐แCฤฦฦขy๓ๆฐฒฒยํท‘••…๔๔tฉ=}๚`PฉT8x๐ ฌฌฌ*• ?–>ธ2u๊Tฤฤฤ@ฅR!::ำฆMร๙๓็๑๋ฏฟโห/ฟฤ€๐เมฉ`+PซV-|๙ๅ—ธpแ‚T$6kึ ํฺตƒฃฃ# $}(ลฺฺŸ~๚)<<<ะขE „……มึึ๚๚๚;v,œœœ'''ฉKKKlถ ธz๕*FŒ!หัว จT*๔๊ีK*„ว‡s็ฮ!,, UซV}™_ฝ…BQAPลคVซannŽaซก’ฑyy‡๓FะE>ฺ๊\ล~M=ไใๅnล๔6`>ไ˜9ๆDŽ9‘{“rฒ0ธIนŽ_ //111€žž^‰ท+xฮศศ(๖ฌ`…I$"""ข‹D""""’a‘HDDDD2,‰ˆˆˆH†E"ษฐH$""""‰DDDD$ร"‘ˆˆˆˆd*•wT๑M๏ะๅฦแ้Mฏbv็Fฅบฑ้Š๙cNไ˜9ๆDŽ9y8“HDDDD2,‰ˆˆˆH†E"ษ๐šDzi๋“€‘iVy‡๑fะไฃ€ีงo:ๅ๛๔oๆCŽ9‘cNไ˜น ž“A๎๏–wฅฦ™D""""’a‘HDDDD2,‰ˆˆˆH†E"ษฐH$""""‰DDDD$ร"‘ˆˆˆˆdX$‘ ‹D""""’๙WŠฤ=z E‹%jซW/899!**๊฿ๅ…Zทn‹/–หุp๑โEดnบLN:‘‘‘ฒๅ+Vฌภฤ‰_22"""๚/{ๅ_หทgฯ่๊–์๋r๓O\พ|IIIฒu๙๙๙%๎งผ”6ฦ jีชbD%๗&ลBDDDož—šI\บt)”J%œœœ0eสไๅๅแ›oพม็Ÿ^ขํปt้‚+WฎภููษษษฐตตลคI“เ์์ŒcวŽaฺดiptt„Jฅยถmqqq๐๓๓C@@lmm‰้ำงCฅRกcวŽx๒ไI‘ใmบฮฮฮprrย!Cคๅห—/‡ซซ+\\\p๋ึ-ภๆอ›ัผys8;;#((>„††bไศ‘pwwว๙๓1|4nNNN;vฌlฬŒŒ ,\ธNNNXฟ~=เ๒ๅหpssƒ““–,Y"ต๛๏ฟัฑcG(•J๘๛๛ใฮ;า˜;w๎คฆฆjอา?~อš5Cร† ฅ=๋ฮ; ‚››ผผผp๙๒eภฌYณะชU+ฌ\นููู/eศษษZญึzัฉฬEโูณg#GŽ )) cฦŒมนs1pเ@˜ššjตŒŒ”N‹&$$HฺฦกT*‘˜˜ฅR ฐตตEbb"๔๕๕ฑu๋Vœ:u ปvํย‡~(jgฯžETTNž<‰O?vvv8{๖,ŒŒŒฐo฿พBใฝs็ฦ‡ุุX$%%aๆฬ™า:œ:u ๚๕“โ๔๑๑ม๑ใว‘˜˜ˆVญZแ๛Ÿิ>=='Nœภ๘๑ใ1}๚tœ9sIII—ฺ์งปป;๚๋/lูฒร‡Œ;_~๙%’’’ „ถ™2e ฺทoไไda๒ไษ/=\ธpGŽม0fฬYม†)Sฆ !!s็ฮลธqใ฿|๓ –,Y‚SงNAฉTbธqธt้Rฑcอ˜1ๆๆๆาฃN:/Œˆˆˆ*ฆ2‰qqq ™™เ๑ใวุฝ{7(k;|๘pฉ@rssรฒeหŠ์ทgฯž€ฃGขG000@อš5ัดiSœ?เแแชUซขz๕๊077G็ฮŽŽŽธy๓fก?~พพพจYณ& Zตjาบภภ@€‹‹ RSS7o„ฏฏ/”J%/^Œ””ฉ}= P(ฎฎฎ่ืฏึญ[ภœ9sเใใOOOคคค`ฺดiฐตต•ถOLL”ฦ์ปทด่ัฃ่ืฏ _ฟ~8rไH‘y*ะญ[7่้้มฺฺ7–]_น~ผ๛pvvฦะกC๑็ŸJ๋๐๗฿#995jิ€ฃฃ#~๕ื"วš4i222คGมฌ+ฝ}^ู5‰‰‰‰HIIž}::๒4 v๎‰ฅK—โฺตk˜={6ฺทo_dRฎˆˆˆ่ํVๆ™ฤถmbบuาui-[ถฤŸ‰ิิT>|...ฅ.ŸๅแแM›6!//๕ฮœ9‡2๗ืขE ์ปWšI๛็ŸŠmฏVซQณfMh4ฌZตชะ6ทo฿†ฏฏ/ๆฬ™#]๏gee…ฯ?็ฯŸGHHfอšGGG์ฝเไไ$ื)์sม๓5kึภำำ`ccƒฤฤDๅด Giiiธx๑"5jคตหหKšนีh4HNNฌ^ฝ5BTTฦ']2P03LDDDme.1z๔hxxxภษษ ?๐C‘m‹บ&ฑ8อš5CงNเโโ???๐ร011)kธฐดดฤผy๓ะกC899ฝ๐1_|๑:v์ˆๆอ›รฮฮฎะ6๙๙๙่ำงT*š7oŽฏพ๚JkฝŽŽฐu๋V์น€๙๓็c๊ิฉprrาบ&q๊ิฉˆ‰‰JฅBtt4ฆM›ชuิP:o๖-œ^ ๆCŽ9‘cNไ˜น ž“A๎๏พ๒>๓๒๒ƒ€€่้้•xป‚๗๏ŒŒŒbฯ ๒WˆˆˆˆHๆ•฿L๛MŒ๋ืฏk-ผyณึ'Œ‰ˆˆˆจhoe‘ธiำฆ๒ˆˆˆจBใ้f""""’a‘HDDDD2,‰ˆˆˆH†E"ษฐH$""""™ท๒ำอ๔zฝ็d-}›ฬำ›žEฟฆตKucำท๓!วœศ1'rฬ‰s๒๚q&‘ˆˆˆˆdX$‘ O7ำK;•ช†้ƒŠ๗=šMภ‰kะัๅŸ๓!วœศ1'rฬ‰-'-๋W)๏8“HDDDDr,‰ˆˆˆH†E"ษฐH$""""‰DDDD$ร"‘ˆˆˆˆdX$‘ ‹D""""’a‘HDDDD2,‰ˆˆˆHฆB‰ใฦƒฃฃ#fอšUโmVฌX{๗๎•ธ฿ึญ[ใโล‹ฅŽ-==ห–-+๕vjิจQฆํโโโ"[žššŠ-Z”9"""" ‚|w๓š5k๐็ŸBกP”x›+V E‹x็wJิ๏Ž;ส[A‘8dศb=x๐UซV-ำฏZFFฬฬฬJ•O"""๚oyใg{๔่๛๗๏รลล฿=กRฉ0hะ h4ภ„ ะธqc899aึฌYุดi //ฏ๖ปkื.ญuห—/‡ฃฃ#ฑdษiy็ฮแ๊๊ ฅR‰่่hภไษ“‘œœ gggูL็“'O ???Œ=••…เเ`ุc๘๐แR[FƒัฃGรััฎฎฎˆ๐ดุ8qขิฮึึููู€๛๗๏ฃ}๛๖hิจฆL™"ว'Ož`ฬ˜1pww‡ณณ3ถm8t่š4i‚oฟw๏-มoแฉœœจีjญฝ๘™ฤ7ขFHLLฤ?ƒ1cฦFމmถมำำ7nฤีซWกฃฃƒŒŒ ˜››รออ ‘‘‘hธ๑ ๛€3fn฿พ้ำง#!!บบบpww‡ŸŸlmmฑrๅJTซV jต-[ถDpp0ฆOŸŽซWฏJEบu K—.ลบu๋เ้้‰ฏพ๚J:;;;lฺด [ถlมโล‹ฅxn฿พไไdœ;w={๖|แ้๏๘๘x\ผxีซW‡ทท7บt้ข5sบlู2ุููแ๛๏ฟ—b๎ะก:w๎ www,_พญ[ท†Jฅย๐แรับu๋bว›1cยรร‹mCDDDo‡7~&๑YIIIhีช”J%ถm†””˜››รฤฤC† มึญ[abb๒Rc$$$ภฯฯUชTฉฉ)p๘qภผy๓เไไ///คฆฆโฏฟ’mโฤ ุููแัฃGHHHภO?คuเัฃGฅk ƒ‚‚`ll,-๏ำง ”J%Œq็ฮbc๕๒๒‚ตต5๔๕๕ัญ[7>|Xkž={ฐx๑b8;;ร™™™HKKXYYaโฤ‰8<๚๖ํ‹ž={โร?,vผI“&!##Czบuู๋$""ขŠ๊ŸI|ึะกC‹ `๖์ูx๘๐!*Uช„„„์ฺต QQQˆŽŽฦŠ+^๙ุภ‰'pโฤ ภัั999ฒv*• K–,ม’%Kะฝ{w :]ปv…พพพิฆ4ื๊๊๊Jงีh๙l? …Bึฏ๛฿เแแQh฿gฮœมาฅKฑw๏^  wwwŒ?>>>8w๎พ๖[ฺฺุ–:_DDD๔vชP3‰“'OFำฆMaee@ff&‘›› …BฏฟŠ๛ฃz๕๊8t่P‰วฐถถฦงŸ~*อพ………มึึ5jิ@DD Rฉเไไฐฐฐ€Jฅ‚JฅB1aยฉ/gggDFFโแร‡า)๋QฃFกo฿พppp€ทท7ฌฌฌ< อมƒกT*กฏฏๅห—<==abb{{{xyyกN:Rอ›7Ghh(nธธนน!55UZ?lุ0\ปv NNNะh4hิจขฃฃallŒจจ(4lุฐดฟ"""๚P!DyA“Zญ†นน9v%\ƒฉ๙›q{Ÿ๒ฆษ‚{เฦญ ฃ[ก๛W0rฬ‰s"วœศืrาฒ~•ถษหหCLL  งงWโพ ฟ n‰W” uบ™ˆˆˆˆ^ทฟวำำฒฯศไฤ‰Z&!"""ข๓Ÿ( ฎ$"""ข’แ้f""""’a‘HDDDD2,‰ˆˆˆH†E"ษฐH$""""™ฤง›้฿ๅjk ‹*ๅฦ!//1fuอKucำท๓!วœศ1'rฬ‰s๒๚q&‘ˆˆˆˆdX$‘ O7ำKป;ผrนๅฦ!ฟ’!๐Rh 'ูๅNน{'๊~y‡@DDeฤ™D""""’a‘HDDDD2,‰ˆˆˆH†E"ษฐH$""""‰DDDD$ร"‘ˆˆˆˆdX$‘ ‹D""""’a‘HDDDD2e.ำำำฑlูฒ"ืืจQใ…}๖oppp€——WYรx)qqq )—ฑ „„„ ..ฎL•c[[[dg๓+แˆˆˆจ์ต"ฑ$ึฌYƒ้ำงใะกCZห๓๓๓_ช฿ืกด1>x๐เ_Šค๔rss๑่ัฃ๒ƒˆˆˆ`%.ำาาะชU+8;;CฅRa๘๑HNN†ณณ3fอš…ฌฌ,รร‡a+Wฎฤ† 0~xŒ5 +Vฌ@=เใใƒ๛ใ๗฿‡——T*z๕๊…ฌฌ,@๋ึญ1~xธธธภ hืฎ๊ึญ‹;v9žZญFŸ>} Rฉเ์์Œ„„O‹ท.]บ Aƒ˜>}บิพs็ฮpuu…RฉDtt4 55ฮฮฮ่ีซ์ํํe9นx๑ขl๘๘x„††ยออMZ๖ล_ QฃF๐๓๓ร๛๗ฅๅห—/‡ฃฃ#ฑdษiฬ-ZHmBCCฑs็N€ร† ƒฝฝ=บu๋Vhแ๗ำO?มNNN—๖ูัั}๔RRR^๐›๚?999PซีZ"""z;•ธH\ปv-|}}‘˜˜ˆSงNaฺดiP*•HLLฤ„ ;;;คคค cวŽธs็Žดญณณณ๔๓!C€ 00ˆˆˆœ={ทoวš5k๐ัG!,, gฯž…ญญ-ๆอ›'๕aaa3gฮภำำฃGฦŽ;ฐy๓fL›6ญศ๘ฟ๚๊+4lุgฯžEBB6l8sๆ VฌXคค$DFFJล่ส•+q๊ิ)9r_|๑„€๓็ฯcส”)ธt้’,'666€ฬฬLDFFยีีแแแ ยฅK—'Nœภž={p๎9,_พ๑๑๑€ทoc๚๔้8|๘0Ž;†นs็"55ตุ฿ษปwัฉS'คคคภฦฦ‹-าZŸ’’‚;w">>gฮœมฉSง+++œ?nnn6l|||ฐfอไไไ;Œ3`nn.=๊ิฉSl{"""ชธJ\$บปปcีชUว•+W`ddคต่ัฃา๕}AAA066–ึ%&&J?/[ถLkVํY:t€ฉฉฉดMทn๚๕ร‘#Gคv;w(•JxxxภะะŽŽŽธy๓f‘๑๏฿ฟ_šแฌTฉฬฬฬญZต‚……Œagg‡ดด4ภผy๓เไไ///คฆฆโฏฟ4iาลๆคVญZˆŽŽFtt4bccŒJ•*Iy๊ึญ๔๔๔`mm-]™???TฉRฆฆฆภ๑ใว‹066F``  w๏8|๘ฐึ๚}๛๖แุฑcpuuEำฆM‘’’‚+WฎŒŒŒ0`ภ:t˜={v‘ฟ—“&MBFF†๔ธu๋Vฑํ‰ˆˆจโ*q‘่ํํƒยาาปwวพ}๛dm ลK๓laY}}}€ŽŽŽึฯeน–ัภภ@๚น เฤ‰8qโ’’’`gg'อฒ=cQ9ูฐa*WฎŒภภ@ฬŸ?_๋”2 งๅLWWFz^ิlŸBก๕%„ภˆ#˜˜ˆฤฤD๛๏่ปทด?ภื_ž={jโ.ЁฬฬฬดDDD๔v*q‘xใฦ ิฌY#FŒ@HHาำำ‘™™)ญ๗๐๐ภ๚๕๋ทo้F8;;cถmž~ภลำำ๓ฅ๚๓๕๕Edd$เษ“'Zฑ?OญVฃZตj000ภ‰'pแย…B=Ÿ“ไไdOgD7mฺ„ุุXจีjดlู}๚๔๐4O›6mB^^าาาคํธปปc฿พ}Pซีx๘๐!bccัผysXYYแ๖ํศสสBzzบึ‡|=z„ํทึฏ_/หQถmฑn:คงงxzJ๛๛ศศศ@`` abb‚ฃGbๅส•hูฒe2KDDDoฃ‰qqqPฉTpqqมกC‡0pเ@จT*จT*ฬš5 ฃFย๏ฟ์ุฑVVVาถ…]“๘"?๐fฮœ •J…kืฎa์ุฑฅฺฑ็}๑ลธ|๙2”J%q๙๒ๅ"๚๛๛ใ๛pppN;ๆ๙œ๔๋ืOk}ญZต๐ๅ—_โย… R‘ุฌY3ดkืŽŽŽ4h๔กkkk|๚้ง๐๐๐@‹-[[[่๋๋c์ุฑprrBHHˆV,–––ุถmp๕๊UŒ1Bk|GGG|๑ว๐๑๑‘}hธq8w๎ยยยPตjีา'”ˆˆˆj Q๐‰ ขRRซี077GJ TQไ–w8o„J†8๕Rธฎ 'ผWๅ;Q๗ƒ€€่้้•w8o„ผผ<ๆไ9ฬ‰s"วœศ•5'๏฿ล^:ฦo\!""""™Jๅภซถkื.|๚้งZห:t่€oฟถœ"""""ชxบ"ั฿฿ๅQ…ฦำอDDDD$ร"‘ˆˆˆˆdX$‘ ‹D""""’a‘HDDDD2oง›้๕ณŒผ ‹๒ใ——ฤฤภ๊็?xณW|Q…ฤ™D""""’a‘HDDDD2###แ๎๎•J…AƒAฃั`ำฆMHHH@pp0ผผผห—/‡ฃฃ#ฑdษ@=p}ธธธ`ืฎ]Zฝ{3fฬ@“&Mp่ะำ๏ะ=v์ะดiSlถMj๛๛๏ฟรหห *• ฝz๕BVV u๋ึธx๑" ..!!!า6[ทn…‹‹ p๘qู~]นrํท‡ซซ+:t่€;w๎F lฺด Ož<)QŽˆˆˆ่ฟฃB‰kืฎ…ฏฏ/q๊ิ)L›6 Jฅ‰‰‰˜0a"""`gg‡””t์ุQ*ŒภููY๚yศ!HHH๔๊ี 'Ožฤูณgadd„mถ!88nnnุดi:„ทoc๚๔้8|๘0Ž;†นs็"557n„……แ๏๏8pเ{๏=ดn …D็ฮC‡ETTN:…ฟ๚KŠ็ฃ>BXXฮž= [[[ฬ›7๏…นธs็NŸ>ีซWc่ะกฒ๕ฃFยฒeหp๊ิ) <_5 ** แแแุถm์ํํ1eสพ}ปุฑrrr VซตDDD๔vชT”…ปป;BCCกฃฃƒž={ยุุXkัฃG๑ูgŸ‚‚‚ดึ'&&J??{Š:)) Ÿ9ิj5าำำQงNi๕›???TฉR€ใวรึึVซ‡~ˆu๋ึแงŸ~B็ฮกP(คu้้้ะh4Rฑ๚{๏!&&FŠญ[ทn€~๚แำO?}a.{๏=( ธธธเษ“'HOO—ึeffโศ‘#า~ไ็็ฃ^ฝzา๚-Z E‹Pซี‡ญญ-Ž=Šfอš:ึŒ3ย˜ˆˆˆจโซEขทท7<ˆmถก{๗๎๘๘ใemž-ฬJb่ะกˆEƒ 0{๖l<|๘ฐฬ๑?ฦฦฦ7nbcc๑มhอ`>โิีี…Fฃ๐t6๏Yฯ๗๕์sFkkkญย๘Yนนนุดi–.]Їbษ’%PฉTEฦ1iา$Œ7NzฎVซQงNฦODDDO…<|ใฦ ิฌY#FŒ@HHาำำ‘™™)ญ๗๐๐ภ๚๕๋ทoวฃG^ุgVVชWฏŽ์์li[055•๚vwwวพ}๛ Vซ๑๐แCฤฦฦขy๓ๆฒพlmm๑w฿แ๙๓๐๑๑มธqใะฌY3œ>}UชTŽŽฮž= !~๙ๅi;ggg้ล5kึภำำ`cc#z[ทnีซ`๛คค$TชT ๆๆๆา:sssTญZปw๏ไๅๅแย… €9sๆ qใฦ8pเfฯž๘๘xผ๛044,2G033ำzัฉB‰qqqPฉTpqqมกC‡0pเ@จT*จT*ฬš5 ฃFย๏ฟ์ุฑVVVาถE]“8y๒d4mฺmฺด‹‹‹ิ&44๛๗‡——ฌญญ๑้งŸยรร-Zด@XX˜์T๓ณ๔๕๕๑{๏aXตj•tฺ{ษ’%่ป7\]]ตb๛แ‡0sๆLจT*\ปv cวŽ„……aฺดipssCฅJฺ“ฟีซWGำฆMังO้ƒ4ฯŠŠŠยฌYณเไไggg้ร-ฮฮฮ8{๖,"##ตrBDDD !„(๏ จbRซี077วoผaa )๏py }์ฌ๛:\๛z"ทผร่Œ;Tnc็ๅๅ!&&ะำำ+ท8$ฬ‰s"วœศ1'reอIม๛wFFFฑg+ไL"ปX$‘ ‹D""""’a‘HDDDD2,‰ˆˆˆH†E"ษฐH$""""‰DDDD$ร"‘ˆˆˆˆd*ฝธ Q๑t>ˆ†Ž…Ey‡๑Fะษหbb 3z't๘DDTq&‘ˆˆˆˆdX$‘ O7ำKำ์œ 1%ะ@ะi อ๖กA~y‡ะ ^X!Qฤ™D""""’a‘HDDDD2,‰ˆˆˆH†E"ษฐH$""""‰DDDD$ร"‘ˆˆˆˆdX$‘ ‹D""""’yใ‹ฤ๔๔t,[ถฌศ๕5jิ(Sฟ+Vฌภฝ{๗Š\?{๖์R๗YึXZดhิิิRo—ššŠ-ZผาXˆˆˆˆ€ท H,ซขŠD!4M™Šฤy๐เม+๏ณฌฒฒฒ——Waั๊+ำาาะชU+8;;CฅRa๘๑HNN†ณณ3fอš…ฌฌ,รร‡/QŸ&L@ใฦแไไ„YณfaำฆMHHH@pp0ผผผVVV1b”J%Œ๛๗๏รููaaaะh4=z4แ๊๊Š๘๘x(Q,B์ูณปwGืฎ]๙๙๙:t(š4i‚=z ''Gj?mฺ48::BฅRaถm€ธธ8„„„HmZทn‹/rrrะฝ{w4iา|๐4,†้ำงร*• K—.\พ|7ฦไษ“qใฦๅ‘ˆˆˆ;*•wฯ[ปv-|}}Žผผ<๛๏๘ใ?คยlๆฬ™ฐณณรฆM›ฐeห,^ผXฺึูู‰‰‰€!C†`๘๐แฐณณรฦq๕๊U่่่ ##ๆๆๆpssCdd$7n ธ{๗.บvํŠ+๕๕ห/ฟเ๖ํHNNฦนs็ะณgO\ผxEฦr๏=,_พ+Vฌ€ƒƒ†___ภฏฟŠ๙)))HLL„ซซ+เฤ‰ุบu+N:…๙-[ถD›6mŠอืูณgฑ|๙r899ก{๗๎ˆŽŽF=ค๕;w๎ฤ฿“'O"77^^^่น3\\\p๚๔iฌ^ฝมมมจYณ&†Ž€€่๊๊:VNNŽVAซVซ_๘๛$""ขŠ้›ItwwวชUซŽ+WฎภศศHkัฃGฅYต   K๋ Š:Xถl`nn 2[ทn…‰‰Iกใšššย฿฿ฟะuGEŸ>} P( T*allŒ;w๎KZZjืฎณgฯ"..ฟ๒ ฺทo…B!๕๗{๏AกPภลลE*T=Š=zภภภ5kึDำฆMq๙b๓ีจQ#8;;CกP $$‡ึZฟgฯlถ ฮฮฮhึฌ๎ฝ‹ซWฏฬออ1jิ(œ>}“&Mย˜1cคูฮยฬ˜1ๆๆๆาฃN:ลฦFDDDืW$z{{ใเมƒฐดดD๗๎ฑo฿>Y›‚bซ$*Uช„„„tํฺQQQ–/_ลฦR Aƒ˜5kฆOŸŽ๛๗บw๏ŽปwฃI“&า‡T Yณf่ิฉ\\\ ฃฃƒ~๘&&&011Aปvํเเเ•JฅUศฉT*„‡‡ใ๙๓๐๖๖Fppฐึ๘8w๎!„€ฅฅ%ถm†J•*aฮœ9hฺด้Kถˆˆˆ่mฅBˆ๒‚*&ตZ sss]= ฦoๅ"บุฉำ4๛ก‡๒ ผฐฦฮหหCLL  งงWnqผI˜9ๆDŽ9‘cNไสš“‚๗๏ŒŒŒbฯ พqง›‰ˆˆˆจฑH$""""‰DDDD$ร"‘ˆˆˆˆdX$‘ ‹D""""’a‘HDDDD2,‰ˆˆˆH†E"ษ๐k2่ฅ้t˜ ‹๒ใ “—ฤฤ@ง๓l่๐ˆˆจใL"ษฐH$""""žnฆ—ฆI๙3ฃ๒ใ ั€4็ึA๓ ำq๊๊:#""*ฮ$‘ ‹D""""’a‘HDDDD2,‰ˆˆˆH†E"ษฐH$""""‰DDDD$ร"‘ˆˆˆˆdX$‘L….ำำำฑlูฒ"ืืจQฃLฎXฑ๗๎+ี6!!!ˆ‹‹+๕X'NฤŠ+Jฝฺฺุ";;[ถผu๋ึธx๑b™๚$"""๒"ฑฌสR$พศฃG››๛J๛|<(๏ˆˆˆ่ VกŠฤดด4ดjี ฮฮฮPฉT?~<’““แ์์ŒYณf!++ มมมฐททว๐แรKิ็„ ะธqc899aึฌYุดi ///ภ๒ๅหแ่่GGG,YฒDฺ๖‹/พ@ฃFเ็็‡๛๗๏ฺ๙๓็๑แ‡ยมมA*ฬ~๑G4lุ^^^ธz๕ชิ6&&*• ŽŽŽ˜:uชดูัฉSง"22Rz>eส8::ขmถ๘๛๏ฟeใ๏ุฑ-Zด€ณณ3†อำ/†›› „ใว—(ODDD๔฿RกŠฤตkืยืื‰‰‰8u๊ฆM›ฅR‰ฤฤDL˜0ฐณณCJJ :v์ˆ;w๎H:;;K?2 ธ>6nˆ””$%%แƒ>@pp0ฐiำ&:tทo฿ฦ๔้ำq๘๐a;v s็ฮEjj*Nœ8={๖เนsXพ|9โใใฅsrrooo >๎๎๎ธpแฌฌฌ๐ว`ผyHHHภŽ;p๒ไIภใว1rไH์ุฑgฮœมž={p๘๐แๆฤฺฺ็ฮCPPยรรตึปw๓็ฯG\\กซซ‹่่hภฅK—ˆฉSงยออ ‹/ฦร‡‹+''jตZ๋ADDDoงJๅ@iธปป#44:::ู่ณ'Œตึ=zŸ}๖ ((Hk}bbข๔sม)๊'OžภฤฤC† Aืฎ]ัฉS'ู˜ ๐๓๓C•*U8~8๓Ot๋ึ zzzฐถถ–fงณt๚๚๚๘๙็Ÿแ่่จี฿ษ“'แ๋๋ 333ฉ?เiัfoo:u๊{๏=9ržžžลๆ$$$ะปwo๘๙๙iญ;v์ฮž=‹-ZxZˆฺุุ*Uช„เเ`ใฦ:t(>๘cdff9ึŒ3d…(ฝ*ิLขทท7<KKKt๏๛๖ํ“ตQ(%๎ฏRฅJHHH@ืฎ]…มƒ—*žgวz๖็%K–ภมม={๖ฤดiำ๐ว”hป’Œ“““S่:…B!๋K   $&&"11—.]ย'Ÿ|"ญฟ>ๆฯŸภภ@Tฎ\6l(6ŽI“&!##Czบu๋…ฑQลTกŠฤ7n fอš1bBBBžžฎ5๓ๅแแ๕๋ืถo฿ŽG฿ร‡‘‘‘ภภ@ฬœ9Sšm455•๚uwwวพ}๛ Vซ๑๐แCฤฦฦขy๓ๆ๐๐๐ภฆM›——‡ดด4:tH๊ทeห–Xนr%Ž9‚ส•+ร฿฿ศศศ€ปป;๖๎‹ฬฬLdff"66ะจQ#\ธpiiix๒ไ 6lุ€VญZ*WฎŒทo#''ปw๏ึฺ‡‚]ฟ~ฝlึฑE‹ุทon฿พ เiQX๐sŸ>}ะฒeKจีjฤฦฦbำฆM่ะกCฑ๙200€™™™ึƒˆˆˆN๊ts\\fฮœ }}}XXX`บuHHH€JฅB1jิ(๔ํ๐๖๖†•••ดญณณณT2ร‡‡ตต5‘›› …BฏฟŠ๛ฃz๕๊8t่>๔Sxxxยยย`kk [[[ดkืŽŽŽฐตต•N้>ซZตj CXX˜t{kkkŒ;ฎฎฎฐฒฒ‚››ภศศุ่ฑ#๒๓๓ัฃGฉ่ ‡jืฎFiq๛๖m(•Jผ๓ฮ;๘ๅ—_ดึYZZ"""AAAศหหƒžž–.]ŠฺตkฃOŸ>Xฝz5tt*ิ DDD๔š(„ขผƒ ŠIญVรw.†…™Qy‡๓Fศำ;ošกรปj่ฝย๚[วฉซ๋์5สหหCLL  งงWแผ˜9ๆDŽ9‘cNไสš“‚๗๏ŒŒŒbฯ r‰ˆˆˆˆdX$‘ ‹D""""’a‘HDDDD2,‰ˆˆˆH†E"ษฐH$""""‰DDDD$Sกพq…L:๖กcaQaผt๒๒€›1ะq o๖JDDg‰ˆˆˆH†E"ษฐH$""""^“H/อ?z84Fๅล๋qบ฿†๒ˆˆ่ตเL"ษฐH$""""‰DDDD$ร"‘ˆˆˆˆdX$‘ ‹D""""’a‘HDDDD2,‰ˆˆˆH†Eโ+๒oฟมมม^^^ฅถFe3..!!!ฒๅฉฉฉhัขE™๚$"""X$พ2kึฌม๔้ำq่ะก"|ธิVฃั`๔่ัptt„ซซ+โใใ+Vฌภฤ‰ตbศฮฮฟํทGฃFคุŸฬ˜1pww‡ณณ3ถm8t่š4i‚oฟw๏}ฉ%""ขทศฎH\ปv-|}}‘˜˜ˆSงN!''8rไ’’’0fฬภ˜1cp๒ไIœ={gฯžERR’ิG๚๕‘””'''ฌ_ฟ @`` """ธu๋พ๒Kุc๛๖ํ๘๊ซฏˆˆˆ€RRRะฑcGนsฐqใFพ}ษษษXฑbBCC_ธ?๑๑๑Xฑb’““ฑkื.$$$hญ_ถl์์์p๒ไIQล๒Ÿ+oธš5kbฤˆ Aff&ึญ[':็Ÿ TญZ๓t_Iโ๗฿G||ม•+Wะพ}{ธบบขC‡ธs็ภึึููู€+V`โฤ‰€ & qใฦprrยฌYณ ศ>ž•ššŠฯ>๛ 7–๖mห–-hุฐ!š5k†'NHmOž< 777(•JŒ1B*f‹Š /^ '''ธปปใ๗฿—โฤ xyyกiำฆู่ณ'=zฺ่ต+z๔่ฝ{๗B๑ย฿5ไไไ@ญVk=ˆˆˆ่ํ๔REโฺตkแ๋๋‹ฤฤDœ:u ะznccƒ้ำงCฉT"11&Lœ={ทoวš5k†)Sฆ !!s็ฮลธqใฝz๕ยษ“'q๖์Yaถmาธ8sๆ <==1z๔h์ุฑ›7oฦดiำŠ๗๊ีซ8x๐ ๆฬ™ƒQฃFaูฒe8u๊Œฏฟบศํ๎฿ฟ7"%%III๘เƒ ศ>๒๓๓ฑu๋V [ทnฐถถฦ้ำงแโโ‚วcฬ˜18pเ>Œ๓็ฯKใ 4‹/Frr2๙็ฌ]ป๖…ฟ…Bคค$|๙็;vฌึบ\L˜0[ทnล้ำงัฌY3,Zด‡aร†a๑โลpttฤ์ูณq๏ฝbวš1cฬออฅG:u^UL•^fcwww„††BGG={๖„———ึs{{๛Bท๋ะกLMM๛๗๏GJJŠดNWWคยGญV#==u๊ิAPP s็ฮฅR …BCCC8::โๆอ›ลฦตkW่้้!33GŽ‘๚หฯฯGฝz๕Šฮ&&&2dบvํŠN:Gืฎ]qyฌ\นžžžZ}]บt ๖๖๖ฐถถt๏=Bzz:4 \]]}๛๖Ell,๚๕๋W์>…„„‚‚‚0rไHูXgฯžE›6m<-ตkเiqูพ}{ดo฿7ยยยPปvm\ปv ตjี*tฌI“&IE<จีjŠDDDoฉ—*ฝฝฝq๐เAlถ ปwวย… eฯ +พŒฅŸ NŸ> ํIอกC‡"66 4ภ์ูณ๑๐แCiพพ>@GGG๋็]kX0ฎFฃตต5emtuuฅS999€J•*!!!ปvํBTTขฃฃ๑๗฿ูวŒ3ฐhั"ผ๛ฦ!Cะ Aญ}.์็ขSI๚Bภปw๏.ด฿‡b๚๕Xถl*WฎŒUซVมสสชศ8 ```๐ยx‰ˆˆจโ{ฉำอ7n@อš51bฤ„„„เ๐แรZฯ“““ajjŠฬฬฬ"๛๐๒๒’>ุขัhœœ ศสสB๕๊ี‘๕๋ืฟL˜2ๆๆๆจZตชT<ๅๅๅแย… $&&Bฃั`๛๖ํžS ฤฬ™3‘˜˜XlŽŽŽXดhฮœ9ƒ  OŸ>hำฆ RSSัจQ#คคค -- yyyˆŽŽTฉRบบบHJJ๐๔T~ม,da1(ศอ๖ํแโโขตฎqใฦธ~บVN ฎ[๘ใฅ๋FWญZ…ฝ{๗ขgฯžาL.ทฝิLb\\fฮœ }}}XXX PฉTา๓u๋ึมยย*• *• ๛๗G๕๊ีต๚Xฐ`†Žˆˆไๅๅaภ€P*•˜ไ˜9ๆDŽ9‘cNไสš“‚๗๏ŒŒ ˜™™ูŽ฿ธBDDDD2ฏf๚็ ฒkื.|๚้งZห:t่€oฟถœ"""""ชxบ"ั฿฿ๅQ…ฦำอDDDD$ร"‘ˆˆˆˆdX$‘ ‹D""""’a‘HDDDD2oง›้๕๛3XXX”wDDD๔ q&‘ˆˆˆˆdX$‘ O7ำKxm-Œ๎–zป ‡ ััซภ™D""""’a‘HDDDD2,‰ˆˆˆH†E"ษฐH$""""‰DDDD$ร"‘ˆˆˆˆdX$‘ ‹D""""’y๋‹ฤ๔๔t,[ถฌผร(V5สด]\\BBBdหSSSัขE‹— ‹ˆˆˆรำEb~~kๅมƒฏuผโddd@QaัชB‰iiihีชœกRฉp๔่Qญ็/^ฤไษ“‘œœ gggฬš5 +Vฌ@=เใใƒ๛ใฮ; ‚››ผผผp๙๒e@dd$กRฉ0hะ h4@๋ึญ1~xธธธภ hืฎ๊ึญ‹;vศb|๒ไ ขฃฃแ็็‡ัฃGฒฒฒ {{{ >\jซัh0z๔h8::ยีี๑๑๑€+V`โฤ‰R;[[[dgg๎฿ฟ๖ํฃQฃF˜2eJกใ3๎๎๎pvvฦถm‡B“&M๐ํท฿โ๎ปฏโืADDDo‘ ]$ฎ]ปพพพHLLฤฉSงpเภญ็666˜>}:”J%1aยภูณgฑ}๛vฌYณaaa˜2e 0w๎\Œ7ะซW/œ๛์3@PPŒฅๅ}๚๔Bก€Rฉ„ฑฑฑT@ลหห ึึึ€nบแ๐แรฺ่ตซด~ฯž=HIIมŠ+™™™HKKƒ ฌฌฌ0qโD|๚้งุพ};z๖์‰,Xฐ ะฑfฬ˜๐๐๐bใ!""ขทC…žI๔๖๖ฦมƒaii‰๎ป#//O๋๙พ}๛ ฎ (…BำงO#11Qš€กC‡J3tcฦŒANNŽดพพ>@GGG๋็‚kU*–,Y‚ร‡ฃ{๗๎๘ๅ—_››ซƒBก(๑~๊๊๊Jงปhล๒l? …Bึฏ๛฿คปy๓&lllค๕gฮœมจQฃ0~x <ใว/2ŽI“&!##Czบuซฤ๛@DDDK….oธš5kbฤˆ มแร‡ตž'''ริิ™™™E๖แๅๅ%}ฐEฃั 99ภำ๋ซWฏŽ์์lฌ_ฟพTqโ๗฿G||,,,ะฟจT*้๙บu๋`aa•J•J…๛ฃz๕๊Z},Xฐร‡GDD๒๒๒0`ภ(•JLž<M›6…••\\\สฃณณ3"##๑๐แC?~0jิ(๔ํ๐๖๖†•• G8x๐ ”J%๔๕๕ฑ|๙r€งง'LLL`oo///ิฉSG๊ฟy๓ๆ ล7777คฆฆJ๋‡ †kืฎมษษ 5Btt4Œ…† –y฿ˆˆˆ่ํฅผ •‘Zญ†นน9"O,€‘นaฉทะpศฟU๙สหหCLL  งงWแ”;ๆCŽ9‘cNไ˜9ๆDฎฌ9)xฮศศ(๖ฌ`…>LDDDD‰DDDD$ร"‘ˆˆˆˆdX$‘ ‹D""""’a‘HDDDD2,‰ˆˆˆH†E"ษฐH$""""™ ต|๔f่Qท7,,,ส; """z…8“HDDDD2,‰ˆˆˆH†E"ษฐH$""""‰DDDD$ร"‘ˆˆˆˆdX$‘ ‹D""""’a‘HDDDD2,‰ˆˆˆH†E"ษฐH$""""‰DDDD$ร"‘ˆˆˆˆdX$‘Lฅ๒€*.! 33zzzๅอ›!//=‚ZญfNภ|†9‘cNไ˜9ๆDฎฌ9Qซี๏}ผ(,ฉฬ๎฿ฟฐณณ+็Hˆˆˆจด233ann^ไz‰TfีชUผyณุƒ์y๎๎๎8y๒dฉวซฉีjิฉSทn‚™™ูฟ:VEุฎฌ๙(หXe;ๆD๎mฯษ๋|-)๋xฏ{ปท9'แ=GฬฬLิชUซุv,ฉฬttž^าjnn^ชƒSWWทิเi;033cNžQฺ|ผฬXe;ๆD๎mอษ๋|-y™๑˜“Wณ]ExฯPขษ~p…^ปQฃFฝีฝฮฑ*สvฏsฌŠฒ๋ซขl๗:วzฝฮ|ผฬxฬษซูฎ"””Bผ่ชEข"จีj˜››###ฃฬผm˜mฬ‡s"วœศ1'rฬ‰ฟฮ$R™`ส”)000(๏Pฬ‰6ๆCŽ9‘cNไ˜9ๆD๎฿ฮ g‰ˆˆˆH†3‰DDDD$ร"‘ˆˆˆˆdX$‘ ‹D*“ˆˆฺฺุยะะอ›7ว‰'ส;คืf๊ิฉP(ZฦK๋ณณณ1jิ(XXXภฤฤปwว;wส1โW๏เมƒ่าฅ jีช…Bอ›7kญBเห/ฟDอš5add___\นrEซอ?ƒพ}๛ยฬฬ UชTมเมƒ๑๐แรืธฏึ‹r*;n:t่ ีๆmสษŒ3เ๎๎SSSXZZขkืฎธt้’V›’ญผy:u‚ฑฑ1,--1aย\ซอ”“*•Jบฯ_ห–-+ญฏ#ภ‹s๒:‰Tj๋ืฏวธqใ0eสœ>}NNN๐๗๗วปwห;ดืฦมม๙ง๔8|๘ฐด.,, ถmร† ๐oฟ!-- บu+วh_ฝฌฌ,899!""ขะ๕3gฮฤ?€ศศH?~•+W†ฟฟ?ฒณณฅ6}๛๖ล๙๓็ฑgฯl฿พฤ|๐บvแ•{QN C‡ZวอฺตkตึฟM9๙ํท฿0jิ(ฤววcฯž=ศหหƒŸŸฒฒฒค6/๚[ษฯฯGงN››‹ฃGโ็ŸฦŠ+๐ๅ—_–ว.ฝด’ไ†ชuœฬœ9SZ๗ถๅคvํฺ๘๖oq๊ิ)$$$ mถ ย๙๓็๗Žเล9^ใ1"ˆJฉYณfbิจQา๓|QซV-1cฦŒrŒ๊๕™2eŠprr*t]zzบะำำ6l–]ธpAวŽ{Mพ^ฤฆM›ค็FิจQCฬš5KZ–žž. ฤฺตk…Bคคคโไษ“R›ุุXกP(ฤ๑ฺbท<Ÿ!„8p  *r›ท='w๏ฤoฟ&„(ู฿JLLŒะัั๕—ิๆวfff"''็๕๎ภฟเ๙œ!„3fL‘ผํ9BˆชUซŠeห–๑yFAN„xฝวgฉTrssq๊ิ)๘๚๚Jหtttเ๋๋‹cวŽ•cdฏื•+WPซV-ิญ[}๛๖ลอ›7งNB^^žV~7nŒw฿}๗?“Ÿ๋ืฏใฏฟาสนน9š7o.ๅเุฑcจRฅ ค6พพพะััม๑ใว_{ฬฏK\\,--ัจQ#Œ1๗๏฿—ึฝํ9ษศศ๐฿๙^’ฟ•cวŽAฉTยสสJjใ๏๏ตZฺป๓˜ฆ๏7เoJะZ ”าrXฯ ฒ •u›0วT˜๓ฺตƒGœวŒำเ20›fฒฬeห–]ๆŒ ’ ECD3ฬ˜จŽ ]t จˆq๕(`(จฅฯ๏ร7๖ื–รƒ*}^ ษ๗๘|ฟŸ็๓๐ฉyล๊ชส๓๊sา)''2™ QQQศศศ€ษd๖๕็œttt 77ญญญะh4๛์3L˜0gฮœA}}=D"คRฉี1จฏฏwNภ}ฌsœ๖ๆH็พ๚๚zศๅrซ๐๓๓๋ทyJJJย;๏ผƒ๐๐pิึึbบuHNNFYY๛uN, Vฏ^W_}QQQะฃฯJ}}ฝyิน๏yf/'’’•J…   œ>}1ชซซฑo฿>3'•••ะh4hoo‡X,F~~>ิj5***\vŽ8ส ะทs„‹Dฦz)99YX3f โโโ Rฉฐw๏^x{{;12๖,›;wฎฐ1cฦ 22:‰‰‰NŒ์้๛เƒpๆฬซgw]ฃœ< jtt4”J%Q[[‹ศศศพณOŒ1hjjB^^RSSqไศg‡ๅTŽrขVซ๛tŽ๐ํfึ+2™ ๎๎๎6o—]ฟ~ …ยIQ9—T*ล๐แรQSS…B{๗๎มh4ZตqฅtŽณซ9ขP(l^t2›อhllt™|‰Dธ๕๖<้.'๖TTT€ี<้O9ฑวbฑเ๎ป.9G้ฬ‰=OuŽ<ยK6ฬลๅๆๆ’——ํน“ฮ;G๏ฟ>IฅRซ7ฉ๚ณดด4า้tTWWG๙'ฝ๙ๆ›$“ษ่ฦDDดlู22dำ‰'HฃัFฃqrิOVss3•——Syy9 oฟ–สหห้ฟ#"ข/ฟ’คR)8p€NŸ>M3fฬ ๐๐pjkkฮ‘””D/พ๘"?~œJKKiุฐaคีj5ควึUNš››iํฺตTVVFuuu๔๛๏ฟำK/ฝDร† ฃ๖๖vแ)'ห—/'า้td0„“ษ$ด้๎ณb6›)**Š&OžLTXXH”‘‘แŒ!=ถ๎rRSSC7nค'NP]]8p€"""(>>^8GหIzz:9r„๊๊๊่๔้ำ”žžNnnnt่ะ!"rฝ9BิuN๚zŽp‘ศษ–-[hศ!$‰h๘๑t์ุ1g‡ิgๆฬ™CJฅ’D"ำœ9sจฆฆFุ฿ึึF+Vฌ ___8p อš5‹ ƒ#~๒JJJ€อOjj*=๘œO?”ษหห‹ฉบบฺ๊ คีjI,“D"ก… RssณF๓dt•“ษD“'Oฆ€€๒๔๔$•JEK–,ฑ๙Uส‰ฝ\ ฌฌ,กMO>+—.]ขไไd๒๖๖&™LFiiit>อ“ั]N๔z=ลวว“ŸŸyyyัะกC้ฃ>ขฆฆ&ซ๓๔งœ,ZดˆT*‰D"  ฤฤDก@$rฝ9BิuN๚zŽธ๕๎ฺ#cŒ1ฦ๋๏๘™DฦcŒ1fƒ‹DฦcŒ1fƒ‹DฦcŒ1fƒ‹DฦcŒ1fƒ‹DฦcŒ1fƒ‹DฦcŒ1fƒ‹DฦcŒ1fƒ‹DฦcŒ1fƒ‹DฦcŒ1fƒ‹Dฦ{ดถถBญVฃฅฅลูกX=z4สสสzuLXXJKKŸRDฝsแยผ๒หฮƒฑg‰Œ1ึaaa4hZ[[…m&“ ƒFXX˜UปB,ร฿฿ณgฯฦํทญฮUQQั๋ยdถm˜1cฤb๑cใI;{๖,4MŸ๔ฅำ้0t่Pซm ,ภ็Ÿศ็>|8 ~๙ๅ—ว ฑ~‡‹Dฦ๋กเเ`์฿ฟ_X?pเ”JฅMปC‡กฅฅzฝ๗๎CffฆียยB$%%๕ช๏Ÿ~๚ Zญ๖‘โ๎ ณูิ๛xVtŽUซีbวŽNކฑg‰Œ1ึCZญ999ย๚ฯ?Œy๓ๆ9l?hะ LŸ>UUUV;‹ฤถถ6hตZ๘๙๙มฯฯ&Lฐ{ฝ^kืฎ!::Zุ†ฏฟฃFยเมƒฑ~zTWWc์ุฑ๐๑๑มฒeห„ถ‹6l@hh(”J%VญZ…ปw๏v๎‰‰'b้าฅ๐๑๑AVV‘’’น\Žˆˆdgg;ใรทŽ 0bฤแ๊jnnฎรใ๚๋/ >Xปv-,‹ฐ๏๛๏ฟวฐaร “ษššŠึึVttt 99/^„X,†X,Fvv6rrr™™ ฑX,Œนฒฒ๑๑๑๐๕๕Ell,Nœ8!œออ [ทnExx8&NœˆGQQ‘KศŒ๕1ฦ๋–Jฅ"NG!!!tใฦ บqใ…„„Pii)ฉT*ซv๑555ัดiำhร† ย;w๎Bก ŽŽ๚แ‡hฺดid2™่๛t๔่Qป}PllฌM< ิะะ@UUUไๅๅE“&M"ฝ^Oƒฉธธ˜ˆˆถo฿Njตš._พLทnขW^yEˆ)++‹)++‹:::ศd2ั[oฝEiiiิNUUUคT*้ิฉS๓า9ภภ@*--%""ƒม@gฯžuxฬ /ผ@ƒฎ^ฝJjตšv์ุADD{๗๎ฅจจ(บt้™L&าjต”––FDD%%%iuฎิิTสฬฬึ›››)((ˆ๒๒๒ศl6S~~>…††R[[ ้ำงSSS™L&แ8‰DB็ฯŸท/cฎŠฏ$2ฦXนปปใฝ๗รž={ฐgฯผ๛๎ปpwwทi—œœ ฉT ___\ธpห—/๖!!! €งง'p๑โExxx8ผ’h4ํ>‹ธjี*๘๙๙aไศ‘ˆ‰‰ARRBCCกP(€SงNrssฑvํZ„„„ภ฿฿๋ืฏว๎ป…๓DFFbม‚0`ššš ำ้ฐiำ&xyyaไศ‘HIIมพ}๛บองง'ชชชะาา…BตZํฐํ‡~…B   ฌYณ{๖์๐เถzFFT*ผฝฝฑn:ไๅๅuwง‚‚Œ=Z๘ฬœ9rนวŽฺคงงC"‘ภ[ุ6x๐`455๕ธฦ\‰Œ1ึ ๓ๆอรฎ]ป““ใ๐V๓ฏฟ ฃั“ษ„™3gb๊ิฉยพ‡ŸGœ?>1kึ,จT*lฺดษ๎๙|||์พี,—ห…eooo›๕ฮcฎ]ป†!C†๛T*ฎ]ป&ฌ‡„„หzฝํํํ€T*…T*ล?ˆ๚๚๚.๓yyyศฯฯGHH’’’lnณ?,44ิjู`0/]บT่๛ตื^รอ›7ปํ๛แ๘9"/•JQUUๅpผš››แใใำใ~s\$2ฦX/Œ;ธ}๛6ฦืe[///ฬŸ?'Ožฤญ[ทvํฺน\œ?‰D(ˆJJJp๖์YX,H$xxxุฝ}ญRฉ P(PYY๙H๑ฮ™3฿|๓ ฎ^ฝŠฦฦFdffb๎นvCฃัเ“O>ษd‚ูlฦ?ƒs็ฮuูวฝ{๗ฐkื.นsžžž‹ลvวาiห–-ธ~: พ๛๎;ฬž=ฐhั"|๑ลBQl0PXXเม•ำ›7oZ} ‘\.วฅK—„๕ท฿~ๅๅๅุฟ?ฬf3ฺฺฺPXXุๅญไฃGโ7€‡‡G—cdฬีp‘ศcฝคVซป|n๒ไษ‹ลษd())ม๛แๆๆf๓ี7ƒ3gฮ„D"มธqใฐt้R‡ฯ%.^ผุ๊9ยXผx1fอš…๑ใวCญV#&&็ไไเส•+ˆˆˆ€\.ว๊ีซัึึึm?ูููPฉT๐๕๕ลแร‡ฑu๋V‡mgฯž & ** “&Mยย… สสส์ฮfฬ•q‘ศc}ไซฏพยš5kเ้้้์Pcฌ[\$2ฦcŒ1L"cŒ1ฦณมE"cŒ1ฦณมE"cŒ1ฦณมE"cŒ1ฦณมE"cŒ1ฦณมE"cŒ1ฦณมE"cŒ1ฦณมE"cŒ1ฦณมE"cŒ1ฦณ๑?L่{คึIENDฎB`‚c4core-bm-charconv-atof-mega_bytes_per_second-float.png000066400000000000000000001035731477602032300335550ustar00rootroot00000000000000c4core-0.2.6/doc/img/windows-x86_64-vs2019-Release‰PNG  IHDR~U้— 9tEXtSoftwareMatplotlib version3.5.3, https://matplotlib.org/อ+นา pHYsaaจ?งi†่IDATxœ์wXื๛6๐{AšาฅX"h์ฐ,Aบ…ˆขข(*๖XขQcŒ’ุขAล• Fc‹~ํ]Q์ ฅE์Kl…E”"œ๗^ๆ—•*ฝ?ืตืลฮœ9๓ฬณณปgสส„DDDDTแi”uDDDD๔~ฐ๐#"""R,ˆˆˆˆิ ?""""5มยˆˆˆHMฐ๐#"""R,ˆˆˆˆิ ?""""5มยˆˆˆHMฐ๐#zEbb"d2ๆอ›Wึกชeห–ฐถถ.๋0JL&“aิจQe}@"##!“ษYึกจฝB__ฟฌร(ต‡ย฿฿&&&ษdXดh‘Z๏_,จ\JHHภดiำ˜˜Xึก•‰“'ObฺดiHNN.Q๛+Wฎ`์ุฑpqqฎฎ.d2Yก๏™L™L†!C†8?((Hj๓๘๑ใRnมYปv--Z๔ฦ”'q›*ชฑcวb฿พ}˜4iVฏ^vํฺฝ—๕พ๎{๘}aแGๅRBBฆOŸฮยิึษ“'1}๚๔iœ:u ‹/Fjj*š4iRl{]]]๏Cfffพy๋ึญƒฎฎ๎๋†\จาIx๑โ<<>}๚๔)ถ}ปvํ T*ฑgฯ•้'Ožฤอ›7ักC‡Rล๑ฆาำำ‘““ ่๊๊BCƒ_S๊เ]~^๔S\ธp@๎๙จปvํยญ[ทคํฐดด๐๛็๚๕๋๑ํท฿ขVญZจ\น2”Je็`ๅZ~ไ~ึ๘๚๚ขJ•*055•๗ฝฺ็ตkืะญ[7˜››CWWตkืF@@RRR ๆขถ ศ-4>๛์3˜™™AWWถถถ๘๗฿K”ฯผ๗ั๑ใว๑ษ'Ÿ@WW๕๊ีรชUซTฺM›6 2™,฿๒y๛ิ๗•ผ>###ฅ๗ฆ”‡อ›7รฦฦบบบฐททGtttฑ๗฿๐๖๖F•*UPณfMฬ˜1#฿{)''‹-Bณfอ ซซ 333 6 OŸ>-p; ๚ผ8pเ`ll }}}4jิ“'OVYพ$ŸyนB 44TzญŠฒqใFุCOOีซWG฿พ}๑ฯ?จด‰‹‹รภQฏ^=่๊๊ยƒFRR’ิฆ4๏แ๗FฝG7nถถถbส”)b๙๒ๅb๒ไษขjีชขnบ"--M!ฤ7ฤ่ัฃ1y๒dฑz๕jฑz๕j๑เม!„SงN„———Xฒd‰5j”ะิิŽŽŽ"33S!ฤำงOEํฺต…ฃฃฃx๙๒ฅBˆฐฐ0@ฌ^ฝบศoผ)aii)ๆฬ™#ฆOŸ.ชUซ&jิจ!ล!„๕—022M›6sๆฬK—.B&“‰อ›7Kํยรรagg'Zทn-–,Y"ฦ/455E=Tึ.d2™ฐถถณfอกกกbศ!ข_ฟ~ROOOQณfMQงN1fฬ๑ำO?‰ึญ[ b๗๎Rปร‡ BกPgggฑx๑b1z๔h!“ษD@@€่ปทh฿พฝ ๚๕ฤ๔้ำUโqtt .K–,mถฤาฅKUฺีญ[W|๑วขjีชโ›oพaaaโ๐แรB!ˆ‘#GJmƒ‚‚„L&ห—/W้รำำS”ไc้ๅห—ขM›6€K—.มมมขu๋ึb๋ึญB!rrrD๋ึญ…L&C† K—.:uฤ—_~ฉาakk+,,,ฤ๗฿/-Z$๊ีซ'*Wฎ,?~,„โ๙๓็B___Œ1"_<ญZตอš5“žฟ๎~ัดiSแ้้)–,Y"fฯž-bccEฏ^ฝฑpแB้=๐์ูณbs#„!!!€ธy๓f๓๓^ๅห— ===‘šš*„"++KิจQCK๏ณทศu๕๎[hkk‹qใฦ‰+Vˆ9sๆˆN:‰?๘C!ฤ๛…BกีซW—ถcห–-Bˆ?›6m* …Xฐ`iiiาผผ}Hˆ’๏๗ฯž=๕๊ีzzzโ›oพ‹-Ÿ|๒‰ฐตตU้3##CXYY‰š5kŠ™3gŠ+Vˆ้ำง GGG‘˜˜X่6ตMฯŸ?Mš4ZZZb์ุฑb๑โลย]‹-*2—Bไพ5j$ฬฬฬฤไษ“ลาฅKE๓ๆอ…L&๕—ิ.๏๕yU>๕฿ื>ฏO 1mฺ4ฑpแBQซV-กฏฏ/๘ใ๑ัG‰ูณg‹ูณg ###๑๑ว‹์์li๙]]]ั Aัฏ_?ฑt้RัฑcG@|๗w*๋2dˆจTฉ’:tจ 'NUชTQ๙|ฮ‹ฉ ฯ‹ฟ๚Khkk ๑ใ?Šฐฐ0๑ีW_ •๕”ไณโฦb๕๊ี€๘๔ำOฅืJQเ•—;GGGฑpแB๑อ7฿===aii)ž>}*ต›7ožpww3fฬห—/cฦŒzzzโ“O>999B๑ฦ๏แw‰…ฝWฯŸ?ฯ7ํิฉS€Xตj•4mใฦ๙”B๑่ั#กญญ-ฺถmซ๒มดt้R@๖oาด}๛๖ bๆฬ™โ๏ฟ๚๚๚ขK—.ลฦ˜W๘้้้‰ปw๏Jำฯœ9#ˆฑcวJำฺดi#lllDzzบ4-''Gธธธˆ Hำ๒>Pผผผค!„;vฌะิิษษษB!’““…prr/^ผP‰๋ฟหๅ}่7gย\t๋ึMš–๗แfmmญ๒กซW/!“ษD๛๖ํUึแ์์,๊ึญซ2ญ ืฬ[ิซWOeZบuฑw๏|ํ[๘?^hhhˆ•+WๆkWาย๏ท฿~ฤ‚ ๒อหหำึญ[ฅืฟ…L&ืฏ_W‰O[[[eZllฌ –,Y"M๋ีซ—055•™Bˆ๛๗๏ 1cฦ iฺ๋๎nnn*} Q|๑V”’~Ož<ฺฺฺา—แฎ]ป„L&‰‰‰%.ŒŒŒTŠ๚‚t่ะ!฿~%ฤํŸ๕๊ีหทŸV๘•dฟŸ?พ  „/^ผ7V้3::Z7n,2ืูฆE‹ Rแ+„™™™ยููY่๋๋ ฅRYdฟy๏ฃฃGJำ=z$tttฤ๘๑ใฅiฏ[๘'Ož”ฆๅ}>๊้้‰[ทnIำ—-[–/๏ ฤ_|!Mหษษ:tฺฺฺา>r์ุ1@ฌYณF%ฆฝ{๗ๆ›^ุ็ลย… Kด฿•๔ณBˆx ‘สฬฬฆฆฆยฺฺZๅณw็ฮ€˜2eŠ4ญ ฯฤu๋ึๅ{ไ=.๑P/ฝWzzzา฿YYYHJJยว ccc้ะPQ<ˆฬฬL|๙ๅ—*็ :†††ุตk—4ญmถ6lfฬ˜ฎ]ปBWWทศCฏ๊าฅ jีช%=ไ“Oเไไ„ปwž๚๖ํ+=ืึึฦ'Ÿ|‚ฟ;฿ถ๔๏฿ZZZาs'''!0x๐`•vNNNธs็^พ|)M๛๏k–’’‚วรำำwพรaVVV๐๖๖ฮท~ ๗žQฃFแวฤไk™๏ะQA๗ฟกz๕๊๘โ‹/๒อหหำ๎ปกฉฉ‰ัฃGซฬ?~<„๙ฮm๓๒๒B๚๕ฅ็rน†††*๙์ูณ'=zคrจpำฆMศษษAฯž=”nฟ:t(455‹๎ทญjีชhืฎึญ[ ๗‚ิญ[ทฤ}ใฬ™3%>}ข  PูฯŠR’~๏ฝจUซ|}}ฅiบบบ:tจJ_FFF€}๛๖แ๙๓็ฅŽฟv๏ sss๔๊ีKšฆฅฅ…ัฃGใูณgž*๐ชฆM›ย]z^ฃF 4jิจภ๗vI5mฺฮฮฮาs'''@๋ึญ๑ัGๅ›^ะบ{Kฆผำ#233q๐เAน‡IŒŒ๐้งŸJ๛ใวaoo}}}>|Xฅฟ‚>/๒ฮลถmrrr ž’~V”TTT=z„#Fจ|๖v่ะ7V๙n๙๏พšžžŽวฃE‹Pข๏ฑฒฦยซ/^`ส”)า9WีซWG5œœ\ไ95y๒ คFฉLืึึFฝz๕ค๙yๆอ›‡jีช!&&‹/†ฉฉi‰cmะ Aพi 6”ฮัธ~:„๘๎ป๏PฃF •วิฉSไž๋๓_€rฟxH็ฟไŸV’๓ซjืฎฏฌZตjพsi Zo^:u๒MฯษษQy-Nœ8///TฉRฦฦฦจQฃ†tพMA…_aVญZ…ะะP,YฒDๅKฑ4nธFกRฅJ…ถนu๋jึฌ™๏ผทผ+^_W^อ?Ÿํฺตƒ‘‘6lุ Mฐa 6l t๛EQy{ืz๗๎เ๖ํุบu+z๗๎Zหฯ;๕๊ิฉƒO>๙ำฆM{ํๅuถฟ$๛ญ[ทPฟ~|ํ>๘ใ|๋7nVฌX๊ีซรกกก%๚,*ฬญ[ทะ Aƒ|ฅถ฿ค$๛โ๋zฯ๙ึฅกกz๕๊ฉLห็๓>ฏ]ป†””˜ššๆ๗Ÿ={Vขพgฯžpuuล!C`ff†€€๙็ŸEoCa฿-ะธqc•ืํษ“'3f ฬฬฬ งง‡5jH๒&๛ฮ๛R๘ง&ั;๐ล_ <<_~๙%œadd™L†€€€w๒ฦŽŽŽ–>lโใใ฿ธเ๘ฏผxฟ๚๊ซBGน^ข)lTง4นพN_…ต-ฎ7n M›6hธ1,X€:u๊@[[ปw๏ฦย… ๓ฝfEฺธบบ"&&K—.E=PญZตB–…’ไSGG]บtม–-[๐ำO?แแร‡8qโ~๘แฉMi๖‹’Žvฝ พพพะััม€‘‘=zผึ๒=z๔€ปป;ถlู‚๛๗#$$sๆฬมๆอ›ัพ}๛๕๑:6฿C0| 8ถmร๛1z๔hใ๔้ำจ]ปvฉ๚|S%ูฦย.Rศฮฮ~ญ>฿f>srr`jjŠ5kึ8ฟF*ฯ z๕๔๔p๔่Q>|ปvํยฝ{ฑaรดn๛๗๏/“‘๑W๕่ั'Ožฤ„  P( ฏฏœœดkื๎จo ?zฏ6mฺ„`๙าด๔๔๔|๗9*์C-๏ิ•+WT๛ฬฬฬฤอ›7แๅๅ%MKKKร AƒะดiSธธธ`๎น๐๓๓ƒฃฃc‰bฝvํZพiWฏ^•ฎห[ฟ–––สz฿Dกฦฟ๚+_qPv์ุŒŒ l฿พ]eฤเีC6%๑๑วc๎นhูฒ%ฺตk‡ˆˆˆืบ ๕ฟ๊ืฏ3gฮ ++Kๅ๖ีญ[Djjชสz๒ฎ|ร™ีณgO๛๏ˆˆˆภฅK— „๓ooฟ(๎๊รทEOO]บtม๖ํฃz๕๊ฏ‡……FŒ#FเัฃGhผ9fอš%~๏k[๒ิญ[ Bจฌ๛๚๕๋ถทฑฑ พ๖[œึ>k_๕฿๏–ึญ[ซฬปrๅŠ4้ำงˆˆˆภ๔้ำ1eสฉMA฿๏{ฟ/)๊ฅ๗JSS3฿’K–,ษ๗_j•*U _A่ๅๅmmm,^ผXฅŸ_)))*๗›8q"n฿พ฿ ,€ฅฅฅ4ชQ[ทnU9๋์ูณ8sๆŒ๔efjjŠ–-[bูฒeธ~พๅ บMKqฺถm #==]e<Ÿฅค๒ป๏บSRR^ชไr9v๏K—.กSงN๙๎Uานt๋ึ ?ฦาฅK๓อห‹ีววููู๙ฺ,\ธ2™ฌฤฃQฏ๒๒๒BตjีฐaรlุฐŸ|๒‰ส!ซทต_๖xพ๚๊+L:฿}๗k-—๏ะ–ฉฉ)jึฌฉ๒>ซRฅส{=ๆํํ๙Gๅ๖9้้้๘ๅ—_Tฺ)•J•๓Y"PCCฃุฯ‰ยถษวว฿ฒ/_พ,ัพไษ“|ำ จผ&ฏs๋ง’ppp€ฉฉ)ยยยTึณgฯ\บtI๚n)่3@7๓~Ÿ๏แืม?zฏ:v์ˆีซWรศศM›6ลฉSงp๐เA˜˜˜จดS(ะิิฤœ9s’’้^r“&Mย๔้ำัฎ];๘๚๚โส•+๘้งŸเ่่(๔}่ะ!๔ำO˜:u*š7o ๗~t-[ถฤw฿}Wเ}ฟ^๕๑วรออ ร‡GFF-Z|๕ืR›ะะPธนนมฦฦC‡Eฝz๕๐๐แCœ:u w๏Ell์kๅวะะ .ฤ!Cเ่่ˆฝ{ฃjีชˆล๓็ฯ฿้‡zAฺถm mmmt๊ิ ร† รณgฯ๐ห/ฟภิิดภขฆ$Zดhmถมววุบuซ4jืฟ9rคุ"ทXตjฦ‡ณgฯยiii8x๐ FŒฮ;ฃSงNhีช‚‚‚˜˜[[[์฿ฟถmร—_~ฉr!ว๋ะาาBืฎ]ฑ~zคฅฅ๘›ฮocฟฐทท๛๓iะาาBงNค/“WฅคคH๗Dร„  ฉฉ‰฿~๛ 5jิภํท฿ส:KWW{๗๎ล€เไไ„={๖`ืฎ]˜๙ไฑn:iพงงงส}ใ๒ 0@ๅyฟzปŠยโ)่ทorน\่๊๊J๗5ฬปสซทŒ่ะกC„Š‚oงฐm6QฉR%ัณgO้ึ<ฏs‹†็ฯŸ‹   aee%ดดด„นนน๐๗๗7nฺคฆฆŠฑcวŠš5k ---ั AขrkœยโหฆW๗K!„8pเ€ d2™ธs็N๑ฝษ~‘็๛๏ฟตjีล"oฟ-่๑๊mG *ษํ\222ฤ„ „ญญญ000UชTถถถโงŸ~Ri๗์ู3ัปwoallฌOa๛็็ฝz;—’์๗B๑๗฿‹:===QฃF 1~x๑ฟOงOŸ–ฺ |(}ฮikk ^lŸB>๒๔๔žžž*ำฮŸ?/œœœ„ถถถ๘่ฃฤ‚ ฝKA}ด๗๓/ฯ€D•*Uฤ7DถmEๅส•…™™™˜:uชสmต๒,_พ\ุ ===a`` lllฤื_-๎ปWlLขs็ฮขfอšB[[[ิฌYS๔๊ีK\ฝz5_>J๚YQะv๖ูปaรagg'tttDตjีDŸ>}Tn๋%„w๏~~~ยุุX‰๎ป‹{๗๎ b๊ิฉ*m_็=พศ„(ƒใGDDD๏ูขE‹0v์Xฝ{WๅVMD๊„…U8/^ผศwฟ5;;;dggK%ฉ#žใGDDNืฎ]๑ัGAกP %%๑._พ\่ญFˆิ ?""ชpผฝฝฑbล ฌYณูููhฺด)ึฏ_ฏr๋"uฤCฝDDDDj‚๗๑#"""R,ˆˆˆˆิ ?"ขทไฮ;ะีี•n \DFFB&“!22๒๛jูฒ%ฌญญ฿<จr E‹*7s'๚Pฐ๐#ขreๅส•ษdษd8~xพ๙BิฉS2™ ;vT™—ท\ฃJ•*hฺด)fฮœ‰็ฯŸธพ๘๘xศd2œ={๖cŸ1cœœœเ๊๊๚ฦ}Qษ๐รุบukพ้'OžฤดiำูฯeMœ8กกกx๐เม;้Ÿ่]aแGDๅ’ฎฎ.ึฎ]›o๚‘#Gp๗๎]่่่ธงŸ~ŠีซWc๕๊ี˜?>์์์๐w฿aภ€ถ฿ตkLMMแ่่๘F๑๛๏ฟ๘๗฿๘F”7x๑โ<<<ส:”U๘MŸ>~;w†กก!~๚้งwา?ัปยนQนไใใƒ7b๑โลจT้>ชึฎ] {{{<~ธภๅ6l(f3"33›7oFzzบ๔{ญyv๏๖ํKฟ฿ZZ๑*Uช๔Nƒ๖uฅฅฅฝ๑๏‚jhhไห™:{9*Wฎ ๘๛๛cีชU˜>}๚๏?D๏ Gˆจ\๊ีซ’’’pเภiZff&6mฺ„ฝ{ฟV_ๆๆๆษd*$$''ใไษ“่ะกƒ4m๚๕ฐทท‡ accƒฑุulบNNNะืืW™žw^[\\<==Qนre|๑วุดi€L'''่้้กQฃF8x๐`พพฃฃฃัพ}{B__mฺดม้ำงUฺไ"?rไFŒSSSิฎ][šฟgฯธปปฃJ•*000@‡p๑โลbทซ sฎ]ป†nบมบบบจ]ป6’’Rlpyธธธ@OOVVV หื&##SงNลว ิฉS_5222ค62™ iii๘๗฿ฅร๛ฤดiำ0aย€•••4/11QZ๖?€ฝฝ=๔๔๔PญZ5เฮ;*1ไฝv็ฯŸ‡‡‡*WฎŒษ“'K๓?๔Sบu 111%ฺnข๒€…•K–––pvvฦบu๋คi{๖์AJJ  ].==?ฦใวq๋ึ-ฌ]ปฟ;z๗๎ฏ๐ทod2ฺถm 8pเz๕๊…ชUซbฮœ9˜={6ZถlY์ลYYY8w๎š7o^เงOŸขcวŽprrยนsกฃฃƒ€€lุฐ๐๑๑ม์ูณ‘––คฆฆJห^ผx๎๎๎ˆลื_๏พ๛7oDห–-qๆฬ™|๋1b0eส|๓อ7€ีซWฃC‡ะืืวœ9s๐w฿!!!nnn*ลPIdffยงOŸฦ_|ะะP|๙็๘๛๏ฟKtX๕้ำง๐๑๑ฝฝ=ๆฮ‹ฺตkc๘๐แ๘ํท฿ค6999๐๕๕ลผy๓ะฉS',Yฒ]บtมย… Unภผz๕j่่่ภ]:ผ?lุ0tํฺฝz๕,\ธPšWฃF ภฌYณะฟ4hะ ,ภ—_~‰ˆˆxxxไ†คค$ดo฿ …‹-BซVญคy๖๖๖Pก.ๆ!5 ˆˆส‘๐๐p@œ;wN,]บTˆ็ฯŸ !„่ฝปhีช•Bˆบu๋Š:จ,  ภG—.]Dzzzพu๕๋ืOxzzJฯวŒ# ลห—/_+ๆ๋ืฏ bษ’%๙ๆyzz bํฺตาดห—/ BCCCœ>}Zšพo฿>@„‡‡Kำบt้"ดตตล7คi๗๎ยรรCš–—7777•๘SSS…ฑฑฑ:tจJ\<FFF๙ฆฟ๊๐แร€8|๘ฐBˆ่่h@lธฑ่ค /๓็ฯ—ฆedd…B!LMMEffฆBˆีซW q์ุ1•ๅรยยqโฤ iZ•*Uฤ€๒ญ+$$D7oT™ž˜˜(455ลฌYณTฆววว‹J•*ฉLฯ‹7,,ฌะmาึึร‡/v‰ส Ž๘QนีฃGผx๑;w๎Djj*v๎Y์aฮ;ใภ8pเถm†I“&a๏ฝ่ป7ฤ~จ(''{๗๎U9ฬkllŒดด4•รห%‘””จZตj๓๕๕๕UF)5jccc4iาNNNา๔ผฟ๛o@vv6๖๏฿.]บ ^ฝzR; ๔๎ว‡RฉTYืะกCกฉฉ)=?pเ’““ัซW/i$๔๑ใวะิิ„““>Zjdd wดดฐ+ฅ‹RฉR% 6Lzฎญญaร†แัฃG8<`ใฦhาค 7nฌs๋ึญเตcฏอ›7#''=z๔P้ 4ศืทŽŽ ThUซV-๔|Sข๒ˆwQนUฃF xyyaํฺตx9ฒณณแ๏๏_ไ2ตkื†———๔ืื&&&๘๊ซฏฐs็N้โ‹s็ฮแ฿U)FŒ?ํทGญZตะถm[๔่ัํฺต+Qผข_ภฌ]ปvพ“ŒŒPงN|ำ€รก@๎•ยฯŸ?GฃF๒๕ูคIไไไเฮ;hึฌ™4สสJฅตkื@*š^ehhXิ&ๅcee…qใฦaม‚Xณf แ๋๋‹พ}๛J๑ฅfอš๙.8iุฐ! 11-Zดภตkืp้า%้ะ์ซ=z๔Z1ืตkื „@ƒ œฏฅฅฅ๒ผVญZะึึ.ด?!/์  ?"*ืz๗๎กC‡โมƒh฿พ=Œ_ป6mฺŽ=*~ปw๏†ฅฅ%š6m*ต355ELL ๖ํ‡={๖`ฯž=G๑๛๏ฟฺฟ‰‰ €+ุ^๕฿ธ’L/ฌ€, ===•็999rฯ‡377ฯืี๓Kb๙8p ถm†๛๗c๔่ัฦ้ำงU.()ญœœุุุ`ม‚ฮต`~พe2๖์ูS`_ฝ8็ี|พ*99ีซW/u}6l(U/_พ<{๖Lšถkื.๘๘๘ไkซญญN:กSงNศษษมˆ#ฐlู2|๗w๘๘ใ ์ฃ>‚žžnผYช๘ SฃF Tฎ\Wฎ\ษ7๏๒ๅหะะะ(ถช_ฟ>€ข๖ฟ#กoสฦฦ666๘๖oq๒ไIธบบ",, 3gฮ,rน{๗๎ๅปอฬีซWไ^ะ“sll,ฺดiS์hZa๓ ›^ฟ~}!`ee%4–ึ?ƒฬฬL4iาไ๚!zŸxŽ•k๚๚๚๘๙็Ÿ1mฺดR฿#oวŽ[[[ภร‡qแย•รผภซ—GCCrนTn#๒*---888 **ชT๑FSSmถลถmTฎพ}๘๐!ึฎ] 77ทbีz{{ระะ?๐ฒฒฒ๒อ๗฿_+&ฅR)าylll กกQdŽ๒ผ|๙ห–-“žgffbูฒeจQฃ†t•l=๐ฯ?เ—_~ษท‹/––&=ฏRฅJW็–ฏฮฺ๋ต+4551}๚๔|#ซBˆ|๛@Q๒ฮItqq)๑2De#~DT๎๖ซนz๕*๘ใน7=}๚4~w|๑ว่ืฏ€รผบบบ*ทๆ€!C†เษ“'hบ5jืฎ[ทnaษ’%P(ลŽ๊t๎AAAP*•ฏ}\Qfฮœ‰ภออ #FŒ@ฅJ•ฐlู2ddd`๎นล.ohhˆŸ๚๕C๓ๆอ€5jเ๖ํุตk\]]ฑt้าวs่ะ!Œ5 ปwGร† ๑๒ๅKฌ^ฝššš่ึญ[ฑหืฌYsๆฬAbb"6lˆ 6 &&ห—/—ฮฏ๋ืฏ๓Oโ๐แรpuuEvv6._พŒ?๛๖ํƒƒƒ€[ช๚vvv%ฮQ™+ป Љˆ๒๛๏ํ\ŠR’นhjjŠฺตk‹ฯ?\<|๘Pj็๏๏/|||๒๕นiำ&ัถm[ajj*ดตตลG}$† &๎฿ฟ_l>•*UซWฏV™๎้้)š5kVข๘๓ถaไศ‘*ำ.\ธ ผฝฝ…พพพจ\นฒhีช•8y๒คJ›โ๒v๘๐aแํํ-ŒŒŒ„ฎฎฎจ_ฟพ8p ˆŠŠ*rป^ฝห฿-,๊ืฏ/tuuEตjีDซVญฤมƒ‹์GˆหETT”pvvบบบขnบb้าฅ๙ฺfffŠ9sๆˆfอš QตjUaoo/ฆOŸ.RRRคv—/_BOOOPนตห๗฿/jีช%444๒ฺๅ๛ŸpssUชTUชT7#GŽWฎ\ษoAฒณณ…………๘๖o‹nข๒D&ฤœELD๔y๙๒%LLLŒ#Fผีพ?๛์3\ฝzวŽ{ซR๙ณu๋V๔๎7n€……EY‡CTb,ˆHญBคฆฆขfอšะะ(zL…I๎ป๗F?~NDDDe็ฮ;จ]ปv‘mX๘‘ฤภภp๓ๆMTซVญŒฃ);YYYุฟ?ฺถm+„”:br1น˜‡\ฬC.ๆ!WyษƒRฉD:uค๏๑ขฐ๐#Iแ]ƒท๚[ฃšฌฌ,Tฎ\†††jฦ<0y˜‡\ฬC.ๆ!WyหCINำโลDDDDj‚…‘š`แGDDDค&X๘ฉ ~DDDDj‚…‘š`แGDDDค&X๘ฉ ~DDDDj‚…‘š`แGDDDค&X๘ฉ ~DDDDj‚…‘šจTึP๙ใฝ่rด๕ห:Œ2ฃญ!0ษpŸ{™9ฒฒงฬ0น˜‡\ฬC.ๆ!๓+/Ž๘ฉ ~DDDDj‚…‘š`แGDDDค&X๘ฉ ~DDDDj‚…‘š`แGDDDค&X๘ฉ‰ _๘๙๛๛ฃE‹ฅ^>11›6m*ถฅK—`kk ;;;คฆฆพGฐตตลš5k`ii‰๔๔๔wPม ฟ@SS๓๚(iqตu๋V 4ััั000(ฐอำงO๗๏฿วีซW‹>}๚ผตุRRR „(uDDDTฑU˜ย๏—_~ lmm1u๊Tdeeแ‡~ภท฿~[ขๅ•J%Zทnๆอ›รฮฮวa฿พ}P(Xณf ๗_ดo฿666๐๖๖ฦร‡q๐เA๘ใ˜?>T๚Bเภ่ึญบt้่ิฉฎ]ป…B๘๘x•๖3gฮ„ตต5ไr9v์ุ๑Zฑ;v Mš4ม์ูณ๑่ัฃ7I'U@•ส:€ท!..กกก8qโ ๑ไษ,Xฐ ศ7๚ DTTยยยฐbล ่้้aถm000ภปwัญ[7œ9sณfอBXXึฏ_1b>๔SŒ7?๔‚‚‚ฐbล ย€ว#<<+WฎDณfอ///ภฆM›€ำงOซฤv๖์Yl฿พ็ฯŸว“'Oเ์์ŒVญZ•86pttDxx8Zถl น\Žภภ@ดlูฒภผedd ##CzฎT*฿์… ""ขrญBŒ๘EFF" †††€/^`0`@พถRqๆเเ€+Vศ™๛๚๋ฏaccƒŽ;โโล‹ฎ๋ไษ“่ท/ o฿พ8qโDพ6๗๎Cํฺต‡ศศH๙็Ÿ๘๔ำO!“ษŠŽ“'Oย฿฿:::ฐฐฐ@๓ๆอq๑โลวfff๘ๆ›op๑โE๔้ำปwว_|Q`เเ`I:u๊}ุ*Dแ๗ช˜˜$$$ภสส nnnˆŽŽ†ฏฏo‘หฌYณ™™™ˆ‰‰ALLฬญ฿ฬฬ ซWฏฦ๛๗แ๋๋‹_iiiฅ๎๏uc‹ŽŽฦศ‘#1~x|๖ูg?~|ํ&Mš„””้q็ฮRวHDDDๅ_…(Zทn๕๋ืK‡*q}$&&โ๘๑ใฐณณร๖ํ‹์CฉTยิิšššุดi“Tจจ\ฅ๋โโ‚ 6ึฎ] 77ท|}ijjข{๗๎8x๐ VญZ…ห—/รฦฦ_}๕U‘1ธธธ`ห–-ศสสยƒfอš•8ถ .ภััใว‡งง'๚๋/ฬž=–––ฎOGG†††*"""ชธ*DแgmmQฃFมลลถถถXผxqกmรยยค๓ขขข0dศ@๏ฝq่ะ!ศๅr=zfffน\Ž/^HPL›6 ปw๏†\.วๆอ›1sๆฬ"ckะ BBBp๙๒e้ฟย|๒ษ'่ะก์์์ะถm[,^ผ๚๚๚%ŽญrๅสXณf :„ž={B[[ปฤ9$""ขŠO&x๚”J%ŒŒŒ`ํ6ไh๋—u8eF[C`’๕3ฅฬœขฯหฌศ˜‡\ฬC.ๆ!๓‹yศ•—hii•Yy฿฿)))ลฝซ#~DDDDT<~DDDDj‚…‘š`แGDDDค&X๘ฉ ~DDDDj‚…‘š`แGDDDค&X๘ฉ‰Je•?๛พt…‰‰IY‡Qfฒฒฒฐ{๗n๛ฺฃL๏ฤ^ึ˜‡\ฬC.ๆ!๓‹yศ•—‡ Gˆˆˆˆิ ?""""5มCฝ”OะkจT๙QY‡Qf4‘ึภW;ฏ šeN™ar1น˜‡\ฬCฎŠž‡ฅ~Mส:„w†#~DDDDj‚…‘š`แGDDDค&X๘ฉ ~DDDDj‚…‘š`แGDDDค&X๘ฉ ~DDDDjขB~hัขEฉ—OLLฤฆM›bDชฦkkk„„„ eห–ธ|๙๒k๗‘œœŒ+Vผƒ่ˆˆˆจขชp…฿ ฉ๙f?๓. ฟงOŸJฏ]ป๑๑๑˜0aBฉ๛{ต๐KKKCVVึลHDDD]๘๒ห/ฐฑฑญญ-ฆNŠฌฌ,๐ร๘๖oKดผRฉD๋ึญัผysุููแ๘๑ใ€   ์ท …kึฌมฟ‹๖ํรฦฦx๘๐!ž>}Š&MšเŸAvv6Zดh3gฮไ[ว้ำง1pเ@888ศLJJ‚๖ํงา6<<ึึึฐถถฦ๒ๅหฅ้;v„ฝฝ=lllฐy๓f)ฦ๘๘x( „„„เ๊ีซhธ1‚‚‚p๋ึญRๅ“ˆˆˆ*ถJe@iลลล!44'Nœ€กก!ž๔SŒ7?๔‚‚‚ฐbล ๐ร „ปป;เไไHMMลš5k๐ห/ฟภิิŸน4:ทiำ&˜››#&& ธ{๗.fอš…จจ(hjjยััmถ…ฅฅ%VญZ…jีชAฉTยูู~~~˜5knธำงOKyแย๑ว๐๓๓ƒ……แใใS่hFF222ค็Jฅ๒-ผ2DDDT^}ฐ…_dd$`hhx๑โ๖๏฿ƒๆ๑ ”vppŠ0!พ๚k?~šššธ~z๋:y๒$ฆM›่ท/–,Y๐๓๓รฺตk๑๋ฏฟJ…ิฌYฮฮฮุผy3๊ึญ[ขํ‰ŠŠBถmall ๐๑๑ม™3g`ii‰… b๛๖ํrC?x๐ ภ>ŒŒŒ0rไHŒ9วGฑ|๙r์ุฑฃภ๖มมม˜>}z‰โ#""ข฿}จ๗ฟbbb+++ธนน!::พพพE.ณfอdff"&&Fฅp+ฉฌฌ,ผyBคฅฅIำ7nˆ*Uชภืื‹-BRRาk๗็๐แร8{๖,ฮž=‹ุุXXYYฉŒาฝฺ๊ตk˜8q"Œ๖ํK#Š™4iRRRคว;wJ'•lแืบukฌ_ฟ^:<้์์Œ๛๗๏#11ว‡4JVฅR SSShjjbำฆMR๑f``€ิิTฉ‹‹ 6lุ ๗ย 777น#f๘๖o1z๔hฉ}ปvํฐeห์ูณG:<ปw๏"cqttDDD”J%ž={†={๖ภษษ JฅีชUƒŽŽฮž=‹K—.cbb"Zตj…>}๚ AƒˆŽŽFhh(ฌญญ ]งŽŽ UDDDTq}ฐ…Ÿตต5Fฺฺุb๑โล…ถ “ฮ๓‹ŠŠย!Cฝ{๗ฦกC‡ —หq๔่Q˜™™ไr9^ผx!]1mฺ4์ฝrน›7oฦฬ™3q๑โE๏ร”)Sะฟ<}๚;w๎TYoอš51eส\บtฉุยฏVญZ˜8q"\\\ะขE Œ;–––๐๖๖FRRš5k†… ยึึ`bbน\น\ސTชT ๓็ฯวูณg1dศTฉRฅิน%""ขŠI&„e•JฅFFF๖ว)TชlTึแ”Mdฃตฦ สฉlผูญ>dฬC.ๆ!๓‹yศUั๓ฐิฏI‰ฺeeea๗๎๐๑๑––ึ;Žชpy฿฿)))ลฝ๛`Gˆˆˆˆ่๕ฐ๐#"""R,ˆˆˆˆิ ?""""5มยˆˆˆHMฐ๐#"""R,ˆˆˆˆิ ?""""5Qฉฌ ๒gVป011)๋0สL๎ 9o`^วFezCฮฒฦ<ไbr1น˜‡\ฬร‡‹#~DDDDj‚…‘š`แGDDDค&xŽๅณ!๖่ค•ue''ีqแ. Q๑~|ผฤ˜‡\ฬC.ๆ!๓KM๒0ศ๑ฃฒแญใˆ‘š`แGDDDค&X๘ฉ ~DDDDj‚…‘š`แGDDDค&X๘ฉ ~DDDDj‚…‘šx'…Ÿฟฟ?ZดhQขถ=z๔€ญญ-ึฌY๓.B)Vห–-q๙๒ๅ๗บฮK—.มึึvvvุฑcJีฯึญ[q๚๕ทUToฝ๐;pเ45K๖๓-๗๏฿วีซW‹>}๚จฬหฮฮ~กฝuฏใำงOไlƒ Btt4 JฝW ฟผ‰ˆˆˆ ๒F…฿/ฟฺฺุb๊ิฉศสสย?€oฟถDหw๊ิ ืฎ]ƒBก@||<,--1iา$( œ:u 3gฮ„ตต5ไr9v์ุˆŒŒDถmแใใKKK„……aึฌYหๅh฿พ=^พ|Y่๚ถo฿…B[[[ 2Dš{{{ุููแฮ;r‹*'''( t๎ฯž= 8#FŒ€ฃฃ#-Z„E‹กqใฦฐตตล—_~™o)))Xบt)lmmฑaร|8Ž9‚vํฺศ-ฺ&Mš„9sๆ`๐เม8v์ุkว๔_Eล๒ชฬฬLlุฐ]ปvล‰'ฐ|๙rศๅ๒BทะะPๅADDDWฉ ฟึญ[c๚๕าyaฮฮฮธ>q๘qุููa๛๖ํฅฬลล[ถlAVV}ƒ†ฎฎn1ู!"""uPฉด Z[[cิจQpqqฆฆ&0mฺดๆ7ˆจจ(„……yธ>๙ไt่ะvvvะะะภโล‹กฏฏ_ฺpajjŠ… JฃrNNNXพ|yกํฟ๛๎;ดo฿&&&puuErrrพ6ููู่ป7RSS!„ภŒ3Tๆkhhภวว>>>ธ{๗ฎtฑFaฆM›†เ—_~นนนTไK@@†ŠYณfแุฑcP(ˆ‹‹{ฃ<Qล%Bˆฒ‚สฅR ###„FฤBฯภธฌร);9ูจ๖ Oฬๅ€FษnMT!1น˜‡\ฬC.ๆ!—šไaใGEฮฯสสย๎ปแใใ--ญ๗U~y฿฿)))ลžถล_๎ """Rฅ>ิ[ž๙๙๙แๆอ›*ำถnZข+k‰ˆˆˆ*ช Y๘ฝz<""""โก^""""ตมยˆˆˆHMฐ๐#"""R,ˆˆˆˆิ ?""""5Q!ฏ๊ฅ7ำำถLLLส:Œ2“{Cฮ8๔m^ปLoศYึ˜‡\ฬC.ๆ!๓‹y๘pqฤˆˆˆHMฐ๐#"""R<ิK๙œOTยเiลํลโไdฟœ;š๊๛ar1น˜‡\ฬC.ๆ!ื๋ๆม๙cใwQ๑8โGDDDค&X๘ฉ ~DDDDj‚…‘š`แGDDDค&X๘ฉ ~DDDDj‚…‘š`แGDDDค&X๘ฉ‰ข๐7nฌญญRโeVฎ\‰ว—ธ฿–-[โ๒ๅหฏ[rr2VฌXQโ๖้้้hบ5์์์p๘๐a˜››ฟ๖: &&,ีฒDDDคž>ˆุ[ปv-๎฿ฟ™LVโeVฎ\‰-Z z๕๊%๊wืฎ]ฅŠ-ฏ๐2dH‘ํž>}ŠชUซ"::†††8t่Pฉึ—'&&—/_†———‡ฑฑ๑๕IDDD[น๑๓๗๗GRR์์์๐ใ?ยััrนƒ BNN`ย„ hธ1lmm‚-[ถ ** ~~~pww/ถ฿}๛๖ฉฬ ‡ตต5ฌญญฑ|๙rizวŽaoolผ„๘๘x(Š|#’/_พฤๆอ›ัถm[Œ5 ษษษ่ืฏŽ9…Bคค$ฉmNNFkkkุใ๔้ำ€7nภออ อ›7‡ณณ3.]บ„์์lL™2แแแP(8|๘0ึญ[[[[„††BฉT–(ทP*•*"""ชธสˆ฿ฆM›`nnŽ˜˜DFF kkk : …๖aii‰™3g"!!ฎฎฎ๐๐๐ภ๙๓ m?iา$คคคH;w๎” CDDD๔ก๚  ฟกC‡bๅส•ˆว˜1c‘‘J•*!** ]บtมš5k๐ูgŸฝ“u>|gฯžลูณg +++dddไk'—หฑ|๙r?~บuรŸ‰ฬฬฬRฏwัขEhิจโใใQเ:ุ๋ฑc4hๆฬ™ƒษ“'ฃo฿พ…ถีัักกกสƒˆˆˆ*ฎช๐KKKC5žžŽ 6ž={†””๘๚๚b๎นาก[คฆฆพ๖:ฅR‰gฯžaฯž=prr‚RฉDตjีคCฎ—.]*p=บบบ:t7.rไ \\\ฐqใF!p๑โEผx๑fffP*•077‡L&รส•+ฅ๖ฏฎwฐถถฦผy๓ะซW/\ผxAAA033{ํQลT๎ฯ๑๛ฏ   4offfฐณณคฆฆยืื™™™ษd๘๛๏Dฟ~PฃF ;vฌฤ๋จUซ&Nœภุฑcaii sss„††ขYณfหๅฐตต˜˜˜@.—C.—ฃ_ฟ~˜0a‚ิ—Bก@XXž={&..Œฟฟ?Ž= hkk#<<๓ฯ่นณิพUซV˜={6์์์ฐ`ม˜˜˜`๏ฝจ]ปv‰ท•ˆˆˆิ‹L!ส:*”J%ŒŒŒฐ/๊oU-๋pสLN๖K<พ|ีปBC๓ƒ๚฿่ญbr1น˜‡\ฬC.ๆ!ื๋ๆม๙cใwG๗wJJJฑงm}P‡z‰ˆˆˆจ๔ิขLwrrสwQฤูณgกญญ]FฝjQ๘w~‘:เก^""""5มยˆˆˆHMฐ๐#"""R,ˆˆˆˆิ ?""""5กW๕า๋ฑท4„‰‰qY‡Qfฒฒฒฐ๛2๐I=#hii•u8e†yศล<ไbr1น˜‡\b8โGDDDค&X๘ฉ ๊ฅ|6Bฆ,ณฌร(3ู•tžฟเแ€Zะ|™^ึแ”™าๆมโOๅ;ŒŠˆˆGˆˆˆˆิ ?""""5มยˆˆˆHMฐ๐#"""R,ˆˆˆˆิ ?""""5มยˆˆˆHMฐ๐#"""R,ˆˆˆˆิ ?""""5Q๊ย/99+Vฌ(tพนนyฑ}9rอš5ƒปป{iรx#‘‘‘x๏๋7nฌญญ‚–-[โ๒ๅหฏGq๙'"""zี;+Jbํฺต˜5kŽ;ฆ2=;;๛๚}^7ฦงOŸJฏ]ป๑๑๑˜0aBฉืjำาา••U๊ˆˆˆจโ+qแw๏=ธบบBกP@.—c๘๑ˆ‡Bก@HHาาาเ็็‡ฆM›"00ฐุVญZ…7b๘๑9r$Vฎ\ xzzข_ฟ~ธ~:!—หัฃGคฅฅZถl‰๑ใวรฮฮŽŽŽˆŠŠB›6mPฏ^=์ฺตซะ๕)•J๔๎rน …QQQr ฒN:กAƒ˜5k–ิพcวŽฐทท‡ 6o HLL„Bก@=ะดiำ|9)hไ๎๔้ำ8p HJJ‚๖ํงา6<<ึึึฐถถฦ๒ๅห‹Œ%((H%Wฏ^Eใฦ„[ทn›ศศศ€RฉTyQลUโยoบu๐๒๒BLL ฮŸ?™3gยฦฦ111˜0aBCCaee…„„ดo฿>”–U(า฿C† ATT๚๗๏___„††"44‡;wbํฺต=z4ฦŽ‹ธธ8XZZbแย…R&&&ˆŽŽ†››F…]ปva๋ึญ˜9sfก๑ฯ˜1 6D\\ขขขะฐaC@tt4Vฎ\‰ุุX„……IๆชUซpyœ8q฿}๗„€‹/b๊ิฉธrๅJพœิญ[ššŠฐฐ0ุc๚๔้่น3ฎ\นุดiLLLooo)พปw๏bึฌY8~8N:…  11ฑะXfอšฅ’;;;\ธp5kึ„ŸŸ:t่€;v92 ###้QงNb๗"""๚pU*iCGGG 8่ฝ;*Wฎฌ2ไษ“˜}๚FQล๖A~๗๎ƒซซ+ ไr9ฦ๘๘x( „„„ -- ~~~hฺด)KิgXX!—ห1hะ ไไไ`ห–-ˆŠŠ‚ŸŸแแแฐถถ†ตต5–/_๐๗๗GRR์์์ฐo฿>•~=z„เเ`4iาวŽรชUซฐqใFŒ?#GŽTi{๚uธปปC.—ฃGHKK{ญุบt้|={๖Dห–-!“ษp๔่Qt์ุ๛๗‡ฏฏ/BCCชฒ]ฃGฦุฑcKKK,\ธฐฤฑ@dd$† †eห–มฺฺ๓ๆอ+rด2##JฅRๅADDDืY๘9::b๕๊ี˜>}:ฎ]ป===•๙'OžD@@ s็ฮจ\นฒ4/&&F๚{ลŠpppฤฦฦยีี666ุฑc๒ญ7** mถ…ฑฑ1 เใใƒ3gฮไk๗ล_ G่ท/.^ผˆoพ๙fffลnWLL บvํ ่ท/Nœ8Qโุ@&“แำO?ลฦ‰˜˜ิฎ]๗๎+ฐ}pp0ŒŒŒคG:uŠ‘ˆˆˆ>\dแ็แแฃGยิิบuCDDDพ62™์ต๚:t(Vฎ\‰๘๘xŒ3ฅŽo๘๑๙.\(2…B;vศฝฤออญฤฑภW_}น\Žห—/c๕๊ี8x๐ บw๏MMอืงฃฃCCC•U\•ส:€าˆŒŒฤนsกญญ ฌ_ฟQQQหๅ่ืฏFމ>}๚ Yณf๐๐๐P๑R(า!Cกy๓ๆ033ƒิ~เภ่ืฏjิจcวŽaโฤ‰pqqŒ;–––…ฦฉญญž={ขgฯžธrๅJฑ\,^ผƒ BPP7nŒ๐๐p(ql^^^๘แ‡ ญญบ)%"""5 ผ“?ฅR ###<๚ม&:9eN™ษ’icoฝัh๗๗bh‰ฬฒG…ฦธ7ปะ๋ศสสย๎ปแใใ--ญ๗ถ๒†yศล<ไbr1นสK๒พฟSRRŠ=z๗A๊%"""ขืวยˆˆˆHMฐ๐#"""R,ˆˆˆˆิ ?""""5มยˆˆˆHMฐ๐#"""R,ˆˆˆˆิ ?""""5๑Adฝ[Ÿo††‰IY‡Qf4ฒฒ€ปก1j/4ิ๘Ž๔DDT๑pฤˆˆˆHMฐ๐#"""R<ิK๙ไ์ BNe๕5r  hดFฮฮฏƒ์ฒงX~Kห:""๚@pฤˆˆˆHMฐ๐#"""R,ˆˆˆˆิ ?""""5มยˆˆˆHMฐ๐#"""R,ˆˆˆˆิ ?""""5มยˆˆˆHM|0…_rr2VฌXQ่|ss๓R๕ปrๅJ<~ธะ๙๓ๆอ+ถ๔๔tดnvvv8|๘pฑํ.\ˆ&Mš`์ุฑ8p ๖๎๛Z1ฟNlDDDDy*LแWZ…~Bไไไ”จธŠŽŽ†กก!ขฃฃัชUซ<™™™€ฐฐ0œ:u .|ฃุf&ž?FQลVn ฟ{๗๎มีี …rนใวG||< BBB––???4mฺ%๊sย„ hธ1lmm‚-[ถ ** ~~~pww˜™™a๘๐แฐฑฑมgŸ}†คค$( Œ;9995jฌญญaooำงO#99๚๕ร‘#G P(””คฒฮ‹/โ‹/พ@ณfอ๐๔้SŒ=7o„งง'ยรรUฺ๎ฝrนึึึ˜6mš4๓ฯ?‡ƒƒš5k†ะะP@PPJlOŸ>…ตต5F„„„7ศ<UT•ส:€ยฌ[ท^^^˜>}:ฒฒฒp๚u๓ฯ?8}๚4`๎นฐฒฒย–-[ฐm6,[ถLZVกP &&0dศยสส ›6mย7 กก””มมมaaahธ1เัฃG่าฅ ~๙gภž={คพ๓Oฝ{๑๑๑๘๋ฏฟะฝ{w\พ|+Vฌ@XXึฏ_ศศศภฆM›ฐlู2!0t่P„„„@WW‹/ฦ๖ํqๆฬ่๊๊โศ‘#€/^`ฤˆ8v์ฬออัฒeKxyyมออ ณgฯFตjี••๔์ูณfอยฏฟ*ลไ™7nฤฐaร กกaร†ก[ทnะัั)0วศศศž+•ส7แˆˆˆจ*ท…Ÿฃฃ# t๏•+WV™๒ไILž<ะนsg•๙-†๒ฟ|๙๚๚๚2dบt้‚:ธ^x{{8๏ไษ“่ป7d2lllPนre<|๘0_;hkkใ๗฿‡ตตu‰ถ๗ส•+hฺด)๊ิฉู่ณ'Nœ8777ฌ]ปฟ๚+ฒณณq็ฮ\ปv ีซWฯื‡žž๚๗๏๛ใฏฟBŒ๘๘๘ืŒ้ำง—(>"""๚๐•Cฝ8z๔(LMMัญ[7DDDไk#“ษJ_ฅJ•….]บ`อš5๘์ณฯ l๗jYห—/Gณfอะฝ{wฬœ9๓Oฉ๛๚๛๏ฟฑlู2=zqqqpuuUฅ{ี?ƒ๏ฟปw‡ตต5–/_^hI“&!%%EzนsงิqQ๙Wn ฟ[ทnมยยร‡G@@’““‘šš*อwqqม† ;w๎,๖ย†gฯž!%%พพพ˜;wฎ4*h`` า๏ซ444““#ญsใฦBเโล‹x๑โฬฬฬ๒-ใ์์ŒUซVแฤ‰จRฅ ผฝฝแ๋๋‹”””BืำจQ#\บt ๗๎รห—/ฑqใFธบบ"55ะืืGbbขth๘ีุ๒ถอ๚๚๚8y๒$VญZgg็BืฉฃฃCCC•U\ๅ๖Podd$ๆฮ mmm˜˜˜`๚๕ˆŠŠ‚\.Gฟ~0rไH๔้ำอš5ƒ‡‡‡JVะ9~ตjี‚ฏฏ/233!“ษ๐๗฿ˆ~๚กF8v์Xพ8๚๖ํ ดm๓็ฯวัฃGaccmmํ|gผชZตj;v,ฦŽ‹ศศศ"๊้้!44ํทGvv6แๆๆจ_ฟ>7nŒ๚๕๋รีีตภุฆM›†qใฦกeห–%ศ.ฉ#™B”uT>(•Jแัร`RนO๐ฮeA{5Zฃ]ฮ!h!ปฌร)–†฿าwาoVVv๏ hiiฝ“u|˜‡\ฬC.ๆ!๓ซผไ!๏๛;%%ฅุฃwๅ๖P/ฝ],ˆˆˆˆิ ?""""5มยˆˆˆHMฐ๐#"""R,ˆˆˆˆิ ?""""5มยˆˆˆHMฐ๐#"""R๊๛๓ T(vณ abRึa”ฌ,`๗nhtœ 5พ#=U<๑#"""R,ˆˆˆˆิ๕R>9 CŽก^Y‡Qfrrภ9ญGฮ{ืHรถ฿๛[ฉ%Ž๘ฉ ~DDDDj‚…‘š`แGDDDค&X๘ฉ ~DDDDj‚…‘š`แGDDDค&X๘ฉ‰ S๘%''cลŠ…ฮ777/Uฟ+Wฎฤใว‹m7n8X[[#$$คุถGŽAณfอเ๎๎Ž•+Wโ›oพyงฑjT๘•VI‹ซตkื">>&L(p~NNRRRคถณfอยฑcวjlOŸ>}ฃˆˆˆจb๛` ฟ{๗๎มีี …rนใวG||< BBB––???4mฺ%๊sย„ hธ1lmm‚-[ถ ** ~~~pww„‡‡รฺฺึึึXพ|9ภ฿฿IIIฐณณรพ}๛T๚|๔่‚ƒƒัคI;v ซVญยฦ1~xŒ9Rฅํ๕๋ืแ๎๎น\Ž=z -- GGGศๅr 4999ฦึฅK๘๛๛ใเมƒBผQ~‰ˆˆจโ๙` ฟu๋ึมหห 1118Œž={ขeห–ษd8z๔(:v์ˆ๛รืืกกก UูฆัฃGc์ุฑˆ‹‹ƒฅฅ%.\่ัฃฮ;‡ธธ8่้้aวŽ๙b€ศศH 6 ห–-ƒตต5ๆอ›WไheFF”Jฅสƒˆˆˆ*ฎถ๐sttฤ๊ีซ1}๚t\ปv zzz*๓Ož<‰€€@็ฮQนrei^LLŒ๔๗Š+เเเ###่๋๋cศ!ุพ};๔๕๕๓ญ3** mถ…ฑฑ1 เใใƒ3gฮไk๗ล_ G่ท/.^ผˆoพ๙fffลnSLL บvํ ่ท/Nœ8ˆ…ซซ+lllฐcว$$$ธผL&รงŸ~Š7"22111จ]ป6๎ปW`๛เเ`I:u๊#}ธ>ุยฯรรG…ฉฉ)บu๋†ˆˆˆ|md2Y‰๛ซTฉขขขะฅKฌYณŸ}๖Yฉc?~<Œqใฦaไศ‘*…fi :+WฎD||<ฦŒƒŒŒŒB>{๖ ฟ๚+|}}๑เมฌ^ฝบะขsาคIHII‘w๎yฃ8‰ˆˆจ|๛` ฟ[ทnมยยร‡G@@’““‘šš*อwqqม† ;w๎ฤ๓็ฯ‹์๏ูณgHIIฏฏ/ๆฮ+kRฟŽŽŽˆˆˆ€Rฉฤณgฯฐgฯ899ๅ๋หาาsๆฬมล‹แ้้‰qใฦแ“O>ม… ŠŒAกP`วŽr/qssคฅฅกFHOO—ถ้ีุเซฏพ‚\.วๅห—ฑz๕j}ะฌY3xxxจŒz) ฉฐ2dQซV-๘๚๚"332™ ฿=`เภ่ืฏjิจcวŽaโฤ‰pqqŒ;–––…ฦจญญž={ขgฯžธrๅJฑ\,^ผƒ BPP7nŒ๐๐p@PPš7o333ุููIํ_อหห ?๐ดตตK“R"""ชเd‚—างT*add„GG—มฤPฏ๘*จฌ`๏mCด๛H ญ๗8&ฎa๏ญฌฒฒฒฐ{๗n๘๘๘@KKซฌร)3ฬC.ๆ!๓‹yศU^๒๗’’R์ัป๖P/ฝ~DDDDj‚…‘š`แGDDDค&X๘ฉ ~DDDDj‚…‘š`แGDDDค&>ุ_๎ wGฃi7h˜˜”ueF#+ ธฝึะPใ“Qลร?""""5มยˆˆˆHMฐ๐#"""R<ว๒๑ˆฝฒŽข์hC “ z–uDDDoGˆˆˆˆิ ?""""5มยˆˆˆHMฐ๐#"""R,ˆˆˆˆิ ?""""5มยˆˆˆHMฐ๐#"""R,’#GŽ Yณfpww/ถmzz:Zทn ;;;>|ๆๆๆฅZgLL Œu๋ึมึึกกกP*•๏!›DDD๔!Qปยoบu๐๒๒BLL ฮŸ?ŒŒ „††โฤ‰ˆล˜1ccฦŒมนs็‡ธธ8ฤฦฦJ}|๑วˆ…ญญ-6lุ€๛รืืกกก นsSฆLAำฆMฑs็Nฬ˜1kึฌฑฑ1VฌXoooฤฤฤภฤฤD๊wำฆMธ{๗.โใใฑrๅJ 8`aaˆˆ\ธp?๘#&Ož MMMฬ˜1ƒ BLL Zตj…แร‡cถmธ>0t่Pœ?พะ\ddd@ฉTช<ˆˆˆจโRปยฯััซWฏฦ๔้ำqํฺ59r044TซV GGG( œ;w Rพพพ;;;$&&ๆ[วูณgaee…็ฯŸ#** ฟ๖ZดhQll'OžD๏ฝ!“ษ`ccƒส•+ใแร‡ศศศภ Aƒ`mmกC‡ชฤ๒*KKKฬœ9 puu…‡‡ๆฯŸ_`เเ`I:u๊#}ธิฎ๐๓๐๐ภัฃGajjŠnบA‘ฏMzz:ฦ‡]ปv!..ปwGFF†4_GG กก์์์|หหๅr,_พวGทn๐็Ÿ"33ณิ1/Zด5B||<"""Tb)ศฑcว0hะ ฬ™3“'OF฿พ} l7iา$คคคH;w๎”:F"""*ิฎ๐ปu๋,,,0|๘p 55๋ืฏ—s>y๒้้้ะะะ@ีชU๑ไษ์ุฑใตึกซซ‹มƒใ๔้ำ มกC‡ะธqใBG๒ธธธ`ใฦBเโล‹x๑โฬฬฬ T*ann™L†•+WJํ šš*=฿ฟ?ฌญญ1o<๔๊ี /^DPPฬฬฬ \ŸŽŽ UDDDTqU*๋ทศศHฬ;ฺฺฺ011ม๚๕๋annhjjยฯฯำฆMCฏ^ฝะคIิฎ]ฮฮฮฅ^ŸBก@XXž={†3gฮูึ฿฿G… ดตต „ฟฟ?~๙gt๎Yj฿ชU+ฬž=vvvXฐ`LLLฐw๏^ิฎ]ปิ๑Qล%๋$ตคT*add๛ๅศั+๋hสŽ6ด0ษ '||| ฅฅUึแ”™ฌฌ,์ฝ›y`0y˜‡\ฬCฎ๒’‡ผ๏๏”””bฉก^""""uลยˆˆˆHMฐ๐#"""R,ˆˆˆˆิ ?""""5มยˆˆˆHMฐ๐#"""R,ˆˆˆˆิ ?""""5กv?ูFลื5 &&&eF™ษป;QEร?""""5มยˆˆˆHM๐P/ๅ3๓จd๐vwื9oต?"""z}๑#"""R,ˆˆˆˆิ ?""""5มยˆˆˆHMฐ๐#"""R,ˆˆˆˆิ ?""""5มยˆˆˆHMฐ๐#"""R,ˆˆˆˆิฤ;/’““ฑbลŠwฝšส† ะคI๔์ูำฆMCXXXฉ๚Yดh^พ|๙–ฃ#""ขŠชL ฟ์์์wฝ๚rณฌฌ,คฅฅ~๛ํ7ฌ[ท6lxฃ>_-ž>}๚FQล๖F…฿ฝ{๗เ๊๊ …Bน\Ž“'Oช<ฟ|๙2‚‚‚…Bฌ\น๐๔๔Dฟ~๐๐แCt๎pwwวีซWaaaptt„\.ว Aƒ““hูฒ%ฦ;;;8::"** mฺดAฝz๕ฐkืฎBc6m ggg|๕ืธvํ>๔Sุฃ]ปvx๘๐!ภาา้้้€•+Wโ›oพL˜07†ญญ-BBB ะ>+11“'OFใฦq๕๊Uฬž='Nœ@ฏ^ฝ0kึ,•ถ็ฮƒƒƒlll0|๘pฉ@:u*ammษ“'BCCq๏=899กgฯž 4gฮœ)ั๋—‘‘ฅRฉ๒ ""ขŠ๋ ฟu๋ึมหห 1118<>ฌ๒ผnบ˜5klllƒ &โโโฐs็Nฌ]ปcวŽลิฉS… `ธq€=zเนsˆ‹‹ƒžžv์ุ!ญืฤฤัััpssรจQฃฐkื.lบ3gฮ,27nเ่ัฃ˜?>Fމ+Vเ๙๓๘์ณฯ๐๗฿บ\RR6mฺ„„„ฤฦฦโ๓ฯ?€B๛ศฮฮฦ๖ํแใใƒฎ]ปขVญZธpแ์์์๐อ7฿ภมม[ถlAPPสz „eห–!>>Ož<มบu๋cฦŒ‘r‡ุุXŒ95kึฤ™3gค‘ร+WฎภืืำฆMƒƒƒ–-[†gฯžบ]มมม022’u๊ิ)2DDD๔aซ๔& ;::bเภะะะ@๗๎แ๎๎ฎ๒ผiำฆ.ืฎ];:„„„ižฆฆ& 66฿~๛-”J%’““QงNt๎ะฑcG€ d2tuuammทoo—.] ฅฅ…ิิTœ8qB๊/;;๕๋ื/t9###่๋๋cศ!่าฅ :t่Pd]บtมล‹ฑjี*ธนน›G ๗xNN์ํํ}๚๔มž={ะทo_DDD`๎นศศศภร‡‘[[|}TชT ~~~๐๓๓รญ[ท0t่P|๕ีWHMM-p“&M’ mP*•,ˆˆˆ*ฐ7*<<‚ƒƒ๑ำO?a๐เม๐๓๓ร!Cะ Aƒ"c+Lzz:ฦ‡๓็ฯริิฃF’โ*HRRVฏ^๐๐pิซW7n,ดญŽŽtttJ}x่P๏ญ[ท`aaแร‡# วWyƒBGœภ]บ๘#''๑๑๑€ดด4ิจQ้้้o|ฤซŒŒŒPตjU์฿ฟ@๎…—.]ิญ[111ศษษมฮ;ฯž=CJJ |}}1w๎\ฤฤฤู‡ตต5~๚้'DGGฃAƒ่ป7Zตj…ฤฤฤBc266†ฆฆ&bccไFwssCzz:444PตjUTธยฯeQนรCฝDDDDj‚…‘š`แGDDDค&X๘ฉ ~DDDDjขย]ีKo๎[วษ011)๋0ˆˆˆ่-ใˆ‘š`แGDDDค&xจ—๒ู๔๗:่%้–jู ‡ผๅhˆˆˆ่mแˆ‘š`แGDDDค&X๘ฉ ~DDDDj‚…‘š`แGDDDค&X๘ฉ ~DDDDj‚…‘šจ๐…_rr2VฌXQึaจHOOG๋ึญagg‡ร‡รผTฤฤฤเเมƒo9:"""ชจิบ๐หฮฮ~ฏฑ<}๚ CCCDGGฃUซVฅ๎๏ีย/99๙MC$""ข ์ƒ.๎ปWWW( ศๅrœ}pใฦ ธนนกy๓ๆpvvฦฅK—)Sฆ << …‡ฦบu๋`kk‹ะะP(•ส๗๐ ั‡ไƒ.ึญ[///ฤฤฤเ๙๓8|๘ฐส๓บu๋bึฌYฐฑฑALL &L˜ˆ‹‹รฮ;ฑvํZŒ;SงNETT,X€qใฦz๔่s็ฮ!..zzzุฑc‡ด^DGGรออ ฃFยฎ]ปฐu๋Vฬœ9Sjs็ฮL™2M›6ลฮ;1cฦ ฌYณฦฦฦXฑbผฝฝi™M›6แ๎ปˆวส•+1pเ@€……"""pแย๘ใ˜|mmmŒ9qqqะิิDzzzก}XZZbๆฬ™˜6m๘ใxxx`ฦŒ?~|พถมมม˜>}z‰b#""ข฿=โ็แแฃGยิิบuCVV–ส๓ˆˆˆ—ซ\นฒ๔ทL&ร… #ภะกCฑrๅJฤววcฬ˜1ศศศ–ัึึhhhจwฮ \.ว๒ๅหq๘qt๋ึ ๙'233Kฝ‹-BฃFˆˆ•X r์ุ1 4sๆฬมไษ“ัทo฿Mš4 )))าใฮ;ฅŽ‘ˆˆˆสฟบ๐ปu๋,,,0|๘pเ๘๑ใ*ฯใใใa``€ิิิB๛pww—.ศษษA||< -- 5jิ@zz:6lุ๐Zq้๊๊b๐เม8}๚4BBBp่ะ!4n๓็ฯ/r9lธB\ผx/^ผ€™™”J%ฬออ!“ษฐrๅJฉซถ~X[[cผy่ีซ.^ผˆ   ˜™™ธ>ช<ˆˆˆจโ๚  ฟศศHศๅrุููแุฑcฐดดTyทo_˜˜˜@.—C.—#$$$_K–,มž={`kk kkk้   4oญZต‚]ฉcT( C\\ E‘maff๔๋ืแแแ€ภภ@,]บ …Bฅะkีชฮž=+ฦฤฤ{๗๎ลถmเใใ ๚ๅ%""ขทL&„e•JฅFFF;ปzFบฅ๊ฃร!o9ช๗/++ ปw๏†ดดดส:œ2ร<ไbr1น˜‡\ฬCฎ๒’‡ผ๏๏”””bqHˆˆˆˆHMฐ๐#"""R,ˆˆˆˆิ ?""""5มยˆˆˆHMฐ๐#"""R,ˆˆˆˆิ ?""""5มยˆˆˆHMT*๋จ๑ฏื &&&eฝe๑#"""R,ˆˆˆˆิ ?""""5มยˆˆˆHMฐ๐#"""R,ˆˆˆˆิ ?""""5มยˆˆˆHMฐ๐#"""R,ˆˆˆˆิ ?""""5มยˆˆˆHMฐ๐#"""R,ˆˆˆˆิ ?""""5Qฉฌ ๒CHMM…––VGSvฒฒฒ๐๙s(•Jๆy`?ๆ!๓‹yศU^๒ T*฿๗xQX๘‘$)) `eeUฦ‘ั๋JMM…‘‘Q‘mX๘‘คZตj€ทoปใผสัั็ฮซห(•JิฉSw๎กกaน‹๏}-ร<ไbr1น˜‡\ฬCฎ๒’!RSSQณfอb๛`แG S>ŒŒ^{ึิิฌPห€กกaนyxฟหฬCๆ!๓‹yศU๒Pา^Aoลศ‘#+ิ2ฅUžท‰y(2ฅUžท‰y(2ฅUžท‰y(2ฅUV๑ษDIฮ$ต T*add„”””RวSQ0น˜‡\ฬC.ๆ!๓‹yศ๕!ๆ#~$ัััมิฉSกฃฃSึก”)ๆ!๓‹yศล<ไbr1น>ฤ,รˆ฿ KKห|yษdาํ*๊พp๔่Qt๊ิ 5kึ„L&รึญ[Uๆ !0eสXXX@OO^^^ธvํšJ›'Ož OŸ>044„ฑฑ1>๛์3<{๖์=nล›+*YYY˜8q"lllPฅJิฌY๛๗วฝ{๗T๚(hš={๖{’7S0pเภ|ุฎ];•6}Pเg…L&CHHˆิฆผ๎,ฐaรŒ7SงNล… `kk ooo๙DŒ9Rzž-jึฌ)‚ƒƒห0ช๗๋ัฃG€8rไˆ4อำำSŒ3ฆ์‚zฆN*lmm œ—œœ,ดดดฤฦฅi—.]ฤฉSงS„ecฬ˜1ข~๚"''Gก๛ฑeห้yNNŽ077!!!าดไไdกฃฃ#ึญ['„"!!A็ฮ“ฺ์ูณGศd2๑ฯ?ผทุ฿ฆW๓Pณgฯ โึญ[าดบu๋Š… พเฃ‚๒0`ภันs็B—Qืกs็ฮขu๋ึ*ำส๋ภ?Bff&ฮŸ?///iš††ผผผp๊ิฉ2Œ์JII๐ฟYœgอš5จ^ฝ:ฌญญ1iา$<ผ,ย{งฎ]ป†š5kข^ฝz่ำงn฿พ 8<ฒฒฒT๖ฦใฃ>ชะ๛Fff&๘ใ <2™Lšฎ๛ยผy๛,฿ผ๒ธ?๐ทz ?Fvv6ฬฬฬTฆ›™™แ๒ๅหeี๛•““ƒ/ฟฎฎฎฐถถ–ฆ๗๎u๋ึEอš5‡‰'โส•+ุผysF๛v999aๅส•hิจ๎฿ฟ้ำงร๕} ซซซ2ฝผ๎<ิKจ^ฝ:455๓]ฉ๙๐แC˜››—QT๏ฯจQฃฐs็N>|ตkื.ฒญ““เ๚๕๋๏#ด2allŒ† โ๚๕๋077Gff&’““UฺTไ}ใึญ[8x๐ † Rd;uุ๒^ใข>ฬออ๓]๖๒ๅK+’ปw๏"))Izจห็ื_…ฝฝ=lmm‹m[n๖‡ฒพบ„ส‡๕๋ื ฑrๅJ‘ >sall,ฺตk'์์์ฤ™3gฤ๑ใวEƒ Dฏ^ฝสj“Jฅจ็ูฏืKoo/Ÿ?& F็m{๔่Q‚ม กPˆบบ:ฎ_ฟL.i744`6>Ÿ'Nะึึ–7๖”›7oฒvํZ็ฟ‰วใX–ลƒœ6๕๕๕†ฯ็s~[ฒd ###?Gฤ ”๘‰ˆ๋8p€T*EKKหผหผทn"›อ266F<งขขยน6}_"‘`็ฮTVVb6s/ฬyšืฒ,ง์๓๙fีง๚๔๕๕ฑbล ็šm๔๕๕9๕H$โ”ำ้4_ฟ~e๙๒ๅ˜ฆ‰iš\นr…Ÿ @[[7n ‰P^^>k‰{บโโโๅL&ใฤฏญญuboูฒ…มมมผฑง๎ปNำ4้ํํwพSFGG ?Gฤ ”๘‰ˆ๋mุฐกก!†‡‡‰ลb ถ-,,$‘H๐๘๑c>~L(++`๑โลœ>}šWฏ^q๛๖m.^ผHOOฯฌ๛ฌ_ฟž7o๖˜Cก้tฺฉงำiBกS๗x|`hhˆ3gฮฐ9†รa6oฬษ“'#—ห๑ไษ^ผxฑ`Œo฿พ‘Jฅ๘๔้^ฏฟ฿?็\ฆ455100@&“แย… TUUPSSรูณgD7“ษะีีLพแœ๑Iหฒx๛๖ญS฿ณgOŸ>ฅฃฃƒ\.ว๘๘8]]] .ใปw;vPPPฐเEF‰ŸˆFฟถ{๗n~?ห–-ฃปป›ŽŽ<ฯฌฯธd2โ๑8†a‹ลจญญwŸ_2™œฑ/๏W$“I*++ูธq#ัh”าาRๆm฿าาย๛๗๏Yตj–eq์ุ1ฦวว๓ฦinnฦถm–.]ส;wธt้าผmซชชุบu+๋ึญcืฎ]:t˜<9L&ฉจจภ0 ถmๆ$kึฌa๏ฝcš&0™(>|๘ำ49rไ@€ฮฮNšššฐ,‹•+Wr๕๊ีวฺฺสแร‡๓ฮOฤm<z""ซ๒๒rู๊๋๋พ}๛/๗๒ๅ ฑXŒG๏>โ7{๚5‰D‚๛๗๏ฯน”,โfJDDƒs็ฮQWW‡ื๋ำCษK‰ŸˆˆˆˆKhŸˆˆˆˆK(๑q %~"""".กฤODDDฤ%”๘‰ˆˆˆธ„?—Pโ'"""โJDDDD\B‰ŸˆˆˆˆKzฎผถชิIENDฎB`‚c4core-bm-charconv-atox-mega_bytes_per_second-i16.png000066400000000000000000001047051477602032300330670ustar00rootroot00000000000000c4core-0.2.6/doc/img/windows-x86_64-vs2019-Release‰PNG  IHDRชธ“9tEXtSoftwareMatplotlib version3.5.3, https://matplotlib.org/อ+นา pHYsaaจ?งi‰2IDATxœ์wXื๛6๐{ฉาAมv้ˆˆŠAQฑ4*šhฌฑ‘ขฑ์5–Kพ ฦปุ6PŠb5v#,ขา๖ผ๘2?WŠ (ฃŸฺ๋๋rgฮœyๆqXฮœ™U!ˆˆˆˆˆdFYๅ†…*ษ U""""’%ชDDDD$K,T‰ˆˆˆH–Xจ‘,ฑP%""""YbกJDDDDฒฤB•ˆˆˆˆd‰…*ัv๚u( ฬœ9ณธCษSฃFเเเPa˜Bกภ AƒŠ; ๚ˆDFFBกP 22ฒธC๙์๕์ู†††ลฦ[ษ<_พ|yq‡๒ษbกJŸฅฤฤDŒ?ืฏ_/๎PˆŠETTฦคคคตฟx๑"† †z๕๊AOO …"ฯŸ…B…Bฝ{็บ~ิจQR›GฝๅŸUซVa๎น๏œ|ŠวDšž={†๑ใว็๚วาปw1bฤ4nFFFoฃ*==“'OFอš5กงง‡2eส eห–ธ}๛v‘ฤSœXจาg)11&L`กJŸญจจ(L˜0กภ…๊ฑcว0o<คคค VญZolฏงง‡ฟ้้้9ึ๕ื_ะำำ+lศyz›ขฎaร†x96lXdq%ช‡J•*แ๙๓็่ฝ{กท}๖์&L˜kax๑โEL›6 ๛/๓ํ'##-[ถฤคI“ะผys๚๋ฏ๘แ‡PฒdI$''I<ลฉDq@D๔6„x๑โ๔๕๕‹;”Jjj*J–,Y่ํ‘””###ฬœ9ฑฑฑ๙ถoผ9ถlู‚;v M›6า๒จจ(\ปv :tภ฿]่8ี‹/ ฃฃฅRYคล2ษ๛๚ผP(๏ๅ๕๖ํqใฦ ้8lll฿๙นz๕jŒ=ๅส•ƒT*UฎsTณ็fฟ้ผ^~ึขdษ’ฐดดฤฐaรฐkืฎ}^พ|:t@ูฒeกงง‡๒ๅห#(((฿‘ฎŽ ###ฅŸMGGG)6l€ฃฃ#๔๔๔เๆๆ†3gฮไ?”,Yึึึ˜8qbŽŸ%ตZนs็ย^บฤทo_LMMahhˆ5jเงŸ~าุพ ŸนอQอžs๛๏ฟขmถ044„……พ๛๎;deeIYXX&L˜ ??`dd33ณ7๎_ญVใ—_~AปvํPงNdffโูณgo.ทใศ/žb%ˆ>!๋ึญฮฮฮb์ุฑb๑โลโงŸ~ฅJ••*UฉฉฉB!ฎ^ฝ*,ˆŸ~๚Iฌ\นRฌ\นRปwO!ฤธqใแ๋๋+ๆฯŸ/ $ดดด„‡‡‡HOOB๑ไษQพ|yแแแ!233…B„…… bๅส•๙ฦxํฺ5@8:: 1mฺ41aยaff&,,,ค8„โ์ูณยฤฤDุูู‰iำฆ‰ ˆ†  …B!6lุ ต[ถl™ \]]E“&Mฤ๙๓EHHˆะาา;wึุฒeห„BกbาคIbแย…ขw๏ข{๗๎Ramm-*Tจ † "~๕WัคI@DDDHํ8 แๅๅ%ๆอ›', … ]ปv-Zด .ปwฤ„ 4โ๑๐๐={๖sๆฬ๓็ฯ~~~€Xฐ`FปJ•*‰ชUซŠRฅJ‰#Fˆฐฐ0qเภ!„ฤภฅถฃF …B,^ผXฃQฝฬฬLัดiS@‰ ˆ)Sฆˆ&MšˆM›6 !„PซีขI“&BกPˆฝ{‹ ˆึญ[ b่ะกฮฮฮยสสJ๓ฯb๎นขrๅสยภภ@|˜๏พบvํ*tttฤ๐แรลาฅKลดiำD๋ึญลŸ)„b๗๎ยลลE”.]Z:Ž7 !๏ดณณ...b๖์ูbส”)"55UZ—} Q๐๓้ำงขrๅสB___Œ1Bฬ;WิฉSG8;;k๔™––&lmm…ตตต K—.&Lโ๚๕๋ys~ว๔์ู3QซV-กญญ-† &ๆอ›'4h ˆนs็ๆ›K!^ีจQC”)SF๔ำObม‚ขvํฺBกPˆณgฯJํฒ^—}Nฝ๚Ÿง•••?~ผ˜3gŽ(Wฎœ044๙งจXฑข˜:uช˜:uช011UซVYYYา๖มมมBOOOTซVMt๏],Xฐ@ดjีJcฦŒัุ๏ฝE‰%DŸ>}DXX˜๘๑วEษ’%5>Ÿณcสํ๓โ์ูณBGGGธปป‹_~๙E„……‰๏พ๛N4lุPc?ฌศ<_ถlYŽใฑทท_}๕•๘ํท฿D‡๑๋ฏฟ !^žCฟ๖› ฺตk'?วลลๅุวบu๋rœซู*๚๔้#tttค฿/๛๗๏cู ฯ‡ฦB•>)ฯž=หฑ์ุฑc€Xฑb…ด,ฏแ็็ง๑Aบ`ม@๏“–ํฺตK๚€๘็Ÿ„กกกhถํcฬ`ำืืทo฿––Ÿ8qBร† “–5mฺT8::Š/^HหิjตจWฏžจVญšด,๛—‡ฏฏฏPซีา๒aร† ---‘””$„"))I OOO๑๙sธ^.๛C๚ีœฅฅฅ‰ฒeหŠ:Hหฒู;88h’่าฅ‹P(ขE‹๛๐๒๒•*UาX–™ฟฟฟจ\นฒฦฒJ•* b็ฮ9ฺฟZจ†„„ฅR)–/_žฃ]A๙๏ฤ์ูณsฌหฮำฆM›คWu์ุQ( qๅส๘ttt4–ลลล b๙าฒ.]บKKK้!„ธ{๗ฎP*•bโฤ‰าฒยž๕๋ืื่Sˆ7›๙)hก๚฿ ้ทํท …B!ฎ_ฟ^เBีฤฤDใดlู2วy%ฤŸ•+WฮqžๅUจไผŸ5k– ั"„ฯŸ?5kึิ่๓ฬ™3€Xทn]พ๑ๆ˜ๆฮ+H…บBคงง ///ahh(T*Uพf:tHZ๖เมกซซ+BBBคe…-Tˆจจ(iY๖็ฃพพพธqใ†ด|ัขE9๒,ˆoฟVZฆVซEห–-…ŽŽŽtŽ>|Xแแแ1ํน3ว๒ผ>/ๆฬ™S ๓๎] U?ณBแ๊๊*ค๗>ฤธqใ๒G~…๊† ann.ชUซ&–-[&–-[&ชUซ&ttt Uh4ž—้“๒๊ฃŒŒ <~UซV…ฉฉฉtฉ0?{๗๎Ezz:† ฅ๒~<๚๔้cccl฿พ]Zๆ็็‡พ}๛bโฤ‰h฿พ=๔๔๔๒ฝบถmข\นrา๛:u๊ภำำ€๛๛๗๏G็ฮ‘’’‚GแัฃGx๘1q๙๒e๛๏ฟ}~๓อ7—๋4h€ฌฌ,ธqภหK^)))1bDŽyUฏ_ๆ344Dทnค๗:::จSง๙็ŸวาฃGhkkK๏===!„ภW_}ฅัฮำำทnBffฆด์ีณไไd>>๘็Ÿr\ตตต…ฟฟŽ/็  4ฟ๒ ๓O็h™ใRbn๛o”.]฿~๛mŽuูyŠˆˆ€––ฌฑ>$$B์ุฑCcนฏฏ/ชTฉ"ฝwrr‚ฑฑฑF>ฟ๘โ ะาาzใqตRฅJกy๓ๆ๘๋ฏฟผผAจ^ฝzจTฉR๛055ล‰' <&7มมมž›X๓~็ฮ(Wฎฅezzz่ำงF_&&&€]ปvฝีๅุDDD lูฒ่าฅ‹ดL[[ƒฦำงOs:๒:;;;4hะ@zoaa5jไ๚ณ]Pvvv๐๒๒’{zzš4i‚Š+ๆXžพ^}ฤ\๖t™๔๔t์ปฐn:˜˜˜ Yณfาy่ั#ธนนมะะะ่/ทฯ SSSภๆอ›กVซ๓<ž‚~Vไง_ฟ~๏4h๐N9ฮอำงOผœ"ณo฿>๔์ู={๖ฤฝ{!„ศuฺสว†…*}Rž?ŽฑcวJsK—. $%%่๎ว์‚ฎFหuttPนrei}ถ™3gยฬฬ ฑฑฑ˜7o,-- kตjีr,ซ^ฝบ4๗๋ส•+B`ฬ˜1ฐฐฐะx7ภหนjฏz๕๐ฒP อ฿สž_Y๙ๅห—ฯQผ–*U*ว\ฐ๖› บB… 9–ซีj‹ฃGยืื%K–„ฉฉ),,,ค๙bนชyYฑb.\ˆ๙๓็kWฏ^E5PขD๗›ธqึึึ9ๆmf฿๚น๒zŽ€œ๙lผ9LLLฐfอiูš5kเโโ‚๊ีซxป๓"ฟผฝo]ปvลž={p๓ๆMlฺด ]ปv-ิ๖ำงOวูณgQกBิฉSใว/๔/๛ยAฮ๛7n J•*9ฺUญZ5ว~‡ŽฅK—ขt้า๐๗๗วย… u'๖๋nธjีชi! ไ}ๅฆ ็baๆ3@Ž})•JTฎ\YcY๖9Ÿ™x๙๒e$''ราา2วน๔้ำ๗_|๑ผฝฝัปwo”)SAAAXปvmพE๋ะำำ“ๆ|f{ื็&๛0ooo\WฌX๕๋ืGTTT‘๎ฏ8๐ฎ๚ค|๛ํทXถl† ///˜˜˜@กP ((จศ?ˆเฬ™3า‡cBBย;HฏสŽ๗ป๏พหs๑๕_Œyšฝอศ@a๚สซํ›๚ธz๕*š6mŠš5kb๖์ูจPกttt9sๆไ๘?หoTฬฑฑฑXฐ`:w๎\ >ค‚ไSWWmถลฦ๑๋ฏฟโ๛8z๔(&Ož,ตy›๓ข8ŸŒ]]]#-- ;w.ิ๖;wFƒ ฐqใF์ฝ3fฬภดiำฐaรดhัข@}ๆ๘‹๒gfอš…ž={b๓ๆอุฝ{7Œ)Sฆเ๘๑ใ(_พ[๕๙ฎ rŒนH@บจ }e>ีj5,--ž๋๚ื ร฿๕๕๕q่ะ!8pทoวฮ;ฑfอ4iาปw๏.ฒ+๊ †ตต5 L™29ึYZZๆyใฺว„…*}Rึฏ_เเ`ฬš5KZ๖โล‹ฯŠฬ๋C8๛’ไล‹5บOOOวตkืเ๋๋+-KMMEฏ^ฝ`gg‡z๕๊a๚๔้hืฎ<<< ๋ๅห—s,ปt้’two๖ตตต5๖๛.ฒ/=Ÿ={6G1SถnŠดด4lูฒEcDๆ๕KxQตjULŸ>5B๓ๆอฑo฿พBฅช*Uชเฤ‰ศศศะ˜า๐ชJ•*a๏ฝHIIัุO๖ย…นผช/พ๘๑๖ํ‡๓็ฯC!]๖Š๎ผศ๋g จ้๋๋ฃmถ๘๓ฯ?ัขE ”.]บะ}XYYaภ€0`๒๛ŒŠ‡ZญึU}ื๓๎uูWc’’’คหๅ@มFl฿†Zญฦ?#ข/?HŸ‰UชTมฝ{แํํN|)•J4mฺM›6ล์ูณ1y๒dŒ5 (ฒฯฺ‚(Š๓ึััฺฺฺ9ฆ๛ภ;wr๏๏;ž๗—้“ขฅฅ•ใ/๕๙๓็็ศ~Žไ๋ฌฏฏ/ttt0o<~~w$''ฃeห–าฒ7oฤูณgรฦฦF5*ˆM›6i|ธœh<๏GT้“าชU+ฌ\น&&&ฐณณรฑcวฐw๏^˜››kดsqq––ฆM›†ไไd่๊๊Jฯ๒9r$&L˜€ๆอ›#00/^ฤฏฟ ้&‹๛๗ใื_ลธqใPปvm/ŸฺจQ#Œ3ฆ@ุซVญŠ๚๕๋ฃHKKรนsannŽ~๘AjณpแBิฏ_ŽŽŽ่ำง*WฎŒ๛๗๏ใุฑcธ}๛6โโโ •cccฬ™3ฝ{๗†‡‡บvํŠRฅJ!..ฯž={ฏฟ„rใ็็ดn}๛๖ลำงOฑdษXZZๆZ„Dบuฑy๓f cวŽุดi“4*ฺฃG'OžDƒ ššŠฝ{๗bภ€hำฆ ZทnฦcิจQธ~:œฑ{๗nlผC‡ีธqช0ดตตัพ}{ฌ^ฝฉฉฉ˜9sfŽ6Eq^ธนนx๙uฆAAAะึึF๋ึญ๓2€ไไd้™ดG๐ฒฐ055…ฉฉฉฦ0ฏsvv†ณณ๓cz]JJ ส—/Ž;ยูู†††ุปw/N:ฅqีฤออ kึฌม๐แรแแแCCCดnบะ๛+จพ}๛bม‚่าฅ † +++„‡‡K7(fLํ฿ฟƒ BงNPฝzudffbๅส•ะาาB‡๒G^ว๔อ7฿`ัขEู่ณ'bbb`ccƒ๕๋ืใ่ัฃ˜;w๎[_ExŸŸ*Vฌˆฏฟ฿=ดดด๐ฟธy๓f‘์ใUzzzุนs'‚ƒƒแ้้‰;v`๛๖ํ๘้งŸคQA๔ํSฆLAll, ญญห—/cบu๘ๅ—_ะฑcว|๗3qโD:t-[ถDฅJ•๐เม๚๋ฏ(_พ<๊ืฏ/ต+่gลปะืื‡ึฌYƒ๊ีซรฬฬ า=ู#๎็ฮฌ\นGŽŒ=Z๊g๒ไษุทoš4i"9o<˜™™ๅx>์ปฤSl>ุ๓ˆ>€'Ožˆ^ฝz‰าฅK CCCแ๏๏/.\ธ *Uช$‚ƒƒ5ฺ.YฒDTฎ\Yhiiๅx๔ว‚ Dอš5…ถถถ(SฆŒ่฿ฟฟx๒ไ‰B•J%*Uช$jืฎ-2224๚6l˜P*•โุฑcyฦ˜8“3fˆYณf‰ *]]]ั Aƒ\%r๕๊UัฃGQถlYกญญ-ส•+'Zตj%ึฏ_/ตษ~dฬฉSง4ถอํ๐Ÿˆˆˆˆd‰…*ั'่ึญ[ะำำ“ฮ)ˆŒŒ„Bก@ddไ;๗ีจQฃโyฉ[ทฎฦ…}JXจๅa๙๒ๅP(P(นฮ๑B B… P(hีช•ฦบ์ํฒ_%K–„BCC๑์ูณ\๗—…B“'Oพs์'N„งง'ผฝฝ฿น/*˜ษ“'cำฆM9–GEEa๘๑๏ํซ)๑G,\ธ๗๎{/'ชDDo งง‡UซVๅX~๐เAพ}บบบนnืฌY3ฌ\น+WฎฤฌYณเ๊๊Š1cฦ 888ื๖ทo‡ฅฅ%<<<)‡โ?@ฟ~ฉนiุฐ!ž?ކ w(นสฏP0aย{+Tดiccc๚๋ฏ๏ฅขโฤวSฝA@@ึญ[‡y๓ๆกD‰๛ุ\ตj๐่ัฃ\ทซ^ฝ:บu๋&ฝ๏ืฏาำำฑaรผx๑B๚n๘lhัข…๔]๑o๋ฯ?D‰%๋๗Vjj*J–,๙N}(•ส9๛œ={๖ P*•ุ่ฑ#VฌX &ผ๓๙C$'Q%"zƒ.]บเ๑ใวุณgด,==๋ืฏGืฎ] ีWูฒeกP(4 ^HJJBTTZถl)-[ฝz5`ddccc8::โ—_~yใ>6mฺOOฯ๐ฮž— jีชXฟ~=€—#ฤžžžะืืG5ฐw๏}Ÿ9s-Zด€ฑฑ1 ัดiS?~\ฃM๖”‰ƒbภ€ฐดดD๙๒ๅฅ๕;v์@ƒ PฒdIกeห–8w๎+ท9ช—/_F‡PถlY่้้ก|๙๒ Brr๒๛€˜˜ิซW๚๚๚ฐตตEXXXŽ6iii7nชVญ ]]]TจP?๐าาาค6 …ฉฉฉ๘ใ?ค้={๖ฤ๘๑ใ๑๗฿lmmฅuืฏ_—ถ๓ฯ?แๆๆ}}}˜™™!((ทnาˆ!๛.&& 6„~๚้'i}ณfอpใฦ ฤฦฦ่ธ‰>,T‰ˆภฦฦ^^^๘๋ฏฟคe;v์@rr2‚‚‚๒๎ล‹x๔่=z„7n`ีชU๘ใ?ะตkื…๊ฎ]ป P(เ็็ุณgบt้‚RฅJaฺดi˜:u*5j๔ฦ›ฃ222p๊ิ)ิฎ];ื๕Ožฉ›็ˆ‚ˆˆrตlู2@œ:uJ,Xฐ@‰gฯž !„่ิฉ“hธฑBˆJ•*‰–-[jl ืWถmล‹/r์ซ{๗๎ยววGz?dศall,233 ๓•+W1๋|||ฑjี*iู… กT*ล๑ใวฅๅปvํฤฒeหคemถ:::โ๊ีซาฒ;w๎###ัฐaCiYv๊ืฏฏJJŠ055}๚๔ัˆ๋ฝ{ยฤฤ$ว๒ื8p@Bqๆฬ@ฌ[ท.คไ";ณfอ’–ฅฅฅ aii)าำำ…Bฌ\นR(•Jq๘๐aํรยยq๔่QiYษ’%EpppŽ}อ˜1Cืฎ]ำX~๚uกฅฅ%&Mšคฑoท fอš…ž={b๓ๆอุฝ{7Œ)Sฆเ๘๑ใ7pฝ-ตZ GGGฬž=;ื๕ฏ๘…ํ[กP`วŽนๆ๕›แ^ฯ็๋’’’Pบt้ทއHŽXจPปvํะทo_?~kึฌyซ>233OŸ>•–m฿พ9ฺ๊่่ u๋ึhบ5ิj5 €E‹aฬ˜1จZตjฎWฌX๚๚๚ธvํฺ[ล— เโล‹9ึ]ธpJฅ๒E[•*Uผ,ย_i~WŽŽŽpttฤ่ัฃooo„……!444฿ํ๎น“ใฑY—.]๐๒บ์˜ใโโะดiำ7ŽVๆต>ฏๅUชTถถถาH๎๚๗฿‘žžŽZตjฝS?Drร9ชDDdhhˆ฿~๛ ใว๋g”nบเ์์ ธ>NŸ>ญqู๘ฟนฆู”J%œœœ@ใฑHฏำึึ†ปป;ขฃฃ฿*พผhiiมฯฯ›7oึธ;๛Xตj๊ืฏฦK๗066ฦไษ“‘‘‘‘cร‡ “Jฅ’ lŽŽŽP*•๙ๆ([ff&-Z$ฝOOOวขE‹`aa!E฿นsg๛๏ฟXฒdIŽํŸ?ŽิิT้}ษ’%s}ฺ@v!๚บ๖ํCKK &Lศ1r-„ศqไ'{Nmฝz๕ ผ ัว€#ชDD…ืทJๅๆาฅK๘๓ฯ?ผ|8๛๑ใว๑ว jีช่ฝ;€——๕๔๔45ฝ{๗ฦ‡&Mš |๙๒ธqใๆฯŸ—7ŽšตiำฃF‚Jฅ*๔ผฯ„††bฯž=จ_ฟ> €%J`ัขEHKKร๔้ำ฿ธฝฑฑ1~๛ํ7t๏ตkืFPP,,,p๓ๆMl฿พXฐ`Aใูฟ? „N:กz๕๊ศฬฬฤส•+กฅฅ…:ผq{kkkL›6 ืฏ_G๕๊ีฑfอฤฦฦb๑โลาะ๎ปcํฺต่ืฏ8ooodeeแย… Xปv-vํฺwww/ตw๏^ฬž=ึึึฐตต…งงงT๔Ž5 AAAะึึF๋ึญQฅJ„††bไศ‘ธ~:ฺถm ###\ปv 7nฤ7฿|ƒ๏พ๛ฎ@นุณg*VฌWWื็่ฃP| "’ทWO•Ÿ‚<žJKKK”/_^|๓อ7โ๛RปŽ;Š€€€}ฎ_ฟ^๘๙๙ KKKกฃฃ#*Vฌ(๚๖ํ+๎ฝ๛ฦธ๏฿ฟ/J”(!Vฎ\ฉฑววGุ(์c8p ฦฒำงO ahh( DใฦETT”F›7ๅํภย฿฿_˜˜˜===QฅJัณgO๏qฝxช๙G|๕ีWขJ•*BOOO˜™™‰ฦ‹ฝ{๗ๆ—‹่่hแๅๅ%๔๔๔DฅJ•ฤ‚ rดMOOำฆM๖๖๖BWWW”*UJธนน‰ &ˆไไdฉ… Dร† …พพพ ๑จชŸY”+WN(•สช๚๛๏ฟE๚๕Eษ’%Eษ’%Eอš5ลภลล‹sฤ››ฌฌ,aee%Fฦใ&๚ุ(„x‡™๒DD๔ึ233annŽ)Sฆ`ภ€Eฺ๗ื_K—.แ๐แรEฺ/ษฯฆM›ะตkW\ฝzVVVลQ‘bกJDTL๐ŸdIญVใฮ;022zใื‘<!’’kkk(•๏>สB•d้ฮ;op"""’ง[ทnก|๙๒๏ U’%###ภตkื`ffVฬั|ผ222ฐ{๗n๘๙๙I_ I…ว< ๆฑh0Eƒy,ฏ็QฅRกB… า๏๑wลB•d)๛rฟ‘‘Q‘~W๙็&##066ๆ๑;`‹๓X4˜วขม<ผ๒XTำ๖x3ษ U""""’%ชDDDD$K,T‰ˆˆˆH–Xจ‘,ฑP%""""YbกJDDDDฒฤB•ˆˆˆˆd‰…*ษ U""""’%ชDDDD$K,T‰ˆˆˆH–Xจ‘,ฑP%""""Y*Qๅว๎Qจu ‹;Œ–ŽR`คะ`๚!คซลฮG‹y,ฬcั`‹ฦ็œวำcšwฦU""""’%ชDDDD$K,T‰ˆˆˆH–Xจ‘,ฑP%""""YbกJDDDDฒฤB•ˆˆˆˆd‰…*ษ U""""’%ชDDDD$K,T฿ cวŽจ[ท๎็… ะจQฃ"o[[ถlมผy๓;v์€ฃฃ#”J%.\ธ ัn๙๒ๅจUซ์์์Zไqั็ซDq g{๖์––Vกทหสสzซํไเษ“'(UชฅeีชUรฺตkัฟถ็ฯŸว’%K}๚ mถะััyใถูฌญญแ็็ฅR oooปwB)ฆ3gฮ`ษ’%ุปw/พ๚kฉภฯฎฎ.tuu ผo"""๚๔qD@“&Mฐz๕ji^ค——๎ฝ‹๋ืฏใศ‘#puu}c‘๚:___,\ธPzPฉTฐฒฒ‚Zญฦส•+ฅ๕ฮฮฮRับfอš|๛ฮซm^๛๔๖๖ฦx๑โž?===|๕ีW8~8fฬ˜๛๗ฃfอš˜5kV๑ีKgฯž…™™ NŸ> „„„ภววgฯžลิฉSaccSเพ‰ˆˆˆXจpppภ AƒPฏ^=8;;KeสM~sT_5v์XนsNNNฐณณ“ฆŒ3-Zด€งง'lmmฅ๖s็ฮล๘๑ใแ์์ฦ9ชyตอkŸฟ๒ ึฎ] '''ิฏ_?ึ่ฯลลaaaˆ‡‹‹KŽํทๅห—วฑcวะจQ#t๏ภหB5##๖๖๖ู่ณ'–,Yเๅศrxx8๖๏฿/พ๘ขPฃดDDDDูโMUQ1PฉT011่อP๋w8-ฅภH‡ง˜rึ้j>.์m1Eƒy,ฬcั๘œ๓xzL“"๋+##€ถถถ๔๛;๛Q•๏Š#ชDDDD$K,Telูฒepqqัxๅ7-ˆˆˆ่SยปeฌWฏ^่ีซWq‡ADDDT,8ขJDDDDฒฤB•ˆˆˆˆd‰…*ษ U""""’%ชDDDD$Kผ๋ŸdmืPo˜››wญ์1ก!ดตต‹;œ๓X4˜วขม< ๆ๑ใภU""""’%ชDDDD$Kผ๔Oฒ6j็e”0xPa|ดด…&Jเปm‘ญโ็ฃล< ๆฑhwดซ๕ม๗IŸ/Žจ‘,ฑP%""""YbกJDDDDฒฤB•ˆˆˆˆd‰…*ษ U""""’%ชDDDD$K,T‰ˆˆˆH–Xจ‘,ฑP•Ž;ขnบoฝ๕๋ืฑ~๚7ถ;v,ขขข ิg@@าำำฅ๘J•*…   6>Dห–-QซV-ุใัฃG…žˆˆˆ(,T‹ูž={ ฅ๕n_WะBuโฤ‰จWฏ^ž๋322šš ˆˆˆ€ŽŽ`ะ AXฑbEŽ๖ƒฦื_๓็ฯ#** FFF€'Ožผอai`ก๚-YฒŽŽŽpvvฦธqใ‘‘ษ“'c๔่ัฺ^ฅRกI“&จ]ป6\]]qไศภจQฃฐkื.ธธธ <<>D‹-เ่่ฟะณgO์น3Gฟืฏ_วO?„š5kโาฅKผx๑ะจQ#ฉอ–””„ณgฯข}๛๖ฺ่๊๊ถm‹Ž;b๏ฝBผEฆˆˆˆˆXจ~0๑๑๑Xธp!Ž=Šธธ8 2ณgฯFpppŽ"0,, aaa€่่h๔๎ ฏฏอ›7ใ๔้ำุบu+BBB“&M‚ฟฟ?bcc๑ๅ—_bธqhึฌะฆMŒ5*Go%Š;€ฯEdd$‚‚‚`ll x9v๏ฝ{๗โฦm๛๕๋'K—.!๐ร?เศ‘#ะาาย•+WrWTTฦ่ึญๆฯŸŸฃMถmq๎9ฌXฑ๕๋ื/๔๑deeแ๘๑ใ8}๚4ชWฏŽถmbห–- „Bก@ณfอะฌY3<|๘ร† C๙๒ๅ๑ฯ?ภฺฺ:ืฆL™‚ &:"""๚tqDต˜ฤฦฦ"11ถถถจ_ฟ>ฮœ9ƒภภภ|ท Gzz:bcc๛N๛Ÿ2e š7oŽฏพ๚ ?๘#._พ\จํญญญQญZ5ุC[[ญZตB\\œด้ำง๘๗฿ˆ{๗๎aๅส•(SฆLž9ษษษา๋ึญ[o}lDDD๔i`ก๚4iาซWฏ–.i{yyแ๎ปธ~:Ž9WWWlูฒ%฿>T*,--กฅฅ…๕๋ืK7>!%%EjWฏ^=ฌYณฐjีช\GL๐๋ฏฟโฬ™3จVญบvํŠฦใ๚๕๋:kkk˜ššโึญ[BเเมƒจYณ&เป๏พƒ““.\ธ€•+Wb๏ฝ่ิฉSพ7้๊๊ยุุXใEDDDŸ7ชˆƒƒ „z๕๊มูู๓ๆอหณm^sTปvํŠ๛๗รษษ ‡’F(œœ๐๙s้fช๑ใว#""NNNุฐaBCC๓Wษ’%ัปwoœ:u 3gฮD‰9gƒดlู:uย–-[Pพ|yœ9s0kึ,ยษษ ฆฆฆ่ะกภืื.\ภŒ3PตjีทK}๖‚ทe“ ฉT*˜˜˜ ๏ŸวPยภคธร๙hi! M”Wฑ_]Yxทว }ฮ˜วขม<โฮใ‚vต>๘>฿‡ŒŒ DDD ฺฺฺลฮG๋๕^ฬcั`‹ฦGœว^‹;๚ศpD•ˆˆˆˆd‰…*ษ U""""’%ชDDDD$K,T‰ˆˆˆH–Xจ‘,ฑP%""""YbกJDDDDฒฤB•ˆˆˆˆd‰…j1ุ๊ฑ#๊ึญ๛ึ_ฟ~๋ืฏ/ยˆฯ;wะฃGภอ›7แํํ ===„……iด;u๊aooึญ[ฟ—Xˆˆˆ่๓ฤฏP-&{๖์–ึป}๕]vกฺฑcว"Š x๒ไ J•*kkkฌXฑ`llŒูณgcห–-m322ะงOฌ_ฟUซVลƒ้้้ศฬฬ„A‘ลEDDDŸŽจ~K–,ฃฃ#œ1n8ddd`๒ไษ=ztถWฉThาค jืฎ WWW9r0jิ(์ฺต ...วร‡ัขE 8::ย฿฿๗๏฿ว“'OPซV-๛๏ฟศสสBบuqโฤ‰๛8~8z๖์ www/‹เ์ั^SSSxzzB[[[c›]ปvมหห UซVXZZxY์:88`๐เมHLL,ะ1ฆฅฅAฅRiผˆˆˆ่๓ฦB๕=‹วย… q๔่Qฤลลaศ!˜={6‚ƒƒaddคั6,,Lบดฝ{๔๕๕ฑy๓fœ>}[ทnEHH`าคI๐๗๗Gll,พ๒KŒ7อš5CBBฺดiƒQฃFกTฉR˜Iผ๔žEFF"((ฦฦฦ€็ฯŸc๗๎ุปw/nธกัถ_ฟ~าฟฑt้R€?๐Ž9---\นr%ื}EEEa๘๑€nบa๙€vํฺaีชU๘๗฿+ตทถถ†——6lุ€J•*๚ุฒฒฒpโฤ ;v iii๐๒๒Bร† aii }}}๔่ั=z๔ภูณgัฃGL™2 น๖5rไH >\zฏRฉXฌ}ๆ8ข๚ลฦฦ"11ถถถจ_ฟ>ฮœ9ƒภภภ|ท Gzz:bcc5 อ‚สศศภตkื „@jjชด|บu(Yฒ$1w๎\<~ธPZ[[ฃqใฦ066†……4Fd๗_๓ฯ่ิฉฐx๑โ<๛าีี…ฑฑฑฦ‹ˆˆˆ>o,T฿ณ&Mš`๕๊ีาœK///ฝ{ืฏ_ว‘#Gเ๊๊šใ&ฅืฉT*XZZBKK ๋ืฏ—ŠM###คคคHํ๊ีซ‡5kึVญZ…๚๕๋xyY฿฿ฃGฦเมƒฅ๖อ›7วฦฑcวจT*xyyกkืฎ>6???œ>}้้้HMME\\ชTฉ‚ไไdย฿฿†††ˆŠŠยŠ+เๅๅUเพ‰ˆˆˆx้=sppภ AƒPฏ^=hiiก]ปvาๅ๙ืeฯOํืฏขฃฃ†ฅK—ขkืฎhีชœœœะจQ#”)Sเไไ„็ฯŸรลล฿=ฦเเ`,Yฒeห–ลส•+q๎9๗฿8y๒$tuu๑ื_aถmhีช•ด_kkkŒ;ฃFยŽ;rฤ๕์ู3Tฏ^*• ZZZ˜9s&ฎ\น‚าฅKฃWฏ^pqqRฉDHHฌญญ‘œœŒแร‡ฃQฃFEžO"""๚|(„ขธƒ zJฅ‚‰‰ ๎‹ƒพ‘iq‡๓๑Rgม์^<+๋(฿ํqhŸ5ๆฑh0Eใ#ฮc/Šล‚$##ศ๑T*ธื๓˜๛;99นHฆ๑๑า?ษ U""""’%ชDDDD$K,T‰ˆˆˆH–Xจ‘,ฑP%""""YbกJDDDDฒฤB•ˆˆˆˆd‰฿LEฒ๖…s9˜››wญ—bŽGทฺๅ๙@๋wภ< ๆฑh0๔9แˆ*ษ U""""’%^๚'Y‹นฎ‚ั“๋ปฌๅD• 8๙O2”Zq[ฬcั`‹ฦ็GฏชฆลษGT‰ˆˆˆH–Xจ‘,ฑP%""""YbกJDDDDฒฤB•ˆˆˆˆd‰…*ษ U""""’%ชDDDD$K,T‰ˆˆˆH–Xจ‘,}ถ…jวŽQทnตํน3œžฃส]ฃFpแย…บฯฑcว"** 0eสTฌXeห–ีhฃVซ1t่PิจQ5kึฤ๎ป?hŒDDD๔i๛4ฟ$๘ ๖์ู-ญ‚}ปwq้า%ฤลลๅX—••Uเ~ŠKac|๒ไ J•*…‰'Jหš5k†เเ`ิฎ][ฃํ’%K Vซq๑โEdee!99Yฃ"""ขw๑ษจ.YฒŽŽŽpvvฦธqใ‘‘ษ“'c๔่ัฺพu๋ึธ|๙2\\\Œ9...8v์BCCแเเ'''lบ ???ภฦฦaaa˜4iœœœะขE dffๆนฟ-[ถภลลฮฮฮ่ปทด|ูฒepssƒซซ+nบุดi<==แโโ‚6mฺเ้ำง€ž={bภ€๐๐๐ภนs1w๎\ิฌYฮฮฮ:thŽ}&''cม‚pvvฦš5kค>v๎ pww‡ตตuฎน5j@KK fff€3fภ+Vฌภ‹/ ”็ดด4จT*}>้B5>> .ฤัฃG‡!C†`๖์ู†‘‘‘Fฐฐ0„……ขฃฃฅ"q๚๕pttDll,666ˆ…ŽŽถlู‚˜˜์ฺต ฿~๛ญT,ฦวว#<<งNย?[[[ฤววC__๛๖ํห5๛๗๏c๘๐แุฑcโโโ0}๚tiกก!bbbะญ[7)Nœ8qฑฑฑ๐๖๖ฦ๏ฟ.ตOJJยษ“'‚I“&แฬ™3ˆ‹‹ร„ ค6ูว้แแ{๗๎a๓ๆอ่ืฏ_๓{๗๎]ฬ›7nnnฺ่ต+’’’“'Oฦโล‹GGG >/^ฬทฏ)SฆภฤฤDzUจPกภqัง้“.T###cccภ๓็ฯฑ{๗n็hฏ_?ฉHswwวาฅK๓์ทSงN€จจ(t์ุบบบฐฒฒBํฺตq๎9@ฝz๕PชT)XXXภฤฤญZต888เๆอ›น๖{โฤ ๘๚๚ยสส คJ ธบบโ๚๕๋€›7oยืืŽŽŽXดhฅ๖;v„Bกธนนก[ทnXฝz5tuuณfอ‚๊ืฏฤฤD„††ยฦฦ&Ÿlๆ”œœ [[[ฤฤฤภมมAcบ€ฝฝ=~๙ๅ$$$ lูฒpppภ฿g_#GŽDrrฒ๔ส5&""ขฯื']จพ.66‰‰‰ฐตตE๚๕qๆฬฉ, ƒ7ถััั‘ญT*ฅ๗JฅYYY…gv๙๊๖ƒฦ่ัฃ‘€iำฆ!---ืทo฿Ž๛ใเมƒhผ9 [ทn9r$ฆM›†ฏพ๚ ‡.tLึึึhถ- ]ปv๓xีj5"""ะฅK„‡‡cๆฬ™hึฌYพวgllฌ๑"""ขฯ']จ6iาซWฏ–ๆ;zyyแ๎ปธ~:Ž9WWWlูฒๅญ๛ฏWฏ6nˆŒŒ ปwgฮœฝฝ[๗Wทn]์ปw๏๗฿๙ถWฉTฐฒฒ‚Zญฦส•+smฃVซq๛๖m๘๚๚bึฌYธt้ L™2=z4ฮ;‡   ฬ˜1…บsฟUซV8x๐ €—ฃื5kึ๙็ŸจQฃยรร1|๘piฺ‹O"""*ŒO๚ฎ 4๕๊ีƒ––ฺตk‡๑ใว็ฺ6{gฟ~ฐฐฐ|/@:uะฒeKธบบBฉTbผy044|๋x---1gฮiิำำำ‹/ฮณ˜1cะขE ˜››ร[š#๚ชฌฌ,tํฺ)))Bh\ž^Žะ ทo฿ฦ๛๗s๔Šฐฐ0<|๘ๅห—วO?„`ไศ‘่าฅ &L˜€ฒeหJลฒ Ž?ss๓ทฮ‘B!Š;ขืฉT*˜˜˜`W๔?02แฃฎ–:+.E้šPj}า—พWฬcั`‹ฦ็Gฏชฆ๏}ˆˆˆ@@@ดตต฿๛>Uฏ็1๛๗wrrr‘\Iค/ัว๋ำS์#ะฎ];\ปvMcูฆM› }็=ังŠ…j1ูธqcq‡@DDD$kผ๔ODDDDฒฤB•ˆˆˆˆd‰…*ษ U""""’%ชDDDD$Kผ๋ŸdออฦๆๆฆลฦG+##€:•M๘@๋wภ< ๆฑh0๔9แˆ*ษ U""""’%^๚'Y{ะฏา้ลฦG+ซ„๐ล.ญฬลฮG‹y,ŸzญึชŠ;ขOGT‰ˆˆˆH–Xจ‘,ฑP%""""YbกJDDDDฒฤB•ˆˆˆˆd‰…*ษ U""""’%ชDDDD$K,T‰ˆˆˆH–Xจ‘,IกฺฑcGิญ[ท@m;w๎ ggg„‡‡ลฎ ญQฃFธpแBฑ์{๘๑ {ง>"##๔V!22ฒ@m}}}ฯŸ?GำฆMahhˆ#Fhดนrๅ 6l{{{ธบบพULDDDDy)๑ฎ์ูณZZZj{๗๎]\บt qqq9ึeeeธŸโ๒1ฤ๘.ž={†%J@GG{๗๎”(QcวŽEbb"nธกัพWฏ^˜5k๊ิฉƒHหŸ>>ะืืืุๆ์ูณ044D:u–––า:www๔๊ี 'Nœศ3?ฏKKKƒJฅาxั็ญภ#ช๑๑๑Xธp!Ž= ccc๗฿˜={6‚ƒƒaddคั6๛๒vฟ~ฐฐ0,]บ๋ืฏGPPŽ?.ตตฑฑAll,Nž<‰-[ถ &&๗ผผผะธqci฿็ฯŸGff&ชVญŠ฿~๛ ๑๑๑h฿พ=๖ํ๑ฟร‡วแร‡aee…๛OZghhˆ˜˜ฬš5K*|}||ะถm[ภ๔้ำ๑๛๏ฟcศ!€คค$œDŸ>}๐ๅ—_ยะะ0ฯฆL™‚ &h฿DDD๔y(pกš=7าุุภหน‹ปw๏ฦฝ{s\๎ืฏŸ๔owww,]บ4ฯ~;u๊ˆŠŠBวŽกซซ +++ิฎ]็ฮิซWOบ”lbb‚VญZp๓ๆอ\๛=qโ|}}aee033“ึ\]]๑๛๏ฟnผ‰N:แ๛x๖์™4Gx9WกPะญ[7t๊ิI*l_งRฉ’’"ฺ&&&าบ–-[BKK ฎฎฎธ~:€—ำ'ฑ|๙r@JJ ๎นƒ๛๗#""ภหK๐ูน?}๚4.]บ„}๛๖มิิ[ทnE||ผ4O๘๙๓็จTฉn฿พ๖ํC[[ๅส•Cƒ ค8กฃฃƒ?๘นG~ฒฒฒpไศฤลลมศศ>>>hะ œQขD ดkืํฺตร7ะงO|๗wHIIษณฟ‘#Gb๘๐แ9ฌPกBกใ"""ขOว[฿L‹ฤฤDฺฺุข~๚8sๆŒT†ม่่่HV*•า{ฅR‰ฌฌฌB๏SWW7ว๖ƒฦ่ัฃ‘€iำฆI—๊_q๛๖ํ่฿ฟ?<ˆๆอ›ษพ…๘๗฿‹ุุXผy•*Uสณ๒ๅห#++ ็ฯŸ—ถoำฆดล‹๑ร?€T`ฟ๏ล‹ร:uBhh(๗฿B‡ตต5๊ิฉ+++ยืื๑๑๑า๚วc๎น Dษ’%ฑnบ7ๆลุุXใEDDDŸทชMš4ม๊ีซฅนƒ^^^ธ{๗.ฎ_ฟŽ#GŽภีี[ถly๋@๊ีซ‡7"##๗๎ร™3g`ooึีญ[{๗๎ลปw@ใาnT*ฌฌฌ Vซฑrๅส\จีjพ}พพพ˜5k.]บ”k;ccc˜˜˜เภ€ไไdiฮhn|}}๑oฟImbccฅๅูำ(233ฅIKKKlฺด ฿|๓ ฮ;‡บu๋b฿พ}ธ}๛6€—Eโํท5rz็ฮ>|Xฺง——VฌXฃGขdษ’๐๗๗G```พำ^UงNนs*• ™™™8z๔(jิจฺ่ต+ผผผ Rฉฐcวlธ๑ญŠz"""๚ผ๘าฟƒƒ „z๕๊AKK ํฺตร๘๑ใsm›ืีิฉS-[ถ„ซซ+”J%ๆอ›—๏œฦ7ฑดดฤœ9sคษำำ‹/ฮณ˜1cะขE ˜››รIII9ฺdeeกkืฎHII'Nฬณฟ+V OŸ>:t( ๒},T฿พ}๑ฯ?ภููjต5jิภ† 0fฬ๔ํŽŽŽ(Qข„Fmmmฑjี*a๛๖ํXธp!ฺดiƒŒŒ hkkcษ’%จSงš6m ุุุไ๚1333 6 ร† ห3F'''พ}™™™๘๓ฯ?qๆฬXXX`ย„ จWฏ€—S8ฒoฌฺ๊ต+๓O(•|L/ฝ=…BwDฏSฉT011AbGs˜*า‹;œVV =ฤ|ฑnk๚@+๓Eq‡๓ัb‹ฦงžGซตๆi%ˆˆˆ@@@€tฃ.๓X4^ฯc๖๏๏ไไไ"™ฦว!/""""’ฅw~เฟดkืืฎ]ำXถiำ&ุุุผ๗}Oš4)วBฃGFวŽ฿๛พ‰ˆˆˆ>eŸDกบqใฦb๗จQฃ0jิจb?ังŠ—‰ˆˆˆH–Xจ‘,ฑP%""""YbกJDDDDฒฤB•ˆˆˆˆd้“ธ๋Ÿ>]–aann^a|ด222€ˆ”๙ใ_>ะ๚0Eƒy$ขยโˆ*ษ U""""’%^๚'YS/nตฎบธร๘hฉ:@ๅมP/hตH/๎p>Zฬcั`‹๓๘’r๘แโ>Žจ‘,ฑP%""""YbกJDDDDฒฤB•ˆˆˆˆd‰…*ษ U""""’%ชDDDD$K,T‰ˆˆˆH–Xจ‘,ฑP%""""Y๚ไ ีคค$,]บ4ฯ๕eห–}c„ฝฝ=4hP”กXdd$‚‚‚>่>๏นƒ=znผ ooo่้้!,,LฃฉSงเ๎๎{{{ดn๚ƒฦHDDDŸถฯพP-ˆUซVaาคI8|X๓{…ณฒฒฉ฿กฐ1>y๒`mm+VŒ1{๖l„„„hดอศศ@Ÿ>}ฐz๕jœ;wฟ; ==ฯž=+‚่‰ˆˆ่s๖ษชw๎ทท7\\\เไไ„$$$ภลล3fฬ@jj*ฺตk;;;๔๋ื๏ญXฑ๋ึญCHHˆๅห—ฃcวŽ๐๑๑A๗๎qๅส4hะNNN่น3RSS5BHH\]]แแแ่่h4mฺ•+Wฦ๖ํ๓ŸJฅBืฎ]แไไDGGxY@ถnีชUรคI“ค๖ญZต‚››ฑaรภ๕๋ืแโโ‚ฮ;รฮฮ.GN.\ธcฟวGฯž=แ๎๎.๕Qทn]€ฉฉ)<==กญญญฑอฎ]ปเๅๅ…ชUซ,--ฅX0x๐`$&&พ1ว––•Jฅ๑"""ขฯ'Wจ๕ื_๐๕๕Ell,bbb GGGฤฦฦโ๛๏ฟวย… akk‹ฤฤDดhั๗๏฿—ถuqq‘ปwoDGGฃG ฤย… ฑpแB@||<ถm†UซVa๐เม6lโใใaccƒ9sๆH}˜››ใฬ™3จ_ฟ> „ํทcำฆM อ3‰'ขz๕๊ˆGtt4ชWฏ8sๆ –/_Žธธ8„……I๑Š+ƒฃGbฬ˜1Bฮ;‡qใฦแโล‹9rRฉR%@JJ ยยยเๆๆ† & M›6ธx๑bs}๙๒eคฅฅกI“&pwwว๚๕๋eส”มนs็เ๎๎Žพ}๛ยววซVญBZZZž}M™2&&&าซB… Žƒˆˆˆ>M%Š;€ขๆแแž={BฉTขSงN000ะX…Ÿ~๚ ะฆM๕ฑฑฑาฟ๓›.ะผysIดo฿ะญ[7๘ใRปVญZกP( งงผy3ฯพ๗๏฿ˆˆ@‰%`ll ๐๖๖†นน9ภึึw๎Aตjี0gฮlูฒภหQะ{๗๎jีช{{๛\sbggเๅๅ}///lุฐA*^ #++ 'Nœภฑcว––///4lุ–––ะืืG=ะฃGœ={=z๔ภ”)Sk_#GŽฤ๐แรฅ๗*•Šล*ัg๎“Qmุฐ!:KKKt่ะ๛๖ํหัFกPผำ>^/~๓ขฃฃP*•~›นญบบบาฟณ๛8pเNž<‰“'O"..ถถถาจๅซ1ๆ•“u๋ึกdษ’ ฤนs๑๘๑ใBลdmmฦรุุpssำ‘๗฿๑๓ฯ?ฃSงNpppภโล‹๓=>ccc}>นB๕ฦฐฒฒB„คค$คคคH๋๋ีซ‡5kึถm๖ฮ7ธธธ`๋ึญ^tUฟ~w๊ฯืืWบณ>33S#๖ืฉT*˜™™AWW'Ožฤ๙๓็sm๗zNฒG5›7oŽ7bวŽPฉT๐๒๒Bืฎ] ซŸŸNŸ>๔๔tคฆฆ"..UชTArr2แ๏๏CCCDEEaลŠ๐๒๒*D&ˆˆˆ่s๗ษช‘‘‘prr‚ซซ+>Œเเ`899มษษ 3fฬภภqๅสุc๛๖ํ(SฆŒดmnsT฿dผy˜>}:œœœ๐ฯ?`่ะก๏˜1cp้า%8::ยรร—.]สณญฟฟ??~ {{{ฬ™3ฮฮฮนถ{='บuำXommฑcวโ๙๓นชฯž=C๙๒ๅ1{๖lŒ9Rบyชt้า่ีซ\\\เ้้‰X[[†Žณgฯbุฐa(Uชิฆƒˆˆˆ>c ‘}๗ ‘ŒจT*˜˜˜เมไ†0ืUw8ญ …vVŒๆฬƒถH/๎p>Zฬcั`‹๓๘’r๘แ77สGFF"""ใฉ6Tpฏ็1๛๗wrrr‘Lใ๛ไFT‰ˆˆˆ่ำ๐ษ๕ฑุตk—ฦ€—sFงNZLษ ีbโ๏๏โƒˆˆˆHถx้Ÿˆˆˆˆd‰…*ษ U""""’%ชDDDD$K,T‰ˆˆˆH–xื?ษš๒› Pš›w-eFๅ P๒ึoy,ฬcั`้sยU""""’%ชDDDD$Kผ๔Oฒฆ9 jžฆoK -@ู๊m฿Aฌโ็ฃUิyTถ[PQ}๚8ขJDDDDฒฤB•ˆˆˆˆd‰…*ษ U""""’%ชDDDD$K,T‰ˆˆˆH–Xจ‘,ฑP%""""YbกJDDDDฒฤB๕JJJยาฅK๓\_ถlูท๎{๙๒ๅx๔่Qพm๎นƒ=zจฟ-[ถ`ผy€;vภััJฅ.\ศฑ฿Zตjมฮฮกกกo<Q.Xจ~@o*T฿EA UkkkฌXฑ"฿6Ož<b๐เม€jีชaํฺตhุฐกF๓็ฯcษ’%ˆ‰‰Abb"พ๙ๆ@rr2„o{(DDDDXจพWw๎ทท7\\\เไไ„$$$ภลล3fฬ@jj*ฺตk;;;๔๋ืฏ@}†……มรรNNN่ีซิj56nˆ่่hดkื 4,[ถ pppภโล‹ืฏ_Gบus๔™™™‰ 6ภฯฯƒ ๐ฒ๐1b jีชจUซVŽํ~w <KKKภแร‡QซV-L:<(dึˆˆˆˆ^bก๚๕ื_๐๕๕Ell,bbb GGGฤฦฦโ๛๏ฟวย… akk‹ฤฤDดhั๗๏฿—ถuqq‘ปwoDGG:w๎ŒSงN!>>๚๚๚ุบu+ฺตkwwwlธ‡ฦํท1iา$9rวŽร์ูณq๚๕๑บu cวŽ…ถm†‰'"<<ผภวw๙๒eœ>}u๋ึEใฦ‘hีช<hิจ‚‚‚™o_iiiPฉT/"""๚ผฑP}<<<ฐrๅJL˜0—/_†พพพฦ๚จจ(ฺดi#L@llฌ๔๏ฅK—ยooo8::b๋ึญHLLฬฑ฿่่h๘๙๙มิิFFFภ‰'4ฺœ}๚`๙๒ๅHHHภ!C––๖Vฑ999a๑โล8rไ:t่€ตkื"==ฝP}X[[#00Jฅธw๏žฦิ3gฮ`เภ มื_<๛9r$’““ฅืญ[ท๊ธˆˆˆ่ำมB๕=บqใฌฌฌะฟ!)) )))า๚z๕๊aอš5€mถแูณgo์355x๑โ…ด-I}{xx`฿พ}PฉTx๚๔)v์ุOOO~๔๔๔๐ีW_แ๘๑ใ˜1c๖๏฿š5kbึฌY>พW/๑Ÿ={fffP(8}๚4<<<œ={SงN…Mž}้๊๊ยุุXใEDDDŸ7ช๏Qdd$œœœเ๊๊Šร‡#88NNNprrยŒ30pเ@\นr๖๖๖ุพ};ส”)#m›ืีQฃFกvํฺhธ1\]]ฅ6={๖D๗๎ั A”+W?๘#๊ีซ‡บu๋bุฐa๙‰... C||ผฦ~ณํทๅห—วฑcวะจQ#t๏ภหB5##๖๖๖ู่ณ'–,Y000@xx8๖๏฿/พ๘:::๏E"""๚\)Ÿ#D2คRฉ`bb‚๖…นA‰โ็ฃ•-์T6As๕~h#ซธร๙hu•ํATŸŒŒ DDD ฺฺฺลฮG‹y,ฬcัx=ูฟฟ“““‹ไ๊(GT‰ˆˆˆH–Xจ‘,ฑP%""""YbกJDDDDฒฤB•ˆˆˆˆd‰…*ษ U""""’%ชDDDD$K,T‰ˆˆˆH–๘•?$kสๆ“ 47/๎0>ZสŒ "สV3กไ7ฏผ5ๆ‘ˆจxpD•ˆˆˆˆd‰…*ษ/“ฌฉ†ฺXฟธร๘hฉี` ๕ูีP๓ฯาท๖.yT:w!}๘ซ‹ˆˆˆˆd‰…*ษ U""""’%ชDDDD$K,T‰ˆˆˆH–Xจ‘,ฑP%""""YbกJDDDDฒฤB•ˆˆˆˆd‰…jKJJยาฅK๓\_ถlูท๊w๙๒ๅx๔่Qž๋gฮœY >FŒQ ;QQQ€)Sฆ bลŠ9bWซี:t(jิจš5kb๗๎๊›ˆˆˆจ Xจฑ7ชo+ฏBUตZ] Bต ž** AAA€6mฺภภภ@Z—]XภาฅKแ๎๎ขw๏ุฒe sฏ‘‘s]…ฎ]ปBกPภััธพF›Yณfมวว๕๋ืGbb"BCC Uค/GbmmmLœ8QZgoo_~๙ ([ถ,๐๗฿็ูื”)S`bb"ฝ*TจPจXˆˆˆ่ำรB๕5lุ‡‚ฅฅ%:t่€}๛๖ๅhฃP( _‰%ถm"<<_uฎํ^-x฿Fทn0rไHL›6 _}๕>\่>ฌญญัถm[@ปvํ'ญSซีˆˆˆ@—.]Ž™3gขYณfy๖5rไH$''Kฏ[ทn:"""๚ดฐP}G7n€••๚๗๏   $%%!%%EZ_ฏ^=i็ถm๐์ูณ|๛{๚๔)’““ˆ้ำงKฃฎFFFพNฉTBญVK๛\ทn„8w๎ž?Ž2eสhด/Sฆ Fs็ฮ!((3fฬ€ƒƒCก๎oีช<ˆŒŒ”ฆ%๙็ŸจQฃยรร1|๘pฤลลaศ!066ฮณ/]]]kผˆˆˆ่๓ฦ9ช๏(22ำงO‡ŽŽฬออฑz๕jDGGรษษ ปwวภ๑ๅ—_ย 6ิ(s›ฃZฎ\9"== …?3€—77u๏นŽ~v๋ึ ŽŽŽ๐๓๓รฌYณp่ะ!8::BGGห–-ห3~ฅR‰€€เ๖ํ9ฆ@hh(ยยย๐๐แC”/_?๔ €‘#GขK—.˜0aส–-‹•+Wlllp๘q˜››ฟKj‰ˆˆ่3งBˆโ‚่u*• &&&xphฬ๕฿ผๅ*C ์ผiŒๆUะๆ๕“ท๖.yT:w?A}„222€€hkkw8-ๆฑh0Eใ๕A,Teศรร+Wฎฤ„ p๙๒eYŸ|กz็ฮx{{รลลNNNˆŠŠาxแยŒ5 pqqมŒ3ฐ|๙rt์ุ>>>่ฝ;๎฿ฟ6mฺภ 4ภฅK—aaa๐๐๐€““z๕๊ตZ hิจBBBเ๊๊ DGGฃiำฆจ\น2ถo฿žgฌใวGฏ^ฝเๅๅ…~๘—/_Fณfอเๆๆ†ๆอ›ใ๛ผx๑ฐ|๙rŒ1๐๗฿ฃfอšpvvฦŒ3 ฯ>^u๚u๔ำOจYณฆtlฏ๎ฃQฃFRš-)) gฯžE๛๖ํ&&&ะีีดm;vฤฝ{!„(ะSZZT*•ฦ‹ˆˆˆ>oŸ|ก๚ื_มืืฑฑฑˆ‰‰ม4WชT “&M‚ฃฃ#bcc๑๗฿โใใฑm6ฌZต ร† รธqใูณgc๘๐แ€ฮ;ใิฉSˆ‡พพ>ถn*ํืgฮœA๚๕1hะ l฿พ›6mBhhhพ๑^ฝz‡ยฌYณ0pเ@,]บ111๘๚๋ฏ๑๓ฯ?็นใวฑ~z$&&"..฿|๓ ไูGVVถlู‚€€ดo฿ๅส•ร้ำงแ๊๊Z ผ^ปv fff๘โ‹/เ๊๊ŠัฃGK๋"##ัทo_,Zด˜9sๆงL™2&&&าซB… Šƒˆˆˆ>]%Š;€๗อรร={๖„RฉDงNะ A๗vvvนnืผysiqHLL”ึiiiโโโ0z๔hจT*$%%กB… hำฆ  UซVGGG( ่้้มมม7oฬ7ถmB[[)))8z๔จิ_VVชTฉ’็v&&&044D๏ฝัถm[ดlู2฿>ฺถm‹s็ฮaลŠจ_ฟ๓๘บฌฌ,?~งOŸF๕๊ีัถm[lูฒP(hึฌš5k†‡bุฐa(_พ<๙็X[[็ฺ฿ศ‘#ฅ?@ฅRฑX%""๚ฬ}๒…jร† q่ะ!lบ:tภ‚ rผฯญ400ญP(p๚๔i(•šะ}๚๔มŽ;PญZ5ฬœ9OŸ>•ึeฯ๏T*•~ำำ์ชีj”+Wฑฑฑ9ฺhiiIำ าาา%J”@tt4vํฺ…๐๐plุฐฟ๒Kž}L™2ฟ๚+พ๚๊+ดkืฝ{๗Fตjี๒ํUึึึจVญ์ํํผ,ฬใโโx๚๔)ึฌYƒฅK—ขdษ’Xนr%ส”)“gบบบาิ""""เ3ธ๔ใฦ XYYก ย‘#G4'$$ภศศ)))y๖ั A้f+ตZ„„@jj*,,,๐โล ฌYณฆHใ611AฉRฅฐ{๗n/ot:< RฅJˆ…Zญฦถmผ, “““ˆ้ำง#666฿>๐๋ฏฟโฬ™3จVญบvํŠฦใ๚๕๋Šฯฺฺฆฆฆธu๋„8x๐ jึฌ ๘๎ป๏ค๙ฟ+Wฎฤฝ{ัฉS'i$šˆˆˆจ >๙B522NNNpuuลแร‡accฃ๑พ[ทn077‡““œœœค›^5|์ุฑฮฮฮpppnˆ5jjืฎฦxnga„‡‡cฦŒpvv†‹‹ Nœ8=z4z๔่z๕๊I—าSRRะฒeK8;;ฃM›6า\ิผ๚ศVฒdI๔๎งNยฬ™3QขDฮA๖–-[ขSงNุฒe ส—/3gฮfอš…ภภ@899มิิ:t๘๚๚โย… ˜1cชVญZไy!""ขฯƒB๔ถlขHฅRมฤฤCw G ฃผgจฬ๐ž๖ฃ๚๘ddd ""ะึึ.๎p>Zฬcั`‹๓X4˜วข๑zณ'''รุุ๘๛ไGT‰ˆˆˆ่ใ๔ษ฿L%Gปvํย?จฑฌy๓ๆ˜:uj1EDDDD$?,T‹ฟฟ?‹; """"Yใฅ""""’%ชDDDD$K,T‰ˆˆˆH–Xจ‘,ฑP%""""Yโ]$kฃ=~‚นนyq‡ADDDล€#ชDDDD$K,T‰ˆˆˆH–x้Ÿdm?Aฑžฦฒี{S4DDD๔!qD•ˆˆˆˆd‰…*ษ U""""’%ชDDDD$K,T‰ˆˆˆH–Xจ‘,ฑP%""""YbกJDDDDฒฤB•ˆˆˆˆd‰…ช $%%a้าฅล††-[ถ`ผy€;vภััJฅ.\ะhท|๙rิชU vvv -ŽP‰ˆˆ่ลฏP•์Bตw๏œ_ š••--ญห“'OPชT)JหชUซ†ตkืขmฯŸ?%K– &&x๐เ 99ฦฦฦP(,n"""๚๔pD๕=ปs็ผฝฝแโโ'''DEEiผฟpแF…„„ธธธ`ฦŒXพ|9:v์t๏๗๏฿G›6mเ๎๎Ž เาฅK€ฐฐ0xxxภษษ ฝz๕‚Zญ4jิ!!!puu…‡‡ขฃฃัดiSTฎ\ทoฯcff&6lุ??? 4ภห‘า#FชVญŠZตjๅุ๎๗฿วเมƒa``ฐดด>|ตjียิฉSฅโ•ˆˆˆจฐXจพg๕|}}‹˜˜8p@ใ}ฅJ•0iา$8::"66฿= >>ถmรชUซ0lุ0Œ7ััั˜={6†่น3N:…๘๘x่๋๋c๋ึญา~อออqๆฬิฏ_ƒ ย๖ํฑiำ&ห๓ทnยุฑcagg‡mถaโฤ‰/๐ฑ]พ|งOŸFบuัธqc$$$Zตj…ƒxY4!222฿พาาา Rฉ4^DDD๔yใฅ๗ฬรร={๖„RฉDงNะ A๗vvvนnืผys๖๏฿ฤฤDi]๖T€ธธ8Œ=*• IIIจPกฺดiเeฑŽŽŽP(ะำำƒƒƒnผ 8y๒$๊ีซ‡กC‡"::ฦฦฦ…>ถฌฌ,ฝ{QQQ8v์z๖์‰˜˜@™2e0bฤ๘ใุถm:u๊„   ฬŸ??ืพฆL™‚ &:"""๚tqD๕=kุฐ!:KKKt่ะ๏๗ํ—๋vู—ำ@กPเ๔้ำˆ•Fb OŸ>Xพ|90dศคฅฅI่่่”JฅฦฟณฒฒNNNXผx1Ž9‚:`ํฺตHOO/ิฑY[[#00Jฅธw๏„า๚3gฮ`เภ มื_<๛9r$’““ฅืญ[ท  }zXจพg7n€••๚๗๏   9rDใ}BBŒŒŒ’’’g 4ž  VซฅK์ฉฉฉฐฐฐภ‹/ฐfอšBลฅงง‡ฏพ๚ ววŒ3ฐ~ิฌYณfอ*pฏ^โ?{๖,ฬฬฬคขฺรร!!!๐๑๑มูณg1u๊Tุุุไู—ฎฎ.Œ5^DDD๔yใฅ๗,22ำงO‡ŽŽฬออัฝ{w899I๏Wฏ^ sss899มษษ ปw‡………F๓็ฯGฟ~ฐpแBddd GpttฤจQฃPปvm”)Sฎฎฎoฃ‹‹ ยยย๐๔้Sœ8q"ว๚}๛๖!88>DฃFะฌY3ฌ\นญZตBDD์ํํกฏฏ%K–x9Ž๊ีซฟuLDDDD ๑๊ตZ"™PฉT011Aุษ๙ะ7ัำXืฃzฮวxQ๎222€€hkkw8-ๆฑh0Eƒy,ฬcัx=ูฟฟณU๙ฎx้Ÿˆˆˆˆd‰…*ษ U""""’%ชDDDD$K,T‰ˆˆˆH–Xจ‘,ฑP%""""YbกJDDDDฒฤB•ˆˆˆˆd‰_กJฒึฑr˜››wDDDT 8ขJDDDDฒฤB•ˆˆˆˆd‰…*ษ U""""’%ชDDDD$K,T‰ˆˆˆH–Xจ‘,ฑP%""""YbกJDDDDฒฤB•ˆˆˆˆd‰…*ษ U""""’%ชDDDD$K,T‰ˆˆˆH–Xจ‘,•(๎ˆr#„คคค@[[ป˜ฃ๙xeddเูณgPฉTฬใ;`‹๓X4˜วขม<ื๓จRฉ฿๏๑wลB•d้๑ใว[[bŽ„ˆˆˆ +%%&&&๏ U’%333ภอ›7฿๚D๗๐๐ภฉSง)ŽwํฃธทWฉTจPกnบccใb‰ก(๚(๎˜วข้ฃ(๒๘ฎ1ศa๛wํƒy,š>>•<w ฏ็Q””X[[ฟu<ฏbกJฒคTพœ>mbb๒ึ ZZZ๏๔แS}๗๖ูŒ?๋<Uฬc๑็ฑ(b(๎ํ‹ชๆ‘y”S ฏๆฑ(FRณ๑f*๚d 8ฐุ๛(๎ํ‹ยงวข๊ฃธ๗ฯ<M ลฝ}Q๕Q1๗๖EีGqว ‡<ศ!yQˆขšํJT„T*LLLœœ\$#ŠŸ+ๆฑh0Eƒy,ฬcั`‹ฦ๛ฮ#GTI–tuu1n8่๊๊w(5ๆฑh0Eƒy,ฬcั`‹ฦ๛ฮ#GT‰ˆˆˆH–8ขJDDDDฒฤB•ˆˆˆˆd‰…*ษ U""""’%ช$; .„ ๔๔๔เ้้‰“'OwHฒ6~x( Wอš5ฅ๕/^ผภภannCCCt่ะ๗๏฿/ฦˆๅแะกChบ5ฌญญกP(ฐiำ&๕BŒ;VVVะืื‡ฏฏ/._พฌัๆฟร—_~ ccc˜ššโ๋ฏฟฦำงO?เQฟ7ๅฑgฯž9ฮฯๆอ›kดa)SฆภรรFFFฐดดDถmq๑โE6๙Yพy๓&Zถl XZZโ๛๏ฟGffๆ‡<”bU<6jิ(ว9ูฏ_?6Ÿ{๛ํ7899I๑๗๒๒ยŽ;ค๕๒\dกJฒฒfอ >ใฦร้ำงแ์์ }:ๆอ›‡ฐฐ0œ8q%K–„ฟฟ?^ผx!ต๙๒ห/q๎9์ูณถmรกC‡๐อ7฿|จC…7ๅš7oฎq~๕ื_๋™Gเเมƒ8p Ž?Ž={๖ ##~~~HMM•ฺผ้g9++ -[ถDzz:ขขข๐ว`๙๒ๅ;vlqRฑ(H OŸ>็ไ๔้ำฅuฬ#Pพ|yL:111ˆŽŽF“&MะฆMœ;wภ>‘ŒิฉSG 8PzŸ••%ฌญญล”)SŠ1*y7nœpvvฮu]RR’ะึึ๋ึญ“–?^วŽ๛@สฑqใF้ฝZญeห–3fฬ–%%% ]]]๑ื_ !„HLLฤฉSงค6;v์ …B๛๏ฟ,v9y=B,ฺดi“็6ฬc๎นXw‚•ีซW ]]]ฑ|๙r‘˜˜(พ๙ๆajjชq็ i ‘‘‘โฺตkโ่ัฃยืืW”.]Z˜G!๚๗๏/LLLDddคธ{๗ฎ๔z๖์™ิๆM?ห™™™ยมมA๘๙๙‰ุุXฑs็Naaa!FŽY‡T,”ว+Wฎˆ‰'Š่่hqํฺ5ฑy๓fQนreัฐaCฉๆQˆ#FˆƒŠkืฎ‰๘๘x1bฤกP(ฤ๎ป…๖\dกJฒ3|QฑbEกฃฃ#๊ิฉ#Ž?^!ษฺ_|!ฌฌฌ„ŽŽŽ(Wฎœ๘โ‹/ฤ•+Wค๕ฯŸ? ฅJ•ข]ปvโ๎ปลฑ<8p@ศ๑ Bผ|Dี˜1cD™2e„ฎฎฎhฺดฉธx๑ขF?]บt†††ยุุX๔๊ีKคคครัŸ๒๘์ู3แ็็',,,„ถถถจTฉ’่ำงOŽ?<™G‘kˆeห–Im ๒ณ|๚uัขE กฏฏ/J—.-BBBDFFฦ>šโ๓ฆ<ผyS4lุP˜™™ ]]]QตjU๑๗฿‹ไไd~>๗<~๕ีWขRฅJBGGGXXXˆฆM›JEช๖\T!Dแฦ`‰ˆˆˆˆ?ฮQ%""""YbกJDDDDฒฤB•ˆˆˆˆd‰…*ษ U""""’%ชDDDD$K,T‰ˆˆˆH–Xจ‘,ฑP%"๚ฬฅฆฆยฮฮOŸ>-๎P4ุใุฑc…ฺฦฦฦGŽyOฮฅK—Pทnโƒ่ฃฦB•ˆจ˜ูุุ dษ’HMM•–={๖ FFFฐฑฑัhg``CCC˜››ฃs็ฮx๒ไ‰F_ฑฑฑ….ŽยยยะฆMพำqตs็ฮมหห๋ƒ์+22UซVีXึณgO„††พuŸีซWGูฒeฑu๋ึw ่ณลB•ˆHส•+‡M›6I๏7o ++ซํv๏งOŸโๆอ›HOOวฯ?ฌฑ~็ฮhผyก๖๛๏ฟฃK—.owadffพ๗}ศE๖ฑv้าK—.-ๆhˆ>^,T‰ˆd K—.—๙็Ÿ๘๒ห/๓l_ฒdIโ๙๓หณ ี็ฯŸฃหk็๎Bข๊ึ8€zEgฦฦqœiLฉtR ิขHอยิฬR +Cฌ$ฌ.,ั PHH(‚Bฃ’ภๆBอ๕BษำL๚ขDL3ำ๑QsดxฮEธ฿<ฮh๏{^hฮ9ฯ๏jฏูkญ็Y{n๖^{= ggg8;;#$$ฤไ<:}}}๐๗๗~๓๔๔ฤีซWแ๋๋ GGGไไไเใว ‚D"ม้ำง…พ ศออ…Jฅ‚ปป;าาา๐ํ7ภฝ{๗ŽิิTH$ctt‰‰‰ษd๐๒๒‚Vซ5ปฦŸใืิิ`ใฦย]ๆ๛๗๏›๗๙slุฐ...ศฬฬฤยย‚p๎ๆอ›Xฟ~=\]]‘œœŒฉฉ)ฬฯฯ#::]]]‰D‰Dะjต())A^^D"‘ฐๆึึV„††ยษษ x๓ๆ0ท•• ฑn:„‡‡BCCQ__Uค3๖"ฦcฟ•ZญฆฦฦFR*•488HƒƒƒคT*ฉนน™ิj๕’~ฯž=#"ข๑๑qŠฅ\แฤฤษๅršŸŸง[ทnQll,Fšฅฆฆ&“ฑkjj(00pY>aaa422BํํํdooOคำ้Hฏื“››=y๒„ˆˆŠŠŠHฃัPOO ำ๖ํ…œŠ‹‹ษฦฦ†Š‹‹i~~žŒF#ํป—222hff†ฺษZZZฬ^—ล๕บนนQss3้๕zjkk3;f๓ๆอคื๋ฉทท—4 ฝ{—ˆˆ‰Db๒m™L&;88,k/Ž้๋๋รฺตk…sjต}}}B[ฉT ว:333Xณf คR)คR)๎นƒฏ TTT ชช JฅQQQหถ>[ถlFฃA@@ฒณณอ๖/))ม—/_เๅๅ™L†๓็ฯczzzี8ZญjตNNNx๘1 อ๖MHH@HH'N๘๑e…””ฤฤฤ@,#,,L(’}}}qเภจT*HฅR? Wฏ^A*•โ์ูณH$จญญEAAd2<==QTTดbeee8u๊ิช๋cŒ™fED๔ป“`Œ1๖Ÿ‰ŠŠBVVv๎๙—วNMM!88ฏ_ฟถธ7๛๔้’’’๐โล “[ cซใB•1ฦ\นr้้้ฐณณ๛ฉ0ฦุ?† UฦcŒ1f‘x*cŒ1ฦณH\จ2ฦcŒ1‹ฤ…*cŒ1ฦณH\จ2ฦcŒ1‹ฤ…*cŒ1ฦณH\จ2ฦcŒ1‹ฤ…*cŒ1ฦณH\จ2ฦcŒ1‹ฤ…*cŒ1ฦณHฯl็ฝ,ฯIENDฎB`‚c4core-bm-charconv-atox-mega_bytes_per_second-i32.png000066400000000000000000001066101477602032300330620ustar00rootroot00000000000000c4core-0.2.6/doc/img/windows-x86_64-vs2019-Release‰PNG  IHDR 1(Z9tEXtSoftwareMatplotlib version3.5.3, https://matplotlib.org/อ+นา pHYsaaจ?งiŒ๕IDATxœ์w|๗๑G2ศ@*v%ีขd"EฬขvƒMUัขf)ชญRซZJmŒ–RJฉฝ๗#„ิh+จMIbEฦ๕๛ร/็๋ศ๋d|ž๗ํœs]๏๋}ฝ^ืนrฮห๛วฦ0 +ฑM๏DDDDไ‹ Pฑ* """"bU*@EDDDฤชT€ŠˆˆˆˆUฉซR*""""VฅTDDDDฌJจˆˆˆˆX• P+‹ˆˆภฦฦ†๏พ๛.ฝCIQ๕๊ี๑๖๖N๏0าฬฦฦ†nบฅw’‰lฺด 6mฺ”กฯkถ-ฮฮฮ้ฦI<Ÿ>}zz‡’้จ•Iแแแ 4ˆˆˆˆ๔E$]์ุฑƒAƒqใฦ4ต?~8={๖$00GGGlllR๛ฑฑฑมฦฦ†๖ํ';ฟ_ฟ~ๆ6Wฏ^}ย ฯ์ูณ;v์S๗“‘dลœฤาํท4hPฒ ฺฒe AAA)RGGG๒็ฯOบuูพ}{’>&NœHํฺต)P ...”)S†‘๘๘๘วŽ้›oพaัขEO˜ัใQ*“ยรรnศ)z’bญjีชนs‡ชUซ>ณ8ž% ™CัขEนs็๏ฝ๗c/{๛๖mœlzโฤ lmm้ิฉ'Nไ“O>แโล‹TญZ•UซV™๓ฯ?|๔ัG†Aฏ^ฝ๘๎ป๏๐๒๒ขK—.|๐ม“ P‘G0 ƒ;w๎คw™ฮญ[ทžhน   nธAXX๏พ๛๎#ืญ[—จจ(Vฎ\i1}วŽœ:uŠ /lllpttฤฮฮ๎™๖พ}{-ZDฟ~hืฎŸ|๒ ;v์ oผ1ษŸ??aaaฌ]ป–>}๚ะฑcG,Xภ๛๏ฟฯŒ3๘๋ฏฟži\ฯ’๒$K9}๚4]บtกD‰899แ๎๎N๓ๆอ-F:งOŸN๓ๆอx๕ือ‡_่?@้าฅqpp `ม‚tํฺีbคจM›68::๒็ŸZฌฟN:ไฮ›๓็ฯง)1cฦPดhQœœœจVญGŽIาๆุฑc4kึŒ๘c<<xyy™R;"'O\\\าดํ *DีชU“์Wณfอยวว'อ็GGG๓๑วใ้้‰ƒƒผ๑ฦ8pธพ๒๒ๅห9}๚ด9OOOเ๖ฯ9sๆะฟ *DŽ9ˆŠŠJ๖ะฤsŸต฿รฯš   rๆฬ‰‡‡={๖d๕๊ีI๚๚่#๒็ฯฯนs็Xถl7nภออ-ูRห้ฮ;Tฏ^ฟ๚‹nบแๅๅลผy๓hถ-7n Gฆ๕อš5ฃ]ปvดiำ†Ÿ™ถmโ๏๏Ÿl1“๕-[ถคcวŽดjีŠ๏พ๛Ž7฿|“พ๘โ บt้ฌhัขวท}ŽงnบTจP#Fฐjี*H\\C† 1ทุ๋ฑ#ำงO็๗฿ง{๗๎œ:uŠ &p๐เA๓็sขไ>/Ž=Jร† ๑๕๕eศ!888๐ื_%9ท2ญŸ)‰งN:”/_ž๏พ๛Žu๋ึ1jิ(Š+F็ฮษ›7/?๘#;wฆI“&ผ๕ึ[๘๚๚Z๔ลฝ{๗ธz๕*3fฬเศ‘#IŠๅไ\ผxภท3gฮค}๛๖ผ๖ฺk|๘แ‡+V,อห?6C$ น}๛v’i;w๎4cฦŒๆi๓ๆอ3cใฦm/_พlุตkื6โใใอำ'L˜`ฦฯ?lžถz๕j0†j๓ฯ?†ณณณัธqใGฦx๊ิ)0œœœŒื<}๗๎`๔์ูำ<ญfอš†q๗๎]๓ด„„#00ะxๅ•WฬำฆM›fFญZตŒ„„๓๔ž={vvvฦ7 ร0Œ7n...F๙๒ๅ;w๎Xฤ๕เrีชUKฒอbbbŒ๙๓M›65Oธqฃฦฝ{๗ฬำ฿y็รฦฦฦจWฏžล:*Vฌh-ZิbZr๏Y:uŒ—^zษbZัขE ภXตjU’๖€ัตkWร0 ฃw๏†ญญญ1}๚๔$ํ๓z”ŸูŒัฃG'™—ธ-Zd~ิฌY3รฦฦฦ๘๋ฏฟ,โณททท˜v่ะ!0ฦož๖ฮ;๏F\\œyฺ…  [[[cศ!ๆiป_Tฎ\ูขOร0Œ‘#G€q๊ิฉGn‡=jูฤ๗ใฟ3์ํํ™3g†aห—/7lllŒˆˆcเภ`\นr%ีuนนน™฿”4hะ ษ~eทพ๔าKI๖ณฤy~คuฟ5j”‹-2Oปs็ŽQฒdI‹>mž>iาค$ฝM›6`|๔ัGๆi Fƒ {{{๓>ฒu๋V0fอšeำชUซ’LO้๓bฬ˜1iฺ๏า๚Y‘๘y>mฺด$๙<๘7k†QฆLร฿฿฿๚ส•+` 80ล๋ิฉcๆฯŽ;&๙์~XLLŒQชT)รหหหˆ}dส™3งัฆM›วZๆI้ผd)NNNๆ็ฑฑฑ\ปv—_~™\นr™ูฅfบuปw?ุโ็:tภีี•ๅห—›งีฎ]›Ž;2dศz๋-S=$ฐฦSจP!๓๋ื^{๒ๅหณbล ๛๏?6lุ@‹-ˆŽŽๆ๊ีซ\ฝz•kืฎQงNNž<ษนs็,๚๐ร-›UฉR…๘๘xNŸ> ?๔อ็Ÿžไ"‡ท9;;ำชU+๓k{{{^{ํ5๙็Ÿ$นดnฺbไก|๙๒†‘ไ$๘๒ๅหs๖์Yโโโฬำ|ฯ"##นz๕*ีชUใŸIr˜าหห‹:u๊$Y??วซ[ทn|๗๚๋ฏดiำ&I›M›6ฅiDใ?เ…^เฃ>J2/q;ญXฑ;;;บw๏n1ฟw๏†‘ไวZตjYŒ&๘๚๚โ๊๊jฑ=฿~๛m._พlqw๙$$$๐๖oOถ_t่ะแ™Ÿฃ–นs็ฆnบ๖oภ k)Zดhš๛ศ•+ปw๏N๓i-ษiำฆล~–šด์๗ซVญขPกB™ง9::ZŒถๆฮีซWs๛๖ํ'ŽA+Vฌ ผ๓ฮ;ๆiูณgง{๗๎ผy3ูS8VชT)ชTฉb~7o^J”(‘์฿vZ•*UŠŠ+š_—/_€5j๐โ‹/&™žบผ•Zโi+๗๎cบuฬ›7777xใ ๓~๕๊UqvvN2็Eฎ\นXผx1 )ๆ“ึฯŠิt๊ิษโu•*U{>œ5kึ๐ำO?QกB๎ปg๑๙™œnบฮ„ ศ–-ใ่V*Yส;w0`€๙œผ^xม|ฮLj็\%J,ิ>ดkooฯK/ฝdžŸ่ป๏พ#Ož<„††2n8<<<า๋+ฏผ’dZ๑โลอ็V๕ื_†ม—_~Iผy-๎Ÿ ๖ ?่แ~˜ฯJ<1-็฿.\8IQš;w๎$็Z%ทฤ/"EŠ$™ž`๑^l฿พZตj‘3gNrๅสEผyอ‡˜’+@S2cฦ &Nœศ๘๑ใ-พœŸฤ฿M‰%R๐>}๚4 Lr^dโฉ๏+o#Hบ=๋ึญ‹›››ล)s็ฮลd2Qผxqเษ๖‹ิถ๓ึฒeKึฎ]ห™3gXดh‘ลii1bฤŽ9B‘"Exํตื4hะc‰?Niู๏OŸ>Mฑbล’ด{๙ๅ—“ฌทWฏ^L:•^x:u๊0qโฤ4}ฅไ๔้ำผ๒ส+I.žJiฟKNZ๖ลว๕8Ÿ@’uฺฺู๒าK/YLK็?Ož GGว$งด<ษ66™Lผ๑ฦ|๐มฌ]ป–={๖คz^ๆศ‘#™2e _}๕๕๋ื’ะญ&ใ–ฦ"Oเฃ>bฺดi|๑วTฌX777lll~ๆ04่………=uแ๓ ฤx?๙ไ“GยKi”๋I'8}ฅิ๖Q}๗฿ิฌY“’%K2z๔hŠ)‚ฝฝ=+Vฌ`ฬ˜1IณิFฑ*UชDhh(&L E‹ไษ“'ลถ้!-ำมมฦณpแB~๘แ.]บฤ๖ํ๙ๆ›oฬmždฟH๋่฿๓„ƒƒmฺด!&&†-Z<ึ๒-Zด J•*,\ธ5kึ0rไHพ๖[,Xไ\ไ”ŸVZrL๎$ ล{K>้gภใHHHภรรƒYณf%;แ‚/น๗ษษ‰-[ถฐqใF–/_ฮชUซ˜;w.5jิ`อš5ฯ์Hม๓8โ`ooOPPร‡็ฮ;I๒›>}:Ÿ}๖:uขฯ|ฯš PษRๆฯŸO›6m5j”yฺปw“๋0ฅืฤCƒวท๘฿๘ฝ{๗8u๊ตjี2Oปu๋๏ฟ>ฅJ•"00#FะคIา๋ษ“'“L;qโ„๙jืฤ๕gฯžbฝO#๑๐‘#G’)้a้าฅฤฤฤฐdษ‹”‡ฅฅลห/ฟฬˆ#จ^ฝ:u๋ึe๚๕uี๖ƒŠ+ฦ๎ป‰ต8ตเAE‹eบuDGG[ฌ'๑สูว9ฬ ท฿~›_~๙…๕๋ื๓็Ÿb†๙๐;<ป"ฅฟgอษษ‰ฦ๓๋ฏฟRฏ^ฝวบ("Q่าฅ ]บtแ๒ๅห”-[–ฏฟฺ\€Z+—DE‹%<<ร0,ึา-o|||๐๑๑ก์ุฑƒJ•*ยะกCS\GjŸQ‡6฿J*ัำ๎wK๙„๒ๅ—_>ึr๑๑๑IW{xxPฐ`A‹ฟณœ9s>ีaํวUงNฮ;gqซปw๏2eส‹vQQQIฮื๓๑๑มึึ๖‘Ÿ)ๅTฟ~}.^ผhqšF\\ใววูู9ษžTโVทlูbž–x‹ž็ๅมฟ%ร0˜0aูณgงfอšภั๐๘๘xพ๚๊ซ$หฦลลฅi_๏ฟ’L3™L๏ษใฒํIๅศ‘Ho๐แำ ๑ว)Rฤโtฏ-[ถLีชU™5kึS6gฮœV๙L€JำฐaCfฮœ‰››ฅJ•b็ฮฌ[ทwww‹v&“ ;;;พ๖["##qpp0฿‹ฒo฿พ <˜บu๋ฤ๑ใว๙แ‡0_œฐaร~๘แHูฒe๛๗ณฌ^ฝ:_~๙eฒ๗ |ุห/ฟLๅส•้น3111Œ;www>๔Ss›‰'Rนre|||่ะก/ฝ๔—.]b็ฮ๛๏ฟ:t่ฑถซซ+cฦŒก}๛๖ะฒeKr็ฮอกC‡ธ}๛๖srINํฺตฑทท็อ7฿คcวŽผy“)Sฆเแแ‘lq•*T`๑โลิฏ_Ÿfอšฑhั"๓(fZoญาบukfฬ˜Aฏ^ฝุณgUชTแึญ[ฌ[ทŽ.]บะจQ#|๓M^u๚๕๋GDD~~~ฌYณ†ล‹๓๑ว?๑ํKฒgฯฮ[oฝลœ9sธu๋฿}๗]’6ฯbฟ๐๗๗๎฿๒'88˜์ูณ๓ๆ›oš ำ‡EFFš๏ฉšxหš &+W.rๅสeqษร๐๓๓{dL‹ŽŽฆpแย4kึ ???œYทn{๗๎ต8สแ๏๏ฯนs้ีซ8;;๓ๆ›o>๖๚าชcวŽL˜0wy‡=zP @fอšeพฐ/qiร† t๋ึๆอ›Sผxqโโโ˜9s&vvv4mฺ4ีuค”ำ‡~ศคI“hถ-๛๗๏วำำ“๙๓็ณ}๛vฦŽ๛ฤฃซ]ป6/พ๘"ํฺตฃOŸ>ุูู๑๓ฯ?“7o^ฮœ9๓Lึ๑ GGGVญZE›6m(_พ<+Wฎd๙๒ๅ|๑ลๆC๋ีชUฃcวŽ 6ŒะะPjืฎM๖์ู9y๒$๓ๆอใ๛๏ฟงYณfฉฎgศ!lูฒ… PดhQ._พฬ?@แย…ฉ\นฒนำ†)-œœœ(Uชs็ฮฅx๑โไษ“oooผฝฝฉWฏ… ฆ|๙๒xxxpๆฬฆM›ฦ๙๓็-๓‘x?Zš5kฦผy๓,ึแ๋๋›ไึNฉ๑๗๗gบuŒ=š‚ โๅๅeพp์™ณสต๖"Vr๚uใ๗฿7^xแรูููจSงŽq์ุ1ฃhัขIn-1eสใฅ—^2์์์’dย„ Fษ’%์ูณ๙๒ๅ3:w๎l\ฟ~0 รˆŠŠ2Š-j”-[6ษ-.z๖์iฺฺุ;w๎L1ฦฤvŒ9า5j”QคHรมมมจRฅŠq่ะก$ํ๛oฃu๋ึF๙์ูณ… 26lhฬŸ?฿&๑ึ({๗๎ตX6น[อ†a,Yฒฤ 4œœœ WWWใตื^3~๛ํ7๓jีชฅK—NK›6m,n “ุรท™I)žไnฝณdษรืืืptt4<==oฟึ|ค‡o๕า Aƒคิฐผ Sขล‹ูฒe3~๛m๓-ตาzkรธ{จ~๚^^^F๖์ู๙๓อš53๛os›่่hฃgฯžFม‚์ูณฏผ๒Š1rไH‹[Zฅ_bNษ๒dํฺต`ุุุgฯžM6พงู/}๕ีWFกB… [[G’)qฟM๎๑๐ํ‚Rส๗Aiน SLLŒังOรฯฯฯpqq1rๆฬi๘๙๙?๐ƒEป›7o-[ถ4rๅสeOJ๛็ƒ๓พ SZ๖{ร0Œ๙วhะ แไไdไอ›ื่ปท๑ว€ฑkื.s›>๘ภ(Vฌ˜แ่่hไษ“วx๕ืu๋ึฅบmRหษ0 ใาฅKๆฯ9{{{รวววโ6@ฉI้๏จZตjFตjี,ฆํ฿ฟ฿(_พผaoooผ๘โ‹ฦ่ัฃSผ Sr}&ท<๘๙—จM›6Fฮœ9ฟจ]ปถ‘#G#_พ|ฦภ-n‡—h๒ไษ†ฟฟฟแไไdธธธ>>>ฦงŸ~jœ?‘1ญ_ฟhิจ‘Qฐ`Aร(Xฐ ๑ฮ;๏'NœHฒ=า๒Y‘าm˜rๆฬ™คmrทถฺฑc‡แ๏๏oุ[’iย„ Fๅส•^xมศ–-›‘7o^ใอ7฿ดธ}–a฿~œา#ต[<%็ุฑcFีชU '''xฎทdฒ1Œt8๎&""’ลŒ;–ž={๒๏ฟZbMD’R*""๒˜พ ๙๎ป”)S†๘๘x๓ล3"’2*""๒˜z๋-^|๑EL&‘‘‘๚๋ฏ;v,ล[‰คงฤŸๆL‰““SŠ? ๛ผhTDDไ1;–ฉSงA||<ฅJ•โำO?ตธe–HF๑จ+ตiำ†้ำง['˜OจˆˆˆH–๘sฆ))Xฐ ฅJ•ฒR4๗ฉซา่EDDDฤชT€ŠˆdAgฯžลััั|ำ๘ฌ`ำฆMุุุฐiำฆง๎ซz๕๊x{{?}P@… ,~ภB$3P*"’‚้ำงcccƒ ถmK2฿0 Š)‚ 6ด˜—ธ\โ#gฮœ”*UŠกC‡r๛๖ํdื† {๖์yุ๊‡ B๙๒ๅฉTฉาS๗%i๓อ7฿ฐhัข$ำw์ุม AƒžO~๖ูgLœ8๑‘W:‹d$*@EDมัั‘ูณg'™พy๓f๗_’]๎7`ๆฬ™ฬœ9“QฃFQฆLพ๒Kฺดi“l๛ๅห—ใแแA@@ภSล{ๅส~๙ๅ:u๊๔Td4UซVๅฮ;TญZ5ฝCIVj่เมƒŸ[ฺจQ#\]]๙แ‡žK"ฯƒ๎*"๒๕๋ืgผyŒ7Žlู๏cs๖์ู๘๛๛s๕๊ีd—+^ผ8ญZต2ฟ๎ิฉ๗๎cม‚ฝ{ืแ‰VฌXAฝz๕yห”G๙๕ื_ษ–-s=๔วu๋ึญg>ญlmm“lณeทo฿&GŽฺฺุาฌY3fฬ˜มเมƒŸzฑ€Šˆ<ย;๏ผรตkืXปvญyฺฝ{๗˜?>-[ถ|ฌพ๒็ฯE! pใฦ v์ุAƒ ฬำๆฬ™ƒฟฟ?...ธบบโใใร๗฿ศu,Zดˆ๒ๅหใ์์l1=๑ผวร‡SญZ5rไศมห/ฟฬ๙๓๛#บๅห—วษษ‰%J${๋–ƒRฏ^=\]]qvvฆfอš์ฺตหขMโฉ ›7oฆK—.xxxPธpa๓•+WRฅJrๆฬ‰‹‹ 4เ่ัฃฬ+นs@Ož๔Sbbbฬmlllธu๋ฟ๒‹๙ด‹ถm2hะ ๚๔้€———y^DD„yู_œœœศ“'มมมœ={ึ"†ฤ๗nTญZ•9r๐ล_˜็ฟ๑ฦœ>}šะะะ4ๅ-’T€Šˆ<‚งง'+Vไท฿~3O[นr%‘‘‘งธปwนz๕*Wฏ^ๅ๔้ำฬž=›_~๙…–-[&)@Wฏ^ ตkื`ํฺตผ๓ฮ;ไฮ›oฟ–แร‡Sฝz๕G^Tหฝ{)[ถlฒ๓ฏ_ฟNร† )_พ<#FŒภมมเเ`ๆฮKpp0๕๋ืg๘๐แบu‹fอšm^๖่ัฃTฉR…C‡๑้งŸ๒ๅ—_r๊ิ)ชWฏฮ๎ป“ฌซK—.„‡‡3`ภ>sfฮœIƒ pvvๆoฟๅห/ฟ$<<œส•+[eiq๏=๊ิฉรฎ]ป๘่ฃ˜8q"~๘!๓Ošw_ฟ~๚๕๋ใ๏๏ฯˆ#(\ธ0;wๆ็Ÿ6ทIHH ((ˆ๏พ๛Ž7฿|“๑ใวำธqcฦŒcqำ๙™3gโเเ@•*Uฬง]t์ุ‘ทz‹wy€1cฦ˜็ๅอ›€ฏฟšึญ[๓ส+ฏ0z๔h>๘cึฏ_OีชU“ไpํฺ5๊ีซ‡ษdb์ุฑผ๚๋ๆyY๊ข3ษโ Iึดiำ ภุปwฏ1aยรลลลธ}๛ถa†ัผysใ๕ื_7 ร0Š-j4hะภbY ูGใฦปw๏&Yื{๏ฝgTซVอบG†ซซซ๗X1๕ื_`Œ?>ษผjีช€1{๖l๓ดcวŽ€akkk์ฺตห<}๕๊ี`L›6อ<ญqใฦ†ฝฝฝ๑๗฿›ง?pqq1ชVญjž–ธ*Wฎlttด‘+W.ฃC‡q]ผxัpssK2a7n4cใฦ†aฦมƒ ภ˜7o^๊%‰bิจQๆi111†ษd2<<<Œ{๗๎†a3gฮ4lmmญ[ทZ,bฦ๖ํอำrๆฬiดiำ&ษบFŽiฦฉSง,ฆGDDvvvฦื_m1=,,ฬศ–-›ล๔ฤxCBBRฬษ่น๓#sษ4*"’-Zดเฮ;,[ถŒ่่h–-[๖ศร๏5bํฺตฌ]ป–ล‹ำทo_VญZEห–-1๘ „„VญZeq๘=Wฎ\บuหโฐZ\ปv €นs';฿ูููbิถD‰ไส•‹W_}•๒ๅห›ง'>็Ÿˆgอš54n˜—^zษฎ@ดlู’mถeฑฎ:`ggg~ฝvํZnธม;๏ผcพz๕*vvv”/_ž7>Vฎ‰ฟ]ฝz๕๊๏,šlูฒัฑcG๓k{{{:v์ศๅห—ูฟ?๓ๆอใีW_ฅdษ’1ืจQเฑc~ะ‚ HHH E‹}็ฯŸŸW^y%I฿ผ๛)๖—;w๎ฯGษht’ˆHไอ›—Zตj1{๖ln฿พM||<อš5Ku™ย… SซV-๓๋   ๙ไ“OXถl™๙"กฝ{๗rๅส‹ดK—.๛๏ิซWB… QปvmZดhAบuำฏ‘ย.\8ษE*nnn)R$ษ4ธ˜๎_Y๛๖mJ”(‘คฯW_}•„„ฮž=K้าฅอำฝผผ,ฺ/6-FEถmYผx1kึฌก{๗๎ 6Œ]ปvY\๘๔ค๐๑๑a๔่ัษฮธpพmllXนreฒแ‹ศžปqใ/ผ๐ยว#bM*@EDาจI“&t์ุ‘]ปv1w๎'๊#..€›7ošง-_พœ๚๕๋'ikooฯ›oพษ›oพIBB]บtaาคI|๙ๅ—ผ๒หษ๖โ‹/โไไฤฉSงž(พ”ไอ›—9rp๘๑$๓Ž;†ญญํ#‹ฑbลŠ๗‹๋G†Ÿ–>>>๔๏฿Ÿ;vPฉR%BBB:thชห?>ษํกNœ8ฟ๐,1ๆC‡QณfอGŽ.ฆ4?ฅ้ลŠร0 ผผผฬ#ฏO๊นsปwW_}๕ฉ๚ฑ*"’Fฮฮฮ๘ใ 4่‰๏ฑนt้Rธt้ฐ8w.g"[[[|}},n๓ฐ์ูณSฎ\9๖ํ๗D๑ฅฤฮฮŽฺตkณx๑b‹ซี/]บฤ์ูณฉ\น๒#กืฉSWWWพ๙ๆbcc“ฬฟrๅสcลe.่๙๘๘`kk›๊6JวคI“ฬฏ๏ปวคI“ศ›7ฏ๙ช๒-Zp๎9ฆL™’d๙;w๎p๋ึ-๓๋œ9s&{๕}b๛๐ผทz ;;;œdคู0Œ$๛@jฯY L๓2"้I# ""!ฅ_1Jฮ‰'๘๕ื_๛7 ฿ตkฟ๒ /ฟ2๏ฝ๗p๐ปฃฃฃล-uฺทoฯG5(\ธ0งOŸf๘๑˜LฆGŽr5jิˆ~๚๕ุ็Uฆf่ะกฌ]ป–ส•+ำฅKฒeหฦคI“ˆ‰‰aฤˆ\ีี•‘๗{ฒeหLผy9sๆ ห—/งRฅJL˜0!อ๑lุฐnบัผysŠ/N\\3gฮฤฮฮŽฆM›>r๙‚ ๒ํท฿A๑โล™;w.กกกLž<ู|ๅ{๏ฝว๏ฟNงNุธq#•*U">>žcวŽ๑๛๏ฟณz๕jส•+ฟาบu๋=z4 ฤหห‹๒ๅห›‹ู~๚L๖์ูy๓อ7)VฌC‡ฅo฿พDDDะธqc\\\8u๊ .ไร?ไ“O>IำถXปv-/พ๘"eส”I๓๖IW้wพˆHฦ๖เm˜R“–0ููู… 6>๐CใาฅKๆvอš53๊ืฏŸคฯ๙๓็ตkื6<<< {{{ใล_4:v์h\ธpแ‘q_บtษศ–-›1sๆL‹้ีชU3J—.ฆ๘sฺ่ตซลดu๊ิ1œ9rฏฟบฑcว‹6ฺn7n4๊ิฉcธนนŽŽŽFฑbลŒถm๛๖ํK5ฏ‡oร๔ฯ?|๐QฌX1รัััศ“'๑๚๋ฏ๋ึญKตร๘ฟmฑo฿>ฃbลІฃฃฃQดhQcย„ Iฺปwฯ๘๖oาฅKF๎น c๐เมFddคนฑcวŒชUซNNN`qKฆฏพ๚ส(Tจakk›ไ–L๑‡Qนre#gฮœFฮœ9’%K]ปv5Ž?ž$ไฤวว 0๚๗๏ศผE2 รxŠ3ฬEDไ‰ลลลแ๎๎ฮฐaร่าฅห3ํป]ปvœ8q‚ญ[ท>ำ~%ใYดh-[ถไ๏ฟฆ@้ŽHšจI'—/_ๆ‡~ cวŽฯผp8sๆ ล‹g๚๕TชT้™๖-KลŠฉRฅJšNƒษ(T€ŠˆˆˆˆU้*xฑ* """"bU*@EDDDฤชT€ŠˆˆˆˆU้F๔’!%$$py\\\๙๓w"""’1†Att4 ฤึ6ๅqN ’!?‘ฟ+-"""ำูณg)\ธpŠ๓U€J†ไโโภฉSงศ“'O:G๓์ลฦฦฒfอjืฎmษฟฌ$ซ็Y?Gๅ—๙e๕•_ฦE‘"Eฬ฿ใ)Q*Rโaw—g๚[ึEll,9rไภีี5S}ฐคUVฯฒ~Žส/๓ห๊9*ฟŒํQงฯ้"$ฑ* """"bU*@EDDDฤชT€ŠˆˆˆˆUฉซR*""""VฅTDDDDฌJจˆˆˆˆX• Pฑ* """"bU*@EDDDฤชT€ŠˆˆˆˆUฉซR*""""Vec†‘Aˆ<,** 777๛/&ม9ฝรyๆ์m ๚z฿dุg๎%ุคw8ฯ\Vฯฒ~Žส/๓ห๊9*ฟ'wเหฯดฟ%~GFFโ๊๊šb;€ŠˆˆˆˆUฉซR*""""VฅTDDDDฌJจˆˆˆˆX• Pฑ* """"bU*@EDDDฤชT€ŠˆˆˆˆUฉซR๚อš5ฃB… V]็ฑcวจ^ฝ๚3o๛8–,Yยธqใ๘๑ว๑๕๕ลd2Qปvm.]บ@HHฅK—ฦืื—ฦ๕ฬใ‘ฌGh*ึฎ]‹c/ขฑŽ๋ืฏD๗๎hีช‡&44”   พ๖[ผฝฝูปw/‡ฦ›1cฦ‰a้“€ˆˆˆdx*@ฟ)SฆเใใƒŸŸ$66–oพ๙†๛งi๙M›6QซV-๊ึญKญZตธy๓&๏ฝ๗ฐkื.-ZD๙๒ๅ1™L4jิˆ›7opโฤ ส•+‡ŸŸ“'ONu])ตMi็ฯŸงAƒ๘๙๙แ๏๏ฯูณg-๚‹‹‹cม‚ิฎ]›nบ0}๚t>s\\\ฬmo฿พ •+W&GŽ๘๛๛s๎9ถnสซฏพส๐แรน|๙ršถ_LL QQQษšT€‡fโฤ‰l฿พC‡ัฃGFM›6m,Š/ธุ9$$€}๛๖ัพ}{๓ผ๛๗3}๚t6nศะกCiฺด){๗๎eแย…tํฺ€jีชฑ{๗nBCCฉTฉ?๔1 เะกC=LฉmJ๋์ฝ;อ›7็ะกClถ^x€ณgฯ2`ภJ•*ลฒeห2dณfอJvcฦŒมำำ“_~๙…พ}๛&™?cฦ jึฌ @ร† ูผy3ีซW'88˜M›6ฅšำฐaรpss3?Š)’j{ษผT€r๔288WWW๎นรš5khำฆM’ถ:uขSงN”+WŽฉSงš็UฉR…๙๓๗฿8“ษDร† น|๙2qqqœ9s†ZตjแใใรคI“0x็wR7ฅถ)ญs็ฮๆ\œœœprrbฯž=xyyq๛๖m๖ํวฯ?œ๊นฎ={๖$""‚Ž;2~x‹y?๐qqqผ๖ๆi๙๒ๅใ๓ฯ?็่ัฃผ๛๎ป4oœ>๚(ล๛๖ํKddค๙๑๐(ญˆˆˆdูา;€Œ(44”๐๐pผผผˆ‹‹ใส•+ฑdษ’T—K< `+Wฎค`ม‚mบw๏ฮเมƒฉ^ฝ:๓็ฯgูฒeๆรฺ?ONJmSZgr|}}™t่QQQ(P€„„fฮœiž๏็็g.F็ฮ›j฿)ตMi•*Uโ—_~เ๎ปนsGGG>๘เvํฺลศ‘#ูฐa%K–dิจQIึw๒ไI๓๓ล‹SฒdIยรร้ึญ‹-28p€€€z๗๎Mตjี8rไร‡วำำ3ีผDDDไƒ P๎_อญ[7๑๓๓3฿~(9ฉ๚ py|}})Uช”๙P—_~Iฝz๕(_พ<^^^ๆ๖cวŽeะ A๘๙๙=๒ะ”ฺฆดฮ๏ฟž฿___*Wฎฬตkื,๚3™L„„„p๘๐aL&S’๕?oooL&๓ๆอc์ุฑๆ๕EFFาธqcL&“๙ช๙9r0kึ,6lุภoฟศQU๙฿bc่~9’EEEแๆๆ†ล$ุ;งw8ฯœฝญA_๏› ;โฬฝ„ิOนศŒฒz~๕sT~™_VฯQ๙=น_ึxฆ=(๑๛;22าโ่่ร4*""""Vฅ4›6m&“ษโ‘ฺ้""""™ฎ‚ฯภ}๔CDDDไ™าจˆˆˆˆX• Pฑ* """"bU*@EDDDฤชT€ŠˆˆˆˆU้F๔’!%ศ๖๊ีซธปปงw8ฯ\ll,+Vฌ ~๚dฯž=ฝรyๆฒz~๕sT~™_VฯQ๙eLบฝˆˆˆˆdH*@EDDDฤชt#zษะ๚ญ:Iถ—ำ;ŒgฮŽxjุย'หŽ]z‡๓ฬe๕ ๋็จ2ฟ๔ฬqB“Wญบ>ษ|4*""""VฅTDDDDฌJจˆˆˆˆX• Pฑ* """"bU*@EDDDฤชT€ŠˆˆˆˆUฉซR*""""Vฅ4hึฌ*Txโๅ#""˜?# 0€;vคฉฯ๚๕๋s๏=๎ฝหkฏฝ†ษdย›)Sฆpํฺ5jึฌIฉRฅ๐๑๑aผyOฟˆˆˆoัOqฆณตkืbg๗t?‘–X€6kึ,ีvC† Iu~ll,๗๎#gฮœฌXฑร0ุธq#9sๆไึญ[๘๘๘ะผyslmm>|8\พ|™ฒeหาฐaCœœœธ~:นs็~ชœDDD$๋าจM™28p ฑฑฑ|๓อ7๔๏฿?MหGEEQฃF ส–-K™2eุถm๚๕c๕๊ี˜L&fอšล•+WจWฏ>>>ิฉS‡K—.ะถm[VญZ•ค฿ˆˆพ๘โ J–,ษ‰'๐๔๔ไ๎ปุุุ3gNbbbHHH !!นs€‡‡๎๎๎\ฟ~€ฦำฌY3ึญ[‡aOทัDDD$หQj%‡fโฤ‰l฿พC‡ัฃGFM›6mpqqฑhBHH๛๖ํฃ}๛๖899ฑx๑b8ภาฅK้ป7_5u๊ิ!44”w฿}—๒ฦoFฃF่ืฏ_’xโใใYฒd ๕๋ื็ญทขPกB8p€2eส$i{็ฮ(Rค}๚๔!Ož<๓111DEEYmัถSงNๆ็ๅส•c๊ิฉภรแŸ~๚)ถmรฮฮŽฟ๚+ูuํุฑƒAƒะชU+ฦŸคMใฦ9z๔(3fฬ rๅสฉฦ๎ไไฤกC‡ธrๅ M›6ฅYณfไห—€7nะบuk&Ožlnoccรoผมoผม•+Wู่ณ'… ๆŸ1ฉ6lƒN5ษ4šNBCC วหห‹ส•+s๐เA‚‚‚R]fึฌYปwะะPBCCŸjร† ฃnบ|๐ม|๖ูgœU~"""’qฉต’5j0gฮ๓กๅŠ+rแย"""ุถmeส”aษ’%ฉ๖…‡‡vvvฬŸ?Ÿ[ทnเโโBttดน]`` s็ฮ`๖์ูษŽpz{{๓ร?p๐เA^yๅZถlษ๋ฏฟNDD„Eป+Wฎpใฦ ขฃฃูดi%J” K—.”+WŽ>๘ภb™O>๙___Ž;ฦฬ™3Yทnอ›7O๕b+\]]-"""’5ฉตoooบu๋F`` ~~~Œ7.ลถ)ฺฒeK6lุ€ฏฏ/[ถl1(๚๚๚r็ฮ๓EHƒ bลŠ๘๚๚ฒ`ม†šโบrๆฬI๛๖ํูปw/฿}๗ูฒYž•qแย^u คs็ฮ๘๚๚rไศฆNสชUซ0™L˜L&ยรรจUซวŽcไศ‘ผ๒หOตDDD$๋ฑ1t™ฒd@QQQธนนั๑ืdหแ–แฎ]ป+W.-ZDXX_}๕ปwเฝ{พ}๛™ฦ%"""Y‡ P+˜2e >>>๘๙๙1pเ@bcc๙ๆ›o่฿ฟš–ŠŠขF”-[–2eสฐm6๚๕๋ว๊ีซ1™Lฬš5‹+WฎPฏ^=|||จSง—.]โ๚๕๋ผ๚๊ซœ;wŽ๘๘x*Tจภ๎ป“ฌcืฎ]ดm–rๅส๗‹ฤัู9r˜‹ๅ[ทnacc@้าฅ)\ธ0œ;wธ_ฤz{{ำฝ{wยรรำ”cLL QQQษšT€>g‡fโฤ‰l฿พC‡ัฃGFM›6mpqqฑhBHH๛๖ํฃ}๛๖899ฑx๑b8ภาฅK้ป7_5u๊ิ!44”w฿}—๒ฦoFฃF่ืฏนs็ๆ›oพกSงNŒ5Šส•+Sพ|yขฃฃ ม฿฿ŸมƒำจQ#Ž?žl[ทnฅTฉRิซW‰'&™?cฦ jึฌ @พ|๙8z๔(ๅส•ฃcวŽTซVูณg“โv6lnnnๆG‘"EsK‹ˆˆHf‘-ฝศ๊6mฺDpp0ฎฎฎนs‡5kึฐn:NŸ>mัถSงNๆ็ๅส•c๊ิฉ†มงŸ~สถmฐณณใฏฟJv];v์`ะ AดjีŠ๑ใวะคIfฯžอO?Dhhจน}ม‚ฉXฑ" , hัขฉๆQฅJยรรูปw/๛๗g๕๊ีๆy๛๗๏'$$ฤ<2 ๗‹ๆึญ[ำบukŽ9B๋ึญ6lXŠ็‰๖ํ—^ฝz™_GEEฉษข4jeกกก„‡‡ใๅๅEๅส•9x๐ AAAฉ.3kึ,๎ปGhhจE™Vฑฑฑœ:u ร0ธu๋–y๚ผy๓ศ™3'AAAŒ;–kืฎ=ฒฏ€€.\ธภ•+W๘๗฿iูฒ%sๆฬมขํนs็๘๊ซฏhผ9Lž<9ล~puuตxˆˆˆHึค๔9ซQฃsๆฬ1ŸำXฑbE.\ธ@DDถmฃL™2,Yฒ$ี>ขขข๐๐๐ภฮฮŽ๙๓็›‹Hขฃฃอํ™;w.ณgฯฆrๅสภรu๊ิกๆ …๊ึญหย… Yนr%QQQTฌX‘–-[&YฉSงˆ‹‹เฯ?ไฦธปปs๋ึ-5jฤจQฃ๐๓๓3ทŒŒ$((ˆ:u๊เ์์ฬŽ;˜1c+V|’M("""YŒ ะ็ฬ›nบˆŸŸใฦKฑmJ็€ถlู’ 6เ๋๋ห–-[ศ—/พพพนsว|า AƒXฑbพพพ,Xฐ€กC‡r๔่Q๘ใ @๋ึญน~:ห–-ณXoม‚0`๙gฒ่ึญ[๑๓๓รd2ัถm[fฮœ‰ญญ-ำฆMใุฑc๔๏฿“ษD`` y™^ฝzqไศz๖์I๎นŸz;ŠˆˆHึac†‘Aˆ<,** 777&ฎ?„“Kฎ๔็ูKˆ'ฯลร—฿lŸ๎v\RVฯฒ~Žส/๓Kว฿x๑นฏ#66–+VPฟ~}ฒgฯืgm™5ฟฤ๏๏ศศศTOงำจˆˆˆˆX• Pฑ* """"bU*@EDDDฤชT€ŠˆˆˆˆUฉซR*""""VฅTDDDDฌ*[z ’šท %๙๙ฌเ †ำชlแLuƒแดส๊๙AึฯQ๙e~ 9JๆฅPฑ* """"bU:/ฺˆ(\ฎgฝ฿iNˆ`ฯ?‘ฺุeฝ?รฌžd•_ๆ—ž9V|9—Uื'™F@EDDDฤชT€ŠˆˆˆˆUฉซR*""""VฅTDDDDฌJจˆˆˆˆX• Pฑ* """"bU*@EDDDฤชT€ŠˆˆˆˆUฯ อš5ฃB… ijขE ˜5kึsŽ*yีซW็ุฑcV]็€ุฑcํฺตรd2แํํM็ฮIHHเร?คD‰”.]šพ}๛Z5>ษผ' ะตkืbg—ถ฿ฟpแ'NœเะกCผ๛๎ป๓โใใŸGxฯิใฦx๚u† B`` cวŽ%44”ฐฐ0ฎ^ฝสฒeหhผ9วŽใะกC์ฺต‹อ›7[๔!"""’œ,_€N™28p ฑฑฑ|๓อ7๔๏฿?Mหฟ๙ๆ›œžžž„„„๐๕ื_ใ๋๋Kฝz๕ˆ‹‹Kq}K–,มd2แ็็G๛๖ํอำงM›†ฟฟ?eส”แ์ูณ,Zดˆ๒ๅหc2™hิจ7o mถt้า…€€ฦŽหุฑc)Yฒ$~~~|๑วIึษ„ ๐๓๓c๎นๆ>VญZ€‹‹ pฟ˜‰‰มฦฦ€7xฒeห†ฏฏ/็ฮ`ไศ‘TชT‰3fp๗๎4m็˜˜ขขข,"""’5e้๔๐แรLœ8‘ํทs่ะ!z๔่ม่ัฃiำฆนจJBHH๛๖ํ3๓็ฯววว‡ะะP|||๐๔๔$44{{{–,Yย๛Yฝz5}๔‘น<|๘0ณfอb๏ฝ|๖ูgxyyq๘๐aœœœXฟ~}ฒ๑^บt‰^ฝzฑrๅJ:ฤˆ#ฬ๓œูฟ?ญZต2วYญZ5v๏Mhh(•*UโงŸ~2ทฟqใ{๖์กw๏|๕ื>>๔๊ี‹ใวง๚^ 6 777๓ฃH‘"ฉถ‘ฬ+K ›6m"88WWW๎นรš5khำฆM’ถ:u2_ๅส•c๊ิฉ)๖ผysv์ุAณfอppp @”-[–ฃGH๎นษ›7/nnn4lุoooฮœ9“lฟปw๏ฆVญZ(P€ันฃ‰…ใƒหw๏๛ฦท฿~KLLLฒ1._พœฮ;ณy๓f๊ึญ @ซVญ่ท/฿~๛-|๐[ทnMSNMš4aัขEๆiฤมมO>๙ฤขmBB+VฌเwaึฌY|๗wผ๑ฦฉๆ็๊๊j๑‘ฌ)K 5jิ`ฮœ9ๆ๓ +Vฌศ… ˆˆˆ`ถm”)S†%K–๚๗๏ฯัฃG fไศ‘x{{ณfอ‹ๅ รเ๏ฟ6๗ตlู2J–, ภฏฟสฆM›˜2eŠล2ฟ๚+%J”`ึฌY๔๊ีห|๚ƒŠJศ–>>อค—ฬใำธ}๛6ูฒeรžu๋ึP @v๎‰ƒƒ—.]" €   ๙๙็Ÿ)QขวŽใอ7฿ไไษ“\ฟ~นsงg*"""’=ึ่”)S๐๑๑มฯฯห7฿|Cำด|b‘b2™ รำำ“พ}๛b2™ุนs'C‡ล___–.] ๑ซ]ป6๕๋ืวำำ“พ๚k|}}ฉWฏqqq)ฎoษ’%ๆ‘ป๖ํ›งO›6 ส”)รูณgXดhๅห—วd2ัจQ#nผ @ถm้าฅ Œ;–ฑcวRฒdI๘๘ใS\๗ฑcวจVญ~~~”/_ž˜˜๖๏฿Oๅส•)Vฌkึฌ ..Ž=z€ษd2็Eห–-๑๕๕ลd2ฑo฿>‹uฌZตŠjีชษ๒ๅหฉPก&“‰N:‘ภ—_~I‰%จ]ป6ืฎ]K6ึฃG๒ัGQบtiฎ_ฟ@๙ฐททวมม€ปw๏š๛-Zด(%J” D‰DEEaๅส•ใ๗฿g๗๎)nŸ‡ลฤฤe๑‘ฌ)อ# ‡fโฤ‰l฿พWWW๛๏?FM›6mpqqฑh›x˜นSงN์ทฆNส๙๓ fืฎ]ๆถžžž„††ฒgฯ–,Yย๛๙๏ฟจXฑ"ฏฟบy๙'qqqผ๒ห๘ใ>|˜ทz‹๕๋ืSงN$๑^บt‰^ฝzฑu๋V (ภgž็์์ฬ๛5j”น ญVญ7`ฤˆ๔ำO๔่ั€7nฐgฯlllศ›7/gฮœมษษ‰ศศศทื{๏ฝวˆ#x๕ื‰ŒŒ${๖์ภCฺ›7o&44”๎ปSปvmฆNŠ——฿=QQQTฌX‘บu๋2dศŠ/ฮ์ูณ‰‹‹ใ๖ํ8pธ_|~๕ื,]บ”ุุXฦŽหฆM›pttคkืฎ,Xฐ€_|‘ตkืrไศ._พLษ’%อ๑ลฤฤ0|&Mš„at่ะ‘#Gโ่่˜$—ฟ›ฦs๊ิ)~๕ื$๓—,YBูฒeฑฑฑ๎ž_บt)ƒ โส•+t่ะw฿}gg็ทืฐaร,**Š่่hsํๆๆfžื A์์์(Sฆ ภำยรร™>}:ัััœ?ž 6ฐbล ฒeหf๖เฤ‰ฌ_ฟž\นrฑt้R>l>๗ฮ;-Z”—ทz‹์ูณSจP!ชTฉbŽฃ\นrุ๓ห/ฟเํํl‰Š+FXX๓ญ[ทฆnบๆB๕๔้ำ๔้ำวgbฌMš4กI“&œ>}š:๐ษ'Ÿโ:๚๖ํKฏ^ฝ,ถa‘"ERKDDD2ง'พ)44”๐๐pผผผจ\น24v#GŽlcooo~nkkk~mkkK||cฏ3๑๒ƒหw๏๛ฦท฿~k>dpŒห—/งs็ฮlผ™บu๋>“u†มO?Dhh(กกกœ9s†ขE‹ฆุGแย…‰็ฯ?4/฿จQ#๓๒ว็ำO?0ฮ?Ÿ9QQQ(P€„„fฮœ™l›„„๗_jีชลจQฃ8qโDฒํ\]]qsscใฦDFFšฯLNญZต๘๑วอmBCCอำOgˆ‹‹3 zxxฐhั">๐CŽ=J… Xฟ~=๛/pฟ๘๛๗฿-ถ้๙๓็ูบuซy+VdฦŒl฿พœ9sRงN‚‚‚’œVp๎9๎นภล‹9|๘0^^^ฤววำขE :v์Hํฺต-–iูฒ%+V$**Š•+Wฒpแย'*ึEDD$kJ๓!xoooบu๋F`` vvv4iา„Aƒ%6ฅs@S๓ฺkฏั Aส”)ƒญญ-ใฦK๕œมG๑๐๐`ฬ˜1ๆยง|๙๒Lž<9ล๖_~๙%๕๊ีรJ•*qใฦ$mโใใiูฒ%ััั†ม!CR์oฦŒt่ะ?˜9rคz๛ฃŽ;๒ฯ?เ็็GBB%J”`ม‚|๙ๅ—t์ุฒeหfฑ ฝผผ˜={6มมม,_พœ‰'าจQ#bccษž=;SฆLแตื^ฃfอšx{{ใ้้™์ญฒ๒ไษCฯž=ู้ณgฒ1†‡‡ำซW/lmmฑตตeิจQผ๐ย ,[ถŒ๕๋ืs๑โE&Mš?M#Wฎ\ดlู’_[[fVDDD’ฒ1/]ษ@ขขขpss#ผ™;นl๎ฅw8ฯ\|6G๖ฟ=นฐ‹ป›แ>ฉ๚ต†ว๑๚๕๋,X3fเํํอ๛ e๚๔้tํฺ€\นrฑhั"ยยย๘๊ซฏ่ฝ;๗๎ใ๖ํฯ0 ษJฒ\zy*Uช„ษdยืื—ฝ{†ษdbไศ‘บu‹&MšPชT):u๊๔ศfฬ˜มผy๓่ป7]ปve๚๔้4kึŒjีช๑{๏๑ื_QฅJ|}}iัขทn z๕๊๔๎›2eสภพ}๛จYณ&/ฝ๔ห—/Oq}QQQดlู___L&๛๖ํ๎†oพ๙&ฏผ๒ _ตน}ร† ๑๗๗ววว‡ ษdขE‹”*U*ษ69v์X’๕๎ฺต‹ถmRฎ\9s*T GŽุููp๋ึ-lll(]บ4… ภ฿฿Ÿs็ฮ™c๕๖๖ฆ{๗๎„‡‡?rฤฤฤe๑‘ฌ)ห ฟ๖ตjี"44”๛๗3t่P||| ฅOŸ>Lœ8///ยรรฉWฏ—.]2/k2™ฬฯทoฯพ}๛hบ5AAALœ8‘‰'p๘๐a–-[ฦ์ูณ้ฝ;={๖ไ๐แรxzz2fฬs๎๎๎๑v‘ฌ#ห ›6mยืื—2eสฐu๋Vฺดiƒฏฏ/พพพŒ9’ฎ]ป๒ื_Qบti–/_Nพ|๙ฬห&w่ฃŒ7Ž#Fเ๋๋ห?รวT๑๙ๅ—œ8q8qโDŠm๋ิฉรตkื(]บ4cฦŒฑ(๔๐6iีช•ล‚ 2`ภ๓ฯd ะญ[ทโ็็‡ษdขmถฬœ9[[[ฆM›ฦฑcว่฿ฟ?&“‰ภภ@๓2ฝz๕โศ‘#๔์ู“นs?แึ‘ฌศฦHผjE$‰ŠŠยออห฿Tล!!ฝรyๆbm์Y๕Rw๊3Ž์ฦฝ๔็™ห๊๙AึฯQ๙enถฝถหŠ+จ_ฟ>ูณgO๏ž9ๅ—1%~GFFฆz:]–‘Œ-ห]ŸYฌ^ฝฺโŠyธNๆ๐แรำ)"๋PšN๊ิฉC:uา; ซำ!xฑ* """"bU*@EDDDฤชT€ŠˆˆˆˆUฉซาU๐’กู~ธ‡~c>+ฐ…+ฐํถ Ltƒแดส๊๙AึฯQ๙‰ศ๓คPฑ* """"bU:/Zยช~$ไศzปiv`[ƒ„eŸ@|z‡๓ฬeลl›LH๏DDฒ €ŠˆˆˆˆUฉซR*""""VฅTDDDDฌJจˆˆˆˆX• Pฑ* """"bU*@EDDDฤชT€ŠˆˆˆˆUฉตข7n0u๊ิ็็ฯŸ‰๛ž>}:Wฏ^Mตอ๙๓็iบuš๚[ฒd ใฦเวฤืื“ษDํฺตนt้!!!”.]___7nLTTิว/""";T€Zัฃ ะง‘–ด`ม‚ฬ˜1#ี6ืฏ_ ((ˆ๎ปะชU+>Lhh(AAA|๛ํทx{{ณw๏^>Œทท7cฦŒ 22ร0ž6%ษขT€>G็ฯŸงRฅJ˜L&|}}้ป7aaa˜L&FŽษญ[ทhาค ฅJ•ขSงNi๊3$$„€€|}}y๗IHH`แย…์ท&MšPฅJฆM›†ทท7Lž<€ˆˆ*Tจคฯธธ8,X@ํฺต้ึญpฟ ๓ฯpqq1ทฝ}๛6666Tฎ\™9rเ๏๏ฯนs็ุบu+ฏพ๚*ร‡็๒ๅหOฒ้DDD$ S๚๖oิชU‹ะะP๖๏฿ฯะกC๑๑๑!44”>}๚0qโDผผผง^ฝzๆC&“ษผ}๛๖์ท€-Z˜GœœXบt)Mš4ก\นr,\ธญ[ท๒๏ฟ๒๕ื_ณm6v๎ษ่ัฃ‰ˆˆH฿ูณg0`ฅJ•bูฒe 2„Yณf%›ห˜1c๐๔๔ไ—_~กo฿พIๆฯ˜1ƒš5kะฐaC6o @๕๊ี fำฆMฉnซ˜˜ขขข,"""’5ฉ}Ž˜9s&ƒๆไษ“899Yฬ฿ฑcมมม4jิศ<šj~>u๊Tส•+ภกC‡จTฉ>>>,]บ”๐๐๐$๋ทoตkื&Wฎ\ธธธPฟ~}v๏mัfฯž=xyyq๛๖m๖ํวฯ?œ์่hขž={AวŽ?~ผลผ~๘ธธ8~๛m๓ด|๙๒๑๙็Ÿs๔่Q}๗]š7oฮG}”bร† รอออ(RคHŠmEDD$sS๚UญZ•-[ถเแแAำฆMYฟ~}’6‰‡ณำชC‡LŸ>ฐฐ0z๔่ALLฬลๆ๋๋หไษ“ูถmM›6ๅ๗฿็ฝ{\ฎUซVฬŸ?฿zอš5Lž<9ู‘ำƒาตkWz๗๎Mปvํ่ปwŠ๖ํ—ศศH๓ใ์ูณO”—ˆˆˆd|*@ŸฃำงOS @:w๎Lpp07n ::ฺoบEผyน{๗ฎyYธžfb฿ฌ_ฟžจจ(nผษส•+)_พผE?ŽŽŽ|๐ม์ฺต‹‘#GฒaรJ–,ษจQฃ’ฌ๓ไษ“ๆ็‹/ฆdษ’„‡‡ำญ[7-Z„ซซซนอ w๏TซV#GŽ0|๘p<==SฬหมมWWW‹‡ˆˆˆdMูา;€ฌlำฆMŒ1{{{™3g๛๖ํรืื—๗{ฎ]ป๒๎ป๏RบtiชVญJพ|๙ฬหšL&๓a๘๖ํำฉS'ส•+Gฟ~([ถ,๙๒ๅฃL™2ๆ๖mถๅฝ๗#oผlบ•ฯ>๛Œภภ@เแsOOฯdฯM\WHH7oLrจ`๘๑lุฐlูฒQฐ`A&Mšภ€ˆŒŒคqใฦภ฿qใฦ‘#GfอšE๑โลŸมV‘ฌฦฦะr$ŠŠŠยออหฟvฤ=Gึ๛R,vฌฒญA„ d'>ฝรyๆฒb~ถM&XผŽeลŠิฏ_Ÿ์ูณงSTฯ๒หฒzŽส/cJŽŒŒL๕hฆม‹ˆˆˆˆUฉซR*""""VฅTDDDDฌJจˆˆˆˆX• Pฑ* """"bU*@EDDDฤชT€ŠˆˆˆˆUeฝŸ˜‘,ลถ๎ืุบปงwฯœml,ฌXmร๏ฐอDฟp‘VY=?y:ซR*""""VฅC๐’ก%„A‚ซSz‡๑ฬ%$ธ’pd Y๐ฟY1?[ฟ๗า;‘,#‹|5ˆˆˆˆHfกTDDDDฌJจˆˆˆˆX• Pฑ* """"bU*@EDDDฤชT€ŠˆˆˆˆUฉซR*""""Vฅ๔ปqใSงNMq~๙Ÿจ฿้ำงs๕๊ี็๗wi๊ใ๓ฯ?Oำ๚ ภŽ;hืฎ&“ ooo:w๎LยŸนแร?คD‰”.]šพ}๛ฆฉ_ ฯุฃ ะ'•Rj i*@ำโ๚๕๋ 2„ภภ@ฦŽKhh(aaa\ฝz•eห–ะผysŽ;ฦกC‡ุตk›7oถ่CDDD$9*@Ÿา๙๓็ฉTฉ&“ ___z๗๎MXX&“‰‘#Gr๋ึ-š4iBฉRฅ่ิฉSš๚์ำง%K–ฤฯฯ‘#GฒpแB๖ํG“&MจRฅ ๙๒ๅฃs็ฮ๘๘๘ะฎ];ฎ]ป†ษdขgฯž$$$ะญ[7ผฝฝ๑๗๗gืฎ]ฉฎ/22’ &เ็็วนshถ-ซVญภลล€๘๘xbbbฐฑฑเ7ภฦฦ†lูฒแ๋๋หนs็9r$•*UbฦŒฝ{๗๑7ชˆˆˆdi*@ŸาoฟFญZต e :BCC้ำง'Nฤหห‹๐๐p๊ีซวฅK—ฬหšL&๓๓๖ํณo฿>ฎ]ปฦ๙๓ ็ะกC|๘แ‡4iา„rๅสฑpแBถn ภๅห—iธ1GŽaฺดiธปปส˜1c˜?>๛/aaaLŸ>ถm&๛พ}๛h฿พ=\ผx‘ล‹งX$ฟ๛๎ปไฯŸggg4h`1๏ๆอ›ฌXฑย\๓อ7Lž<™๛๗ใใใCฏ^ฝ8~xช1&&†จจ(‹‡ˆˆˆdM*@ŸR@@3gฮd๐เมœ>>ไศ‘รข๐5jีชUฃrๅส„‡‡3t่P<==SฬsึฌYœ?;;;ึฏ_ožnํฺตฃcวŽ)Rฤ<ฝt้า|๗„……‘?~ผฝฝ๙ใ?R์ุฐaธนน™๖%"""Y‹ ะงTตjUถlู‚‡‡M›6ต(ฮ%ฒN‹lูฒฑo฿>7nฬฌYณhืฎ]ฒํ,dŸDซVญ่ท/฿~๛-|๐yd55๖๖๖4iา„E‹™ง 8>๙ไ‹ถ ฌXฑ‚wy‡Yณf๑w฿๑ฦoคุw฿พ}‰ŒŒ4?ฮž=๛ฤน‰ˆˆHฦฆ๔)>}š ะนsg‚ƒƒนqใัััๆ๙ๆ๓*—-[ฦํทSํ๏ๆอ›DFFฤˆ#ฬฃค...>ฬึึึ|uz`` ๓ๆอร0 Ž=ส;wศ—/ŸE๛|๙๒ัฟŽ=Jpp0#GŽฤ›5kึXด3 ƒฟธ_T.[ถŒ’%K๐๋ฏฟฒiำ&ฆL™bฑฬฏฟJ‰%˜5kฝz๕โะกC๔่ัWWืใwppภีีีโ!"""YSถ๔ ณดi#FŒภwwwๆฬ™รพ}๛๐๕๕ๅฝ๗ฃkืฎผ๛๎ป”.]šชUซZ‚&“ษ\`ถo฿žN:QจP!‚‚‚ธw๏666|๕ีWภ‹‚{๏=๒ๆอ›์heซVญ๐๑๑กvํฺŒ5Š-[ถเใใƒฝฝ=ำฆMK1~[[[๊ืฏO๚๕๙๗฿“ช7 ƒึญ[…aTฉRล|ž่วŒ››ๅห— Wฏ^ดnOOOvํฺ…ปป๛Sm[ษšl ร0า;‘‡EEEแๆๆฦๅ-“pwuz๔™Llฌ:ใJฃศžCdลlณxหŠ+จ_ฟ>ูณgOงจžๅ—๙e๕•_ฦ”๘™๊ัฬ,๒ี """"™… Pฑ* """"bU*@EDDDฤชT€ŠˆˆˆˆUฉซR*""""VฅTDDDDฌJฟ„$šmฉฆุfม_Tฒ…3+ฐ๕ฦ6`8ญฒz~""๒t4*""""VฅTDDDDฌJจˆˆˆˆX•ฮ• ญฮ‚N$8ฅw๏@ซy้‚ˆˆH†ฅPฑ* """"bU*@EDDDฤชT€ŠˆˆˆˆUฉซR*""""VฅTDDDDฌJจˆˆˆˆX• Pฑ* C6oL้าฅฉRฅส#.Yฒ„qใฦ๐ใ?โ๋๋‹ษdขvํฺ\บt €J—.ฏฏ/7&**๊นฦ/"""Yƒ ะ!ณgฯๆ๋ฏฟf๋ึญ)ถน~:AAAt๏€VญZq๘๐aBCC โoฟภ›ฝ{๗r๘๐aผฝฝ3f ‘‘‘†๑œณ‘ฬJhty*Uช„ษdยืื—cวŽ1eส|||๐๓๓cเภ 8€€ผฝฝ๙โ‹/ฬห{zz2pเ@จZต*QQQฬ˜1ƒy๓ๆัปwoบvํjฑพธธ8,X@ํฺต้ึญำงO็๓ฯ?ภลลล๖๖ํุุุPนrerไศ€ฟฟ?็ฮ`๋ึญผ๚๊ซ >œห—/ง)็˜˜ขขข,"""’5ฉอ€~๛ํ7jีชEhh(๛๗๏'&&†‰'ฒ}๛v:D=่ัฃ‡y๒๐แร:tศวห/ฟฬกC‡๐๓๓c๎นดnš   &Nœศฤ‰8{๖,  TฉR,[ถŒ!C†0kึฌdc3f žžž๒ห/๔ํ7ษ3fPณfM6lศๆอ›จ^ฝ:มมมlฺด)ีœ‡ †›››๙QคH‘วn"""’9จอ€˜9s&ƒๆไษ“lผ™เเ`\]]ศ“'๋ืฏ' “ษฤฝ{ 7๗@™2eˆˆˆHฒŽ={๖เๅๅลํทูทo?3*TH1ฆž={AวŽ?~ผลผ~๘ธธ8~๛m๓ด|๙๒๑๙็Ÿs๔่Q}๗]š7oฮG}”b}๛๖%22า8{๖์ฃ7”ˆˆˆdJ*@3 ชUซฒeห<<L๓ๆอ‰‰‰1ฯwppภึึ–๘๘๘$ห๛๚๚2y๒dถmFำฆM๙๗฿นw๏#ckีช๓็ฯ7ฟ^ณf “'ONvไ๔เมƒtํฺ•ฝ{ำฎ];z๗๎bฟธบบZ}š ะนsg‚ƒƒ‰ŽŽfฮœ9ๆ๓"๛๏?๎ฝ‹ญญ-นs็ๆฟc้าฅตGGG>๘เvํฺลศ‘#ูฐa%K–dิจQIฺžมึ‘ฌ&[z Imฺด‰#F`ooปป;sๆฬ!bggG“&M4h๏ผ๓ฏพ๚*… ฆbลŠOผ>“ษDHH7od๗๎Iๆ?ž 6-[6 ,ศคI“0`‘‘‘4nธ?r;n8rไศมฌYณ(^ผ๘ว$"""Y— ะ จM›6ดiำฦbZ๛๖ํi฿พฝลดแร‡3|๘๐$ห?xฮgถmอฯงOŸž๊zอ=ธ\โ@๖เก๘%ŽŠˆˆˆ$G‡เEDDDฤชT€ŠˆˆˆˆUฉซR*""""VฅTDDDDฌJจˆˆˆˆX• Pฑ* """"bUบฝdhซ฿ ม=ฝร‘gH# """"bU*@EDDDฤชt^2ดก{ฟ!›K๊ป้ศJ฿Z)y4*""""VฅTDDDDฌJจˆˆˆˆX• Pฑ* """"bU*@EDDDฤชT€ŠˆˆˆˆUฉซR*""""VฅTDDDDฌJ(pใฦ ฆNšad(๕๋ื็ฝ{ฝ{—ื^{ “ษ„ทท7SฆLเฺตkิฌY“RฅJแใใรผy๓า9bษ,T€’zoๅhาoฝฑฑฑบu €+V`ooƒƒ7n$44”ปw3lุ0nธญญ-ร‡'<<œ๕๋ืำณgO๎นภ๕๋ืญปˆˆˆdYพ=<•*Uยd2แ๋๋หŽ;,^;vŒ~๚†ษdbไศ‘LŸ>fอšQญZ5{๏=.]บDฃF(WฎUชTแฤ‰„„„€ฏฏ/๏ฟ> Tฏ^ฝ{SฆLุทo5kึไฅ—^b๙๒ๅ)ฦ:hะ }*VฌศงŸ~สษ“'yใ7๐๗๗งnบ\บt OOO๎ฝ ภ๔้ำ๙๓ฯ่ำง%K–ฤฯฯ‘#Gคุวƒ"""๘โ‹/(Yฒค9ทฤuุุุ3gNbbbHHH !!นs€‡‡๎๎๎ๆยณqใฦ4kึŒu๋ึaFšง˜˜ขขข,"""’5e๙๔ท฿~ฃVญZ„††ฒ~6nh๑บhัข|๕ื๘๘๘JŸ>}8|๘0ห–-c๖์ู๔์ู“ฒo฿>FMฏ^ฝhัข{๗๎ๅ๐แร899ฑt้R๓z9x๐ •+Wฆ[ทn,_พœE‹1t่ะTใ๛๏ฟูฒe ฃFขkืฎL:•๛๗ำฎ];พ๚๊ซ—ปvํ๓็ฯ'<<œC‡๑แ‡คุG||}ศ“'ลƒOม‚ุดi;vdาคIx{{๓w฿q๕๊ีT๓6lnnnๆG‘"ERm/"""™Wถ๔เy  mถฺฺุาผysชTฉb๑บTฉRษ.Wทn]\\\ุฐaแแแๆyvvv:tˆ๛ล7(Rค5 aร†๘๘๘`ccƒฃฃ#œ9s&ีx7nL๖์ู‰ŽŽf๛๖ํๆโใใ)VฌXŠหนนนแ์์L๛๖ํiธ1 4Hตฦs๔่Qfฬ˜Aๅส•Sษษษ‰C‡qๅสš6mJณfอศ—/p๔…ึญ[3y๒ds{xใ xใ ฎ\นBฯž=)\ธ0๓นH}X฿พ}อ…=@TT”ŠP‘,*ห UซVeห–-,]บ”ฆM›2aย„$ฏ“+์rไศa~nccรฐตต0๎ะก+Wฎไ•W^แป๏พใๆอ›ๆy๖๖๖ฺฺุZ<ิน‰๋MHH PกB„††&icggg>@ถlูุทoซWฏfึฌY,Xฐ€๏ฟ>ล>† ฦ?ภ|@“&Mh฿พ=ฏผ๒Jชฑๅอ›“ษฤ–-[hผ9ฑฑฑ4mฺ”ž={hั๖ๆอ›ฬ;—ฉSง’3gNfฮœi.Z“ใเเ€ƒƒCช๋‘ฌ!ห‚?}๚4  s็ฮณm6‹ืaaaธธธbUชT1_ค”@XXทn"oผฝ{—นs็>ำธศ;7kึฌ๎_ ๔็ŸPดhQBCCIHH`ูฒeภ‚/22’   FŒAhhhช}x{{๓ร?p๐เA^yๅZถlษ๋ฏฟNDD„EWฎ\แฦDGGณiำ&J”(@—.](Wฎ|๐ล2Ÿ|๒‰๙ฺ™3gฒn:š7on9‘mYพดiพพพ”)S†ญ[ทโ้้i๑บUซVธปปใ๋๋‹ฏฏฏ๙โ?ž•+Wโ็็‡ททท๙Bข~๚QถlY^๕dฯ|Zณfอbไศ‘๘๙๙a2™ุฝ{7๛๗งu๋ึšiGGGำ Ahิจ‘๙\ฯ”๚H”3gNฺทoฯฝ{๙๎ป๏ศ–อrPย… ผ๚๋๘๙๙H็ฮ๑๕๕ๅศ‘#L:•UซVa2™0™Lๆำjีชลฑcว9r$/ฟ๒3฿."""’นูiฝLYฤŠขขขpssใใ•ฝศๆ’๚™"#+}kฅจžุุXVฌXA๚๕ษž={z‡๓ฬe๕ ๋็จ2ฟฌžฃ๒ห˜ฟฟ###quuMฑ]–‘Œ%ห_„”ญ^ฝšฯ>๛ฬbZบu>|x:E$"""b=*@ำA:uจSงNz‡!"""’.t^DDDDฌJจˆˆˆˆX• Pฑ* """"bU*@EDDDฤชtผdhพภ=ฝร‘gH# """"bU*@EDDDฤชt^2ด๙†ำ5ว$ำ[oŸัˆˆˆศณ Pฑ* """"bU*@EDDDฤชT€ŠˆˆˆˆUฉซR*""""VฅTDDDDฌJจˆˆˆˆX• Pฑ* ภ7˜:ujz‡aaษ’%Œ7€___L&ตkืๆาฅK„„„Pบti|}}iธ1QQQ้ฒˆˆˆd*@3€ิ ะ๘๘xซฦr๚u‚‚‚่ฝ;ญZตโ๐แร„††ฤท฿~ €ทท7{๗๎ๅ๐แรx{{3fฬ"##1 รชq‹ˆˆHๆก๔9;<•*Uยd2แ๋๋หŽ;,^;vŒ~๚†ษdbไศ‘LŸ>fอšQญZ5{๏=.]บDฃF(WฎUชTแฤ‰ภศ€€|}}y๗IHH z๕๊๔๎›2eสภพ}๛จYณ&/ฝ๔ห—/Oc\\ , vํฺt๋ึ €้ำง๓๙็Ÿเโโbn{๛๖mlllจ\น29rไภ฿฿Ÿs็ฮฐu๋V^}๕U†ฮๅห—Ÿำ–‘ฬJ่s๖oฟQซV-BCCูฟ?7nดx]ดhQพ๚k||| ฅOŸ>>|˜eห–1{๖lz๖์ษภูทoฃGฆWฏ^ดhัย<้ไไฤาฅKอ๋uww็เมƒTฎ\™nบฑ|๙r-ZฤะกCอmฮž=ห€(Uชห–-cศ!ฬš5+ู<ฦŒƒงง'ฟ๒ }๛๖M2ฦŒิฌY€† ฒy๓fเ~1ฬฆM›RN111DEEY}:aaa๔่ัƒ˜˜๓2๖๖๖ฺฺุZ8ด>]฿™ํ{"[ถl.\๘‘ํt’d ]ปv}.mŸw฿ฯซ฿็๓๓ส๏yฦกžฎ๓่7ฃ์ฯ+#ผ‡Y=ฟ'i<๚อŒ๛hF‰9ญmmŒG%*’ขขขpss#22๒ฑทŸ(ฟฬ/ซ็จ2ฟฌžฃ๒ห4*’ƒƒฤมม!ฝCy.”_ๆ—ีsT~™_VฯQ๙enซาจˆˆˆˆX• Pฑ* """"bU*@EDDDฤชT€J†3qโD<==qttค|๙๒์ูณ'ฝCz"ƒ ยฦฦฦโQฒdI๓ปw๏าตkWqvvฆiำฆ\บt)#~ด-[ถ๐ๆ›oRฐ`AlllXดh‘ล|ร00` ภษษ‰Zตjq๒ไI‹6๗๏พ๛.ฎฎฎไส•‹vํฺq๓ๆM+f‘ฒGๅืถm$๏iบu-ฺdไ† F@@...xxxะธqcŽ?nั&-๛ๅ™3ghะ 9rไภรรƒ>}๚gอT’•–ชWฏžไ=์ิฉ“E›Œšภ?ˆฏฏฏ๙ๆไ+Vdๅส•ๆ๙™๙ƒG็—ู฿ฟ‡ >>๘c๓ดฬฆ• PษPๆฮKฏ^ฝ8p ภฯฯ:u๊p๙๒ๅ๔ํ‰”.]š .˜ถm3ฯู๋ณ'K—.eผylผ™๓็ฯ๓ึ[oฅcดv๋ึ-˜8qbฒ๓GŒมธqใ a๗๎ไฬ™“:u๊p๗๎]s›w฿}—ฃGฒvํZ–-[ฦ–-[๘๐รญ•Bช•@บu-ำ฿~๛อb~Fฮo๓ๆอtํฺ•]ปvฑvํZbccฉ]ป6ทn2ทyิ~Oƒ ธw๏;v์เ—_~a๚๔้ 0 =Rฒ–:t่`๑Ž1ย%JpแยL•*U8rไ/^ฤž\นrY,“/_>.^ผ˜>?ฅฤธ“{็]ผx‹๙ูฒe#Ož<™"๏บu๋๒ึ[oแๅๅล฿อ_|Aฝz๕ุนs'vvv™*ฟ„„>๘c*Uช„ทท7@š๖ห‹/&๛'ฮห(’ห eห–-Z”‚ r๘๐a>๛์3Ž?ฮ‚ €ฬ‘_XX+Vไ๎ป8;;ณpแBJ•*Ehhh–xRสฒฦ๛7gฮ8ภฝ{“ฬหJƒขTไ9ฉWฏž๙นฏฏ/ๅห—งhัข๛๏899ฅcd๒ค‚ƒƒอฯ}||๐๕๕ฅXฑblฺด‰š5kฆcdฏkืฎ9rฤโผไฌ$ฅ<ืวว‡ PณfM๛oŠ+fํ0ŸH‰% %22’๙๓็ำฆM6oœa=3)ๅWชTฉL={–=zฐvํZำ;œtฅC๐’aผ๐ย ุูู%นฺ๏าฅKไฯŸ?ขzvrๅสE๑โล๙๋ฏฟศŸ??๗๎ใฦm2sฎ‰qง๖ๅฯŸ?ษeqqq๗฿™2๏—^z‰^xฟ๚ ศ<๙u๋ึeห–ฑqใF .lžž–2ษพว‰๓2‚”๒KN๙๒ๅ,รŒžŸฝฝ=/ฟ2 6 ???พ๛,๓ฅ”_r2๛ท~._พLูฒeษ–-ูฒec๓ๆอŒ7Žlูฒ‘/_พ,๑ฆ… Pษ0์ํํ๑๗๗g๚๕ๆi ฏ๛‰บใD~ะใ๎๘u๑๋๘!ฆ'Ž ฐh ‰)ฐt0†ส uอrะญt“–ญVซiหœ ูก1…‹4เ4 i(C„T่TNQ~ร๒ใ๕ร๑™ฟิพ‡ผmŸ๏_ฏ{฿ฦ‹ฯ็๙Œฃผผhฯ|500€+Wฎ@ฉT"00ึึึFฑ677CงำอXฝฝฝกP(Œb๊๋๋CMMSHHzzzp๎9กLEEฦวว…?$๓ษ๕๋ืัูู ฅR ภใ#"ผ๖(**BEEผฝฝฮ?ฬ๏2$$ F‰๖ฉSง ‘H„คseถ๘ฆR__Fshฎ๑Mg||w๏๗๓7‰๘ฆ2฿ๆ/<< จฏฏ>AAAHLLถŸฤ9œา\?ลุƒ๒๓๓I$ััฃG้โล‹๔ึ[o‘L&3zฺoพHKK#ญVKญญญ๔oฟั+ฏผBNNNิััADDทo'OOOชจจ ฺฺZ ก9๕ฬ๚๛๛ฉฎฎŽ๊๊๊}๑ลTWWG7}๒ษ'$“ษจคค„.\ธ@ัััไํํMCCCB‘‘‘๔ฬ3ฯPMM UUU‘ŸŸi4šน ษศL๑๕๗๗Szz:UWWSkk+๒ห/๔์ณฯ’ŸŸ  m˜s|;v์ ฉTJZญ–๔zฝ๐1 B™ู~—ฃฃฃไ๏๏OT__Oeeeไ์์L™™™s’‘ูโป|๙2ํทjkkฉตต•JJJศวว‡BCC…6ฬ9>"ขŒŒ :}๚4ตถถา… (##ƒ,,,่ไษ“D4ฟ็hๆ๘ž„๙›ส?Ÿ์Ÿ๏s๘ฐ8ef็ภไ้้I666ดz๕j:{๖์\้ฑฤวว“Rฉ$rssฃ๘๘xบ|๙ฒp~hhˆv๎I๖๖๖ดx๑bŠ%ฝ^?‡#ž]ee%˜๔INN&ข๛ฏb๚๐รษลล…D"…‡‡SssณQคัhH,“D"ก-[ถPD3ูL๑ Šˆˆ gggฒถถ&•JEถm›๔ฯ‘9ว7Ul(;;[(๓0ฟหถถ6ŠŠŠ"[[[rrrขดด41q4“อŸNงฃะะPrpp ‘HDK—.ฅ๗{z{{ฺ1ื๘ˆˆถnJ*•Šlllศูู™ยรร…ไ“h~ฯัฬ๑= ๓7•& ๓}–‘้ฎท2ฦcŒฑ…Žื€2ฦcŒ1“โ”1ฦcŒ™' Œ1ฦcฬค8eŒ1ฦc&ล (cŒ1ฦ3)N@cŒ1ฦ˜IqสcŒ1ฦLŠPฦcŒ1fRœ€2ฦุ788ตZนŠ‘•+Wขบบ๚‘๊xyyกชช๊?ัฃiiiม๓ฯ??ืร`ฬ,qสcsฬหห K–,มเเ pฬ`0ภฮฮ^^^Fๅ/^ ฑX GGGฤลลกปปจญ๚๚๚GNz:„่่hˆลโว[cc#BBBLา—VซลาฅKŽmผ}๔ัcทนlู2( ๘ใvxŒ=q8eŒ13เๆๆ†โโbaฟคคJฅrRน“'Ob``:๗๎CVV–ั๙ฒฒ2DFF>R฿฿}๗4อc๛QŒŽŽ็}˜‹‰X5 Ž92วฃaฬpสcf@ฃั 77Wุ๛๏‘˜˜8m๙%K–`ำฆMhjj2:>‘€ AฃัภมมXณfอ”ํ่t:ดททcีชUย1///|๖ูgXฑb์์์ฐgฯ477#((RฉทoสŽc๏ฝ๐๐๐€Rฉฤฎ]ปp๗๎]ภัฃGฑvํZคฆฆB*•";;]]]HHH€\.‡rrrฆ๑ม้ฅฅฅx๊ฉง„ซย๙๙๙ำึ๛๗฿ฑlู28::"==ใใใยนฏฟ~~~prrBrr2166†จจ(\ฝzbฑbฑ999ศออEVVฤbฑsCCBCCaooภภ@ิึึ m[XXเเมƒ๐๖๖ฦฺตkกกก(//_Pษ7c…cŒอ)•JEZญ–ฉฃฃƒ:::ศชชชHฅR•๛๕ื_‰ˆจทท—6nH{๗๎ฮ๗๕๕‘Bก ฑฑ1๚ๆ›ohใฦd0hdd„ฮœ93e฿ฅฅฅ8i.—ห…m[[I๛uฺแ้้)œSฉThoo๖…mN‡แแa8;;C&“A&“แoฟลอ›7g^ ฐฐEEEpwwGddไคฅ๒๐๐0ฺึ๋๕BฉฉฉB฿/พ๘"n฿พ=k฿Ž๔้ำB}™L†ฆฆฆiใะ฿฿ฉT๚ะ0ถpสcf"((]]]่๎๎Fpp๐ŒeE"’’’p๎9นsภ”ึฏ_ฐฑฑมพ}๛ะาา‚Ÿ_}๕ดZํคvVญZ…+Wฎ<๖˜]]]กำ้„}NWWWa฿ยยBุvssƒX,Fww7zzzะำำƒ~:thึ~ž{๎9œ8qทnB@@€ั•฿บvํšั๖ฤร\nnnศษษ๚๎้้<๐เ8ง๛D๕๋ืOชŸ0m›7obttพพพณฦศุBย (cŒ™‘ใว?ิ-้‘‘ไๅๅA.—รัั—.]‚D"’ญสสJ466b||‰VVVSาWฉTP(hhhxฌ๑ฦววใ๓ฯ?ว7ะีี…ฌฌ,ผ๙ๆ›S–ussCHH>๘เ ŒŽŽโฯ?ฤล‹g์ใฝ{ศหหC__ฌญญ!‹งŒeยp๋ึ-่๕z|๙ๅ—ˆ‹‹lบฑp๋๕z”••ธล๗๖ํFฏย’หๅhkk๖_{ํ5ิีีกธธฃฃฃBYYูŒทืฯœ9ƒ—_~VVV3ฦศุBร (cŒ™ตZ=ใ๚ฦˆˆˆลb899กฒฒลลลฐฐฐ˜๔๚%ฝ^˜˜H$#55uฺu )))F๋6EJJ bccฑz๕jจีj 33sฺ๒นนนธ~:||| —ห๑๎ป๏bhhhึ~rrr Rฉ`ooSงNแเมƒำ–‹‹รš5kเ๏๏u๋ึaห–-๎ฟi %%6l€D"AXX˜ฎXฑััั๐๐๐€L&p?aญฉฉL&รฮ;!•Jqโฤ 8prน^^^8|๘๐Œใ>v์ถm6k|Œ-4DDs=ฦcNdd$222๐าK/=rมมAใ?0ป—ัฯg๕’’’P]]=ๅ-~ฦ2N@c์ ๐้งŸb๗๎ฐถถž๋ก0ฦุฌ8eŒ1ฦc&ลk@cŒ1ฦ˜IqสcŒ1ฦLŠPฦcŒ1fRœ€2ฦcŒ1“โ”1ฦcŒ™' Œ1ฦcฬค8eŒ1ฦc&ล (cŒ1ฦ3)N@cŒ1ฦ˜IƒOืeIENDฎB`‚c4core-bm-charconv-atox-mega_bytes_per_second-i64.png000066400000000000000000001066031477602032300330710ustar00rootroot00000000000000c4core-0.2.6/doc/img/windows-x86_64-vs2019-Release‰PNG  IHDR 1(Z9tEXtSoftwareMatplotlib version3.5.3, https://matplotlib.org/อ+นา pHYsaaจ?งiŒ๐IDATxœ์wXื๛6๐{—Ž•€Š ์JAฃ(Vฤ~‘จจมXcรDฑcTŒ=–K"ั`‰ฦลฎXฃ‚ ˆD%1Xb7สข(mฯ๛‡/๓sฅˆ……ฌ๗็บ๖บุ™3gžgvYฮœ™• !ˆˆˆˆˆิD^ึั‡…(ฉ P""""R+ DDDDคV,@‰ˆˆˆHญX€‘Zฑ%""""ตbJDDDDjล”ˆˆˆˆิŠ(‘šฅฅฅA&“aผyeJ‘Zทn [[ฒฃฤd2†^ึaะHll,d2bccห:”^ฟ~`ddTึaผ•ฯ๓จจจฒๅ?‡(}RRR0mฺ4คฅฅ•u(Deโไษ“˜6m?~\ข๖—/_ฦ่ัฃแแแ}}}ศdฒ"d2d2BBB ]?qโDฉอƒ2ƒณn:,Zด่๛)O41'R•™™‰iำฆ๛OะะฆM˜ššยุุฮฮฮุธqc‘ํ๚๋/้๗3>>โนu๋ฆM›†„„„7ฺ๎mฑฅRJJ ยรรY€า๋ไษ“/q๚๛๏ฟc๑โลศศศ@ใฦ_^__ฟ๚+ฒณณ ฌ[ฟ~=๔๕๕฿4ไ"ฝMฑึชU+<{๖ ญZตzoqผO,@jืฎgฯžกOŸ>oผmff&ยรร‹,@Wฏ^๖ํCGGณfอยนsัชU+ธqฃศ>G mmํ7ŽxQ€†‡‡ณ%"*Žฯž=+๋0sž>}๚V๙๚๚โ๑ใวธpแ>๔ำืถ๏ะก v๏ญฒไษ“๘๛๏ฟันs็ทŠใ]=Jฅrน๚๚๚ห๙g๐CPZŸ2™ ๚๚๚ะาาzฏฆฅฅaุฐa๘โ‹/ฐw๏^ 6 ƒฦย… 1v์ุBทูปw/๖๎‹ัฃGฟืXJ ๓Hฃ\ปv C‡Eร† a``333จŒtFEE! ๐๑วKง_/๔ป๏พƒ ๔๔๔`ii‰aร†ฉŒC__๑‡ส}||PฉR%บuซD๑.\ธตkื†ผผผœœ\ อฅK—เ๏๏ส•+C__...ุฑc‡J›จจ(ศd2œ8qcฦŒนน9*Tจ€๎ปใ๛๚ฝ{7ผผผ`ll ธบบbบuฺฅคคเใ?†กก!ชWฏŽ9sๆจฌฯŸG๗ห/ฟ <<ีซW‡ฑฑ1‘žžŽฌฌ,Œ5 022B‘••ฅาว๊ีซัฆMXXX@OOMš4ม๗฿_ +++t้า{๗๎…‹‹ ฐ|๙๒"ํŒ3 —หฑdษiู๕๋ืq้าฅ"ทyู๓็ฯ1mฺ44hะ๚๚๚จVญ>๙ไ๕ื_R›งOŸ"445kึ„žž6lˆy๓ๆAกาWีmถมึึzzzฐฑฑมž={ค6›7o†L&ร‘#G ฤฒ|๙rศd2•๗ว›ผ/Ž9‚กC‡ยยย5jิภดiำ๐ๅ—_ฌญญฅ฿โฮTฎ\ฦฦฦ%:vPฝzuดjีชภ๛*::vvv%žcœ‘‘QฃFมสส zzzฐฐฐ@ปvํp๎9/ๆ+๏ฺต ืฎ]“๒ฐฒฒ๐๏ฯ 6`าคIจ^ฝ: กP( š?๗๙u๏{เลgฏฏ/*Tจ Œ={๗๎-ะgjj*z๔่ชUซB__5jิ@`` าำำ‹ฬนธœเฝ{๘์ณฯPฅJ่๋๋รมม?๔S‰Žg๏ั๑ใวัฌY3่๋๋ฃN:XณfJปiำฆA&“ุ>=๕๒{%ฟฯุุX้wำฮฮN:[ถl๔๕๕แ์์Œ๓็ฯีซWแใใƒ *ภาาำงO/๐ปคT*ฑhั"ุุุ@__UชTม Aƒ๐่ัฃB๓,์๓bhูฒ%*Vฌ###4lุ&LPูพคŸ…ออŸำ๚ฯ?ภฯฯFFF077วุฑc‘——'mgnn—^็iำฆ"##‘——‡้ำงžB๑ื_‰#Fbย„ bํฺตbํฺตโฮ;B!ฆN*oooฑdษ1|๘pกฅฅ%\]]EvvถBˆG‰5jWWW‘››+„"22Rkืฎ-6ฦฟ[vvvยสสJ|๓อ7"<<\Tฎ\Y˜››Kq!Drrฒ055Mš4฿|๓Xบtฉhีช•ษdbห–-RปีซW ยษษIดiำF,YฒD„†† ---ัณgO•ฏ^ฝZศd2akk+fฮœ)–-[&BBBDŸ>}ค6^^^ยาาRิฌYSŒ9R|๗wขM›6€ˆ‰‰‘ฺ>|XŽŽŽย],^ผXŒ1Bศd2(‚‚‚DวŽลฒeหDŸ>}ฎซซซ่ืฏŸXธpกXฒd‰h฿พฝ –.]ชาฎvํฺข^ฝzขRฅJb๘๑"22R>|X!1lุ0ฉํฤ‰…L&+VฌP้รหหK”ไc/77WดmVb้าฅ"""BดiำFlถM!„Rฉmฺด2™L„„„ˆฅK—Šฎ]ป bิจQ*ขZตjโ๋ฏฟ‹-u๊ิ†††โมƒB!233…‘‘‘:thx>๘cacc#=ำ๗E“&M„———Xฒd‰˜={ถHLLฝz๕ฤย… ฅ฿'Ožผ๖ุ!ฤนs๑๗฿บ>๕Xฑb…000B!rrr„นนนˆˆˆ~ฯ๎฿ฟ_์พ‚‚‚„ฎฎฎ3fŒXตj•๘ๆ›oDืฎ]ลฯ?,„b฿พ}ยััQ|๔ัGR[ทnB฿๛ณI“&ยััQ,Xฐ@DDDˆงOŸJ๋๒฿CB”}ไษQงNa`` ฦ/-Z$š5k&T๚ฬสสึึึยาาRฬ˜1CฌZตJ„‡‡ WWW‘––Vdฮลๅ”™™)7n,tttฤ่ัฃลโล‹…งงง -ZT์ฑโล๏Qร† E•*Uฤ„ ฤาฅKEำฆM…L&ษษษRปื็U๙๏ฉ—_๛>ซUซ&ฆM›&.\(ชWฏ.ŒŒŒฤฯ?,jีช%fฯž-fฯž-LMMEฝz๕D^^žด}ppฐะืื๕๋ื}๚๔K—.]บtฤไษ“U๖"ดตตลภEddค7nœจPก‚ส็s~L…}^$'' ]]]แโโ"พ๖[)ฦŽ+ZตjฅฒŸ’~Vไžฏ^ฝบ@>666bภ€โ๛๏ฟ=z๔ฤw฿}'„x๑๚๛๏ัฝ{w้uNLLBแ์์,์ํํลบu๋D๕๊ีQฉR%1iา$•c—oฮœ9ยยยBคงงKฏQ\\kใฯw็ฮ1}๚t@|๙็R<๕W‰๛xS,@IฃdffX๖๛๏ฟ bอš5าฒM›6๘ใ#„๗๎บบบข}๛๖*ฟไK—.ฤ?(-ปwฏ fฬ˜!ฎ^ฝ*ŒŒŒ„ŸŸ฿kcฬภ2007o”–Ÿ>}ZฃG––ตmVุูู‰็ฯŸKห”Jฅ๐๐๐๕๋ื—–ๅเx{{ ฅR)-=zดะาา?B๑๘๑call,ฤณgฯTโzyป฿—YVV–จZตช่ัฃ‡ด,ธญญญส‡ฏ^ฝ„L&;vTู‡ปปปจ]ปถสฒย^3QงN•eตkืฤž={ ดน rน\DEEhWา?*?๘ฃ ,XP`]qฺถm›๔๚ฟฬ฿฿_ศd2๑็Ÿชฤงซซซฒ,11QK–,‘–๕๊ีKXXXHิ!ฤํท…\.ำงO—–ฝ้๛ขeห–*} ๑๚"ฒ8%-@๗_กซซ+Sถkื.!“ษDZZZ‰ PSSS•. ำนs็๏+!๏YงN๏ณข ะ’ผ๏็ฯŸ/HŒ!ฤณgฯDฃFT๚<ผ 6mฺTlo’ำขE‹ฉBˆ์์lแ๎๎.ŒŒŒ„Bก(ถ฿฿ฃฃGJห๎ป'๔๔๔Dhhจด์M Pโไษ“าฒฯGqํฺ5i๙๒ๅห ๗เเ`@|๑ลา2ฅR):w๎,tuuฅ๗ศฑcวญำž={ ,/๊๓bแย…%z฿ฝk @ๅwV!œœœ„ณณณ๔๛€˜:uj~MLLDฅJ•„žžž˜๙๚๚๚ลž~•ŸŸชWฏ.=oึฌ๘๗฿q่ะ!๔์ูx๐เ>>๖ผ˜ใ5|๘p|๛ํท๘๙็Ÿ\ Mlllฑงฑ๒๚๋ฏ๘่ฃ๐ล_X—œbbb ฅฅ…#Fจฌ …ขภGooo•Sc๖๖๖011Q9ž๛฿p๏=•Sธ›7o†Rฉฤ๗?o๗พ8pเ{ŸฃV•*UB‡ฐ~z/.ฌ๑๐๐@ํฺตKGลŠq๚๔้Ok)Lppฐส๛ฌ8%y฿๏ูณีซW‡ฏฏฏดL__T้หิิภ‹นy™™™oหbbbPตjU๔๊ีKZฆฃฃƒ#Fเษ“'…NแxU“&Mเ้้)=777Gร† .ฉ&Mšภ]z๎ๆๆhำฆ jีชU`ya๛z๙Vj๙ำVฒณณqเภภฆM›`jjŠvํฺI๏๛ภููFFF8|๘ฐJ…}^TฌXฐ}๛v(•ส"๓)้gEqฌ๒ำำณฤว๘ษ“'x๔่ยรร1}๚t๔่ัััั่ะกพ๖[dddHmว‡:u๊yื‰๒Š(i”gฯžaส”)าœผ>๚ๆๆๆx๘qฑsฎ๒ๅj 6TYฎซซ‹:u๊H๋๓อ›7•+WFBB/^ ‹วZฟ~ห4h อญ๚๓ฯ?!„ภไษ“annฎ๒˜:u*€sม^๖๒=๐ข อสŸฟX’๙w5jิ(P”VชTฉภ\ซย๖›‡ทfอš–+•J•ืโฤ‰๐๖๖F… PฑbE˜››K๓ฑ +@‹ฒfอ,[ถ K–,Q๙ใ6๚๋/4lุฐุซIฏ]ปKKห๓"๓ฏ๕ฝ๒๊1 ฯ:ภิิTๅ6+7n„ฃฃ#4hเํลทา„๛๗ใ๚๕ุ๋ถm‚‚‚h๛9sๆ 995kึDณfอ0mฺด7.”$’ผ๏ฏ]ป†บu๋hWฏ^ฝ๛3f VญZ…>๚>>>XถlY‰>‹Šrํฺ5ิฏ_ฟภลSEฝ๏ S’๗โ›z“ฯ๖%—หQงN•e๙๏๙ฯฤิิTคงงรยยขภ{ษ“'%z฿๏C‹-‚*Uช 00ฟ๒Kฑล่ะืื—ๆxๆ{“cœำซŸeฝz๕ยณgฯคyดงNยฺตkฑpแยuowญ>Q9๕ล_`๕๊ี5jajj ™L†ภภภ๗็ฯŸ—>๔.\ธ๐ฮ…ฯห๒ใ;vl‘ฃ~ฏม+j”๋m““พŠj๛บ>๚๋/ดm5ย‚ PณfM่๊๊"&& .,๐š7ŠีขE $$$`้าฅู่ณ'*Wฎ\dฒP’ใฉงง???lบ฿}๗๎ฝ‹'N`ึฌYR›ทy_”t๔ฏ4๘๚๚BOOมมมศสสBฯž=฿h๛ž={ยำำ[ทnลพ}๛0w๎\|๓อ7ุฒe :v์Xข>$๗๙;๓็ฯGฟ~ฐ}๛v์ท#FŒ@DDN:…5jผUŸ๏ช$9v้"š’๖๙>งRฉ„……ขฃฃ ]jมWุ๋n``€ฃGโ๐แรุตk๖์ูƒ7ขM›6ุทo฿{;S๐ฎXZZ"55UชTQYž?ศ‘_ศ~๕ีW๐๔๔„ตตตTจ็฿[๗๖ํธ~zกp”,@Iฃlผมมม˜?พด์๙๓็๎uXิ‡kฉมห—/ซ7žฟาฒงOŸขhาค <<<0gฮt๏]บ’๐uRSS ,ปrๅŠtตkuttT๖๛.๒O'''(Rสยoฟ†ฌฌ,์ุฑCๅC๒ีSi%Qฏ^=ฬ™3ญ[ทF‡p๐เม7บj๛eu๋ึล้ำง‘““ฃ2ตเeตkืฦ‘‘กฒŸ+g฿ไ4๓ห๗ฟแงŸ~ยมƒ๑ว@!~฿๛ขจ฿๗อภภ~~~๘๙็ŸัฑcG|๔ัGoGตjี0t่P :๗๎CำฆM1sๆLฉUW.๙jืฎ””!T๖็Ÿฺฮฮvvv˜4iNž<‰-Z 223fฬ(rล}F%%%Iท’ส๗ฎ๏ปWๅŸ=y๘ฑtฺ(ู๋P*•ธz๕ช4๊ ผ๘< }&ึญ[@‹-้Ÿ*น\ŽถmขmถXฐ`fอš…‰'โ๐แร๏ํณถ$Š{฿:;;Kำi^[”?%ฟุพ~:ฎ]ปV่hฏฏฏ/LMMK|ฏ_uทฦk‰^CKKซภึK–,)๐_{…  ภ/ฆทท7tuuฑx๑b•~~๘แคงงซปpธqธ~:~๚้',XฐVVVา(OIlถMeฎ™3gp๚๔i้ช……Zทnๅห—ใ๖ํถ/์๖Jฏำพ}{#""ฯŸ?WY๗ฎ๓F(มห๛NOOว๊ีซ฿ช?{{{ฤฤฤเ?@ืฎ] ๗ฏคทV้ัฃ}Zโ=ฝ——„Xบt)tttะถm[/Fร๓๒๒๐๕ื_ุ677ทD๏ๅทภ2GGGPyMไ–moหะะ@แฟƒ๙t๐รา2ฅR‰ีซWฃrๅสpvvฌXฑ[ทnUyไฯ]Ÿ7o^‘ฃล…Q็gภPา0]บtมฺตkajjŠ&Mšเ๗฿ว`ffฆาฮััZZZ๘ๆ›ožž===้^”aaaG‡เ๋๋‹ห—/ใป๏พƒซซซtqยกC‡๐w฿a๊ิฉhฺด)€๗ณlบ5&Ož\่}_Uฏ^=ดlูC† AVV-Z333|๕ีWR›eห–กeห–ฐณณรภQงNฝ{ฟ;nผ‰ฤฤฤ7:>&&&Xธp!BBBเ๊๊Š   TชT ‰‰‰ศฬฬ,ี?.…i฿พ=tuuัตkW 4Ož<มส•+aaaQhqUอ›7ว๖ํัฉS'๘๛๛cถmา(f฿พ}qไศ‘ื}๛๖ลš5k0fฬœ9sžžžx๚๔)8€กC‡ข[ทnฺ่ต+>๘cLœ8iiipppภพ}๛ฐ}๛vŒ5๊ญ๎ลผูไ“Oฐaร<}๚๓ๆอ+ะๆ}ผ/๒€Mœ8ะััAืฎ]ฅ?BฏJOO—๎ฉzโฤ / †Š+ขbลŠ*ผสมมฏ้UจQฃแเเ###8pqqq*g9๒ฟžpฬ˜1puu…‘‘บvํ๚ฦ๛+ฉAƒa้าฅ่ีซFމjีช!::Zบฐ/$้ะกC>|8ะ AไๆๆbํฺตะาาB=ŠGQ9}๙็Xพ|9๚๕๋‡ณgฯยสส ›7oฦ‰'ฐhัขท๕U๛๖ํQซV-|๖ูg๘๒ห/กฅฅ…ๆๆๆธ~๚{ูวห๔๕๕ฑgฯรออ ปw๏ฦฎ]ป0aยiดฯหห ƒ BDDคo JMMลฆM›๐ํท฿ย฿฿ฟุLŸ>GE็ฮQปvmปw฿}๗jิจ–-[JํJ๚Y๑. ะคIlธ 4@ๅส•akk [[[t๋ึ mถEDDึญ[W`๙‘#Gp๓ๆM้k๑^ีฎ];ฌ]ปkืฎล๙๓แไไ„ษ“'#88ธะ๖ปvํ‚……\]]฿)๛๗๏ใงŸ~ยเมƒ฿ฉŸ๒ฆUซVx๖์ZตjUึกชธ4<<ผิ ะnบมฤฤ฿}๗]ฉ๔OTx&"ขื่ิฉ6mฺ„ล‹C[๛>6ืญ[ggg}Zไ๗ฬ—”\./pฬ>d™™™044„\.‡ฟฟ?ึฌYƒ๐๐๐w~ฉG@‰ˆ^ฃWฏ^x๘๐!๖๏฿/-หฮฮฦๆอ›๔F}UญZ2™Lฅ€วใไษ“่นณดlร† pvv†ฑฑ1LLL`gg‡oฟ๖ต๛ุถm`ddคฒ<cRRผผผ`hhˆz๕๊a๓ๆอ^Œ่บนนมภภ 6ฤ ๔}yt์ุ&&&022Bถmq๊ิ)•6๙SŽ9‚กC‡ยยย5jิึ๏ฝžžžจPกŒันsg\ผx๑ตy6455=z๔@ีชUกฏฏ5j 00้้้ฏํฮž= ภฺฺ‘‘‘ฺdeea๊ิฉจWฏ๔๔๔PณfM|๕ีWศสส’ฺศd2<}๚?๔“4ํข_ฟ~˜6mพ๒K€ตตตด.--Mฺ๖็Ÿ†ณณ3 Pนreโฦ*1ไฟvgฯžEซVญ`hhˆ &H๋ตk‡kืฎ!!!กDy•5 DDฏaeewwwฌ_ฟ^Zถ{๗nคงง#00ฐศํž?Žเมƒธvํึญ[‡Ÿ~๚ AAA ะฝ{๗B&“ก}๛๖€๛๗ฃWฏ^จTฉพ๙ๆฬž=ญ[ท~ํEE999ˆ‹‹CำฆM ]่ั#t้าnnn˜3g๔๔๔ˆ7"00:uย์ูณ๑๔้S๘๛๛###Cฺ๖โล‹๐๔๔Dbb"พ๚๊+Lž<7ZทnำงOุืะกC‘’’‚)Sฆ`๘๑€ตkืขs็ฮ022ย7฿|ƒษ“'#%%-[ถT)สJ";;>>>8u๊พ๘โ ,[ถ Ÿ9ฎ^ฝZขำ=BงNเ์์Œ9sๆ F2d~๑GฉRฉ„ฏฏ/ๆอ›‡ฎ]ปbษ’%๐๓๓รย… Un:ฟvํZ่้้มำำSšv1hะ |๒ษ'่ีซ`แย…า:sssภฬ™3ัทo_ิฏ_ ,ภจQฃp๐เAดjีช@>DวŽแ่่ˆE‹ฉ\ูู4๊ข3าp‚ˆˆ ตz๕j@ฤลล‰ฅK— ccc‘™™)„" @|๑วB!jืฎ-:w๎ฌฒ-€B~~~โ๙๓็๖ีงOแๅๅ%=9rค011นนนo๓Ÿ)ˆ%K–X็ๅๅ%ˆu๋ึIห.]บ$น\.N:%-฿ปwฏ Vฏ^--๓๓๓บบบโฏฟ’–บuK‹VญZIห๒[ห–-Uโฯศศ+VT‰๋ฮ;ยิิดภ๒W>|X‡Bqy@lฺดฉ๘ƒRˆc1|iYVV–ptt";;[!ฤฺตk…\.วŽSู>22R'Nœ–UจPAุืนs๑๗฿ซ,OKKZZZbๆฬ™*ห/\ธ ดตตU–็วYdNบบบbศ!ฏอจ<เ(Q ๔์ูฯž=รฮ;‘‘‘;wพ๖๔{ทnฐ~์฿ฟทoGXX๖์ูƒ   ˆ—พDฉTbฯž=*ง฿+VฌˆงOŸชœ๖/‰‡*UชT่z###•Q† ขbลŠhธ1คๅ๙?_ฝz——‡}๛๖มฯฯu๊ิ‘ฺUซV AAA8~8 …สพ---้๙๛๑๘๑c๔๊ีK~๐เดดดเๆๆ†ร‡ฟQฎฆฆฆ^Œugโhkkcะ Aาs]]] 4๗๎“พ9fำฆMhธ15jคs›6mเc~ู–-[ T*ัณgO•พซVญŠ๚๕๋่[OO๛๗/ฒฟJ•*9™จผแEHDD%`nnoooฌ[ท™™™ศหหƒฟฟฑิจQาs___˜™™a์ุฑุนsงt‘P\\๎฿ฟฏR€:ฟ๒ :v์ˆ๊ีซฃ}๛๖ู่ณ':t่PขxE_rWฃFฉ˜ššขfอš–/NS/ฎฌฯฬฬDร† ๔ูธqc(•Jธq666าrkkk•vฉฉฉ oฏ211).ฅฌญญ1fฬ,Xฐััั๐๔๔„ฏฏ/z๗๎-ล_KKหF5hะ––†ๆอ›#55๑‡tสU๗๎{ฃ˜_–šš !๊ืฏ_่z•็ีซW‡ฎฎn‘ !xgฐ%"*ก   8w๎AวŽQฑbล7๎ฃmถ€ฃGJhLL ฌฌฌะคIฉ……ฐw๏^์ฝปw๏ฦ๊ีซัทo_๔ำOE๖offเ วWฝ<"Y’ๅEฒ%a`` ๒\ฉTx1_ฒjีชฺฟ:/ถ$ๆฯŸ~๚a๛๖ํุทoFŒˆˆœ:uJๅยงทฅT*agg‡ บียM๛–ษdุฝ{wกวี‹ศ^=žฏz๘1>๚่ฃทއHX€•P๗๎1hะ œ:u 7n|ซ>rssOž<‘–ํฺต :u*ะVWW]ปvEืฎ]กT*1t่P,_พ“'OFฝz๕ ํฟVญZ000ภ฿V๑ล†††ธ|๙ru—.]‚\.m1Vทn]/Š๋—G†฿•์์์0iา$œŸไryฑว(_nn.–/_.=ฯฮฮฦ๒ๅหann.]UณgO๓ฯ?XนreํŸ={†งOŸJฯ+TจP่ี๗๙๎ซ๋>๙ไhii!<<ผภHณขภ{ 8๙sV=<}๚ iำฆ „นน9ฎ_ฟŽ]ปvกE‹Xบti‰ใ9t่†Ž€€4hะนนนXปv-ดดดะฃGืnoii‰oพ๙iiihะ 6nˆ„„ฌXฑBšูงO๒ห/Œ-Z //—.]ย/ฟ‚ฝ{๗ยลลภ‹[!8p ,€ฅฅ%ฌญญแๆๆ&ณ'ND`` tttะตkWิญ[3fฬ@XXาาาเ็็ccc๗฿ุบu+>sŒ;ถDวbจUซœœœJ|ˆสTู]€ODTพฝ|ฆโ”ไ6LZZZขFโ๓ฯ?w๏•ฺ๙๛๛‹N:่s๓ๆอข}๛๖ยยยB่๊๊ŠZตj‰Aƒ‰ทoฟ6๎ปw๏ mmmฑvํZ•ๅ^^^ยฦฦฆD๑็็0lุ0•e็ฮ>>>ยศศHŠ?Xœ>พุผ^ฝ ำีซWล€Dบu…พพพจ\นฒ๘๘ใลŠํGˆ;๑๑๑ย]่๋๋‹ฺตk‹ฅK—h›-พ๙ๆacc#๔๔๔DฅJ•„ณณณ้้้RปK—.‰VญZ @ๅ–L_ตจ^ฝบหๅnษ๔๋ฏฟŠ–-[Š *ˆ *ˆF‰aร†‰ห—/ˆท0yyyขZตjbาคIฏอ›จผ ๑3ฬ‰ˆ่ญๅๆๆยฬฬ :t่{ํ๛ณฯ>ร•+Wp์ุฑ๗ฺ/•?ถmCPP๚๋/TซVญฌร!* DDeไฝ{๘๎ป๏0hะ ๗^8\ฟ~ 4ภมƒัขE‹๗ฺ7•/๎๎๎๐๔๔,ั4ข๒‚(ฉฏ‚'""""ตbJDDDDjล”ˆˆˆˆิŠ(ฉoDOๅ’Rฉฤญ[ท`llฺฏฟ#""ข๒AŒŒ XZZB./zœ“(•Kทnzํ๗JQ๙tใฦ ิจQฃศ๕,@ฉ\266๗฿จ\นrGSบrrrฐo฿>ดo฿^๚๚?Mล\5sีLRฎภ‡•oiๆชP(PณfM้๏xQX€Rน”ฺุุ๘ฝ~—uy”““CCC˜˜˜|zฬU๓0Wอ๔!ๅ |X๙ช#ืืMŸใEHDDDDคV,@‰ˆˆˆHญX€‘Zฑ%""""ตbJDDDDjล”ˆˆˆˆิŠ(ฉ P""""R+ DDDDคV,@‰ˆˆˆHญX€‘Zฑ%""""ตbJDDDDjล”ˆˆˆˆิJปฌ *ŽฯขP๊•uฅJW.f xฮ9Šlฅฌฌร)UฬU31Wอ๔!ๅ ผ|ฯMn๓ขา\%""""ตbJDDDDjล”ˆˆˆˆิŠ(ฉ P""""R+ DDDDคV,@‰ˆˆˆHญX€‘Zฑ%""""ตbJDDDDjล๔5ัผysต๎๓าฅKhบ๕{o๛&v์ุล‹Kฯ#""ะฐaC4nQQQ*m—.] ™L†็ฯŸฟ๗8ˆˆˆH๓๐ปเ‹ฑ~hiiฝ๑vyyyoต]y๐่ั#TชT พพพาฒฝ{๗"..)))หๅx๐เด๎๛ุตkjีช%-KOO‡‰‰ d2อ๎`"""zsVฎ\ ;;;888`๊ิฉศษษมฌYณ0iาคm ooot่ะx๒ไ ๚๔้WWWธบบโิฉS€mถมออ ŽŽŽ่ึญž>!!!าบณgฯ"** ‡ฦŒ3ะฃGฤลลa๋ึญ6lภหห งOŸFBBZดh~๘0jิ(L™2‰‰‰BoQm‹ฺ็ˆ#€ฤฤD?~}๔เฦ˜2e š4i‚;wb๚๔้ˆŽŽ.ฐฟิิTฤฤฤภีี]บt‘ ุSงNAฉTขYณf*ํปt้‚#GŽZทnภภ@ฤฦฦ›SDDLMMฅGอš5‹mODDD],@๑b๔200&&&€gฯža฿พ}.ะv๐เม๛์3ฉp/Œžž๔๔๔^7๗q@›6mฐaรiกปป;n฿พดด4?~NNNฏ->_ๅํํeห–Iฯ …ีชUƒRฉฤฺตkฅ๕R1บqใฦb๛.ชmQ๛lัข~๚้'ภ๓็ฯ๑์ู3่๋๋cภ€8u๊ๆฮ‹C‡กQฃF˜?~ฝ|J=665‚ฉฉ)๎฿ฟดด4คฅฅกFธ|๙2 q๎9ธบบ"44^^^HNNฦ์ูณaeeUโใGDDDš‹([[[ >pppPนะซŠ›๚ฒ)Sฆเึญ[ฐททG“&MคS๕“'OFวŽแๆๆkkkฉขE‹0mฺ4888ผvhQm‹ฺ็ท฿~‹_~๙๖๖๖hูฒ%>|จาŸฃฃ#"##‘””GGว๛8p Nž< ;;;ฬœ9 .,6>CCCDGGใะกC๘฿W่จ*}ธdโuีQP(055…๓คํP๊•u8ฅJW.f๛ษFศVj๖ญซ˜ซfbฎš้Cสx๙ž›ๆ=DU:rrrƒN:AGG็ฝ๖๗;–ŒEแ(ฉ ะrl๕๊ีpttTy7=€ˆˆˆ่ฟ€Wม—c๛๗Gห: """ข๗Š# DDDDคV,@‰ˆˆˆHญX€‘Zฑ%""""ตbJDDDDjลซเฉ\;ชฬฬฬส:ŒR•Cเc_ตz๏7.o˜ซfbฎš้Cส๘๐๒-k%""""ตbJDDDDjลS๐TฎM“ mร{eFฉาBฺศฑ;/#ZeNฉbฎš‰นjฆ)Wเรสwa—zeG@‰ˆˆˆHฝX€‘Zฑ%""""ตbJDDDDjล”ˆˆˆˆิŠ(ฉ P""""R+ DDDDคV,@‰ˆˆˆHญX€–hผ๙[oŸ––†อ›7ฟถ”)Sp๒ไษ๕ูฉS'dgg๓Oดjี 666prrRi—™™‰ฺตkc๘๑o8}X€–ฑ๛๗CK๋พ๒ซค่๔้ำแแแQไ๚œœ<}๚]]]@1o<\ผx{๗๎Uูfๆฬ™Š็Gฝi DDD๔aชF+Wฎ„0u๊Tไไไ`ึฌY˜4iR‰ถW(hำฆ š6m '''?~0qโD์ปŽŽŽˆŽŽฦ๛๗ัฑcGุููมววw๏๔๋ื{๖์)ะoZZ&L˜€Fแส•++++<ษษษ022Bณfอาvฉฉฉธt้:v์จาŸŸŸqเภ!@‘Fcช&IIIXถlNœ8ฤฤDŒ9 ,@pp0ŒUฺFFF"22€ถo฿Žs็ฮแท฿~Chh(€ฃ>>>HHHภงŸ~ŠฉSงข]ปvธpแบu๋†‰'ˆ'//;v์@งN๐ษ'Ÿ z๕๊8w๎\S์ฉฉฉ000@็ฮัดiS,]บTZ7v์XDDD่;66ƒ ย๒ๅหakk‹y๓ๆแมƒลŸฌฌ,( •i&ํฒเC‹ภภ@˜˜˜ž={†}๛๖แภธvํšJมƒK?ปธธ`ีชU!พ๚๊+?~ZZZ๘๓ฯ? ืษ“'1mฺ4@๏ฝฑdษ’mp๑โEฌYณ-[ถ,2๎ผผ<?~‰‰‰066†——<==‘––†  Aƒๆ•สd2ดkืํฺตร๛๗1z๔hิจQWฏ^…ฅฅeก๛‰ˆˆ@xxx‘q‘ๆ`ZF’’kkkไๆๆโ๛๐๕๕ลŽ;Š&::ูููHHH€––ŒŒŒz๘๎ป๏0`ภt๏!!!จ_ฟ~v–––hึฌชUซ๐๖๖FRRRRRฐaรlฺด Ožpppภโล‹‹l[ิะ   :t๖๖๖8z๔จ4ขhoogฯžI!M›6 111ฐททว–-[0cฦŒ"๗UกB„„„ ..๓ๆอƒถถ๊ ธถถ6ยรรแแแGGGดkืNบ ฉ(ธt้ๆฮ‹z๕๊•่๘ั‡C&x™2•C …ฆฆฆ๔๓๏ะ64-๋pJ•๒ะF)๋"๏vKฎ๒Žนj&ๆช™>ค\+฿…]๊!&&:u‚ŽŽฮ{ํ;๏wzzzฑg39JDDDDjล”ˆˆˆˆิŠ(ฉ P""""R+ DDDDคV,@‰ˆˆˆHญX€‘Zฑ%""""ตโwมSน6ณC}˜™™•uฅ*''11a^—†๏†ภๅ sีLฬU3}HนVพ999eG@‰ˆˆˆHฝX€‘Zฑ%""""ตโP*ื6&ใงeF้Rๆก2€ŸฯไZeM้bฎš‰นjฆ)W@#๓ํ๏ZซฌC(G@‰ˆˆˆHญX€‘Zฑ%""""ตbJDDDDjล”ˆˆˆˆิŠ(ฉ P""""R+ DDDDคV,@‰ˆˆˆHญX€–!4oญทOKKรๆอ›฿cD็ึญ[่ทฏ๔|๗๎ฐตต… ฌา611ฺฺฺุณgOฉฤBDDDš…_ลYF๖๏฿-ญw๛ชฏิ฿฿=E}บภ>N:…~๚มลลภ‹โ6tv๚๕ ‚นน9ภยยBฺnํฺตhำฆ ชTฉ"-{๔่lmm1bฤคคค”(วฌฌ,( •i& ฅ,)) ห–-ร‰'˜˜ˆ‘#Gbม‚†ฑฑฑJศศHDFFโใใ000ภ๖ํq๎9๖o ฬœ9>>>HHHภงŸ~ŠฉSงข]ปvธpแบu๋†‰'ขRฅJ˜5kŒ๙๓็ฃeห–pssddd 22ฮฮฮGทnp๙๒ๅ9คฆฆโๆอ›hูฒ%<<}:š6mŠŸฯŸ?GNNŽดฎฐc™฿Qa4~tๅส•ฐณณƒƒƒฆNŠœœฬš5 “&M*ั๖]ปvEjj*qแยXYY!,, ŽŽŽ๘๗฿1cฦ ฺฺุยฟ๖ 66ํทGงN`ee…ศศHฬœ9๖๖๖ุ่ฑ#rss‹฿Ž;เ่่„„„HหWฏ^ ggg899แฦ€mถมออ ŽŽŽ่ึญž}จVญ rๅสา:___€““าาาืฏ_‡ทท7์์์ฐ|๙rคคคHํ!“ษฮฮฮ่ป76lุ===ภ๙๓แๅๅ…–-["%%3fฬ€••U˜๒๒๒p๙๒e๘๛๛ในsศหหร๒ๅห๑ฯ?y,ภฦฦ฿~๛-.\ธ€ชUซยึึฟ๚k‘ว4,, ้้้า#”—ˆˆˆ4F ฏJHH@JJ ฌญญัฒeKœ?^*์„กกแk่๊๊J?หๅr้น\.G^^๏3ฟp|y๛#F`าคIธpแพ๙ๆid๒ีwํฺ…!C†เศ‘#่ะก w๏ ร7฿|ƒเุฑc…๎ืฬฬ •+W†ทท7d2˜˜๘ฺcฉT*ƒ^ฝz!::๓ๆอCปvํŠอฯฤฤDๅADDDšIฃ ะ6mฺ`ร† า|Bwwwพ}iii8~8œœœฐcวŽท๎฿รร[ทnENN๎นƒ๓็ฯรฦฦๆญ๛kผ98€ทo๗฿b+ TซV Jฅkืฎ-ดRฉฤอ›7แํํ๙๓็ใส•+€*Uช`าคIธx๑"1w๎\ฺฺุb฿พ}*หd2xyyแ์ูณ^Œ*7jิ;w.๒X๓ฯhุฐ!ขฃฃ1fฬi๚‹J"""4*x[[[ >ะาาB๗๎1mฺดBๆฯซjิr-Ÿนj(ๆช™>ค\+_—ฺƒN:AGG็ฝ๖๗;==ฝุ3Ÿ} žˆˆˆˆสอ.๑หฑ๎ปใ๏ฟVYถmถBฏD'"""า$,@หศึญ[ห:"""ข2มS๐DDDDคV,@‰ˆˆˆHญX€‘Zฑ%""""ตbJDDDDjลซเฉ\sถ2™YลฒฃTๅไไ ๆะฌŽ้{ฟ!pyร\5sีLRฎภ‡•oNNNY‡ภP""""R/ DDDDคV<Oๅฺฝม ‘-ห.๋0JUžถ>๐ฟ•ธ\Zนฯห:œRล\5sีLš”kต_eฝ‚# DDDDคV,@‰ˆˆˆHญX€‘Zฑ%""""ตbJDDDDjล”ˆˆˆˆิŠ(ฉ P""""R+ DDDDคV,@‰ˆˆˆHญK๊๏๏ๆอ›—จmฯž=แเเ€่่่๗ฑ๋7ึบuk\บtฉL๖=mฺ4DFFพSฑฑฑ |ซm[ขถาฯqqqpqq บvํชา๎๖ํ011y็ผˆˆˆ่ร๑ฮ฿ฟ~hii•จํํทqๅส$&&X———Wโ~สส!ฦw‘™™ mmm่๊๊โภ€œœ 8›7oFฝz๕p๏=•mฦvํฺฉ,{๔่*Uชคถธ‰ˆˆ่ฟๅF@Wฎ\ ;;;888`๊ิฉศษษมฌYณ0iาคm฿ตkWคฆฆยัั.\€••ยยยเ่่ˆ฿3fฬ€ญญ-์ํํ๑oฟx1โืพ}{t๊ิ VVVˆŒŒฤฬ™3aooŽ;"77ทศํุฑŽŽŽppp@HHˆด|๕๊ีpvv†““nธุถmเ่่ˆnบแษ“'€~๚a่ะกpuuลขE‹ฐhั"4jิ5jT‘๛พt้ผผผเเเ777deeฮž=‹–-[ขnบุทo 77#GŽ„ซซ+ฅ ‚‚‚`ooGGGฤววซ์cฯž=๐๒๒Bzz:vํฺ…ๆอ›รััƒ†RฉLž< 6D๛๖ํ๑๐แรBcฝx๑"พ๘โ ุุุเัฃG€ชUซ๖๎ wwwิซW`aa!mw๔่Q˜˜˜ภฮฮNฅ?๔๏฿งOŸ.๒๘ผ*++ …BๅADDDšฉฤhRR–-[†'N 11#GŽฤ‚  ccc•ถ‘‘‘า)ู๘๘xฉ๘ผy3์์์ -VVVHHH€ฎฎ.v์ุณgฯb๏ฝ๘โ‹/ค"0)) ัััˆ‹‹รธqใ`mmคค$เเมƒ…ฦ{๗๎]Œ3ปw๏Fbb"ๆฬ™#ญ322ยูณgัปwo)N///œ>} hัข~๘แฉใวqๆฬ„††bๆฬ™8<^ไ๑๊ำงฆM›†ฤฤD์ท:::€kืฎแศ‘#๘ๅ—_คํWญZkkkฤลลแ่ัฃ?~Ÿ?๗ะฤฤ๐์ู3์ทภตkืTฺ๘c)ๆ|;w†––œœœ––เล4†””DEE222p๋ึ-:t111mmmุ้Ÿ;wWฎ\มมƒQฑbE๖oHJJ’ๆแ>{๖ ตkืฦอ›7๑ษ'Ÿ@GGีซW‡งงง‡‹‹ tuu๑ำO?มึึถะ<€ำNŸ>฿YYYpwwGซVญฐ~zจื|ฺฺฺ่ฝ;บw๏Žkืฎaเภ;v,222ŠOXXฦŒฃr Y„iฆทž𐐀””X[[#77๗๏฿‡ฏฏ/v์ุ๑Fพถฎฎฎ๔ณ\.—žหๅrไๅๅฝYเ๔๔๔ l?bฤ„‡‡ฃu๋ึุผy3v๎YhŒปvํยแร‡๑๋ฏฟ"22ฒฤ๕ทo!~๘แxxx”จ5jเแร‡๘ใ?เแแ!บu๋†+Vจด[ดh‘T8P๙yลŠ๘๛๏€O?๛๗G๕๊ี ์หาาฑT:;;ใ๒ๅห8sๆ Ž?Žนs็โ๑ใวะาา‚กก!๚๖ํ x๘๐!ึฎ]‹ีซWฃN:ุดiำkKฑ!"""อVโS๐mฺดม† คนy๎๎๎ธ}๛6าาาp๘q899ฝq๑๙2lบ999ธs็ฮŸ?›ท๎ฏy๓ๆ8pเn฿พ ๘๗฿‹mฏP(PญZ5(•Jฌ]ปถะ6Jฅ7o„ทท7ๆฯŸ+Wฎฺฮฤฤฆฆฆ8|๘0 ==]š“Yooo|๗R›„„iy\iัยยถmร็ŸŽ‹/ขy๓ๆ8x๐ nผ เE๑w๓ๆM•cz๋ึ-;vLฺงปป;ึฌYƒ'N B… ๐๑๑ฏฏ/าำำUbk฿พ=ฮ;‡์์l<}๚‰‰‰จ[ท.ขฃฃqํฺ5คฅฅaิจQ˜9sฆT|ม …ปw๏ฦึญ[ักC‡b?}8J<jkk‹แร‡รรรZZZ่ฝ;ฆM›Vhขi๐เมˆGdddฑงแ Yณf่น3œœœ —หฑx๑b•<“WXXX`แย…RแใๆๆV`„๐e“'OFวŽaff†-Zเ๑ใวฺไๅๅ!((B`๚๔้E๖ทfอ 8ฃF‚กกaฑ#ฅƒ ยีซWแเเฅR‰† bห–-˜ฮo%œ7„V๎๓ฒงT1Wอฤ\5“&ๅZํ—ื฿Y%''111่ิฉ“tแฐฆ*อ\๓~งงงKำ๗ ร!*""""Rซwพ}yะฝ{w๗฿*หถm++ซR฿๗ฬ™3 \`3iา$๘๛๛—๚พ‰ˆˆˆ‹4ขบuk™ํ{โฤ‰˜8qb™ํŸˆˆˆ่ฟ†งเ‰ˆˆˆHญX€‘Zฑ%""""ตbJDDDDjล”ˆˆˆˆิJ#ฎ‚'อeyfffeFฉสษษbbPๅง>ˆ›3Wอร\5ำ‡”+ฉG@‰ˆˆˆHญX€‘Z๑<•kสŸ@ฉง,๋0J•Rฆ ิๅาP อ{ๆช™˜๋“|ฬฑฒ>`%""""ตbJDDDDjล”ˆˆˆˆิŠ(ฉ P""""R+ DDDDคV,@‰ˆˆˆHญX€‘Zฑ%""""ตbJDDDDjฅ๑่ใวฑjีช"ืWญZ๕ต}9r666๐๔๔|Ÿก•Xll,ีบฯ[ทnกo฿พา๓ปwรึึ666๘ด$ึญ[‡™3gโุ1ี๏ออหห{ง~ีแMc|๔่ภาาkึฌ<|๘ใววแร‡q๑โELŸ>]j/„@XXฺตk'-หฮฮFffๆ{ˆžˆˆˆ4‘ฦ ทnB‹-เ่่{{{„††โย… pttฤนs๑๔้St๏Mš4)0’W˜5kึ`ำฆM ลฐaรxyyกOŸ>๘๓ฯ?แ้้ {{{๔์ูOŸ>ดnกกกprr‚ซซ+โใใัถm[ิฉSปvํ*r …AAAฐทท‡ฃฃ#โใใผ( ปvํŠ๚๕๋cๆฬ™R๛.]บภููvvvุฒe -- ŽŽŽู่ณ'š4iRเ˜\บtฉภ~O:…~๚มลลE๊ฃy๓ๆ€๕๋ื#((ๆๆๆ iปตkืขM›6จRฅŠด์ัฃGฐตตลˆ#’’๒ฺc YYYP(*"""าLW€ฎ_ฟHHHภูณg1cฦ ุูู!!!_~๙%–-[kkkคคค cวŽธ{๗ฎดญฃฃฃ๔sHHโใใัทo_๘๚๚bูฒeXถl )) ;w๎ฤบu๋0bฤŒ=IIIฐฒฒยย… ฅ>ฬฬฬpyดlูร‡วฎ]ปฐm6ฬ˜1ฃศ๘งOŸŽ  )) ๑๑๑hะ เ๙๓ˆŠŠBbb""##ฅBwอš58{๖,Nœ8ษ“'Cธx๑"ฆNŠห—/8&ตkืddd 22ฮฮฮGทnp๙๒ๅ1ฅฆฆโๆอ›hูฒ%<<๔๎ใฦ“ฺu้า`gg™L}}}ฺฺุโ๚๕๋E๖}่ะ!ฤฤฤดตตabbhัขฬฬฬึึึธu๋๊ืฏ… bวŽ^ŒZนsะธqcุุุzLš4iเลivwwwlูฒE*J “——‡?๘ฤ๕๋ืัพ}{คฆฆbฺดi7nttt lc``€พ}๛ขo฿พHNNF฿พ} .บฐฐ0Œ3FzฎP(X„i(mีชŽ= ๔่ั,ะF&“ฝำ>^-j‹ขซซ หๅ*?ฟอQ===้็>>Œ3gฮเฬ™3HLL„ตตต4ส๘rŒE“M›6กB… ๐๕๕ลขE‹๐๐แรB๗mii‰Ž;BOO๕๋ื‡……n฿พณgฯbุฐaฐฒฒยๆอ›ŒC‡I๓ฯ?๘๚๋ฏ[[[ฌXฑขุLLLTDDDค™4ฎฝvํชUซ†!C† 00?FFF†ดรร7n์น๓/–qttฤoฟเลลJ-[ถ|งผฝฝ ศออU‰U …•+W†žžฮœ9ƒ?๘ฃะvฏ“Qศ:`๋ึญุฝ{7 T`๛.]บเุฑcBเฮ;ธs็ชVญŠฃG"-- iii๐๗๗วO?„6mฺ ==พพพ๐๑๑‘‘Nž<‰5kึภŽ i+@cccaoo''';v มมมฐทท‡ฝฝ=ๆฮ‹aร†แฯ?„ vํฺฅr๑Las@_g๑โล˜3g์ํํq๕๊UŒ5๊โŸzง~=z„J•*มืืWZถw๏^ฤลล!%%rน\ฅะฝ>vํฺ…ZตjIหาำำabb™L๖Nฑ‘fโh)บu๋ZดhGGGุ#44.\€ฃฃ#ๆฮ‹งOŸข{๗๎hาค \ข>###แ๊๊ {{{๔๏฿Jฅ[ทnE||<บw๏OOOภ๊ีซakk [[[ฌXฑขุ>sssฑeหดo฿ร‡๐ข ?~<`ๅส•7nดดด “ษ`nn.m†๐๐p•b๓ุฑchธ1fฯž{๗๎ฝั1#"""อวดญ_ฟHHHภูณg1cฦ ุูู!!!_~๙%–-[kkkคคค cวŽธ{๗ฎดญฃฃฃ๔sHHโใใ={๖D\\’’’```€฿~๛ ปw‡‹‹ ถnŠcวŽแๆอ›˜9s&Ž?Ž฿ ,@ZZZ๘nธ)Sฆ I“&ุนs'ฆOŸŽ่่่ํRSSWWWt้า7nœ:u Jฅอš5Si฿ฅK9rะบuk"66ถุc•••…Bก๒ """อฤดนบบbํฺตGjj* TึŸ}Zฅอ™3g`mmฬฬLฤววใว,r~h^^๒๒๒‡   Œ9Jฅaaa˜5kVกTฉRใววล‹๑้งŸ" _|๑E‘ว*""ฆฆฆาฃfอšEถ%""ข6 ฅจUซV8z๔(,,,ะฃGChhh‘๑„……!==]zไฒ‘ๆaZŠฎ]ป†jีชaศ! ฤใว‘‘‘!ญ๗๐๐ภฦ;w๎T)Š๒๔้S˜››ใ๙๓็าถ`ll,๕ํ๊๊ŠƒBกPเษ“'ุฝ{7T๚ัืืว€p๊ิ)ฬ;‡BฃF0๛|๙”zll,5jSSSฟiiiHKKC5p๙๒eโนspuuEhh(ผผผœœŒูณgรสสชศผ๔๔๔`bbข๒ """อฤซเKQll,ๆฬ™]]]˜™™aร† ˆ‡ฝฝ=๚๔้ƒaร†แำO?… Zตj…*UชH:::JงแCBB0x๐`ธธธ`โฤ‰hฺด)ชTฉ'''ฉ}ฟ~ะงO˜››ใุฑc7n<<<ฃG†••Uก๓@๓๗‰'Ož8Uผuํป7ขขข`jjŠฑุผ  ผแ#""ขL!ส:ขW) ˜ššโฯƒ`fจู'ๅ@ {ไmะAy:ศ+๋pJี๛ศU}้{Žชtไไไ &&:u‚ŽŽNY‡Sช˜ซf๚r>ฌ|K3ืฟ฿๙ทd, Oม‘Zฑ%""""ตbJDDDDjล”ˆˆˆˆิŠ(ฉ P""""R+ DDDDคV,@‰ˆˆˆHญX€‘Zi๖WฬะžผรLศอฬส:ŒR%ฯษbb ๏2r ๖)W""*G@‰ˆˆˆHญX€‘Z๑<•kส”_ก41(๋0J•R &P&o€Rร%/ไ*w่Sึ!iผr๚'€ˆˆˆˆ4 P""""R+ DDDDคV,@‰ˆˆˆHญX€‘Zฑ%""""ตbJDDDDjล”ˆˆˆˆิŠ(ฉ ะ๗เ๑ใวXตjU‘๋ซVญ๚VFEEแมƒEฎŸ7o^‰๚?~< _ฟ~ุณgO‰๖ฉS'dgg๓Oดjี 666prrRi—™™‰ฺตkK๛ """z ๏ม๋ ะทUT*„€Rฉ,Q๚&rrr๐๔้S@LL tuu๛๗วผy๓p๑โE์ปWe›™3gขy๓ๆ*ห=z๔^ใ""""อย๔-บu -Zด€ฃฃ#์ํํŠ .ภััs็ฮลำงOัฝ{w4iาƒ.QŸ_~๙%5jฬ;[ทnE||<บw๏OOO@•*U0dศุููแณฯ>รร‡แ่่ˆัฃGCฉTb๘๐แฐตต…ณณ3N:Uโ|าาา0aย4jิWฎ\XYYแ๙๓็HNN†‘‘š5kฐฐฐถKMMลฅK—ะฑcG•เ๏๏@Qโ8ˆˆˆ่ร ]ึญ_ฟGNN๓O๓ฯ?Rั7gฮX[[c๋ึญุพ};–/_.m๋่่ˆ„„@HH kkklผ๕ไr9าำำajj DFFขQฃF€{๗๎มฯฯ฿=`๗๎R_ฟ๒ nผ‰ . 99ธt้R‘9ไๅๅaืฎ]ˆŒŒฤ;w๐ูgŸแนs055Ui—šš t๎ทo฿ฦ€0|๘pภุฑc1w๎\œF5jเ๊ีซฐดด,t?/2"""า<Zตj…ฃGยยย=z๔ภมƒ ด‘ษd%๎O[[๑๑๑๐๓๓Ctt4>๛์ณBฝZ่พ‹ˆˆt่ะ ภธqใššZh;KKK4kึ ีชUƒ‘‘ผฝฝ‘””„SงNaร† ฐฒฒยุฑc๑๗฿cึฌYาvOž<ม?___นskืฎE•*UŠŒ',, ้้้าใฦ๏-W"""*_8๚ฎ]ป†5j`ศ!ธw๏?~ŒŒŒ iฝ‡‡6nWWW์น™™™ล๖๗ไษdffยืื่ึญ€#ž/๗๛*น\ฅR น\lฺด HIIมณgฯŠ-๘lmm๑w฿แ้ำงXฟ~=‚‚‚`dd„ีซWรสสJjืฌY3บu …†††8qโz๔่>}๚ ""ภ‹‹ฅ.]บ$๚Ž;[ถlA=ฐvํZิซW๏ตวTOOzzzฏmGDDD},@฿Bll,ๆฬ™]]]˜™™aร† ˆ‡ฝฝ=๚๔้ƒaร†แำO?… ZตjฅR6ดz๕๊๐๕๕Evv6d2พ๚k/n›ิงO˜››ใุฑcโ่ป7์์์ะพ}{ฬŸ?G…tuuฑz๕๊ๅRกB„„„ $$gฯž…ถถ๊[B[[แแแ๐๐๐H$ลณfอ’ฎข'"""z™L๐2e*‡ LMMq๏่r˜™”u8ฅ*G ์นn‚ตะั๐I1…\ๅ}K?999ˆ‰‰AงN ฃฃ๓^๚,ฏ˜ซf๚r>ฌ|K3ืฟ฿้้้011)ฒ]9@DDDDšŠ(ฉ P""""R+ DDDDคV,@‰ˆˆˆHญX€‘Zฑ%""""ตbJDDDDjลoBขrMคไffeFฉ’็ไืc ท „\รo~!ๅJDDEใ(ฉ P""""R+ DDDDคVœJๅšฯ–มP”uo็\๏MeQนฤP""""R+ DDDDคV,@‰ˆˆˆHญX€‘Zฑ%""""ตbJDDDDjล”ˆˆˆˆิŠ(ฉ P""""R+ #GŽภฦฦžžžฏmปcว,^ผXz† ขqใฦˆŠŠRiปt้Rศd2<}‡LDDDˆ_ล๙Yทnfฮœ ??ฟ"vํฺ…ZตjIหาำำabb™LV*yัG@หก[ทnกE‹ptt„ฝฝ=.]บ„•+Wยฮฮ˜:u*`๊ิฉpuu…ญญ-&L˜ moee…ฉSงยมมญZต‚Bกภš5kฐiำ&„††bุฐa*๛หออล–-[ะพ}{ >…๑ใวVฎ\‰qใฦAKK 2™ ๆๆๆาถaaaW)6;†ฦc๖์ูธw๏^‰rฮสส‚BกPy‘fbZญ_ฟHHHภูณg‘••…eห–แฤ‰HLLฤศ‘##GŽD\\’’’””„ฤฤDฉz๕๊!11ุธq#๚๖ํ ___,[ถ ห–-ธqSฆLA“&Mฐs็NLŸ>ัััโIMMELL \]]ัฅKธqp๊ิ)(•J4kึLฅ}—.]pไศ@๋ึญˆุุุbsŽˆˆ€ฉฉฉ๔จYณๆ[?"""*฿X€–CฎฎฎXปv-ยรร‘ššŠ#GŽ 00&&&€ส•+<WWW8::Jงศ๓ๅŸBwrrBZZZ}œ9sึึึศฬฬD||<~๑G4oผะx๒๒๒——‡ธธ8aไศ‘P*• รฌYณ ฆJ•*?~<.^ผˆO?๘โ‹/Šฬ9,, ้้้า#ฟศ%"""อรดjีชŽ= ๔่ัBˆmž?Ž1cฦ`ืฎ]HJJB@@ฒฒฒค๕zzzน\ŽผผผcลŠ8~8z๔่_~๙ููู…ฦcii)อํฝ;‘‘‘ไไd4oVVVธy๓&6lˆฬฬLiป๓็ฯcุฐa ลgŸ}†ะะะ"sึำำƒ‰‰‰สƒˆˆˆ4 ะrฺ่ตkจVญ† ‚ภภ@ddd`ร† าผศฯŸ?‡\.GฅJ•๐๏ฟโท฿~{ฃ}่๋๋cภ€8u๊ๆฮ‹C‡กQฃF˜?~ถ/ŸREฃF`jjŠ๛๗๏#-- iiiจQฃ._พ CCCœ;wฎฎฎ …——’““1{๖lXYYฝ๓ฑ!""ข>^_ลฦฦbฮœ9ะีี…™™6lุ€ชUซยรรZZZ่ฝ;ฆM›†^ฝzกqใฦจQฃ฿zŽŽŽˆŒŒฤ“'Op๚๔้๋ˆฝ{#** ฆฆฆ๘๑ว‹ํฯะะัััhะ ม[วDDDDš‹h9Œเเ`•e!!! QY6{๖lฬž=ปภ๖/ฯ๙์ืฏŸ๔๓ซ๗๏|•‘‘ฺถm[`;๚๋ฏลn๛๒>5jTl["""๚ฐ๑<ฉ P""""R+ DDDDคV,@‰ˆˆˆHญX€‘Zฑ%""""ตbJDDDDjล”ˆˆˆˆิŠ7ขงrm๏'‘033+๋0ˆˆˆ่=โ(ฉ P""""R+ž‚งrmF,h6โ5ECDDD๏G@‰ˆˆˆHญX€‘Zฑ%""""ตbJDDDDjล”ˆˆˆˆิŠ(ฉ P""""R+ DDDDคV,@‰ˆˆˆHญX€‘Zฑ๐๘๑cฌZตชฌร(W:u๊„์์lภŸ‰VญZมฦฦNNN*ํ233QปvmŒ?พ,ย$""ข  (พอหหSs4eท฿œœ<}๚]]]@1o<\ผx{๗๎Uูfๆฬ™hผนสฒGฉ'`"""๚Oา๘๔ึญ[hัขaoo“'Oช<ฟt้&Nœˆ .ภััs็ฮETTแๅๅ…>}๚เ๎ป่ึญ\\\เ้้‰+Wฎ"##แ๊๊ {{{๔๏฿Jฅะบuk„††ยษษ ฎฎฎˆGถmQงN์ฺตซศXงM›†๛ร_}๕RSSัฎ];8;;ฃC‡ธ{๗.ภสส ฯŸ?DEEIฃ_~๙%5jฬ;Š์ใeiii˜0a5j$ๅ–ฟไไdกYณf iปิิT\บt ;vT้ฯฯฯ8pเ„%zฒฒฒ P(TDDDค™4พ]ฟ~=ผฝฝ‘€ณgฯโ๐แร*ฯkืฎ™3gยฮฮ ๘๒ห/IIIุนs'ึญ[‡ัฃGc๊ิฉˆว‚ 0fฬ@ฯž=‡คค$เท฿~“๖kff†๓็ฯฃeห–>|8vํฺ…mถaฦŒลฦ๛ื_แ่ัฃ˜?>† †UซVแ์ูณ๘์ณฯ๐๕ื_นร‡ฑy๓fคคค 11Ÿ9ูG^^v์ุN:แ“O>A๕๊ีq๎นงุSSSa``€ฮ;ฃiำฆXบtฉดn์ุฑˆˆˆ(Kll, „ๅห—รึึ๓ๆอรƒŠอ;""ฆฆฆาฃfอšลถ'""ข.ํฒ ดนบบข_ฟ~หๅ€งงงส๓&Mšบ]‡`ll 8t่RRRคuZZZ€ฤฤDLš4 …?Fอš5ัญ[7@—.]vvvษdะืื‡ญญ-ฎ_ฟ^lผ~~~ะััAFFNœ8!๕———‡บu๋นฉฉ)ŒŒŒ???t๎นุ>p๑โEฌYณ-[ถ,ฒ฿ผผ<?~‰‰‰066†——<==‘––†  Aƒ8y๒คส62™ ํฺตCปvํp}Œ=5jิภีซWaiiY่~ยยยคย ‹P""" ฅ๑hซVญp๔่Q๖o่ัฃ–.]Zเya…กกก๔ณL&รนs็ —ซ8ปw๏F๚๕1o<<==ฅ‹””J%.\ธx๚๔)ฬออ๑๙slธ๑ฝฦmjjŠJ•*a฿พ}^\ ๔วjืฎ„„(•J์นภ‹‚/==พพพ˜3gŠํรึึ฿}๗ฮŸ?๚๕๋#((1าาาTโhึฌnบ…B\œ8q 6DDDnธดด4ฬ›7C† ‘ŠฯฑcวJ๓kืฎ]‹ @9&""ข›ฦ ฑฑฑฐทท‡““Ž;+++•็ฝ{๗†™™์ํํaoo/]ผ๓ฒ%K–`๗๎ppp€ญญญt!ัฤ‰ัดiS|๑วๆNพััั˜;w.เ่่ˆำงO&Mš„พ}๛ยรรC:ฅ‘‘ฮ;รมมบu“ๆzีGพ * $$qqq˜7oดตUลตตต8::ข]ปvาIE๑๖๖ฦฅK—0w๎\ิซW๏}"""า2Qาห”‰ิHกPภิิฃvถq๑3Eๆถ๘FMQ•Žœœฤฤฤ SงNะัั)๋pJsีLฬU3}HนVพฅ™k฿๏๔๔t˜˜˜ูNใG@‰ˆˆˆจ|ั๘‹สฃฝ{๗bธq*ห:t่€ูณg—QDDDDD๊รด ๘๘๘ภววงฌร """*<ODDDDjล”ˆˆˆˆิŠ(ฉ P""""R+ DDDDคVผ žสตIฎ`ffVึaั{ฤP""""R+ DDDDคV<Oๅฺๆซ๋a๐Pฟภ๒พ Bส """z8JDDDDjล”ˆˆˆˆิŠ(ฉ P""""R+ DDDDคV,@‰ˆˆˆHญX€‘Zฑ%""""ตbJDDDDjลดx๘1VญZUึaจุฑc/^,=ˆˆ@ร† ัธqcDEEฉด]บt)d2ž?ฎๆ(‰ˆˆ่ฟˆ_ลYไ !!ฟ^2//ZZZj‹ๅัฃGจTฉ|}}ฅe{๗๎E\\RRR —ห๑เมi๛๗ฑkื.ิชUKZ–žžศd2ตลMDDD-eทnB‹-เ่่{{{œ…๑ใวVฎ\‰qใฦAKK 2™ ๆๆๆาถaaaW)6;†ฦc๖์ูธw๏^ฉ["""๚obZสึฏ_ooo$$$เ์ูณ8|๘ฐส๓ฺตkcๆฬ™ฐณณCBBพ๒K@RRv๎‰u๋ึa๔่ั˜:u*โใใฑ`มŒ3ะณgOฤลล!)) ๘ํท฿คš™™แ๙๓hูฒ%†Ž]ปvaถm˜1c†ิๆฦ˜2e š4i‚;wb๚๔้ˆŽŽ.Cjj*bbbเ๊๊Š.]บเฦ€SงNAฉTขYณf*ํปt้‚#GŽxQ "66ถุใ”••…Bก๒ """อฤS๐ฅฬีี๚๕ƒ\.G@@<==Už7iาคะํ:t่cccภกC‡’’"ญห?%Ÿ˜˜ˆI“&AกPเ๑ใวจYณ&บu๋เEvvvษdะืื‡ญญ-ฎ_ฟ8sๆ <<<0jิ(ฤววรฤฤคศ๒๒๒——‡ธธ8ฌ[ท#GŽฤๆอ›†๕๋ืบM•*U0~xŒ7;w๎D@@ฑdษ’BGDD <<ผธCIDDD‚# ฅฌUซV8z๔(,,,ะฃGไไไจ*๙ภ’%K0x๐`,[ถ 999่ท/์์์0qโD4mฺUชT““ำ[ว่่่ˆศศHl<ODDDDjล”ˆˆˆˆิŠ(ฉ P""""R+ DDDDคV,@‰ˆˆˆHญX€‘Zฑ%""""ตbJDDDDjลoBขrอฟN/˜™™•uDDD๔q”ˆˆˆˆิŠ(ฉ P""""R+ DDDDคV,@‰ˆˆˆHญX€‘Zฑ%""""ตbJDDDDjล”ˆˆˆˆิŠ(ฉ P""""R+ DDDDคV,@‰ˆˆˆHญX€‘Zฑ%""""ตา.๋ˆ #„ddd@GGงŒฃ)]999ศฬฬ„Bก`ฎ„นj&ๆชน>ค|K3W…BเŽ…(•K>X[[—q$DDD๔ฆ222`jjZไz T.Uฎ\p๚๕b฿ภ/suuE\\{o[ฺํ jึฌ‰7nภฤฤไฝ๗!ๅ๚ฆํ?ค\฿ด=s-=ื7i!ๅ ผyพๅ)๖7m_šน !‘‘KKหbฑฅrI.1=ูิิดฤ|ZZZฅาVํภฤฤ„นช9ž)ื7mฯ\‹๗_อ๕mฺHน%ฯทผล^žr-ษภ/B"1lุฐRiซŽ๖oŠนพŸ๖Rฎoฺžนพ?ๅ)ืทi_š}—ท๖ฅูwyk_ึ}หฤ๋f‰•…BSSSคงงฟ๑t5ฬU31Wอฤ\5ื‡”oyศ•# T.้้้a๊ิฉะำำ+๋PJsีLฬU31Wอ๕!ๅ[rๅ(ฉG@‰ˆˆˆHญX€‘Zฑ%""""ตbJDDDDjล”สeห–มสส ๚๚๚pssร™3gส:ค7v๔่Qtํฺ–––ษdุถm›สz!ฆL™‚jีชมภภHMMUi๓๏ฟโำO?…‰‰ *Vฌˆฯ>๛ Ož๔S!D๙|]y žส์์lœ={า2น\ooo๛๏eู๛๕๗฿ใฮ;*yšššยออMส๓๗฿GลŠแโโ"ต๑๖๖†\.ว้ำงี๓›HOOTฎ\p๖์YไไไจไจQ#ิชUK%_;;;TฉREjใใใ…B‹/ช1๚’หหหร† ๐๔้Sธปปklžร† C็ฮU๒4๏uMMM…ฅฅ%๊ิฉƒO?ืฏ_ yy๎ุฑ...€……œœœฐrๅJiฝ&>eggใ็Ÿฦ€ “ษ4๊ต๕๐๐ภมƒqๅส@bb"Ž?ŽŽ;(Ÿฏซ๖{๏‘่-=x๐yyy*ฟ่PฅJ\บtฉŒขz๎น…ๆ™ฟ๎ฮ;ฐฐฐPYฏญญส•+Kmส#ฅR‰QฃFกE‹ฐตต๐"]]]TฌXQฅํซ๙v<๒ื•'.\€ปป;ž?###lบMš4ABB‚Fๅ 6lภนs็W`&ฝฎnnnˆŠŠBร† q๛๖m„‡‡รำำษษษ•'\ฝz฿=ฦŒƒ & ..#FŒ€ฎฎ.‚ƒƒ5๚๓iถmx๘1๚๕๋@ณรใว‡Bก@ฃF ฅฅ…ผผ<ฬœ9Ÿ~๚)€๒๙w‡(ฝ7ร† Crr2Ž?^ึก”š† "!!ุ้้้ผy3‚ƒƒqไศ‘ฒ๋ฝปqใFމ๛๗C__ฟฌร)U๙ฃD`oo777ิฎ]ฟ๒ ส0ฒ๗OฉTยลลณfอ899!99‘‘‘.ใ่Jื?€Ž;ยาาฒฌCy๏~๙ๅDGGcบuฐฑฑABBFKKหr๛บ๒<•}๔ดดด \x๗๎]TญZตŒขz๒s).ฯชUซโฝ{*๋sss๑๏ฟ–c1|๘p์น‡F5คๅUซVEvv6?~ฌาี| ;๙๋ส]]]ิซWฮฮฮˆˆˆ€ƒƒพ๖[ห๓์ูณธw๏š6m mmmhkkใศ‘#Xผx1ดตตQฅJส๗e+VDƒ ๐็Ÿj๋ZญZ54iาDeYใฦฅ)š๚๙tํฺ58p!!!า2Mzmฟ๒KŒ?ฐณณCŸ>}0z๔hDDD(Ÿฏ+ P*7tuuแ์์ŒƒJห”J%<ww๗2Œ์ฒถถFีชUU๒T(8}๚ด”งปป;?~ŒณgฯJm:ฅR 777ตว\!†Žญ[ทโะกCฐถถVY๏์์ •|/_พŒ๋ืฏซไ{แย•ฟ๛๗รฤฤคภห๒FฉT"++Kใ๒lถ-.\ธ€„„้แโโ‚O?T๚Y“๒}ู“'O๐ื_กZตj๗บถhัขภmาฎ\น‚ฺตkะผฯง|ซWฏ†……:w๎,-ำคื633rนjIงฅฅฅR  œพฎ๏ฒ&ขwฐaรกงง'ขขขDJJŠ๘๓ฯEลŠUฎ@/ศศศ็ฯŸ็ฯŸฤ‚ ฤ๙๓็ลตkื„/n‡QฑbEฑ}๛v‘””$บu๋V่ํ0œœœฤ้ำงล๑ใวE๚๕หๅmN† "LMMEllฌสํN233ฅ6ƒตjี๚ํ}LU๕๐7๒xน\ž..p ส๐ŠฃMฑh)ฉฉฐtq •5ส?4‡+์Aทจjm5lณ›ฅ1ค‰ m ฅ5+อŠKู5นŠ๒ “ Ÿ฿Œ3๏'ฉ_~๐~ml็œ๏ใ็ž}vฮ๗|ๅฤ‰r๖์YIHH„„ฅ|xซ“•+Wสนs็คบบZ‚‚‚ฆV'๙๙๙r๒ไIนz๕ช๖o’ŸŸ/...r์ุ1™9qŽๅฏเEfNผyyyR[[+Wฏ^•๏ฟ^žyๆ ”––™9qŠ mฉๅๆๆ&๏ฝ๗ž\พ|Yฬfณx{{ห๛•:3้“ศะn*๒๚๋ฏ(›)๗6;;[๔zฝฒ SEE…สkฏฝฆิ™n๗• (M;………!ฒdษ9sๆฬTOiาjjjภˆฟ์์lฺใํท฿–เเ`๑๔๔”คค$นt้’Cญญญb2™DฅR‰Zญ–7Jww๗D3พัโ ลลลJพพ>ูผyณ๘๙๙‰ทททคฅฅ‰ีju่งฉฉIRRRฤหหK%//O๚๛๛อ๘6mฺ$ƒA<<<$((H’’’”ไSdๆฤ9–N@gJผ"ขื๋%##รa_ฬ™็ฐร‡KllฌxzzJLLŒ9”ฯคO""G#b™9๗ถซซKถn*๒ภHTT”ผ๙ๆ›[EMท๛๊"rฯ6๙DDDDD2ฎ%""""งbJDDDDNล”ˆˆˆˆœŠ (9P""""r*& DDDDไTL@‰ˆˆˆศฉ˜€‘S1%"šๅz{{a4ัำำ3ีSqฐ`มœ>}zRm"##QWW๗/อhr๑๘ใO๕4ˆฆ%& DDS,22s็ฮEooฏrอfณมวว‘‘‘๕ผฝฝกRฉ€๔๔tดทท;๔u๎นI'={๗๎ลบu๋ RฉQk๕๕๕HHHpสXตตตx่ก‡ฎmุฐ๏พ๛๎฿๎sผyะ้t8|๘๐?ัŒร”ˆhะ๋๕จฌฌTฮฟ๚k„„„Œจw์ุ1๔๔๔ภbฑเ๎ป(((p(ฏฎฎFrr๒คฦโ‹/`2™ึผ'รnท๋cLรฑšL&์ทoŠgC40%"šL&ฬfณrพ~ฌ_ฟ~ฬ๚s็ฮลฺตkัะะเp}8ํ๋๋ƒษd‚ฟฟ?ฑt้าQ๛ฑX,hnnฦย… •k‘‘‘๘๐ร1|๘๘๘`็ฮธt้/^ ___ผ๒หJมมA์ฺต แแแ ม–-[๐ื_พ๒K,_พนนน๐๕๕Eqq1ฺฺฺ™™ ญV‹จจ(”””Œใฝฏำซชช๐ศ#(O…<8fป~๘๓ๆอC@@ถo฿ŽมมAฅ์ำO?ลร?Œภภ@dggฃททHIIม•+W Rฉ RฉPRRณูŒ‚‚จT*%ๆ .`ูฒe๐๓๓รขE‹p๖์Yฅo์ูณ>๘ –/_XถlŽ?>ซ’oข๛"DD4ฅ ƒิึึJXX˜ดดดHKK‹„……I]] ‡z฿}๗ˆˆtvvสš5kdืฎ]JyWW—่t:ฯ>๛LึฌY#6›M๚๛๛ๅิฉSฃŽ]UU%‹-1ŸฤฤDimm•††๑๔๔”+Vˆลbซี*มมมrโฤ )**ฃั(ืฎ]“ทoหO<กฬฉธธX\]]ฅธธXฤfณษณฯ>+yyyr็ฮihh9˜ฟหpผมมมRWW'""VซU๊๋๋วl๓่ฃŠีj•๋ืฏ‹ัh”}๛๖‰ˆศW_}%ฑฑฑาิิ$6›ML&“ไๅๅ‰ˆHMMDGG;๔•-สywwท„††Jyyนุํv9t่„‡‡K__ŸˆˆตkืJggงุl6ฅZญ–‹/Ž:_ขูŠO@‰ˆฆWWWผ๐ย (++CYYžyธบบŽจ—’’F???466โ•W^QสŽ?ŽฤฤDฬ™3๎๎๎hmmล•+Wเๆๆ6ๆะŽŽŽQื~nูฒˆ‰‰A\\’““N‡ฤฤDœ?p๐เAl฿พaaaภฮ;qเภฅŸ่่hlุฐsๆฬAgg'jkkฑ{๗nxzz"&&™™™จจจ˜๐๗qwwGCCzzz ำ้`4วฌปu๋V่t:„††bถm(++0ดิ`วŽ0 ๐๒๒ยoผ๒๒๒ วVUU… (๗&55ZญgฮœQ๊ไ็็CญVรหหKนๆใใƒฮฮฮ๛‡h6`JD4Mฌ_ฟฅฅฅ0›อcพ~ๆ›oะัั›อ†ิิTฌ^ฝZ)ปwgVV’’’––ƒม€ปwฺŸฏฏ๏จ_ฟkตZๅุหหkฤ๙p›ๆๆfDDD(eƒอออสyXX˜rlฑXp็ฮAฃั@ฃัเ๓ฯ?ว7ฦ] ผผ‡BXX’““G,=ธWxxธรฑีjUฦฯออUฦ~๒ษ'q๋ึญ วพw'OžTฺk4444Œ๏ฐ๎๎n๘๚๚๗8DณP"ขib๑โลhkkC{{;โใใวญ๋้้‰ฌฌ,๓ฯธ}๛6€ก”VญZ๐๐๐ภ;๏ผƒฦฦF=zŸ|๒ jkkG๔ณpแB๑ว{ฮกกกฐX,สนลbAhhจr๎โโข๋๕zจT*ดททฃฃฃ่๎๎ฦฝ{'็ฑวร‘#Gp๓ๆMฤลล9<๙oืฎ]s8˜KฏืฃคคDปฃฃCูyเyŽ6๗แ๖ซVญั>33sฬ67n€nGtt๔„1อ&L@‰ˆฆ‘ŠŠŠ๛z%฿฿าาRhตZเโล‹PซีJฒUSSƒ๚๚z BญVรออmิW๚ƒ:.\๘[๓อศศภG}„๋ืฏฃญญ x๑ลGญซื๋‘€ทz 6› vปฟ๒ ~๗qวธ{๗.JKKัีีwwwจTชQcVXXˆ›7oยjตโใ?Fzz:`ำฆMx๗•„jตขบบภะ฿[ทn9l…ฅีjัิิคœ?๗s๘๕ื_QYY ปŽพพ>TWW๛zิฉSx๚้งแๆๆ6nŒDณ P"ขiฤh4Žปพqๅส•PฉT DMM *++แโโ2b๛%ซีŠิิTจีjฤวว#77wฬu 999๋6'#''iiiXฒd ŒF#โโโฐcวŽ1๋›อf๙็ŸˆŠŠ‚VซลซฏพŠพพพ ว)))ม`€ŸŸพ๖[์ูณgฬบ้้้Xบt)bccฑbล lธภะN999Xฝz5ิj5•ไw๙Xทnยรรกัh %ฌ?๘#4 6o ___9r………ะjตˆŒŒDQQัธ๓>pเ^z้ฅ ใ#šm\DDฆzDD๔ฯ$''#??O=๕ิค๖๖๖">>?๔ำดŒูๅห—‘••…ำงO๚ŠŸh6cJD4|๐มุถmงz*DDbJDDDDNล5 DDDDไTL@‰ˆˆˆศฉ˜€‘S1%""""งbJDDDDNล”ˆˆˆˆœŠ (9P""""r*& DDDDไTb]กฎ| ฒIENDฎB`‚c4core-bm-charconv-atox-mega_bytes_per_second-i8.png000066400000000000000000001036431477602032300330100ustar00rootroot00000000000000c4core-0.2.6/doc/img/windows-x86_64-vs2019-Release‰PNG  IHDRškเ:ซ9tEXtSoftwareMatplotlib version3.5.3, https://matplotlib.org/อ+นา pHYsaaจ?งi‡IDATxœ์wXS็๛?๐wยF†JA,เภล""8pPม๎โถญึYg‡ึmตจิQGEซuโธ๗ฤฝPJโ(n… (+ฯ๏œฏ1€8b฿ฏ๋ส%9็9ฯsŸ;'ษํY‘ !ˆˆˆˆˆ>0นฎ """ขข‰…&i M""""า šDDDDค,4‰ˆˆˆH+Xh‘Vฐะ$""""ญ`กIDDDDZมB“ˆˆˆˆด‚…&ัG–™L†?๘Cืกไฉ~๚pqqัu&“ษะฟ]‡AŸศศHศd2DFF๊:”ฯ^๗๎affฆ๋0Iฮ็๙โล‹uJกลB“>K๑๑๑;v,t ‘N;v cวŽERRRฺ_บt ƒ†ฏฏ/Œ!“ษ๒|ศd2ศd2๔่ั#ื๙#FŒฺIB<\ืa|rRSS฿iน   $%%!..:uzc๛ภภ@(•J์ุฑCm๚ฑcวpใฦ 4kึ์โx_/^ผ€Jฅ‚\.‡ฑฑ1ไr~ ~ด๕y!“ษ`ll ==ฝฺ๏ผy๓‡ยเมƒัซW/lธ๕๊ี๛ไำ๓FEสอ›7ัทo_TชT &&&ฐฒฒBปvํิ๖\.^ผํฺต4hะ@:„๗๊*๚๋/TซV FFFฐณณCฟ~ิ๖t๋ึ ฦฦฦ๘๗฿ีฦ@‰%˜˜X xงOŸ˜˜˜ภฯฯ็ฯŸืhs๑โEดm%K–„ฑฑ1jิจอ›7ซตYผx1d2Ž=Š!C† TฉR(VฌZตj…‡j๔นcว๘๙๙ม๐๒๒ยŠ+4ฺลววฃAƒ055E™2e0eสต๙9็นญYณใฦC™2e`nnŽถm"99้้้4hฌญญaff†oพ๙้้้j},Zด 6„ตต5ŒŒŒPตjUฬ;W#GGG4oปvํB5`bb"}็fย„ หๅ˜5k–4ํึญ[ธx๑bžหผ๊ล‹;v,œall [[[ดnืฎ]“ฺคฆฆb่ะก([ถ,ŒŒŒPฉR%๑วBจ๕•s้ฦแโโ###TซV ;w๎”ฺฌ[ท2™ ิˆeผyษdjวlD฿พ}amm {{{Œ;?๔ภษษIzไท‡ฟdษ’077/P๎ L™2จWฏžฦvWWืŸœ’’‚AƒมััFFFฐถถฦW_}…ณgฯxy>๑ถmp๓ๆMi=฿๖นjี*Œ9eส”ฉฉ)”Jeฎ็hๆœ›ฆํx๙Y„bลŠมฺฺƒฦฎ]ป4๚ผrๅ ฺดiƒาฅKรุุ๖๖๖ Arrrž๋œ฿:ภƒ๐w฿มฦฦฦฦฦpwwว’%K ”ฯœ๗ั‘#GPณfMฃ\นrXบtฉZปฑcวB&“i,ŸณMฝบญไ๔)ฝ7]]]ฅ<ฌ_ฟฎฎฎ066†งง'ฮ;—klืฏ_G@@Š+;;;Œ?^ใฝคRฉ0cฦ TซV ฦฦฦฐฑฑAฏ^ฝ๐๔้ำ\ื3ทฯ‹={๖ N:(^ผ8ฬฬฬPฉR%๚๋ฏjห๔ณ"ทs4sฮ9๏ฟะฒeK˜™™กTฉR๘๑วฅร (Uช`ธqา๋ฬwฌŽ; CCC1dศฑ`ม1y๒dัขE ฑ|๙r!„ปw๏ …B|๑ลาzlุฐA๑gีชU…BกำฆMกกก"55Uš—ณ Q๐ํูณgข\นrยฤฤD 6Lฬ˜1CิฌYSธปปซ๕™žž.œœœ„˜0a‚Xฐ`7nœ๐๒๒ yฎs~๋”––&ชTฉ" ฤเมƒลฬ™3Eบu1cฦŒ|s)ฤห๗QฅJ•„๘๕ื_ล์ูณE๕๊ี…L&็ฯŸ—ฺๅผ>ฏหูฆ^}ํs๚ดตตcวŽำงOeส”fffb๙๒ๅโห/ฟ“&M“&M–––ขB… ";;[Zพ[ทnยุุXTฌXQt้าEฬž=[4o\ฃFRฟGB___๔์ูS„‡‡‹_~๙E+VLํ๓9'ฆ>/ฮŸ?/ E5ฤŸ)ยรรล?(๊ีซง6NA?+r>ฯ-Zคฑ>ีชU฿~๛ญ˜;wฎhำฆ ๚๋/!ฤหmh๎น€hีช•๔:วฤฤ!„4ฏG">>^$$$ˆนs็ ƒฝฮ9๒–>šTคคฅฅiL;~ธ –.]*M[ปvญฦ—ŒBš˜˜ˆ›7oJำ็อ›ง‘๗nบ โ‡~ฆฉT*ัฌY3ahh(m#‡DDD„ZL;w๎ิ˜žื็ล๔้ำ ดฝoก @ํ=+„ยำำSz๐แC@Œ3Fฃ฿ฌฌ,ัฟa`` BOOOฬ;๗1ฝ.ฏm้cแกs*R^=ค™™‰วฃB… (^ผธtจ-?{๗๎EFF คv๎Vฯž=aaamถIำ7nŒ^ฝza๘๑hบ5Œ๓=”๛บ–-[ขL™2า๓š5kยทo๐๒ฌ๛ใฯ?ฤ๒ๅหัญ[76‘‘‘‡โr๓ฟ_|๑~๘แy9yฺพ};๔๔๔0`ภต๙C‡…BใD”/_^z๎ๆๆ ต|~๕ืx๐เฺกืu๋ึAฅRแ๋ฏฟ๐nEฯž=?๘9dQขD bๅส•^^”เ๋๋ ‡๗QผxqœXํ~็ฮ(Sฆ ‚‚‚คiฦฦฦู่ณงZ_–––€]ปv!--ํใี๖ํQบtit่ะAšf``€เูณgนžz๑บชUซขnบา๓RฅJกRฅJนพท ชjีช๐๑๑‘ž{{{6lˆ/ฟRczncฝz‹ฒœำM222ฐw๏^ภฺตkaii‰ฏพ๚Jฺ๎=zOOO˜™™แภjๅ๖y‘s(zำฆMPฉTyฎOA?+๒ำปwoต็u๋ึ-pŽ๕๔๔Pพ|y`ษ’%Xฝz5Zดh~๘7n|ฏธ>6šTค<ฃG–ฮ™๛โ‹/PชT)$%%ๅ{NTŽœ‚ฌRฅJjำ Qฎ\9i~Ž?๘%K–Dtt4fฮœ kk๋วZฑbEiฮฮฮานOWฏ^…ฃFBฉRฅิcฦŒ๐๒\ญWฝ๚ผข ฟ”s~aAฮณททื(>K”(กq.Tnใๆ|ม–-[VcบJฅR{-Ž= +V ล‹GฉRฅค๓ฅr+4๓ฒt้Rฬ™3ณfอR๛~ืฎ]CฅJ• ฏฏŸg››7oยฮฮNใผลœ+ฒ_฿V^ฯ ™ฯภภ@XZZb๕๊ีาดีซWCกPภููภปm๙ๅM:v์ˆ={๖เึญ[ุธq#:v์๘VหO™2็ฯŸGูฒeQณfMŒ;๖ญ ขทY‚l๗7oD๙๒ๅ5ฺUจPAc!C†`ม‚๘โ‹/€9sๆ่ณ(/7oDลŠ5.bสkปหMAถลท๕6Ÿ4ฦ’หๅ(Wฎœฺดœm>็3๑ส•+HNN†ตตตฦถ์ูณm๗_5jืฎ=zภฦฦ!!!XณfMพE็ป066–ฮมฬ๑69ž4i&OžŒ•+Wขkืฎh฿พ=6lุ€:u๊ _ฟ~jY/์๒%๚๐รXดh XZZB&“!$$ไƒภนs็คทธธธ๗.p^•๏?˜็^ผืฟุ๒ฺk๕.3›พ๒j๛ฆ>ฎ]ป†Fกrๅส˜6mส–- CCCl฿พำงOืxอ๒+UปvmDGGc๖์ูh฿พ=J–,™g[](H>ŒŒะฒeKlุฐ๕๎฿ฟฃGโ๗฿—ฺผหv๑6|hAAA022BทnžžŽ๖ํฟี๒ํทGบuฑaร์ฝaaa˜ฑo฿พทบJ๚Uๅห—วษ“'‘™™ฉvJภซฐw๏^คคคจ“sฅ๊~ีื_%K–`฿พ}๘๗฿!„›nปศ๋=๐ก™˜˜ eห–Xพ|9š4i‚/พ๘โญ๛ฐตตE฿พ}ัทo_d้ปPฉTธ~บดx๙y@๚L,_พ<๖๎‹ฺตkฟืžไr95j„Faฺดi๘๗฿1bฤ8pเƒ}ึD~ํ๛๗s-๊333เญ๖h~์๗ว๋x่œŠ===)ฯš5Kใ [ฌX1ะ(@ahhˆ™3gช๕ณpแB$''ซ๛๏—_~มญ[ทฐdษL›6 ŽŽŽา^›‚ุธqฃฺนtงNยษ“'ฅ/Okkkิฏ_๓ๆอรปw5–ฯํถEoาธqc˜››#44/^ผP›๗พ็#ฝ‹œ๕ฟ:vrr2-Z๔Nนนนa๛๖ํ๘๗฿ัขE ๛ๆ๔–%mฺดมฃG0{๖ly9ฑ6mฺูููmฆOŸ™LVเฝmฏ๓๗๗Gษ’%ฑz๕jฌ^ฝ5kึT;๘กถ‹ผฺ๐ใ?bฬ˜15jิ[-—ญq˜ฺฺูvvvj๏ณbลŠฝืแ่ท€๛OํvR/^ผภ฿ญึNฉTjฎฎฎหๅoœศkš6mŠ{๗๎ฉ^‘••…Yณfมฬฬ ~~~๏ฒJrSz่ะ!iZjjjoฃ๔.^}/ !0{๖l QฃF^๎ฮฮฮฦoฟฆฑlVVVถๅ'OžhLS( ๖šผอญะ•ฉฉ)€฿ƒฮฮฮุณg?~,Mหฮฮฦš5k`nnฎvพ๗›|์๗ว๋ธG“Š”ๆอ›cูฒeฐดดDีชUq๘q์ปVVVjํ ๔๔๔0y๒d$''รศศHบ—ใ๐แร1n8"((—.]ย_///้"๛๗ใฏฟย˜1cPฝzu/๏Yฟ~}Œ5*ื๛๎ฝฎB… จSง๚๔้ƒ๔๔tฬ˜1VVV๘๙็Ÿฅ6sๆฬA:uเ๊๊Šž={ข\นrธ>Ž?Ž;w๎ &&ๆญ๒caa้ำงฃG๐๒๒BวŽQขD ฤฤฤ --Mซ_"นiธ1 ัขE ๔๊ี ฯž=ร฿ kk๋\‹จ‚จUซ6mฺ„ฆM›ขmถุธqฃดWฒkืฎ8x๐เ‹๊ฎ]ปb้าฅ2dN:…บu๋"55{๗๎E฿พ}Œ-Z Aƒ1bเ๎๎ŽปwcำฆM4hะ[}ผสภภญ[ทฦชUซššŠ?๘Cฃอ‡ุ.<==ผ9ศ E‹R๚บไไd้žคG๐ฒ0(^ผ8Š/ž๏oอปปปร1ฝ.%%๖๖๖hถ-aff†ฝ{๗โ๔้ำjG-<==ฑz๕j 2^^^033C‹-zผ‚๊ีซfฯž:`เภฐตตEDD„t]ฮค๛๗ฃhืฎœ‘••…eห–AOOmฺดษwŒผึ้๛๏ฟวผy๓ะฝ{wœ9sŽŽŽXทnŽ=Š3fผ๓^ื5n_~๙%พ๛๎;๔ำOะำำร?ƒRฅJแึญ[dŒWc็ฮ่ึญผฝฝฑcวlถ ฟ๚ซtHฯฯฝz๕Bhh(ขฃฃัธqcเส•+Xปv-๓Oดm6฿qฦC‡กYณfpppภƒ๐ื_มu๊ิ‘ฺ๔ณโ}˜˜˜ jีชXฝz5œQฒdIธธธภลลร† C็ฮแํํ๏ฟ&&&Xนr%ฮœ9ƒ &ไyค%7๛กแใ]เNค}OŸ>฿|๓๘โ‹/„™™™/^ข[ทnjm๛oQฎ\9กงงงqปูณg‹ส•+ acc#๚๔้#ž>}*„BฉT Qฝzu‘™™ฉึ็เมƒ…\.วฯ3ฦœa„……‰ฉSงŠฒeห ###Qทn]้jฏบvํšฺ่ตซ(]บด000eส”อ›7๋ึญ“ฺไrไ๔้ำjหๆv !„ุผyณ๐๕๕&&&ยยยBิฌYSฌ\นRš๏็็งv฿ฦบuSปMFNฏ฿พ%ฏxrปฅอๆอ›…›››066–๎+šs{กืoกาฌY3อ„ อ๛h !ฤฆM›„พพพ๘๚๋ฏฅ[U๔–%Bผผําˆ#„“““000ฅK—mถืฎ]“ฺคคคˆมƒ ;;;a`` *Vฌ(ยยยิn•W|9๋๔๚v)„{๖์„L&ทo฿ฮ5พ๗ู.r๖oขL™2B.—ฟ๑VG9mnืo’ื๚พช ท7JOO?๔“pwwๆๆๆขXฑbย]บaŽgฯž‰Ž;Šโล‹ซล“ื๖๙๊ผืooTํ^!ฎ_ฟ.š5k&LLLDฉRฅฤะกCล๗?@œ8qBj๓ํท฿Š๒ๅห cccQฒdIั Aฑw๏|s“฿: !ฤ๛๗ฅฯ9CCCแ๊๊ชv{ไ๕>๒๓๓~~~jำฮœ9#ผฝฝ…กกก๘๒ห/ลดiำ๒ผฝQn}ๆถผ๚๙—ฃ[ทnขXฑbโฺตkขqใฦยิิTุุุˆ1cฦจf.ว๙๓…งงง011ๆๆๆยีีU๓ฯ"11๑1ํทO ;;;ahh(์์์D‡ฤๅห—5๒QฯŠผnoTฌX1ถน2ุ๊ฑcยำำSj๊h็ฮยฯฯOํucLฏหo[๚dB่เxQ3cฦ <w๎Qปuั็Œ…&ั[zนฺ)/^ผ€‡‡ฒณณฅ‹Xˆˆ็hฝตึญ[ให/ฟ„Bก@rr2–/_Ž‹/ๆy๋ขํษ“'ศศศศsพžžžฦ-Ÿt{4‰ˆˆาŒ3ฐ`ม$$$ ;;UซVลฯ?ฌv+*"mช_ฟ~พฟๅเเ ์^—Xh}bฮœ9“๏/ ™˜˜ vํฺ1ขฑะ$""""ญเ ‰ˆˆˆH+Xh}ยn฿พ ccc้&๊EAdd$d2"##฿ปฏ๚๕๋รลลๅƒ*jีชฅ๖ƒDŸšD๔ู[ผx1d2d2Ž9ข1_ฒeหB&“กy๓ๆj๓r–หy+V UซVล„ –––๋xqqqษd8u๊ิ{ว>~xx{{Šsฑ>ฟ;6nจ1ุฑc;vฌึ~ึ๓—_~มœ9sp๏=ญ๔Oค ,4‰ˆ?cccฌXฑBc๚มƒq็ฮๅบW_}…eห–aูฒe˜:u*<<<0jิ(t๋ึ-ื๖ถmƒตต5ผผผ+‡bษ’%่ป๗{๕SุิซWฯŸ?Gฝz๕tJฎ๒+4วงตB388๘๋ฏฟดา?‘6๐>šDD_ำฆMฑvํZฬœ9๚๚๗๑ธbล xzzโัฃGน.็์์Œฮ;Kฯ{๗๎ŒŒ ฌ_ฟ/^ผ~;ว๖ํัคI้7ฑ฿ี๒ๅหกฏฏqท๘ RSS๓ฝ๔‚’หๅ9๛œฅฅฅมิิrนmถลาฅK1nธ๗~ˆ>๎ั$"๚:t่€วcฯž=าดŒŒ ฌ[ท;v|ซพJ—. ™LฆVฐ@RRŽ;†fอšIำVญZOOO˜››รยยฎฎฎ๘๓ฯ?฿8ฦฦแํํ 333ต้9็%ฦฦฦยฯฯฆฆฆจPกึญ[เๅZooo˜˜˜ RฅJุปwฏF฿็ฮC“&M`aa3334jิ'NœPk“sสมมƒัทo_X[[ร^šฟcวิญ[ลŠƒนน9š5k† .ผqฝr;G๓ส•+hำฆ J—. cccุ#$$ษษษo์xy+___˜˜˜ภษษ แแแmาำำ1fฬTจPFFF([ถ,~๙gคงงKmd2RSSฑdษ้t‰๎ปc์ุฑ๘้งŸNNNาผW๏cธ|๙rxzzยฤฤ%K–DHHn฿พญCฮkwๆฬิซWฆฆฆ๘๕ื_ฅ๙_}๕nผ‰่่่ญ7‘ฎฑะ$"๚แใใƒ•+WJำv์ุไไd„„„ไน‹/๐่ั#E๓ๆอแํํ)Sฆภศศ!!!Xฝz5BBBะดiSLš4 ฉฉฉhถ-RRRคe/\ธ€บu๋"&&?3F…7n ~๚8y๒คฦX}๛๖E||-fฯž-ฬออEZZšBˆvํฺ‰ !„pppอš5S[@ฎ–-[Š/^hŒีฅKแ็็'=8p ฐฐฐYYYo๓ีซW1kึ,y~~~€Xฑb…4ํโล‹€หๅโฤ‰า๔]ปv bัขEาด–-[ CCCqํฺ5iZbbข077๕๊ี“ฆๅไญN:j๑งคคˆโล‹‹ž={ชลu๏=aiiฉ1uฤ„Bœ;wNkืฎอ?)นศษลิฉSฅi้้้BกPkkk‘‘‘!„bูฒeB.—‹ร‡ซ-.ˆฃGJำŠ+&บu๋ฆ1VXX˜ nธก6=!!A่้้‰‰'ชM‹‹๚๚๚jำsโ ฯs EŸ>}ธ๎D…๗hฝข}๛๖x9ถnŠ””lบ๕‡อƒƒƒฑgฯ์ูณ›6mย๐แรฑs็Nt์ุโ•฿ฤPฉTุนsงฺa๓โล‹#55Uํp}A<~PขD‰\็›™™ฉํ…ญTฉŠ/Ž*Uชภ[šž๓๗๕๋ืูููุฝ{7Zถl‰rๅสIํlmmัฑcG9rJฅRmฌž={BOOOzพgฯ$%%กC‡าžGAOO8pเภ[ญซฅฅ%€—{ƒ๓บ’??๚๚๚่ีซ—๔ะะฝz๕ยƒpๆฬภฺตkQฅJTฎ\Y-ๆ† ภ[วช๕๋ืCฅRก}๛๖j}—.]+Vิ่ศศ฿|๓Mž•(Q"ฯ๓…‰ ^ DD๔ŠRฅJม฿฿+Vฌ@ZZฒณณัถm|—ฑทท‡ฟฟฟ๔<((VVV๘๑วฑu๋V้bำงOใแร‡j…f฿พ}ฑfอ4iาeส”Aใฦัพ}{(^‘วปูk\,bii‰ฒeหjL ”ร‡‘––†J•*i๔YฅJจT*พ}ีชU“ฆ;99ฉตปrๅ HEฺ๋,,,๒[% NNN2dฆM›†ˆˆิญ[AAA่นณ~์์์4.Prvv$$$ VญZธrๅ ๗_้P๗๋&šDDฏiีชz๕๊…'N`๕๊ี๏ิGVVเูณgาดmถกiำฆm ัขE ดhั*• }๛๖ลผy๓0jิ(TจP!ืฟ๒K˜˜˜เฦ๏_^J•*SSS\บtIcล‹!—ห฿Xt•/_ภห"๚ี=ฝ๏หีีฎฎฎ9r$Ž;†ฺตk#<<&LศwนฤฤD.]พ|ภห ภrbމ‰AฃFธท0ฏ๙yM/_พ<„prr’๖คพซ๛จRฅส{๕C๔ฑ๐M"ขื˜™™a๎น;v์;฿ฃrห–-wwwภ๛๗q๖์Yตรๆภk™C.—รออ ิnซ๓:ิจQQQQ๏_^๔๔๔ะธqclฺดIํ๊๐๛๗๏cลŠจSงฮ}ภยยฟ;2335ๆ?|๘๐ญbR*•Rแžรีีrน<฿ๅศสสยผy๓ค็˜7oJ•*%]ลพ}{๗฿๘๛๏ฟ5–9RSSฅ็ลŠห๕j๗œB๖๕yญ[ท†žžฦงฑ็Xกฑ ไ'็œR__฿/CคKฃID”‹ผ~ี'7—/_ฦ๒ๅหผผน๖‰'ฐdษTจP]บt๐๒ฐนฑฑฑฺญj Gx๒ไ 6l{{{ผyณfอ‚Bกxใ^ซเเ`Œ1Jฅ๒ญฯ{ฬฯ„ ฐgฯิฉS}๛๖…พพ>ๆอ›‡๔๔tL™2ๅห[XX`๎น่าฅ ชWฏސ”*U ทnยถmPปvmฬž=ปภ๑์฿ฟ๛๗Gปvํเ์์Œฌฌ,,[ถ zzzhำฆอ—ทณณรไษ“‘gggฌ^ฝััั˜?พt~d—.]ฐfอ๔๎@ํฺต‘‹/bอš5ุตkjิจเๅ-†๖๎‹iำฆมฮฮNNN๐๖๖–Šึ#F $$hัขส—/ &`๘๐แHHH@ห–-annŽ7n`ร† ๘๛๏๑ใ?({๖์ม—_~ ็Hงtwม;Qแ๐๊ํ๒S้้้ {{{๑๗฿‹๛๗๏Kํฺถm+š6mชั็บu๋Dใฦ…ตตต044_~๙ฅ่ีซ—ธ{๗๎ใพพะืืห–-S›๎็็'ชUซV ๘sึก_ฟ~jำฮž=+„™™™055 4วŽSk๓ฆผ8p@KKKall,ส—//บw๏.ขขข๒]ฏืoot๚u๑ํท฿Š๒ๅห cccQฒdIั Aฑw๏|๛โr%|||„ฑฑฑpppณgฯึh›‘‘!&Ož,ชUซ&ŒŒŒD‰%„งงง7nœHNN–ฺ]ผxQิซWO˜˜˜jท:๚ํท฿D™2e„\.ืธีั๗?QงNQฌX1QฌX1Qนreัฏ_?q้า%xs“-lmmลศ‘#฿ธD……Lˆ๗8œˆˆ(++ VVV E฿พ}?h฿฿}๗._พŒร‡ะ~ฉ๐ูธq#:v์ˆkืฎมึึVืแ M""-{๐เ๚๋/๔๊ี๋ƒทn‚ณณ3๖ํ‡ฺตkะพฉp๑๑๑Aบu t๚QaมB“ˆˆˆˆด‚W‘Vฐะ$""""ญ`กIDDDDZมB“ˆˆˆˆด‚7l'RฉTHLL„นน๙๖ˆˆˆ !RRR`ggน<๏–,4Iง฿๘ปษDDDT8พ}๖๖๖yฮgกI:ennธqใJ–,ฉใht#33ปw๏FใฦฅŸร๛0ฬภฬภŸF”J%ส–-+}็……&้Tฮแrss๓๚[อŸ’ฬฬL˜ššยยยขะ~ hsภฬภฬ๐iๅเMงฝ๑b """"า šDDDDค,4‰ˆˆˆH+Xh‘Vฐะ$""""ญ`กIDDDDZมB“ˆˆˆˆด‚…&i M""""า šDDDDค,4‰ˆˆˆH+Xh‘Vฐะ$""""ญ`กIDDDDZ!B]AŸ/ฅR KKKxŽ•ก™ฎรั Cนภp—g=o† •Lืแ่sภฬภฬ๐แrpvTร•บœ๏๏ไไdXXXไูŽ{4‰ˆˆˆH+Xh‘Vฐะ$""""ญ`กIDDDDZมB“ˆˆˆˆด‚…&i M""""า šDDDDค,4‰ˆˆˆH+Xh‘Vฐะ|ƒถmขVญZuฬ‹/ข~๚ผํุผy3fฮœ ธ}๛6เแแš5k"66๖ƒGDDDE อ|์ูณzzzoฝ\vvถข๙8ž>}  ย€SงNE็ฮq๎9Œ1ใฦ$''CกณX‰ˆˆจpcก๙๗฿puu…ปป;ฦŒƒฬฬL๛๏9rd–ŒŒ„ฟฟ?แ๏๏gฯžกK—.๐๒๒‚——Nœ8ุธq#ผฝฝกP(Œgฯž._พŒ5jภ๓็ฯฯwฌผฺๆ5fbb"š5kwwwxzzโ๖ํjeeea๚๕hธ1๚๗๏Xผx1† &ตQ*•าฟถถถ€ร‡ฃJ•*˜4i],4๑rodHH,,,ฯŸ?ว๎ปัญ[7ถฝ{๗F๏ฝ5jิภ‚ คyu๋ึE้าฅผ<์>fฬ( 4o<@VVnบธบบbผyˆDGG#((ะกC‡|ใอซm^c?~\Z˜˜˜เิฉSprrBZZขขข๐ฯ?ไy.๊Š+0x๐`พ}กกก4h4ฯฦฦร† ร… ะฉS'ดkื?๐Cžฑ>ษษษาใ๕ฝซDDDTt่๋:€ย(::๑๑๑prrBVV>|ˆ   lผ9฿ๅLMMฅฟ…ุฑc์์์ิฺ 0ใฦC๚๕ฑn:lบ “ษค6ฏ›ผฺๆ5fn0|ฬŸ?mฺดAฯž=ัฒeKjด]ธp!Ž9hบตดG3วนs็๐๗฿c๏ฝ๘๎ป๏คB<7FFF022zc|DDD๔้ใM 6ฤชUซค๓}||p๗๎]$$$เศ‘#๐๐๐xc‘๙:ฬ™3GzเฮqTฉTXถl™4฿]*:Wฏ^o฿yตอkฬฺตkcษ’%€/^เ๙๓็066ฦท฿~‹'N ,, ๛๗๏Gๅส•1u๊T๑์ํํฅCโ๛๖ํƒณณ3เ์ูณ๐๒๒ยะกCแ็็‡๓็ฯcาคIptt,PŽˆˆˆจhcก ภลล๛๗‡ฏฏ/ฅ๚ไ&ฟs4_5z๔h$&&ยออ UซV•ฑ5 Mš4ทท7œœœค๖3fฬภุฑcแ๎๎ฦs4๓j›ื˜๙'ึฌY777ิฉS?V๋OกP <<ฑฑฑP(ใ………aาคIpwwวฤ‰1mฺ4/๗เFDD`๘๚๋ฏsJDDDŸ/™เiH‡”J%,--แ9rT†fบG' ๅร]ž!๔ผ2T๙Ÿ6QT1ฬภฬภ.gG5€Qฉห๙NNN–ฎqษ ๗h‘Vฐะ,ฤ-Z…Bก๖ศ๏ฐ>Qaยซฮ ฑoพ๙฿|๓ฎร """z'ฃIDDDDZมB“ˆˆˆˆด‚…&i M""""า šDDDDคผa;้Tฮ _=z+++]‡ฃ™™™ุพ};š6m ]‡ฃฬs0s0ภง‘ฐˆˆˆˆtŠ…&ioุN…ยˆW o๚@ืa่„ฒัPธ๕ฒกง๋pt‚9`ๆ`€ย—ƒูญช่:„O๗h‘Vฐะ$""""ญ`กIDDDDZมB“ˆˆˆˆด‚…&i M""""า šDDDDค,4‰ˆˆˆH+Xh‘Vฐะ,ฺถm‹Zตjฝ๓๒ Xทn=วŽ+PŸM›6EFF`ฦŒจVญชVญŠŸ๙ใ$""ขฯ Mณg๔๔๏'ถ ZhŽ?พพพyฮฯฬฬDjj*`๛๖ํ044ฤ“'O0{๖lœ={qqq8pเโโโOŸ>}ฏธ‰ˆˆจhcก๙๗฿puu…ปป;ฦŒƒฬฬL๛๏9rd–W*•hุฐ!ชWฏ9r0bฤ์ฺต …x๘๐!š4iWWWเ๛€๎ปc็ฮ&$$เื_Eๅส•q๙๒e€ฃฃ#^ผx!ฒฒฒžžŽŒŒ จT*XYYZถl‰ถmb๏ฝB|ˆQยB๓#‰ลœ9sp๔่Qฤฤฤ`เภ˜6mบu๋sssตถแแแDEEกGlฺด gฯžล–-[0t่Pภฤ‰€่่ht๊ิ cฦŒมW_}…ธธ8cฤˆ๑dggc๓ๆอhฺด)Zทn2eสเ์ูณ๐๐๐Pkgee…!C† lูฒฐตตE›6m`ggˆŒŒDฏ^ฝ0o<ธธธเ?ภฃG๒อCzz:”JฅฺƒˆˆˆŠ&}]๐นˆŒŒDHH,,,ฯŸ?ว๎ปฑw๏^ผySญm๏ฝฅฟkิจ „๘๙็Ÿqไศ่้้แ๊ีซนŽu์ุ1Œ;ะนsgฬš5KฃMห–-qแย,]บu๊ิษ3๎งOŸbืฎ]ธu๋ไr95j„เเ`TซV 2™ _}๕พ๚๊+<|๘ƒ†ฝฝ=ฎ_ฟ.ฃฏ ลธqใ๒Nฃฉ#ัััˆ‡““๊ิฉƒs็ฮ!(((฿e"""‘‘่่hDGGฟื๘กกก ฤท฿~‹_~๙Wฎ\ษตฝ{QกBXZZย 4ภ™3gค๙ฯž=รย… „{๗๎aูฒeฐฑฑษsแร‡#99Yzพ}๛ฝึƒˆˆˆ /šIร† ฑjี*้Pฑ๎ฝ‹„„9rุผysพ}(•JX[[COO๋ึญ“.177GJJŠิฮืืซWฏฌXฑ"ื=–...๘๋ฏฟp๎9TฌX;vDƒ  ึฮว—ฮั<|๘0œ?๘#p๑โE,[ถ {๗๎Eปvํ๒ฝธษศศj"""*šXh~$...่฿ฟ?|}}แ๎๎Ž™3gๆู6ฏs4;v์ˆ๛๗รออ ‡’๖บนนแ๙๓็าล@cวŽล๖ํแๆๆ†๕๋ืcย„ yŽUฌX1๔่ังOŸฦ}}๕ณ)|||ะฐaC( ( 4lุPบ“ฟฟ?.^ผˆฐฐ0TจPแฝ๒CDDDEL๐raา!ฅR KKK๔Z~๚ฆ–บG'๔†๒kุฏ*lผ฿ญฎ>Uฬs0sพฬnUๅฃ™™™‰ํทฃiำฆ000๘่ใDฮ๗wrrrพG'นG“ˆˆˆˆด‚…&i M""""า šDDDDค,4‰ˆˆˆH+Xh‘Vฐะ$""""ญ`กIDDDDZกๆ&Dฺ71ฐ"ฌฌฌt†Nผผ1๏5ัผRกฝ1ฏถ1ฬภฬภ5ฃIDDDDZมB“ˆˆˆˆด‚…&iฯัคBauฬ01OีuบกสFIหฯไzบŽF7˜ๆ`ๆ๘จ9๘ฦ๋Kญ๖OฃIDDDDZยB“ˆˆˆˆด‚…&i M""""า šDDDDค,4‰ˆˆˆH+Xh‘Vฐะ$""""ญ`กIDDDDZมBS‡ฺถm‹Zตjฝ๓๒ XทnŒ่$&&ขkืฎ€ฌฌ,t้าnnnpqqม๊ีซต2&-,4udฯž=ะำ{ฟŸึาFก๙๔้S€–.] ุบu+T*bccฑ~ <‘‘ดดด:>,4?‚ฟฎฎฎpwwว˜1c™™‰฿#GŽ,ะ๒Jฅ 6D๕๊ีแแแ#GŽFŒ]ปvAกP "">D“&Mเ๊๊Š€€ฟOŸ>E•*U๐฿!;;ตjียษ“'5ฦ8qโบw๏Ž5jxYฤพบท555*• ฯž=ƒ €—Eฉ‹‹  €๘๘๘ญKzz:”JฅฺƒˆˆˆŠ&šZ‹9sๆเ่ัฃˆ‰‰มภ1mฺ4t๋ึ ๆๆๆjmรรรˆŠŠB=&&&ุดiฮž=‹-[ถ`่ะก€‰'" ััั่ิฉฦŒƒฏพ๚ qqqฦˆ#PขD ๛๏่ป7ฆNŠ:u๊ภ’’‚๐๐pxzzbธqฦฅK—4ึกy๓ๆ066† ฆM›ฐฑฑม… PฃF ๔๊ี ~~~Xฑbาำำ๓ฬGhh(,--ฅGูฒe฿?ษDDDT(้๋:€ข.22!!!ฐฐฐ<ปw๏ฦฝ{q๓ๆMตถฝ{๗–ฎQฃ,XBเ็Ÿฦ‘#G งง‡ซWฏๆ:ึฑcว0v์X@็ฮ1kึ,@ซVญฐbล ,\ธัััR{;;;๘๘๘`๚๕pppศsNž< KKK$&&โ๊ีซF\\๔๕๕abb‚ฎ]ปขkืฎ8<บvํŠะะPฤลลๅฺื๐แร1dศ้นRฉdฑIDDTDqๆG๘๘x899กN:8w๎‚‚‚๒]&""ˆŽŽV+ *337n€ฉฉฉา๔ตkืขXฑb ยŒ3๐๘๑ใ\—_ฑb!—หแ์์ $&&J๓๛๏?๖ohืฎ\\\0”J%ฌญญกงง‡u๋ึIลขนน9RRRคvพพพาแ+Vฌ@:uผ<\€‘#Gbภ€R๛ภภ@lุฐ;v์€Rฉ„:v์จ1พฝฝ="##ผผ=11ฅK—Frr2‚‚‚333;v K—.…ฯป'ŒˆˆˆŠ šZๆโโ‚๛รืื๎๎๎˜9sfžm๓:GณcวŽุฟ?p่ะ!้b777<\บh์ุฑุพ};ฐ~zL˜0.\ภ๗?Œ=]ปvลำงOฑu๋Vตqํ์์0z๔h๛๏ฟนš๚๕ร7ค‹Œ๓O† ‚๓็ฯc๐เม(Qขฤษ 2!„ะu๔๙R*•ฐดดฤœ}101/ฎ๋ptC•’๗b๑คด ฟ[^}ฒ˜ๆ`ๆ๘จ9๘ฦ๋Kญ๖ฎ233ฑ}๛v4mฺบ'W9฿฿ษษษ๙žว=šDDDDค,4‰ˆˆˆH+Xh‘Vฐะ$""""ญ`กIDDDDZมB“ˆˆˆˆด‚…&i M""""า }]@_ป—•••ฎระ‰—7ๆE็๊๖…๖ฦผฺฦ0s0sPิp&i M""""า :งBแL‚ๆO?ฯ฿๕UegN]O†\๏๓|K2ฬภฬP๘rเSกธฎC๘คq&i M""""า šDDDDค,4‰ˆˆˆH+Xh‘Vฐะ$""""ญ`กIDDDDZมB“ˆˆˆˆด‚…&i M""""าŠฯถะlถ-jีชU ถํท‡ปป;"""ดU๎๊ืฏ‹/~ิ1GcวŽ๖๏฿ธปปฃYณfHII๙จฑัง้ณ,4๗์ู=ฝ‚ฎ๖ปwq๙๒eฤฤฤ SงNj๓ฒณณต๕ถ1>}๚0~x๘๚๚† ‚5kึ &&ฮฮฮXผxฑZ["""ข๙B๓๏ฟ†ซซ+1fฬdffโ๗฿วศ‘# ด|‹-pๅส( ฤลลมััร‡‡Bกภ๑ใว1aยธธธภออ [ถlDFFขqใฦhฺด)މ'ยออ Mš4AVVVžใmผ …๎๎๎่ัฃ‡4}ัขE๐๔๔„‡‡n฿พ ุธq#ผฝฝกP(Œgฯžบw๏Žพ}๛ยหห 3fฬภŒ3Pนreธปปcะ Ac&''c๖์ูpwwว๊ีซฅ>v๎)ตQ*•B %%ถถถ€ฐฐ0ิฎ]K—.ล‹/ ”ฯ๔๔t(•JตM๚บ@›bcc1gฮ=zx๒ไ ฆM›†nบม\ญmxx8 w๏ˆŠŠBxx8,X€u๋ึ!$$'Nœฺ:::"::งNยๆอ›qๆฬ>>hะ 4๖ฟ‹ฌฌ,TจPs็ฮEll,Zทn}๛๖! @#๛๗๏cศ!8|๘0lmm๑ไษiž™™ฮœ9ƒฉSงJ…ซŸŸZถl ˜2e .\ˆ’’’p๊ิ)ศd2”*U ทn‚‰‰ ’““ฅ>sึ๓ะกCh฿พ=6mฺGGGธfฯž€€ภออ mฺด๛๏ธpแๆฯŸ฿~๛ -Zด@ฏ^ฝPฉRฅ<_“ะะPŒ7.ฟ—ˆˆˆŠˆ"ฝG322!!!ฐฐฐ<ปw๏Fทn4ฺ๖๎ฝ{๗ิจQ ,ศณ฿vํฺŽ;†ถmยศศถถถจ^ฝ:.\ธ๐๕๕E‰%PชT)XZZขy๓ๆบu+ื~Ož< iaษ’%ฅyAAA$$$nบธบบbผyˆ—ฺทm2™ เ้้‰ฮ;cีชU022L:~~~จSงโใใ1aย„\‹L˜9s&"##‘˜˜ฬŸ?_šWญZ5๙็Ÿˆ‹‹C้าฅแโโ‚๏yๆn๘๐แHNN–9{g‰ˆˆจ่)า…ๆ๋ขฃฃ'''ิฉS็ฮ“ ธทajj๚ฦ6†††า฿rน\z.—ห฿้ฮœ๑ีๅ €‘#G"..“'OFzzzฎ1nถ }๚๔มมƒ่น3†Žษ“'ใoฟลแร‡s๗แร‡ธt้\\\ “ษะชU+œ>> ฤ๘๑ใแ์์Œ+V ++ iii8{๖,€—Eๆฤ‰ฑeหdffbฦŒˆŒŒ„ฑฑ1๚๕๋‡๕๋ืให/ฟฤž={py|8† ข–ซฒeหๆูžˆˆˆ>]๏|1Ptt4โใใแไไ„:u๊เนsR๗6LMM฿ุฦะะP๚[.—Kฯๅr9ฒณณ฿zฬœ=rฏ.?`ภŒ9qqq˜}๚เเมƒ c !ฐpแBDGG#::ทn‚ƒƒCž}ุ#;;๛ฏด|ppฐดฅK—๐๓ฯ?€T ฟ๗๙๓QญZ5ดkื&Lภ—๋X6l€ŒŒŒ`ccwww้?๐๘๑cฬ˜1AAA(Vฌึฎ]๛ฦ๕ทฐฐP{QัTเBณaร†Xตj•tN๎ฝ‹„„9rุผy๓;โ๋๋‹ 6 33๗๎รนs็PญZตw๎ฏVญZุปw/๎ฝ j‡ฮsฃT*akk •J…eห–ๅฺFฅRแฮ;๐๗๗วิฉSq๙๒ๅ\YXXภาา$''K็Lๆฦ฿฿s็ฮ•ฺDGGKำsNCศสส’๖Z[[cใฦ๘๛๏qแยิชU ๛๖ํร;wผ,๎นฃ–ำฤฤD>|XำววK—.ลัฃGQฌX1 ((Hใt{{{:t*• )))8{๖,ส—/ุ่ฑ#||| T*ฑcวlุฐแŠo"""*š |่ลล๛๗‡ฏฏ/๔๔๔ะชU+Œ;6ืถyฃ™Ÿš5kขYณf๐๐๐€\.วฬ™3๓=ื๏Mฌญญ1}๚tฉ๐๑๖๖ฦ๙๓๓l?jิ(้pํฺต‘””คั&;;;vDJJ „?~|ž-]บ={๖ฤ Aƒ`jjš๏m…z๕๊…๋ืฏร*• •*Uย๚๕๋1jิ(๔๊ี ฎฎฎะืืWหก““VฌXlถ sๆฬApp0233a``€ฟ5kึDฃFเโโGGว\oAUฒdI <ƒฮ5ฦvํฺaืฎ]puu <eส”๐ฒะ\พ|9ไrŽ•ˆˆˆ4ษ„BืAะ็KฉTยาา๑mญP\–ก๋pt"[฿gพžซ{B/๋…ฎรั ๆ€9tŸ5บฟ Fff&ถo฿ŽฆM›J‘~n˜ƒO#9฿฿ษษษ๙žว]QDDDDค๏}ร๖ย UซVธqใ†ฺด7ยััQ๋cOœ8Qใ˜‘#GขmถZ›ˆˆˆจ0+…ๆ† t6๖ˆ#0bฤODDDTX๑ะ9i M""""า šDDDDค,4‰ˆˆˆH+Xh‘V‰ซฮ้ำg~ VVVบC'233ํaณไฟB{c^mc˜€9 *ŠธG“ˆˆˆˆด‚…&iSก š฿*#•ฎระ •ฬ(7ชูP‰ฯ๓๗™ๆ`€O3๒!‡ubฃIDDDDZมB“ˆˆˆˆด‚…&i M""""า šDDDDค,4‰ˆˆˆH+Xh‘Vฐะ$""""ญ`กIDDDDZมB“ˆˆˆˆดขศšIIIXฐ`Až๓K—.ฦ><ˆjีชกnบ2ด‹ŒŒDHHศG311]ปvdeeกK—.pssƒ‹‹ Vฏ^Qc!""ขOำg_hฤŠ+0qโD>ฌ{ฎููู๏ี๏ว๐ถ1>}๚`gg‡ฅK—ถn •J…ุุX์฿ฟƒddd --ํรLDDDEF‘+4Qปvm( ธนนa่ะกˆ‹‹ƒBก@XXRSSัชU+TญZฝ{๗~cK—.ลฺตk1t่P๔๋ื‹/Fถmแ็็‡.]บเ๊ีซจ[ท.ะพ}{คฆฆ๊ืฏกC‡ยรร^^^ˆŠŠBฃFPฎ\9lถ-ฯ๑”J%:v์777( DEExYถhั+Vฤฤ‰ฅ๖อ›7‡งง'\]]ฑ~z@BB ฺทoชUซjไไโล‹ใž8qปwG5ค>jีช%อOMM…Jฅยณgฯ`cc#ลไโโ‚ >>น€๔๔t(•JตMEฎะ\นr%3gฮ`ย„ puuEtt4~๚้'ฬ™3NNNˆG“&Mp}iY…B!ฃGDEEกkืฎ ยœ9s0gฮ@ll,ถnŠ+V`ภ€"Cืแ่sภฬ๐iๆ@>ไ๐›ฝ…ฬฬLl฿พM›6…มํ๛S๑)ไ ็๛;999฿ำเŠM""""*ŠU็ŸŠ]ปvฉ]กผ !!ตjีา่3++ ๋ืฏGใฦัฟ/ ืaร†Im”Jฅ๔ฏญญ-เ๐แรจRฅ &Mš„ผ{ขˆˆˆจHbกฉE+Wฎ„ฟฟ?ขฃฃqๆฬL˜0ฎฎฎˆŽŽฦO?„9sๆภษษ ๑๑๑hาค ๎฿ฟ/-ซP(คฟ{๔่จจ(@๛๖ํq๚๔iฤฦฦยฤฤ[ถlAซVญPฃF lุฐ‡ฦ;w0qโD9rววดiำ ฿ํท1z๔hTญZ[ทnล๘๑ใกัnุฐaXดhส–-‹#F`ิจQ€ๆอ›ใเมƒ€๚๕๋#$$‘‘‘๙ๆ$==JฅRํADDDE M-๒๒๒ยฒeห0n8\นr&&&j๓;†@pp0LMMฅyัััา฿ ,@5111จ]ป6\]]ฑeหฤววkŒ…ฦฃx๑โ077GำฆMq๒ไIต6งN‚““าาา…๙'ืฝฐbล <ทo฿Fhh( $อณฑฑมฐaรpแยt๊ิ ํฺตร?gNBCCaii)=ส–-›g["""๚ดฑะิขz๕๊แะกCฐถถF›6mฐo฿>62™์ญ๚์ูณ'/^Œธธ8 8้้้๏›››ๆฯŸ#GŽ M›6Xณf 222rmปpแBดnะบukข๕นs่ืฏ†Š๏พ๛C‡อsแร‡#99Yzพ}๛โ'""ขย…ฆผyถถถ่ำงBBB””„””iพฏฏ/Vฏ^ ุบu+าาาุgjj*J•*…/^Hห€นนนิท——๖ํฅR‰gฯžaวŽ๐๖๖V๋วุุ฿~๛-Nœ8ฐฐ0์฿ฟ•+WฦิฉS5ฦดทท—‰๏ทฮฮฮ€ณgฯยหห C‡…ŸŸฮŸ?I“&มัั1ฯ๘ŒŒ`aaก๖ ""ขขI_ืe‘‘‘˜2e aee…UซV!** nnn่าฅ ๚๕๋‡N:กZตjจWฏlllคe …t๘ผG่ป7jิจ#F z๕๊ฐฑฑ‡‡‡ิพ{๗๎่าฅ J•*…ร‡ใ—_~ฏฏ/`๐เมpttฬ๕<อœฑยรร๑์ู3ฝ•†ž={b์ุฑ055ลย… ฆฆฆˆˆˆ O"""ขWษ๏OC:คT*aii‰ห{มส๔๓O&๔ฐSช0@ถฎรั‰ขšyซูn›™™‰ํทฃiำฆ000ะbT…sภฬ๐iไ ็๛;999฿ฃ“า‰ˆˆˆจ0aกIDDDDZมB“ˆˆˆˆด‚…&i M""""า šDDDDค,4‰ˆˆˆH+Xh‘Vฐะ$""""ญ`ก๙%%%aม‚yฮ/]บ๔;๕ปx๑b)ฃ๙žผผผฐlู2Œ7Wฎ\‰‰‰ฺcวŽ!$$ SSSi^Na ,@5`ii 333๔่ั›7o†™™Yฎใš››# ืyวŽCวŽ!“ษเ๊๊ SSSฟ_ญอิฉSแ็็‡:u๊ >>&Lศตศ€™3g"22‰‰‰pppภ๙๓ฅyีชUรŸ‰ธธ8”.]...๘฿—gพBCCaii)=ส–-›g["""๚ดฑะ|O๕๊ีรกC‡`mm6mฺ`฿พ}md2Y๛ำืืGTTZถl‰ˆˆ|๗wนถ{ต`};wฦ๐แร1y๒d|๛ํท8|๘pฎํ>|ˆK—.มลล2™ ญZตยษ“'ฅ๙*• ทoG‡?๘_}๕Užใ>ษษษาใ๖ํ๏ตDDDTxฑะ|O7o„ญญ-๚๔้ƒ$%%ฉ]•ํ๋๋+๗ธu๋Vคฅฅๅ฿ณgฯœœŒ   L™2Eฺ๋innž๏ีrน*•JsํฺตBเย… x9lllิฺุุ`ไศ‘ธpแBBB์ฝ[ญ]‰%p}ฉ ทoœห—/GฅJ•!C† &&„……EžqมยยBํADDDEฯั|O‘‘‘˜2e aee…UซV!** nnn่าฅ ๚๕๋‡N:กZตjจWฏžZม—9šeส”APP222 “ษ๐oฟxyqN—.]PชTฉ\๗>v๎ฎฎฎhธ1ฆNŠC‡มีี†††XดhQž๑หๅr4mฺM›6ล;w4ฑ๋๋๋cๆฬ™ „\.GลŠ1v์X€ฃฃ#Nœ8++ซ๗ฬ"E2!„ะu๔๙R*•ฐดดฤƒC๓`ea๒ๆŠ Lฐ๓–ฟTยเ3=ฦPTs w๏Rเถ™™™ุพ};š6m -FUx1ฬภŸFrพฟ“““๓=:Y„>า‰ˆˆˆจ0aกIDDDDZมB“ˆˆˆˆด‚…&i M""""า šDDDDค,4‰ˆˆˆH+Xh‘V๐—จPWm๙g๚ C๒ฬLเึvศ]B /ค7ๆี6ๆ€ˆจhโM""""า šDDDDค,4‰ˆˆˆH+xŽ& ๋{Ceข๋(ิํผVื!}าธG“ˆˆˆˆด‚…&i M""""า šDDDDค,4‰ˆˆˆH+Xh‘Vฐะ$""""ญ`กIDDDDZมB“ˆˆˆˆด‚…ๆgไเมƒจVญ๊ึญ๛ฦถ›7oฦฬ™3ทo฿†ŸŸ<<}๑๑๑RAAA$$$hŒq๊ิ)899!-- QQQ๘็ŸPซVญ\ใYฑbŒทo#44ƒ ’ๆูุุ`ุฐaธpแ:u๊„vํฺแ‡~ศs†Žไไd้q๛๖ํทM}"XhB๕๊ีรกC‡`mm6mฺไzไ‹/0dศlถ ฑฑฑhืฎาำำฅ๙FFFน\Ž์์lๅ0|9rmฺดมš5k‘‘‘k< .D๋ึญญ[ทฦษ“'ีๆŸ;w๚๕ระกC๑w฿a่ะกyฎ›‘‘,,,ิDDDT4ฑะ,„nผ [[[๔้ำ!!!HIIมชUซค๓Ÿ† xyy!** 5Bนrๅฐmถภัั/^ผ,^ผร† ๔ำOจ\น2y๖๑ช„„๚๋ฏจ\นฒดn9c!••…๔๔tddd@ฅRมสส ะฒeKดm{๗๎…ข@ฏGzz:”JฅฺƒˆˆˆŠฆ"_hฎ\นˆŽŽฦ™3gpเภต็˜8q"\]]Ÿ~๚ ‹ญ[ทbลŠBCC๑ื_แoฟEซVญะฃGTฌXQฃฝ{QกBXZZ4h€3gฮ Zตj€gฯža๕๊ีXฐ`Š+†eห–มฦฦ&ฯ๕322‚‘‘Qพ9 ""ขขกศ:ฟy๓&lmmังO„„„เศ‘#jฯใโโ`nnŽ”””<๛จ[ทฎtฑJฅ’.†IMMEฉRฅ๐โล ฌ^ฝ๚ƒฦmii‰%J`๗๎^^จ๓๏ฟ •J…ญ[ทxY๐%''#((SฆLAtttพ}ธธธเฏฟยนs็PฑbEt์ุ 4@BB‚Z๖๖๖8~ธtŽๆแร‡แ์์ ๘๑วฅ๓\—-[†ฝ{๗ข]ปvา_"""๚ผ๙B322nnn๐๐๐ภแร‡แ่่จ๖ผs็ฮฐฒฒ‚››ค‹h^5kึ,์ุฑ๎๎๎pqq‘.่1bชWฏŽ hœ๘!DDD ,, ๎๎๎P(8y๒$`ไศ‘ฺ่ต+|}}ฅCิ)))hึฌ,‹™W9Š+†=zเ๔้ำ๘ใ? ฏฏพ“วว 6„Bก€Bก@ร† QซV-€ฟฟ?.^ผˆฐฐ0TจPแƒฏ?}ฺdข — iRฉ„ฅฅ%ํ}sํŸษV{ฒึวx[™™™ุพ};š6m ]‡ฃฬs0s0ภง‘ƒœ๏๏ไไdXXXไูฎศ๏ั$""""(๒Fปvํย/ฟข6-00“&MาQDDDDD M@@@€ฎร """า*:'""""ญ`กIDDDDZมB“ˆˆˆˆด‚…&i M""""า ^uN…ยHฏ_aeeฅ๋0ˆˆˆ่โM""""า šDDDDค,4ฉPXw}%–^^ ๋0ˆˆˆ่bกIDDDDZมB“ˆˆˆˆด‚…&i M""""า šDDDDค,4‰ˆˆˆH+Xh‘Vฐะ$""""ญ`กIDDDDZมBณHJJย‚…๋Wq6oŒ™3gn฿พ ???xxx fอšˆีqtDDD๔)`กYไWhfggิXž>}  ย€SงNE็ฮq๎9Œ1ใฦ$''C๑Qใ#""ขO M-KLLDํฺตกP(เๆๆ†cวŽฉ=ฟx๑"FŒธธ8( „……a๑โลhถ-ะฅKฟมมมจQฃ๊ึญ‹ห—/ยรรแๅๅ777|๓อ7PฉT€๚๕๋c่ะก๐๐๐€——ขขขะจQ#”+Wถmำˆ1++ ๋ืฏGใฦัฟภโล‹1lุ0ฉRฉ”ตตต>|UชTมคI“๐เมญๆ‘ˆˆˆ>=,4ตlๅส•๐๗๗Gtt4ฮœ9ƒจ=wppภฤ‰แ๊๊Š่่h๔ำO€ุุXlบ+Vฌภเมƒ1fฬDEEaฺดi2d }๛๖8}๚4bccabb‚-[ถHใZYYแนsจSง๚๗๏mถaใฦ˜0a‚ิๆ๖ํ=z4ชVญŠญ[ทb๘๑ˆˆˆะX‡aร†aัขE([ถ,FŒQฃFš7oŽƒxY†„„ 222฿|คงงCฉTช=ˆˆˆจhาืuE——บw๏น\ŽvํฺกnบjฯซVญš๋r077์฿ฟ๑๑๑า<===@LL FŽ ฅR‰คค$”-[มมม^เ๊๊ ™Lcccธธธเึญ[€SงNมืืƒ BTT,,,๒\‡œb๗ป๏พCDD „•+Wlll0lุ0๒ห/ุบu+ฺตk‡ฬš5+ืพBCCฅC๏DDDTดqฆ–ีซW‡‚ตต5ฺดiƒฬฬLต็๛๖ํหu9SSS้o™L†ณgฯ"::Zฺ ={๖ฤโล‹‡"==]Zฦะะ —หีฮ9็ำออ ๓็ฯว‘#GะฆMฌYณนฦฒpแBดnะบukœ†Žไไd้q๛๖ํ|๓GDDDŸ.šZv๓ๆMฺฺุขOŸ> ม‘#Gิžวลลม)))y๖Qทn]้b!•J…ธธ8@jj*J•*…/^`๕๊ีo—ฑฑ1พ๖[œ8qaaaุฟ?*WฎŒฉSงjดตทท—‰๏ทฮฮฮ€ณgฯยหห C‡…ŸŸฮŸ?I“&มัั1ฯqŒŒ`aaก๖ ""ขข‰‡ฮต,22SฆLกก!ฌฌฌะฅKธนนIฯWญZ+++ธนนมออ ]บtAฉRฅิ๚˜5kz๗๎9sๆ 33]ปv…ซซ+FŒ๊ีซรฦฦ๏ฃBก@xx8ž={ฆฑทยยยะณgOŒ;ฆฆฆXธp!€—{]#""คย“ˆˆˆ่U,4ตฌ[ทn่ึญ›ฦดืๅœ๓˜lุฐAczฅซฤ_๕๊9ปwW›w๏ฝ<ว133CฃF4–sssหตญ\นrž}๑ะ9i M""""า šDDDDค,4‰ˆˆˆH+Xh‘Vฐะ$""""ญ`กIDDDDZมB“ˆˆˆˆด‚…&iˆ …ถๅ:ภสสJืaัฤ=šDDDDค,4‰ˆˆˆH+Xh‘Vฐะ$""""ญ`กIDDDDZมB“ˆˆˆˆด‚…&i M""""า šDDDDค,4‰ˆˆˆH+Xh‘Vฐะ$""""ญ`กIDDDDZมB“ˆˆˆˆด‚…&i…พฎ ฯ›’’Gฃ™™™HKKƒRฉd˜ๆ€9`˜ƒO"Jฅภ}็……&้ิใวNNN:Ž„ˆˆˆVJJ ,--๓œฯB“tชdษ’€[ทnๅปกพฮหห งOŸ~ซฑ ๋2Jฅeห–ลํทaaaQจb๛Xห0ฬภฬภ๏žƒิจQ๛๗๏‡]พํXh’Nษๅ/Oถดด|ซ7“žž[ฟ๙ ๓2`aaม0ฬ˜€9˜เํs๐ฎcฝห2๚๚๚ฐททc;^ DŸค~๚ฉeEa^ๆ€9xืeEa^ๆ€9xืeUa['™xำYœDZคT*aii‰ไไไw๚฿^Qภ0s0s0@ัส๗h’Naฬ˜1022าu(:ร0s0s0@ัส๗h‘Vp&i M""""า šDDDDค,4‰ˆˆˆH+Xh’ฮฬ™3ŽŽŽ066†ทท7N:ฅ๋ด&44^^^077‡ตต5Zถl‰K—.ฉตฉ_ฟ>d2™ฺฃw๏:Š๘ร;vฌฦ๚Uฎ\Yšโล ๔๋ืVVV033C›6mp}Fแ9::jไ@&“I๗ฃ+ชภกC‡ะขE ุููA&“aใฦj๓…=z4lmmabb\นrEญอ“'OะฉS'XXX x๑โ๘๎ป๏๐์ูณธ๏'ฟdffโ—_~ซซ+Š+;;;tํฺ‰‰‰j}ไถLš4้#ฏษป{ำvะฝ{w๕ TkS”ทน~>ศd2„……Im>ตํ€…&้ฤ๊ีซ1dศŒ3gฯž…ปป;๐เม]‡ฆDฟ~pโฤ ์ูณ™™™hธ1RSSีฺ๕์ูw๏•SฆLัQฤฺQญZ5ต๕;rไˆ4o๐เมุฒe ึฎ]‹ƒ"11ญ[ทึaด้ำงีึฯž=€vํฺImŠโ6šš wwwฬ™3'ื๙SฆLมฬ™3Ž“'OขXฑbภ‹/ค6:uย… ฐgฯlบ‡ย๗฿ฑVแฝๅ—ƒดด4œ={ฃFยูณgฑ~z\บt AAAmวฏถ}๐ร#โMชญ฿ส•+ีๆๅํ€ฺบ฿ฝ{๓d2ฺดiฃึ๎“ฺ‘ิฌYS๔๋ืOzž-์์์Dhhจฃ๚xZ์ส๋9ศอฉSงq๓ๆMišƒƒƒ˜>}บvƒ๛HrหAทnDpppžห|ŽAppฐhุฐกฺดOm;เM๚่222pๆฬ๘๛๛Kำไr9q๘qF๖๑$''J–,ฉ6=""_|๑\\\0|๘pคฅฅ้"<ญนrๅ ์์์Pฎ\9t๊ิ ทnœ9s™™™jDๅส•๑ๅ—_ูm"##ห—/วท฿~ ™L&M/๊ภ๋nธ{๗๎ฉฝ๖–––๐๖๖–^๛ใวฃx๑โจQฃ†ิฦ฿฿rน'Ož่1 ษษษษd(^ผธฺ๔I“&มสส  CVV–nิ’ศศHX[[ฃRฅJ่ำง?~,อ๛ถƒ๛๗๏cถm๘๎ป๏4ๆ}Jพฎ ฯฯฃG ต้666ธx๑ขŽข๚xT* „ฺตkรลลEšฑcG888ภฮฮฑฑฑ๘ๅ—_p้า%ฌ_ฟ^‡ั~8Xผx1*Uช„ปw๏bธqจ[ท.ฮŸ?{๗๎มะะPใKีฦฦ๗๎ำMภZถqใF$%%ก{๗๎าดขพ ไ&็๕อํ๓ gฝ{๗`mmญ6___%K–,’ว‹/๐ห/ฟ C‡j??8`ภTฏ^%K–ฤฑcว0|๘pฝ{ำฆMำaดN`` Zทn '''\ปv ฟ๚+š4i‚ใวCOO๏ณ–,YsssSˆ>ตํ€…&ัGึฏ_?œ?^ํDj็นบบยึึ5ยตkืPพ|๙ๆืคI้o777x{{รมมkึฌ‰‰‰#ำ… ขI“&ฐณณ“ฆ๕m€,33ํท‡s็ฮU›7dศ้o777ขWฏ^ -?U"ํ๊๊ 777”/_‘‘‘hิจ‘#ำ๙:u‚ฑฑฑฺ๔Om;เกs๚่พ๘โ ่้้i\Q|}”.]ZGQ}๛๗วึญ[qเภุ็ึp๕๊ีฺGWผxq8;;ใ๊ีซ(]บ4222””คึฆจn7oฤฝ{ัฃG|๕m€๔๚ๆ๗yPบti ณฒฒ๐ไษ“"ต}ไ™7oฤž={ิ๖fๆฦYYYHHH๘8~dๅส•ร_|!mŸหv‡ฦฅK—๘ํ€…&}t†††๐๔๔ฤพ}๛คi*• ๛๖ํƒ#ำ!๚๗๏ 6`prrzใ2ััั[[[-Gงฯž=รตkื`kk OOOจm—.]ยญ[ทŠไ6ฑhั"X[[ฃYณf๙ถ+๊899กt้าjฏฝRฉฤษ“'ฅืววIII8sๆŒิfPฉTR1ฉห)2ฏ\น‚ฝ{๗ยสส๊หDGGC.—kN.*๎นƒวK็ฐไXธp!<==แ๎๎ฦถ…~;ะ๕ีH๔yZตj•022‹/๑๑๑โ๛๏ฟล‹๗๎ำuhZังOaii)"##ลปwฅGZZšBˆซWฏŠ๑ใว‹จจ(qใฦ ฑiำ&Qฎ\9Qฏ^=Gแ :TDFFŠ7nˆฃG ๑ล_ˆ!„่ปท๘๒ห/ล๛ETT”๐๑๑>>>:Ž๚รหฮฮ_~๙ฅ๘ๅ—_ิฆๅm %%Eœ;wNœ;wNำฆM็ฮ“ฎจž4i’(^ผธุดi“ˆมมมยษษI<\๊#00Pxxxˆ“'OŠ#GŽˆŠ+Š:่j•Z~9ศศศAAAย^DGGซ}Fคงง !„8v์˜˜>}บˆŽŽืฎ]ห—/ฅJ•]ปvี๑š\~9HII?๘ฃ8~ธธqใ†ุปwฏจ^ฝบจXฑขx๑โ…ิGQr$'' SSS1w๎\ๅ?ลํ€…&้ฬฌYณฤ—_~) Eอš5ล‰'t’ึศ๕ฑhั"!„ทn๕๊ี%K–FFFขB… โงŸ~ษษษบ ๚๚๋ฏ…ญญญ044eส”_ตธz๕ช4๙๓็ขo฿พขD‰ยิิTดjีJฝ{W‡kวฎ]ปq้า%ต้Ey8pเ@ฎทn„/oq4jิ(acc#ŒŒŒDฃF4๒๓๘๑cักCaff&,,,ฤ7฿|#RRRtฐ6๏&ฟธq#ฯฯˆ!„8sๆŒ๐๖๖–––ยุุXTฉRE๛๏jEXa—_าาาDใฦEฉRฅ„ppp={๖ิุ๙P”ทƒ๓ๆอ&&&"))Ic๙Oq; !„Vw™ัg‰็h‘Vฐะ$""""ญ`กIDDDDZมB“ˆˆˆˆด‚…&i M""""า šDDDDค,4‰ˆˆˆH+Xh}&RSSQตjU<{๖LืกจฉVญŽ?Vห8::โศ‘#ZŠ่ํ\พ|ตjีาuD… M"ขฤััลŠCjjช4--- ๆๆๆpttTkgjj 333XYYก}๛๖x๚๔ฉZ_ัััo]„‡‡#88fff๏ตฺ… เใใ๓QฦŠŒŒD… ิฆu๏&Lx็>Qบtilูฒๅ}ร#*rXh}Deส”มฦฅ็›6m‚ญญญFปปwใูณgธu๋222๐oฟฉอ฿นs'฿j์… ขC‡๏๗ศสสา๚…Eฮบv่ะ ,ะq4D… M"ขจC‡ˆˆˆž/_พ:uสณ}ฑbล„WmzNก๙๙st่ะ%K–Dษ’%Qทn\๛นu๋แ๊๊*MsttDXXชTฉsssŒ=—.]B5`ii‰ฝ{KmU*ฦŒƒฒeหยึึ @zz:`๑โลhะ z๕๊KKK,ZดOž|X!Drrฒhัข…3fŒ4_ฉTŠาฅK‹์์l1w๎\ัขE ‘––&233ลกC‡r{๋ึญยำำS#???๑๘๑c๑๏ฟ ###๑ีW_‰[ทn‰ปw๏ ฑk็Bš์โ8€u[2ฐmfญต?-ฺ-c]ดข(Eน2J)ฌŒัŸR•ุ…Ft‘…]”โ…ณลP/’Œ่Eะจฐ‰QศLงhบemRซ๓^ˆ๙บiฝฐz_~ฎฮูsฮs~็ูอ็œ๓%„ขฆฆFXญVัำำ#†††ฤบu๋ค˜jkk…L&ตตตโทo"Šํท‹ฒฒ2166&€Xดh‘hooO๚\&ๆปpแB๑่ั#!„กPHttt$ํณrๅJ …DooฏฐZญโฦB!nบ%rssEwwทˆFฃbขฌฌL!„฿๏‹eาฝ<(*++ฅ๚่่จะ๋๕ย็๓‰x<.ššš„ษdฑXL!ฑs็N‰DD4•๚ฉT*ัูู™0^ขูŠo4‰ˆ~#™L†={๖ภ๋๕ย๋๕b๗๎ษdSฺmถ YYY่๊๊ยฑcวคk๗๏฿‡รแ@zz: >|๘€w๏A.—'}ฃ‡๎อ455มh4ย้tNู2๐#“ษ4ฉ …ค๑KJJคฑืฏ_มมมว1H5 @า๙N…Zญ้qˆf&šDDฟูชUซ0<<Œ‘‘ุํ๖ifddภๅrแ๙๓็0~P(//0gฮœ?]]]ธ{๗.ฎ\น‚ถถถ)๗Yฑbพ}๛ฏcึ๋๕ƒR= BฏืK๕ดด4ฉl0™™‰‘‘„รa„รaŒŽŽโฺตk3Žณfอดดด```6›mา›๊้้™Tž8Te0PWW'‡ฅ“?ฦ™(๖‰yyyS๚'ํำ฿฿x<‹ล2ใ‰f&šDD@ccใO-%๚Zญููู่์์„Jฅ’’*ฟ฿ŽŽ|*• rน<แRผูl†NงรซWฏUผ{๗๎ลฅK—ะ‹แแaTVVb฿พ}  ฌ]ปgฯžE4E<ว‹/๐๚๕๋iว๘๒ๅ <>~…Bฬฬฬ„s™P]]„B!\พ|EEE€#GŽเย… Rb …ะฺฺ ` ๎เเเคOLiตZtwwK๕;vเๅห—hnnF<G,Ckk๋ดหโ>ฤฆM› —หง#ัlรD“ˆ่ฐZญำ๎?บu+2331|๘~477#--mสgBก  Rฉ`ทQRR’tŸฆํžดฏ๒Wธnb๕๊ีฐZญฐูlจจจHฺพพพ๏฿ฟวาฅKกีjq๊ิ)ฤbฑวฉซซƒูlFVV๎ป‡ซWฏ&m[TT„ 6 77[ถlมแร‡ŒŸ์wปศฯฯ‡Jฅ‚รแ’eห–aืฎ]0™Lะh4ฦำงOŸBฃัเ๘๑ใPซีhiiAuu5ดZ-–,Y‚šššiใnhhภัฃGgœัl“&„:""๚9Nงๅๅๅุธqใ/๗๙3์v;ž={๖Ÿ๛h๛ู›7oเrน๐๘๑ใ„K๓DณM"ข‘‹/ขดด …โO‡BD4#&šDDDD”ฃIDDDD)มD“ˆˆˆˆR‚‰&ฅM""""J &šDDDD”L4‰ˆˆˆ(%˜hQJ0ั$"""ข”`ขIDDDD)๑7แู›คM,ฯuIENDฎB`‚c4core-bm-charconv-atox-mega_bytes_per_second-u16.png000066400000000000000000001055151477602032300331030ustar00rootroot00000000000000c4core-0.2.6/doc/img/windows-x86_64-vs2019-Release‰PNG  IHDRคฺˆ 9tEXtSoftwareMatplotlib version3.5.3, https://matplotlib.org/อ+นา pHYsaaจ?งiŠบIDATxœ์wXื๛6๐{้(EE@PุCY@@)F `CQ4Hฌ‰ฦS460–o์1š`Iฌุ{ปh์ข•ˆ%b/ั‹(u็ร—๙น bฤ๛s]{ษฮ9sๆ™วay8S ‚ €ˆˆˆˆH"R@DDDD7คDDDD$)คDDDD$)คDDDD$)คDDDD$)คDDDD$)คDDDD$)คDDDD$)คDDDD$)คD๏Ijj*d2fฮœ)u(ลjผ9์ํํฅฃิd2,u๔‰…L&Cllฌิก|๔z๕๊ฉรx็z๕๊kkkฉร(๗XาG%99แแแHMM•:"I?~แแแHKK+U””Œ1žžžะำำƒL&+๖๛G&“A&“กOŸ>Eถ;V์๓่ัฃ2๎มYฝz5ๆฮ๛ฦใ”'qŸจ์ขฃฃ^dบu๋ะญ[7ิฏ_2™ อ›7W;ึนs็„jีชกRฅJฐททวผy๓ZZวGDDDฉ า'N`ผyศศศภงŸ~Zb===lฺด 999…ฺึฌY==ฝื นXe)|||๐๙s๘๘๘ผต8&คฯโล‹‘’’RฆuฃฃฃQd๏ฟŽmถกvํฺจZตชฺq๖๎ <|๘ใวว/ฟ‚ถmโ๖ํo-ž7ฅ๕NF%"zGA@VV๔๕๕ฅๅƒ’™™‰ส•+ฟ๖zAAAHKKƒกก!fฮœ‰„„ตฑ}๛vฤฤฤ }๛๖โ๒ใวใ๚๕๋่ิฉ6mฺ๔ฺqผฉฌฌ,่่่@CCใญลTพ•‡ฯ mmํw2๎ส•+QณfMhhhจฝิJกP Ghำฆ 6n ๒9Y>ฃ"zM7nภภัฐaC่๋๋รฤฤ;wV™ ]ถl:w๎ ๘์ณฯฤS‡/_K๖oฟมฮฮบบบฐดดฤ AƒTf’z๖์ ===๗฿*@ีชUq๗๎Rล;gฮXYYA__พพพธpแBก>—.]BHHชUซ===ธบบb๛๖ํ*}–-[™L†cวŽaไศ‘055Eๅส•Œทะ˜111๐๕๕…กก!ŒŒŒเๆๆ†ีซW๊—œœŒฯ>๛ •*UBอš51}๚t•๖‚๋๐ึฏ_ˆˆิฌY††† Azz:ฒณณ1|๘p˜™™มภภฝ{๗FvvถสK—.E‹-`ff]]]ฺฺุโ๗฿/‹ตต5ฺถm‹={๖ภีี๚๚๚Xธpaฑน7n„L&รแร‡ ลฒpแBศd2•ใใuŽ‹ร‡cเภ033CญZตŽ๏พ๛`cc#~จ;cPญZ5–*wPณfM๘๘๘:ฎขขขเเเP๊k”3220|๘pX[[CWWfff๘๓ฯq๎9/ฎwตknธ!๎Gมuzว็ฺตk1n8ิฌY•*U‚Bก(๒า‚kงK:๎Ÿ5AAAจ\น2ฬฬฬ0bฤ์ูณงะ˜Wฎ\AงNPฃF ่้้กVญZ Ezzzฑ๛ฌnŸเแร‡๘๚๋ฏann===8::b๙๒ๅฅสgม๗ััฃGัคI่้้กN:Xฑb…Jฟ๐๐pศdฒB๋S/+cฦฦฦŠ฿›b6o ่้้มลล๑๑๑Eฦ๖ฯ? •+W†ฅฅ%&MšT่{IฉTb๎นฐณณƒžžฬออัฏ_?>>:t(ๆอ›‡Q>ปw๏FXX˜ุ๏ษ“' DวŽัฅKlธ?๐ะชU+•ํN›6 ๚๚๚=z4ฎ^ฝŠ_ฺฺฺะะะภ“'OŽ“'Obูฒeฐฑฑม„ ฤuwุูู!((ZZZุฑcฅR‰Aƒฉl'%%]ปvEฟ~ะทo_4lุฐศŽ7SงNลย… ัทo_qy=p๘๐แB?ไ^•ŸŸถmโภ ลฐaร‘‘}๛๖แย… จ[ท.A@PP:„ฏฟNNNุณgพ๛๎;นssๆฬQ๓่ัฃุผy3CCCฬ›7:uยอ›7abb‚6mฺภภภ๋ืฏ‡ฏฏฏสบ๋ึญƒXฤฝ๎q1pเ@˜ššbย„ ศฬฬDซVญp๙๒eฌYณsๆฬA๕๊ีฆฆฆj๓๒บยยย0lุ0<}๚ศหหร† 0rไHdee•jŒ๛cใฦ+บt้‚””•"*??hฺด)ฆOŸŽปwcโฤ‰ศหหรคI“ฤ~๚๕รฒeหะปwo :ืฏ_ว๙๓/~>(๊๓โโล‹hถ-ไr9&Mš]]]\ฝzวŽSูŸา~Vผ ซWฏFFF๚๕๋™L†้ำงฃcวŽ๘็Ÿ ญญ~๚แ๎ปุทoVฎ\Yๆํ์฿ฟFFFธs็:t่€ห—/ฃrๅส่ฝ;ๆฬ™S๊3o+žb Dภณgฯ -;qโ„@Xฑb…ธlร† แะกC*}>|(่่่B~~พธ|๙แฯ?—ํูณG Lž/ๆฬ™SชใฎดŸEๅCŠ>พz๖์ฉ๒Z๐ณภฤฤD๘๏ฟฤๅถm;v์— 4จT๑ุูู พพพEถษๅrกRฅJBฅJ•„!C†›6m† "BCCK๛eฅง,xสž*„—ฏสออลใวQฏ^=TฉRE<ลงฮ๛‘““ƒแร‡ซ๖ทo_aืฎ]โ2๔๋ื“&MBวŽกงงง๖๒ซ:t่€š5kŠ๏›4iwwwDGG๛๏?^ekk ooo๑ฝฉฉ)6lXไ๗viฺฺูยรรC|๏๎๎hัข>๙ไ“Bห‹ฺึหn+ธฬ%''๛๗๏lุฐฦฦฦ๘๓ฯลใัฃGpqqAก๊ข>/ชTฉุถm›ฺำีฅฌxพ๘โ •›‘ oไฃ(OŸ>ลณgฯะฃGฬ›7;vฤผy๓ะฏ_?ฌ]ปWฎ\yซ++คT!<&Lฏ้ซ^ฝ:LMM‘––ฆ๖šญ…ซง‚uttPงNฑฝภฬ™3QญZ5$$$`ผy033+uฌ๕๋ื/ดฌAƒโตHWฏ^… ?~.\@ํฺตัคI„‡‡ฟ๖๊ืูา๗7n@บu ๕ซWฏ^กํŽ9K–,A๕๊ี€ ”๊ณจ87n@๚๕ ]3XqW”า‹ฏ๋u>ฺ–††๊ิฉฃฒฌเ˜/๘Lผrๅ าำำaffVุ่๚๔iฉŽ๛/พ๘อš5CŸ>}`nnŽะะPฌ_ฟพLืRพ-%}nฟ-ฟ”ฝ๚๙X๐=yโฤ‰ทบฝฒโ5คT! 2K—.ล๐แรแแแcccศd2„††พ“œ๘๘x๑C๐๙๓o\ฝฌ oฟถุYมW7 V–฿๔_gฌโ๚–4ฦตkืะฒeK4jิณgฯFํฺตกฃฃƒ่่hฬ™3งะ™บYฎfอš!!!๓็ฯG—.]PญZตb๛Jก4๙ิีีE‡ฐeห๖ox๐เŽ;†ฉSงŠ}สr\HygqPPtuuัณgOdggฃK—.ฏต~—.]เํํ-[ถ`๏ฝ˜1c~๙glผนะตฬลy›฿C0kึ,๔๊ี ถmรฝ{1t่PL›6 'OžDญZตส4ๆ›*อ>w“J~~k๙6๓ฉT*aff†จจจ"_ฝบจw}}}9r‡ยฎ]ปฐ{๗nฌ[ท-Zดภฝ{_๛Lย๋ๆฉ(o๛˜+Žฅฅ%.^ผ(ฃP `"ๅmภeล‚”*„7ขgฯž˜5k–ธ,++ซะณ‹๛)8•˜’’ข๒zNNฎ_ฟ???qYff&z๗๎ [[[xzzb๚๔้†››[ฉb-๊๔ศๅห—ลป0 ถฏญญญฒ7Qpส๘ย… …Š)์ุฑูููุพ}ปส,มซงJฃ^ฝz˜>}:š7oŽภภ@8pเต๎ Yบuq๊ิ)ไๆๆ๛จ+++์฿ฟ*)ธ3๗uNKฟ์‹/พภ๒ๅหqเภ๗฿A<]ผฝใโmซŽพพ>:t่€UซVกUซVโ Tฏรยยฤภ๑๐แC4nSฆL า๗ต/ฌฌฌœœ ATถ}๕๊ี"๛;88ภมมใฦร๑ใวัฌY3DFFb๒ไษลnCgTRR”Jฅส,้›wฏ*˜ฅKKKOsฅ›- ฅR‰๙Gœ^|?๋ึญ‹๛๗ฃYณfo๔K–††Zถl‰–-[b๖์ู˜:u*ฦŽ‹C‡ฝ๖๗ิหyzูฮำ8ฦ]\\ฐo฿>นsGๅ,`มๅ0ฏsSใปžใ){ช455 V๙๋ฏฟ๚mตเ9Œฏ~ˆ๘๙๙AGG๓ๆอS็?@zz:ฺดi#.๛แ‡p๓ๆM,_พณgฯ†ตตต8 T[ทnUนึ๏๔้ำ8u๊”๘Cึฬฬ อ›7วย… q๏ฝB๋๕8ง’๘๛๛ระะำฆM+t—๓๛บ^๊e3/o;==K—.-ำxrนััั๘๛๏ฟัฎ];<\ฅฝดr้ิฉ=z„๙๓็j+ˆตu๋ึศฯฯ/ิgฮœ9ษdฅžฝ{•ŸŸชUซ†u๋ึaบuhาค‰สฉวทu\๗=๐.|๛ํท˜8q"ฦZ๋ๅ็็:ฝmffKKK•๏ณส•+ฟัi๐ื€;w๎จ sฬ˜1ˆˆˆ@`` ‚‚‚’’‚฿~๛ nnnโอฤoฟ†‰'ขqใฦ^ ooodffb8p ฺทovํฺแณฯ>รุฑc‘šš GGG์ปถmร๐แรUn`zฺฺฺุ่ฑ#ึฎ]‹ฬฬLฬœ9ณPŸทq\ธธธx๑ˆกะะPhkkฃ]ปvล>4?==]|ฆkม#rๆฯŸ*Uช J•**7คผสััŽŽŽ%ฦ๔ชŒŒ ิชU !!!ptt„๖๏฿3gฮจœqqqมบu๋0rไHธนนมภภํฺต{ํํ•Vฟ~0|tํฺร† ƒ……ขขขฤ f<ˆมƒฃs็ฮhะ ๒๒๒ฐrๅJhjjขSงNjทQ>}๓อ7Xธp!z๕๊…ณgฯยฺฺ7nฤฑcว0w๎2Ÿx•ฟฟ?>๙ไ|๕ื๘๎ป๏ ฉฉ‰?ฆฆฆธy๓ๆ[ูฦห๔๔๔ฐ{๗n๔์ู๎๎๎ˆ‰‰มฎ]ป๐ใ?Š3wพพพ่ืฏฆM›†„„๘๛๛C[[Wฎ\ม† ๐ห/ฟ $$Dํv&Mš„#GŽ M›6ฐฒฒยร‡๑oฟกVญZ๐๒๒๛•๖ณยฮฮM›6ล˜1c๐฿กZตjXปvmก_DTม๗๋ะกCMMM„††xQ ฤ๛/233ลูw๑ฏ‘9;;ใซฏพยŸ‰ผผ<๘๚๚"666lภ˜1cJ๕ธยาฤ๓ฦษฝ๛D๏ู“'O„ฝ{ ีซW „€€แาฅK‚•••ะณgO•พ‹/๊ิฉ#hjjz<ว๙๓…F ฺฺฺ‚นนน0`ภแษ“'‚ ‚Bกฌฌฌ„ฦ นนน*cŽ1BะะะNœ8QlŒ๚˜1c†0kึ,กvํฺ‚ฎฎฎเํํ-$&&๊ํฺ5กGB5mmmกfอšBถm…7Š} =rๆฬ•u‹z๔ˆ ย๖ํOOOA___022š4i"ฌYณFl๗๕๕์์์ ล๒๊cK ฦ๕ฑ6ลลSิฃ~ถo฿.ศๅrAOOOฐถถ~๙g๑ฑKฏ>ZฆM›6…*จ>๖ฉภถm---แ‹/พแUฺGนย‹วQ;Vฐฑฑดตต…5j!!!ยตkืฤ>ยˆ#KKKA[[[จ_ฟพ0cฦ •Gh_ม>ฝz\ ‚ ์ทO ศd2แึญ[Eฦ๗&วEŸ~๚IจYณฆ กกQโ#  Žข^ฏ>žจธ}Yi๛”-|๗w‚ฃฃฃ`hh(Tฎ\Yptt~๛ํ7•~OŸ>ยยย„*UชจฤS๑๙rซ}*อq/‚๐ฯ?mฺด๔๕๕SSSaิจQยฆM›ยษ“'ล>_}๕•Pทn]AOOOจVญš๐ูgŸ ๛๗๏W›u๛$‚๐เม๑sNGGGppp–.]Zโ˜‚P๗‘ฏฏoกว={Vpwwttt„O>๙D˜={vฑ}*jฬขŽƒ—? ๔์ูSจ\นฒpํฺ5ม฿฿_จTฉ’`nn.Lœ8Qๅ๑{-Z$ธธธ๚๚๚‚กกกเเเ |๗ยปwKŒ้ภB๛๖ํKKKAGGGฐดดบvํ*\พ|นP>J๛Yqํฺ5มฯฯOะีีฬออ…Q.อcŸ^ฮEยฤ‰ล๗yyyย!CSSSA&“ฉฤV๐ฝTิ๋ๅ1แล#ยยรร+++A[[[จWฏž0gฮœRํ็หิล๓ฆd‚ ม๙:""ข b๎น1bn฿พญ๒H7"*=คDDDฅ๔๙s•kฒฒฒเ์์Œ|๑f"z}ผ†”ˆˆจ”:v์ˆO>๙NNNHOOวชUซp้าฅbID๔!HOO/t3่ซjิจ๑Ncเ )Q)อ;K–,Ajj*๒๓๓akk‹๏ฟ^ๅ]Dš^ฝz•xs๋ป.Y}ฤ’““K3ฝo๋นุลaAJDDDD’โƒ๑‰ˆˆˆHR,H‰ˆ*ธ[ทnAOOO|ฐ}E ™L†ุุุ7ซy๓ๆฐทท๓ สฆM›ช‘ ข R"ขRXถld2d2Ž=Zจ]ิฎ]2™ mถUi+XฏเUนreฺฺุb๒ไษx๖์Y‘;ฦฑOš4 ๎๎๎hึฌูEฅ3u๊Tlบตะ๒ใว#<<้ึ~๘ ,ภ๛๗฿ษ๘D๏ R"ขื งง‡ีซWZ~๘๐aพ}บบบEฎ๗๙็Ÿcๅส•Xนr%fอšgggŒ?={๖,ฒฎ]ป`ff77ท7Š๗฿ล๒ๅหัฟ7งผ๑๑๑ม๓็ฯล?Xจ+H#""YAฺพ}{แท฿~{'ใฝ+|)ัkhบ56lุ€y๓ๆAK๋>BWฏ^ ููู˜8q"๊ีซ]]]ิฎ]฿=ฒณณล>2™ ™™™Xพ|นx™Fฏ^ฝŽ๏พ๛`cc#ถฅฆฆŠ๋ฎZต ...ะืืGตjีŠ[ทnฉฤP๐w๖์Y๘๘๘ RฅJ๘๑วล๖ฯ?7n@BBBฉ๖›จ<`AJD๔ฌญญแแแ5kึˆหbbbžžŽะะะbืหสสยฃG๐่ั#ธqซWฏฦ๒ๅหVจ ณgd2๛๖ํCืฎ]QตjU๓ฯ๘฿‡ๆอ›—x“Rnn.ฮœ9ƒฦูไษดm๎๎๎˜>}:tuuŠu๋ึ!44ญ[ทฦ๗?dff"$$โบ/^„ทท7๑๗฿c๘๑ธ~:š7oŽSงNฺึภ‘œœŒ &`๔่ั€•+WขM›6000ภฯ?Œ๑ใว#99^^^*EZiไไไ 'Ožฤ!Cฐ`ม|๓อ7๘็ŸJuzษ“'hบ5\\\0}๚tิชU  ภŸ)๖Q*• ยฬ™3ัฎ];๚๋ฏ่ะกๆฬ™ฃ๒`•+WBWWโe๚๕CวŽัตkWภœ9sฤ6SSSภ”)SะฃGิฏ_ณgฯฦ๐แรqเภ๘๘๘ฺ‡วฃUซVprrยนs๑ูgŸ‰m...Pกnbฃ€@DD%Zบtฉ@8sๆŒ0|มะะPx๖์™ ‚ะนsgแณฯ>Aฌฌฌ„6mฺจฌ  ศW‡„ฌฌฌB๊ฝปเ๋๋+พ6l˜`dd$ไๅๅฝVฬWฏ^ฟ๚kก6___€ฐz๕jqูฅK—‚†††p๒ไIq๙ž={ยาฅKลe:tttt„kืฎ‰ห๎ฝ+ >>>โฒ‚ผyyyฉฤŸ‘‘!TฉRE่ทฏJ\๗๏฿Œ -ีกC‡ยกC‡A„๘๘x€ฐaร๕I)BA.fอš%.หฮฮœœœ333!''GAXนrฅ กก!๕ื_*๋GFF „cวމห*Wฎ,๔์ูณะถfฬ˜!ฎ_ฟฎฒ<55UะิิฆL™ขฒ๙๓‚–––ส๒‚x###‹'aภ€%๎;QyมR"ขืิฅK<;w๎DFFv๎Yโ้๚๖ํc฿พ}ุทoถm†1cฦ`๗๎ S๙“|Jฅปw๏V9]_ฅJdffช\&P?TญZตศv•Y† ขJ•*๘๔ำOแ๎๎../๘๚Ÿไ็็c๏ฝ่ะก๊ิฉ#๖ณฐฐ@XXŽ= …Bกฒญพ}๛BSSS|ฟo฿>คฅฅกkืฎโฬ๑ฃG ฉฉ www:t่ต๖ีุุภ‹ูๅโž\ Ž––๚๕๋'พืััAฟ~๐๐แCœ={ฐaร|๚้งhิจ‘Jฬ-Zด€ืŽ๙e›7o†RฉD—.]TฦฎQฃ๊ืฏ_hl]]]๔๎ปุ๑ชVญZ์๕ฬDๅoj""zMฆฆฆ๐๓๓ร๊ีซ๑์ู3ไ็็#$$Dํ:ตjีR๙ำ{AAA011มท฿~‹;wŠ79s๛ฏJA:pเ@ฌ_ฟญZตBอš5แ๏๏.]บ 00ฐT๑ ลAพZตjบ้ลุุตkื.ด xqZxq็ณgฯะฐaรBc~๚้งP*•ธu๋์์์ฤๅ666*ฎ\นb1๗*###uปTˆ Fމูณg#**  Bทnฤ๘ีฑดด,tฃUƒ ฉฉฉhฺด)ฎ\น‚ฟ[<ลช‡พVฬ/ปrๅ A@๚๕‹lืึึVy_ณfM่่่;ž ผก‰>(,H‰ˆส ,, }๛๖ล๛๗ัชU+TฉRๅตวhูฒ%เศ‘#bA kkkฺฺุŠฬฬฬ€={๖ &&111Xบt)z๔่ๅห—;พ‰‰ €+$_๕๒Œei–Wุ–†พพพส{ฅR เล๕–5jิ(ิี๋jKcึฌY่ีซถm†ฝ{๗b่ะก˜6mNž<ฉr#UY)•J888`๖์ูEถฟZศฟ๎ุ2™ 111Eๆี›า^อ็ซาาาPฝz๕2วC๔พฑ %"*ƒเเ`๔๋ื'Ožฤบu๋ส4F^^เ้ำงโฒ]ปvกu๋ึ…๚๊่่ ]ปvhืฎ”J%ˆ… b๘๑จWฏ^‘ใ๒ษ'ะืืว๕๋ืห_qLMMQฉR%คคคjปt้444J,ฮ๊ึญ เEฑ๒ฬ๑›rpp€ƒƒฦ‡ใวฃYณfˆŒŒฤไษ“ีฎw๗๎Bฃบ|๙2€7ฒฤœ˜˜ˆ–-[–8๛X\{qห๋ึญ A`cc#ฮฬ–ี;w““ƒO?๔ฦ!zŸx )Qเ๗฿Gxxx™Ÿ๑นcว€ฃฃ#เมƒ8w๎œส้zเฎ- กกน\*z•ถถ6\]]Wฆ๘Šฃฉฉ lถMๅn๘`๕๊ี๐๒๒*๑”{@@ŒŒŒ0u๊Tไๆๆj๗฿_+&…B!๘ กกก6G๒๒๒ฐpแB๑}NN.\SSS๑ฎ๕.]บเฮ;Xผxqก๕Ÿ?ŽฬฬL๑}ๅส•‹ผปฟ เ}ตญcวŽะิิDDDDก™hA ๊\๓๊้้Y๊uˆคฦR"ข2*๎ฏ,ๅ๒ๅหXตj€1?y๒$–/_Žz๕๊ก{๗๎^œฎืำำSy„๔้ำ๗ZดhZตjแฦ๘๕ื_แไไTโ,X๛๖ํ1v์X(Šืพ.Sษ“'c฿พ}๐๒๒ยภกฅฅ…… ";;ำงO/q}###๛๏่ฝ;7nŒะะP˜ššโๆอ›ุตkš5k†๙๓็—:žƒb๐เม่น34h€ผผ<ฌ\นššš่ิฉS‰๋[ZZโ็ŸFjj*4h€u๋ึ!!!‹-ฏ฿์ฝ;ึฏ_๛ใะกChึฌ๒๓๓q้า%ฌ_ฟ{๖์ซซ+€^ฺฟ?fฯž KKKุุุภ],nวŽ‹ะะPhkkฃ]ปvจ[ท.&OžŒ1cฦ 55:t€กก!ฎ_ฟŽ-[ถเ›oพมท฿~[ช\์ทŸ|๒ œK?"ษIwƒ?ั‡ใๅว>ฉSšว>ijj ตjีพ๙ๆแมƒbฟกu๋ึ…ฦธqฃเ๏๏/˜™™ :::ย'Ÿ|"๔๋ืOธw๏^‰q?x๐@ะาาVฎ\ฉฒืืWฐณณ+U๛0hะ •e็ฮกRฅJยgŸ}&?~\ฅOIy;t่  zzzBบu…^ฝz qqqj๗๋ีว>๓ฯ?ยW_}%ิญ[WะำำชUซ&|๖ูgย๛ีŽ#—‹ธธ8มรรCะำำฌฌฌ„๙๓็๊›““#๓ฯ‚ ซซ+TญZUpqq"""„๔๔tฑ฿ฅK—A___ ๒จŸ~๚IจYณฆ กกQ่P›6mผผผ„ส•+ •+W5j$ 4HHII)oQ๒๓๓ aธq%๎7Qy"„7ธJˆˆŠผผ<˜˜˜`ฺดi8pเ[๛๋ฏฟฦๅห—๑ื_ฝีqฉูบu+ยยยpํฺ5XXXHQฉฑ %"*>|ˆ฿~๛ ๚๕{๋…ฤอ›7ั A8pอš5{ซcS๙โแแoo๏R]6ATžฐ %""""I๑.{""""’ R""""’ R""""’ R""""’ŒOๅžRฉฤปwahhXโŸ๋#""ข๒Adddภาา๊็@YRนw๗๎.6•OทnBญZติ๖aAJๅžกก!เ๚๕๋จVญšฤั”?นนนุปw/ล?qHช˜#๕˜๕˜Ÿ’1G๊}ฌ๙Q(จ]ปถ๘s\คT๎œฆ744|ซ‹ปขศออEฅJ•`dd๔Q}ะฝๆH=ๆG=ๆงdฬ‘z{~Jsนoj"""""Iฑ %""""Iฑ %""""Iฑ %""""Iฑ %""""Iฑ %""""Iฑ %""""Iฑ %""""Iฑ %""""Iฑ %""""Iฑ %""""Iฑ %""""Iฑ %""""Iฑ %""""IษAค‚H…BcccธŒฅށิแ”;:ฦุ?ลด ศQสคง\bŽิc~ิc~JฦฉWž๓sn|‹w6vมฯ๏๔๔tฉํหR""""’ R""""’ R""""’ R""""’ R""""’ R""""’ R""""’ R""""’ R""""’ R""""’ า„„„ iำฆ๏u›—.]B๓ๆอ฿z฿ทแ๙๓็hูฒ% 0z๔h•ถซWฏยววvvvpvv~o1ั‡MK๊สณ}๛๖ASS๓ตืหฯฯ/ำzๅม“'OPตjีbตดด0aย$''ใฦ*mฝ{๗ฦฌYณะคI<|๘ฐิcัว3ค฿โล‹แเเGGGLœ8นนน˜:u*ฦWช๕cccแ็็‡ภภ@๘๙๙แ้ำง่ฝ;เๆๆ†“'Oถn www899ก}๛๖x๚๔)เ๒ๅหpuu…ฃฃ#-Zคv[ล๕-n›w๏E›6mเ่่บuKeผผผ}ฤถณgฯbูฒe8t่&OžŒN:แฬ™3ุฒe  ๐๕๕ลฉSง€fอšแ? >&L@bb"APoq}‹ๆะกCันsg$&&โ่ัฃจ^ฝ:เึญ[˜0almmฑs็NLš4 QQQeสแ•+W ฏฏ6mฺ qใฦ˜?พุ–’’‚   „‡‡รีี . ๑ขL›6 ฦฦฦโซvํฺeЉˆˆˆ> >พุx‹๋[6Oœ8 6€8ณy๚๔ixzzb๘๐แˆ‹‹๗ฝฌ๒๓๓q๔่Q$&&ยะะพพพ๐๖๖†ฃฃ#ดดดŒเเ`ธq}๛๖ลท฿~‹ŒŒŒ"ว3f FŽ)พW(,J‰ˆˆ*0คEHHH@rr2lll——‡AAAุพ}ปฺ๕*Uช$~-bbb`iiฉาg่ะกˆˆˆ@๓ๆอฑqใF์น “ษฤ>/]”โ๚ทอขศๅr,Zด‹-BงNะทo_t่ะ:::MMM(•Jฑvvถฺ๑,--ัคIXXX””GGG/Šใ•+Wb้าฅจSงŽX EWWบบบ%๎U Vฬ‘zฬzฬOษ˜#๕สs~ฮo๑ฮฦ.๘๙žž^โฝ*œ!%""""Iฑ -ว–.] '''•—บห ˆˆˆˆ>Dผหพ๋ป7z๗๎-uDDDD๏gH‰ˆˆˆHR,H‰ˆˆˆHR,H‰ˆˆˆHR,H‰ˆˆˆHR,H‰ˆˆˆHR|0>•{ึ}๔่LLLคงษออEtt4Zทn mmmฉร)—˜#๕˜๕˜Ÿ’1G๊}ฌ๙แƒ๑‰ˆˆˆ่ƒม‚”ˆˆˆˆ$ลใำc์๎+ะช๔P๊0สMไฃ…๐ํฮไCS๊pส%ๆH=ๆG=ฉ๒3?๘ำ๗ถ-"ฉq†”ˆˆˆˆ$ล‚”ˆˆˆˆ$ล‚”ˆˆˆˆ$ล‚”ˆˆˆˆ$ล‚”ˆˆˆˆ$ล‚”ˆˆˆˆ$ล‚”ˆˆˆˆ$ล‚”ˆˆˆˆ$ล‚”ˆˆˆˆ$ล‚T"!!!hฺดi™ืOMMลฦ฿bDฅs๓ๆM4kึ zzzˆŒŒTi;sๆ \]]agg‡vํฺฝ๗ุˆˆˆ่รฤ?*}๛๖AS๓อ\AA๒–ขzแษ“'จZตjฑํFFF˜={6ถo฿ฎฒ<77}๛๖ลฦQฏ^=<|๘โO|ๆไไ //•*UzซqQลมาwl๑โลppp€ฃฃ#&Nœˆ\L:ใฦ+ี๚ …-Zด@ใฦแ์์ŒฃGฦŽ‹={๖ภษษ QQQ๘๗฿ัชU+888 <๔๊ี ปw๏๐ขˆ-jV6++ ห—/‡งง'fฬ˜W™ญQฃ J•*pww‡ถถถส{๖์‡‡๊ีซ033๐ขภตททวะกC‘œœ\๊ผัวƒ้;”””„ เุฑcHLLฤฐaร0{๖l๔์ู†††*}###ล0..}๚๔่๋๋cถm8w๎v์ุQฃFฆL™‚€€$$$เห/ฟฤฤ‰๑๙็Ÿใ๙๓h฿พ=ฦŽ[b|)))1b์ํํq๎9,^ผSงN-ำพ^นrูููhัข\]]ลห ฬออq๑โEธบบข_ฟ~๐๕๕ล๊ีซ‘]์XูููP(*/"""ชธxสŠEhh(ŒŒŒฯŸ?วฝ{ฑ~ธqCฅoลฏ]]]ฑdษ€ ๘๛๏q๔่Qhjjโ๊ีซEn๋๘๑ใt๋ึ ฟ๚ซฺุ6mฺ„ะะPL™2.\€žž^YwŸŸSงNแฤ‰ศฮฮ†‡‡|||`ff}}}๔่ั=z๔ภ… ะฃGL›6 ็ฯŸ/rฌiำฆ!""โโ!""ขgH฿ฃ„„$''รฦฦ^^^ˆGPPฺuขขข““ƒ„„$$$ผ๖6555กT*@eV๒๓ฯ?วฬ™3…ฎ]ป"::Z์งnฝโXZZโณฯ>ƒ‘‘LMMแโโ‚””ฑฮ;๘้งŸะนsgุcัขEลŽ5fฬคงง‹ฏ[ทnฝ๖~ั‡ƒ้;ิขE ฌ]ปV<ๅ์แแ{๗๎!55G…ณณsก›ƒ^ฅP(`ffMMMlธ™™™CCCdddˆ<==ฑn:ภ๊ีซแๅๅฐฒฒ ู—ทedd„aร†!11#FŒ@TT6lˆUซVฉ]ฏ88w๎rrr™™‰ฤฤDิญ[้้้ B@@ p๘qฌXฑลŽฅซซ ###•U\,H฿!{{{ <žžžpttฤผy๓Šํ[5คaaa8x๐ ไr9Ž9sss€\.ว๓็ฯล›šยรร น\Žอ›7c๒ไษ€ฏฟ›7o†ณณ3=zTไถ}||…“'OยฺฺะฑcG\พ|rน.\๛>{๖ ตjีย์ูณ1fฬ๑&ฆ๊ีซฃw๏prr‚ปป;FKKKภศ‘#qแยŒ1BํDDD๔q’ ‚ H‘: …ฦฦฦ่ท๊ด*KNนฃ‰|ดะธ†ƒสบศว›=NฌขbŽิc~ิ“*?๓ƒ?}ozSนนนˆŽŽF๋ึญ =……>NOO/๑l'gH‰ˆˆˆHR,H‰ˆˆˆHR,H‰ˆˆˆHR,H‰ˆˆˆHR,H‰ˆˆˆHR,H‰ˆˆˆHR,H‰ˆˆˆHR,H‰ˆˆˆHRZR@TZS๋รฤฤD๊0ส\พ†™m~T\~ฬ‘zฬzฬัปวR""""’ R""""’ R""""’ฏ!ฅฦบฤ;ะ7ฬ”:Œ๒G™jVป hhJM๙ฤฉวจ'A~zป}๒^ถCT^p†”ˆˆˆˆ$ล‚”ˆˆˆˆ$ล‚”ˆˆˆˆ$ล‚”ˆˆˆˆ$ล‚”ˆˆˆˆ$ล‚”ˆˆˆˆ$ล‚”ˆˆˆˆ$ล‚”ˆˆˆˆ$ล‚”ˆˆˆˆ$ล‚TB!!!hฺดi™ืOMMลฦ฿bDฅ3t่P˜››Š๙๓็่ึญ5j„O?.\x๏ฑั‡‡ฉD๖ํMอ7๛t๏ข }๒ไI‰}BCC]h๙คI“ะธqc\บt ๑๑๑ฐฒฒ*๕˜DDD๔๑bA๚,^ผpttฤฤ‰‘››‹ฉSงbธqฅZ_กP E‹hธ1œq๔่Qภุฑcฑgฯ899!** ๛/Zตjเมƒx๒ไ >๔Sนs๙๙๙hฺด)N:Uh'OžDฏ^ฝเ๊๊ เEฑ๛๒ hฏ^ฝฐ{๗n€งง'LLL ฑn: 2 งงCCCภเมƒ€-[ถ //ฏฤอฮฮ†BกPyQลล‚๔KJJย‚ p์ุ1$&&bุฐa˜={6z๖์)l"## ˆ‹‹CŸ>}๚๚๚ุถmฮ;‡;v`ิจQ€)Sฆ ๘๒ห/1qโD|๙็8<ฺทoฑcวขjีช˜:u*๚๗๏Yณfมหห ๎๎๎€ŒŒ DFFยลลh฿พ=RRRสดŸOž<ŽŽ† ggg 8ููู€จจ(DDD`วŽฐตตลฤ‰q๛๖ํbวš6mŒลWํฺตห}Xพcฑฑฑ …‘‘€ืY๎ป={๖,ิท่฿ฟ?ภีีK–,‚€๏ฟhถ-.^ผXไถŽ?Žnบบu๋†cวŽ‚ƒƒกงง‡?๘?๔“ุ฿าา›7oฦๆอ›ƒเเ`hii•i?๓๓๓‘’’‚œ;w๙๙๙XธpกุดiS๙็Ÿˆ‹‹รำงOammำงO9ึ˜1cžž.พnบUฆ˜ˆˆˆ่รภ‚๔=KHH@rr2lllเๅๅ…๘๘xฉ]'** 999HHH@BBยko377ืฏ_‡ ศฬฬ—oุฐ•+WFPPๆฮ‹ว‹mšššP*•โ๛‚ูฮโ˜˜˜ Zตj๐๓๓ƒL&C‡˜˜(ถ็ไไ`บuุ่ฑ#Ž;†E‹A.—9–ฎฎ.ŒŒŒT^DDDTqฑ }วZดhตkืŠืAzxxเฝ{HMMลัฃGแ์์ŒํทซCกPภฬฬ šššุธqฃXT"##C์็้้‰u๋ึVฏ^ ////N`ธq:tจุ?00[ถlALL  <<<077วํท‘™™‰ดด4๕ื_jc”ษd๐๕๕ลูณgผ˜nิจ`ึฌYhิจ:„™3gโไษ“๘๊ซฏ งงW๊<Qลล‚๔ณททวเมƒแ้้ GGGฬ›7ฏุพล]C†ƒB.—ใศ‘#077ศๅr<\ผฉ)<<ัััหๅุผy3&OžŒ‹/bำฆM˜0az๔่'Ož`็ฮ*ตดดฤ„ ๐๗฿‹ฉŽŽ†GGG„††ยััQ์฿ฏ_?xxx >>ตjี ๊้ำงc๐เมหๅ๘็Ÿ0hะ €““’’’ ''งท“X"""ช0d‚ RAคŽBก€ฑฑ1H„พaฉร)”๙จv? ีo๖(ฑ ‹9R๙QO‚๔v๛ไฝl็mษออEtt4Zทn mmmฉร)w>ึNOO/๑๒;ฮ‘คX‘คX‘คX‘คX‘คX‘คX‘คX‘คดค€จดพpฌ ฉร(w^ึNOO๏็)N…>eODDDDๅ–Hpp0ฎ_ฟฎฒl๋ึญotง;ั‡ˆฉDถlู"uDDDDๅOู‘คX‘คX‘คX‘คX‘คx—=}0\ฌ`bRE๊0ส\D_šิ1จธ:˜#๕˜๕˜ขw3คDDDD$)คDDDD$)žฒงฦร ‘#ห‘:Œr'_K๘b1๔ฌ อผ,ฉร)—˜#๕คฬลzล{•Oœ!%""""Iฑ %""""Iฑ %""""Iฑ %""""Iฑ %""""Iฑ %""""Iฑ %""""Iฑ %""""Iฑ %""""Iฑ %""""Iฝ•‚4$$M›6-U฿.]บภััQQQocำฏญy๓ๆธt้’$Gddไ‹ะะะ2ญŠุุุ7ฺดiำ๐ษ'Ÿ F*ห•J%†ކ ขQฃFุปw๏m‡ˆˆˆ>oท์๗ํMMอR๕ฝw๏._พŒฤฤฤBm๙๙๙ฅG*BŒoโูณgะาา‚ŽŽNฑ}>s๔์ู7VYพx๑b(•Jคคค ??้้้€'Ož jีช๏4n"""๚ฐฝึ ้โล‹แเเGGGLœ8นนน˜:u*ฦWช๕ตk‡+Wฎภษษ ็ฯŸ‡ตต5ฦŒ'''œ8q“'O†ฝฝ=ไr9v์ุเลŒ ฟฟ?Zทn kkkDFFbส”)หๅhีช๒๒๒Š๖ํแไไGGG๔้ำG\พt้Rธธธภููทnlบ๎๎๎prrB๛๖ํ๑๔้S@ฏ^ฝ0pเ@ธนนa๎น˜;w.5jGGG >ผุm_บt พพพptt„ปป;ฒณณgฯž…——๊ึญ+ฮ"ๆๅๅaุฐapssƒ“““ธ๏ …aaaหๅprrB\\œส6v๏ ___คงงcืฎ]hฺด)œœœะฟ(•Jภ๘๑ใัฐaC๘๛๛ใ๑ใวEฦz๑โE 2vvvx๒ไ จฬ€พ<ณ๋๊๊ KKหBc,^ผcวŽhjjขZตj€3f YณfXฑbฒฒฒŠอืหฒณณกP(T^DDDTq•บ MJJย‚ p์ุ1$&&bุฐa˜={6z๖์ CCC•พ‘‘‘b'ƒ7n„ƒƒเเเฐถถFBBtttฐ}๛vœ={{๖์ม!Cฤข0)) QQQ8sๆ ~๘แุุุ )) ๚๚๚8pเ@‘๑>x๐#GŽDLL 1}๚tฑอภภgฯžEทnฤ8}}}q๊ิ)$$$ Yณf๘ใ?ฤiii8}๚4F…)Sฆ >>‰‰‰ˆˆˆ(6_ปwGxx8ฑw๏^hkknธร‡c๚๕โ๚K–, ฮœ9ƒ#GŽ`๔่ัศออลคI“ะ A$%%!.. 4ว฿ฝ{7ฆL™‚mถ!77s็ฮEll, ฉฉ‰อ›7ใ๔้ำุทo.\ธ€ฅK—โไษ“โ๚ูููˆŠŠ‚๚๗๏777๗฿077Ww๋ฝ{˜7o\\\†ดด4ภิฉSฑhั"œ={9r$RRRิŽ5mฺ4‹ฏฺตk—)&"""๚0”๚”}มต‹FFF€็ฯŸc๏ฝุฟ?nธกาทโืฎฎฎXฒdIฑใv๎p๘q„„„@WWhธ1.^ผ๐๔๔O๛ฃmถ{{{ผyณศqO:???XXX€8cAAAgggฑ๐ผy๓&:w๎Œเูณg๐๓๓๛‡„„@&“\\\ะญ[7t๎:t(r …๘์ณฯฤ˜ ดiำšššpvvFjj*€—=$''cูฒe€ŒŒ ฝ{Dtt4@KKKฬนs็p๙๒e8pUชTมŽ;””$^ว๛๙sXYYแ๖ํุ่ฑ#ดตตQณfMx{{‹qธบบBGGห—/‡ฝฝ}‘๛๑:าำำaccƒณgฯb๊ิฉ˜4ifฯž ฐณณร/ฟ‚Ÿ๓ๆอƒฝฝ=ึฎ]‹N:9ึ˜1c0rไH•|ฒ(%""ชธส|SSBB’““acc///ฤวว‹…๋จTฉR‰}^พฆQCCC|ฏกกืฆฎฎnก๕‡Šqใฦแ๙๓๘๙็ŸลS์ฏฦธkื. 0‡F``เ[ูถ ๘ใ?€„„ผyVVVลŽQซV-ไ็็ใ๏ฟืo฿พฝธ~JJ พ{ ้Wฟ^ดh์์์ะนsgLž<w๎Qูฦห}_ฮEq,--ล=88Xๅ:aฅR‰่่htํฺQQQ˜9s&>๓bวาีี…‘‘‘ส‹ˆˆˆ*ฎRค-Zดภฺตkล๋๙<<žฒ'""""Iฑ %""""Iฑ %""""Iฑ %""""Iฑ %""""IUˆป์้ใ`™ฉร(wrss่h˜/ฟ๓Q=p๙u0G๊1?D$5ฮ‘คX‘คxสž>สEกิUJFนฃ”้u†B9?J!G๊pส%ๆH=ๆGฝ๒–‘Iั[วR""""’ R""""’ R""""’ R""""’ R""""’ R""""’ R""""’ R""""’ R""""’ R""""’T…/Hำาาฐdษ’bkิจQโ‡†ผฝฝ฿fhฅ‹ะะPIถ]”กC‡ยM›6UY๙st๋ึ 5ยงŸ~Š .H!}H>๚‚ด4Vฏ^)SฆเฏฟT~p~~๛>ผnŒOž<)ฑOhh(ขฃฃ -Ÿ4i7nŒK—.!>>VVVฅ“ˆˆˆ>^ฎ ฝ{๗.š5k'''ศๅrŒ5 ็ฯŸ‡““fฬ˜ฬฬLรึึ๛๗/qผ+V`ร† 5j „eห–!$$พพพ่ฝ;ฎ^ฝ oooศๅrt้า™™™€ๆอ›cิจQpvv†››โโโะฒeKิฉSปvํ*v{ …aaaหๅprrB\\€E]ปvํPฟ~}L™2E์฿ถm[ธธธภมม›7oคฆฆยษษ ]บtญญmกœ\บtฉะvOž<‰^ฝzมีีUใๅะ^ฝza๗๎OOO˜˜˜cบu2d@OO†††€มƒ# [ถlA^^^‰9ฯฮฮ†BกPyQลUแ า5kึภฯฯ 8{๖,&Ož $$$เป๏พร‚ `ccƒไไdดjี <ืurrฟ๎ำงโโโะฃGaม‚Xฐ` )) ;w๎ฤ๊ีซ1t่PŒ1IIIฐถถฦœ9sฤ1LLL/// <ปvํยึญ[1y๒ไbใŸ4i4h€คค$ฤลลกAƒ€๘๘x,[ถ ‰‰‰ˆŒŒ ฿+Vเ์ูณ8v์ฦA/^ฤฤ‰‘’’R('3—ˆŒŒ„‹‹ """ะพ}{คคค”)๏Ož<ŽŽ† ggg 8ููู€จจ(DDD`วŽฐตตลฤ‰q๛๖ํbวš6mŒลWํฺตห}*\A๊ๆๆ†•+W"""Wฎ\พพพJ๛๑ใวล๋1ทoJ•*‰m โืK–,g _(ฮ%$$ cวŽ€nบแุฑcbฟถmเ้้ ===ุใๆอ›ลฦ๐เAqๆVKK FFF€fอšมฤฤ•*U‚ ๎ฝ ˜3gแํํิิTฟ๐้งŸยฮฮNmN,--ฑy๓flผ111†––Vฑฑฉ“ŸŸ””„„„เนsศฯฯวย… ล๖ฆM›โฯ?D\\ž>} kkkœ>}บศฑฦŒƒ๔๔t๑u๋ึญ2ลDDDD† W๚๘๘เศ‘#033CงNpเภB}d2ูmใๅ"V€†††สืeน๖TWWWบ`ŒC‡แ๔้ำ8}๚4acc#ฮJพcq9ูฐa*WฎŒ   ฬ;?ืัิิ„Rฉ฿Œ[TซV ~~~ษd่ะกล๖œœฌ[ท;vฤฑcวฐhั"ศๅ๒b๗ีศศHๅEDDDW…+Hoธ 0กกกHKKCFF†ุ๎้้‰u๋ึv๎‰gฯžฝั๖œœœฐcว/n~๒๒๒zฃ๑ ศหหS‰U …ีชUƒฎฎ.NŸ>ฟปศ~ฏๆไ๙๓^ฬ๔nูฒ111P(๐๐๐@XXภทo฿Fff&าาา ะ๕*™L___œ={ภ‹'4jิ0kึ,4jิ‡ยฬ™3q๒ไI|๕ีWะำำ{ฝไQ…Tแ าุุXศๅr8;;ใฏฟBฯž=!—ห!—ห1cฦ 4Wฏ^…vํฺsssqขฎ!-ษผy๓0}๚tศๅr๓ฯ?>|๘ล?~x\พ|pssรๅห—‹ํ€วรฮฮNึNOO/๑๒ป 7CJDDDD–ฒRMolฯž=๘แ‡T–โ๛ŸDIƒฉD uDDDD’ใ){""""’ R""""’ R""""’ R""""’ R""""’๏ฒง†ฦ7›กab"uๅŽFn. มปก๑=p๙u0G๊1?๊1?D๏gH‰ˆˆˆHR,H‰ˆˆˆHR}๚ ..ะฅKœ9sIIIะืืวŽ; WWWlูฒ๕n฿พ)Sฆเ่ัฃ8qโfฯžิิิB๑บu &L€ญญ-v๎‰I“&!**ชL๛zๅส่๋๋ฃM›6hธ1ๆฯŸ/ถฅคค ((แแแpuuลย… ๑๔้ำbวสฮฮ†BกPyQลล‚๔rssรส•+!l/;~8BCCํทGฅJ•ฤถ„„๑๋%K–ภีี˜˜ˆfอšมมม;v์@rrrกํฦลลม฿฿UชTกก!Zทn]hv๒๔้ำฐฑฑมณgฯ‡?ณศูำาสฯฯวัฃGฑdษ9rK—.Ebb"€ง๙ƒƒƒƒM›6aำฆMฐฐฐ(vฌiำฆมุุX|ีฎ]ปฬqQ๙ว‚๔๒๑๑ม‘#G`ff†N:แภ…๚ศdฒืณo฿พXถlฮŸ?aร†!;;ปLฑษๅr,ZดGEงNฐ~zไไไˆํšššP*•โ๛’ถcii‰&Mšภยย๐๓๓CRR’ุ๘๑cฬ;AAAจ\น26lุP์XcฦŒAzzบ๘บu๋V™๖‘ˆˆˆ> ,H฿ก7nภยย @hh(าาา‘‘!ถ{zzbบu€;wโูณg%Ž™™™ SSSdee‰๋€กกก8ถ››8…BงOŸ"&&๎๎๎*ใ่้้แซฏพยษ“'1cฦ ผyอš5ƒžž"##Uฺฮœ9WWWุููก]ปvoด"""๚xฐ -ฃ’ าฒ*ฎ Jฅ๒ าาx๒ไ‰ฺv###ฬž=ฃFRYž››‹พ}๛bํฺตธx๑"๘ใ@NNž={๖ฮโ%""ข าRบ{๗.š5k'''ศๅrŒ5 ็ฯŸ‡““fฬ˜ฬฬLรึึ๛๗/ี˜฿}๗5jGGGฬ˜1[ถlA\\‚ƒƒแํํ 077ว€เเเ€ฏฟ?†““FŒฅR‰มƒร...8y๒$€Eํ่ัฃลํX[[#++ซุ8ฒฒฒฐ|๙rxzzbฦŒ€๐๐p•ะ‚฿*Uชภฺฺฺ*c์ูณจWฏภฬฬ ภ‹ืC‡Errrฉ๒BDDD-ฉ๘PฌYณ~~~ˆˆˆ@nn.ฎ^ฝŠ;w๎ˆEเ๔้ำaccƒ-[ถ`ถmXธpกธฎ““}๚๔Aaccƒ7โฺตkะะะ@zz:Œแ๊๊ŠศศH4jิ๐๐แCt่ะฟ; &&Fk๚๕ธ}๛6ฮŸ? . s็ฮธt้Rฉ๗)%%‘‘‘ุฑcฺดiƒล‹รฮฮฎL๙นrๅ ฒณณัขE ( Œ=!!!077วล‹ฑaร๔๋ื่ืฏ:u๊]]"วสฮฮFvvถ๘^กP”)&"""๚0ฐ -%777๔๊ี ่น3*Uชคา~๘q๘ใ€๖ํซดฤำyyy000@Ÿ>}ะกCดiำฆศํ"  ศถใว#,, 2™ จTฉsฬœ9QQQฺ่ต+ขฃฃUึyyŒขึ•ฅฅ%>๛์3มิิ...HII๏นƒŸ~๚ ;w†ฝฝ=-ZT์XcฦŒAzzบ๘บu๋Vฉ๖›ˆˆˆ>L,HK้ฦฐฐฐภ€Šดด4dddˆํžžžXทn`็ฮ%ศ๓๔้Sคงง#((ำงOgQ Uฦ}•†††X(zzzbร† /^ฤ๓็ฯann+++$&&NŸ>]ไฌฉ‘‘† †ฤฤDŒ1QQQhุฐ!VญZฐฒฒcฺพ}{‰๙๑๗๗วนs็““ƒฬฬL$&&ขnบโ>ภภภววŠ+เแแQ์Xบบบ022RyQลลS๖ฅ‹้ำงCGG&&&Xปv-โโโ —หัฝ{w 4_~๙%์์์เใใsssqขฎ!ญYณ&‚‚‚““™L†Ÿ~๚ ะซW/t๏ฆฆฆ๘๋ฏฟ ลัญ[7888ภ฿฿ณfอย‘#Gเเเ,]บเๅๅฺฺุยตkืVปo>>>๐๑๑มใว๑๗฿:v์ˆ?rนมมมb฿gฯžกAƒP(ะิิฤฬ™3q๕๊UTฏ^ฝ{๗†““4440jิ(XZZ"==#GŽD๓ๆอ฿$DDDTษAค‚H…Bccc<<ฒ&F๚R‡S๎ไ*7๘‰ฺ<็Qค๗•# ว๎๏n๐w(77ัััhบuก'h๓Sฬ‘zk~ ~~งงง—xถ“?พˆˆˆˆHR,H‰ˆˆˆHR,H‰ˆˆˆHR,H‰ˆˆˆHR,H‰ˆˆˆHR,H‰ˆˆˆHR,H‰ˆˆˆHR,H‰ˆˆˆHRKM๔มะฐํ ฉร(w4rs›ัะฐ…ฦG๔ภๅืม•oœ!%""""Iฑ %""""Iฑ %""""I๑R๚`l๎ฅพิQ๏\ท R‡@DD๔Aโ )IŠ)IŠ)IŠ)IŠ)IŠ)IŠ)IŠ)IŠ)IŠ้Gไ๐แรฐณณƒททw™วx9Zถl Œ=Zฅํ๊ีซ๐๑๑œ฿4\"""๚H๐O‡~DVฏ^)Sฆ C‡ล๖y๒ไ ชVญZlป––&L˜€ไไdธqCฅญw๏˜5kš4i‚‡–zL"""๚ธq†ดบ{๗.š5k'''ศๅr\บt ‹/†ƒƒ1qโDภฤ‰แๆๆ{{{๘ใโ๚ึึึ˜8q"แใใ…B+V`ร† 5j คฒฝผผฺดiƒฦc๙b[JJ ‚‚‚WWW,\ธOŸ>-vฌiำฆมุุX|ีฎ]ปL1ั‡i9ไๆๆ†•+W"""Wฎ\มแร‡ ###@ตjี€››œœœpๆฬ$''‹cœ‘ššZhงOŸ† ž={†ธธ8๙็Ÿhฺดi™cฮฯฯวัฃGฑdษ9rK—. d---#&&›6mยฆM›`aaQ์XcฦŒAzzบ๘บu๋V™ใ"""ข๒i9ไใใƒ#GŽภฬฬ :u‚ …๚deeaไศ‘ุตk’’’ะนsgdgg‹ํบบบ ไ็็Z_.—cัขE8z๔(:u๊„๕๋ื#''Glืิิ„Rฉ฿ฟ3Z†ลฒ3šฃ!""ขท…3คDDDD$)คDDDD$)คDDDD$)คDDDD$)คDDDD$)คDDDD$)คDDDD$)คDDDD$)คDDDD$)คDDDD$)คาาาฐdษฉร๘ ,]บ๕๋ื‡L&CVV–JดiำะฐaC|๚้งXถl™4ั‡)ิค๙๙๙๏9้ถ›››‹ฬฬLต}ฐw๏^XYYฉ,฿ณgฮœ9ƒไไd$''ฃM›6^ไ–ˆˆˆH _ฝ{อš5ƒ““ไr9Ž?ฎ๒าฅK;v,ฮŸ?'''ฬ˜1ห–-CHH|}}ัฝ{wsธธธ 00<X[[‹ณ“ห–-ร่ัฃ฿}๗5jGGGฬ˜1Šใeฉฉฉ๘๑วัจQ#q฿Іฝฝ=lll ฑx๑b๐ระิิ„L&ƒฉฉ)`อš5pttฤ‚  P(J๕– …Bก๒"""ขŠซยคkึฌŸŸp๖์Y:tHๅฝ••ฆL™$$$เป๏พ$%%a็ฮXฝz5FŒ‰'"..ณgฯฦศ‘#]บtม™3g””}}}์ุฑCฎ‰‰ โใใแๅๅ…มƒcืฎ]ุบu+&Ožฌ6kืฎแศ‘#˜5k „%K–เ์ูณ๘๚๋ฏ๑ำO?ปใวฑqใF$''#11฿|๓ ;F~~>ถo฿Žึญ[ฃcวŽจYณ&ฮ;gg็2ๅ๙ส•+ˆŽŽ†››ฺถm‹[ทn €mถแฝ{puuE฿พ}q๖์YตcM›6 ฦฦฦโซvํฺeЉˆˆˆ> ZR๐ฎนนนกWฏ^ะะะ@็ฮแํํญ๒ึึถศ๕ahh8x๐ ’““ล6MMM@bb"ฦ…Bดด4ิฎ]ํทดmเเเ™L===ุใๆอ›jใํะกดตต‘‘‘cวމใๅ็็ฃnบลฎgll ๔้ำ:t@›6mิŽักC\ผx+Vฌ€——W‰y,I~~>๒๓๓qๆฬฌ^ฝร† รๆอ›ผ˜m}Pฟ~}ตPวาา:tc๘๑*ํ๕-Z„ธธ8๘ใ่ึญ[ฑc้๊๊BWWทฤmQลPแOู฿ธq0`BCCq๔่Q•๗็ฯŸ‡กก!222Šร[ผ้IฉTโ๙๓€ฬฬL˜šš"++ ๋ึญ{ซqฃjีชุปw/€7๗฿+++$$$@ฉTb็ฮ€งOŸ"==AAA˜>}:ิŽaoo฿~๛ ๑๑๑จ_ฟ>ยยย๐ูgŸ!55ตุmจำถm[>|‹F๖๎ {{{ฬœ9]ปvลล‹1v์X˜››ฟฝdัญยคฑฑฑหๅpvvฦ_kkk•๗บuƒ‰‰ ไr9ไrนx3ะห~๕Wฤฤฤภัั๖๖๖โIcวŽEใฦ๑ูgŸ•๙ฺKuขขข0cฦ 8::ยษษ งNŒ7=z๔€งง',--hำฆ ัพ}{๑Zัโฦ(Pนre๔้ำgฮœมฬ™3กฅฅU์6€78ีชU ทo฿Fฝz๕0fฬ/f‹?L™2sๆฬ๐โZฺปwcถmhบuกYf""""™ ‚ิAฉฃP(`llŒแ1#กeXU&3šฃ*?rssึญ[C[[[๊pส%ๆH=ๆG=ๆงdฬ‘zk~ ~~งงงรศศHm_NW‘ค*MMๅัž={๐ร?จ, ฤ๗?‰"""""’ R  @๊0ˆˆˆˆสžฒ'""""Iฑ %""""Iฑ %""""Iฑ %""""Iฑ %""""I๑.{๚`Œs๛&&&R‡ADDDogH‰ˆˆˆHR,H‰ˆˆˆHRทnย„ `kk‹;wbาคIˆŠŠ*ำ~^นr๚๚๚hำฆ 7nŒ๙๓็‹m))) Bxx8\]]ฑpแB<}๚ดุฑฒณณกP(T^DDDTqiI@E็ๆๆ†^ฝzACC;w†ทททส{[["ื „กก!เเมƒHNN455‰‰‰7n าาาPปvmดo฿ะถm[€ƒƒd2๔๔๔`oo›7oNŸ> OOO >qqq022zฃฬฯฯวัฃG‘˜˜CCC๘๚๚ยŽŽŽะาาBpp0‚ƒƒqใฦ ๔ํ฿~๛-222Škฺดiˆˆˆxฃxˆˆˆ่รมาwฬววGށ™™:u๊„\•๗(rฝJ•*‰_หd2œ;w โฬ*๔ํห–-ร๙๓็1lุ0dgg‹๋่่่444Tพ.ธ&U.—cัขE8z๔(:u๊„๕๋ื#''G\_SSSผ€สุEฑดดD“&M`aa๘๙๙!))Il๘1ๆฮ‹   Tฎ\6l(vฌ1cฦ ==]|บuKํถ‰ˆˆ่รฦ‚๔ปqใ,,,0`ภ„††โ่ัฃ*๏ฯŸ?CCรbg ภ[ผ้IฉTโ๙๓€ฬฬL˜šš"++ ๋ึญ{ญธ๔๔๔๐ีW_แไษ“˜1c<ˆFaึฌY+++$&&x1›๚เมตใ5iาw๏…Bก@^^Ž;†† ยยยเแแ…B˜˜lูฒลŽฅซซ ###•U\!uบยฤฤD๊0ˆˆˆ่-ใ )IŠ)IŠ)IŠ)IŠ)IŠ)IŠ)IŠ)IŠ)IŠ)IŠ)IŠ)IŠ)IŠ)IŠ)IJK๊ˆJ" ##ฺฺฺGSไๆๆโูณgP(ฬO1˜#๕˜๕˜Ÿ’1G๊}ฌ๙Q(๏็ธ:,Hฉ{๘1ภฦฦFโHˆˆˆ่ueddภุุXmคT๎UซV p๓ๆอ่ขธนนแฬ™3๏mฝ๗ฝM…Bฺตkใึญ[022z/|“๕คุๆ›ไ่CฺฯฒฎหcH=ๆงdS๏c=†A@FF,--K\)•{/.u666.ำ7ฒฆฆๆ{]Oชm1?%(KŽ>ดไ1๔๎ถษ”Œ฿c๊}ŒวPi'’xSUxƒ zฏ๋Iตอฒb~6?คพ‰i?™Ÿwทอฒ๚ะ๖๓Cสั‡”[™Pš+M‰$คP(`llŒ๔๔๔7๚อฝขb~Jฦฉวจว”Œ9R๙)gHฉำีีลฤ‰กซซ+u(ๅ๓S2ๆH=ๆG=ๆงdฬ‘zฬOษ8CJDDDD’โ )IŠ)IŠ)IŠ)IŠ)•{ ,€ตต5๔๔๔เ๎๎ŽำงOK’$ยรร!“ษT^5ณฒฒ0hะ ˜˜˜ภภภ:uยƒ$Œ๘:rไฺตkKKKศd2lบUฅ]L˜0ะืื‡ŸŸฎ\นขา็ฟร—_~ ###TฉR_5ž>}๚๗โ*)Gฝz๕*tLช๔ฉจ9š6m`hh333t่ะ)))*}J๓=u๓ๆMดiำ•*U‚™™พ๛๎;ไๅๅฝฯ]ygJ“ฃๆอ›:†๚๗๏ฏางขๆ่๗฿‡\.v๏แแ˜˜ฑc?~^ R*ืึญ[‡‘#Gbโฤ‰8w๎€‡Jš$์์์p๏=๑u๔่Qฑmฤˆุฑc6lุ€ร‡ใ๎ปุ่ฑฃ„ัพ[™™™pttฤ‚ ŠlŸ>}:ๆอ›‡ศศHœ:u •+WF@@ฒฒฒฤ>_~๙%.^ผˆ}๛๖a็ฮ8rไพ๙ๆ›๗ต ๏\I9€ภภ@•cjอš5*ํ5G‡ฦ Aƒp๒ไI์ทนนน๐๗๗Gffฆุงค๏ฉ|ดiำ9998~8–/_Žeห–aย„ R์า[Wš@฿พ}UŽก้ำง‹m9Gตjีย๗?œ={qqqhัขฺทo‹/เ๑๓ฺขrฌI“&ย Aƒฤ๗๙๙๙‚ฅฅฅ0mฺ4 ฃ’ฦฤ‰GGว"าาาmmmaร† โฒฟ[ œ8qโ=E(ย–-[ฤ๗JฅRจQฃ†0cฦ qYZZš ซซ+ฌYณFAHNNgฮœ๛ฤฤฤ2™Lธs็ฮ{‹}y5G‚ ={๖ฺทo_์:SŽ>|(>,B้พงขฃฃ แ๛bŸ฿]022ฒณณ฿๏ผฏๆHมืืW6lXฑ๋|l9ชZตชฐdษ?eภR*ทrrrp๖์Y๘๙๙‰ห444เ็็‡'NH™tฎ\นKKKิฉS_~๙%nผ 8{๖,rssUrีจQ#|๒ษ'eฎฎ_ฟŽ๛๗๏ซไรุุ๎๎๎b>Nœ8*UชภีีU์ใ็็ œ:u๊ฝว,•ุุX˜™™กaร†0`?~,ถ}L9JOOTซV @้พงNœ8˜››‹} P(ฤYฒŠไีˆŠŠB๕๊ีaoo1cฦเูณgbว’ฃ|ฌ]ป™™™๐๐๐เ๑SZR@TœG!??_ๅ›ฬออq้า%‰ข’Žปป;–-[†† โฝ{ˆˆˆ€ทท7.\ธ€๛๗๏CGGUชTQYว๗๏฿—&` ์sQวNA๛๗affฆาฎฅฅ…jีช}49 DวŽaccƒkืฎแวDซVญpโฤ hjj~49R*•>|8š5k{{{(ี๗ิ๛๗‹<ฦ ฺ*’ขraaaฐฒฒ‚ฅฅ%’’’๐ร? %%›7oP๑styxxx ++ ุฒe lmm‘ภใ็5ฑ %๚@ดjีJZ.—รVVVXฟ~=๔๕๕%ŒŒ>Tกกกโืหๅจ[ท.bccัฒeK #{ฟ „ .จ\“MชŠหัหื;88ภยย-[ถฤตkืPทn๗ๆ{ืฐaC$$$ ==7nDฯž=q๘๐aฉร๚ ๑”=•[ีซW‡ฆฆfกปkฎ ๖YฑSฃFB7วๅๅๅแฟ๛(su๊ิA๕๊ีq๕๊UGŽŒ;wโะกCจUซ–ธผ4฿S5jิ(๒+hซ(ŠหQQ@ๅชศ9าััAฝz๕เโโ‚iำฆมััฟ๒ Ÿ2`AJๅ–ŽŽ\\\pเภq™Rฉฤเแแ!adๅรำงOqํฺ5XXXภลลฺฺฺ*นJIIมอ›7?ส\ูุุ F*๙P(8u๊”˜คฅฅแ์ูณbŸƒBฉTŠ?T?6ทo฿ฦใวaaa b็H <[ถlมมƒaccฃา^š๏)œ?^ฅh฿ทoŒŒŒ`kk๛~vไ*)GEIHH•cจ"็่UJฅููู<~สB๊ปชˆิYปvญ ซซ+,[ถLHNNพ๙ๆกJ•**w%~,F%ฤฦฦ ืฏ_Ž;&๘๙๙ ีซW>|(‚ ๔๏฿_๘ไ“O„ƒ qqq‚‡‡‡เแแ!qิ๏NFF†/ฤวว „ูณg ๑๑๑ย7A„๏B•*U„mถ IIIB๛๖ํแ๙๓็โ‚ณณณp๊ิ)แ่ัฃB๚๕…ฎ]ปJตKoบedd฿~๛ญpโฤ แ๚๕๋ย๛…ฦ ๕๋ืฒฒฒฤ1*jŽ   ฑฑฑยฝ{๗ฤืณgฯฤ>%}Oๅๅๅ ๖๖๖‚ฟฟฟ ์ฝ[055ฦŒ#ล.ฝu%ๅ่๊ีซยคI“„ธธ8แ๚๕๋ยถm„:u๊>>>โ9GฃG>,\ฟ~]HJJF-ศd2a๏ฝ‚ ๐๘y],Hฉ๛๕ื_…O>๙Dะััš4i"œฅ๙žJMMZตj%่๋๋ ีซWF%ไๆๆพ็ฝy7Jสัอ›7กZตj‚ฎฎฎPฏ^=แป๏พาำำUฦฉจ9๚๊ซฏ+++AGGG05ํkL“็๐  ณดดhื*›‡ชa‰ฒษ2AgTฝ‡็p?…W>}งศาฅK•0*ยŸฑ ๙๗žวyโR""""๒)R""""๒)R""""๒)R""""๒)R""""๒)R""""๒)R""""๒)R""""๒)R""Rtwwรbฑ ซซหืฅx˜3gฎ\น2ฆ>fณ PEcำิิ„… ๚บ "ฟล@JDไGฬf3&Mš„๎๎nๅšหๅBXXฬfณGป—^z *• ‘‘‘ศศศ@[[›วX?๔ำ˜Cะแร‡‘––•J๕—ึ๑wkllDBBยฟ2W}}=^yๅk›7oฦงŸ~๚ยcฮ˜1zฝgฯžซๅ'1๙™˜˜TUU)็gฮœATTิv_5บบบ`ท๑ไษyฏญญErr๒˜ๆ๓ฯaตZ_จ๎ฑpป๘bpญVซวŽ๓q5D‰”ˆศฯXญV”••)็_~๙%6n่ตคI“šš ›อๆq}0๖๔๔ภjต"""Xดhัฐใุํvดดด`ผyส5ณูŒปwc๖์ู CAA~๙ๅ,Xฐ|๐าv``………0ˆŠŠยถm๐วพ๘โ ,Yฒ999ะh4())Akk+233กำ้0}๚t”––z]ใณ_ฟWWWcๆฬ™สSใ'Nxํw๙๒eฬ˜1‘‘‘ุฑc”{ฤซฏพŠษ“'cำฆM่๎๎F?Vฎ\‰ๆๆfจT*จT*”––ขฌฌ EEEPฉTสšoผ‰ฤฤD„‡‡c๙๘แ‡”ฑpเภL›6 K–,$&&โ๙๓ใ*Œ=7!""ฟa2™คพพ^ ƒุงฅฅ/ฟฒrฯd2กฅฅE97 สฑnGoo/ฆL™ญV ญV‹#GŽเฝ{#~.PYY‰ำงOร`0 99yศV…gFc‡รกฬŸ““ฃฬึ[oแแร‡ฃฮl.\P๚kตZุl6ฏ๋ิูู F๓๓ คDD~hม‚hmmE[[โใใGl‚ฌฌ,\ปv =๐๔O+VฌLœ8;w๎DSSพ๚๊+์ท๕๕๕Cฦ™7o~๛ํทฎ9::vป]9ทํˆŽŽVฮ”ใ˜˜จT*ดตตม้tย้tขณณ‡už7x555ธ>โโโ<ž ฏ;w๎x8,&&ฅฅฅสNงSyณมณuW๛`+V ้Ÿ™™้ตฯฝ{๗เvป;๊‰ฦR""?u๊ิฉ็๚ ปฏฏๅๅๅะ้tˆŒŒฤญ[ท Vซ•๐UWW‡ฦฦF @ญV#((hุ-&“ zฝ7o|กz7lุ€={๖เ๎ปhmmEQQy็aฦฤฤ !!Ÿ|๒ \.n7ฎ_ฟŽŸyฤ9žSธรแ@mm-€งO„>|่๑๊-N‡ทo+็kึฌม?ˆชช*ธn๔๔๔ ถถvฤฏใ/^ผˆท฿~AAA#ฎ‘hล@JDDDD>ล@JDDDD>ล@JDDDD>ล@JDDDD>ล@JDDDD>ล@JDDDD>ล@JDDDD>ล@JDDDD>๕'zYตลฯญpIENDฎB`‚c4core-bm-charconv-atox-mega_bytes_per_second-u32.png000066400000000000000000001060771477602032300331050ustar00rootroot00000000000000c4core-0.2.6/doc/img/windows-x86_64-vs2019-Release‰PNG  IHDRคฺˆ 9tEXtSoftwareMatplotlib version3.5.3, https://matplotlib.org/อ+นา pHYsaaจ?งi‹ฌIDATxœ์wxี๛๗๑wา ˆtฆ‚ค‰tˆ„"กc@iŠ‚‚T๑+าE)Š i‚ %t้E’H้ME’ ’yเษX’@@`!~^ืตู™3g๎นณ์9sfึฮ0 ฑทu""""๒฿ฆ‚TDDDDlJฉˆˆˆˆุ” Rฑ)ค""""bS*HEDDDฤฆTŠˆˆˆˆMฉ ›RA*""""6ฅ‚Tไ9~8vvvL˜0มึกdู๋gŸลวววึaไ˜ฝ{๗ถu๒ูธq#vvvlธัึก็uํฺ777[‡q฿uํฺ•2eสุ:Œ‡ž R๙O9pเ#GŽไ๘๑ใถEฤ&ถo฿ฮศ‘#‰‹‹หQ๛C‡ัฟjึฌ‰‹‹ vvvูฑณณรฮฮŽ๎ปgน~ศ!f›ฟ๛.เฬ;—I“&๋~&น๑˜ไ๎EDD0rไศ,ื๕๏฿Ÿ*UชPฐ`A๒ๆอหำO?อศ‘#น|๙ฒUปปwำปwoผฝฝษ—/?8ํท็๐แรwฯพ ค๒ŸrเภFฅ‚Tณถo฿ฮจQฃrฒcว>๛์3x๚้งoลล…‘”””L๋พ{\\\๎4ไlM๑Vทn]ฎ^ฝJบu๏Y๗’ า็ซฏพโะกCwตmDDฃFสr๎ปฉSงฃFโำO?ฅ~๚|๘แ‡4n˜๔๔tณG}ฤ?Hร† ๙๔ำOyํตืุผy3UชTa฿พ}wฯพ‰<๗ผG‘๛ศ0 ’’’puuตu(”ฤฤD๒ๅหwว…††‡ปป;&L **๊–ํ7nฬาฅKYนr%-Zด0—o฿พcวŽัฆM~๑ว;Žใ฿JJJยษษ {{๛{Zหรํaxฟpttผ/nบ5ำฒ๒ๅห๓ึ[oฑkื.ชWฏภ€˜;w.NNNfป^x___>๐Cfฯž}_โปS!•\แฤ‰ผ๑ฦTจPWWWผผผhืฎีH่Œ3hืฎ๕๋ื7O8—์‹/พภgggŠ/Nฏ^ฝฌ์าฅ ...๖oV๛ ก@œ={6G๑~๒ษ'”.]WWW๊ีซ—ๅ_ฉคmถ,XYบtฉU›3f`ggวถm0`… "_พ|ดjีŠฟ๚+SŸ+Wฎค^ฝzธปปใแแAPPs็ฮอิ๎ภิฏ_Ÿผy๓RขD ฦgต>c?ภจQฃ(Qข๎๎๎ดm–๘๘x’““้ืฏ… ฦออnบ‘œœlีวท฿~Kƒ (\ธ0ฮฮฮTชT‰/ฟ2S,eส”แ๙็Ÿg๕๊ีโ๊๊สิฉSณอํ˜1cฐทท็๓ฯ?7—>>8;;ใํํอชUซฬ6 .ฤฮฮŽM›6eŠe๊ิฉุููYฝ>๎ไuฑiำ&xใ .Lษ’%9r$ƒ  lูฒๆ[1(Xฐ ๎๎๎9ส@‰%จ[ทnฆืีœ9s๐๕๕อ๑ๅ„„๚๕๋G™2epvvฆpแย<๗s๚๋ฏภ๕๙ฮ+Vฌเฤ‰ๆqdฬำหx}ฮ›7กC‡RขD ๒ๆอ‹ลbษriฦ้ฝ๎แ๚{Mhh(๙๒ๅฃpแย๔๏฿ŸีซWg๊๓ศ‘#ดiำ†ขE‹โโโBษ’% #>>>cพี1๙็Ÿผ๒ส+)R๙๎ป๏r”ฯŒG[ทnๅ™gžมลล…rๅส1sๆLซv#GŽฤฮฮ.ำ๖ฏฉ_+}nธัฟ้๋๋kๆaัขE๘๚๚โโโBีชUูปwo–ฑ๑ว„„„/_>Š/ฮ่ัฃ3_JOOgาคIx{{ใโโB‘"E่ัฃ—.]ส๒8ณzฟXปv-ตkื&ธนนQกB}๗]ซํs๚^‘U> ๋9ส7ฯ!ฝ๑z‚iำฆQพ|yœ b๗๎VM™2๘ฟ้0Ynn>~ภ๊sซfอšVล(ภ“O>‰ททwฆฯฒ[น›๗;กRษv๏อ๖ํ ฃdษ’?~œ/ฟ’gŸ}–7o^๊ึญKŸ>}๘์ณฯx๗wอำŽ9’QฃFฬ๋ฏฟฮกC‡๘๒ห/ูฝ{7ถmรัั‘O?”Ÿ™.]บฐcว˜:u*kึฌaึฌY/^ถฑฮœ9“„„z๕๊ERRŸ~๚) 4 66–"EŠฐ~jีชE‰%x็wศ—/?๐-[ถไวคUซVV}พ๙ๆ›(P€#Fp๘q&MšD๏ฝ™?พูfฦŒผ๒หx{{3x๐`๒็ฯฯฝ{Yตj;v4]บt‰ฦำบukฺทoฯย… ๙฿‡ฏฏ/Mš4ฑฺ๏ุฑcquuๅwแ๗฿็๓ฯ?วัั{{{.]บฤศ‘#ูนs'3fฬ lูฒ >๖ห/ฟฤ›ะะP๒ไษรฒeหxใ7HOOงWฏ^V๛9t่:t Gผ๚๊ซTจP!ห:”>๘€ฉSง๒๊ซฏšห;w๎ฬฆM›2}ศ,--็Ÿž๕๋ืF฿พ}IHH`ํฺต์ท๒ๅหcกกกlุฐW^y…€€Vฏ^อ Aƒ8sๆ Ÿ|๒‰UŸ[ทneัขEผ๑ฦธปป๓ูgŸัฆMNž<‰——อš5รออ~๘z๕๊Ym;|ผฝฝอ"๎N_oผ๑… b๘๐แ$&&าคI>ฬ๗฿ฯ'Ÿ|ยc=@กB…n™—;ีฑcG๚๖ํหๅห—qssใฺตk,Xฐ€”””ฃ>z๖์ษย… ้ป7•*Uโโล‹lบ•฿~๛*Uช0dศโใใ9}๚ด™๓›/y๏ฝ๗prrโญท"999ำ‡๒r๒บOLLคAƒœ;wŽพ}๛RดhQๆฮห† ฌ๚JII!$$„ไไd|๓MŠ-ส™3gXพ|9qqqxzzfรญŽ้๊ีซ<๛์ณ๛๏๔๎›ฒeหฒ`มบvํJ\\}๛๖ฝmNwฺถmห+ฏผB—.]๘ๆ›oฺ่ต+UซVล๛ถgืgวŽ้ัฃ/ฝ๔&L y๓ๆ„‡‡๓๎ป๏๒ฦoื฿+ฺทoฯกC‡ฐทฟฑฐดด47nL๕๊ี7nซVญbฤˆ\ปvัฃG›ํz๔่มŒ3่ึญ}๚๔แุฑcLž<™ฝ{๗š๏ฯฒzฟุฟ?ฯ?<~~~Œ=ggg~wถmfu<9}ฏธๆฮKBB=z๔ภฮฮŽqใฦับuk๘ใ้ัฃgฯžeํฺตฬš5+ห>ฎ]ปF\\)))์ทกC‡โ๎๎ฮ3ฯjิจa”.]ฺjYVฟณฃ\นrVหJ—.mฦชUซ2ตŒ^ฝz†a4์ํํ3fdj—q\ท๓อ7฿€๑๑วgZ—‘ง%K–˜ฟตmึฐณณ3~wซ๘œœœฌ–EGG€๑๙็Ÿ›ห:t่`.\ุธvํšน์นs†ฝฝฝ1z๔hsูพ.jืฎmีงaฦ๘๑ใ ภ8v์ุm๓qณm›๑๛๘็Ÿ '''cึฌY†aฦŠ+ ;;;ใ๘๑ใฦˆ# ภ๘๋ฏฟnน/OOO๓w›fอšez]ฦฝ>ห•+—้u–ฑ๎ฦ๗€œพ๎'Nœhฦ’%KฬeWฏ^5*Vฌhี็ฝ{ ภXฐ`ม-ใฟ“cš4i’ณgฯ6—ฅคค5jิ0 ‹ลrห~3mผู\๖็ŸฮฮฮฦภอeฟŸ›eผฆng๔น}๛vsYฦ๛ฃซซซqโฤ s๙ิฉS3ๅฝK—.`ผ๙ๆ›ๆฒ๔๔tฃYณf†“““๙ูฒe‹sๆฬฑŠiีชU™–g๗~๑ษ'Ÿไ่u—ำ๗Šฌ๒aYฟพบt้b๕;อ๘,๐๒๒2๙็s๙O?dฦฒeหฬeฝz๕บe<Ÿs *d๚|หสฌYณ ภ๘๚๋ฏo๖Fๆใvtส^r…็ฅฆฆr๑โEžxโ ๒็ฯožโป•u๋ึ‘’’Bฟ~ฌz๕ีW๑๐๐`ลŠๆฒFัฃGFM๋ึญqqqนๅ)ไ›ตlู’%J˜ฯŸyๆชUซFDD๓?3ํท'!!ฟ›ฟ›‹/ย‘#G8sๆŒUŸฏฝ๖šีฉœ:u๊––ฦ‰'€๋งชx็w2อŸป๙››/ฝ๔’๙ษษ‰gžy†?๘#ำฑt๎ูjdขZตj†มห/ฟlีฎZตjœ:uŠkืฎ™หnลวว๓๗฿Sฏ^=๘ใLง5ห–-KHHHฆร๕ฟ๔{๗๎องŸ~ส์ูณ้าฅKฆ67nฬัˆว?ศc=ฦ›oพ™i]Fž"""ppp OŸ>V๋ˆaฌ\นาjypp0ๅห—7Ÿ๛๙๙แแแa•ฯ^x?ำ๊4฿ย… IOO็…^๎๎u๑๊ซฏโเเpใพื (@ใฦ๙๛๏๋#A5kึคt้า9๎#๒ห/9ž“•.]บไx๎`N^๗ซVญขD‰„††šห\\\ฌFใst๕๊ี\นrๅฎใฟQDDE‹ฅC‡ๆ2GGG๚๔้รๅห—ณœ๒qณJ•*QงN๓yกB…จPกB–ทsชRฅJิจQร|^ญZ54hภใ?žiyV๛บ๑ึmำ\RRRXทn ,ภำำ“็ž{ฮ|๗฿TญZ77ทL#ิYฝ_ไฯŸ€Ÿ~๚ษ๊‚Ÿ›ๅ๔ฝโ^xแ…(P €๙<ใws'ฟJ•*ฑvํZ–,YยoฟMพ|๙2]eณƒาซW/jิจ‘ๅ๛ฅญจ •\แ๊ีซ >œำ๗ุcQจP!โโโn9g+CFแv๓ฉ`'''ส•+gฎฯ0aย ,HTTŸ}๖… ฮqฌO>๙dฆeO=๕”9็๗฿ว0 † FกB…ฌ#FŒฎฯ%ปัo€๙&—1ฟ*ccNๆ๏•,Y2S‘Z @LsตฒฺoฦqฉRฅ2-OOOท๚]lถเเ`๒ๅหG๙)Tจ9Ÿ+ซ‚4;3gฮdส”)|๙็Vึwใ่ัฃTจP<๕ิSภฝ.n•ท๛ญcวŽฌ]ป–“'Oฒdษซi!91n8๖ํGฉRฅxๆ™g9rไNwr9yŸ8q‚๒ๅหgj๗ฤOdฺ๏€˜>}:=๖!!!L™2%G๏Eู9qโO>๙คีฬ๋.+9y-ฉ;y2ํหžrๅสY-หxอgผ'9r„๘๘x .œ้ต๙๒ๅฝ๎_xแjีชE๗๎)Rคaaa๐รท,N๏ทฝo็„‡‡มมมดhั‚>๚ˆาขE ขฃฃณlyš5k†งง' .ดษฌูัRษ|๓Mพ๖[๚๕๋G5๐๔๔ฤฮฮŽฐฐฐ๛๒†ณw๏^๓M066๖_B7สˆ๗ญทสvT๐ๆภ์T๎ๆ/;้+ปถท๋ใ่ัฃ4lุŠ+๒๑วSชT)œœœˆˆˆเ“O>ษ๔;ปี(WญZตˆŠŠb๒ไษดo฿ž‚ fึr’OgggZถlษโล‹๙โ‹/ธpแถmใƒ>0อ๋ย–W‡††โ์์L—.]HNNฆ}๛๖wด}๛๖ํฉSง‹/fอš5Œ?ž>๚ˆE‹ešหœ;9{๙`โฤ‰tํฺ•Ÿ~๚‰5kึะงOฦŽหฮ;)Yฒไ]๕๙oๅไณปh&--ํŽ๚ผ—๙LOOงpแยฬ™3'ห๕7ฯaฬ๊๗๎๊๊สๆอ›ูฐa+Vฌ`ีชUฬŸ?Ÿ ฐfอš;.ฬ๎4OYนืฏ9ธ>ฯณSงNฬ›7ซu๑๑๑4iา„ธธ8ถlู’ฃk$ค’+,\ธ.]บ0qโDsYRRRฆ{ฅe๗&’q*๑ะกCVญงคคp์ุ1‚ƒƒอe‰‰‰t๋ึJ•*QณfMฦGซVญ สQฌGŽษด์๐แรๆี‘๛wttดฺ๏ฟ‘qสx฿พ}™Š[Xถlษษษ,]บิj”เๆSo9๑ฤO0n8ž}๖Y7nฬ๚๕๋๏่ช๐•/_ž_~๙…ิิิloีRบtiึญ[GBB‚ี~2ฎฬฝ“ำา7zแ…๘๎ป๏Xฟ~=ฟ๖†a˜ง๋แฝ.nw•๎ฝโ๊๊Jห–-™={6Mš41/€ธลŠใ7เ7เฯ?คJ•*ผ๛fA๚ Ž%C้าฅ9pเ†aXํ๛๗฿ฯฒฝฏฏ/พพพ :”ํทSซV-ยรร3fLถ๛ธี{TLL ้้้Vฃค๖uwณŒQบธธ8๓47ไl๖nคงง๓ว˜ฃข€yร๖Œ๗ฤ๒ๅหณn:jีช๕ฏศฒททงaร†4lุ?˜>๘€!C†ฐaร†;?ucžntฏ๓tงฏ๑ไไไLgฃเ๚็a๓ๆอ9|๘0๋ึญฃRฅJ$ž;กS๖’+888d๚ซ๒๓ฯ?ฯ๔ืjฦ}o~ ฦษษ‰ฯ>๛ฬชŸฏฟš๘๘xš5kf.๛฿วษ“'๙๎ป๏๘๘ใ)SฆŒ9 ”K–,ฑš๋ทkื.~๙ๅ๓Cถpแย<๛์ณL:•s็ฮeฺ>ซ9NฃFpwwg์ุฑ™ฎr~P๓ฅn”12pใพใใใ๙๖o๏ช????"""๘ํท฿hผ9Wฏ^ตZŸำ[นดiำ†ฟ›ษ“'gZ—kำฆMIKKหิๆ“O>มฮฮ.วฃw7 ฆ`ม‚ฬŸ?Ÿ๙๓็๓ฬ3ฯXzผWฏ‹์oฝ๕#FŒ`ุฐawด]ZZZฆิย… Sผxqซg๙๒ๅ๛Wงม๏THHgฮœฑบอVRR_}๕•U;‹ลb5_ฎง๖๖๖ท}Ÿศ๎˜š6mส๙๓็ญฆu\ปvฯ?77ทLwhธ[ผnผู\–˜˜˜ใK/†มไษ“qttคaร†ภ๕ั๒ดด4{๏ฝLf\e~;๓OฆeVฟ“œพWd•งดด4ฆM›vm๏Dv_ใโโHMMอิ~๚๔้Zล๕ย /ฐcว,X`5็๗^ลs/h„Tr…็ŸžYณfแ้้IฅJ•ุฑc๋ึญรหหหช]@@|๔ัGฤววใ์์l s๐เมŒ5ŠฦสกC‡๘โ‹/ 2/v๘๙็Ÿ๙โ‹/1bUชTฎ฿O๓ูgŸeุฐaYท๐fO<๑ตkืๆ๕ื_'99™I“&แๅๅลoฟmถ™2e ตkืฦืื—W_}•rๅสqแยv์ุม้ำงณ”>๙ไบw๏NPP;vค@DGGsๅส•๛๚a“•FแไไD๓ๆอ้ัฃ—/_ๆซฏพขpแยY[9Qฝzu~๚้'š6mJถmYฒd‰9ส™ำ[นt๎™™3g2`ภvํฺE:uHLLdบuผ๑ฦดhั‚ๆอ›Sฟ~}† ย๑ใว๑๗๗gอš5๔ำO๔๋ืฯ๊ฆ;แ่่H๋ึญ™7o‰‰‰L˜0!S›{๑บจZต*pCaaa8::าผy๓lošoำ5ใ9“'O&ไฯŸ฿๊‚”›๙๛๛g:m˜ ”,Y’ถmโ๏๏››๋ึญc๗๎VgAชVญส๙๓0`AAAธนนัผy๓;_N๕่ัƒษ“'ำกC๚๖ํKฑbล˜3gŽyก`ฦ่ัฯ?L๏ฝiืฎO=๕ืฎ]cึฌY888ะฆM›[๎#ปczํตื˜:u*]ปveฯž=”)S†… ฒm6&MštืgnึจQ#q^yๅ „ƒƒ฿|๓ … โไษ“๗d7rqqaีชUt้า…jีชฑrๅJVฌXมป๏พkžŠฏWฏ=z๔`์ุฑDEEัจQ#9rไ ,เำO?ฅmถทฯ่ัฃูผy3อš5ฃt้า๙็Ÿ|๑ล”,Y’ฺตk›ํr๚^แํํM๕๊ี>žูณgs๐เมloI$๒(ธ|๙๒moจ_จPก๛z฿Rค"""9ย๔้ำ™3giiiTชT‰y๓ๆYขKไQ3aยFuห6วŽ3oลu?่”ฝˆˆˆศุqoBซ]ปvฆฏžพ—TŠˆˆˆˆM้ฦ๘""""bS*HEDrนSงNแโโbุ>7ุธq#vvvlธ๑_๗๕์ณฯโใใ๓๏ƒzTฏ^๊K6D*HEDr`ฦŒุููaggวึญ[3ญ7 ƒRฅJaggว๓ฯ?oต.cปŒGพ|๙จTฉcฦŒแส•+Y๎/66;;;vํฺ๕ฏc=z4ีชUฃVญZบ/ษ™>๘€%K–dZพ}๛vFŽy฿พบ๕๛SฆLแ๙๓๗ฅ‘๛Eฉˆศpqqa๎น™–oฺด‰ำงOใ์์œๅvฯ=๗ณfอbึฌYLœ8‘ส•+3lุ0บt้’e๛+VPธpa‚‚‚Uผ๕฿}๗={๖W๚ˆaร†qเภjืฎmUคๅDJJ !!!์น“7฿|“)Sฆ๐ฺkฏ๑วไ่๔๘ฅK—hฺด)UซVeธq”,Y’ื_oพ๙ฦl“žžNhh(&L y๓ๆ|๙็ดlู’O>๙ฤ๊ฦ๘ณfอยูู™:u๊˜ำ4z๔่A๋ึญ้ะกŸ|๒‰นฎPกBผ๛t๎™'Ÿ|’?˜~๚ฑ~z๊ึญ›้.^ผH“&M`าคIิฏ_฿\WตjU€\u›""r[฿~๛ญปw๏6&OžlธปปWฎ\1 ร0ฺตkgิฏ_฿0 ร(]บดัฌY3ซm,-[ถ4’’’2ํซSงNFฝz๕ฬ็}๛๖5<<<ŒkืฎQฬฟปŸyฆu๕๊ี3c๎นๆฒƒ€aooo์นำ\พz๕j0พ๖[sYห–- '''ใ่ัฃๆฒณgฯ๎๎๎Fบuอeyซ]ปถU F๙W_}ี*ฎ๓็ฯžžž™–฿lร† `lุฐม0 รุปwฏ ,ธuRฒ‘‹‰'šห’““€€ฃpแยFJJŠa†1kึ,รุฒe‹ี๖แแแ`lถอ\–/_>ฃK—.™๖5~x0Ž;fต๘๑ใ†ƒƒƒ๑๛๏[-5๒ไษcต<#๐๐๐lษษษษx๕ืo{์" Šˆก๖ํs๕๊U–/_NBBห—/ฟํ้๚-ZฐvํZึฎ]หO?ฤเมƒYตj;vฤธแ๛IาำำYตj•ี้๚๙๓“˜˜h5M '.^ผ@ฒ\๏ๆๆf5ช[กB๒็ฯฯำO?Mตjีฬๅ?g|“KZZkึฌกeห–”+WฮlWฌX1:v์ศึญ[ฑX,V๛z๕ีWญพ{ํฺตฤลลักCsไ๘๏ฟฦมมjีชฑaร†;:VOOOเ๚่rvw.ธ•๙d–๋ญž—(Q''งl๛3 C4ษ#Eฉˆศ]ุ่ฑ#ฏพ๚*็ฯŸงI“&ไฯŸŽ๛hุฐ!›7o6 าˆˆส”)CฅJ•ฬv… &**ŠีซWณrๅJVฎ\ษท฿~K็ฮ๙๎ป๏ฒํ฿หห ๘ฟB๒f7ŽXๆdyv…mNธบบZ=OOOฎฯท,Zดhฆ๖7ฯซอ‰‰'าตkW~๚้'ึฌYCŸ>};v,;w๎ดบ๊nฅงงใ๋๋หวœๅ๚› ๙;ํฮฮŽ•+Wf™›/Jป9Ÿ7‹‹‹ใฑวป๋xD4ค""wกUซV๔่ัƒ;w2ป๊ใฺตk\พ|ู\ถbล š6mšฉญ““อ›7งy๓ๆคงง๓ฦo0u๊T† ฦO<‘e?8ฎฎฎ;v์ฎโหNกB…ศ›7/‡สด๎เมƒุ฿ถ8+_พ—-[€ฟฟ?.\เื_ต:]74ƒฝฝ=~~~Vทบ™ฃฃ#DFFU|ูqpp QฃF๔ำOVWร_ธpนs็Rปvํžr มรรƒ>๘€ิิิL๋๚๋ฏ;Šษbฑ˜~___์ํํo™ฃ ืฎ]c๊ิฉๆ๓””ฆNJกB…ฬซึทoฯ™3g๘๊ซฏ2m๕๊Uอ็๙๒ๅห๒๊Œ‚๗ๆuญ[ทฦมมQฃFe‰6 #ำkเV2ๆผึฌY3วˆุšFHED๎Rv฿ฒ”•ร‡3{๖lเ๚Mฬw๎ษw฿}วO.\h4jิศ(\ธฐแไไd<๘ใF=Œs็ฮ6๎ .y๒ไ1fอšeตผ^ฝz†ททwŽโฯ8†^ฝzY-๛๕ื_รอออศ›7ฏQฟ~}c๛๖ํVmn—ท 6!!!†งงงแโโb”/_ฺ่ตซyหใบ๙ถO๑‡๑๒ห/ๅห—7\\\Œ‚ ๕๋ื7ึญ[wห~ ใriิจQรpqq1J—.mLž<9S””ใฃ>2ผฝฝ gggฃ@FีชUQฃF๑๑๑fปƒu๋ึ5\]] ภ๊P๏ฝ๗žQขD ร>ำ- ~๑GฃvํฺFพ|๙Œ|๙๒+V4z๕๊e:t(SผYIKK3Š+f :๔ถว-๒0ฑ3Œ1K]DD๎‰kืฎแๅๅลุฑcyใ7๎i฿ฏผ๒ ‡fห–-๗ด_y๘,Yฒ„Ž;r๔่QŠ+f๋pDrLฉˆศCเฯ?ไ‹/พ G๗ผ8y๒$O=๕๋ืฏงVญZ๗ดoyธิจQƒ:u๊ไhฺ„ศรDฉˆˆˆˆุ”ฎฒ›RA*""""6ฅ‚TDDDDlJฉˆˆˆˆุ”nŒ/ฝ๔๔tฮž=‹ปป๛mฟฎODDD†a@๑โลฑทฟ๕จ Ry่={๖ถ฿‹-"""งSงNQฒdษ[ถQA*=wwwŽ;Fม‚mM๎—ššสš5khิจ‘๙•‰r(฿–๒`)฿ึร–o‹ลBฉRฅฬฯ๑[QA*ฝŒำ๔๎๎๎๗๔ปธ%kฉฉฉไอ›‡โ -ทSพ,ๅ๛มRพฌ‡5฿9™nง‹šDDDDฤฆTŠˆˆˆˆMฉ ›RA*""""6ฅ‚TDDDDlJฉˆˆˆˆุ” Rฑ)ค""""bS*HEDDDฤฆTŠˆˆˆˆMฉ ›RA*""""6ฅ‚TDDDDlJฉˆˆˆˆุT[ ’S!“ถ‘๎ไf๋0r='{ƒม>PgfRาํlNฎง|?Xส๗ƒฅ|?Xw“๏_‡5ธฯQๅŒFHEDDDฤฆTŠˆˆˆˆMฉ ›RA*""""6ฅ‚TDDDDlJฉˆˆˆˆุ” Rฑ)ค""""bS*HEDDDฤฆTŠˆˆˆˆMฉ ฝถmRฝz๕บฯƒ๒์ณฯ๓ถ๗ย‰'จRฅ ๘๛๛ณt้R:DญZต๐๑๑กJ•*lฺด้ล$"""6}—-ฌ]ป‡;.--ํฎถ{\บt‰ dปพXฑb์ุฑggg.\ธ@PPกกกธธธ๐อ7฿PกB|˜ภภ@™6mฺ-๗•]์๖y๖์Yš5k†ฟฟ?UซVๅิฉSV]ปvE‹ัจQ#z๗๎ ภŒ3x็wฬ6eส”!)) '''œHJJ"==€าฅKSกB*Tจ€ลbม0 ้ึญฟ๒KŽr™œœŒลbฑzˆˆˆH๎ฅ‚ˆ‰‰aส”)lถ่่h๚๖ํหวL—.]pwwทjNxx8‘‘‘t๏\ทgฯfฬ˜ม† 3f mฺดa๗๎,^ผ˜^ฝzPฏ^=~๙ๅขขขจUซ_5๚๕c๘๐แDGG›…\vฒk›>๛๔้CปvํˆŽŽf๋ึญ<๖ุcœ:uŠแร‡SฉR%–/_ฮ่ัฃ™3gฮm๓u๔่Q|}}๑๖๖f๒ไษ™ึ/]บ”*Uช`gg\?สศ‘# d๊ิฉf!ž•ฑcวโ้้i>J•*u˜DDDไัฅS๖\ รรร€ซWฏฒfอึญ[ว‰'ฌฺ๖์ูำ900้ำง›ฯ๋ิฉCัขE๋ง๛Wฎ\ษศ‘#ธx๑"ืฎ]ใไษ“ดkืŽ .pๅส‚ƒƒˆŠŠ"44€:ฐw๏lใอฎmv๛ฑc ,ภีี€]ปvQณfM๚๕๋Gddคy์9Qพ|ybcc๙ใ?่น37ฦลลธ>วtะ ADDD˜ํ๓ไษCซVญhีช'NœเีW_ๅญท"!!!หฬ€ฬ็‹EEฉˆˆH.ฆา,DEEqเภส–-KํฺตูปwฏYJผyอŸ ร`ๅส•DEEลฉSงศ“'}๚๔a่ะกฤฦฦ๒ัG‘œœ `Ž&sVฒk›>ณโ็็วดiำุบu+mฺดแ‡~ %%ล\๏เเ`žŽฬ8oTฎ\9 ,Hll,pฝplัข“'Oๆ‰'žฐj{๑โE&MšDhh(๙๒ๅ3 ไฌ8;;ใแแa๕‘K)ะ Aๆอ›gฮUฌQฃ็ฮใ๘๑ใlบ•ส•+›W“็Tpp0SฆL1ŸGGGื‹ถbลŠ‘žžฮฌYณฬ๕,_พ€๙๓็฿ฒ๏์ฺfทฯZตj๑w฿ื็}^ฝz^~๙ev๎ษ๘๑ใ๙๙็ŸฉXฑ"'Nฎฯ อุ~ืฎ]\ธp€3gฮp๕๊UฮŸ?OLL eห–%--๖ํำฃG5jdoวŽฉQฃ‹…•+Wฒx๑b7nœฃ<ŠˆˆH๎ง‚๐๑๑กw๏ิฌY>๛์ณlj้†ฮูณg๑๓๓ฃRฅJๆฉaร†ัคIชUซFูฒeอ๖“&Mbไศ‘๘๛๛฿vivmณ็งŸ~ส?€ŸŸตkืๆโล‹VNLL ิฎ]777*Uชฤื_mž2?pเฯ<๓ 4iา„‰'๒ุcฑrๅJึฏ_ฯิฉS  €ธธ8เzAz๐เA†N๑โลoyl"""๒฿cgฎ๚ฑ1‹ล‚งง'U‡Dบ“›ญรษ๕œ์ ๛\f์>7Rาo=}D=ๅ๛มRพ,ๅ๛มบ›|:ฌม}‹'ใ๓;>>ถำ๏4B*""""6ฅ‚๔!๖ํท฿šงฟ3ทšN """๒(าmŸbบuฃ[ทnถCDDDไพาฉˆˆˆˆุ” Rฑ)ค""""bS*HEDDDฤฆTŠˆˆˆˆM้ฦ๘๒ะหธฑ๎฿———ญรษ๕RSS‰ˆˆ iำฆ8::ฺ:œ\O๙~ฐ”๏K๙~ฐถ|๋ฦ๘""""๒ศPA*""""6ฅให#cศช#ไษ๛งญรศ๕Hฃ=ผตi8ุ:œ\O๙~ฐี|On๕ดญCนฏ4B*""""6ฅ‚TDDDDlJฉˆˆˆˆุ” Rฑ)ค""""bS*HEDDDฤฆTŠˆˆˆˆMฉ ›RA*""""6ฅ‚ิFฺถmK๕๊ี๏z๛ใวณpแย{Qฮ์ฺต‹€€ dวŽlถภภ@|}}ฉQฃฑฑฑ<6y4ฉ ตตkืโเ๐๏พฒ๎~ค—.]บๅz๖์ูCTT3fฬ Wฏ^ไฯŸŸ%K–ห{๏ฝGŸ>}HIIแส•+๗>>๔้ำ‡Y๒DDDไ?A้}ร”)Sุถmััั๔ํ—?˜.]บเ๎๎nี6<<,###้ฝ;ฎฎฎ๔ำO๚๋ฏ,[ถŒ๐๛๏BTT/พ๘"#FŒเน็ž#66–-Z0dศฦw่ะ!๚๗๏ฟ๚+_}๕|๐มmทฒe •*UขI“&L™2%ำ๚™3gาฐaCŠ)ย๛ คGิซWนs็’œœœmษษษX,ซ‡ˆˆˆไ^*H๏ฃ7†‡‡Wฏ^eอš5t้า%Sž={าณgO™>}:†a๐๖oใ๋๋ห๓ฯ?ฯ๛ณื๖ํy้ฅ—x้ฅ—ุถm-c๛๑ว๑๑๑กXฑb์ทO?oo๏W:u8pเซWฏfฤˆV๋๖์ูCxx8cฦŒ1—นบบานsgถlูย”)S˜0aู๖?v์X<==อGฉRฅr—ˆˆˆ<šT>@QQQ8p€ฒeหRปvm๖๎Khh่-ท™3g)))DEEuว๛tpp ==ภjT๒น็žcย„ ฬ™3‡:aถปีv7 โนs๕ื_œ>}šŽ;2o<ผผผฌฺž9s†๗{vํฺแใใรดiำฒy๐เมฤวว›SงN๑q‹ˆˆศฃC้}ิ Aๆอ›gžrฎQฃ็ฮใ๘๑ใlบ•ส•+ณt้า[๖aฑX(\ธ0,\ธฤฤDIHH0ีฌY“๙๓็0w๎\jืฎ @้าฅอB๖ฦ}yxxะทo_ขฃฃ้฿ฟ?sๆฬกB… ฬž=๛–;vŒkืฎ๐oฟ‡——‰‰‰ดhั‚‰'โ๏๏oถ'44”ุพ};3gฮคFูณณณ3VษฝTG>>>๔๎›š5kโ๏๏ฯgŸ}–m์ๆv์ุ‘Ÿ???6oL‘"E๐๓๓ใ๊ีซๆEM#GŽ$""???-Zdž2ๅ•WXดh•+Wๆ๏ฟฮr฿u๋ึeฮœ9์น“2eสะบuk>ŒŸŸ๛๖ํ3nูฒฺ่ต+ณfอยžoฟ–ƒ2t่PจYณฆนอ€ุทo๛๗ง@wŸPษ•์ ร0l„ศญX,<==้1{y๒zฺ:œ\ฯ4ุๅ็๔๒ค๑๏nO&ทง|?Xjพ'ทzฺึ!•ิิT"""hฺด)ŽŽŽถ'ื{ุ๒๑๙ณ!›RA*""""6ฅ‚TDDDDlJฉˆˆˆˆุ” Rฑ)ค""""bS*HEDDDฤฆTŠˆˆˆˆMๅฑu"9๕~ใ'๑๒๒ฒuน๕+eย๓Š+็vส๗ƒฅ|‹<œ4B*""""6ฅ‚TDDDDlJฉˆˆˆˆุ”ๆส#c~๔\mF๎—žFA`๖ฏงมมึัไ~ส๗ƒ๕ไป[ะใถAไำฉˆˆˆˆุ” Rฑ)ค""""bS*HEDDDฤฆTŠˆˆˆˆMฉ ›RA*""""6ฅ‚TDDDDlJฉˆˆˆˆุ” Rjถ-ีซWฟ๋ํ?ฮย… ๏aD9ำธqc๐๖๖f๔่ัคงงำผys*Vฌˆทท7Ÿ๙KDDDM*Hmdํฺต88ปฏญป้ฅK—nfม‚DEEMDDฑฑฑ๔้ำ‡ƒฒkื.พ๘โ Ž;–ใ>EDDไฟK้๐ีW_แ๋๋‹ฟฟ?#FŒ 55•>๘€กC‡ๆh{‹ลBƒ จRฅ •+Wf๋ึญ 2„ีซWภœ9s๘๋ฏฟhาค พพพ„„„pแย.]บฤำO?อ™3gHKKฃz๕๊๒ห/™๖ฑs็NบvํJ`` pฝุฝq๔ถkืฎฌZต wwwRSSIMMภž็ž{€|๙๒๑ิSOq๎9z๗๎MHH‹/ๆฺตkท=ไไd,‹ีCDDDr/ค๗YLL SฆLaถmDGGำทo_>๘cบt้bvยรร  22’๎ปเ๊๊สO?ฤฏฟสฒeห8p ๏ฟ>!!!DEE๑โ‹/2bฤž{๎9bcciัขC† ก@|๐ม๔์ู“‰'RปvmชUซ@BBแแแTญZ•QฃFัขE :”ฃใช_ฟ>EŠ!88___ซugฮœ!&&ๆฬ™รจQฃXถl•*Ubฤˆœ>}:พวŽ‹งงง๙(UชTŽb‘G“ า๛lใฦ„……แแแภีซWYณf ]บtษิถgฯž๔์ู€ภภ@ฆOŸ€aผ๖๘๚๚๒๓ฯณ,๗ต}๛v^z้%^z้%ถm@ซVญpqqแ๋ฏฟๆฝ๗3/^œE‹ฑhั"Vฎ\IซVญศ“'OŽŽkร† œ={–ุุX๖ํg.OII!,,Œqใฦ‘/_>sy๕๊ี๙ๆ›oˆŒŒไ๒ๅห”)S†]ปveู๗เมƒ‰7งNสQL"""๒hRA๚€EEEqเภส–-Kํฺตูปw/กกกทfฮœ9คคคETTิ๏355•cวŽa‰‰‰ๆ๒ /_>BCC™4i/^4ื988žžn>ONNฮิฏ››มมมฌ\นา\ึฝ{w๊ืฏOปvํฌฺฆคค0|Zทnอถm˜6m~~~Yฦ๋์์Œ‡‡‡ีCDDDr/ค๗Yƒ ˜7ož9ฒFœ;wŽใวณu๋V*WฎฬาฅKoู‡ลbกpแย888ฐpแBณจtww'!!มlWณfMๆฯŸภนsฉ]ป6pxHHC‡ฅOŸ>f๛ฦณx๑bVฎ\‰ลbกFt์ุ€"EŠp๚๔i‰‹‹cห–-\พ|™๓็ฯื‹ิUซVQฑbEฦŒCJJ ฃFฒŠโฤ‰TฌX‘ 60aยv๎ษห/ฟŒ‹‹ห%UDDDrค๗™ฝ{๗ฆfอš๘๛๛๓ูgŸe6ป9ค;vไ็Ÿฦฯฯอ›7SคHธz๕ชyQำศ‘#‰ˆˆภฯฯE‹1fฬ๖๏฿ฯ?ศ๐แร้น3—.]b๙๒ๅV๛-^ผ8ร‡็ท฿~3 R'''๚๕๋‡ฟฟ?aaaๆ|ะฤฤDš7oŽŸŸUซVฅF4oœ„„†Ntt4•+W& €u๋ึ@LL แแแำŠˆˆศฃฯฮ0 รึAˆŠลbมำำ“)๋ฃquฯo๋prฟ๔4 žแŸข~`๏nM&9 |?X@พป=n๋๎™ิิT"""hฺด)ŽŽŽถ'ื{ุ๒๑๙้w!›RA*""""6ฅ‚TDDDDlJฉˆˆˆˆุ” Rฑ)ค""""bS*HEDDDฤฆTŠˆˆˆˆMๅฑu"9๕‚ ผผผlFฎwฦส1ผTฅไCqcๅN๙~ฐ”o‘‡“FHEDDDฤฆTŠˆˆˆˆM้”ฝ<2๖ทเ~้แ๎้$=ํปˆวAo๗›๒`=ช๙ฎ๑D~[‡ r_i„TDDDDlJฉˆˆˆˆุ” Rฑ)ค""""bS*HEDDDฤฆTŠˆˆˆˆMฉ ›RA*""""6ฅ‚TDDDDlJฉˆˆˆˆุิถ mถ-ีซWฯQ๖ํใ๏๏ฯœ9s๎sTY{๖ูg9x๐ M๖}ณŸ~๚ ???จ]ป6‡`๑โล๘๙๙แ็็Gร† 9}๚ด#‘Gลฒ ]ปv-9๛N๔s็ฮq๘๐aขฃฃy๑ลญึฅฅฅ๐๎ฉ;๑าฅKท\฿ฐaCขฃฃ‰ŠŠโwa๐เม”,Y’7C‡6l‰‰‰คฆฆ]๐"""๒Ÿ๋ าฏพ๚ ___1bฉฉฉ|๐ม :4G7oœ#GŽ@ll,eส”a๐เมฐcวฦŒƒ~~~,[ถ €7าจQ#š6mJ™2e็๗฿วฯฯ&Mšpํฺตl๗ทt้R๐๗๗ง{๗๎ๆ๒oฟ–ชUซRนreN:ภ’%KจVญดhั‚ห—/ะตkWxใ ‚‚‚˜4i“&MขbลŠ๘๛๛ำฏ_ฟL๛Œg๒ไษ๘๛๛3|ณUซVp๘qs4ูออ ;;;เzฑ™๑sPP  jีชœ9s€ร‡SฑbE† ย‰'r”๓ไไd,‹ีCDDDrฏ<ถเ~Љ‰aส”)lถ ๙็>๘cบt้‚ปปปU๐๐pz๖์Idd$แแแLŸ>… ฦฮ;อถeส”!**Š]ปvฑt้R๖์ูร?C5จ_ฟพน๏฿~๛kืฎ๑ฤO๐ๅ—_C๋ึญYฟ~=!!!™โฝpแ `ห–-+VŒ๙ว\็ๆๆฦž={˜8qขYเึซW–-[0n8พ๚k๚๖ํ @\\ปvํยฮฮŽB… q๒ไI\]]‰7๛ฬ8ฮอ›7ำพ}{~๚้'ส”)sผฮŸ?ŸกC‡r๕๊U6n˜iฬ™3iุฐ!•+Wๆื_e๖์ูดjีŠbลŠัณgOš6mšํ(๕ุฑc5jิmใ‘!Wnธ‘ฐฐ0<<<ธz๕*kึฌกK—.™ฺ๖์ู“ž={ศ๔้ำณํท]ปvl฿พถmโ์์LฑbลจRฅ ๛๗๏ fอš(P€B… แ้้ษ๓ฯ?€'Ožฬฒ฿_~๙…เเ`Š+`Ž8„††ื ผใวp๒ไI‚ƒƒ๑๕๕e๊ิฉ8pภl฿ถm[s๔ฒjีชผ๔าKฬ›7ggg&NœHฝz๕จ]ป6`ฬ˜19*F^xแŽ9ย_|ม{๏ฝgตn๙๒ๅlถอj$ึำำ“^ฝz๑๋ฏฟ2x๐`๚๖ํkาY}๚0t่Pbcc๙่ฃHNNฮ2ฦ+V๐๚๋ฏณiำ&7n ภK/ฝฤเมƒ๙่ฃx๙ๅ—ูฒe‹ีHOOฐ๊๗FกกกฌYณฦ|อภYดh‘o†#GŽ๐ฟ—_~™&Mš0v์ุ[ซ‡‡‡ีCDDDrฏ\]6hะ€y๓ๆ™skิจมนs็8~8[ทnฅrๅส,]บ๔ฎ๛ฏYณ&‹/&55•๓็ฯณw๏^ผฝฝ๏บฟ๊ีซณn:ฮ;`uส>+‹…bลŠ‘žžฮฌYณฒl“žžฮ้ำง fโฤ‰>|€"EŠ0t่P๖๏฿OXXใววววว,0K—.MTT€UŽŽ=Šalุฐโล‹py^xแๆฬ™Cษ’%อ๖วง~๚ผ๘โ‹<๙ไ“์ป—)Sฆเใใs‘(Wฯ!๕๑๑กw๏ิฌYZตjลศ‘#ณl›า[yๆ™ghึฌ•+Wฦžฯ>๛ 77ทปŽทpแย|๒ษ'ๆ(fตjี˜6mZถํ‡ F“&M๐๒๒ขVญZฤลลej“––FวŽIHHภ0 FmตžฆM›าดiSNŸ>อ… xๅ•Whัข , QฃFf๛… 2sๆL๑๔๔dฦŒL˜0 .˜b=๑ฤ,\ธ”๏๋Qอw'๒:„ป’ššJDDM›6ลัััึแไz[พ3>ฟใใใo;.WŸฒ‘‡฿ฃ๓็a.ำชU+Ž;fตlษ’%9พา]DDD$ทPAj#‹/ถu""""ฒ›RA*""""6ฅ‚TDDDDlJฉˆˆˆˆุ” Rฑ)]e/Œชe<๐๒สo๋0rฝิิT"ย3ๅ<Š+็vส๗ƒฅ|‹<œ4B*""""6ฅ‚TDDDDlJง์ๅ‘๑gฯ คุฅุ:Œ\/- ผ๐บ”ภแZ’ญรษ๕๋๙.๖ƒลึ!ˆศC@#ค""""bS*HEDDDฤฆTŠˆˆˆˆMฉ ›RA*""""6ฅ‚TDDDDlJฉˆˆˆˆุ” Rฑ)ค""""bS*HEDDDฤฆ๎IAฺถm[ชWฏžฃถํทว฿฿Ÿ9sๆ‹]฿ฑgŸ}–ƒฺd฿#GŽ$<<_๕ฑqใFยยย๎jฐฐ06n๘ฏ๖ส+ฏ€ฏฟ:้้้ผ๖ฺkTจPoooฏ๖!"""-บ ]ปv-9j{๎9>Ltt4/พ๘ขีบดดดส}๗(ฤ๘o\นr…””[WคI“ˆŠŠ"66–ฟ›ๅห—ะฎ];>>๘๙๙ฑlู2เ๚ˆ`ฃFhฺด)eส”!<<œ๗฿???š4iยตkืฒ฿าฅK ภ฿฿Ÿ๎ป›หฟ๖[ชVญJๅส•9u๊K–,กZตjะขE ._พ @ืฎ]yใ7 bาคILš4‰Š+โ๏๏Oฟ~ฒ๗มƒฉWฏTซVไไd๖์ูCํฺต)_พ๘เฆM›ฦž={๐๕๕eภ€:t่–;OOO๓QชTฉฦ$"""ฎ<9m˜1wัรร€ซWฏฒfอึญ[ว‰'ฌฺ๖์ูำ900้ำงgoปvํุพ};mถลูู™bลŠQฅJ๖๏฿@อš5)P žžž<๓๘๘๘p๒ไษ,๛ๅ—_ฆXฑb,Xะ\ @ๅส•อย๓ไษ“ดkืŽ .pๅส‚ƒƒอ๖mถ5GซVญสK/ฝDปvํhูฒe–๛ถX,$$$Pฟ~}3ๆ อš5รมมส•+s๘qเ๚ด‡0cฦ 8{๖,?3ไษ“วฬฏฟสแร‡Yฟ~=๙๓็gูฒeฤฤฤ˜๓xฏ^ฝJ้าฅ9}๚4ญ[ทฦัั‘%J˜E"\ฝ899๑w฿แใใ“ๅqdgฮœ9คคค๐ส+ฏฐ~zž{๎9 รเ•W^กGVEคทท7Ÿ~๚)}๔Ÿ}๖>>>ฬ›76mฺdูเมƒ0`€U>U”Šˆˆไ^w=‡4**ŠPถlYjืฎอฝ{อB๏Nไอ›๗ถmœœœฬŸํํํอ็๖๖๖w5ฏำูู9ำ๖}๚๔a่ะกฤฦฦ๒ัG™งุoŽqลŠผ๚๋lฺด‰ฦ฿“}†มื_MTTQQQœ>>๔๎›š5kโเเ@ซVญ9rd–m3Šจž={Ixx๘-O<๓ฬ34kึŒส•+cooฯgŸ}†››[ฮไ&… ๆ“O>1G1ซUซฦดiำฒm?lุ0š4i‚——ตjี"...S›ดด4:v์HBB†a0z๔่l๛›9s&ฏพ๚*๚๕#oผทผR=๘ใ?๐๗๗'== *ฐhั"† F=๐๕๕%Ož>ถgF๕MM""""bS9>e0kีชวŽณZถdษส”)s฿๗๛๏ณ`มซeC‡ฅmถ๗}฿""""นAฎ(H/^lณ}2„!C†ุl"""":ฒ›RA*""""6ฅ‚TDDDDlJฉˆˆˆˆุ” Rฑฉ\q•ฝ7?คo|zRSS!"‚"฿y(nฌœ)฿""!SA*""""6ฅS๖๒ศHŸึšt็t[‡‘๋ฅ9Aน>คOnLบ‘b๋pr=ๅ๛มส*฿๖ถุ8*ัฉˆˆˆˆุ” Rฑ)ค""""bS*HEDDDฤฆTŠˆˆˆˆMฉ ›RA*""""6ฅ‚TDDDDlJฉˆˆˆˆุ” Rฑฉ\_ฦลล1}๚๔lื-Z๔ถ}lฺด ooo๊ิฉs/Cหฑ7f“}gฅqใฦเํํอ่ัฃHOOงy๓ๆTฌXooo>sG)"""Š|Ašs็ฮๅ๗฿gห๋๏;NKK๛W>wใฅK—nfม‚DEEMDDฑฑฑ๔้ำ‡ƒฒkื.พ๘โ Ž;–ใ>EDDไฟ+ืคgฯžฅVญZเ็็วภ‰% €๑ใว“˜˜HซVญจTฉ={๖ผm3gฮdม‚ 8^ฝz1cฦ ฺถmKฝz๕่ิฉฟ;u๊ิมฯฯ๖ํ“˜˜ภณฯ>หภฉ\น2AAADFFาฐaCส•+วŠ+ฒŸลbกcวŽ๘๙๙@dd$pฝจkผ9O>๙$๏ฟพู๙็Ÿงjีช๘๚๚ฒhั"Ž?N@@ํทงRฅJ™rr๐เมL๛นs']ปv%00ะ์ฃz๕๊ๆ๚ฎ]ปฒjี*HMM%55{{{ž{๎9๒ๅหวSO=ลนs็่ป7!!!,^ผ˜kืฎ6็ษษษX,ซ‡ˆˆˆไ^นฎ ๛๏ &**Š={๖0fฬ|}}‰ŠŠbะ AL™2…ฒeหrเภš4iย… ฬmฬŸปw๏Ndd$;w&44”)Sฆ0eสbbbXพ|9s็ฮฅOŸ>๔๏฿Ÿ˜˜ส”)ร'Ÿ|b๖แๅๅลฝ{ฉ]ป6ฝ{๗fลŠ,Yฒ„1cฦd่ัฃy๊ฉงˆ‰‰!22’งžz €ฝ{๗2cฦ ขฃฃ 7 ฿™3gฒgฯถmฦฐaร0 €๛๗3bฤ:”)'ฅK— !!๐๐pชVญสจQฃhัข‡สQž๋ืฏO‘"Eฦืืืj™3gˆ‰‰ม฿฿€9sๆ0jิ(–-[FฅJ•1bงOŸฮถ๏ฑcวโ้้i>J•*•ฃ˜DDDไั”วึkAAAtํฺ{{{ฺตkGผyญึo฿พw฿}€-ZXญŠŠ2พีiฦ›ฃ„QQQดn€—^z‰๏fป็Ÿ___์์์pqqมวว‡“'Of๗ฯ?LDDy๒ไมรร€Zตjแๅๅ@ูฒe9{๖,O>๙$Ÿ|๒ K—.ฎjž?€งŸ~oo๏,sRฉR%Š/N5Xดh‘Yคๆิ† ธ|๙2ํทg฿พ}๘๘๘’’BXXใฦ#_พ|f๛๊ีซSฝzu, ฃFขL™2l฿พgžy&S฿ƒfภ€ๆs‹ลขขTDD$หu#คu๋ึe๓ๆอ.\˜6mฺฐ~๚Lm์์์ี>n.rณใไไ\?}ใฯw3๗ิููู9ฃ 6ฐkื.vํฺEtt4eห–%999SŒูๅdม‚ไห—ะะP&Mšฤล‹อmHOO7Ÿg๔{#777‚ƒƒYนrฅนฌ{๗๎ิฏ_ŸvํฺYตMIIa๙ดnšmถ1mฺ4ฒ=Vซ‡ˆˆˆไ^นฎ =qโลŠใ๕ื_',,Œธธ8ฬ๕5kึd๙,_พœ+Wฎซฐlู2เ๚ลOตkืWภตkืฌbฟ™ลbก`ม‚8;;ณkื.~๛ํท,œ“Œ‹7nฬโล‹Yนr%‹…5jะฑcGŠ)ย้ำงILL$..ฮผ ๋๒ๅหๆ(lrr2ซVญขbลŠŒ3†””Feต‰'RฑbE6lุภ„ ุนs'/ฟ2..."S"""’[ไบ‚tใฦ๘๙๙QนreถlูB—.]๐๓๓รฯฯ๑ใวำซW/~wผฝฝYฑbEŠ1ทอj้ํ|๖ูgŒ7???๘ใ๚๕๋๗ฏโ6l‡ฦืื—   >œm.^ผˆทท7Ÿ|๒‰9g๓f7็ไฅ—^ฒZ_ผxq†ฮoฟfคNNN๔๋ืยยยฬพiผ9~~~TญZ•5jะผys>|8ัััTฎ\™€€ึญ[\ฯkLL แแแV9ฐ32ฎ‚yHY,<==๙๓ƒบx9ง฿~๙WRํœXUฎ๘ G#ลึแไzส๗ƒ•UพํlนอVrทRSS‰ˆˆ iำฆ8::ฺ:œ\๏aหwฦ็w||mง฿ๅบRyดไบซ์ซWฏถบ"ฎฯ้๐รm‘ˆˆˆˆmจ ต‘BBBl†ˆˆˆˆอ้”ฝˆˆˆˆุ” Rฑ)ค""""bS*HEDDDฤฆTŠˆˆˆˆM้*{ydุฟถ{//[‡‘ู๋งฆBD๖ฝWaX9ทSพ,ๅ[ไแคRฑ)ค""""bS:e/Œ๔UCHฯซ—์–Žุ7 }๙[ค“vวทš|ข‘L#ค""""bS*HEDDDฤฆTŠˆˆˆˆMฉ ›RA*""""6ฅ‚TDDDDlJฉˆˆˆˆุ” Rฑ)ค""""bS*H ธธ8ฆOŸžํ๚ขE‹u฿3fฬเ๏ฟพe›ณgฯานs็ปภ‰'จRฅ ๘๛๛ณt้R:DญZต๐๑๑กJ•*lฺด้_ํGDDD;T>@ท+Hœคล‹gๆฬ™ทls้าฅ[ฎ/Vฌ;v์ **Š5kึะปwo\\\๘ๆ›oุทos็ฮฅ{๗๎9๎SDDDTGgฯžฅVญZเ็็วภ‰% €๑ใว“˜˜HซVญจTฉ={๖ฬQŸแแแแ็็GทnHOOg๑โลDFFาชU+๊ิฉภท฿~‹>>>L›6 €ใวSฝz๕L}^ปvE‹ัจQ#ณภœ1c๏ผ๓ŽูฆL™2$%%แไไ„ณณ3IIIคงงPบti*Tจ@… ฐX,†@`` บuใ—_~น›4ŠˆˆH.ง‚๔>๚๛๏ &**Š={๖0fฬ|}}‰ŠŠbะ AL™2…ฒeหrเภš4iย… ฬmฬŸปw๏Ndd$ํทg๗๎ฤฤฤเ๊๊สฒeหhีช,^ผ˜-[ถp๚๔i}ถnสŽ;๘๘ใ9~xฆ๘N:ล๐แรฉTฉห—/g๔่ัฬ™3็ถวu๔่Q|}}๑๖๖f๒ไษ™ึ/]บ”*Uช`gg\?สศ‘# d๊ิฉ\พ|9“““ฑX,VษฝTGAAAฬš5‹QฃFqไศ\]]ญึo฿พฐฐ0ZดhAผyอuQQQๆฯำงO'00€่่hjีช…ฏฏ/ห–-ใภ™๖IฃFศŸ??๎๎๎4mฺ4ำ่ไฎ]ป([ถ,Wฎ\!22’oพ๙&หัำฌ”/_žุุXbbb˜0aIIIๆบ'N0hะ >ssYžnDDDDไQฆ‚TDDDDlJฉˆˆˆˆุ” Rฑ)ค""""bS*HEDDDฤฆTŠˆˆˆˆMฉ ›RA*""""6ฅ‚๔.ลลล1}๚๔lื-Z๔ฎ๚1cwถ๋'L˜pWlธ‘ฐฐฐป`ืฎ]@`` ;v์`ถmโ๋๋K5ˆW๛‘คw้v้สฎ 5 ƒ๔๔๔UๆฤฅK—nนวว‡={๖ลŒ3่ีซ๙๓็gษ’%ฤฦฦ๒{๏ังORRRธrๅส}YDDDm*Hs่์ูณิชU‹€€8p ฑฑฑ0~xiีช•*Uขgฯž9๊sะ ATฌXฦฯโล‹‰ŒŒคUซVิฉS€"EŠ๐๚๋ฏใ๋๋ห+ฏผยล‹  คงงำปwo|||จZต*;w๎ฎต๏ผ๓ŽนŸ2eส”””mIII|๗wิฌY“๑ใว0rไHยรรอ6#พy๓ๆลมม€ฤฤD์์์๐๖๖ฆdษ’TญZ•3gฮื \๚๔้รr”๙oษc๋฿=มมมŒ5ŠิิT~wฮœ9cใฦฃlูฒ,^ผ˜Ÿ~๚‰ฉSงš@๗๎ู้ณ'eห–eแย…=z{{{โใใ๑๔๔$00๐๐p*VฌภŸIห–-๙๒ห/Xนrฅูื?ภ้ำง‰e฿พ}ดkืŽƒๆ๘˜:Dxx8ห–-ฃYณf|๕ีWx{{฿vป-[ถะฃGฮŸ?ODDDฆ๕3gฮคaร†ภ๕‚z,Xฐ€=z`ooO=hำฆ ฮฮฮY๖ŸœœLrrฒ๙bฑไ๘˜DDDไัฃา bึฌYŒ5Š#GŽเ๊๊jต~๛๖ํๆฬ-Z7o^s]F 0}๚t๑๔๔ฤออ๎ปณt้Rฒฏปป;!!!Yฎพ};;vฤฮฮ___๒ๆอห… rt>>+VŒ}๛๖๑้งŸๆจจSง`๕๊ีŒ1ยjž={gฬ˜1ๆ2WWW:w๎ฬ–-[˜2e &L 000วŽ‹งงง๙(UชTŽโ‘G“ าช[ท.›7oฆpแยดiำ†๕๋ืgj“q๚:'๒ไษCdd$-[ถdฮœ9ผ๒ส+Yถปฑฐอ)าำำอ็7Ž6fx๎น็˜0asๆฬกC‡DDDXmscYmื‹๔s็ฮ๑ื_p๚๔i:v์ศผy๓๐๒๒ฒj{ๆฬ{๏=ฺตk‡ำฆMห6มƒo>N:•๓ƒ‘GŽ า:qโลŠใ๕ื_',,Œธธ8ฬ๕5kึd๙,_พถ๒\พ|™๘๘xBCC7nœ9Š๊๎๎nี๏อ์ํํอBฑfอš,Xฐร0ุฟ?Wฏ^ฅH‘"”.]š่่hเ๚U๑Yšzxxะทo_ขฃฃ้฿ฟ?sๆฬกB… ฬž=€าฅK›1-]บิ๎ุฑc\ปv €฿~๛ธธ8ผผผHLLคE‹Lœ8ณ}ฦ1†„„เๆๆฦ๖ํ™9s&5jิศ๖๑๐๐ฐzˆˆˆH๎ฅ9ค9ดqใFฦ‡““^^^ฬ›7ศศH่ิฉฝz๕โล_ฤ›บu๋RคHsฌๆ–(Q‚ะะPRRRฐณณใฝ๗ kืฎt๊ิ‰B… ฑeห–Lqผ๔าK๘๚๚าจQ#&Nœศๆอ›๑๕๕ลษษ‰oฟ€ฺตkใๆๆFฅJ•จSงฮmOyืญ[—บu๋r๑โE~๛ํ7Zทnอ7฿|ƒŸŸญZต2nูฒ…>๚GGGœ™5k๖๖๖|๛ํท๛์]็^DDDr7;ร0 [!r+‹OOO</ืo Jj:ฌ:้Aใว-8ๆ‚s(๖lย-ฅฆฆAำฆMqttดu8นž๒`)฿ึร–๏Œฯ๏๘๘๘žํฬ7""""๒(SA*""""6ฅ‚TDDDDlJฉˆˆˆˆุ” Rฑ)ค""""bS*HEDDDฤฆTŠˆˆˆˆM้›šไ‘a_ฉ ๖^^ถ#ืณOM…“ุ๛„aXYDDr?ŠˆˆˆˆMฉ ›RA*""""6ฅ9ค๒ศYิ“tW[Gqkฟพดภึ!ˆˆˆžxโ ขฃฃ๑๗๗g๙t๎™ะะPฆL™ย”)S8u๊ร‡งRฅJ,_พœัฃG3gฮœฦw๔่Q|}}๑๖๖f๒ไษ™ึ/]บ”*Uช`gg\?สศ‘# d๊ิฉ\พ|9วŽ‹งงง๙(UชิๅODDD-*HBAAAฬš5‹QฃFqไศ6mฺDXX,X€๕๋ืD@@ปw๏ๆภfกกกTฎ\™ใวgฺวฎ]ป([ถ,Wฎ\!22’oพ๙†๊ีซ็(พ๒ๅหKLL &L ))ษ\wโฤ  ฤ็Ÿn.ห“'ญZตbๅส•๘ใ๘ใ+V,L||ผ๙8u๊TŽโ‘G“ า‡Pบuูผy3… ฆM›6ๆฉ๏%%%1`ภVฌXALL ํฺต#99ู\ŸqZžดดดL๛๙๙1mฺ4ถnJ›6m๘แ‡HII1ื;88˜งใซพ3”+WŽ‚  €ลbกE‹Lž<™'žxยชํล‹™4iกกกไห— d{ฮฮฮxxxX=DDD$๗RA๚:qโลŠใ๕ื_',,Œ„„ๆอ›gฮฅ็ŸHJJยž ๐ฯ?ฐlูฒ;ฺ‡‹‹ /ฟ2;w๎d๘๑๓ฯTฌX‘‰'ื็„fLุตk.\เฬ™3\ฝz€๓็ฯCูฒeIKKฃ}๛๖๔่ัƒFYํซcวŽิจQ‹ลยส•+Yผx17W9‘CWู?„6nศธqใprrยหห‹y๓ๆQดhQjึฌ‰ƒƒญZตbไศ‘t่ะงŸ~š’%KRฃFป_@@แแแ\พ|ูผ๐จvํฺธนนQฉR%๊ิฉcฮใXไ!bฑX๐๔๔ค๊ดถคปฺ:š[๛๕ฅ์ง"<*RSS‰ˆˆ iำฆ8::ฺ:œ\O๙~ฐ”๏K๙~ฐถ|g|~ววว฿v๚†ฌDDDDฤฆTŠˆˆˆˆMฉ ›RA*""""6ฅ‚TDDDDlJฉˆˆˆˆุ” Rฑ)ค""""bS๚ฆ&ydฌnŽ———ญร‘{L#ค""""bS*HEDDDฤฆtส^cv@๗ฌ_ฒใk}๔€ฃ‘{E#ค""""bS*HEDDDฤฆTŠˆˆˆˆMฉ ›RA*""""6ฅ‚TDDDDlJฉˆˆˆˆุ” Rฑ)ค""""bS*HEDDDฤฆTqqqLŸ>ึa<† †ฟฟ?~~~ดkืŽ+Wฎ0rไH*Vฌˆบuใฺตk6ŽTDDD*HนuAš––๖€ฃฑ~SSSILLผe›ท฿~›่่hbbbx๑วอผีญ[—ุุX๖ํวตkื˜3gp=ท""""ท’๋ าณgฯRซV-๐๓๓c๛๖ํVฯ<ศ!Cˆ% €๑ใว3cฦ ฺถmKฝz๕่ิฉ.\ E‹RงN> @xx8AAA๘๙๙ัญ[7าำำx๖ูg8p •+W&((ˆศศH6lHนrๅXฑbEถฑŽ9’nบQฃF ~๛mŽ9ยsฯ=GีชUiธ1.\ L™2$%%0cฦ y็ DลŠ๑๗๗g๘๑ู๖qฃใว๓๎ป๏RฑbE๓ุฒ‡ปป;†a””„ 4ภัั€*Uชpๆฬพ{™2e ‹%Gฟณไไd,‹ีCDDDrฏ\_~๗ลž={ุฐaƒี๓าฅK๓๛๏ใ๋๋KTTƒ  &&†ๅห—3w๎\๚๗๏ฯˆ#ˆŒŒไใ?fภ€ดo฿žปwƒซซ+ห–-3๗๋ๅๅลฝ{ฉ]ป6ฝ{๗fลŠ,Yฒ„1cฦ2ฃGฒy๓f&NœHฏ^ฝ˜>}:{๖์แ•W^แฝ๗หvป‹/ฒpแB8@tt4ฏฝ๖@ถ}คฅฅฑt้Rš6mJ๋ึญ)Qขฟ๚+•+WพmN D‰%ุฟ?ปwทZ—––ฦนsiุฐ!ฏฟ:?๔็ฮ#00W_}•={๖ฒฑcวโ้้i>J•*u˜DDDไั•วึoAAAtํฺ{{{ฺตkG:uฌžWชT)หํ7nlŽ๓ฯ8pภ\็เเ@tt4C‡ลbฑGฉRฅhัขฯ?<พพพุููแโโ‚'Ožผeผ-[ถฤัั‘„„ถmf๖—––F๙๒ๅณฮำำ777บw๏Nห–-iึฌู-๛hูฒ%๛๗๏gๆฬ™ิฎ]๛ถyผั๘๑ใ7noฟ6๓ๆอฃ[ทnๆบมƒSญZ5ชUซf.+Sฆ cฦŒaไศ‘ฬž=›บu๋2z๔h˜eƒ6‹~‹ลขขTDD$ห๕iบuูผy3ห–-ฃM›6Lž<9ำ๓ฌ ฝผy๓š?ูู๑๋ฏฟboo= ๊ซฏฒrๅJž|๒I&L˜ภๅห—อuNNNุ[|ปนก๛MOOงD‰DEEejใเเ`NHNN OžzภQๅ^ฉฉฉDDDะดiS๓ฮ r(฿–๒`)฿ึร–๏Œฯ๏๘๘x<< @xx8AAA๘๙๙ัญ[7าำำx๖ูg8p •+W&((ˆศศH6lHนrๅXฑbEฆฏ]ปฦขE‹hิจ‘Y`ฮ˜1ƒwyวlSฆL’’’prrยูู€คค$sŸฅK—ฆB… TจP‹ล‚aาญ[7~๙ๅ—๛”ey”ฉ ฝฯพ{‚ƒƒ‰ŠŠbฯž=lุฐม๊y้าฅy๗๑๕๕%**ŠAƒร๒ๅห™;w.๛๗gฤˆDFF๒๑ว3`ภฺทoฯ๎ป‰‰‰มีี•eห–™๛๕๒๒b๏ฝิฎ]›ฝ{ณbล –,Yย˜1cฬ6งNb๘๐แTชT‰ๅห—3z๔hๆฬ™sc:z๔(พพพx{{3y๒ไL๋—.]J•*UฐณณฎŸฮ eไศ‘2u๊T._พœmษษษX,ซ‡ˆˆˆไ^yl@nDืฎ]ฑททง]ปvิฉSว๊yฅJ•ฒฎqใฦธปป๐๓ฯ?sเภsƒƒััั :‹ลB\\ฅJ•ขE‹<๓๘๚๚bgg‡‹‹ >>>œฆ๒ๅหหA็ฮiธ1...ภ๕9ฆƒ """ยlŸ'OZตjEซVญ8qโฏพ๚*oฝ๕ Y๖?v์XF•ใxDDDไัฆา๛ฌnบlผ™ย… ำฆMRSSญžฏ_ฟ>หํ๒ๆอklggวฏฟJTT”9ฒ ๐๊ซฏ2cฦ bcc้ท/ษษษๆ6NNNุ[œ1'ีฯฯiำฆฑu๋Vฺดiร?@JJŠนฝƒƒƒy:ฐ๊;Cนrๅ(Xฐ ฑฑฑX,Zดhมไษ“yโ‰'ฌฺ^ผx‘I“&Jพ|๙Xฐ`Aถ9Ÿ7o^^^๘๙๙แ็็GงN(TจUŸ9={๖dส”)คฆฆานsg|}}2dUชTกH‘"Tฎ\๙ฎc  <<œห—/›ีฎ]777*UชD:u(Uช`ภ€ุcooฯฤ‰y์ฑวXพ|9๋ืฏ็๙๓L:ี<๖๙๓ำฑcGfฯžฝฝ‘ฬ์ŒŒKกER‹OOOยw}Žซง‹ีบฮOuฯf+น[ฉฉฉDDDะดiSmNฎง|?Xส๗ƒฅ|?X[พ3>ฟใใใo{ถSCV""""bS*HEDDDฤฆTŠˆˆˆˆMฉ ›RA*""""6ฅ‚TDDDDlJฉˆˆˆˆุ” Rฑ)ค""""bS๚๊Pydด-ื///[‡!"""๗˜FHEDDDฤฆTŠˆˆˆˆMฉ ›RA*""""6ฅ‚TDDDDlJฉˆˆˆˆุ” Rฑ)ค""""bS*HEDDDฤฆTŠˆˆˆˆMฉ ›RA*""""6ฅ‚TDDDDlJฉˆˆˆˆุ” Rฑฉ<ถ@ไv ร !!GGGG“๛ฅฆฆrๅส,‹๒(฿–๒`)฿ึร–o‹ล฿็๘ญจ •‡ล‹([ถฌ#‘;•€งง็-จ •‡^ม‚8y๒ไm_ะทฤ๎ป๏EX๗ฌฏ‡-&‹ลBฉRฅ8u๊6็^๗๕ฐลค|?ุ~”๏ฯร˜๏{{ุ๒m /^ถmUสCฯ๚TgOOฯฬมมแ_๗qฏ๛zc๐๐๐Pพ`_ส๗ƒ้'ƒ๒`๚ษ๐0ๅ;72œbลŠแ๊๊Jpp0GŽฑj๓ฯ?๐โ‹/โแแA๙yๅ•Wธ|๙๒<ŠGวุฑc ยย… ำฒeK:dี&))‰^ฝzแๅๅ…››mฺดแย… VmNž๐C์์์่ืฏŸนL๙พทFމีฃbลŠๆ๚’oค๒P›?> `ฤˆ๚๋ฏ๘๛๛ยŸi๋ะ)‰‰‰๘๛๛3eส”,ื7Žฯ>๛Œ๐๐p~๙ๅ๒ๅหGHHIIIf›_|‘๛๗ณvํZ–/_ฮๆอ›yํตืิ!OKK3Š/nŒ;ึ†Q=ฺc๑โลๆ๓๔๔tฃhัขฦ๘๑ใอeqqq†ณณณ๑๗฿†a0c๗๎f›•+Wvvvฦ™3gX์ช?ำŒM›6†q=ฟŽŽŽฦ‚ ฬ6ฟ๖›;v์0 ร0""" {{{ใ๙๓f›/ฟา๐๐๐0’““์<‚ (`LŸ>]นพOŒ'Ÿ|าXปvญQฏ^=ฃo฿พ†a่ต}?Œ1ย๐๗๗ฯr]nสทFHๅก•’’ยž={6—ูฬŽ;lY๎r์ุ1ฮŸ?o•gOOOชUซfๆyวŽไฯŸŸภภ@ณMpp0๖๖๖๒ห/<ๆGM||< `ฯž=คฆฆZๅผbลŠ<๘ใV9๗๕๕ฅH‘"f›,‹9๒'™ฅฅฅ1o<ฉQฃ†r}Ÿ๔๊ี‹fอšYๅ๔ฺพ_Ž9B๑โล)Wฎ/พ๘"'OžrWพ๓ุ:‘์๗฿คฅฅY'(RคดQTนฯ๙๓็ฒฬsฦบ๓็ฯSธpaซ๕y๒ไก`ม‚fษZzz:๚๕ฃVญZ๘๘๘ื๓้ไไD๙ญฺœ๓ฌ~'๋ฤZll,5jิ )) 777/^LฅJ•ˆŠŠRฎ๏ฑy๓ๆ๑๋ฏฟฒ{๗๎L๋๔ฺพ๗ชUซฦŒ3จPก็ฮcิจQิฉS‡}๛๖ๅช|ซ นz๕๊ลพ}๛ฌๆ|ษฝWกBขขขˆgแย…t้า…M›6ู:ฌ\็ิฉS๔ํ—ตkืโโโb๋pš4ib์็็Gตjี(]บ4?๐ฎฎฎ6Œ์า){yh=๖ุc888dบZ๐ย… -ZิFQๅ>นผUž‹-š้Bฒkืฎ๑ฯ?่wq ฝ{๗f๙๒ๅlุฐ’%Kšห‹-JJJ qqqVํoฮyVฟ“Œubอษษ‰'žx‚ชUซ2v์X๙๔ำO•๋{lฯž=๙็ŸTฉR…๙D4์ทONž<)ห–-“ะะP้๏๏W๚ˆ—gŸ}VjjjคบบZฆM›&FฃัVSฒkซWฏฉชชณูฌ|,‹RgีชU2y๒dฉจจcวŽILLŒฤฤฤ(ๅƒƒƒ. .”บบ:)++___ษออตล”์ZNNŽ:tHฮŸ?/'Ož”œœqppˆื๚Qป){ฎ๗ร–-UUUry๙๕ื_ๅๅ—_imm‘วgฝ™’ผyณLž๘เ๑๓๓WWW‰‹‹“ฆฆ&ซ>ฺฺฺฤh4ŠJฅตZ-+Vฌžžฬฦตึ$??_ฉำ฿฿/kึฌOOO™8qข$%%‰ูlถ๊็ย… ’ nnnโใใ#ููู200๐/ฯฦญ\นR๔zฝธธธˆฏฏฏฤลล)ษจื๚Q๛gBส๕~ธRRRฤ฿฿_\\\$00PRRRไฬ™3J๙ใฒ""ถน7KDDDDฤ=คDDDDdcLH‰ˆˆˆศฆ˜‘M1!%""""›bBJDDDD6ล„”ˆˆˆˆlŠ )ูR""""ฒ)&คDDค่๋๋ƒม`@ooฏญCฑ2sๆL9rไพฺ„„„ บบ๚Etš››๑sฯู: "ปล„”ˆศŽ„„„`าคI่๋๋SฎY,ธปป#$$ฤชฤ‰กRฉเํํไไdtttX๕UWWw฿Iะึญ[ฑlู2จTชk[CCbbb•ฑชชช๐ิSOY][พ|9>๚่ฃ๎3,, :?๘ใัc‰ )‘ DII‰rพo฿>๘๛๛ชwเภ๔๖๖ยd2แๆอ›ศหหณ*/++C||}w฿มh4>P๗cpp๐‘a/Fๆj4ฑ}๛vGCdŸ˜ูฃัˆยยBๅ๛๏ฟGZZฺธ๕'Mš„ฅK—ขฑฑั๊๚HBฺ฿฿ฃั///xyya๎นc๖c2™ะาา‚Yณf)ืBBB๐ูgŸaฦŒpwwว† ะิิ„จจ(xxx`ีชUJแแalธมมม๐๗๗วฺตkqใฦ ภŽ;0|deeมรร๙๙๙hooGjj*ดZ-ฆL™‚‚‚‚q็x๛ฯ๏ฅฅฅx๚้ง•ปฦปvํทoฟ†ฐฐ0x{{c๚๕Vสพ๚kL›6 >>>ศศศ@__†††€s็ฮAฅRAฅRก  ………ศหหƒJฅRๆ\__y๓ๆมำำ‘‘‘8v์˜าทƒƒถlู‚ะะPฬŸ?0o<”——?Qษ8ั=""ฒzฝ^ชชช$((HZ[[ฅตตU‚‚‚คบบZ๔zฝUฝ_~๙EDDบบบdษ’%ฒqใFฅผปป[t: ษ7฿|#K–,‹ล"r๘๐แ1ว.--•ศศศQ๑ฤฦฦJ[[›466Šซซซ,Xฐ@L&“˜อf๑๓๓“ŠŠ ูถm› นx๑ข\ปvMžy%ฆ|qtt”|‹ล"ฏผ๒Šdggห๕๋ืฅฑฑQๅฤ‰ใฎหศ|คบบZDDฬfณ444Œๆ™gžณู,—.]ƒม ทo‘~๘Aยรรๅย… bฑXฤh4JvvถˆˆTVVสิฉSญ๚สศศผผ<ๅผงงGdฯž=288(ลลล,""@–.]*]]]bฑX”vjตZNŸ>=fผDO2!%"ฒ3ŽŽŽx๕ืฑ{๗n์ฝฏฝ๖GีKHH€Fฃงง'š››ฑz๕jฅฌผผฑฑฑ˜0aœัึึ†s็ฮมษษi;คc๎]ปv-ผผผ0}๚tDDD >>มมมะ้tˆล‰'ปvํย๚๕๋ooolุฐ;w๎T๚™:u*–/_Ž & ซซ UUUุดi\]]1}๚tคฆฆb๏ฝw]ggg466ขทท:ƒaบ๏ผ๓t:ฐn:์ฝภญญ นนนะ๋๕pssร{๏ฝ‡={๖u์ฅฅฅ˜9sฆ๒ทILL„VซลัฃG•:999PซีpssSฎนปปฃซซ๋žว!zR0!%"ฒCiii(**Baaแธ?ื๔ำO่์์„ลbAbb"/^ฌ”พ4==qqqHJJ‚^ฏวฆM›ฦ์ฯรรcฬง๋ตZญr์ๆๆ6๊|คMKK &Ožฌ”้๕zดดด(็AAAสฑษdย๕๋ืแ๋๋ FFƒoฟ—/_พใบภž={P\\Œ   ฤววฺชpปเเ`ซcณูฌŒŸ••ฅŒย /เ๊ีซw๛๖๘:คดืh4hllwพ#zzzเแแqฯใ=)˜ูกจจ(ดททฃฃฃัััwฌ๋๊๊Š๔๔t?~ืฎ]p๋งE‹\\\๐แ‡ขนน?3พ๚๊+TUU๊gึฌY8{๖์ว“ษคœ›L&(็สq`` T*:::ะูู‰ฮฮN๔๔๔`๋ึญwgฮœ9ุฟ?ฎ\น‚ˆˆซ;รt๑โEซใ‘‡รQPP Œููฉผูเ๖8วŠ}คขE‹FตOMMทอๅห—188ˆฉSงuŽDO&คDDvj๏ฝ๗๔๖ภภŠŠŠ ีjแํํำงOCญV+ษWee%0<< ตZ ''ง1ท่๕z่t:ิืื?Pผ)))๘๓ฯq้า%ดทท#//oผ๑ฦ˜uƒ๗฿‹ƒƒƒ๘ใ?p๊ิฉ;Žq๓ๆMกปปฮฮฮPฉTcฮeฤๆอ›qๅส˜อf|๙ๅ—HNNฌ\นฑ’€›อf”••ธuG๘๊ีซVฏาjตธpแ‚r๊ซฏขถถ%%%D?สสส๎๘sแร‡๑าK/มษษ้Žs$z1!%"ฒSƒแŽ๛#.\•JTVVขคคฃ^๗d6›‘˜˜ตZ่่hdeeป433ำj฿็ศฬฬDRRfฯž ƒม€ˆˆไๆๆŽ[ฟฐฐ7ฆL™ญV‹w฿}wง  zฝžžž8x๐ ถlู2nไไdฬ;แแแXฐ`VฌXเึ› 233ฑx๑bจีjฤฦฦ*ษ๐Œ3ฐlู2Cฃัธ•ภึิิ@ฃั`อš5๐๐๐ภ๛ฑy๓fhตZ„„„`ถmwŒ{็ฮx๓อ7๏:?ข'‘ƒˆˆญƒ "ข‡'>>999x๑ล๏ปm__ขฃฃ๑๛๏ฟห๑ห๓Oคงงใศ‘#cn zา1!%"zฬ|๚้งXทnœm ั=aBJDDDD6ล=คDDDDdSLH‰ˆˆˆศฆ˜‘M1!%""""›bBJDDDD6ล„”ˆˆˆˆlŠ )ูR""""ฒ)&คDDDDdSDU€^ใVIENDฎB`‚c4core-bm-charconv-atox-mega_bytes_per_second-u64.png000066400000000000000000001070021477602032300330770ustar00rootroot00000000000000c4core-0.2.6/doc/img/windows-x86_64-vs2019-Release‰PNG  IHDRคฺˆ 9tEXtSoftwareMatplotlib version3.5.3, https://matplotlib.org/อ+นา pHYsaaจ?งioIDATxœ์w|O็๑GYD‚TTิˆปชถ FCอ–š5;(ต>FKฉถด1๚กUซ|P{ฏฺ‚ฤชัjŒZญส dž฿~9_oB๑&yoท๗M็\ืu^ืๅไWฎsร0 DDDDDฌฤึฺˆˆˆˆHึฆ„TDDDDฌJ ฉˆˆˆˆX•Rฑ*%ค""""bUJHEDDDฤช”ŠˆˆˆˆU)!ซRB*""""Vฅ„Tไ)‰ˆˆภฦฦ†ฯ>๛ฬฺกคฉvํฺ”+Wฮฺad˜ }๚๔ฑv๒ูถm666lถอฺกdy;wฦลลลฺa}zšc;fฬlmm๙๊ซฏฬm็ฯŸ็ไษ“iึนื;w9r$%K–ฤษษ‰ ๐๚๋ฏ๓oฟ™enบล Aƒ(\ธ0ŽŽŽ”*UŠฯ>๛ ร0,ฺJ^ใบ|๙rส•+‡ฃฃ#ฌ[ทฮ,ณdษlllุพ}{ŠXฆOŸŽล๙๑0็ล๖ํ้ีซ*Tˆ‘#G๒๛๏PดhQ๓{ ฝ+y๒ไ!gฮœ;€‚ Rณfอ็ีผy๓๐๑๑ษ๐ๅ˜˜๚๗๏——ŽŽŽxxx๐ฺkฏq่ะ!เ๎z็ีซWs๎9ณษ๋๔’ฯฯ… 2lุ0 ,H๖์ู‰ŽŽNu i๒ฺ้๗p๗ณ&((ˆ9rเแแม€Xฟ~}Š6ฯœ9Cห–-ษŸ??NNN*Tˆเเ`ขขขา์sz}ธvํoฟ6๙๒ๅรษษ ???พ๛๎ป g๒๗ัฮ;y๙ๅ—qrrโฅ—^โ๛๏ฟท(7rไHlllRิO>ง๎=W’ถm›๙ฝ้ใใcŽราฅK๑๑๑มษษ‰Š+r๘๐แTc;{๖,๕๋ื'GŽxzz2z๔่฿KIIIL™2oooœœœศ—/ปw็ฦฉ๖3ตฯ‹7Rฝzurๅส…‹‹ ฅJ•โฃ>ฒจŸัฯŠิฦR_ฃ|า{๏'˜1cลŠรัั‘J•*qเภ‹zำฆMo9L๒Mdd$ณgฯๆwกhัขฤลลฅ9+šl๎น;vŒฑcว>ฐฉyะ๙๙oe{l-‰Xัุฝ{7มมม*Tˆˆˆพ๙ๆjืฎอ‰'ศž=;5kึคo฿พ|๙ๅ—|๔ัGๆๅวไGŽษจQฃจ[ท.={๖ไิฉS|๓อ78p€]ปvaooฯ_|ม–-[่ิฉ{๖์มฮฮŽ้ำงณaรๆฮ‹งง็c๛๏‰‰‰กw๏นs‡/พ๘‚:u๊p๔่Q๓ทึใวSญZ5 ,ศเมƒษ‘#?๘#อ›7็๛-Zดฐh๓w฿%w๎Œ1‚ˆˆฆL™BŸ>}Xดh‘Yfฮœ9ผ๕ึ[x{{3dศrๅสลแร‡Yทnํฺต3หธqƒ ๐๚๋ฏำฆM–,Yย‡~ˆ 6ด8๎๘๑ใqvvf๐เม๚๋ฏ|๕ีWุckkห79r${๗๎eฮœ9-Z”แร‡›uฟ๙ๆผฝฝ "[ถlฌ\น’^ฝz‘””D๏ฝ-Žs๊ิ)ฺถmK๗๎้ึญฅJ•Jul‡ ฦธqใ˜>}:บu3ทw์ุ‘ํทง๘!wฟฤฤDš4iยๆอ› ฆ_ฟ~ฤฤฤฐqใFŽ;Fฑbล0 ƒ   ถnสoฟฟฟ?๋ืฏ็๗฿็?เ๓ฯ?ทhs็ฮ,]บ”^ฝz‘3gNพ๒KZถlษ๙๓็qwwงqใฦธธธ๐ใ?RซV-‹บ‹-ยLโ๖ผ่ีซy๓ๆe๘๐แบu‹† r๚๔i,Xภ็Ÿฮ /ผ@ผyำ—‡ีฎ];๚๕๋วอ›7qqq!!!ล‹3pเ@๎น“ก6z๔่ม’%K่ำงeห–ๅ๚๕๋์น“_~๙… *0t่Pขขขธx๑ข9ๆ๗฿ ๓Ÿ{๏=bccqppH๓x9๏oบE:uธ|๙2๚๕#ฬŸ?Ÿญ[ทZดG๚๕‰ๅw฿%๑วฌZตŠศศHR!ฝ>พ}›ฺตk๓๋ฏฟางOŠ-สโล‹้น3‘‘‘๔๋ื๏c๚๋ฏฟาชU+~๛m:u๊ฤ๛_:w๎LลŠ๑๖๖~`ดฺlืฎปwง}๛๖|๖ูg4mฺ”>๚่#z๕๊ฌhำฆ งNฒ˜NLLคAƒTฉR… &ฐn:FŒABBฃG6หu๏9sๆะฅK๚๖ํห๏ฟฮิฉS9|๘ฐ๙๙œ,ตฯ‹ใวำคI|}}=z4ŽŽŽ๚๋ฏ์ฺตหข?ฌxๆฯŸOLL ปwวฦฦ† &๐๚๋ฏs๖์Y์ํํ้ฝ;—.]bใฦฬ;ืข๎ฮ;นs็ล‹งUซV,_พœคค$™6mๅcbb๘๐ร๙่ฃศŸ?#ล›‘๏นลษ๙็Ÿ๖์ูcฦ๗฿on[ผxฑ[ทnต({ํฺ5รมมมจWฏž‘˜˜hnŸ:uช๏อm๋ืฏ7cฬ˜1ฦูณg ฃy๓ๆŒ๑๗฿7รูููธx๑ขน}฿พ}` 0ภ๖๊ซฏ>>>ฦ;wฬmIIIFีชU%J˜fฯžmFบuคค$s๛€ ;;;#22า0 รˆŒŒ4rๆฬiTฎ\ูธ}๛ถE\๗ึซUซVŠ1‹5๒็ฯoดlูาถu๋V0ส•+gฤลล™ถmkุุุ 6ด8F`` QคH‹mฉŸีฏ_฿x้ฅ—,ถ)RฤŒu๋ึฅ(ฝ{๗6 ร0 dฺฺุsๆฬIQ.น_๒฿ืŒษ“'งุ—lฦโล‹ำa๚4eส0~๘แs[\\œhธธธััั้ถ›}ดcวsตkื GGGcะ AๆถไŸ๛%ŸS๗฿'ทน{๗ns[๒็ฃณณณq๎9s๛๔้ำSŒ{งN ภx๗wอmIIIFใฦ ๓๙๙็Ÿ ภ˜7ožEL๋ึญKฑ=ญฯ‹ฯ?}๘โ‹/๘แ‡่ิฉSŠ2ถmหะŒว๗?^xแ}๗๛’วiอš5ุููัทo_‹ƒ ย0Œk'๋ึญKฑbลฬ๗พพพธบบZŒ็oผมตkื,.๓-Yฒ„คค$xใ เัฮ‹nบagg๗ภ~?nนs็ฆAƒ,Xฐธ;TตjUŠ)’แ6rๅสลพ}๛2ผ &5:uฒ8ฯา“‘๓~บu,X   s›“““ลl<`ฮ€ฎ_ฟ>ปฦš5kศŸ??mถ5ทูำทo_nผ™๊’๛•-[–5j˜๏๓ๆอKฉRฅRฮจฒeหhพฏ\น2u๊ิแล_Lฑ=ตc๛่ถไe.qqqlฺด €ล‹ใๆๆฦkฏฝfž๗๕+Vฤลล%ล ujŸนrๅเงŸ~")))อd๔ณโqxใ7,ึz&฿dไใๆอ›ภ๑ฺผy3ํฺตฃgฯž,_พœ7n˜—๚NŸ>อ_|มฤ‰ŸศZึวE ฉd ทo฿f๘๐แๆšพ^xผy๓™๎šญdษ‰—‚x้ฅ—ฬษ>๛์3๒ไษCXX_~๙%ŽตD‰)ถ•,Yา\‹๔๋ฏฟb1y๓ๆตx1ธป–์^๗~๐ๆ‡\๒๚ชไ๕YฟWจPกIj๎นSฌีJํธษ?ˆ .œb{RR’ลลฎ]ปจ[ท.9rไ Wฎ\ไอ›ื\ฯ•ZBš–๏ฟžiำฆ๑ีW_Yฐ~ฟ๖ฅJ•"[ถดW3;wOOฯ๋*“—~ฎ?Fr<4h€›››ล‹E‹แ๏๏Oษ’%G;/าท'ญ]ปvlธ‘๓็ฯณ|๙r‹e!1aยŽ;Fแย…y๙ๅ—9rไC'NำŒœ๗็ฮฃXฑb)ส/^<ลqศฌYณxแ…จ_ฟ>ำฆMหะgQZฮ;G‰%RŒ•ึy—šŒœ‹๋a>€วฒตตๅฅ—^ฒุ–|ฮ'&ž9s†จจ(<<๓g้อrUซVฐฐ0ฆNJ›6mศ“'Ošeญ!#ใ้่่H๓ๆอYถl_5Wฏ^eืฎ]Œ7ฮ,๓(็EFgŸ„   ้ิฉฑฑฑดiำๆก๊ทiำ†5jฐlู26lุภฤ‰๙๔ำOYบtiŠตฬiy˜?ฮ๏!€I“&ันsg~๚้'6lุ@฿พ}?~<{๗๎ฅPกBิๆฟ•‘>ฆvC]๋๙0m>ฮ๑LJJยรรƒy๓ๆฅบ5ะฉฟ;;;ณcวถnส๊ีซYทn‹-ขN:lุฐแกฏ$<์8ฅๆ฿ŒQ๒ ฉ-๏แแa&ต[ถlaบu,]บิโฌ„„n฿พMDDy๒ไมีี5รq?)JH%SXฒd :ubาคIๆถ;w๎คxึbZ"ษ—O:e๑z\\ฟ;u๋ึ5ทบu‹.]บPถlYชVญส„ hัข•*UสPฌgฮœIฑํ๔้ำๆŠษวทททท8๎ฟ‘|ษ๘ุฑc)’kXนr%ฑฑฑฌXฑยb–เKoQผxq&L˜@ํฺตiะ ›7o~จปย๏UฌX1๖ํG||ผลR„{)R„M›6cqœไ;sๆฒ๔ฝxใ พ๛๎;6oฬ/ฟ‚aๆๅzx|็EZ฿›ณณ3อ›7็‡~ aร†ๆ Tฃ@๔๊ี‹^ฝzqํฺ5*Tจภุฑcอ„๔i๕%Y‘"E8qโ†aX๛ื_Mตผ>>> 6ŒปwSญZ5BBB3fLšวH๏3๊ศ‘#ๆฃซ’๓๎~ษณt‘‘‘ๆenศุ ์ฃHJJโ์ูณๆฌ(<ฬฯฤbลŠฑiำ&ชUซ๖ฏ~ษฒตตๅีW_ๅีW_e๒ไษŒ7ŽกC‡ฒu๋ึ‡žบwœ๎๕ธว)ญ๓กbลŠ)–้\บt‰าฅKwŸ๐๚๋ฏง(๗วPดhQ>s๚๗๏ฏโytษ^2;;ปฟU~๕ีW)~[อ‘#๒Cคnบ888๐ๅ—_Zด๓ํท฿e๑์ฤ?๓็ฯ๓w฿1y๒dผผผฬY ŒXพ|นล‡ศ๛ูทoŸ๙Cึรรƒฺตk3}๚t._พœข~jszz๕๊‘3gNฦŸโ.็งต^๊^ษ3๗;**Šูณg?R{พพพฌYณ†_~๙…ฆM›ฆx๎`FๅาฒeK๚๋/ฆNšb_rฌ5"111E™ฯ?› ฯฏnบไษ“‡E‹ฑhั"^~๙e‹K๋ผH๋{เIx๏ฝ๗1b๑CีKLLLqyรรOOO‹๏ณ9rซหเซ~๚๑วูบs็3gฮด(mฑ^๎&งถถถœHซO5โส•+ห:๘๊ซฏpqqI๑„†G•ห๋Ž;ฬmทnส๐ใฅลฝ฿K†a0u๊T์ํํy๕ีWปณๅ‰‰‰็?IQ7!!!C็๒฿b[๒่๗Ÿd๔ณ"ตqJLLdฦŒฌ๛0า๚~-Uช~~~๔ำO๕lร† \ธpื^{ ธป–wูฒe)^y๓ๆ% €eห–ัดiำ‡Š็I}ฯi†T2…&Mš0w๎\([ถ,{๖์aำฆMธปป[”๓๗๗วฮฮŽO?”จจ(อga2„QฃFั A‚‚‚8u๊_5•*U2ovุฒe _5#FŒ B… ภ็iึฎ]›?8ี็ฏx๑โTฏ^ž={ห”)Spww็ƒ>0หL›6๊ีซใใใCทnx้ฅ—ธz๕*{๖์แโล‹„‡‡?ิ๘ธบบ๒๙็ŸำตkW*UชDปvํศ;7แแแ๓ฯ?O๔‡Mj๊ีซ‡ƒƒM›6ฅ{๗๎ผy“™3gโแแ‘jฒ•UชTแงŸ~ขQฃFๆcP’g93๚(—Ž;๒๗฿3pเ@๖๏฿O5ธu๋›6mขWฏ^4kึŒฆM›๒ส+ฏ0t่P"""๐๓๓cร† ๔ำO๔๏฿฿โฆ‡aooฯ๋ฏฟฮย… นu๋Ÿ}๖YŠ2ใผHžY:t(มมมุำดiS๓฿ขขขฬgบ&?"g๊ิฉไส•‹\นrYr????ำbbb(TจญZตยฯฯ6mฺฤ,ฎ‚TฌX‘E‹1pเ@*Uช„‹‹หCp}Xปwg๊ิฉดm–~๚Q @ๆอ›g(˜<{ดeห๚๔้C๋ึญ)Yฒ$ ฬ;;;ปฎใKซO๏ผ๓ำงOงs็ฮ&NœhLš4ษ(\ธฐแ่่hิจQรOQท฿~3:v์hไฯŸ฿ฐทท7 ,h4iาฤXฒd‰Y&๙ั#ฐจ›ฺฃG ร0VฌXaTญZีpvv6\]]—_~ูXฐ`นฟVญZ†ททwŠX๎lIr๛๗?ึ&ญxR{ิฯŠ+ ___รษษษ๐๒๒2>๔S๓ฑK๗?Z&ญว“pฯcŸ’๔ำOFถlูŒ7xร|„WFๅbwG5t่Pฃhัข†ฝฝฝ‘?~ฃUซVฦoฟf–‰‰‰1 `xzz๖๖๖F‰%Œ‰'Z๐Pษ็mjฏ๛’V๏•‘ว>ลฦฦ๏ฟพแ็็gไฬ™ำศ‘#‡แ็็g|๕ืๅnผiดkืฮศ•+—Eฅึfj็มฝŸษ:u๊dไศ‘ร๘ํท฿Œz๕ู๊ณg7๒ๅหgŒ1ยโ๑{ษfฬ˜aTฌXัpvv6rๆฬi๘๘๘|๐ล#ŽาŠi๓ๆอFณfอ OOOรมมม๐๔๔4ฺถmkœ>}:ลxd๔ณโท฿~3๊ึญk8::๙๒ๅ3>๚่#๓{8#}บw,’ฦˆ#ฬ๗ ฦป๏พkไอ›ืฐฑฑIฦ*Uช˜็Y‡Œห—/?0๖G}์Sz็็ฟecVธ^'""’IL™2…p๑โE‹Gบ‰Hฦ)!ษ ทo[Xs็ฮส—/Obbขy3Žˆ<<ญ!ษ ื__|ขขข๘แ‡8y๒dš$y๗฿ฤลลฅน฿ฮฮ๎ฑ‰แ๛i†TDD$ƒฆL™ยฌYณˆˆˆ 11‘ฒeห๒มX<ขKไySปvํtฺW‘"E,žc๚$(!ษย<˜๎_ˆrvvฆZตjO4%ค""""bUz0พˆˆˆˆX•R‘L๎ย… 899™ถฯ ถm† ถm๛ืmีฎ]›rๅส๛ žUชTฑ๘#"ฯ %ค""0gฮlllฐฑฑa็ฮ)๖†Aแย…ฑฑฑกI“&๛’๋%ฟrไศAูฒe3f ๓Oชว;z๔(666์฿ฟ_ว>z๔h*Wฎฤื€ษ7nห—/Oฑ}๗๎Œ9๒‰้ึ?iำฆqๅส•'าพศ“ข„TDไ!8991ทo฿ฮล‹qttLตkฏฝฦนs™;w.“&Mข|๙๒|๑วt๊ิ)ี๒ซWฏฦรรƒJ•*ซx๓Oพ๛๎;z๔่๑ฏฺyึิฌY“ทoSณfMk‡’ช๔าQฃF=ฑ„ดYณfธบบ๒๕ื_?‘๖Ež=‡TDไ!4jิˆล‹๓ๅ—_’-}„ฮŸ?ŸŠ+๒ื_ฅZฏdษ’ดo฿|฿ฃGโโโXบt)w๎1zฒ5kึะฐaC๓๏ฃ?ช~๘lูฒ=ัฟ๑ฐnบEŽ9Uถถถ)ฦ,+๛็Ÿศž=;ถถถดjีŠ๏ฟžQฃF๋๓Gไiั ฉˆศChถ-ืฏ_gใฦๆถธธ8–,YBปvํชญ๙๓cccc‘ุDFFฒ{๗n7nln[ธp!+V$gฮœธบบโใใร_|๑ภc,_พœส•+ใโโbฑ=yไ‘#GจUซูณgงx๑โ,Yฒธ;ใ[นreœ)Uช›6mJั๖แร‡iุฐ!ฎฎฎธธธ๐๊ซฏฒw๏^‹2ษKถo฿Nฏ^ฝ๐๐๐ PกBๆตkืRฃF rไศAฮœ9iธ1ว`ฟR[CzๆฬZถlI๙qrrขPกB๕ภ๖เ๎ฃoชVญŠณณ3E‹%$$$E™ุุXFŒA๑โลqttคpแย|๐มฤฦฦšelllธu๋฿}๗นLฃs็ฮŒ9’๗฿€ขE‹š๛๎}พใ?@ลŠqvv&Ož<sแย‹’๏๔S>๙ไjืฎภ›”โใใ9pเ*THu7hาค •+Wfย„ 8::ฬขE‹ฆQฃF|๒ษ'บu‹VญZcึ=~85jิ <<œ>๘€?˜฿ฺตkณo฿พว๊ีซ'Nœ`๘๐แ <€นs็าธqc\\\๘๔ำO๙๘ใ9qโีซW่‡pวลลQฟ~}๖๎หป๏พหดiำx็w8{๖l†.฿ธqƒFQฑbE&L˜@กB…ู่ณ'๏อ2III๑ูgŸัดiSพ๚๊+š7oฮ็Ÿn๑`นs็โ่่H5ฬeปw็๕ื_งmถ|๙็ๆพไฟ€3v์X:v์H‰%˜|ุŒล‹ง?(ฉH‹I“&™bcc รรรรˆ‹‹3 ร0ๆฮkฺฺุ?ณE0vํฺenห‘#‡ัฉSงวš8qขฟปล๖ˆˆรฮฮฮ;vฌล๖ฃGูฒeณุžoHHHš}rpp0z๖์๙ภพ‹<+4C*"๒ฺดiรํทYตj111ฌZต๊—๋›5kฦฦูธq#?๔C† aบuดkืใžฟO’””ฤบu๋,.ื็ส•‹[ทnY,ศˆ๋ืฏ;w๎T๗ปธธXฬ๊–*UŠ\นrQฆL*WฎlnO๚์ูณ$&&ฒaรš7oฮK/ฝd–+P ํฺตc็ฮDGG[ซ[ทnุูู™๏7nHdd$mถ5gŽ๚๋/์์์จ\น2[ทn}จพบนนwg—ำzrAzฒeหF๗๎อ๗t๏kืฎq๐เA/^L™2e(]บดEฬu๊ิx่˜๏ตt้R’’’hำฆE๙๓็งD‰)ฺvttคK—.iถ—;w๎4ื3‹<‹tS“ˆศCส›7/u๋ึe๙๓ฯ?$&&าชUซt๋*Tˆบu๋š๏ƒ‚‚pww็ฝ๗cีชUๆMGเฯ?ดHH{๕๊ล?Hร† )Xฐ ๕๊ีฃM›64hะ C๑iAพB… ฅธ้ลออย… งุ˜Z๐ฯ?ไŸกTฉR)ฺ,Sฆ III\ธpooos{ัขE-ส9sภLๆ๎็๊๊š^—R(Zด(d๒ไษฬ›75jD๛๖ํอ๘ำใ้้™โFซ’%KA•*U8sๆ ฟ๒‹y‰~ืฎ]{จ˜๏uๆฬ ร D‰ฉ๎ททททx_ฐ`Aาlฯ0 ะ$ฯ%ค"" ]ปvt๋ึ+WฎะฐaCrๅส๕ะmผ๚๊ซ์ุฑรLHืฌYƒ——eห–5หyxxฦ๚๕๋Yปv-kืฎe๖์ูt์ุ‘๏พ๛.อ๖าี๗ฮXfd{Z‰mF8;;[ผOJJ๎ฎทฬŸ?Š๒๗ฏซอˆI“&ันsg~๚้'6lุ@฿พ}?~<{๗๎ตธ‘๊Q%%%แใใรไษ“S"ฐmุุฐvํฺTว›า๎ฯ๛EFF๒ย / ฝ‘-9ๆ๐๐p^}๕ีฮ>ฆต?ญํลŠร0 Š-jฮฬ>ช?๘ƒธธ8ส”)๓ฏฺyšด†TDไธธธ๐อ7฿0rไศG~ฦ็ส•+๐๓๓เ๊ีซ:tศโr=฿Zะdถถถ๘๚๚X}:y๓ๆ5๏Zoำฆ ๑3gฮLQ๖ํบuห|Ÿ#GŽT๏๎ONx๏฿๗๚๋ฏcggวจQฃRฬD†‘โHO๒šืชUซfธŽˆตi†TDไฅ๕W–Rs๚๔i~๘แเ๎Cฬ๗๎หw฿}G๑โล้ะกp๗rฝ“““ล#|บvํส฿M:u(Tจ็ฮใซฏพย฿฿ณ`อš5c่ะกDGG?๔บฬ๔Œ3†7Rฝzuz๕๊Eถlู˜>}:ฑฑฑL˜0แ๕]]]๙ๆ›o่ะก*T 88˜ผy๓ryVฏ^Mตjี˜:uj†ใูฒe }๚๔กu๋ึ”,Y’„„ๆฮ‹-[ถ|`}OOO>๔S"""(Yฒ$‹-",,Œ3f˜๋7;t่ภ?H=ุบu+ีชU#11‘“'O๒ใ?ฒ~z€ป^ฺดi“'Oฦำำ“ขE‹Rนre3น:t(มมมุำดiSŠ+ฦ˜1c2d4oœœ9s๒๛๏ฟณlู2y็{๏ฝ ลฦy๑ล)_พ|†วOฤ๊ฌwƒฟˆศ๓ใว>ฅ'#}ฒณณ3 *dผ๓ฮ;ฦีซWอrญZต25j”ขอ%K–๕๊ี3<<< ใล_4บw๏n\พ|๙q_ฝzีศ–-›1w๎\‹ํตjี2ผฝฝ3rz๗๎mฑํะกCF๚๕ #{๖์ฦ+ฏผb์ฝขฬƒฦm๋ึญF๚๕ 777รษษษ(Vฌ˜ันsg#444~ุงณgฯoฝ๕–QฌX1รษษษศ“'๑ส+ฏ›6mJทร๘ฟฑ 5 '''ฃH‘"ฦิฉSS”‹‹3>๔Sรptt4r็ฮmTฌXั5j”e–;y๒คQณfMรููู,๕Ÿว(Xฐ akk›โP๛฿Œ๊ีซ9rไ0rไศa”.]ฺ่ปทq๊ิฉ๑ฆ&11ั(P €1lุฐ๖[ไYbcb•บˆˆ< ธปป3~xz๕๊๕X~๛ํท9}๚4?๓cmWž=ห—/ง]ปv๖o(Pภฺแˆd˜R‘gภตkื๘๚๋ฏ้ฝ๛cO$ฮŸ?Oษ’%ูผy3ีชU{ฌmหณ%005jdhู„ศณD ฉˆˆˆˆX•๎ฒซRB*""""Vฅ„TDDDDฌJ ฉˆˆˆˆX•Œ/ฯผคค$.]บDฮœ9๘็๚DDDไู`111xzzbk›จRyๆ]บt้[DDDžM.\ PกB้–QB*ฯผœ9s๐๛๏ฟ“'O+Gc๑๑๑lุฐz๕๊™ฦ0+QณvAcี๛ƒ็ฑััั.\ุ9ž%ค๒ฬKพLŸ3gฮว๚ทธŸ'๑๑๑dฯžWWื็ๆƒ่qRณvAcี๛ƒ็นYnง›šDDDDฤช”ŠˆˆˆˆU)!ซRB*""""Vฅ„TDDDDฌJ ฉˆˆˆˆX•Rฑ*%ค""""bUJHEDDDฤช”ŠˆˆˆˆU)!ซRB*""""Vฅ„TDDDDฌJ ฉˆˆˆˆX•a†ตƒIOtt4nnnT๖I.ึว*l †”ปษ๘c.ฤ%ูX;œงNฯฺAV๏?h žT}\็ฑตuฟไŸ฿QQQธบบฆ[V3ค""""bUJHEDDDฤช”ŠˆˆˆˆU)!ซRB*""""Vฅ„TDDDDฌJ ฉˆˆˆˆX•Rฑ*%ค""""bUJHEDDDฤช”>@ซVญจRฅสS=ๆษ“'ฉ]ป๖c/๛ธ8p€€€ผฝฝiฺดฉลพห—/ใ๊๊JHHศSIDDDž_ูฌภณlใฦุูู=tฝฤฤฤGช๗,ธqในs็Ns||<บucษ’%/^œkืฎY์>žqใฦ1lุฐ ี฿ถmu๋ึฅAƒิญ[—›7oากC*UชDฅJ•ุปw/ห—/งrๅส๘๛๛ำฌY3nผ ภ้ำง ภฯฯ3fค{ฌดสฆuฬK—.ัธqcจXฑ".\ฐh/!!ฅK—Rฏ^=๚๔้ภœ9s|8eห–eีชUŒ=šy๓ๆฅ{์3gฮK:u`ษ’%ภคv๘๐แŒ5*ESงNฤศ‘# `๚๔้f"žš๑ใวใๆๆfพ .œnL"""๒|ำ%{๎ฮnใ๊๊ ภํทูฐa›6mโนse{๔่a~ภฌYณฬ๗5jิ ภหkืฎeไศ‘\ฟ~„„ฮŸ?O๋ึญนz๕*๓u๋ึ ,,Œ   ฺถmหแร‡ำŒ7ญฒisฯž=,^ผggg๖๏฿OีชU้฿ฟ?กกกf฿$11‘}๛๖ฑgฯbcc คfอš,Xฐ€ึญ[“'OžuฒeหF‹-hัข็ฮฃ[ทnผ๗{ฤฤฤคzŒ!C†0pเ@๓}ttด’R‘LL i*ยยย8qโE‹%!!?“   VฌX‘nฝ์ูณ›_†มฺตk๑๔๔ด(ำทo_FEํฺตYฒd ซVญภฦฦฦ,s๏ืฉIซlZวLฏฏ/3fฬ`ฦŒดlู’nบัผysฐณณ#))ษ, €งง'ฏผ๒Š™ภVฌX‘SงNฑ~v๎ษฤ‰‰ŒŒฤฮฮŽ์ูณำฑcGเnr}๚PตjU๘๒ห/ำ,›า{ >œK—.แ๋๋KูฒeอK๛1 6คrๅส-Zิ,?eสFމŸŸ฿ืฆU6ญc~๑ล๘ใ๘๚๚Rฝzuฎ_ฟnัžฟฟ?!!!9rชWฏŽ‹‹ eห–ๅoฟ5/™ฟ๐ย t้า*Wฎฬ Aƒ8#ฎ];Nž<ษ๐แร34{+"""Y‹๑ ์GฤสขฃฃqssฃโฐŸHrpฑv8Vแ`k0คMฦs!.)%™‘๚Ÿต๛ƒฌะ<ฉ๚ธฮck๋~ษ?ฟฃขขxฏŠfHEDDDฤช”>รfฯžฟฟฟล+ฝๅ""""ฯ#e ๋าฅ ]บtฑv""""O”fHEDDDฤช”ŠˆˆˆˆU)!ซRB*""""Vฅ„TDDDDฌJฦ—g^๒ƒu๚๋/ญŽUฤววณfอ5j„ฝฝฝตรy๊ิฌะd๕ƒฦเy์ฟŒ/""""ฯ %ค""""bUz0พ<7†ฎ;Cถ์ืฌ†Uุ‘H[xoี)ฑณv8O๚Ÿต๛ƒฌxฦ`j‹2ึแนขRฑ*%ค""""bUJHEDDDฤช”ŠˆˆˆˆU)!ซRB*""""Vฅ„TDDDDฌJ ฉˆˆˆˆX•Rฑ*%คVาชU+ชTฉ๒ศ๕#""XฒdษcŒ(ใึฎ]Kนrๅ๐๖๖ฆG๛ยรรษ–-๋ึญณJl"""๒ัŸต‚7bg๗๏์YrBฺชUซวี]7n w๎i๎ฟ~:ƒf๋ึญไอ›—kื๏Oy†ม!Cxํตืฬmqqq$$$={๖วงˆˆˆdš!}ยfฮœ‰~~~Œ1‚๘๘xฦวฐaร2T?::š:u๊PกBส—/ฯฮ;:t(๋ืฏว฿฿Ÿy๓ๆ๑็ŸาฐaC|||จ_ฟ>Wฏ^ s็ฮๆleDDDชณฒw๎แป๏พฃjีชLœ8€‘#Gb–ษŸ?? , ]ปvไอ›ณฬนsฉSง๙๒ๅ3ทธqƒrๅสัทo_Nœ8‘แq‘ฌC ้tไศฆM›ฦฎ]ปง_ฟ~Lž<™N:‘3gN‹ฒ!!!fJืฎ]pvvๆงŸ~โะกCฌ\น’Aƒ0v์X๊ืฏOXXoพ๙&#FŒเตื^ใ่ัฃ4kึŒกC‡>0พSงN1`ภส•+วกC‡˜9s&ใฦKทฮ™3gธx๑"ีซWงjีชl฿พ€จจ(fอšEฟ~,ส็ห—ใว@๗๎ฉUซ๓็ฯ'666อcฤฦฦm๑‘ฬK—์Ÿ mถŒซซ+ทo฿fร† lฺด‰s็ฮY”ฝw-f@@ณfอ๎^เƒุนs'vvv๚๋ฏฉk๗๎Œ9€๖ํ๓ีW_ฅ๗?‚ƒƒ;v,วŽรษษ)C}JLLไ—_~a๓ๆอœ?žz๕๊qๆฬFŽษ‡~ˆฝฝ}Š:ฮฮฮt์ุ‘Ž;r์ุ1:v์ศ๘๑ใ9z๔hชว?~<ฃFสP<"""๒ำ ้Sฦ‰'(Zด(ีซW็๐แรฅ[gผyฤลลFXXุCำฮฮŽคค$‹Yษื^{ฯ>๛Œy๓ๆัถm[ึฌYc–Kฏžงง' 6ฤัั‘%Jเแแมๅห—9x๐ ฝ{๗ฦหห‹%K–ะฉS'ถlูbึ๛ใ?๘ฯC๋ึญ)Wฎ3fฬH3ๆ!C†eพ.\ธ๐ะ‘็‡า'จN:,\ธะผไศๅห—‰ˆˆ`็ฮ”/_ž+VคFtt4ุููฑdษnบ@ฮœ9‰‰‰1หUญZ•E‹0|ชWฏ@‘"EฬD๖cนบบาฏ_?ยรร0`๓ๆอฃTฉR๐ร้ึkาค ?3†apๅสฎ\นB๙ูฑcDDDะชU+พ๛๎;๊ิฉCTTAAAิฏ_v๏อ๗฿O```š}vttฤีีีโ%"""™—า'จ\นr๔้ำ‡ชUซโ็็ว—_~™fูดึถkืŽ-[ถเ๋๋หŽ;ฬ†|}}น}๛ถySำศ‘#Yณf พพพ,]บ”1cฦ๐๖oณt้Rส—/ฯ_•๊ฑkึฌษผy๓ุปw/^^^ผ๚๋œ>}___Ž;f–๕๕๕ฅB… x{{Sฏ^=ฆNš๊e๚{ 8cวŽ1`ภ€t๏เ‘ฌษฦ0 รฺAˆค'::777บฐ‡lูฌŽUุ‘H฿ุ’TŒD#รžG๊ึ๎?h ฒzแ๙ƒฉ-ส<ึ๖โใใYณf 5zเDะณ"๙็wTTิฏvj†TDDDDฌJ ฉˆˆˆˆX•Rฑ*%ค""""bUJHEDDDฤช”ŠˆˆˆˆU)!ซRB*""""V•อฺˆdิุ%pwwทvVq๗ศฟ๑Y“Rฯอ‘'๕?k๗4Yฝ 1ศ์4C*""""Vฅ„TDDDDฌJ ฉˆˆˆˆX•ึสscQ๘8็ผeํ0ฌ#)‘<ภ‡.‚ญตฃy๚ิฌะd๕รs7]*ฝhํž+š!ซRB*""""Vฅ„TDDDDฌJ ฉˆˆˆˆX•Rฑ*%ค""""bUJHEDDDฤช”ŠˆˆˆˆU)!ซRBjEญZตขJ•*\?""‚%K–<ฦˆ2ๆฯ?คqใฦ”)Sooo๚๋/s_RR•+W&88๘ฉว%"""ฯ'%คVฒqใF์์Ÿ>{ ้7Xฆo฿พผ๖๒ห/์ฝ›œ9sš๛พ๖[ผผผบMษบ”>3gฮฤวว???FŒA||<ใฦcุฐaชM:uจPกๅห—g็ฮ :”๕๋ืใ๏๏ฯผy๓๘๓ฯ?iุฐ!>>>ิฏ_ŸซWฏrใฦ ส”)รAbb"UชTa฿พ})Žฑw๏^:w๎L@@p7ูฝw๖ถs็ฮฌ[ทŽศศHŽ;ฦ๋ฏฟ€››ŽŽŽ๗฿,\ธwyวขํ>}๚Pฟ~}–-[FBBย๛KttดลKDDD2/%คOุ‘#G˜6mปvํ"<<œ~๚1y๒d:u๊d1ณBHHกกกtํฺggg~๚้':ฤส•+4hcวŽฅ~๚„……๑ๆ›o2bฤ^{ํ5Ž=Jณfอ:t(นs็fธq๔่ัƒI“&Qฝzu*Wฎ @LL !!!TฌX‘QฃFัฌY3N:•n~w๒ไษรoผA๙๒ๅ-’๊กC‡๒๑วง˜๙7oฃFbๅส•”-[–#Fp๑โล41~xฬWแย…38ฺ"""๒<สfํ2ปmถŒซซ+ทo฿fร† lฺด‰s็ฮY”ํัฃ‡๙u@@ณfอภ0 >๘เv๎‰ฟ๚kชวฺฝ{7#GŽ }๛๖|๕ีWดhั‚๙๓็๓ํท฿f–๗๔๔$00ฅK—RคH‘ ๕'11‘ฝ{๗r่ะ!J–,I๓ๆอYฑb… ๆฦิฎ]›mถฅจWฅJชTฉBtt4ฃFยหห‹ปw๓๒ห/ง(;dศhพŽŽVR*""’‰)!}สยยย8qโE‹%!!?“   VฌX‘fy๓ๆGXXvvvธธธ<ิ1ใใใ๙๗฿1 ƒ[ทnแ์์ ภโล‹™>}:AAAt้า…:เ๎๎€IIIfฑฑฑภ$ถD‰x{{ะคIยรร๙ใ?๘๙็Ÿ๑๒๒โฮ;ฤฤฤะซW/พ๚kโโโXถl3gฮไๆอ›ฬ˜1__฿Tใutt4—ˆˆˆHๆงK๖OX:uXธpกน200ห—/มฮ;)_พ|บษ(!๔๐๐ภฮฮŽ%K–p๋ึ-rๆฬILLŒYฎjีช,Zด€๙๓็Sฝzuเ๎%๐๚๕๋3lุ0๚๖ํk–oะ ห–-cํฺตDGGHปvํศ—//^ไึญ[DFF๒๓ฯ?wา\นrqแย ร`๛๖ํ”.]šž={๒วมย… iฺดฉ™ŒNš4‰าฅKณu๋V>๛์3๖๎ห[oฝ…““ำใbyฮ)!}ยส•+GŸ>}จZต*~~~|๙ๅ—i–Mk iปvํุฒe พพพ์ุฑƒ|๙๒เ๋๋หํทอ›šFŽษš5k๐๕๕e้าฅŒ3†ใว๓ฟแร‡ำฑcGnธมชUซ,Ž๋้้ษ๐แร๙ๅ—_ฬ„ิมม๛ใ็็Gpp0~~~f๙I“&„ฏฏ/นrๅขeห–้ށฟฟ?GŽ!$$‡Cษl ร0ฌ„Hzขฃฃqsscฺๆpœsๆฒv8ึ‘”Hž+G๘;ฟ/ุปว…=—ิฌะd๕รs7]*ฝ๘X‹gอš54jิ{{๛วฺ๖“’๓;**สผ—&-š!ซRB*""""Vฅ„TDDDDฌJ ฉˆˆˆˆX•Rฑ*%ค""""bUJHEDDDฤช”ŠˆˆˆˆU้oูหsใ ฟ‚ธปป[; ซธ๛@ไ#ดฏP่นy ๒ใคgํƒฦ ซ๗4™fHEDDDฤช”ŠˆˆˆˆU้’ฝ<7FD“๓ฦณ๗‹Ÿ„คฤ๖Ÿยึ.๋}ชYป 1ศ๊‡็o ‹็ฒvฯอŠˆˆˆˆU)!ซRB*""""Vฅ„TDDDDฌJ ฉˆˆˆˆX•Rฑ*%ค""""bUJHEDDDฤช”ŠˆˆˆˆU)!ซสฒ iซVญจRฅJ†สถiำ???ๆอ›๗„ฃJ]ํฺต9y๒คUŽš9sๆPฆLส–-ห˜1c,๖ญZต ›g*^yถ=๛ ๖ ุธq#vv๛›่—/_ๆ๔้ำ„‡‡งุ—˜˜˜แvฌๅacผqในs็Ns/ฟยฬ™39x๐ ูณg็ฺตkๆพ;w๎๐๙็Ÿ๓๒ห/›nบ…ƒƒ๖๖๖ึษ๔2 ้ฬ™3๑๑๑มฯฯ#Fฯธqใ6lX†๊7mฺ”3gฮเ๏๏ฯัฃG๑๒๒bศ!๘๛๛ณgฯฦŒCนrๅ๐๕๕eๅส•lถz๕๊ัจQ#ผผผ a์ุฑ๘๚๚าฐaCา<Š+๐๗๗วฯฯฎ]ปšgฯžMลŠ)_พ<.\`๙๒ๅTฎ\š5kฦอ›7่น3ฝz๕ขRฅJL™2…)SฆPบti่฿ฟŠcFEE1u๊TXดh‘ูฦบu๋ˆˆˆ0g“ฟ๖[๚๖ํK๖์ู๐๐๐0™0a={๖ฤูููv๚๔iJ—.อะกC9w๎\†ฦ<66–่่h‹—ˆˆˆd^™:!=rไำฆMcืฎ]„‡‡ำฏ_?&OžLงNศ™3งEูBBB 5“ม%K–เใใCXX>>>xyy†ƒƒ+Vฌเเมƒฌ_ฟžw฿}ืL 9ยผy๓8pเ~๘!E‹ๅศ‘#8;;ณy๓ๆTใฝz๕*dํฺต„‡‡3aยsŸ‹‹ ค}๛๖fœตjีb฿พ}„……QญZ5พ๖[ณ|dd$๛๗๏gะ AŒ;–ร‡ฮจQฃฬ2ษฌTฉWฎ\แงŸ~ขG้Ž้™3g8t่UชTแ•W^แ่ัฃภคu๏ฝดjีสข|๙๒ๅ9t่žžžดhั‚ฦณrๅJำ<ฦ๘๑ใqss3_… N7&yพe๊„tถmใ๊๊ ภํทูฐa:uJQถGf2ภฌYณาlทu๋ึ์ฝ›VญZแ่่HจPกว jีชไฮ›ผy๓โๆๆF“&M(Wฎ็ฯŸOต}๛๖Qทn] (@ž}:'Nœ0หทjี *VฌH๛๖ํYธp!ŽŽŽLš4‰ZตjQฝzuNœ8ม˜1c๐๒๒Jg4๏JLLไ๒ๅห์ฝ›1cฦะนsg{๏=>๙ไ“T๋ธนนัปwo:ฤ!C่ืฏอ›7O๓C† !**ส|%ฯ‹ˆˆHๆ”ฅึ†……qโฤ Š-JBB๙'AAAฌXฑโกฺIพ\๓k[[[๓ฝญญmบณƒiIN$๏ญ฿ทo_FEํฺตYฒd ซVญJ5ฦีซWณu๋V๗ฟยถmh฿พ=ทo฿ๆำO?eห–-t๋ึ5j˜u์์์HJJ๎^BOๆ้้Iฝz๕ฐตตฅZตj\นrร08t่™4_นr…W_}•ญ[ทRฒdIเ๎ฬ๊ฌYณXถl 6คgฯž้๖5นฟ"""’๙e๊า:u๊ฐpแBs b`` —/_&""‚;wRพ|๙‡NF๏UตjU–-[F||ฬดiำ(Wฎ#“ˆˆˆd.™z†ด\นr๔้ำ‡ชUซbggG‹-9rdชe“ืe๖่ัƒะะPBBBาฝl๐๒ห/ำธqcส—/ญญ-_~๙%...ฏ‡‡Ÿ9 4 rๅสฬ˜1#อ๒1 6ฤjีช™ขLbb"ํฺต#&&ร0=zดล~[[[5jDฃFธx๑"Wฏ^เํท฿ฆYณf,^ผ˜z๕๊™ๅ›4iยš5k๐๖๖ฦูู™™3gฆงlูฒ1iา$*Tจัa‘,ฦฦ0 รฺAˆค'::777ึ‡ž%ง[ฺคสฬ’๘๋ไ.^(] [ปL{dชิฌะd๕ร๓7ลs=ึ๖โใใYณf 5znฅ˜๓;**สผŸ'-™๚’ฝˆˆˆˆ<๛ž_12ฉ-Z๐๛๏ฟ[l[พ|y†๎tษL”Zษฒeหฌ‚ˆˆˆศ3A—์EDDDฤช”ŠˆˆˆˆU)!ซRB*""""Vฅ„TDDDDฌJwูหsฃข—+๎๎นฌ†Uฤววณๆ$ผ’s๓@ไวIฯฺAV๏?h 2;อŠˆˆˆˆU)!ซา%{yn\๋QŠ8›8k‡a‰ูœเ™\ํTป„;ึ็ฉSณvAc•๛_เวhk‡ OfHEDDDฤช”ŠˆˆˆˆU)!ซRB*""""Vฅ„TDDDDฌJ ฉˆˆˆˆX•Rฑ*%ค""""bUJHEDDDฤช”ŠˆˆˆˆU=–„ดUซVTฉR%CeดiƒŸŸ๓ๆอ{‡~hตkืๆไษ“V9๖ศ‘# ๙WmlถเเเGชฬถmี๑o฿พM๛๖ํ)]บ4eส”แุฑc๛ๆ\ว๐ท์7nˆ]†ส^พ|™ำงOžb_bbb†ฑ–็!ฦใŸ![ถl888คYf๔่ัTจP~๘;w๎o๎Kํ\ธqในs็~b1‹ˆˆศ๓๏กfHgฮœ‰~~~Œ1‚๘๘xฦวฐaร2Tฟiำฆœ9sŽ=Š——C† ม฿฿Ÿ={๖0fฬส•+‡ฏฏ/+Wฎ๎ฮึซWFแๅๅEHHcวŽลืื—† ’ๆ๑VฌXฟฟ?~~~tํฺี>{๖l*VฌH๙๒ๅนpแห—/งrๅส๘๛๛ำฌY3nผ @็ฮ้ีซ•*Ubส”)L™2…าฅKใ็็Gำ<๖ษ“'ฉUซ~~~Tฎ\™ุุX>>xyy†ƒƒ+Vฌเเมƒฌ_ฟžw฿}ืL 9ยผy๓8pเ~๘!E‹ๅศ‘#8;;ณy๓ๆTใฝz๕*dํฺต„‡‡3aยsŸ‹‹ ค}๛๖fœตjีb฿พ}„……QญZ5พ๖[ณ|dd$๛๗๏gะ AŒ;–ร‡ฮจQฃาฏ:0rไHยรรูฐa๖๖๖œ;wŽํท๓ใ?š๕gอšEัขE9pเ;v์`๐เมฤวว3z๔hJ–,ษ‘#G ฅdษ’f๛๋ึญc์ุฑ๔ำOฤวว3eสถmFXXvvv,]บ”๛๗ณqใFŽ;ฦ์ูณูปwฏY?66–y๓ๆQณfMz๔่AฅJ•๘ๅ—_ศ—/_š}บqใผ๛๎ป”/_ž^ฝz™‰vZ็ยธqใ˜1cฤวว‡r๊ิฉ40~xฬWแย…ำ-/"""ฯท _ฒO^ป่๊๊ ]Kธaร6mฺฤนs็,ส๖่ัร: €Yณfฅูn๋ึญุฝ{7ญZตยัั‘ PกBŽ?@ีชUอหพnnn4iา€rๅสq๙Tทou๋ึฅ@ไษ“ว@๙๒ๅอฤ๓๙๓ดnšซWฏ๒ฯ?Pทn]ณ|ซVญฐฑฑ bลŠดo฿žึญ[ำผy๓TMLL ฏผ๒ŠsฒฦcggG๙๒ๅ‰ˆˆ๎^๊>qโsๆฬ &&†K—.ฑeหึฌY@ถlูฬฑ?t่งOŸf๓ๆอไส•‹•+Wrไศsํๆํท)Rค/^ไ๕ื_วž‚ RฃF 3Ž€€๘๎ป๏(Wฎ\ชธ_bb"งNb๊ิฉ|๓อ7๔่ัƒ้ำงำฒeห4ฯoooพ๘โ >๔Sพ๒Kส•+วย… iูฒeชว2dดO%ฅ"""™ื#฿ิฦ‰'(Zด(ีซW็๐แรfข๗0ฒgฯภ2๗ฎiดตต5฿ฺฺ’˜˜๘ะวtttLQฟo฿พ 6ŒฃG๒้งŸš3๗วธz๕jz๖์ษ๖ํiะ มc9ถa|๛ํท„……ฦ๙๓็)RคHšm*TˆฤฤD~๙ๅณ~ณfอฬ๚งNโƒ>0้๛ฟž1cดnš1cฦ๐วXใฒษcแ๎๎Nž๛์3^{ํตtวศีีีโ%"""™W†า:u๊ฐpแBs=_`` —/_&""‚;wRพ|yVฌX๑ศTญZ•eห–ฯ•+W8|๘0^•*Uุดi—/_เ๏ฟNท|tt4  ))‰นs็ฆZ&))‰‹/Rทn]&Mšฤ้ำงS-็๊๊Š››[ทn **ส\ำ™šบu๋๒อ7฿˜eยยยฬํษK ˆ‰‰ภรรƒๅห—๓ฮ;๏p๘qชTฉยๆอ›นx๑"ืฏ_็โล‹cz้า%~๙g๓˜|๗์ฺต‹9rPฟ~}‚‚‚ˆŠŠ GŽ\ผx‘ุุXsญซ ตjีโเมƒภY๓าฅKำธqใ4ฯ…~๘RฅJ1o<h.๗P’)"""ษ2|ษพ\นr๔้ำ‡ชUซbggG‹-9rdชe““จ=zJHHHบ—ํ^~๙e7nL๙๒ๅฑตตๅห/ฟฤลล%ใ=น‡‡Ÿน9‹Yนrefฬ˜‘f๙?˜† โ๎๎NตjีˆŒŒLQ&11‘vํฺƒaŒ=:อ๖พ{บu๋Fษž={บ[๊ฝ;gฯžลฯฯคค$J•*ลาฅK๙๘ใ้ฝ;>>>dห–อb ‹-ส๙๓ f๕๊ีL›6fอšฝฝ=3gฮไๅ—_ๆีW_ฅ\นrxyyฅ๚8ฆ>ž5kึะจQ#๓Fแฌไy์๒ฯ๏จจจ^ี_jซ๚ืฦดhั‚฿b๒ๅห๑๒๒zโว;v,‹/ถุ6lุ0Zตj๕ฤ-"""’dŠ„tูฒeV;๖ะกC:tจีŽ/"""๒ผำ%{ฑ*%ค""""bUJHEDDDฤช”ŠˆˆˆˆU)!ซสwูKึเr*หลง๘๘xXณ†|฿๑<๙qRณvAcี๛/™ŸfHEDDDฤช”ŠˆˆˆˆU้’ฝ<7’fผN’c’ตรฐŠ$xฉ/ISdฤY;œงNฯฺAV๏?h ’๛ŸYi†TDDDDฌJ ฉˆˆˆˆX•Rฑ*%ค""""bUJHEDDDฤช”ŠˆˆˆˆU)!ซRB*""""Vฅ„TDDDDฌJ ฉˆˆˆˆXUฆOH###™5kVš๛๓็ฯภ6ถo฿Žทท75jิxœกeุถmถสฑS๓็Ÿาธqcส”)ƒทท7๕—น/))‰ส•+?S๑Šˆˆศณ-ห'ค1|ฦŽหฯ?lฑ=11๑_ต๛4}๚ฐz๕j–/_ฮ˜1cาŒ๔่ั”,Y’#GŽJษ’%8|๘0sๆฬ!<<œ3๑๛๏9x๐ ปvํโใ?ฦ0 Ž?ฮˆ#8u๊TŠ1)Rค111„„„PฑbEFEณfอ8u๊Tบใ๛๛๏ฟ“'Oxใ ส—/ฯฐaรฬ}C‡ๅใ?ฦฮฮฮขฮผy๓5j+WฎคlูฒŒ1‚‹/ฆyŒ๑ใวใๆๆfพ .œnL"""๒|หfํทJ•*ันsglmmiบ5ูณgทุฟ{๗n>๚่#š5kfฑ?,,ฬ:ฝห 40/S‡……™ณ…ํท็ร?4ห5iาlllprrข\นrœ?>อถทlูยš5kศ–-ฎฎฎTซV wwwŠ-สฅK—(QขŸ9+Vฌ๎ฮj^นrภ\฿™ฺ˜”-[OOOYบtฉ™ค>Hbb"{๗๎ๅะกC”,Y’ๆอ›ณbล .ฬ7จ]ป6ถmKQฏJ•*TฉR…่่hF…——ปw๏ๆๅ—_NQvศ! 8ะ|ญคTDD$หt3ค5kึdวŽxxxะฒeK6oœขŒอฟ:ฦInZฐตตต๘๚Qึž&_ฟทญ[ทฒ~๖๏฿Oxx8E‹%666EŒiษโล‹ษ‘#AAAL™2…๋ืฏ›u์์์HJJ2฿'ท๋้้I‰%๐๖๖ฦž&Mšฮฝ{๙๙็Ÿ๑๒๒"88˜•+WาซW/ณ~\\‹-โ๕ื_gืฎ]ฬ˜1__฿4๛๊๊๊j๑‘ฬ+ำ%ค็ฮฃ@๔์ู“เเ`"##‰‰‰1๗WญZ•E‹ฐjี*๙็Ÿu<Vฎ\ ฝ๙ฉz๕๊ชฝบu๋@BB‚E์๗‹ŽŽ&Ož<8::ฒ~~๙ๅ—Tห?&G๎ฮ๔.[ถŒตkืM`` ํฺต _พ|\ผx‘[ทniะๅ้้Iฎ\นธpแ†aฐ}๛vJ—.Mฯž=๙ใ?ˆˆˆ`แย…4mฺ”ฏฟ€I“&QบtiถnสgŸ}ฦฝ{y๋ญทprr๚Wc%"""™CฆKHทm†ฏฏ/ๅห—็็ŸฆSงN๘๚๚โ๋๋หฤ‰้ป7ฟ๚+ฌ^ฝš|๙๒™uS[C๚ _~๙%&Lภืื—ณgฯาฟวฬ้ำง๑๑๑กRฅJœ>}:อฒ๕๋ื็๚๕๋x{{๓๙็Ÿใ็็—jน๛วค}๛๖๛===>|8ฟ๒‹™:88ะฟถh{าคIแ๋๋Kฎ\นhูฒeบ}๒๗๗็ศ‘#„„„XŒฑˆˆˆ€‘|Œศ3*::777ฎซ‰ปcาƒ+dB๑6ฌ{ฉ/ ฮ~‰ฝgํpž:๕?k๗4Yฝ 1H๎ฃFฐทททv8’๓;**๊ห๏2 ฉˆˆˆˆ<_2]๖ฯ‹๕๋ื[‘wืt~๒ษ'VŠHDDDฤ:”ZI๚๕ฉ_ฟพตรฑ:]ฒซRB*""""Vฅ„TDDDDฌJ ฉˆˆˆˆX•Rฑ*e/ฯ w–b๋๎nํ0ฌย6>ึฌมถฯ:lŸ“"?N๊ึ๎?h ฒzAcฬJ3ค""""bUJHEDDDฤชtษ^žI๋†’”=kžฒIุm’VฝG‰ึ็ฉ{\ทm1๕1F%""‹fHEDDDฤช”ŠˆˆˆˆU)!ซRB*""""Vฅ„TDDDDฌJ ฉˆˆˆˆX•Rฑ*%ค""""bUJHEDDDฤช”>E‘‘‘ฬš5+อ๙๓็ไถ็ฬ™ร_•n™ˆˆชTฉ๒ศวHvเภ๐๖๖ฆiำฆ๛._พŒซซ+!!!๚8"""’5(!}Š”IH3โฦ้๎ง[ทn,\ธใว๓ํท฿Z์}€ป ๎เมƒอ2^^^นs‡๕๋ืH๑โล๐๐๐0ห์ุฑWWW|||,ฺ K—.์ท/C}‘ฌE ้ด`ม๊ึญKXXdฬ˜1๘๘๘ฦ๛๏ฟฯดiำ(Zด('Nœ aร†\ฝzีฌ๋๏๏o~ตkWBCChำฆ เศ‘#8;;ณrๅJZดhA@@ห–-ใ็Ÿๆโล‹Œ;–;wฒgฯ&OžLDDDŠ๘.\ธภ๐แร)[ถ,ซVญb๔่ัฬ›7/>9s†ุุX๊ิฉC@@K–,๎&ตร‡gิจQ)๊œ:uŠ   FŽI@@ำงO็ๆอ›i#66–่่h‹—ˆˆˆd^ูฌ@fVฉR%:w๎Œญญ-ญ[ท&{๖์๛w๏อG}@ณfอ,๖‡……™_฿{™?<<œaร†Mdd$… ฆYณfํ†††Rฏ^=rๅส@ฃFุทo•+W6ห์฿ฟŸชUซาฟBCCquuอPŸูทo{๖์!66–ภภ@jึฌษ‚ hบ5y๒ไIQ'[ถlดhั‚-Zp๎9บu๋ฦ{๏ฝGLLLชว?~|ช‰ญˆˆˆdNš!}‚jึฌษŽ;๐๐๐ eห–lผ9E›‡jณ[ทnฬ™3‡ฃGาฏ_?bcc)6___fฬ˜มฮ;iูฒ%?๘#qqqๆ~;;;’’’ฬ๗ษว๑๔๔ไ•W^มีี•ผy๓RฑbEN:ล๛™0a^^^L™2…กC‡๒๗฿›๕ฏ_ฟฮ”)S "GŽ,^ผ8อุ† BTT”๙บpแย#๕QDDDžJHŸ s็ฮQ @z๖์Ipp0‘‘‘ณ‚UซVeัขEฌZตŠ๙็mบu‹ผy๓r็ฮณ.@ฮœ9อถ+Uชฤๆอ›‰ŽŽๆๆอ›ฌ]ปึbvภษษ‰ทz‹ฝ{๗2qโDถlูB้าฅ™4iEŠ!<<ธ;›šผœ ^ฝz:tˆธธ8nบExx8ลŠcผyœ;wŽˆˆ๚๗๏ฯุฑcุ้ฑ#ํฺต#00่่hึฎ]หฒeหhะ Aš}tttฤีีีโ%"""™—.ู?Aถmcย„ 888เ๎๎ฮย… ลืื—:ะปwo|๓MผฝฝฉYณ&๙๒ๅ3๋๚๛๛›—ํปvํJ=`่ะกTจP|๙๒Qพ|yณ|็ฮ้ะกy๓ๆๅ็Ÿๆร?คjีช 0//ฏTื‘&+$$„›7oš7Uฏ^ส–-K5(\ธ0/ผ๐]บtม฿฿[[[ „งงgบใะฎ];~๘แlm๕๛ˆˆˆคdc†aํ Dา››ื~่Ž{๖ฌ๙;T๛์‘ฺุถmมมมŒ9’Gn+ู๘๑ใ)Uชeส”aฮœ9๛ฆNŠ w๎๙ืว‘ฌA ้CxPB๚จาJH ร ))้_%ค#))‰จจจtหฌ_ฟžpโฤ Nœ8Aใฦอ}๙'ซWฏๆล_4ทEEEaฦ‹YDDDžJHำq้า%ชUซ†ฟฟ?พพพ 4ˆฃGโ๏๏ฯฤ‰นu๋-Zด lูฒ๔่ั#Cmพ๛”.]???&Nœศฒeห ฅE‹ิจQ€|๙๒ัณgO|||x๛ํทน~: 0€คค$๚๔้CนrๅจXฑ"{๗๎๎&ตƒ6ใๅๅ•แYสkืฎ1~xส”)รฯ? @ํฺต9y๒$`9ห:sๆL>๐C์์์ฐฑฑ!oผf;C† aิจQุุุ˜~๙gส”)ร'Ÿ|ยตkื2ˆˆˆd-JHำฑ`ม๊ึญKXXdฬ˜1๘๘๘ฦ๛๏ฟฯดiำ(Zด('Nœ aร†\ฝzีฌ๋๏๏o~ตkWBCCน~:K–,แฤ‰„‡‡๓ฮ;๏ะขE Xถl™™ ^ปvๆอ›s์ุ1fฯžปป;aaa|๙็,Yฒ„‹/r๔่Qๆฬ™C็ฮน[ทnๅ7 vํฺุุุฐcวš4i’n3gฮฐfอ*UชD“&Mธpแ{๗๎%))‰—_~ูข|“&Mุพ};p7ษ fถm้#66–่่h‹—ˆˆˆd^JHำQฉR%ๆฮหจQฃ8sๆ ฮฮฮ๛w๏mฮ6kึŒ์ูณ›๛ยยยฬฏgอšE@@nnnธธธะตkWVฌX‹‹Kชวอ™3'๕๋ืOu฿๎ปiืฎ666๘๘๘={v‹D8ฃ}๗]ฺดiC๛๖ํ9~8ƒ&_พ|ฌ—˜˜Hbb" ]ปv๔๋ืคค$† ยธqใRญ“/_>ฬ๑ใวy๓อ7iบ5๏พ๛nšว?~๔SŽ?NญZต8p /ฟ2‡ H‘"f|+Vฌ0๋{ ~ถm”.]777๓O"""ˆˆˆ PกBœ:uŠ์ูณs่ะ!*Uชฤ AƒจUซวŽใ“O>มหห+อุquuตx‰ˆˆHๆ•อฺ<หถmฦ„ pppภ… Šฏฏ/:t w๏ผ๙ๆ›x{{SณfM‹KfBืตkWz๔่Aม‚ "..๓Ÿะนsg:t่@ผyอuค๗j฿พ=>>>ิซWI“&ฑcว|||ppp`๖์ูTฏ^ส–-K52|™มม7xƒ7xƒSงN™wฤ0€7xƒษ“'SญZ5ณ|ทnh฿พ=sๆฬมออ๗ฟ้ถŸ={vๆอ›Gษ’%3ˆˆˆd=6†žษ#ฯธ่่hธถc:๎ฎฮฎ ล'มบ๓ฎ4x1๛,x]#3๔฿ึฏร#ืgอš54jิ{{๛วี๓#ซAV๏?h žว'ŽŠŠzเีฮ็๔ฃ]DDDD2 %ค""""bUJHEDDDฤช”ŠˆˆˆˆU)!ซRB*""""Vฅ„TDDDDฌJ ฉˆˆˆˆX•R“<7lหถฤึฺaX…m|<œ_ƒmน`lŸ“"?NYฝ""™fHEDDDฤช”ŠˆˆˆˆU)!ซาRynิ_ฺƒ$gkG๑๘jฟฺุ!ˆˆˆX•fHEDDDฤช”ŠˆˆˆˆU)!ซRB*""""Vฅ„TDDDDฌJ ฉˆˆˆˆX•Rฑ*%ค""""bUJHEDDDฤช”f!ทoว›5jซv8@@@4mฺิb฿ๅห—quu%$$ไ_CDDDฒ้ะ,d๙Œ;–ๆอ›งYๆฦไฮ;อ๑๑๑t๋ึ%K–Pผxqฎ]ปfฑ๐เมผ๖ฺkีฆˆˆˆdmš!}]บt‰jีชแ๏๏ฏฏ/'Oždๆฬ™๘๘๘เ็็วˆ#1b•*Uข\นr|๔ัGf}///FŒŸŸ5kึ$::š๏ฟžล‹3hะ z๗๎mqผ„„–.]Jฝz๕่ำงsๆฬa๐เมmนs‡๕๋ืH๑โล๐๐๐0ห์ุฑWWW|||,ฺ K—.์ท/C%::ฺโ%"""™—าgะ‚ จ[ท.aaaœฒeหฒjี*Fอผy๓าํฬ™3ฤฦฦRงNXฒd p7ฉ>|8ฃFJQ็ิฉS1rไH˜>}:7oL๓ใววอออ|.\๘กวPDDDžบd ชTฉ;wฦึึ–ึญ[ณ}๛v‚ƒƒquu Ož<lผ™ &หีซW9qโ~~~Pพ|y~๛ํทวุฟ?UซVฅ„††šm?Hbb"๛๖ํcฯž=ฤฦฦHอš5Yฐ`ญ[ท6cปWถlูhัข-Zดเนst๋ึ๗{˜˜˜T1dศhพŽŽVR*""’‰i†๔TณfMv์ุ‡‡-[ถฤ0Œe๎นรภYฝz5GŽกu๋ึฤฦฦš๛ฐตต%111E}___fฬ˜มฮ;iูฒ%?๘#qqqๆ~;;;’’’ฬ๗ษm{zz๒ส+ฏเ๊๊JผyฉXฑ"งNbL˜0///ฆL™ยะกC๙๛๏อ๚ืฏ_gส”)‘#G/^œfquuตx‰ˆˆHๆฅ„๔t๎9 (@ฯž= &&&†… šk)๛o๎นƒญญ-นs็ๆ๏ฟfๅส•u '''z๋-๖๎หฤ‰ูฒe ฅK—fาคI)Rฤ\ฐ~ฎ^ฝ @ฝz๕8t่qqqบu‹๐๐pŠ+ฦผy๓8w๎๔๏฿ŸฑcวาฑcGฺตkG`` ัััฌ]ป–eห–ั Aƒว5\"""๒œำ%๛gะถm˜0aธปปณpแB๒็ฯOีชUฑณณฃE‹Œ9’ถmRฆL *D``เ#ฯ฿฿ŸnผixTฝzu\\\([ถ,5jิ0/™ฟ๐ย t้าlmm4hžžž้ถ฿ฎ];~๘แlm๕๛ˆˆˆคdcคv=Xไ››gด"ษฺูั<~‡ฺงฝ|!Y||…hDDDไqั ฉˆˆˆˆX•Rฑ*%ค""""bUJHEDDDฤช”ŠˆˆˆˆU)!ซRB*""""Vฅ„TDDDDฌJ ฉˆˆˆˆX•Rฑ*%ค@dd$ณfอฒvฯ…คค$๚๗๏OฉRฅ(]บ46lฐุ{๏‘?~+E'"""ฯ#%คคŸ&&&>ๅhฌw๘๘xnบ•n™™3g’””ฤฉSง8~8ๆพ'Npๅส‹๒‘‘‘O"TษD2}Bz้า%ชUซ†ฟฟ?พพพ์ฝโษ“':t(Gล฿฿Ÿ‰'2gฮZตjEญZต่ะกWฏ^ฅYณfPฃF NŸ> @HH•*Uยืื—.]บ””@ํฺต4hๅห—งRฅJ„††๒๊ซฏ๒าK/ฑz๕๊4c9r$]บt!00>๘€3gฮ๐ฺkฏQฑbE4hภีซW๐๒๒โฮ;ฬ™3‡มƒ๐๛๏Sบti˜8q"@šm+""‚>๚ˆาฅK›}K๋3gฮd่ะกุูู‘'Oณ>๘€qใฦYดฝ`ม˜6mััั๚?‹%::ฺโ%"""™WฆOH,X@บu ใเมƒlบีโ}‘"E;v,>>>„……๑๛๏pไศVญZล๙๓0`#FŒ 44”ษ“'3pเ@ฺดiร8rไฮฮฮฌ\นา<ฎปป;‡ฆz๕๊๔้ำ‡ีซWณ|๙rฦŒ“nผฟ๖;v์`าคI๔๎›Yณfq๐เA~๛m๓ŸคY๏๚๕๋,Yฒ„'Nฮ;๏ผf‰‰‰ฌXฑ‚F๑๚๋ฏSฐ`A:D๙๒ๅำ๏๒ๅห|๙ๅ—TฌX‘vํฺ™3 ‹-" €_|ัข|ฯž=๙้งŸธ|๙2t๋ึƒฆ{Œ๑ใวใๆๆfพ .œnyyพeณvOZฅJ•่น3ถถถดnš5jXผ/[ถlช๕4h@ฮœ9ุฒe 'Nœ0๗ูููฮฐaรˆŽŽ&22’ย… ำฌY3š4i€666899Qฎ\9ฮŸ?Ÿnผอ›7วž˜˜vํฺeถ—˜˜Hฑbลาฌ็ๆๆ†‹‹ ]ปvฅy๓ๆ4n86š7oฮ๑ใว๙๛๏ฉ^ฝ๚ว1YTTE‹ๅเมƒŒ7ŽัฃG๓Ÿ‡/ฟ’M›6ฅZวหห‹1cฦ0rไH~๘แjึฌษ่ัฃ4hPชๅ‡ b&ัััJJEDD2ฑLŸึฌY“;vฐrๅJZถlษิฉSSผO-ัหž=ป๙ต ‡ยึึrBน[ทnฌ]ป–%J๐ูgŸq๓ๆMsŸƒƒถถถ_?hmh๒q“’’(Xฐ aaa)สุูู™หbccศ–-กกกฌ_ฟžy๓ๆฑt้Rพ๘โ‹4?~<_5oฝ๕-Zด kืฎ”(Q"cxzzาผysZดhAŸ>}8{๖,ฟ๚+eส”เฯ?คB… :tศฌ๗๓ฯ?3cฦ BCC๙่ฃh฿พ}šcเ่่ˆฃฃcบใ$"""™Gฆฟd๎9 (@ฯž= f็ฮ๏=Jฮœ9‰‰‰Iณ5j˜7=%%%q๔่QnบEผyนs็‹-zฌqปนน‘;wn๓.๖๘๘x~๙ๅŠ)BXXIIIฌZต €›7oEPP&L ,,,6ส•+วื_อแร‡)Qขํฺตใ•W^!"""อcภ™฿ํทฐm6J—.Wฏ^%""‚ˆˆ๒ๆอk&ฃ6l \นr|๖ูgดm–ใว3t่P๒ๅห๗XวKDDDž_™~†tถmL˜0้ะกพพพๆ๛… โ๎๎Žฏฏ/พพพt่ะผy๓Zด๑ีW_ัฃGฆM›F||<;vฤวว‡กC‡RกB๒ๅห๗ภต—bผy๔์ู“๗฿Ÿ„„}ส”)รฐaรุ่ฑ#/ผ๐~~~ฤฤฤD\\666ๆZัดฺH–#GบvํJืฎ]9x๐ ูฒ=%R;ฝœถm[FE๙™;wnบ}pwwgบu*T่qˆˆˆd6†aึB$=ัััธนนัํ@ฒๅ|๐๏Pซ}๚ขzบโใใYณf 5ยฺแฬ™3‡มƒ›eผผผธs็๋ืฏ'00โล‹เแแa–ูฑcฎฎฎ๘๘๘Xด@—.]ุทo฿ใ\ษ”>a , nบ„……q๐เAถnj๑พH‘"Œ;ยยยx๗8rไซVญb๙ 0€#Fสไษ“8p mฺดแภ9rgggVฎ\iืร‡Sฝzu๚๔้ร๊ีซYพ|9cฦŒ1ห\ธpแร‡SถlYVญZล่ัฃ™7o^บ9sๆ ฑฑฑิฉS‡€€–,YMj‡ฮจQฃRิ9u๊AAAŒ9’€€ฆOŸฮอ›7ำ>โๆอ›Sญ—={v๓k:DXX˜9ณ ะญ[7ๆฬ™รัฃG้ืฏฑฑฑflmm-พN^“๊๋๋หŒ3ุนs'-[ถไว$..ฮฌoggg.ฬถ===yๅ•Wpuu%oผTฌX‘SงNฑ~&L˜€——SฆLa่ะก|๗f๋ืฏ3eส‚‚‚ศ‘#‹/Nsฬ† BTT”๙บpแBฦ[DDDžKJHŸฐs็ฮQ @z๖์Ipp0;w๎ดx๔่Qrๆฬ™ๆl!@5ฬ›ž’’’8z๔(ทn"oผนs‡E‹=T\NNNผ๕ึ[์ป—‰'ฒeหJ—.อคI“(RคแแแภูิซWฏPฏ^=:D\\ทn"<<œbลŠ1o<ฮ;GDD๛๗g์ุฑt์ุ€vํฺHtt4kืฎeูฒe4hะ อุquuตx‰ˆˆHๆฅK๖Oุถm˜0aธปปำกC|}}อ๗ .ฤ___|}}้ะกy๓ๆตhใซฏพขGL›6๘๘x:v์ˆC‡ฅB… ไห—๒ๅห?rŒ„„„p๓ๆM๓ฦฃ๊ีซใโโBูฒeฉQฃ… เ…^ K—.๘๛๛ckkห Aƒ๐๔๔Lทvํฺ๑ร?`kซ฿DDD$%ร0 k!’ž่่hูฮnNฉ–้Xฒ๋SŽ๊้Šgอš54jิ{{{k‡๓ิฉYป 1ศ๊ม๓ุไŸ฿QQQผฺฉ)+ฑ*%ค""""bUJHEDDDฤช”ŠˆˆˆˆU)!ซRB*""""Vฅ„TDDDDฌJ ฉˆˆˆˆX•Rฑ*้Pynดzฉ-๎๎๎ึCDDD3อŠˆˆˆˆU)!ซRB*""""Vฅ„TDDDDฌJ ฉˆˆˆˆX•Rฑ*%ค""""bUJHEDDDฤช”ŠˆˆˆˆU)!ซRB*""""Vฅ„TDDDDฌJ ฉˆˆˆˆX•Rฑ*%ค""""bUูฌ€ศƒ†@LL ๖๖๖VŽฦ:โใใ๙็ŸˆŽŽฮ’c gํƒฦ ซ๗4ฯcฃฃฃ๛9ž%ค๒ฬป~:E‹ตr$"""๒ฐbbbpssKทŒRyๆๅษ“€๓็ฯ?๐„พWฅJ•8pเภC๋YญMแย…นpแฎฎฎฯL\Oซฮฃ๔iล๖(uฒzฅฮณ<YฝOซŽ>Ÿฟsภ0 bbb๐๔๔|`}%ค๒ฬณตฝปิูออํกพ ํ์์ชณ^ภีี5ร๕žๅพ<?๊qžFฌGญฯๆd๕?อ: ฯม็ํศ่D’nj’Lซw๏™ชฮำ8ฦณ\็Q<ซษ๊ิ:โYฬLšužฦ1žๅ:โy้‘‘•ฆ"V››QQQ๔dfีว@ฯฺAV๏?h 2{5C*ฯ๊ึ๎?h ฒzAcู๛ฏRฑ*อŠˆˆˆˆU)!ซRB*""""Vฅ„TDDDDฌJ ฉ<๓ฆM›†——NNNTฎ\™๛๗[;ควbวŽ4mฺOOOlllXพ|นล~ร0>|8 ภูู™บu๋rๆฬ‹27oพ๙&ฎฎฎไส•‹ท฿~››7o>ล^<บ๑ใวSฉR%rๆฬ‰‡‡อ›7็ิฉSe๎นC๏ฝqwwวลล…–-[r๕๊U‹2็ฯŸงqใฦdฯž}žfWษ7฿|ƒฏฏฏ๙๋ภภ@ึฎ]k๎ฯฬ}Oอ'Ÿ|‚ ๛๗7ทe๖19r$666ฏาฅK›๛3{๘ใฺทoปป;ฮฮฮ๘๘๘j๎ฯ์Ÿƒ^^^)ฮ๓™žYแ0"ฯฐ… ฦ๛_ใ๘๑ใFทnŒ\นrWฏ^ตvhฺš5kŒกC‡K—.5cูฒe๛?๙ไรอออXพ|นnE‹5n฿พm–iะ แ็็g์ปื๘๙็Ÿโล‹mถ}ส=y4๕๋ื7fฯžm;vฬ 35jdผ๘โ‹ฦอ›7อ2=z๔0 .llผู 5ชTฉbTญZีŸ`”+Wฮจ[ทฎq๘๐acอš5ฦ /ผ` 2ฤ]z(+Vฌ0Vฏ^mœ>}ฺ8u๊”๑ัG๖๖๖ฦฑcว รศ}ฟ฿๛ ///รืืื่ืฏŸน=ณมˆ# oooใ๒ๅหๆ๋ฯ?4๗g๖๗฿F‘"EŒฮ;๛๖ํ3ฮž=kฌ_ฟ๘๕ื_อ2™s๐ฺตk7n4c๋ึญ†adsเ^JHๅ™๖๒ห/ฝ{๗6฿'&&žžžฦ๘๑ใญีใwBš””dไฯŸ฿˜8qขน-22าptt4,X`†aœ8qยŒ˜eึฎ]kุุุ๑วS‹qนvํšทo7 ใnํํํล‹›e~๙ๅ0๖์ูcฦคึึึธrๅŠYๆ›oพ1\]]ุุุงว w๎ฦฌYณฒT฿cbbŒ%J7n4jีชe&คYa FŒa๘๙๙ฅบ/+๔ร?4ชWฏžๆฌ๘9ุฏ_?ฃXฑbFRRR–8๎ฅK๖๒ฬŠ‹‹ใเมƒิญ[ืfkkKบuูณg#{๒~wฎ\นbัw777*Wฎl๖}ฯž=ไส•‹€€ณLบuฑตตe฿พ}O=ๆ+** €ใโโ๘แ‡x๋ญทฐฑฑษ็ภฝ”ส3๋ฏฟ"11ัโ _พ|\นrลJQ=ษKฏ๏Wฎ\มรรรbถlูศ“'ฯs7>III๔๏฿ŸjีชQฎ\9เnศ•+—Eู๛ว ต1J๗ฌ;z๔(...8::าฃG–-[FูฒeณD฿.\ศกC‡?~|Š}Ya *Wฎฬœ9sXทn฿|๓ ฟ;5jิ &&&K๔์ูณ|๓อ7”(Q‚๕๋ืำณgO๚๖ํหw฿}dฝฯมๅห—I็ฮฌ๑=pฏlึ@Dคw๏;vŒ;wZ;”งชTฉR„……ล’%K่ิฉทoทvXOล… ่ืฏ7nฤษษษฺแXEร† อฏ}}}ฉ\น2EŠแวฤูููŠ‘=III0n8ส—/ฯฑcว กSงNVŽ๎้๛๖oiุฐ!žžžึล*4C*ฯฌ^x;;ปw^ฝz•๙๓[)ชง#น้๕=\ปvอbBB๗s5>}๚๔aีชUlบ•B… ™๓็ฯO\\‘‘‘ๅ๏ƒิฦ(y฿ณฮมมโล‹SฑbEฦŸŸ_|๑E–่๛มƒนvํ*T [ถldห–ํท๓ๅ—_’-[6๒ๅห—้วเ~นrๅขdษ’๚๋ฏYโ(P eห–ตุVฆLsูBV๚Ÿ๗ฯื‡ผ๖น๗็ใภ™๛ยยย ื๋ํbommEeeฅ{LL ฌV+Nž<ฉิ)--EOOฆOŸŸฯyฐD๏ฝ๗ QZZŠฐฐ0ป๒ศศHธธธุƒ๓็ฯรl6ƒ๊๊jปH„Zญ๎๓๎iะำำƒ;w๎ŒˆุใโโP]]SงN)?QQQHMMUއ๛=๘ป๖๖v\ผx#โ3๐าK/๕ู๊ญฎฎƒภศ๘;ุ+'':๓ๆอSฎ„ฯ€GฟUE๔0โๆๆ&ถm“ณgฯสป๏พ+Zญึ๎ยงU[[›TUUIUU•oพ๙Fชชชไฯ?‘๛hตZูณgœ9sF๛๎ไ๙็Ÿ—สสJฉจจ &<5ฌ\นR4”——m{bณู”:+Vฌ)--•'NHLLŒฤฤฤ(ๅฝ[žฬ™3GN:%%%%โ็็๗Tly’™™)‡–ห—/ห™3g$33Sœœœไภ"2ผcศƒoู‹ {‘‘!ๅๅๅr๙๒e๙ํท฿ไตื^___ihh‘แ๑ใวลููY>sนpแ‚ไๅๅ‰‡‡‡l฿พ]ฉ3Š฿=&$$D>๐ร>eร3๐ &ค4ไmฺดIBBBฤีีUฆM›&วŽs๔”eee ฯOzzบˆ฿๒ไ“O>‘ฑcวŠ›››ฤลลษ๙๓็ํ๚hll“ษ$*•Jิjต,YฒDฺฺฺอเ๕;ษษษQ๊tvvสชUซฤหหK<<ฟ'คร,ZดHลีีUeัขEv{p๗๘ED๖๎+โๆๆ&แแแ’mW>Šˆ์฿ฟ_๔‰Kdd|z9‰ˆ8ไั,ธ†”ˆˆˆˆŒ )9R""""r(&คDDDDไPLH‰ˆˆˆศก˜‘C1!%""""‡bBJDDDDล„”ˆˆ0hoow๔T์Lž<GT›ะะPTTTK3œบบ:ผ๐ย Žžัล„”ˆh ล˜1cะััก\ณูl๐๔๔Dhhจ]=จT*๘๘๘ 99อออv}:ujะIะ–-[˜˜•J๕ล๑OซฉฉALLฬ2Vyy9žyๆปk‹/ฦgŸ}๖ฤ}Nœ8zฝ{๗๎งG4,1!%"bQTTคœ๏ูณ}๊8pํํํ0›อธ{๗.ฒฒฒ์สKJJ?จฑ๚้'˜Lฆ'š๗`tuu๋c ฝฑšL&lบีมณ!š˜ 1&“ yyyส๙๖ํ‘šš:`1cฦ`ม‚จญญตป›vvvยd2ม˜1cFฟ˜อfิืืcส”)สตะะP|๕ีW˜4i<==ฑ~zœ?QQQะh4Xฑb…Rทงง6l@pp0ฑz๕jนsฐm6ฬš5 ห—/‡FฃANNššš’’N‡qใฦ!77wภ๚ฝธธฯ>๛ฌ๒ิธ  `ภvฟ;&Nœฌ]ป===Jู๗฿ &ภืื้้้่่่@ww7p้า%จT*จT*ไๆๆ"//YYYPฉTJฬีีี˜9s&ผผผ‰'N(};99a๓ๆอ รฌYณ3gฮฤกC‡FT2N๔ุ„ˆˆ† ƒม ๅๅๅ$ าะะ AAARQQ!ƒมฎฏฟ*""---2|ูฐaƒRฺฺ*zฝ^บปปๅ‡~๙๓็‹อf“{๗๎ษ‘#G๚ปธธX"##๛ฬ'66VฅถถVd๖์ูb6›ลbฑศุฑcฅดดTDDฒณณลh4สีซWๅึญ[๒โ‹/*sสษษ‘ัฃGKNNŽtww‹อf“ื_]222ไ๖ํR[[+r๚๔้๏KoผcวŽ•ŠŠ ฑX,RSS3`›็ž{N,‹\ปvMŒFฃlบUDD~๙g‰ˆˆ+Wฎˆอf“ษ$""RVV&ใวท๋+==]ฒฒฒ”๓ถถ6 ]ปvIWW—JppฐtvvŠˆYฐ`ดดดˆอfSฺฉีj9w๎\ฟ๓%ษ๘„”ˆhˆ=z4z๋-์น;w๎ฤ›oพ‰ัฃG๗ฉ—ญV ///ิีีaๅส•JูกC‡‹QฃFมลลธt้œ|BjตZ๛];บz๕jx{{#<<SงNE||<‚ƒƒกื๋‹ำงO ฐvํZมวว๋ืฏวŽ;”~ฦล‹cิจQhiiAyy96n777„‡‡#%%ปw๏~ไqqqAmm-ฺกื๋a4ฌ๛๛๏Cฏื# kึฌมฮ;_šฐn: ธปปใฃ>ยฎ]ป9vฏโโbLžt:|||p๎9จีj%๙*++CMM zzz Vซแ์์๏ƒมฝ^๊๊๊'š๏ขE‹๐๕ื_ใฺตkhjjBVV~๛ํ~๋"&&1l6บบบ๐วเ์ูณใ๎ปศฯฯGkk+\\\ Rฉ๚ฅืฆM›pใฦ X,|๛ํทHNN,]บ_|๑…’€[,”””ธD๘ๆอ›v[o้t:\นrE9ใ7PUU…ขข"tuuกณณ%%%:ศ‘#x๕ีWแ์์ะ‰F"&คDDC”ัh|่๚ศ9sๆ@ฅRมืืeee(**‚““SŸํž, ’’’ Vซๅห—ธŽtูฒev๋>cูฒeXธp!ฆM›ฃัˆฉSงbบuึฯหหร_…qใฦAงำแƒ>@gg็#วษออ…ม`€——<ˆอ›7X7993fฬ@DDfฯž%K–ธฟ“มฒeห0o<จีjฤฦฦ*ษ๐คI“˜˜ˆเเ`hตZ๗ุสสJhตZฌZต ๛๖ํรฆM› ำ้Š์์์‡ฮ{วŽx็wัHไ$"โ่Iั?'>>™™™xๅ•Wถฃฃััั8~๘ivแยคฅฅแ่ัฃ. ้˜ 3_~๙%ึฌYGO…ˆ่ฑ0!%""""‡โR""""r(&คDDDDไPLH‰ˆˆˆศก˜‘C1!%""""‡bBJDDDDล„”ˆˆˆˆŠ )9R""""rจQ€Iลฯ‰ๆIENDฎB`‚c4core-bm-charconv-atox-mega_bytes_per_second-u8.png000066400000000000000000001044261477602032300330240ustar00rootroot00000000000000c4core-0.2.6/doc/img/windows-x86_64-vs2019-Release‰PNG  IHDRžb šั9tEXtSoftwareMatplotlib version3.5.3, https://matplotlib.org/อ+นา pHYsaaจ?งiˆƒIDATxœ์wxU๛๑wz€ RB‘ Šา „jAB3tž€าคJ}P‘Ž J4 *J้)าคH@:Jโ#% B’฿2_–B@๘ผฎk/ฒ3gฮ๗dwssๆฬฌa"""""™}v """"Ož""""b*ฯ;ว‚ ู่ณ'_~๙%ํทgะ Aฬ™3‡๘๘x,X๐@๗๗ ้'9ยฉSง่าฅ ฯ?<นrๅยหห‹fอšYlNŸ>fอš๐ส+ฏ˜งn๋๕ๅ—_RถlY\\\(Rค]ปvตjำฆ ฎฎฎ:tศjกกกไห—˜˜˜,ล๛๙็ŸSขD rๅสE5๘๗฿ำด9|๘0M›6%ธบบฬ’%KฌฺLŸ>;;;ถnJ๏ฝ)P y๒ไกQฃF๏Kำ็ส•+ฉQฃ๎๎๎xxxPกBfฯžฆมƒyๅ•Wฬำ7ฃFฒZŸ:O๎งŸ~b่ะก-Zwwwš6mJll,‰‰‰๔์ู“‚ โๆๆFปvํHLLด๊ใป๏พใีW_ฅ`ม‚ธธธเ๋๋หW_}•&๊ืฏฯ๊ีซ &Wฎ\L™2%รc;|๘p์ํํ๙โ‹/ฬeงOŸๆ๐แรnsซ๋ืฏ3dศJ—.ซซ+4n˜?๘รl“@Ÿ>}(^ผ8...<๓Œ3ร0ฌ๚Jƒบhั"pqqกlูฒฌZตสl3|์์์๘๕ื_ำฤ2eส์์์ฌ^w๓บ๘๕ื_้าฅ  คXฑb 2„พ}๛PฒdI๓=ู€๙๓ใ๎๎žฅcPดhQชWฏžๆu5kึ,ณ<‡8>>žž={โใใƒ‹‹  ไ๕ื_gฯž=ภอ๙ศห—/็ิฉSfฉ๓่R_Ÿsๆฬaภ€-Z”นs—๎ฯินอwzรอฯšฐฐ0๒ไษCม‚้ีซซWฏNำ็ฑcวhาค … ฦีี•bลŠNlll†9g–ภ?ร;๏ผCกB…puu%00๏ฟ>Kว3๕}ดeห^z้%\]]yๆ™g๘แ‡ฌฺ 2;;ป4งพฆn}ญค๖นqใF๓ฝ้๏๏o‡ เ๏๏ซซ+ๅห—g๏ฝ้ฦ๖็ŸJž/ึฎ]KีชUษ›7/nnn<๓|๔ัGVg๕ณ"ฝใ้ฯ!พ}Ž็ญ๓งNJฉRฅpqqกB… ์ฺตหjปษ“'7%๕w@กB…ฌ๖๏ํํ @ฎ\น๎˜Cjผ*T ]ปvๆ>ฆOŸžฅํ๏…ใC๋Yฤ†vํฺลถmงXฑbœฬษ“'?~<บuc๎นf›้ำง๓๖oSถlY๚๕๋Gผyูปw/ซVญขeห–fปK—.Qปvm7nL๓ๆอ™?>|๐ิฉSวjฟ#GŽ$Wฎ\|๘แ‡?~œ/พ๘'''์ํํนt้C† a๛๖ํLŸ>’%K2hะ sฏพ๚Šฒeห†ฃฃ#K—.ฅK—.X,บvํjตŸ#GŽะขE :v์H‡x๙็ำ=ถ เ“O>aส”)t่ะม\บuk~๕ื4ฬn—’’B๚๕Yทnแแแ๔่ัƒ๘๘xึฎ]ห๏ฟNฉRฅ0 ƒฐฐ06lุภ;๏ผCPPซWฏฆo฿พœ;wŽฯ?ชฯ-[ถฐ`มบt้‚ปป;'NคI“&œ>}///๊ีซ‡››?๔5jิฐฺv๎น”-[ึ,ึ๎๖uัฅK (ภ AƒHHH N:=z”‘ฯ?œงžz € dz\๎Vห–-้ัฃWฎ\มออไไdๆอ›G๏ฝน~z–๚่ิฉ๓็ฯง[ทn๘๚๚rแยถlูยกC‡x๑ล้฿ฟ?ฑฑฑœ={ึ<ๆท_จ๒๑วใ์์ฬ๛_qvvฮpYy'$$๐๊ซฏ๒ื_ัฃG .ฬ์ูณูฐaƒU_7n 44”ฤฤD{๏= .ฬนs็Xถl—/_ฦำำ32หฺ้ตkผ๒ห?~œnบQฒdIๆอ›Gถmน|๙2=z๔ธใ1=~8M›6ๅwกM›6|๛ํทดm–๒ๅหSถlู;nŸQŸ-[ถคcวŽผ๕ึ[Œ3†7xƒˆˆ>๚่#บt้ฌhผ9GŽฑmNIIกvํฺTชT‰QฃFฑjี*Lrr2ร† 3u์ุ‘้ำงำฎ];บw๏ฮ‰'˜4i{๗๎5?ŸSฅ๗yqเภ๊ืฏO@@ร† รลล…ใวณu๋Vซ|ฒ๚Y๑ ฬž=›๘๘x:v์ˆฃFขqใฦ๙็Ÿ899ัฑcGbbbXปv-3fฬฐฺถTฉR+VŒฑcว๒๓ฯSฎ\9bbbx๗)Yฒ$แแแYŠแ…^`ุฐa 4ˆw฿}—jีชPนrๅžฏษษฎ^ฝšfูoฟfฦ?`.›7ož6lฐj๛ฯ?ฮฮฮFญZตŒ””s๙คI“ ภ๘๖oอeซWฏ6c๘๐แฦŸiธนน 6ผcŒ'Nœ0#Wฎ\ฦูณgอๅ;v์0ฃWฏ^ๆฒื^{อ๐๗๗7ฎ_ฟn.ณX,Fๅส•็ž{ฮ\๖w฿€QณfMรbฑ˜ห{๕๊e888—/_6 ร0._พlธปป+V4ฎ]ปfืญีจQ#อ1KLL4 .l4iาฤ\ถaร0Œ7n˜ห[ดhaุููu๊ิฑฺGHHˆQขD ซe้ฮBCCgžyฦjY‰% ภXตjUš๖€ัตkWร0 ฃOŸ>†ฝฝฝ1}๚๔4ํR๓บ“oฟึŒqใฦฅY—zœ-ZdoีดiSรฮฮฮ8~ธU|ฮฮฮVหขฃฃ ภ๘โ‹/ฬe-Zด0 ,h$''›ห๚๋/ร6l˜น์n_UซVต๊ำ0 c๔่ั`œ8qโŽวใvwฺ6๕๗q๑โEรููู˜1c†a†ฑ|๙rรฮฮฮ8y๒ค1x๐`0๗ฟeบ/OOO๓w›‘z๕๊ฅy]ฦฝ>Ÿyๆ™4ฏณิuท~d๕u?v์X0-Zd.ปvํšQฆLซ>๗๎kฦผy๓2nr?~ผ3gฮ4—ธqร 1ŒธธธL๛M}mฺดษ\๖ฯ?...FŸ>}ฬeฉฟŸฅพฆnง๖นm6sY๊็cฎ\นŒSงN™หงL™’ๆธทiำฦŒ๗{ฯ\fฑXŒz๕๊ฮฮฮๆkd๓ๆอ`ฬš5ห*ฆUซVฅYžั็ล็Ÿžฅื]V?+า;†‘๋ซM›6Vฟำิฟ^^^ฦล‹อๅ‹/6c้าฅๆฒฎ]ปfฯŽ;ŒRฅJ€๙(_พผ๑ื_1[ํฺตหŒ๏พ๛๎ฎถปW:ี.9ยญง’’’ธpแฯ>๛,y๓ๆ5Oอeๆ—_~แฦ๔์ูำ๊ใ:tภรรƒๅห—›หjีชEวŽ6l7ฦีี5ำSฟทkุฐ!E‹5Ÿฟ๔าKTฌX‘+Vp๑โEึฏ_O๓ๆอ‰็฿ๅ฿ๅย… „††r์ุ1ฮ;gี็ป๏พkuzฌZตjคคค˜ฬืฎ]K||<~๘aš‹;n?ญๆๆๆฦ[oฝe>wvvๆฅ—^โฯ?L“K๋ึญญF*Vฌˆaผ๖Vํ*Vฌศ™3gHNN6—๚;‹ๅ฿ฅF๙็ŸiNG–,Y’ะะะ4๛‡›sธบu๋ฦ„ ˜9s&mฺดIำfใฦYม๘๙็Ÿy๊ฉงx๏ฝ๗าฌK=N+Vฌภมม๎ป[ญ๏ำง†aค™XณfMJ•*e>ภรรร๊x็?แŸฑ:=7|, ๙ฯ€{{]t่ะ‡;ๆ ๅห—ฺตk๓ใ?7Gv*WฎL‰%ฒGผyูฑcG–งฏคงM›6Y>ๅ˜•ืชUซ(Zด(aaaๆ2WWWซัuภั\ฝz5Wฏ^ฝ็๘oตbล .L‹-ฬeNNNt๏+Wฎค;Uใvพพพๆˆ้~๙็ำ}og•ฏฏ/!!!ๆ๓Š+๐๊ซฏ๒๔ำOงYžพnฝ%Z๊๔”7n๐ห/ฟ0o<<==y๕ือืฟK๙๒ๅqssK3โœ็EผyXผx1‹%ร|ฒ๚Y๑ ็?!_พ|ๆ๓ิ฿MV๙๒ๅ#((ˆ?E‹1fฬNžอขE‹ฌฆsdลจQฃ๘๗฿)^ผ8/ฝ๔C† น๋้n๒ฯส๋ิฉS”*U*MปgŸ}6อ~{๗๎อดiำx๊ฉง e๒ไษY๚,สศฉSงx๎น็า\•ั๋.=Yy-ญป๙ า์หžgžyฦjY๊k>๕3๑ุฑcฤฦฦRฐ`ม4ฏ+Wฎd้uŸ‡*Uชะพ}{ *Dxx8?๔SฆE่รvงฯํฬฤฦฦRญZ5BBB9r$ 4 OŸ>๓ฯlูฒ…๏พ๛๎กฤ hŽงไ๏ฝ๗฿}๗={๖$$$OOO์์์(,{๗๎5?์๖๏฿฿ฯญRใ๏›แ(฿ํ่2ีบ—น฿M_ตฝS๑ฏฝ๖eส”aธq/^gggVฌXม็Ÿžๆw–ูจU•*UˆŠŠbาคI4oœ๙๓gุ6;dๅxบธธะฐaC.\ศ—_~ษ๙๓็ูบu+Ÿ|๒‰ูๆ^^Yํ{ยยยpqqกM›6$&&าผy๓ปฺพy๓ๆTซV… ฒfอFอgŸ}ฦ‚ าฬ5ฮศไ ฿CcวŽฅmถ,^ผ˜5kึะฝ{wFŽษ๖ํ)Vฌุ=๕yฟฒ’czมอน˜wำ็ƒ<ž‹…‚ 2kึฌtื฿>G9ฝ฿{ฎ\นุดi6l`๙๒ๅฌZตŠนs็๒๊ซฏฒfอšป>3pทว)=๗sŒ~๙gฮŸ?o5๚PฃF <<<ุบu+;wฮr,ถคยSr„๙๓็ำฆMฦŽk.ป~zš{f๔a‘z ๐ศ‘#V๛พqใ'Nœ fอšๆฒ„„ฺตk‡ฏฏ/•+WfิจQ4jิศผ2๐NŽ;–fูัฃGอซS๗๏ไไdต฿๛‘zช๗๗฿OSœd‡ฅK—’˜˜ศ’%Kฌื๛)ณฌx๖ูg5j/ฟ2ตkืfบuwu๖ญJ•*ลŽ;HJJฒšBpซ%J๐ห/ฟoตŸิ+a๏ๆt๒ญ๓Ÿ๐๗฿ณn::„aๆivxpฏ‹ŒZฎ\นhุฐ!3gฮคN:ๆ…Lwร›.]บะฅK๙็^|๑EFŒažถส%U‰%8x๐ †aXํ๛๘๑ใ้ถ๗๗๗ว฿฿Ÿฐm6ชTฉBDDร‡ฯp™}Fํทฯผ%Tช๛}.uิํ๒ๅหๆ้iศฺˆ๊ฝฐX,๙็Ÿๆ('<ฬฯฤRฅJ๑ห/ฟPฅJ•๛๚ฯ”ฝฝ=ฏฝ๖ฏฝ๖ใฦใ“O>กlุฐแฎ฿Sทง[=่ใ”ั๋แ๙๓@ฺBื0 RRRฌฆ5๋>j—มมม!อฟ๘โ‹4oส>>ฬŸ?Ÿญ[ท2~๘{ๅฟ]ญZตx๚้งy็w่ท/|๛ํท(P€ำงO?}สีี•UซVัฆM*Vฌศส•+Yพ|9}๔‘y ฝFt์ุ‘‘#GEญZตprrโุฑcฬ›7 &ะดiำL๗3lุ06mฺDฝz๕(Qข๓_~๙%ลŠฃjีชfปฌ~V”-[–J•*ัฏ_?.^ผH๙™3gฮ]4fE๊๛ต{๗๎„††โเเ@xx8oผ๑eห–eุฐaœ:uŠJ•*q๘q&Mš„ทท7๏ผ๓N–๗QชT)๒ๆอKDD๎๎๎ไษ“‡Š+>ผ9โ6นv^ไ!ปt้’ัฎ];ใฉงž2ŒะะPใ๐แรF‰%Œ6mฺXต๚๋ฏgžyฦpppHs‹I“&eส”1œœœŒB… ;w6.]บd†aฤลล%J”0^|๑E#))ษชฯ^ฝz๖๖๖ฦoฟ–aŒฉทะ=zด1v์Xฃx๑โ†‹‹‹QญZ5#:::M๛?๘รhบตQธpaรษษษ(ZดจQฟ~}c๙f›ิ[z์ฺตหj๔n้a†ฑdษฃrๅสFฎ\น ใฅ—^2~๑Gs}5Œฒeหฆ‰ๅ๖ค๖๛ํb2Š'ฝ[่,Yฒฤ0\]] ใณฯ>3ogt๛-[๊ีซ—๖€ึทSJตx๑bรััั๘ฯc+ซทH1Œ›ทy๊฿ฟฟQฒdIรษษษ(\ธฐัดiSใ?0ฤววฝz๕2Š)b899ฯ=๗œ1z๔hซ[Se_jNทฟ. ร0ึฎ]k†qๆฬ™tใปŸืEช?ุ(Zดจaooว[+ฅพnำ{~ŸŒ๒ฝUVnง”˜˜h๔ํื 4}ŒŸูŒํท›m~๛mฃTฉR†ซซซ‘?~ใ•W^1~๙ๅ—LMf9†aœ?œsvv6ณ| œŒG5jิ0jิจaตl๗๎FลŠ gggใ้งŸ6ฦ—แํ”า๋3ฝืมญŸฉฺดicไษ“ว๘ใ?ŒZตjนs็6 *d <ุ๊ถvฉฆNj”/_ศ•+—แ๎๎n๘๛๛๏ฟพsว˜ึญ[g4hะภ(Rคˆแ์์l)Rฤhัข…q๔่ั4ว#ซŸ๑‡QณfMรลลล(Tจ๑ัG™๏แฌN้ึc‘ 0l>ONN6{๏=ฃ@†Ul/^4z๕๊e”.]ฺpqq1žz๊)#<<๘๓ฯ?ณญ/^l๘๚๚ŽŽŽึJv†‘ ็ูDDDrˆ๑ใวำซW/ฮž=kuซ4IK…งˆˆH]ปvอ๊—๋ืฏSฎ\9RRRฬ‹bD$cšใ)""’E7ๆ้งŸ&((ˆุุXfฮœษแร‡3ผีHvนqใFบUสำำำๆท]Sแ)""’EกกกL›6Yณf‘’’‚ฏฏ/sๆฬฑบ๕•ศฃ`ถmผ๒ส+™ถ๙๎ป๏hถญm๚tช]DDD$‡นt้ปw๏ฮดMูฒe๑๖๖ถQD7ฉ๐›ะ ไEDDDฤ&TxŠˆไgฮœมีีีผั{NฐqใF์์์ุธqใ}๗๕๒ห/ใ็็wA=*Uชd๕ฅ" ž""ท˜>}:vvvุููฑeห–4๋ ร x๑โุููQฟ~}ซuฉฅ>๒ไษƒฏฏ/ร‡็๊ีซ้๎oุููฑs็ฮ๛Ž}ุฐaTฌX‘*Uชw_’5Ÿ|๒ ‹-Jณ|ถm 2ไก} แ|ภไษ“๙๛๏ฟJ"‹ O‘tธบบ2{๖์4ห๕Wฮž=‹‹‹Kบฝ๚๋ฬ˜1ƒ3f0v์Xส•+วภiำฆMบํ—/_Nม‚ฉPกย}ล๛ฟ๏ฟžN:W?š๊ีซsํฺ5ชWฏžกค+ณยs่ะกญ๐lะ |๙ๅ—ฅ‘‡EทSIGบu™7o'Nฤั๑>*gฯžM๙๒ๅ๙๗฿ำฎt้าผ๕ึ[ๆ๓N:qใฦ ,Xภ๕๋ือ๏๕Nตbล ๊ิฉc~ฯ๗ฝš9s&ŽŽŽ๕ปส๏VBBB†฿ŸU๖๖๖iŽู“์๊ีซไฮ{{{š6mส?ภะกC๏๛๕#b+๑IG‹-ธpแkืฎ5—ธqƒ๙๓็ำฒeหป๊ซpแยุููYฐ—/_fถmิซWฯ\6gฮส—/ปป;๘๛๛3aย„;๎cัขETฌX777ซๅฉ๓๗ํG5ศ;7ฯ>๛,๓็ฯnŽเVฌX‘\นr๑๓ฯ๓ห/ฟค้{๏ฝิฉSxํตืุพ}ปU›ิ) ฟ๚+]บtก`ม‚+Vฬ\ฟrๅJชUซFžใำO?ๅๅ—_พใลBIII์ฺต‹_|1๕—.]ข~๚TฌX‘QฃFแโโBxx8s็ฮ%<<œบu๋๒้งŸ’@ำฆM‰7ท=pเีชU#::š๗฿Ÿrโฤ ^~๙ev์ุ‘f_]บtแเมƒ 4ˆ?€3fPฏ^=๘์ณฯ8p คjีชVลXVธqƒะะPถo฿ฮ{๏ฝวไษ“y๗w๙๓ฯ?ณtZ๛าฅKิญ[—๒ๅห3jิ(Š+F็ฮ๙๖oอ6‹…ฐฐ0ฦŒรoผม_|Aร† ๙๓ฯญn?cฦ \\\จVญš9ฝขcวŽ4n˜-Z๐๙็Ÿ›๋ (ภˆ#hบ5ฯ=๗ใฦฃgฯžฌ[ทŽ๊ีซงษแย… ิฉS‡   ฦouC๐๒ๅหไจ‹ษไ `ˆˆˆ้ป๏พ3cืฎ]ฦคI“ wwwใ๊ีซ†aFณfอŒW^yล0 ร(Qข„Qฏ^=ซmt 64ฎ_ฟžf_ญZต2jิจa>๏ัฃ‡แแแa$''฿Uฬว7ใ‹/พHณฎF`ฬž=\v๘๐a0์ํํํท›หWฏ^mฦw฿}g.kุฐกแ์์l๑วๆฒ˜˜รจ^ฝบน,๕ธUญZี*๘๘x#oผF‡ฌโ๚๛๏ฟ OOฯ4หoทaร06lุ`†a์ปืŒy๓ๆe~Pา‘z,ฦŽk.KLL4‚‚‚Œ‚ 7n0 ร0fฬ˜aุ›7oถฺ>""ยŒญ[ทšห๒ไษcดiำ&อพFmฦ‰'ฌ–Ÿ รหห‹๗ฟ,[ถฬผ๘gืฎ]๏ณ*<ปt้ยO?D:u(Zด(ตjีขy๓ๆิฎ];K๑|]ฑbลา\|โ้้I๑โลำ,ƒ›งฃแๆ•๒Wฏ^ๅ๙็ŸOำ็ /ผ€ลbแฬ™3”-[ึ\^ฒdIซvวŽ0‹ถyxxd–R%K–คw๏Œ7ŽYณfQญZ5ยยยx๋ญทฬ๘3SคH‘4<•.]€“'ORฉR%Ž;ฦกC‡ฬSใท๛็Ÿ๎*ๆ[;v ร0x๎น็า]๏ไไd๕ผhัข8;;gุŸaบฐH+*>>๘๚๚šํ ,HTTซWฏfๅส•ฌ\น’๏พ๛Žึญ[๓๗฿gุฟ——๐ใํnฬส๒Œ ุฌศ•+—ีs‹ลœYธpแ4ํoŸ๗šcวŽฅmถ,^ผ˜5kึะฝ{wFŽษ๖ํญ.hบW‹ฦ—๎๚ ๖ปํฮฮŽ•+Wฆ{oฟ8์๖ใyปห—/๓ิSOs<"ถฆยSD$5ขcวŽl฿พนs็Sษษษ\นrล\ถ|๙r๊ึญ›ฆญณณ3oผ๑oผ๑‹….]บ0eสศณฯ>›nO?4นrๅโฤ‰๗_F (@๎น9rไHšu‡ฦŽEXฉRฅ€›E๕ญ#ม๗ห฿฿ ภถmจRฅ  ><ำํbbbาๆ้่ัฃภอ สRcŽŽŽๆตื^ปใhbF๋3Z^ชT) ร dษ’ๆH๋ฝ:w๎7nเ…^ธฏ~DlIs?<ณgฯฆjีชw•ฟฟ?๖๖๖™ฃTษษษL™2ล|~ใฦ ฆL™Bฬซฤ›7oฮนs็๘๚๋ฏำlํฺ5ฬ็y๒ไI๗j๚ิย๖๖u7ฦมมกC‡ฆY6 #อk 3ฉsR+WฎœๅmDฒ›FฬO?ฤ๊ีซ nา่—_~aธq)R„’%KRฑbEณˆํ฿ฟ?แแแ899๑ฦoPชT)†Nฟ~8y๒$ 6ฤ'NฐpแB}๗]๛฿f้Xฌ]ป–งŸ~šrๅสe๙๘‰dป์ป ^Dไัs๋ํ”2“•)988ลŠ3}๗]ใ๙๓fปฆM›u๋ึMำ็๙๓Zตj 4œงŸ~ฺุ่ฑฃ๑ื_1๎๓็ฯŽŽŽฦŒ3ฌ–ืจQร([ถl–โOอกkืฎVห๖์ูc„††nnnF๎นW^yลุถm›U›;ท 6กกก†งงงแ๊๊j”*Uสhถญ™i^ท฿N้ฯ?4~๛mฃTฉR†ซซซ‘?~ใ•W^1~๙ๅ—L๛1Œ;‘‘‘FHHˆแ๊๊j”(Qย˜4iRšถ7n0>๛์3ฃlูฒ†‹‹‹‘/_>ฃ|๙๒ฦะกCุุXณแร‡๊ีซนrๅ2ซ[+}๑วFัขE {{๛4ทV๚๙็ŸชUซy๒ไ1๒ไษc”)Sฦฺ่ตซqไศ‘4๑ฆ'%%ล๐๖๖6 pวผE%v†qณศEDไฎ$''ใๅๅลศ‘#้าฅหํ๛wแ่ัฃlผ๙๖+žE‹ัฒeK๘ใผฝฝณ;‘,Sแ)"bC๓_~๙%;v|เร้ำง)]บ4๋ึญฃJ•*ดoyด„„„PญZต,Mwy”จ๐›ะUํ""""b*ฆฉยS111wgy49s†bลŠeฺF…ง<28qโ๙๓็ฯๆhl+))‰5kึPซV-๓k๛žสษหIอ”ปrฯ™นวลลQผxq๓๏xfTxส##๕๔บปป๛ฎ้วARRนs็ฦรร#G~(eFน?yน?ฉyƒrW๎9;๗ฌL“ำลE""""b*>ฬห/ฟภ>(}๛๖ลฯฯ___&L˜`ำ}‹ˆˆศใK…g&ึฎ]‹ƒƒร]o—’’๒ขฑK—.eบ>**Šํทณo฿>"##3f qqqYฺVDDDžl*<ฟฏฟ?ะlใใใร๕๋ืธ~:III\ปv www\\\ฆ]ปv์ุฑ#Kว,11‘ธธ8ซ‡ˆˆˆไ\*<}๛๖1y๒dถnJtt4=z๔`ธqดiำwwwซถDDDI๛๖ํอuปw๏f๚๔้lุฐแร‡ำคIvํฺลย… ฺ้ต+5jิ`วŽDEEQฅJพ๙ๆz๖์ษ AƒˆŽŽฦ0ŒLใอจmF๛์ฝ;อš5#::š-[ถ๐ิSOpๆฬ „ฏฏ/ห–-cุฐaฬš5+ำ}QฃF Š)‚}๔‘Yx9r„ฐฐ0† Bpp0SฆL1 ๋๔Œ9OOO๓Qผx๑L๗-"""7ว์เQฐqใFยรร๑๐๐เฺตkฌYณ†_~๙…SงNYตํิฉ“๙spp0ำฆM3ŸWซVย… 7Oำฏ\น’!C†pแย’““9}๚4อš5ใ๙๓\ฝz•š5k7Oa‡……ะขE ๖๎›aผตอhŸฟ๖๓ๆอ Wฎ\์น“ส•+ำณgO"##อ๏ไ๘๑ใœ>}š˜˜._พL5จSง^^^8::าจQ#5jฤฉSง่ะก๏‰Oทฏ~๚ัปwo๓y\\œŠO‘L#ž้ˆŠŠโเมƒ”,Y’ชUซฒw๏^ณะหL๎นอŸ ร`ๅส•DEEล™3gpttค{๗๎ 0€๛๗๓ูgŸ‘˜˜€นํญ?ง'ฃถํ3=L:•-[ถะคI~๚้'nธaฎwppภbฑ˜ฯSใ\ธp!!!!ธธธPจP!9pเ€ู๎ย… Œ?žฐฐ0๒ไษcผ้qqqมรรร๊!"""9— OเีW_eฮœ9ๆร๚๋/Nž<ษ–-[(WฎK–,นซ>kึฌษไษ“อ็ัััภอQ=ooo, 3fฬ0ืฒlู2ๆฮ›i฿ตอhŸUชTแ๛๏ฟnฮฯผvํฎฎฎผ๖l฿พัฃGณ~zส”)รุฑc(Qข„นฮ;9<ลŠcำฆMX,โใใูณgฅJ• eห–„„„วส•+Yธp!ตkืพซใ&"""9— OภฯฯnบQนre™8qb†m3›ใyซAƒC@@พพพๆ)๙RงN*VฌHษ’%อ๖ใวgศ!qŽgFm3ฺ็„ ๘้งŸ jีช\ธpมชฟ   """ุทoAAATญZ777|}}๙ๆ›oฬSเอš5รำำ*UชDฏ^ฝ(Zด(pณ๐<|๘0ƒ ขH‘"™ๆ """O;ใNUŽˆฤลลแ้้I๙‹ฑ8ปew86ๅloะฯ๏ #wใ†%๓ฉ9r๒rR๓ๅฎณ/๗=_}h}งŽฝใด9xŠˆˆˆˆMจ๐|„}๗wY=2› """๒(ำํ”aํฺตฃ]ปvู†ˆˆˆศกOฑ ž""""b*๙ไ ฅํใโโx๕ีWy๑ล)Wฎ[ถl ฌ^ฝš   fอšล๗?๊ิฉƒฟฟ?กกกœ?€ถmฒjี*เfฑš(๋๕๋ื๙๛๏ฉ\น2ฃG`ศ!DDD˜m .lœ€ลbแส•+*TธYฐ๚๙๙ัฝ{w}1bกกกDEE๑ๆ›o2x๐`^u๖๏฿Oƒ ่฿ฟใ;rไฝz๕ยฯฯ={๖๐๕ื_๓ษ'ŸdบM๚๕quuฅH‘"1n8 *ฤฆcวŽิจQƒูณg“˜˜˜a_‰‰‰ฤลลY=DDD$็Rแ๙mธ‘๐๐p<<<ธvํkึฌกM›6iฺv๊ิ‰N:ฬดiำ0 ƒ๗฿๊ืฏฯาืถmx๋ญทx๋ญทุบukฆฑ๓ฯ๘๙๙แํํอ๏ฟฮ„ ([ถ์sฺฑcžžžฤฤฤI—.]HNNnษญ[ทf๓ๆอLž<™1cฦœa_#GŽฤำำำ|/^Ž๛‘ว— OŠŠŠโเมƒ”,Y’ชUซฒw๏^ยยย2fึฌYธqƒจจ(ขขข๎zŸX,ซัวื_1cฦ0kึ,ZดhมŠ+ฬv™m7{๖ljืฎฝฝ=ฅK—ฦรรƒ˜˜sนs็๘๘ใiึฌ~~~L:5รุ๚๕๋Gllฌ๙8sๆฬ]็'"""žัซฏพสœ9sฬSศ!!!๕ื_œ{๖lชVญ @‰%ฬ‚๕ึ}yxxะฃGขฃฃ้ีซณfอโ๙็Ÿgๆฬ™™nWฌX16n@LL 111.\˜ุุXยยย ลออmถ๑ร?’an...xxxX=DDD$็Rแ๙๙๙๙ัญ[7*WฎL`` 'NฬฐmFs<[ถlษ๚๕๋ `ำฆMๆล<\ปvอผธhศ!ฌXฑ‚€€,Xภ๐แรx็wXฐ`ๅส•ใ฿Mw฿ีซWgึฌYl฿พ7nฬัฃG เ๗฿7vํฺ•'N˜1M˜0gggz๗๎อ๏ฟNฏ^ฝศ—/฿<ษq์ ร0ฒ;ธ9บ๋้้Iว™ฟแ˜3ปรฑ)Rxีึ[J‘ยj๋qฃŸผŸิผAนg5๗I^ฐQTถ‘””ฤŠ+จ[ท.NNNูฮ—๚๗;66๖Žg/5โ)""""6กยSDDDDlB…งˆˆˆˆุ„ Oฑ ž""""b*d๛๖ํc๒ไษlบ•่่hz๔่มธqใhำฆ ๎๎๎Vm#""ˆˆˆ 22’๖ํ+W./^ฬž={Xบt)}๚๔`ฤˆ„††ล›oพษเมƒy๕ืูฟ? 4 ไห—O>๙„N:1v์XชVญJลŠˆ'""‚๒ๅห3t่P4hภ‘#G๎˜ำ_|Aูฒe๑๖๖ฆx๑โTจP€Yณf1t่P–.]Šฏฏ/ƒๆ์ูณ๖3rไH<==อG๑โล๏‹ˆˆศcC…็CถqใFยรร๑๐๐เฺตkฌYณ†6mฺคiฉS':u๊@pp0ำฆMภ0 }ฉ_ฟ>Hw_ถmใญทเญทb๋ึญ4jิWWWพ๙ๆ>๘cณ}‘"EXฐ` ,`ๅส•4jิGGวL๓IJJโ›oพแะกCœ;wŽs็ฮฑz๕js}ฅJ•๘๖o‰ŒŒไส•+๘๘๘ฐs็ฮt๛๊ืฏฑฑฑๆใฬ™3™๎[DDDo*o<๒ไษCXXใว็ย… ๆ:,‹๙<11ัŒ฿ษษ‰"EŠเ์์L๚๕ญN฿ธqƒนs็าธqcถnสิฉS H7.<<<ฌ"""’sฉ๐|ศ^}๕Uๆฬ™cฮ_ แฏฟโไษ“lูฒ…rๅสฑdษ’L๛ˆ‹‹ฃ`ม‚8880|ณxtww'>>lWนreๆฮ ภ์ูณฉZต*p๓”vhh(  {๗๎f๛ฺตkณpแBVฎ\I\\!!!ดlู€B… q๖์Yธ|๙2›7onŽ’FGG‡alุฐาฅK0v์Xส”)ร† 3f ทo็ํท฿ฦีี๕AJyฬฉ๐|ศ่ึญ•+W&00‰'fุ6ฃ9ž-[ถd๚๕ฐiำ& *@@@ืฎ]3/.2d+Vฌ € 0|๘p8ภฯ?ฬ Aƒhบ5—.]bูฒeV๛-Rคƒ โะกCfแ้์์Lฯž= $<<œภภ@Š-J๏ฝฉXฑ"xxxะฌY3‚‚‚ุทo=ะใ("""?;ร0Œ์BnŽ์zzz2y]4น๓fw8ถeI!฿๛ธX8์๏๏6[ๅไๅคๆ ส= นทซ๐ด ƒฒคค$VฌXAบuqrrส๎pธิฟ฿ฑฑฑwœ6งOฑ ž""""b*|8[๖}ปธธ8๊ีซGPPAAAlุฐ!ปC‘วฤ“๕Eฑ฿ฺตkqpศฺw๕ื_=z”่่่4๋RRRฒOvน/]บDพ|๙2\ํท฿ฤ๒ๅห‰ŽŽๆํท฿f๗๎$$$เ์์Œ““ำƒ[DDDr ?โ๙๕ื_ใ๏๏O`` ƒ&))‰O>๙„di๛7xƒcวŽฤ๛๑๑๑ก_ฟ~๑oฟ1|๘p`้าฅlธ‘ZตjQทn]|||ˆˆˆ`ฤˆPงN’““3฿’%K "00๖ํ›หฟ๛๎;ส—/Oนrๅ8sๆ ‹-ขbลŠั Aฎ\น@ถm้าฅ *T`๘๑Œ?ž2eสHฯž=ำ์366–I“&ศนsอ>VญZภษ“'ญF‡ใใใ›ฃŸ=z”2eสะฟN:•ฅc›˜˜H\\œีCDDDrฎ=โนo฿>&Ožฬึญ[๑๐๐เโล‹Œ7Ž6mฺเ๎๎nี6""€N:IDDำฆMc๙„‡‡ณ}๛vณญQQQ์น“%K–ฐ{๗n.^ผHHHฏผ๒Šน๏C‡‘œœฬณฯ>หW_}ลพ}๛hธ1๋ึญ#444Mผ็ฯŸงw๏lผooo.^ผhฎsssc๗๎Œ;ึ,dkิจAร† 5j฿|๓ =z๔เ๒ๅห์น;;; (ภ้ำงษ•+ฑฑฑfŸฉynฺด‰ๆอ›ณx๑b|||2=ฆํทง~๚-Z”๋ืฏณy๓fส•+วž={˜9s&5ย›N:Qทn G\GŽษะกC3Ÿˆˆˆไ9zฤsใฦ„‡‡ใแแภตkืXณf mฺดIำถSงNt๊ิ €เเ`ฆM›–aฟอš5`ถm4mฺผฝฝy๑ล9pเ•+W&_พ|(POOO๊ืฏ€ŸŸงOŸNท฿;vPณfMs1ๆบฐฐ0เfw๒ไINŸ>Mอš5๑๗๗gส”)|๘‹N€•+WRฃF ฮ;วขE‹่ะกƒนฮำำ“ฎ]ปฒgฯ๚๕๋G=ฬย8=๚๕#66ึ|คŽไŠˆˆHฮ”ฃ ฯEEEq๐เAJ–,IีชUูปwฏYะนs฿ฑณณณ๙ณฝฝฝ๙ž”””ปgjมx๋๖ปwgภ€์฿ฟŸฯ>๛Œฤฤฤtc\พ|9;wๆื_ฅvํฺผ๕ึ[๔๋ืฯ>๛Œท฿~นLๅเเ€ลbฐ๊w๚๔้f1YญZ5Nœ8aๆ๚cวŽ๑ม๐๖oSงNFŽ™iNVษนrtแ๙๊ซฏ2gฮs๎`HH๕'Oždห–-”+WŽ%K–s•+Wfแย…$%%๑๗฿ณw๏^ส–-{ฯUชT‰_~๙…ฟ๚ ภ๊T{zR็XZ,fฬ˜‘n‹ลยูณgฉYณ&cวŽๅ่ัฃ*Tˆpเภยรร=z4~~~ฌYณ€%J`uŒŠ+ฦฦ›ำ ๒ๅห‡'Ožไ•W^แอ7฿ไน็žc๏ฝLž<??ฟ{>"""’ณไ่9ž~~~t๋ึส•+ใเเ@ฃF2dHบm3šใ™™—^z‰z๕๊Qฎ\9์ํํ™8q"nnn๗oม‚๙๓ฯอQษŠ+2u๊ิ 8:u๊เๅๅE•*Uธ|๙rš6)))ดlู’๘๘x ร`ุฐaV๋ํํํฉ[ท.u๋ึๅ์ูณœ?€wy‡ 0o๙ไ ฅํ฿xใ Ž;FPP๛๗๏ววว‡~๚ฤoฟฦ๐แร๑๓๓# €ฅK—7G๘jีชEบu๑๑๑!""‚#F@:uHNNฮpK–,!((ˆภภ@ฺทoo.๎ป๏(_พ<ๅส•ใฬ™3,ZดˆŠ+Dƒ ธrๅ mถฅK—.TจP๑ใว3~xส”)C`` ={๖ฬp฿‡ฆFRฑbEุฝ{7UซVฅTฉRฌYณ€ไไdz๔่A…  2s‹‹ฃeห–Dddคี>VญZE5ˆe๙๒ๅTชT‰   :u๊„ลb`เภ<๓ิชU‹ .ค๋x๏ฝ๗([ถฌY@.\ุ\๛Hm\\†aทท7ฃGฆJ•*๐ร\ฟ~=รใrซฤฤDโโโฌ"""’s9fตแพ}๛˜แแแl฿พl๋ใใCTT;w๎dษ’%์ฝ›‹/ย+ฏผb๎๛ะกC$''๓์ณฯ๒ีW_ฑo฿>7nฬบu๋ M๏๙๓็้ป7›7oฦ›‹/šุ๋ฝ{7cวŽ5 ู5jะฐaCFล7฿|C=ธ|๙2;w๎ฤฮฮŽ p๚๔irๅสElll†วซUซVŒ5ŠW^y…ุุXœœœ8u๊ฟ๚+QQQt๏Zตj1mฺ4J–,ษ„ ˆ‹‹#$$„ฺตk3lุ0J—.อ์ูณINNๆ๊ีซ์ูณธYtŽ1‚ฅK—’””ฤ๘๑ใูธq#ฎฎฎtํฺ• ๐๔ำOณvํZ~w๙็ส”)cฦ—˜˜ศ๙๓™2e †aะกCFซซkฆฏƒI“&Š““4iา€O>๙„0u๊T>๘cxใ :v์ศ๓ฯ?Ÿa_#GŽd่ะก™๎ODDDrŽ,žฉs =<<ธvํkึฌแ—_~แิฉSVm;u๊dฬดiำ2์ทYณflถฆM›โโโ‚ทท7/พ๘" rๅสไห—OOO๊ืฏ€ŸŸงOŸNท฿;vPณfMsD.ๆบฐฐ0ส•+ว7฿|ภ้ำงiึฌ็ฯŸ็๊ีซิฌYำl฿ดiS์์์(_พcโฤ‰๘๙๙1gฮณ8ฝ]ฟ~่ปทีq+^ผx–c‘วห=ฯ๑ŒŠŠโเมƒ”,Y’ชUซฒw๏^ณ ปนs็พcggg๓g{{{๓นฝฝ=อปtqqIณ}๗๎0`๛๗๏็ณฯ>3O฿ใ๒ๅห้น3ฟ๚+ตkื~ ๛6 ƒoพ๙†จจ(ขขข8}๚4%J”ศฐbลŠ‘’’ยกC‡ฬํ4h`nไศ}ณ`พ็ฉSงRถlYš5kฦ๐แร9w๎œี>nm›z,๗ฟqไศฐณณฃQฃF์ุฑรlgฑXXฑb-Zด`ึฌYŒ3†ื_=ำcแแแa๕‘œ+ห…็ซฏพสœ9sฬyx!!!๕ื_œฮŸ?oฮ‹]ทnฅK—`ๆฬ™<๓ฬš5‹ฝ{M=TLŠˆˆˆ)หงฺ่ึญ•+WฦมมF1dศtf4ว33/ฝ๔๕๊ีฃ\นrุ3qโDฒžษm ,ศ็ŸnŽJVฌX‘ฉSงfุ~เภิฉS///ชTฉยๅห—ำดIIIกeห–ฤววcร† หฐฟ~๘:ะณgOr็ฮ้mŒ:v์ศŸI`` ‹…็Ÿž 0pเ@:v์ˆฟฟ?ŽŽŽVวฐdษ’ฬž=›๐๐p–/_ฮไษ“iะ III899๑๕ื_๓าK/๑ฺkฏแ็็‡OบทผสŸ??ฝz๕ขWฏ^V1:”5jPฌX1sžฆฃฃ#'Nคvํฺุ๓sฯ™ฏถo฿Ž——W†yŠˆˆศ“อฮ0 #ปƒ›ฃฮžžžl๊E^ปฬo๋”ำค8บฒ๛?_S~n’ณvW€œBน?~น{tw HJJbลŠิญ[ืผ๐๒Iก•{Nฬ=๕๏wll์ฯt๊›‹DDDDฤ&ฒ|ชQึจQ#Nœ8aตlัขE๘๘๘<๔}1‚y๓ๆY-0`M›6}่๛yœไˆยsแย…ูถ๏๛ำฟlฟˆˆˆศใBงฺEDDDฤ&TxŠˆˆˆˆMจ๐›Pแ)""""6กยSDDDDl"G\ี.9Kมˆ#O7 %%%มŠ๚\Žผนpf”๛“™ปˆ<™4โ)""""6กยSDDDDlBงฺๅ‘c™ฺ‹‹%ปรฐ)‹3<ำหคฺXŒ'๋{๊•๛“—๛“š7(๗'=wัˆงˆˆˆˆุˆ Oฑ ž""""b*>ž•+Wfy[yrๅธย3&&†*UชD@@}๚๔a1z๔hhิจพพพt๊ิ้Ž๐รฬ›7>}๚ะตkWฆOŸNำฆMฉQฃญZตโ๘๑ใTซV€€š7oNBB/ฟ2}๚๔ก\นrTจPศศH^{ํ5žyๆ–/_žแโโโhูฒ% ,๊xใ ž{๎9FŒaถฏ_ฟ>ๅห—ว฿฿Ÿ p๒ไI‚‚‚hผ9พพพiŽษแร‡ำ์w๛๖ํดm–เเ`ณJ•*™๋ถmหชUซ€›ลlBBษษษ\ปvอ5๎ึญกกก,\ธ0Kฃ ‰‰‰ฤลลY=DDD$็สq…็?Hอš5‰ŠŠb๗๎ >ขขข่ท/“'Oฆdษ’่่h"""ฬ๗‡~`๗๎lบ•b`๐เม9r$อ1)Qข๑๑๑DDDPพ|y†Jƒ 8rไศ๑_|Aูฒe๑๖๖ฆx๑โTจP€Yณf1t่P–.]Šฏฏ/ƒๆ์ูณ๖3rไH<==อG๑โล๏ธoy|9fwZ… hถ-๖๖๖4kึŒนs[ญ฿ถm}๔ 4ฐZeœู้๙ฺตkใ๎๎nnำธqcz๋->๘เณ]๚๕๐๗๗วฮฮWWW8}๚t†}ฏ_ฟž+Vเ่่ˆ‡‡UชTมหห €’%Kรsฯ=ว็Ÿฮ’%K€›ฃ”7/ผ๐eห–M๗˜๘๚๚PคHBBBXฐ`YŒIRR฿|๓ ‡โฉงžขQฃFฌ^ฝšะะP*UชDฅJ•ˆ‹‹c่ะก๘๘๘ฐm6^z้ฅ4}๕๋ืฝ{›ฯใโโT|Šˆˆไ`9nฤณz๕๊lฺด‰‚ าคIึญ[—ฆ}ํใ๖b6#ฮฮฮุ[|/sC]\\ฬŸS๛ุฐa;w๎d็ฮDGGSฒdIำฤ˜ั1™7oy๒ไ!,,Œ๑ใวsแยs,‹๙<ต฿จจ(œœœ(Rคฮฮฮิฏ_Ÿ;v˜ํnธมนsiธ1[ทne๊ิฉd˜“‡‡‡ีCDDDrฎWxž:u ooo:w๎Lxx8—/_&>>\_นreๆฮ ภฒeหธz๕๊}ํ/((ˆฅK—7/BชZต๊}๕WณfM"""HNNถŠvqqqไฯŸv๎ษกC‡าmw๛1ูฟ?psไvแย…ฌ\น’ธธ8BBBhูฒ%… โ์ูณ$$$p๙๒e๓ยช"EŠM\\†aฐaรs:ภุฑc)Sฆ 6l`ฬ˜1l฿พท฿~WWื๛:&"""’3ไธยsใฦPฎ\96oL›6m €ัฃGำตkWŽ?NูฒeYพ|9… 2ทMoŽ็Lœ8‘QฃFภŸIฯž=๏+r๔่QฉPกGอฐmhh(.\ lูฒ|๙็ฆ๎๖c๒ึ[oYญ/Rคƒ โะกCfแ้์์Lฯž= $<<์ปhัข๔๎›Š+โ๏๏‡‡อš5nฟ}๛๖au,EDDD์ŒิซQDฒY\\žžž๓Iuผ\,w Iฒsfี3ฉ็DœŒูŽM)๗'/๗'5oP๎Oz๎u๋ึลษษ)ปรyเR~วฦฦqฺ\Ž๑‘GSŽปชqฑz๕jซ+เแๆœหO?4›"yธTxf“ะะP๓D""""Oj›Pแ)""""6กยSDDDDlB…งˆˆˆˆุ„ Oฑ ]ี.๛w`๏ๅ•aุ”}RฌX}ทUุ็ภ› gFน?yน?ฉyƒrาsxŠˆˆˆˆจ๐›ะฉvyไXV๕ว’๛ษziZp๛Wฑ,๛/Rฒ;›R๎™็n฿h’ฃyx4โ)""""6กยSDDDDlB…งˆˆˆˆุ„ Oฑ ž""""b***Šํทณo฿>"##3f qqqYฺVDDDžl*<ข˜˜ชTฉBPP๔้ำ‡๛๗ฤ่ัฃIHH QฃF๘๚๚าฉSง,๕A…  ]ปvX,.\Hdd$5ขZตj|๗w๘๙๙แ็็วิฉS8y๒$•*UJำgrr2 , VญZt๋ึ ธYศ~๘แ‡fฎ_ฟภ๕๋ืIJJโฺตkธปปใโโ@pp0ํฺตcวŽ๗~ะDDD$วRแ๙๘ใิฌY“จจ(v๏อ๐แร๑๗๗'**Šพ}๛2y๒dJ–,ษมƒฉSง็ฯŸ7ท 2n฿พ=‘‘‘4oœ]ปvฑo฿>rๅสลาฅKiิจมมม,\ธอ›7s๖์YFŒม–-[๘ํท฿7n'OžL฿™3g4hพพพ,[ถŒaร†1kึฌLs ขF)R>๚่#ณ๐}:๛๗๏งG$&&SlL:•-[ถะคI~๚้'nธaฎwppภbฑ˜ฯS๗ณpแBBBBpqqกPกBrเภณ… ?~}ุฟ?AAAŒ=š„„5j„ฏฏ/:uสRŸ}๛๖ฅL™22z๔h.\Hdd$5ขZตj*Tˆฮ;ใ๏๏ฯ;๏ผร…  ขWฏ^X,บu๋†ŸŸๅห—g๛๖ํภอโ๕ร?4๗ใใใร๕๋ื3Œใ๚๕๋|๗Tฎ\™ัฃG0dศ"""ฬ6ทŽเ&$$`ฑXธrๅ … nฌ~~~t๏ƒf๑จŠˆˆศ“ฤ1ปx\๘ใิฌY“กC‡’””ฤ๑ใว9w๎œY์5Š’%KฒpแB/^ฬ”)Sฬmƒ‚‚ˆŠŠ }๛๖t๊ิ‰’%K2|๘ใ์ํํ‰ลำำ“เเ`"""(Sฆ ๓ 6ไซฏพ`ๅส•f_?๔gฯže๛๏4kึŒร‡g9ง#GŽมาฅKฉWฏ_5eห–อt›๚๕๋3gฮŠ)ยีซWYผx1pณ@>pเ๓ๆอฃcวŽุำฑcGš4i‚‹‹Kบ}%&&’˜˜h>‹‹หr์"""๒๘ัˆgUจP3f0t่PŽ;Fฎ\นฌึoถอœ?ู Ar็ฮmฎK-ฆM›Fpp0žžžธนนัพ}{–,Y‚››[บ๛uww'444uถmฃeห–ุููแ๏๏O๎น9|–๒๙๙็Ÿ๑๓๓ร›฿ &ฑุ่ฑcžžžฤฤฤI—.]HNN Wฎ\ดnšอ›73y๒dฦŒCppp†}9OOO๓Qผx๑,ล."""'žYTฝzu6mฺDม‚iาค ๋ึญKำฦฮฮ.ห9::Iร† ™5k๏ผ๓Nบํn-`ณสมม‹ลb>ฟuT1ี๋ฏฟฮ˜1c˜5k-Zด`ลŠVฺวญฯž=›ฺตkcooO้าฅ๑๐๐ &&ฦ\๎9>๘cš5k†ŸŸSงNอ0ฮ~๚k>ฮœ9sืนŠˆˆศใC…g:u ooo:w๎Lxx8—/_&>>\_นre๓ ๏eห–๑B›+WฎKXXฃF2GEญ๚ฝฝฝฝYVฎ\™y๓ๆaเฺตk*Tˆ%J ภฮ;ำ๕๐๐ GDGGำซW/fอšล๓ฯ?ฯฬ™3(Qข„ำ’%KฬํŠ+ฦฦ›๓^cbb(\ธฐ™Khh(nnnlถ~๘ sqqqมรรร๊!"""9—ๆxfัฦ5jฮฮฮxyy1gฮ"##  UซVtํฺ•7฿|“ฒeหRฝzu๓ขHŽgัขE ใฦุูู๑๑วะถm[ZตjEุผysš8z๋-ฉUซcวŽeำฆM๘๛๛ใ์์ฬw฿}@ีชUqssรืื—jีช๑v๕๊ีฉ^ฝ:.\เะกC4n˜oฟ–€€5jdถํฺตซภ„ pvvๆฺตk๔๎›—_~๙žฑˆˆˆไlv†aู„ผธศำำ“6Mมห#ื7ศA’,ฐ๊ดตŸŽร้ ;กำๆnุ*๛‚ฒคค$VฌXAบuqrrส๎plJน+๗œ˜{๊฿๏ุุุ;žฝ|ย>ๆEDDD$ปจ๐›Pแ)""""6กยSDDDDlB…งˆˆˆˆุ„ Oฑ ž""""b*‚bbbจRฅ AAAp๘๐aพ๚k d๐เม <˜ *เ็็วG}dn๏ใใรเมƒ คz๕๊ฤลล๑ร?0o<๚๔้Cืฎ]ญ๖—œœฬ‚ จUซบu`๚๔้|๘แ‡V}^ฟ~€๋ืฏ“””ฤตkืpwwวลล€เเ`ฺตkวŽ;ฒ”gbb"qqqVษนTx>‚~๑GjึฌITTปw๏&11‘ษ“'ณu๋Vขฃฃ้ัฃ=z๔`ืฎ]์ท}๛๖m๖๑์ณฯM`` s็ฮฅu๋ึ„……1y๒d&Ož ภ™3g4hพพพ,[ถŒaร†1kึฌLc ขF)R>๚่#ณ๐‚ชWฏฮฆM›(Xฐ Mš4ม0Œ4mฎ_ฟN๏ฝYพ|9๛๖ํฃYณf$&&š๋SG!ํํํIIIIณ}@@SงNeห–-4iา„Ÿ~๚‰7n˜๋ฐX,ๆ๓ิพ.\HHH...*Tˆภภ@8`ถปpแใว',,Œ.^ผศาฅK๏jฎฎฎผ๖l฿พัฃGณ~zส”)รุฑc(Qข„y๊~็ฮœ?€bลŠฑiำ&, ๑๑๑์ูณ‡RฅJะฒeKBBBˆ‹‹cๅส•,\ธฺตk?จร""""9ว์@าฺธq#ฃFยูู///ๆฬ™Cแย…ฉ\น24jิˆ!C†ะขE ^xแŠ+FHHศ=๏/((ˆˆˆฎ\นb^TตjU๐๕๕ฅZตjๆหfอšฑz๕j่ีซE‹nž3gฮฤ^Ÿ‘ดTx>‚ฺดiC›6mฌ–ตo฿ž๖ํ[-๛๔ำO๙๔ำOำl๋œฮถmš?OŸ>=ำบนน๑ฺkฏ7Oั๓ฯ้ถหจŸ๚๕๋gฺฟˆˆˆ<ู44%""""6กยSDDDDlB…งˆˆˆˆุ„ Oฑ ž""""b*วŽใ๕ื_ง|๙๒ิฎ]›๓็ฯเใใร๕๋ื˜>}:~๘!}๛๖ฅL™22z๔h€ ๛ธีษ“'๙่ฃ(SฆŒ™[F๛ˆ‹‹3๕๖๖เว$00ษ“'›๋๏$11‘ธธ8ซ‡ˆˆˆไ\9พ๐๑วฉYณ&QQQ์ฝ› 6X=/Qข#FŒภ฿฿Ÿจจ(๚๖ํ <ฅผlู2fฯžMฏ^ฝ>žญ[ทšฅคคPชTฉ ท๓๔๔ฤออ๖ํำฐaC๊ีซ—i 6ไภ๐รTญZ๕Žว1ี—_~ษท฿~Kอš51bC‡eไศ‘ภอQาแร‡3dศfฮœI๕๊ี6l}๚๔Iทฏ~๚™E<AU๑)""’sๅ๘ยณz๕๊lฺด‰ฅK—าคI&Mš”ๆyz]๎นอŸํ์์ุณg๖๖ึฤ:t`ๅส•<๗sŒ3†+Wฎ˜๋œฐททท๚๙Ns7S๗kฑX(Zด(QQQiฺ888˜ง๕ptt$22’ีซW3kึ,,Xภ„ 2์cไศ‘|๙ๅ—ผ๖4jิˆ๖ํ๓sฯeบ€๙๓็3qโD7nLืฎ]ญ๚ผy3SงN%22’>๚ˆทz+ร\]\\pqqษ๔xˆˆˆHฮ‘ใOตŸ:u ooo:w๎Lxx8[ถlฑzพ~‰ฯฐjีช™Y,๖๏฿@BB เ๚๕๋ฬ;๗ฦํ้้Iพ|๙Xณf p๓ยŸC‡PขD ขขขฐX,,[ถ €+WฎKXXฃF"***ำ>๘๒ห/ูปw/ฯ=๗-[ถไ•W^แไษ“๎ภรรƒ={๖ฐn:J—. ภš5k๐๓๓cฬ˜1ดhั‚ะฟ *๔@‹ˆˆˆ<พrˆ็ฦ5jฮฮฮxyyัชU+ฬ็sๆฬมหห‹€€hีช ฐ๊ใ‹/พ SงNLž<™คค$Zทnฟฟ?๛๗็ล_คPกBwœy/fอšE็ฮ้ท/ษษษ๔ํ—^xะบukžz๊)ˆ',,Œ7n`gggฮๅฬจTy๒ไก}๛๖ดo฿žปwใ่x๓%‘>พ๚๊+~๛m ร @๐รภอ9ญซVญขXฑb8ˆˆˆHฮ`g†‘Aˆภอ9žžžž๔\ูG๗์๙?ั่*Ÿeห~“’’Xฑbu๋ึลษษ)[bศ.สษหIอ”ปrฯ™นงŽลรร#ำถ9Tปˆˆˆˆ<rฉ๖Gั๊ีซ๙เƒฌ–ีฎ]›O?4›"y๘TxfƒะะPBCCณ; ›าฉvฑ ž""""b*”+WŽ *ษkฏฝฦ3ฯ<ร๒ๅหำฤ˜œœฬ‚ จUซบu`๚๔้|๘แ‡fฎ_ฟภ๕๋ืIJJโฺตkธปปใโโ@pp0ํฺตcวŽ๕˜ŠˆˆศใI…็C๖ใ?RณfMขขขุฝ{76lฐz^ขD FŒฟฟ?QQQ๔ํ€}๛๖ฑlู2fฯžMฏ^ฝว็๔้ำฤฤฤp๙๒ejิจA:u๐๒๒ยัั‘FัจQ#N:E‡๘๏K|||บ}9’กC‡fiฟ"""๒๘ำˆ็CVฝzu6mฺDม‚iาค IIIVฯืญ[—๎vนs็6ถณณcฯž=DEE™#ฅ:t`๚๔้์฿ฟŸ=z˜˜hnใ์์ €ฝฝฝีฯฉsF˜:u*[ถlกI“&๔ำOธqรมมมฮœ9“ตƒ*"""%žูฉSง๐๖๖ฆs็ฮ„‡‡ณeหซ็๛๗๏ว=รQA€jีช™Y,๖๏฿@BB เ๚๕๋ฬ;๗ฎโruuๅํท฿f๛๖ํŒ=š๕๋ืSฆLฦŽ @‰%ˆŽŽnŽŽž?€bลŠฑiำ&, ๑๑๑์ูณ‡RฅJะฒeKBBBˆ‹‹cๅส•,\ธฺตkgƒ‹‹ Vษนtช!ธq#ฃFยูู///ZตjE@@€๙|ฮœ9xyy@@@ญZตข@V}|๑ลt๊ิ‰ษ“'“””D๋ึญ๑๗๗งผ๘โ‹*TˆrๅสsŒAAADDDpๅส๓ย ชUซโๆๆ†ฏฏ/ีชUฃx๑โ4kึŒีซWใ๏๏@ฏ^ฝ(Zด(pณ๐œ9s&๖๖๚Œˆˆˆคฅย๓!kำฆ mฺดIณ์v?๘c†}*Tˆ… ฆYญ[7๓*๔[mธันmถV๋๛๏ ๗ใๆๆฦkฏฝ<-๓ฯ?งn๚๔้้.OW*"""’ M‰ˆˆˆˆMจ๐›Pแ)""""6กยSDDDDlB…งˆˆˆˆุ„ Oฑ ž""""b*}วnF*Tจภฎ]ป๎9†๛ู~ถ‹‹ฃx๑โœ9s›๏?;›rฟ๗ณ3๖๛ู>ป็ูนใž๛ใ^ฟ฿ํ็๖q3 ƒ๘๘xŠ)rวพTxส#รๆ”cOOฯ{~c:88๓ถ๗ป๎ภรร#[๖Ÿว-•rฟ๛>ฒ;๖๛>ป~็ย๖k๎๓{~ทœsทลqห๊€‘..’ฅkืฎูถ๎๛~eg์ส={dw์ส={่s.{ถœs”^๏vFVf‚Šุ@\\žžžฤฦฦ๗*7ส]น?Iน?ฉyƒrW๎O^๎ทำˆง<2\\\+y^ผx‘7฿|๒ๆอห;๏ผร•+Wl˜ลฝษ,๗คค$>๘เษ“'EŠกu๋ึฤฤฤX๕๑8ๆ~ง฿๙ญ:u๊„ใวทZ8ๆ}ฟTxส#a๎น๔๎›มƒณgฯ ๅŸษ๎ะ˜_•ฎ]ปฒ}๛vึฎ]KRRตjี"!!มlำซW/–.]สผy๓๘๕ื_‰‰‰กqใฦู๕ƒทkื.ฆL™B@@€ี๒œš๛ฅK—จRฅ NNNฌ\น’ƒ2v์X๒ๅหgถ5j'N$""‚;v'OBCCน~z6F~>๛์3พ๚๊+&MšฤกC‡๘์ณฯ5j_|๑…ู&งไž@`` “'ONw}V๒|๓อ79pเkืฎeูฒelฺด‰w฿}ืV)ณฬrฟz๕*{๖์aเภ์ูณ‡ pไศยยยฌฺ=Žน฿้wžjแย…l฿พ=ฏ“|๓พo†ศ#เฅ—^2บvํj>OII1Š)bŒ92ฃzธ๙็0~๕Wร0 ใ๒ๅห†“““1o<ณอกC‡ ภ๘ํท฿ฒ+ฬ*>>x๎น็Œตkื5jิ0z๔่aFฮฮƒ>0ชVญšแz‹ลb.\ุ=zดน์๒ๅห†‹‹‹๑ใ?ฺ"ฤ‡ฆ^ฝzฦoฟmตฌqใฦฦ›oพiFฮอ0.\h>ฯJž4cืฎ]f›•+Wvvvฦนs็l๛บ=๗๔์นำŒSงN†‘3rฯ(๏ณgฯE‹5~wฃD‰ฦ็Ÿnฎห y฿ xJถปqใปw๏ฆfอšๆ2{{{jึฌษoฟ–‘=\ฑฑฑไฯŸ€ปw“””duส”)รำO?cŽCืฎ]ฉWฏžUސณs_ฒd มมม4kึŒ‚ Rฎ\9พ๚ks‰'๘๛๏ฟญr๗๔๔คbลŠ}๎•+Wfบu=z€่่hถlูB:u€œ๛ญฒ’็oฟFผy 6ิฌY{{{v์ุa๓˜ฆุุX์์์ศ›7/ssทX,ดjีŠพ}๛Rถlู4๋sjwโ˜ˆ๛๏ฟคคคPจP!ซๅ… โ๐แรูีรeฑXู่ณ'UชTมฯฯ€ฟggg๓ร8UกB…๘๛๏ฟณ!สkฮœ9์ูณ‡]ปvฅY—“s๓ฯ?๙๊ซฏ่ป7}๔ปvํข{๗๎8;;ำฆM3ฟ๔^{๎~๘!qqq”)SRRR1boพ๙&@ŽฮVYษ๓๏ฟฆ`ม‚V๋ษŸ?Ž:ืฏ_็ƒ> E‹ๆWGๆิ?๛์3้ฝ{บ๋sjwขยS$tํฺ•฿-[ถdw(6qๆฬz๔่มฺตkquuอ๎plสbฑฬ'Ÿ|@นrๅ๘๗฿‰ˆˆ M›6ูร๕ำO?1kึ,fฯžMูฒe‰ŠŠขgฯž)R$ว็.i%%%ัผys รเซฏพส๎pชปw3aย๖์ูƒ]v‡๓HัฉvษvO=๕iฎ`><… ฮฆจžnบฑlู26lุ@ฑbลฬๅ… ๆฦ\พ|ูช}N8ปw๏ๆŸแล_ฤััGGG~๕W&Nœˆฃฃ#… สฑน{{{ใ๋๋kต์…^เ๔้ำf~9๑๕฿ทo_>๐Cยรร๑๗๗งUซV๔๊ี‹‘#G9;๗[e%ฯย… งน˜299™‹/ๆˆc‘Ztž:uŠตkืšฃ3s฿ผy3๓O?ด๙™w๊ิ)๚๔้ƒ3๓ฮ ž’ํœ)_พ<๋ึญ3—Y,ึญ[GHHH6F๖`†AทnXธp!๋ืฏงdษ’V๋ห—/“““ีq8rไงOŸ~์รkฏฝฦ๛‰ŠŠ2มมมผ๙ๆ›ๆฯ95๗*UชคนmึัฃG)Qข%K–คpแยVนวลลฑcวŽว>๗ซWฏboogฦมม‹ลไ์o••ซฯผ"EŠะทo_Vฏ^ ไฬผณ$ปฏn1 ร˜3gŽแโโbLŸ>8x๐ ๑๎ป๏y๓ๆ5๛๏์ํ้นณแ้้ilธั๘๋ฏฟฬวีซWอ6:u2ž~๚ic๚๕Fddคb„„„dcิฯญWตFฮอ}็ฮ†ฃฃฃ1bฤใุฑcฦฌYณŒนs3gฮ4|๚้งFผyล‹๛๖ํ34h`”,YาธvํZ6F~ฺดic-ZิXถl™qโฤ cม‚ฦSO=eผ๛f›œ’{||ผฑw๏^c๏ฝ`Œ7ฮุปwฏyๅvV๒ฌ]ปถQฎ\9cวŽฦ–-[Œ็ž{ฮhัขEvฅ”e™ๅ~ใฦ #,,ฬ(Vฌ˜e๕ู—˜˜h๖๑8ๆ~ง฿๙ํnฟช0ฯผ๏— Oyd|๑ลฦำO?m8;;/ฝ๔’ฑ}๛๖์้า}|๗wf›kืฎ]บt1๒ๅหgไฮhิจ‘๑ื_e_ะัํ…gNฮ}้าฅ†ŸŸŸแโโb”)Sฦ˜:uชีz‹ลb 8ะ(Tจแโโbผ๖ฺkฦ‘#Gฒ)ฺ'..ฮ่ัฃ‡๑๔ำOฎฎฎฦ3ฯK—.Mแย…Yบt้†'’#ฉ๐ษ&E‹eัขEๆ๓ล‹ใํํฆš5kธrๅ งOŸๆฦ|๑วV๋WญZEํฺต๏j฿฿|๓ -Zดธงธ๏Frr๒C฿วฃ"5ื-Z0mฺดlŽFไัคยSD$›ดhั‚Yณf™ฯgฮœษ›oพ™a๛999Q~~>MNN’ีjฅร‡Sjj*“ม` ///jllด{_fๆ๋้้I DDd2™จนนู๎˜ํท“ษdขฮฮNาjต๔่ั#""z๒ไ ๙๛๛S{{;YญV:}๚4ฅฆฆQmm-๙๚๚ฮบVBBeee ํ‘‘R*•TZZJ6›สหหIญVำุุ ฃG’ลb!ซี*Œ“H$ิาา2oพŒญdฤ“1ฦ–‰““Nœ8’’”””เ๘๑ใprršำ/""2™ nnnhmmลล‹…s555ะ้tptt„H$ยภภฺฺฺเ์์l๗‰งูlžwogrr2ึฌY??? <<jต …:€โโbคฅฅAฅRมืฏ_GQQ‘p___œ={ŽŽŽฐX,จซซCvv6\\\เ็็‡ธธ8”••-zD" ~๘…BญVkท๏ๅห—กP( T*‘’’‚’’ำ[ 222 ัhเ๊๊ŠซWฏขดดtัุ3*++ฑu๋Vแฟ‰ŽŽ†\.วทo…>้้้H$puu~[ฝz5,หวalฅเย“1ฦ–ั™3gPXXˆ‚‚ปห์OŸ>…ูl†ีjEtt4"##…sฟ๏๏ŒวมƒFƒ์์์yฏ'•J็}›].— วฎฎฎsฺ3cบบบฐn:แœFฃAWW—ะVฉTยฑัhฤ๘๘8ึฎ] ™L™L†‡ขปป{ม๛ฅฅฅ(//‡JฅBxx๘œ-ฟSซีณŽM&“?))Iˆฝw๏^๔๕๕-๛๗_พ|)Œ—ษd0 v็;cddRฉ๔ใ0ถRpแษcหhวŽฤะะ‚‚‚์๋โโ‚๘๘x|๘ฆ_< ฌZต 7n@kk+ž={†ปw๏ขฎฎnฮuถm†o฿พ๋œ•J%ŒFฃะ6P*•BมมA8๖๖๖†X,ฦะะฬf3ฬf3FFF๐เมƒEใ์ฺต UUU่้้A@@ภฌ'ฝซฃฃcึ๑ฬKZะ๋๕Blณู,|Iเ๗<็ห}f|XXุœ๑qqqvวtwwรfณมืืwั92ถาpแษcหฌฌฌ์–ž'&&PXXน\wwwดดด@"‘EVmm-š››155‰Dgg็y—๎5  šššUพ'Ožฤํทัูู‰มมAdeeแิฉS๓๖๕๖๖ฦ๎ปqํฺ5XญVุl6|๚๔ _พ|Y0ฦฏ_ฟPXXˆแแaˆD"ˆลโy็2#''===0™Lธs็bcc็ฯŸวอ›7…Bd2กบบภ๔พพพYŸด’หๅhooฺGŽม็ฯŸQQQ›อ†ฑฑ1TWW/ธŒ^__ภููyม92ถqแษcหLซี.ธ๑ะกC‹ล๐๐๐@mm-***เเเ0็3J&“ ัััH$ BRR’}ž‰‰‰ณ๖eฤฤDฤฤฤ`็ฮะjต@FF†๘;||| —หqๅสŒ-GฏืCฃัภออ ฯŸ?GnnฎพฑฑฑุทoŠs็ฮ˜r@bb""##!‘H ำ้„ขwห–-8v์ิj5d2€้B๕ปwษdธt้คR)ชชช““น\Ž๕๋ื#//oมผ‹ŠŠpแย…E็วุJไ@DดI0ฦ๛{แแแHOOว๛z์่่(‚‚‚๐๛ปศ—}๚๑๑๑x๓ๆอผK๙Œญt\x2ฦุิญ[ท’’‘Hดฉ0ฦุแย“1ฦcŒ- ใษcŒ1ฦ–žŒ1ฦclIpแษcŒ1ฦ–žŒ1ฦclIpแษcŒ1ฦ–žŒ1ฦclIpแษcŒ1ฦ–žŒ1ฦclIpแษcŒ1ฦ–ฤ?4ทc…lIENDฎB`‚c4core-bm-charconv-ftoa-mega_bytes_per_second-double.png000066400000000000000000000746731477602032300337320ustar00rootroot00000000000000c4core-0.2.6/doc/img/windows-x86_64-vs2019-Release‰PNG  IHDR„R‡‹๐9tEXtSoftwareMatplotlib version3.5.3, https://matplotlib.org/อ+นา pHYsaaจ?งiy(IDATxœํw|M๗ใ?๐ือ”ศ"$Aา$VศŽ$4"bฤŠZMEQ1ZTตV%Zj•jญD}*ชถRjฯ˜5nb– M†D๖๛๗‡oฮฯuณ’8ฏ็ใq๎9็}๏๗๗WฮขB‘li”wˆˆˆˆจ|1ษ!‘ฬ1ษ!‘ฬ1ษ!‘ฬ1ษ!‘ฬ1Ÿเเ`”w7Š…B7–wWJ%,, …<(๏ฎLดjี ŽŽŽๅwŽBก@XXXywฃLดjี ญZตzฃmผฬoIEZท „Ta์ุฑฃย|0ˆสห๗฿?ณิๅ—,Y‚^ฝzแฝ๗ƒBก@pppกๅ บ††nบฅ6=55zzzP(9rไ+๖žJ’‘‘ฐฐ0DEEฝ๕ถ?Žฐฐ0$''ฟ๕ถฉโc ค cวŽ˜:ujywƒจ\ฝl œ5k8hii•X^WWkึฌQฟiำฆ—้&ฝขŒŒ L:ตแิฉS_:>}๚“'O~3ข ƒˆสTzzzywกาBเ้ำงฏ4๏กC‡๐เม์นบบบ%–๗๗๗/4ฎ^ฝ;w~ฅ>ศI~~>233หปo๓หYฅJ•RฑA•!ฝQOŸ>EฃFะจQ#•ผGกVญZhผ9๒๒๒ŒE‹xvMEมซ@zz:ฦŽ +++่๊๊ยฮฮ?๐„*ํ-_พmฺด™™tuuaoo%K–ผTŸฏ]ป†: jีชจ]ป6พ๖[ตv๒๓๓1|888 J•*077วะกC๑๘๑c•r666๘เƒp๔่Q4mฺUชTAบu๑oฟฉต›œœŒ1cฦภฦฦบบบฐดดฤวฌv ^~~>ฆOŸKKKTฉRmถลีซWUส\K___่๋๋ฃ~๚า๕‡‡Bณfอ งง;;;์ทOe7n`๘๐แฐณณƒžžLMMัซW/$&&ช”‹ŒŒ„BกภกC‡0|๘p˜™™มาาฒศu{ใฦ ิฏ_ŽŽŽธ{๗.€gGL.^ผX๊k Ož< TซV UซV…ณณ3~๚้'•2€ชVญ t๋ึ .\P)Sp ๕๊ีซ†‰‰ Œ1pเ@dddHๅับukต~ไ็็ฃN:P๗2๛ล๎ปแแแ===DDD@กP ==+Vฌ>E.`mmญ๒Y)Iฟ~ T*q๑โEi;wpเภ๔๋ืฏิ๕œZ๓ฯ?แ่่]]]888`ืฎ]*ๅ‚ƒƒaccฃ6ม๚/ฌฮ 6ภzzz๐๒๒B||< ""๕๋ืG•*UะชU+ตฑ@LL š7o===ฺฺุ"<<\ญLVVBCCQฟ~}่๊๊ยสส _}๕ฒฒฒ ํำชUซเเเ]]]iืฎ] wwwยศศNNNj๛โ๓QณfMภิฉSฅmฅ2ฅูw‹ฒ`ม888@__ีชUƒ‡‡Vฏ^ เู๚7nภึึVjป`ทœ/๖ฑดŸเูoภ็ŸŽ5jภะะ]ปvลงVgZZF-}™™™ก]ปv8sๆŒTๆeฟ+–.]Šz๕๊AOOM›6ล‘#G -w๏= 4ๆๆๆจRฅ \\\ฐbล •2ืpฟxd711 …‘‘‘j๕–ๆทค0๗>๙ไ˜››KŸซ_ตTหZัvโฤ กฉฉ)ฦŒ# zzzโาฅKB!Ž?.ฺตk'ˆ•+WJ/!„ศฯฯmฺด …B ฤ7฿|ฃRv๐เมBKKK 2D„‡‡‹ฏฟZTญZUxzzŠ์์lฉœตตตฐณณๆๆๆbโฤ‰bแย…ขI“&BกPˆs็ฮIๅาาา„ฃฃฃะิิC† K–,฿}๗๐๔๔gฯžBq๐เA@ธนน www๑ใ?Šฐฐ0กฏฏ/š6mชา?___Qปvmaee%ฦ',X ์ํํ…ฆฆฆXปvญฐฐฐaaab๙ขN:ยุุXคฆฆJ๓oุฐAธธธˆ)SฆˆฅK—Љ'Šjีช kkk‘žž.•[พ|น ์ํํ…ฏฏฏXฐ`˜9sฆBˆะะP@ฟ_!ฤีซWล{๏ฝ'\]]ฅqฯ/Whhh‰hฯž=BGGGX[[‹ะะPฑdษ๑๙็Ÿ ???ฉฬฝ{…–––hุฐก˜={ถ˜:uชจQฃ†จVญšธ~บTฎ nnnโร?‹/ƒฤW_}%•๛๖o…†††ธ}๛ถJ_:$ˆ 6ผา~Qฟ~}QญZ51~x.<(Vฎ\)tuu…๔8~x‰๋ฅ@ีชUล€ Vฐผ๗๎–––*๛๔๙๓…ฑฑฑศฬฬฤˆ#Jl €pqqตjี฿}๗˜?พจ[ทฎะืื<ส 0@X[[ูŸ๋tvvVVVbๆฬ™bๆฬ™ยุุXผ๗{bแย…ย^ฬ;WLž5nXิฌYSL:U,ZดHœ={V์ูณGmถ‹-‹-#GŽฝz๕*r=y๒D,YฒD=z๔ถqllฌข๔๛na–.]*ˆ€€!~๚้'1hะ ๑๙็Ÿ !„ˆ}๛๖ฤ?(ตไษ“b—ณ`ฺ๓Ÿฯา~v„ขw๏€ ‹-ฝ{๗...ju๖๋ืO่่่ˆ/พ๘B,[ถLฬš5Kt้าE๛๏R™—๙ฎXถl™ š7o.~๙g1z๔habb"๊ึญ+|}}ฅrขqใฦB[[[Œ3F๓ฯยววG๓็ฯWk๛เมƒ*ํ\ฟ~]ห—/—ฦฝฬoษ‹หs็ฮaii)ฌฌฌฤท฿~+–,Y"บvํ*mท7‰Š & q๘๐aฑaรต›BŒ1BํB!๓O@L›6Me|@@€P(โ๊ีซาธŒŒ ต๙;t่ ๊ึญ[b  ˆฯ>๛L—ŸŸ/:w๎,tttคsไศ@ฌZตJe]ปvฉทถถฤแร‡ฅq๗๎บบบb์ุฑาธ)SฆbำฆMjสฯฯB/คฦ‹ฌฌ,i๚O?$ˆ๘๘xiœฏฏฏ Vฏ^-ปx๑ข 444ฤ‰'ค๑ปw๏V๛B+l=๗฿€๘ํท฿คqฐE‹"77Wฅ๓๐ย… ขvํฺยำำS”ฦลฦฦ ๑๑วซ๕๏“O>QฉซGยิิTพt้’ ,X Rn๘๐แยภภ@ZWฏฒ_์ฺตKm9‹ u%)M ผพ๘๒ห/E๚๕ฅižžžbเภB๑RPGGGๅ๓ซถฎ^6๊๊๊ช„Ÿˆˆ@XXXจั2aย@ฅlม~?w๎\i\VV–ดO„๒•+W qไศ•๖รรรq์ุ1•>ihhˆ๓็ฯซ”5j”022R๏Kr"๗๗า๎ป…้ึญ›ppp(ถฬœ9sิึYข–ณ`ZaฐคฯNLLLกธซีill\โ~Wฺ๏Š์์laff&\]]Uพ+ B๓๓p๙€J๐ฬฮฮ^^^ยภภ@ฺ็^6–ๆทD๕u;hะ QซV-•?ช„xvลุุธะ๏ๆฒยSฦ๔V„……มมม ภ๐แรแ๋๋‹ฯ?ผT๓๎ุฑšššjๅวŽ !v๎)ำำำ“งคคเมƒ๐๕๕ลตkื’’Rช๖žฟรฒเ4JvvถtZuร† 066Fปvํ๐เม้ๅ๎๎{{{๘๘๘Hร5kึ„ฎ]ป&๛ใ?เโโ‚=zจ๕็ลำj„ŽŽŽ4\P๗๓๕€ฅa;;;˜˜˜ qใฦhึฌ™4พเ๓๓?ฟsrr๐๐แCิฏ_&&&*งp 2šššjใเนs๐๕๕… ๖ํ‡jีชฉLoีช„%a~๖์Y\ฟ~ฃG†‰‰‰สด‚ut๛๖m(•Jฃz๕๊าtgggดkื;v์Pซ7$$Deุวว>Djj* aร†puuลบu๋ค2yyyุธq#บt้"ญซ—/lmmักC‡b—๙M้ืฏฎ^ฝŠำงOKพฬ้โ~~~จWฏž4์์์ ###ต}๑eดmVๅsมูณgOชฑ---- :TึััมะกCq๏=ฤฤฤxถญ7nŒFฉlซ6mฺ€ฺถ๒๕๕…ฝฝฝส8คงงc๏ฝฏผฌฯ{•}๗ล๛๏ฟ8}๚๔+๗กฐๅ,NIŸ‚Sฮร‡W)๗ูgŸฉีebb‚“'O"))ฉศ๖J๛]{๗๎!$$Dๅป288ฦฦฦ*ew์ุ ๔ํWงญญฯ?Ož<มกC‡Šmซ8%–ผH?๘]บtBe฿์ะกRRR -+ „๔V่่่เื_ล๕๋ื‘––†ๅห——๚บง7n vํฺ*?ะธqcizcวŽมฯฯOบฆfอš˜8q"”*jhh nบ*ใ6lาต6Wฎ\AJJ ฬฬฬPณfM•ื“'Op๏=•๙฿{๏=ตvชUซฆr]ู?S๊็งฝX_Aภz๑:5KKKตulll +++ตq/ฮ๔้SL™2EบfณFจYณ&’““ ]ถถถE๖ทK—.044ฤ๎ปaddTŠ%,?ลฎง‚}มฮฮNmZใฦ๑เมต›^Jณ>๛๔้ƒcวŽแฟ๐์zข{๗๎กOŸ>R™—/Š[goš››5j„ีซWcีชUฐฐฐยะห(อพบu์Ÿฅูo vํฺจZตชสธย>ร็ฯŸWNๅJณญ†ކ ขSงNฐดดฤ'Ÿ|ขvไหx•}๗y_5 ะดiS4hะ#FŒภฑcว^ช/ปO–๔ูนqใ444ิ๊ญ_ฟพZ]ณgฯฦนs็`ee…ฆM›",,์•ฐ(X— 4Pฏญญญ๖~ใฦ 4hะชqจฐ฿——Qš฿’ฟษษษXบtฉฺพ9pเ@๊๛fYโmC๔ึ์ฝ™™‰+Wฎ”๙โ?ƒถmขQฃF˜7oฌฌฌ ฃฃƒ;vเวD~~~™ด“ŸŸ333ฌZตชะ้(๊ศ™(ลลล…)m}E•+อŸ}๖–/_ŽัฃGรหห ฦฦฦP( ,t=>D๑E={๖ฤŠ+ฐjี*•#7EiึGŸ>}0aยlุฐฃGฦ๚๕๋allŒŽ;Je^vฟ(nฝ ๚๕ร’%K`hhˆ>}๚จ –Fiึ]Q๘ๅๅๅฝTe๙9สฯฯ‡““ๆอ›W่๔รgaสฬฬ Jฅปw๏ฦฮ;ฑs็N,_พฑฺ oCใฦq้า%lถ ปvํยล‹cส”)ฅ~œืห๎“eนMz๗๎ lผ{๖์มœ9s0kึ,lฺด :uz้๚สฺห๎วฏขเป๕ฃ>ย€ -ใ์์\fํฝˆŠธธ8|๛ํท8p ”J%Œ๘๘x•ร๗E}เฌญญฑo฿>คฅฅฉ%,ธKาฺฺ๐ื_!++ [ทnU๙ห๕ลำ?ลษฯฯวตkืคฟไเ๒ๅห ฦชWฏ๖ํoo๏2๛QฏWฏฮ;W&u•…7bภ€˜;wฎ4.33๓•h;gฮhiia๘๐แ044|ฅS“คS“็ฮƒŸŸ_กe ๖…K—.ฉMปx๑"jิจกv๔จ4lmmัดiSฌ[ท#GŽฤฆM›ะฝ{w•วผ”ี~๑2w ฟŽ~๚aส”)ธ}๛6Vฎ\๙ฦฺฉVญZก๛อซy)IRRาำำUถsaŸแุุXดm๖ตึทŽŽบt้‚.]บ ??ร‡GDDพ๙ๆ›B‚ลฯฏท๏VญZ}๚๔AŸ>}?ำงOว„ PฅJ•ทถoฐถถF~~>ฎ_ฟฎrด๎ลง"จUซ†Žแร‡ใฝ{hาค ฆOŸาฐ`]^นrEๅศwNNฎ_ฟ•ฒqqqศฯฯW๙ฃ่ล฿—‚ฃŸ/๎หEํวฅ๙-yQอš5ahhˆผผผ"ฟใ$ž2ฆ7.''มมมจ]ป6~๚้'DFFโ๎ป3fŒJน‚/ป?pศหหรย… Uฦ๘ใP(า—Eม_ซฯuš’’‚ๅห—ฟTŸoG… B[[mถ๐์/ูผผ<|๗wj๓ๆๆๆพRhู๊ณ'bccฑy๓fตiฏz$๑uhjjชตป`ม‚W๚kXกP`้าฅภ€ฐu๋V•้ฅ}”D“&M`kk‹๙๓็ซญใ‚พึชU ฎฎฎXฑb…J™s็ฮaฯž=๐๗๗้่ำงNœ8_บๆy๚๚๚ิฟ็^w฿}ฑ?:::ฐทท‡999ŠŽ}S ฎ‘]ผxฑส๘ จ ็ๅๅฉ]Šbff†ฺตkซฌหา~Wxxx fอšGvvถ4>22ฒะ฿—;w๎จ\#œ››‹ ภภภพพพžCMMM>|Xe—ํy%–ผHSS={๖ฤQ่‚๛๗๏ฝะe€G้›6m”J%๖๏฿CCC8;;cส”)˜๙๎๎๎x๔่ถnŠ๐๐p•ฟh฿†>๘+Wฎ„ฑฑ1์ํํ๑๗฿c฿พ}055}ฅ๚444๐๛๏ฟฃ{๗๎่ป7v์ุ!ๅ~๊ิ)ดnกกกล^,ฎกก%K– K—.puuลภQซV-\ผx็ฯŸ—.I˜3g:u๊/// 4OŸ>ล‚ `llZ5b๏ฝ๑ๅ—_โห/ฟD๕๊ีี‚/ซย๛๖ํรผy๓Pปvmฺฺุช๔ขฟ๚ ฑฑฑž๑‡iำฆบvํZ์)ฆQฃF•fั_K`` พ๚k๔่ัŸ9222ฐdษ4lุ๐\ _ปvmฬš5 ‰‰‰hุฐ!ึญ[ฅR‰ฅK—B[[„๕๋ื#$$„ทท7๒๒๒p๑โEฌ_ฟ^z>dqŒGกM›6ฐดดฤ7ฐ`มธบบJืŸFOO๖๖๖Xทn6lˆ๊ีซรััŽŽŽฏต๏ถo฿๐๖๖†นน9.\ธ€… ขs็ฮา™•‚๏ุI“&!00ฺฺฺ่าฅห+5/ www๔์ู๓็ฯวร‡๑๛๏ใะกCา‘ฒ‚#–iiiฐดดD@@\\\```€}๛๖แ๔้ำ*g)J๛]กญญiำฆa่ะกhำฆ ๚๔้ƒ๋ืฏc๙๒ๅjื๕}๚้งˆˆˆ@pp0bbb`ccƒ7โุฑc˜?พด๎ŒัซW/,Xฐ …๕๊ีรถmŠผฆฏ4ฟ%…™9s&<ˆfอšaศ!ฐททวฃGpๆฬ์ท=*ีบ%o์e"๑์ฑZZZ*ท฿ ๑์"žžžขvํฺา#DrssลgŸ}&jึฌ) …ส#)าาาฤ˜1cDํฺต…ถถถhะ ˜3gŽสใF„b๋ึญยููYTฉREุุุˆYณf‰_ตศG-;้้้bฤˆขz๕๊ยภภ@t๏]z”Sม3Kณฒฒฤธqใ„‹‹‹๔นvqq‹/Vฉeฟ+/^,lmm…ฎฎฎ๐๐๐‡.๔ป๗๎ปา๗ŽŽŽprrR๙์ธพู่ณงะืืีชUC‡็ฮ+๔ฑ3ฅ-)ly๎ฝ+FŒ!ฌฌฌ„ถถถฐฐฐmถK—.-ีrฟ*ลuˆˆˆˆ่S*•pssร๏ฟŽ๛—ww่๐B"""z# ๛?บ็ฯŸ ดlูฒzDEแ5„DDD๔Fฬž=111hบ5ดดดคG๔|๚้งj๗ก๒ลSฦDDD๔F์ปSงNEBBž> …งNzํพ๛ํทhึฌผฝฝ_ป.*๏ฟ๙งฺ๘ใว#,,์n_5-Z„;w๎ผ‘๚‰B"ชtชTฉ‚ีซWซ?t่๗_่๊๊:_ปvํฐrๅJฌ\นs็ฮ…››พ๙ๆ 0 ะ๒ทo‡™™<==_ซฟ๗๏฿วŠ+๒Z๕T4-[ถฤำงO+์๓ไŠ „SงN}cฐ[ทn022*๖น%ชhxฯ7U:ุฐa~๙g•GWฌ^ฝ๎๎๎x๐เAก๓5lุ}๔‘4‚์์llฺด ™™™จRฅŠJ๙;v SงNาน๚ช~whiiกK—.ฏUOYJOOํรVCCCmษYFF๔๕๕กกก€€๖o˜:u๊k๏?DoQฅำทo_<|๘{๗๎•ฦeggcใฦ่ืฏ฿Kีeaa…Bก๖Lดไไd?~;w–ฦญ]ป๎๎๎044„‘‘œœœ๐ำO?•ุฦŸ‰fอšมภภ@e|มusqqq๐๕๕…พพ>๊ืฏ7xvฤณYณfะำำƒ๖ํงV๗ูณgัฉS'มภภmถล‰'Tสœj?t่†333XZZJำw๎ TญZ†††่น3ฮŸ?_โrv แ•+WะณgOXXX J•*ฐดดD`` RRRJฌbbbะผys่้้มึึแแแjeฒฒฒŠ๚๕๋CWWVVV๘๊ซฏ••%•Q(HOOวŠ+คห‚ƒƒ†qใฦlmmฅi‰‰‰าผฟ;กงง‡๊ีซ#00ทnR้Cมถ‹‰‰Aห–-กฏฏ‰'Jำตk‡7n@ฉT–jน‰ส!U:666๐๒๒ยš5kคq;w๎DJJ ‹œ/33<ภƒpใฦ ฌ^ฝ+Vฌ@ฟ~ิแ๎ปกP(ะพ}{ฯฐทo_TซV ณfอยฬ™3ัชUซoษษษม้ำงัคI“Bง?~|๐š5k†ูณgCWWXทnแ๏๏™3g"==HKK“ๆ=<|||‹ฏพ๚ ฿|๓ ฎ_ฟŽVญZแไษ“jm > ˜2e ฦXนr%:w๎ ฬš5 ฿|๓ ะขE •Tููู่ะกNœ8ฯ>๛ ‹-ยงŸ~Škืฎ•๊๔์ใวแ๏๏wwwฬž=–––6l~๕WฉL~~>บvํŠ~๘]บtม‚ ะฝ{w๘ใ่ำงTnๅส•ะีี…t™ภะกC๑แ‡ขo฿พ€QšVณfMภ๔้ำ๑๑วฃAƒ˜7oF๛๗ฃeห–jห๐๐แCt๊ิ ฎฎฎ˜?>Zทn-Msww€w๊&"zว "ขJb๙๒ๅ€8}๚ดXธpก044B!z๕๊%Zทn-„ยฺฺZt๎Ye^…พบw๏.233ีฺ พพพา๐จQฃ„‘‘‘ศออ}ฉ>_ฝzU ,P›ๆ๋๋+ˆีซWKใ.^ผ( qโฤ i๎ปฑ|๙ri\๗๎…ŽŽŽ๘็ŸคqIIIยะะPดlูRWฐZดhกาดด4abb"† ขาฏ;w๎cccต๑/:x๐  <(„โ์ูณ€ุฐaC๑+ฅ๋b๎นาธฌฌ,แ๊๊*ฬฬฬDvvถBˆ•+W qไศ•๙รรรq์ุ1i\ีชUล€ิฺš3gŽ ฎ_ฟฎ2>11QhjjŠ้ำงซŒZZZ*ใ ๚^ไ2้่่ˆaร†•ธ์DQฅิปwo<}๚ถmCZZถmVโ้โnบa๏ฝุปw/ถlู‚ &`ืฎ]่ืฏฤsiS~~>vํฺฅrบุฤฤ้้้*งฉKใแร‡€jีช:ภภ@ๅจฆLLLะธqc4kึL_๐ฺตk€ผผ<์ูณปwGบuฅrตjีBฟ~p๔่Qคฆฆชด5dศhjjJร{๗๎Err2๚๖ํ+9}๐เ455ัฌY3๚H๊qjืฎญvฃKร† ‰‰‰x๗qๅส\ธpA:ล๛ข{๗๎ฝTŸŸwๅส!ะ AƒBงkkkซ ืฉS:::Eึ'„เ %Ti0Qฅีฏ_? 2w๎AงN`bb๒าuดmp๘๐a)๎ุฑ666ฐทท—ส™™™AฉTb๗๎ุนs'v๎‰ๅห—ใใ?ฦŠ+Šฌ฿ิิภr/zˆ]iฦ,KCOOOe8??ภณ๋ํ,,,ิสฟx]eiฬ;มมมุฒe ๖์ูƒฯ?3fฬภ‰'TndyU๙๙๙prrยผy๓ b~ูบ v๎Y่๚๑ฆ ื็‹’““QฃFW๎ัฤ@HD•V=0t่Pœ8q๋ึญ{ฅ:rssOž<‘ฦm฿พjeuttะฅKt้า๙๙๙>|8"""๐อ7฿ ~๚…ึ{๏AOOืฏ_ฅฅfอšะืืวฅK—ิฆ]ผx%†ฃz๕๊xvŸ?r๚บœœœเไไ„ษ“'ใ๘๑ใ๐๖๖Fxx8ฆM›V์|IIIjรน|๙2€g7๔966mถ-๑่[Qำ‹_ฏ^=!`kk+™|U๗ฒณณัธqใืช‡่mแ5„DTi`ษ’% {ๅg๕ื_ภปwqๆฬ•ำลภฟฐ€††œ@ๅq'/าึึ†‡‡ขฃฃ_ฉEัิิD๛๖ํฑeห•ป๏ฝ‹ีซWฃE‹%ž๒ํะกŒŒŒ๐๗฿#''Gm๚๛๗_ชOฉฉฉRภ.เไไ bืQ\DDDHรูููˆˆˆ@อš5ฅปv{๗๎๛ฟ๒‹ฺOŸ>Ezzบ4\ตjีB๏n.œ/N๛๐รกฉฉ‰ฉSงช‰Bจํล)ธๆฑy๓ๆฅž‡จ<๑!UjE/#…น|๙2~wฯ"|โฤ ฌXฑ๕๋ืGPP€gง‹ซTฉข๒อ›7cฤˆ€aร†aห–-ธ}๛6<<<0dศฤฤฤVVVRSSU^DDD๔nชฐเ:9###ภำงOฑgฯ 0@ญlHHBBBา้เใวฃOŸ>P(pssCฃF m๋๘๑ใ๘่ฃธpแ€gง€{๔่'''„††"!!ภณ ้่่ˆZตjแนs๘้งŸเเเ R_ม5~}๛๖-ฑโ๘๛๛รศศFFF๐๓๓รฉSงTฆ๏ปกกกpuuล|€{๗๎!77`ccƒiำฆ!!!hูฒ%ๆฮ[d[3fฬ€ฑฑฑ๔ฒฒฒ*ฑDDDT9UŠ@๘"ฅR‰„„ฺฺุขE‹8{๖,บvํZโ| …ขะ๗ฅ1eส|๘แ‡ˆวส•+ฅSฮํฺตร?€UซVกo฿พุฑc๒๓๓ mท4mjjjJ๓ดQT_ฌO;wBฉTBฉTโึญ[ะาา’ฆ9rฤฌYณ0qโD)fย„ HII‘^ทn*ฑ๏DDDT9UŠ@ุฆMฌ]ปV:m้ๅๅ…ทo#11G…››ถnZlอ›7ว๚๕๋ฑฑฑธx๑"ภะะiii*ๅึญ[ุตk์ํํฉฉฉจUซ€gw022ยจQฃ‹1cฦ`ีชUฐณณร๏ฟฎV_มฟลตcmm ฅR jหดs็Nคฅฅ!-- ๛๗๏‡งงงสt???,ZดH.8-พgฯ8::โ‡~@฿พ}qyLš4 ๆๆๆEฎ/]]]้hdม‹ˆˆˆM•":::bไศ‘hผ9\\\๐๓ฯ?Yถจk{๖์ ccc4nำฆMƒณณ3ภิิฮฮฮpvvฦœ9s0rไH$%%มูู฿}๗ฐพ๒K|๖ูghาค mปeห–XตjNœ8!=^&447n„“““ส5Eต๓แ‡โ๒ๅหpvvฦนs็T๊wwwGงNเ๎๎Ž1cฦ vํฺ*ำงL™"ีioo/.755ลฎ]ปฐeห๘๛๛CCฃRlv"""zKBQ Š/55ฦฦฦpŸผ๙:…โgพi๓–z%o999ุฑcกญญ]กรํR๑p›TL.oGม๏wJJJฑg๛xจˆˆˆˆHๆ‰ˆˆˆdށˆˆˆHๆ‰ˆˆˆdށˆˆˆHๆ‰ˆˆˆdށˆˆˆHๆ‰ˆˆˆdށˆˆˆHๆ‰ˆˆˆdށˆˆˆHๆ‰ˆˆˆdށˆˆˆHๆ‰ˆˆˆdNซผ;@•ห๎ั055-๏nQโB""""™c $"""’9B""""™ใ5„๔R&ํบ-{ล–Yุฃ๑[๊ •!$"""’9B""""™c $"""’9B""""™c $"""’9B""""™c $"""’9B""""™c $"""’9B""""™c $"""’9B""""™c $"""’9B""""™c $"""’นw"เ๗฿ๅ๙ฃขข]†=*Zxx8ยยย^iVญZแโล‹jใƒƒƒฑkืฎื์ษUฅ„{๗๎…ฆฆๆkี๑&aNNาำำหดฮื๑๘๑ใ๒๎UP•*๒ห/prr‚‹‹ BCC‘““ƒ๏ฟ“'O.ีkืฎE@@ &&žžžธu๋ยรร1}๚tธบบโาฅK8}๚4<<<เไไ„aร†!// OOO8::bโฤ‰…ถ‘˜˜ˆ‰'ขQฃFธ|๙2`ห–-hุฐ!š6mŠSงNIe‹jวฦฦ™™™€ศศHŒ?^š'""...๐๔๔ฤีซWีฺ?u๊|||ะคI๔๊ี €๎ป# ๛๖ํƒขT๋‹ˆˆˆไกายธธ8,ZดวŽCll,F…y๓ๆaภ€044T)Ž๐๐p@tt4  DNNึฌYƒกC‡b้าฅฐฒฒBHH&MšฅR ;;; 8ˆวฃGฐfอภจQฃp๚๔iฤลล!..ฑฑฑ€ผผย๛1{๖ldeeแ๎ปHHH€‹‹ บw๏Ž๓็ฯใท฿~C‹-T๊ปt้์ํํQงN@ฯž=‘‘‘Ql;ล t๋ึ ร‡Wk+..ญ[ท๐, ถmภณ ูฎ];ดkื๗๏฿ว˜1c`ii‰kืฎกvํฺjํฬ˜1SงN-ถ/DDD๔nจ4๐EJฅ ฐตตEnn.๎฿ฟฎ]ปb๋ึญลฮ—˜˜]]]พ}๛ฅฺหฬฬฤ_|˜˜˜™™aไศ‘ศสส๐,<-^ผŸ|๒ z๔่มƒฃAƒาผ …ขะ๗EัิิD~~>Hm”ฆ.!<==ฑgฯžB๋}๒ไ ึญ[‡eห–กjีชXนr%ฬออ -;aย|๑ลาpjj*ฌฌฌJ์;U>•ๆ”q›6mฐvํZ้ิฅ——n฿พฤฤD=znnn%†มฌฌ, 6 ๛๖ํรญ[ทคเdhhˆดด4€‰‰ 455ฅำมkึฌA‹-™™ TซV =ย_%ี๋่่ˆล‹ใ์ูณhะ ๚๕๋‡ึญ[#11vvvHHH@RRrrrฐiำฆbkkk(•Jไ็็cถm*หฐn:ภถmิŽp6jิืฏ_G||< ==]บฮ๐ห/ฟ„ณณ3.^ผˆ•+Wb฿พ}่ีซW‘7ไ่๊๊ยศศHๅEDDD๏ฆJs„ะัั#GŽD๓ๆอกฉฉ‰=z๙๘–‚๋CBB๐๐p,[ถ ฿~๛-z๔่GGG,]บ]บtมษ“'ัฅK`๕๊ีXปv-~๕W 4YYY๐๖๖F`` 455ัทo_4n–––๐๒๒Rkทjีช:u๊'''t่ะw๏-r‹/ยืื...hึฌฒฒฒ111hัข๊ีซ‡={๖๙็ดhัMš4——.\ธˆŒŒD@@|}}„ƒยษษ ฎฎฎ๐๖๖Vk377›6mB๛๖ํ1rไH@zz:z๔่{{{„„„He๓๓๓1rไH8::ย'Nœฺ?~ผTฮฦฦ™™™€‡ข]ปvฐณณChhhกํ5 žžžpuuล_8rไ7nŒ™3gโฝ{ฅZ๗YYYHMMUyัป้ยธธ8,ZดวŽCll,F…y๓ๆaภ€044T).สŽŽฦเมƒำงOG‡ T*ัฟ„††ข]ปvˆGทn0iาค" BXXbccฑgฯhkknธC‡a๚๕˜:u* VญZุฟ?ฮœ9ƒŸ~๚ 'NTYŽmถa๕๊ี˜7o~๙g(•J์ุฑC*s๋ึ-L™2๖๖๖ุถmพ๖[ฌZต ฐhั"ฺฺุ"!!:u’B์ฦ๑๏ฟ">>‘‘‘.qž8q‘‘‘ˆว๎ปญ2}ูฒeฐตตล้ำงq๘๐aŒ?999๘เƒp่ะ!@ซVญˆจจจbš1cŒฅ—••U‰#""ขส้ย‚kŒŒŒOŸ>ลž={0`ภตฒ!!!าั3,[ถฌะ:?Ž>๚๐ัGแุฑc…–KMMEZZZทn 066††ฦณEํน3455แๆๆ†ฤฤDฯކ 8ŽŽŽ2dคบ:v์(ุๆอ›ใซฏพยย… ฅ#ŽงN‚ญญ-222_UๅšพใวKืu๋ึ ๚๚๚า๘~๚AกPภษษ ๚๚๚ล๑ิฉS:::๘๐รq๔่Q•้{๗๎EDD\]]ัฒeKคฅฅ!)) `nnŽ๑ใวใ๙๓่฿ฟ?z๕๊…ฯ>๛ฌศถ&L˜€””้u๋ึญb๛FDDD•ื[ป†PฉT"!!ถถถhัขฮž=‹ฎ]ปพญๆ%บบบ ้บภ๙๓็รฮฮ๑๑๑ุฟฟ๖Hx’~๙ๅ<~อš5รร‡แ์์ŒฅK—โ่ัฃู่ณ'ึฏ_์์l•6 Eฉ๛งฉฉ‰|i๘๙พ<_BกPซW๏P*•P*•ธy๓&ฌญญฅ้gฯžลˆ#0v์X 4cวŽ-ฒบบบ022Ryัป้ย6mฺ`ํฺตาตg^^^ธ}๛6q๔่Qธนนa๋ึญลึahhˆดด4iธy๓ๆXทn`๕๊ีhัขEก๓มุุ๐์ฆŠ็Cึ‹RSSaaa…Bศศศ"ห]ปv ฎฎฎ๘ๆ›o`ccƒ[ทnกJ•*๘ไ“Opโฤ ฬ™3@ฃF0w๎\ต>oถ า๘ 6@๓็ฯใ้ำง077‡ตต5bcc<;๚๘Qร#GŽ )) 999ุดi“ฺuŒ~~~Xฒd‰ดฌJฅpๆฬxzzb์ุฑ๐๕๕ลนs็0sๆLุุุนฌDDD$o,:::bไศ‘hผ9\\\๐๓ฯ?Yถจk๑๔้S้ฆ’ฐฐ0์ุฑฮฮฮุดiฆM›Vdฟ๖BCCแโโ‚Ž;"''งศฒ!!!Xธp!\]]U่‹ๆอ›8;;ฃQฃFpqqQ™๎๊๊Š๐๐pฤลลมีี0bฤ\ฝzุพ};ฬออ<{๔Žนน9œœœ„ๅห—Zดhุใ๛Ÿสต{อš5Cpp0ัพ}{xxxจด?t่P˜››รลล๘๖o<;สนjี*8p}๚๔ŽŽN‘หHDDD๒ฃ| •Bjj*Œฑh,๔ MŠ-;ะ๓ฝทำ)™หษษมŽ;เ๏๏/4Eๅฅโแ6ฉ˜ธ]Ž‚฿๏”””b/โTBDDD$s•>NŸ>ฎฎฎ*ฏŠ๒0k"""ขส@ซผ;๐บ&MšT์๓‰ˆˆˆจx•!ฝB""""™c $"""’9B""""™c $"""’9B""""™c $"""’9B""""™c $"""’9B""""™ซ๔uฝ]}\๊ภิิดผปADDDeˆG‰ˆˆˆdށˆˆˆHๆ‰ˆˆˆdށˆˆˆHๆxS ฝ”˜ฤT>ึ,๏n€ผ\ภฉk)ะะไGนขเvฉxธM*&n—ฯซพIywG‰ˆˆˆไށˆˆˆHๆ‰ˆˆˆdށˆˆˆHๆ‰ˆˆˆdށˆˆˆHๆ‰ˆˆˆdށˆˆˆHๆ‰ˆˆˆdށˆˆˆHๆ‰ˆˆˆdށˆˆˆHๆ‰ˆˆˆdށˆˆˆHๆ‰ˆˆˆd๎ยไไd,[ถฌศ้%ึ‰”YŸJำๆ›ŽฐฐฐWšทUซVธx๑ขฺ๘เเ`์ฺต๋5{FDDDrVnฐ4ส:พŽผผผR—อษษAzz๚์อหy๘qywˆˆˆ*ฐ2 „III๐๖๖†ซซ+œ1v์XฤววรีีsๆฬAzz:z๔่{{{„„„”X฿ๆอ›=zภววฐ|๙r8::ยััK—.-vฉSงยััฮฮฮˆˆˆฦ5 ่ึญ›๒BCCแ้้ GGGLœ8Q*kccƒ &ภีีGลG}899a๕๊ีjm&&&bโฤ‰hิจ._พ ุฒe 6lˆฆM›โิฉSRูำงOรรรNNN6l˜ิdffxˆว/อxzzโ๊ีซjํŸ:u >>>hาค z๕๊…ŒŒ @๗๎€}๛๖AQ์z+••…ิิT•ฝ›ส,ฎYณ~~~P*•ˆ‰‰มดiำเไไฅR‰qใฦaัขEฐตตEBB:u๊„ปw๏J๓บบบJ๏,AlผGŽมฟ‹้ำงใ่ัฃ๘๛๏ฟ1o<$&&ฺ—mถแุฑc8sๆ โโโะซW/ภปwัณgOœ?๙๙๙8pเ€g!๑๔้ำˆ‹‹C\\bccฅบlll T*a``€[ทnแ๙๓ˆG็ฮ<;rธu๋V๘๛๛ใร?D:upๆฬธนนแ้ำง5j<ˆฃGโ๙๓RฝDDDโใใ๑่ั#ฌYณฆฤuฌP(‹ษ“'c๔่ั*ำฒณณ1n8lบgฮœAำฆMฑx๑b@TT†Šˆˆ8::โ‡~(๑ศ๋Œ3`ll,ฝฌฌฌJ์UNe===ฑrๅJL:Wฎ\žžžส๔ใว#00ะญ[7่๋๋Kำ”Jฅ๔~ูฒe๐๐๐Pซ?::ํท‡‰‰ แ๏๏“'Oฺ—เ“O>ŽŽ z๕๊ดlูเๆๆ&ส๛๗รำำฎฎฎ8}๚4คบ ยdบuq๓ๆM|๖ูgุฟ?Œ<;๚6z๔hLœ8gฮœมˆ#คi—.]‚ฝฝ=๊ิฉ๔์ูภณำ้๙๙๙pww๔๏฿วŽ+iซฌฟณgฯชLปt้โโโะบukธบบb๙๒ๅธqใ€gAฒ]ปvุฐaขขข T*aii‰คคค"š0aRRRคืญ[ทJ์UNe[ถl‰ร‡รฬฬ ={๖ฤ๛ีส(Šฒj๎•่๊๊J๏544——‡ฬฬL|๑ลุพ}ปt41++K*W\ซUซ†ธธ8ดhัณfอ’n™1c:v์ˆO>๙_5ฎ\นขาๆ๓ห\šๅืิิD~~>จ๔ฃคบ„๐๔๔„Rฉ„RฉDBB,X M๒ไ ๗ฟกkืฎธs็Vฎ\ ss๓"๛กซซ ###•ฝ›ส,ธqตjียฐaรˆไไdคฅฅIำ›7oŽu๋ึxvJทเ๚ถโJuxzzbHMMล“'Oฐs็N4kึฌะ๙๐๋ฏฟ";;๐่ัฃ"ศฬฬ„††ชUซ†Gแฏฟ*ดƒ „@Ÿ>}0iา$้จฆฃฃ#/^ŒณgฯขAƒ่ืฏZทnฤฤDุูู!!!IIIศษษมฆM›<;Rฉฉฉ)š^ณf Zดhฐถถ†RฉD~~>ถmฆา‡็ืŸ›››สดFแ๚๕๋ˆคงงKื~๙ๅ—pvvฦล‹ฑrๅJ์ทฝz๕‚ฆฆf‘๋…ˆˆˆไCซฌ*ŠŠŠย์ูณกฃฃSSSฌ]ปัััpvvFPPFŒ๛รมม-[ถT9:ๅ๊๊*ฌมƒ#$$FPPjึฌ‰#GŽเ๋ฏฟF๓ๆอcฦŒMก}๑๗๗Gtt4 ฅฅ…‘#Gbศ!…–511A฿พ}ัธqcXZZยหหซะr๛/!ดดดฐpแB•้UซVลเมƒ1x๐`ฤฤฤ@KK zzz๘๑วับuk˜˜˜ภมมA*๋ฏฟbะ Aศสส‚ทททt:x๒ไษ๘๘ใQฃF ธธธจด‘——่่่จ]sจฃฃƒีซW#$$Ož<ณgฯF๚๕แ็็‡๏ฟ^:…NDDD๔<…(ํmง$kฉฉฉ066ฦ๎่k04ฎV!๙yนxp๑j4๒††f™mGฏ‰ฅโแ6ฉ˜ธ]?ฏ๚&oฌ๎‚฿๏”””b/โTBDDD$s•:’?|๘mถUWฃF ์ทฏœzDDDDT๙T๊@hjjช๒ศ""""zy|x‰๋๙๔้ำุฑcขฃฃ1w๎\$%%ฉLŸ6mz๖์‰ำงOc๓ๆอ1b`ุฐaุฒe n฿พ  2111ลถ5cฦ K/++ซ๛GDDD•S™BOOOฌ\นSงNล•+W งงง2๘๑ใาunบuƒพพพ4MฉTJ๏—-[ต๚ฃฃฃัพ}{˜˜˜ภะะ8y๒dก}๑๒๒ยœ9s0{๖lฟ_-ผ่ฝ;ดตต ึตkW€›››ภฝ{๗›› ฐฑฑมดiำoooดlูฒะ0\`ย„ HII‘^GJ‰ˆˆ่S&ฐeห–8|๘0ฬฬฬะณgO์฿ฟ_ญŒBก(‹ฆJิฏ_?lูฒZZZhบu‘A๋๙P๚"]]]€††๒๒๒BˆBหถkื?๐VญZ…พ}๛bวŽศฯฯW)Sฐ์ฅYšššาYYY…ึS๐ล๚„ุนs'”J%”J%nบฅˆ9‚bึฌY˜8qขH ฃซซ+…ฯ‚ฝ›ส$ธqตjียฐaรˆไไdคฅฅIำ›7oŽu๋ึถm†ŒŒŒ๋444”๊๐๔๔ฤ๛‘ššŠ'Ož`็ฮhึฌYก๓]ฟ~๕๋ืว_|___\บtIฅฎWๅโโ‚;v6lุ 722ยจQฃ‹1cฦ`ีชUฐณณร๏ฟฎถ์พ8~ืฎ]ฐททX[[KGMทnชา‡;w"-- iiiุฟ?<==Uฆ๛๙๙aัขEาpll,`ฯž=pttฤ?€พ}๛โ๙๓˜4iฬออ_kัปกLaTTœแๆๆ†#GŽ`ภ€pvv†ณณ3ๆฬ™ƒ#Fเ๊ีซpppภ๖ํU‚Haื@pp0‚‚‚เใใƒ:u๊เ๋ฏฟF๓ๆอ๑๛๏cฬ˜1E>พeํฺตptt„ซซ+าาาะฑcG8;;ใ้ำงาM%ฏโวฤ7฿|WWWn—Їคbโvy; ~ฟSRRŠฝซ๐;.Hอษ“'1fฬไๅๅมึึฟ๖[yw‰ˆˆˆจLTฺ@๘๐แCดmVe\5ฐo฿พ7า^๋ึญU๎ˆ&"""zWTฺ@hjjส€FDDDTxw‘ฬ1ษ!‘ฬ1ษ!‘ฬ1ษ!‘ฬ1ษ!‘ฬ1ษ\ฅฏ๋จ|˜…_‚ฉฉiywƒˆˆˆสษ!‘ฬ1ษ!‘ฬ๑ฆz)๙K?DพnKฯง๑ล‘7ะ"""* ๖ํWlนแูณgadd„ณgฯขu๋ึ…ฮ“‘‘์์์2ํ๏๋x๘qywˆˆˆ*จw&&%%มฎฎฎpvvฦล‹แๆๆ†ž={ขqใฦ๘๔ำO‘ŸŸ077วฐaรเไไ„[ทnมยย…: K—.hะ ฆOŸ˜4iโใใแ๊๊Š9sๆ ((‡‚ซซ+>|จา๓็ฯใณฯ>ƒƒƒƒย–,Y‚† ยวว๓TvวŽpvv†ฃฃ#ยยยค๑€ฐฐ0„‡‡KรกกกpttD›6mp}ต๕ฐ}๛vผ๛puuEHHˆดฬ8p Nž<๙:ซ™ˆˆˆA๏L \ณf  T*!โโโ๐อ7฿ !!<ภฆM›๗๎C๗๎q๎9X[[ซิs๖์YDFF"66แแแHOOว๔้ำแไไฅR‰qใฦaูฒe่ะก”J%LMM‘••…UซVกeห– งง'.\ธsss๗฿๘๑วํทใ๔้ำ€งOŸb๘๐แุพ};ฮž=‹ฝ{๗โ่ัฃ%.g:up๎9t๋ึ SงNU™๖เมฬŸ?QQQP*•ะิิ”–๙าฅKฺ่ต+ยยยเแแˆˆ}p์ุ1ดhัขุถ}๛๖E๛๖ํUฆ๗฿ˆ‹‹ร๛๏ฟเY่,ผZZZ่ัฃz๔่7n`ศ!๘๒ห/‘––Vh;3fฬP œDDD๔nzgŽถlู‡†™™z๖์‰๛๗CกPHำ …4ฌฏฏ_d=บบบา{ ไๅๅ•ุ๖าฅKแเเ€^ฝzaฺดi๘๏ฟTฆฟุ’<_&++ซะiฯ/O!บu๋ฅR ฅR‰K—.แซฏพ’ฆ?|๘๓็ฯGืฎ]QตjUlุฐกศ>L˜0)))า๋ึญ[%๖›ˆˆˆ*งw&ธqตjียฐaรˆดด4\ผxqqqB`๚๕%}+Šกกa‘Gาภหห ฟ๖Ž;†ชUซขC‡ฺ่ต+RRRเ้้‰}๛๖!-- iiiุนs'ภฮฮ.\@RRrssฑaรx{{ชVญŠYYYุณgJ[๋ึญ“}qy}์฿ฟ๛/€gฐเ}ฟ~เๅๅ…ิิT์น›7oFวŽ‹\&]]]ฉผˆˆˆ่๔ฮœ2ŽŠŠย์ูณกฃฃSSSฬœ9ฮฮฮ˜:u*ฮŸ?–-[ขGฏTทฉฉ)œแ์์Œ   xzzZฎz๕๊3f ฦŒƒจจ(ฯฎ๙=z4ann€žž-Z„N:!//Rภ›:u*|}}aii ;;;•6๗_899กFXฟ~ฝส4333,ZดบuCNNดตต๑ห/ฟภาา๚๕ร๏ฟ wๆo"""*# !„(๏Nผ ‰‰‰ ฤ‰'สป+๏„ิิTใ๗-aช›า๓k|qไ ๔Jrrrฐcว๘๛๛—x+ฝ=.ทIลฤํ๒v~งคค{ถ‡‹ˆˆˆˆd๎ „666<:HDDDT ๏l $"""ขาa $"""’9B""""™c $"""’9B""""™c $"""’9B""""™c $"""’9B""""™c $"""’9B""""™c $"""’9ญ๒๎U.Ÿn‚†ฉiywƒˆˆˆสษ!‘ฬ1ษ!ฝ”]“ฟydywƒˆˆˆส!‘ฬ1ษ!‘ฬ1ษ!‘ฬ1ษ!‘ฬ1ษ!‘ฬ1ษ!‘ฬ1ษ!‘ฬ1ษ!‘ฬ•i LNNฦฒeหสฒสwJxx8ยยย^iVญZแโล‹jใƒƒƒฑkืฎื์ษู[ „yyyeูTฉ•Gป999HOO๋ํๅ๑ใวๅ"""ชภJ“’’เํํ WWW8;;ใ๘๑ใ*ร/^ฤคI“WWWฬ™3‘‘‘€ฏฏ/‚‚‚p๗๎]t๋ึ ๐๑๑มๅห—<;rๆ้้ ggg 8๙๙๙ž;v,เ้้‰่่hดmu๋ึล๖ํ‹์kXX///|๕ีWธrๅ ฺตkwwwt์ุw๏ุุุ 33‰๑ใวฦ‡Fมลลsๆฬ€"๋x^bb"&NœˆFIหถeห4lุM›6ลฉSงคฒงOŸ†‡‡œœœ0lุ0)ธี'ˆˆˆ€‹‹ <==q๕๊Uต๖O:4iาฝz๕BFF {๗๎ภพ}๛ „(q[@VVRSSU^DDD๔n*u \ณf  T*ƒƒช [[[c๚๔้prr‚RฉฤธqใqqqุถmVฏ^1cฦ 44ััั˜7oพ๘โ @๏ฝq๚๔iฤลลAOO๕—ิฎฉฉ)ฮž=‹-Z`ไศ‘ุพ};๓OL›6ญุ๓ฯ?8|๘0ๆฮ‹#F`ูฒeˆ‰‰ม Aƒ๐w฿9฿ร‡ฑqใF$$$ 66Ÿ~๚)YG^^ถn |๘แ‡จSงฮœ9777<}๚ฃFยมƒq๔่Qœ?^jgเภˆˆˆ@||<=z„5kึ”ธ  bcc1y๒dŒ=ZeZvv6ฦ‡ญ[ทโฬ™3hฺด)/^ ˆŠŠยะกCGGG๐รx๐เAฑmอ˜1ฦฦฦาหสสชฤQๅคUฺ‚žžž†††z๕๊•a{{๛B็ุ๋ฑ# @BB‚4MSSค“ššŠไไdXYYก[ทn€>๘เไไ…B*Uชภัั7o,ถฟปw‡ถถ6าาาp์ุ1ฉพผผ<ิซWฏศ๙Œa``€มƒฃ{๗๎่นsฑut๏็ฯŸวoฟ†-Zจิu้า%ุฃN:€ž={"##ษษษศฯฯ‡ปป; ุนs'>๚่ฃb—)00ะญ[7 >\ญญธธ8ดnภณ€ุถm[ฯ‚dปvํะฎ];ฟcฦŒฅฅ%ฎ]ป†ฺตkฺึ„ คภฉฉฉ …DDD๏จRย–-[โ๐แร๘๋ฏฟะณgO,\ธPmธฐ ฅฏฏ/ฝW(8sๆ 44TL2;w๎Dƒ ๐ร?เษ“'า4€†††ส๛’ฎ ,h7??u๊ิRฉT+ฃฉฉ)žฮสสhii!::ปw๏ฦชUซฐiำ&๔ำOEึ1cฦ ,^ผŸ|๒ z๔่มƒฃAƒ*ห\ุ๛ขึงาิ%„€งง'๖์ูShฝOž<มบu๋ฐlู2TญZ+Wฎ„นนy‘ะีี…ฎฎn‰%""ขสฏิงŒoธZตjaุฐa ฤัฃGU†ใใใahhˆดดด"๋๐๑๑‘n:ษฯฯG||< ==5kึDff&ึญ[๗š‹คสุุีชU“‚RNN.\ธฐถถ†RฉD~~>ถmเYpJIIAืฎ]1{๖l(•สb๋pttฤโล‹q๖์Y4hะ๚๕C๋ึญ‘˜˜;;;$$$ )) 999ุดiภฤฤšššˆ๐์t|มัลย๚T `lถ nnn*ำ5j„๋ืฏซฌำ‚๋ ฟ๒K้:ฯ•+Wb฿พ}่ีซ—t„–ˆˆˆไญิGฃขข0{๖l่่่ภิิAAApvv–†ืฎ] SSS8;;รููAAAจYณฆJ ,@HH-Z„œœ|๑วprrยคI“ะคI˜››ซฒฐjี* 6 ใฦCnn.ฦ‡ฦc๒ไษ๘๘ใQฃF ธธธาาาะตkWdggCกPHื UGชUซb๐เม>>ธ|๙2 <<žžžpvvฦภ‘ŸŸhีชฦŽ 777xzz"::mถEบuฑ}๛vต>ๆๆๆbำฆMh฿พ=FŽ HOOG=`ooฉl~~>FŽ GGGธปปใฤ‰€ศศHŒ?^*gccƒฬฬLภร‡ัฎ];ุูู!44ดะ๖GOOOธบบโฏฟ9r7ฦฬ™3q๏ฝฒุDDD๔ฉ4pอš5๐๓๓ƒRฉDLL <จ2lmm้ำงรษษ JฅใฦฤลลaถmXฝz5ฦŒƒะะPDGGcผy๘โ‹/ฝ{๗ฦ้ำง===)H€ฉฉ)ฮž=‹-Z`ไศ‘ุพ};๓OL›6M*s๋ึ-L™2๖๖๖ุถmพ๖[ฌZต ฐhั"ฺฺุ"!!:uยปw7nฤฟ‹๘๘xDFF"88ธฤupโฤ DFF">>ปw๏Fttดส๔eห–มึึงOŸฦแร‡1~xไไไเƒ>ภกC‡< นˆŠŠ*ถญฌฌ,คฆฆชผˆˆˆ่คU(-OOOCCCฝz๕‚สฐฝฝ}ก๓u์ุ†††€ !!Ašฆฉฉ ˆลไษ“‘ššŠไไdXYYก[ทn€>๘เไไ…B*Uชภัั7oœ:u อ›7ว่ัฃ ###•๖?މ'บu๋}}}i|ฟ~ P(เไไ}}}),ลววu๊ิ|๘แ‡8z๔(บw๏.M฿ปw/ HKKCRRฌญญannŽ๑ใวใ๋ฏฟฦถmะซW/bม‚…ถ5cฦ L:ตุัปกา!lูฒ%> 333๔์ู999*ร๛๗๏/tพ‚ …gฮœRฉ”Ž,ภ!Cค#oฃFBVV–4ŽŽ@CCCๅ}ม5‰ฮฮฮXบt)Ž=Šž={b๚๕ศฮฮV้ƒBก(๕rjjjJงฌจ๔ๅ๙z …ZฝB๏“–๏ๆอ›ฐถถ–ฆŸ={#FŒภุฑc1hะ Œ;ถศ~L˜0)))า๋ึญ[ฅ^"""ช\*M ผqใjีช…aร†!00GUŽ‡กก!าาาŠฌรววGบ้$??๑๑๑ž]็WณfMdffbบu/ีฏ*Uชเ“O>ม‰'0gฮ8p5ยนsอ›7—๊ถm222ค๑6l€็ฯŸวำงOannkkkฤฦฦxv๔๑๙ฃ†GŽARRrrrฐiำ&x{{ซ๔ลฯฯK–,‘ฅRฉœ9sžžž;v,|}}q๎9ฬœ9666E.—ฎฎ.ŒŒŒT^DDD๔nช4งŒฃขข0{๖l่่่ภิิAAApvv–†ืฎ] SSS8;;รููAAAจYณฆJ ,@HH-Z„œœ|๑วprrยคI“ะคI˜››รออํ•๛่๊๊Š๐๐p '''่่่`๙๒ๅ€-Zภภภ๖๖๖๐๑๑•••TณfอŒ7n 00HLL”ฆ:ืฎ]ƒ‹‹ ๒๓๓agg‡M›6A__ซVญBร† _yูˆˆˆ่ฅ| •Bjj*Œ๑เม˜šš–ww@NNv์ุhkk—ww่pปT<&ทหQ๐๛’’R์ูพJsส˜ˆˆˆˆ B""""™c $"""’9B""""™c $"""’9B""""™c $"""’9B""""™c $"""’9B""""™c $"""’9B""""™c $"""’9B""""™c $"""’9B""""™c $"""’9B""""™c $"""’9B""""™c $"""’9B""""™c $"""’9B""""™c $"""’9B""""™c $"""’9B""""™c $"""’9B""""™ำ*๏Pๅ „คฅฅA[[ปœ{C““ƒŒŒ คฆฆr›T .ทIลฤํ๒vคฆฆ๘ฟใEa คRy๘๐!ภึึถœ{BDDD/+-- ฦฦฦENg คRฉ^ฝ:เๆอ›ล๎P/รำำงOŸ.“บD}oขฮฒฌ/55VVVธu๋ŒŒŒสคN b/๓›จฏฌ๋|ฅข/sEฏŸ•ฒSัทKE_ๆ๒จOดด4ิฎ]ปุzฉT44ž]njll\f\MMอ2r.๋๚DoขFFFบฝพ7UgYn—สฐฬฝ>€Ÿ•ŠZ'?+oพพาศแM%TnFŒQก๋{uพ‰>–ตŠพฬ•a;—ตสฐฬฝพ7กข/seุoสZeXๆŠZŸB”t•!žฺ766FJJJ™๕Eฏ†คbโvฉxธM*&n—Š…GฉTtuu ]]๒๎ n“Љฅโแ6ฉ˜ธ]*!$"""’9!$"""’9B""""™c $"""’9B*ัขE‹`ccƒ*Uช Yณf8u๊Tyw้…Bก๒jิจ‘4=33#FŒ€ฉฉ) ะณgOฝ{WฅŽ›7oขs็ฮะืื‡™™ฦ‡ทฝ(•ฺแร‡ัฅKิฎ] …๙งสt!ฆL™‚ZตjAOO~~~ธrๅŠJ™Gก022‚‰‰  „'Ožจ”‰‹‹ƒชTฉ+++ฬž=๛M/ZฅUา6 V๛์t์ุQฅ ทIูš1c<==ahh333t๏—.]R)SV฿YQQQhาค tuuQฟ~}DFFพ้ล“B*ึบu๋๐ล_ 44gฮœ‹‹ :t่€{๗๎•wืYธ}๛ถ๔:z๔จ4mฬ˜1๘๋ฏฟฐaร:tIII๘๐รฅ้yyy่น3ฒณณq๘qฌXฑ‘‘‘˜2eJy,Jฅ•žž,Zดจะ้ณgฯฦฯ?Œ๐๐pœ๔Sizjj*ฺทokkkฤฤฤ`ฮœ9 ราฅK฿๘๒UF%mุ่ฑฃสggอš5*ำนMสึกC‡0bฤœ8q{๗๎ENNฺทo๔๔tฉLY|g]ฟ~;wF๋ึญกT*1z๔h <ปw๏~ซห๛ฮDลhฺดฉ1b„4œ——'jืฎ-fฬ˜QŽฝzw…†† —Bง%'' mmmฑaรi… ๑๗฿ !„ุฑc‡ะะะw๎‘ส,YฒD‰ฌฌฌ7ฺ๗wฑy๓fi8??_XXXˆ9sๆHใ’““…ฎฎฎXณfBˆ„„@œ>}Z*ณs็NกP(ฤ'„b๑โลขZตj*ๅ๋ฏฟvvvox‰*ฟท‰B 0@t๋ึญศyธMผ{๗๎ โะกCBˆฒ๛ฮ๚๊ซฏ„ƒƒƒJ[}๚๔:txำ‹$+”ฆq›ผy)))€๊ีซ(ป๏ฌฟ[ฅŽ‚2*[ „Tค //Oๅƒ ๆๆๆธs็N9๕๊ึฌY3DFFbืฎ]Xฒd ฎ_ฟคฅฅแฮ;ะัั‰‰‰ส<ฯo;w๎บฝ ฆั๋+Xล}.๎น333•้ZZZจ^ฝ:ทีาฑcG๖oุฟ?fอš…C‡กSงNศหหภm๒ฆๅ็็c๔่ั๐๖๖†ฃฃ#”ูwVQeRSS๑๔้ำ7ฑ8ฒคU ขฏSงNา{ggg4kึ ึึึXฟ~=๔๔๔สฑgD[`` ๔ษษ ฮฮฮจWฏขขขะถmr์™<Œ1็ฮSนๆ™*!ค"ีจQšššjw„ฝ{ๅิ+y111Aร† q๕๊UXXX ;;ษษษ*ež฿…nฏ‚i๔๚ ึcqŸ ตฏrss๑่ั#nซทคnบจQฃฎ^ฝ €ไM9r$ถm†ƒยาาR_V฿YE•122โสeˆŠคฃฃwww์฿ฟ_—ŸŸ๛๗รหหซ{&Ož<ม?ƒZตjมฺฺฺ*ใาฅKธy๓ฆด=ผผผฏ๒รทw๏^มญ๗]dkk •ํššŠ“'Oชl‡ไไdฤฤฤHe8€|4kึL*s๘๐aไไไHe๖๎ ;;;TซVํ--อป๋฿ลร‡QซV-&o‚#GŽฤๆอ›qเภฺฺุชL/ซ๏,///•: ส๐wจŒ•๗]-Tฑญ]ปV่๊๊ŠศศH‘ >๔SabbขrG•ฑcวŠจจ(q๚uq์ุ1แ็็'jิจ!๎ป'„"$$Dผ๗{โภ"::Zxyy ///i\แ่่(ฺทo/”Jฅุตk—จYณฆ˜0aBy-Rฅ”––&ฮž=+ฮž=+ˆy๓ๆ‰ณgฯŠ7n!„˜9sฆ011[ถlqqqข[ทnยึึV<}๚TชฃcวŽยออMœโ๊ีซา๔งOŸŠแร‡‹jีช }}}ัฃGq๛๖m•:EงN„žžžจQฃ†;vฌศษษy‹Rฉsdee"##ับuk :ฦฦฦXพ|9=z„~๚มฬฬ u๋ึลŠ+Š\ฦ็Onถ vvvาQำตkื9฿๑ใวัฐaC˜ššโห/ฟD~~พ4mัขEhะ jิจ ==yyy่ิฉฎ]ป`ลŠXตjพ๛๎;Hห–-[ขZตjpwwGttดTทBกภย… akk‹ึญ[Zถl‰๛๗ห* •Š ""ึึึ"**JXZZŠ{๗๎‰{๗๎ KKKq๔่QammญR๎ศ‘#B!RRRD—.]Dhhจ4=55UXXXˆผผ<ฑdษัฅK‘‘‘!rrrฤแร‡ m{ถmย]ญ?พพพโแร‡โย… BWWWดkืNผySพ}[˜››‹!„Xบtฉฐทททn<อ›7—๚ด|๙rกฉฉ)–/_.๒๒๒DFF†๐๗๗cวŽ™™™โย… ขVญZ"66ถศ๕Rฐผๆๆๆโ่ัฃB!n฿พ-ฮŸ?_ไ<ฎฎฎโ๖ํโฟ๖๖๖bูฒeB!ึฏ_/Ebbขศศศ}๛๖cวŽBq๐เAQฏ^=•บ  พ๛๎;i8--Mิฎ][lธQไๆๆŠอ›7 +++๑๔้S!„Dืฎ]EJJŠศศศๆ322/^,ดฟDrล#„DD…ะิิD@@ึญ[‡u๋ึกgฯžะิิT+ืฉS'˜˜˜ Zตjธ|๙2† &Mฟ?|}}กกกmmm<|๘ืฎ]ƒ––V‘G“““ ฝv๐๓ฯ?G๕๊ีัจQ#ธธธ cวŽฐฒฒ‚……|}} Xปv-พ๒KXZZยิิSฆLมš5kคz๊ีซ‡เเ`hhh %%QQQ˜1ctuuัจQ#๔๋ื›6m*qhkkใย… x๒ไ ,,,`oo_dูQฃFมยยตkืฦ˜1cฐn:ฯNO˜0ึึึะำำรฤ‰ฑqใฦ.ฐm6888Hฆ{๗๎033ร‰'ค2ใว‡‘‘๔๔๔คq†††HII)u;Drภ@HDT„๛c๕๊ีXตjU‘ง‹w๎‰ไไdddd {๗๎่นณ4ํ๙๋ƒ‚‚ะถm[๔่ัึึึ˜1cFก๕zwฑ™™™๔^OOOmธ`žคค$ผ๗{า4kkk$%%Iร–––า๛›7o"335kึ„‰‰ LLL;w๎ป^`ใฦุผy3,--ัฑcGตSๅฯณฒฒRy๛๖mฉกC‡Jmทhั๗๏฿/ฑํ็๛่ะ!i~\ธpกศๅ-––ccใRทC$ „DDE๐๐๐ภฃG๐๘๑cxzz[VWWAAAˆ‰‰มƒ<ปแคC‡|๛ํทธ|๙2v๏Ÿ~๚ QQQj๕899แŸyๅ>ืฎ]7o”†oผ‰ฺตkKร …Bz_งNเ๑ใวHNNFrr2าาา^b;อš5ร๖ํq๗๎]ธธธจ}ัญ[ทTœSงNฌXฑBj;99Yบณ๛๙~ึ๗‚๙;t่ 6ฟ~Šœ็ฮ;ศออEฝz๕J\F"9a $"*ฦฆM›Ju 5''ซWฏ†™™LMMq๑โEIแ็เมƒ8<๒๓๓add--ญBOA[[[รยย๑๑๑ฏิ฿>}๚`๎น๘๏ฟ๐่ั#|๗w ,ดl:uเๅๅ…ษ“'###นนน8sๆ Šm#;;ซWฏFjj*ดตตa``P่ฒXฐ`๎ฝ‹ทoc๙่ป7เ“O>ม๗฿/เทocืฎ]žฝพสฃฬฬฬ˜˜( ๐ม8{๖,๓Oไๆๆโ้ำงุตkWฑงƒ>Œ6mฺ@KKซุe$’B"ขbุ{}\๛๖ํa``€5jเเมƒ๘๓ฯ?กP(ิ7s๛๖mt๏FFF๐๔๔ฤะกC‹ผŽpะ A*ืฝŒAƒกGhฺด)์ํํแโโ‚ &Y~ีชU๘๗฿Qทn]˜™™a๔่ัx๚๔i‰ํฌXฑึึึจVญ๖๎‹… Yถw๏๐๑๑ฃฃ#ฺตk‡xv'๗ AƒะนsgมืืW ฃ7Fทn`eeฯไษ“'abb‚แร‡รุุทoว‚ `ff,]บดุ~ฏYณC† )q๙ˆไF!„ๅ "ขwMวŽ1~xดjี๊ฅ็MOO‡งง'N:UแN]™]นrAAA๘๛๏ฟ =%M$g „DDoภ์ูณ1fฬhkk—wWˆˆJฤ@HDDD$sผ†ˆˆˆHๆ‰ˆˆˆdށˆˆˆHๆ‰ˆˆˆdށˆˆˆHๆ‰ˆˆˆdށˆˆˆHๆ‰ˆˆˆdށˆˆˆHๆไ4P`็p)IENDฎB`‚c4core-bm-charconv-ftoa-mega_bytes_per_second-float.png000066400000000000000000000721731477602032300335560ustar00rootroot00000000000000c4core-0.2.6/doc/img/windows-x86_64-vs2019-Release‰PNG  IHDRดฎ@ด9tEXtSoftwareMatplotlib version3.5.3, https://matplotlib.org/อ+นา pHYsaaจ?งis่IDATxœํyx ็>๐;๛"ซH‚ฒHา’ุ—จญถ$•’ขึ*mUIKดิZีขB}„ฺ—ขญฺI์[ศf ช‚–R!‹์ษy~๘eพŽ,"ยมฏ๋:—œ™gžyฯ<็œfๆL4„DDDD$+š๊.€ˆˆˆˆ^>†@""""b$"""’!†@""""b$"""’!†@""""b$"""’!†@""""b$"""’!†@’ฝAƒมศศHe”+66ุผyณบKฉ”ศศHhhhเฝ{๊.…dขu๋ึpuuUwo DFFชปŒgถjี*4n:::033๐่5าบukตึ๕*b$ตฑcวk๙ACTพ๙ๆlถญาํ/^Œพ}๛ข^ฝzะะะภ AƒสlWส555q๓ๆอR๓333a`` Œ=บŠีำำไไไ 22ฑฑฑ/}วŽCdd$าำำ_๚บ_ถ”” 4 4ภO?„ฅK—พดu?๋{๘UภHjทcวL:Ueฉีณ™5k8hkk?ตฝžžึญ[Wj๚–-[žฅLชขœœL:Um!p๊ิฉฯsss๑ล_ผ˜ข^ุุX(•J|๗4h๚๕๋๗าึอHDฒ•ญ๎^;BไๆๆViูƒโฝ{ุนs'๔๔๔žฺ>((จฬธvํZtํฺตJ5ศ‰RฉD^^žบหxแ฿N}}JใUr๗๎]NSล้…ศออEใฦัธqc•_r๗๏฿‡ Zดhโโb 4‹-๐่๚“’G‰์์l|๒ษ'ฐณณƒžžœ1w๎\!Tึถmยาาzzzhฺด)/^L5๕ื_่ิฉjิจ[[[|๕ีWฅึฃT*1|ธธธ@__VVV6l~๙็R๋MOOวธqใเเเ===ิญ[๏ฝ๗^ฉk๊”J%ฆOŸŽบu๋B__ํฺตรŸฉาฆไฺจคค$ยะะ 6”ฎ'}Tฆ=ห๋b๗๎๐๖๖†–,Y dggcๅส•า{ ผำป%์ํํU+OŠ„„คคคHำ๗_8pกกก•๎งได๑ถmเ๊๊ ===ธธธ`ืฎ]*ํ ‡Rห—์ฒ๚ดiš6m ๘๙๙!99ฐdษ4lุ๚๚๚hบuฉืc‰3gฮ E‹000€ฃฃ#ขขขJตษฯฯว”)SะฐaC่้้มฮฮŸ}๖๒๓๓หฌiอš5pqqžžžด๋ืฏ‡——Œabb77ทRฏลวฅฆฆขvํฺ€ฉSงJc๘e0•yํ–gม‚pqqกก!ฬออแํํตkืxดฟวptt”ึ]ฒ+ฺฮ'kฌ์{x๔;`ฬ˜1จUซŒัฝ{w๓ฯ?ฅ๚ฬสสยุฑcฅฯ?KKKt่ะgฯž•ฺT๖ณยมมSฆLิฎ]๛ฉื4ฝ{ƒ†••๔๕๕แแแ•+W–j7w๎\ดhั000€——Wฉkดซ๒~%ขไฤ‰BKKKŒ7Nš, ฤฅK—„B;vLt่ะAซVญ’BกT*Eถm…†††2dˆXธpก่ึญ› ฦŽซฒ.1hะ ๑w฿‰ ˆŽ; bแย…OญsเภB___899‰ฐฐ0ฑpแB๑๖o โห/ฟTi;dศกญญ-†*ขขขฤ„ D5„(((ฺู gggaee%&Mš$.\(š5k&444ฤนs็คvYYYยีีUhii‰กC‡Šล‹‹ฏฟZ๘๘๘ˆ๘๘x!„111€๐๔๔^^^โป๏พ‘‘‘ยะะPผ๕ึ[*๕ [[[agg'ฦ/,X š6m*ดดดฤ๚๕๋…ตตตˆŒŒ๓็ฯu๊ิฆฆฆ"33SZ~ำฆMยรรCLž‹/Dฏ^ฝค1NLLBTต[–ฅK— ขOŸ>bษ’%โ๛๏ฟƒcฦŒB‘˜˜(BBB๑w฿I๋~๘๐a…Y2๏๑๗ge฿;Bัฏ_?@„……‰E‹‰~๚ R}††† ]]]๑๑ว‹eห–‰Yณf‰nบ‰ีซWKm*๛Yฑu๋VัซW/@,^ผXeŠภภ@ฉmNNŽhาค‰ะััใฦ?๐ƒ๐๗๗ฤ๙๓U๚ญ[ทฎ9rคXธpก˜7ožx๋ญทฑ}๛vฉอ๓พ‡ี…!^จ‰' MMMq่ะ!ฑiำฆ2฿`ฃF*๕KA!ถm&ˆiำฆฉL๏ำงะะะ๙ง4-''งิ๒:u๕๋ืjฤ‡~(MS*•ขkืฎBWWW .‡ฤš5kT–฿ตkWฉ้๖๖๖€8t่4ํ๎ปBOOO|๒ษ'าดษ“' bห–-ฅ๊R*•Bˆ๛lาค‰ศฯฯ—ๆ๗€HNN–ฆ bํฺตาด””@hjjŠ'NHำw๏-ˆ่่hiZY๛๑๘๑ใ€๘๙็Ÿฅi%!ฐUซVขจจHฅใ!๐โล‹ยึึV๘๘๘ˆ๛๗๏ซดซ์{QQ‘ptt๖๖๖โมƒe๎#!„P(ยาาRคฅฅIำ…ฆฆฆx๏ฝ๗Jี๗๛๏ซ๔ีซW/aaa!=ฟt้’ ,X าnไศ‘ยศศHฺWUy]์ฺตซิvVไžฆ2!๐ฟŸ~๚ฉhุฐก4ฯววG„‡‡ !ฤ3…@]]]•๗_bbbฉ}๕ฌ!POOO%๐,YฒDึึึ*Q™8qข าถไuํท฿Jำ๒๓๓ฅืDI_ตj•ะิิ‡VYTT” Ž=ชR“ฆฆฆ8ผJ>๚H˜˜˜”z?อW๎๋ฝฒฏฒ๔่ัCธธธTุfฮœ9ฅ๖Y‰๒ถณd^Y!๐i๏3gฮ”๙Ÿ๕Aƒ•๊ำิิ๔ฉฏปg๙ใ“ -๑dœ?พ 6 „ŸŸŸ022Ryอ=๙นXPP \]]EถmUฆ?ฯ{X]x:˜^จศศHธธธ`เภ9r$1fฬ˜J-ปcวhii•jษ'Ÿ@;wJำ คŸ322p๏=โฏฟBFFFฅึ๗๘7#KN‘HงL7mฺSSSt่ะ๗๎“^^^022BLLŒJM›6…ฟฟฟ๔ผvํฺpvvฦ_%M๛ๅ—_เแแ^ฝz•ช็ษSfแแแะีี•ž—๔x`dd„เเ`้นณณ3ฬฬฬะคI๘๚๚JำK~~|๙ว๗caa!าาาะฐaC˜™™ฉœž)1t่Phii•š็ฮC`` ฐo฿>˜››ซฬoบ5„Ofx||<ฎ]ป†ฑcว–บฮงdพ} 4hjึฌ)อwwwG‡ฐcวŽR>\ๅนฟฟ?าาา™™ hิจ 6lุ ต)..ฦๆอ›ัญ[7i_=๋๋ยัั:uชp›_”ะะP๙็Ÿ8}๚ด๔๏ณœ .ัพ}{4hะ@z๎๎๎“Rฏลgัฎ];•ำว%ฏฯฝ{รุุธิ๔'ืฅญญaร†Iฯuuu1lุ0ฝ{gฮœ๐hฌš4i‚ฦซŒUถm ิXขiำฆ*ำฬฬฬฝ{๗Vy[W•ื๎“๕๗฿8}๚t•k(k;+๒ด๗Nษ้ไ‘#Gชด๛๐รK๕eff†“'Oโึญ[ๅฎฏฒŸฯbวŽฐถถFHHˆ4MGGcฦŒมร‡q๐เAi๚ใŸ‹<@FFหL|0า ฅซซ‹ๅห—ใฺตkศสสBtttฅฏcบ~:lmmU~@“&Mค๙%Ž=Š๖ํKืำิฎ]“&M€J…@MMMิฏ__eZฃF@บvๆส•+ศศศ€ฅฅ%jืฎญ๒x๘๐กtAr‰z๕๊•ZนนนสubWฏ^ญ๔อž์ฏ$T=yYบuKํcSSSุูู•š๖ไ๒นนน˜{ั<==ัธqcฌ]ปkึฌตตต€žEe^ฯgษ๋ณ2ฏ[ฐตตE5Tฆ•๕>|ฉq*iW™ฑ9r$5j„.]บ nบx๗K]๙,ช๒ฺ}„ `dd„ทz NNN5jŽ=๚L5<๋k๒i๏๋ืฏCSSณTฟ 6,ีื์ูณq๎9ุููแญทBddไsgขฒฎ_ฟ'''hjชฦ ฒ~ฟl฿พอ›7‡พพ>jึฌ‰ฺตkc๑โล•>ภ๐*{ฝพ๖Cฏฅปw๒๒๒pๅส•j%x๕๊Uดkื7ฦผy๓`gg]]]์ุฑ฿}๗”JeตฌGฉTยาาkึฌ)s~ษ…฿%ส;B&ž๘ฒIeUถฟ๒ฺUf๙?ััั;v,`jj —น๒“z๗๎•+Wbอš5*Gh^•ู๛๗วฤ‰ฑiำ&Œ;7n„ฉฉ):w๎,ตyึืEE๛์e ลโล‹allŒ๛—๚%X•ูwๅgฏธธ๘™๚ฌฮ๗‘Rฉ„››ๆอ›Wๆ'gYceii‰„„์ฝ;w๎ฤฮ;๗{ฏฬ/ผhMš4มฅK—ฐ}๛v์ฺต ฟ๒ ~๑GLž<นาทzึืduŽIฟ~เ๏๏ญ[ทbฯž=˜3gfอš…-[ถ K—.ฯ_u;|๘0บw๏Ž€€๘ใฐฑฑŽŽขฃฃฅ/฿ผฮ้…JJJยW_}…๐๐p$$$`ศ!HNN–7”หย๛๖ํCVV–สัภ’o7ฺ~wไ็็ใท฿~S๙๊“งv*ขT*๑ื_IGเ๒ๅห ขjะ ๖ํ‡–-[V/๒ เนsีาWuุผy3ˆoฟVš–——Wฅ›ฬฮ™3ฺฺฺ9r$Œซtฺ€tฺ๑นsh฿พ}™mJ^ —.]*5/%%ตjี*u”จ2๑ึ[oaร† =z4ถlู‚ž={ช’ฅบ^ฯ๒M฿็Šษ“'ใ๖ํXตjี [นนy™ฏ›วฐTง[ทn!;;[eœหz'&&ข]ปvฯตฟuuuัญ[7t๋ึ Jฅ#GŽฤ’%K๐ๅ—_–yด จ๘sxพืn5ะฟ๔๏฿x็w0}๚tLœ8๚๚๚/ํตUยJฅืฎ]ƒ“““4ษป”ฐฑฑมศ‘#1rไHฝ{อš5ร๔้ำ_hดททGRR”Jฅส„ž๒ห/ฟ@__ปw๏Vy฿GGG—๊๓e๏็๊ภำม๔ยbะ Aฐตตล๗฿+Vเฮ;7nœJป’ธ'aกธธ .T™w฿ACCC๚€(๙_้ใ อศศ(๓MZ‘วื#„ภย… กฃฃƒvํฺx๔?ึโโb|๕ืฅ–-**ชRP๊ป7ฑu๋ึR๓ชzฤ๐yhii•Z๏‚ ส=zS ,]บ}๚๔มภ๑oฟฉฬฏ์mš5kGGGฬŸ?ฟิ>.ฉีฦฦ …+WฎTis๎9์ูณAAAฯ\‰๛ใฤ‰Xพ|9๎ปงr*จพืE5^ส_thะ ๆฯŸ3fเญทzก๋ษศศ@RR’4ํ๖ํeพึซCQQ–,Y"=/((ภ’%KPปvmxyyx4V๓~๚้งRห็ๆๆV๊^—iii*ฯ555แ๎๎ฅn3๓8CCCฅ?็ž๗ต๛d=บบบhฺด)„(,,Pg์‹Rrอ๋?จ2}ม‚*ฯ‹‹‹KRตดด„ญญญสพ|ึIUFPP๗_•k~‹ŠŠฐ`ม!00ภฃฯD •ฯภิิิ2o ฒรี‰G้…™6mฐ~ร“'Oฦ_|>}๚Hn%ะcฦŒAงN ฅฅ…เเ`t๋ึ mฺดADDRSSแแแ={๖เื_ลุฑcฅ#D;v”g>lุ0<|๘?๔,--q๛๖ํJีชฏฏ]ปvaเภ๐๕๕ลฮ;๑ว`าคIา้ผภภ@ 6 3fฬ@BB:v์\นr›6mย๗฿ฏr๏ธส?~<6oŒพ}๛โ๗฿‡——๎฿ฟ฿~๛ QQQ๐๐๐xฆžืoฟUซVมิิM›6ล๑ใวฑo฿>XXXTฉ?MMMฌ^ฝ={๖Dฟ~ฐcว้ดSงNกM›6˜2eJ…|kjjb๑โล่ึญ ยรรaccƒ””œ?^บ`ฮœ9่าฅ 0x๐`ไๆๆbม‚055}ฎ ส๛๕๋‡O?Ÿ~๚)jึฌY๊hduฝ.ผผผฐo฿>ฬ›7ถถถpttT๙"ฯ“~w$&&x๔ฎคค$L›6 ะฝ{w)˜”ๅฃ>ชฬฆ?—เเ`L˜0ฝz๕ย˜1c““ƒล‹ฃQฃF/ไ‚z[[[ฬš5 ฉฉฉhิจ6lุ€„„,]บ:::€ฐฐ0lธร‡GLL Zถl‰โโbคคค`ใฦา+2dศฟmถEบuq๚u,Xฐ …Bบžฌ,hฺด)6lุ€Fกfอšpuu…ซซ๋sฝv;v์kkkดlูVVVธx๑".\ˆฎ]ปJgPJ>c#"" t๋ึญJGว+รหห ฝ{๗ฦ๙๓‘––†ๆอ›ใเมƒา‘ู’#fYYYจ[ท.๚๔้a฿พ}8}๚ดสูˆส~V<‹>๘K–,ม Aƒpๆฬ888`๓ๆอ8z๔(ๆฯŸ/ํปฎ]ปbผy่น3BCCq๗๎],Zด 6T๙Nษv?ห{๘•๐๒ฟLrpๆฬกญญญr!๎รววGฺฺุJท๛(**~๘กจ]ปถะะะPน}DVV–7nœฐตต:::ยษษIฬ™3Gๅึ B๑oฟ wwwกฏฏ/ฤฌYณฤ๒ๅหหฝ-ยใ(jิจ!ฎ^ฝ*CฬสสJL™2E—jฟt้Rแๅๅ% „ฑฑฑpssŸ}๖™ธu๋–ิฦ^tํฺติฒOฆ@!าาาฤ่ัฃE:u„ฎฎฎจ[ทฎ8p tฯต’#<~_:!„ธvํZฉ[ผ–yปˆ๒๊มทy๐เตjีFFFขSงN"%%Eุซ๚ ไ1งOŸ.ีgYทhศษษยศศHบMอณ๖A!Ž9":t่ ŒE5„ปป{ฉท์ทOดlูRัญ[7qแย…งึ๗๘6•๕ziูฒฅ † Rn}ฯ๓บโัญ|„๐ิ[M”ฺจฌวใฏ‰๒ถ๗IOพžต“ฏ!฿ัีีU่๊๊ gggฑz๕๊ro๓dŸ%ฏ๏9sๆจL/๋P๒บ‹‹~~~B___ุ—yŸะ‚‚1kึ,แโโ"๔๔๔„นนน๐๒๒SงNOฮอ›7‹Ž; KKKกซซ+๊ีซ'† V๊~’e9v์˜๐๒๒บบบฅ^๛•yํ–eษ’%" @XXX===ั A1~x•mBˆฏฟZิฉSGhjjชผฮ+๗'k|–๗Nvvถ5j”จYณฆ022={๖”nปTrOั|1~xแแแ!ฝฏ=<<ฤ?จา‹ธEŒBนsG๚ผำีีnnn*๏๛฿„“““ะำำ7ัััeพŽŸ๕=*ะB ็œˆˆˆHVเ้้‰ีซWใw฿Uw9^HDDDีฌฌฟ‰=|hjj" @ QYxM Uซูณgใฬ™3hำฆ ดตตฅ้|๐มฅnลC๊รำมDDDTญ๖๎‹ฉSงโย… x๘๐!๊ีซ‡ฐฐ0DDD@[›วŸ^ DDDD2ฤk‰ˆˆˆdˆ!ˆˆˆH†‰ˆช่ๆอ›ะืืวัฃGี]Jต‰…††bccŸปฏึญ[รีี๕๙‹z4oŸ}๖™บห ชV DคV+Vฌ€††444pไศ‘R๓…ฐณณƒ††~๛m•y%ห•|๘s๕๓ช @nn๎+{/ทŠBเิฉS_X์ัฃLLLJ=\ขืฟงMDฏ„   lฺด ?๐ƒส-$ึฎ] //ฏrx|ฃF0`ภ้๙๐แรQPP€-[ถ //๚๚๚*ํw์ุ.]บHฟดชVฏ^ mmmt๋ึํน๚ฉNูููฯ๗`555Kํ39หษษกก!455ังO๓ฯ˜:u๊sฟ~ˆ^<HDฏ„คฅฅa๏ฝาด‚‚lผกกกฯิ—ตต5444J,==วŽCืฎ]ฅi๋ืฏ‡——Œabb777|๗O]วถmเ๋๋ ###•้%ืม%%%!00†††hุฐ!6o เั‘M___ภูู๛๖ํ+ีw||<บt้ก]ปv8qโ„J›’ำ่ฤศ‘#aii‰บu๋J๓w๎ ิจQฦฦฦฺ่ต+ฮŸ?ิํ*๋šภ+Wฎ w๏ฐถถ†พพ>๊ึญ‹เเ`ddd<ต?8sๆ Zดh8::"**ชT›|L™2 6„žž์์์๐ูgŸ!??_jฃกก์์lฌ\นRบ`ะ AˆŒŒฤ๘๑ใŽŽŽาผิิTiูีซWรหห จYณ&‚ƒƒq๓ๆM•Jฦ๎ฬ™3€กก!&Mš$อ๏ะกฎ_ฟŽ„„„Jm7ัซŽ!ˆ^ ๐๓๓รบu๋คi;w๎DFF‚ƒƒห].//๗๎รฝ{๗p๚uฌ]ป+WฎDhhhฉธ{๗nhhh cวŽะ6$$ๆๆๆ˜5kfฮœ‰ึญ[?๕‹………8}๚4š5kVๆเํท฿†ฏฏ/fฯž ===cร† FPPfฮœ‰์์l๔้ำYYYาฒ็ฯŸ‡ฟฟ?๑ูgŸแห/ฟฤตkืะบukœz๖์)๒๒๒Jญ+,,LJฯ?๚่#abb"ŠŠŠžฉๆ?S ,(5/00Pkืฎ•ฆฅคคBSSSœ8qBšพ{๗n@DGGKำz๖์)tuuลีซWฅiทnฦฦฦ" @šVฒ฿ZตjฅRVV–033C‡Uฉ๋฿ฆฆฆฅฆ?)&&F111B!โใใฑiำฆŠwJJ๖ลท฿~+Mหฯฯ …BXZZŠ‚‚!„ซVญšššโ๐แร*หGEE โ่ัฃาด5jˆ–Zืœ9sqํฺ5•้ฉฉฉBKKKLŸ>]ezrrฒะึึV™^RoTTTนคซซ+FŒ๑ิm'z๐H ฝ2๚๕๋‡\l฿พYYYุพ}๛SO๗่ั{๗๎ลฝ{๑๋ฏฟbโฤ‰ุตkBCC!๛ƒHJฅปvํR9lff†์์l•Sะ•‘––077/sพ‘‘‘สัKggg˜™™กI“&๐๕๕•ฆ—ื_Š‹‹ฑgฯ๔์ู๕๋ื—ฺูุุ 44GŽAffฆสบ† ---้๙ฝ{‘žžŽ้้ฝ{๗ ฅฅ___ฤฤฤ<ำถšššxtตผo\WD[[ร† “ž๋๊๊bุฐaธ{๗.ฮœ9ุดiš4i‚ฦซิถm[xๆšทeห(•J๔๋ืOฅokkk899•๊[OOแแแๅ๖gnn^๎๕ฉDฏ~1„ˆ^ตkืF๛๖ํฑvํZไไไ ธธ}๚๔ฉp™บu๋ข}๛๖า๓๎ปรยยŸ~๚)ถo฿.}qใ๔้ำ๘๏ฟTBเศ‘#ฑqใFt้าu๊ิAวŽัฏ_?t๎นR๕Šr๊fบuK}qภิิvvvฅฆN™พqœ““gg็R}6iาJฅ7o„‹‹‹4ััQฅ•+W@ PO211ฉh“JqttฤวŒy๓ๆaอš5๐๗๗G๗๎1`ภฉŠฺฺุ–๚ฒJฃFฉฉฉhผ9ฎ\น‚‹/JงoŸt๗๎gช๙qWฎ\NNNeฮืััQy^งN่๊๊–Ÿ‚_ ก7C ฝRBCC1t่P๛๏ฟ่าฅ ฬฬฬžนvํฺ:$…ภ;vภมมM›6•ฺYZZ"!!ปw๏ฦฮ;ฑs็NDGGใฝ๗รส•+หํ฿ยยภ…ท'=~dฎ2ำห “•a`` ๒\ฉTxtœตตuฉ๖O^'Y฿~๛- „_{๖์ม˜1c0cฦ œ8qBๅห(UฅT*แๆๆ†y๓ๆ•9ษ๐ฌ}khh`็ฮe๎'ฟุ๓ไ|Rzz:jีชUๅzˆ^% D๔J้ีซ† †'N`ร† U๊ฃจจ๐๐แCiฺ   Rmuuuัญ[7t๋ึ Jฅ#GŽฤ’%K๐ๅ—_ขaร†e๖_ฏ^=เฺตkUชฏ<ตkื†กก!.]บTj^JJ 455Ÿˆ4hเQภ}้๓rssƒ››พ๘โ ;v -[ถDTTฆM›Vแrทn*u๋šห—/x๔e ’šัฎ]ปงe+o~yำ4h!ฅ#U๕ฯ?   Mš4yฎ~ˆ^ผ&ˆ^)FFFXผx1"##ซ|พ฿เแแธs็ฮž=ซr*๘ฟk๛JhjjยTnM๒$x{{#..ฎJ๕•GKK ;vฤฏฟช๒-;w๎`ํฺตhีชีSO็v๊ิ &&&๘ๆ›oPXXXj๗L5effJกบ„››455+G%ŠŠŠฐdษ้yAA–,Y‚ฺตkK฿ถํืฏ๙็๔ำOฅ–ฯออEvvถ๔ผFe~+น$d>9๏w––ฆNZ๊ˆซขิk "%ื0ถhัขาหฝสx$ˆ^9ๅตฒ\พ|ซWฏ๐่ฦพ'Nœภส•+ัฐaC„……xt*X___ๅv0dศฟmถEบuq๚u,Xฐ …โฉG{z๔่ˆˆdff>๓uv™6m๖๎‹VญZaไศ‘ะึึฦ’%KŸŸูณg?uy,^ผaaahึฌ‚ƒƒQปvmธq๑Zถl‰… Vบž`๔่ั่ท/5j„ขข"ฌZต ZZZ่ป๗S—ทตตลฌYณššŠFaร† HHHภาฅKฅ๋๑ยยยฐqใF >111hูฒ%Š‹‹‘’’‚7b๗๎๐๖๖๐่6-๛๖ํรผy๓`kk GGG๘๚๚J2""มมมะััAทnะ AL›6 'NDjj*z๖์ ccc\ปv [ทnล|€O?ดR๛b๏ฝจWฏ<==+ฝˆ^i๊๛b2‘๊-b*R™[ฤhii‰บu๋Š>๘@นsGjืงOTชฯอ›7‹Ž; KKKกซซ+๊ีซ'† &n฿พิบ๏น#ดตตลชUซTฆ —Jี_ฒ ฃFR™v๖์YัฉS'add$ E›6mฤฑcวTฺ๔ำjญ็มƒ077G||\๚ูห–-{jวŽChh(444เๆๆCCCนsบบบ5j’’’ ฅฅ…ผผ<ภฉSงะขE Œ;qqqR]ีฝžฒ888`ฺดiˆŒŒฤ๊ีซ€ฏพ๚ Ÿ|๒I™ํgฬ˜ฉSงVช>"""zณฝ–งƒ—€ .ภััญZตB||<บw๏^ํ๋™?>œ‘œœŒ๛๗KGิฑt้R9rฝ{๗ฦฦQPPPํ๋)ฯแร‡ŽYณfaาคI0`@นm'NœˆŒŒ ้q๓ๆอ*ืIDDDฏทื.ถm๋ืฏ—Ne๚๙๙แ๖ํHMMล‘#Gเ้้‰฿~๛ํ™๚ิิิ„Rฉดhั›6m‚็ฯŸGnn.ฌฌฌ™™ kkkhhh`ลŠาฒ๚๚๚x๗qโฤ ฬ™3@ใฦ๑ํท฿Vธฮg]ฑฑ1ฒฒฒค็{๖์ซซ+ๆฮ‹œ?ฐฒฒ*wzzz011Qy‘<ฝv!ะีีฃGF‹-เแแ~๘กถQQQาuqqq2dH™ํ 777Œ7}๚๔••†่่hN-/\ธ …B%Œ=NกP ** IIIP(nวณฎงM›68u๊”tซ ์ฺต ฟ๚+‚‚‚ ฉ๙ฺ %ฉ‘†BจปRฬฬL˜ššย๋‹_กิ5’ฆŸฒญซ’—ยยB์ุฑAAAะััQw9ฒฤ1x5pิc ~•ƒ’฿฿ฯuV‡ˆˆˆˆdˆ!ˆˆˆH†‰ˆˆˆdˆ!ˆˆˆH†‰ˆˆˆdˆ!ˆˆˆH†‰ˆˆˆdˆ!ˆˆˆH†‰ˆˆˆdˆ!ˆˆˆH†‰ˆˆˆdˆ!ˆˆˆH†‰ˆˆˆdˆ!ˆˆˆH†ดี]ฉ฿๎ฑ-aaaก๎2ˆˆˆ่%โ‘@""""b$"""’!†@""""โ5„ˆ]W mxWzพฐW5VCDDD/ษC ‘ 1ษC ‘ 1ษC ‘ 1ษC ‘ 1ษC ‘ 1ษC ‘ 1ษC ‘ 1ษะ๛๔้ƒๆอ›Wy๙ุุXฤลลUcEช6lุ€&Mš ˆŒŒDTTT•๚™?>ŠŠŠชน:"""’ฃื>๎ปZZZฯีว‹………ศฮฮ,_พ๋ึญร† žซฯ'Cเƒžซ?"""’ฏื*๔ำOpssƒ‡‡ฆL™‚ยยB|๓อ7๘โ‹/*ต๚๕๋ังOภ™3gเใใƒ›7o"** ำงO‡BกภฅK—p๚๔ix{{รออ #FŒ@qq1`ส”)๐๑๑ซซ+&MšTๆ:RSS1iา$4n—/_ฦฬ™3q๔่Q„„„`๚๔้*mŸe=‹-ยญ[ทเ๋๋‹๛ผฝฝŽ“'O>๛ฮ$"""Y{mB`RR-Z„ฃG"11}๔ๆอ›‡ยุุXฅmTT”tส5..C† ฃฐฐ๋ึญรฐaรฐt้Rุููa๘๐แˆˆˆ@BBœŽ%K– 99๗๏฿วบu๋}๔NŸ>คค$$%%!11P\\Œ฿~๛ AAAx็wPงNœ={žžž๘๓ฯแํํญ[ท"""BฅฮgYฯจQฃ`kk‹“'OJG/]บ„๎ป#22Xฒd >|X๎>ฬฯฯGffฆสƒˆˆˆไ้ต ฑฑฑ†‰‰ 77{๖์มภKต>|8†เััฒeห–I๓ขขข0rไHt์ุžžžฅ–MOO‡Rฉ„——เw฿ลัฃG๛๗๏‡ NŸ> .z๖์‰ฑcวbาคI8{๖,FSSำ ทง*๋y’ถถ6z๕๊…;wโ—_~ม/ฟ›rื9cฦ ˜ššJ;;ป k$""ข7ืkŸ”€ .ภััญZตB||<บw๏ิๅRSSกงง‡ทo?ำ๚๒๒๒๐๑วใ?@RR๚๖ํ‹|ยU็ฮ๑๛๏cย„ ธrๅJ•ถ้i๋)KZZๆฯŸ๎ปฃFุดiSนm'NœˆŒŒ ้q๓ๆอ*ืIDDDฏทื&ถm๋ืฏ—Na๚๙๙แ๖ํHMMล‘#Gเ้้‰฿~๛ญย>๒๓๓1bฤ์ท7oฤž={ฦฦฦศสส˜™™AKKK:ีปn:ดjี yyyะิิ„นน9๎฿ฟ฿]๊ืีี?๘#โใใแไไ„ะะPดiำฉฉฉๅึR•๕<^'„††ยฯฯ™™™ุนs'ถnŠฮ;—ปN===˜˜˜จ<ˆˆˆHž^›่๊๊ŠัฃGฃE‹๐๐๐ภ?Pn๒ฎ ๊ซฏะซW/ธบบb้าฅ7n>|ˆnบaีชU๐๔๔ฤฅK—ฐ|๙r <nnn055Epp0ฬฬฬ‚&MšเwŸŸ_ฉ๕ึจQC† ม้ำง1w๎\hkkWธMฯบžกC‡ย฿฿_๚bHhh(RRR0y๒dฺฺุ>๓>%"""๙าBuA๊‘™™ SSS [}ฺ†w ใย^MิX•ผbวŽ ‚ŽŽŽบห‘%Žมซใ ~๕ซ์”ฮศศxฎณzฏอ‘@""""ช> DDDD2ฤHDDD$C DDDD2ฤHDDD$C DDDD2ฤHDDD$C DDDD2ฤHDDD$C DDDD2ฤHDDD$C DDDD2ฤHDDD$C DDDD2คญ๎Hฆwv‚………บห ""ข—ˆG‰ˆˆˆdˆ!ˆˆˆH†‰ˆˆˆdˆื6$ใl้yธO=5VCDDD/ษC ‘ 1ษC ‘ 1ษC ‘ 1ษC ‘ 1ษC ‘ 1ษC ‘ 1ษC ‘ 1ษZB`Ÿ>}ะผy๓งถKMMลๆอ›ซmฝ‘‘‘ˆŠŠชถ*#//mถ…งง'bbb`mm]ฅ~ฐo฿พjฎŽˆˆˆไ๊ฅ‡ภฝ{๗BKKซRmซ;>โโโgjเม@||233UDDD$SโILL"##C!DZZš˜9sฆˆŽŽืฎ]พพพRล‹‹ล‹ !„8}๚ด๛์3,\ธP:ฒx๊ิ)8::"''qqqXพ|yฅฎwœ‘œœŒ๛๗K ฅŸ'NœˆŸ~๚ <€ฏฏ/าาาเ๎๎ŽฅK—โศ‘#่ป76nˆ‚‚‚*ืWQ-e9|๘0ยรร1kึ,Lš4I ษๅmป‰‰‰สƒˆˆˆไ้……ภถmb๚๕าug~~~ธ}๛6RSSqไศxzzโท฿~ซฐcccdeeIฯ[ดh 6ึฎ]‹VญZ•นœ‰‰ LMMศศศ€Rฉ,w=™™™ฐถถ†††VฌXQnปฟ๚ …_~๙%p๓ๆM่๋๋ใ๗฿ว‰'0gฮ8p7ฎ๐ˆ\ษถlฺด Bœ?นนนฐฒฒ*ท–'๗ลž={เ๊๊Šนs็"$$็ฯŸGDDฌฌฌ*\/๐C ซซ+F-Zภรร?๐Cนmฃขขค[ทฤลลaศ!wwwไๆๆJ_ ‰ŒŒฤŽ;เ๎๎Ž-[ถ`ฺดiๅ๖๙๓ฯ?cส”)๐๐๐@็ฮQXXXnแร‡cแย…P(*A๋I๓ๆอƒ‹‹ ัธqcxxxจฬW(ˆŠŠBRR Eนn“cee777„……!::บยZฺดiƒSงNIทšฑฐฐภฎ]ป๐๋ฏฟ"((H:MDDDTBก๎"H=233ajjŠE๛a`l&M๗ฉงพขdฆฐฐ;v์@PPtttิ]Ž,q ^ ๕ใจ_eว ไ๗wFFฦs]ฺลรGDDDD2๔ฺ‡ภ้ำงCกPจ<^•Lฝชดี]ภ๓Šˆˆ@DD„บห """zญผ๖G‰ˆˆˆู่1ษC ‘ 1ษC ‘ 1ษC ‘ 1ษC ‘ 1ษะkgใ่๙๕๗จ u—ADDD/ษC ‘ 1ษC ‘ ๑‹!„3ฉ™0~ ฅ๎2dIY\8๕W4ต๘vTŽมซใ ~ƒ๊ๅืะL%<ษC ‘ 1ษC ‘ 1ษC ‘ 1ษC ‘ 1ษC ‘ 1ษC ‘ 1ษC ‘ 1ษะ ้้้XถlYน๓ญญญŸฺวŠ+p๏ฝjซฉ2๋ฌn6l@“&MะฟDFF"**ชJฬŸ?EEEี\ษ•ฺB`eTw|ลลล•n[XXˆ์์lภ๒ๅหฑn:lุฐแนึd|๐เมs๕GDDD๒Vm!๐ึญ[hูฒ% ๑ษ'Ÿ 99 …sๆฬAvv6z๕๊…ฆM›b๘๐แOํo๋ึญˆ‹‹Cฏ^ฝเ๏๏ˆŽŽ†ซซ+\]]ฑt้า —Ÿ:u*\]]แ๎๎Ž%K–Hำ?๚่#ธธธ GRฐ›2e |||เ๊๊ŠI“&Im0qโD( 9r €‹‹ ฐvํฺR๋LMMลคI“ะธqc\พ|3gฮฤัฃG‚้ำงซด=}๚4ผฝฝแๆๆ†#FTXหขE‹p๋ึ-๘๚๚ขooo„‡‡ใไษ“O—%๒๓๓‘™™ฉ๒ """yชถธn:ดo฿ 8sๆ ฆM›777$$$`๘๑Xดhqแยt้าw๎‘–U(าฯC† ‘ยŸทท7ถnŠร‡ใ๏ฟฦ๔้ำqไศ?~๓ๆอCjjj™ตl฿พGลูณg‘””„พ}๛๎นƒฝ{ใ๙๓P*•8pเ€Gม๐๔้ำHJJBRRฅพ###ผy็ฯŸGrr2บvํ เัย฿~๛ AAAx็wPงNœ={žžž๘๓ฯฅmˆˆˆPฉ1<<K–,Arr2๎฿ฟu๋ึ•[หจQฃ`kk‹“'OJG/]บ„๎ป#22Xฒd >|Xแอ˜1ฆฆฆารฮฮฎ#KDDDoขj >>>XตjฆNŠ+Wฎภภภ@eฑcว ่ัฃ ฅy าฯห–-ƒททwฉใโโะฑcG˜™™มุุAAAๅ;pเ}่๊๊jึฌ 033C@@ภำำS ‘๛๗๏‡ NŸ> .H}•ศ๚๕๋ใฦ๘๐รฑ~˜ššz๖์‰ฑcวbาคI8{๖,F%อ+Ozz:”J%ผผผ๏พ๛.Ž=๚ิZงญญ^ฝza็ฮ๘ๅ—_๐ห/ฟภฦฦฆย๕Nœ8าใๆอ›ถ'""ข7Wต…ภ€€:t–––่ป7๖๏฿_ช††FuญฎJ๔๔๔คŸ555Q\\Œผผ<|๑ว๘ใ?คฃ†๙๙๙Rป’ฐjnnŽคค$ดjี ณfอBdd$€GGื:w๎Œ๗฿&Lภ•+Wช\฿ำjyRZZๆฯŸ๎ปฃFุดiำSท฿ฤฤDๅADDD๒Tm!๐๚๕๋ฐฑฑมˆ#Œ๔๔tdeeI๓[ดh!สพ};rrržฺงฑฑฑิ‡๖๏฿ฬฬL<|๘;w๎„ฏฏo™หตo฿ห—/GAAเ๛ๅฎ#//ššš077ว๛๗๑๛๏ฟ—ู๎ฝ{B ˆˆˆŽ^บบบโวD||<œœœŠ6mฺ”{ชxtDRKKK:ํผn:ดjีชยZ฿ ???dffb็ฮุบu+:w๎\๎:‰ˆˆˆง]]ลฦฦb๖์ูะีี………ึฏ_ธธ8ธปป#,, ฃFยป๏พ ภสสJZVกPHกjศ!>|8ผฝฝ1hะ „……กvํฺ8|๘0&L˜€-Zฦ‡2k B\\<==กญญัฃGc่ะกeถ533CHHš4i‚บu๋ยฯฯฏฬv7ยรร!„€ถถ6.\จ2ฟF2d† ‚3gฮ@[ปโ]ป|๙r <๙๙๙hูฒ%‚ƒƒกฅฅUn-C‡…ฟฟ?<<<ฐaร„††b๕๊ีะิไญ‰ˆˆู่i!„บ‹ ๕ศฬฬ„ฉฉ)vวcSsu—#Kสโ"K9ŠZ[BSซฺOFฯ€c๐jเ8จว z๙54{ๆe ฑcวAGGงv%ฟฟ322ž๋า.F""""’กื:๊งฅฅก]ปv*ำjีช…}๛๖ฉฉ""""ขืรk-,,Tn/CDDDD•รำมDDDD2ฤHDDD$C DDDD2ฤHDDD$C DDDD2ฤHDDD$C DDDD2ฤHDDD$C DDDD2ฤHDDD$Cฏ๕Ÿฃ๊แๅ` 3u—!K………ุ‘ผU฿:::๊.G–8ฏŽƒ๚q ไ‡G‰ˆˆˆdˆ!ˆˆˆH†‰ˆˆˆdˆ!pwธ3n๗3QwDDD๔1ษC ‘ 1ษC ‘ 1ษC ‘ 1ษC ‘ 1ษC ‘ 1ษC ‘ 1ษC ‘ 1ษะ ้้้XถlYน๓ญญญŸฺวŠ+p๏ฝjฉ'55›7o.w~TTT…๓Ÿวปw๑ึ[oมำำ—.]B๓ๆอซิOll,โโโชน:"""’+ต„ภสxY!ฐธธร‡GŸ>}ชe]%>ร‡ว์ูณagg‡แร‡#"" pvvฦ7฿|ƒฅK—โฬ™3pssรวŒK—.U8N3fฬ€ฉฉฉ๔ฐณณซฐ=ฝนช%๚๘๘`ีชU˜:u*ฎ\น•๙วŽCpp0 G044”ๆ%$$H?/[ถ ฅ๚‹‹CวŽaffccc• U%0gฮฬž=๗_ฉภVขgฯžะัั)s^๗๎žžžRุLLLฤoฟ ่฿ฟฟิ๖—_~ซซ+lllp๎9|๗pqq)ณ฿ว;v  แโล‹ๆํีซ0eส\ธpก>\\\๐๗฿#99ึึึpuuล/ฟRn๛‰'"##Czผy๓ฉuั›ฉZB`@@:KKK๔๎๛๗๏/ีFCCฃ:V๕Tกกก๘๕ื_กญญ6mฺHแ๊Iั'•\ปงฉฉ‰โโb€ขฬถ:tภนsฑfอ„„„`วŽP*•Uฎ๒ไษx็wœœŒUซVฉœพ}’RฉฤŽ;‚5kึ`๎น่ะกC…ebbข๒ """yช–x๚uุุุ`ฤˆFzz:ฒฒฒค๙-Zดฎ‡พ};rrržฺงฑฑฑิ‡๖๏฿ฬฬL<|๘;w๎„ฏฏo™ห]ปv 6ฤวŒภภ@\บtIฅฏช๒๐๐ภŽ;›6m’ฆ›˜˜เฃ>Bbb"ฦ‡5kึภููซWฏฎฐฟว๗ษฎ]ปะดiSฎำณฑฑ๐่ห1%ž†ีซWรููkึฌมวŒฤฤD|๔ัG vDDDT)ีcccแ๎๎OOO>|„ปป;1gฮŒ5 ๙'\\\๐วภสสJZถฌk`ะ A ƒฟฟ?๊ิฉƒ & E‹hผ9ฦ‡2kYฟ~=\]]กP(••…ฮ;รนนนP(XณfM•ถ๑ป๏พร—_~ …B‡–ถฐfอœ8qข๚JŒ=ทn‚ปป;พ๚k,Zด๐้งŸโร?Dณfอ`dd$ต๏ึญVญZ%jฦมม'Nœภš5kเ๏๏_ฅm""""๙าๅ็$999000€††ฆM›†ขข"DFFชปฌ็’™™ SSS\่c3ุlไท…_ถยยB์ุฑAAAๅ^ฃJ/วเีภqP?ށ๚Uv J~gdd<ืภjนEŒœ>&&&ˆG›6mส\&''€จจ(?~฿}๗sี๛x,((@NNฮs๕GDDD๒๕ฦ„ภ[ทnกeห–P(pwwGJJ <==ัปwo4iา|๐”J%ภสส #FŒ€››nผ kkk@ll,:u๊„nบมษษ ำงODDD 99 …sๆฬAXX<…Bดด4•:ฮŸ??...x๐เฦŒƒkืฎ!00ััั*mw์ุwwwธบบ"22Ršมภ...Xดh‘TCZZ ฦ‡ภีีcฦŒม… ^ิn%""ข7ิืญ[‡๖ํ#!!gฮœIII๘๒ห/qแยปw[ถlฝ{={๖ฤนs็`ooฏาO||HHHภw฿}+++œ?6lฑvํZไ็็—ป๒๓๓‘™™ฉ๒ """yาVwีลววƒ ‚ฆฆ&๚๖ํ CCC8;;CกP‚ƒƒqไศ๔้ำฦฦฦ่ิฉS™ดlูGGGบu :::ฎบบบXนr%\]]+U๏ฅK—ะดiSุูู๚๗๏ฃGขUซVXปv-๗ฟกธธ7oฤ•+WPซVญR}เฝ๗ร{๏ฝ‡s็ฮแฝ๗รŒ3œœ\ๆ:gฬ˜ฉSงVช>"""zณฝ1Gp่ะ!XZZขw๏ุฟ?444ค๙าsCCรr๛ัำำ“~ึิิDqq๑Sืฝt้Rธธธ o฿พ˜6m๙็Ÿ*oว_…%K–เะกCHJJBห–-+<บ๗ฯ?เ๋ฏฟF฿พ}แ๊๊ŠฅK—–vโฤ‰ศศศ7oฌrDDD๔z{cBเ๕๋ืaccƒ#F 88YYYHIIARR„ุธq#ZตjUฅพ‘••U๎|???๓ฯ8z๔(jิจN:ก{๗๎ศศศ(wggg\ผxทnBQQ6mฺ„–-["++ ฦฦฦ022Bjj*<(-ฃฉฉ)]ื˜‘‘๎ปฃSงN022ยฑcว๐๓ฯ?รฯฯฏu๊้้มฤฤDๅADDD๒๔ฦœŽล์ูณกซซ ฬœ9๎๎๎˜:u*ฮŸ?€€๔๊ีซJ}[XXภ๎๎๎ ƒO™ํjึฌ‰qใฦaธqˆญฐO,Zด]บtAqq1๚๔้#…ิ  qใฦhะ Zถl)-3`ภธนนกcวŽˆŒŒฤวŒึญ[Wi›ˆˆˆH4„BEผฉฉฉฦ‰'ิ]ส++33ฆฆฆธ๛M,๔”ฅๆk~|X UษKaa!v์ุ   ง^{J/วเีภqP?ށ๚Uv J~gdd<ืYฝ7ๆt0Uxˆˆˆจol$"""ข๒1ษC ‘ 1ษC ‘ 1ษC ‘ 1ษC ‘ 1ษC ‘ 1ษถบ ๕ำ` 4-,ิ]ฝD<HDDD$C DDDD2ฤHDDD$C DDDD2ฤHDDD$C DDDD2ฤHDDD$C DDDD2ฤHDDD$C DDDD2ฤHDDD$C DDDD2ฤHDDD$C DDDD2ฤHDDD$C DDDD2ฤHDDD$C DDDD2ฤHDDD$Cีำำำฑlูฒ๊์๒ตทaร4iา๛๗Gdd$ขขขชิฯ๙๓QTTTอี‘\ฝดX\\\ซช4uฌทฐฐููู€ๅห—cบuุฐaรs๕๙d|๐เมs๕GDDD๒V้x๋ึ-ดlู …๎๎๎8v์˜ส๓””DDD 99 …sๆฬมŠ+ะงO",, w๎A=เํํ \พ|ธปป#<<Jฅะบuk|๒ษ'๐๔๔„โโโะฎ];ิฏ_๑GนตFFF"<<~~~๘์ณฯpๅสt่ะ^^^่น3๎นppp@^^`ลŠ๘๓ฯใวGใฦแแแ9sๆ@น}<.55“&MBใฦq๙๒eฬœ9GEHHฆOŸฎา๖๔้ำ๐๖๖†››FŒ!…ี)Sฆภววฎฎฎ˜4i`ัขEธu๋|}}ัฟ€ทท7ยรรq๒ไษส!๒๓๓‘™™ฉ๒ """™•4w๎\1y๒d!„bฺดi*ฯsrrฤตkื„ฏฏฏดLttดprr™™™B!BBBฤ™3g„Bœ:uJtํฺU!DZZšดฬˆ#ฤถm„BŠ้ำง !„;vฌ๐๕๕นนน"11Q4oผZงL™"EAABˆ:ˆิิT!„7nฃFBaoo/rssฅZ'L˜ ๎ป'DqqฑBˆ๔๔๔ ๛(**ฟ๚ซ่าฅ‹๐๔๔ .”–)ู†‹/Ju-^ผX!„‹‹‹ˆ‹‹Bัฏ_?ฑjี*•}Q\\,บvํ*Jี*„………bห–-ขs็ฮยหหKDEE‰ฌฌฌr๗Iษ๚”zปwฏยๅ่ล)((ถm“^ซ๔๒q ^ ๕ใจ_eว ##Cฯต>ํส†E 4ššš่ท/Už7mฺดฬๅ:w๎ cccภpแยiž–– 11_|๑233‘žž;;;๔่ั๐๖o กก}}}ธบบโฦึณgO่่่ ++ G•๚+..Fƒ ส]ฮิิFFF2dz๖์‰ฎ]ปVุGฯž=qy๓ฯhีชีS๗#๐่ดนRฉ„——เw฿ลฮ;1`ภ์฿ฟณgฯF~~>๎นƒ .ภรรฃTฺฺฺ่ีซz๕๊…๋ืฏc่ะก๘๔ำO‘••U๎z'Nœˆ?Xzž™™ ;;ปJีLDDDo–J‡ภ€€:tฟ;z๗๎… –z^Vธ244”~ึะะภูณgกฉฉzz่ะกุนs'œœœ0w๎\<|๘Pšงซซ ะิิT๙๙iื๚•ฌWฉTขN:HHH(ีFKKK:๕œŸŸเQธŠ‹‹ร๎ปฑfอlูฒ฿}น}ฬ˜1?๘#}๔๊ี C† ““S…ต•'//1ฮœ9KKKŒ=Zชซ,iiiXตjขฃฃQฟ~}lฺดฉย๕๔๔ งงWฅฺˆˆˆ่อR้kฏ_ฟŒ1มมม8rไˆส๓ไไdWx$ส฿฿_๚โˆRฉDrr2 ;;ตkืF^^sโIฆฆฆ077วž={<๚าฦล‹๖๖๖HHH€Rฉฤ๖ํ>DFFบw๏Žูณg#!!กย>\]]๑ใ?">>NNN E›6mššZnMfffะาาBbb"`บuhีช๒๒๒ ฉฉ sssฟฟปดฬ“๛644~~~ศฬฬฤฮ;ฑu๋Vt๎น๚vฝั*cccแ๎๎OOO>|*ฯ  ธปปร]๚Bลใ,X€;wยรรฎฎฎา—;"""ะฌY3ดiำžžžีทu฿š5k0gฮxxx@กPH_ฆ๘โ‹/๐{๏กE‹ฐตตdeeกkืฎ๐๐๐@=๐๕ื_WุG‰5j`ศ!8}๚4ๆฮ mํŠฒ._พƒ†››LMM 333„„„ I“&x็wเ็็'ต:t(ฅ/†„††"%%“'O–j'"""ช, !„Pwค™™™055ลฝ{๗`aaก๎rdฉฐฐ;v์@PPtttิ]Ž,q ^ ๕ใจ_eว ไ๗wFFLLLชผ>ล""""ช๔C^Eปw๏ฦ„ Tฆu๎3gฮTSEDDDDฏ‡ื:v๊ิ :uRwDDDDฏž&"""’!†@""""b$"""’!†@""""b$"""’!†@""""b$"""’!†@""""b$"""’!†@""""b$"""’!†@""""b$"""’!†@""""b$"""’!†@""""b$"""’!†@""""b$"""’!†@""""b$"""’!†@""""b$"""’!†@""""b$"""’!†@""""b$"""’!†@""""b$"""’!†@""""zฃB`zz:–-[ฆ๎2Tไๅๅกmถ๐๔๔DLL ฌญญซิOBB๖ํWอี‘\ษ&ฟิZ}บBˆฑcว ___‘››+E๓ๆอฅenธ!พ๒Kแไไ$ยรรล๑ใวฅy111ขาs+++!„6l=z๔JฅR$%% ggg!„ููู"//O!ฤษ“'Eฯž=ฅm™0a‚ส>นvํšˆˆˆNNNbศ!"..ฎย}˜——'222ควอ›7q๏ฝ —ฃง  @lถMจปูโผ8๊ว1PฟสŽAFF† 222žk}ฺ๊ก•ๅใใƒAƒASS}๛๖…ฟฟฟส๓ฆM›–น\็ฮall 8pเ.\ธ อำาา$&&โ‹/พ@ff&าำำagg‡=z~๛m€››444 ฏฏWWWธqp๊ิ)ดhัcวŽE\\LLL*ต=วŽChh(444เๆๆCCCนsบบบ5j’’’ ฅฅ…ผผผr๛pppภดiำ‰ีซW# _}๕>๙ไ“2ฯ˜1SงNญT}DDD๔f{mNเะกCฐดดD๏ฝQXXจ๒|e.ghh(ฌกกณgฯ"!! 8sๆ `่ะกXฑb’““๑ัG!??_ZFWW ฉฉฉ๒sษ5†๎๎๎Xบt)Ž9‚ฝ{cใฦ(((จ๒vฮŸ?ฮฮฮHNNฦ๛Uj)หแร‡ŽYณfaาคI0`@นm'NœˆŒŒ ้q๓ๆอ*ืIDDDฏทื&^ฟ~6661b‚ƒƒqไศ•็ษษษ066FVVVน}๘๛๛K_Q*•HNNdggฃvํฺศหหร† žฉ.}}}ผ๛8qโๆฬ™ƒ qใฦ๘๖o+\ฎE‹ุดi„8 .„BกP }mฺดมฉSงค[อXXX`ืฎ]๘๕ื_Mอืf(‰ˆˆ่ !„๊.‚ิ#33ฆฆฆธw๏,,,ิ]Ž,bวŽ ‚ŽŽŽบห‘%Žมซใ ~๕ซ์”ฮศศxฎณz<|DDDD$C DDDD2ฤHDDD$C DDDD2ฤHDDD$C DDDD2ฤHDDD$C DDDD2ฤHDDD$C DDDD2ฤHDDD$C DDDD2ฤHDDD$C DDDD2ฤHDDD$C DDDD2ฤHDDD$C DDDD2ฤHDDD$C DDDD2ฤHDDD$C DDDD2ฤHDDD$C DDDD2ฤHDDD$C DDDD2ฤHDDD$C DDDD2ฤHDDD$C DDDD2คญ๎H}„€ฌฌ,่่่จนy*,,DNN2339jย1x5pิc ~•ƒฬฬL๗{ผชe,-- เ่่จๆJˆˆˆ่Yeeeมิิดสห3สXอš57nxฎQ œ>}๚น๛yฝชตeffยฮฮ7o„‰‰ษ+Sื‹่๏Uญญบวว~ซ๎พ^ๅ๗ว jไฒ฿ชณฟสށYYYฐตต}ฎ๕1ส˜ฆๆฃKBMMMซๅ ฏฅฅUmฟDซปฟWน6011แจนฟ๊@>๛ญบk^อ๗ว jได฿ิ๑yTo๘ลช6ฃFze๛{•kซNฏ๒vพสตU7น์7ށ๚๛“หTwฏrm/“†xซ ้ต•™™ SSSdddT๛$ฉr8๊ว1x5pิc ~/{ x$Pฦ๔๔๔0eส่้้ฉปูโจวเีภqP?ށ๚ฝ์1เ‘@""""โ‘@""""b$"""’!†@""""b”ฉE‹มมม๚๚๚๐๕๕ลฉSงิ]า#22*ฦK๓๓๒๒0jิ(XXXภศศฝ{๗ฦ;wT๚ธqใบvํ CCCXZZb๘๑(**zู›๒ฺ8t่บu๋[[[hhh`ถm*๓…˜์์์0{๖์ฝiฏ•งร AƒJฝ7:w๎ฌา†ใPu3fฬ€Œaii‰ž={โาฅK*mช๋๓'66อš5ƒžž6lˆ+Vผ่อ{mTfZทn]๊ฝ0|๘p•6/eษฮ๚๕๋…ฎฎฎXพ|น8ผ:tจ033w๎Qwio„)Sฆq๛๖m้๑฿I๓‡.์์์ฤ๛E\\œhผนhัข…4ฟจจHธบบŠ๖ํ‹๘๘xฑcวQซV-1qโDulฮkaวŽ"""BlูฒE[ทnU™?sๆLajj*ถm&E๗๎…ฃฃฃศออ•ฺt๎Yxxxˆ'Nˆร‡‹† Аi~FF†ฐฒฒ๏พ๛ฎ8w๎œXทn000K–,yY›๙ส{ฺ8 8Pt๎Yๅฝq}•6‡ช๋ิฉ“ˆŽŽ็ฮ "((HิซWO<|๘PjSŸ?๕—044ฑธpแ‚Xฐ`ะาาปvํzฉ๛ชชฬ8ŠกC‡ชผ222ค๙/ke่ญทฃF’ž [[[1cฦ 5V๕ๆ˜2eŠ๐๐๐(s^zzบะัั›6m’ฆ]ผxQวB<๚Eชฉฉ)๗_ฉอโล‹…‰‰‰ศฯฯกตฟ ž JฅRX[[‹9sๆHำาำำ…žžžXทnBˆ .โ๔้ำR›;w ๑ฯ?!„๘๑ว…นนนสL˜0A8;;ฟเ-z=•{๔่Q๎2‡๊u๗๎]@๚จe^ึ8๐tฐฬเฬ™3h฿พฝ4MSSํทว๑ใวีXู›ๅส•+ฐตตE๚๕๑๎ป๏โฦ€3gฮ ฐฐPe7n๕๊ี“๖๑ใวแๆๆ+++ฉMงN™™‰๓็ฯฟ y\ปv ๛ฏส>755…ฏฏฏส>733ƒทททิฆ}๛๖ะิิฤษ“'ฅ6ะีี•ฺt๊ิ —.]ยƒ^าึผbccaii gggŒ1iiiา<ŽC๕สศศ๐'พบ>Ž?ฎาGI)“ใPbอš5จUซ\]]1qโDไไไH๓^ึ8๐oหฬฝ{๗P\\ฌ๒ย+++คคคจฉช7‹ฏฏ/VฌXgggพ}SงN…ฟฟ?ฮ;‡บบบ033SYฦสส ๛/เ฿-s|Jๆัณ)ูgeํำว๗นฅฅฅส|mmmิฌYSฅฃฃcฉ>Jๆ™››ฟ๚฿$;wฦ;๏ผGGG\ฝz“&MB—.]p๘qhiiqช‘RฉฤุฑcัฒeKธบบ@ต}”ื&33นนน000x›๔Z*k 44๖๖๖ฐตตERR&L˜€K—.aห–-^80Uณ.]บH?ปปปรืื๖๖๖ุธq#?Iึ‚ƒƒฅŸเ๎๎Ž  66ํฺตSceožQฃFแนs8rไˆบK‘ต๒ฦแƒ>~vssƒ ฺตk‡ซWฏขAƒ/ญ>ž–™ZตjAKKซิทม๎นkkk5U๕f333CฃF๐็ŸยฺฺHOOWi๓๘ทถถ.s|Jๆัณ)ูgฝๆญญญq๗๎]•๙EEEธ>วๅช_ฟ>jีช…?วกบŒ=ทoGLL ๊ึญ+MฏฎฯŸ๒ฺ˜˜˜๐?บ)oสโ๋๋ *๏…—1 2ฃซซ ///์฿ฟ_šฆT*ฑ~๘๙๙ฉฑฒ7ืร‡q๕๊Uุุุภหห :::*๛าฅKธqใ†ดœœฌ๒หp๏ฝ011AำฆM_zฏ;GGGX[[ซ์๓ฬฬLœ๙ไ+ฎ]ป&Ž=*ฺทo/jีช%๎ฝ+„xt‹†z๕๊‰ˆธธ8แ็็'คๅKn ะฑcG‘ vํฺ%jืฎอ[ฤT ++Kฤวว‹๘๘x@ฬ›7Oฤวว‹๋ืฏ !"ฦฬฬL๚๋ฏ"))I๔่ัฃฬ[ฤxzzŠ“'OŠ#GŽ'''•[“คงง +++&ฮ;'ึฏ_/ yk’วT4YYYโำO?วืฎ]๛๖ํอš5NNN"//O๊ƒใPu#FŒฆฆฆ"66Vๅึ#999R›๊๘)น5ษ๘๑ใลล‹ลขE‹x‹˜วาาาDHHˆ022&&&"<<\deeฉดILLญZตzzzขN:bๆฬ™/k_ CNNŽุ่ฑฃจ]ปถะัั๖๖๖b่ะกฅ๓ษqจบฒ๖=-ตฉฎฯŸ˜˜กP(„ฎฎฎจ_ฟพส:ไ๎iใpใฦ  jึฌ)๔๔๔Dร† ล๘๑ใU๎(ฤห_0ษฏ $"""’!†@""""b$"""’!†@""""b$"""’!†@""""b$"""’!†@""""b$"""’!†@"ข— ;;M›6ลร‡ี]Š ?~™–qppภ‘#G^PEฯๆ๒ๅหhผนบห z-1‘,888 Fศฮฮ–ฆๅไไภุุ*ํ add ๔๋ื|ˆ7n   _ตส]ปvกs็ฮฯด๎๏ ฉRฯขจจ่…ฏใUQฒญ!!!Xถl™šซ!z0‘l„„„`อš5า๓ีซWใw฿-ท}5ะฝ{w\ผxQezIฬออEHHjึฌ‰š5kย฿฿ฟฬ~nธ[ทnมออMšๆเเ€9sๆ I“&066ฦไษ“q้า%x{{ริิร‡—ฺ*•JL™2vvvฐฑฑม˜1cŸŸXฑbฺดiƒaร†มิิัััธ>BCCaii‰๚๕๋cๅส•ๅnใใงvทo฿ggg้่่๚๕๋ห]๎ุฑchิจ,,,๐้งŸBฉTJ๓-Z'''ิชU Dvv6Š‹‹ัฅK๕ื_022‚‘‘Vฎ\‰5kึเ๋ฏฟ†‘‘‘ดอษษษ€นน9ผผผ'๕ญกก… ยััmฺด`ฒ ภDีBษ€ฝฝฝˆu๋ึw๏w๏u๋ึGŽ๖๖๖*ํ>,„"##Ct๋ึML™2EšŸ™™)ฌญญEqqฑXผxฑ่ึญ›ศษษ………โะกCeฎ{๛๖ํยหหซT="--M\ผxQ่้้‰:ˆ7nˆทo +++qเภ!„K—.M›67o๗๎-ZดjŠŽŽZZZ"::Z‹œœ$>๙ไ‘——'.^ผ(lllDbbbน๛ฅd{ญฌฌฤ‘#G„Bพ}[œ?พe …ธ}๛ถ๘็ŸDำฆMลฒeห„BlธQธบบŠิิT‘““#BBBฤ'Ÿ|"„"&&F4hะ@ฅฏŠฏฟZzž••%lmmลๆอ›EQQ‘ุบuซฐณณนนนB!ˆ๎ป‹ŒŒ ‘““#-gbb"RRRสฌ—ˆสฦ#D$ZZZ่ำง6lุ€ 6 w๏ะาา*ีฎK—.033ƒนน9._พŒ#FH๓๖๏฿ภภ@hjjBGGiii๘๋ฏฟ ญญ]๎‘ภ๔๔๔2ฏ3f jึฌ‰ฦรรร;w†ฌญญˆฤฤDภ๚๕๋๑้งŸขnบฐฐฐภไษ“ฑn:ฉŸ `ะ AะิิDFFbcc1cฦ ่้้กqใฦ ล–-[žบtttp๑โE<|๘ึึึhฺดiนm?๚่#X[[รึึใฦร† <:ํ=qโDุรภภ“&Mยๆอ›Ÿบ๎ทo‡‹‹‹46={๖„ฅฅ%Nœ8!ต๙๓ฯabbišฑฑ1222*ฝ"โ้`"’™w฿}kืฎลš5kส=ผs็Nคงง#''={๖Dืฎ]ฅy_†vํฺกWฏ^ฐททวŒ3ส์ฯิิดฬo[ZZJ?”z^ฒฬญ[ทPฏ^=ižฝฝ=nบ%=ฏ[ทฎ๔๓7——‡ฺตkรฬฬ fffXฒd ๗฿ ๗ lผ[ทnEบuันs็Rงมgggง๒๓ํทฅ๕6LZwซVญ๐฿=uื๐เAiy333\ผxฑํ-‘••SSำJฏ‡ˆ‰Hfผฝฝq}>>ถีำำCXXฮœ9ƒ{๗๎x๔ฅ‘N:tuu๑ีW_แ๒ๅหุฝ{7พ{ฤฦฦ–๊วออ Wฏ^ญrอถถถธqใ†๔ฦฐตต•žkhhH?ืฉSFFFx๐เาำำ‘žžŽฌฌ,DEE=u=พพพ๘ใ?p็ฮxxxจ}าอ›7U~.๙‚M:uฐrๅJi้้้า7ฒฏณฌฺK–๏ิฉSฉๅCCCห]ๆ฿EQQ4h๐ิm$ขรHDฒณeห–J-,,ฤฺตkaii คคคภฤฤD <1118<”J%LLL ญญ]ๆ้e{{{X[[#99นJ๕๖๏฿฿~๛-๙็ฟ_5‚ƒƒหl[งN๘๙๙แ‹/พ@NNŠŠŠp๖์Y\ธpกยu`ํฺตศฬฬ„ŽŽŒŒŒส– ,ภ;wp๛๖mฬŸ?๚๕ผ๛๘ๆ›oคะ{๛๖m์ฺต ภฃ#Ÿ๗Ÿสmz,--‘šš*=๛ํทmถกจจนนนุตkW…งz:„ถmB[[ปยm$"U D$;M›6ญ๐zทŽ;ยศศตjีBLL ถm Rท†น}๛6z๖์ ๘๘๘`ุฐaๅ^8x๐`•๋๘žลเมƒัซW/ผ๕ึ[hฺด)<<<0qโฤrฏYณ7๊ืฏKKKŒ;นนนO]ฯส•+aoosss์ป .,ทmฟ~เ๏๏WWWt่ะแแแ}{๐เมฺ่ต+LLL(ะ&Mš Gฐณณƒ™™€Gก๑ไษ“033รศ‘#ajjŠ?๘ ,€ฅฅ%ฐt้า ๋^ทn†๚ิํ#"UBก๎"ˆˆ^;wฦ็ŸŽึญ[?๓ฒููู๐๑๑มฉSง^นFฟฮฎ\น‚ฐฐ0?~ผฬำอDT>†@"ขJš={6ฦu—BD๔‰ˆˆˆdˆืษC ‘ 1ษC ‘ 1ษC ‘ 1ษC ‘ 1ษะXอuะx๛†๋IENDฎB`‚c4core-bm-charconv-xtoa-mega_bytes_per_second-i16.png000066400000000000000000000744511477602032300330730ustar00rootroot00000000000000c4core-0.2.6/doc/img/windows-x86_64-vs2019-Release‰PNG  IHDRrOีw.9tEXtSoftwareMatplotlib version3.5.3, https://matplotlib.org/อ+นา pHYsaaจ?งix–IDATxœํw|N็?๐ื}gษN„ IJศ%4V์‘ABPตk–ขZซFKฉU5*FkคถmJAฌ Dดญ=2„์๋๗‡_ฮื-››8๑z>๗C๎sฎs๗นœ$ฏœu+„DDDD$;ส๒.€ˆˆˆˆ^ ƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษƒษZa``Pe)"" …;v์(๏RJeฦŒP(x๐เAy—B๏‰-Zภููนผหจp fฬ˜Qe”IaccSeศƒฝ–ฐฐ0ูฐ Rท๏พ๛ฟ๖[ฉฏXฑจUซ ๚๗๏_hป`ญT*q๓ๆอ๓SSSกซซ …BQฃFฝb๕T’งOŸbฦŒˆˆˆx๋๋ŽŒŒฤŒ3œœึื-'ล.ฺบu+>๘cุููAกP E‹ล๖u๎9๘๙๙กrๅสะำำƒณณ3–,YขถzิAŽ^KXXfฮœYe•ซฒน๏ฟ‡‚““455Klฏฃฃƒอ›7˜พs็ฮฒ”Iฏ่้ำง˜9sfนน™3g–9ศ={๖ SงN}3Eฝ!ซWฏฦฅK—^iูโ~ญXฑฟ;ฌฌฌ`jjZl?๛๗๏‡——๎ป‡ฏฟ?๘#:u๊„Wm๕จ[ษ?AˆจยKOO‡พพ~y—!+Bddd@WWทฬห9rD:WšK|||ฐy๓f|๙ๅ—*ำ7mฺ___๏+s ๏“ผผ}>>>055…พพ>\]]๑ใ?ชด9t่š5k}}}˜˜˜ K—.ธx๑ขJ›S7๚๗๏cภ€x๚๔ฉิฮูู-[ถ,PG^^jึฌ‰€€•ieู/๖ํ‡ @WW+Wฎ„Bก@zz:ึฏ_/}uช4Ÿตตตส๗JIz๗๎˜˜$&&Jำ๎นƒC‡กw๏ฅ๎'์oฟggg่่่ภษษ ๙งJปขฎUสย๚พ};กซซ ///ฤววVฎ\‰:u๊ RฅJhัขE1_TT7n ]]]ฺฺุ"88ธ@›ฬฬLLŸ>u๊ิŽŽฌฌฌ๐ๅ—_"33ณะš6n'''่่่Hธeหิฏ_†††022‚‹‹K}๑EIIIจZต*`ๆฬ™า๑‹งอJณ๏e้าฅprr‚žžLMMั Alฺด ภ๓๑ž0aภึึVZwท/ืXฺ๏เ๙๏€ัฃGฃJ•*044„ŸŸ๛๏ฟ}ฆฅฅแ๓ฯ?—~™››ฃmถ8w๎œิฆ,?+^๏’’’ P(ฐ`มฌZต ตkื†ŽŽ<==qๆฬ•ๅŠ๛]deeUชPถiำ&ฝ{ณgฯ†RฉDzz:๒๒๒J\ฎฐํ(ฎตD…8u๊”ะะะcวŽ•ฆ ]]]q้า%!„‘‘‘ขmถ€ ‘^B‘——'Zตj% …s•uyzzŠ๛‹~๘A,]บTดkืNห–-+ฑฮ~๚‰J•* ;;;ัทo_ฑlู2ัฉS'@|๕ื*m,455ล!CDppฐ๘๊ซฏ„พพพ๐๔๔YYYR;kkkQฏ^=QญZ51y๒dฑlู2๑แ‡ …B!ฮŸ?/ตKKKฮฮฮBCCC 2DฌXฑB|๛ํทยำำSDGG !„8|๘ฐ <<}บ ๎฿ฟ/„โ๏ฟตjี๎๎๎าดทk๚๔้%ํ฿ฟ_hkk kkk1}๚tฑbล 1z๔hัฆMฉอ„ฆฆฆจ[ทฎ˜7ož˜9sฆจRฅŠ055ืฎ]“ฺๅื็แแ!บu๋&~๚้'1x๐`@|๙ๅ—Rปoพ๙F(•Jq๛๖m•ZŽ9"ˆํทฟา~QงNajj*&Nœ(‚ƒƒลแร‡EHHˆะััอš5“พ"##K—|๚๚๚ข_ฟ~…ฮห฿{๗๎ KKK•}z๑โลยุุXdddbไศ‘%ฎ €pss5jิ฿~๛ญXผxฑ๘เƒ„žžžx๐เิฎ_ฟ~ยฺฺบศz^๎ำีีUXYY‰นs็Šนs็ cccQซV-ฑlู2แ่่(.\(ฆN*ดตตEห–-U–ฯ฿๏อออลจQฃฤ’%KDำฆM๑๓ฯ?KํrssEปvํ„žžž๘๓ฯลส•+ลจQฃ„ฆฆฆ่าฅKšDีชUลฬ™3ล๒ๅหEttดุฟฟ Zทn-–/_.–/_.F%‹ณ'Ožˆ+Vขkืฎาqllฌข๔๛naVญZ%ˆ€€ฑrๅJ๑ใ?ŠAƒ‰ัฃG !„ˆฝz๕ฤ? ญ๛ษ“'ลngผฟ?K๛ฝ#„=z๔D฿พ}ล๒ๅหE=„››[>{๗๎-ดตตลธqใฤš5kฤ๗฿/:w๎,~๕WฉMY~Vผผ฿]ปvMชนN:โ๛๏ฟ๓ๆอUชT–––า๗gqฟ‹^ๆไไ$ผฝฝ ืฝ{wadd$8 ๊ึญ+}}}1lุ0๑์ูณ๋ฯW–zิAŽŠ4iา$กT*ลัฃGล๖ํฑx๑b•6#GŽ,๐ƒ]!~๛ํ7@ฬš5Kez@@€P(โ๏ฟ–ฆ=}๚ดภ๒ํท|๐A‰5๖๋ืOŸ}๖™4-//O๘๚๚ mmm)|;vL7nTYฯ?,0ฺฺZG•ฆปwO่่่ˆ๑ใวKำฆM›&ˆ;wจ+//O๑?ฤDffฆ4วD||ผ4อ[›6m’ฆ%&& BฉTŠSงNIำ๗ํ'ˆตkืJำ ว“'O bร† าด ืดiS‘““ฃาล w๑โEaaa!<==ลฃGTฺ•๖‡sNNŽฐตตึึึโ๑ใว…Ž‘Bธปป sss๑๐แCiZllฌP*•โ“O>)P฿ภU๚ฺ๊ตซ033“_บtIK—.Ui7bฤa`` ีซ์๙gํ,.Œ•ค4A๎๛โ‹/พu๊ิ‘ๆyzzŠ!D™‚œถถถส๗_lllฑ*kำััQ -+WฎD๕๊ีUุ˜4i’ า6ฟ_ธpก4-33Sฺ'๒Y‡„„ฅR)Ž;ฆฒเเ`@œ8qBฅ&ฅR).\ธ าvฬ˜1ยศศจภ~_’๛๗๏นฟ—v฿-L—.]„““SฑmๆฯŸ_`ฬ๒ต๙๓ r%}๏DEE๚w ๔ill\โ~งŽ gffฆ๒3่๗฿ฤ!M+๊wัหŠ rฎฎฎBOOO่้้‰ฯ>๛L๏Ÿ}๖™ ‚‚‚J์๛EฅญGxj•Š4cฦ 899ก_ฟ~1bผฝฝ1z๔่R- ํว!๖๎+M{๑ฃ””|ˆ:u๊ภฤฤDๅTGพ!C†@CCฃภt8<ผฝฝaccƒ๐๐๐ทhัBˆ๏สŠŽŽฦตkื๐๙็ŸรฤฤDe^พ}111่฿ฟ?*Wฎ,อwuuEถmV ฿aร†ฉผoึฌ>|ˆิิT@บuแ๎๎Žญ[ทJmrssฑcวt๎Yซฒ๎ถถถh฿พ}ฑฆ๔๎7ฮœ9#[–ำช๙ฺดiƒฺตkK๏]]]addT`_,‹ึญ[ซœห฿?ปw๏CCรำ_^—ฆฆ&†*ฝืึึฦะกCq๏=DEExๅเเ{{{•ซVญZ@+ooo8::ชL311Azz:8๐ส๚ขWูw_ฎ็฿U9MXV…mgqJ๚ษ?5;bฤ•vŸ}๖YพLLLp๚๔iบuซศ๕•๖gEqz๖์ฉ๒3จจŸŸฏ๋ษ“'x๚๔)>๙ไ,Yฒบuร’%K0t่PlูฒWฎ\Q๋๚ิ…AŽŠคญญ_~๙ืฎ]CZZึฎ][๊๓ืฏ_‡………สqpppๆ็;qโฺดi#]_RตjULž<Jไ”J%>๘เ•iu๋ึ้Z’+Wฎ %%ๆๆๆจZตชส๋ษ“'ธw๏žส๒ตjี*ฐSSS•๋ฆ๙็ŸR?๊ๅ๒(ฝ|–ฅฅe1666†••Ui//์ู3L›6Mบ&ฑJ•*จZต*’““ G[["๋ํน3 ฑo฿>•b ๗ฯ?@ฑใ”ฟ/ิซWฏภ<uแ]ซTฌ}๛๖222pๅสต"๛็ŸะบukุcัขEฐฒฒ‚ถถ6ยยย๐ร?ผา…ฆ…ษหหƒนน96nX่‹™๓uคJผtEi•ถฟขฺ•f๙ฯ>๛ kืฎล็Ÿ///CกP ((จะq,๎nห๎ปc๚๕ุธqฃส‘’wEiฦฃgฯž˜4iถo฿Žฯ?ถmƒฑฑ1:t่ ต)๋~๑*wจชS๏ฝฑbล ขgฯžฏtW]iฦฎจ?ุrssหิง:ฟ๒๒๒เโโ‚E‹:ๅะXุ•นน9bbbฐo฿>์ป{๗๎ลฺตk๑ษ'Ÿ`๚๕eฎ้u988เาฅKุฝ{7๓O๏รO?„iำฆ•๚ัe'ี๙าฃG4kึ ปvํย๛1||๗ุนs':v์XๆŠข๎ŸวEฑฐฐภ… PญZ5•้ๆๆๆิี…AŽŠ‡oพ๙ @LL Œ๘๘x้ฏj ่๘ึึึGZZšสQนป๎ฌญญ๑233ช๒WืหงIŠ“——‡ซWฏJ™ภๅห—@:Sปvm„‡‡ฃI“&j๛e\ปvmœ?^-}ฉรŽ;ะฏ_?,\ธPš–‘‘๑J?>4551bฤพา)<า)ผ๓็ฯฃM›6…ถษ฿ {~Tbb"ชTฉ๒JFฑตตEร† ฑu๋VŒ5 ;w๎„ฟฟ?tttT๊Sว~๑F๏H{A๏ฝ1mฺ4พ}!!!ol=ฆฆฆ…๎7/IWง[ทnxNa฿รฑฑฑhบ๕kทถถ6:w๎Œฮ;#//#FŒภส•+๑๕ื_zิ (็๐z๛ฎพพ>z๖์‰ž={"++ บuร์ูณ1iา$TชT้ญํ[๙ฌญญ‘——‡kืฎมฮฮNš๒]๖๙jิจ#F`ฤˆธw๏>๐Cฬž=[ญAฎ4ิ1N๕๋ืว๐฿ฉeอ?u๒voบžาโฉU*Tvv6๚๗๏ ๘ใXทn๎ฝ‹ฑcวชดห!๕๒}ไๆๆbูฒe*ำ๘แ( ้›€็W๗Vฏ^]`๙gฯž{ 3฿ร‡U+•Jธบบ@G˜ผHOO@มŸsฏป๏พ\ถถ6!„@vv6€ขฦพ)๙ื€๔ำO*ำ—.]ช๒>77ทภ%ๆๆๆฐฐฐPหฒ>ช่Uฉcœz๔่๘๙็ŸUฆฏYณššš%~"„บ๋)-‘ฃBอš5 1118x๐ แ๊๊Šiำฆa๊ิฉ~@ๅ=z4ฺทo กs็ฮhูฒ%ฆL™‚คค$ธนนa๘๗฿๑๙็ŸKGjฺตk'…ยรรฑhั"XXXภึึVๅๆ”—๑วˆ๐ฆธธ8ฬš5 เ็็'…‹ยŒ3ฆ4›Z‚‚‚๐ีW_กkืฎ=z4ž>}Š+V nบ…8๓บ,,,๐๗฿#)) u๋ึลึญ[ƒUซVI‰ํท/ถm†aร†แ๐แรhาค rss‘˜˜ˆmถIฯ๗+ฮเมƒ๑่ั#ดjี –––ธ~:–.] www้๚ย่๊๊ยัั[ทnEบuQนre8;;รูู๙ต๖vํฺกz๕๊hาค ชUซ†‹/bูฒe๐๕๕•ฮdไŒ2e ‚‚‚ ฅฅ…ฮ;ฟฑxืฏ_ปwวโล‹๑๐แC|๔ัG8rไˆt„4HSZZ,--777 <<gฮœQ9+PฺŸ๊จ(๘ปŽ=ŠฃG๎฿ฟ๔๔t้๛ญy๓ๆhผ9€็ืก8ฟ๒ rrrเํํˆˆl฿พ“&M‚………Z๊Qปทro,ษJTT”ะิิTyค‡ฯ%แ้้),,,คGIไไไˆฯ>๛LTญZU( •ญำาาฤุฑc…………ะาาvvvb๙*BˆะะPแ๊๊**Uช$lllฤ๗฿/~๙ๅ—"oนQฟ~„พพพ๘็ŸคgLUซVMLŸ>]ไๆๆhฟjี*Qฟ~}กซซ+ …‹‹‹๘๒ห/ลญ[ทค6ึึึยืืทภฒn[๘๐ก5j”จYณฆะึึ–––ข_ฟ~า3น๒oฝ๑นeB฿m๕/>>ฤปะGU^zไฤใวล€D•*U„h฿พฝHLLึึึ*ทศศ™3g ๔๙๒sไ„xXoooa`` =ฅ,Bˆใว‹ถm CCCกฏฏ/\]] <$<<\4iาD่๊๊ ###ันsg‘Pb}/nSa๛K“&M1x๐เ"๋{Bˆ็‰iผนะีีJ|Ics {ฝธOตฝ/{y_(kป—๗!ž?ฯููYhkk‹z๕๊‰_ตศวผg=|•้…}?ไ๏๗gฯž^^^ขRฅJยฺฺบะ็Hfee‰๏ฟ^899 ajj*๊ืฏ/fฮœ)RRRJฮ;vˆvํฺ sssกญญ-jีช%†Zเyƒ…‰ŒŒ๕๋ืฺฺฺ๖า์ป…Yนrฅhผน033:::ขvํฺbย„ *"„฿~๛ญจYณฆP*•*๛yq๏/ืX–๏๔๔t1rไHQนrea`` ฅG๚ไ?s233SL˜0AธนนI฿ืnnnโงŸ~R้_yy?*l๛Š๛]”ฟํ…ฝ^ฎ+++Kฬ˜1CX[[ ---QงN๑ร?”X๛หŠซGB”ร9 """’˜˜xxxเื_EŸ>}สปzฏ‘#"""ษ‹อ˜o๑โลP*•าiHzw๐9"""’ฬ›7QQQhูฒ%455ฅGต|๚้ง๓๒พIII)4่พจz๕๊oฉš็xj•ˆˆˆ$ภฬ™3‘€'Ož VญZ่ท/ฆL™Mอ๗๛๘OK|ๆเŽU rDDDDฅP์G’(๒™™o ƒ‘L๑f""""™b#"*ฦอ›7QฉRฅ2˜๙ป,"" …ฏW‹-เ์์๚Eฝ>๚่#|๙ๅ—ๅ]Q™0ศัทn:( ( ?~ผภ|!ฌฌฌ P(ะฉS'•y๙หๅฟ๔๕๕แ่่ˆYณfแ้ำง…ฎ/>> …๕ืkือ7฿ QฃFhาคษk๗Eฅ๓w฿แท฿~+0=223fฬxc{๔ีW_a๙๒ๅธs็ฮ้Ÿ่M`#ขทฆRฅJุดiS้GŽมฟซ๒๖/jถ-BBB‚… ยรร_5๚๕๋Wh๛={๖ภžžžฏU๏๛๗ฑ~z 6์ต๚yื4oฯž={gŸ V\›9sๆ r]บt‘‘Qฯ%z—ฝ฿๗ั[ๅใใƒํทcษ’%*1ุดi๊ืฏ_ไkืญ[ฑ๔~ุฐaศสสยฮ;‘‘‘J•*ฉด CวŽฅฯ…|Uฟ๚+455ันs็ื๊Gาำำ_๛s6•Je1{Ÿ=}๚zzzP*•ภ† 0sๆฬืˆ‘#ขทฆWฏ^x๘๐!8 MหสสยŽ;ะปw๏2๕Uฝzu(ŠฯตJNNFdd$|}}ฅi[ถlA๚๕ahh###ธธธเว,qฟ๖5j•้๙ื…ลลลมzzzจSงv์ุเ๙ฦFAWW๕๊ีCxxxพฃฃฃัฑcGมภภญ[ทฦฉSงTฺไŸ’>rไFŒsssXZZJ๓๗๎‹fอšA__†††๐๕๕ล… Jฎยฎ‘ปrๅ บw๏Ž๊ีซฃRฅJฐดดDPPRRRJ์ขขขะธqc่๊๊ยึึมมมฺdffb๚๔้จSงttt`ee…/ฟ™™™R…B๔๔tฌ_ฟ^:ฟฬ˜1&LฺฺุJ๓’’’คe๕Wิฏ_บบบจ\น2‚‚‚p๓ๆM•๒๏ขขขะผys่้้a๒ไษาถmโ๚๕๋ˆ‰‰)ีv•79"zklllเๅๅ…อ›7Kำ๖๎‹””น\FF}บภบFŒ„„L›6 'N„„„ภืื๘๛๏๑๕ื_#!!M›6U 7ฅ‘••…๖ํใิฉS๘์ณฯฐ|๙r|๚้งธz๕jฉNc>~>>>จ_ฟ>ๆอ›KKK >ฟ๒‹ิ&//~~~Xฐ`:w๎ŒฅK—ย฿฿?๐z๖์)ต ŽŽš5k&N:t(บu๋†^ฝz~๘แi^ีชUณgฯฦ'Ÿ|;;;,ZดŸ9<ˆๆอ›ุ†‡ขcวŽpwwวโล‹ัฒeKi^๚๕ BBœ "zรึฎ]+ˆ3gฮˆeห– CCC๑๔้S!„ขeห–B!ฌญญ…ฏฏฏสฒ }๙๛๛‹ŒŒŒ๋๊ทฏ๐๖๖–3F‰œœœ2ี๗฿ b้าฅๆy{{ bำฆMาดฤฤD@(•Jq๊ิ)i๚พ}๛ฑvํZišฟฟฟะึึ๓4ํึญ[ยะะP4o\š–?nM›6Uฉ?--M˜˜˜ˆ!C†จิu็ฮall\`๚ห>,ˆร‡ !„ˆŽŽฤ๖ํ‹”Bไลย… ฅi™™™ย]˜››‹ฌฌ,!„!!!BฉTŠcวŽฉ,,ˆ'NHำ๔๕๕Eฟ~ ฌk๙€ธvํšส๔คค$กกก!fฯžญ2=>>^hjjชLฯฏ788ธศmาึึร‡/q‰<"GDoU=๐์ู3์ฝiiiุฝ{w‰งUปt้‚เภ๘๗฿1iา$๙็Ÿ่ปทสวแไๅๅแฯ?T9ญjbb‚๔๔t•ำนฅ๑๐แC€ฉฉiก๓ TŽ"ึซW&&&ppp@ฃFค้๙__ฝz››‹๛๗ร฿฿|๐ิฎF่ป7Ž?ŽิิT•u 2า๛ 99ฝz๕’ŽT>x๐hิจ>\ฆm566๐hfQwGSSC‡•kkkc่ะกธw๏ขขขทo‡ƒƒ์ํํUjnีช”นๆํนyyy่ัฃ‡J฿ีซW‡]พutt0`ภ€"๛355-๒zMขw ov ขทชjีชhำฆ 6mฺ„งOŸ"77ล.ciiฉ๒ฑ7~~~033ร_|ปwK7#œ9s๗๏฿W r#FŒภถmะฑcGิฌYํฺตC=ะกC‡Rี+Š๘๐KKหร๘P๑๔๘๑cฯ๏„}๚๔)๊ีซW Oไๅๅแๆอ›prr’ฆฺฺชดปrๅ H!่eFFFลmRถถถ7n-Z„7ขYณf๐๓๓รว,ี_ ‹7`ิญ[””„>๚Wฎ\มล‹ฅSก/ปw๏^™j~ั•+W „€]ก๓ตดดTืฌYฺฺฺE๖'„เ$ rD๔ึ๕๎C† ม;wะฑcG˜˜˜”นึญ[Ž=*นฐฐ0ุุุภััQjgnnŽ˜˜์ท{๗๎ลฝ{ฑvํZ|๒ษ'ล~๘ต™™€ `/{๑YiฆKCWWWๅ}^^€็ื“Uฏ^ฝ@๛W๙`๓… ข๘๗฿ฑ~Œ=sๆฬมฉSงTnฐxUyyypqqมขE‹ r.k฿ …{๗๎-t_พYๅๅ๑|Yrr2ชTฉ๒ส๕ฝM rD๔ึuํฺC‡ลฉSงฐu๋ึW๊#''๐ไษiฺž={เใใS ญถถ6:w๎Œฮ;#//#FŒภส•+๑๕ื_ฃN:…๖_ซV-่๊๊โฺตkฏT_QชVญ ===\บtฉภผฤฤD(•สCMํฺต<ฉ๊€nธธธ`๊ิฉˆŒŒD“&MŒYณfปญ[ท <ๅ๒ๅหž฿เ’_sll,Zทn]โัฎขๆ5ฝvํฺBภึึV:๘ช๛๏?deeมมมแต๚!z[xฝuXฑbfฬ˜๑สฯh๛ใ?nnn€ปw๏โนs*งUปึ-ŸRฉ„ซซ+จ<๖โeZZZhะ ฮž=๛J๕ECCํฺตร๏ฟฎrw้ปwฑiำ&4mฺดฤSฃํท‡‘‘พ๛๎;dgg˜2ี”šš*ใ|...P*•ลŽQพœœฌ\นRzŸ••…•+Wขjีชา] =z๔ภ‡ีซWXูณgHOO—๋๋๋zทl~P|y^ทn กก™3g8๒)„(ฐ'šพฦ—zข๒ฤ#rDT.Š๚T†ย\พ|ฟ๚+€็o=u๊ึฏ_:u๊ o฿พžŸVญTฉ’สฃ$`๐เมx๔่ZตjKKK\ฟ~K—.…ปป{‰G]บt้‚)Sฆ 55ตฬืgึฌY8pเš6mŠ#F@SS+WฎDff&ๆอ›Wโ๒FFFXฑb๚๖ํ‹?AAAจZต*nธ={๖ I“&XถlYฉ๋9t่F…ภภ@ิญ[999 ††บw๏^โ๒๘๛๏‘””„บu๋b๋ึญˆ‰‰มชUซค๋ำ๚๖ํ‹mถaุฐa8|๘0š4i‚\$&&bถmุทo4hเ๙#@ยรรฑhั"XXXภึึ5’Bแ”)S---t๎ตkืฦฌYณ0iา$$%%ม฿฿†††ธvํvํฺ…O?_|๑EฉฦโภจUซ<<>>๚ฑc‡hืฎ077ฺฺฺขVญZb่ะกโ๖ํ%ึ}๗๎]กฉฉ)BBBTฆ{{{ ''งRีŸฟ #GŽT™v๎9ัพ}{a`` ๔๔๔Dห–-EddคJ›’ฦํ๐แรข}๛๖ยุุXTชTIิฎ][๔๏฿_œ={ถุํz๙๑#Wฏ^ตkื•*U•+W-[ถแแแล๖#ฤลูณg…———จTฉ’ฐถถห–-+ะ6++K|๗ยษษI่่่SSSQฟ~}1sๆL‘’’"ตKLLอ›7บบบ€สฃHพ๖[QณfMกT* <Šไ๛Ÿhฺดฉะืื๚๚๚ย^Œ9R\บtฉ@ฝ…ษออ5jิSงN-qป‰ !^ใ \"ขw@NNฬฬฬ0gฮŒ1Bญ}4—/_ฦฑcวิฺ/ฝ{~๛ํ7๔๎๓jิจQๅ• ƒษฝ{๗๐ำO?a่ะกj|ใฦ ิญ[D“&Mิฺ7ฝ[ผผผะฌYณR&zW0ศษ๏Z%"""’)9""""™b#"""’)9""""™โ+ธผผ<บu †††h"""™B -- P*‹>๎ฦ Wมบu๋ต>Œšˆˆˆสฯอ›7aiiYไ|น ฮะะpํฺ5Tฎ\นœซ‘ท์์l์฿ฟํฺต“>vˆ^ วR}8–๊รฑTŽๅ๋KMM…•••๔{ผ( r\้TCCCต~Vไ๛(;;zzz022โฆืฤฑTŽฅ๚p,ี‡cฉ>%]ล›ˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆ4หปz;ฺ/>R{ฟกกกXฒd เท฿~ร฿ฺ}!""โต๛y™ฒฒฒ<SSSฉดน>|}}แเเ'''ะะPŒ9๎๎๎HKKร_…fอšแร?D`` ž>}Zไzฟ๚kิซWํฺตรร‡ฅ้{๖์มG}www 6 yyy…n็ห’’’0y๒dุใ๒ๅหdddZดh!…ด|ษษษ8<บu๋066†ŽŽภ฿฿‡ขTc™™™‰ิิT•ULฏไโโโฐ|๙rœ8qฑฑฑ3f -Z„~๚-มมมœ={ƒ4iา‘‘‘HMM…ถถ6"##QQQจ_ฟพดžปwcำฆMR5‚ŸŸ–/_Ž˜˜่่่`ย„  ลนs็ะฐaC๔ำO…ึื_แภ8<ึฎ]‹SงNK๕yีฑ<๗uซ7X•ผไNII‘ฎฯ/ ?ูˆˆˆHฆิ~ณรปจQฃFศฬฬT™๖ื_I๊%"""’ฃ๗"ศ>}บผK """R;žZ%"""’)9""""™b#"""’)9""""™b#"""’)9""""™b#"""’)9""""™โgญVp๙Ÿี๖เม˜™™•w9ฒ–ฐฐ0๘๘๘@KKซผห‘5Žฅ๚p,ี‡cฉ>หืวฯZ%"""ชเไˆˆˆˆdŠAŽˆˆˆHฆx\—Ž}่ฏ'กฉg\ๅศšrัJ๙ๅีF.4สปYใXชวR}8–๊๓.ๅฒฎๅ]Bฉ๐9"""ข ŽAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆ*T ภG}Tbปณgฯbโฤ‰€ˆˆœ={๖ีไใใƒฌฌ,ฉ>SSSฉดน>|}}แเเ'''}:<==แ์์Œษ“'ฺoRR&Ož {{{\พ|`ccƒŒŒ @‹-ค–/99็ฯŸGทnฦฦฦะัั๘๛๛# แแแB”} ˆˆˆจB“]‹‹‹ร๒ๅหqโฤ ฤฦฦbฬ˜1Xดh๚๕๋W $#88ภ๓ำฉƒV™oee…aร†aส”)ˆ‰‰Aฝz๕0`ภฌ\น๑๑๑x๔่6o 3f ฮœ9ƒธธ8ฤลล!66››‹ะะP๘๘๘ [ทnจYณ&ฮ;RmฯตkืPนre๔์ู*a4""C‡ลส•+แ์์Œ ”xฺ533ฉฉฉ*/"""ช˜4หป€ฒส?šfddx๖์๖๏฿๐๐p\ฟ~]ฅํฐaรคฏ4h€5kึwrr2๒๒๒Pฟ~}@Ÿ>}ฐw๏^|๑ว8x๐ ๆอ›‡ฬฬLฝ{ pssƒฟฟ?.\ธ€ 6 iำฆež\œ:u ็ฮCบuแ๏๏ะะP๘๙๙AกP mถhถ-๎฿ฟฑcวยาาWฏ^………Eกอ™33gฮ,sDDD$?ฒ;"๗ฒ˜˜$$$ภึึM›6Ett4ิบŽŒŒ Œ7{๖์A\\‘™™ เyp๊ะกˆฏพ๚ Wฎ\)S฿ฐณณƒ““ดดดะฉS'้hK๕แXชฯป<–หบ:”w ฅ’๛;%%ฅุณkฒ;"GDDDDฯ1ศษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษ”fy@oว์v033+๏2d-;;aa`Aงzะาา*๏rdcฉ>K๕แXชว๒ํแ9""""™b#"""’)žZ}Olบ†้ๅ]†ผๅๅข2€_ฯ (5สปyใXชวR}8–๊๓žŒๅฯZๅ]ศษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษT…r๘่ฃ^y๙ˆˆœ={Vฉ๒๑๑AVV€็ตššš"((Hฅอ๛๗แ๋๋ 899แมƒoฌ"""ชdไ8 ื๊ใMน์์lคงงยยย ญญ 5j6lุP ่ัฃ1hะ \ผx‘‘‘044<~XญuQล!ซ ทz๕jธธธภออ ำงOGvv6พ๛๎;L:ตTหoูฒ€จจ(xzzโๆอ›ฦ์ูณแ๎๎ŽK—.แฬ™3hะ \\\0|๘pไๆๆฆOŸOOO8;;c๒ไษ…ฎ#)) “'O†ฝฝ=._พ ฐฑฑAFF E‹RHห—œœŒ๓็ฯฃ[ทnccc่่่€๐๐p!JฦฬฬLคฆฆชผˆˆˆจb’M‹‹‹ร๒ๅหqโฤ ฤฦฦbฬ˜1Xดh๚๕๋W #88p๖์Y <„์์llผC‡ลชUซ`ee…aร†aส”)ˆ‰‰Aฝz๕0`ภฌ\น๑๑๑x๔่6o 3f ฮœ9ƒธธ8ฤลล!66››‹ะะP๘๘๘ [ทnจYณ&ฮ;RmตkืPนre๔์ู*ม4""C‡ลส•+แ์์Œ {ฺuฮœ9066–^VVVฅd"""’อ๒. ด"""###ภณgฯฐ~„‡‡ใ๚๕๋*m‡ &} AฌYณFz GGG >ผะ •œœŒผผ<ิฏ_ะงO์ป1<ˆy๓ๆ!33w๏EBBเ๏๏ .`ร† hฺดi™ท-77งNยนs็Pทn]๘๛๛#44~~~P(hถ-ฺถm‹๛๗๏c์ุฑฐดดฤีซWaaaQ ฏI“&aธqา๛ิิT†9""ข J6Gไ^ƒ„„ฺฺุขiำฆˆŽŽ†ŸŸ_‰ห%%%AGGทo฿.ำ๚2220n8์ูณqqq Dff&€็Gม:t่€โซฏพย•+Wสิท……์์์เไไ---t๊ิI:ฺOž<มฯ? ???นs!!!จVญZก}้่่ภศศHๅEDDD“l‚\ซVญฐeห้š////พ}III8~8<<<Zl™™™>|8ยรรq๓ๆM์฿ฟ`hhˆดด4€‰‰ 444ค ตy๓f4mฺP*•055ลฃG๐วH:;;ใงŸ~Btt4์์์ะปwoดlูIIIฅฺ6 ˜˜˜เๆอ›Bเศ‘#ฐทท|๑ลpuuEbb"BBBŽภภภืพมƒˆˆˆไO6AฮููฃFBใฦแๆๆ†%K–ูถจkไพ๙ๆtํฺฮฮฮXตjฦŽ‹'Ož s็ฮ ‡‡.]บ„_~๙ƒ ‚‹‹ Œ๔๊ี ่ึญผผผ ฌW__ƒฦ™3gฐ`มhjK๕yOฦr€gญ7ึw๏๏”””b/“’อ9""""Rล GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2U๐SฉB๊้Vfffๅ]†ฌegg#,,h --ญ๒.Gึ8–๊รฑTŽฅ๚p,฿‘#"""’)9""""™b#"""’)^#๗žˆJJ…แc๒.Cึ๒rs]MRƒ฿:ฏƒcฉ>K๕แXชOiวาซŽษ[ชจโโ9""""™b#"""’)9""""™b#"""’)9""""™b#"""’)9""""™b#"""’)9""""™b#"""’)9""""™b#"""’)9""""™*— €>๚จฤvIIIุฑc‡ฺึ;cฦ ซญฟา ล’%K{๗๎…‹‹ ”J%Uฺญ[ทpttฤฌYณjDDD$Ošo{…€††Fฉฺๆน€€€7\UษrssK]7<~ฆฆฆ๐๓๓“ฆูููaถm>|ธJ‹/b๕๊ีˆŠŠ‚žž๎ปHII‘‘ …z6‚ˆˆˆ*”7zDn๕๊ีpqq››ฆOŸŽ์์l|๗w˜:ujฉ–Ÿ2e ๖ํwwwlธ๗๏฿GวŽแโโ‚๖ํใ๎ปE.›˜˜oooธนนกQฃFศฬฬDEEกiำฆจ]ป6๖๏฿๘็ŸะดiS|๘แ‡๐๒๒ยล‹}ˆฯ>๛ฌศพ&Mš„””้u๓ๆอ2ีBDDD๒๑ึnvˆ‰‰ABBlmmัดiSDGGซ\?๖ถ่่่”J%rss‹/Fฝz๕ƒJ! €tบx’Vฏ^วฃQฃFx๘๐!\]]ฑjี*?~ปwวถm••Uฆš,,,เ็็ฅR‰&Mšเฮ;BH๓ฃฃฃ1rไHŒ?ƒ ย๘๑ใ‹>###•ULo,ศตjี [ถl‘ฎั๒๒๒ยํท‘””„ใวรรรกกกล๖ahhˆดด4้}ใฦฑu๋VภฆM›ะดiำB—322‚ฑฑ1> เ๙MyyyEฎ'55ีซW‡Bกภบu๋Šlw๕๊Uธปปใ๋ฏฟ† nผ‰J•*aเภ8u๊ๆฯŸC‡ม .,v^๔โ)ิ๓็ฯฃrๅสP(8w๎<==1~xx{{ใ๙๓˜;w.lllJ7U\o,ศ9;;cิจQhธ1คGpฆจkไ\]]๑์ู3้f‡3f ,, ฎฎฎุนsgฑุ้ฐaฆOŸ777t่ะูููEถ6l–-[www•เ๘ฒE‹มษษ ฎฎฎฐทท‡›››ส|www#..๎๎๎–?x๐ ,--q๒ไIดhั}๛๖๐<ศeggรษษ ๛๗ว๊ีซK๕แXชว๒ํแ9""""™b#"""’)9""""™โ5r๏‰{ร๊!K‘UeศZฎf% ็jํW9ๅ]Žฌฝ๋cYc[jy—@DT*<"GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$So,ศ%''cอš5Eฮฏ^ฝz‰}ฌ[ท|}}แเเ'''ตn3U\ๅไJCA๎uไๆๆ–บmvv6าำำaaaะึึŒ5 6l(ะ~๔่ั4h.^ผˆศศH?~ฌ†ส‰ˆˆจขR[ปu๋š4iwwwธบบb๘๑ˆ‡ปป;ๆฯŸ๔๔ttํฺŽŽŽ6lX‰ํฺต gฯžEืฎ]ัฌY3ภฺตkแ์์ gggฌZตชุๅgฮœ gggธบบbๅส•า๔1cฦภษษ ]บt‘ยู๔้ำแ้้ gggLž}666ฺ:t”NiVฎ\`bb‚ๆอ›<<<ค x๐เAฬ›7™™™ธ{๗.เๆๆRเƒpใฦ |๖ูg๐๗๗G๋ึญฦŽ KKK\ฝz…๖7iา$Œ7NzŸššส0GDDTAฉํˆ\๓ๆอq๔่Q˜››ฃ{๗๎8x๐`6 …B]ซ{%๙ง,@ฉT"777n๖์ู#ฝหฬฬ”ฺๅNSSSฤลลกiำฆ๘๛๏1cฦ ฯ€u่ะฤW_}…+Wฎ”ฉ& ุููมษษ ZZZ่ิฉ“สม'Ožเ็Ÿ†ŸŸ๎นƒTซVญุm422RyQลคถ w๚uิจQร‡GPP’““‘––&อoธ1ถn เ๙ฉฯงOŸ–ุงกกกิ‡งง'<ˆิิT}๚ภษษ อ›7W9ชไ๎๎.ฃมƒcุฐahะ ๚๗๏พ}๛ขjีช8v์พ๚๊+4n0v์ุBOซฯOปž={ะิิฤจQฃ0dศBš˜˜ Wฏ^ppp€ฅฅ%ผผผ m๗๏ฟbภ€B@SSห–-S™ฏฏฏมƒc๐เมˆŠŠ‚ฆfมก๕๕๕ล_…๔๔tXZZโ?€‡‡.\???ไไไ I“&่ฝ;€็๔ป๏พ“NฝH!J{;$ษRjj*Œ‘`EVy—#kนš•ีs5๊oœŒ๒.Gึ๕ฑฌฑM>w{ggg#,, >>>ะาา*๏rdcฉ>หื—๛;%%ฅุหค๘ษDDDD2ฅถSซๅแแร‡าฃ๙ชTฉ‚๐๐๐rชˆˆˆˆ่ํ‘u333Syt ั๛„งV‰ˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆd@`*=๓เK033+๏2d-;; Cต๕๑ณ_ว’ˆH=xDŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆx{"oU7ไ้ไ•wฒ–งะ>ผe'ฒสปœ7B9๎Xy—@DDeภ#rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2๕F‚\rr2ึฌYSไ๊ีซ—ุวบu๋๐เมติ“””„;v9?88ธุ๙ฏใลพืฎ] ;;;( dddจด›3g๊ีซฌ[ท๎ิBDDDKนนาx[A.77ร† C@@€Zึ•๏๑ใว าทงง'๖๏฿kkk•ถ๛๖ํร™3g€„„๘๚๚x>ŽDDDDEัTG'ทnB`` าำำ‘——;;;ฤววร}๚๔มˆ#๐๑วใาฅKhผy‰ํฺต gฯžEืฎ]QฅJ;v kืฎลย… ฃGฦงŸ~Z่ฒ๑๑๑่฿ฟ?rssกP(p๘๐aL™2 pwwว„ pๅส\ฟ~‰‰‰hธ1 Qฝzu 6 -Zด@ฃFŽผผ<„††ยสส —/_F๏ฝ‘–-["&&*๋ฮศศภึญ[ฑrๅJดhั฿}๗fฬ˜!๕ํ์์\hอซWฏฦW_} @ีชU›7oFpp0>๔S๔ํFFF%Ž]ff&233ฅ๗ฉฉฉ%.CDDD๒ค–#r›7oF›6mƒจจ(ฬš5 ...ˆ‰‰ม„ ฐ|๙rฺฺุ"!!;vฤปwฅeฅฏ,ธ `ืฎ]8v์๗_ฬž=ววษ“'ฑhั"$%%ZหชUซ0jิ(ฤฤฤเฤ‰000ภ์ูณัพ}{ฤฤฤ OŸ>€๙G•ยแ‹ …?มมม€ฯ?3fฬ@ll,45U๓๏ฅK—0v์X8;;ในsXฝz5พ๛๎ปR฿•+WOOOt๊ิ 7o >ฟ;n฿พ `ศ!ˆŠŠ*ถฏ9sๆภุุXzYYY•บ"""’ต9OOO„„„`ๆฬ™ธrๅ tuuUๆGFF"((ะฅK่้้I๓bbbคฏืฌYƒ ่์ูณhืฎLLL`hhœ>}บะZผผผ0|ฬ›7๗๏฿/บ๒๙๛๛CKKซะy~~~)0ฦฦฦขSงN€ž={Jm๗ฟมูู5jิภ๙๓็๑ใ?ยษษฉะ~‹’››‹\œ9sฝ{๗ฦ˜1cคy666˜5kะคI4oผะ๐™oาคIHII‘^๙กˆˆˆ*ตนๆอ›ใ่ัฃ077G๗๎q๐เมm …:VUขฝ{ใ๗฿‡ฆฆ&Zถl‰‹/ฺ๎ล0๙2€RฉDnn.@Qhถmbม‚ุธq#z๕๊…ฐฐ0ไๅๅ•ฉf ๘๛๛บvํŠุุX•๙วŽร€๐๗฿c๒ไษ๘๘ใ‹ญศศHๅEDDD“Z‚๕๋ืQฃF >AAAHNNFZZš4ฟqใฦุบu+`๗๎x๚๔i‰}J}xzzโเมƒHMMล“'Oฐw๏^4jิจะๅฎ]ป†:u๊`ธq๐๖๖ฦฅK—T๚zUnnn l฿พ]šndd„1cฦ 66cวŽลฦQฏ^=๚๋ฏฅ๎ปSงN8rไ ""๖๖๖€๛๗รูู ,@ฏ^ฝpแยL™2ีชU{ญm!""ขŠA-A.""ฎฎฎ๐๐๐ภฑcวะฏ_?ธบบยีี๓็ฯวศ‘#๑๗฿รษษ {๖์Q "…]#๛๗G฿พ}ัฌY3ิฌY_}๕7nŒ>๚cวŽ…MกตlูฒฮฮฮpwwGZZ:t่WWW<{๖ ๎๎๎ุธqใ+mใ?€ฏฟ๎๎๎x๒ไIกGบš7oŽ7โิฉS…ึทn:XZZโ฿E:u0iา$ภ!C ฬž=?๐ภฬฬ ๙'~w๘๘๘@ฉไcˆˆˆ่(DQ็ IลำงOกซซ …BYณf!''3fฬ(๏ฒJ”šš ccc๛ฎ9ฬtสvส—Te+ด๑็ฃัแ๊h‰ฌ๒.็PŽ;๖Vึ“ฐฐ0๘๘๘yญ*•วR}8–๊รฑ|}๙ฟฟSRRŠฝLJ-yœ>}cวŽEnn.lmmฑaร†๒.‰ˆˆˆsฒ r>D๋ึญUฆUฉRแแแod}๙ฯŽ#"""zWศ6ศ™™™1Xั{Wฯษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘Lษ๖ภT6สOwBifVeศš2; ƒrิŸP๒ณ‰ˆ่ภ#rDDDD2ล GDDD$S<ต๚žศ๛s ๒๔ทฒ๋ฒ7พ"""zŽGไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠA@›6mŠŸœœŒ5kึH๏322ะชU+xxxเ๐แรฅ๎ูณghบ5 0qโD•67š7o'''xxxผยVั๛Fณผ (OB!^lป 7x๐`@tt4ŒŒŒp่ะก"—y๚๔)455กญญ-๕ฏฉฉ‰iำฆ!!!ืฏ_Wi?`ภ,\ธ 6ฤฝ{๗ค้?†ฉฉ้ซn"U`ๆˆญ[ทะคIธปปรีี‰‰‰๐๐๐@๗๎แเเ€O?yyy€jีชa๘๐แpqqมอ›7Qฝzu@DDฺทoฮ;รฮฮณgฯL™2๑๑๑pwwว๙๓ัทo_9r๎๎๎x๘๐กJ.\ภgŸ}'''<~คตดดเํํ ]]]•eฮŸ?4lุ`nn.อkะ  €ำงO—j233‘ššช๒"""ขŠฉยนอ›7ฃM›6ˆ‰‰ATT„ˆ‹‹รื_„„55•aŽˆˆจ‚ช0Gไš7oŽฃGยปwวมƒกP(ค๙ …BzฏงงWd?:::าืJฅนนน%ฎ{ีชUprrB`` fอš…๛ฏLต[XX aร†จQฃ ะฆMฤลลI๓>|ˆล‹รฯฯ๚๚๚ุพ}{ฑ๕ฉผˆˆˆจbช0A๎๚๕๋จQฃ†Ž   คฅฅ!11qqqB`ถmhฺด้+๕mhhXไ0๐๒๒ย† pโฤ ่๋๋ฃ}๛๖๐๓๓CJJJฉ๚oุฐ!nบ…ิิTไไไเฤ‰จWฏ w๏๐๒๒Bjj*๖๎‹]ปvกC‡ฏดDDDTฑT˜Sซ˜7oดตตaff†นs็ยีี3gฮฤ… ะผystํฺ๕•๚633ƒซซ+\]]ัทo_xzzฺฎrๅส;v,ฦŽ‹ˆˆˆBธบบโ฿ENN~๕WDGGฃjีช˜9s&7n  ”n|่ป7~๕W(•&s‘šT˜ ืฏ_?๔๋ืOzŸ””๏+ะ๖ฮ;…พoัขZดh!M1ŒmผYe™ๆล๙/ฎ๏ลSฆ/๊น3:w๎\`zงNŠ]ฝฟx˜‡ˆˆˆHฆ*lณฑฑมฉSงสป """ข7ฆย9"""ขŠŽAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdชย|ึ*Oูa6”ffๅ]ฉศษƒ‘L1ศษฏ‘{Oไ%yFบา{ฅ[฿rฌ†ˆˆˆิGไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdJญA.99kึฌQg—ฒ็ใใƒฌฌ,@@@LMMคาๆ๛๐๕๕…ƒƒœœœ๐เมƒ๒(•ˆˆˆdๆญน\uฎชิสcฝูููHOO„……A[[0jิ(lุฐก@๛ัฃGcะ Aธx๑""##ahhx๘๑+šˆˆˆdงิA๎ึญ[hาค แ๊๊ŠศศH•๗‰‰‰˜2e โใใแ๎๎Ž๙๓็cบu€ทท7๚๖ํ‹ปw๏ขK—.hะ š5k†ห—/‚ƒƒแ้้ WWW 0yyy€-Z`๘๑๐๐๐€งง'ฮž=‹ึญ[ใƒ>ภž={ŠฌuฦŒ0`ผผผ๐ๅ—_โส•+hถ-๊ืฏ:เ๎ปdddึญ[‡‰'&L˜{{{ธนนa๙Pd/JJJยไษ“aoo/m‹๋hัข…า๒%''ใ๙๓่ึญภุุ::: <<BˆR?eff"55UๅEDDDSฉƒๆอ›ัฆMฤฤฤ ** ‡Vyommูณgรลล111˜0a ..ปw๏ฦฆM›0v์XLŸ>gฯžลขE‹0n8@=pๆฬฤลลAWW๑‡ด^333DGGฃiำฆ5j๖์ูƒ฿~๛ ณfอ*ถ๙Gลย… 1rไHฌYณQQQ4hพ๖"—{๘๐!v์ุ„„ฤฦฦโำO?€"๛ศออEhh(|||ะญ[7ิฌY็ฮƒ‡‡Gฉฦ๕ฺตkจ\น2z๖์ L:UšกC‡bๅส•pvvฦ‚ J<ํ:gฮK/++ซRีADDD๒ฃYฺ†žžž่฿ฟ?”J%ัฌY3•๗ŽŽŽ….ืกC้(ิกC‡ อำะะฤฦฦb๊ิฉHMMErr2ฌฌฌะฅK@งN...P(จTฉœqใฦb๋๕๗๗‡––าาาpโฤ ฉฟ\ิฎ]ปศๅŒa``€มƒร฿฿พพพล๖แ๏๏ .`ร† hฺดi‰ใ๘ฒ\œ:u ็ฮCบuแ๏๏ะะP๘๙๙AกP mถhถ-๎฿ฟฑcวยาาWฏ^………EกMš4I ศššส0GDDTA•:ศ5oGล๎ปcูฒe๔๔๔คฏ ฮ;ฅR๕@เ!Cฐw๏^ุููaม‚x๒ไ‰4/๚2ฅRฉ๒uIืพๅฏ7//5kึDLLL6าiฬฬL€ฆฆ&ฮž=‹}๛๖aใฦุนs'~๑ว"๛˜3g~๚้' 8]ปvลเมƒaggWlm/ฒฐฐ€œœœ<ฎฑฑฑ๐๓๓AAA8~ธส๛๘๘x"--ญศ>š5k& ‘——‡๘๘x@zz:ชVญŠŒŒ lบ๕57I•ฑฑ1LMMฑ~ฯoDธx๑"ภฺฺ111ศหหร๎ป<N)))๐๓๓รผy๓Slฮฮฮ๘้งŸ ;;;๔๎-[ถDRRRฉ๊ณฐฐ€‰‰ nผ !Ž9{{{ภ_|!]‚๐๐pJG2‰ˆˆ่V๊ WWWxxxเุฑcฐฑฑQy๑วรฬฬ ฎฎฎpuu•nxัาฅKฑw๏^ธนนมููYบaaส”)๘๐รัฒeหR_[V7nฤ๙๓แๆๆwwwœ>}0u๊T|๒ษ'hธฑtช2-- พพพpssC—.]คkแŠ๊#Ÿพพ>Œ3gฮ`ม‚ะิ,xฐำืื …ฅฅ%ขฃฃ .„ŸŸ\]]abb‚๎ปฺดiƒฤฤDฬŸ?u๊ิQ๛ธ‘ผ)Dio‡$YJMM…ฑฑ1๎] 3#]iบาญo9V%Oููู ƒดดดสปYใXชวR}8–๊รฑ|}๙ฟฟSRR`ddTd;~ฒ‘L•๚f‡wัพ}๛๐ีW_ฉL๋ะกๆฮ[Nฝ=ฒrํทG๛๖ํหป """ขrมSซDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$Sฒ~ 0•žาฑ;”ffๅ]ฉศษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘LUจ —œœŒ5kึ”w*BCCฑdษภฝ{แโโฅR‰ฤฤD•v๋ึญƒƒƒ1kึฌ๒(•ˆˆˆdFณผ Pง 7x๐เ๓rssกกก๑ึjy๘1LMMแ็็'Mณณณรถm0|๘p•ถ/^ฤ๊ีซ===ปw’’###(ŠทV7ษ‡lŽศบu Mš4ปป;\]]ฉ๒>11SฆLA||<1|ฌ[ท๐๖๖F฿พ}q๗๎]t้า 4@ณfอp๙๒e@pp0<==แ๊๊Š //ะขE Œ?๐๔๔ฤูณgับuk|๐มุณgOsrrฐs็NดkืฃF๐Hฤ‰u๊ิƒƒCๅ~๙gŒ=zzzsssภฑcวเเเ€นs็JแŽˆˆˆ(Ÿl‚ๆอ›ัฆMฤฤฤ ** ‡Vyommูณgรลล111˜0a ..ปw๏ฦฆM›0v์XLŸ>gฯžลขE‹0n8@=pๆฬฤลลAWW๑‡ด^333DGGฃiำฆ5j๖์ูƒ฿~๛Mๅ๔็อ›71mฺ48::b๗๎๘ๆ›oฐqใฦRo•+Wp๎9|๔ัGhูฒ%โใใ:uย‘#G<•AAAˆˆˆ(ถฏฬฬLคฆฆชผˆˆˆจb’อฉUOOO๔๏฿Jฅhึฌ™ส{GGวB—๋ะก ‡BBB‚4/Tkll,ฆNŠิิT$''รสส ]บt๐:{{{,\ธฐิ}ผx ๕๙๓จ\นฒ:===1~xx{{ใ๙๓˜;w.lllŠ์KGGFFF*/"""ช˜dsj5""๓ๆอƒถถ6ฬฬฬะทo_ธบบJ๏ทlู333ธบบยีี}๛๖EีชUU๚Xบt)† †ๅห—#;;Ÿ|๒ \\\0eส|๘แ‡จVญ<<<^นFwwwใษ“'8}๚t๙Dฟ~p}ดhัmถEHH:u๊„ฐฐ0899AWWซWฏ๐hโฦQทnWฎ‰ˆˆˆ*.…x๑U8ฉฉฉ066ฦƒ`ffVๅศZvv6ยยยเใใ--ญ๒.Gึ8–๊รฑTŽฅ๚p,__๏๏G‘E6งV‰ˆˆˆHƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘Li–w๔f !iiiะาา*็jไ-;;OŸ>Ejj*ว๒5q,ี‡cฉ>K๕แXพพิิT๗{ผ( rร‡ถถถๅ\ •UZZŒ‹œฯ WมUฎ\pใฦbw„โxzzโฬ™3ฏUวปะว๋.Ÿšš +++ผyFFFๅRรปาวป0–๊จƒcฉพ:8–๊ซƒcฉพ:ไ<–Bคฅฅมยยขุv rœR๙2HccใWfาะะxญoฤwฅuิFFFหw`,ีQวR}up,ีWวR}uศ},Ks†7;P‰FŽY!๚PG ฏ๋]u๔๑.Œ%๐nlวปPƒ:ผ ๑.ิ ๏ยvผ 5จรปฐ๏B ลQˆ’ฎข#YKMM…ฑฑ1RRRิ๒ืี๛Œcฉ>K๕แXชวR}8–oศUp:::˜>}:tttสปูใXชวR}8–๊รฑTŽๅร#rDDDD2ล#rDDDD2ล GDDD$S rDDDD2ล GDDD$S rุ๒ๅหaccƒJ•*กQฃF๘๋ฏฟสปคwฮัฃGันsgXXX@กPเท฿~S™/„ภดiำPฃF ่๊๊ขM›6ธrๅŠJ›GกOŸ>022‚‰‰  „'Ožผลญx7ฬ™3žžž044„นน9q้า%•69r$ฬฬฬ```€๎ปใ๎ป*mnธ___่้้ม&L@NNฮ”rทbล ธบบJS๕๒๒ยฝ{ฅ๙วW7w๎\( |๙็า4Žg้ฬ˜1 …Bๅeoo/อ็8–น j๋ึญ7nฆOŸŽs็ฮมออ ํทวฝ{๗สปดwJzz:ฐ|๙๒B็ฯ›7K–,App0NŸ> }}}ดo฿R›>}๚เย… 8pเv๏ฃGโำO?}[›๐ฮ8rไFމSงNแภศฮฮFปvํžž.ต;v,๘ใl฿พGŽมญ[ทะญ[7i~nn.|}}‘••…ศศHฌ_ฟ๋ึญรดiำสc“สฅฅ%ๆฮ‹จจ(œ={ญZตB—.]pแยวWuๆฬฌ\นฎฎฎ*ำ9žฅ็ไไ„ทoKฏใวK๓8ŽๅDP…ิฐaC1rไH้}nnฎฐฐฐsๆฬ)วชmฤฎ]ปค๗yyyขz๕๊b๙าดไไdกฃฃ#6o,„"!!Agฮœ‘ฺ์ปW( ๑฿ฝตฺ฿E๗๎ฤ‘#G„ฯวNKKKl฿พ]js๑โE@œ๚่ฃ๒.ƒ่ฤ GD† ๔๕๕‘žž.M{๚๔) accฃาNOO033C=๐๘๑c•พbbbส‚ƒƒัฅKผึvจ… ค.ำ"""PงN•i๛๗วฌYณ^นฯบu๋ขz๕๊๘ใ?^ท<ข ‡AŽˆ*”š5kโท฿~“๛๏จQฃFv๛๗๏ว“'Opใฦ deeแoฟU™็ŸขC‡eZ๗ฯ?Œ^ฝzฝRe‘““๓ฦื๑ฎศ฿ึ^ฝzaอš5ๅ\ ัป‡AŽˆ*”^ฝzaใฦา๛_}๚๔)ฒฝพพ>p๑โE•้๙A๎ูณg่ีซ*WฎŒส•+ฃYณf…๖sใฦ บu ...า4ฬŸ?044ฤดiำp้า%4hะฦฦฦ6l˜ิ6//ำงO‡••jิจัฃG#33ฐn:ดlูC‡…ฑฑ1ึฎ]‹Gกw๏077ว|€๕๋ืน/ž&ฝ{7๊ีซ'ฅฒeK‘หEFFขnบ033ร_|ผผ}บ4?55UTฏ^]ไๆๆŠ+Vˆฮ;‹งOŸŠ์์lq๔่ัBืฝ{๗nQฟ~๕x{{‹‡Š‹/ ัถm[qใฦ q๛๖mQญZ5q่ะ!!„ซVญŽŽŽโๆอ›โมƒขqใฦRMkืฎbํฺต"77W<}๚T๘๘๘ˆ๑ใว‹ŒŒ q๑โEQฃF [ไธไooตjีฤ๑ใว…Bพ}[\ธpกศeลํทล'ลš5k„BlถM8;;‹คค$๑๔้SัซW/1~x!„‡ตkืV้ซ_ฟ~โoฟ•งฅฅ ฑcว‘““#vํฺ%ฌฌฌฤณgฯ„B~~~"%%E<}๚TZฮศศH$&&Z/ั๛ŠGไˆจBัะะ@@@ถnŠญ[ทข{๗๎ะะะ(ะฎcวŽ011ฉฉ)._พŒแร‡K๓<ooo(•Jhiiแแร‡ธz๕*455‹<"—œœ\่ตqฃGFๅส•aoo777t่ะVVVจ^ฝ:ผฝฝ ุฒe พ๘โ XZZยฬฬ ำฆMรๆอ›ฅ~jืฎ๛CฉT"%%˜3gttt`ooฝ{c็ฮ%Ž––.^ผˆ'Ož z๕๊ptt,ฒํ˜1cPฝzuXXX`์ุฑุบu+€็ง'Mškkk่๊๊b๒ไษุฑcG‰๋ฮท{๗n899I7077วฉSงค6'N„‘‘tuuฅi†††HII)๕zˆ rDTแ๔้ำ›6mยฦ‹<ญบw๏^$''ใ้ำง๐๗๗‡ฏฏฏ4๏ล๋ใ๚๖ํ‹ึญ[ฃkืฎฐถถฦœ9s ํฯุุธะปUอออฅฏuuu ผฯ_ๆึญ[จUซ–4ฯฺฺทn’[ZZJ_฿ธqจZต*LLL`bb‚•+Wโฮ;ลŽ ์ุฑปvํ‚ฅฅ%:t่Pเ”๒‹ฌฌฌTพพ}๛ถดกC‡J๋nฺด)๎฿ฟ_โบ_ฌศ‘#า๒&&&ธx๑b‘›/-- ฦฦฦฅ^ั๛€AŽˆ*œ เัฃGx๘1<==‹mซฃฃƒพ}๛"** <๐Fˆ๖ํดตต๑อ7฿เ๒ๅหุทo~๑GDDD่วลล๓ฯ+ืlaa7nH๏oธ ้ฝBกพฎYณ& ๐๘๑c$''#99iii.q=5ยž={p๗๎]ธนนฉ‰|ูอ›7UพฮฟiคfอšXฟ~ฝด๎ไไd้Nแ๋,ฌ๖ๅทo_`๙ฝ{นฬ;w““ƒฺตk—ธD๏9"ชv๎YชSูููุดiฬออaff†ฤฤDIกๅ๐แรธpแ๒๒๒`ddMMอBOีZ[[ฃz๕๊ˆฅz{๖์‰… โฟรฃG๐ํท฿"((จะถ5kึ„——ฆNŠงOŸ"''็ฮCBBBฑ๋ศสสยฆM›šš ---บ-๙–.]Šปw๏โ๖ํXผx1z๔่8p พ๛๎;)ธพ}๙'€็G ๏฿ฟฏ๒sss$%%I๏;u๊„่่h๖oศษษมณgฯ๐็Ÿ{ฺ๔่ัฃhีช455‹Fข๗ ƒUHŽŽŽล^ีฎ]; J•*8|๘0~๛ํ7(Šน}๛6addOOO :ดศ๋ไ คr][Y 4]ปvEร† แ่่777Lš4ฉศ๖7nฤฟ‹>๘ๆๆๆ๘๓ฯ๑์ูณืณ~zX[[ริิภฒeหŠlฃG4kึ ฮฮฮhถ- เ๙มƒ ‚ฏฏ/ŒŒŒเํํ-…Ht้าVVV011๐<๘>}&&&1bŒฑgฯ,]บๆๆๆฐฑฑมชUซŠญ{๓ๆอ2dH‰G๔พQ!DyAD๔ฎ่ะก&Nœˆ-Z”yู๔๔txzzโฏฟz็ ,gWฎ\A฿พ}q๒ไษBOฝฯไˆˆ^0o<Œ;ZZZๅ] Q‰ไˆˆˆˆdŠืศษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษิ+(๒ํ่ IENDฎB`‚c4core-bm-charconv-xtoa-mega_bytes_per_second-i32.png000066400000000000000000000764131477602032300330710ustar00rootroot00000000000000c4core-0.2.6/doc/img/windows-x86_64-vs2019-Release‰PNG  IHDRrOีw.9tEXtSoftwareMatplotlib version3.5.3, https://matplotlib.org/อ+นา pHYsaaจ?งi|xIDATxœํw|็?๐ื9ูฒ… Iฌ'ษ‰$41bXQ A JลจQดF[ดิฌR+ฦงhฬRT‰MฬR!‹Z‚ฺ+Cศs๐หud"ฤฏ็ใqr๎๛บฏ๛}_็ไไๅ^G!„ """"ูQ–tDDDD๔zไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไHึ๚๔้“’.#_P(ุดiSI—R$“&M‚Bกภ๛๗Kบ๚@4iา*•ชคห(u &MšTาeผ’>}๚ภมมกคห9z#แแแฒ๛ฐ *n?๐ถnZไ๖‹/F`` ชTฉ…B>}๚ไู.'X+•J\ฟ~=ื””AกP`่ะกฏY=ๆษ“'˜4i"""๙บ?ŽI“&!))้ฏ[N ๚[4rไHิญ[eห–E™2ePปvmLš4 ?ึjw๊ิ) :u๊ิฑฑ1ชTฉ‚ฎ]ปโโล‹ฏ\ฯป|ไ่„‡‡c๒ไษ%]Q‰zี 7cฦ 8pu๊ิฎฎnกํ ฐnบ\ำ7o*eาkz๒ไ &Ož\bAn๒ไษฏž>}Šฏฟ๚ํ๕–,[ถ .\xญe ๚[t๊ิ)4jิ“'Oฦผy๓ะดiSLŸ>mฺดFฃ‘ฺอ˜1ฟ;š7oŽy๓ๆแณฯ>รแร‡Qทn]œ={๖•๊yืํu BDฅ^ZZŒKบ YB ==FFFฏผ์กC‡คฝqE95ภฯฯ๋ึญร—_~ฉ5}ํฺตhืฎ~๗WฎแCขัh™™ CCร’.ๅญzq;ๅธญzzzoฅ฿ฃGๆšVญZ5Œ=7>๚่#ภ_|ตkืB___jืญ[7ธธธ`๚๔้Xฝz๕[ฉ๏Mqๅ๒๔้SิชU ตjียำงOฅ้>DฅJ•เใใƒ์์l๔้ำ .๐|ŒœGŽดด4Œ5 vvv000€““fฯž !„ึ๚VฌXfอšมฺฺpvvฦโล‹_ฉๆห—/ฃu๋ึ066† พ๛๎ป\๋ัh4˜;w.๊ิฉCCCTจPฤฃGดฺ988 }๛๖8z๔(๊ีซCCCTญZฟ๚kฎ๕&%%aไศ‘ppp€lmmัปw๏\็˜i4L:ถถถ044D๓ๆอ๑ฯ?hตษ9W(66พพพ(Sฆ ชWฏ._w่ะ!ิฏ_FFFprrยพ}๛ด–ฟz๕* '''มสส HLLิjทrๅJ( :tƒ†ตต5lmm๓ซWฏขz๕๊PฉTธs็€็{(Š|.ษ“'แ็็KKKรีี๓ๆอำjsเภ4jิฦฦฦฐฐฐ@งNpyญ69‡๙็๔้ำ077G฿พ}๑ไษฉJฅBำฆMsีกัhPนrehM{•๗ล๎ปแ้้ ###,Yฒ …iiiXตj•๔;฿กา๖๖๖Zฟ+…้ัฃขฃฃ‘ Mป}๛68€=zนŸœCฐ[ทn…Jฅ‚๊ิฉƒ]ปviตห๏\ฅœ๑ฯซฯ7ยููFFF๐๖๖F\\`ษ’%จ^ฝ: ัคI“\๏วงOŸ†ŒŒŒเ่่ˆะะะ\m2220qโDTฏ^ฐณณร—_~‰ŒŒŒcฦŒ8::J๋ฮร‚ถ๓ๅ‹๚ป<0lุ0”+Wฆฆฆุ่ฑ#nธ‘ซฯิิTŒ1B๚ณถถFห–-qๆฬฉอซ|VผพKLL„Bกภ์ูณฑt้RTซV ๐๒๒ยฉSงด–+่oQ^rึ๓โ3ญ5jิ@:uŠz…ฟnลNๅแฤ‰BGGGŒ9Rš$ŒŒŒฤ… „B?~\ดlูRaaaาC!4hึฌ™P(ขbม‚ขC‡€1b„ึบผผผDŸ>}ฤO?$ๆฯŸ/Zตj%ˆ Zgppฐ0445jิฝz๕ ,ํทฤ7฿|ฃีถBWWW 0@„††Šฏพ๚J ///‘™™)ตณททNNNขB… b๘๑bม‚ขnบBกPˆณgฯJํRSS…Jฅ:::bภ€b๑โลโ๛๏ฟ^^^"**J!ฤมƒแ๎๎.<<<ฤO?$&Mš$ส”)#๊ีซงUŸฏฏฏฐฑฑvvvbฬ˜1b๙ยููY่่่ˆ๕๋ื‹Š+ŠI“&‰นs็Šส•+ sss‘’’"-ฟqใFแๆๆ&พ๖[ฑt้R1~xaii)์ํํEZZšิnลŠ€pvvพพพb๙b๚๔้B!&Nœ(ˆ{๗๎ !„๘็ŸD•*U„Zญ–ฆฝธ]'N,๔5ฺณgะืื๖๖๖bโฤ‰b๑โลbุฐaขE‹R›ฝ{๗ ]]]QณfM1sๆL1y๒dQฎ\9aii)ฎ\น"ตหฉฯ]|๑วbัขEข€๘๒ห/ฅv฿}๗P*•โึญ[Zต:tH7n|ญ๗E๕๊ี…ฅฅฅ;vฌ aaaยภภ@4jิH๚8~xกใ’รุุX็9/g{๏ฝ+lmmตำs็ฮๆๆๆ"==]C† )t]„›››จTฉ’๘๛๏ลนsEีชUE™2eฤ๛๗ฅvมมมย>฿z^๎ำีีUุูู‰้ำง‹้ำง sssQฅJฑ`มแ์์,~๑G๑๕ื_ }}}ัดiSญๅs๗ึึึb่ะกโ็Ÿ 6ฤ๗?ฉ]vvถhีช•(SฆŒ1b„Xฒd‰:tจะีี:uสUSํฺตE๙๒ๅลไษ“ลย… ETT”ุณg š7o..\(.\(†*๓ณว‹ล‹ ขs็ฮาk#„(๚{7/K—.D@@€Xฒd‰˜7ož๘๔ำOลฐaร„Bฤฤฤˆ๎ป โงŸ~’ึ๘๑ใท3g‹ฟŸEBˆฎ]ป ขWฏ^bแย…ขkืฎยออ-WŸ=z๔๚๚๚โ‹/พห—/3fฬ:tซWฏ–ฺผสgลห๏ป+WฎH5Wฏ^]ฬ˜1Cฬœ9S”+WNฺฺุJฟŸ-ส‘••%๎ป'nธ!v๏-jีช%LMMลƒ ฌIฃัˆส•+‹VญZZŽย^ทโฦ G๙7nœP*•โ๐แรbใฦ€˜;wฎV›!C†ไ๚`Bˆญ[ท bส”)Zำ„Bก๓4ํษ“'น–oบตจZตjก5 โ๓ฯ?—ฆi4ัฎ];กฏฏ/…#GŽbอš5Zห๏ฺต+ืt{{{@>|Xšv๗๎]a`` F%M๛๖oฑy๓ๆ\ui4!ฤ}ˆีฎ][dddH๓็อ›'ˆธธ8išฏฏฏ ึฎ]+MKHH„Rฉ'Nœฆ๏ฝ[+Vฌฆๅ5Ž๕— ~๕WiZNkุฐกx๖์™V๛ƒ๙๓็…๐๒๒>ิjWิ็gฯž GGGaoo/=z”็ !„ZญึึึZช111BฉTŠฝ{็ชฏ_ฟ~Z}u๎YXYYIฯ/\ธ ˆ๙๓็kต}:ฯp๗้ำ'WŸๆๆๆ…พ๏Š#ศYYYi}๑ว€๘๓ฯ?ฅi๙-ส‘๓Y˜๓prr,ดฆฐฐฐ\ฉ(Š‚^ทโฦCซ”ฏI“&กN:ฦเมƒแ๋๋‹aร†iู๐๐p่่่ไj?jิ(!ฐs็Niฺ‹็%''ใ๛๐๕๕ลๅห—‘œœ\ค๕ฝxล^ฮแ†ฬฬL้๐ใฦannŽ–-[โ๛ารรร&&&8x๐ Vฮฮฮhิจ‘๔ผ|๙๒prrยๅห—ฅiฟ;ะนs็\๕ผผ[ฟo฿พZป์s๚~ฑ?011APP๔ษษ จ]ป6๊ืฏ/Mฯ๙๙ลๅ_วฌฌ,([ถฌ4฿ีี-[ถDxxxฎ~CBBดž7jิ<@JJ  fอšPซีุฐaƒิ&;;›6mB‡คฑzี๗…ฃฃ#Zทn]เ6ฟ-=z๔ภ?ƒSงNIพสaี-Zด@ตjีค็ฎฎฎ033ห๕^|อ›7ื:$–๓์าฅ LMMsMy]บบบ8p ๔\__ฤปwq๚๔iฯ_ซฺตkฃVญZZฏUณfอ ืkๅ๋๋ gggญiHKKรฝ{_{[_๔:๏—๋๙๏ฟดพชผถณ …๎ไš”^>หึึ6ื›››รฮฮ.ืด——๚๔)พ๖[้œฤrๅสก|๙๒HJJสs๓ญทC‡055ล๎ปaffV„-ฬฟ ŽSฮ{มษษ)ืผฺตkใ๛HKKำš^”๑์ึญŽ;†7nx~Oฟปw๏ข[ทnR›W}_4fo›ปป;jีช…ตkืbอš5จXฑขb^EQoฺgฮ๛ณ(๏[ฐฑฑษuฑM^ฟร็ฮห๕:ๅด+สk5x๐`ิฌYmถ…ญญ-๚๕๋—๋ภW๑:๏}๕ีW011Aฝz๕PฃF 2วŽ{ฅ^๕=Yุ๏ฮีซWกT*s๕[ฝz๕\}อœ9gฯž…๊ีซ‡I“&ฝั^ทๆข033C‹-ะฉS'ฬ˜1ฃFBงN“g๛ทoฃ]ปv077วฆM›๒O๏๛€WญRv๏ HOOวฅK—Šูฟ‹ๆอ›ฃVญZ˜3g์์์ ฏฏ๐๐p๔ำOZ—†ฟ FkkkฌYณ&ฯ๙9'3็ศ๏—VผtEQตฟฺe๙ฯ?+Vฌภˆ#เํํ sss( ๅ9Ž]mูฅKฌZต kึฌัฺS๒พ(สxt๋ึ ใฦรฦ1bฤ๖o077G›6mค6ฏ๚พx+T‹S=ฐx๑b˜ššข[ทnP*_โEปร–J}็๏‘Fฃ‹‹ ๆฬ™“็—Cc^ฏ•ตต5ขฃฃฑ{๗n์น;w๎ฤŠ+ะปwoฌZต๊•kzSตkืฦ… ฐ}๛v์ฺต ฟ;-Z„oฟถศทuzี๗dqพ&]ปvEฃFฐeห์ูณณfอยŒ3ฐy๓fดm๖•๛หOqภวŒ^ฝza๚๕pssำš—œœŒถm")) Gށอkฏ็]`ฃ|ลฦฦโป๏พC฿พ}๛#..N๚_5พฝฝ=๖ํ‡ิิTญฝr9Wู๓Oddd`ถmZ๋z๙0IA4 ._พ,ฯ€tวœร=ีชUรพ}๛ะ Aƒb๛c\ญZตWพทะดiำ&ใว”ฆฅงงฟึ}Œfอš]]] <ฆฆฆฏu€t๏์ูณhัขEžmr y?*!!ๅส•{ญ[ฃ8::ข^ฝzุฐa†Šอ›7ร฿฿Z๕ว๛โUฎ@}=z๔ภท฿~‹[ทn!,,์ญญวาา2ฯ๗อ‹{า‹ำอ›7s'ฏ฿แ˜˜4oฦ[__:t@‡ ัh0x๐`,Yฒ฿|๓Mž{€‚?็€7{๏ฃ[ทn่ึญ233๑๑วc๊ิฉ7n ฿ู{+‡ฝฝ=4 ฎ\น‚5jHำ_พส>GฅJ•0x๐` <w๏Eบu1u๊ิb rE๑ชใ”‘‘F“๋hEzz::t่€‹/b฿พ}ฏtุ๚M๊y<ดJyสสสBŸ>}`ccƒy๓ๆaๅส•ธs็FŽฉี.็C๊ๅ}???dggcม‚Zำ๚้'( ้—<็Z/ฯ*99+Vฌxฅz_\ ,€žžš7oเ๙ณณณ๑๗฿็Z๖ูณgฏvบt้‚˜˜lูฒ%ืผ7๙Ÿโ๋าััษต๙๓็็ปฅ …K—.E@@‚ƒƒฑm6ญ๙Eฝฅ@บuแ่่ˆนs็ๆใœZ+UชตZUซViต9{๖,๖์ู??ฟWฎ?Gทnpโฤ ๒ห/ธพึaU ๘ฦฦฦ๏ไฦŸีชUรนs1mฺ4ิซW๏ญฎ'99ฑฑฑาด[ทnๅ๙^/ฯž=ร’%Kค็™™™Xฒd ส—/ฯ_ซ7n`ูฒeน–๚๔i‡0s|ญ็ูููนBตต5lllดฦ๒UoU๔บ๒งคค$i,_ด|๙r€งงง4-;;บuร_…7ยปุ๋yธGŽ๒4eสDGGc055…ซซ+พ๖[|๕ื> r>d‡ †ึญ[CGGAAA่ะกš6mŠ & 11nnnุณg๘ใŒ1BฺSำชU+้ศฤใวฑlู2X[[ใึญ[EชีะะปvํBpp0๊ืฏ;wbวŽ?~ผthฬืืฤดiำVญZAOO—.]ยฦ1o<ญ{‹ล˜1cฐiำ&ข_ฟ~๐๐๐ภร‡ฑm6„††ๆฺ]ถตo฿aaa077‡ณณ3๚๋/์ทVVVฏีŸRฉฤ๊ีซแ๏๏ฎ]ป"<<\:'๋๏ฟFำฆM1qโฤObV*•Xผx1:t่ตZพ}๛ขRฅJHHHภนs็คC๗ณfอBถmแํํO?OŸ>ล๙๓annF'IwํฺฃGฦ่ัฃQถlู\{‹๋}แแแ}๛๖aฮœ9ฐฑฑฃฃฃึล)/๛๓ฯ?ฅssฒฒฒ‹)Sฆ:v์(…‹ผ >ผ(›F‚‚‚๐ีW_กs็ฮ6lž๚่#:tHฺCšณง)55ถถถ€››LLLฐo฿>œ:uJ๋จ@Q?+Šฃn ๗฿ขˆˆ 6 จQฃ233qไศlผžžž๘ไ“Oค>F…mถกC‡x๘๐aฎฟุถจ๕ผ“ืํญ_Kฒs๚๔iกซซซuK!ž฿JยหหKุุุHท’x๖์™๘๓ฯE๙๒ๅ…Bกะบ;55UŒ9Rุุุ===QฃF 1kึ,ญN!ฤถm„ซซซ044bฦŒโ—_~)าฅมมมยุุX๛๏ฟา=ฆ*Tจ &Nœ(ฒณณsต_บtฉ๐๐๐FFFยิิTธธธˆ/ฟRผySjcoo/ฺตk—kY___แ๋๋ซ5ํมƒb่ะกขrๅสB___ฺฺุŠเเ`้ž\9—ฟx฿2!๏ฒ๚oโ๋๋›็ญ๒ซ/rโัฃGขo฿พข\นrยฤฤDดnZ$$${{{ญ[ไ~ไิฉSน๚|๙>rB<ฟญ‰ฏฏฏ011‘n๒*ทBˆฃGŠ–-[ SSSall,\]]sd฿พ}ขAƒยศศH˜™™‰:ˆ๘๘๘B๋{q›๒zฟ4hะ@๛๗ฯทพ7y_๑617FFF@กท"ษนmN^฿๙m๏ห^~/ผjป—฿#B<ฟŸJฅ๚๚๚ยษษIฌ^ฝ:฿ผgฮ๛{ึฌYZำ๓๚}ศy฿GFF oooahh(์ํํ๓ผdffฆ˜1c†จSงŽ000–––ยรรCLžMš4)๔โ…ฌฌ,œ:u u๋ึอsฃGะพ}{ิฏ_3gฮ„‚‚‚ฐaรมฯฯำงOGZZšš*-{๎94jิ111๘๒ห/๑อ7฿เส•+hาค Nž<™k]ƒF||<พ๖[Œ;†vํฺมฤฤ3fฬภ7฿|ƒ๘๘x4lุP+Eff&Zทn'Nเ๓ฯ?วย… ๑ูgŸแ๒ๅหE:Œ๙่ั#๘๙๙มรร3gฮ„ญญ- „_~๙EjฃัhะฑcGฬž=:tภ๙๓แ๏๏Ÿ~๚ บu“ฺ………มภภ5’ง81บw๏๘้งŸคyๅห—L:ฝ{๗F50gฮŒ1๛๗๏Gใฦsmรƒะถm[จีjฬ;M›6•ๆyxx@ฉบธ…J9AD๔–ญXฑBงN ,ฆฆฆโษ“'B!EำฆM…Bุ‹vํฺi- ฯ‡ฟฟฟHOOฯตฎ^ฝz ___้๙๐แร…™™™x๖์ู+ีฯ?b๙นๆ๙๚๚ bํฺตาด„„@(•Jqโฤ i๚๎ปฑbล išฟฟฟะืื๛ฏ4ํๆอ›ยิิT4nXš–3n 6ิช?55UXXXˆhีu๛๖mannžk๚ห<(ˆƒ !„ˆŠŠฤฦ ”<ไŒล?(MหศศjตZX[[‹ฬฬL!„aaaBฉTŠ#GŽh-*ˆcวŽIำŒEpppฎuอš5KWฎ\ัšž˜˜(tttฤิฉSตฆวลล ]]]ญ้9๕†††ๆปM๚๚๚bะ A…n;ั๛€{ไˆ่ฺ๊ต+ž>}Šํท#55ทo/๔ฐjงNฐw๏^์ป๑ฦ‡]ปvกG/ำ\ฃั`ืฎ]Z‡U-,,––ฆu8ท(๚่#\บt ็ฯŸ—…พ์๎ปฏT๓‹.]บ!jิจ‘็|===ญ็•+W†พพ~พ !xกษƒฝs=z๔ภ€p๛๖mดmฏG๓ๆอ‡–‚\xx8เ์์,ตณถถFtt4v๏;wb็ฮXฑbz๗๎UซVๅฟ••€ `/{qYQฆ็‹ยศศH๋นFฃ๐|ฒŠ+ๆj:_lใ?ขOŸ>๘ใ?ฐgฯ 6 ำฆMร‰'ด.ฐx]...˜3gNž๓_ภฏฺทBกภฮ;๓—/Vyy<_–””„rๅสฝv=D๏ƒฝs;wฦภqโฤ lุฐแต๚x๖์เ๑ใวาด;vภฯฯ/W[}}}t่ะ:t€Fฃมเมƒฑdษ|๓อ7จ^ฝzžWฉRFFFธrๅสkี—Ÿ๒ๅหฃL™2ธpแBฎy P*•…†šjีชxR_S๙ฆ\\\เโโ‚ฏฟวGƒ Š)Sฆธอ›7sๅโล‹ž_เ’SsLL š7o^่ฎๆ็7ฝZตjBภััQฺ๘บnธฬฬLิฎ]๛๚!zWxŽฝs&&&Xผx1&Mš๔ฺ๗h๛๓ฯ?nnn€;w๎เฬ™3Z‡U;ื-‡Rฉ„ซซ+h๖โezzz๐๔๔Dddไkี—ดjี ๑‡ึีฅw๎มฺตkัฐaรBถnfff๘แ‡•••kฝ{๗^ฉฆ””)็pqqRฉ,pŒr<{๖ K–,‘žgffbษ’%(_พผthืฎ]qใฦ ,[ถ,ื๒OŸ>EZZš๔ุุ8ฯซes‚โห๓>๘c่่่`๒ไษน๖| !rฝ ’sNŸO‘—!*I#GD%"ฟoeศหล‹ฑz๕jฯozโฤ ฌZต ีซWGฏ^ฝ|ˆfอšมึึWฏ^ล๙๓กVซ ๋าฉS'L˜0)))ฏ|YAฆL™‚ฝ{๗ขaร†๛LนsGj r๕นiำ&ัชU+amm-๔๕๕E•*Uฤภลญ[ท ญ๛ฮ;BWWW„……iM๗๕๕u๊ิ)R90dศญigฮœญ[ท&&&ขL™2ขiำฆโ๘๑ใZm ทƒŠึญ[ sssahh(ชUซ&๚๔้#"## ฎ—o?r๙๒eัฏ_?QญZ5ahh(ส–-+š6m*๖ํW`?B฿XDFF oooahh(์ํํล‚ rตอฬฬ3fฬu๊ิยาาRxxxˆษ“'‹ไไdฉ]BB‚hธฑ022ดnE๒๗฿‹ส•+ ฅR™๋V$ฟปhุฐก066ฦฦฦขVญZbศ!โย… น๊อKvvถจTฉ’๘๚๋ฏ nข๗…Bˆ78—ˆ่=๐์ู3XYYaฺดiƒ\)gjj ธrๅ ส–-[ยีผฒฒฒฐgฯดjีJ๚*!๚?ŸยqŒ ฦ๑)วงp๊ฅคคภฮฮN๚;žนR.็pชฉฉiฑ~Wdi‘••…2eสภฬฬ์ƒ๚€(*ŽOแ8Fใ๘ŒใSธ}Œ ;-Š;ษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘L้–t๔nดž{ }“’.ใฝฃฏงอ<ŒLขคหy๏p| WZว่ฬ7อJบ"*๎‘#"""’)9""""™b#"""’)9""""™b#"""’)9""""™b#"""’)9""""™b#"""’)9""""™b#"""’)9""""™b#"""’ฉทไ๐ัG{ฟถmรฯ? ุบu+๙็Ÿ7๎3((oฯห™™‰๔๔tิซWjต*• ห–-}:ผผผp๗๎]ิญ[ํท‡‘‘=zKKห"""z_หนeห–มลลnnn˜8q"ฒฒฒ๐ร?เ๋ฏฟ.า๒ ภมƒnnn๘้งŸมมม8~8Vฎ\‰€€๘๚๚ขWฏ^Xนr%ฦŽ‹“'Obถm2dิj5RSS๑๗฿ฃQฃFจ[ท.๑ไษ“|ื๛อ7฿ภษษ ญZตยƒค้;v์ภG}ตZh4š<ท๓e‰‰‰?~ๆฮ‹ˆˆDGGCGG›7oฮs;็{ทm???|๑วจ\น2ฮœ9ww๗\๋|๚๔)`gg‡1cฦ lูฒZ๓ฃขข @DDˆ%K–@ฅRa๖์ูธ~ฏวดiำ`nn.=์์์ lODDD๒๕ฦ‡V#""333ฯรสž={ฐo฿>\ฝzUซmHHˆ๔ณงง'–/_เy>|8<==แ๏๏ปwใฮ;ฐฐฐ€ M›6น‚แห.\ธ€ุุX4mฺ™™‰ๆอ›็ู๖๘๑ใ๘๘ใกงง‡ส•+ฃQฃF€ฟ๚ ฑฑฑาน}OŸ>…ฝฝ=nผฉต9!ฬ฿฿็ฮรฏฟІ XŸ‘‘bbbp๏=t้าจPก )) ฝ{๗ฦาฅKฅ๖ …-[ถDห–-q๏=Œ9ถถถธ|๙ฒ๖^6n8|๑ลา๓””†9""ขRชุฯ‘‹ŽŽF||<๑์ู3ปw;vฤถm๒]ฆF๘็Ÿpไศดlู—.]BXX|||ค6eส”)tBxyyaฯž=EชUกPไ๚YN:i*าล/›6m-Z„~๚กs็ฮ่฿ฟ?jิจQเzห—/ตZร‡#00YYY่าฅ FŽฉตอ๐๘๑clุฐห—/‡ฑฑ1ยยยค๐—)Q้๖ฦ‡V›5k†๕๋ืK็by{{ใึญ[HLLฤัฃGแ๎๎^`ˆหแ์์Œตkืข^ฝzhะ ๆฮ‹ บœฉฉ)RSSตjีย•+WHKKห๗ŠVlูฒYYYธy๓&Ž9๘่ฃฐ~๗฿ž_U๚฿ๅฺฮ‡T*-Z„จจ(ิจQ=z๔@ำฆM‘˜˜จตพ{๗๎!)) ššŠˆˆ899 OOO๔๋ืOk™ัฃGรีี  รพ}๛๘V."!"""๙yใ งRฉ0t่P๘๘๘ภออ-฿=W@็ศฯฏ–/_FFFhะ nธ‘k๏T^‚‚‚0qโDจีjddd`ํฺต ››ผฝฝ๓ r๕๊ีC๓ๆอกRฉะทo_้Pชตต5.\ˆN:มีีญZตยปw Nccc๔๏฿งNย์ูณกซซฝณ๓ึญ[hฺด)เใใƒAƒมีีgฯžล๒ๅหฑkื.จีjจีjฤววZดh„„ฬš5๋ฝบ*—ˆˆˆ Qิห!I–RRR`nnฏ€F฿คคหy๏่+ฦฉcฺYdj…/๐แ๘ฎดŽั™ošK?YYY‡ŸŸ๔๔๔Šฅฯา„ใSธuŒr~'''K็็็…฿์@DDD$Soํ†ภ๏“๚๕๋###Ckฺ฿ }}ชˆˆˆˆ่อ}A๎ไษ“%]QฑใกU""""™b#"""’)9""""™b#"""’)9""""™b#"""’)9""""™b#"""’ฉโ†ภ์ัVVV%]ฦ{'็;Ž|ู๘ƒ๚ฟขโ๘ŽcDD%‰{ไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠ็ศ} &์บ2wKบŒ๗ŽฒัL Œ~ูะ)้r;Ÿยษ}Œtฎ]า%ัเ9""""™b#"""’)9""""™b#"""’)9""""™b#"""’)9""""™b#"""’)9""""™b#"""’)9""""™b#"""’ฉRไ๐ัGฺ.22cวŽDDD 22๒ญีไ็็‡ฬฬLคงงฃ^ฝzPซีPฉTXถlเมƒhผ9œแโโ‚7พตZˆˆˆจtั-้Šหฝ{กฃฃSคถžžž๐๔๔๐<ศUฌXQz^ฒฒฒ™™ ccc„‡‡„8x๐ Œ‘––BฉTb๚๔้๐๒๒ยปwQทn]ดo฿FFFx๔่,--‹ญ."""*]dนGnูฒepqq››&Nœˆฌฌ,๐ร๘๚๋ฏ‹ด|DD‚‚‚p๚u„††b๊ิฉPซีธpแN:OOOธธธ`ะ AศฮฮLœ8^^^PฉT?~|ž&&&b๘๑จUซ.^ผppp@zz: Œะh4ะh4ฐดด„——ภฺฺVVVx๔่ภ฿฿ุทo„o4fDDDT๚ศ.ศลฦฦbแย…8v์bbb0|๘pฬ™3มมม055ีjŠะะPฯง๖๏฿_kพBBB0aยDGGรษษ }๛๖ล’%K‡‡bบu€แร‡ใิฉSˆEll,bbbูููุถm๐๑วฃrๅส8sๆ sี๔้SธนนมฮฮcฦŒAูฒeตๆGEE!;;666žฮbษ’%PฉT˜={6๎฿ฟ_เ๘ddd %%E๋ADDDฅ“์‚\ฮ4333ฯรัž={œซmHHBBB>ŽŽŽhุฐ!ขขขะฑcวb]Gzz:พ๘โ ์ุฑฑฑฑ DFF€็มฉM›6่ืฏพ๚๊+\บtฉะส—/ตZร‡x~N]—.]0rไH๘๘๘hต}๘1๗ฟกcวŽธ}๛6ยยยPกB…|๛7n’““ฅว๕๋ื฿`ห‰ˆˆ่}&ป ืฌY3ฌ_ฟ^:d่ํํ[ทn!11G…ปป;ถmVไLMM‘šš ฐฐฐ€ŽŽŽtุtบuhุฐ!าำำกT*aii‰‡โฯ?”–WฉTXดhขขขPฃF ๔่ัM›6Ebbขึz๎ป‡คค$@jj*"""เไไ…ใQIโ9""""™b#"""’)Z@lˆน#ำด’.ใฃษFYซฯ(uJบš๗วงpฃ‚q| ฦ๑){zํๅ#""YŒi๓๓๓Cff&าำำQฏ^=จีjจT*,[ถ ๐เม4oฮฮฮpqqมฦ฿Z-DDDTz่–toj๏ฝะััyฃ>"""PฑbExzzSU@VV233allŒ๐๐p€„ฑฑ1าาาเโโ‚ภภ@(•JLŸ>^^^ธ{๗.๊ึญ‹๖ํรศศ=‚ฅฅeฑีEDDDฅ‡ฌ๖ศ-[ถ ...pssรฤ‰‘••…~๘_u‘–_ฟ~=งOŸ†——ฎ_ฟŽะะPL:jต.\ภฉSงเ้้  4ููู€‰'ยหห *• ใวฯs‰‰‰?~sๆฬApp0LMMตฺ†††"44‰๛‚‚‚••…u๋ึaเภXบt)์์์‚ & ::NNN่ท/–,Y‚ธธ8<|๘๋ึญ >งNBll,bccศฮฮฦถmเ็็‡?•+Wฦ™3gเ๎๎žk;ž>} 777ุููaฬ˜1([ถฌึจจ(dggรฦฦภ๓ฝ…ฤ’%K Rฉ0{๖lฟ?฿qš6mฬออฅ‡kŽ8ฝ๏dไ"""333ฯัž={œซmHHBBBžžžXพ|น4/44ƒFซVญ๒ ZIIIะh4๐๐๐๔์ูวŽ์฿ฟ^^^Pซี8u๊โใใ<฿k6bฤŒ?gฮœม!C`nnž็v!&&‰‰‰ุฐa๎นฃต๎ฝ{c้าฅา4…B–-[bใฦˆˆˆ@tt4lmmq๓ๆอ<๛7n’““ฅว๕๋ื๓T"""’5ูน—EGG#>>ŽŽŽhุฐ!ขขขะฑcวB—KLL„nบ๕J๋KOOว_|;v 66ศศศ๐|/X›6mะฏ_?|๕ีWธt้Rก•/_jต‡๐œบ.]บ`ไศ‘๐๑๑ัj๛๘๑c๏CวŽq๛๖m„……กB… y๖k``333ญ•Nฒ rอš5ร๚๕๋ฅsพผฝฝq๋ึ-$&&โ่ัฃpwwวถm ์###ƒ ยพ}๛p๚u์ูณ`jjŠิิT€……tttครฆ๋ึญCร† ‘žžฅR KKK<|๘๙งิฏJฅยขE‹…5j Ghฺด)ตึ๏=$%%RSS'''ภเมƒแ้้‰~๚i-3z๔hธบบ"!!aaaุทo฿๘"""’?ู9•J…กC‡ยววnnn๘๙็Ÿ๓m›฿9r฿}๗:w๎ •J…ฅK—bไศ‘x๘1:t่€ฐฐ0ธปปใย… ๘ๅ—_๐้งŸยลลๆๆๆ ‚……บw๏Žฺตkใใ?†ททwฎ๕ฃ8u๊fฯž ]]ํ‹‚oบ…ฆM›ยออ >>>4h\]]q๖์Y,_พปvํ‚Zญ†Zญ–ถhั ˜5kชWฏ^\รIDDDฅ€BๅRH’ญ””˜››cแ™Z”t9๏M6สŽลรŠฎ€’{9sแ๘ŽcT0ŽOม8>…{วจฏW•ทึwฮ฿๏ไไไO“’อ9""""าฦ GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ฅ[x* บนU†••UI—๑ษสสBxx,>ฉk ==ฝ’.็ฝร๑)วจ`Ÿ‚q| ว1*๗ศษƒ‘L1ศษฯ‘๛@œNL้#’.ใฝฃษ~๘๛r2”:uxวงpฅuŒผซ[”t DT#GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S%ไ๐ัGฺ.11›6m*ถ๕Nš4 กกกลึ_Qlถ ?3`๑โลpuu…ZญFซVญp็ฮ@hh(๊ิฉWWW๘๛๛#%%ๅึHDDD๒๔ฮƒฝ{กฃฃSคถลไDvv๖+ต๔่ cวŽ6lเ“O>All,ขฃฃัฑcGฬ˜1 Rฉp๊ิ)ฤฦฦBฅRแงŸ~$''CQŒ[ADDDฅษ[ rห–-ƒ‹‹ 0qโDdeeแ‡~ภื_]คๅ'L˜€ปwCญVcอš5ธw๏ฺถm ดnZฺฃ•—„„๘๚๚ยออ ๕๋ืGFFเ๔้ำhุฐ!ชUซ†={๖๗_4lุu๋ึ…ทท7ฮŸ?Xนr%เ๋๋‹^ฝzแเมƒpqqZญFƒ rญ๓ูณgุผy3Zตj…กC‡J}Œ;`jj*ต}๒ไ   aร†(Sฆ ภรร7n9rตkืฦ๔้ำq๗๎"YFFRRRดDDDT:ฝต ‹… โุฑcˆ‰‰ม๐แร1gฮkเ๙กลœCž‘‘‘่฿ฟ?`๊ิฉhบ5ขฃฃัณgOLœ8-[ถD\\:u๊„ &ไป^ฝzaาคIˆ‰‰มž={ งงธz๕*:„฿~๛ “'OTชT ๛๗๏ว™3g0o<Œ?^k;ถo฿Žตkืbฮœ9๘๙็Ÿ๐๐pฉอ๕๋ื๑ํท฿ยููทoวw฿}‡5kึไYืO?ฌZต ใฦห5ื_E๓ๆอํทวกC‡Mš4APP""" ๗iำฆม\zุููุžˆˆˆไ๋ญนˆˆมฬฬ ๐๔้S์ูณมมมนฺ†„„ $$เ้้‰ๅห—็ู็๑ใว๑ษ'Ÿx~˜๒ุฑcyถKIIAjj*š6m 077‡R๙|Sตkธปป#11ภ๓ฝX}๛๖…Jฅย€/๕ีฆM)x๚๘๘เห/ฟฤ‚ ค=|7๑ไษDFFโ—_~)๐ฟ‘#G"11ฤ๙๓ตๆ-Zดฯž=Cทnคi*Tภุฑcq๎9๔์ู๘๓ฯ๓ํธqHNN–ืฏ_ฯท-ษ;;G.::๑๑๑pttDร† …Ž;พซีK JฅR:๏m๎นprrB\\๖๏฿/…4า!OเyHZถl=z„๚๕๋ใมƒpuuลาฅKq๔่Qt้าฟ๖233 ญใ“O>ั:oฯž=Xบtiž{๒ขขข0dศŒ5 Ÿ~๚)FUเ๖™™™i=ˆˆˆจtzkAฎYณfXฟ~ฝtŽ–ทท7nบ…ฤฤD=z๎๎๎ุถm[}˜šš"55Uz๎ใใƒ 6ึฎ]‹† ๆนœ™™ฬออq๐เAฯ/ะh4๙ฎ'%%+V„Bกภส•+๓mw๙๒eจีj|๓อ7pppภ๕๋ืahhˆ~๚แฤ‰˜5k8€ZตjแวฬตฅK—คŸ๘ใิชU กC‡b๋ึญZม๋ฬ™3๐๒๒ยจQฃเ๋๋‹ณgฯb๚๔้pppศทF"""๚pผต งRฉ0t่P๘๘๘ภออMบG^๒;GฮีีOŸ>•.v˜4iยรรแ๊๊Šอ›7cส”)๙๖๙๋ฏฟbโฤ‰pssC›6m•••o,XฐjตZ+8พlฮœ9าmBjีช777ญ๙jตกกกˆ…Zญฮต๙๓กRฉ VซฑqใFฬ;๐ํท฿"99PซีาUฎeส”มš5kpเภt๋ึ ๚๚๚๙ึFDDD…เ-Jต””˜››cwไe˜š[–t9๏M๖3O8†rต@ฉฃ[าๅผw8>…+ญcไ]ขX๚ษสสBxx8ค‹ฮ่p| ๗กŽQฮ฿๏ไไไO“โ7;ษ”์ƒิฉSกVซต๏หM„‰ˆˆˆ&ู˜0aB๗“#"""*ญdฟGŽˆˆˆ่Cล GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$Sฒฟ!0‡ƒฌฌ,JบŒ๗NVVย€zUอ?จ๏๐+*ŽOแ8FDT’ธGŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆxŽโnˆ2™%]ฦ{'[ื่ถ w‚+C็YzI—๓แ๘๎]ŒQฅ฿RJฟD$#GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$S rDDDD2ล GDDD$So-ศ%%%a๙๒ๅ๙ฮฏXฑbก}ฌ\น๗๏฿/ถšŠฒฮโๆ็็‡ฬฬLคงงฃ^ฝzPซีPฉTXถlเมƒhผ9œแโโ‚7พ๓‰ˆˆHžJ,ศEqน7‘]ไถYYYHKK„‡‡C__8x๐ ขฃฃq๒ไIL›6 IIIP*•˜>}:โใใฑ~Œ9OŸ>>^๊+'VญZืฎ]ร็ŸŽ๛๗รภ๓ฝf#FŒภ๘๑ใqๆฬ 2Dš๗2###ฤฤฤ 116lะ ณIII่ปทึžF…B–-[bใฦˆˆˆ@tt4lmmq๓ๆอ<๛€qใฦ!99Yz\ฟ~=฿ถDDD$oลไ7nŒร‡รฺฺ]บtม๛sตQ(ลตบืb`` ฌT*‘๔๔t|๑ลุฑc‡ด๗.##Cj—8---‹† bฦŒ˜4i€็{ภฺดiƒ~๚แซฏพยฅK— ญฃ|๙๒Pซี8|๘0€็็ิu้า#GŽ„Vวใ๛:v์ˆทo#,, *T(pอฬฬดDDDT:[ปz๕**Uช„Aƒ!((IIIHMM•ๆ๛๘๘`ร† ž๚|๒ไIก}šššJ}xyyaHIIมใวฑs็Nิฏ_?ฯๅZดh_~๙™™™€‡ๆปŽ๔๔t(•JXZZโแร‡๘๓ฯ?๓lw}!ะญ[7L˜0Aฺ‹จRฉฐhั"DEEกF่ัฃš6mš๋ฐ๏ฝ{๗””HMMEDDœœœƒ†งง'๚๕๋งตฬ่ัฃแ๊๊Š„„„……a฿พ} „ŽŽNใFDDDโ๊(""3gฮ„พพ>ฌฌฌฐ~zDFFยีีฝz๕ย!CะณgOิฉS7ึฺซคVซฅ`ิฟ„„„ภำำ}๚๔Aฏ^ฝPพ|y9r_}๕•ดวjไศ‘pppศณ???DFFยบบบ:t( g[ t๏ตkื†ญญ-ผฝฝ๓l๗฿กo฿พB@WW ,ะšollŒ๛ฃ8}๚4tuต‡๖ึญ[–.rิ1ส๙๛œœ\เiRf""""™*ถCซ%!็[^Tฎ\9์ทฏ„*""""zwdไฌฌฌดn]BDDD๔!แกU""""™b#"""’)9""""™b#"""’)9""""™b#"""’)9""""™b#"""’)Y฿˜Šฮ:๔ฌฌฌJบŒ๗NVVŽ ซn|P฿แWTŸยqŒˆจ$q‘L1ศษƒ‘L๑น„f้วะhJบŒ๗ŽFกTอ‚6ะˆฬ’.็ฝ๓>๒‹#%]Q‰ใ9""""™b#"""’)9""""™b#"""’)9""""™b#"""’)9""""™b#"""’)9""""™b#"""’)9""""™b#"""’)9""""™z+A.)) ห—/ฯw~ลŠ ํcๅส•ธ~ฑิ“˜˜ˆM›6ๅ;?44ดภ๙oโลพฟ๙ๆธนนมีีx๒ไ `าคIจUซT*๚๖ํ‹gฯžฝ•Zˆˆˆจt)‘ W๏*ศegg#$$ลฒฎ=ญพฟ๒Kฤฤฤ 66UชT‘ฦจqใฦˆ‹‹รูณg๑์ู3ฌYณภ๓q$"""สnqtr๓ๆM"-- 5jิ@\\ิj5z๖์‰มƒใ“O>ม… ะธqใB๛ฒe "##ันsg”+WGŽมŠ+๐ใ?† †ฯ>๛,ฯeใโโะงOdggCกPเเมƒ˜0aโใใกVซ1fฬ\บt Wฏ^EBB|||`jjŠŠ+"$$Mš4A๚๕ฑo฿>h4lถ vvvธx๑"z๔่ฌฌ,4mฺัััˆˆˆะZwzz:6lุ€%K– I“&๘แ‡0iา$ฉoSSS€้้้P(€fอšI}ิญ[7nฌ[ทกกก๘์ณฯะซW/˜™™:vศศศžงคคบ ษSฑ์‘[ทnZดh่่hœ>}SฆL‹‹ ขฃฃ1fฬ,\ธŽŽŽˆGถmq็ฮiYตZ-ฟ)ภyzzbห–-8rไ๛๏?L:Gล_…9sๆ 111ฯZ–.]ŠกC‡"::วŽƒ‰‰ ฆNŠึญ[#::={๖๛๏ฟ8|๘ฐ_dbb‚ำงOใ“O>Ahh(`ฤˆ˜4ibbb ซซ/\ธ€‘#GBฅRแฬ™3Xถl~๘แ‡<๋3f *WฎŒs็ฮกZ๓ฒณณฑvํZ4o0hะ ๑วธu๋<==1`ภœ>}บภืbฺดi077—vvvถ'"""๙*– ็ๅๅ…ฐฐ0Lž<—.]‚‘‘‘ึใว#((ะฉS'”)SFš-ผ|๙rxzzๆ๊?22ญZต‚……LMMแ็็‡“'OๆY‹ทท7fอš…™3gโฝ{นBW่้้ๅ9ฏcวŽwww)0ฦฤฤ }๛๖€nบImwจT*TชT gฯžลผy๓PงN<๛€Yณfแฦ๐๒๒ย๚๕๋ตๆ7๕๋ืG๚๕ฅi˜2e โใใั A4n8ฯ๐๙bษษษาใ๚๕๋๙ถ%"""y+– ืธqc>|ึึึ่าฅ ๖๏฿ŸซMฮaฤทญG๘ใ? ซซ‹ฆM›โ๙๓yถ{1Lพฬภภ T*‘ เ๙แะผดlูณgฯฦš5kะฝ{w„‡‡CฃัXฃBก@๗๎ตฮ๛฿‡ำงOc๎นนฺ9r}๛๖ลŒ30~x|๒ษ'ึnffฆ๕ ""ขาฉX‚ีซWQฉR% 4AAAHJJBjjช4฿วว6ll฿พ]บZณ ฆฆฆR^^^ุฟ?RRR๐๘๑c์นSkฏี‹ฎ\น‚๊ีซใ‹/พ€ฏฏ/.\ธ ีื๋rssCxx8`ใฦาt333 >1119r$ึฌY'''ฌ^ฝ:W—.]’~ถmjีช8x๐ ๆอ›‡M›6iํAณgT*fฯž๎ปในs˜0a*Tจ๐FBDDDฅCฑ\์™3gB__VVVXฟ~="##แ๊๊Š^ฝzaศ!ู่ณ'๊ิฉƒฦkตZ-^ํ฿ฟ?BBBเ้้‰>}๚ Wฏ^(_พ<Ž9‚ฏพ๚ >>>€‘#Gยมม!ฯZึฏ_ีซWCOOีซWG›6m ฃฃƒงOŸJ;ผŽŸ~๚ ={๖ฤ๘๑ใแใใ“็žฎฦฃqใฦx๐เAž{วŽ‹ .@ฉTยููK–,๐ผนGกiำฆ€   Œ;VVVุตklmm_ซf"""*"ฟc†คๅษ“'022‚Bกภ”)S๐์ู3Lš4ฉคห*TJJ ฬออq๗‡ฦฐ2(๘๏‡(Kก]U‡กอๅŸก'2Kบœ๗ฮ๛<>ส/Ž”t €ฌฌ,„‡‡รฯฯ/฿๓n?dŸ‚q| ๗กŽQฮ฿๏ไไไO“*–=r‚“'Obไศ‘ศฮฮ†ฃฃ#~๕ื’.‰ˆˆˆ>pฒ r<nำ‘ฃ\นrุทo฿[Y_ฮฝใˆˆˆˆฒ rVVV VDDD๔A{+_ัEDDDDoƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘Lษ๖†ภ๔j”Ÿm†าสชคหx๏(ณฒ€๐p(‡๎‚๒๚ฟขโ๘ฝ฿ธGŽˆˆˆHฆไˆˆˆˆdЇV?š] )๓~ผสฮ Jบ""ขR{ไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠA@‹- œŸ””„ๅห—KฯำำำัฌY3ธปปใเมƒE๎๊ีซจ[ท.ิj5ฐm6ภ… ะ AจT*ิญ[‡zƒญ!""ข…nIP’„B`฿พ}ถห r๛๗DEEมฬฬ ศw™'Ož@WW๚๚๚R•*Uย_นs^^^ุ่ฑ# ๑ห/ฟภษษ ่ะก.]บx๔่,--‹i‹‰ˆˆจ4)5{ไnผ‰ @ญVรีี pwwG—.]Pปvm|๖ูgะh4€ *`ะ Apqqม๕๋ืQฑbE@DDZทn: F˜:u*`ย„ ˆ‹‹ƒZญฦฌYณะซW/:tjต<ะชในs๘๓ฯQงN} T*ˆ2eสภษษ jต„ฃG" ฆฆฆhบuž4hะVVVGGGผyzzzฎำำ๚๚๚XตjT*UmซUซ†ธธ8\พ|ฝ{๗F›6m`hhเ๙9tcฦŒAxxธิ^WW;wF็ฮq๕๊U 0ฃGFjjjž7_|๑…๔<%%…aŽˆˆจ”*5{ไ7nŒร‡รฺฺ]บtม๛ฅฝZ P(ค็eส”ษทŸœCŸ T*‘]่บ—.]Š:u๊ 00SฆLม7 ]ฆjีช([ถ,โโโ<\:uย‚ Pฝzuญถ<ภนsัฑcGcใฦึoffฆ๕ ""ขาฉินซWฏขRฅJ4h‚‚‚ššŠ„„ฤฦฦB฿~๛ 6|ญพMMM๓๘๕ื_q์ุ1ฃu๋ึุ่ฑ#’““ตฺธqOŸ>พ}ฑฑฑpttDvv6บvํЁขUซVZห๔่ัHIIมฮ;ฑeหดiำๆตถƒˆˆˆJ—Rsh5""3gฮ„พพ>ฌฌฌ0}๚tธบบb๒ไษ8w๎7nŒฮ;ฟV฿VVVpuu…ซซ+z๕๊//ฏ<•-[#GŽฤศ‘#‘k~||<พ๘โ (•J(•J๘ใ(Wฎถo฿Ž๛๗ใ๖ํXฒd‰ด=่ัฃVฏ^ ฅฒิdn"""*&ฅ&ศ#88Xzž˜˜๛๏นฺพ};ฯ็Mš4A“&Mค้/†ฑu๋ึi-๓bปผผ8?ง–-[J‡R_ิพ}{deeๅูO๛๖ํ \}ธธ›‡ˆˆˆHฆJmsppภ‰'Jบ """ขทฆิ9"""ขาŽAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdชิ|ื*Lูf*”VV%]#๎‘#"""’)9""""™b#"""’)ž#๗ะฤ™Qž๓”nฝq5DDDTธGŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠAŽˆˆˆHฆŠ5ศ%%%a๙๒ๅลูฅ์๙๙๙!33้้้จWฏิj5T*–-[x๐เš7ogggธธธ`ใฦ%\1ษล; rูููลนช"+‰๕fee!-- }}}เเมƒˆŽŽฦษ“'1mฺ4$%%AฉTb๚๔้ˆว๛1rไH<}๚๐่ัฃw^;ษG‘ƒอ›7ั Aจีjธบบโ๘๑ใZฯ0aยฤลลAญVcึฌYXนr%เ๋๋‹^ฝzแฮ;่ิฉ<==ัจQ#\ผx ///ธบบขo฿พะh4€&Mš`ิจQpww‡——"##ัผysTญZ;v์ศทึI“&กo฿พ๐๖๖ฦ—_~‰K—.กeห–๐๐๐@›6mp็ฮ€ƒƒาำำ+WฎฤุฑccฦŒAญZตเๆๆ†Yณf@พ}ผ(11ใวGญZตคmหY‡Bก€ฑฑ1 ##–––๐๒๒X[[รสสJ pภพ}๛ „(า๋”‘‘””ญ•NEr๋ึญC‹-ำงOใเมƒZฯํํํ1u๊Tธธธ ::cฦŒฤฦฦb๛๖ํXปv-Fމ‰'"22sๆฬม_|ฺ่ต+N:…ุุXแฯ?”ึkee…จจ(4lุC‡ลŽ;ฐu๋VL™2ฅภz๗_>|?๘#† ‚ๅห—ใ๔้ำ๘๔ำO๑๗฿็ปƒฐiำ&ฤวว#&&Ÿ}๖ไGvv6ถm???|๑วจ\น2ฮœ9ww๗\}?}๚nnnฐณณร˜1cPถlYญ๙QQQศฮฮ† ""ฤ’%K Rฉ0{๖lฟฟภํž6mฬออฅ‡]ํ‰ˆˆHพt‹ฺะหห }๚๔RฉD`` 5jค๕ูู9ฯๅฺดiSSSภ/อำััฤฤฤเ๋ฏฟFJJ ’’’`gg‡N:ฺทopqqBก€กก!T*ฎ]ปV`ฝะำำCjj*Ž;&๕—jีชๅปœนน9LLLะฟ๘๛๛ฃ]ปv๖แ๏๏s็ฮแื_Eร† ฌษศศ111ธw๏บt้‚€€TจPภ๓ราฝ{๗ฦาฅKฅ๖ …-[ถDห–-q๏=Œ9ถถถธ|๙ฒ๖^6n8) @JJ รQ)Uไ ืธqc>|๙'บt้‚ ไzžW@*SฆŒ๔ณBกภ™3g Tj๏0`v๎‰5j`๖์ูx๘ฑ4O__ T*ต~.์ทœ๕j4Tฎ\ััันฺ่่่H‡q322บบบˆŒŒฤ๎ปฑfอlผ๓ๆอหทiำฆaัขE่ืฏ:w๎Œ๛ฃFึVพ|yจีj>|ศสสB—.]0rไH๘๘๘hต}๘16lุ€ๅห—รุุaaaR๘ห‹ \?•E>ดz๕๊UTชT ƒ BPPŽ=ช๕<..ฆฆฆHMMอทFICh4ฤลลาาาPพ|yคงงcร† oธIฺฬออaii‰={๖x~!ย๙๓็๖๖๖ˆŽŽ†Fฃม๖ํ<Nษษษุ่ฑ#fฮœ‰่่่๛PฉTXดhขขขPฃF ๔่ัM›6EbbขV๗๎CRR 55prr <žžž่ืฏŸึ2ฃG–ฮ? รพ}๛(ํษ$""ข[‘ƒ\DD\]]แ๎๎Ž#GŽภมมA๋๙'Ÿ|+++ธบบยีีUบHเE๓็ฯวฮ;แๆๆ•J%]ฐ0aยิญ[M›6อ๓ฒ7ตfอฬš5 nnnPซี8y๒$เ๋ฏฟF๏ฝแใใ#ชLMMEปvํเๆๆ†N:I็ยๅืGccc๔๏฿งNย์ูณกซซฝณ๓ึญ[hฺด)เใใƒAƒมีีgฯžล๒ๅหฑkื.จีjจีj้๐s‹-€Yณfกz๕๊ล>.DDD$o Qิห!I–RRR`nnŽป‡—ภสฬ(ฯ6Jท^๏ธช๗GVVยรรแ็็==ฝ’.็ฝร๑)วจ`Ÿ‚q| ๗กŽQฮ฿๏ไไd˜™™ๅŽ฿์@DDD$SEพุแ}ด{๗n|๕ีWZำฺดiƒ้ำง—PEDDDD๏Žฌƒ\๋ึญับu๋’.ƒˆˆˆจD๐ะ*‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษ”ฌoLEงt๎ฅ•UI—ADDDลˆ{ไˆˆˆˆdŠAŽˆˆˆHฆไˆˆˆˆdŠA๎ัzs๊ฎ,้2ˆˆˆจ1ศษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘L•ช —””„ๅห——tZถm†Ÿฐx๑bธบบBญVฃUซVธs็ 44u๊ิซซ+‘’’R’%‘L|0A.;;๛ึ๒่ั#@วŽ1lุ0ภ'Ÿ|‚ุุXDGGฃcวŽ˜1c@ฅRแิฉSˆ…JฅยO?HNN†โึMDDD๒!› w๓ๆM4hะjตฎฎฎ8~ธึ๓„„L˜0qqqPซี˜5kVฎ\‰€€๘๚๚ขWฏ^ธs็:u๊OOO4jิ/^๐|˜——\]]ัทo_h4@“&M0jิ(ธปปรหห ‘‘‘hผ9ชVญŠ;vไช๑ูณgุผy3Zตj…กC‡Vฎ\‰ฑcวLMMฅถOž<Bก4lุeส”xxxเฦ€#GŽ vํฺ˜>}:๎ฝ๛–F–ˆˆˆไJ6Anบuhัขขฃฃq๚๔iสw;FމฤฤD 8๓็ฯืšทhั"<{๖ บu“ฆUจPcวŽลนs็ะณgOโ๓ฯ?ฯทiำฆม\zุูู4ฌDDD$cฒ r7ฦแร‡amm.]บ ++K๋๙๛๓\.็%( œ9sัััาž<0`Vฎ\‰ธธ8 >า2๚๚๚ฅRฉ๕sฮ9wฎฎฎXบt)Ž=Š.]บเท฿~Cfffก๓ษ'Ÿ`ำฆMา๓={๖`้าฅy๎ษ‹ŠŠย!C0jิ(|๚้ง5jTพŽ7ษษษาใ๚๕๋…ึBDDD๒$› w๕๊UTชT ƒ BPPŽ=ช๕<..ฆฆฆHMMอทFICh4ฤลลาาาPพ|yคงงcร† ฏT—กก!๚๕๋‡'N`ึฌY8pเjีช…1WK—.I?๑วจUซ >>C‡ลึญ[aff&ต9sๆ ผผผ0jิ(๘๚๚โ์ูณ˜>}:๒ญวภภfffZ"""*tKบ€ขŠˆˆภฬ™3กฏฏ+++๔๊ี ฎฎฎา๓๕๋ืรสส ฎฎฎpuuEฏ^ฝPพ|yญ>ๆฯŸ,\ธYYY่ป7\\\0aยิญ[*T€ปป๛kืจVซŠวใไษ“นๆฯŸ?€ฎฎ.lllฐdษภท฿~‹ไไd๘๛๛xพ๗๑็ŸF™2eฐfอิฌY๓ตk"""ขาK!x‹R-%%ๆๆๆ๐Xpๆ“%]า{%++ แแแ๐๓๓ƒžž^I—๓แ๘ŽcT0ŽOม8>…๛Pว(็๏wrrrGืdsh•ˆˆˆˆด1ศษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษƒ‘L1ศษ”nI@๏ฦ๎CaeeUาeQ1โ9""""™b#"""’)9""""™b#"""’)9""""™b#"""’)9""""™b#"""’)9""""™b#"""’)9""""™b#"""’)9""""™b#"""’)9""""™า-้่ํBRSSกงงWยีผฒฒฒ๐ไษคคคp|๒ภ๑)วจ`Ÿ‚q| ๗กŽQJJ €๛;žนR๎มƒGGวฎ„ˆˆˆ^Ujj*ฬออ๓ฯ Wส•-[pํฺต฿y๑๒๒ยฉSง^kฝฏป์ป^gJJ ์์์p๚u˜™™ฝ“u–ฤrฏปฌฦง$ึ๙&c$งํไ๘ผe๙;Vธ’xฝใ#„@jj*lll \ŽAฎ”S*ŸŸinnสฟ:::ฏ๕ม๒&ห–ฤ:ภฬฬ์ึห๑y;ห•ิ:ื#9m'ว็ํ.ห฿ฑยฝห๗ะ๛2>Eูร‹(_C† y็ห–ฤ:฿ฤปNŽฯ๛นฮื%งํไ๘ผe฿๕:ๅ6ถฏ๋C…(์,:’ต””˜››#99๙'TZq| ฦ๑)วจ`Ÿ‚q| ว1*๗ศ•r˜8q" Jบ”๗วง`ŸยqŒ ฦ๑)วงpฃ‚q‘Lq‘L1ศษƒ‘L1ศษƒ\)ถpแB888ภะะ๕๋ืว฿]า%ฝ‡F‡`cc…Bญ[ทjอBเoฟEฅJ•`dd„-ZเาฅKZm>|ˆž={ยฬฬ ๘๔ำO๑๘๑ใwธoฯดiำเๅๅSSSX[[ร฿฿.\ะj“žžŽ!C†ภสส &&&่าฅ ๎นฃีๆฺตkhืฎส”)kkkŒ3ฯž={—›๒ึ,^ผฎฎฎา Hฝฝฝฑs็Ni‡>>/›>}: FŒ!M๛วhาคIP(ZZตjI๓?ไฑษqใฦ |๒ษ'ฐฒฒ‚‘‘\\\)อะ?ง_‰ Ri๚๕B___๒ห/โนsbภ€ยยยBนsงคK{๋ยรรล„ ฤๆอ›ฑeหญ๙ำงOๆๆๆb๋ึญ"&&Ft์ุQ8::ŠงOŸJmฺดi#ฤ‰'ฤ‘#GD๕๊ีE๗๎฿๑–ผญ[ท+VฌgฯžัััยฯฯOTฉRE<~Xj"์์์ฤ๛Eddค๘่ฃ„4ูณgBฅR‰-Zˆจจ(.ส•+'ฦW›T์ถm&v์ุ!.^ผ(.\ธ ฦ/๔๔๔ฤูณg…Ÿ๗฿ยมมAธบบŠแร‡Kำ?ไ1š8qขจSงŽธu๋–๔ธw๏ž4C!„x๘๐กฐทท}๚๔'Ož—/_ปw๏๓ิๆCœ~ rฅTฝz๕ฤ!Cค็ูููยฦฦFL›6ญซz๗^rFTฌXQฬš5Kš–””$ ฤบu๋„Bฤวว โิฉSR›;w …B!nธ๑ฮjW๎ฝ+ˆC‡ !ž‡žžžุธqฃิๆ๙๓€๘๋ฏฟ„ฯรฒRฉทo฿–ฺ,^ผX˜™™‰ŒŒŒwป๏ˆฅฅฅXพ|9ว็ฉฉฉขFb๏ฝยืืW r๚Mœ8Qธนนๅ9๏C!„๘๊ซฏDร† ๓ฯฯ้WรCซฅPff&NŸ>-ZHำ”J%Zดhฟ๚ซ++yWฎ\มํทตฦฦ๕๋ื—ฦๆฏฟ‚……<==ฅ6-Zด€Rฉฤษ“'฿yอo[rr2 lูฒ€ำงO#++KkŒjีช…*Uชh‘‹‹ *Tจ ตiบ5RRRp๎นwX—๕๋ื#-- Ÿ 2ํฺตำ €๏!ธt้lllPตjU๔์ูืฎ]ภฑ€mถมำำฐถถ†ปป;–-[&อ็็๔ซa+…๎฿ฟ์์lญจPกn฿พ]BUฝrถฟ ฑน}๛6ฌญญตๆ๋๊๊ขlูฒฅn4 FŒ @ฅRxพ๚๚๚ฐฐฐะj๛๒ๅ5†9๓Jƒธธ8˜˜˜ภภภ!!!ุฒe œ9>฿๚๕๋qๆฬL›6-ืผ}Œ๊ืฏ•+Wbืฎ]Xผx1ฎ\น‚F!55๕ƒธ|๙2/^Œ5j`๗๎4h† †UซVเ็๔ซา-้ˆจไ 2gฯžลัฃGKบ”๗Ž““ขฃฃ‘œœŒM›6!88‡*้ฒ ืฏ_ว๐แรฑw๏^–t9๏ถmJ?ปบบข~๚ฐททวoฟ##ฃฌ์ ัhเ้้‰~๘เ๎๎Žณgฯ"44มมม%\p\)Tฎ\9่่่ไบ ๊ฮ;จXฑb U๕~ศู‚ฦฆbลŠธ{๗ฎึgฯžแแร‡ฅj†Šํทใเมƒฐตต•ฆWฌX™™™HJJาj๒ๅ5†9๓J}}}Tฏ^˜6m0o<Žžผ{๗.๊ึญ ]]]่๊๊โะกC๘๙็Ÿกซซ‹ *|๐c๔" ิฌY๓฿?*Uชgggญiตkื–?๓s๚ี0ศ•B๚๚๚๐๐๐ภ๛ฅi๛๗๏‡ททw VV๒QฑbEญฑIIIมษ“'ฅฑ๑๖๖FRRNŸ>-ต9pเ4 ๊ืฏฮk.nB :[ถlมเ่่จ5฿รรzzzZctแย\ปvMkŒโโโด>H๗๎ 33ณ\ะฅ…FฃAFFว@๓ๆอ‡่่h้แ้้‰ž={J?่c๔ขวใ฿EฅJ•๘ะ Aƒ\ท<บx๑"์ํํ๐s๚••๔ี๔vฌ_ฟ^ˆ•+WŠ๘๘x๑ูgŸ ญซ JซิิT%ขขข1gฮ%ฎ^ฝ*„x~Yป………๘ใ?Dllฌ่ิฉSž—ตปปป‹“'OŠฃGŠ5j”šหฺ $ฬออEDD„ึํž}๚`ส”)ฏgอš5QฑbE๙็ŸoZQฉร GDฅJๅส•ฑu๋V้๙J•*ๅjทgฯ<~ืฎ]Cff&พ{ญ๙ปvํB›6m^i๛฿ะฝ{๗ืช๛U<{๖์ญฏใ}‘ณญปwว๒ๅหKธข๗ƒ•*ปwวš5kค็ซWฏFฯž=๓mollŒŽ;โ๙๓Zำs‚ำงOัฝ{w”-[eห–EฃF๒์็ฺตkธy๓&\\\คi˜5kjืฎ SSS|๛ํทธpแ<==annސฉญFฃมฤ‰agg‡J•*aุฐaศศศฌ\นM›6ลภannŽ+Vเแร‡่ัฃฌญญQตjUฌZต*฿m|๑0้๖ํแไไ$ํฅ\ฟ~}พห?~5kึ„••F F#อ[ธp!jิจrๅส!88iiiศฮฮFถmq๙๒e˜˜˜ภฤฤซVญยš5k๐๗฿รฤฤDฺๆธธ84n–––๐๐๐@ddคิทBกภ‚ เ่่ˆฆM›7nŒ๛๗P!–จHQ)aoo/"""„ญญญธ{๗ฎธ{๗ฎฐตตG๖๖๖ZํŽ9"„"99Yt่ะALœ8QšŸ’’"*Vฌ(ฒณณลโล‹E‡ฤ“'ODVV–8|๘pž๋พ}ป๐๐๐ศUฏฏฏx๐เ8ผ000-[ถืฎ]ทn*TBฑt้Rแ์์,ฎ_ฟ.๎฿ฟ/|||คšVฌX!tttฤŠ+Dvvถx๒ไ‰๐๓๓ฃF้้้โ๙๓ขRฅJ"&&&฿qษู *ˆฃG !„ธu๋–8w๎\พหจีjq๋ึ-qใฦ แ์์,–/_.„โท฿~*•J$&&Š'Ožˆ๎ป‹QฃF !„8x๐ จVญšV_มมมโ๛๏ฟ—žงฆฆ ฑiำ&๑์ู3ฑeหagg'ž>}*„€ุ่ฑฃHNNOž<‘–333 yึK๔กโ9"*Uttt€ 6`ร† ่าฅ tttrตkถ-,,,`ii‰‹/bะ Aาผ๛๗รืืJฅzzzx๐เ._พ ]]|๗ศ%%%ๅynฐaรPถlYิชU nnnhำฆ ์์์PฑbE๘๚๚"&&ฐ~zŒ=ถถถฐฒฒยท฿~‹u๋ึITซV }๚๔RฉDrr2"""0mฺ4 VญZ่ัฃ6o\่๘่้้แ๙๓x๘1*Vฌgg็|>+V„ Fމ 6x~yธqฐทท‡‘‘ฦM›6บ๎ทoG:uคืฦ฿฿ึึึ8qโ„ิf์ุฑ033ƒ‘‘‘4อิิษษษE^ั‡€AŽˆJž={bํฺตXณfMพ‡Uw๎‰คค$}๗๏฿๐Bˆึญ[๔๕๕๑w฿แโล‹ุฝ{7ๆอ›‡ˆˆˆ\ธธธเ฿}ํšmllpํฺ5้๙ตkื`cc#=W(าฯ•+W†‰‰ =z„คค$$%%!55กกก…ฎง~๚ุฑc๎น777ญ=‘/ป~บึฯ9Tฎ\ซVญ’ึ””$])byีžณ|๋ึญs-฿ฃG|—น}๛6ž={†jีชบD9"*•6o\คCYYYXปv-ฌญญaee…„„˜™™Iกๅเมƒ8w๎4 ฬฬฬ ซซ›็กZ{{{TฌXqqqฏUoทn๐ใ?โฦx๘๐!พ{ๅูถrๅส๐๖๖ฦื_'Ožเูณg8sๆ โใใ \Gff&ึฎ]‹””่้้มฤฤ$ฯmษ1|นsทnยนsัตkW@ฟ~๐ร?Hม๕ึญ[ุตk€็{ ๏ปงu kkk$&&Jฯทoจจ(lบฯž=รำงOฑkืฎ›>|อš5ƒฎฎnH๔กa#ขRษููนภ๓ฟZตj”+Wฤึญ[กP(rvไึญ[๐๗๗‡™™ผผผ0pเภ|ฯ“๛๔ำOตฮk{Ÿ~๚):w๎Œz๕๊มููnnn7n\พํืฌYƒ๛UซV…ตต5FŒงOŸบžUซVม–––ุปw/,Xoฎ]ปขQฃFPฉThูฒ%๚๖ํ เ๙•มŸ~๚)ฺตk333๘๚๚J!ฒvํฺ่ิฉ์์์`aaเy๐;y๒$,,,0x๐`˜››cวŽ˜?>ฌญญแเเ€ฅK—X๗บu๋0`ภ€Bท่CฃBˆ’.‚ˆ่}ัฆMŒ;Mš4yๅeำาาเๅๅ…ฟ๛ฝป)ฐœ]บt ฝz๕ย_•็ก[ขƒั fฮœ‰‘#GBOOฏคK!"*ƒ‘L๑9""""™b#"""’)9""""™b#"""’)9""""™b#"""’)9""""™b#"""’)9""""™๚hCิฬํx7IENDฎB`‚c4core-bm-charconv-xtoa-mega_bytes_per_second-i64.png000066400000000000000000000767011477602032300330760ustar00rootroot00000000000000c4core-0.2.6/doc/img/windows-x86_64-vs2019-Release‰PNG  IHDRuญ lW9tEXtSoftwareMatplotlib version3.5.3, https://matplotlib.org/อ+นา pHYsaaจ?งi}.IDATxœํy\N๙?วUi_E’R%KซŠสR–l!&Kƒฦ:cฬ`Œ1cห๒LcCถuE…&2„๛า&ญื๋๗‡_็ใาข้xoท๋ฆsฮ๋ผฮ๓<;Wืำ๋,—B!@DDDDUšZe@DDDDๅวขŽˆˆˆHXิษ‹:""""`QGDDD$,๊ˆˆˆˆd€E‘ ฐจ#"""’uDDDD2ภขŽชดAƒA__ฟฒร(VTT ถmVูก”สฬ™3กP(๐๐แรส…ญ[ท†ฝฝ}e‡!; …3gฮฌ์0สdะ Aฐฑฑฉ์0ช4uT.U๎QE›;w.v๎Y๊๖+Vฌ@๏ฝQทn]( 4จศvEถššnบUhyZZttt P(0z๔่ืŒž^%333gฮDTTิ[฿๖ฉSง0sๆLคคคผ๕mW%ฏ๚,JOOว_|[[[hiiกN: Bfffฑ๋ : …]บt)s<7nฤโล‹หผ^yฑจฃr‰ˆˆภฌYณ*; ขJUึข๎ป๏พรแร‡ัดiShhhผฒฝ––6mฺTh๖ํห&ฝฆฬฬLฬš5ซาŠบYณf•นจ{๖์พ๒ห7ิฒz๕j\พ|๙ตึ-้ณ(55๘๙็Ÿัทo_ฌXฑŸ9ฒฒฒ]ไ:ัััXทnดตต_+žส*๊^ื„ˆd๏้ำงะำำซ์0ช!ฒฒฒ ฃฃSๆu=*า•ๆ๒€€lฺด _|๑…ส7ขs็ฮ๘฿Wๆ'Jฅ999ฏ]UผธŸUq_ซUซ๖F๚:u*nธs็ฮมึึVš?y๒ไ" !๐๙็Ÿใฃ>ยกC‡HLo G๊จgฯžกQฃFhิจž={&อ๘1jืฎ ///ไ็็cะ AXถl€็ืoผ <}๚&L€••ดดด`gg‡… Bกฒฝตkืขmถ033ƒ––š4i‚+V”)ๆkืฎกC‡ะำำƒ……พ๙ๆ›BQ*•Xผx1š6m mmmิชU ร† ร“'OTฺูุุ K—.8qโ<<< ญญ>๘ฟ๒Kกํฆคค`ธqฐฑฑ––,--๑ัGบ&MฉTbฮœ9ฐดด„ถถ6ฺตk‡ซWฏชด)ธถ(>>พพพะีีE๚๕ฅ๋๑Ž=Šๆอ›CGGvvvˆŒŒTYฦ9r$์์์ ฃฃSSS๔๎ษษษ*ํึญ[…BฃGbไศ‘033ƒฅฅeฑนฝqใ๊ืฏ{{{ปwภ๓‘‹ฤฤฤR_{wๆฬภฤฤzzzpttฤ?จาๆ๐แร๐๖๖†žžŒัฝ{w๗฿*m NG^ฝzƒ ‚ฑฑ1ŒŒŒ0x๐`•ำ(๖๖๖hำฆMก8”Jฅtฺๅลye9.๖๏฿777่่่`ๅส•P(x๚๔)ึฏ_/ฝŠ;ZภฺฺZๅฝ๒*๚๕Cll,ฅyw๏ลแร‡ัฏ_ฟR๗Spšv็ฮฐทท‡––š6mŠ}๛๖ฉด+๎ฺฆ‚ี็ึญ[ัคI่่่ภำำ.\ฌ\น๕๋ื‡ถถ6Zทn]่x,///่่่ภึึaaa…ฺdggcฦŒจ_ฟ>ดดด`ee…/พ๘ขะhKAL6l@ำฆMกฅฅ%ํใๆอ›แ๊๊ ยมมกะฑ๘ขไไdิฌY0kึ,้wโฉพาปลYฒd š6m ]]]˜˜˜ภออ 7n๐<฿“&MฺฺุJ.ศaI๛๙rŒฅ}๏ฯ?>sิจQ่ึญ๛๏ฟB}ฆงงc์ุฑา฿?333๘๛๛ในsR›ฒญx๙ธKNN†Bกภย… ฑjี*ิซWZZZpwwวูณgUึ+๎ณ(%%kืฎลงŸ~ [[[ไไไ;:W <</^ฤœ9s^sQZทn={๖เฦR,oํZAAT„ำงO uuu1n8i^ppฐะัั—/_Bq๊ิ)แ๏๏/ˆ๐๐p้%„JฅRดmV( 1dศฑt้RัตkW@Œ;Ve[๎๎๎bะ Aโ‡~K–,ํทฤาฅK_็ภ…ถถถhะ  K—.]บtฤW_}ฅาvศ!BCCC :T„……‰ษ“' ===แ๎๎.rrrคvึึึยฮฮNิชUKL›6M,]บT4kึL( q๑โEฉ]zzบฐทท๊๊๊b่ะกbลŠโoฟ๎๎๎โ๙๓B!Ž9"แ๊๊*~๘แ1sๆLกซซ+<<๘เกซซ+>|(ต8p ฐถถ.6ž—๛tttVVVbผybผyยศศHิญ[W,]บT4iาD|๗โห/ฟšššขM›6*๋๗fffb๔่ัโงŸ~ญZตฤ๛Oj—ŸŸ/ฺทo/tuuลุฑcลส•+ล่ัฃ…†††่ฝ{ก˜7n,jึฌ)fอš%–-[&ฮŸ?/8 ˆvํฺ‰eห–‰eห–‰ัฃG‹ฝ{›ณŒŒ ฑbล @๔่ัC๚วลล !J์eีชU€ +Wฎ?๘ฃ๘ไ“Oฤ็Ÿ.„"..N๔ํW?๐ƒดํŒŒŒ๗ณ`ู‹๏ฯาพw„ขOŸ>€ ห–-}๚๔NNN…๚์ืฏŸะิิใวkึฌ฿}๗ฺ่ตซ๘๕ื_ฅ6e๙[๑๒qw๚u)ๆ๚๕๋‹๏พ๛NฬŸ?_ิจQCXZZJ๏ฯ’>‹๘ใ@ฌZตJ๔๊ีKจซซ …B!ผผผค\ฝ(--M˜››‹ะะP!ฤ๓๗}็ฮ_๛‹8 œE5คXv์ุQฆ>^‹:*ึิฉS…ššš8v์˜ุบuซ /^ฌาfิจQ…ศ !ฤฮ;1{๖l•๙AAABกPˆซWฏJ๓233 ญ฿กC๑มผ2ฦ โณฯ>“ๆ)•Jันsgกฉฉ)"วฤ† Tึ฿ทo_ก๙ึึึ€8v์˜4๏๛BKKKL˜0Aš๗๕ื_ b๛๖ํ…โR*•Bˆ๛ƒึธqc‘--๑วqแยižฏฏฏ 6n(อKLL„ššš8}๚ด4€Xปvญ4ฏจ<๙็Ÿ€๘ๅ—_คyE]ซVญD^^žJ๛‹บฟ[XXXwww๑๘๑c•vฅC——'lmm…ตตตx๒ไI‘9Bgggaff&=z$อ‹‹‹jjjโฃ>*฿วฌาW=„ฉฉฉ4}๙๒e@,YฒDฅศ‘#…พพพ”ซื9.๖ํWh?K*ฬ^ฅ4Eƒฤฤ‰E๚๕ฅe๎๎๎b๐เมBQฆขNSSSๅW(We-๊ดดดT ˜•+W ย\ๅ?SงNTฺ๗฿ฝ4/;;[:& >ธรรร…ššš8~ธส๖รยยq๒ไI•˜ิิิฤฅK—TฺŽ3F:๎_ๅมƒล๏ฅ=v‹าฝ{wัดiำ,Xฐ Pฮ ทŸหŠ*๊^๕‰‰‰)๒?฿ƒ *ิง‘‘ั+ปŠ(๊LMMU๛๏€๘ใ?คyล}-ZดH๊รรรClุฐA,_พ\ิชUK˜˜˜ˆทoซดŸ8qขฐตตYYYBˆื+๊„ขs็ฮEพ‡4ž~ฅbอœ9M›6ลภ1rไH๘๚๚โ๓ฯ?/ีบPWW/ิ~ย„ B`๏ฝาผฏIJMMลร‡แ๋๋‹kืฎ!55ตT{๑ฮฟ‚S999า)สญ[ทยศศx๘๐ก๔ruu…พพ>Ž9ขา_“&Mเํํ-MืฌYvvvธvํš4๏๛œœœะฃGB๑ผ|Šj๐เมะิิ”ฆ ๚~ฑ?ะืืGppฐ4mggccc4nอ›7—ๆโ๚/ๆ177=B๚๕allฌr:คภะกCกฎฎ^h>\ผxพพพฐฑฑAdd$LLLT–ทnBˆW๙|y\ฟ~cวŽ…ฑฑฑสฒ‚นsฑฑฑ4hชWฏ.-wtt„ฟฟ?""" ๕;|๘p•iooo๛์ณB}ใฬ™3ธ}๛vฑ+ํ฿Š’|๘แ‡*ƒŠ๛๛Y”ŒŒ ฯ:t๚๕รˆ#ฐs็NฤำงOUๆ—&Ÿ~๘!Nž<‰๛ภ๓gฟ~๘กิฆฌวEI9{ำ\\\ะจQ#lธ6l€นนนTะ”EiŽํ๒๖Yp|–ๆธ ‹B7๊๕พt้Rก฿SAปาฎFމ† ขSงNฐดดฤว\่zยฒxc๗E“'O†พพ><<<ะ AŒ5 'Ož,S e=&_๕นqใิิิ ๕[ฟ~B}อŸ?/^„••<<<0sๆฬr็เuc.IมเบvํชrSR‹-`kk‹SงNI๓ฦŒ///๔๊ีซ"ยฎผ๛•Jด~@VV’’’*CํŸAปvํะจQ#,ZดVVVะิิDDD~๘แ(•ส ูŽRฉ„™™6lุPไ๒‚ ก 7‚%^บ๙ขดJ_qํJณgŸ}†ตkืb์ุฑ๐๔๔„‘‘ ‚ƒƒ‹ฬcIwm๖๊ี ๋ืฏว† TFPฅษว‡~ˆฉSงb๋ึญ;v,~๛ํ7กcวŽR›ฒฏsงkE๊ืฏVฌX|๘แ‡PS+๛หK“ปโ๓–ŸŸ_ฆ>+๒}คT*แเเ€E‹นๅฒจ฿•™™bccฑ~์ป{๗๎ลฺตk๑ัGa๚๕eŽฉผ7nŒห—/c๗๎ุทo๗ฟa๙๒ๅ๘๚๋ฏKจจฒ“๙;้ำงผฝฝฑcว8p ,ภw฿}‡ํทฃSงNe๎ฏ8ๅ‰ูยยPซVญBหฬฬฬคย๐๐แรุทoถo฿ฎr3O^^ž={†ไไdTฏ^ฝ\ษ}XิQฑโใใ๑อ7฿`๐เมˆล!Cpแย้@๑ญญญ‰๔๔t•ับ‚ป๗ฌญญ๑ฒณณฑkื.•ฝ|*ฅ$Jฅืฎ]“ว<F ชWฏ"##ัฒeห ๛`ฎWฏ.^ผX!}U„mถaเภ๘๛๏ฅyYYYฏ๕ะา @CC#GŽ„มkๆ ๆปx๑"ŠlSp,๕|ชฤฤDิจQใตทbkk lูฒฃGฦ๖ํจrZฅขŽ‹ฒษZ๚๕รื_;w๎ <<mวฤฤคศใๆล๖Št๛๖ํBี)๊=‡vํฺ•+฿šššฺ่ต+บvํ ฅR‰‘#Gbๅส•๘๊ซฏŠJ;”๏ุีำำร‡~ˆ?999ู่ณ'ๆฬ™ƒฉSงB[[๛ญ[ฌญญกT*q๚u4hะ@š๒๚jืฎ‘#Gbไศ‘ธ>š5k†9sๆThQWลๅษีีค๛พ}5ผyะณgฯBํ๛๏?ฺฺุโ‡~ภุฑcหฯ›ฦำฏTค\ 4๘๑วฑn:ปwใฦSiW๐๋ๅ€€€ไ็็c้าฅ*๓๘แ( ้ _๐?ฐว•ššŠตkื–)ท#„ภาฅKQญZ5ดkืภ๓Qๆ็็ใoฟ-ดn^^k>ฝz๕B\\v์ุQhู๋Ž่•‡บบzกํ.Yฒคุั•’( ฌZต AAA8p vํฺฅฒผด)hึฌlmmฑx๑โB9.ˆตvํฺpvvฦ๚๕๋Uฺ\ผx@@@@™ใ/๐แ‡โ๔้ำ๘๙็Ÿ๑๐แC•Sฏ@ลzzzoๅ‰๕๊ีรโล‹ 7บิิTฤววK๓๎นSไฑ^๒๒๒ฐrๅJi:''+WฎDอš5ฅๅ>}๚เฟร๊ีซ ญ์ูณOsx๔่‘สดšš ฤว\่๊๊(wฎผว๎ห๑hjjขI“&B 77@๑c฿”‚kF—/_ฎ2ษ’%*ำ๙๙๙….๋033ƒ………J.ห๚๘ฃืU\ž์์์เไไ„฿]%†เึญ[๐๗๗ดm;v์(๔ชYณ&ฐcวtํฺตL๑”๖š๐Šฤ‘:*า์ูณ‹C‡มภภŽŽŽ๘๚๋ฏ๑ๅ—_"((H๚cU๐๗๓ฯ?G‡ ฎฎŽเเ`tํฺmฺดม๔้ำ‘œœ '''8pฟ;ฦŽ+เดo฿^๚Ÿ๓ฐaร‘‘ีซWรฬฬ w๎)Uฌฺฺฺุทoˆๆอ›c๏ฝุณgฆM›&>๓๕๕ลฐaรŠุุXดo฿ีชUCRRถnŠQๅูeฅ1iา$lถ ฝ{๗ฦว WWW<~ปvํBXXœœœสิ_yu้าแแแ022B“&M๐็Ÿ"22ฆฆฆฏีŸšš~๕WขOŸ>ˆˆˆฎแ๚๋ฏฟะฆMฬ˜1ฃฤ  ีิิฐbล tํฺฮฮฮ˜8q"&Nœˆ๊ีซ-ฌจใยีี‘‘‘Xดh,,,`kkซrcหห๘ใฤลลxจ๘๘xฬž=ะญ[7ฉะ(ส˜1cJณ๋ๅŒษ“'ฃG๘๓ฯ‘™™‰+V aร†EtS^๘๎ป๏œœŒ† bห–-ˆลชUซคา†„„เท฿~ร๐แรqไศดlู๙๙๙HLLฤoฟ&=?ฐ$C† มใวัถm[XZZโฦXฒd œฅ๋}‹ขฃฃƒ&Mš`ห–-hุฐ!ชWฏ{{{ุ—ุ๋m฿พ=ฬออัฒeKิชU 7–.]Šฮ;Kg8 ฦNŸ>มมมจVญบvํ๚ฦ๎๊๊Š^ฝza๑โลx๔่ZดhฃGJ#ง#P้้้ฐดดDPPœœœ ฏฏศศHœ={VๅlAiVTD@แฯ"เ๙`‚ฟฟ?Zตj…aร†!55‹-Bร† 1bฤฯฏ+๊zำฑcวขVญZ ,s<[ถlม๘๑ใแ๎๎}}2…ฏํญ฿oK๏ผ˜˜กกกก๒˜!ž?žย]XXXHงศหหŸ}๖™จYณฆP(*ท”งงง‹qใฦ QญZ5ั Aฑ`ม•GY!ฤฎ]ป„ฃฃฃะึึ666โป๏พ?sฑท๑ฟhเภBOOO๓ฯ?า3ฌjีช%fฬ˜!๒๓๓ ต_ตj•puu:::ยภภ@888ˆ/พ๘Bๅถ๖โna๗๕๕พพพ*๓=z$F-๊ิฉ#455…ฅฅฅ8p ๔ฬฏ‚๙_|.šwซ‹$๑๕๕-๒๑ลลƒ—c๑ไษ1x๐`QฃF กฏฏ/:t่ …ตตตส#3 ir๖์ูB}พœ:!ž?*ลืืW่๋๋KU)หc „โฤ‰ย฿฿_===แ่่X่q#‘‘‘ขeห–BGGGŠฎ]ปŠ„„„Wฦ๗โ>uผดlูRC† )6พ๒B<๔Œะัั^๙x“‚G๑๕z๑˜(n_๖๒ฑPึv/#B<ึ–ฝฝฝะิิvvvโื_-๖‘&/๗Yp|/Xฐ@e~Q๏‡‚ใ>::Zxzz mmmamm]ไs*srrฤw฿}'š6m*ดดด„‰‰‰puuณfอฉฉฉฏฯmถ‰๖ํ 333กฉฉ)๊ึญ+† V่y†E9u๊”puuššš…ŽาปEYนrฅ๐๑๑ฆฆฆBKKKิซWOLš4Ie_„โoฟu๊ิjjj*วyIฟ๗—c,ห{็้ำงbิจQขz๕๊B___J *xฆevvถ˜4i’prr’ืNNNb๙๒ๅ*Wฤ#M^>ŽŠฺฟ’>‹„x<ม-ZmmmQฝzuRช฿๛๋>า$##C๔๋ืO oํ๑& !*แ<UฑฑฑpqqมฏฟŠ๛Wv8T ^SGDDD’ฟฒภโล‹กฆฆŸJˆˆJ‹ืิ‘d๙ˆ‰‰A›6m กก!=ๅำO?-๔่˜๗อใว‘““S์ruu๕BBz›x๚•ˆˆˆ$ฤฌYณ€ŒŒ ิญ[!!!˜>}:44๏ฑ ึญ[ใ่ัฃล.ทถถVyฮฦขŽˆˆˆจbbbJ& ดlู๒-FคŠE‘ ๐F """"`QGDT‚[ทnA[[ปฬ_ด.‹ŠŠ‚Bก@TTTน๛jบ5์ํํหิ; E‹๘โ‹/*; ขืฦขŽˆธu๋ึAกP@กPเฤ‰…– !`ee…B.]บจ,+Xฏเฅงง‡&Mš`๖์ูศฬฬ,r{.\€Bกภ_U๎ุฟ๙ๆ4oผRฏ“y฿ฬ;;w๎,4ิฉS˜9sๆ๛สฌษ“'cูฒeธ{๗๎้Ÿ่McQGDoถถ66nXhัฃG๑๏ฟBKKซศ๕Ž๐๐p|๗pqqมW_}…ู~ฯž=033ƒปป{นโ}๐เึฏ_แร‡—ซŸwž={๖ฮ>sฌคขnึฌYoฌจ๋ฝ; }๏)QU๑~฿›LDoU@@ถnŠŸ~๚Iๅั7n„ซซkฑ_๚ฐaC 0@š>|8rrrฐ}๛vdeeA[[[ฅ}DD:u๊$}Oๅ๋๚๕ื_กกก๑vพณฑ”ž>}Z๎๏TSS+”ณ๗Yff&tuuกฆฆ†   ๒ห/˜5kVนขท#uD๔ึ๔ํ=ยมƒฅy999ุถm๚๕๋WฆพฬออกP( =7+%%งNB็ฮฅy›7o†ซซ+ `hh๘ใฏฦฮ;ัผys่๋๋ซฬ/ธŽ,>>พพพะีีE๚๕ฑm6ฯG›7oุูู!22ฒP฿็ฯŸGงN`hh}}}ดkืงOŸViSpฺ๚่ัฃ9r$ฬฬฬ`ii)-฿ปw/ผฝฝกงงt๎—.]zๅ~uM]RRz๕๊ssshkkราามมมHMM}eภ๓G=xyyAGGถถถ +ิ&;;3fฬ@๚๕กฅฅ+++|๑ลศฮฮ–ฺ( <}๚๋ืฏ—Nน43gฮฤคI“ถถถาฒŸ ๖๋ฏฟยีี:::จ^ฝ:‚ƒƒq๋ึ-• ~w111๐๑๑ฎฎ.ฆM›&-๗๗๗ว7[ช&z—ฐจ#ขทฦฦฦžžžุดi“4o๏ฝHMMEpppฑ๋eeeแแร‡x๘๐!nธ7b๚๕่ืฏ_กขnP(h฿พ=€็Rํท/LLL๐w฿aผyhบ๕+o|ศออลูณgัฌYณ"—?y๒]บtA๓ๆอ1|hii!88[ถlApp00o<<}๚AAAHOO—ึฝt้ผฝฝ‡/พ๘_}๕ฎ_ฟŽึญ[ใฬ™3…ถ5rไH$$$เ๋ฏฟฦ”)Sแแแ่น3๔๕๕๑w฿แซฏพBBBZตjUๆ‡Ÿๆไไ C‡8}๚4>๛์3,[ถ Ÿ~๚)ฎ]ปVชSOžฺีฎ]๚๕ร‰'––ฆฒญกC‡B]]]š>x๐ RRRะทo_i๓แร‡PWWG๓ๆอqไศ‘2ํซ‘‘€็ฃœลQ\ 6Lšึิิฤฐaรp}ฤฤฤถnŠฦฃQฃF*1ทmส๓‹ถo฿ฅR‰>}๚จ๔mnnŽ ๊[KK ƒ.ถ?“bฏ๏$z—๑F "zซjึฌ ???lธ™™™ศฯฯGPPP‰๋XZZยฯฯOš๎ึญLMM1qโD์ฝ[บ‘แ์ูณx๐เJQ7rไH๖o่ิฉ๊ิฉƒ๖ํฃOŸ>ุ่ฑcฉโล|้Žฅฅeก ้ŒŒ }แyAมT๐ีB<@ff&์์์ ๕ูธqc(•Jบu M›6•ๆฺฺชดKJJฉ z™กกaIปTˆญญ-ฦE‹aร† ๐๖๖Fทn0`ภ)’XXXบyฃaร†€ไไdดhัIII๘๛๏ฟ‹ฒ๓๛๗๏—)ๆ%%%A นผZตj*ำu๊ิฆฆfฑ !x“UI,๊ˆ่ญ๋ืฏ†Šปw๏ขSงN066.sํฺต;vL*๊"""`ccƒ&MšHํฬฬฬ‹๛๗c๏ฝุปw/ึฎ]‹>๚๋ืฏ/ถSSS(๖{_9+อโŠราะััQ™V*•ž_fnn^จ๋|้๚๗฿Aƒแ๗฿ว๐๙็Ÿ#44งOŸVน9ใu)•J888`ัขEE.น.k฿ …{๗๎-2/฿่๒r>_–’’‚5jผv}:‚ƒƒQญZ5tํฺ๕๊ีร์ูณ1u๊T$''#00ธ~:v์ุO?'N,U.<ˆบu๋ยลลฅิ๙#zgTทD๔พx๑‘&%)อ#Mิีี…ฅฅฅ๘๔ำOลฝ{๗คvAAA"  PŸถmํทfffBSSSิญ[W 6Lนs็•q฿ปwOhhhˆ๐๐p•๙พพพขiำฆฅŠฟ`Fฅ2๏นsขC‡B___่๊๊Š6mฺˆSงNฉดyUŽ9":t่ ŒŒŒ„ถถถจWฏž4hˆŽŽ.qฟ^~คษตkืฤว,๊ีซ'ดตตE๕๊ีE›6mDddd‰๑นˆŽŽžžžB[[[X[[‹ฅK—j›““#พ๛๎;ัดiSกฅฅ%LLL„ซซซ˜5k–HMM•ฺ%&& กฃฃ#จ<ไoฟu๊ิjjj…o๒ฟOดjีJ่้้ ===ัจQ#1jิ(q๙๒ๅB๑%??_ิฎ][|๙ๅ—ฏoขw‘Bˆr\ฝKD๔ศหหƒฉฉ)BCC1rไศ ํ๛“O>ม•+Wp๘๑ ํ—=;w๎Dฟ~๐ฯ? vํฺ•Q™ฑจ#ข*๏๛Xพ|9† Vแฦ7oDร† q่ะ!ดlูฒB๛ฆw‹งง'ผฝฝKu œ่]ฤขŽˆˆˆHx๗+‘ ฐจ#"""’uDDDD2ภขŽˆˆˆH๘๐a™S*•ธ}๛6 ๘ีDDDU„้้้ฐฐฐ€šZ้ฦเXิษํทห๕EูDDDTynบKKหRตeQ's€๋ืฏฃz๕๊•Mี“››‹ }๛๖าืQ้1ๅร•sX>ฬ_๙”'iiiฐฒฒ’>วKƒEฬœr500จะ๏ฎ|_ไๆๆBWW†††ƒ๖˜ฟ๒aส9,ๆฏ|*"eนtŠ7Jษ‹:""""`QGDDD$,๊ˆˆˆˆd€E‘ ฐจ#"""’uDDDD2ภขŽˆˆˆHXิษ‹:""""`QGDDD$,๊ˆˆˆˆd€E‘ ฐจ#"""’ส€Ž‹OBฉฉ_ูaT9šjSํ๏๙วฃTTv8U๓W>ฬ_๙1‡ๅร•์Wm+;ฉ#"""’uDDDD2ภขŽˆˆˆHXิษ‹:""""`QGDDD$,๊ˆˆˆˆd€E‘ ฐจ#"""’uDDDD2ภขŽˆˆˆHXิษ‹:""""xฃE]PPZดhQแ๎ฺต ?๔`็ฮธz๕jน๛ FTTTน๛yY@@rrrWฏ^…š6m •v™™™ฐถถฦ”)S*<"""’?7ี๑มƒกฎฎ^แๆ็็ฃ[ทnา๔ฮ;กญญ๚๕๋W๘ถ^Wnn.rrr งง‡ˆˆiเมƒ๑๗฿รรร๗๏฿WYgฮœ9… เ'OžภฤฤไญฤLDDDU[…Œิญ^ฝprrยŒ3››‹นs็โห/ฟ,ี๚C‡ล‘#GNNN๘แ‡ฤฉSงฐn:มืื!!!XทnฆL™‚3gฮ`ืฎ]5jœ‘žžŽฟ๚ hึฌz๗๎ฬฬฬbท๛ีW_มฮฮํทวฃGค๙{๖์A‹-เ์์Œแร‡CฉTนŸ/KNNฦดiำะจQ#\นr`ccƒฌฌ,\ผx๚๚๚๐๐๐˜™™I๋%%%!11:uR้/00AAAˆŒŒ„ขTนฬฮฮFZZšส‹ˆˆˆไฏE]||<–-[†“'O"..cฦŒมขE‹0pเ@จด CXX ::C† ดlูงNBZZ455q๊ิ)@LL \]]ฅํ์ฝ7n”๚kผ9บu๋†eห–!66ZZZ˜4ivํฺ…s็ฮมรรห—//2๎ฟ๚ ฤล‹ฑvํZœ>}๐๐แC,^ผQQQˆ…บบ:ถo฿^ไ~ฯGwํฺ…€€๔์ูu๊ิมนs็ ^MJJ‚ŽŽ:w๎Œfอša้าฅาฒ‰'"44ดPŒQQQ6lVฎ\ {{{,\ธ>,๑๗ ###้eeeUb{"""’‡rŸ~ŠŠBpp0 ฯž=ร‰7nจด>|ธ๔ณ››ึฌYเyQ7fฬธนน!00๛๗๏วฝ{๗`ll ---@วŽ ‰/ป|๙2โใใัฆM@NNฺตkWdSงNกgฯžจVญ๊ิฉoooภŸ‰๘๘x้T่ณgฯ`mmทoซ์g๕๊ี<Mปt้~๙ๅดjีชุุ๒๓๓qโฤ ฤลลมภภพพพ๐๖๖Frr26lˆ† Jลl…B๘๛๛ใมƒ7n,--qํฺ5XXXนฉSงb๘๑าtZZ ;""ข๗@…_S‹„„ฺฺุ"//<@ทnฐkืฎbืiะ ฎ^ฝŠใวร฿฿III‡———ิFWW๗•Bภ(Uฌ …ขะฯBt๏ซVญRi[pcฦหBCCฑ|๙r|๑ว่ัฃ† ‚ jgaaิฎ]เ็็‡๘๘x$$$`๓ๆอุบu+222›› CCCL›6 ‘‘-[ถ`อš5ะำำCxx8jีชU์>iiiI…0ฝ?ส}๚ตmถุผyณtํ–งง'๎นƒไไdœ8q...%tš4i‚7ยรร-[ถฤโล‹ัฒeหWฎg``€๔๔t@ฃFp๚u\ธp๐๔้ำb๏Œ๕๒๒ยŽ;››‹ทoใ๘๑ใ€-ZเะกC๘๗฿=ยฟ[h??~ ฐททว๒ๅหqy4hะ๚๕C›6mœœฌฒ=พ}iiiศหหรษ“'agg‡ะะPบu ษษษXธp!FŒ!t'N„ฃฃ#ŽศศH๔๎๛€BDDDU[น‹:{{{Œ=^^^prr*vD (š:เ๙)ุš5kBGG-[ถฤง2RWœเเ`ฬ˜1ฮฮฮศฮฮฦฦ1|๘p899มำำณุขฮรรํฺตƒฝฝ=,n533รฒeหะฝ{w8::ข}๛๖ธ+๗SOOC† มูณgฑpแBhhจ‚jhh`ึฌY๐๒๒‚ณณ3ฅ›&Šใ็็‡ฤฤD,Xฐเบป—ˆˆˆ= Qฺ*ฉJJKKƒ‘‘\ฟJMสงสัT˜jŸะ‹๚ศQ*^ฝฉ`ส‡๙+?ๆฐ|˜ฟ’๛ชm‰หsss€€TซVญL}|~งฆฆJื๓ฟ ฟQ‚ˆˆˆHุร‡฿%อ›7Gvvถสผฟ๚ ššš•Qลz/Šบ3gฮTvDDDDoOฟษ‹:""""`QGDDD$,๊ˆˆˆˆd€E‘ ฐจ#"""’uDDDD2ภขŽˆˆˆH‹‡ฐlK˜ššVvUNม๗๖ยงฬ฿Gฬ_y1ๅว–๓WตpคŽˆˆˆHXิษ‹:""""เ5u๏‰้๛’ ก{ฟฒรจrิ‘ถjภฤ—‘๕สงสaส‡๙+?ๆฐ|็-ํัธฒC(3Žิษ‹:""""`QGDDD$,๊ˆˆˆˆd€E‘ ฐจ#"""’uDDDD2ภขŽˆˆˆHXิษ‹:""""`QGDDD$,๊ˆˆˆˆd@VE]PPZดh๑สvััั˜2e ** ัััo,ฆ€€ไไไฎ^ฝ 4mฺ...*ํ233amm-ลEDDDT•@E9x๐ ิีีKีึออ nnnžuๆๆๆาtEศออENN๔๔๔!อ}:bccagg‡มƒcๅส•ธpแ?~ŒM›6ฦŒƒณgฯ">>๑๑๑ˆ‹‹ไ็็cืฎ]@ฯž=QงNœ;wฎะ้ีคค$่่่ s็ฮhึฌ–.]*-›8q"BCC ํkTT† †•+Wย .ฤร‡KฬOvv6าาาT^DDD$U๎๔kม(›กก!เูณg8pเ"##qใฦ •ถร‡—~vssรš5kJ์;%%Jฅฎฎฎ€๛c๏ฝ0`:„๙๓็#;;๗๎CBBœœœˆK—.แ—_~AซVญŠํ;??'Nœ@\\ เ๋๋ ooo$''ฃaร†hุฐ!N:ฅฒŽBก€ฟฟ?๑เมŒ7–––ธvํ,,,ŠNhh(fอšUโ~‘Tนข๎eฑฑฑHHH€ญญ-๒๒๒๐เมt๋ึ ปvํชฐmdeea๘๑ˆ‰‰™™F์์lฯ‹จๅห—ใใ?F=0dศ4hะ P๐๐๐@ํฺต~~~ˆGBB6oŒญ[ท"##นนน044”N๑fdd`ห–-Xณf ๔๔๔ŽZตj๋ิฉS1~xi:-- VVV– """z7Uนำฏmถลๆอ›ฅำŠžžžธs็’““qโฤ ธธธ”ฉ 300@zz:ภุุ๊๊๊าฉีM›6กUซVศสส‚ššLLL๐๘๑c๑วา๚๖๖๖Xพ|9ฮŸ?  _ฟ~hำฆ ’““Uถใแแทo#-- yyy8y๒$์์์Š[ทn!99 .ฤˆ#ค‚nโฤ‰pttDbb"ยรร‰ฝ{—xCˆ–– U^DDD$Uฎจณททว่ัฃแๅๅ'''๔ำOลถ}ี5uะตkW„‡‡รลล—/_ฦฯ?ŒO>๙022Bpp0Œัทo_4n={๖„งงgก~๔๔๔0dศœ={ .„††๊ จ††fอš///8;;ร฿฿_บiข8~~~HLLฤ‚ Pฟ~าค‡ˆˆˆS ม*e--- FFF๖๋Ÿะะ5ช์pชuไฃญฺ?8ฌฌ‡|”๎‘9๔˜ฟ๒aส9,Ÿ๗9K{4.wนนนˆˆˆ@@@ชUซVฆu >ฟSSSK}ึญสิQa,๊ˆˆˆˆd€E‘ ฐจ#"""’uDDDD2ภขŽˆˆˆHXิษ‹:""""`QGDDD$,๊ˆˆˆˆd€E‘ ฐจ#"""’ส€Ž9ภิิดฒรจrž๓?Xุลฎฬ_ฦLฬ_y1ๅว–๓WตpคŽˆˆˆHXิษOฟพ'ถฤƒง•FีฃฬGuฟž๛PSฏ์hชๆฏ|˜ฟ๒cห็-ไoฐ{7า๏๛ˆ#uDDDD2ภขŽˆˆˆHXิษ‹:""""`QGDDD$,๊ˆˆˆˆd€E‘ ฐจ#"""’uDDDD2ภขŽˆˆˆHXิษ‹:""""`QGDDD$ฒ(๊‚‚‚ะขE‹ื^?** ััั‘ช€€ไไไฎ^ฝ 4mฺ...*ํ233amm)SฆผฑXˆˆˆHžช|Qw๐เAจซซ—ซ7Qิๅๆๆโ้ำง€ˆˆhjjŒ… โาฅKุฟฟส:sๆฬ)Tœ>y๒คBใ""""yชRE๊ีซแเเ'''ฬ˜1นนน˜;w.พ๒หRญฟy๓fbbbเ๎๎Ž[ทn!,, sๆฬณณ3._พŒณgฯยออ 1b๒๓๓3fฬ€ปป;์ํํ1mฺด"ท‘œœŒiำฆกQฃFธrๅ ภฦฦYYYธx๑"๔๕๕แแแ033“ึKJJBbb":u๊คา_`` ‚‚‚ !ฤ+๗1;;iii*/"""’ฟ*Sิลววcูฒe8y๒$โโโ0fฬ,Zด„Jฐฐ0„……ขฃฃ1dศ@pp0rssฑiำ& 6 ซVญ‚••†Ž้ำง#66vvvvํฺ…€€๔์ูu๊ิมนs็ ^MJJ‚ŽŽ:w๎Œfอša้าฅาฒ‰'"44ดะ~GEEaุฐaXนr%์ํํฑpแB<|๘ฐุ<…††ยศศHzYYYฝFถ‰ˆˆจชัจ์J+** มมม044<{๖ @dd$nธกาv๘๐แาฯnnnXณf4†&Mš`ฤˆ…Š.HIIRฉ„ซซ+ ุปw/ €C‡a๙ศฮฮฦฝ{๗'''โาฅK๘ๅ—_ะชUซb๗!??'Nœ@\\ เ๋๋ ooo$''ฃaร†hุฐ!N:ฅฒŽBก€ฟฟ?๑เมŒ7–––ธvํ,,, mc๊ิฉ?~ผ4––ฦยŽˆˆ่=PeŠบ—ลฦฦ"!!ถถถศหหรƒะญ[7์ฺตซฤ๕’““กฅฅ…;w๎”i{YYY?~๙022Bpp0Œัทo_4n={๖„งงgกํ๊้้aศ!8{๖,.\ ีP ฬš5 ^^^pvv†ฟฟฟtำDq˜˜ˆ  ~๚eMฝ'ข4ทTR••––###,;ใสง๊Qๆฃ๚x<6wิ8:Zfฬ_๙0ๅว–ฯ[ศ฿`๗บoค฿wAnn."""€jีช•i‚ฯ๏ิิT้~‚Wฉ2#uDDDDT<uDDDD2ภขŽˆˆˆHXิษ‹:""""`QGDDD$,๊ˆˆˆˆd€E‘ ฐจ#"""’uDDDD2ภขŽˆˆˆH4^„ไเCง:055ญ์0ชœ็฿อ,หฝ}ฤ•๓W~ฬa๙0U G๊ˆˆˆˆd€E‘ ฐจ#"""’^S๗žˆINƒม๕สฃสQๆ็บ– 5uพ]สŠ๙+ๆฏ˜ร๒yŸ๓็Y฿ธฒC(3Žิษ‹:""""`QGDDD$,๊ˆˆˆˆd€E‘ ฐจ#"""’uDDDD2ภขŽˆˆˆHXิษ‹:""""`QGDDD$,๊ˆˆˆˆd€E‘ TJQ„-Zผฒ]rr2ถmVa9s&ยยย*ฌฟาุตk~๚้'i:44vvvhธ1ึญ[งาv้าฅP(ศสสzซ1Qีง๑ถ7x๐เAจซซ—ชmAQ๔†ฃzตRว Ož<‰‰ บu๋&อฟ?ฮž=‹„„จฉฉแแร‡าฒ`ฯž=จ[ทฎ4/55†††P(ณDDD$[otคn๕๊ีppp€““fฬ˜\ฬ;_~๙eฉึŸ>}:๖๏฿ggglุฐ<@งNเเเ€:เฝ{ลฎ›˜˜___899กy๓ๆศฮฮฤฤฤ UซVจWฏ8๘็ŸะชU+4kึ žžž๘๛๏ฟ๋ึญCPP|}}‚#GŽภมมฮฮฮhูฒeกmๆๅๅa๛๖ํh฿พ=F-๕1eส)“'O†บบ: jึฌ)ญ;u๊Tฬš5Kฅ€;~87nŒy๓ๆแ๛ฅสYvv6าาาT^DDD$oฌจ‹วฒeหp๒ไIฤลลaฬ˜1Xดh•ถaaaาiั่่h 20gฮt่ะฑฑฑ่฿ฟ?fฬ˜\ธpปwว๔้ำ‹~HHfฮœ‰ธธ88pีชUธqGลoฟ†YณfjืฎC‡แนs๘๑ว1mฺ4•ุฝ{76nˆE‹แงŸ~Bll,"""ค6ทnยื_&Mš`๗๎๘ๆ›oฐaร†B1%%%!""๎๎๎่าฅ nบ8}๚4”J%<<เๆๆ†5kึู็ฉSง0`ภภ€p๒ไษ"ฅฅฅ!==mฺดAMํ๙ฎv๎๊๊๊pqqArr2€็ฃ[ƒ†ฝฝ=†Š„„ฉฏŽ;JEจ——พ๘โ ,]บT๙๛๋ฏฟ`kk‹ฬฬLDGGใ็Ÿ.๖zม|ไ็็ใ์ูณ่ืฏฦŒฅR‰ฉSงb๎นEฎSซV-L™2—.]Bัปwo|๖ูgEถž๘ฅฆฆJฏ‚ย‘ˆˆˆไํญ(‹„„ฺฺุขUซV8ผส๕fo‹––@MM ๙๙๙€ล‹รฮฮ.\ภกC‡ค‚ tuuฅŸงNŠีซWใษ“'hผ9=zGGGฌZต 'Nœ@ฏ^ฝ๐oฟ!''งศm[XX 00ะฃGฤลล!==/^D‹-`ccƒvvvศฬฬ”ึ;ม„ J?CCC•ษ฿+ฺ๊ถm‹อ›7Kืtyzzโฮ;HNNฦ‰'เโโ‚]ปv•ุ‡าำำฅi///lูฒฐqใFดjีชศ๕ add„#GŽx~รRฉ,v;iii077‡Bก(tG๊‹ฎ]ปggg|๕ีWฐฑฑมญ[ท ญญ?งOŸฦ‚ p๘๐a4jิ฿}ก๕_<…Fมศศ<@rr2’““aii‰ห—/CWW็ฮƒปป;&L˜___\ผx๓ๆอƒM‰y#""ข๗ฯ+๊์ํํ1z๔hxyyมษษIๅฑ/+๎š:GGG<{๖LบQbๆฬ™ˆˆˆ€ฃฃ#ถo฿Žูณg็/ฟ‚3fภษษ ;vDnnnฑm‡ŽฅK—ยููYฅˆ|ูขE‹ะดiS8::ขQฃFprrRY๎์์Œฐฐ0ฤววรููนะ๚C‡ลฉSงเเเ€9sๆเ‡~(v[ภ๓Qย 6เ๐แร๘๐รกฉฉYb{"""z)„ขฒƒ 7'-- FFFุ} F&•N•ฃฬฯรรฤ“จัจ%ิิ฿๚€ช<ๆฏ|˜ฟ๒cห็}ฮŸg}ใr๗‘››‹ˆˆH7l–Vม็wมใอJƒ฿(ADDD$Uพจ›3gœU^๙-DDDDUA•K>}z‰ฯซ#"""zT๙‘:""""bQGDDD$ ,๊ˆˆˆˆd€E‘ ฐจ#"""’uDDDD2ภขŽˆˆˆHXิษ@•๘0•Žซ!LM+;Œ*'77‰€วFe>bส‹๙+?ๆฐ|˜ฟช…#uDDDD2ภขŽˆˆˆHXิษฏฉ{On‡ENe‡Qๅไkhฎฦฝu ž—UูแT9ฬ_๙ผk๙ซ[Ze‡@D%เH‘ ฐจ#"""’uDDDD2ภขŽˆˆˆHXิษ‹:""""`QGDDD$,๊ˆˆˆˆd€E‘ ฐจ#"""’uDDDD2ภขŽˆˆˆHXิษภ+๊RRRฐfอšb—›››ฟฒu๋ึแแร‡SiถYั““ธz๕*|||ะดiSธธธจดหฬฬ„ตต5ฆL™๒ึc$""ขชฏาŠบาจ่ขฎ<๒๓๓K677OŸ>DDD@SS0x๐`,\ธ—.]ย๛Uึ™3gZดhก2๏ษ“'ๅŒšˆˆˆVิพ}-[ถ„ณณ31aย\ธpฮฮฮXฐ`ž>}Š=z I“&>|๘+๛ฑcขฃฃัฃGx{{ึฎ] {{{ุcีชU%ฎ?kึ,ุรัั+Wฎ”ๆ3M›6E๗๎ฅBmฦŒpww‡ฝฝ=ฆM›&ตตฑฑมิฉSแ์์Œ'N`ภ€hฺด)ฐqใฦBLNNฦดiำะจQ#\นrE๊#++ /^„พพ><<<fffาzIIIHLLDงNT๚ DPP"##!„xeฮ ;;iii*/"""’ฟ +๊6mฺ???ฤฦฦ"&&ณgฯ†ƒƒbcc1iา$,[ถ ถถถHHH@งNp๏=i]ggg้็!C†Hลœ››v์ุใวใ฿ลœ9spโฤ ๙็ŸXดh’““‹Œe๗๎8y๒$ฮ;‡๘๘x๔๎p๏=๔๊ี —.]‚Rฉฤแร‡๛์3ข]ปvžฆ]บt ฟ๒ ZตjUl~๒๓๓qโฤ ฤลลมภภพพพ๐๖๖Frr26lˆ† โิฉS*๋( ๘๛๛ร฿฿<ภธqใ`ii‰kืฎมยยขศํL:ใว—ฆำาาXุฝ*lคฮวววŽƒ™™z๕๊…C‡jฃP(*jsฏEKKK๚YMM ๙๙๙ศสสย๘๑ใฑgฯiT/;;[jWP|š˜˜ >>ญZตยw฿}‡™3gx>2ึฑcG|๑ว˜|!>๐CLŸ>]]ดททว๒ๅหqy4hะ๚๕C›6m ๖๐๐ภํท‘––†ผผ<œ|8Zทnๆอ›#22Jฅปvํ‚••ฎ\น‚~๚!77mฺดAll,ขขขTถ••…-[ถ`ๅส•hบ5ๆฮ‹™3gJ}ฏ^ฝ{๖์จซซฃz๕๊าบ_|๑–/_ŽศศHiฆM›†O?!!!044|e๎ฒณณ‘-Mงฅฅฝr"""ช๚*dคnำฆM๐๓๓Cll,bbb0{๖l888 66“&Mยฒeห`kk‹„„t๊ิ ๗๎“ึuvv–~2dˆTฬนนนaวŽ8~8๗_ฬ™3'NœภŸ‰E‹!99นศXVญZ…ัฃG#66'Ož„พพ>ๆฬ™ƒ: 66๛๗๓ฯ?8v์˜T(พH__1110`ยยยcวŽลฬ™3 ีZ๘๒ๅห7n์ํํq๎9ฌ^ฝs็ฮ-ิ๏;w๐ำO?มีี๚๕“Fโถlู777ิญ[Wฅˆ#๐๛๏ฟใฮ;pssระกCSโ๏"44FFFาหสสชฤ๖DDD$Rินปป#<<ณfอBRRtttT–Ÿ:u มมม€๎ปCWWWZ+ผfอ•S’ขฃฃัพ}{รภภ8sๆL‘ฑxzzbม‚˜?>@Qd[,\ธ6l@฿พ}ฅRYd[ z๔่ธธ8\ปv Wฏ^Eใฦaccƒ Yณf*๋?~ƒฦw฿}‡iำฆaภ€%ฦnhhจ๒""""๙ซข๎ฦจ]ป6FŒเเ`คคค ==]Z๎ๅๅ…-[ถv๏ฬฬฬW๖i`` ๕แ๎๎ŽC‡!-- ุปw/š7o^ไzืฏ_G๚๕1~x๘๚๚โ๒ๅห*}ฝ.'''DDDถn*อ744ฤ˜1c‡qใฦaร† ฐณณรฏฟZจ.]บเ่ัฃ€จจ(4jิธw๏’““‘œœŒš5kโนs€ภ .D฿พ}q้า%LŸ>ตjี*ืพ‘TศQQQ˜?>455ajjŠอ›7#::ŽŽŽ มจQฃะฟ4mฺ>>>*E‰ณณณt vศ!>|80hะ „„„ fอš8~8&Ož ///ภธqใ`ccSd,›7oฦฏฟŠjีชก~๚ุ่ฑ#ิีี๑์ู3้F‰ื๑ร? ˜6mผผผŠ๓๑๑=zTไแิฉSัทo_ฬš5 ๆๆๆ/q›ฆฆฆุทo,--_+f"""z(Dq็IEff&ttt P(0{๖lไๅๅaๆฬ™•ึ+ฅฅฅมศศ๗็๚ภTซ่ำยTผ\…&๖}๐9:^๛ ีDNe‡Sๅศ)jใฟ๕mๆๆๆ"""ล^L%cห‡๙+Ÿ๒ไฏเ๓;55ติ—RUศH๛เฬ™37n๒๓๓akk‹_~๙ฅฒC""""’Tูข๎ัฃGhืฎสผ5jจ<็ญ"<›Žˆˆˆ่]Te‹:SSSYDDDDฟ7๒5aDDDD๔vฑจ#"""’uDDDD2ภขŽˆˆˆHXิษ‹:""""`QGDDD$,๊ˆˆˆˆd ส>|˜สFํำํP35ญ์0ชต\ "jฃ๗A฿{Xfฬัร‘:""""`QGDDD$<๚žP๎›ฅ๎uซ๕X๚ึทIDD๔>โH‘ ฐจ#"""’uDDDD2ภขŽˆˆˆHXิษ‹:""""`QGDDD$,๊ˆˆˆˆd€E‘ ฐจ#"""’uDDDD2ภขŽˆˆˆHXิษ‹:~~~%.OIIมš5kค้ฌฌ,ดm...8rไH™๚?{๖,ะดiStํฺUฅ;w`hhˆฐฐฐ2๎ฝ๏4*;€ส$„€‘‘‘%ถ+(๊† 8< q๘๐แbืษฬฬ„††455ฅsss1t่Plถ ๕๋ืว๛๗Uึ™2e Uๆ=y๒&&&ฏณ{DDD๔‘อHํทัฒeK8;;รัั‰‰‰pqqAฏ^ฝะธqc|๚้งP*•€Zตjaฤˆpppภญ[ท`nnˆŠŠB‡ะตkW4hะsๆฬLŸ>.\€ณณ3,X€=zฮฮฮx๔่‘J—.]ยgŸ}†ฆM›โษ“' ๕ฟ~xzzข~๚333iฝcวŽมะะ*นนนa๐เม8sๆLฉ๒ดด4•ษŸlŠบM›6มฯฯฑฑฑˆ‰‰๑๑๑๘๊ซฏ€‡b๛๖ํ€๛๗๏#00/^„ตตตJ?็ฯŸวบu๋‡ฐฐ0<}๚sๆฬƒƒbcc1iา$ฌYณ:t@ll,LMM‘ 6ภววร‡‡ปป;๛oิชUKฅ๏คค$dggฃmถpssรถmyyy๘๚๋ฏ1kึฌB๛u๙๒et๋ึ 3gฮ„››Vฎ\‰ŒŒŒb๓ ###้eeeUิQ ›ำฏ๎๎๎4hิิิะปwo่๊๊ยฮฮฮฮฮ€เเ`œ8qAAA000@‡Š์งeห–055ฺฺุโ๖ํจVญZ‰vssƒฆฆ&ึฏ_{{๛bๅ็็ใฬ™3๘๓ฯ?‘ OOO๘๘๘`ำฆM่ป7ชWฏ^h ๔่ั=z๔ภ70t่PLœ8้้้Enc๊ิฉ?~ผ4––ฦยŽˆˆ่= ›‘:;v fff่ีซ:…B!-W(าดฎฎnฑhiiI?ซฉฉ!??•^ตjš6mŠฝ{c๖์ู๘๏ฟŠlgaa6mฺภะะ5kึ„ซซ+._พŒฟ๚ ๓็ฯ‡ /^Œ้ำงใ—_~‘ึ{๔่/^ŒnบAOO[ทn-1~CCC•ษŸlF๊nธKKKŒ1๗๏฿Gzz:๖o~ญพ ŠOOOxzzโ๑ใวXฟ~=:t่€>๘แแแ022’ฺตo฿K—.ENNrss‡z๕๊aร† R›™3gย}๔ _ฟ~ˆŽŽฦ€ฐw๏^XXXผึ>‘ผษฆจ‹ŠŠย๙๓กฉฉ SSSฬ›7ŽŽŽ˜5k.]บ๔่ัใต๚655…ฃฃ#ww๗"Uฏ^ใฦรธqใUhy50x๐`8;;CMM &Lxe‘ึฏ_?๚๋ฏPS“อ *ฝฒ)๊ˆJำษษษะาาย๗ฟBm๏ฝ[ไt๋ึญับuki‹…ูฆM›Tึyฑ]Q^\โ๖†ŠกC‡ปฬ™3Uฆปt้Rโvˆˆˆˆ]SGDDD๔>“mQgccƒำงOWvDDDDo…l‹:"""ข๗ ‹:""""`QGDDD$,๊ˆˆˆˆd€E‘ ฐจ#"""’uDDDD2ภขŽˆˆˆHXิษ€lพ๛•JฆึqิLM+; """zC8RGDDD$,๊ˆˆˆˆd€E‘ ๐šบ๗„2แP๊นLอ)ไ-GCDDD#uDDDD2ภขŽˆˆˆHXิษ‹:""""`QGDDD$,๊ˆˆˆˆd€E‘ ฐจ#"""’uDDDD2ภขŽˆˆˆHXิษ‹:""""`QGDDD$Zิฅคค`อš5ูe•€œœภีซWแใใƒฆM›ยลลEฅ]ff&ฌญญ1eส”ส“ˆˆˆชธทVิๅ็็WไฆJญ2ถ›››‹งOŸ""" ฉฉ ๘{๖์)6ึ™3gb๐เม๐๔๔ฤ_|คค$๘๛๛รีี;vฤฝ{๗666ศสสฌ[ทN%›4i5j''',XฐŠํใEษษษ˜6m5j$ํ[ม6.^ผ}}}xxxฬฬฬค๕’’’˜˜ˆN:ฉ๔ˆ   DFFBQช฿Svv6าาาT^DDD$ฅ.๊6mฺ???ฤฦฦ"&&GŽQ™ถถถฦœ9sเเเ€ุุXLš4 ปwcใฦ7nfฬ˜่่h,Zดใว๔้ำgฯžE||† ‚ภภ@t๎นฤ>q้า%๒ห/hีชUฑๆ็็ใฤ‰ˆ‹‹ƒ|}}แํํไไd4lุ 6ฤฉSงTึQ(๐๗๗‡ฟฟ?Eอš5‘••…-[ถ”s—Tมฤฤ๐&†ฟ`mmุุX(•J์ฝภ๓"*55บuร๙๓๖๖๖Xพ|9ฮŸ?  _ฟ~hำฆ ’““Uโ๐๐๐ภํท‘––†ผผ<œ๚่#xyyIง3ำำำันsg899ก{๗๎าตsล๕Q@OOC† มูณgฑpแBhhจ‚jhh`ึฌY๐๒๒‚ณณ3ฅ›&Šใ็็‡ฤฤD,Xฐ๕๋ืฏจt‘ )Dioซค*)-- FFFธl%L uŠlฃๆ๒–ฃช:rss€€TซVญฒรฉr˜ฟ๒aส9,ๆฏ|ส“ฟ‚ฯ๏ิิT–j~ฃ‘ ”๚F‰wั๛1y๒d•y;vฤผy๓*)""""ขสQฅ‹บ: C‡•Qฅใ้W""""`QGDDD$,๊ˆˆˆˆd€E‘ ฐจ#"""’uDDDD2ภขŽˆˆˆHXิษ@•~๘0•žZ“^P35ญ์0ˆˆˆ่ แH‘ ฐจ#"""’uDDDD2ภk๊ถ‡R็ฆฯ ุZyมQ…ใH‘ ฐจ#"""’uDDDD2ภขŽˆˆˆHXิษ‹:""""`QGDDD$,๊ˆˆˆˆd€E‘ ฐจ#"""’uDDDD2ภขŽˆˆˆHdUิฅคค`อš5•†Š]ปvแงŸ~’ฆCCCagg‡ฦcบu*m—.] …Bฌฌฌท%Uu•@E*(๊† RhY~~>ิีี฿Z,Ož<‰‰ บu๋&อฟ?ฮž=‹„„จฉฉแแร‡าฒ`ฯž=จ[ทฎ4/55†††P(o-n"""ชšชฬHํทัฒeK8;;รัังNR™NLLฤ๔้ำqแย8;;cม‚Xทn‚‚‚เ๋๋‹ปwปw‡››ผฝฝqๅส@XXแ่่ˆมƒCฉTZทn &ภลล๎๎๎ˆŽŽFปvํ๐ม`ฯž=…bฬหหร๖ํัพ}{Œ=ฐn:L™2ฐz๕jLž<๊๊๊P(จYณฆด๎ิฉS1kึ,•๎๘๑ใhธ1ๆอ›‡๛๗๏ฟฑQีWeŠบM›6มฯฯฑฑฑˆ‰‰ม‘#GTฆญญญ1gฮ888 66“&Mฤววc๗๎ุธq#ฦ‡3f ::‹-ย๘๑ใ}๚๔มูณg๑วาvMMMqyดjี ฃGฦž={ฐs็Nฬž=[js๋ึ-|๕ืhาค v๏oพ๙6l(ดIIIˆˆˆ€ปป;บt้‚[ทnNŸ> ฅR •๖]บtมัฃGt่P‘๋้๊๊J?+ œ;wฑฑฑา :๋ึญร… 0fฬdggK๋hjjิิิT~ฮฯฯ8::bีชU8qโz๕๊…฿~๛ 999Eฦbaaภภ@@=‡๔๔t\ผx-Zด€ ๗_ุูู!33SZ๏๙๓5j&L˜€O>๙&L(6OSงNEjjช๔* $"""yซ2E7PปvmŒ1มมม8qโ„ส๔… ```€๔๔๔b๛๐๖๖–๎ŽU*•ธpแเ้ำงจYณ&ฒฒฒฐeห–2ลฅญญ?งOŸฦ‚ p๘๐a4jิ฿}กถ/žNŠŠBฃF`dd„ 99ษษษฐดดฤๅห—กซซ‹s็ฮม&L€ฏฏ/.^ผˆy๓ๆมฦฦฆุxดดด`hhจ๒""""๙ซ2ง_ฃขข0|hjjยิิ!!!ptt”ฆ7o SSS8::ยัั!!!*7"ภ’%K0|๘p,[ถ นนน๘่ฃเเเ€้ำงฃYณfจUซ\\\^;Fggg„……!##gฮœ)ด|่ะก0`ึญ[###๓ฯ%๖งซซ‹ 6 aร†ฏฝBQูAะ›“––###ธฎ ‚R็ๆŸฐต๒‚ชBrss€€TซVญฒรฉr˜ฟ๒aส9,ๆฏ|ส“ฟ‚ฯ๏‚ว›•F•9JDDDDลcQGDDD$,๊ˆˆˆˆd€E‘ ฐจ#"""’uDDDD2ภขŽˆˆˆHXิษ‹:""""`QGDDD$,๊ˆˆˆˆd€E‘ hTv๔v์๏SSำสƒˆˆˆŽิษ‹:""""`QGDDD$,๊ˆˆˆˆd€E‘ ฐจ#"""’uDDDD2ภขŽˆˆˆHXิษ‹:""""`QGDDD$,๊ˆˆˆˆd€E‘ ฐจ#"""’uDDDD2 Qูะ›%„คงงฃZตj•Mี“››‹ฬฬLคฅฅ1ฏ๙+ๆฏ˜ร๒aสง<๙KKK๐ŸใฅมขNๆ=zฐตตญไHˆˆˆจฌาำำaddTชถ,๊dฎz๕๊€›7o–๚ xwwwœ={ถB๚zื๛KKKƒ••nบCCร ้๓]฿Š๎๙+ๆฏ˜ร๒aสง<๙B ==ฅ^‡Eฬฉฉ=ฟlาศศจย๊๊๊ึWU่ ™ฟr`ส‡๙+?ๆฐ|˜ฟ๒y•u0†7JP™5๊ฝ๊ฏขฝ๋๛หฝ[Uดw}฿๕๏>ฟ๋9|ื๗๗]ฯ_Iข,WเQ•“––###คฆฆพ‘ส๓W>ฬ_๙0ๅว–๓W>o;ฉ“9---ฬ˜1ZZZ•J•ฤ•๓W>ฬ_๙1‡ๅร•ฯฮG๊ˆˆˆˆd€#uDDDD2ภขŽˆˆˆHXิษ‹:""""`Q'cห–-ƒ ดตตัผys๕ื_•า;!44๎๎๎000€™™q๙๒e•6YYY5jLMMกฏฏ^ฝzแฝ{*mnผ‰ฮ;CWWfff˜4i๒๒๒ๆฎผๆอ›…BฑcวJ๓˜ฟ’๗฿0`LMMกฃฃDGGKห…๘๚๋ฏQปvm่่่ภฯฯIII*}<~๛๗‡กก!Œ๑ษ'Ÿ ##ใm๏ส[—ŸŸฏพ๚ ถถถะััAฝz๕๐ํท฿ช|?&๓งุ๊ฑcฺ่ต+,,, P(ฐs็N•ๅ•ฏ๘๘xx{{C[[VVV˜?›ตทขคๅๆๆb๒ไษppp€žž,,,๐ัGแ๖ํ*}ผต ’ฅอ›7 MMM๑๓ฯ?‹K—.‰กC‡ cccq๏ฝสญาu่ะAฌ]ปV\ผxQฤฦฦŠ€€Qทn]‘‘‘!ต>|ธฐฒฒ‡ัััขE‹ยหหKZž——'์ํํ…ŸŸŸ8ผˆˆˆ5jิSงNญŒ]ช4๕—ฐฑฑŽŽŽbฬ˜1า|ๆฏx?ึึึbะ Aโฬ™3โฺตkbโ๊ีซR›y๓ๆ ###ฑs็N'บu๋&lmmลณgฯค6;vNNNโ๔้ำโ๘๑ใข~๚ขo฿พ•ฑKoีœ9s„ฉฉฉุฝ{ทธ~บุบuซะืื?๘ฃิ†๙S!ฆOŸ.ถo฿.ˆ;vจ,ฏˆ|ฅฆฆŠZตj‰๛‹‹/ŠM›6 ฑrๅสทต›oLI๙KII~~~bห–-"11Q๙็ŸยรรCธบบช๔๑ถ๒วขNฆ<<<ฤจQฃค้|aaa!BCC+1ชwำ๛๗q๔่Q!ฤ๓7iตjีฤึญ[ฅ6ท ๓O!ฤ๓7นšššธ{๗ฎิfลŠยะะPdggฟจ$้้้ขAƒโเมƒยืืW*๊˜ฟ’Mž>>ะิิ”ฺt่ะ—/_ฦ“'OาผRSSกP(`ll เํๆOฃbv%>D~~พส&ิชU ‰‰‰•ีปIฉTb์ุฑhูฒ%์ํํw๏…ฆฆฆ๔†,PซV-ฝ{WjST~ –ษๆอ›q๎9œ={ถะ2ๆฏdืฎ]รŠ+0~xL›6 gฯžล็ŸMMM 8Pฺข๒๓bฬฬฬT–khh z๕๊ฒฯ฿”)S––†FA]]๙๙๙˜3g๚๗๏ฬ_UTพ๎ฝ [[B},311y#๑ฟkฒฒฒ0y๒d๔ํW๚Zฐท™?u๔^5j.^ผˆ'NTv(Uฦญ[ท0fฬ๔Sallฌrทแ๛jฤˆยศศHDEE‰;w๎HฏฬฬLฉอ๐แรEบuลแร‡Ettด๐๔๔žžžา๒‚Grดo฿^ฤฦฦŠ}๛๖‰š5kพไ(ส‹wฟ ม•ไฏฟbฮœ9"))IlุฐA่๊๊Š_Uj3o]ู!ฝ๙Zปvญิๆูณgbไศ‘ยฤฤD่๊๊Š=zˆ;w๎จ๔“œœ,:u๊$tttD5ฤ„ Dnn๎[›wรหE๓Wฒ?๘Cุ ---ัจQ#ฑjี*•ๅJฅR|๕ีWขVญZBKKKดkืN\พ|YฅอฃGD฿พ}…พพพ044ƒ้้้os7*EZZš3fŒจ[ทฎะึึ|๐˜>}บส(๓ง๊ศ‘#Eอ8p ขโ๒'Zตj%ดดดD:uฤผy๓ึ.พQ%ๅ๏๚๕๋ล~ฆ9rD๊ใmๅO!ฤ แ&"""ข*‰ืิษ‹:""""`QGDDD$,๊ˆˆˆˆd€E‘ ฐจ#"""’uDDDD2ภขŽˆˆˆHXิUงOŸขI“&ศศศจ์PT4mฺ๙g™ึฑฑฑม‰'PDesๅสดhัขฒร z็ฑจ#"ูฐฑฑžžž>}*อหฬฬ„lllTฺ้๊๊B__ฆฆฆ่ำงžt์ุฑL๏กo฿พฏwYไๅๅฝ๑mผ+ ๖ตo฿พXณfM%GC๔ncQGDฒาทo_lุฐAš๕ื_ัฟb๋้้ก[ทn๘๛๏ฟUๆuฯž=C฿พ}QฝzuTฏ^E๖s๓ๆMพ}า<,Xฐ7†พ๚k\พ|nnn022ย๐แรฅถJฅ3fฬ€••jืฎฯ?ููู€u๋ึกM›66lŒŒŒฐvํZ<~๚๕ƒ™™>๘เฌ_ฟพุ}|๑T๊๎ปagg'^nผนุ๕N:…† ยิิ'N„Rฉ”–-[ถ 4@50pเ@<}๚๙๙๙่ิฉฎ]ป}}}่๋๋c๚๕ุฐaพ๖[่๋๋K๛|แย๘๘๘ภฤฤฎฎฎˆŽŽ–๚V(Xบt)lmmัฆM€:๔^ดDe&ˆˆdยฺฺZDEE KKKq}q}aii)Nœ8!ฌญญUฺ?~\!Djjชฺ่ตซ˜1c†ด<--M˜››‹|ฑbล ัตkW‘™™)rssลฑcวŠ๖๎ป…ซซkกx|}}ลฃGฤ฿-ดดด„ฟฟฟธy๓ฆธs็ŽจUซ–8|๘ฐBˆUซV‰&Mšˆ[ทn‰‡ ///)ฆตkื uuuฑvํZ‘ŸŸ/233E@@€˜0a‚ศสสทจ]ปถˆ‹‹+6/๛[ซV-qโฤ !„w๎—.]*vgggq็ฮ๑฿‰&Mšˆ5kึ!„๘ํท฿„ฝฝฝHNN™™™ขo฿พbย„ B!Ž9"๊ีซงาืภลท฿~+Mงงง ฑm6‘——'v์ุ!ฌฌฌฤณgฯ„Bบuฉฉฉ"33SZฯะะP$&&/ ม‘:"’uuuaห–-ุฒe z๕๊uu๕Bํ:u๊ccc˜˜˜เส•+1b„ด์ะกC๐๕๕…ššชUซ†Gแฺตkะะะ(vค.%%ฅศk้>sTฏ^5‚““:v์+++˜››รืืqqq€อ›7cโฤ‰ฐดด„ฉฉ)พ๚klฺดI๊ง^ฝz4hิิิššŠจจ(„††BKK 5Bฟ~ฐ}๛๖WๆงZตj๘๛๏ฟ‘‘‘sss4iาคุถcฦŒนน9,,,0n8lูฒภ๓ำฬSงN…ตต5ttt0mฺ4lถํ•.ฐ{๗n4mฺT๚ยฬฬ งOŸ–ฺL™2†††ะัั‘ๆ 55ติ!z฿ฐจ#"ู้฿ฟ?6nˆ 6{๊u๏ฝHIIAff&ันsgiู‹ืำ…„„ ]ปv่ัฃฌญญZdFFFE๕jff&ฌฃฃShบ`ทoฃnบา2kkkพ}[šถดด”~พy๓&ฒฒฒPณfMรุุ+WฎฤปwKฬ lถ ;v์€ฅฅ%:v์X่ด๓‹ฌฌฌT~พs็Žดaร†InีชฝฯXิ‘,5iาคฤ๋ลฺทo}}}ิจQGŽมฮ;กP( =สไฮ; „กก!1lุฐbฏซ๛ไ“OTฎƒ+‹O>๙=z๔€‡‡š4i'''L:ตุ๖6lภฟ‹>๘fff;v,ž={๖สํฌ_ฟึึึ011มมƒฑt้าb๖้ำฐทท‡ฟฟ? เ๙ฦŸ|๒ :w๎ CCC๘๚๚Jeใฦัฝ{wXYYมุุภ๓"๐ฬ™3066ฦศ‘#add„={๖`ษ’%033ƒ VญZUb›6mยะกC_นD๏3…BTvDD๏ŠŽ;bส”)hบu™ื}๚๔)๑ื_ฝs ฎส’’’‚?ณศำปD๔‹:"ขฬŸ?ใฦCตjี*;"ข2aQGDDD$ผฆŽˆˆˆHXิษ‹:""""`QGDDD$,๊ˆˆˆˆd€E‘ ฐจ#"""’uDDDD2ภขŽˆˆˆH?|I๗๐…qMIENDฎB`‚c4core-bm-charconv-xtoa-mega_bytes_per_second-i8.png000066400000000000000000000751031477602032300330070ustar00rootroot00000000000000c4core-0.2.6/doc/img/windows-x86_64-vs2019-Release‰PNG  IHDRlvฒฦu9tEXtSoftwareMatplotlib version3.5.3, https://matplotlib.org/อ+นา pHYsaaจ?งiyฐIDATxœํw|M๗๐ืฝY"[ˆ$Iˆ•&Aฌˆ˜Q;๊ณbิึZ5ZJQีZกZTญVQ%Š 6•‰;hํ‘!‘y?ฟ?sฮ็|ฮ๛}ฮษฝog]…B€ˆˆˆˆdKYึQแXฐษ 6""""™cมFDDD$s,ุˆˆˆˆdŽ‘ฬฑ`#"""’9lDDDD2ว‚ˆˆˆHๆXฐQนีฏ_?–uŠŒŒ„Bกภ–-[ส:”b™1c ?~\ึกะD๓ๆอแโโRึah…B3f”u%าฏ_?ุ—uฒฦ‚Xxxxน๛P *m_}๕ถo฿^์๖ห—/G๗๎Qฝzu( ๔๋ื/฿vนดRฉฤ;w๒LONN†พพ> FŒ๑†ัSQาาา0cฦ DFFพ๗e?~3fฬ@bbโ{_vyRุwQzz:ๆฬ™'''TฌXีชUC๗๎qแย…-ใ๎ป˜1cbbb>เ7ฤ‚Xxx8fฮœYึa•ฉ’l_58ggghkkู^OO7nฬ3~๋ึญ% “PZZfฮœYfฬ™3K\ฐฝx๑SงN}7Aฝ#?๐._พF๓๖]ิงOL›6 อ›7ว๗฿!C†เ๐แร๐๕๕ลญ[ทŠฝŒปw๏bๆฬ™,ุˆจ์คฆฆ–uๅŽ/^ผxฃy:„วc๗๎ะำำ+ฒ}```พ† ะพ}๛7ŠแฟDฅR!==ฝฌรx็^อณB… ล๚ฯ€œ่่่๋๏ก$๗_lบฃGฦฒeห0hะ L›6 ›6mBJJJน๛O 6R๓โล ิญ[u๋ึU๛Bz๚๔)ฌฌฌะจQ#ไไไ _ฟ~Xบt)€—ืKไพrฅฆฆbธqฐตต…žž๊ิฉƒ @กถผีซWฃE‹ฐฐฐ€žžœœœฐ|๙๒ล|ใฦ ดiำฐถถฦ_|‘g9*• ‹-‚ณณ3*Tจ€ชUซbศ!x๖์™Z;{{{|๘แ‡8z๔(๊ืฏ * F๘๙็Ÿ๓,711cฦŒฝฝ=๔๔๔`ccƒ๏yฎSฉT˜={6lllPกBเฺตkjmrฏๅ‰…ŸŸ*VฌGGG้๚ทC‡กAƒะืืG:uก6ญ[ท0lุ0ิฉS๚๚๚077G๗๎‘ ึnอš5P(8t่†  ุุุธnoบGGGธธธเมƒ^qˆ/๖ตnงNB`` ฬฬฬ```777|๗wjm8€ฆM›ยภภฆฆฆ่ิฉ.]บคึ&๗แตkืะฏ_?˜ššยฤฤ๛๗GZZšิฮลลyโPฉTจVญ‚‚‚ิฦ•dฟุณgผฝฝกฏฏ+V@กP 55kืฎ• :ล™หฮฮNํoฅ(ฝ{๗FLL โใใฅq๗๏฿วะปw๏b๗“{๊t๛๖ํpqqžžœ๑ื_ฉต+่Zข๕Ÿ_Ÿฟ๖œœœ ฏฏ___ฤลลVฌXGGGTจPอ›7ฯณ?ๆŠŽŽFฃF ฏฏ„……ๅi“‘‘้ำงรััzzzฐตตลงŸ~ŠŒŒŒ|cZฟ~=œกงง'ๅธiำ&xyyมศศฦฦฦpuuอณ/พ*!!UชTฬœ9Sฺฦฏž~+ฮพ[ล‹รูู+V„™™ผฝฝฑaร/ื๗„ าฒsืaayพcqv€—฿#GŽDๅส•add„Ž;โ฿อำgJJ F-}YXX UซV8sๆŒิฆ$Ÿฏ๏w P(Xฐ`Vฎ\‰š5kBOO>>>8}๚ดฺ|}ฅคคชVญชถ,+++€พพ~‘q/ฏG๖๑๑๔๏฿_Zฦš5kŠ5ฉDฏ9y๒คะาาcฦŒ‘ฦ }}}q๙๒e!„วญZตฤบu๋ค—BจT*ัขE กP(ฤ Aƒฤ’%KD‡1z๔hตe๙๘๘ˆ~๚‰oฟV,^ผXดnZK–,)2ฮQกBQซV-ัทo_ฑdษ๑แ‡ โ๓ฯ?Wk;hะ กญญ-,ยยยฤgŸ}& „ศฬฬ”ฺููู‰:u๊ˆชUซŠษ“'‹%K–ˆ>๘@( qyฉ]JJŠpqqZZZb๐เมb๙๒ๅโห/ฟ>>>โ์ูณB!<(OOOแๅๅ%พ๖[1cฦ QฑbEQฟ~}ต๘„ตตตฐตต&L‹/NNNBKKKlฺดIXZZŠ3fˆE‹‰jีช ‘œœ,อoฟ www1mฺ4ฑrๅJ1y๒daff&์์์Djjชิn๕๊ี€prr~~~b๑โลb๎นB!ฆOŸ.ˆG !„ธvํšจ^ฝบ๐๐๐ฦฝšื๔้ำ‹F{๗๎บบบยฮฮNLŸ>],_พ\Œ9RดlูRjณo฿>กญญ-jืฎ-ๆอ›'fฮœ)*Wฎ,ฬฬฬฤอ›7ฅvน๑yzzŠฎ]ปŠeห–‰Aƒ โำO?•ฺ}๑ลBฉTŠ{๗๎ฉลr่ะ!@๖ooด_8:: 3331qโD&<(ึญ['๔๔๔DำฆMฅฟใวน^rˆ|งๅๆ๛๐แCaccฃถO/ZดH˜˜˜ˆ๔๔t@ >ผศe๎๎๎ยสสJ|๙ๅ—bัขEขFขbลŠโ๑ใวRปaggW`<ฏ๗้ๆๆ&lmmลนsลนs…‰‰‰จ^ฝบXฒd‰prr฿|๓˜:uชะีีj๓็๎๗bฤˆโ๛๏ฟMš4ฤ?(ตหษษญ[ท+VฃG+Vฌ#FŒฺฺฺขSงNybชWฏžจRฅŠ˜9sฆXบtฉ8{๖ฌุปwฏ ฤาฅKลาฅKลˆ#D๗๎ \gฯŸ?ห—/D—.]คm|๎9!D๑๗ฌ\นRAAAbลŠโป๏พ#GŽBq๎9ัซW/@|๛ํทาฒŸ?^hžนำ^๛,๎฿ŽB๔่ัC}๛๖K—.=z๔๎๎๎y๚์ปทะีีcวŽซVญ_ต่ะกƒ๘ๅ—_ค6%๙ฌx}ฟปy๓ฆณฃฃฃ๘๚๋ฏลผy๓Dๅส•…๔๗YุwQffฆฐฑฑ–––bวŽโฮ;โิฉSยฯฯO888ˆgฯž—Bฟ_|๑ล€๘๘ใฅe\ฟ~ฝX๓—l”ฏI“& ฅR)>,~๛ํ7@,ZดHญอ๐แร๓|€ !ฤ๖ํ1kึ,ต๑AAABกPˆkืฎIใาาา๒ฬ฿ฆMQฃF"c ฤ'Ÿ|"SฉTข}๛๖BWWW*2Ž9"ˆ๕๋ืซอื_ๅogg'ˆร‡Kใ>|(๔๔๔ฤธqใคqำฆMฤึญ[๓ฤฅRฉ„aUฏ^=‘‘‘!M๎ป๏'๓๓๓ฤ† คq๑๑๑€P*•โไษ“า๘={๖b๕๊ีาธึใ‰'๑๓ฯ?Kใr ถ&Mšˆ์์lต๖ฏl—.]ึึึยววG<}๚Tญ]q?„ณณณ…ƒƒƒฐณณห๓ม˜ปŽ„ยรรCXXXˆ'OžHใฮ;'”Jฅ๘฿—'พจ๕ีฅKann. _พ|Y‹/Vk7lุ0ahh(ญซ7ู/๚๋ฏ‘๛ฅผn:กT*ล‘#Gิ–&ˆcวŽฉลคT*ล… ิฺŽ5J็ู๏‹๒่ัฃ๗๗โ๎ป๙้ิฉ“pvv.ดอ๙๓๓ฌณ\ๅ™;-ฟ‚ญจฟ่่่|cฏ_ฟ<}š˜˜น฿•Fมfnnฎ๖๔วโฯ?”ฦ๔]$„งN5kึค———Wžะๅ๔้ำy>w฿7žฅ|อ˜1ฮฮฮ มฐaรเ็็‡‘#Gk๐๐phiiๅi?n8!ฐ{๗niซ‡ค“’’๐๘๑c๘๙๙แฦHJJ*ึ๒^ฝC.๗4Affฆtฺ๐ท฿~ƒ‰‰ Zตj…วK////โเมƒj999กiำฆาp•*UPงNธqC๗๛๏ฟร]บtษฯ๋ง๚๗๏]]]i8ท๏W๛CCCKรu๊ิฉฉ)๊ีซ‡ Hใs฿ฟ:ซ๋1++ Ož<ฃฃ#LMMีNQไ{๖์‰cวŽแ฿๐๒”‡ขgฯžR›’๎…ญณwอำำu๋ึล† ฐ~zXZZJลJIg฿~>s๗ฯโ์ท`mm ตq๙ _ธp!ฯvสmWœm5lุ0ิฎ]ํฺตƒ  ็๚ฝ’x“}๗UŸ}๖ Qฟ~}ิชU ร‡วฑcวJCI๗ษขvnบฅR™ง_GGว<}อ›7็ฯŸ‡ญญ-๊ืฏ3fผUแฆ1&)) M›6…ฏฏ/ๆฬ™ƒN:aธq๘๗฿q๔่Qฌ^ฝบิใ}—สืm$๔^ํูณภห็ุ\ฝzติฟฐฎ_ฟŽ€€ิญ[ .„ญญ-tuuŽoฟ*•ชT–ฃRฉ`aa๕๋ื็;=๗ขโ\yฏศP\ลํฏ vล™“O>ม๊ีซ1z๔h๘๚๚ยฤฤ …มมม๙ฎวย.ถํึญึฎ]‹๕๋ืซ๙‹โฌž={bาคI๘ํท฿0z๔h๚๋ฏ011Aถmฅ6%/Š{๒ปาปwo,_พFFFู่ณ'”ส’ป8๋ฎ ˜ๅไไ”จฯา;RฉTpuuลย… ๓zq˜฿ถฒฐฐ@LL ๖์ูƒปwc๗๎Xฝz5๗ฟaํฺต%Ž้mีซW—/_ฦฮ;๑ื_แ๗฿วฒeห0mฺดb?.ฉค๛din“=z iำฆุถm๖๎‹๙๓็ใ๋ฏฟฦึญ[ัฎ]ป๗Wท‰๙๗฿วƒะฑcGต๑~~~066ฦฑcว0t่ะR‰๓}`มF๙Šล_|๛#&&ƒ B\\œ๔ฟd เv;;;DDD %%Eํ([๎]nvvv€?ุฑc‡ฺข^?ฝQ•J…7nHำ€+Wฎ€tšฆfอšˆˆˆ@ใฦKํKทfอš8|ฉ๔Uถlู‚|๓อ7าธ๔๔๔7zเๆ๙๓กญญaร†มศศ่NฝNฝ?-[ถฬทM๎พ฿๓—โใใQนrๅ๘เฬž=ปT ถโ(h=ๅู๚6„ศษษAvv๖[/ใ}โ)Qส#++ ๚๕ƒตต5พ๛๎;ฌYณ<ภ˜1cิฺๅ~ฝแˆœœ,YฒDmท฿~ …B!1็ฯ้ี)%%%•๘0๕ซหB`ษ’%ะััA@@€—ฬษษม—_~™g์์์7*jบu๋†s็ฮaถmyฆฝ้‘ธทกฅฅ•gน‹/.๐จHa Vฎ\‰   „„„`วŽjำ‹{ซ|,Zด(ฯ:ฮีสส XปvญZ›๓็ฯc๏ฝ ,qนz๖์‰“'OโงŸ~ยใวีN‡ฅท_ผ—'ัืฌY‹-ยœ9sPฟ~wบœคค$ฤฦฦJใ๎ป—๏พ^ฒณณฑbล i833+Vฌ@•*Uเๅๅเๅถ๚๗฿๑ร?ไ™ล‹ลz–เ“'Oิ†•J% ฯฃA^UฑbEy?็v฿}=]]]899Aฌฌ,ฦพ+นืh.[ถLmโล‹ี†srr๒\jaaakkkตuYาGฝฉ‚ึS๎ไ7mฺค6~วŽHMM…งง็[/ใ}โ6สcึฌYˆ‰‰ม๛add777L›6 SงNEPP๔A”๛a:rไHดiำZZZF‡เ๏๏)Sฆ !!๎๎๎ุปw/๘ใŒ=Z:๒าบuk้ผC† ม๓็ฯ๑ร?ภยย๗๎+Vฌ*Tภ_…4hะปw๏ฦฎ]ป0y๒d้”–ŸŸ† ‚9sๆ &&ญ[ท†ŽŽฎ^ฝŠ฿~๛ ฿}๗ฺณนŠcย„ ุฒe บw๏Žภหห OŸ>ลŽ;ww๗๕๗ถ>๐Cฌ[ท&&&prrย‰'ss๓7๊OฉTโ—_~A็ฮัฃG„‡‡KืL๗฿๐๗๗ว๔้ำ ฝ˜XฉTb๙๒ๅ่ะก<<<ะฟXYY!>>.\NนฯŸ?ํฺตƒฏฏ/ˆ/^`๑โล011yซ‹•{๔่๑ใวc๘๑จTฉRžฃ|ฅต_xyy!"" .„ตต5ิnyŸ‰s็ฮx๙ŸฃุุXฬš5 ะฑcGฉˆศฯจQฃŠ“๚[ ฦgŸ}†.]บ`ไศ‘HKKร๒ๅหQปvํ|o`y[ึึึ๘๚๋ฏ‘€ฺตkc๓ๆอˆ‰‰มส•+กฃฃ่ท/~๕W„††โเมƒhธ1rrr_Uz>^a „งOŸขE‹ฐฑฑมญ[ทฐx๑bxxxHืืๆG__NNNุผy3jืฎJ•*มลล...oต๏ถn–––hธ1ชVญŠK—.aษ’%h฿พฝtf"๗3vส”)†ŽŽ:t่๐FG‹รหห บuรขE‹๐ไษ4lุ‡’Žxพ๚|3ม†††ˆˆˆภ้ำงีŽ๒๗ณข4โ๒.rvvฦ_|[ทnกaร†ธvํ–,Y+++ 8ฐุหจYณ&LMM### Aƒ๏๗ฺึ๗}[*ษ[ttดะึึV{T†/ัเใใ#ฌญญฅG4dgg‹O>๙DTฉRE( ตชSRRฤ˜1c„ตตตะััตjี๓็ฯW{œƒB์ุฑCธนน‰ *{{{๑๕ื_‹Ÿ~๚ฉภ[ู_" ฤ๕๋ืฅg4UญZULŸ>]ไไไไiฟrๅJแๅๅ%๔๕๕…‘‘‘puuŸ~๚ฉธ{๗ฎิฦฮฮNดo฿>ฯผ~~~ยฯฯOm“'Oฤˆ#Dตjี„ฎฎฎฐฑฑ!!!า3ญroi๕น_Bํ๊ฏ๎็็—๏-ลƒืๅ๐์ู3ัฟQนreahh(ฺดi#โใใ…ฺc#r๋q๚๔้<}พ6!^>.ฤฯฯOJ)ษญ๚Bq๔่QัชU+add$ „››[žGnDDDˆฦ }}}all,:t่ .^ผXd|ฏๆ”฿าธqc@ 4จภ๘fฟโๅใWš5k&๔๕๕€"๑‘๛8š^ฏ๎ๅ๛บื๗…’ถ{}โๅ๓๓\\\„ฎฎฎจSงŽ๘ๅ—_ |ฌว๋}ๆ๎฿๓็ฯWŸ฿฿C๎~%|}}E… „]พฯaฬฬฬ_ตpvvzzzยฬฬLxyy‰™3gŠคคค"๓ฒe‹hบตฐฐฐบบบขz๕๊bศ!ลzผร๑ใว…———ะีีอณ๏g฿อฯŠ+Dณfอ„นนนะำำ5kึ&LPหE!พ๒KQญZ5กT*ี๖๓ยถ๛๋1–ไo'55U >\TชTIŠฮ;Kสษ}fcFF†˜0a‚pww—ฎลฒeหิ๚/วzผพๅ—_a฿EOŸ>cฦŒตkืzzzขrๅส"88Xธqฃศ˜^๗ว'''กญญ]&๘PQ็oˆˆˆจ\ˆ‰‰งง'~๙ๅ๔้ำงฌร๙ฯโ5lDDD๙F๎ขE‹ T*ัฌYณ2ˆˆr๑6"""๐๒๙jััั๐๗๗‡ถถถ๔”?8ฯใS4Aff&ž>}Zh“2ฌ๐”(๖ํ‡™3gโโล‹x9ชWฏŽพ}๛bส”)ะึึผc<‘‘‘๐๗๗/ดอ๊ีซัฏ_ฟ๗P!XฐัาณgฯคŸ@+ˆณณ3ฌฌฌSDcมFDDD$sผ้€ˆˆˆHๆXฐธs็*TจPโเ–ณศศH( DFFพu_อ›7‡‹‹ห% 6ฤงŸ~Zึa• 6"*5kึฌBก€BกภัฃG๓LBภึึ …~๘กฺด๙r_prrยฌYณ–––๏๒โโโ P(๐๗฿ฟu์_|๑4h€ฦฟu_T<_}๕ถo฿žg๑ใว1cฦŒw๖3@Ÿ}๖–.]Š๛๗๏ฟ“‰lDT๊*Tจ€ 6ไ่ะ!๓ฯ?j?ยชVญZaบuXทnพ๙ๆxzzโ๓ฯ?GHHHพํwํฺ ๘๘๘ผUผ=ยฺตk๚VศMณfอ๐โล ู>?ซฐ‚mๆฬ™๏ฌ`๋ิฉŒ๓f&‘œi=บDTๆ๑oฟแ๛๏ฟW{ภ† เๅๅUเAืฎ]}๔‘4ŠฬฬLlบ้้้จPก‚Z๛๐๐pดkืN๚ร7๕ห/ฟ@[[:txซ~JSjj๊[fคRฉฬณฮหาาาPฑbE(•Jแ็Ÿฦฬ™3฿z!zx„ˆJ]ฏ^ฝ๐ไษ์ทO—™™‰-[ถ w๏%๊หาา …"ฯ3 q๘qดo฿^ทiำ&xyyมศศฦฦฦpuuลw฿}Wไ2ถo฿Ž ภะะPm|๎u[ฑฑฑ๐๓๓CลŠแ่่ˆ-[ถxyฤฐAƒะืืG:u‘ง๏ณgฯข]ปv066†กก!p๒ไIต6นง’:„aร†มยย666า๔ปwฃiำฆ000€‘‘ฺทo .™W~ืฐ]ฝzบuƒฅฅ%*Tจ#))ฉศ ::5‚พพ>–งMFFฆOŸGGG่้้มึึŸ~๚)222ค6 …ฉฉฉXปvญtผ_ฟ~˜1c&L˜pppฆ%$$H๓๒ห/๐๒๒‚พพ>*Uช„เเ`นsG-†mfอšกbลŠ˜{๖ ๐๒๒ยผy๓`ccƒกC‡โงŸ~’ฺจT*t์ุ ,@‡ฐx๑bt๎฿~๛-z๖์)ต[ทn๔๔๔ะดiS้4๘!CะตkW๔๊ี ๐ํท฿JำชTฉ˜={6๗ฟกVญZXธp!F๛๗ฃYณfyrx๒ไ ฺตk,ZดHํฉ^^^ Q7™†{ฏ?5ODm๕๊ี€8}๚ดXฒd‰022iiiB!บw๏.…Bุูู‰๖ํซอ ฿W็ฮEzzzže๕ํW๘๙๙IรฃFฦฦฦ";;ปD1_ปvM‹/ฮ3อฯฯO6lฦลวว BฉTŠ“'OJใ๗์ู#ˆีซWKใ:w๎,tuuล๕๋ืฅqw๏FFFขYณfาธ๕ึคIต๘SRR„ฉฉฉ}=R+ุ† †_ํฺตCตjีะบuk๔่ัmถ-Vผข€}ฑฑฑษsQบ‰‰Ižยฮ-†ž={เๅงiiiจSงNž>๋ีซ•J…;w๎ภููY๏เเ ึ๎๊ีซ ;ฏ366.,ฅ<0v์X,\ธ๋ืฏGำฆMัฑcG|๔ัGR…ฑถถฮs#Dํฺต hุฐ!ฎ^ฝŠK—.Iง0_๗๐แรลชซWฏBZตjๅ;]GGGmธZตjะีี-ฐ?!o8 rƒฝ3ฝ{๗ฦเมƒq}ดkืฆฆฆ%๎# p๘๐aฉ` ‡ฝฝ=œœœคvˆ‰‰มž={ฐ{๗n์ฝซWฏฦ๗?ฌ]ปถภอออก๕บWxg|A…_q่๋๋ซ ซT*/ฏ๗ฒดดฬำM~Œ๛›oพAฟ~๐ว`๏ฝ9r$ๆฬ™ƒ“'Oช่๐ฆT*\]]ฑpแย|งฟ^่–ดo…Bปw็ป_ฟiไ๕๕๙บฤฤDTฎ\๙ใ!zŸXฐั;ำฅK 2'Ožฤๆอ›฿จ์์lภ๓็ฯฅqปvํB```žถบบบ่ะก:t่•J…aร†aลŠ๘๓ฯแ่่˜oีซW‡พพ>nผ๙F๑คJ•*จXฑ"._พœgZ||<”Je‘ลKอš5ผ,F_=๒๘ถ\]]แ๊๊ŠฉSงโ๘๑ใhธ1ยยย0kึฌB็ป{๗nžว\นrภหMrc>w๎Š๘c๑เมฉ]PP ฬำ็–-[D๋ึญ…………ะีีีซWC† ๗๎+2๎mmmฑn:ต๑~~~ยููนX๑็ๆ0|๘pตqgฮœmฺด†††ขbลŠย฿฿_?~\ญMQ๋ํเมƒขM›6ยฤฤDTจPAิฌYS๔๋ืODEEšื๋๕ธqใ†0`€จYณฆจPก‚จTฉ’๐๗๗…๖#ฤฏ‹จจ(แ๋๋+*Tจ ์์์ฤ’%K๒ดอฬฬ_ตpvvzzzยฬฬLxyy‰™3gŠคค$ฉ]||ผhึฌ™ะืืิ๑๑ๅ—_Šjีช ฅR™็ฟปhาค‰000ขnบb๘๐แโ๒ๅหyโอONNŽฐฒฒSงN-2o"นP๑WศฝGููู077วœ9s0lุฐRํ{เภธrๅ Ž9Rช’l฿พฝ{๗ฦ๕๋ืaeeUึแ 6"*7>|ˆeห–aศ!ฅE{๛๖mิฎ]๛๗๏GใฦKตo’___4mฺดXงฅ‰ไ‚‘ฬ๑.Q""""™cมFDDD$s,ุˆˆˆˆdŽ‘ฬ๑มนBฅRแ๎ป022โ•BคคคภฺฺJeมวัXฐiˆปw๏พี*Qูนs็lll œฮ‚MCnผ‰J•*•q4ฅ+++ {๗๎E๋ึญฅŸฟัšœ ู๙1ท๒K“๓cnๅOrr2lmmฅ๏๑‚ฐ`ำนงAŒŒJ๕ทๅ ++ +V„ฑฑฑF‘š ู๙1ท๒K“๓cnๅWQ—3๑ฆ""""™cมFDDD$s,ุˆˆˆˆdŽ‘ฬฑ`#"""’9lDDDD2ว‚ˆˆˆHๆXฐษ 6""""™cมFDDD$s,ุˆˆˆˆdŽ‘ฬฑ`#"""’9lDDDD2งBˆฒ‚^rr2LLLเ5๕จt ห:œRฅซ˜ไ๒sฮ"Sฅ(๋pJ•&็hv~ฬญาไ˜ปqๆ๓๏ฌ๏๏๏คค$ุŽGุˆˆˆˆdŽ‘ฬฑ`#"""’9lDDDD2ว‚ˆˆˆHๆXฐษ 6""""™cมFDDD$s,ุˆˆˆˆdŽ‘ฬฑ`#"""’9lDDDD2ว‚ˆˆˆHๆiม„† –zฟ;v์ภ๗฿ุพ};ฎ]ป๖ึ}#22๒ญ๛y]`` 233‹-‚ณณ3œœœ๐้งŸ–๚ฒˆˆˆH3iฟซŽ๗ํ--ญR๏7'';v”†ทo฿Ž *ภััฑิ—๕ฆฒฒฒ™™ „‡‡ž>}Š%K–เย… ะึึFร† WWW<{๖ fffe5ษUฉa๛แ‡เ๊๊ wwwLŸ>YYY๘๊ซฏ0u๊ิbอ?x๐`–-[–o7๖ํ‡๓็ฯc๕๊ี8y๒$เ๑ใวXดh"##---lบ5฿<—Gv์ุภภ@tํฺีชUร™3gเ้้ฉถ7nŒE‹กqใฦEฮgdd„””@บuq๓ๆMฤลลRSS ผƒดQฃFุถmฒฒฒp๗๎]9rะฐaC์฿ฟ๓เษ“'๘็Ÿ๒ไ๙๔้S€‹‹ –-[†ณgฯขVญZ่ป7‘ ถ<œ8qBบ†ํศ‘#จ]ป6`๘๑pssC||<ึญ[‡ˆˆt๏ดADDDๅฯ[l...1b5jww๗D_รผ<-ZฅJ่๋๋ฃqใฦ๘๗฿ีŽฐ$88ำงO‡‡‡222ฐaร„††ยพพพl๕๋ืG@@\\\ะฟ้จ……–.]ŠN:มออ ญ[ทฦร‡‹ฬำภภƒ ย้ำงฑ`มhkซผ๔๕๕E‹-เแแดhัBZfห–-๙๓็ห๊nW"""’…(๎m‰$kษษษ011ืิ? า5,๋pJ•ฎR`’หsฬ9oˆL•ข่สMฮ ะ์˜[๙ฅษ๙1ทwใฬ็-Y฿น฿฿IIIาu๒๙แ/ษ;{pฎœ4hะjใ๛o่๊๊–QDDDDDล๗Ÿ(ุN:Uึ!ฝ1ž%"""’9lDDDD2ว‚ˆˆˆHๆXฐษ 6""""™cมFDDD$s,ุˆˆˆˆdŽ‘ฬ๑ทD5D๎o‘=~ๆๆๆeNฉสสสBxx8กฃฃSึแ”*Mฮ ะ์˜[๙ฅษ๙1ท๒‡ฟ%JDDDค!Xฐษ 6""""™๛O๘๛ษ”ฟฎBปโรฒฃTi!-”ภ๘—‘ญฒงTirn€f็วสŸ%]๊•uDoŒGุˆˆˆˆdŽ‘ฬฑ`#"""’9lDDDD2ว‚ˆˆˆHๆXฐษ 6""""™cมFDDD$s,ุˆˆˆˆdŽ‘ฬฑ`#"""’9lDDDD2งQ[PP6lXdปจจ(Lœ8‰จจจwS`` 233‹-‚ณณ3œœœ๐้งŸพณe‘fั.๋Jหพ}๛ ฅฅUฌถ๐๖๖๐ฒ`ณดด”†KCVV233a``€๐๐pภำงOฑdษ\ธpฺฺฺhุฐ!โโโเ๊๊Šgฯžมฬฬฌิ–ODDDšฅ\a๛แ‡เ๊๊ wwwLŸ>YYY๘๊ซฏ0u๊ิbอ‰เเ`นsaaa˜={6<<}puuละกC‘““˜>}:|||เโโ‚ษ“'็oBB&OžŒบu๋โส•+{{{คงงC์์lddd 33*• ๆๆๆ€ฮ;#((B”ย""""MR๎ ถุุX,]บวŽรนs็0jิ(,\ธ!!!022Rk†ฐฐ0/Oƒ4Hmบญญ-BCC1eสฤฤฤ N:่฿ฟ?VฌXธธ8<}๚7nŒ5 งOŸFll,bccq๎9@NNv์ุภภ@tํฺีชUร™3gเ้้ฉถ,sssŒ;ถถถฐฒฒBทn`mm เe9dศฌXฑ...Xฐ`?~\่zศศศ@rrฒฺ‹ˆˆˆ4Sน;%š{tฬุุ๐โล ์ปธu๋–ZะะP้ฝทท7VญZUh฿‰‰‰PฉT๐๒๒๔้ำปw๏ฦG}„๛๗cผyศศศภƒp๑โEธปปฃs็ฮธpแ~๙g4iาคภพŸ={†={๖เ๖ํP*•@งNเ์์ …BVญZกUซVx๔่ฦŒธqC*๊^7gฮฬœ9ณX๋Œˆˆˆสทrw„ํu111ธx๑"ะคIœ={;v,ีeคงงc์ุฑุตkbccัฝ{wdddxY8ตm ภgŸ}†ซWฏๆGDDabb###๘๛๛#::Zš๙s๘ใุ่ฑ#๎฿ฟu๋ึกjีชฦ4iา$$%%Iฏ;w๎”jฮDDD$ๅฎ`kัข6mฺ$๔๕๕ลฝ{๗€ฃGยำำ;v์(vFFFHII˜ššBKKK:นqใF4iา้้้P*•033รำงO๑็ŸJ๓ปธธ`ูฒe8{๖,jีช…ฝ{ร฿฿ jหฑฑฑม‰'คkุŽ9‚ฺตkฦ777ฤววcบuˆˆˆ@๗๎ ฝ‰BOOฦฦฦj/"""าLๅฎ`sqqมˆ#ะจQ#ธปปใ๛๏ฟ/ฐmQืฐ@‡ฐn:xzzโ๒ๅห๘้งŸ0pเ@ธบบยฤฤมมม055Eฏ^ฝPฏ^=tํฺพพพy๚100ภ Aƒp๚๔i,Xฐฺฺ๊g›}}}ัขE xxxภรร-ZดAาฒeKฤววc๙ptt|›ีCDDDH!x[ขFHNN†‰‰ †rฺMส:œRฅ…ดP^วUMไ xn)/497@ณ๓cnๅฯ’.๕ผ|๔Rxx8กฃฃSฦQ•.ๆVไ~'%%zถฌa#"""๚ฏaมFDDD$s,ุˆˆˆˆdŽ‘ฬฑ`#"""’9lDDDD2ว‚ˆˆˆHๆXฐษ 6""""™cมFDDD$s,ุˆˆˆˆdŽ‘ฬi—uTบfทญss๓ฒฃTฝม฿๋X๐a๚ม_@ณs4;?ๆFD๏ฐษ 6""""™ใ)Q ณ๙ฟะ7J-๋0J—*•rๆ@ฉUึั”.Mฮ ะ์˜[๙Uส๙๕๗ฉ๖1GุˆˆˆˆdŽ‘ฬฑ`#"""’9lDDDD2ว‚ˆˆˆHๆXฐษ 6""""™cมFDDD$s,ุˆˆˆˆdŽ‘ฬฑ`#"""’9lDDDD2ว‚ˆˆˆHๆ4ข` Bร† ฿xศศHDEE•bD๊‘™™ Xดhœแไไ„O?๔-“ˆˆˆ4Gน/ุ๖ํ--ญท๊ใ]lYYYHMM„‡‡CWWOŸ>ล’%Kpๆฬฤลลแเมƒˆ‹‹<{๖ฌT—ODDDšฃ\l?๐\]]แ๎๎Ž้ำง#++ _}๕ฆNZฌ๙7mฺ„   @tt4|||p็ฮ„……a๖์ู๐๐๐ภๅห—q๚๔ix{{รีีC‡ENN`๚๔้๐๑๑‹‹ &Ožœ๏20y๒dิญ[Wฎ\ุ#==Bdgg###™™™PฉT077t๎AAAˆˆˆ€ขศ\222œœฌ๖""""อTn ถุุX,]บวŽรนs็0jิ(,\ธ!!!022Rk†ฐฐ0@TT FVV6nˆ!C†`ๅส•ฐตตEhh(ฆL™‚˜˜ิฉS๛๗วŠ+‡งOŸbใฦ€QฃFแ๔้ำˆEll,ฮ;ศษษมŽ;ˆฎ]ปขZตj8sๆ <==ีโ277วุฑcakk +++t๋ึ ึึึ^ๅ2dVฌX,Xฐ?.p}ฬ™3&&&าหึึถtV4ษŽvYP\‘‘‘†ฑฑ1เล‹ุปw/"""p๋ึ-ตถกกกา{oooฌZตJ ƒ““†šง €ฤฤDจT*xyy๚๔้ƒปwใฃ>ย๛1o}Š?S๊ืลลห–-รูณgQซV-๔๎HHHP[พ Nœ8!]รvไศิฎ]0~xธนน!>>๋ึญCDDบw๏ึ7TQ๙Wn 6Œ15‚ปป;พ๛t _|.]บภลล+Wฎฤ˜1c๐๙st่ะ๋ึญƒงง'._พŒŸ~๚ „ซซ+LLL SSS๔๊ี ๕๊ีCืฎ]แ๋๋›gน4hNŸ> @[[Œณฏฏ/Zดhxxx E‹าใHZถl‰๘๘xฬŸ?ŽŽŽฅตฺˆˆˆH(DqnI$ูKNN†‰‰ –๎?}#ำฒงtฉrP้~,žZบJ ;โจษนšs+ฟJ9ฟ>ีK!จา‘••…๐๐pBGGงฌร)Ušš[๎๗wRRRก—7•›#lDDDDU,ุˆˆˆˆdŽ‘ฬฑ`#"""’9lDDDD2ว‚ˆˆˆHๆXฐษ 6""""™cมFDDD$s,ุˆˆˆˆdŽ‘ฬi„ส“ž๎ี`nn^ึa”ช—ฟ‹>ฐัจ฿4;7@ณ๓cnๅ—ฆ็Gš‰GุˆˆˆˆdŽ‘ฬฑ`#"""’9^รฆaข’a๔Lซฌร(Uชœlภ฿7’ ิาฌ]V“s4;?ๆV~•v~พŽฆoQQx„ˆˆˆHๆXฐษ 6""""™cมFDDD$s,ุˆˆˆˆdŽ‘ฬฑ`#"""’9lDDDD2ว‚ˆˆˆHๆXฐษ 6""""™cมFDDD$s,ุˆˆˆˆdฎL ถ   4lุฐศv ุฒeKฉ-wฦŒ +ตŠcวŽ๘๛๏w๎ŸŸ<==Qฟ~}ฤฦฦพืXˆˆˆจ|z๏พ}๛ ฅฅUฌถฅ]ฐฝœœœต๖์ cวŽ9r$เ›oพมG}„ณgฯbส”)˜9s& )) Bˆา ˜ˆˆˆ4ฦ;-ุ~๘แธบบยำงOGVVพ๚๊+L:ตX๓O™2{๖์‡‡ึฏ_Gก]ปvpuuE›6m๐เมƒ็‡ŸŸั AdddขฃฃัคIิฌY{๗๎\ฟ~Mš4ม|___\บt ฐfอมฯฯ}๛๖ลมƒแ๊๊ 4n8ฯ2ณณณฑu๋Vดn#FŒ๚˜8qขิ&99Y๚ืสส pไศิซWs็ฮลร‡‹ตn222œœฌ๖""""อคฎ:ŽลาฅKq์ุ1ใ้ำงXธp!BBB`ddคึ6๗4ehh(ขขข†UซVa๖์ู รฆM›ร† CซVญ0v์X,[ถ SฆLมชUซ๒]~฿พ}1o<๘๛๛#)) :::€[ทnแะกCˆ‰‰มศ‘#ับukXYYaะำำร฿ษ“'cถmRััั022B‡๐๗฿K}ๆบs็~๘แlฺด Mš4ม_|‘๏)฿‰'ขeห–Xดh NŸ> ๘๐รแใใƒีซWฃy๓ๆpssChh(š7o^เ๚3gŽt„Žˆˆˆ4;;ย‰เเ`^ผxฝ{๗"$$$OะะP„††ผฝฝ ,ยŽ?Ž>๚๐ัGแุฑc๙ถKNNFJJ &&&P*_ฆฺพ}{hiiมำำ ^ญ๊฿ฟ?\\\0x๐`\ผxQ๊ซmถRูจQ#|๚้งXฒd‰tฤ๎๏ฟ†ƒƒาาา…Ÿ~๚ฉภ๋๓6lุ€1cฦเฮ;˜3gF-MซZต*&Nœˆ . OŸ>่ฝ;>๙ไ“|๛€I“&!))IzนsงภถDDDTพฝทkุbbbp๑โE888 I“&8{๖,:v์๘พ/ัำำ(•J้บดE‹กN:ˆ‹‹ร๛ฅb *Vฌ(ฝŸ4i~๘แ<{๖ 4ภ“'Oเๆๆ†•+Wโ่ัฃ่ึญ~๕Wdffๆป์]ปvtํฺงNR›~๖์Y >ใฦรภ1nธB๓066V{‘fzg[‹-ฐiำ&ฺ้*___ปw 8z๔(<==ฑcวŽB๛022BJJŠ4จQ#lผภหฃUMš4ษw>ccc˜˜˜เเมƒ^^ิฏRฉ \Nrr2,--กP(ฐfอšธq๘๓ฯaoo;w๎ B… 0`Nž<‰๙๓็ใภจ[ท.พ๙ๆ›<๓ุุ 22ฐ~ิฎ]pๆฬ๘๘๘`ธq๐๓๓ร๙๓็1w๎\ุถzˆˆˆ่?โl...1b5jwww้ั๙ “ฎc‹ŠŠย Aƒnnnx๑โ…tำมŒ3777lบณfอ*ฐฯŸำงO‡ปป;ฺถm‹ฌฌฌ†††bษ’%๐๐๐P+_ทpแB8;;รออ u๋ึ…ปปปฺt„……!66yๆŸ?>ๆฮ wwwฬž= .๐๒(๚๕๋qเภ๔์ูบบบฦ@DDD= ม็Ih„ไไd˜˜˜`Oิ ™˜•u8ฅJ•“ว๑วPนnc(ตู}2eB“s4;?ๆV~•v~พŽฆoT)ษสสBxx8ฅ›ํ4…ฆๆ–๛””T่ๅMฅ""""™+๗์ูณแแแก๖’หรv‰ˆˆˆJCน?ึ=eสL™2ฅฌร """zgส6""""Mว‚ˆˆˆHๆXฐษ 6""""™cมFDDD$s,ุˆˆˆˆdŽ‘ฬฑ`#"""’นrเ\R็eo ssำฒฃTeee!<จ_รDฃ~?ะ์อฮน•_šži&a#"""’9lDDDD2ว‚ˆˆˆHๆx ›†yZ™ŠฬฒฃTๅhWz€!ี •^ึแ”*Mฮ (y~Vฟ&ฟ‡จˆˆสa#"""’9lDDDD2ว‚ˆˆˆHๆXฐษ 6""""™cมFDDD$s,ุˆˆˆˆdŽ‘ฬฑ`#"""’9lDDDD2ว‚ˆˆˆHๆXฐษ 6""""™{g[bb"VญZUเtKKห"๛Xณf ?~\j1g™ฅ-00™™™€E‹มููNNN๘๔ำO฿{,DDDT>•YมVฅ]ฐฝœœœbทอสสBjj* <<บบบx๚๔)–,Y‚3gฮ ..D\\เูณg๏$f"""า ฅVฐฝ{7†‡‡0n8ฤลลมรร๓็ฯGjj*บt้'''„††ู฿ถm….]บ iำฆ€ีซWรลล...Xนreก๓ฯœ9...pssรŠ+ค๑ฃF‚ณณ3:u๊$aำงO‡\\\0y๒dฉญฝฝ=&Mš=z}๔œแ๊๊Š 6ไYfBB&OžŒบu๋โส•+R้้้B ;;ศฬฬ„Jฅ‚นน9 s็ฮ BDD„Eฎศศศ@rrฒฺ‹ˆˆˆ4Sฉl7nDห–-ƒ่่hฬš5 ฎฎฎˆ‰‰ม„ ฐt้R888เโล‹hืฎ}ฑฑฑˆลนs็คพ์ํํCCCนs.\@\\ฺทoเๅ‘ท;v 00]ปvEตjีpๆฬxzzชลdnnŽฑcวยึึVVV่ึญฌญญ‘‘‘2dVฌX,Xฐ ศ#‹sๆฬ‰‰‰๔ฒตต-†"""ขrGปด:๒๑๑Aฟ~ T*ัฝ{wTฌXQm๚๑ใวฅฃW:uR›#ฝ/่4jTTZทn SSS/ฏ ;u๊์ํํ๓ด=pเ ]]]@ฅJ•ฆฆฆhึฌภำำS*๘๖๏฿y๓ๆ!##<ภล‹แ๎๎RฑWฃF พ}Ÿ|๒ :w๎Œ€€/Ž]ธp?3š4iRเ๚y๖์๖์ูƒทoCฉT" :u‚ณณ3 Zตj…VญZแัฃG3f lllpใฦ ฉจ{คI“0v์Xi899™E‘†*ต#lอš5รแร‡aaanบayฺ(ŠาZัำำ“+•Jไไไ ==cวŽลฎ]ปคฃqRปยาฬฬ ฑฑฑhาค พ๚kฬ˜1ภห#]mถล€๐ูgŸแ๊ีซ๙.;""ŽŽŽ011‘‘-M9~๑Gt์ุ๗๏฿วบu๋PตjีBs166V{‘f*ต‚ํึญ[ฐฒฒยะกCŒฤฤDคคคHำ5j„อ›7xyส2--ญศ>ŒŒค>|||ฐ~$''ใ๙๓็ุฝ{74h๏|-[ถฤO?$๙๔้ำ—‘žžฅR 333<}๚๙gพํ?~ !z๖์‰)SฆHG]\\ฐlู2œ={ตjีB๏ฝแ๏๏Ÿ็tญ Nœ8!]รvไศิฎ]0~xธนน!>>๋ึญCDDบw๏--ญ"ืiพR;%‰y๓ๆAWWๆๆๆุดiขขขเๆๆ†พ}๛b๘๐แ่ำงœัฌY3ตฃGR4hะ „††ย๚๕C฿พ}QฅJ9rŸ}๖5j3fLพงC—งKฃขขเ้้ mmmŒ1ƒฮทญฉฉ)z๕๊…z๕๊มฦฦพพพ๙ถ๛็Ÿะฟ! ญญ%K–จM700ภ Aƒ0hะ DGGC[[}ี๚๚๚ขE‹๐๐๐€Bก@ืฎ]ัฐaC/ ฬฏพ๚J:…KDDD๔*…(๎m‰$kษษษ011มล s˜*2ห:œR•ฃ]ั=€ืๆมะสN/๋pJ•&็”}๚`ุฐa๘่ฃp๙๒e4kึฌศถm†จจ(t้า•+Wฦ‘#Gฐz๕j|๓อ7€‘#Gโใ?ฮwธธ8๔๋ื999P(8x๐ ฆL™‚‹/ยรร&LภีซWq๋ึ-ฤววฃQฃF022‚ฅฅ%BCCัผys4hะPฉTุฑclmmqๅส๔๎YYY๐๗๗GLL "##ี–žžŽอ›7cลŠhผ9พ๚๊+ฬ˜1C๊’““ฅญฌฌ7nDXX>๘c๔ํฦฦฦEฎฃŒŒ dddHรน‘ๆ)•#l7nDห–-ƒ่่hฬš5 ฎฎฎˆ‰‰ม„ ฐt้R888เโล‹hืฎ€๋ืฏใ๐แรR๘*CCCDGGใฃ>BXX`๔่ั˜1cฮ;mm๕:๗๒ๅห3f \\\pๆฬ๐ร๘๊ซฏ๒๔;w๎\Œ3666ุฒe FŒ:t(๘ใปw|่ึญ๖๏฿ŸงBก(Eฉw๏๘ใ? ญญ \บt)฿vฏฏำำำ(•Jไไไ„๙ถmีช,X€๕๋ืฃWฏ^‡Jฅสทํ–-[ะฒeK@ืฎ]๓GŽA๑๕ื_c๒ไษ๘่ฃ ัุุXํEDDDšฉT ถ[ทnมสส C‡Epp0‘’’"Moิจ6o ุนs'าาาŠ์ำศศH๊รวว๛๗๏Grr2ž?ŽปwฃAƒ๙ฮw๓ๆM8::b์ุฑ๐๓๓รๅห—ี๚zS๎๎๎๖oาxcccŒ5 ็ฮร˜1cฐ~zิฉSฟ๒Kž>Œqๆฬภ๛Qปvmภฝ{แโโ‚  Wฏ^ธpแฆL™‚ชUซพUฬDDDคJๅฆƒศศHฬ›7บบบ077วฆM›777๔ํร‡GŸ>}เ์์Œfอšฉ"าiัAƒ!44่ืฏ๚๖ํ‹*Uชเศ‘#๘์ณฯะจQ#ภ˜1c`ooŸo,›6mย/ฟ8::ขmถะาาย‹/ค›ฤท฿~‹>}๚`๒ไษhิจQพGดš5k†fอšแษ“'๙ู[พ|9 !ชTฉ‚Ÿ`nnŽฟ๚ 666oi6…(่\ฉIKKƒพพ> fอš…์์lฬ˜1ฃฌร’$''รฤฤฟjsฝOษ–WY ]Uc$ฺ๘:"ณฌรy+สฑGิ†ณฒฒŽภภภฏฉ,ฯ49?ๆV~ir~ฬญษNJJ*๔๒ฆR9ย๖_p๊ิ)Œ3999pppŽŽฝkๅถ`{๒ไ ิฦUฎ\๏dyนฯ^#"""z฿สmมfnnฮŠˆˆˆ๘ใ๏DDDD2ว‚ˆˆˆHๆXฐษ 6""""™cมFDDD$s,ุˆˆˆˆdŽ‘ฬฑ`#"""’นr๛เ\สŸ๒ใญPš›—uฅJ™•„‡C9โ/(5่๗ใˆˆˆŠ‹GุˆˆˆˆdŽ‘ฬ๑”จ†Q5ชŠฅปY•]–”jDDDT2<ยFDDD$s,ุˆˆˆˆdŽ‘ฬฑ`#"""’9lDDDD2ว‚ˆˆˆHๆXฐษ 6""""™cมFDDD$s,ุˆˆˆˆdŽ‘ฬฑ`#"""’9lDDDD2ว‚ @ห–- ž˜˜ˆUซVIร้้้hัข<==q๐เม๕?aยธธธภษษ ฿}๗›MDDD้‚M•J…ˆˆˆBฝ^ฐ={ฦฦฦ8{๖,๓'-- ™™™ ๕ƒ“'O"66QQQXฐ`’““ฯž=+”ˆˆˆHiLมv๗๎]4npssC||<<==ัญ[7ิซW1T* jีช:t(\]]q็ฮXZZ"##ัฆMt่ะตjีย์ูณSฆLA\\<<<0|๔ํ‡‚‡‡ž{๖ {๖์มํทกT*€N:มูู …ญZตBซVญ๐่ั#Œ3666ธqใ†TิฝnาคIRม ษษษ,ฺˆˆˆ4Tฑ ถfอšแ๐แร๘๓ฯ?ัญ[7,Yฒ$ฯp~…PลŠฅ๗ …gฮœRฉ~`o๐เมุฝ{7jีช… เ๙๓็า4]]]€RฉT{_ิตiนหUฉTจVญbbb๒ดัาา’Nฟfddดตต…={๖`๚๕ุบu+พ๛๎ป๛˜3g–-[† K—.4hjีช•ง]DDabb๐๗๗Gtt4œฯŸ?วๆอ›ฑjี*`บuจZตj๙้้้AOOฏะu@DDDšกุงDoบ+++ :มมม8z๔จฺp\\ŒŒŒ’’R`M›6•nJPฉTาE๗ฉฉฉจRฅ าำำฑy๓ๆทLI‰‰ ฬฬฬฐw๏^/oธt้ภฮฮ111PฉTุนs'€—…SRR:v์ˆy๓ๆ!&&ฆะ>\\\ฐlู2œ={ตjีB๏ฝแ๏๏„„ต8lllpโฤ ้ถ#GŽ vํฺ€๑ใวKืฎ[ท่ฝปt’ˆˆˆŠ]ฐEFFยออ žžž8rไ์ํํี†?๚่#˜››รออ nnnาล๚ฏZผx1v๏ wwwธธธH7L™2|๐๓\๛Uึฏ_๙๓็ร8u๊`๊ิฉ๘฿‡FIงSRRะพ}{ธปปฃSงNาตj๕‘หภภƒ ย้ำงฑ`มhkซผ๔๕๕E‹-เแแดhั 6ดlู๑๑๑˜?>K="""*฿ขธท%’ฌ%''รฤฤฏ€นฑ~ฑๆQบ๗}วQ•Žฌฌ,„‡‡#00:::eNฉาไอฮน•_šœs+rฟฟ“’’`ll\`;า‘ฬ๛ฆ9ฺณg>๛์3ตqmถลนsห(""""ขาWฎ ถ6mฺ M›6eั;ลSขDDDD2ว‚ˆˆˆHๆXฐษ 6""""™cมFDDD$s,ุˆˆˆˆdŽ‘ฬฑ`#"""’นrเ\สK้ิ Js๓ฒƒˆˆˆJฐษ 6""""™cมFDDD$s,ุˆˆˆˆdŽ‘ฬฑ`#"""’9lDDDD2ว‚ˆˆˆHๆXฐษ 6""""™cมFDDD$s,ุˆˆˆˆdŽ‘ฬฑ`#"""’9lDDDD2ว‚ˆˆˆHๆ4ช`KLLฤชUซส: 5;v์ภ๗฿ธs็เ้้‰๚๕๋#66ถŒฃ#""ข๒เ?SฐๅไไผืXž={ุ่ฑ#FŽ ๘ๆ›o๐ัGแ์ูณ˜2e fฮœ HJJ‚โฝฦGDDDๅGน)ุ๎ฝ‹ฦรรรnnn8~ธฺp||<ฆL™‚ธธ8xxx`๙Xณf ‚‚‚เ็็‡พ}๛โมƒ่ิฉผฝฝัดiS\นrธนนกPฉT€ๆอ›cธq๐๔๔„ขขข€5j`ืฎ]ybฬฮฮฦึญ[ับukŒ1ฐfอLœ8Qj“œœ,kee8rไ๊ีซ‡นs็โแร‡๏t=Q๙Sn ถ7ขeห–ˆ‰‰Att4<จ6lgg‡ูณgรีี111˜0a 66;w๎ฤ† 0fฬLŸ>QQQXธp!ฦŽ ่ัฃNŸ>ุุX่๋๋ใฯ?”–knnŽณgฯขI“&1bvํฺ…ํทcึฌYR›;w๎`ฺดiprrยฮ;๑ล_`๚๕yr˜8q"Vฏ^ [[[L™2Ÿ9เร?ฤกC‡ผ,ƒƒƒY่๚ศศศ@rrฒฺ‹ˆˆˆ4“vYP\>>>่ืฏ”J%บw๏ŽฆM›ช ;99ๅ;_ถmadd8pเ.^ผ(Mำาาœ;wSงNErr2akk‹N:xYL€ซซ+ *Tจพ}๐๗฿ฃQฃF=z4ขขข`ll\`นEใภฑ~zŒ=7nTญZ'NฤgŸ}†;wข{๗๎ฦโล‹๓ํkฮœ9า)U"""าlๅๆ[ณfอp๘๐aXXX [ทnศสสRฟพ๓UฌXQzฏP(pๆฬฤฤฤHGๆ`๐เมXณf โโโ0jิ(dddH๓่๊๊”Jฅฺ๛kโฐrๅJ=zบuรฏฟŠฬฬฬ|c๙๑วัตkW@ืฎ]q๊ิ)ต้gฯžล๐แร1n8 8ใฦ+p}Lš4 IIIา๋ฮ;…ฎ?"""*ฟสMมv๋ึ-XYYa่ะกฦัฃGี†ใโโ`dd„”””๛hฺดฉtS‚JฅB\\ 55UชTAzz:6o\ขธ*Tจ€เไษ“˜?>8€บu๋โ›oพษำึฦฦF:ีน~ิฎ]pๆฬ๘๘๘`ธq๐๓๓ร๙๓็1w๎\ุธ\===ซฝˆˆˆH3•›Sข‘‘‘˜7otuuannŽพ}๛ยออMดiฬออแๆๆ777๔ํUชTQ๋c๑โล ลาฅK‘••…๏puuล”)S๐ม jีช๐๔๔|ใ=<<†็ฯŸ็9z๓็ฯวเมƒ1cฦ TฌX?๘#€—Gืฏ_/pDDDDฏ*7[HHBBB๒Œ{]๎5a๙ฉZต*ถm–gˆ#คป:_๕๊…๚๕S›v—chhˆ€€€<๓นนนๅ[ศีญ[ทภพˆˆˆˆสอ)Q"""ข*lDDDD2ว‚ˆˆˆHๆXฐษ 6""""™cมFDDD$s,ุˆˆˆˆdŽ‘ฬฑ`#"""’9lDDDD2ว‚ˆˆˆHๆXฐษ 6""""™cมFDDD$s,ุˆˆˆˆdŽ‘ฬฑ`#"""’9lDDDD2ว‚ˆˆˆHๆXฐษ 6""""™cมFDDD$s,ุˆˆˆˆdŽ‘ฬฑ`#"""’9lDDDD2ว‚ˆˆˆHๆXฐษœvY@ฅCHIIŽŽNGSบฒฒฒ––†ไไdๆVฮhr~ฬญาไ˜[๙“œœ เฟว ย‚MCEŸ>}`ll SSS 8ฯŸ?Yไฏจ๚๕๋—g[ถmVญ\s›3g|||`dd t๎—/_VkSœ}๑๖ํh฿พ=*Vฌ L˜0ููู๏3•<Š“[๓ๆอ๓lปะะPต6rฬ –/_777้กชพพพุฝ{ท4ฝผn7 ่ส๓v{นsกP(0z๔hi\yvฅJPนถiำ&กซซ+~๚้'qแย1x๐`ajj*}๚Tญ\skำฆXฝzต8ผˆ‰‰ขz๕๊โ๙๓็R›ข๖ล์์lแโโ"Zถl)ฮž=+ยรรEๅส•ลคI“ส"%Iqr๓๓๓ƒVvIIIาtนๆ&„;v์ปvํWฎ\—/_“'O:::โ๙๓Bˆ๒ป„(:ท๒ผ^๕๗฿ {{{แๆๆ&F%/ฯฎ4ฑ`+็๊ืฏ/†. ็ไไkkk1gฮœ2ŒชไฆOŸ.๓–˜˜(tttฤoฟ&ปt้’ Nœ8๑ž"|sฏ5*•JXZZŠ๙๓็Kใ…žžžุธqฃBˆ‹/ โ๔้ำR›ปw …B!๗฿๗{Q *ุ:u๊Tเ<ๅ%7!„x๘๐ก :$„(พ.”Jฅธพิf๙๒ๅยุุXdddผ฿ ๑znBผโ๕‹๒uๅ%ท\fffbีชUตrๅๆ&„flท””QซV-ฑo฿>ต|4qฝ)ž-ว233–-[Jใ”J%Zถl‰'N”adoๆ๊ีซฐถถF5ะงOพ}ฌฌ,ต<๋ึญ‹๊ีซ—หํทWF€fอฝ-๘{9๖๘๑cไไไจํคPตjUฤวว—QToฆAƒXณf ๊ิฉƒ{๗๎aๆฬ™hฺด)ฮŸ?๛๗๏CWWฆฆฆj๓TญZ๗๏฿/›€฿Bnฬ๙mทi๗๏฿‡………ฺtmmmTชTI๖9ทm]ปv…ƒƒฎ_ฟŽษ“'ฃ]ปv8qโดดดสMn*• ฃGFใฦแโโลฺ๏฿ฟŸ๏ถอ&๙ๅฝ{๗†ฌญญ‹ฯ>๛ —/_ฦึญ[ศ?ทธธ8๘๚๚"==†††ุถmœœœS๎ท[Aนๅปmฺด gฮœม้ำง๓Lำ”ฟนาภ‚dก]ปvา{7774hะvvv๘๕ื_กฏฏ_†‘QIK๏]]]แๆๆ†š5k"22eYษ >็ฯŸวัฃGห:”RWPnฑ๔ีีVVVภ๕๋ืQณfอ๗f‰ีฉS111HJJย–-[‚C‡•uXฅข œœœส๕vปs็F…}๛๖กB… eŽฌ๑”h9Vนrehiiๅน[ๆมƒฐดด,ฃจJ‡ฉฉ)jืฎkืฎมาา™™™HLLTkS^๓ฬนฐํfii‰‡ชMฯฮฮฦำงOห]ฮ5jิ@ๅส•qํฺ5ๅ#ท#F`็ฮ8x๐ lllค๑ลู---๓ถนำสZAนๅงAƒ ถํไœ›ฎฎ.แๅๅ…9sๆภ฿}๗Flท‚rหOyฺnัััx๘๐!>๘เhkkC[[‡ย๗฿mmmTญZตoปาย‚ญำีี…——๖๏฿/SฉTุฟฟฺต ๅั๓็ฯq๚uXYYมหห :::jy^พ|ทo฿.—y:88ภาาR-Ÿไไdœ:uJสวืื‰‰‰ˆŽŽ–ฺ8p*•J๚0./๙็๘@ิชUKคงงK}ศ5ทกC‡ ฉ๖ˆ„ดด4ฉMQ๛b๎#Zทn-bbbฤ_%ชTฉRๆ(*ทkืฎ‰/พ๘BDEE‰›7oŠ?๘CิจQC4kึL๊Cฎน !ฤฤ‰ลกC‡ฤอ›7Ellฌ˜8qขP(b๏ฝBˆ๒ป„(<ท๒พ๒๓๚]ฏๅy•&l`๑โลขz๕๊BWWWิฏ__œถ700@วŽq้า%ต๑น‹/ะซW/TชT •*UBำฆM๓ํ็๖ํธ{๗.\]]ฅq๖๖๖˜?>๊ีซ###L›6 —/_†ทท7LLL*ตUฉT˜>}:lmmaee…‘#G"##ฐfอ๘๛๛cศ!011ม๊ีซ๑๔้S๔๎จQฃึฎ][`Žฏžนs'๊ิฉ#uดiS๓?~ตkื†นน9ฦ•J%M[บt)jีช…ส•+#$$ฉฉฉศษษAปvํpใฦ ยะะkืฎล๚๕๋๑ๅ—_ยะะPส9..อš5ƒ™™ผผผ%๕ญP(ฐdษ888ภ฿฿ะฌY3์฿ฟ?UฌKY๚<QIููู‰ศศHacc#>|(>|(lllฤัฃG…Zป#GŽ!„HJJ:tำงO—ฆ''' KKK‘““#–/_.:t่ าาาDVV–8|๘pพหนsง๐๒๒สŸŸŸx๒ไ‰ธt้’ะำำญZตทo฿๗๎UซVBฑrๅJแไไ$๎น#?~,5j$ลดz๕jกฅฅ%Vฏ^-rrrDZZš ใฦ้้้โาฅKยสสJœ;wฎภ๕’›oีชUลัฃG…BปwO\ธpกภy<<<ฤฝ{๗ฤฟ+œœœฤชUซ„B๚๋ฏยลลE$$$ˆดด4ัซW/1n8!„5kึT๋+$$D|๙ๅ—าpJJŠฐถถ[ถlูููbถmยึึVผx๑B!ัฑcG‘””$าาาค๙ŒE|||พ๑W๑•KZZZ ยๆอ›ฑy๓ft๋ึ ZZZyฺตkืฆฆฆ033ร•+W0t่Piฺ๛แ็็ฅR }๚`ร† Xฟ~}งCw๏ฤฤDคฅฅกs็ฮh฿พฝ4ํี๋ื๚๖ํ‹€€t้าvvv˜3gNพ™˜˜ไ{wจ………๔^__?ฯp๎>>๘๛๏ฟe๗๐๒์๊ีซ่ท/Nœ8‘๏)Wข2lD๔Ÿ4o<Œ3:::e Q‘Xฐษฏa#"""’9lDDDD2ว‚ˆˆˆHๆXฐษ 6""""™cมFDDD$s,ุˆˆˆˆdŽ‘ฬฑ`#"""’น šขำ้ดWsIENDฎB`‚c4core-bm-charconv-xtoa-mega_bytes_per_second-u16.png000066400000000000000000000757571477602032300331210ustar00rootroot00000000000000c4core-0.2.6/doc/img/windows-x86_64-vs2019-Release‰PNG  IHDRvF>ืT9tEXtSoftwareMatplotlib version3.5.3, https://matplotlib.org/อ+นา pHYsaaจ?งi{\IDATxœํwTื๛5๐}้HUA N  `/X‰ ฑXพฑลXcITb‰ ห/b์ัุขจุฐF#(Eฑ&bขHฝ็รลผ^ฉ๗gญปไฮœ9๓ฬa€ํดซBQ…งVQู`ฐ#"""’ ;""""™`ฐ#"""’ ;""""™`ฐ#"""’ ;""""™`ฐ#"""’ ;""""™`ฐฃ ฉะืื/๏2  …Bmถ•w)ล2}๚t( &Jฅ™™™ะัั)๏RSonงœทUกP'็๎๎ŽงOŸขJ•*ุถmบu๋V`วŽรษ“'ั Aƒ2ฏฅ,๐ˆI^ฝz;;;ุููแีซWา๔gฯžกF๐๖๖FNN๚๗๏ฅK—xƒ–๛ส๕๒ๅKŒ;–––ะึึ†ญญ-ๆฯŸ!„ส๚ึฌYƒfอšมฬฬ ฺฺฺฐททว๒ๅห฿ฉๆ๙ญ[ท†žžฬออ๑w฿ๅYRฉฤขE‹เเเ 62dž?ฎาฮฺฺํท—~`utt๐ษ'Ÿเื_อณคค$Œ=ึึึะึึ†……๚๖ํ›็5ฅR‰Yณfมยย:::hผ9nธกา&๗Zฃธธ8๘๙๙กRฅJจSงŽt}ฑcวะฐaC่๊๊ยึึ‡RYึญ[6llmmกซซ t๋ึ ‰‰‰*ํยยย P(p์ุ1 6 fffฐฐฐ(ploบ…:u๊ภัั>๐๚™Wฎ\)๖ตxgฯž…ฟฟ?*Wฎ ===8;;ใงŸ~Risไศ4nzzz066FงNp๙๒e•6นง&oธ๛รุุFFF0`าาาคvŽŽŽhฺดiž:”J%jึฌ‰ฎ]ปชL{—โภ๐๐๐€ฎฎ.VฌX…B—/_bํฺตาฯ@AงVsYYYฉฌ%((111ธrๅŠ4ํ฿ล‘#GT์~rOู๎นŽŽŽะึึ†ƒƒ๖๏฿ฏาฎฐถถฮณ|๎๘็ื็ึญ[aoo]]]xyy!>>ฐbล ิฉS:::hาคIž1Wtt4ผฝฝกซซ „††ๆi“‘‘iำฆกN:ะึึ†ฅฅ%พ๙ๆdddไ[ำ† เเเmmmi7o wwwภะะNNNy๖ล7%&&ยิิ0cฦ ้{ๆ%(ลูw ฒx๑b888 RฅJจ\น2<<<ฐqใFฏว{ธqiนcXุvพ]cqv€ืพ๚๊+TญZุ่ฑ#๎ป—งฯิิTŒ5J๚gff†–-[โ๙๓R›w๙]amm๏ฯN“&MะคI้}~ืุๅ^o}๏=t๎๚๚๚055ลื_œœiนยพ—จRฅJ‘u*•J๔ำO@ƒ g ‹ฃ8๛Vฉข7œ9sFจซซ‹ัฃGKำ…ฎฎฎธz๕ชBˆำงO‹–-[ bบuาK!”Jฅhึฌ™P(bะ Abษ’%ขC‡€5j”สบ<==Eล?(/^,Zตj%ˆ%K–Ygฟ~„ŽŽŽจ[ทฎ่ำงXฒd‰h฿พฝ พ๖[•ถƒ b๐เม"44TŒ?^่้้ OOO‘™™)ตณฒฒถถถขZตjbาคIbษ’%โำO? …B\ผxQj—šš*…บบบ]TชTI4hะ@ฅ>???ann.,--ลธqใฤโล‹…ฝฝฝPWW›7oีซWำงO‹-5kึFFF"%%EZ~๋ึญยลลEL:Uฌ\นRLš4ITฎ\YXYY‰—/_JํึฌY#{{{แ็็'/^,~๘แ!„ำฆMฤใว…BธqCิชUKธบบJำฎiำฆ๙=ŠˆˆZZZยสสJL›6M,_พ\|๕ีWขE‹R›ƒ Qฏ^=1w๎\1cฦ QตjUQนreq๓ๆMฉ]n}nnnโ๓ฯ?ห–-ƒ ฤ7฿|#ต๛๎ป๏„šššx๐เJ-วŽฤึญ[Kด_ิฉSGTฎ\YL˜0A„††ŠฃGŠu๋ึ mmmัธqc้gเ๔้ำEŽK.===ัฏ_ฟ|็ๅn๏ฃG„………ส>ฝhั"add$าำำ1|๘๐"ื@ธธธˆ5jˆ๏ฟ^,ZดH|๒ษ'ขRฅJโษ“'Rป~๚ ++ซ๋yปOgggaii)~๘แ๑ร?###QซV-ฑdษaoo/,X ฆL™"ดดดDำฆMU–ฯ๏อฬฬฤˆ#ฤฯ?,5j$ˆ๛ฟ“ฺๅไไˆVญZ‰J•*‰QฃF‰+Vˆ#F ัฉSง<5ีฏ__˜ššŠ3fˆฅK—Š .ˆˆˆ@4o\,]บT,]บTŒ1Bt๋ึญภ1{๑โ…Xพ|น ค๏qllฌข๘๛n~Vฎ\)ˆฎ]ปŠ+VˆŸ~๚I|๑ลโซฏพB+z๖์)ˆQZ๗‹/ ฮyo|๗gG!บw๏.ˆ>}๚ˆฅK—Š๎ป —<} ---1fฬฑz๕j1gฮักCฑ~zฉอปฎฐฒฒส๗gมฯฯO๘๙๙I๏oผ)ˆ5kึHำr888ˆŠๅห—‹.]บbูฒeBˆขฟ—oฺบuซ Ž=šg^||ผ fฮœ),ดดดแไไ$Ž9Rไvๆz—zJ‚มŽ๒˜8qขPSSว—v๒E‹ฉด>|xž_๔Bฑs็NiวSืฎ]…Bก7nฆฅฅฅๅYพu๋ึโ“O>)ฒฦ~๚ โ๛Ÿ4MฉTŠvํฺ ---)Œœ8qB6lPY~yฆ[YY โ๘๑ใาดG mmm1v์XiฺิฉSฑ}๛๖‘ฎืญ['ิิิฤ‰'Tึ*ˆSงNฉิคฆฆ&.]บคาvไศ‘ยะะ0ฯ~_”วธฟw฿อOงN„ƒƒCกmๆอ›—gฬrดน๓๒ vE์DGG็๛๐๛็้ำศศจศ๎};โป๏พSY6๗?ีน ๛^พฉฐ`ท}๛v@˜˜˜ˆบu๋Š5kึˆ5kึˆบu๋ --ญw fลญง$x*–๒˜>}:ะฏ_? 6 ~~~๘๊ซฏŠตlxx8ิีี๓ด;v,„ุทoŸ4ํอk”’““๑ไษ๘๙๙แŸ)๖Eจo˜{z"33S:]นu๋Vกeห–x๒ไ‰๔rww‡พพ>Ž=ชาŸฝฝ=7n,ฝ755…ญญ-๙็iฺ๏ฟไฉ็ํำU €–––๔>ท๏7๛}}}J๏mmmallŒ๚๕๋ฃaร†า๔ฏ฿\อqฬสสยำงOQงNซœษ5x๐`จซซ็™/^„ŸŸฌญญq่ะ!Tฎ\Ye~“&M „(๒”ม… p๓ๆMŒ5 ฦฦฦ*๓rว่มƒˆ‰‰AUNƒ8;;ฃeห–ฯำoppฐส๛ฦใ้ำงHIIิซWฎฎฎุฒe‹ิ&''ถmC‡คฑzืยฦฦญ[ท.t›+AAAธqใฮ;'๛.งasตhัตkื–;;;ระะ0ฯพ๘.š7oฎr๊6w์าฅ ๒L{]2dˆ๔^KK C† มฃG เ๕๗ช~๚ฐณณS๙^5kึ ๒|ฏ`ooฏ2อุุ/_พฤมƒKผญo*ษพ๛v=w๏ลนs็J\C~Y˜ข~vrOๅ6Lฅ๗ฟ<}ใ์ูณธ~๋+๎๏Šฒ’฿๖•f฿ฮฯ‹/ผ>}๘๐a๔๏฿๛๗วกC‡ „ภนsหt}%ล`Gyhiiแ—_~มอ›7‘ššŠ5kึ๛บ [ทnม\ๅ—:ิฏ__šŸ๋ิฉShัข…t}Šฉฉ)&Mšล vjjj๘ไ“OTฆีซWคkQฎ_ฟŽไไd˜™™มิิTๅ๕โล z๔=z๔ฺผ๋~Qุ˜ื`gg‡7bร† จ^ฝบjEq๖ํา๖™ปgฟss๓<7๏ไ๗3|้าฅ<฿งvล๙^ 6 ๕๊ีCถmaaaๆนพ๐]”d฿}ำ๘๑ใกฏฏ  nบ>|8N:๕N5ผ๋>Yิฯฮญ[ท ฆฆ–ง฿:u๊ไ้k๎นธx๑",--ั ALŸ>ฝฬCิปะัั‘ฎYหUฺ};?น1๔๑๑Qูวkีช…Fแ๔้ำeบพ’โ]ฑ”ฏาำำq๚๕2ร๖๗฿ฃy๓ๆฐณณรย… aii ---„‡‡ใว„Rฉ,“๕(•J˜™™aร† ๙ฮ๛—AAGฒฤ[7dWq๛+จ]q–฿‡5kึ`ิจQ๐๒๒‚‘‘ ๓วย๎ๆ์าฅ ึฎ]‹ 6จI๙Pg>>e๖วนvํฺธx๑b™๔Uถm†~๚aม‚าด๔๔๔=ุtผyะะะภฐaร```PขS~คS~/^D‹-๒m“ป/\ฝz5ฯผ+Wฎ jีช%z‹ 4h€-[ถ`ฤˆุพ};:w๎ mmm•๚สbฟx—;\K#((SงNลƒฐnบl=•+Wฮwฟy๓H{Yบ~žG๎ไ๗3‹ๆอ›—jผตดดะกCt่ะJฅร† รŠ+๐ํท฿ๆ{T (๗Pบ}WOO=z๔@=™™‰ฯ?ณfอยฤ‰กฃฃ๓๖ญ\VVVP*•ธy๓&๊ึญ+M๛.\5jิภฐaร0lุ0ยเำO?… -Z”gŒskญQฃ\]]ฑvํZ•6/^DDD฿น\=z๔ภ™3g๐ห/ฟเษ“'*งaฒ/๔๔๔ห'ิฎ]‹-BHHศ๚์ฌฺตk#99qqqาดไปฏ—…์์lฌXฑBzŸ™™‰+Vภิิ๎๎๎^ฏ๎ป‡UซVๅYีซW…ž๒ฬ๕๔้S•๗jjjpvv€<LySฅJ•ไ=Wฺ}๗ํzดดด`oo!ฒฒฒ;๖ฟ’{ ้ฒeหTฆ/^ผXๅ}NNNžK<ฬฬฬ`nnฎ2–๏๒ธ“ฺตkใฬ™3ศฬฬ”ฆํูณ'฿O])ฉ‚พ—๏ยภภ8}๚ดส#ˆ._พŒำงOฃeห–๏ตž‚๐ˆฉ˜9s&bbbp๘๐aภููSงNล”)SะตkW้V๎/ฏพ๚ ญ[ท†บบ:ักC4mฺ“'OFbb"\\\]ปvaิจQา‘œVญZIƒ2d^ผxUซVมฬฬ <(Vญ:::ุฟ?๚๕๋‡† b฿พ}ุปw/&Mš$ฯษฯฯC† AHHbbbะชU+hjjโ๚๕ุ๋บu+~๚้'•g›วธqใค‡X8๎๎๎x๖์v๏ะะPธธธผSฅีพ}{ฌ[ทFFFฐททวŸ‰C‡มฤฤคDฉฉฉa๚๕่น3บw๏Ž๐๐p้šฎฟ๚ M›6ลดiำ ฝ(ZMM ห—/G‡เ๊๊Š Fธrๅ .]บ$๊Ÿ7oฺถm ///|๑ลx๕๊/^ ##ฃR]tฝ{w|๕ื๘๚๋ฏQฅJ•๘ํท฿ŒฃGยวว999ธrๅ ~๛ํ7้๙‚…4hž={†fอšมยยทnยโล‹แ๊๊*]›]]]ุcห–-จWฏชTฉGGG8::–j฿mีชชWฏTซV —/_ฦ’%Kะฎ];้LG๎๏ุษ“'#00ššš่ะกร๖@qwwwt้า‹-ยำงO๑ูgŸแุฑcาิ#Lฉฉฉฐฐฐ@ืฎ]แโโ}}}:t็ฮS9kP฿ภ๋๏ฯถmะฆMt๏7ึฏ_ฏrณOi๖ฝ ^บt ฐn:œษc๖์ู8|๘0š5k&$๘๓ฯ?ฃJ•*า5โeQOฉ”๙}ถTaEGG •Gˆ๑๚ัžžžย\ztEvvถ๘฿'LMM…BกPyBjjช=zด077šššขnบbผy*นBˆปw gggกฃฃ#ฌญญลœ9sฤ/ฟRเ-o๊ืฏŸะำำท๔Œซjีช‰iำฆ‰œœœ<ํWฎ\)…ฎฎฎ000NNNโ›oพ๗๏฿—ฺXYY‰vํฺๅY๖ํ[๎…โ้ำงbฤˆขfอšBKKKXXXˆ~๚Iฯหฝีอ็ฆ ‘ํ๚~~~๙>๚  z๐ึ#.ž?.  ชVญ*๔๕๕E๋ึญล•+W๒>>BWWWŠ:ˆ„„„"๋{s›๒_|||1hะ ๋+อ~!ฤ๋วา๘๚๚ ]]] ศGŸไ>š!ฟื›๛DA๛ถท๗…wm—฿c&"""„ฃฃฃะาาถถถb๚๕>๎ไํ>s๗๏y๓ๆฉLฯ๏็!wฟŠŠ^^^BGGGXYYๅ๛หฬฬL1gฮแเเ ดตตEๅส•…ปปป˜1c†HNN.r;ทm&Zตj%ฬฬฬ„–––จUซ–2dHž็ๆ็๔้ำย]zfู›๛~q๖ฌXฑB๘๚๚ กญญ-jืฎ-ฦงฒ-B๑๗฿‹š5k 555•ผฐ๏๛5พหฯฮห—/ล๐แรE•*U„พพพ่นณ๔กg^fddˆqใฦ ้็ฺลลEzf\ฎw]ฑ`มQณfMกญญ-|||DTTTฑwขงง—งฟ๖ูยพ—\ๆ“ขฃฃE‹-„žžž000:uืฎ]+ึvทžาPQ็Žˆˆˆ่ƒ777ฌ_ฟฝz๕*๏rจxฉ|”dฎE‹AMM พพพๅP•ฏฑ#"""ฬ;ัััhฺด)444คGร|๙ๅ—y+C๙หษษมใว mฃฏฏ}}ฌžŠ%"""˜๙คฬžฯ—;""""™เอDDDD2ม`GDTLw๎ŽŽฮ;`๛‡,22 …‘‘‘ฅ๎ซI“&e๓€ีภgŸ}†oพ๙ฆผห zg vD๔^………AกP@กPไ{-Š–––P(h฿พฝสผๅr_zzzฐททวฬ™3‘–––๏๚โใใกP(๐ื_•บ๖๏พ๛ 6„Oฉ๛ขโ™={6v๎™g๚้ำง1}๚๔์#ทฦฅK—โ฿O๚'๚ฏ0ุQนะััมฦ๓L?v์๎ฝ mmํ|—kูฒ%ึญ[‡u๋ึaม‚pssรท฿~‹~๚ๅ~๏ฝ033ƒงงgฉ๊}๘1ึฎ]‹เเเR๕๓ก๑๕๕ลซWฏ>ุ็”์fฬ˜๑ŸปN:มะะ0ฯgง}่x2• lบ?ณสฃ6nww๗?<ผ^ฝz่ปท๔>88™™™ุพ};าำำกฃฃฃา><<mถ•>๋ฒคึฏ_ t่ะกT”ฅ—/_–๚ณCีิิ๒Œูว,-- •*U‚ššบvํŠ_3fฬ(๕C๔พ๐ˆ•‹ž={โ้ำง8x๐ 4-33ถmCPPะ;๕Uฝzu(Š<ฯฺJJJย้ำงัฎ];iฺๆอ›แ๎๎ยษษ ?๔S‘ุ๋นs'6l˜็มขนื•ลลลมฯฯ•*UB:uฐm6ฏ@6lุบบบฐตตลกC‡๒๔}แยดm†††ะืืG๓ๆอqๆฬ•6นงฐ;†aร†มฬฬ า}๛๖กqใฦะำำƒฺตk'} ya๒ปฦ๎๚๕๋่าฅ ชWฏXXX 00ษษษE๖ััั๐๖๖†ฎฎ.lllšงMFFฆM›†:u๊@[[–––๘ๆ›o‘‘!ตQ(x๙๒%ึฎ]+~๏฿ฟ?ฆOŸŽqใฦlllคy‰‰‰าฒ๋ืฏ‡ปป;tuuQฅJโฮ;*5ไ~๏ขฃฃแ๋๋‹J•*ฉ|{ห–-q๋ึ-ฤฤฤkป‰> vDT.ฌญญแๅๅ…M›6Iำ๖ํ‡ไไdธ\zz:ž44TงN’ฆ้้้‰~๚ๅYืผy๓q๓ๆM•้‰‰‰B]]]ฬš5Kez||ผะะะP™ž[ohhhคฅฅ%†Zไถ}(xฤŽˆสM๗๎๑๊ี+์ูณฉฉฉุณgO‘งa;u๊„ƒโเมƒุตk&Nœˆ๛๗#((โ็ญ+•J์฿ฟ_ๅ4ฌฑฑ1^พ|ฉr๚ท8ž>} จ\นrพ๓๕๕๕UŽ2ฺฺฺยุุ๕๋ืGร† ฅ้น_๓ฯ?^ฎdDD:w๎ฌ๒$๚5j (('OžDJJŠสบ uuu้มƒ‘””„ž={JG2Ÿ”J%๎นi๚ŸCy๚uBั คฝฤฯˆ๛ใ?...€‡โ๙๓*งaญ\.5558;;€สc6ฆฉฉ DEE•จพ‚จซซฃUซVุตk—สซ>ฤฦัจQฃ"Oฅถn†††˜={6ฒฒฒ๒ฬ๘๑;ี”’’"ๅ\NNNPSS+tŒreggcลŠา๛ฬฬLฌXฑฆฆฆา]ฆปwวฝ{๗ฐjีช<หฟz๕ /_พ”๋้้ๅ{7nnp|{็Ÿuuuฬ˜1#ฯ‘Q!Dž} 0นืz{{{ข๒ฦ#vDT๎ ๚ิˆ\ปv ๋ืฏ๐๚aฒgฮœมฺตkQงN๔้ำภ๋ำฐ:::*ฎ€Aƒแูณghึฌ,,,p๋ึ-,^ผฎฎฎE•้ิฉ&OžŒ”””wพnญ03gฮฤมƒัจQ# 6 Xฑb2220w๎"—744ฤ๒ๅหังO|๚้ง „ฉฉ)n฿พฝ{๗ยววK–,)v=GŽมˆ#ะญ[7ิซWูููXทnิีีัฅK—"—777วœ9s˜˜ˆz๕๊aห–-ˆ‰‰มส•+ฅ๋๚๔้ƒ฿~๛ มมม8z๔(|||““ƒ+Wฎเท฿~รเแแเ๕#G:„… ย666hุฐก'OžŒภภ@hjjขC‡จ]ป6fฮœ‰‰'"11;w†nผ‰;vเห/ฟฤื_]ฌฑ8x๐ jีช77ทbQน+ฟr‰่c๔ๆใN Sœวจซซ ๑ๅ—_ЇJํบvํ*๓๔นm6ัชU+aff&ดดดDญZตฤ!CฤƒŠฌ๛แร‡BCCCฌ[ทNeบŸŸŸppp(Vน0|๘p•i็ฯŸญ[ท๚๚๚ขRฅJขiำฆโ๔้ำ*mŠทฃGŠึญ[ ###กฃฃ#jืฎ-๚๗๏/ขขข ฎทw๒ฯ?ˆŠฺตk QฅJัดiSq่ะกB๛โETT”๐๒๒:::ยสสJ,Yฒ$OฬฬL1gฮแเเ ดตตEๅส•…ปปป˜1c†HNN–ฺ]นrE๘๚๚ ]]]@ๅั'฿ฝจYณฆPSSห๓่“฿]4jิH่้้ ===agg'†.ฎ^ฝšงไไไˆ5jˆ)SฆนD…ฅธŠ—ˆ่“ „„„`ุฐaeฺ๗_|kืฎแฤ‰eฺ/}xv๎‰   ๗฿จQฃFy—CTl vD$+=ยฒeห0dศ2ƒ|๛๖mิซW‡†O™๖M///4nธXงร‰>$ vDDDD2มปb‰ˆˆˆd‚มŽˆˆˆH&์ˆˆˆˆd‚มŽˆˆˆH&๘€โˆRฉฤ๛๗a``ภต&""ช „HMM…นน9ิิ ?&ว`๗น~ฉ>\›ˆˆˆสฯ;w`aaQhปˆเๆอ›จRฅJ9WS๑dee!""ญZต’>‰Š‡cWrปาแ๘•วฎไสz์RRR`ii)/ ƒG$๗๔ซA™~ึๅว"++ •*U‚กก!ษฝ#Ž]ษq์J‡ใWrป’๛ฏฦฎ8—Q๑ๆ """"™`ฐ#"""’ ;""""™`ฐ#"""’ ;""""™`ฐ#"""’ ;""""™`ฐ#"""’ ;""""™`ฐ#"""’ ;""""™`ฐ#"""’ ;""""™`ฐ#"""’ ๒.€ฟึ‹NAฉฅ_eT8Zjฦs#Sฉ(๏r*Ž]ษq์J‡ใWrปwwfๅ]ุษƒ‘L0ุษƒ‘L0ุษƒ‘L0ุษƒ‘L0ุษƒ‘L0ุษƒ‘L0ุษฤ์บvํŠฯ>๛ฌฬ๛ฝ{7~๙gภฮ;qใฦR๗ˆศศศR๗S\kึฌAบuกP(žžฎ2/$$ถถถจ_ฟ>ยยย[MDDDTฑiW}† &เ์ูณุฝ{7†WWWคฆฆโฏฟBใฦ๑้งŸข[ทnHKK+pฝ฿~๛-lmmัชU+<}๚Tšพw๏^|๖ูgpuuEpp0”Jeพ๙ถฤฤDLš4 vvvธvํภฺฺZ:"—[78::ยฦฦ&฿ฑ?~<ิีีกP(`jj ุดi\\\ฐt้Rคคคk\322’’ข๒""""๙*uฐ‹‹‹ราฅKq๊ิ)ฤฦฦbไศ‘Xธp!๚๕๋•ถกกก DEEaะ Aœ>})))ะาาย้ำงัััpww—ึณgฯlธQ๊ฏaร†ุ่ฑ#–.]Š˜˜hkkcธqุฝ{7ฮŸ? `ูฒe๙ึื_แเมƒธx๑"ึฌYƒ3gฮžNœ8๘์ณฯp๘๐aฝ{๐๔้Sฝ{7ฯv>{๖ ภ๋kๅ–-[† . nบ BำฆM‘˜˜ฐฒฒBLL ”J%๖์ูSไ๖ดo฿วŽ๐๚hจ ""ŽŽŽ˜?>z๖์‰K—.a๒ไษจVญZ‘}ัวกิมฮัั#FŒ€ทท7\\\ <ฒ|๐๚tฌฉฉ)tuuแใใƒ{๗๎ฉฑ+H`` ฆM›WWWddd`ใฦ†‹‹ ผผผ v 4@๓ๆอแ่่ˆHง^อฬฬฐt้Rt๊ิ ฮฮฮhีช=zTไv๊้้aะ A8w๎ๆฯŸ ืCงL™‚พ}๛ยๆๆๆR๛ฐฐ0XXXเ๎ปจSง&Nœเ๕$งOŸ†““fอš%Hbbb‚๛๗cืฎ]๐๗๗‡šAHDDDชBQEะ๛‘’’###ธOูฅ–~y—Sแhฉ Lt|‹๚ศT*Š^€$ป’ใุ•วฏไ8v๏๎ทอผ~์Yxx8กฉฉY๊~s~'''Kื๚„‡}ˆˆˆˆdโ?{@๑‡คaร†yn\๘๋ฏฟ ฅฅUN•ฝ"ุ={ถผK """๚ฯ๑T,‘L0ุษƒ‘L0ุษƒ‘L0ุษƒ‘L0ุษฤG๑€bRu`”LLLสปŒ '๗ณN|ใ[&Ÿ๗1แุ•วฎt8~%วฑซ˜xฤŽˆˆˆH&์ˆˆˆˆd‚มŽˆˆˆH&xGh๒๋ะจ๔จผหจpิ‘ƒfjภื{ฎ"๊ๅ]N…ยฑ+9Ž]้pJŽc๗๎–ิ/๏xฤŽˆˆˆH.์ˆˆˆˆd‚มŽˆˆˆH&์ˆˆˆˆd‚มŽˆˆˆH&์ˆˆˆˆd‚มŽˆˆˆH&์ˆˆˆˆd‚มŽˆˆˆH&์ˆˆˆˆd‚มŽˆˆˆH&์ˆˆˆˆdขยปฎ]ปโณฯ>+๑๒IIIXฝzuVT<ทo฿†tttช2๏นs๐๐๐€ƒƒ:t่๐k#""ขŠIฃผ (ƒB]]ฝT}ไปAƒ•QUฏ=•+W.pพกก!.\ˆปwซLฯสสยเมƒฑm6ิฉS=dff";;•*U*ำ:‰ˆˆH>*ฬปUซVมษษ ...˜6mฒฒฒ0{๖lL™2ฅXหGFF"00Pz฿คI\นr“'OF||<\]]1o<คฅฅกgฯžprr‚ฎ]ป๘๓ฯ?แๅๅ7774kึ <ศณŽ๔๔tฌ]ป˜7o`๚๔้*GไชWฏ066Fร† กฉฉฉาวเๅๅ…:u๊ฬฬฬผŠŽŽŽ๘๊ซฏPa#""ขH…vqqqXบt)N:…ุุXŒ9 .Dฟ~``` า644T RQQQE‰›5kœœœƒqใฦaษ’%055E||<&OžŒaร†p๒ไI\ธpมมม˜;wฎิวีซW1z๔h8::โ๙๓Xตjfฯž]ขmฝ~:222ะฌY3xxx`ถm€jีชแาฅK๐๐๐ภ!Cเ็็‡7"##ฃภพ222’’ข๒""""๙ชงbsถ^ฝz…ˆˆ:tทnRi,}ํแแ๑ฮืฯ>}“&M๘๛๛c๐เม^1๋ป7nผ‰์์lิชU ๐๛๏ฟ#00ณfอยล‹กฃฃSโํ€œœœ={๙'222เๅๅ___˜™™AWW}๛๖E฿พ}q๑โE๔ํ!!!ˆฯทฏฬ˜1ฃT๕QลQ!Žุฝ-&& ฐฑฑAฃFpแยt์ุฑะeิีีกT*ฅ๗…้สฯิฉS๑๙็Ÿ#>>๋ึญ“–oูฒ%ๆฯŸ 6 gฯžWYฯ›๋-ฮ:อออัดiSยิิ๎๎๎ธz๕ช4ฝ{๘๛๏ัญ[78::bๅส•๖5qโD$''Kฏ;w๎ผำ6QลR!‚]ณfอฐy๓f้Tข——}zพmsฏฏ FTTBCCฑz๕jXYYกy๓ๆppp€ณณ3&&&pvv†ณณ3๚๔้ƒ#Fเ‹/พ€ณณ3 ฐfอภื_@__ญZตสwพพพ๐๕๕ลำงOq๙๒eภ็ŸŽ_~๙ฮฮฮฺฆฅฅก^ฝzHIIบบ:ๆฯŸ7n jีช0`\]]กฆฆ†ฑcวยษษษ3f š4iRFฃJDDDrฃBˆ๒.‚””aศ๚?กQษจผหฉpิ‘ƒfjใˆฒ6rPบว์|l8v%วฑ+Ž_ษq์’€๚^?บ,<<yž~Qนฟ“““‹<๛V!NลQั์ˆˆˆˆd‚มŽˆˆˆH&์ˆˆˆˆd‚มŽˆˆˆH&์ˆˆˆˆd‚มŽˆˆˆH&์ˆˆˆˆd‚มŽˆˆˆH&์ˆˆˆˆd‚มŽˆˆˆH&์ˆˆˆˆdBฃผ  ๗oV›บ011)๏2*œื๊7ๆทท-“u˜p์JŽcW:ฟ’ใุUL&ป’ใุ•วฏไ8vุษƒ‘L0ุษฏฑ๛E'ฆภเนzy—Qแ(sฒ“ 5u่ผ Ž]ษq์J‡ใWry์ผ๊—w ๅ†G์ˆˆˆˆd‚มŽˆˆˆH&์ˆˆˆˆd‚มŽˆˆˆH&์ˆˆˆˆd‚มŽˆˆˆH&์ˆˆˆˆd‚มŽˆˆˆH&์ˆˆˆˆd‚มŽˆˆˆH&์ˆˆˆˆd‚มŽˆˆˆH&์ˆˆˆˆdข\‚]ืฎ]๑ูgŸู.11ถm+ณ๕NŸ>กกกeึ_iผz๕ อ›7‡พพ>&L˜ 2๏ฦ๐๕๕…ƒƒสฉB"""ชh{ฐ;x๐ ิีี‹ีถฌƒ]iไไไผS๛็ฯŸ:_CCSงNลผy๓๒ฬ0`ๆฯŸK—.แภล๎“ˆˆˆ>niฐ[ตjœœœเโโ‚iำฆ!++ ณgฯฦ”)SŠตไษ“qเภธบบbร† x๘1ฺถm '''ดn>,pู+Wฎภฯฯ...hุฐ!222ัััhิจjืฎˆˆภ฿FแำO?…——._พ  Cืฎ]แ็็‡>}๚เ่ัฃprr‚ซซ+|||๒ฌ3;;ทoGซVญ0bฤฉ7ศY[[#==ššš๐๓๓ƒฎฎฎJ/^„พพ>4h033“ๆyxx`ภ€8{๖lฑฦ/##)))*/"""’ฏ,ุลลลa้าฅ8u๊bcc1rไH,\ธ๚๕ƒJะะP้iTT ˜5kZทn˜˜๔๊ี ำฆMCห–-N:a๒ไษฎฟOŸ>˜>}:bccMMMภญ[ทp์ุ1๖o˜1c F8|๘0ฮŸ?Ÿ~๚ “&MRูŽ={๖`ใฦXธp!~๙gฤฤฤ <<\js็ฮL:๖๖๖ุณgพ๛๎;lุฐกDใv๚u่๊๊ข]ปv๘๔ำOฑdษiีซWัฑcGLŸ>Xฑb^ผxQ`_!!!022’^–––%ช‰ˆˆˆ*†,ุEFF"00†††^_S~๚ๅiŒเเ`ฏJญ^ฝ:฿>OŸ>ฝ{z๗๎SงNๅ.%%ฉฉฉhฺด)ภศศjjฏ7ต]ปvPWW‡››ผ>ฒ5`ภ8::b๐เมHHH๚jำฆDฝฝฝ๑อ7฿`ษ’%าภฟ๚ 666HKKCTT~๙ๅ—b]?Xœœœ šš*ฝ๗๖๖ฦ–-[7nDฃF๒]ฮะะFFF8z๔( 99Y%\ฝ-%%ีซW‡Bก@XXXํ๙็ธบบโoฟ…ตต5๎น 8gฮœมผy๓pไศุููaม‚+++้ˆ_U่uะ Aฟ)))ศฮฮฦฉSง`kk  ‚——RRRฐo฿>์ุฑmฺด)ด?"""๚xgมฮัั#FŒ€ทท7\\\๐๓ฯ?ุถ k์œ๑๊ี+้ๆ‰้ำง#<<ฮฮฮุพ};fฮœY`Ÿฟ๚+ฆM›ดiำYYYถ ฦ’%Kเ๊๊ช$฿ถpแB888ภููvvvpqqQ™๏๊๊ŠะะPฤลลมีีะจQ#่๋๋ร๗งr›ณณ3ฦŒƒeห–มยย?†††fฬ˜oooธบบขeห–าAAAธrๅ ฆN ss๓๋$""ข“B!สปz?RRR`dd„Qภภจry—Sแ(sฒ๑ไส)Tต๓šบFy—Sกp์JŽcW:ฟ’ซศc็Uวธ\ืŸ••…๐๐p๘๛๛K7o–F๎฿๏ไไไ"/ซโ'OษD…vณfอ‚ซซซส๋Cyจ1ั๛TฑŽญๆc๒ไษ…>ฯŽˆˆˆ่cQแุัk vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2QแPL๏ฮฺ&&ฦๅ]F…“••…๐+@ƒOŒสไณ>&ป’ใุ•วฏไ8vุษƒ‘L0ุษฏฑ๛= ถEฆ"ณผหจpr4t€ซ๐ฐ_Mจgง—w9JEปฟฅ”w DDฅย#vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2๑Ÿปคค$ฌ^ฝบภ๙ีซW/ฒฐฐ0”–uuu•พ4h่<<<ฐcวœ8qw๏ลฌYณp๒ไI๙็ŸXธp!๓ญeฯž=8u๊ฮŸ?ธธ8t๋ึ ๐๐แCt้า—.]‚Rฉฤ‘#Gผ{็ฮC\\โโโ+๕emm˜˜่๋๋ใฮ;ธt้โใใฅ#i999ุฝ{7๑๙็Ÿฃfอš8ภภ@@งNPฉR%i^LLŒ๔๕๊ีซแแแ‘งจจ(ดjี ฦฦฦ000€ฟฟ?ฮž=›o-GŽมภกฅฅจRฅ ภุุพพพ777)>|žžžpuu•Nƒๆส …Ÿ|๒ n฿พ๏8|๘0ŒŒŒ;wฦจQฃ0iา$œ?ร‡—ๆ•DNNrrrp๎9aไศ‘าภ๋ฃbmฺดมภ1~x\ฟ~]e๊๊๊P*• าoAฬออันsg@@@€สัC8qโ €9sๆ`าคI่ปwกkhhจ๒""""๙*ณ`w๋ึ-ิจQC‡E`` ’’’šš*อ๗๖๖ฦ–-[ผ>Uš––VdŸRžžž8|๘0RRR๐โล ์ท 6ฬwน-Zเ—_~Aff&เูณgฎ#==jjjจ\น2ž={†?๘#฿vOž<=z๔ภไษ“ฅฃŒŽŽŽXถl.\ธ€บu๋"((M›6•ŽZYY!&&Jฅ{๖์)r›ทocวŽ"##aggˆˆˆ€ฃฃ#ๆฯŸž={โาฅK˜ฝz๕‚ƒƒ|}}U‰ซซซ” „เเ`xxx ่ำงLMMqโฤ Œ?€ัฃGรฺฺ:฿Z777hhh`ฤˆJ !„(๏"่HII‘‘บšภX‘YๅT89:ˆ๎ฑ ๎[C=;ฝ่HRQฦฎฦoใYYY‡ฟฟ?455หปœ ‡ใWrป’+๋ฑห๛œœ\ไeUไ """"™(ณSฑๅแ้ำงhผนสดชUซโะกCๅTQ๙ฉะมฮฤฤDๅQ)DDDD3žŠ%"""’ ;""""™`ฐ#"""’ ;""""™`ฐ#"""’ ;""""™`ฐ#"""’ ;""""™จะ(ฆ’1 ฝ “๒.ฃยษสสยรQmํ=~nโ;โุฝบu๋†—/_BฉTขnบˆ‡ซซ+z๕๊…aร†กw๏ธz๕*|}}‹์oวŽˆŠŠB@@ชVญŠ'N`อš5Xฐ`เซฏพย—_~™๏ฒ๑๑๑่฿ฟ?rrr P(p๔่QLž< puuลธqใp๚uบu Wฎ\ทท7 PฝzuฃI“&hุฐ!:ฅR‰ปwราาืฎ]CPPฒฒฒะดiSฤฤฤ 22Reุ้้้ฒe VฌX&Mš`๖์ู˜>}บิ7๐๚hๅฟ ccc4lุ๛๖ํS้ใภ๐๒๒B:ufff^E///ดo฿มมมฐทท/r322‘‘!ฝOII)r"""ชธสไˆฆM›ะขE ฤฤฤ ::3gฮ„““bbb0n8,]บ666HHH@ถm๑๐แCiYWWW้๋AƒIฮรร;v์ภ‰'p๗๎]ฬš5 'OžฤŸ‰… "111฿ZVฎ\‰#F &&งN‚พพ>fอš…ึญ[#&&ฝz๕๗฿8~ธ฿คฏฏ่่h๔๎[:M:jิ(LŸ>ฑฑฑะะPอรWฏ^ล่ัฃแ่่ˆ๓็ฯcีชU˜={v‰ฦ๒๚๕๋ศศศ@ณfอเแแ!iฌVญ.]บ 2~~~ุธqฃJp{[HHŒŒŒค—ฅฅe‰j"""ขŠกL‚งง'ึญ[‡3fเ๚๕๋ะีีU™๚๔i:u๊„J•*I๓bbbคฏWฏ^ }๚`๘๐แ่ีซเ๋๋‹jีชIหบบบJมgะ A†‡‡๚๗๏>}๚ภิิ'Nœภ๘๑ใแํํ =z4ฌญญ๓ญe๓ๆอXฟ~=455QงNดiำ๊๊๊x๕๊•t๓DI๘ใ่ีซ&Mšoo๏|~๙๚๚ยืืOŸ>•Ž~๙็๘ๅ—_เ์์Œ€€ฉmZZ๊ีซ‡””จซซc๙ธqใชVญŠภีีjjj;v,ฬออ‘œœŒ1cฦ I“&%ชŸˆˆˆไO! :วH*าาา ซซ …B™3g";;ำงO/๏ฒIJJ ŒŒŒ๐hถ/Lด•E/@*ฒZุษWh๓ฯฯะ™ๅ]N™Qsโ?_GVVยรรแ๏๏_เตญ”?Ž]้pJŽcWre=vนฟ“““‹ผฌชLŽุ} ฮž=‹ัฃG#''666๘๕ื_หป$""""6ุ=}๚อ›7W™VตjU:t่?Y_๎ณ๋ˆˆˆˆ>T6ุ™˜˜0hฝแ?๙H1""""z์ˆˆˆˆd‚มŽˆˆˆH&์ˆˆˆˆd‚มŽˆˆˆH&์ˆˆˆˆd‚มŽˆˆˆH&์ˆˆˆˆdขย> ˜JNํหํP31)๏2*ตฌ, <j#๖CŸ›HDD ฑ#"""’ ;""""™เฉุrd(+ท฿zต€%iDDD”ุษƒ‘L0ุษƒ‘L0ุษƒ‘L0ุษƒ‘L0ุษƒ‘L0ุษƒ‘L0ุษƒ€-Z:?)) ซWฏ–งงงฃYณfpssรัฃGKผิชU ีซWW™ฎT*1jิ(ฺฺุยฮฮ%^}<>๊`'„€RฉฤกC‡ m๗vฐปpแ qแย4mฺ4฿eาาา™™Yhฟ-[ถฤ™3g๒L_ตj”J%ฎ^ฝŠK—.มรร๐๙๓ข6‰ˆˆˆ>bฒ v๗๏฿‡\]]แ์์Œ+Wฎภออ ]บtA๚๕๑ๅ—_BฉTชUซ†กC‡ยษษ w๎‘Ž˜EFFขu๋ึ่ะก๊ึญ‹Yณf&OžŒ๘๘xธบบbผy่ำงŽ;WWW<}๚TฅŽK—.แ๛ค ๖ๆน้ำง#44เแแss๓<ฒjี*Lž< ฎฎŽ*Uชๆอ›๚๋ฏHOO/rL222’’ข๒""""๙’MฐดiZดh˜˜DGGCธธ8|๛ํทHHHภ“'Oฐ}๛vภฃGะนsg\ผxVVV*\ธpaaaˆEhh(^พ|‰Yณfมษษ 1117nVฏ^ึญ[#&&&&&ศศศภ† เ๋๋‹เเ`xzzโ๒ๅหจVญZ‰ถๅมƒ๘๙็Ÿแ๎๎Ž   $%%fฯž•+W"::NNN3f ฎ^ฝZ`?!!!022’^–––%ช‡ˆˆˆ*ู;OOOฌ[ท3fฬภ๕๋ืกซซ [[[ธบบBกP 00'Ož u๋ึ๙๖ใใใTชT 666ธ~‘๋๖๐๐ภย… ฑlู2œ8q}๛๖…ŽŽN‰ท%99666ˆŽŽ†ฃฃ#พ๛๎;ižƒƒ~๚้'ฤววฃz๕๊pttฤ๏ฟžo?'NDrrฒ๔บs็N‰k"""ขŸl‚ฏฏ/Ž?333t้า‡†Bกๆ+ ้}ฅJ• ์G[[[๚ZMM 999Eฎ{ๅส•ppp@ทn0sๆLปwOe›udddูŸนน9:w๎ @llฌ4OฉT"<<={๖ฤ† 0|ดlูฒภm144Ty‘|ษ&ุบu 5jิภะกCˆิิT\นrqqqBเท฿~CฃFJิทRSS œ๏ๅๅ…_งN‚žžZทnŽ;"99 งง‡ปw๏"##ฃXwธถo฿วŽ๐๚บ?;;;ภ๚๕๋akk‹ 6`ฬ˜1ˆลศ‘#ุˆˆˆ€Œ‚]dd$œแๆๆ†'N QฃFpvvฦŒ3Pฟ~}Tฎ\%๊ฤฤฮฮฮpvvฦผy๓ lWฅJŒ=/^ฤ˜1cค้3fฬ€ŸŸZตj[[[i๚ฬ™3aaaวรยยห–-๐๚๊๒ๅหแ์์Œ;v`๊ิฉkkkœ9s6l@ใฦKด-DDD$_ๅ]@Y้ืฏ๚๕๋'ฝOLL„ถถvพืŸ๛๏ฟ๙พoาค š4i"MŒŒ”พดi“ส2oถหฯ›๓{๕๊…^ฝzๅi3eสL™2%ฯtSSำ|มRา#ŽDDD๔qอ;"""ขlƒ]๎iK"""ข…lƒัว†มŽˆˆˆH&์ˆˆˆˆd‚มŽˆˆˆH&์ˆˆˆˆd‚มŽˆˆˆH&์ˆˆˆˆd‚มŽˆˆˆH&์ˆˆˆˆdB6ŸKลงึfิLLสป """*c>>puu…ณณ3NŸ>ญ๒ส•+˜|ฐถถ–Ž–………aย„ €qใฦมฮฮ...˜7oุว›1iา$ุููIVะ:acc“งUซVa๘๑PWW‡Bก€ฉฉ)`ำฆMpqqมาฅK‘’’Rฌ๏YFFRRRT^DDD$_ลv›6mB‹-ƒ่่h=zTๅฝ••fอš'''ฤฤฤ`ธq€ธธ8์ูณ7nฤ่ัฃ1mฺ4DEEaแย…3f  {๗๎8w๎โโโ ซซ‹?๘CZฏ‰‰ .\ธ€Faฤˆุปw/v๎‰™3gZ๏฿ใวcม‚>|8Vฏ^่่h|๑ล๘๛๏ \๎้ำงุถm‹/ฟ ์#''ปw๏†ฟฟ?>sิฌY็ฯŸ‡››[q‡Vล๕๋ืOOOดo฿w๎ :ปvํยƒเแแมƒ#::บะพBBB`dd$ฝ,--KTU ลm่้้‰๛CMM บuCใฦU็ป\›6m```8rไคy๊๊๊€ุุXL™2)))HJJ‚ฅฅ%:u๊h฿พ=ภษษ …:::pttฤํท ญทs็ฮะิิDjj*N:%๕—““ƒฺตkธœ‘‘๔๕๕1hะ t๎ํฺต+ดฮ;ใาฅK๘๕ื_ัจQฃ"วฑ(999ศษษมนs็ฐqใFŒ9ทo๐๚่฿ฬ™31}๚tฌ_ฟพพพ๘๎ป๏0v์ุ|๛š8qขž %%…แŽˆˆHฦŠ์|}}q๘q๑ว่าฅ –,Y’็}~ฉRฅJาื …็ฯŸ‡šš๊ยมƒc฿พ}จ[ท.ๆฯŸ/^H๓ดดดjjj*_uํ\๎z•J%jึฌ‰˜˜˜BBBฐlู2 84h๊ึญ[่: cnnŽฮ;๐ํท฿ชฬ?qโVฎ\‰จจ(Lš4 ฝ{๗.ฐ/mmmhkkนN"""’‡bŸŠฝu๋jิจกC‡"00'OžTyคฆฆุGใฦฅ›+”J%โใใ/_พ„ฉฉ)าำำฑeห–Rn’*###Tฎ\^฿ุp๙๒e€••bbb T*ฑgฯภ‹/œœŒŽ;b๎นˆ‰‰)ดGGG,[ถ .\@บu„ฆM›"11ฑภuฆ}๛๖8v์ 22vvv€ˆˆ8::b๙ู่ณ'.]บ„ษ“'ฃZตje7XDDDTก;ุEFFยููnnn8qโฌญญU๗๎&&&pvv†ณณณtำม›/^Œ}๛๖มลลŽŽŽา “'OฦงŸ~ŠฆM›–๘ฺดยlุฐ๓ๆอƒ‹‹ \]]q๖์Yภ”)Sะทo_x{{รššŠvํฺมลล:u’ฎฅ+จ\zzz4hฮ;‡๙๓็CCCฃภuฏoคฐฐฐภปwQงNLœ8ภ๋ฃ—งOŸ†““fอš…ภ๋k ๗๏฿]ปvม฿฿?ฯQO""""…B”w๔~คคคภศศŽฏ€‰กฎ4]อฅO9VUqdee!<<ะิิ,๏r*Ž]ษq์J‡ใWrป’+๋ฑห๛œœ CCรB๒ฐ‘L๛ๆ‰ั0~x•imฺดม?PN•Ÿ ์Zทnึญ[—wDDDDžŠ%"""’ ;""""™`ฐ#"""’ ;""""™`ฐ#"""’ ;""""™`ฐ#"""’ ;""""™จะ(ฆ’Qณ๏5“๒.ƒˆˆˆสุษƒ‘L0ุษƒGจ๕๖`|บพ[y—ADDDeŒมŽˆˆˆH&์ˆˆˆˆd‚มŽˆˆˆH&์ˆˆˆˆd‚มŽˆˆˆH&์ˆˆˆˆd‚มŽˆˆˆH&์ˆˆˆˆd‚มŽˆˆˆH&์ˆˆˆˆd‚มŽˆˆˆH&์ˆˆˆˆdBVม.)) ซWฏ.๏2ŠๅีซWhผ9๔๕๕1aย•y7n€ฏฏ/เๆๆVNQE๓ัปœœœ๗Zห๓็ฯ ฏกกฉSงbผyyๆ 0๓็ฯวฅK—pเภb๗IDDDท ์๎฿ฟธบบยููงOŸVyๅสLž<๑๑๑puuลผy๓†ฎ]ปยฯฯ}๚๔มร‡ัฉS'xxx qใฦธvํ 44žžžpvvฦ€ T*Mš4มุฑcแๆๆOOODEEกy๓ๆ๘ไ“Oฐw๏<5fggc๛๖ํhีชFŒ S9"gmm๔๔thjjยฯฯบบบ*}\ผx๚๚๚hะ ภฬฬLš็แแเ์ูณe;ธDDD$ &ุmฺด -Zด@LL ขฃฃq๔่Q•๗VVV˜5kœœœƒqใฦโโโฐgฯlธฃGฦดiำ…… bฬ˜1€๎ปในsˆ‹‹ƒฎฎ.๘ใiฝ&&&ธpแ5j„#F`๏ฝุนs'fฮœ)ตนs็ฆN {{{์ูณ฿}๗6lุPขํผ~:tuuัฎ];|๚้งXฒd‰4๏๊ีซุ่ฑ#ฆOŸฌXฑ/^ผ(ฐฏŒŒ คคคจผˆˆˆHพ4สป€โ๒๔๔Dกฆฆ†nบกqใฦ*๏ํํํ๓]ฎM›60009r าลขE‹ะฑcG่้้a๋ึญ๖5qโD$''Kฏ;w๎บn"""ชุ*Lฐปu๋jิจกC‡"00'OžTyƒ^@ใฦฅ›+”J%โใใ/_พ„ฉฉ)าำำฑeห–wชKGGฤ™3g0o<9rvvvXฐ`ภสส ฑฑฑ^{๘๐aก5hะ๗๏฿GJJ ฒณณq๊ิ)ฺฺุ‚‚‚เๅๅ…””์ท;v์@›6m ์K[[†††*/"""’ฏ s*622s็ฮ…––LLLะงO8;;K๏7o 8;;รูู}๚๔ฉฉฉJ‹/Fpp0–.]Šฌฌ,๔ํNNN˜๔STซVญTquuEhh(^ผx!เะจQ#่๋๋ร7†ฅฅฅิููw๏Evv6ึฏ_ .ภิิ3fฬ€ทท7 [ทnาAAAXฟ~=ิิ*L'""ข๗H!„ๅ]ฝ)))022‚๛สฎP๊็{|—๒สสสBxx8กฉฉYๅT(ป’ใุ•วฏไ8v%Wึc—๛๗;99นศณo<๔CDDD$ vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2กQะ๛wเ๓P˜˜˜”wDDDTฦxฤŽˆˆˆH&์ˆˆˆˆd‚มŽˆˆˆH&์ˆˆˆˆd‚มŽˆˆˆH&์ˆˆˆˆd‚มŽˆˆˆH&์ˆˆˆˆd‚มŽˆˆˆH&์ˆˆˆˆd‚มŽˆˆˆH&์ˆˆˆˆd‚มŽˆˆˆH&์ˆˆˆˆd‚มŽˆˆˆH&4สปz„€ิิThjj–s5OVVาาา’’ย๑{Gป’ใุ•วฏไ8v%Wึc—’’เ/ ƒGไ้ำง›rฎ„ˆˆˆUjj*ŒŒŒ mร`๗ฉRฅ เ๖ํE๎๑๔๔ฤนs็J\CE^>%%–––ธs็ ฿๋บ+๚๒ฅปาฎฟผ—็ุ}ผ๛วฎโni–/๋ฑB 55ๆๆๆE.ว`๗QS{}Iฅ‘‘Q‰w4uu๕/+‡ๅภะะฐD}”wํๅฝ|๘Gฝ|yฎปข/_Zๅ]i–็ุ}ผ๛^yo{E;9,_๋Vˆโ\‰Gฒ’’###$''—๚p#Ž_ษq์JŽcW:ฟ’ใุ•\yŽุ}Dดตต1mฺ4hkk—w)วฏไ8v%วฑ+Ž_ษq์Jฎ<วŽG์ˆˆˆˆd‚G์ˆˆˆˆd‚มŽˆˆˆH&์ˆˆˆˆd‚มŽˆˆˆH&์>"K—.…ตต5tttะฐaC๕ื_ๅ]Rน;~8:t่sss( ์นSeพSงNE5 ซซ‹-Zเ๚๕๋*mž={†^ฝzมะะฦฦฦ๘โ‹/๐โล‹๗ธๅ#$$žžž000€™™:w๎ŒซWฏชดIOOว๐แรabb}}}t้า>Tis๛๖mดkื•*U‚™™ฦ‡์์์๗น)๏๒ๅหแ์์,=ผิหห ๛๖ํ“ๆsŠ๏‡~€BกภจQฃคiฟ‚MŸ> …Bๅegg'อ็ุ๎ฝ{่ป7LLL ซซ '''DEEI๓?ˆฟ‚> ›7oZZZโ—_~—.]ƒฦฦฦโแร‡ๅ]Zน “'OทoฤŽ;Tๆ๐รยศศH์นSฤฦฦŠŽ; ๑๊ี+ฉM›6m„‹‹‹8sๆŒ8qโ„จSงŽู่ณ็{’๗ฏu๋ึbอš5โโล‹"&&F๘๛๛‹Zตj‰/^Hm‚ƒƒ…ฅฅฅ8|๘ฐˆŠŠŸ}๖™๐๖๖–ๆggg GGGัขE qแย.ชVญ*&NœX›๔์ฝ[์ปW\ปvM\ฝzULš4IhjjŠ‹/ !8nล๕ื_ kkkแ์์,FŽ)M็๘lฺดiยมมA>๚๚๚ะึึFpp0v์ุ{{{Ž[1lผ็ฯŸGHHHžyฟย5lุaaaุฟ?–/_Ž›7oขqใฦHMMๅุแŸม๒ๅหQทn]8pC‡ลW_}…ตkื๘pfh”I/D๔Q>|8.^ผˆ“'O–w)†ญญ-bbbœœŒmถก_ฟ~8v์Xy—๕มปs็FމƒBGGงผหฉpฺถm+}ํ์์Œ† ยสส ฟ๖tuuหฑฒŸRฉ„‡‡fฯž pssรล‹Š~๚•suุ}ชVญ uu๕|นcSุธUฏ^=R™Ÿgฯž}4c;bฤ์ูณG…………4ฝz๕๊ศฬฬDRR’J๛ทว/ฟ๑อ'gZZZจSง๔ำOท"DGGใัฃG๘๔ำOกกก ;v ?3444PญZ5Ž฿;066Fฝz๕pใฦ ๎{EจQฃ์ํํUฆีฏ__:•กอ`ฐ๛hiiม‡–ฆ)•J>|^^^ๅXู‡อฦฦีซWWท””œ={V7///$%%!::Zjsไศ(•J4lุ๐ฝื> !0bฤ์ุฑGށส|wwwhjjชŒ฿ีซWq๛๖m•๑‹W๙Ew๐เAๆ๙*wJฅท"4o๑๑๑ˆ‰‰‘^่ีซ—๔5วฏ๘^ผxฟ5jิเพWŸ<tบvํฌฌฌ|@3สไ ๚เmผYhkk‹ฐฐ0‘ พ๒Kallฌrgำว(55U\ธpA\ธpA ..\ทnBผพuุุX์ฺตKฤลล‰N:ๅ{๋บ›››8{๖ฌ8y๒คจ[ท๎G๑ธ“กC‡ ###ฉ๒่„ดด4ฉMppฐจUซ–8rไˆˆŠŠ^^^ยหหKšŸ๛่„VญZ‰˜˜ฑ~ajj*๛G'L˜0A;vLผySฤลล‰ &…B!"""„ทw๕ๆ]ฑBp 3v์X)nผ)N:%Zดh!ชVญ*=z$„เุๆฏฟbึฌYโ๚๕๋bร† ขRฅJb๚๕R›แoƒGd๑โลขVญZBKKK4hะ@œ9sฆผK*wG๒ผ๚๕๋'„x}๛๚ท฿~+ชUซ&ดตตE๓ๆอลีซWU๚x๚๔ฉู่ณงะืื†††bภ€"55ตถๆสoˆ5kึHm^ฝz%† &*Wฎ,*Uช$ฤƒT๚ILLmถบบบขjีชb์ุฑ"++๋=oอ๛5pเ@aee%ดดด„ฉฉฉhผน๊„เธฝซทƒวฏ`=z๔5jิZZZขfอšขG*ฯaใุ๎?ŽŽŽB[[[ุูู‰•+Wชฬf(„ขlŽQyโ5vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDD‘—/_ย/^ผ(๏RT888เฯ?|งeฌญญq๒ไษจขwsํฺ5|๖ูgๅ]ั‰มŽˆdหฺฺzzzx๙๒ฅ4--- ฐถถViWฉR%่๋๋รฤฤปwว๓็ฯU๚Љ‰y็0ŠN:A__ฟTQึ.]บ$}(๙-22u๊ิQ™ึฟฬœ9ณฤ}ึซWีซWวQฺ๒ˆd‡มŽˆdญfอšุนsง๔~ืฎ]จQฃFžvx๑โn฿พฬฬL|๗*๓๗๏฿6mฺผำบ๏={๖,Q๏";;๛?_ว‡"w[{๖์‰ีซW—s5D;"’ตž={bร† า๛๕๋ืฃWฏ^ถืำำCวŽq๙๒e•้นม๎ีซWู่ณ'ชTฉ‚*Uช qใฦ๙๖s๛๖mฟNNNา4kkkฬ›7๕๋ื‡ฆNŠซWฏยรรFFF–ฺ*•JL›6 –––จQฃพ๚๊+dddยยยะดiS 2FFFXณf ž={†   ˜™™แ“O>มฺตk ฦ7Oซ๎ูณถถถาQฬอ›7ธ้ำงQฏ^=˜˜˜เ๋ฏฟ†Rฉ”ๆ-]บu๋ึEีชUัฏ_?ผ|๙999hถ-๙็่๋๋C__kืฎล† ๐๗฿C___ฺๆ๘๘x๘๚๚ขrๅสpwwGTT”ิทBกภ’%K`ccƒฆM›|}}q๘๐แ*ิ‹ "’)+++),,,ฤฃGฤฃG„………8y๒คฐฒฒRiwโฤ !„ษษษขC‡bฺดiา””Qฝzu‘““#–/_.:t่ าาาDVV–8~xพ๋ณgpwwฯSŸŸŸx๚๔ฉธ|๙ฒะึึ-[ถทo฿<ีชUGŽBฑrๅJaoo/๎น#ž55U˜››‹mถ‰์์lฑcวaii)^ฝz%„€ุ่ฑฃHNNiiiาr†††โส•+๙ึK๔ฑโ;"’5uuutํฺ[ถlม–-[ะฅKจซซ็iืถm[ฃrๅสธvํ†*อ;|๘0 ฆฆMMM<}๚๓444 $%%!-- ;wFปvํคyo^_ืงO4oฐฒฒBHHHพๅ{7ฌ™™™๔ตฎฎnž๗นหฟตjี’ๆYYYแ๛า{ ้๋ทo#==ฆฆฆ066†ฑฑ1VฌXทะq€mถaวŽฐฐฐ@›6m๒œ‚~“ฅฅฅสื<ึ?dศi5ยใว‹\๗›๕;vLZุุ—/_.p{sฅฆฆยศศจุ๋!๚0ุ‘์yxxเูณgx9<== mซญญ>}๚ ::Ož<๐๚ฦŠึญ[ดดด๐w฿แฺตk8pเ~๚้'DFFๆ้วษษ w‰k677วํทฅ๗ทo฿†นนน๔^กPH_ืฌY๚๚๚x9’’’””„ิิT„††นž† b๏ฝx๘๐!\\\TŽTพํฮ;*_็„RณfMฌ]ปVZwRR’t'๒›uๆW{๎๒ญ[ทฮณ|PPPห๛๏ฟศฮฮFํฺต‹Fข ƒ}ถo฿^ฌS“YYYุธq#ฬฬฬ`bb‚+WฎภะะP 1GลฅK— T*ahh |OํZYYกz๕๊ˆ/Qฝ=z๔ภ‚ p๏=<{๖ ฿=๓m[ณfMxyyaส”)HKKCvv6ฮŸ?„„„Bื‘™™‰7"%%šššะืืฯw[r-^ผ>ฤƒฐhั"t๏0pเ@ฬž=[ ฒ<ภ๛ผ>B๙๘๑c•Gฮ˜™™!11Qz฿พ}{\ธp;w๎Dvv6^ฝz…๛๗zš๕๘๑ใhึฌ444 Fข ƒ}์ํํ ฝ~ฌUซVะืืGีชUq๔่Q์น …"ฯcN๙ไ˜™™aิจQx๕๊U‘๋Yปv-ฌฌฌPนreขB!สป"ขU›6m0aย4iาไ—}๙๒%<==๑ื_}p)ฎศฎ_ฟŽ>}๚เฯ?ฬ๗T/ัวŒมŽˆจs็ฮล่ัฃกฉฉYฅ‰มŽˆˆˆH&x‘L0ุษƒ‘L0ุษƒ‘L0ุษƒ‘L0ุษƒ‘L?{„=f”฿IENDฎB`‚c4core-bm-charconv-xtoa-mega_bytes_per_second-u32.png000066400000000000000000000773501477602032300331060ustar00rootroot00000000000000c4core-0.2.6/doc/img/windows-x86_64-vs2019-Release‰PNG  IHDRvF>ืT9tEXtSoftwareMatplotlib version3.5.3, https://matplotlib.org/อ+นา pHYsaaจ?งi~UIDATxœํwTื฿๐g—Ž4EฌH]B{-6ิ(j0b‰-ัX#FฑF6,‰55ฦ{ฅ(ถจจฑ7Š u๏๛‡‡y]ฉ6ะแ๙œณGvๆฮ๛]–วiซBั'OY """ข๗ƒมŽˆˆˆH&์ˆˆˆˆd‚มŽˆˆˆH&์ˆˆˆˆd‚มŽˆˆˆH&์ˆˆˆˆd‚มŽˆˆˆH&์ˆˆˆˆd‚มŽ>Iฝz๕‚‘‘Qq#O„Bกภ† Š{(… …Bว๗Pจ„จ_ฟ>œœœŠ{ฒฃP(\ร๘ โโโ P(ฐbลŠโสGมŽส๖ํe๛แATX?36o\่๖‹-BงNPนre( ๔๊ี+ืvูA[ฉTโ๖ํ9ๆ'&&ยภภ …ƒ zหัSARRRŒƒ๙บ?Žเเ`ฤวว๙บๅ(ฟื๒๐แรhำฆ ฌญญกฏฏKKK4oวŽหัว‚ ะดiSTจPฦฦฦpssรขE‹••๕ฦczำฯยbฐฃทฒ}๛vLœ8ฑธ‡ATฌ๔ƒyฺดiุฟ?กญญ]`{===ฌYณ&ว๔7พษ0้-ฅคค`โฤ‰ล์&Nœ๘ฦม๎ล‹7n‡T1ณฑฑม‹/ะฃG7^6ฟื๒ส•+P*• ย‚ ๐๗฿ใ๛๐๕๕ลฮ;ฅvืฏ_วท฿~ !†Ž™3gยฮฮ @Ÿ>}xL*ุษBDฒ•œœŒRฅJ๗0>)Bคฆฆยภภเ—=t่ดทฎ0งดlูkึฌมศ‘#5ฆ‡……กUซV๘๋ฏฟx %‰ZญFzz:๔๕๕‹{(ิซuสนV…B๑A๊ D`` ฦด J•*˜3gš7oฐดดDLL ฅv๚๕CŸ>}ฐ|๙rŒ?ีชU{๏ใ{ScG’/^ภ๖๖๖x๑โ…4้ำงจPก๊ึญ‹ฌฌ,๔๊ี ,๐๒-๛‘-99฿}๗ฌญญกงง‡š5kbๆฬ™Bhฌo๙๒ๅhุฐ!,,, งง,Zด่ฦ|๚u4kึ ฅJ•BลŠ๑ำO?ๅXZญฦœ9sเ่่}}}”/_๚๕รณgฯ4ฺฺฺูโ‹/พภัฃG๑ูgŸA__UชTม‘cฝ๑๑๑6llmmกงง+++๔์ู3ว9jjตSฆL••๔๕๕ัจQ#๛๏ฟmฒฯ5ŠŽŽ†ŸŸ QญZ5้ผC‡มำำจYณ&๖๎ซฑอ›71`ภิฌY077GงNงัnลŠP(8t่  XYYๅนmoผ‰jีชมษษ <๐๒ฝ—.]*๔นxงNBห–-Qบti”*U ...˜;wฎF›๛๗รววฅJ•‚™™ฺถm‹‹/jดษ>4๙๏ฟขWฏ^033ƒฉฉ)z๗๎””ฉ““4hcjต•*UBวŽ5ฆฝษ๛bืฎ]pww‡/^ …Bไไdฌ\นR๚ศ๋ะj6฿•‚t๋ึ ‘‘‘ธt้’4ํ๛ุฟ?บu๋V่~ฒูnผNNNะำำƒฃฃฃฦเๅนซถถถ9–ฯน๕น~z888ภภภ^^^ˆ‰‰,^ผีชUƒพพ>๊ืฏŸใ˜-""u๋ึ…์์์’ฃMZZ&L˜€jีชAOOึึึ9r$าาาrShh(กงง'ีธvํZิฉSฦฦฦ011ณณsŽ๗โซโโโPฎ\9ภฤ‰ฅื๘ีSP ๓อหผy๓เ่่CCC”.]๎๎๎ ๐r{1`gg'ญ;{ๆW็๋c,์๏๐๒oภเมƒQถlYฃM›6ธs็NŽ>“’’0t่P้๓ฯยยMš4มูณgฅ6o๒Yakk›๋๏N๚๕Qฟ~}้yn็ุeŸo}็ฮดkืFFF(Wฎพ{้๐ha^หืข\นr{Lห–-ซ๊ฒตo฿ ฺxซฯBDฏ8y๒คะาาร† “ฆ๙๛๛ q๙๒e!„วMš4ฤชUซค‡BจีjัฐaCกP(D`` ˜?พhบต †ชฑ.ัซW/๑๋ฏฟŠy๓ๆ‰ฆM› b๙Ž3 @่๋๋‹๊ีซ‹=zˆ๙๓็‹/พ๘Bใวืh(ดตตE฿พ}EHHˆ๘แ‡DฉRฅ„‡‡‡HOO—ฺูุุˆš5kŠ๒ๅห‹1cฦˆ๙๓็‹ฺตk …B!ฮŸ?/ตKJJNNNBKKK๔ํW,ZดHLš4Ixxxˆs็ฮ !„8pเ€ D:uฤฏฟ*‚ƒƒ…กกก๘์ณฯ4ฦ็็็'*Vฌ(ฌญญลˆ#ฤผy๓„ƒƒƒะาาkืฎ–––"88Xฬ™3GTชTI˜ššŠฤฤDi๙๕๋ื WWW๑ใ?Š%K–ˆ1cฦˆาฅK ‘œœ,ต[พ|น „ŸŸŸ˜7ož๘ๅ—_„BL˜0A=B๑๏ฟŠส•+ •J%M{ตฎ &๘ํฝ[่๊๊ 1aยฑhั"1x๐`ัธqcฉอž={„ถถถจQฃ†˜>}บ˜8qข([ถฌ(]บดธqใ†ิ.{|nnnโห/ฟ .€9rคิ๎งŸ~JฅRปwOc,‡ฤ๚๕๋฿๊}QญZ5Qบti1jิ("8 VญZ%๔๔๔„๔;p๘๑ทKถRฅJ‰€€€\็eื๛๐แCaeeฅ๑žž3gŽ055ฉฉฉ€8p`๋ \]]E… ฤคI“ฤœ9sD•*U„กกกx๘ฑิ. @ุุุไ9žื๛tqqึึึโ—_~ฟ๒‹055•+W๓็ฯbึฌYbธqBWWW4hะ@c๙์๗ฝ………4h๘฿'๊ีซ'ˆ฿~๛Mj—••%š6m* ละกCลโล‹ล Aƒ„ถถถhถmŽ1ีชUK”+WNLœ8Q,Xฐ@œ;wN์ฝ[5 , ,ƒ :uสs›=\,ZดHํท—^ใจจ(!Dแ฿ปนYฒd‰ :v์(/^,ๆฮ+พ๚k1x๐`!„QQQขkืฎ€๘๕ื_ฅu?<฿:ณ็ฝ๚๛Yุ฿!„่นณ z๔่!,X :w๎,\]]s๔ูญ[7กซซ+†.–-[&ฆM›&Zทn-Vฏ^-ตy“ฯ ›\„ŸŸŸ๔ฦ€Xพ|น4-๛oฃฃฃ่ำงXดh‘่ะกƒ .\(„(๘ตฬ– =z$.^ผ(F-ˆ1cฦ8์ื๓M~฿๕๓#? v”ร่ัฃ…Rฉ‡๋ืฏฤœ9s4ฺ 80วฝBlผY“'Oึ˜ฑcGกP(ฤฟ+MKIIษฑ|ณfอD•*U c@@€ พ๖[išZญญZตบบบR9rไˆ BCC5–฿นsgŽ้666€8|๘ฐ4ํแร‡BOOO|๗wาดQ7nฬ1.ตZ-„๘ตZตj‰ดด4iนs#M๓๓๓DXX˜4ําฅK€P*•โไษ“า๔]ปvๅ๘`หm;ž8qB๑‡4-;ุีซWOdffjด5ุ]ผxQTฌXQxxxˆงOŸjด+์‡uffฆฐณณ666โูณgนn#!„PฉTยยยB|จฑ|ๅส•sฌงt้า็]]ปvญะ๗฿zฝฟ์ ๔๚y\VVV9ถฑฉฉ)ฌญญsL{}๙/^เว”ฮi,[ถฌtnHnัฮฮ.ฯ๑ถnฦฦฦุตkLLL Qa๎ฎ]ป๙nง์๗Bอš5sฬซUซ?~Œไไd้…ูž]บtมฑcวp็ฮ/๏)๘๐แCt้าEj๓ฆ๏‹ถู‡ๆๆๆ{{{„……!44–––Rจy…yoฟkŸู๏ฯยผo bลŠ9.ษํw๘ย… 9^ง์v…yญ €5j E‹ฐฒฒBŸ>}rœ_๘&ๆฝ๛ช~๘FFF๘์ณฯPฝzu 80วญ5 ๒ฆ๏ษ‚~wnผ ฅR™ฃ฿.˜>}:ฮŸ?kkk|๖ูg~ง ผ+}}}้บlo๓VฉThาค ๚๔้ƒ={๖เ๔้ำ๙ž๗6cฦ ,]บ“&MBห–-฿f่ฤว/้ฃณkื.@jj*ฎ^ฝ๚ฐ]ปv 5‚ฝฝ=fฯž kkk่๊๊b๛๖ํ๘๕ื_กVซ฿หzิj5,,,š๋ื? ๒ฺ“%^ป ฃฐ _^ํ ณท฿~‹ๅห—c่ะก๐๒๒‚ฉฉ) sŽ๙]อูกCฌ\นกกก{R>…ู]บtม่ัฃฑ~z :๙'LMMฅ+€7_ผอฐ๏Sทnฐhั"ฃK—.P*฿ไ…ูvy.ฏ{tฝห๛ถฐิj5œ1{๖์\็ฟ"s{ญ,,,‰]ปvaวŽุฑc–/_Žž={bๅส•o<ฆwUซV-\พ|[ทnลฮ;๑ื_aแย…๘๑ว }ฉ7}Oพฯืคs็ฮ๐๑๑มฆM›ฐ{๗nฬ˜1ำฆMรฦัขE‹7๎/ฟ๗]^ใ~Uaฺผ)]]]ดiำฟ๒ ^ผx‘c{ฏXฑ?๐‚‚‚>บห0ุQััั๘้งŸะปwoDFF"00111าบผmllฐw๏^$%%i์ตหพชฯฦฦ๐ฯ? -- [ถlั๘Ÿไ๋‡U๒ฃVซq๚u้๎ภห๛UญZ{๗๎…ทท๗{๛ใ\ตjUœ?ฝ๔๕>lุฐ˜5k–4-55๕ญnl:cฦ hkkcภ€066~ซC~คC~็ฯŸGใฦsm“^ธ|๙rŽy—.]Bูฒe฿๊V,vvv๘์ณฯฐn: 47nDปvํ งงง1พ๗๑พx“+\฿Eทn๐ใ?โฝ{Xตjี[O้าฅs}฿ผบง}บ{๗nŽ[๎ไ๖;…Fฝำ๖ึีีE๋ึญับukจีj 0‹/ฮ๗๙}ฮ๏๖-Uชบt้‚.]บ ==_~๙%ฆL™‚ัฃGC__ฟศ[ูlll Vซqใฦ Tฏ^]š๚Uู*Tจ€`ภ€x๘๐!jืฎ)SฆผUฐห๏}๗๚Q™ท๕6๓ล‹B ))Iใsโ๏ฟF`` พ๒K้E5ฆยเกXา‘‘^ฝzกbลŠ˜;w.VฌX`ุฐaํฒ?ด^elูฒ%ฒฒฒ0|้ฟ๚+ …๔KŸ?ฌWท˜€ๅห—ฟัx_]๓็ฯ‡ŽŽ5jเๅ,ณฒฒ0iาคหfffพU๘้ะกขขขฐiำฆ๓vฯปะาาสฑy๓ๆฝีะ –,Y‚Ž;" [ถlั˜_ุ[ิฎ]vvv˜3gNŽmœ=ึ *@ฅRaๅส•mฮŸ?ปwฟำก.]บเไษ“๘๗฿๑๘๑cรฐภ๛{_”*UชHพ jีช˜3gฆNŠฯ>๛์ƒฎ'!!ัััาด{๗๎ๅ๚^233ฑx๑b้yzz:/^ŒrๅสกN:^พVw๎มาฅKs,โล‹|yf{๒ไ‰ฦsฅR ศqห”Wศ๙9๗ฎ๏ืวฃซซ !‘‘ ๏ฯุ%๛า… jLŸ7ožฦ๓ฌฌฌงxXXX bลŠ๒MnwRตjUœ ๘๚๚"44๔ญ๖žg๛PŸcG&OžŒศศH์ทฦฦฦpqqม?ˆqใฦกcวŽาV๖‡๎เมƒัฌY3hiiม฿฿ญ[ทFƒ 0v์Xฤลลมีีปw๏ฦ฿กC‡J{rš6m*บ_ฟ~x9–.] ปwฏPcีืืวฮ;OOO์ุฑถmร˜1cคCi~~~่ืฏฆNŠศศH4mฺ:::ธz๕*ึฏ_นs็jฌ0FŒ 6 SงN่ำง๊ิฉƒงOŸbห–- ซซ๋๕๗ฎพ๘โ ฌZต ฆฆฆpppภ‰'ฐw๏^˜››ฟUJฅซWฏFปvํะนsgl฿พ]:ง๋๔้ำhะ &L˜๏IัJฅ‹-B๋ึญกRฉะปwoTจP—.]ย… คC3fฬ@‹-เๅๅ…ฏฟ/^ผภผy๓`jj๚N']w๎฿=พ{”)S&ว^ร๗๕พจSง๖๎‹ูณgฃbลŠฐณณำธุๅu๓ขขขผOTtt4&Ož hำฆ6r3dศย”N๑ร? }๛๖Zตj%้ศŒ;v,กฃฃƒึญ[ฐŠืฉS:tภœ9s๐ไษ|๙็8t่ด5{๏RRRฌฌฌะฑcGธบบยศศ{๗๎ล™3g4Ž๖ณx๙๚lุฐอ›7G็ฮqํฺ5ฌ^ฝZใbŸw•฿k™}๎ฅงง',,,p๋ึ-,_พw๏ีธ๋ๆอ›hำฆ  :v์ˆ๕๋ืkฌรลล%฿฿แืฝ้็Gกฝ๗๋l้“!ดตต5n!"ฤห[WxxxˆŠ+Jทฎศฬฬ฿~๛ญ(WฎœP(ทBHJJร† +V:::ขz๕๊bฦŒทนBˆ-[ถกฏฏ/lmmลดiำฤ๏ฟž็%ฏ ฅJ•ืฎ]“๎qUพ|y1aย‘•••ฃ’%KD:u„066ฮฮฮbไศ‘โ๎ปRัชUซหพ~ษฝB_ฟ/oฃโ็็'ŒŒŒค[ฎผษ- „โ่ัฃขI“&ยุุX”*UJธธธไธษฝ{…ททท000&&&ขu๋ึ"66ถภ๑ฝZSn๏ooo@ๆ9พwy_๑๒ถ4พพพยภภ@(๐ึูทfศํ๑๊{"ฏz_๗๚{แMๅv›‰ปw '''กซซ+jึฌ)Vฏ^็ํN^๏3๛=cฦ ้น>dฟ๏รรร…———ะืื666นว2==]L›6M8:: ===QบtiQงN1qโD‘P`6lM›6BWWWTฎ\Y๔๋ื/วss๘qQงNกซซ›ใฝ_˜๗nn/^,|}}…นนนะำำUซV#FŒะจE!&Mš$*Uช$”Jฅฦ๛<ฟื๕1พษ๏Nrrฒ8p (SฆŒ022ํฺต“n!”}ฯหดด41bฤแ๊๊*^ปบบJ๗Œห๖ฆŸณfอ•*Uzzzย[„‡‡๚v'ฅJ•สั_n๏ูผ^ห๙๓็‹z๕๊‰ฒeห mmmQฎ\9ับuk[_ฝZS^ยึšํM?? K!D1;"""ข^dd$ฐz๕jt๏ฝธ‡C…ภs์ˆˆˆHใซ$ณอ™3Jฅพพพล0"z<วŽˆˆˆ0}๚tDDD Aƒะึึ–n ๓อ7฿ไธญ ๅํ๛๙ฮ700ะธหฤ๛ฦCฑDDD„={๖`โฤ‰ˆล๓็ฯQนre๔่ัcวŽhพUแSPะmLฐbลŠท~;"""ข๗#๛+-๓Rฑbล7๚:ธ7ล`GDDD$ผx‚ˆˆˆH&์ˆˆ ้๖ํะืืใ/l˜ยยยrL?t่๛๏?่้้ๅบ\“&Mฐjี*ฌZต ณfอ‚››ฦ€€€\oถ ๐๐๐xง๑>z๔+WฎDPPะ;๕๓ฑ๑๕๕ล‹/>ฺ๛”ๅ์&Nœ๘ม‚]ถmabb’ใปS‰>vผ~™ˆŠEห–-ฑ~z๏ำธ•BXX๊ิฉ“็—‡ืจQ_}๕•๔<((ุ้้้ธq#RSSกฏฏฏั~๛๖ํhัขEท (ศ๊ีซกญญึญ[ฟS?๏Srr๒;wจRฉฬฑอJฒ””BฉTขcวŽ๘ใ?0qโฤw~๎ฑ#ขbัตkW„}่ะ! 0ฐฒฒ’ๆ๏ุฑ>>>(UชŒัชU+\ธpกภบr;ว๎๊ีซ่ะก,--กฏฏ+++๘๛๛#!!กภ ""u๋ึ…์์์’ฃMZZ&L˜€jีชAOOึึึ9r$าาาค6 …ษษษXนrฅt๘ฝWฏ^ฦˆ#vvvาผธธ8iูีซWฃN:000@™2eเ๏๏ทokŒ!๛ต‹ˆˆ€ฏฏ/ 1fฬi~“&Mp๓ๆMDFFชnขƒ [[[xyyaอš5าด;v !!y.—ššŠวใ๑ใวธy๓&ยยยฐrๅJt๋ึ-Gฐตk š6m เๅ XปvํŠาฅKcฺดi๘ๅ—_Pฟ~/†ศศศภ™3gPปvํ\็?{๖ _|๑<==1}๚t่้้ม฿฿๋ึญƒฟฟ?Zถl‰_~๙ษษษุ่ฑ#’’’คe/\ธDEEaไศ‘?~VVV่฿ฟ?~wฉZญF›6m0sๆLดn๓ๆอCปvํ๐๋ฏฟขK—.RปUซVAOO>>>าแ๗~๚แห/ฟDืฎ]ฟ๚ซ4ฏ\นr€)Sฆ gฯžจ^ฝ:fฯžกC‡b฿พ}๐๕๕อQร“'OะขE จT*ฬ™3 4ๆีฉSduฑ •‚ˆจ-_พ\gฮœ๓็ฯฦฦฦ"%%E!DงNDƒ „BุุุˆVญZi, ืGปvํDjjjŽu๕่ัC๘๙๙Iฯ‡ "LLLDffๆ๙฿ฤผy๓rฬ๓๓๓DXX˜4ําฅK€P*•โไษ“า๔]ปv b๙๒ๅาดvํฺ ]]]qํฺ5iฺปw…ฑฑฑ๐๕๕•ฆeoทz๕๊iŒ?))I˜™™‰พ}๛jŒ๋๛ยิิ4ว๔ื8p@Bq๎9@ฌ_ฟ>’‹์m1kึ,iZZZšPฉTยยยBคงง !„Xตj•P*•โศ‘#ห‡„„โุฑcาดRฅJ‰€€€๋š1c† nธก1=..Nhii‰)SฆhL‰‰ฺฺฺำณว’gMบบบขึN๔ฑเ;"*6;wฦ‹/ฐu๋V$%%a๋ึญ†mถ-๖์ูƒ={๖เ๏ฟฦ่ัฃฑs็Nt๋ึ โ•๛ญซีj์นSใ0ฌ™™’““5ฦ“'OฅK—ฮuพ‘‘‘ฦ^ฦš5kยฬฬ ตjี‚งงง4=๛็๋ืฏฒฒฒฐ{๗nดkืUชT‘ฺUจPบuรัฃG‘˜˜จฑฎพ}๛BKKKzพgฯฤววฃkืฎาžฬวCKK žžž8pเภีš–ปvํส๓Jใhkkฃ_ฟ~าs]]]๔๋ื>DDD`๚๕จUซ์ํํ5ฦฐaCxใ1ฟjใฦPซี่นณF฿–––จ^ฝzŽพ๕๔๔ะปw๏<๛+]บtž็{}Œx๑›rๅสกqใฦ CJJ ฒฒฒะฑcว|—ฑฒฒBใฦฅ็mฺดนน9พ{lบUบธแฬ™3x๔่‘Fฐ0`๓Oดhั•*UBำฆMันsg4oผPใy|Q••UŽ“๋MMMs|qzvhz๖์€—Wฺฆคค fอš9๚ฌUซิj5n฿พ GGGiบFปซWฏ€Š^gbb’_I9ุููa๘๐แ˜={6BCCแใใƒ6mฺเซฏพ*ิ—WฌX1ว5jิฤลลแ๓ฯ?วีซWq๑โE้ะ้๋>|๘Fc~ีีซW!„@๕๊ีsฏฃฃฃ๑ผRฅJะีีอณ?!/œ O ƒซnบกo฿พธ>Zดh33ณ7๎ฃQฃF€ร‡Kมn๛๖ํฐตตี๘NF DFFbืฎ]ุฑcv์ุๅห—ฃgฯžXนrež›››๘@๖บW๗ fz^ฑ0 4žซีj/ฯGณดดฬัmพผ}ึฌY่ีซ๛o์ฝƒฦิฉSq๒ไI 6–Zญ†ณณ3fฯž๋ื๑›๖ญP(ฐcวŽ\ท๋ฟผพ=_ฒeหพ๕xˆŠƒซ๖ํฃ_ฟ~8y๒$ึญ[๗V}dffž?.MถmZถl™ฃญฎฎ.Zทnึญ[CญVcภ€Xผx1ฦjีชๅฺๅส•a``€7nผี๘๒Rฎ\9โ๒ๅห9ๆ]บt JฅฒภSตjU/C๋ซ{2฿•ณณ3œ1n8?~ มไษ“๓]๎๎ป9nรrๅส//˜ษsTT5jTเฐผๆ็5ฝjีชBภฮฮNฺS๘ถ๎นƒ๔๔tิชU๋๚!*J<วŽˆŠ•‘‘-Z„เเเทพG?puu๛์3,\ธ0ืqŸ>}{๖์ม๙๓็ฑ|๙rœMฺ๏ปรศศHฤฦฦยฮฮ™™™x๔ฺ่ดiƒ-[ถไนL๕๊ี๑๏ฟโศ‘#hาค ฎ^ฝŠUซVกnบRCCรื-„€‡‡v๏]จฑf|๕g!ฺถm‹%K–hดอพXใuSงNลย… ังOดo฿จ^ฝบ4_KKK:”›–––๋บvํŠ๑ใวฃw๏€฿~๛ ุตkWŽ๖GŽม’%KŽ1cฦเซฏพสณ>===)‘ฝ๓ป† bํฺตา๙[^^^ธw๏โโโp๔่Qธนนๅ๊ฒ988 ,, Ÿ}๖ผฝฝ1gฮx{{ธœฑฑ1’’’๖๖๖ธqใbbbษษษy^XQทn]lฺด ธ{๗.Ž9๘๓ฯฑo฿>๗฿€'OžเฟหQ็ำงONNNXธp!ฮ;‡๊ีซฃ[ทnhะ โโโ666ˆŒŒ„Zญฦึญ[ฅ๕_ฝzU๚yห–-ฐทท8ps็ฮล†  ญน{๗๎prrยฬ™3ัตkW\ธpcวŽE๙๒ๅ FDDDT2ผsฐsrrย AƒPทn]ธบบๆนg ศ๛;เๅแุrๅสมภภธs็Žฦปผ๘๛๛cย„ PฉTHKKCXX‚‚‚เ๊๊ //ฏ<ƒgŸ}†FIทษพ-‹……,X€ถmยลลM›6ลร‡ ฌณTฉR ฤ™3g0sๆL)”7={๖DบuQฑbEฉจQฃเไไ\บt ?๘#€—็={๖L:œห/ฟฬออฑs็N๗฿hูฒ%”J‚ˆˆˆ4)„ขธAE#11ฆฆฆจ3๎oจuŠ{8EJW)0ฺ้9ฆž7BบZQ๐2ยฺY{Iชฝคึ ฐ๖wญ์๘†๏yT๏O๖฿๏„„้\ผpท‘Lผ๗‹'>Fžžž9.\8}๚4tuu‹iDDDDD๏_‰vงN*๎!}p<KDDD$ vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2ม๏Š-Aฒฟk๎๑ใว077/๎แฉŒŒ l฿พ-[ถ„ŽŽNqงHฑvึ^’j/ฉuฌ]ฮต๓ปb‰ˆˆˆJ ;""""™`ฐ#"""’ žcW‚dฃ๏ท๚ด M‹{8EJ Yhจผ†๊ชศ‚VqงHฑvึ^’j/ฉuฌcจ}~๛Zค_žcGDDDT1ุษƒ‘L0ุษƒ‘L0ุษƒ‘L0ุษƒ‘L0ุษƒ‘L0ุษฤ'์:v์ˆฯ?ญ—วฒeหใˆ ็๔้ำPฉTPฉTpwwว‰'วŽƒปป;œแๅๅ…˜˜˜"}š>้`ทgฯhiiฝS*ุ={๖,฿๙NNNˆˆˆ@dd$VฌXฬฬฬฐy๓fฤฤฤ`าคI™CฑฏŠŒŒDll,์์์Pฏ^=œ;wmฺดษw---จีj้๙ซ{ฒ ใวฤ—_~‰˜˜ฌZตJZพI“&˜9s&BCCัตkWl฿พ]c=ฏฎ7ฏuzxxเฝ{x๔่เฟCทnฐvํZ˜››kดฝs็&Mš„N:มษษ K–,ษsฬฃGFBB‚๔ธ}๛๖ีLDDDŸ–O"ุ5lุkืฎ•%zyyแฝ{ˆ‹‹รัฃGแๆๆ†-[ถไGๅส•qแยdffโๆอ›ˆŽŽ#))IjWทn]ฌ[ทฐs็N888xyณB… €+VHํMLL0dศDEEaุฐa Eอš5ฑz๕j€ "##@cŒู{เโล‹ˆ‡นน9’““ัถm[ฬš5 ฎฎฎR๛„„ดiำอš5ƒ‘‘Ž?Ž?๘^^^yึฌงงษื'q(ึษษ ƒ Bบuกฅฅ…๖ํ#888ืถycgccƒFมัั...prr˜››รลล...่ัฃ „ฏฟ...066ฦ๒ๅห฿=z๗๎ ###4mฺ4ืu๛๚๚ยืืOž<มล‹_~๙%~wธธธ }๛๖R#GŽ`ฺดiะััžžVญZฅR‰ๅห—ใาฅK7nฦCCC?~0|๘pิฏ_}lR"""’!…B๗ จh$&&ยิิVŸ€ถกiqงHi! •ืฐ_]Yxท[ไ|jX;k/Iต—ิบึ1ิ>ฟ}ญาo๖฿๏„„„พ}‡b‰ˆˆˆจ` vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2ก] ข7ฅyu˜››๗0ŠTFFถoฟ†™_ิ„ŽŽNqงHฑvึ^’j/ฉuฌฝคึ:๎ฑ#"""’ ;""""™เกุh]ิ'๗0Š–: eฌ>๛ ิ*๎ั-ึฮฺKRํ%ตn€ตใj๏ํQ๙Žฉ˜p‘L0ุษƒ‘L0ุษƒ‘L0ุษƒ‘L0ุษƒ‘L0ุษƒ‘L0ุษƒ‘Lศ"ุu์ุŸ๙[/๐เA„‡‡ฟวฮ๘๑ใแ๊๊ t๊ิ )))€เเ`ุรษษ ฝ{๗Ffff‘ˆˆˆ>=Ÿ|ฐณgดดดฉ์222œœœo›‘#G"** ัััจ\น2–-[๐๕๕ELL ฮŸ?ฬฬL„††โใใ฿๋‰ˆˆH^>ฉ`ทt้R8;;รีี&L@FF~๙gŒ7ฎPหฏ]ป;vDDDภรรทo฿FHHฆL™•J…ห—/ใฬ™3pww‡ณณ3๚๗๏ฌฌ,ภ„ เแแ'''Œ3&ืuฤลลaฬ˜1ฐททว•+WถถถHMMฌXฑฃF„HMM…Bก4lุ:::€ฺตkใฮ;€5kึภีี ,@bbb๕ฆฅฅ!11QใADDD๒๕ษป่่h,XฐวŽCTT† ‚ูณg# @ HูBBBG`` ภ฿฿Xณf ๚๕๋‡%K–ภฺฺAAA;v,"##QณfM๔๎‹/FLL ž>}Š5kึ† ‚3gฮ ::ัััˆŠŠdeeaห–-hูฒ%พ๒KTชT gฯž…››[u1•*Uย… คqfหสสBXX5j่฿ฟ?๛oปw๎๎๎่ท/"""๒์{๊ิฉ055•ึึึ…ฺDDD๔)๚d‚มƒแ๏๏ภ‹/ฐ{๗nไh„   €ปปปtˆx๚ €ฆM›ๆผโใใกVซQงN@๗๎q์ุ1ภพ}๛เแแ•J…3gฮ 66ะฎ]; :cฦŒมูณg1pเ@˜ššชฎ3fเฮ;๐๐๐ภฺตk5ๆ=žžž๐๔๔”ฆฺฺูb๒ไษˆ…ทท7|}}1kึฌ\๛=z4ควํท 5&"""๚4}2ม๎u‘‘‘ˆ…๊ีซ‡s็ฮกM›6.===ปw๏ึ—ššŠแร‡cถmˆŽŽFงN––เๅžฑๆอ›ฃOŸ>๘แ‡p๕๊Ueตดด Vซ@ZๆU …]ปvล† คiฟ๖"""0gฮœํ9‚ฝ{cฺดi3f พ๚๊ซ\วฌงงษื'์6lˆตkืJ็‰yyyแฝ{ˆ‹‹รัฃGแๆๆ†-[ถไGZZ๚๗๏ฝ{๗โ๖ํุฝ{7€—็บ%%%ฬฬฬ ฅฅ%f]ณf ๊ีซ‡ิิT(•J”.]OŸ>ล?#๕๋ไไ„… โนsจ^ฝ:บu๋†  ..`ccƒศศHจีjlบUZ๎ีธeหุ8€นs็bร† ะึึ–ฺ์ฝNNN˜9s&บvํŠ .`์ุฑ(_พnV"""’ํ‚›|œœœ0hะ ิญ[ZZZh฿พ=‚ƒƒsm›}~]PPยรร‚eห–แงŸ~B๛๖ํแไไ„%K– u๋ึ8u๊ZทnŽ;",, kืฎล๏ฟŽฏฟiii๐๖๖†ฟฟ?ดดดะตkWิชU VVV๐๒๒สฑRฅJ!00ˆˆˆBูธqใะณgO”-[ฎฎฎR๛QฃFแ๒ๅหP*•pppภโล‹ผ<๏๎ูณghะ €—็Ž5 ๆๆๆุนs'ฌฌฌ็ฆ%"""™P!Dq‚ŠFbb"LMMฑ`_ ŒอŠ{8EK…2๗ฃ๑ิาPพํq>9ฌต—คฺKjkวฺ{{T~ฯƒzฒ~'$$xZี's(–ˆˆˆˆ๒ว`GDDD$ vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2ก] ขืลตฬออ‹{E*##ทGใซฺVะัั)๎แ)ึฮฺKRํ%ตn€ต—ิฺ_ว=vDDDD2ม`GDDD$ vDDDD2มs์J ˆธD?ำ*๎a)uV&เ๔๕(ตJึžตณ๖’T{Iญ`ํ@ัื๎UอฌศึUXcGDDD$ vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ล์:v์ˆฯ?ผภvqqqุฐaร{[opp0BBB[๏โๆอ›จ]ป6T*\]]ฑeหภๅห—แํํ '''ิฎ]‡*ๆ‘ังขศƒž={ ฅฅUจถ๏;ุฝ‹ฌฌฌ7j์ูณ|็WจP'Nœ@dd$v๏Aƒ๔๕๕๑๛๏ฟใ๙๓ C```ก๛$""ข’ํƒปฅK—ยููฎฎฎ˜0a222๐๓ฯ?cธq…Z~์ุฑุตkT*BCC๑่ั#ดhัฮฮฮhึฌ}Šูณg# ฦฦฦmณ!<<!!!XถlฆL™‚ฌ]ป0`ภ4iาร‡วย… 1v์X,[ถ,ื๕๗่ัำงOGƒ /:t‘‘‘ ;;;คคค <<ฟ{กBTญZ111ˆŽŽฦฬ™3‘šš*อปy๓&FŒy๓ๆIำดตตัพ}{์ุฑ๕๚๋/TจP!ฯG„„้q๛๖ํB‹ˆˆˆ>MEvŽ]dd$bccagg‡z๕๊แนshำฆMQญ^’}๘SฉTJ็ออ™35kึDLL ๖ํ'…6044”~=z4–.]ŠgฯžมำำOž<‹‹ –,Y‚ฃGขC‡๘๓ฯ?‘žž.-ฃฅฅ%f ัwถ*Uช L™2ˆ‰‰๐2˜ถm๓็ฯGตjี4ฺ>y๒sๆฬA›6mPชT)ฌ_ฟ>฿ZMLL4DDD$_,ุ5lุkืฎ•ฮ๋๒๒๒ยฝ{๗‡ฃGยออMบ4/ฦฦฦHJJ’žืญ[๋ึญ„……ก^ฝzน.gbbSSS8p ฎ^—˜˜KKK( ฌXฑ"ฯvืฏ_‡Jฅย๘๑ใakk‹ทoC__}๚๔มษ“'1cฦ ์฿ฟ๖๖๖˜5k€—็ฬEEExนw/๛ผภ;w๎เล‹€๛๗๏#::vvvศสสB็ฮัฏ_?4mฺTcบuƒ——ฑcวlฺด อ›7ฯoQ ๒ม‚““ „บu๋ยีี๛฿๒l"g.] ๊โโ‚/^HOc๛๖ํpqqมฦ1y๒ไ<๛ใ?0aยธบบขy๓ๆศศศศณmPPๆฯŸ•Jฅ$_7{๖l8::ยลล๖๖๖puuี˜ฏRฉ‚่่hจT*@ฝz๕`dd๖oฐถถฤฦฦโณฯ>ƒซซ+ZดhYณfกlูฒุฑc๖ํ‡ล‹CฅRAฅR!>>ภห`w้า%๘ใจXฑbžใ$""ข’I!ฒ/น$ูKLL„ฉฉ)v…_‡ฑi้โN‘Rgeโ๑ฅc(k๏ ฅึปf่ฃฤฺY{Iชฝคึ ฐ๖โจซšY‘ฌ'๛๏wBBBงU๑›'ˆˆˆˆdโ“vSฆL‘Yf?>–›ฅO~_ํุฑc1v์ุโQฑ๛ไ๗ุัK vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2๑ษ฿ ˜\[˜››๗0ŠTFFถ_>ซb โN‘bํฌฝ$ี^R๋X{IญucGDDD$ vDDDD2ม`GDDD$<วฎzT้Š๔โF‘สาึบ,ลƒ€JะสL-๎แ)ึ๎ตW๘3๑=ŽŠˆ่รแ;""""™`ฐ#"""’ ;""""™`ฐ#"""’ ;""""™`ฐ#"""’ ;""""™`ฐ#"""’ ;""""™`ฐ#"""’ ;""""™`ฐ#"""’ ;""""™๘`ม.>>ห–-หsพฅฅe}ฌXฑ?~oc*ฬ:‹ส๘๑ใแ๊๊ t๊ิ )))€เเ`ุรษษ ฝ{๗Ffff1”ˆˆˆ>ล์ ใ}ปw‘••U่ถHNNฮทอศ‘#…่่hTฎ\YฺVพพพˆ‰‰ม๙๓็‘™™‰ะะP/ท'Q~[ฐป{๗.ผฝฝกRฉเโโ‚๏พ๛111PฉT˜1c’““ัพ}{888 ((จภ6mฺ„๐๐pดo฿>>>€ๅห—รษษ NNNXฒdIพหOœ8NNNpqqมโล‹ฅ้C† ฃฃ#ฺถm+…ต &ภรรNNN3fŒิึึึฃG†JฅยัฃG๑ีW_มััฮฮฮ หฑฮธธ8Œ3๖๖๖ธrๅŠิGjj*€—AuิจQccc€ฉฉฉP(€† BGGPปvmนsฐfอธบบbม‚HLL,p๛@ZZ5DDD$_๏-ุญYณ7Fdd$"""0y๒d8;;#22#FŒภ‚ `gg‡ุุXดhั<–UฉTาฯR swwวฆM›pไศ๗฿˜2e Ž=Š'N`๖์ูˆ‹‹หu,[ทnลฑcวp๖์YDGGฃSงN€ C‡ธpแิj5๖๏฿เeุ;sๆ ขฃฃจจ(ฉ/[[[DFFยศศทo฿ฦ… ƒVญZxน'oห–-hูฒ%พ๒KTชT gฯž…››[lฤˆจTฉ.\ธ€ภภ@yYYY CฃF๛๗ว฿{๗๎ม}๛๖EDDDพO:ฆฆฆารฺฺบภ1ัง๋ฝ;ฌZต 'NฤีซWa`` 1๘๑ใ๐๗๗ดm†††าผศศH้็eห–ม=Gแแแhฺด)ฬฬฬ`llŒ–-[โิฉSนŽe่ำงtuueส”˜™™มืืเๆๆ&ร}๛๖มรร*• gฮœAllฌิWv(ฌRฅ nบ…oฟ๛๖ํƒฉฉ) ]ปv:t(ฦŒƒณgฯbเภาผ‚ฬ˜1w๎‡‡ึฎ]ซ1o๔่ั๐๔๔„งงง4อึึ“'OFll,ผฝฝแ๋๋‹Yณfๅู่ัฃ‘ =n฿พ]จqัง้ฝ;___>|่ะก๖ํ—ฃM๖แฦโขงง'ฌT*‘••…ิิT >ถm“๖๎ฅฅฅIํฒh้าฅz๕๊aฺดi๐rฏX๓ๆอังO๐รธz๕ชฦ:ตดด Vซ@ฃ฿l …]ปvล† คiฟ๖"""0gฮœํ9‚ฝ{cฺดi3f พ๚๊ซ|๋511ัx‘|ฝท`w๓ๆMTจP๛๗‡ฟฟ?โใใ‘””$อฏ[ท.ึญ[เๅกา์ซ@๓cll,๕แแแ}๛๖!11ฯŸ?วŽ;4๖fฝชqใฦ๘๗฿‘žžx๚๔iž๋HMM…RฉD้าฅ๑๔้S๓ฯ?นถ{๘1„่าฅ ฦŽ+ํetrrยย… q๎9Tฏ^บuCƒ คฝ666ˆŒŒ„Zญฦึญ[ฅ^ €[ถlฝฝ=เภ˜;w.6lุmmmฉอ๎ปแไไ„™3gขkืฎธpแฦŽ‹๒ๅหฐ‰ˆˆจคะ.ธIแVฌXวฟ—๑ฤลลaร† yฮ ษw‡p๚๔iจT*จT*ธปปใฤ‰€cวŽมฮฮฮ๐๒๒BLLL‘Ž‹ˆˆˆ>]ล์ ฃจ‚]VV‚‚‚ะฑcว๗ฒฎlฯž=หwพ““"""‰+V`เภ333lผ111˜4i HOOGJJส{#ษ‹๖๛่ไ๎ป่ิฉ’““กVซQฝzuฤฤฤ@ฅRก{๗๎0`พ๚๊+\พ|พพพ๖ทiำ&„‡‡ฃ}๛๖([ถ,Ž9‚ๅห—cึฌY€มƒใ›oพษuู˜˜๔๊ี YYYP(8pเฦŽ‹ุุXจT*Œ1Wฏ^ลอ›7q้า%ิญ[ฦฦฦฐดดDPP๊ืฏOOO์ปjต[ถlตต5ฎ\น‚nบ!## 4@dd$<จฑ๎ิิTฌ[ท‹/F๚๕๑๓ฯ?#88X๊xนท๒๛044”–KNN†Bก8::Jำ๋ิฉƒ;w๎xฝผผ๐ล_ ((nวดด4คฅฅIฯ \†ˆˆˆ>]๏eš5kะธqcDFF"""“'O†ณณ3"##1bฤ,XฐvvvˆE‹-๐เมiY•J%(:wwwlฺด GŽม‡)Sฆเ่ัฃ8qโfฯžธธธ\วฒdษ 4‘‘‘8v์ŒŒŒ0eส4kึ ‘‘‘่ฝ;เฺตk8|๘ฐ_edd„ˆˆ|๕ีW  :มมมˆŠŠ‚ถถfพ|๙2† '''œ={K—.ลฯ?\เv;rไะขE ,Xฐ ว?๘5”/_.\€ปป;๚๕๋???„……iทืM:ฆฆฆารฺฺบภ1ัง๋ฝ;ฌZต 'NฤีซWa`` 1๘๑ใ๐๗๗ดmVcoUddค๔๓ฒeหเ๎๎žฃ๐๐p4mฺfff066Fห–-q๊ิฉ\วโๅๅ…3f`๚๔้x๔่QŽ–ญ]ปvะััษu^›6mnnnR€ŒŠŠย_|่าฅ‹ิ๖ฏฟ‚““*Tจ€๓็ฯc๎น{๒ใใใƒุุX์ฺต &Lะ˜Lž<<<ฐo฿>$&&โ๙๓็ุฑc<==s]๎ฦจVญ†???\พ|Yฃฏทๅ๊๊Šํทึฏ_/M711ม!C…aร†!445kึฤ๊ีซ666า^ษ-[ถhŒ333p๑โEฤววรษษษhถ-fอšWWWฉ}BBฺดiƒfอšมศศวว//ฏwช‹ˆˆˆไใฝปƒยลลnnn8rไเโโฬ˜1ฤฟ GGGlถ ๅห——–อํ;่ีซz๔่TชT ?๐๊ึญ‹ฯ?ร† ƒญญmฎcYปv-œœœ Rฉ””„ๆอ›รลล/^ผ€JฅBhh่[ี๘๋ฏฟb๘๑PฉTxyฎ{ฟ|}}Š“'OJใ๛๒ห/qๅสธธธเ๙๓R#GŽภีี*• ฝz๕ยชUซ T*ฑ|๙r\บt ใฦƒJฅBบuฅe†Ž๓็ฯcุฐa(]บ๔[ีADDD๒ฅyc$ )))000€Bกภไษ“‘™™‰เเเโึILL„ฉฉ)์ s=uม ศH†B;ซ F๓๋ƒŽH/๎แฉกvๅ๐#ลฒŒŒ l฿พ-[ถฬ๓œZน*ฉต—ิบึ.็ฺณ~'$$xZี{นIIp๊ิ) 6 YYYฐณณรQC""""า๐ษป'OžHทษVถlY์ป๗ƒฌ/๛uDDDDซO6ุ™››3hฝโƒ|ฅ=;""""™`ฐ#"""’ ;""""™`ฐ#"""’ ;""""™`ฐ#"""’ ;""""™๘doPLoO๙อF(ออ‹{EJ™‘l฿ๅ Pส๐{๓S’k'"*iธวŽˆˆˆH&์ˆˆˆˆd‚‡bK ๕ฮฑP฿Kฏl?ฟุึMDD$gcGDDD$ vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ vDDDD2ม`GDDD$ v7nœ๏๘๘x,[ถLzžššŠ† ยออ x๋๕~๕ืPฉTprrBกVซ฿|๓ jึฌ GGGŒ=๚ญ๛'""ข’ฅD;!ิj5๖๎›oปืƒนs็`bb‚s็ฮกAƒน.“’’‚๔๔๔|๛3g"##ƒวc๋ึญ€N:แาฅKˆŠŠยษ“'q่ะ!ภณgฯค<"""*ad์๎ฝ oooจT*ธธธเาฅKpssC‡PซV-|๓อ7าฑ๒ๅหฃpvvฦํทaii 8x๐ š5k†ึญ[ฃz๕๊˜2e `์ุฑˆ‰‰JฅยŒ3ะฃG:t*• Ož<ัว… ๐ํท฿ยััQ bู@pp0BBBฦฦฦ€ฌฌ,คฅฅAกPš4i…Bmmmธธธเฮ;€3fภ๑RSS &iiiHLLิx‘|ษ&ุญYณ7Fdd$""" „@tt4ฦุุX<~7n<|๘ํฺตร๙๓็accฃัฯนs็ฐbล DEE!$$ษษษ˜2e œ‰#F`ูฒehึฌ"##annŽดด4„††ยืืAAA๐๐๐ภล‹Qพ|๙วฝ{wXZZยศศญZตา˜๗๙sl฿พ>>>€ŸK–,ADDœ1|๘p\พ|9ฯพงN SSS้ammฆ›•ˆˆˆ>!ฒ vXตj&NœˆซWฏยภภ5kึ„Jฅ‚Bก€ฟฟ?Ž= เๅžฒfอšๅฺทท7ฬออahh;;;ฝ{ทภuปปปc๖์ูXธp!Ž9‚ž={B__ฟPใ ลปwกฅฅ…}๛๖Iำ…๘๚๋ฏัฏ_?@ๆ่่ˆนs็"&&–––prrย_•k฿ฃGFBB‚๔ธ}๛vกฦDDDDŸ&ู;___>|่ะก๖ํ'ฺ…B!=744ฬณ===้gฅR‰ฌฌฌืฝdษ8::ขSงN˜QQQ2dด‹{๏หมƒ1}๚t่๊๊ยฟ๒ \\\0qโD\ธpพพพh฿พ[๕mnnธธธ G๐๐๐ศต]™2e0lุ0 6 ”ฆOœ8~~~ฐฒฒBอš5ผ v={๖Dbb"„๐๑๑APP`่ะก055…งง'`๘๐แู่ณ'lmmq๒ไI˜››ฟUDDD$oฒ vžวลลAOO/ื๓ฯ๎฿ฟŸ๋๓๚๕๋ฃ~๚า๔Wรูš5k4–yต]n^฿ฝ{wt๏=G›cวŽๅบ์ใวsถ{‰ˆˆจdอกX"""ข’Nถม.๛ฐ%QI!`GDDDTา0ุษƒ‘L0ุษƒ‘L0ุษƒ‘L0ุษƒ‘Lศๆปbฉ๐”อง@in^ร ""ข๗Œ{์ˆˆˆˆd‚มŽˆˆˆH&์ˆˆˆˆd‚็ุ•@ุ๊ฟ 61ศ1]ฺ้ฃFCDDD๏ ๗ุษƒ‘L0ุษƒ‘L0ุษƒ‘L0ุษƒ‘L0ุษƒ‘L0ุษƒ‘L0ุษฤ{ v๑๑๑Xถlู๛์RถฦWWWธธธ SงNHIIรNNN่ป7233‹yคDDD๔ฉ(ฒ`—••๕>WUhลฑŒŒ $''็fไศ‘ˆŠŠBtt4*Wฎ,m7___ฤฤฤเ๙๓ศฬฬDhh(€—–ˆˆˆ(?…vw๏…ทท7T*\\\p๘q็—.]ยุฑc•J…3f`ลŠุ่ฑ#ะฃGะนsgœ9sััั000ภ?#ญื็ฮCฝz๕0hะ lถ ›7oฦไษ“๓๏ตkืp๘๐aฬš5 ฤฒeหฏฟ“&Mสsน'Ož`ร† ˆETTพ๙ๆศณฌฌ,lูฒ-[ถฤ—_~‰J•*แ์ูณpss+p›Ž1•*Uย… จ1/++ aaahิจ ๘๛๏ฟq๏=ธปปฃo฿พˆˆˆศทฉSงยิิTzX[[8&"""๚tiถก‡‡z๕๊ฅR‰N:มววGในƒƒCฎห5o\ฺ;ต~ฤฦฦJ๓ดดดQQQ7nkkkดm๐ล_œกP( ฏฏ'''บu+฿๑ถkื:::HJJยฑcวคฒฒฒPตjี<—355…‘‘ัฎ];ดjี*฿>ฺตk‡ .เ?@ฝz๕ Žฏš1cฆOŸŽ‘#Gbํฺต่ปท4o๔่ั๐๔๔„งงง4อึึ“'OFpp0Vฏ^ ___๔ำO๘๎ป๏rํ๔่ัRx€ฤฤD†;"""+tฐ๓๕๕ลแร‡๑ฯ? C‡˜?~Ž็น&CCC้g…BณgฯBฉิQุทo_์ุฑีซWวฬ™3๑๙sižฎฎ.@ฉTj\ะนsู๋UซีจTฉ"##sดัาา’๛ฆฅฅดตตŽ]ปv!447nฤนs๓์c๊ิฉXธp!๚๔้ƒ๖ํ#00ีซWฯwฏR(ฺ่ต+ฦ/ป฿~๛ ุตkWŽ๖GŽม’%KŽ1cฦเซฏพสs่้้AOO/ฯ๙DDD$/…>{๓ๆMTจP๛๗‡ฟฟ?Ž=ช๑<&&ฦฦฦHJJสณ้"ตZ˜˜@rr2ส•+‡ิิTฌ[ท๎KาdjjŠาฅKc๗๎^^ุp๑โE€ "##กVซฑu๋Vภ๓็ฯ‘€6mฺ`๚๔้ˆŒŒฬท''',\ธ็ฮC๕๊ีัญ[74hะqqqyฎxyฮ^ถ-[ถภpเภฬ;6l€ถ๖็๎ปwรษษ 3gฮDืฎ]qแยŒ;ๅห—ฏ‹ˆˆˆ>]…cw๐เALŸ>บบบ077G=เโโ"=_ปv-ฬออแโโ๔่ัๅส•ำ่cผy ย‚ ‘‘ž={ยููcวŽEํฺตQพ|๙B›๖ฆBCCัฟŒ1™™™1bjีช…qใฦกgฯž([ถ,\]]IIIhำฆ าำำกP(คs้๒๊#[ฉRฅˆภภ@DDDHก,ทuภจQฃp๙๒e(•J888`๑โล^žw๗์ู34hะเ๏๏QฃFม;w๎„••ี{฿>DDD$ !„(๎APัHLL„ฉฉ)^ sƒ๓•ฎ=ŠaTE###ทoGห–-ฅซŽK ึฮฺKRํ%ตn€ตหน๖์ฟ฿ 011ษท-ฟy‚ˆˆˆH& }(๖cดkื.๐รำš7oŽ_~๙ฅ˜FDDDDT|>้`ืฌY34kึฌธ‡ADDD๔QเกX""""™`ฐ#"""’ ;""""™`ฐ#"""’ ;""""™`ฐ#"""’ ;""""™`ฐ#"""’‰O๚ล๔v” 47/๎aั{ฦ=vDDDD2ม`GDDD$ vDDDD2ม`W5„ฺซ;๗0ˆˆˆ่=cฐ#"""’ ;""""™`ฐ#"""’ ;""""™`ฐ#"""’ ;""""™`ฐ#"""’ ;""""™`ฐ#"""’ ;""""™`ฐ#"""’ ;""""™Uฐ‹วฒeหŠ{…r๓ๆMิฎ]*• ฎฎฎุฒe เ๒ๅห๐๖๖†““jืฎC‡๓H‰ˆˆ่SQb‚]VVV‘Žๅูณg๙ฮฏPกNœ8ศศH์ฝƒ ่๋๋ใ๗฿ว๙๓็†ภภภB๗IDDD%'์๎ฝ oooจT*ธธธเ๘๑ใฯ/]บ„ฑcว"&&*• 3fฬภŠ+ะฑcG๘๙๙กGx๐เฺถm www๘๘๘เส•+€xxxภลลฝ{๗†Zญิฏ_฿}๗เแแ๐๐p4jิUชTมถmrŒ1337nDำฆMฅ ถbล Œ5Jjckk‹ิิT่๊๊BOOšš*ญำฦฦ5kึิฌY‰‰‰Bัปwoœ:u๊me"""๚”}2มnอš5hธ1"##h<ทฑฑม”)Sเ์์ŒศศHŒ1ญ[ท",, ร† ร„ Žูณgc๘๐แ€ฮ;ใฬ™3ˆŽŽ†๙็iฝๆๆๆ8w๎๊ีซ‡Aƒaถmุผy3&Ož,ตน}๛6~๑G888`๋ึญ๘้งŸZ`Mืฎ]ƒณณ31๓ทlู‚ฺตkCกPxy˜ถM›6†ปป;/^Œ็ฯŸ็ูZZ5DDD$_ฺล=€ย๒๐๐@ฏ^ฝ T*ัฉS'๘๘๘h t่ะฯ๗ํ—๋r†††าฯ …gฯžEddคดง๚๖ํ‹+V &&C† AZZšดŒฎฎ.@ฉTjœ}ฮž‹‹ –,Y‚ฃGขC‡๘๓ฯ?‘žž.-ฏฅฅ%f ัwถ*Uช L™2ˆ‰‰$&&ขmถ˜?>ชUซฆั๖ษ“'˜3gฺดiƒRฅJa๚๕ynณัฃG#!!Azพ};ฯถDDD๔้๛d‚อ›7QกB๔๏฿8z๔จฦ๓˜˜็น๗ |||ค‹+ิjตค’““Qฎ\9คฆฆbบuo4.}}}๔้ำ'OžฤŒ3ฐ~ุcึฌY^ž3เๅฝ๎นƒ/^๎฿ฟ่่hุูู!++ ;wFฟ~ะดiSuu๋ึ ^^^HLLฤŽ;ฐiำ&4o<ฯฑ้้้มฤฤDใADDD๒๕ษŠ=x๐ ฆOŸ]]]˜››ฃGpqq‘žฏ]ปๆๆๆpqq‹‹ z๔่rๅสi๔1o<aม‚ศศศ@ฯž=แ์์Œฑcวขvํฺ(_พส—/M›6ๅ˜>hะ ้*ึWX๛ขX&11ึึึธ}๛6LLL>ุธŠข๖7m6ตŒฏแดXk/Šu”ิฺ‹๊wm–‘Kํใ็ƒœjฯญฝIIIจXฑbห3ุ• JๅหS*MMM฿่ฏฅฅ๕Aๅ2&&&Ÿ|ํoณเอjX_Cนิ^T(นต่฿๕ทYF.ตฌŸ€}Š๎ปรฤฤfff๘๚๋ฏ๑๙๓"ฌโํL:066†……ฺตk‡ห—/kดIMMลภann###t่ะ<ะhs๋ึ-ดjี †††ฐฐฐภˆ#™™Y”ฅผฑE‹มลลEบฉ——v์ุ!อ—kฏ๛ๅ—_ P(0t่Piš\k†BกะxุK๓ๅZwถ;w๎เซฏพ‚นน9 เ์์Œ๐๐piพ\?๋lmmsผ๎ …Bบฯ›_๗ท&จDXปvญะีีฟปธpแ‚่ทฏ033<(๎กฝตํท‹ฑcวŠ7 bำฆM๓๙ๅajj*6o,ขขขD›6m„x๑โ…ิฆy๓ๆยีีUœ-lmm…‹‹‹2dˆ4]ฎตO˜0A8::Š{๗๎IGI๓ๅZทB<}๚Tุุุˆ^ฝz‰SงN‰๋ืฏ‹]ปv‰Wj#ืฯบ‡jผๆ{๖์ฤ„๒~฿ƒ] ๑ูgŸ‰JฯณฒฒDลŠลิฉS‹qT๏ฯ๋มNญV KKK1cฦ iZ||ผะำำkึฌB+ˆ3gฮHmv์ุ! …ธs็N‘}x๘๐ก :$„xYซŽŽŽXฟ~ฝิๆโล‹€8qโ„โe0V*•โ๛R›E‹ ‘––VดผฃาฅK‹eห–•ˆบ“’’D๕๊ีลž={„ŸŸŸ์ไ\๛„ „ซซkฎ๓ไ\ทB๐รข^ฝzyฮ/IŸuC† UซVjตZ๖ฏ๛ปเกุ ==hธฑ4MฉTขqใฦ8qโD1Ž์รนqใ๎฿ฟฏQณฉฉ)<==ฅšOœ8333ธปปKm7n ฅR‰SงN๙˜฿EBB L™2€ˆˆdddhิoooส•+kิ๏์์Œ๒ๅหKmš5k†ฤฤD\ธpกG๖ฒฒฒฐvํZ$''รหหซDิ=pเ@ดjีJฃF@ฏ๙ีซWQฑbETฉRปwวญ[ทศฟ๎-[ถภ:u‚……ฐt้Ri~I๙ฌKOOว๊ีซังO( ูฟ๎๏‚มฎx๘1ฒฒฒ4Pพ|yฟฟ˜F๕aeื•_อ๗๏฿‡………ฦ|mmm”)Sๆ“ฺ.jตC‡…ทท7œœœผฌMWWfffm_ฏ?ทํ“=๏c###่้้!((›6m‚ƒƒƒ์๋^ปv-ฮž=‹ฉSงๆ˜'็ฺ===ฑbล ์น‹-ย7เใใƒคค$Yื ืฏ_วขE‹Pฝzu์ฺต ๛๗วเมƒฑrๅJ%็ณn๓ๆอˆGฏ^ฝศ๛ฎด‹{D๔nˆ๓็ฯใ่ัฃล=”"SณfMDFF"!!6l@@@:Tร๚ n฿พ!C†`ฯž=ะืื/๎แฉ-ZH?ปธธภำำ666๘๓ฯ?a``PŒ#๛๐ิj5๑๓ฯ?py„„„  ˜GWt~๛ํ7ดhั+V,๎ก|๔ธวฎ([ถ,ดดดr\-๔เมXZZำจ>ฌ์บ๒ซูาา>ิ˜Ÿ™™‰งOŸ~2eะ Aุบu+8+++iบฅฅ%าำำฏั๕๚s>ู๓>fบบบจVญ๊ิฉƒฉSงยีีs็ฮ•ux๘๐!jืฎ mmmhkkใะกC๘฿mmm”/_^ถตฟฮฬฬ 5jิภฟ+๋ื*Tจiตjี’E—„ฯบ›7ob๏ฝ ”ฆษu v%€ฎฎ.๊ิฉƒ}๛๖Iำิj5๖ํ//ฏbู‡cggKKKšq๊ิ)ฉf///ฤวว#""Bjณ~จีjxzz๙˜฿„ƒ ยฆM›ฐ~ุููiฬฏSงttt4๊ฟ|๙2nบฅQLLŒฦž={`bb’ใษวNญV#--Mึu7jิ111ˆŒŒ”๎๎๎่ฝป๔ณ\k๓็ฯqํฺ5TจPAึฏ9x{{็ธ•ั•+W`cc@Ÿuฐ|๙rXXX UซVา4นฟ๎๏คธฏ ขฑvํZกงง'VฌX!bccล7฿|#ฬฬฬ4ฎ๚ิ$%%‰s็ฮ‰s็ฮ b๖์ูโนsโๆอ›Bˆ—ท033ทˆŽŽmถอ๕nnnโิฉSโ่ัฃขz๕๊-„ขยิิTBศทn!^ฺF[[[L™2E\ฝzU„†† CCCฑz๕jฉœ?๋ฒฒฒDๅส•ล?cžœ_๗wม`W‚ฬ›7OTฎ\Y่๊๊Šฯ>๛Lœ๓โัG‰มŽˆdหึึฅJ•Brrฒ4-%%ฦฦฦฐตตีhghh###˜››ฃs็ฮx๖์™F_‘‘‘o&BBBะถm[ฝS๏… ค/Jะ<ˆjีชiL๋ีซ&Ožึ}ึจQ–––๘็ŸuxDฒร`GDฒVฉR%lผYz๗฿ฃB… 9ฺํฝฯŸ?วญ[ทžžŽI“&iฬ฿นs'š7oF๋ํท฿ะตkืท๗›ศฬฬเ๋๘XdืฺตkW,[ถฌ˜GC๔๑aฐ#"Yฺ๋ต+BCCฅ็ซWฏF๗๎๓l_ชT)ดiำ/^ิ˜ž์^ผxฎ]ปขL™2(Sฆ |||rํ็ึญ[ธ{๗.œฅiถถถ˜1cjีชccc๘ใธ|๙2ajjŠ   ฉญZญฦ„ `mm *`๐เมHKKฌXฑ 4@ฟ~`jjŠๅห—ใ้ำง่ึญ,,,PฅJฌ\น2ฯ_=ฌบu๋VิฌYSฺ‹นvํฺ<—;~8jิจsss|๗Pซีาผ  z๕๊([ถ,œœŒฌฌ,ดhัืฏ_‡‘‘ŒŒŒฐrๅJ„††bาคI022’jމ‰ฏฏ/J—.:u๊ <<\๊[กP`๙ฐณณCƒ พพพุทo_‰ ตD…"ˆˆdสฦฦFœ๋บทn*๊ิฉ“c<~~~โษ“'โโล‹BOOO4iาDบuKปwO”/_^์฿ฟ_!ฤ’%K„ƒƒƒธ}๛ถx๘ฑจ[ทฎ4ฆๅห— ---ฑ|๙r‘••%RRRDห–-ลw฿}'RSSลล‹E… DTTTž%ป๒ๅห‹ฃG !„ธw๏žธpแBžหจT*q๏=q็ฮแเเ –-[&„โฯ?NNN"..Nคคคˆฎ]ปŠ๏พ๛N!ฤDีชU5๚ “&M’ž'%%‰Š+Š 6ˆฬฬLฑiำ&amm-^ผx!„€hำฆHHH)))าr&&&โาฅKนŽ—จคโ;"’5---t์ุ๋ึญรบu๋ะกChiiๅhืขE ˜™™กt้าธrๅ ๚๗๏/อทo T*กฃฃƒ'Ožเ๚๕๋ะึึฮs]|||ฎ็ึ <eส”ฝฝ=\]]ัผysX[[ราา~~~ˆŠŠฌ]ป฿=ฌฌฌ`nnŽkึฌ‘๚ฉZต*z๕๊ฅR‰„„>)))hืฎZตj%อ{๕บ=z QฃFh฿พ=lll0u๊ิ\๛355อ๕jX ้gƒฯณ—น{๗.*Wฎ,อณฑฑมปwฅ็VVVาฯทnBjj*ส•+333˜™™a๑โลธ~พ6lุ€M›6มสส อ›7ฯq๚Uึึึ?฿ปwOZฟ~คuืซW=*pฏŽะกCา๒fffธx๑bž๕fKJJ‚ฉฉiกืCT0ุ‘์นปปใ้ำงx๖์<<<๒mซงง‡=z ""?๐๒ยŠfอštuu๑ำO?แส•+ุตkๆฮ‹ƒๆ่วููืฎ]{๋1WฌXทn’ž฿บu +V”ž+ ้็J•*มศศฯž=C||<โใใ‘””„ืใ้้‰mถแมƒpuuีุS๙บทokœ}JฅJ•ฐrๅJi๑๑๑า•ศฏŽ3ทฑg/฿ฌYณหw๋ึ-ฯe๎฿ฟฬฬLTญZตภ‰J;"*6nXจC“ ƒ……ฬออq้า%˜˜˜H!ๆภธpแิj5LLL ญญ๋ก]XZZ"&&ๆญฦฅKฬš5 w๎มำงO1iา$๘๛๛็ฺถRฅJ๐๒๒ยธqใ’’‚ฬฬLœ={ฑฑฑ๙ฎ#==aaaHLL„ŽŽŒŒŒrญ%ผy๓๐เมปwsๆฬA็ฮ}๚๔มฯ?,ู{๗๎a็ฮ^๎ก|๔่‘ฦ-g,,,'=โ‹/p๎9lผ™™™x๑โv๎™๏aึร‡ฃaร†ะึึฮทFข’†มŽˆJ‡|ฯkฺด)ŒŒŒPถlY8p›7o†Bกศq›“{๗๎ก]ปv011‡‡๚๕๋—็yv_ตฦyqoโ๋ฏฟF๛๖ํ๑ูgŸมมมฎฎฎ=ztžํCCC๑฿กJ•*ฐฐฐภะกC๑โล‹ืณrๅJุุุ t้าุณgๆฯŸŸgฮ;รววNNNhาค z๗๎ เๅ•ว_5Zตj๘๙๙IกฒVญZhถ-ฌญญaffเe็s็}ฯฝ๗ํs–ซ"„ """"ูQ-๏ˆˆˆˆจ|ฐ$"""’)‚DDDD2ลBˆˆˆHฆXษ A""""™b!HDDD$S,‰ˆˆˆdŠ… ‘Lฑค ฉOŸ>ะีี-๏0 lผนผC)‘ะะPจจจเัฃGๅ ษDำฆMแเเPa|tTTTZaผ‰‰‰PQQมชUซส;” Az+ปvํ๚h?lˆJjฦŒุถm[‰/Yฒ=z๔@ญZต ขข‚>}๚ุ.ฏ0WUUลํท๓อOMM…ถถ6TTT0t่ะทŒžŠ๓๙s„††"""โฝฏ๛ไษ“ Err๒{_๗วจ$ฏๅะผys@OOnnnุธqcกํ๗_hiiAEE‘‘‘oฯปwŠ่่่7Z๎]`!Hoeืฎ]˜>>จ\น2๊ิฉ#_xไศ4lฺฺฺุฐฑฑม”–ฟy๓& hkkรศศ=z๔@bbขRปUซVAEEGŽมเมƒabbss๓Bs{๓ๆMิฉSธ>€—ซพ|๙r‰ฯ%ฐฒฒสท|^ ๊sำฆMฐณณƒถถ6<==Xบt)๊ิฉ---4mฺ4฿˜'** 5‚ถถ6ฌญญ–ฏMff&&Mš„:u๊@SS=z4233 Œ)<<๖๖๖ะิิ”ถqร† pssƒžž๔๕๕แ่่Xไ—~bb"Œ“'O–^ใWO‰)ษพ[˜ ภ•+WF•*Uเ๎๎Žu๋ึx™๏QฃFฌญญฅu็ๅฐจํ|=ฦ’พw€—฿฿~๛-ชUซ===t๊ิ w๎ษืgZZ†.}™˜˜ UซV8w๎œิๆM>+ฌฌฌ |๏4mฺM›6•žtŽ`๙โw๎A—.] ซซ cccŒ9นนนาrEฝ–aaaศออล”)Sฯž=ห๗=๒ช์์l 6 ร† Cํฺต‹พืEDDภรระทo_)žr;๗Qฝโ๔้ำBMMMŒ1Bšๆ็็'ดตตEBB‚Bˆ“'OŠVญZ bอš5าC! …hผนPQQ๛๗ .;vฤ๐แร•ึๅแแ!๚๔้#~๙ๅฑ`มับuk@,\ธฐุ8ƒ‚‚„–––จ[ทฎ  .:tฤ? ิถB]]] 0@„……‰1cฦแแแ!ฒฒฒคv–––ยฦฦFTฏ^]Œ?^,\ธP4hะ@จจจˆ .Hําาา„ƒƒƒPSS K–,SงNโ๙๓B!>,WWWแๆๆ&~๙ๅ**Wฎ,>๔Sฅ๘|||„™™™ฐฐฐฃF ,vvvBMMMlุฐA˜ššŠะะP1o|XฌYณFhjjŠ&MšH๏“'O›—<:::"((จภyy๛เมannฎดOฯ›7OˆŒŒ @ 2คุuฮฮฮขFb๊ิฉbผyโ“O>•+W=’ฺ KKหBใyฝO'''aaa!~๑G๑ใ? QซV-ฑpแBagg'ๆฬ™#&L˜ 444Dณfอ”–ฯ๏MLLฤะกCล๙๓Eใฦ๑ฟOj—››+Zทn-*Wฎ,†.–.]*†*ิีีE็ฮ๓ลTฟ~}all,&Ož,-Z$ฮŸ?/๖ํ'ˆ-ZˆE‹‰E‹‰กC‡Š=zšณgฯž‰%K–ขkืฎาk#„(๙พ[eห– ข{๗๎b้าฅโื__}๕•๘๖o…Bฤฤฤ@๒ห/าบŸ={Vไvๆอ{๕Yา๗ŽB๔์ูSbัขEขgฯžยูู9_ŸBCCC|๗wbลŠโงŸ~;vkืฎ•ฺผษg…ฅฅe๏แใใ#=ฟqใ† Vฎ\)Mห๛.ฐทท๚๕K–,บuฤโล‹…ลฟ–nnnยษษIฌ[ทNิฌYSUชT&Lนนน๙โš5k–011)))า็ู๊ณg‹ฮ<๗๎SฆLฤื_-ล๓๏ฟ–ธฒฤB๒7nœPUUG›6mฤผy๓”ฺ 2$฿ƒBlถMำฆMSšฝ{wกขข"ฎ]ป&M{yพๅดi#>๙ไ“bc ฤ7฿|#MS(ข}๛๖BCCC*^Ž;&ˆ๐๐pฅๅ๗์ู“oบฅฅฅ Ž=*M{๐เะิิ฿ฝ4mโฤ‰€ุฒeKพธ …โ?๋ืฏ/233ฅ๙ฟ๚ซ โโโคi>>>€Xทn4ํ๒ๅห€PUUงOŸ–ฆ๏ป7฿aAy|(FŽ)๊ิฉ#อ๓๐๐}๛๖Bˆ7*544”111๙r๕ฆ… ฆฆฆRัณt้R@˜šš*geธq€Rผ~ฮœ9าดฬฬLiŸศ+ฦืฌY#TUUลฑcว”ึ&ˆ'N(ลคชช*.^ผจิvุฐaB__?฿~_œ‡บฟ—t฿-H็ฮ…ฝฝ}‘mfฯž/gy ฮผy‚ลฝwขขข {Ÿ>}๒๕i``P์~๗> Abส”)Jหๆ'กกกฐททGPP |๛ํท%Zvืฎ]PSSหื๛๏ฟ‡ปw๏–ฆฝzŽUJJ =z\ฟ~)))%Z฿ซWLๆ.ษสส’Ÿnฺด hีช=z$= ซซ‹ร‡+๕ggg‡&MšHฯaccƒ๋ืฏKำ๓O8;;ฃkืฎ๙โy๐Y฿พ}กกก!=ฯ๋๛ี@WW~~~าsข~๚hุฐก4=๏๏W—5ูููx๘1๊ิฉCCCฅC5y 55ต|ำเย… ๐๑๑••8€*Uช(อoฺด)„ล^1~yธqร‡‡กกกาผผ%%%!::}๚๔AีชUฅ๙NNNhีชvํฺ•ฏ฿เเ`ฅ็Mš4มใว‘šš จWฏ\\\”ฎ๔หออลๆอ›ัฑcG)Woบ_X[[ฃM›6En๓ป€kืฎแ์ูณาฟorX8Oห–-•c999A__?฿พ๘&Zดhกt(9o์ึญ๔๔๔๒M}]๊๊๊8p ๔\CCฤƒเๅkUฟ~}ฺฺุ*ฝVอ›7€|ฏ•์์์”ฆ"==๛๗๏๋m}ี์ปฏว๓฿แ์ูณoCAY”โ;y‡–ฌิ๎›oพษื—กก!ฮœ9ƒปw๏บพ’~V”•‚ถฏค๛๖ณgฯ๐๔้SLž<SฆLAทnŽถmโื_EZZšิvฬ˜1๘ไ“Oะฟ2ฟ<ฑค|444๐oฟแฦHKKรส•+K|^ำอ›7affฆ๔%๕๋ื—ๆ็9qโZถl)_cllŒ๑ใว@‰ AUUU|๒ษ'Jำ๊ีซาน4Wฏ^EJJ LLL`llฌ๔x๖์Y{็ๆอ›PUUอืo:u๒๕5kึ,\ธp๘๔ำOZชP”––––t`ž7ูท๓ƒ่๏๏ฏ4฿฿/^ผภ๙๓็งOŸฦš5k๐ห/ฟ@U๕ใ)Ÿxี0h๏ฝ€ŒŒ \ฝzตฬฟ๗_ดhัถถถ˜;w.,,, กก]ปvแ—_~Bก(“๕( ˜˜˜ <<ผภ๙ฏx6R&Š8qธ(%ํฏฐv%Y›oพมส•+1|๘pxzzยภภ***๐๓๓+0E]ํฺญ[7ฌ^ฝแแแJ#5Š’ไใ‹/พภธqใฐiำ& >๑ ะถm[ฉอ›๎os…pY ภ’%K งง‡/พ๘โญพ„J’ปยร—wา}I๛,ห๗‘Bก€ฃฃ#ๆฮ[เื‹ฮ‚^+DGGc๏ฝุฝ{7v๏•+Wขw๏Xฝz๕วTZ๕๋ืGBBv์ุ={๖เฯ?ฤโล‹1qโฤ฿–๋M๗ษฒ|Mz๖์‰&Mš`๋ึญุทofฯžŸ~๚ [ถlAปvํธฟข๖ปยโ~UIฺลฬฬ Wฏ^E๕๊ี•ฆ›˜˜๘by๔่ัhาค ฌญญฅจไ] “””„[ทn๘ฎ Aส'66SฆLA฿พ}๛#..N๚_=P๘ืาา@ZZšาจ`U–––€ฟ™™™ุพ}ปา็๕ร}`ff†_ซVญย๛๗1bฤฅvyrฏ๏๔พพพศออลย… •ฆ๒ห/PQQ‘>$๒๗๊FSRRฐrๅส7Š๗ี๕!ฐpแBTชT -Zด๐๒ฎนนน˜:ujพesrrชX๊ึญbbbฐu๋ึ|๓vไฐ4ิิิ๒ญwม‚…ŽโEEEห–-C๗๎„ํท+อ/้-!4hkkkฬ›7/_Ž๓bญQฃ\\\ฐz๕jฅ6.\ภพ}๛เ๋๋๛ฦ๑็๙โ‹/p๚๔i๖ox๔่‘าaa ์๖ ๗๒หตkืฦผy๓0sๆL|๚้ง๏t=)))ˆ•ฆ%%%ธฏ—…œœ,]บTzž••…ฅK—ยุุnnn^พVw๎ม๒ๅห๓-โล‹"มๆy๘ฑาsUUU899@พ[ะผชrๅส๒ฮ•v฿}= ุููA์์l…ฦพ+y็ภ.^ผXi๚‚ ”ž็ๆๆๆ;ๅฤฤฤfffJน|“วิฎ]งOŸFVV–4mวŽEฬ๙M๖Z>๗ฟIำ Vฎ\‰ชUซJ๛โฒeหฐu๋VฅG9”?sกG ๒พ_฿ขpD”L›6 ััั8x๐ ๔๔๔เไไ„‰'bย„ ่ฝป๔—๗ฦ๘๖oัฆMจฉฉมฯฯ;vDณfอ‚ฤฤD8;;c฿พ}๘๋ฏฟ0|๘piคจu๋ึาะˆgฯža๙๒ๅ011ARRR‰bีาายž={„† b๗๎ุนs'ฦ/ฮววฤฬ™3-9๊ีซุดi~๕Wฅ{ห•ฤจQฃฐy๓f๔่ั๚๕ƒ››ž-[ถLธนน mmmกงง'ล่ัฃลปwฅ6–––ข}๛๖๙–}B๑๘๑c1t่PQณfMกกก!ฬออEPPtOถผ['ผz฿:! พOท’(,ผvหงOŸŠพ}๛Šjีช ]]]ัฆMq๙๒ๅ|ทd(๊6ฏ฿GPˆ—ทฅ๑๑๑บบบา-lไ–Bq๘qัชU+กงง'ttt„““Sพ[ป8p@xyy mmmกฏฏ/:v์(โใใ‹๏ีm*h๑๒๒D ฏ4๛…/o๓ใํํ-ดตต€bo%“wซ‹‚ฏ๎…m๏๋^฿ด]AทํุทoŸpppยฦฦFฌ]ปถะวผg={๖lฅ้ฝ๒๖๛ศศHแ้้)ดดด„ฅฅe๗อสส?๔“ฐททšššขJ•*ยออMLžxัััpuuลฺตkัซWฏ๒‡ž#HDDDJ?-šgผyPUU…ททw9DD๏ฯ$"""ฬš5 QQQhึฌิีีฅ[ํ|๕ื๙nำCหสสย“'OŠlc``P๎ทคz ๖๏฿ษ“'#>>ฯž=CญZตˆจซsจ$"""ะฌYณ"ฌ\น}๚๔y?• A"""ข2๐๔้S้็ coo5jผงˆŠวBˆˆˆHฆxฑ‘Lฑ$"*กทoCKK 'Nœ(๏PสLDDTTTQ๊พš6m ‡า๕๘์ณฯ0z๔่๒ƒ่c!HD๏ีชUซ ขข?~<฿|!,,, ขข‚:(อห[.๏กฃฃ;;;L›6 ฯŸ?/p}qqqPQQม?Sุ๊งL™‚† ยหหซิ}Qษฬ˜1ถmห7ไษ“ }g?ั5fฬ,Zด๗๎{'}(XQนะาายบu๋๒M?rไ๛๏?้g^ืชU+ฌYณkึฌมœ9sเ๊๊Š~๘AAAถ฿นs'LLLเแแQชx>|ˆีซW#88ธT|hผฝฝ๑โล‹๖>qE‚“'O~g…`็ฮกฏฏŸ๏ทw‰>6ผœˆส…ฏฏ/6mฺ„๙๓็+šbบupss+๔ว๊๋ีซ‡/ฟRzŒฌฌ,lูฒะาาRjฟkื.ดkืN๚ญิทตvํZจซซฃcวŽฅ๊ง,ฅงง—๚ทgUUU๓ๅLฮž?Žส•+CUUปwว๏ฟŽษ“'—z!๚PqDˆส…ฟฟ??~Œ๛๗Kำฒฒฒฐy๓fผQ_ฆฆฆPQQษwฏณไไdœ๑๋ฏฟปŽmถกaร†ะีีUšžw^\ll,|||PนreิฉS›7o๐r„ณaร†ะึึ† 8ฏ๏๓็ฯฃ]ปvะืื‡ฎฎ.ZดhำงO+ตษ;ค~ไศ <&&&077—ๆ๏ฝMš4ŽŽ๔๔๔ะพ}{\ผxฑุํ*่มซWฏข[ทn055…––ฬออแ็็‡”””b๛€จจ(4jิฺฺฺฐถถFXXXพ6™™™˜4i๊ิฉMMMXXX`๔่ัศฬฬ”ฺจจจ ==ซWฏ–N่ำงBCC1jิ(€ตตต4/11QZvํฺตpssƒถถ6ชVญ ???พ}[)†ผื.** จ\น2ฦ/อoีชnผ‰่่่m7QEฤBˆส…••<==ฑ~ziฺ๎ป‘’’??ฟB—หศศภฃG๐่ั#ผy๋ึญร๊ีซฏปw/TTTะบuk/o˜๋๏๏*UชเงŸ~ย?ˆฆM›{๑Gvv6ฮž=‹ 8้ำง่ะก6lˆYณfASS~~~ุธq#เ๋๋‹้้้่ฝ;าาาคe/^ผˆ&Mš &&ฃGฦ?€7n iำฆ8sๆLพu <๑๑๑˜8q"ฦŽ Xณf ฺทo]]]๔ำO๘แ‡ฦ+G%‘••…6mฺเ๔้ำ๘ๆ›oฐhั"|๕ืธ~z‰ร>}๚พพพpssรฌYณ`nnŽAƒแท฿~“ฺ( t๊ิ ?3:v์ˆ  K—.๘ๅ—_๐ล_HํึฌYMMM4iาD:`เภ๘๓ฯแ๏๏๘ๅ—_คyฦฦฦ€้ำงฃw๏จ[ท.ๆฮ‹แร‡ใเมƒ๐๖๖ฮท ?Fปvํเโโ‚y๓ๆ) ุออ >ช‹ƒˆ๒DD๏ัส•+q๖์YฑpแBกงง'ž?.„ขGขYณfB!,--E๛๖ํ•–PเฃK—."###฿บ…๔|ุฐaB___ไไไผQฬืฎ]ฤ‚ ๒อ๓๑๑ฤบu๋คi—/_„ชชช8}๚ด4}๏ฝ€Xนrฅ4ญK—.BCCC๛๏ฟาดปw๏ ===แํํ-Mหห[ใฦ•โOKK†††bภ€JqปwOไ›บร‡ โ๐แรB!ฮŸ?/ˆM›6”ไๅbฮœ9าดฬฬLแโโ"LLLDVV–Bˆ5kึUUUq์ุ1ฅๅรยยqโฤ išŽŽŽ สทฎูณg โฦJำ…ššš˜>}บา๔ธธ8กฎฎฎ4=/ฐฐฐBทICCC 4จุm'ชจ8"HDๅฆgฯžx๑โv์ุดด4์ุฑฃุรย;wฦ๛ฑ~๕ื_7n๖์ูƒ€€ˆW๎ฏP(ฐgฯฅรย†††HOOW:]?TฉRฅภ๙บบบJฃ˜666044D๚๕ัฐaCiz฿ืฏ_ไๆๆb฿พ}่าฅ >๙ไฉ]5€ใว#55Ui] €ššš๔|HNN†ฟฟฟ4R๚่ั#จฉฉกaร†8|๘๐mซ€—ฃฉ…]‰]uuu 8Pzฎกกโมƒา/.lฺด ๕๋ื‡ญญญRฬอ›7€7Ž๙U[ถlBก@ฯž=•๚655Eบu๓๕ญฉฉ‰พ}๛ฺ_•*U =_•่cภ‹Eˆจฃeห–Xทnž?Ž\t๏ฝศeฬออัฒeK้yงN`dd„‘#GbวŽาลgฯžลร‡• มมƒใ?@ปvํPณfMดn={๖DถmKฏ(ไ‡˜ฬออ๓]L``` ‹|ำ€—‡O—W"?666๙๚ฌ_ฟ> n฿พ {{{iบตตตRปซWฏ€TDฝN__ฟจMสวฺฺ฿}๗ๆฮ‹๐๐p4iา:uย—_~)ล_33ณ|ฐิซW˜˜ˆฯ>๛ Wฏ^ลฅK—คCนฏ{๐เมลชซWฏBบu๋8ฟRฅJJฯkึฌ B๛B๐B๚จฑ$ขr€เฝ{hืฎ ฿ธ-ZŽ=*‚ปvํ‚••์์์คv&&&ˆŽŽฦฝ{ฑ{๗n์ฝ+WฎD๏ฝฑz๕๊B๛722๐๋^ก+ษ๔ย ส’ะึึVzฎP(ผ<Ÿฮิิ4_๛ืฯ›,‰9sๆ OŸ>๘๋ฏฟฐo฿>|๛ํท˜9s&NŸ>ญtสR(pttฤนs œzฆ}ซจจ`๗๎ๆ๕‹}^ฯ็๋’““QญZตทއ่CวBˆสUืฎ]1pเ@œ>}7n|ซ>rrrฯž=“ฆํนพพพ๙ฺjhh cวŽุ่ฑ# ŒฅK—โ‡~@:u ์ฟVญZะึึฦ7*พยฃrๅสHHHศ7๏๒ๅหPUU-ถ(ช]ป6€—E๎ซ#ฅฅๅ่่GGGL˜0'Ož„——ยยย0mฺด"—ป{๗nพฺ\นrภห „๒bމ‰A‹-Šm+l~aำkืฎ !ฌญญฅ‘ศทu็ฮdeeก~๚ฅ๊‡่Cฦs‰จ\้๊๊bษ’% }๋{๔๗฿gggภ๛๗q๎9ฅรยภŸ๋—GUUNNN t’ืUชT ๎๎๎ˆŒŒ|ซ๘ ฃฆฆ†ึญ[ใฏฟRบบ๗๛Xทn7n\์ก6mฺ@__3fฬ@vvvพ๙>|ฃ˜RSSฅย:ฃฃ#TUU‹ฬQžœœ,]บTzž••…ฅK—ยุุXบ ทgฯžธs็–/_žo๙/^ ==]zฎฃฃSเีสy…ๆ๋๓>sจฉฉa๒ไษ๙F^…๙๖ขไำุจQฃ/CTัpDˆส]aฟ R+Wฎ`ํฺต^๗๔้ำXฝz5๊ิฉƒภภ@/ kii) ๚๗๏'Ož y๓ๆ077วอ›7ฑ`มธธธ;๊ำนsg„„„ 55๕ฯป+สดiำฐ~4nƒ†บบ:–.]ŠฬฬLฬš5ซุๅ๕๕๕ฑdษขAƒ๐๓๓ƒฑฑ1nบ…;wยหห .,q<‡ยะกCัฃGิซW999Xณf ิิิะญ[ทb—733รO?„ฤฤDิซW7nDtt4–-[&Ÿˆ?๘มมม8|๘0ผผผ››‹ห—/ใ?ภฝ{แ๎๎เๅ-\8€นs็ยฬฬ ึึึhุฐกTT†„„ภฯฯ•*UBวŽQปvmL›6 ใฦCbb"บt้===ธq[ทnลื_‘#G–(๛๗๏GญZตเ๊๊ZโU8ๅwม2ษัซท)JInฃฆฆ&ฬออลื_-๎฿ฟ/ต๋ฝป๐๕๕อื็ๆอ›E๋ึญ…‰‰‰ะะะตjีIIIลฦ}}กฎฎ.ึฌYฃ4ววGุ—(ผm2dˆาดs็ฮ‰6mฺ]]]QนreัฌY3q๒ไIฅ6ลๅํ๐แรขM›6ยภภ@hii‰ฺตk‹>}๚ˆศศศ"ท๋๕ว\ฟ~]๔๋ืOิฎ][hii‰ชUซŠfอš‰ูŸ‹ศศHแ้้)ดดด„ฅฅฅXธpaพถYYYโงŸ~๖๖๖BSSSTฉREธนน‰ษ“'‹””ฉๅห—…ทททะึึ”n%3u๊TQณfMกชชš๏V2๙งhธฑะัั:::ยึึV 2D$$$ไ‹ท นนนขFbย„ ลn7QEฆ"D)ฮZ&"๚ภไไไภศศ3gฮฤเมƒหด๏ฏพ๚ Wฎ\มฑcวสด_๚๐lถ ๘๗฿QฃF๒‡่a!HD•`๑โล8p`™฿บu ๕๊ีรมƒแๅๅUฆ}ำ‡ลำำMš4)ัแyขŠŒ… ‘L๑ชa""""™b!HDDD$S,‰ˆˆˆdŠ… ‘L๑†า2ขP(p๗๎]่้้๑Gิ‰ˆˆ*!าาา`ffUีฒรc!(#w๏-ีนQ๙น}๛6ฬออหดO‚2ขงงธqใชVญZฮัT\ูููุทoZทn-dฝ9ๆฑ๔˜รฒม<– ๆฑ๔ หajj*,,,ค๏๑ฒฤBPF๒๋้้•้oฅสMvv6*Wฎ }}}~ุ•๓Xzฬaู`ห๓Xzลๅ๐]œึล‹EˆˆˆˆdŠ… ‘Lฑ$"""’)‚DDDD2ลBˆˆˆHฆXษ A""""™b!HDDD$S,‰ˆˆˆdŠ… ‘Lฑ$"""’)‚DDDD2ลBˆˆˆHฆXษ”zy@๏_›y' ะะ-๏0*, Uq@“YG‘ฅP)๏p*,ๆฑ๔˜รฒม<– ๆ8๗C๓๒แqDˆˆˆHฆXษ A""""™b!HDDD$S,‰ˆˆˆdŠ… ‘Lฑ$"""’)‚DDDD2ลBˆˆˆHฆXษ A""""™b!HDDD$S,‰ˆˆˆd๊‚ปwวgŸ}Vๆn฿พ๓็ฯlถ ืฎ]+uŸ~~~ˆˆˆ(u?%ฅP(0|๘pุุุภึึ๛๖ํSš?rไH˜ššพทxˆˆˆH~ิ฿Uว๛๗๏‡ššZ™๗›››‹N:Iฯทm---ิฉSงฬื๕ถฒณณ‘••B,_พ … ศออEJJŠ4/>>๗๎SjŸœœ CCรw2ษP™Œ._พŽŽŽpvvฦคI“3f`ย„ %Z~ภ€8|๘0ภููฟ๒ (('OžฤชUซะฝ{w๘๘๘ 00ซVญยุฑcqๆฬl฿พC† ‹‹ าาา๐ฯ? I“&hะ z๔่็ฯŸบ~๘666hบ5?~,M฿นs'>๛์3ธธธ 88 …ขภํ|]bb"ฦ[[[\นr`ee…ŒŒ โฮ๋+$$ ฆฆ†ชUซJŒ=3fฬP๊{๚๕pvvฦขE‹ššZขผfff"55U้ADDD”งิ…`ll,-Z„'N &&ร† รนs===ฅถaaa DFFข///œ}๐่ั#ฬ›7ˆŽŽ†ššถlูRเv/G(ทo฿___|๙็จYณ&ฮ;WWื"๓–””„๙๓็รออ HNNlธ๎๎๎จUซ–R๛AƒแฏฟBRR1`ภDEEนŽ™3gยภภ@zXXXูžˆˆˆไฅิ…`DD ฏฏx๑โ๖ํ‡   |mƒƒƒ pwwวŠ+ผ,Oœ8SงNกK—.ธ>๎฿ฟCCChjjฺถm›ฏฐ|]BBbccัฌY3ธธธ`ๅส•ธy๓fmOž<‰ฯ?•*UBอš5ัคIภฉSง+8pืฏ_ฯทy#x]บtม๐แร1~xœ;wC† AฑyKIIตต5ขขขเเเ€)Sฆ ==๓็ฯว˜1c \ฦสส ำฆMC||<ผผผเํํ9sๆบŽqใฦ!%%Ezพ}ปุธˆˆˆH>สม่่hฤววรฺฺ999x๘๐!:u๊„ํทบLบuqํฺ5;v ญZตยีซWฑfอ4jิHjSนrๅbื-„€‡‡Gพ / ฃขข’๏o!:w๎Œeห–)ตอป8ๅu3gฮฤโล‹ัฏ_?tํฺ๛๗Gบuฅ๙jjjากๅฬฬLiบ™™บtฺ้่ต+†Š๋ืฏใฺตkจ_ฟ>เแร‡hะ ฮ;'-w์ุ1,[ถ ‘‘‘?~<พ๒หBทOSSS*ค‰ˆˆˆ^W๊มๆอ›cร† า๙gžžžHJJBbb"Ž?WWื"‹ภ๔Sxyyaผy๐๒๒*v9===คฅฅlmmqใฦ ฤลลาำำ ฝขธQฃFุบu+ฒณณq๗๎];v ๐ูgŸแเมƒ๘๏ฟ?ฦ—o;Ÿ‘˜˜cccฉทo๐๓ฯ?ร฿฿/^DHHชWฏ^lŽˆˆˆˆ R๊BะมมC‡EฃFเ์์\่ศP๘9‚ภหรรฦฦฦะึึ†——๎นฃ4"X???Lš4 ...ศฬฬฤบu๋ gggxzzZ~๚้งhัขะทo_้67&&&Xดh:w๎ '''ดn<(v;uttะฟœ={?3ิี_ถN˜0ฝ{๗FฃF`ff&ต7n–,Y'''lบ'N,r;ŒŒฐgฯ๕ื_๐๕๕…ช*oIDDDฅฃ"„ๅฝฉฉฉ000€„ฟ ะะ-๏p*, Uqฯ0๓‚.ฒ*ล/@bK9,ฬcู`s?4/ี๒ูููุตk|}}QฉR%iz๗wJJŠtญBYแฐ‘LฝณJH6lจtก๐๒๖1ๅQ๙“E!xๆฬ™๒ˆˆˆ่ƒรCรDDDD2ลBˆˆˆHฆXษ A""""™b!HDDD$S,‰ˆˆˆdŠ… ‘Lฑ$"""’)YPš”ํ๎##ฃ๒ฃยส๛-ศcฃฝ•~ ’ ๓Xzฬaู`ห๓X1qDˆˆˆHฆXษ A""""™โ9‚2ฒ็*ิ+?(๏0*,5ไขน*0rGrกVแTXฬc้1‡eƒy,ฬ#ฐฐk๒แqDˆˆˆHฆXษ A""""™b!HDDD$S,‰ˆˆˆdŠ… ‘Lฑ$"""’)‚DDDD2ลBˆˆˆHฆXษ A""""™b!HDDD$Sพ์ฝ;>๛์ณท^>99+Vฌ(รˆJn๗๎ppp€ฝฝ=‚ƒƒ•ๆลฤฤ@]]{๖์)—ุˆˆˆ่ใง^”ฦ๛กฆฆVช>๒ ม๛—QT/=}๚UชT)tใว1v์X>|ฦฦฦx๐เ4OqใฦกUซVาดฌฌ,ไไไ rๅสe'ษW…\พ|9แ์์ŒI“&!;;3fฬภ„ Jด|DDค็M›6ลๅห—‚ธธ8ธธธ`๖์ูx9แ่่///\นrp๊ิ)xzzยีีอ›7GRRRพuddd`๕๊ีhิจfฯž  EXX˜ิฦิิฐ~zภุุ`bb"ตYณf š7oŽ๊ีซKำž>} |๛ํทˆ/iฺˆˆˆˆ U! มุุX,Zด'Nœ@LL † †นs็"((zzzJmรยยคย+22ฒุ‘พ้ำงรััััั5j.\cccฤลล!$$ƒุใ๘๑ใ8<‚ƒƒ1kึ,ฉ„„Œ18w๎–/_Ž3fนซWฏโฟCใฦัจQ#9r’’‚+V`ุฐaJํซWฏŽ‹/ย„ึญ[‡ฬฬฬBื‘™™‰ิิTฅQž qh8o4O__๐โล ์ทภอ›7•ฺพzฎปป๛Ÿw๒ไIŒ?เ๋๋‹x9"๗ๅ—_โฦศษษAญZต๙'0}๚t\ธpZZZ%ZOnn..]บ„ƒโึญ[hบ5ฎ^ฝŠะะPŒ3•*UสทŒถถ6z๗๎ฝ{ใย… ่ป7fฮœ‰ธธธื1sๆLLž<๙ถŸˆˆˆไฃBŒพ.::๑๑๑ฐถถFใฦqyt๊ิฉศeิิิ P(ค็Eคdโฤ‰๘๓ฯ‡5kึHหทjี ?3ยรรแ๏๏]ปv)ญ็ี๕พบN333ดkืšššจ[ท.LLL””„จจ( 2VVVุผy3‚‚‚p่ะ!iน;w๎`๊ิฉ่ัฃฐlูฒBc7nRRRควํท฿h›‰ˆˆ่ใV! มๆอ›cร† ากMOOO$%%!11ว‡ซซ+ถo฿^dตjียล‹‘““ƒ›7o"66 งง‡ดด4ฉ]ฃFฐqใFภž={`ggHMME5ซVญ’ฺ๋๋๋cุฐaˆ‰‰มˆ#ฌ]ป`ii‰่่hPŠฑC‡8v์„ธw๏๎ปSSS=z‰‰‰HLLD๗๎ฑz๕j4o)))่ิฉฺดi]]]œ;;ปvํ‚ฏฏฏาเP๗wJJJ™ซ‡†‰ˆˆˆจ์ฑ$"""’)‚DDDD2ลBˆˆˆHฆXษ A""""™b!HDDD$S,‰ˆˆˆdŠ… ‘Lฑ$"""’)‚DDDD2ลBˆˆˆHฆิห;zฆทญ ##ฃ๒ฃยz๙ฃเโ็6J? No†y,=ๆฐl0eƒyฌ˜8"HDDD$S,‰ˆˆˆdЇ†ehcฬh๋ฅ—w—"Uฌ=๗ ชVัT\ฬc้1‡eƒy,Q๛zิ*๏Žษ A""""™b!HDDD$S,‰ˆˆˆdŠ… ‘Lฑ$"""’)‚DDDD2ลBˆˆˆHฆXษ A""""™b!HDDD$S,‰ˆˆˆdŠ… ‘L}…`๗๎๑ูgŸฝ๕๒ˆŒŒ,รˆJFกP`๘๐แฐฑฑญญ-๖ํง4ไศ‘055}๏q‘<จ—wฅต~จฉฉ•ชˆˆ˜ššยฝŒขฒณณ‘••B,_พ … ศออEJJŠ4/>>๗๎SjŸœœ CCร2‹‘ˆˆˆไญB._พŽŽŽpvvฦคI“3f`ย„ %Z~ร† ่ฝ; ** ธ}๛6ยยย0}๚tธธธ !!gฯž…ปป;1hะ ไๆๆ&Mš888`๘๑ฎ#11ใว‡ญญ-ฎ\นฐฒฒBFF`ีชU;vฌด=!!!555TญZU๊g๔่ั˜1c†R฿๋ืฏ‡ณณ3-Z„ิิิbท733ฉฉฉJ"""ข<ฆŒลขE‹pโฤ ฤฤฤ`ุฐa˜;w.‚‚‚ งงงิ6,, aaa€ศศH๔๏฿เ็็‡์์lฌ_ฟฤฒeห`aaเเ`„„„ ::666่ท/–.]Šธธ8zฆŒˆˆ€ŸŸ๔๕๕/^ผภพ}๛”ฏmpp0‚ƒƒ๎๎๎Xฑb…4/,, ƒF๋ึญ ,ิ’““กP(เๆๆ่ีซNœ88x๐ <<<เโโ‚ณgฯ">>ะฅK >ใววนs็0dศปM)))ฐถถFTT0eสคงงc๙3fLหXYYaฺดiˆ‡——ผฝฝ1gฮœŽ7)))าใ๖ํลฦDDDD๒Qa มืEGG#>>ึึึhธ1ฮŸ?N:ป\bb"455‘””๔F๋หศศภw฿}‡;w"66=z๔@ff&€—#omถEฟ~0fฬ\ฝzUiY555( –333t้าะตkWฤฤฤเ๚๕๋ธvํ๊ืฏ+++<|๘ 4P๊๏ุฑc่ท/~๚้'Œ?_~๙e1kjjB___้ADDD”งย‚อ›7ว† ค๓<==‘””„ฤฤD?~ฎฎฎุพ}{‘}dffbะ A8pเn฿พ-]ฅซงง‡ดด4€กก!ิิิครพ๋ืฏGใฦ‘‘‘UUUTฉROž<ม฿-๕๋เเ€ล‹ใ๙๓จ[ท.ะฌY3$&&,-- …B;vHหu่ะGŽ๐rฤำึึŽŽŽธ>‘˜˜cccœ;wฐo฿>888เ็Ÿ†ฟฟ?.^ผˆTฏ^ฝ 2LDDDrSaฎvppภะกCัจQ#จฉฉกkืฎ -ฐm๙มมมˆŒŒDXXVฌX)Sฆ kืฎpppภฒeหะฑcGœ9s;vD๗๎ฑn:lุฐฟ๖พ๚๊+dffยหห ~~~PSSƒฟฟ?๊ืฏsssxzzๆ[ฏŽŽ๚๗๏๛#** ๊๊/ำ;aย๔๎ีชUƒณณณิ~ธq๐๗๗วไษ“ajjŠ5kึ™###์ูณๆๆๆo™E"""ขง"„ๅฝฉฉฉ000ภขƒ1ะึ3,๏p*.E.ช‹ลS'@ตtท.’5ๆฑ๔˜รฒม<–(}=j฿่ศฮฮฦฎ]ปเ๋๋‹J•*Iำ๓พฟSRRส4ฏ sh˜ˆˆˆˆส A""""™b!HDDD$S,‰ˆˆˆdŠ… ‘Lฑ$"""’)‚DDDD2ลBˆˆˆHฆXษ A""""™b!HDDD$S๊ๅฝ_8ื„‘‘Qy‡Qaฝ-ศX|ูภ\้ท ้อ0ฅว– ๆฑl0G‰ˆˆˆdŠ… ‘Lฑ$"""’)ž#(CQ‰ฉะ{ชVaTXŠภ?ืS ชฦทะbK9,ฬcู`ฯ:†ๅยใˆ ‘Lฑ$"""’)‚DDDD2ลBˆˆˆHฆXษ A""""™b!HDDD$S,‰ˆˆˆdŠ… ‘Lฑ$"""’)‚DDDD2ลBˆˆˆHฆXษTน‚ปwวgŸ}VlปฤฤDlผนฬึŠฐฐฐ2๋ฏดฮž= wwwุฃcวŽJ๓’’’ ฏฏAลKDDD—๗^๎฿ฟjjj%j[ึ…`iไๆๆพQ๛งOŸ9?;; ภ† p๑โE๏Sš?v์Xดjี๊๚$"""z๏ด\พ|9แ์์ŒI“&!;;3fฬภ„ Jด|HH๖๎ „‡‡ใแร‡hืฎัฆMฟฟะe/_พ 8;;ฃaร†ศฬฬDEEกqใฦจ]ป6๖ํ๘๗฿ัธqc4hะžžžธt้`ีชU่ฝ;|||ˆร‡รัั...๐๒๒สทฮœœlูฒญ[ทฦะกCฅ>ฦŽ+ตฑฒฒBFF๖๎ OOOิฉS`bb"ต9z๔(๔๕๕แ่่จิฟปป;๚๖ํ‹3gฮ”(™™™HMMUzๅyg…`ll,-Z„'N &&ร† รนs===ฅถaaaา!ะศศH๔๏฿0}๚tดiำััั่ีซ&Mš„VญZ!..;wFHHHก๋ Dhh(bbbฐo฿>TชT p๓ๆM9r๑&Ož จQฃ<ˆs็ฮแื_ล๘๑ใ•ถcวŽXทnๆฮ‹๙๓็#::ปvํ’ฺพ}'N„v์ุ)Sฆ <<ผศ\ฝz™™™hผ9ฅ‘ฯœœLœ8QŠํU ่ิฉBCCแ๎๎ŽฅK—โูณg…ฎcๆฬ™000EฦDDDD๒ขฎ:Žˆˆ€ŸŸ๔๕๕/^ผภพ}๛pเภผySฉmppฐ๔ทปป;VฌXQ`Ÿ'OžDhh(เห/ฟฤ‚ l—ššŠดด44kึ ``` อk฿พ=ิิิเ๊๊ŠฤฤD/Gฮ† ‚ุุXจฉฉ!##Cj฿ถm[ฉpmิจF   ๔์ู๐ฯ? QฃF>|8"##ฅํ-Nnn.ฮœ9ƒSงN!33žžž๐๖๖ฦ๚๕๋ัฃGTญZ5฿2ฺ๊๊๊่ต+บvํŠ›7obภ€9r$าาา \วธqใ๐w฿)ๅ…ล ๅyo็FGG#>>ึึึhธ1ฮŸ?N:ฝฏีK455ชชชาy๓ๆอƒ โโโp๐เA้02Tฎ\Y๚{ธqXพ|9ž>}І โ๑ใวprrยฒeหp๘qt๋ึ ๑ฒฒฒคeิิิ P(ค็y}›™™กYณfะืื‡ฑฑ1€๙ณfอ‚••ๆอ›‡๛๏า๒?ฦผy๓ะฉS'่่่`ำฆMEnซพพพาƒˆˆˆ(ฯ;+›7oŽ 6H็ฅyzz")) ‰‰‰8~8\]]ฑ}๛๖"๛ะำำSํjิจ6nXทn7n\เr๚๚๚000ภแร‡)))Jลุ๋RSSajj ฌZตชะvืฏ_‡‹‹ ~๘แXYYแ๖ํะาาBฟ~p๚๔iฬž=‡‚ญญ-ๆฬ™ฐดดDLL €—ฃ‡y็5ถn็ฮCVVาำำƒฺตk#<<7oDbb"†Ž้ำงฃw๏€€€xzz"55ปw๏ฦึญ[ัถm"sHDDDT˜wV:88`่ะกhิจœ1BvŽ ““^ผx!],Š]ปvมษษ [ถlมดiำ ํ๓๗฿วคI“เ์์Œถm";;ปะถมมมXธp!\\\ =ฬ s็ฮ…ฝฝ=œœœ`kk gggฅ๙... Cll,\\\7†ฎฎ.์์์๐ฟO:4[ญZ5๔ํ...hุฐ!พ{˜™™บnเe!x๙๒eLœ8ฑุถDDDDลQBˆ๒‚ิิT`oไu่T)๏p*,En]>jถ^PU{gงู~๔˜วาcห๓X6˜GภณŽaฉ–ฯฮฮฦฎ]ปเ๋๋+]ไ ๗wJJJ™Ÿๆล_!"""’ฉ _NŸ>...Jๅ&ิDDDDฒ ?vRไ‰ˆˆˆจ`~Dˆˆˆˆ A""""™b!HDDD$S,‰ˆˆˆdŠ… ‘Lฑ$"""’)‚DDDD2ลBˆˆˆHฆ* ฅ้อนY้รศศฐผรจฐฒณณฑ๋2๐้'JฟIo†y,=ๆฐl0eƒyฌ˜8"HDDD$S,‰ˆˆˆdŠ… ‘L๑Azlƒ,•ฌ๒ฃยสUืพXŽ๛A5ก–“QแTXฬc้U”ึ๘#ตผC ขBpDˆˆˆHฆXษ A""""™b!HDDD$S,‰ˆˆˆdŠ… ‘Lฑ$"""’)‚DDDD2ลBˆˆˆHฆXษ A""""™b!HDDD$S,‰ˆˆˆd๊‚ษษษXฑbEก๓MMM‹ํcีชUx๔่Q™ลT’uพ/ …ร‡‡ lmmฑo฿>ฅ๙#GŽ โ%""ขOน‚%Qึ…`iไๆๆ–ธmvv6าำำ‹lณ|๙r( $$$เโล‹pww—ๆลววใฝ{Jํ“““฿(^"""ขโ”Y!x๗๎]xyyมลลNNN๘๛๏ฬž=ฺ้้้่ต+์์์\l[ทnEdd$บvํŠ&MšVฎ\ 888`ูฒeE.?y๒d888ภษษ K—.•ฆ6 ๖๖๖่นณTMš4 pppภ๘๑ใฅถVVV7n\\\p๘q|๙ๅ—ฐทท‡ฃฃ#ึญ[—o‰‰‰?~sิฌY็ฮƒซซk‘๙JJJย๙๓แๆๆ†€€iฤoใฦpwwGญZต”ฺ4๕’’’เ๎๎Ž **ชศuฬœ9ารยยขศ๖DDD$/eVzxx`อš5˜๙ทnย7฿|ƒƒยภภะฅK >ใววนs็0dศi^QRRR`mmจจ(888`ส”)HOOว๙๓1fฬ˜—ฑฒฒยดiำ///x{{cฮœ9…ฎcธqHII‘ทo฿.6."""’2+ฝฝฝq๔่Q˜˜˜ [ทn8x๐`พ6***eตบทขฉฉ)ญชชŠ\dddเป๏พรฮ;ฅัรฬฬLฉ]^มZฅJฤฦฦขqใฦ๘้งŸ เๅจ[ถmัฏ_?Œ3Wฏ^UZงšš (๕kff†.]บบvํŠ˜˜\ฟ~ืฎ]C๚๕aee…‡ขAƒJ;v }๛๖ลO?„๑ใวให/ฟ,r{๕๕๕•DDDDyสฌผy๓&jิจAƒมฯฯษษษHKK“ๆ7jิ7n๐๒ะํ๓็ฯ‹ํSOOO๊รรรDjj*ž={†ปwฃaร†.ืฒeK๖oศสส>...5jฎ^ฝŠ›7oโ๒ๅหhิจ๔๔๔`jjŠเเ`4mฺ 6ฤ P(ฐ}๛vXXXเส•+@vv6š5k†่่hDDD(ญ;##7nฤาฅKัดiSฬ˜1กกกR฿ภหัะ{๗๎a๚๕€ฑฑ1ภฤฤD๊gอš5hผ9.\ธ M{๚๔)<==ักCรฮฮฎุกกกา!W%$$`ฤˆpppภนs็ฐ|๙rฬ˜1ฃศœ]ฝz๗7nŒFแศ‘#€””ฌXฑร† Sj_ฝzu\ผx๎๎๎8p |||ฐn:ฅB๏u3gฮ„๔ฐฐฐ(2&"""’—2)=<<ฐfอLž<Wฏ^…ถถถา“'OยฯฯะนsgTฎ\Yš-ฝbล ธปป็๋?22ญ[ท†กก!๔๔๔เ๋๋‹3gฮ‹งง'fฯžYณfแแร‡๙Šถ<]บtAฅJ• œืฉS'€ซซซTpฦฤฤ C‡€/พ๘Bj๛็Ÿยมม5jิภ… ๐๋ฏฟยพภ~_•››‹๘๘x}““ƒะะPŒ3ฆภุดตตัปwo;v ‹-ยฯ?\`พ๒Œ7)))าใ๖ํลฦEDDD๒Q&… ทท7Ž= t๋ึ ฬืFEEฅ,VUฌ€€๕ื_PWWGณfอp้าฅฝZŒพNSS ชชŠ\/ฯ+HซVญ๐๓ฯ?#<<ุตk …4_MMMz๊่™™ฺตkMMMิญ[&&&HJJBTT† +++lผAAA8t่ด;w0u๊T๔่ัXถlY‘กฏฏฏ๔ """สS&…เอ›7QฃF 4~~~HNNFZZš4ฟQฃFุธq#`วŽ%บ่AOOO๊รรรDjj*ž={†ปwฃaร†.wใฦ ิฉS฿}๗||| ิืrvvฦฎ]ป›6m’ฆ๋๋๋cุฐaˆ‰‰มˆ#ฌ]ป`ii)zn฿พ]ZฎC‡8v์„ธw๏๎ปSSS=z‰‰‰HLLD๗๎ฑz๕j4o)))่ิฉฺดi]]]œ๛์3Œ1VVVฦฒaร888ภลลiiihถ-œœœ๐โล ธธธ <<ญถ๑—_~ม?<{๖ฌภั5ooo„‡‡ใ๔้ำR|Ÿ9ฎ\น'''ฅ‹?œœœะ Aุฃu๋ึXธpaก‡ช๓|๗wธpแFŒ*UชผีvๅQ…๓$%ฯŸ?‡ถถ6TTT0mฺ4้|พŠ$55x0รFšŠโ eซh`ฯ'฿ขํ๕๙จ$ฒส;œ ๋cสฃ๊wวสeฝูููุตk|}}‹$Žy,ฬc้–รผ๏๏”””2?อซLn#gฮœมˆ#›› kkk๛๏ๅQฉTุB๐๑ใวhัข…าดjีชแภ๏d}y๗$"""๚XTุBะศศˆ…Q)ผ“Ÿ˜#"""ข A""""™b!HDDD$S,‰ˆˆˆdŠ… ‘Lฑ$"""’)‚DDDD2ลBˆˆˆHฆ*์ ฅ้ํฉ~ฝชFFๅF…ฅš ์ฺีก{ ส฿ำ|kฬ#Q๙ใˆ ‘Lฑ$"""’)–!ลž(*—ฯKฏฺuaนฌ—ˆˆˆ๒ใˆ ‘Lฑ$"""’)‚DDDD2ลBˆˆˆHฆXษ A""""™b!HDDD$S,‰ˆˆˆdŠ… ‘Lฑ$"""’)‚DDDD2ลBˆˆˆHฆXษ A-[ถ,r~rr2VฌX!=ฯศศ@๓ๆอแ๊๊Šร‡ฟ๕z_ผx/ฟถถถจ_ฟ>.\ธ 4ฟ{๗๎๘์ณฯบ"""ขขศบB@กPเภEถ{ฝ<<๔๕๕qy4kึฌภež?Žฌฌฌ"๛2e 4h€ห—/ใ๙๓ฐดด”ๆํ฿ฟjjjJํŸ>}Z&•ุGSฝ{^^^pqq““._พ WWWt๋ึ ๕๋ืวื_ …Bจ^ฝ: GGGพ}ฆฆฆ€ˆˆดiำ;vDบu1}๚t@HHโโโเโโ‚ูณg#00Gށ‹‹ ?~ฌวล‹๑อ7฿ภ^*๒๚€ะะP„……6nˆoพ๙ ฅฅ===@vv6fฬ˜ &(๕={๖lxyyแ๗฿GFFFฑ9ษฬฬDjjชาƒˆˆˆ(ฯGSฎ_ฟ-[ถDtt4ขขข „@ll,~๘แฤววใัฃGุฒe เมƒ่าฅ .\ธ 4 ผํ[ตjbbb†๔๔tLŸ>ŽŽŽˆŽŽฦจQฃฐbล ดiำััั022Bff&ยรรแํํเเ`xxxเาฅKจ^ฝzก๑>}๚๘ๆ›oเ๊๊Šมƒ#330w๎\I…až3f`ูฒeˆŠŠ‚ฃฃ#พ๛๎;$$$บŽ™3gยภภ@zXXXผmz‰ˆˆ่#๔ั‚Xณf &OžŒซWฏB[[666pqqŠŠ p๘q€žžฺดiS`?^^^022Bๅส•ammปw๏ปnwwwฬ;‹/ฦฑcวะปwohiiนLnn.ะฝ{wœ;wนนนXบt)๎นƒ}๛๖!((จภๅ์ํํ๑๋ฏฟ"..ฆฆฆpppภŸY`qใฦ!%%Ezพ}ปุm!"""๙๘h Aooo=z&&&่ึญ<iพŠŠŠ๔ผrๅส…๖ฃฉฉ)ญชชŠbืฝlู2ุฃG˜6m๎นฃ4ี8๒FŒŒŒPตjUดlู***่าฅ bbb๘๘xX[[ฃqใฦ8<:u๊$-ฏP(ฐkื.๘๛๛#<<?3ZตjU่ถ่๋๋+=ˆˆˆˆ๒|4…เอ›7QฃF 4~~~HKKรๅห— !๘ใ4n๘ญ๚ึำำCZZZก๓===๑๛๏ฟใฤ‰ะััA›6mะฉS'คคคttt๐฿!33๛๖ํ๐ฒ8๔๑๑ATT€—็'ฺฺฺข}๛๖HJJBbb"Ž?WWWl฿พฐvํZุุุ <<฿}๗bbb0lุ0xDDD๔Vิห;€ฒYณfACCFFF๘๑วแไไ„ษ“'ใโล‹๐๖๖Fืฎ]฿ชo###899มษษ ๐๐๐(ฐ]ีชU1bฤŒ1า๔ษ“'รววๆๆๆฐฑฑ‘ฆฯš5 HOO‡ &MšTdVVV8}๚4ŒŒŒj;ˆˆˆˆ^๕ั‚AAAJ็ี%&&BSSณภ๓็๎ปWเ๓ฆM›ขiำฆา๔W‹น๕๋ื+-๓jป‚ผ:ฟWฏ^่ีซWพ6u๊ิมฉSง ํ#ฏ๐ห๓ถ#šDDDD๙h ั›๙h มืGำˆˆˆˆHูG[QัXษ A""""™b!HDDD$S,‰ˆˆˆdŠ… ‘Lฑ$"""’)‚DDDD2ลBˆˆˆHฆ>š฿ฆ’Sm;ชFFๅ•3Žษ A""""™b!HDDD$Sมฮ; 544}๛๖…งง'FซWฏขUซVpssCถmq}€••222ซVญยุฑcฃF‚ญญ-œ1{๖l(ดW%&&b๘๑ฐตต•ถญฐu,_พ!!!555TญZU๊g๔่ั˜1c†R฿๋ืฏ‡ณณ3-Z„ิิิฝf™™™HMMUzๅ)q!ธ~zดlูัััˆŠŠยแร‡•ž[ZZb๚๔้pttDtt4FˆลŽ;ฐn:Œ1“&MBdd$ๆฮ‹๏พ๛ะณgOœ={ฑฑฑะึึฦ฿-ญืศศ็ฯŸGใฦ1t่P์นถmรดiำŠŒ๗฿ลัฃG1gฮ 2+Vฌ@TTพ๚๊+L:ตะๅ?~Œอ›7#>>111๘๚๋ฏ ะ>rssฑ}๛v๘๚๚โ๓ฯ?Gอš5q๎9ธบบ_RRๆฯŸ777H#~7n„ปป;jีชฅิ~ะ A๘๋ฏฟ””www 0QQQEฎcๆฬ™000Eถ'"""yQ/iC๔้ำชชช่ัฃš4iข๔ฮฮฎภๅฺถm ===ภกC‡/อSSSฤฤฤ`ย„ HMMErr2,,,ะนsg@‡ŽŽŽPQQ––p๋ึญ"ใําฅ *Uช„ดด4œ8qB๊/77ตkื.t9่๊๊ข่าฅ ฺทo_d]บtมล‹๑๛๏ฟฃqใฦลๆ1OJJ ฌญญ…3f`ส”)˜:u*ๆฯŸธŒ••ฆM›†ะะPฌ]ป˜2e พ๛7N*ถ 55•ล IJ\z{{ใ่ัฃ๘๛๏ฟัญ[7,\ธ0฿๓‚ ฌส•+KซจจเนsPUUˆ0`v๏บu๋โ็ŸฦณgฯคyUUUฅฟ‹;๗/oฝ …5kึDtttพ6jjjาa่ฬฬL€บบ:"##ฑw๏^„‡‡cห–-๘๕ื_ ํcๆฬ™Xผx1๚๕๋‡ฎ]ปขจ[ทn‘๋333t้าะตkW :ืฏ_วตkืPฟ~}ภร‡ั Aœ;wNZ๎ุฑcXถl"##1~x|๙ๅ—…ๆ@SSšššEๆ‰ˆˆˆไซฤ‡†oผ‰5j`ะ A๐๓๓ร๑ใว•žวลลAOOiii…๖ัคI้b…Bธธ8@zz:Œ‘‘‘7–r“” J•*าUนูููธt้ภาาัััP(ุฑcเูณgHIIAงN0kึ,DGGู‡ƒƒ/^Œ๓็ฯฃnบ@ณfอ˜˜X่:€—#GŽDDDภึึŽŽŽธ>‘˜˜cccฉทo๐๓ฯ?ร฿฿/^DHHชWฏ^ฆ๙""""๙(๑ˆ`DDfอš !00NNNา๓ 6ภศศNNNprrB`` Œ•๚Xฐ`‚ƒƒฑhั"dggฃw๏pttDHH4h€๊ีซ{nว Aƒ0jิ(ไไไ`ิจQจ_ฟ>&L˜€ฝ{ฃZตjpvvคฅฅกSงNศสส‚ŠŠŠt.`a}ไัััAัฟDEEA]ej Z๐๒ฐญฟฟ?&Ož SSSฌYณฆศm022ยž={`nn^ึ้!"""™RBˆ๒‚ิิTเมัฅ0าื.ดชsเ{Œชโษฮฮฦฎ]ปเ๋๋‹J•*•w8๓Xzฬaู`ห๓Xz…ๅ0๏๛;%%๚๚๚eบNฒ‘L•๘ะ๐‡h๏ฝ3fŒาดถmโว,งˆˆˆˆˆ*Ž ]ถiำmฺด)๏0ˆˆˆˆ*$&"""’)‚DDDD2ลBˆˆˆHฆXษ A""""™b!HDDD$S,‰ˆˆˆdŠ… ‘LU่JำQต๋U#ฃ๒ƒˆˆˆสG‰ˆˆˆdŠ… ‘Lฑ$"""’)‚2ิfK0ฌํQaQ9c!HDDD$S,‰ˆˆˆdŠ… ‘Lฑ$"""’)‚DDDD2ลBˆˆˆHฆXษ A""""™b!HDDD$S,‰ˆˆˆdŠ… ‘Lฑ$"""’ฉชLNNฦŠ+ส;Œ;{๖,aooŽ;*อKJJ‚พพ>ยยยส):"""๚ุษฆฬออ}ฏฑ<}๚ดศ๙ููู0`6lุ€‹/โ๛ŸาฑcวขUซVoิ'ั›จ0…เปwแๅๅ899แไษ“Jฯ/_พŒฤลลมลลณgฯฦชUซะฝ{w๘๘๘ 00๗๏฿G็ฮแ๎๎Ž&Mšเส•+€ฐฐ0xxxภษษ }๛๖…Bก4mฺ฿=\]]แแแศศHดhัŸ|๒ v๎™/ฦœœlูฒญ[ทฦะกCซVญยุฑcฅ6VVVศศศภฝ{แ้้‰:u๊LLLค6G…พพ>•๚wwwG฿พ}qๆฬ™ฒM.ษR…)ืฏ_–-["::QQQ8|๘ฐาsKKKLŸ>ŽŽŽˆŽŽฦจQฃฑฑฑุฑcึญ[‡#F`าคIˆŒŒฤนs๑w฿z๖์‰ณgฯ"66ฺฺฺ๘๛๏ฟฅ๕แ๙๓hธ1†Š;wbถm˜6mšิๆ๖ํ˜8q"์์์ฐcวL™2แแแEnฯีซW‘™™‰ๆอ›ร›7o๐ฒ˜œ8q"&Ožœo™„„t๊ิ กกกpwwวาฅK๑์ูณBื‘™™‰ิิTฅQ๕๒ ค<<<ะงOจชชขGhาค‰าs;;ป—kถ-๔๔๔‡B||ผ4OMM ƒ & 55ษษษฐฐฐ@็ฮ:t8::BEEZZZpppภญ[ท๓5j„แร‡#22๚๚๚%ฺž\œ9sงNBff&<==แํํ๕๋ืฃGจZตjพeิีีัตkWtํฺ7oฤ€0rไHคฅฅธŽ™3gXPhDะG…‰‰ บu๋†์์lฅ็,pนส•+KซจจเนsˆŽŽ–F`ภ€Xตjโโโ0lุ0dffJหhhhTUU•ฮ;็ะษษ ห–-ร๑ใวัญ[7๑วศสส’–WSS“5๚633Cณfอ ฏฏcccธนน!!!๓fอš+++ฬ›7!!!๘๗฿ฅๅ?~Œy๓ๆกSงNะััมฆM› อูธqใ’’"=n฿พ]ฒd‘,T˜B๐ๆอ›จQฃ ????~\้y\\๔๔๔ €&MšH“( ฤลลาำำallŒŒŒ lธ๑โาาาBฟ~p๚๔iฬž=‡‚ญญ-ๆฬ™ฐดดDLL €—ฃ‡๗๏฿ดn็ฮCVVาำำƒฺตk#<<7oDbb"†Ž้ำงฃw๏€€€xzz"55ปw๏ฦึญ[ัถmBcำิิ„พพพาƒˆˆˆ(O…94YณfACCFFF „“““๔|ร† 022‚““œœœcccฅ>,X€เเ`,Zดููู่ป7‚  z๕๊puu}๋]\\†gฯžIt4nบบบฐณณC“&M`aaจVญ๚๖ํ จชชโ๛๏ฟ‡™™Y‘`ํฺตPUญ0๕;}ภT„ขผƒ ๗#55p[ึ mเ—…Vฆยeggcืฎ]๐๕๕EฅJ•ส;œ ‹y,=ๆฐl0eƒy,ฝยr˜๗’’RๆG๗8ดDDDD$S,‰ˆˆˆdŠ… ‘Lฑ$"""’)‚DDDD2ลBˆˆˆHฆXษ A""""™b!HDDD$S,‰ˆˆˆdŠ… ‘Lฑ$"""’)๕๒€ฟฝŸ‡มศศจผร ""ขrฦA""""™b!HDDD$S,‰ˆˆˆdŠ… ‘Lฑ$"""’)‚DDDD2ลBˆˆˆHฆXษ A""""™b!HDDD$S,‰ˆˆˆdŠ… ‘Lฑ$"""’)‚DDDD2ลBˆˆˆHฆิห;z„€ดด4TชTฉœฃฉธฒณณ๑๙sคฆฆ2ฅภ<–sX6˜วฒม<–^a9LMM๐฿ใe‰… Œ<~`mm]ฮ‘ั›JKKƒA™๖ษBPFชVญ ธu๋V™๎H8{๖ฌl๚KMM………n฿พ }}2้ณฌc|}ส1๚๋๒.r0eแC฿ๆwั๓Xz…ๅPดด4˜™™•ษz^ลBPFTU_žj``Pฆ_jjjฒ๊/พพ~™๕๛.bd?ผUŸe™C€y, a›ๅ๘ž~}พฏ}ฑฌG๓๐b*ต!C†ศชฟwแ]ฤศ<~xฝซ>ห๓Xza›?๔ฬใ๛ "ล™‡๔AJMM…RRRษๅ‚y,ฬc้1‡eƒy,ฬc้•G9"(#ššš˜4i455ห;” y,ฬc้1‡eƒy,ฬc้•G9"HDDD$S$"""’)‚DDDD2ลBˆˆˆHฆXษ AYดhฌฌฌ ฅฅ…† โŸ)๏>3gฮ„‡‡๔๔๔`bb‚.]บ !!AฉMFF† ###่๊๊ข[ทnธพR›[ทnก}๛๖จ\น2LLL0jิ(ไไไผฯM๙`๘ใPQQม๐แรฅiฬaษนs_~๙%ŒŒŒ ญญ GGGDFFJ๓…˜8q"jิจmmmดlูWฏ^U๊ใษ“'่ีซ๔๕๕ahhˆฏพ๚ ฯž={฿›Rnrss๑ร?ภฺฺฺฺฺจ]ป6ฆNช๔[ญฬc~GEวŽafflถMi~Yๅ,66Mš4––,,,0kึฌwฝi๏MQ9ฬฮฮฦ˜1cเ่่˜™™กw๏ธ{๗ฎR๏5‡‚daร† BCCC๖oโโล‹bภ€ยะะPฟฟผC๛ ดiำFฌ\นR\ธpADGG ___QซV-๑์ู3ฉMppฐฐฐฐ‘‘‘โณฯ>5’ๆ็ไไัฒeKqyฑkื.QญZ51nธ๒ุคr๕ฯ?+++แไไ$† &Mg‹๗ไษaii)๚๔้#ฮœ9#ฎ_ฟ.๖๎+ฎ]ป&ต๙๑ว…ุถm›ˆ‰‰:uึึึโล‹R›ถm gggq๚๔iq์ุ1QงNแ๏๏_›T.ฆOŸ.ŒŒŒฤŽ;ฤ7ฤฆM›„ฎฎฎ๘๕ื_ฅ6ฬc~ปvํ!!!bห–-€ุบuซาฒศYJJŠจ^ฝบ่ีซ—ธpแ‚Xฟ~ฝะึึK—.}_›๙N•รไไdัฒeKฑqใFq๙๒eq๊ิ)๑้งŸ 777ฅ>gYสฤงŸ~*† "=ฯออfffbๆฬ™ๅี‡๋มƒ€8rไˆโๅ›ทRฅJbำฆMR›K—. โิฉSBˆ—o~UUUq๏=ฉอ’%K„พพพศฬฬ|ฟPŽาาาDบuล๛…T2‡%3fฬัธqใB็+ ajj*fฯž-MKNNšššb๚๕B!โใใq๖์Yฉอ๎ป…ŠŠŠธs็ฮป าพ}{ัฏ_?ฅiŸน่ีซ—‚y,‰ื‹˜ฒสูโล‹E•*U”ำcฦŒ666๏x‹ฟ‚Š้ื๓ฯ?€ธy๓ฆโ็‡†e ++ QQQhูฒฅ4MUU-[ถฤฉSงส1ฒWJJ  jีช€จจ(dgg+ๅะึึตjี’rx๊ิ)8::ขz๕๊R›6mฺ 55/^|ั—ฏ!C† }๛๖Jน˜ร’ฺพ};ัฃG˜˜˜ภีีห—/—ๆ฿ธq๗๎Sสฃ6lจ”GCCCธปปKmZถl UUUœ9sๆmL9jิจ<ˆ+Wฎbbbp๘qดkื๓๘6ส*gงN‚ทท7444ค6mฺดABBž>}๚žถๆร‘’’x9T/&ะ‡๎ัฃGศออU๚r€๊ีซใ๒ๅหๅี‡KกP`๘๐แ๐๒๒‚ƒƒเฝ{ะะะจyชWฏŽ{๗๎Im สq<9ุฐaฮ;‡ณgฯๆ›ว–ฬ๕๋ืฑdษ|๗w?~<ฮž=‹oฟ ’๒PPž^อฃ‰‰‰า|uuuTญZU6y;v,RSSakk 555ไๆๆb๚๔้่ีซ0oกฌrv๏=X[[็๋#o^•*UIขŒŒ Œ3าOสฝ๏ฒ$zอ!Cpแย?~ผผCฉPn฿พaร†aะาา*๏p*,…Bwwwฬ˜1เ๊๊Š . ,, AAAๅ]ล๑ว <<๋ึญƒฝฝ=ขฃฃ1|๘p˜™™1๔AศฮฮFฯž=!„ภ’%Kส-–jีชAMM-฿ี™๗๏฿‡ฉฉi9E๕a:t(v์ุร‡ร\šnjjŠฌฌ,$''+ต5‡ฆฆฆๆ8oว.** <@ƒ  ฎฎuuu9r๓็ฯ‡บบ:ชWฏฮ–@5`ggง4ญ~๚ธu๋€ฯCQ๏gSSS |ฌ\นRj๓โล 1x๐`QฅJQนreัตkW‘””คิObbขhืฎะึึีชU฿ฝศฮฮ~ฯ[๓แxฝdKๆ๏ฟBSSSฺฺุŠeห–)อW(โ‡~ีซWšššขE‹"!!Aฉอใว…ฟฟฟะีี๚๚๚ขo฿พ"--ํ}nFนJMMร† ตjีZZZโ“O>!!!J_ถฬc~‡.๐ณ0((HQv9‹‰‰7šššขfอšโว|_›๘ฮ•ร7n๚}s๘๐aฉ๗™C!^นอ:ษฯ$"""’)‚DDDD2ลBˆˆˆHฆXษ A""""™b!HDDD$S,‰ˆˆˆdŠ… ‘Lฑ$"zGาำำagg‡gฯž•w(J์ํํq๊ิฉ7Zฦสส วGฝ™+Wฎเณฯ>+๏0ˆ> ,‰่ฃeeeคงงKำž?===XYY)ตซ\น2tuuadd„ž={โ้ำงJ}EGGฟq๑†ฮ;CWWทTQึ.^ผOOฯ๗ฒฎˆˆิฉSGiZŸ>}0mฺดท๎ณ^ฝz055ล฿]ฺ๐ˆd… }ิjึฌ‰mถIฯ๚๋/ิจQ#_ป}๛๖แูณgธu๋ฒฒฒ0u๊Tฅ๙{๖์Aถm฿h๛฿เ๏๏Vqฟ‰œœœwพŽEถ๚๛๛cลŠๅ QลวBˆ>j—žฏ]ปฝz๕*ดฝŽŽ:u๊„K—.)Mฯ+_ผxTญZUซVE“&M ์็ึญ[ธ{๗.ฅiVVV˜={6๊ืฏ===Lœ8 pww‡‚ƒƒฅถ …“&M‚……jิจoฟ™™™€UซVกYณf8p ฐrๅJ,jืฎญิWPP˜:uช๔<--M˜™™‰อ›7‹œœฑu๋Vaaa!^ผx!„€่ิฉ“HIIฯŸ?—–ำืื—/_.0^"*ŽัGMMM ปwวฦฑqใFt๋ึ jjj๙ฺตkื†††จRฅ ฎ\น‚AƒI๓<จชชขRฅJx๘1ฎ_ฟuu๕BG“““ <7๐oฟEีชUakk gggดm055…bbb6lภศ‘#ann###Lœ8๋ืฏ—๚ฉ]ป6๚๔้UUUคคค ""3gฮ„ฆฆ&lmm€-[ถ›ŸJ•*แาฅKx๖์LMMaggWhaร†มิิfff1b6nเๅ!๐qใฦมาาฺฺฺ?~<6o\์บ๓์ุฑ๖๖๖าkำฅK˜˜˜เ๔้ำR›ฑcวB__ฺฺฺา4===คคค”x=D” A"๚่๕๊ี ๋ึญCxxxก‡…w๏ไไd<]บtA๛๖ํฅyฏžˆ-Z kืฎฐดดฤฬ™3 ์ฯภภ ภซ…MLLคฟตตต๓=ฯ[ๆ๎ปจUซ–4ฯาาw๏•ž›››K฿บu 066†กก! ฑt้Rปwฏศผภๆอ›ฑu๋V˜››ฃmถ๙‰ฟสยยB้๏คค$i”ึธqc<|๘ฐุuฟ‘#Gคๅ q้าฅBท7OZZ Jผ"ส… }๔๑ไษ<}๚EถีิิD`` ขขข๐่ั#//$iำฆ @CCSฆLม•+Wฐw๏^๚๋ฏˆˆˆศืฃฃ#๗฿ทŽูฬฬ ทn’ž฿บu fffาs้๏š5kBWWOŸ>Err2’““‘––†ฐฐฐbืำฐaC์น๗๏฿‡ณณณาH่๋n฿พญ๔wE75kึฤ๊ีซฅu'''KWjฟgAฑ็-฿ฆM›|หบฬฝ{๗““ƒฺตkปDT8‚D$ [ถl)ักา์์lฌ[ท&&&022ยๅห—กฏฏ/=‡ฦล‹กP( ฏฏuu๕5[ZZยิิqqqo๏_|9sๆเฮ;x๒ไ ฆN ??ฟึฌYžžž˜0až?Žœœœ;w๑๑๑Eฎ#++ ๋ึญCjj**Uช]]ท%ฯ‚ p}$%%aผyู่ณ' _ฟ~˜1c†T๘&%%aฯž=^Ž€>|๘P้>&&&HLL”žw่ะ็ฯŸวถm““ƒ/^`ฯž=E๖=z๔(š7ouu๕"ท‘ˆŠฦBˆdมฮฮฎศ๓฿Zทn ]]]TซV ‡ฦถm ขข’๏ถ1III่าฅ ๔๕๕แแแzžเW_}ฅt^฿›๘๊ซฏะตkW|๚้งฐณณƒณณ3ฦWh๛๐๐p๗฿๘ไ“O`bb‚แร‡ใล‹ลฎg๕๊ีฐดดD•*Uฐ~,\ธฐะถ={๖D“&Mเเเ€VญZกo฿พ^^™ีW_ก}๛๖ะืื‡T„ึฏ_;w†…… ผ,ฯœ9CCC <ุนs',XXYYaูฒeEฦฝ~z 0 ุํ#ขขฉ!DyAD๔กjถ-ฦŽ‹ฆM›พ๑ฒ้้้๐๐๐ภ?๓มTบ"ปz๕*q๊ิฉ=Qษฑ$"*ยฌYณ0bฤTชTฉผC!"*s,‰ˆˆˆdŠ็ษ A""""™b!HDDD$S,‰ˆˆˆdŠ… ‘Lฑ$"""’)‚DDDD2ลBˆˆˆHฆXษิuรๅฐg๎IENDฎB`‚c4core-bm-charconv-xtoa-mega_bytes_per_second-u8.png000066400000000000000000000735711477602032300330320ustar00rootroot00000000000000c4core-0.2.6/doc/img/windows-x86_64-vs2019-Release‰PNG  IHDRpK ง9tEXtSoftwareMatplotlib version3.5.3, https://matplotlib.org/อ+นา pHYsaaจ?งivๆIDATxœํwTื฿๐g้HYA@ˆฉb;๖ฎA#ถhฤ[ฝล†ฦ_์จ1๖Š5AP์ฦNค๎}๐0ฏ+UEq๐๙œณGvๆฮ๏ฬ]เq !„ษ†VI@DDDDฏ‡ŽˆˆˆHfเˆˆˆˆd†ŽˆˆˆHfเˆˆˆˆd†ŽˆˆˆHfเˆˆˆˆd†ŽˆˆˆHfเˆˆˆˆd†ŽdฉWฏ^066.้2๒…Bอ›7—t)E …BG•t)๔‘จ_ฟ>œKบŒRGกP 44ดคหx'โโโ P(ฐ|๙๒’.ๅƒภGodืฎ]ฅ๖‡QQ๒ห/ุถm[‘/Zด;wFฅJ• P(ะซWฏ<ๅj---พ};ืคค$BกP`๐เมoX=&55กกก๏๋>y๒$BCC‘๐ื]6–‘‘‘hีชฌฌฌ`ll WWW๚๋ฏศฮฮ~ญ๕ฌ]ปsๆฬy๛‚‹€Žศฎ]ป0aย„’.ƒจDฝn€›:u*:„ZตjAGGงะ๖๚๚๚Xทn]ฎ้[ถly2้ ฅฆฆbย„ %เ&L˜๐ฺ๎๙๓็;v์ป)ช„ูใ๙๓็ zํe หศศHิฉSqqq๘แ‡0sๆL|๒ษ':t(†Z๋a€#ข๗"%%ฅคK!ž?Fห9r=ย๎ปกฏฏ_h๛-Zไเึฎ]‹–-[พQ ตZดดด’.ใ{y; Š๔Ÿ9R(000€ถถvฑ๖ปx๑bภัฃG‚๛cถm๐๓๓๛ Oื2ภ‘ไ๙๓็จQฃjิจก๑ ๊ษ“'ฐถถF:u^ฝzaม‚^|Cๅผrคคคเoฟ…๔๕๕Qฝzuฬ˜1B๕-[ถ 6„ฅฅ%๔๕๕แไไ„E‹ฝVอ๛/`dd๔ำOนึฃVซ1gฮิชU จPก๚๗๏งOŸjดspp@ซVญp๘q|๖ูg000ภ'Ÿ|‚•+WๆZoBBBBBเเเ}}}ฺฺุขGนฎ!Sซี˜4ilmma``€FแฺตkmrฎŠŽŽ†ฟฟ?ส”)ƒ*UชHืฯ9rตkื†กก!ชWฏŽh,๓ๆM 8ีซW‡กก!ฬออันsgฤลลiด[พ|9 Ž9‚ยาาถถถ๙๎›7oขJ•*pvvฦ๛๗ผ๘_์ฅK—Š|ญ้ำงัขE ”-[FFFpuuลนs5ฺ:t๕๊ีƒ‘‘ฬฬฬะถm[\ผxQฃMฮ)ลkืฎกWฏ^033ƒRฉD๏ฝ‘šš*ตsvvFƒ rีกVซQฑbEt๊ิIcฺ๋|.๖๎ ///b๑โลP(HIIมŠ+ค๏N‰ๆฐททื๘^)Lทn Rฉp้า%iฺ‡C‡ก[ทnE๎'็T๋ถmเ์์ }}}ิชU {๖์ัhืซW/888ไZ>g็ี็ฆM›เไไCCC๘๘๘ &&ภ‹_ŠUชT๊ืฏŸ๋๓˜#็่‡กก!–ซMzz:ฦ*Uช@__vvv๘๛๏‘žžžgMkึฌAญZต ฏฏ/mใ๚๕๋แ้้ ˜ššยลล%ืg๑eqqqฐฐฐL˜0Aใ—/)สg7?๓ๆอCญZตPฆL”-[^^^Xปv-€๛{ฤˆGGGi9๛ฐ ํ|ตฦข~๏/~ 2ๅห—‡‰‰ ฺดiƒปw๏ๆ๊399ร† “~YZZขI“&8{๖ฌิๆu~V888ไ๙ฝSฟ~}ิฏ__zŸื5p9ืC฿ฝ{ํฺตƒฑฑ1,,,๐w฿Iง? หคค$ภฬฬLcึึึ044,ด—๋นs'nผ)ญ#ฏ๏งb#ˆ^r๊ิ)กญญ-BBBคiยะะP\พ|Y!ฤษ“'E“&Mฑjี*้%„jตZ4lุP( ัทo_1|ับuk@ 6Lc]ขWฏ^b๖์ูbผyขiำฆ€˜?~กu๖์ูSˆชUซŠ   1|ัชU+@๘ใm๛๖ํ+tttDฟ~DXX˜๘แ‡„‘‘‘๐๖๖R;{{{QฝzuQกB1z๔h1|๑้งŸ …B!ฮŸ?/ตKNNฮฮฮB[[[๔๋ืO,ZดH๓ฯย[œ;wN!ฤแร‡แแแ!<==ล์ูณEhhจ(SฆŒ๘์ณฯ4๊๓๗๗666ยฮฮNŒ1Bฬ›7O899 mmmฑ~zaee%BCCลœ9sDลŠ…RฉIIIา๒›6mnnnbธqbษ’%b๔่ัขlูฒย^คคคHํ–-[&'''แ๏๏/ๆอ›'ฆL™"„b๘๑€x๘๐กBˆkืฎ‰J•* wwwiฺห5~๘Bวh฿พ}BOOOุ‹๑ใว‹E‹‰!C†ˆฦKm๖๏฿/tttDตjีฤดiำฤ„ D๙๒ๅEูฒeล7คv9๕yxxˆ:ˆ… Šพ}๛ โ๛๏ฟ—ฺ๔ำOBKKKปwOฃ–#GŽbำฆMo๔นจRฅŠ([ถฌ9rค ‡ซVญ๚๚๚ข^ฝzา๗ภษ“' /9ŒŒŒDฯž=๓œ—ณฝ<ถถถŸ้9sๆฅR)าาา1hะ Bื@ธนน kkk๑๓ฯ?‹9sๆˆO>๙D”)SF\,]บTL:UดnZฌ^ฝZj๓:?+์ํํ๓^๐๗๗า๛7nbูฒeาดœ฿ตjี}๚๔‹-;vฤย… ……eฮผพ}๛ŠุุX'-Z$tuuลœ9s ญ?วพ}๛„ปปป(_พผดŽญ[ทy๙ืลGนŒ5Jhii‰ฃGŠM›6 น>ฤƒ ส๕]!ถm&ˆ‰'jL๏ิฉ“P(โฺตkาดิิิ\หˆO>๙คะ{๖์)ˆoพ๙FšฆVซEห–-…žžž:Ž;&ˆ5kึh,ฟgฯž\ำํํํq๔่Qiฺƒ„พพพ๘๖oฅiใฦฤ–-[rีฅVซ…รซfอš"==]š?w๎\@ฤฤฤHำฑvํZiฺฅK—กฅฅ%N:%M฿ปwoฎ`yํวฟ[+Wฎ”ฆๅธบu๋Šฌฌ,๖/ธ‹/ แํํ-žอs !„ปปปฐดด?–ฆEEE ---ัฃG\๕๕้ำGฃฏ๖ํ sss้ๅห—1o<vฦฦฦาพz“ฯลž={rmgA!ฌ0E p>฿}๗จRฅŠ4ฯ[๔๎[!^+ภ้้้i|EEEๅฺWฏเ๔๕๕5ยสโล‹aeeฅ๑ŸŒQฃF ms>๗3gฮ”ฆฅงงKŸ‰œฝjี*กฅฅ%Ž;ฆฑฐฐ0@œ8qBฃ&---qแยถC‡ฆฆฆน>๗…y๘๐aพŸ๗ข~v๓าถm[QซVญLŸ>=ื>ห‘฿vๆฬห+ภ๖ฝ™็ด{๕๊•ซOฅRY่็๎}8โงŸ~าX6็?ฯ9 หฌฌ,1x๐`กซซ+B[[[,Zดจะฺ_ีฒeห<ฟ‡žBฅ\BCCQซV-๔์ู„ฟฟ?† Rคewํฺmmํ\ํฟ๖[!ฐ{๗niฺห‡ฆ๑่ั#๘๛๛ใ฿Ebbb‘ึ๗๒x9ง222คำŒ›6m‚RฉD“&M๐่ั#้ๅ้้ ccc>|Xฃ?'''ิซWOzoaa๊ีซใ฿•ฆ๑วpssC๛๖ํsี๓๊iฆฝ{COOOzŸำ๗ห€ฑฑ1ฅ๗ีซW‡™™jึฌ‰ฺตkKำsพ~y๙—๗cff&?~Œ*UชภฬฬLใ”FŽ~๚ๅ{ ษ๙๓็แ๏๏8peห–ี˜_ฟ~}! ฝ๙นsธqใ† –๋ดDฮ>บw๏T*z๕๊…rๅสI๓]]]ัคI์ฺต+Wฟมมม๏๋ีซ‡ว#)) PญZ5ธปปcร† R›์์llผญ[ท–๖ี๋~.Pเ6ฟ+บuรตkืpๆฬ้฿ื9}šฃqใฦจ\นฒ๔ีีฆฆฆน>‹ฏฃQฃFงˆr>Ÿ;v„‰‰Iฎ้ฏฎKGG๛๗—๋้้กx๐เ"##ผซš5kขFcีฐaCศ5Vprrา˜fff†””์฿ฟท๕eo๒ู}ตž;w๎เฬ™3o\C^YยพwrNม8Pฃ7฿|“ซ/333œ>}๑๑๑๙ฎฏจ?+ŠK^Wิฯถถถ6*WฎŒ€€ฌXฑ6l@๋ึญ๑อ7฿ผึMJ๏ๅขงง‡฿7n@rr2–-[Vไ๋vnผ PณfMi~Ž'N qใฦา๕#=z4)ภiiiแ“O>ั˜VญZ5ฎนz๕*aii ืณgฯ๐เมๅ+Uช”k=eห–ีธ.๊๚๕๋E~~ีซๅขWฏณฒตตอต•J%์์์rM{u๙็ฯŸcธqา5‡ๅห—‡……๒ŽŽŽ๙ึบuk˜˜˜`๏ฝ055-ยๆํ๚๕๋Pเ~ส๙,Tฏ^=ืผš5kโัฃGนnฒ(สโ‹/pโฤ ฝ{ภ‹g๒=x๐_|๑…ิๆu?ํณwอรร5jิภฺตkฑfอXYYIแๅuๅณถ}ๆ|>‹๒นiLห๋{๘ย… นฦ)ง]QฦjเภจVญš7o[[[๔้ำ'ื๕ฏใM>ป/๛แ‡`llŒฯ>๛ UซVล Aƒpโฤ‰ืชแu?“…}๏ผyZZZน๚ญRฅJฎพฆM›†๓็ฯรฮฮŸ}๖BCC฿๊?oหภภ@บฦ-ว๋|ถงL™‚ฉSงbบu่ัฃบt้‚ญ[ทขnบ4hฒฒฒEูoญtชBom๏ฝ€ดด4\ฝzตุ]ฟ~5B50kึ,ุููAOOปvํย์ูณกVซ‹e=jต–––XณfMž๓_ฆฯ๏ศ”xๅฦˆข*j๙ต+ส๒฿|๓ –-[†aร†มววJฅ …y๎ว‚.สํุฑ#VฌX5kึh๙Pe|๑ล5j6mฺ„aร†aใฦP*•hึฌ™ิๆu?ฏs!๓ปะญ[7,Zด&&&๘โ‹/ ฅ๕๚๗.สพห๏?j๙= ๋m>ทEฅVซแโโ‚Yณfๅ9ีฐ˜ืXYZZBฅRa๏ฝุฝ{7v๏eห–กGXฑbลkื๔ถjึฌ‰ห—/cวŽุณg๘ใ,\ธใฦ+๒ใ™^๗3YœcาฅKิซW[ทnลพ}๛0}๚tL:[ถlA๓ๆอ_ปฟ‚>wEนใ๔m๏J]ธp!6l˜๋แ๐mฺดม๐แร—g-i p”Ktt4~๚้'๔๎*• }๛๖ELLŒ๔ฟh o8{{{8pษษษGแr๎ขณทท๕ื_HOOว๖ํ5g๘๊้‚จีj๛๏ฟาฤเส•+ ึฉ\น28__฿b๛%\นreœ?พX๚*›7oFฯž=1sๆLiZZZฺ=t๚๔้ะััมภabb๒Fง๊Hง๊ฮŸ?ฦ็ู&็ณp๙๒ๅ\๓.]บ„๒ๅห็::SŽŽŽ๘์ณฯฐaร <[ถlAปvํ4Q\Ÿ‹ืนฃ๔mt๋ึ ใฦรฝ{๗ฐjีชwถžฒeหๆ๙นy๙ศyqŠGJJŠฦ8็๕=…FฝีึำำC๋ึญับukจีj 8‹/ฦ?˜๏/็‚~ฮo๗ู522ย_|/พ๘่ะก&Mš„QฃFมภภเฝ}ถrุCญVใฦจZตช4ีปๆsX[[cเภ8p ๙็Ÿ6l˜๔ะดiS้ฤ๛๗วณgฯ๐oฟมาา๗๎+Rญุณgz๖์‰ฺตkc๗๎ุนs'F-๓๗๗G1y๒dจT*4mฺบบบธz๕*6mฺ„นs็j<ฌ(FŒอ›7ฃs็ฮ่ำง<==๑ไษl฿พaaapss{ญVซVญฐjี*(•J899แ๏ฟฦ`nnFiiia๕๊ีhืฎบt้‚]ปvIื\๓ฯ?hะ ฦ_เลษZZZXดhZทn www๔๎ึึึธt้.\ธ ขŸ>}:š7o|๕ีWx9ๆอ›ฅR๙V?w้า฿}๗พ๛๎;”+W.ืQภโ๚\xzzโภ˜5klllเ่่จqำษซ๚๋/DEEx๑Ÿฅ่่hLœ8ภ‹ำ59ก"/C‡-สฆฟ•ภภ@๐รh฿พ=† ‚ิิT,ZดีชUห๓†˜ทeccƒฉSง"..ีชUร†  Rฉฐdษ่๊๊‚‚‚ฐqใFใ๐แร๐๕๕Evv6.]บ„7Jฯ็+H฿พ}๑ไษ4lุถถถธy๓&ๆอ›www้๚ผยษษ 6l@ตjีPฎ\98;;รูู๙ญ>ปM›6…••|}}QกB\ผx๓็ฯGห–-ฅ39?cวŒƒภภ@่๊๊ขu๋ึotTบ(<==ัฑcGฬ™3?ฦ็ŸŽ#GŽHGDsŽ,%''รึึ:u‚››Œqเภœ9sFใ,@QV/ฦg๓ๆอhึฌบt้‚๋ืฏc๕๊ีฏœ SะXŽ9ปwGํฺต๑๕ื_ระะ๋ึญCdd$&Nœ(}‹ยำำ6lภ๐แรแํํ cccดnบุถCร{นื•d!22R่่่h<šCˆทX{{{ ้‘YYYโ›oพBกPhNˆ'๑๗๗ฦฦฦาฃL^็ัBq๘qัคIabb"ŒŒŒ„ซซkฎG|8p@๘๚๚ CCCajj*Zทn-bcc ญ๏ๅmส๋๓โ๋๋+=)?o๓นโลใ^„กกกP่#Eryื๋ๅฯD~๛ชW? ฏ.ฏว7์ทO8;; ===Qฝzuฑz๕๊|#๒jŸ9Ÿ๏้ำงkLฯ๋๛!็s!|||„ฐททฯ๓9b๊ิฉขVญZB___”-[VxzzŠ &ˆฤฤฤBทs๓ๆอขiำฆยาาR่้้‰J•*‰๛็z^`^Nž<)<==…žž^ฎฯ~Q>ปyYผxฑ๐๓๓ๆๆๆB___Tฎ\YŒ1Bc[„โ็Ÿ+VZZZŸ๓‚ฦี_็{'%%E 4H”+WN‹vํฺIๆษyfdzzบ1b„pss“พฏคgฎๅxŸ3gฮ+V๚๚๚ยืืWDDD๙1"FFFน๚ห๋3[ะX๎ูณG๘๛๛‹๒ๅห ===แโโ"ยยยŠT๛หž={&บu๋&ฬฬฬ€w๚H…%pฮ‡ˆˆˆ>x*• Xฝz5พ๒ห’.‡^ยkเˆˆˆ(ฯฟ๑;gฮhiiมฯฯฏ*ข‚๐8"""ยดiำ‰ @GGGzไสื_๋q-›'Ožhd๑*mmํ\zืx •ˆˆˆฐ~L˜0ฑฑฑx๖์*Uช„   Œ3::๗๑ž๚๕๋ใศ‘#๙ฮททท—>พ0ภ 22ฒภฟ์`hh__฿๗X‘์๐&""""™a€#"zลํทa``๐ฺ`C…B๐๐๐ท๎ซ~๚pvv~๛ข>Ÿ9พ๛’.ƒ่ต1ภั;ฑ|๙r( ( ?~<ื|!์์์ P(ะชU+y9หๅผŒŒŒเไไ„‰'"555ฯ๕ลฤฤ@กPเŸyฺ๋๚้'ิฎ]๛ฝ_ำ๒1๛ๅ—_ฐmถ\ำOž<‰ะะะw๖'ฅ~๘แ,Xฐ๗฿;้Ÿ่]a€#ขwสภภkืฎอ5ศ‘#ธs็Žฦ™Y“&Mฐjี*ฌZต 3gฮ„‡‡~๑G๔์ู3ฯ๖;w๎„ฅฅ%ผฝฝ฿ช‡bลŠ~ซ~>4~~~x๙๛<ฏ‚„ Y€kถ-LMMs Pขว}_0ฝs-ZดภฆM›๐๋ฏฟj<Š`ํฺต๐๔๔ฬ๗]WซV ปw—###[ถlAZZ 4ฺ๏ฺต อ›7—fใ›Zฝz5ttt฿/|)))o70ตดดrํณYjj*ส”)---t๊ิ +Wฎฤ„ ๚๓C๔พ๐ฝS]ปvลใวฑ~iZFF6oŒnบฝV_VVVP(นžI•€“'Oขeห–าด๕๋ืรำำ&&&055…‹‹ ๆฮ[่:ถm†ฺตkรุุXczฮu_ััั๐๗๗G™2ePฅJlผภ‹#Šตkื†กก!ชWฏŽไ๊๛นshผ9LMMallŒFแิฉSmrN=9r„ฅฅ%lmmฅ๙ปw๏Fฝz๕`ddดlู.\(tป๒บ๎๊ีซุ่ฑ#ฌฌฌ```[[["11ฑะ€VจSง แ่่ˆฐฐฐ\mาำำ1~xTฉR๚๚๚ฐณณร๗฿๔๔tฉBก@JJ VฌX!6๏ีซBCC1bฤ€ฃฃฃ4๏ๅ็mญ^ฝžžž044Dนrๅˆทokิ3v‘‘‘๐๓๓C™2e0z๔hi~“&Mp๓ๆMจTช"m7ั‡€Žˆ)๘๘๘`บuาดปw#11๙.—––†GแัฃGธy๓&ึฎ]‹+V [ทnนฝ{กP(ะดiS/HฺตkW”-[SงNล”)SPฟ~BoJศฬฬฤ™3g๐้งŸๆ9้ำงhีชjืฎiำฆA__ุฐaัขE L™2)))่ิฉ’““ฅe/\ธ€z๕๊!** ฿=~๑Gธq๕๋ืว้ำงsญkเภˆลธqใ0rไHภชUซะฒeKc๊ิฉ๘๑ว‹บu๋พ๖CD322€SงNแ›oพม‚ ๐๕ื_ใ฿-า้สงOŸขE‹๐๔๔ฤดiำ`kk‹เ๗฿—ฺจีjดiำ3fฬ@๋ึญ1o<ดkืณgฯฦ_|!ต[ตj๔๕๕Qฏ^=้ดyักCtํฺ0{๖li^ฮ๏'Mš„=z jีช˜5k† †ƒยฯฯ/ื6<~อ›7‡ปป;ๆฬ™ƒ H๓<== TดBื๘ร๗DDEถlู2@œ9sFฬŸ?_˜˜˜ˆิิT!„;w 4Baoo/Zถlฉฑ,€<_ํฺตiiiนึ$ฅ๗C‡ฆฆฆ"++๋ตjพvํš ๆอ›—kžฟฟฟ ึฎ]+Mปt้’ ดดดฤฉSงค้{๗๎ฤฒeหคiํฺตzzzโ๚๕๋าด๘๘xabb"คi9๛ญnบ๕''' 333ัฏ_?บ๛๏?กT*sMีแร‡q๘๐a!„็ฮฤฆM› )yศู3gฮ”ฆฅงง wwwaii)222„BฌZตJhii‰cวŽi,&ˆ'NHำŒŒŒDฯž=sญk๚๔้€ธqใ†ฦ๔ธธ8กญญ-&Mšค1=&&F่่่hLฯฉ7,,,฿mาำำ (t‰><GD๏\—.]๐๙s์ุฑษษษุฑcGกงOถm‹๛๗c๘๓ฯ?1jิ(์ูณบuƒx้๙ใjต{๖์ั8}jff†””ำถE๑๘๑c@ูฒe๓œollฌqิฐz๕๊033Cอš5Qปvmizฮื๛/ ;;๛๖ํCปvํ๐ษ'ŸHํฌญญัญ[7?~III๋๊ืฏดตตฅ๗๛๗๏GBBบvํ*™|๔่ดตตQปvm>|๘ตถUฉTxq๔2ฟ;{ ขฃฃƒ๛K๏๕๔๔ะฟs\ฝz/^ฬ๗|?x๐เตj~ูีซW!„@ีชU๓œฏซซซ๑พbลŠะำำหท?!o` Ya€#ข๗ข[ทn่ืฏ๛๏?4offfฏGฃFG•ฎ]ปเเเ'''ฉฅฅ%T*๖๎‹ปwc๗๎Xถlz๔่+Vไฟนน9ไ๛7_>"V”้๙มข044ิxฏVซผธ^ฬสส*W๛7๙cใ3gฮDฏ^ฝ๐็Ÿb฿พ}2d&OžŒSงNi8๑ฆิj5\\\0kึฌ<็ฟ|_ทo…Bปw็น_ฝ ๅี๙ช„„”/_๋!z฿เˆ่ฝh฿พ=๚๗๏SงNaร† oิGVVเูณgาด;wขE‹นฺ๊้้กu๋ึhบ5ิj5ˆล‹ใวD•*U๒์ฟRฅJ044ฤ7จพXXX L™2ธ|๙rฎy—.]‚––Vกaฆrๅส^„ำ—Lพ-ธธธ`์ุฑ8y๒$|}}†‰'ธ\|||ฎว›\นrภ‹WrjŽŠŠBฃF =บ•฿ฆWฎ\B8::JGิปw‘‘‘š5kพU?D๏ฏ#ข๗ยุุ‹-Bhh่?cํฏฟธนน๎฿ฟณgฯjœ>ZถZZZpuuวWผJWW^^^ˆˆˆxฃ๚๒ฃญญฆM›โฯ?ิธ[๔๛Xปv-๊ึญ[่)ะ€€˜ššโ—_~Afffฎ๙>|ญš’’’ค@œรลลZZZ๎ฃYYYXผxฑ๔>##‹/†………tWg—.]p๗๎]๖oน–9RRRค๗FFFyš_ืกChkkcย„ นŽt !r} ’sอ^:uŠผ QIใ8"zo๒๛+ yนrๅ Vฏ^ เลCWO:…+V J•* ๐โ๔ฉฦ#! o฿พx๒ไ 6l[[[ผy๓ๆอƒปป{กGYฺถm‹1cฦ ))้ตฏ++ศฤ‰ฑ~ิญ[„ŽŽ/^Œ๔๔tL›6ญะๅMMMฑhั"แำO?E`` ,,,p๋ึ-์นพพพ˜?~‘๋9t่Œฮ;ฃZตjศสสยชUซ ญญŽ;บผ ฆNŠธธ8TซV 6l€Jฅย’%Kค๋ฯ‚‚‚ฐqใFใ๐แร๐๕๕Evv6.]บ„7b๏ฝ๐๒๒๐โQภฌYณ`ccGGGิฎ][ ƒcฦŒA`` tuuับukTฎ\'NฤจQฃ‡vํฺมฤฤ7nภึญ[๑๕ื_ใป๏พ+าพุฟ?*Uช"๏?ขWr7ภQi๖๒cD R”วˆhkk [[[๑๕ื_‹๛๗๏Kํ:u๊$Zดh‘ซฯอ›7‹ฆM› KKKกงง'*Uช$๚๗๏/๎ปWh๗๏฿:::bีชUำEญZตŠTฮ6 4HcฺูณgE@@€066eส” 4'OžิhSุ~;|๘ฐJฅRˆส•+‹^ฝz‰ˆˆˆท๋ีวˆ๛๏ฟขOŸ>ขrๅสยภภ@”+WN4hะ@8p ภ~„๘}!|||„ฐทท๓็ฯฯี6##CL:UิชUK่๋๋‹ฒeห OOO1aย‘˜˜(ตปt้’๐๓๓†††€ฦ#E~๙gQฑbEกฅฅ•๋‘"๑‡จ[ทฎ022FFFขFbะ Aโ๒ๅหน๊อKvvถฐถถcวŽ-tป‰>$ !โ*["ข’••sssLž<,ึพฟ๚๊+\นrวŽ+ึ~้รณm6t๋ึ ืฏ_‡ตตuI—CTd pD$K<ภย… ัฟbล{๋ึ-TซV „ฏฏoฑ๖MิซWฏHงฑ‰>$ pDDDD2รปP‰ˆˆˆd†ŽˆˆˆHfเˆˆˆˆd†ŽˆˆˆHf๘ ฿RHญV#>>&&&ใฬDDD2!„@rr2lll ฅU๐16ธR(>>ญH4•œทoรึึถภ6 pฅ‰‰ เฦ(Wฎ\ WC…ษฬฬฤพ}๛ะดiS้Oั‡‹ใ%?3y๙˜ว+)) vvvา๏๑‚0ภ•B9งMMLLŠ๕o9าป‘™™‰2eสภิิ๔ฃ๛a%G/๙แ˜ษ ว Eบ‰71ษ ‘ฬ0ภษ ‘ฬ0ภษ ‘ฬ0ภษ ‘ฬ0ภษ ‘ฬ0ภษ ‘ฬ0ภษ ‘ฬ่”t๔๎ฬ9ตžqI—A…ะำๅ ิ›vjEI—C…เxษวL^ไ0^glXา%๐‘0ภษ ‘ฬ0ภษ ‘ฬ0ภษ ‘ฬ0ภษ ‘ฬ0ภษ ‘ฬ0ภษ ‘ฬผำืฉS'|๙็ล๏๖ํ๑๋ฏฟถm†kืฎฝuŸ๋~Š*::ตkื†ปป;q็ฮ๗ถn"""’ทwเ๖๏฿mmํb๏7;;mฺดม!C_€+N™™™HII)ฐอธqใ0qโDจT*t่ะณgฯ$$$ผ‡ ‰ˆˆHฮŠ%ภ๖opqq››ฦฬฬL๒ห/;vl‘–๏ืฏ> pss“ยLฯž=q๒ไI,_พ:u‚ฟฟ?‚‚‚ฐ|๙rŒ9งOŸฦ๖ํ1hะ ธปป#99๓๊ีซ‡O?;wFjjjพ๋๑วQฝzu4mฺ?–ฆ๏นŸ9 ตZ็vพ*..ฃGF5pๅส€ƒƒาาา@ช;GRR’๔ฏตต5`บupssร‚ ค๙…IOOGRR’ฦ‹ˆˆˆJฏทpัััXฐ`Nœ8จจ( :ณfอBฯž=abbขั6,, aaa€ˆˆ๔ํเ๋๋‹“'O")) zzz8y๒$ 22žžžาzv์ุตkืJีฎ]mฺดม‚  Rฉ ฏฏ#F`๛๖ํ8{๖,>๛์3,\ธ0ฯบ๙็์฿ฟ็ฯŸวฒeหp๊ิ)ภฃG0gฮ„‡‡CฅRA[[[ถlษs;Gทo฿Ž-Z C‡จXฑ"ฮž= ๗”)S[[[lผƒ 0๙'๎ป///๔๋ื‘‘‘๖5y๒d(•J้eggW`{"""’ททpแแแ „ฉฉ)เ๙๓็ุทoz๖์™ซmpp0‚ƒƒ^^^Xบt)€๎ฤ‰๘๛๏ฟัฎ];ฟ๗๏฿‡™™๔๕๕อš5ห_u๙๒eDGGฃAƒpwwวฒeหp๓ๆอ<žƒฏฏ/ๆฬ™__฿B—311Arr2 Fธqใbbb)))๙เPงNlบ™™™ˆวฑcวŸ9<(๚๘๑cนs'ืv>y๒เ์์Œ… โนsจZต*บu๋†  ..`oo•JตZ;vH๋755ลูณgDตjี๛๖ํƒณณ3fฬ˜ฎ]ปโย… 3f *TจP่พ ""ขร[svvฦเมƒQงNhkkฃ}๛๖ อณmฮ๕oมมมˆˆˆ@XX˜ฦiิ{๗๎มะะพพพธ{๗ฎฦธข_ฟ~˜4iŽ;†ตkื"88ฯž=ƒำฆMC•*Ur-๗ูgŸกQฃFpvv†ƒƒƒ๔ธKKK,XฐmถEff&tuu๑oฟแำO?-p;ŒŒะทo_๔ํ‘‘‘ะัyฑkวŽ‹=z |๙๒pss“ฺ/Zด}๚๔Xนr%ภ{๖์ญญmแ;Ÿˆˆˆ>J !„(้"จx%%%AฉTยs์ŸP๋—t9T=-Qฮฯ0๙ผ12ิŠย ล๑’Ž™ผศaผฮุ๐๔›๓๛;11Qบๆ>?K DDDD2S์71|ˆjืฎญq๐โ1"zzz%Tั›๛(้ำงKบ"""ขbรSจDDDD2รGDDD$3 pDDDD2รGDDD$3 pDDDD2รGDDD$3 pDDDD2รGDDD$3ลƒ|?V{‡๙ยผคห Bdffbืฎ]8๖ฝtuuKบ*วK~8f๒ย๑*#"""’8""""™a€#"""’…B”tTผ’’’ T*ั๕฿ะ)ฃ,้rจฺศFCญ๋8คฎŒlh—t9TŽ—pฬไEใ5ฟ}อwาoฮ๏๏ฤฤD˜ššุ–Gเˆˆˆˆd†ŽˆˆˆHfเˆˆˆˆd†ŽˆˆˆHfเˆˆˆˆd†ŽˆˆˆHfเˆˆˆˆd†ŽˆˆˆHfเˆˆˆˆd†ŽˆˆˆHfเˆˆˆˆd†ŽˆˆˆHfdเ:u๊„ฯ?—OHHภาฅK‹ฑขขษสสBPP\]]แ์์Œ 6ผ๗ˆˆˆHždเ๖๏฿mmํท๊ใ]ธงOŸ8วŽPซีˆŽŽฦกC‡ศศศ@jjjฑืCDDDฅ‡loฟธนนa๘๑ศฬฬฤ/ฟ‚ฑcวi๙๐๐pJ๏๋ืฏK—.aฬ˜1ˆ‰‰ปป;ฆOŸŽิิTtํฺ...๐๕๕ล•+W7|||เแแ† โฝ{นึ‘––†+V N:˜>}: 44aaaR+++้๋””จีj<{๖ *T๐"๘9;;cศ!ˆ}EDDDฅžNIPัััXฐ`Nœ8SSS=z๒ไIŒ=ะขE ๔๋ืภ‹#cปwว7••…J•*๘ใbาคI8< ŠดžำงOCฉT">>ืฎ]CถmขG่ัฃฮŸ?=z`๒ไษˆ‰‰ษณฏษ“'cย„ ฏตDDD$_ฒ9…๚2•J…ุุX8::ขnบ8w๎ฺดiSเ2ฺฺฺPซีา๛—XลธqใะกCฤฤฤ`ีชUา๒Mš4มŒ3ฐfอtํฺปvําXฯห๋}ykืฎEณfอ ฅฅ…jีชมิิ๑๑๑าปw๏โ็ŸF็ฮแ์์Œ%K–ไ[จQฃ˜˜(ฝn฿พZFDDD๒"‹ืฐaCฌ_ฟ^:5่ใใƒ{๗๎!..ว‡‡‡ถo฿^`•*Uย… ••…›7o"::`bb‚ไไdฉ]:uค;B๗์ู'''/NKZ[[–/_.ต755ละกC…ฌYณีซWว๊ีซ๖๖๖PฉT Qฃญญ-ยรร๑๑๑ˆ‡••ัฆMภุุ'Ožฤส•+แใใ“๏ถ้๋๋ริิTใEDDDฅ—,Nก:;;c๐เมจSงดตตัพ}{„††ๆู6ฟkเ์ํํัจQ#ิชUKzt˜››รีีฎฎฎ ยเมƒ๑ีW_มีี&&&Xถlเป๏พC๏ฝallŒฆM›ๆนn???๘๙๙แ๑ใวธx๑" C‡๘๗฿แ๊๊Š๖ํKm „๎ปรลล0w๎\่้้แ๙๓็>|8๊ืฏ_ปŽˆˆˆJ!…B”tTผ’’’ T*ั๕฿ะ)ฃ,้rจฺศFCญ๋8คฎŒlผcq่ใxษวL^ไ0^๓ื|'ๆNLL,๔lš,Nกัc€#"""’8""""™a€#"""’8""""™a€#"""’8""""™a€#"""’8""""™a€#"""’8""""™a€#"""’’.€Iอชยผคห Bdffbืฎ๋˜ัช:tuuKบ*วK~8f๒ย๑*#"""’8""""™แ)ิRlCิ]šค”tTu6สX}๖ ฅ]าีPa8^๒ร1“ŒWo๏J%]ภษ ‘ฬ0ภษ ‘ฬ0ภษ ‘ฬ0ภษ ‘ฬ0ภษ ‘ฬ0ภษ ‘ฬ0ภษLฉp:uย็Ÿฦห‡‡‡#""ข+*š่่hิฎ]๎๎๎๐๗๗ว;w{ DDD$?ฒp๛๗๏‡ถถ๖[๕๑.\ff&RRR l3n8Lœ8*• :tภ์ูณ ลZ •.ฒ pฟ๖\\\เๆๆ†๑ใว#33ฟ๒ ฦŽ[คๅืฏ_N:"##แํํทo#,, “&M‚ปป;._พŒ3gฮภหห ...0`ฒณณใว‡ทท7œ1z๔่<ื‡ัฃGฃFธrๅ ภมมiii€ๅห—cไศ‘R๛คค$้_kkkภบu๋เๆๆ† H๓ ’žžŽคค$•^ฒ pัััXฐ`Nœ8จจ( :ณfอBฯž=abbขั6,, aaa€ˆˆ๔ํˆฬฬLฌ[ท๛๗ว’%K`gg‡เเ`Œ3*• ีซWG๏ฝฑx๑bฤฤฤเษ“'Xทn`่ะก8sๆ ขฃฃจจ(@vv6ถo฿Ž-Z C‡จXฑ"ฮž= ทiส”) ญญ-6oŒมƒ €?๗๎ƒ——๚๕๋‡ศศศ|๛™|8v๎‰่่ht๎้้้^kึฌ๚๔้ƒ~๘Wฏ^ีXV[[jตคe`๓ๆอhธ1 C‡8}๚ดฦrวŽC๏ฝ1u๊TŒ=ปwฯณ6}}}˜ššjผˆˆˆจ๔’M€kุฐ!ึฏ_/]฿ๅใใƒ{๗๎!..ว‡‡‡ถo฿^`้้้0`8€ทoc฿พ}$''ฬฬฬ ญญ-]ทn๊ึญ‹ดด4hiiกlูฒx๒ไ ๚๋/ฉ_ggg,\ธ็ฮCีชUัญ[74hะqqq{{{จT*จีj์ุฑCZฮิิgฯž๐โ่^ตjี๛๖ํƒณณ3fฬ˜ฎ]ปโย… 3f *TจP {’ˆˆˆไNงค (*ggg <u๊ิถถ6ฺทoะะะ<ๆ\Œˆˆ„……a้าฅ๘้งŸะพ}{8;;cษ’%hบ5NŸ>ึญ[ฃSงNXปv-ึฏ_฿_}๕าำำแ๋๋‹ภภ@hkkฃkืฎจYณ&lmmแใใ“kฝFFF่ท/๚๖ํ‹ศศH่่ผุฝcวŽE=Pพ|yธนนIํ-Z„>}๚@ ฌ\น`nnŽ={๖ภึึถ˜๗"• !„(้"จx%%%AฉTbมม(š˜•t9Tu6ส'Vฎ€ึ=‡Ž—pฬไEใีปา;้7็๗wbbbก—Cษๆ*ฝภGDDD$3 pDDDD2รGDDD$3 pDDDD2รGDDD$3 pDDDD2รGDDD$3 pDDDD2รGDDD$3 pDDDD2#›?fOฏ๏ ทŠ077/้2จ™™™ุต+?ต…ฎฎnI—C…เxษวL^8^Eร#pDDDD2รGDDD$3 pDDDD2รkเJฑศธ$˜<ี.้2จ๊์,ภ?&BK›฿’:Ž—pฬ>L>UฬJบYใ8""""™a€#"""’8""""™a€#"""’8""""™a€#"""’8""""™a€#"""’8""""™a€#"""’8""""™a€#"""’8""""™)‘ืฉS'|๙็…ถ‹‹‹รๆอ›‹mฝกกก +ถึˆ#เ์์ '''ฬ;ทคห!"""™x๏nะึึ.Rโpo#;;๛ตฺ?}๚ดภ๙*• งNBtt4"""0cฦ $%%iY"""๚ธฝำ๗oฟมลลnnn?~<233๑ห/ฟ`์ุฑEZ~ฬ˜1ุปw/ฑfอ<|๘อ›7‡‹‹ p|—ฝt้แๆๆ†ฺตk#==‰บu๋ขrๅสุทoเ๚๕๋จ[ท.>๔S๘๘๘เโล‹€ๅห—ฃSงN๐๗๗GPP> ธปปรืื7ื:ณฒฒฐeห4mฺƒ–๚9rคิฦมมiii€ดด4dffโ๙๓็011พพ>ภหห ฝ{๗ฦ้ำง‹ดŸาำำ‘””ค๑"""ขาK็]u เฤ‰055ล“'O0kึ,๔์ู&&&msNk#""aaaXบt)&Mš„ฐฐ0ฌ_ฟ0pเ@4iาร‡วย… 1fฬ,]บ4ฯ๕aฺดihะ กซซ ธy๓&Ž9•J…!C† iำฆฐถถฦมƒกฏฏ๙ฃGฦึญ[ฅํˆŒŒ„‰‰ Zทn_U๊3วํท๑oฟa๚๕จ[ท.~๚้งBOปปปร฿฿666ศศศภขE‹คw๙๒e๕ื_ ลร‡ัฏ_?|๙ๅ—066ฮณฏษ“'cย„ … •๏์\xx8ajj x9๖ํ‡ž={ๆjŒเเ`/Ž>ๅสNž<‰๎ปบw๏Ž'Nไู.)) ษษษhะ @ฉTBK๋ลฆถlฺฺฺู๐๐๐@\\€Gฐz๗๎ ggg๔๋ืฑฑฑR_อš5“g:u๐๗฿c๙าฝ๙ŽŽŽHMMEDD~๗"]฿wํฺ5บu ๑๑๑ธvํ&Nœˆวtttะพ}{์ฝ๑๘ใX[[็ืจQฃ˜˜(ฝn฿พ]่๚‰ˆˆHพ5p*• ฑฑฑpttDบuq๎9ดiำๆ}ญ^’s”KKKKบฎmฮœ9จ^ฝ:bbbp๐เA)œ@™2eคฏG…฿~๛ OŸ>Eํฺต๑๘๑cธบบbษ’%8~8:v์ˆ7"##CZF[[jตZzŸำ๗ึญ[แใใ}}}TจPnnnธpแ‚ิ๎๑ใว˜3gฺดi###lฺดฉภm255ีxQ้๕ฮ\ร† ฑ~z้z,ปwqqq8~8<<<ฐ}๛๖๛011Arrฒ๔พN:ุฐa`ํฺตจ[ทnžห™ššBฉTโ๐แร€ฤฤD๕ชคค$XYYAกP`๙๒ๅ๙ถ๛๗฿แ๎๎Žธ}๛6 ะงOœ:u ำงOวกC‡PฃF ฬœ9`ooจจ(/Žึๅ\ทgkk‹ฃGBญV#99gฯžEๅส•บuƒ’’’ฐ{๗nlบอš5+p_ัวใ8ggg <u๊ิ››~๕ื|†……IืมEDD o฿พWWW<\บ‰!44ปvํ‚ซซ+ถlู‚‰'ๆ็ส•+1~xธนนกYณfศฬฬฬทmpp0ๆฯŸwwwภ๘ชYณfกVญZpuuE5เๆๆฆ1฿aaaˆŽŽ†ปป; nบ066†““๗ฟมฮฮะนsg(•Jธธธเ๓ฯ?GHH*VฌเE€ปt้ฦ›|๋!""ข“B!Jบ*^IIIP*•ุ๑/L”eKบ*„:; .@๙พะา~g๗Q1แxษว์รไSล,ฯ้™™™ุตkZดh!€๘ฑศ๙˜˜X่ๅPK DDDD2#๛7iา$ธปปkผ>”‡ฝ ฒ?––/_ŽGK=qqqุผysพ๓รยย œ.dee!((ฎฎฎpvvฦ† ๋๚‰ˆˆHพJ$ภล๛ pูููFงNŠe]9ž>}Zเ;v@ญV#::‡BHH ##ฉฉฉลZ •.:ลัI||<:w๎Œ””จีjTญZ111pwwว—_~‰ข{๗๎ธ|๙2 ํo๋ึญˆˆˆ@๛๖ํQพ|y;v ห–-รฬ™3C† มื_็ฒ111่ีซฒณณกP(p๘๐aŒ3ฑฑฑpwwวˆ#p๕๊Uผy—.]B:u`bb+++ฃ~๚จ]ป68ตZํทรฮฮWฎ\Aทn™™‰ @ฅR!<<\ciiiุฐa/^Œ๚๕๋ใ—_~Ahhจิ7๐โ่ใาz๖์*TจเE๐๓๑๑AซVญ ''งB๗Wzz:าำำฅ๗III….CDDD๒U,Gเึญ[‡ฦCฅR!22'N„‹‹ T*FŒ ภััฑฑฑhผ9๎฿ฟ/-๋๎๎.}ทo_)ธyyya๋ึญ8v์๎นƒI“&แ๘๑ใ๘๛๏ฟ1kึ,ฤลลๅYห’%K0x๐`จT*œ8qฦฦฦ˜4i Rฉ๐ๅ—_ฎ_ฟŽฃGJก๐eฦฦฦˆŒŒD๗๎6lBCCอ{๙๒e„„„ภููgฯžลoฟ†_~๙ฅภ}ึชU+ภฦฦ๎๎๎˜5k B… ธpแผผผะฟ๘๛๛cํฺตํU“'O†Rฉ”^vvvฎ›ˆˆˆไญXœทท7VญZ… &เ๊ีซ044ิ˜๒ไIฺถm‹2eสH๓T*•๔๕าฅKแๅๅ•ซˆˆ4mฺfff011A‹-p๚๔้ ฅR‰๘๘xDDD`เภศสสขG8v์,X€3fไน_rŒ5 ‰‰‰า๋๖ํ…ฎŸˆˆˆไซXœŸŸŽ= KKKt์ุฬีFกPวช ีญ[7๙็ŸะััAƒ p๑โล<ฝ"_ฅฏฏะาาBvv6@‘g&Mš`ฦŒXณf บvํŠ]ปvAญVK๓ตตตฅ๗/E[ปv-š5k---TซV ฆฆฆˆ—ๆ฿ฝ{?3:w๎ ggg,YฒคภzMMM5^DDDTzK€ปy๓&ฌญญ1`ภ"!!ษษษา:u๊HwY๎ุฑฃH้›˜˜H}x{{ใเมƒHJJยณgฯฐ{๗nิฎ];ฯๅnธ*Uช`๘๐แ๐๗๗วๅห—5๚zSnnnุตk`ำฆMาtSSS :QQQ มš5kPฝzuฌ^ฝ`oo/eพ}ปดœญญญt ]||<โใใaee…ฤฤDดiำ066ฦษ“'ฑrๅJ๘๘๘ผUDDDTzK€ ‡ซซ+<<|8ฮŸ?”-[๖๊%""ขาK!๒;7HRSSahh…B‰'"++ กกก%]Vž’’’ T*๑เ?˜๋ซ _€JŒึ๐cศฬฬฤฎ]ปะขE‹|ฏหควK~8f๒๒1Wฮ๏๏ฤฤฤB/‡*–วˆ| NŸ>dggรัั+Wฎ,้’ˆˆˆ่#%๗๘๑c4jิHcZ๙๒ๅqเภwฒพœgฟ•4ู8sss*"""๚(๑ูษ ‘ฬ0ภษ ‘ฬ0ภษ ‘ฬ0ภษ ‘ฬศ๖AพT8ญฏท@หผคห ""ขbฦ#pDDDD2รGDDD$3<…ZŠฉ๗ŒบL๑ฑV๛๙ลฺฝ>#"""’8""""™a€#"""’8""""™a€#"""’8""""™a€#"""’8""""™a€#"""’8""""™a€#"""’8""""™a€#"""’87.p~BB–.]*ฝOKKCร† แแแร‡ฟ๑z:ธนนกeห–HNN~ใพˆˆˆ่ใ๑Q8!ิj58P`ปWนs็`jjŠs็ฮกAƒy.“ššŠŒŒŒ๛>|86nˆจจ(TซV ห—/<}๚๔๕6„ˆˆˆ>*ฅ&ภลววรืื๎๎๎puuลฅK—เแแŽ;ขfอš๘๚๋ฏกVซ*Tภ€เโโ‚ทoรสส Ž€€ดnUซVลคI“cฦŒALL 1}๚tแศ‘#pwwวใว5๊ธpแพ๙ๆิชUK b9@hh(ยยยค๗IIIB 99ึึึ€้ำงรืื+WฎDZZZกžžžŽคค$•^ฅ&ภญ[ท7†JฅBdd$„ˆŽŽฦ?ˆุุX>พะu{yyaึฌYXธp!Ž;†=zภภภ ะๅ~๕W„‡‡#>>๖๖๖Xฒd‰4ฏVญZ˜;w.bbb`eeggg๑วy๖3jิ($&&Jฏทoบn"""’ฏRเp๔่QXZZขcวŽ8x๐  …4_กPH๏ห”)“o?๚๚๚าืZZZศฮฮ.tK–,AญZตะนsgLœ8w๏ี˜r้้้€‡โ๒ๅหpvv†Bก@๛๖ํq๚๔iฉZญฦฎ]ปะตkWฌYณ3fฬ@“&M๒ญูิิTใEDDDฅWฉ p7o„ตต5 €ภภ@$''ใาฅKˆŽŽ†7nDบu฿จo“๏๕๑๑มส•+qโฤ ! mฺดAbb"ภศศw๎Azz:๖ํ([ถ,๎฿ฟ/-;x๐ ชUซXฝz5ชWฏŽ5kึ`๘๐แˆŠŠยะกCฬˆˆˆ Sา—๐๐pL›6 zzz077ว”)Sเ๊๊Š &เย… ๐๓๓C๛๖ํ฿จosssธบบยีีAAA๐๖๖ฮณ]นrๅ‚„‡‡Kำ'L˜ฺฺุขz๕๊๚๋ฏhึฌดดดPตjU„††p๊ิ)˜››ฟQฝDDDTบ)„ขค‹xโโโˆSงN•t)๏]RR”J%ฌ๎๓2ล›ัตฺฯ/ึศฬฬฤฎ]ปะขE ่๊๊–t9TŽ—pฬไๅcฏœ฿฿‰‰‰…žu+5งP‰ˆˆˆ>ฅ6ภๅœ†$"""*mJm€#"""*ญเˆˆˆˆd†ŽˆˆˆHfเˆˆˆˆd†ŽˆˆˆHfเˆˆˆˆd†ŽˆˆˆHfเˆˆˆˆd†ŽˆˆˆHfJอณงดšM‚–นyI—ADDDลŒGเˆˆˆˆd†ŽˆˆˆHfเˆˆˆˆd†ืภ•bุ๊? 65,R[-ท w\ #"""’8""""™a€#"""’8""""™a€#"""’8""""™a€#"""’8""""™a€#"""’8""""™a€#"""’8""""™a€#"""’™b p XบtiqvYjEGGฃvํฺpww‡ฟฟ?๎นSา%‘Lผท—]œซ*ฒ’Xoff&RRR l3n8Lœ8*• :tภ์ูณผุ‡DDDD)r€‹‡ฏฏ/แ๊๊Š“'Ojผฟt้ฦŒƒ˜˜ธปปc๚๔้Xพ|9:u๊แ๛hถ-ผผผPฏ^=\นroooธบบขw๏Pซี€๚๕๋ใoฟ…‡‡ผฝฝFแ“O>มฮ;๓ญ544ฝ{๗†พ{\ฝzMš4งง'š5k†๛๗๏––Xพ|9FŽ 1bjิจ777LŸ>๒ํใeqqq=z4jิจ!m[~๋€คค$้_kkkภบu๋เๆๆ† H๓ “žžŽคค$•^Ep๋ึญCใฦกRฉ‰ร‡kผทททวคI“เโโ•J…#FxqชpวŽXปv-BBB0~xDDD`ึฌY>|8 K—.8sๆ ขฃฃahhˆฟ๚KZฏนน9ฮ;‡บu๋b๐เมุนs'ถm†‰'X๏๕๋ืq๔่Qฬœ9ƒ ยาฅK‰ฏพ๚ ?sพห=~›7oFll,ขขข๐๕ื_@พ}dggc๛๖ํhัข:t่€Š+โ์ูณ๐๐๐(ฐพ)Sฆ $$ถถถุผy3 0`๓Oปw^^^่ืฏ"## ์k๒ไษP*•าหฮฮฎภ๖DDD$o:Em่ํํ^ฝzAKK ;wFฝz๕4;99ๅน\ณfอ`bb8t่bccฅyฺฺฺ€จจ(Œ;IIIHHH€ฺถm hีชภลล …pvvฦญ[ท ฌท]ปvะีีErr2Nœ8!๕—ส•+็ปœRฉ„ฑฑ1๚๖ํ‹vํฺกeห–๖ัฎ];\ธp+WฎDบu 9.\ˆ฿7ฦคI“0aยLž<ภ‹ฃv'NDhh(Vฏ^ ???๔ำO๘๖o๓์kิจQR^ัcˆ#""*ฝŠเp๔่Q๕ื_ุ่ฑ#ๆฯŸŸ๋}^มจL™2าื …gฯž…––ๆฟ~๚a๗๎จZต*fฬ˜gฯžI๓๔๔๔ZZZ_vm[ฮzีj5*Vฌ•J•ซถถถtบ6== ฃฃƒˆˆ์ปkึฌม–-[0w๎|๛˜}๚ }๛๖่ท/ชVญZเ:`๓ๆอ๘๕ื_:tภ Aƒ4๚=v์–,Y‚ˆˆŒ=ปwฯw[๕๕๕กฏฏ_เ ""ขาฃศงPoผ kkk 08~ธฦ๛˜˜˜˜˜ 999฿>๊ีซ'ไ VซHII……าาาฐaร†ท$MJฅeห–ลพ}๛ผธมเโล‹{{{จT*จีj์ุฑ๐์ู3$&&ขM›6˜6mT*U}8;;cแย…8w๎ชVญŠnบกAƒˆ‹‹หw`jjŠณgฯ<ˆjีช๖ํgggฬ˜1]ปvล… 0fฬTจPกX๗ ษW‘ภ…‡‡cฺดiะำำƒนน9‚‚‚เ๊๊*ฝ_ฟ~=ฬออแ๊๊ WWWมยยBฃy๓ๆ!88 ,@ff&z๔่Œ3Ÿ~๚)*TจP่ตcobอš50`FŒฌฌ,Œ15kึฤุฑcัฃG”/_nnn€ไไdดiำP(าตn๙๕‘รศศ}๛๖E฿พ} ป6ฏuภขE‹ะงO!`aa•+Wxqอ฿ž={`kk[์๛ˆˆˆJ…B”tTผ’’’ T*๑เ่b˜›i-ท w\ๅ'33ปvํB‹- ซซ[าๅP!8^๒ร1“—yผr~'&&ยิิดภถK DDDD2SไSจขฝ{๗โ‡~ะ˜ึฌY3L™2ฅ„*""""z๗dเPาeฝW<…JDDD$3 pDDDD2รGDDD$3 pDDDD2รGDDD$3 pDDDD2รGDDD$3 pDDDD2#๋๙Rมดœ:Bหผคห ""ขbฦ#pDDDD2รGDDD$3 pDDDD2รWŠl .้ˆˆˆ่`€#"""’8""""™a€#"""’8""""™a€#"""’8""""™a€#"""’8""""™a€#"""’8""""™a€#"""’8""""™)U.!!K—.-้2Šlฤˆpvv†““ๆฮ[าๅ‘L|4.;;๛ฝึ๒๔้ำ็ซT*œ:u ัััˆˆˆภŒ3””Tคe‰ˆˆ่ใ&›___ธปปรีี'Ožิx้า%Œ3111pwwว๔้ำฑ|๙rt๊ิ  ย๛๗ัถm[xyyก^ฝzธrๅ ,, puuE๏ฝกVซ๕๋ืวท฿~ x{{#""5ย'Ÿ|‚;wๆช1++ [ถlAำฆM1x๐`ภ๒ๅห1rไHฉƒƒาาาiiiศฬฬฤ๓็ฯabb}}}€——z๗๎ำงOฟำ}JDDD๒$›ทn:4n*• ‘‘‘8|๘ฐฦ{{{{Lš4 ...PฉT1b ::;v์ภฺตk‚๑ใว#""ณfอย๐แร]บtม™3g CCC๕ื_าzอออq๎9ิญ[ƒฦฮ;ฑm6Lœ8Qjs๛๖mŒ7NNNุฑc~๚้'ฌYณฆภํqww‡ฟฟ?lllเเเ€ัฃGK๎๒ๅหhำฆ BCCแๅๅ…ล‹ใูณg๙๖•žžŽคค$•^:%]@Qy{{ฃWฏ^ะาาB็ฮQฏ^=๗NNNy.ืฌY3˜˜˜:„ุุXižถถ6 ** cวŽERR`gg‡ถmZตjpqqBก€œq๋ึ-ภ?ƒ:u๊`ุฐaˆˆˆ€ฉฉi‘ถ็ฺตkธu๋โใใ‘4oๆๆๆะััA๛๖ํัพ}{ผy๚๕รw฿}‡ไไไ<๛š}๚เิฉS˜>}::„5j`ๆฬ™{{{DEExqด๎๛[[[=zjตษษษ8{๖,*Wฎ ่ึญ|||””„ปwc๋ึญhึฌYพ5่๋๋ริิTใEDDDฅ—lNก†‡‡cฺดiะำำƒนน9‚‚‚เ๊๊*ฝ_ฟ~=ฬออแ๊๊ WWWมยยBฃy๓ๆ!88 ,@ff&z๔่Œ3Ÿ~๚)*Tจ7ฎัaaax๖์™tBบuall '''ิซWvvv€ฮ;c๏ฝpqq„„„ bลŠ^ธีซWCKK6๙šˆˆˆ#…B”tTผ’’’ T*แนค"๚ๅ๊•> ™™™ุตkZดh]]’.‡ ม๑’Ž™ผ|ฬใ•๓๛;11ฑะณi<ฤCDDD$3 pDDDD2รGDDD$3 pDDDD2รGDDD$3 pDDDD2รGDDD$3 pDDDD2รGDDD$3 pDDDD2รGDDD$3 pDDDD2รWŠํํVา%ั;ภGDDD$3 pDDDD2รGDDD$3 pDDDD2รGDDD$3 pDDDD2รGDDD$3 pDDDD2รGDDD$3 pDDDD2รGDDD$3 pDDDD2รGDDD$3 pDDDD2รGDDD$3:%]?! 99บบบ%\ &33ฉฉฉHJJโxษวK~8f๒๒1WRR€=^ธR่๑ใวGGวฎ„ˆˆˆ^Wrr2”JemเJกrๅสnบU่เuy{{ใฬ™3|Ÿr๊7)) vvvธ}๛6LMM‹ญ_@>๛เ]๕๙.๚ๅxฝป>฿Uฟ๏jฬไดไT๋ว<^B$''รฦฦฆะถ pฅ–ึ‹K•Jeฑ‚ัึึ–EŸr์ืิิ๔ฃทrชเxษฉึล=frฺrช5วว:^E=๐ย›่ต 4H}สฑ฿wAN๛@Nตพ+rฺrช๕]‘ำ>Sญ๏Ji Q”+ๅHV’’’ T*‘˜˜๘ฮgDล‡ใ%//๙แ˜ษ วซhxฎาืืว๘๑ใกฏฏ_าฅPpผไ…ใ%?3yแx ภษ ภษ ‘ฬ0ภษ ‘ฬ0ภ•B ,€ƒƒ Pปvm๓ฯ?%]าG้่ัฃhบ5lll P(ฐm6๙BŒ7ึึึ044Dใฦq๕๊U6Ož<ม—_~ SSS˜™™แซฏพยณgฯใV|&Ož ooo˜˜˜ภาาํฺตรๅห—5ฺคฅฅaะ A077‡ฑฑ1:v์ˆ๛๗๏kดนu๋Zถl‰2eสภาา#FŒ@VVึ๛”ยขE‹เ๊๊*=่ีววปw๏–ๆsฌ>lSฆLBกภฐaรคiณืวWสlุฐร‡ว๘๑ใq๖์Yธนน! <(้า>:)))pssร‚ ๒œ?mฺ4๚๋ฏ ร้ำงadd„€€คฅฅImพ๒K\ธp๛๗๏วŽ;p๔่Q|๕ื๏k>GŽม Aƒp๊ิ)์฿ฟ™™™hฺด)RRRค6!!!๘๋ฏฟฐiำ&9r๑๑๑่ะกƒ4?;;-[ถDFFNž<‰+V`๙๒ๅ7n\IlRฉfkk‹)Sฆ 22hุฐ!ฺถm‹ .เX}ศฮœ9ƒล‹รีีUc:ว์ *U>๛์31hะ ้}vvถฐฑฑ“'O.มช€ุบuซ๔^ญV +++1}๚tiZBB‚ะืื๋ึญB+ˆ3gฮHmv๏- …ธ{๗๎{ซc๔เม@9rD๑bltuuลฆM›ค6/^ฤ฿-„bืฎ]BKKK๗฿R›E‹ SSS‘žž~7เ#TถlYฑt้RŽี,99YTญZU์฿ฟ_๘๛๛‹กC‡ !๘๕ฆxฎษศศ@dd$7n,MำาาBใฦ๑๗฿—`e๔ช7nเฟำ+ฅR‰ฺตkKc๕๗฿รฬฬ ^^^R›ฦCKK งOŸ~๏5Lๅส•DFF"33ScผjิจJ•*iŒ—‹‹ *Tจ ต @RR’tdˆŠ_vv6ึฏ_””๘๘๘pฌ>`ƒ Bห–-5ฦเ๗ื›โณ/E=z„์์l8TจP—.]*กช(/๗ไ9V9๓๛๏?XZZjฬืััAนrๅค6Tิj5† ___8;;x1zzz033ำh๛๊xๅ5ž9๓จxลฤฤภววiii066ฦึญ[แไไ•Jลฑ๚ญ_ฟgฯžล™3grอใ๗ื›a€#"zษ Aƒpy?~ผคKกTฏ^*• ‰‰‰ุผy3z๖์‰#GŽ”tY”‡ทoc่ะกุฟ? JบœRƒงPK‘๒ๅหC[[;ื;๗๏฿‡••U UEyษ‚ฦสสส*ือ'YYYx๒ไ ว๓>>HHH@ddคิๆะกCPซีจ]ป๖{ฏน4B`๐เมุบu+:GGG๙žžžะีีีฏห—/ใึญ[ใฃบ๗๏฿SSS899ฝŸ ๙ˆฉีjคงงsฌ>@5BLL T*•๔๒๒๒ย—_~)}อ1{%}ฏ๕๋ื }}}ฑ|๙r+พ๚kaffฆq็ฝษษษโนsโนs€˜5k–8w๎œธy๓ฆBˆ)Sฆ333๑็ŸŠ่่hัถm[แ่่(ž?.๕ัฌY3แแแ!NŸ>-Ž?.ชVญ*บvํZR›Tj 0@(•J.๎ป'ฝRSSฅ6มมมขRฅJโะกC"""B๘๘๘i~VV–pvvM›6*•J์ูณGXXXˆQฃF•ฤ&•j#GŽGŽ7nัััbไศ‘BกPˆ}๛๖ !8Vr๐๒]จBpฬ\)4o๛์3q๊ิฉ’.้ฃt๘๐a ืซgฯžBˆ๙๑วE… „พพพhิจ‘ธ|๙ฒF?]ปvฦฦฦยิิT๔๎[$''—ภึ”nyฑlู2ฉอ๓็ฯลภEูฒeE™2eD๛๖ํลฝ{๗4๚‰‹‹อ›7†††ข|๙๒โoฟ™™™๏ykJฟ>}๚{{{กงง',,,DฃFค๐&วJ^ pณืงBˆ’9๖GDDDDo‚ืภษ ‘ฬ0ภษ ‘ฬ0ภษ ‘ฬ0ภษ ‘ฬ0ภฝฅ””899แูณg%]ІZตjแ๏ฟ~ญep๘๑wTั๋นrๅ >๓’.ƒ่ƒฤGDฒ็เเ###คคคHำRSSabbveส”ฑฑ1ฬออัฅK<}๚Tฃ/•J๕ฺก!,, mถ…ฑฑ๑[mGqปpแ‚๔วภ฿ต๐๐pTฉREcZฏ^ฝ0qโฤ7๎ณZตjฐฒฒย_๕ถๅ•: pDT*TฌXถm“๙็Ÿฐถถฮีn฿พ}x๖์nบ…ŒŒ ๓ฯ๓๗์ูƒfอšฝึบ๗ฟกkืฎoT๗๋ศสสz็๋๘Pไlkืฎ]ฑt้าฎ†่รรGDฅBืฎ]ฑfอ้๊ีซ๑ๅ—_ๆศศmฺดมล‹5ฆ็ธ็ฯŸฃkืฎ(Wฎส•+‡z๕๊ๅูฯญ[ทišƒƒฆOŸŽš5kยฤฤใฦรๅห—แๅๅฅR‰เเ`ฉญZญฦ๘๑ใaggkkk 2้้้€ๅห—ฃAƒ่฿ฟ?”J%–-[†'Ož [ทnฐดดฤ'Ÿ|‚+Vไป/ŸฑcชWฏ.•\ฟ~}พห4Ž<พ๊๖ํ_็ RฑbEฌXฑBZwBB‚t็๏หuๆU{ฮ๒น–๏ึญ[พห๗฿ศสสBๅส• Fข •*[ถl)า)ลฬฬLฌ]ป–––077วฅK—`jj*…•ร‡ใย… Pซี055…ŽŽNžงdํํํaee…˜˜˜7ช๗‹/พภฬ™3q๗๎]๙ไXZZbุฐaxyก๋Yฑb์ํํQถlY์฿ฟ๓็ฯฯทm—.]Pฏ^=8;;ฃI“&่ป7€w๚~๕ีWhูฒ%LMMแ๏๏/…วš5kขmถฐณณƒ™™€๏๔้ำ033รภกT*ฑs็Nฬ›7–––pppภ’%K ฌ{บu่ืฏ_กG๔ฑQ!DIADTาš5k†‘#Gข~๚ฏฝlJJ ผฝฝ๑ฯ?|p๓•ณซWฏ"((wžงh‰>f pDDฆM›†่๊๊–t)DD…b€#"""’^GDDD$3 pDDDD2รGDDD$3 pDDDD2รGDDD$3 pDDDD2รGDDD$3 pDDDD2รGDDD$3ฏญQน๋T?IENDฎB`‚c4core-0.2.6/src/000077500000000000000000000000001477602032300134715ustar00rootroot00000000000000c4core-0.2.6/src/c4/000077500000000000000000000000001477602032300137775ustar00rootroot00000000000000c4core-0.2.6/src/c4/allocator.hpp000066400000000000000000000331411477602032300164720ustar00rootroot00000000000000#ifndef _C4_ALLOCATOR_HPP_ #define _C4_ALLOCATOR_HPP_ #include "c4/memory_resource.hpp" #include "c4/ctor_dtor.hpp" #include // std::allocator_traits #include /** @file allocator.hpp Contains classes to make typeful allocations (note * that memory resources are typeless) */ /** @defgroup mem_res_providers Memory resource providers * @brief Policy classes which provide a memory resource for * use in an allocator. * @ingroup memory */ /** @defgroup allocators Allocators * @brief Lightweight classes that act as handles to specific memory * resources and provide typeful memory. * @ingroup memory */ namespace c4 { C4_SUPPRESS_WARNING_GCC_CLANG_WITH_PUSH("-Wold-style-cast") namespace detail { template inline size_t size_for (size_t num_objs) noexcept { return num_objs * sizeof(T); } template< > inline size_t size_for(size_t num_objs) noexcept { return num_objs; } } // namespace detail //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /** provides a per-allocator memory resource * @ingroup mem_res_providers */ class MemRes { public: MemRes() : m_resource(get_memory_resource()) {} MemRes(MemoryResource* r) noexcept : m_resource(r ? r : get_memory_resource()) {} MemoryResource* resource() const { return m_resource; } private: MemoryResource* m_resource; }; /** the allocators using this will default to the global memory resource * @ingroup mem_res_providers */ class MemResGlobal { public: MemResGlobal() = default; MemResGlobal(MemoryResource* r) noexcept { C4_UNUSED(r); C4_ASSERT(r == get_memory_resource()); } static MemoryResource* resource() { return get_memory_resource(); } }; //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- namespace detail { template struct _AllocatorUtil; template struct has_no_alloc : public std::integral_constant::value) && std::is_constructible::value> {}; // std::uses_allocator_v && std::is_constructible // ie can construct(std::allocator_arg_t, MemoryResource*, Args...) template struct has_alloc_arg : public std::integral_constant::value && std::is_constructible::value> {}; // std::uses_allocator && std::is_constructible // ie, can construct(Args..., MemoryResource*) template struct has_alloc : public std::integral_constant::value && std::is_constructible::value> {}; } // namespace detail template struct detail::_AllocatorUtil : public MemRes { using MemRes::MemRes; /** for construct: * @see http://en.cppreference.com/w/cpp/experimental/polymorphic_allocator/construct */ // 1. types with no allocators template C4_ALWAYS_INLINE typename std::enable_if::value, void>::type construct(U *ptr, Args &&...args) { c4::construct(ptr, std::forward(args)...); } template C4_ALWAYS_INLINE typename std::enable_if::value, void>::type construct_n(U* ptr, I n, Args&&... args) { c4::construct_n(ptr, n, std::forward(args)...); } // 2. types using allocators (ie, containers) // 2.1. can construct(std::allocator_arg_t, MemoryResource*, Args...) template C4_ALWAYS_INLINE typename std::enable_if::value, void>::type construct(U* ptr, Args&&... args) { c4::construct(ptr, std::allocator_arg, this->resource(), std::forward(args)...); } template C4_ALWAYS_INLINE typename std::enable_if::value, void>::type construct_n(U* ptr, I n, Args&&... args) { c4::construct_n(ptr, n, std::allocator_arg, this->resource(), std::forward(args)...); } // 2.2. can construct(Args..., MemoryResource*) template C4_ALWAYS_INLINE typename std::enable_if::value, void>::type construct(U* ptr, Args&&... args) { c4::construct(ptr, std::forward(args)..., this->resource()); } template C4_ALWAYS_INLINE typename std::enable_if::value, void>::type construct_n(U* ptr, I n, Args&&... args) { c4::construct_n(ptr, n, std::forward(args)..., this->resource()); } template static C4_ALWAYS_INLINE void destroy(U* ptr) { c4::destroy(ptr); } template static C4_ALWAYS_INLINE void destroy_n(U* ptr, I n) { c4::destroy_n(ptr, n); } }; //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /** An allocator is simply a proxy to a memory resource. * @param T * @param MemResProvider * @ingroup allocators */ template class Allocator : public detail::_AllocatorUtil // NOLINT(*-member-functions) { public: using impl_type = detail::_AllocatorUtil; using value_type = T; using pointer = T*; using const_pointer = T const*; using reference = T&; using const_reference = T const&; using size_type = size_t; using difference_type = std::ptrdiff_t; using propagate_on_container_move_assigment = std::true_type; public: template bool operator== (Allocator const& that) const { return this->resource() == that.resource(); } template bool operator!= (Allocator const& that) const { return this->resource() != that.resource(); } public: template friend class Allocator; template struct rebind { using other = Allocator; }; template typename rebind::other rebound() { return typename rebind::other(*this); } public: using impl_type::impl_type; Allocator() : impl_type() {} // VS demands this template Allocator(Allocator const& that) : impl_type(that.resource()) {} Allocator(Allocator const&) = default; Allocator(Allocator &&) = default; Allocator& operator= (Allocator const&) = default; // why? @see http://en.cppreference.com/w/cpp/memory/polymorphic_allocator Allocator& operator= (Allocator &&) = default; /** returns a default-constructed polymorphic allocator object * @see http://en.cppreference.com/w/cpp/memory/polymorphic_allocator/select_on_container_copy_construction */ Allocator select_on_container_copy_construct() const { return Allocator(*this); } T* allocate(size_t num_objs, size_t alignment=alignof(T)) { C4_ASSERT(this->resource() != nullptr); C4_ASSERT(alignment >= alignof(T)); void* vmem = this->resource()->allocate(detail::size_for(num_objs), alignment); T* mem = static_cast(vmem); return mem; } void deallocate(T * ptr, size_t num_objs, size_t alignment=alignof(T)) { C4_ASSERT(this->resource() != nullptr); C4_ASSERT(alignment>= alignof(T)); this->resource()->deallocate(ptr, detail::size_for(num_objs), alignment); } T* reallocate(T* ptr, size_t oldnum, size_t newnum, size_t alignment=alignof(T)) { C4_ASSERT(this->resource() != nullptr); C4_ASSERT(alignment >= alignof(T)); void* vmem = this->resource()->reallocate(ptr, detail::size_for(oldnum), detail::size_for(newnum), alignment); T* mem = static_cast(vmem); return mem; } }; //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /** @ingroup allocators */ template class SmallAllocator : public detail::_AllocatorUtil // NOLINT(*-member-functions) { static_assert(Alignment >= alignof(T), "invalid alignment"); using impl_type = detail::_AllocatorUtil; alignas(Alignment) char m_arr[N * sizeof(T)]; size_t m_num{0}; public: using value_type = T; using pointer = T*; using const_pointer = T const*; using reference = T&; using const_reference = T const&; using size_type = size_t; using difference_type = std::ptrdiff_t; using propagate_on_container_move_assigment = std::true_type; template bool operator== (SmallAllocator const&) const { return false; } template bool operator!= (SmallAllocator const&) const { return true; } public: template friend class SmallAllocator; template struct rebind { using other = SmallAllocator; }; template typename rebind::other rebound() { return typename rebind::other(*this); } public: using impl_type::impl_type; SmallAllocator() : impl_type() {} // VS demands this template SmallAllocator(SmallAllocator const& that) : impl_type(that.resource()) { C4_ASSERT(that.m_num == 0); } SmallAllocator(SmallAllocator const&) = default; SmallAllocator(SmallAllocator &&) = default; SmallAllocator& operator= (SmallAllocator const&) = default; // WTF? why? @see http://en.cppreference.com/w/cpp/memory/polymorphic_allocator SmallAllocator& operator= (SmallAllocator &&) = default; /** returns a default-constructed polymorphic allocator object * @see http://en.cppreference.com/w/cpp/memory/polymorphic_allocator/select_on_container_copy_construction */ SmallAllocator select_on_container_copy_construct() const { return SmallAllocator(*this); } T* allocate(size_t num_objs, size_t alignment=Alignment) { C4_ASSERT(this->resource() != nullptr); C4_ASSERT(alignment >= alignof(T)); void *vmem; if(m_num + num_objs <= N) { vmem = (m_arr + m_num * sizeof(T)); } else { vmem = this->resource()->allocate(num_objs * sizeof(T), alignment); } m_num += num_objs; T *mem = static_cast(vmem); return mem; } void deallocate(T * ptr, size_t num_objs, size_t alignment=Alignment) { C4_ASSERT(m_num >= num_objs); m_num -= num_objs; if((char*)ptr >= m_arr && (char*)ptr < m_arr + (N * sizeof(T))) { return; } C4_ASSERT(this->resource() != nullptr); C4_ASSERT(alignment >= alignof(T)); this->resource()->deallocate(ptr, num_objs * sizeof(T), alignment); } T* reallocate(T * ptr, size_t oldnum, size_t newnum, size_t alignment=Alignment) { C4_ASSERT(this->resource() != nullptr); C4_ASSERT(alignment >= alignof(T)); if(oldnum <= N && newnum <= N) { return m_arr; } else if(oldnum <= N && newnum > N) { return allocate(newnum, alignment); } else if(oldnum > N && newnum <= N) { deallocate(ptr, oldnum, alignment); return m_arr; } void* vmem = this->resource()->reallocate(ptr, oldnum * sizeof(T), newnum * sizeof(T), alignment); T* mem = static_cast(vmem); return mem; } }; //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /** An allocator making use of the global memory resource. * @ingroup allocators */ template using allocator = Allocator; /** An allocator with a per-instance memory resource * @ingroup allocators */ template using allocator_mr = Allocator; /** @ingroup allocators */ template using small_allocator = SmallAllocator; /** @ingroup allocators */ template using small_allocator_mr = SmallAllocator; C4_SUPPRESS_WARNING_GCC_CLANG_POP } // namespace c4 #endif /* _C4_ALLOCATOR_HPP_ */ c4core-0.2.6/src/c4/base64.cpp000066400000000000000000000211551477602032300155730ustar00rootroot00000000000000#include "c4/base64.hpp" #ifdef __clang__ # pragma clang diagnostic push # pragma clang diagnostic ignored "-Wchar-subscripts" // array subscript is of type 'char' # pragma clang diagnostic ignored "-Wold-style-cast" #elif defined(__GNUC__) # pragma GCC diagnostic push # pragma GCC diagnostic ignored "-Wuseless-cast" # pragma GCC diagnostic ignored "-Wchar-subscripts" # pragma GCC diagnostic ignored "-Wtype-limits" # pragma GCC diagnostic ignored "-Wold-style-cast" #endif // NOLINTBEGIN(bugprone-signed-char-misuse,cert-str34-c,hicpp-signed-bitwise) namespace c4 { namespace detail { constexpr static const char base64_sextet_to_char_[64] = { /* 0/ 65*/ 'A', /* 1/ 66*/ 'B', /* 2/ 67*/ 'C', /* 3/ 68*/ 'D', /* 4/ 69*/ 'E', /* 5/ 70*/ 'F', /* 6/ 71*/ 'G', /* 7/ 72*/ 'H', /* 8/ 73*/ 'I', /* 9/ 74*/ 'J', /*10/ 75*/ 'K', /*11/ 74*/ 'L', /*12/ 77*/ 'M', /*13/ 78*/ 'N', /*14/ 79*/ 'O', /*15/ 78*/ 'P', /*16/ 81*/ 'Q', /*17/ 82*/ 'R', /*18/ 83*/ 'S', /*19/ 82*/ 'T', /*20/ 85*/ 'U', /*21/ 86*/ 'V', /*22/ 87*/ 'W', /*23/ 88*/ 'X', /*24/ 89*/ 'Y', /*25/ 90*/ 'Z', /*26/ 97*/ 'a', /*27/ 98*/ 'b', /*28/ 99*/ 'c', /*29/100*/ 'd', /*30/101*/ 'e', /*31/102*/ 'f', /*32/103*/ 'g', /*33/104*/ 'h', /*34/105*/ 'i', /*35/106*/ 'j', /*36/107*/ 'k', /*37/108*/ 'l', /*38/109*/ 'm', /*39/110*/ 'n', /*40/111*/ 'o', /*41/112*/ 'p', /*42/113*/ 'q', /*43/114*/ 'r', /*44/115*/ 's', /*45/116*/ 't', /*46/117*/ 'u', /*47/118*/ 'v', /*48/119*/ 'w', /*49/120*/ 'x', /*50/121*/ 'y', /*51/122*/ 'z', /*52/ 48*/ '0', /*53/ 49*/ '1', /*54/ 50*/ '2', /*55/ 51*/ '3', /*56/ 52*/ '4', /*57/ 53*/ '5', /*58/ 54*/ '6', /*59/ 55*/ '7', /*60/ 56*/ '8', /*61/ 57*/ '9', /*62/ 43*/ '+', /*63/ 47*/ '/', }; // https://www.cs.cmu.edu/~pattis/15-1XX/common/handouts/ascii.html constexpr static const char base64_char_to_sextet_[128] = { #define __ char(-1) // undefined below /* 0 NUL*/ __, /* 1 SOH*/ __, /* 2 STX*/ __, /* 3 ETX*/ __, /* 4 EOT*/ __, /* 5 ENQ*/ __, /* 6 ACK*/ __, /* 7 BEL*/ __, /* 8 BS */ __, /* 9 TAB*/ __, /* 10 LF */ __, /* 11 VT */ __, /* 12 FF */ __, /* 13 CR */ __, /* 14 SO */ __, /* 15 SI */ __, /* 16 DLE*/ __, /* 17 DC1*/ __, /* 18 DC2*/ __, /* 19 DC3*/ __, /* 20 DC4*/ __, /* 21 NAK*/ __, /* 22 SYN*/ __, /* 23 ETB*/ __, /* 24 CAN*/ __, /* 25 EM */ __, /* 26 SUB*/ __, /* 27 ESC*/ __, /* 28 FS */ __, /* 29 GS */ __, /* 30 RS */ __, /* 31 US */ __, /* 32 SPC*/ __, /* 33 ! */ __, /* 34 " */ __, /* 35 # */ __, /* 36 $ */ __, /* 37 % */ __, /* 38 & */ __, /* 39 ' */ __, /* 40 ( */ __, /* 41 ) */ __, /* 42 * */ __, /* 43 + */ 62, /* 44 , */ __, /* 45 - */ __, /* 46 . */ __, /* 47 / */ 63, /* 48 0 */ 52, /* 49 1 */ 53, /* 50 2 */ 54, /* 51 3 */ 55, /* 52 4 */ 56, /* 53 5 */ 57, /* 54 6 */ 58, /* 55 7 */ 59, /* 56 8 */ 60, /* 57 9 */ 61, /* 58 : */ __, /* 59 ; */ __, /* 60 < */ __, /* 61 = */ __, /* 62 > */ __, /* 63 ? */ __, /* 64 @ */ __, /* 65 A */ 0, /* 66 B */ 1, /* 67 C */ 2, /* 68 D */ 3, /* 69 E */ 4, /* 70 F */ 5, /* 71 G */ 6, /* 72 H */ 7, /* 73 I */ 8, /* 74 J */ 9, /* 75 K */ 10, /* 76 L */ 11, /* 77 M */ 12, /* 78 N */ 13, /* 79 O */ 14, /* 80 P */ 15, /* 81 Q */ 16, /* 82 R */ 17, /* 83 S */ 18, /* 84 T */ 19, /* 85 U */ 20, /* 86 V */ 21, /* 87 W */ 22, /* 88 X */ 23, /* 89 Y */ 24, /* 90 Z */ 25, /* 91 [ */ __, /* 92 \ */ __, /* 93 ] */ __, /* 94 ^ */ __, /* 95 _ */ __, /* 96 ` */ __, /* 97 a */ 26, /* 98 b */ 27, /* 99 c */ 28, /*100 d */ 29, /*101 e */ 30, /*102 f */ 31, /*103 g */ 32, /*104 h */ 33, /*105 i */ 34, /*106 j */ 35, /*107 k */ 36, /*108 l */ 37, /*109 m */ 38, /*110 n */ 39, /*111 o */ 40, /*112 p */ 41, /*113 q */ 42, /*114 r */ 43, /*115 s */ 44, /*116 t */ 45, /*117 u */ 46, /*118 v */ 47, /*119 w */ 48, /*120 x */ 49, /*121 y */ 50, /*122 z */ 51, /*123 { */ __, /*124 | */ __, /*125 } */ __, /*126 ~ */ __, /*127 DEL*/ __, #undef __ }; #ifndef NDEBUG void base64_test_tables() { for(size_t i = 0; i < C4_COUNTOF(detail::base64_sextet_to_char_); ++i) { char s2c = base64_sextet_to_char_[i]; char c2s = base64_char_to_sextet_[(unsigned)s2c]; C4_CHECK((size_t)c2s == i); } for(size_t i = 0; i < C4_COUNTOF(detail::base64_char_to_sextet_); ++i) { char c2s = base64_char_to_sextet_[i]; if(c2s == char(-1)) continue; char s2c = base64_sextet_to_char_[(unsigned)c2s]; C4_CHECK((size_t)s2c == i); } } #endif } // namespace detail bool base64_valid(csubstr encoded) { if((encoded.len & size_t(3u)) != size_t(0)) // (encoded.len % 4u) return false; for(const char c : encoded) { if(c < 0/* || c >= 128*/) return false; if(c == '=') continue; if(detail::base64_char_to_sextet_[c] == char(-1)) return false; } return true; } size_t base64_encode(substr buf, cblob data) { #define c4append_(c) { if(pos < buf.len) { buf.str[pos] = (c); } ++pos; } #define c4append_idx_(char_idx) \ {\ C4_XASSERT((char_idx) < sizeof(detail::base64_sextet_to_char_));\ c4append_(detail::base64_sextet_to_char_[(char_idx)]);\ } size_t rem, pos = 0; constexpr const uint32_t sextet_mask = uint32_t(1 << 6) - 1; const unsigned char *C4_RESTRICT d = (const unsigned char *) data.buf; // cast to unsigned to avoid wrapping high-bits for(rem = data.len; rem >= 3; rem -= 3, d += 3) { const uint32_t val = ((uint32_t(d[0]) << 16) | (uint32_t(d[1]) << 8) | (uint32_t(d[2]))); c4append_idx_((val >> 18) & sextet_mask); c4append_idx_((val >> 12) & sextet_mask); c4append_idx_((val >> 6) & sextet_mask); c4append_idx_((val ) & sextet_mask); } C4_ASSERT(rem < 3); if(rem == 2) { const uint32_t val = ((uint32_t(d[0]) << 16) | (uint32_t(d[1]) << 8)); c4append_idx_((val >> 18) & sextet_mask); c4append_idx_((val >> 12) & sextet_mask); c4append_idx_((val >> 6) & sextet_mask); c4append_('='); } else if(rem == 1) { const uint32_t val = ((uint32_t(d[0]) << 16)); c4append_idx_((val >> 18) & sextet_mask); c4append_idx_((val >> 12) & sextet_mask); c4append_('='); c4append_('='); } return pos; #undef c4append_ #undef c4append_idx_ } size_t base64_decode(csubstr encoded, blob data) { #define c4append_(c) { if(wpos < data.len) { data.buf[wpos] = static_cast(c); } ++wpos; } #define c4appendval_(c, shift)\ {\ C4_XASSERT((c) >= 0);\ C4_XASSERT(size_t(c) < sizeof(detail::base64_char_to_sextet_));\ val |= static_cast(detail::base64_char_to_sextet_[(c)]) << ((shift) * 6);\ } C4_ASSERT(base64_valid(encoded)); C4_CHECK((encoded.len & 3u) == 0); size_t wpos = 0; // the write position const char *C4_RESTRICT d = encoded.str; constexpr const uint32_t full_byte = 0xff; // process every quartet of input 6 bits --> triplet of output bytes for(size_t rpos = 0; rpos < encoded.len; rpos += 4, d += 4) { if(d[2] == '=' || d[3] == '=') // skip the last quartet if it is padded { C4_ASSERT(d + 4 == encoded.str + encoded.len); break; } uint32_t val = 0; c4appendval_(d[3], 0); c4appendval_(d[2], 1); c4appendval_(d[1], 2); c4appendval_(d[0], 3); c4append_((val >> (2 * 8)) & full_byte); c4append_((val >> (1 * 8)) & full_byte); c4append_((val ) & full_byte); } // deal with the last quartet when it is padded if(d == encoded.str + encoded.len) return wpos; if(d[2] == '=') // 2 padding chars { C4_ASSERT(d + 4 == encoded.str + encoded.len); C4_ASSERT(d[3] == '='); uint32_t val = 0; c4appendval_(d[1], 2); c4appendval_(d[0], 3); c4append_((val >> (2 * 8)) & full_byte); } else if(d[3] == '=') // 1 padding char { C4_ASSERT(d + 4 == encoded.str + encoded.len); uint32_t val = 0; c4appendval_(d[2], 1); c4appendval_(d[1], 2); c4appendval_(d[0], 3); c4append_((val >> (2 * 8)) & full_byte); c4append_((val >> (1 * 8)) & full_byte); } return wpos; #undef c4append_ #undef c4appendval_ } } // namespace c4 // NOLINTEND(bugprone-signed-char-misuse,cert-str34-c,hicpp-signed-bitwise) #ifdef __clang__ # pragma clang diagnostic pop #elif defined(__GNUC__) # pragma GCC diagnostic pop #endif c4core-0.2.6/src/c4/base64.hpp000066400000000000000000000101461477602032300155760ustar00rootroot00000000000000#ifndef _C4_BASE64_HPP_ #define _C4_BASE64_HPP_ /** @file base64.hpp encoding/decoding for base64. * @see https://en.wikipedia.org/wiki/Base64 * @see https://www.base64encode.org/ * */ #include "c4/charconv.hpp" #include "c4/blob.hpp" namespace c4 { /** @defgroup doc_base64 Base64 encoding/decoding * @see https://en.wikipedia.org/wiki/Base64 * @see https://www.base64encode.org/ * @{ */ /** check that the given buffer is a valid base64 encoding * @see https://en.wikipedia.org/wiki/Base64 */ C4CORE_EXPORT bool base64_valid(csubstr encoded); /** base64-encode binary data. * @param encoded [out] output buffer for encoded data * @param data [in] the input buffer with the binary data * * @return the number of bytes needed to return the output (ie the * required size for @p encoded). No writes occur beyond the end of * the output buffer, so it is safe to do a speculative call where the * encoded buffer is empty, or maybe too small. The caller should * ensure that the returned size is smaller than the size of the * encoded buffer. * * @note the result depends on endianness. If transfer between * little/big endian systems is desired, the caller should normalize * @p data before encoding. * * @see https://en.wikipedia.org/wiki/Base64 */ C4CORE_EXPORT size_t base64_encode(substr encoded, cblob data); /** decode the base64 encoding in the given buffer * @param encoded [in] the encoded base64 * @param data [out] the output buffer * * @return the number of bytes needed to return the output (ie the * required size for @p data). No writes occur beyond the end of the * output buffer, so it is safe to do a speculative call where the * data buffer is empty, or maybe too small. The caller should ensure * that the returned size is smaller than the size of the data buffer. * * @note the result depends on endianness. If transfer between * little/big endian systems is desired, the caller should normalize * @p data after decoding. * * @see https://en.wikipedia.org/wiki/Base64 */ C4CORE_EXPORT size_t base64_decode(csubstr encoded, blob data); /** @} */ // base64 namespace fmt { /** @addtogroup doc_format_specifiers * @{ */ /** @defgroup doc_base64_fmt Base64 * @{ */ template struct base64_wrapper_ { blob_ data; base64_wrapper_() : data() {} base64_wrapper_(blob_ blob) : data(blob) {} }; /** a tag type to mark a payload as base64-encoded */ using const_base64_wrapper = base64_wrapper_; /** a tag type to mark a payload to be encoded as base64 */ using base64_wrapper = base64_wrapper_; /** mark a variable to be written in base64 format */ template C4_ALWAYS_INLINE const_base64_wrapper cbase64(Args const& C4_RESTRICT ...args) { return const_base64_wrapper(cblob(args...)); } /** mark a csubstr to be written in base64 format */ C4_ALWAYS_INLINE const_base64_wrapper cbase64(csubstr s) { return const_base64_wrapper(cblob(s.str, s.len)); } /** mark a variable to be written in base64 format */ template C4_ALWAYS_INLINE const_base64_wrapper base64(Args const& C4_RESTRICT ...args) { return const_base64_wrapper(cblob(args...)); } /** mark a csubstr to be written in base64 format */ C4_ALWAYS_INLINE const_base64_wrapper base64(csubstr s) { return const_base64_wrapper(cblob(s.str, s.len)); } /** mark a variable to be read in base64 format */ template C4_ALWAYS_INLINE base64_wrapper base64(Args &... args) { return base64_wrapper(blob(args...)); } /** mark a variable to be read in base64 format */ C4_ALWAYS_INLINE base64_wrapper base64(substr s) { return base64_wrapper(blob(s.str, s.len)); } /** @} */ // base64_fmt /** @} */ // format_specifiers } // namespace fmt /** write a variable in base64 format * @ingroup doc_to_chars */ inline size_t to_chars(substr buf, fmt::const_base64_wrapper b) { return base64_encode(buf, b.data); } /** read a variable in base64 format * @ingroup doc_from_chars */ inline size_t from_chars(csubstr buf, fmt::base64_wrapper *b) { return base64_decode(buf, b->data); } } // namespace c4 #endif /* _C4_BASE64_HPP_ */ c4core-0.2.6/src/c4/bitmask.hpp000066400000000000000000000237041477602032300161500ustar00rootroot00000000000000#ifndef _C4_BITMASK_HPP_ #define _C4_BITMASK_HPP_ /** @file bitmask.hpp bitmask utilities */ #include #include #include "c4/enum.hpp" #include "c4/format.hpp" #if defined(_MSC_VER) # pragma warning(push) # pragma warning(disable : 4996) // 'strncpy', fopen, etc: This function or variable may be unsafe #endif #if defined(__clang__) # pragma clang diagnostic push # pragma clang diagnostic ignored "-Wold-style-cast" #elif defined(__GNUC__) # pragma GCC diagnostic push # pragma GCC diagnostic ignored "-Wold-style-cast" # if __GNUC__ >= 8 # pragma GCC diagnostic ignored "-Wstringop-truncation" # pragma GCC diagnostic ignored "-Wstringop-overflow" # endif #endif namespace c4 { //----------------------------------------------------------------------------- /** write a bitmask to a stream, formatted as a string */ template Stream& bm2stream(Stream &s, typename std::underlying_type::type bits, EnumOffsetType offst=EOFFS_PFX) { using I = typename std::underlying_type::type; bool written = false; auto const& pairs = esyms(); // write non null value if(bits) { // do reverse iteration to give preference to composite enum symbols, // which are likely to appear at the end of the enum sequence for(size_t i = pairs.size() - 1; i != size_t(-1); --i) { auto p = pairs[i]; I b(static_cast(p.value)); if(b && (bits & b) == b) { if(written) s << '|'; // append bit-or character written = true; s << p.name_offs(offst); // append bit string bits &= ~b; } } return s; } else { // write a null value for(size_t i = pairs.size() - 1; i != size_t(-1); --i) { auto p = pairs[i]; I b(static_cast(p.value)); if(b == 0) { s << p.name_offs(offst); written = true; break; } } } if(!written) { s << '0'; } return s; } template typename std::enable_if::value, Stream&>::type bm2stream(Stream &s, Enum value, EnumOffsetType offst=EOFFS_PFX) { using I = typename std::underlying_type::type; return bm2stream(s, static_cast(value), offst); } //----------------------------------------------------------------------------- // some utility macros, undefed below /// @cond dev /* Execute `code` if the `num` of characters is available in the str * buffer. This macro simplifies the code for bm2str(). * @todo improve performance by writing from the end and moving only once. */ #define _c4prependchars(code, num) \ if(str && (pos + (num) <= sz)) \ { \ /* move the current string to the right */ \ memmove(str + (num), str, pos); \ /* now write in the beginning of the string */ \ code; \ } \ else if(str && sz) \ { \ C4_ERROR("cannot write to string pos=%d num=%d sz=%d", \ (int)pos, (int)(num), (int)sz); \ } \ pos += num /* Execute `code` if the `num` of characters is available in the str * buffer. This macro simplifies the code for bm2str(). */ #define _c4appendchars(code, num) \ if(str && (pos + (num) <= sz)) \ { \ code; \ } \ else if(str && sz) \ { \ C4_ERROR("cannot write to string pos=%d num=%d sz=%d", \ (int)pos, (int)(num), (int)sz); \ } \ pos += num /// @endcond /** convert a bitmask to string. * return the number of characters written. To find the needed size, * call first with str=nullptr and sz=0 */ template size_t bm2str ( typename std::underlying_type::type bits, char *str=nullptr, size_t sz=0, EnumOffsetType offst=EOFFS_PFX ) { using I = typename std::underlying_type::type; C4_ASSERT((str == nullptr) == (sz == 0)); auto syms = esyms(); size_t pos = 0; typename EnumSymbols::Sym const* C4_RESTRICT zero = nullptr; // do reverse iteration to give preference to composite enum symbols, // which are likely to appear later in the enum sequence for(size_t i = syms.size()-1; i != size_t(-1); --i) { auto const &C4_RESTRICT p = syms[i]; // do not copy, we are assigning to `zero` I b = static_cast(p.value); if(b == 0) { zero = &p; // save this symbol for later } else if((bits & b) == b) { bits &= ~b; // append bit-or character if(pos > 0) { _c4prependchars(*str = '|', 1); } // append bit string const char *pname = p.name_offs(offst); size_t len = strlen(pname); _c4prependchars(strncpy(str, pname, len), len); } } C4_CHECK_MSG(bits == 0, "could not find all bits"); if(pos == 0) // make sure at least something is written { if(zero) // if we have a zero symbol, use that { const char *pname = zero->name_offs(offst); size_t len = strlen(pname); _c4prependchars(strncpy(str, pname, len), len); } else // otherwise just write an integer zero { _c4prependchars(*str = '0', 1); } } _c4appendchars(str[pos] = '\0', 1); return pos; } // cleanup! #undef _c4appendchars #undef _c4prependchars /** scoped enums do not convert automatically to their underlying type, * so this SFINAE overload will accept scoped enum symbols and cast them * to the underlying type */ template typename std::enable_if::value, size_t>::type bm2str ( Enum bits, char *str=nullptr, size_t sz=0, EnumOffsetType offst=EOFFS_PFX ) { using I = typename std::underlying_type::type; return bm2str(static_cast(bits), str, sz, offst); } //----------------------------------------------------------------------------- namespace detail { #ifdef __clang__ # pragma clang diagnostic push #elif defined(__GNUC__) # pragma GCC diagnostic push # if __GNUC__ >= 6 # pragma GCC diagnostic ignored "-Wnull-dereference" # endif #endif template typename std::underlying_type::type str2bm_read_one(const char *str, size_t sz, bool alnum) { using I = typename std::underlying_type::type; auto pairs = esyms(); if(alnum) { auto *p = pairs.find(str, sz); C4_CHECK_MSG(p != nullptr, "no valid enum pair name for '%.*s'", (int)sz, str); return static_cast(p->value); } I tmp{0}; size_t len = uncat(csubstr(str, sz), tmp); C4_CHECK_MSG(len != csubstr::npos, "could not read string as an integral type: '%.*s'", (int)sz, str); return tmp; } #ifdef __clang__ # pragma clang diagnostic pop #elif defined(__GNUC__) # pragma GCC diagnostic pop #endif } // namespace detail /** convert a string to a bitmask */ template typename std::underlying_type::type str2bm(const char *str, size_t sz) { using I = typename std::underlying_type::type; I val = 0; bool started = false; bool alnum = false, num = false; const char *f = nullptr, *pc = str; for( ; pc < str+sz; ++pc) { const char c = *pc; if((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_') { C4_CHECK(( ! num) || ((pc - f) == 1 && (c == 'x' || c == 'X'))); // accept hexadecimal numbers if( ! started) { f = pc; alnum = started = true; } } else if(c >= '0' && c <= '9') { C4_CHECK( ! alnum); if(!started) { f = pc; num = started = true; } } else if(c == ':' || c == ' ') { // skip this char } else if(c == '|' || c == '\0') { C4_ASSERT(num != alnum); C4_ASSERT(pc >= f); val |= detail::str2bm_read_one(f, static_cast(pc-f), alnum); started = num = alnum = false; if(c == '\0') { return val; } } else { C4_ERROR("bad character '%c' in bitmask string", c); } } if(f) { C4_ASSERT(num != alnum); C4_ASSERT(pc >= f); val |= detail::str2bm_read_one(f, static_cast(pc-f), alnum); } return val; } /** convert a string to a bitmask */ template typename std::underlying_type::type str2bm(const char *str) { return str2bm(str, strlen(str)); } } // namespace c4 #ifdef _MSC_VER # pragma warning(pop) #endif #if defined(__clang__) # pragma clang diagnostic pop #elif defined(__GNUC__) # pragma GCC diagnostic pop #endif #endif // _C4_BITMASK_HPP_ c4core-0.2.6/src/c4/blob.hpp000066400000000000000000000074621477602032300154370ustar00rootroot00000000000000#ifndef _C4_BLOB_HPP_ #define _C4_BLOB_HPP_ #include "c4/types.hpp" #include "c4/error.hpp" /** @file blob.hpp Mutable and immutable binary data blobs. */ namespace c4 { template struct blob_; namespace detail { template struct is_blob_type : std::integral_constant {}; template struct is_blob_type> : std::integral_constant {}; template struct is_blob_value_type : std::integral_constant::value || std::is_trivially_copyable::value)> {}; } // namespace // NOLINTBEGIN(cppcoreguidelines-special-member-functions,hicpp-special-member-functions) template struct blob_ { static_assert(std::is_same::value || std::is_same::value, "must be either byte or cbyte"); static_assert(sizeof(T) == 1u, "must be either byte or cbyte"); public: T * buf; size_t len; public: C4_ALWAYS_INLINE blob_() noexcept = default; C4_ALWAYS_INLINE blob_(blob_ const& that) noexcept = default; C4_ALWAYS_INLINE blob_(blob_ && that) noexcept = default; C4_ALWAYS_INLINE blob_& operator=(blob_ && that) noexcept = default; C4_ALWAYS_INLINE blob_& operator=(blob_ const& that) noexcept = default; template::value && std::is_same::type, T>::value, U>::type> C4_ALWAYS_INLINE blob_(blob_ const& that) noexcept : buf(that.buf), len(that.len) {} // NOLINT template::value && std::is_same::type, T>::value, U>::type> C4_ALWAYS_INLINE blob_(blob_ && that) noexcept : buf(that.buf), len(that.len) {} // NOLINT template::value && std::is_same::type, T>::value, U>::type> C4_ALWAYS_INLINE blob_& operator=(blob_ && that) noexcept { buf = that.buf; len = that.len; } // NOLINT template::value && std::is_same::type, T>::value, U>::type> C4_ALWAYS_INLINE blob_& operator=(blob_ const& that) noexcept { buf = that.buf; len = that.len; } // NOLINT C4_ALWAYS_INLINE blob_(void *ptr, size_t n) noexcept : buf(reinterpret_cast(ptr)), len(n) {} // NOLINT C4_ALWAYS_INLINE blob_(void const *ptr, size_t n) noexcept : buf(reinterpret_cast(ptr)), len(n) {} // NOLINT #define _C4_REQUIRE_BLOBTYPE(ty) class=typename std::enable_if<((!detail::is_blob_type::value) && (detail::is_blob_value_type::value)), T>::type template C4_ALWAYS_INLINE blob_(U &var) noexcept : buf(reinterpret_cast(&var)), len(sizeof(U)) {} // NOLINT template C4_ALWAYS_INLINE blob_(U *ptr, size_t n) noexcept : buf(reinterpret_cast(ptr)), len(sizeof(U) * n) { C4_ASSERT(is_aligned(ptr)); } // NOLINT template C4_ALWAYS_INLINE blob_& operator= (U &var) noexcept { buf = reinterpret_cast(&var); len = sizeof(U); return *this; } // NOLINT template C4_ALWAYS_INLINE blob_(U (&arr)[N]) noexcept : buf(reinterpret_cast(arr)), len(sizeof(U) * N) {} // NOLINT template C4_ALWAYS_INLINE blob_& operator= (U (&arr)[N]) noexcept { buf = reinterpret_cast(arr); len = sizeof(U) * N; return *this; } // NOLINT #undef _C4_REQUIRE_BLOBTYPE }; // NOLINTEND(cppcoreguidelines-special-member-functions,hicpp-special-member-functions) /** an immutable binary blob */ using cblob = blob_; /** a mutable binary blob */ using blob = blob_< byte>; C4_MUST_BE_TRIVIAL_COPY(blob); C4_MUST_BE_TRIVIAL_COPY(cblob); } // namespace c4 #endif // _C4_BLOB_HPP_ c4core-0.2.6/src/c4/c4_pop.hpp000066400000000000000000000005611477602032300156760ustar00rootroot00000000000000#ifdef _C4_PUSH_HPP_ // this must match the include guard from c4_push /** @file c4_pop.hpp disables the macros and control directives * enabled in c4_push.hpp. * @see c4_push.hpp */ #include "c4/unrestrict.hpp" #ifdef C4_WIN # include "c4/windows_pop.hpp" #endif #ifdef _MSC_VER # pragma warning(pop) #endif #undef _C4_PUSH_HPP_ #endif /* _C4_PUSH_HPP_ */ c4core-0.2.6/src/c4/c4_push.hpp000066400000000000000000000024751477602032300160650ustar00rootroot00000000000000#ifndef _C4_PUSH_HPP_ #define _C4_PUSH_HPP_ /** @file c4_push.hpp enables macros and warning control directives * needed by c4core. This is implemented in a push/pop way. * @see c4_pop.hpp */ #ifndef _C4_CONFIG_HPP_ #include "c4/config.hpp" #endif #include "c4/restrict.hpp" #ifdef C4_WIN # include "c4/windows_push.hpp" #endif #ifdef _MSC_VER # pragma warning(push) # pragma warning(disable : 4068) // unknown pragma # pragma warning(disable : 4100) // unreferenced formal parameter # pragma warning(disable : 4127) // conditional expression is constant -- eg do {} while(1); # pragma warning(disable : 4201) // nonstandard extension used : nameless struct/union //# pragma warning(disable : 4238) // nonstandard extension used: class rvalue used as lvalue # pragma warning(disable : 4244) # pragma warning(disable : 4503) // decorated name length exceeded, name was truncated # pragma warning(disable : 4702) // unreachable code # pragma warning(disable : 4714) // function marked as __forceinline not inlined # pragma warning(disable : 4996) // 'strncpy', fopen, etc: This function or variable may be unsafe # if C4_MSVC_VERSION != C4_MSVC_VERSION_2017 # pragma warning(disable : 4800) // forcing value to bool 'true' or 'false' (performance warning) # endif #endif #endif /* _C4_PUSH_HPP_ */ c4core-0.2.6/src/c4/c4core.natvis000066400000000000000000000132171477602032300164100ustar00rootroot00000000000000 {str,[len]} (sz={len}) str,[len] len len str {m_ptr,[m_size]} (sz={m_size}) m_size m_size m_ptr {m_ptr,[m_size]} (sz={m_size}, cap={m_capacity}) m_size m_capacity m_size m_ptr {m_ptr,[m_size]} (sz={m_size}) m_ptr,[m_size] m_size m_size m_ptr {m_ptr,[m_size]} (sz={m_size}) m_ptr,[m_size] m_size m_size m_ptr {m_ptr,[m_size]} (sz={m_size}, cap={m_capacity}) m_ptr,[m_size] m_size m_capacity m_size m_ptr {m_ptr,[m_size]} (sz={m_size}, cap={m_capacity}) m_ptr,[m_size] m_size m_capacity m_size m_ptr {(($T3*)this)->m_str,[(($T3*)this)->m_size]} (sz={(($T3*)this)->m_size}) (($T3*)this)->m_str,[(($T3*)this)->m_size] {(($T3*)this)->m_str,[(($T3*)this)->m_size]} (($T3*)this)->m_str,[(($T3*)this)->m_size] {(($T3*)this)->m_size} {m_str,[m_size]} (sz={m_size}) m_str,[m_size] {m_size} {m_str,[m_size]} (sz={m_size},cap={m_capacity}) m_str,[m_size] {m_size} {m_capacity} {m_str,[m_capacity]} m_str,[m_capacity] {m_str,[m_size]} (sz={m_size},cap={m_capacity}) m_str,[m_size] {m_size} {m_str,[m_capacity]} m_str,[m_capacity] {value} - {name} value name {m_symbols,[m_num]} (sz={m_num}) m_num m_num m_symbols c4core-0.2.6/src/c4/char_traits.cpp000066400000000000000000000005131477602032300170050ustar00rootroot00000000000000#include "c4/char_traits.hpp" namespace c4 { constexpr const char char_traits< char >::whitespace_chars[]; constexpr const size_t char_traits< char >::num_whitespace_chars; constexpr const wchar_t char_traits< wchar_t >::whitespace_chars[]; constexpr const size_t char_traits< wchar_t >::num_whitespace_chars; } // namespace c4 c4core-0.2.6/src/c4/char_traits.hpp000066400000000000000000000051741477602032300170220ustar00rootroot00000000000000#ifndef _C4_CHAR_TRAITS_HPP_ #define _C4_CHAR_TRAITS_HPP_ #include "c4/config.hpp" #include // needed because of std::char_traits #include #include namespace c4 { C4_ALWAYS_INLINE bool isspace(char c) { return std::isspace(c) != 0; } C4_ALWAYS_INLINE bool isspace(wchar_t c) { return std::iswspace(static_cast(c)) != 0; } //----------------------------------------------------------------------------- template struct char_traits; template<> struct char_traits : public std::char_traits { constexpr static const char whitespace_chars[] = " \f\n\r\t\v"; constexpr static const size_t num_whitespace_chars = sizeof(whitespace_chars) - 1; }; template<> struct char_traits : public std::char_traits { constexpr static const wchar_t whitespace_chars[] = L" \f\n\r\t\v"; constexpr static const size_t num_whitespace_chars = sizeof(whitespace_chars) - 1; }; //----------------------------------------------------------------------------- namespace detail { template struct needed_chars; template<> struct needed_chars { template C4_ALWAYS_INLINE constexpr static SizeType for_bytes(SizeType num_bytes) { return num_bytes; } }; template<> struct needed_chars { template C4_ALWAYS_INLINE constexpr static SizeType for_bytes(SizeType num_bytes) { // wchar_t is not necessarily 2 bytes. return (num_bytes / static_cast(sizeof(wchar_t))) + ((num_bytes & static_cast(SizeType(sizeof(wchar_t)) - SizeType(1))) != 0); } }; } // namespace detail /** get the number of C characters needed to store a number of bytes */ template C4_ALWAYS_INLINE constexpr SizeType num_needed_chars(SizeType num_bytes) { return detail::needed_chars::for_bytes(num_bytes); } //----------------------------------------------------------------------------- /** get the given text string as either char or wchar_t according to the given type */ #define C4_TXTTY(txt, type) \ /* is there a smarter way to do this? */\ c4::detail::literal_as::get(txt, C4_WIDEN(txt)) namespace detail { template struct literal_as; template<> struct literal_as { C4_ALWAYS_INLINE static constexpr const char* get(const char* str, const wchar_t *) { return str; } }; template<> struct literal_as { C4_ALWAYS_INLINE static constexpr const wchar_t* get(const char*, const wchar_t *wstr) { return wstr; } }; } // namespace detail } // namespace c4 #endif /* _C4_CHAR_TRAITS_HPP_ */ c4core-0.2.6/src/c4/charconv.hpp000066400000000000000000003032321477602032300163160ustar00rootroot00000000000000#ifndef _C4_CHARCONV_HPP_ #define _C4_CHARCONV_HPP_ /** @file charconv.hpp Lightweight generic type-safe wrappers for * converting individual values to/from strings. */ #include "c4/language.hpp" #include #include #include #include #include #include "c4/config.hpp" #include "c4/substr.hpp" #include "c4/std/std_fwd.hpp" #include "c4/memory_util.hpp" #include "c4/szconv.hpp" #ifndef C4CORE_NO_FAST_FLOAT # if (C4_CPP >= 17) # if defined(_MSC_VER) # if (C4_MSVC_VERSION >= C4_MSVC_VERSION_2019) // VS2017 and lower do not have these macros # include # define C4CORE_HAVE_STD_TOCHARS 1 # define C4CORE_HAVE_STD_FROMCHARS 0 // prefer fast_float with MSVC # define C4CORE_HAVE_FAST_FLOAT 1 # else # define C4CORE_HAVE_STD_TOCHARS 0 # define C4CORE_HAVE_STD_FROMCHARS 0 # define C4CORE_HAVE_FAST_FLOAT 1 # endif # else # if __has_include() # include # if defined(__cpp_lib_to_chars) # define C4CORE_HAVE_STD_TOCHARS 1 # define C4CORE_HAVE_STD_FROMCHARS 0 // glibc uses fast_float internally # define C4CORE_HAVE_FAST_FLOAT 1 # else # define C4CORE_HAVE_STD_TOCHARS 0 # define C4CORE_HAVE_STD_FROMCHARS 0 # define C4CORE_HAVE_FAST_FLOAT 1 # endif # else # define C4CORE_HAVE_STD_TOCHARS 0 # define C4CORE_HAVE_STD_FROMCHARS 0 # define C4CORE_HAVE_FAST_FLOAT 1 # endif # endif # else # define C4CORE_HAVE_STD_TOCHARS 0 # define C4CORE_HAVE_STD_FROMCHARS 0 # define C4CORE_HAVE_FAST_FLOAT 1 # endif # if C4CORE_HAVE_FAST_FLOAT # include "c4/ext/fast_float.hpp" # endif #elif (C4_CPP >= 17) # define C4CORE_HAVE_FAST_FLOAT 0 # if defined(_MSC_VER) # if (C4_MSVC_VERSION >= C4_MSVC_VERSION_2019) // VS2017 and lower do not have these macros # include # define C4CORE_HAVE_STD_TOCHARS 1 # define C4CORE_HAVE_STD_FROMCHARS 1 # else # define C4CORE_HAVE_STD_TOCHARS 0 # define C4CORE_HAVE_STD_FROMCHARS 0 # endif # else # if __has_include() # include # if defined(__cpp_lib_to_chars) # define C4CORE_HAVE_STD_TOCHARS 1 # define C4CORE_HAVE_STD_FROMCHARS 1 // glibc uses fast_float internally # else # define C4CORE_HAVE_STD_TOCHARS 0 # define C4CORE_HAVE_STD_FROMCHARS 0 # endif # else # define C4CORE_HAVE_STD_TOCHARS 0 # define C4CORE_HAVE_STD_FROMCHARS 0 # endif # endif #else # define C4CORE_HAVE_STD_TOCHARS 0 # define C4CORE_HAVE_STD_FROMCHARS 0 # define C4CORE_HAVE_FAST_FLOAT 0 #endif #if !C4CORE_HAVE_STD_FROMCHARS #include #endif #if defined(_MSC_VER) && !defined(__clang__) # pragma warning(push) # pragma warning(disable: 4996) // snprintf/scanf: this function or variable may be unsafe # if C4_MSVC_VERSION != C4_MSVC_VERSION_2017 # pragma warning(disable: 4800) //'int': forcing value to bool 'true' or 'false' (performance warning) # endif #elif defined(__clang__) # pragma clang diagnostic push # pragma clang diagnostic ignored "-Wtautological-constant-out-of-range-compare" # pragma clang diagnostic ignored "-Wformat-nonliteral" # pragma clang diagnostic ignored "-Wdouble-promotion" // implicit conversion increases floating-point precision # pragma clang diagnostic ignored "-Wold-style-cast" #elif defined(__GNUC__) # pragma GCC diagnostic push # pragma GCC diagnostic ignored "-Wformat-nonliteral" # pragma GCC diagnostic ignored "-Wdouble-promotion" // implicit conversion increases floating-point precision # pragma GCC diagnostic ignored "-Wuseless-cast" # pragma GCC diagnostic ignored "-Wold-style-cast" #endif #if defined(__clang__) #define C4_NO_UBSAN_IOVRFLW __attribute__((no_sanitize("signed-integer-overflow"))) #elif defined(__GNUC__) #if __GNUC__ > 7 #define C4_NO_UBSAN_IOVRFLW __attribute__((no_sanitize("signed-integer-overflow"))) #else #define C4_NO_UBSAN_IOVRFLW #endif #else #define C4_NO_UBSAN_IOVRFLW #endif // NOLINTBEGIN(hicpp-signed-bitwise) namespace c4 { /** @defgroup doc_charconv Charconv utilities * * Lightweight, very fast generic type-safe wrappers for converting * individual values to/from strings. These are the main generic * functions: * - @ref doc_to_chars and its alias @ref xtoa(): implemented by calling @ref itoa() / @ref utoa() / @ref ftoa() / @ref dtoa() (or generically @ref xtoa()) * - @ref doc_from_chars and its alias @ref atox(): implemented by calling @ref atoi() / @ref atou() / @ref atof() / @ref atod() (or generically @ref atox()) * - @ref to_chars_sub() * - @ref from_chars_first() * - @ref xtoa() and @ref atox() are implemented in terms of @ref write_dec() / @ref read_dec() et al (see @ref doc_write / @ref doc_read()) * * And also some modest brag is in order: these functions are really * fast: faster even than C++17 `std::to_chars()` and * `std::to_chars()`, and many dozens of times faster than the * iostream abominations. * * For example, here are some benchmark comparisons for @ref * doc_from_chars (link leads to the main project README, where these * results are shown more systematically). * * * *
atox,int64_t
g++12, linux Visual Studio 2019 *
\image html linux-x86_64-gxx12.1-Release-c4core-bm-charconv-atox-mega_bytes_per_second-i64.png \image html windows-x86_64-vs2019-Release-c4core-bm-charconv-atox-mega_bytes_per_second-i64.png *
* * * *
xtoa,int64_t
g++12, linux Visual Studio 2019 *
\image html linux-x86_64-gxx12.1-Release-c4core-bm-charconv-xtoa-mega_bytes_per_second-i64.png \image html windows-x86_64-vs2019-Release-c4core-bm-charconv-xtoa-mega_bytes_per_second-i64.png *
* * To parse floating point, c4core uses * [fastfloat](https://github.com/fastfloat/fast_float), which is * extremely fast, by an even larger factor: * * * *
atox,float
g++12, linux Visual Studio 2019 *
\image html linux-x86_64-gxx12.1-Release-c4core-bm-charconv-atof-mega_bytes_per_second-float.png \image html windows-x86_64-vs2019-Release-c4core-bm-charconv-atof-mega_bytes_per_second-float.png *
* * @{ */ #if C4CORE_HAVE_STD_TOCHARS /** @warning Use only the symbol. Do not rely on the type or naked value of this enum. */ typedef enum : std::underlying_type::type { /** print the real number in floating point format (like %f) */ FTOA_FLOAT = static_cast::type>(std::chars_format::fixed), /** print the real number in scientific format (like %e) */ FTOA_SCIENT = static_cast::type>(std::chars_format::scientific), /** print the real number in flexible format (like %g) */ FTOA_FLEX = static_cast::type>(std::chars_format::general), /** print the real number in hexadecimal format (like %a) */ FTOA_HEXA = static_cast::type>(std::chars_format::hex), } RealFormat_e; #else /** @warning Use only the symbol. Do not rely on the type or naked value of this enum. */ typedef enum : char { /** print the real number in floating point format (like %f) */ FTOA_FLOAT = 'f', /** print the real number in scientific format (like %e) */ FTOA_SCIENT = 'e', /** print the real number in flexible format (like %g) */ FTOA_FLEX = 'g', /** print the real number in hexadecimal format (like %a) */ FTOA_HEXA = 'a', } RealFormat_e; #endif /** @cond dev */ /** in some platforms, int,unsigned int * are not any of int8_t...int64_t and * long,unsigned long are not any of uint8_t...uint64_t */ template struct is_fixed_length { enum : bool { /** true if T is one of the fixed length signed types */ value_i = (std::is_integral::value && (std::is_same::value || std::is_same::value || std::is_same::value || std::is_same::value)), /** true if T is one of the fixed length unsigned types */ value_u = (std::is_integral::value && (std::is_same::value || std::is_same::value || std::is_same::value || std::is_same::value)), /** true if T is one of the fixed length signed or unsigned types */ value = value_i || value_u }; }; /** @endcond */ //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- #if defined(_MSC_VER) && !defined(__clang__) # pragma warning(push) #elif defined(__clang__) # pragma clang diagnostic push #elif defined(__GNUC__) # pragma GCC diagnostic push # pragma GCC diagnostic ignored "-Wconversion" # if __GNUC__ >= 6 # pragma GCC diagnostic ignored "-Wnull-dereference" # endif #endif /** @cond dev */ namespace detail { /* python command to get the values below: def dec(v): return str(v) for bits in (8, 16, 32, 64): imin, imax, umax = (-(1 << (bits - 1))), (1 << (bits - 1)) - 1, (1 << bits) - 1 for vname, v in (("imin", imin), ("imax", imax), ("umax", umax)): for f in (bin, oct, dec, hex): print(f"{bits}b: {vname}={v} {f.__name__}: len={len(f(v)):2d}: {v} {f(v)}") */ // do not use the type as the template argument because in some // platforms long!=int32 and long!=int64. Just use the numbytes // which is more generic and spares lengthy SFINAE code. template struct charconv_digits_; template using charconv_digits = charconv_digits_::value>; template<> struct charconv_digits_<1u, true> // int8_t { enum : size_t { maxdigits_bin = 1 + 2 + 8, // -128==-0b10000000 maxdigits_oct = 1 + 2 + 3, // -128==-0o200 maxdigits_dec = 1 + 3, // -128 maxdigits_hex = 1 + 2 + 2, // -128==-0x80 maxdigits_bin_nopfx = 8, // -128==-0b10000000 maxdigits_oct_nopfx = 3, // -128==-0o200 maxdigits_dec_nopfx = 3, // -128 maxdigits_hex_nopfx = 2, // -128==-0x80 }; // min values without sign! static constexpr csubstr min_value_dec() noexcept { return csubstr("128"); } static constexpr csubstr min_value_hex() noexcept { return csubstr("80"); } static constexpr csubstr min_value_oct() noexcept { return csubstr("200"); } static constexpr csubstr min_value_bin() noexcept { return csubstr("10000000"); } static constexpr csubstr max_value_dec() noexcept { return csubstr("127"); } static constexpr bool is_oct_overflow(csubstr str) noexcept { return !((str.len < 3) || (str.len == 3 && str[0] <= '1')); } }; template<> struct charconv_digits_<1u, false> // uint8_t { enum : size_t { maxdigits_bin = 2 + 8, // 255 0b11111111 maxdigits_oct = 2 + 3, // 255 0o377 maxdigits_dec = 3, // 255 maxdigits_hex = 2 + 2, // 255 0xff maxdigits_bin_nopfx = 8, // 255 0b11111111 maxdigits_oct_nopfx = 3, // 255 0o377 maxdigits_dec_nopfx = 3, // 255 maxdigits_hex_nopfx = 2, // 255 0xff }; static constexpr csubstr max_value_dec() noexcept { return csubstr("255"); } static constexpr bool is_oct_overflow(csubstr str) noexcept { return !((str.len < 3) || (str.len == 3 && str[0] <= '3')); } }; template<> struct charconv_digits_<2u, true> // int16_t { enum : size_t { maxdigits_bin = 1 + 2 + 16, // -32768 -0b1000000000000000 maxdigits_oct = 1 + 2 + 6, // -32768 -0o100000 maxdigits_dec = 1 + 5, // -32768 -32768 maxdigits_hex = 1 + 2 + 4, // -32768 -0x8000 maxdigits_bin_nopfx = 16, // -32768 -0b1000000000000000 maxdigits_oct_nopfx = 6, // -32768 -0o100000 maxdigits_dec_nopfx = 5, // -32768 -32768 maxdigits_hex_nopfx = 4, // -32768 -0x8000 }; // min values without sign! static constexpr csubstr min_value_dec() noexcept { return csubstr("32768"); } static constexpr csubstr min_value_hex() noexcept { return csubstr("8000"); } static constexpr csubstr min_value_oct() noexcept { return csubstr("100000"); } static constexpr csubstr min_value_bin() noexcept { return csubstr("1000000000000000"); } static constexpr csubstr max_value_dec() noexcept { return csubstr("32767"); } static constexpr bool is_oct_overflow(csubstr str) noexcept { return !((str.len < 6)); } }; template<> struct charconv_digits_<2u, false> // uint16_t { enum : size_t { maxdigits_bin = 2 + 16, // 65535 0b1111111111111111 maxdigits_oct = 2 + 6, // 65535 0o177777 maxdigits_dec = 6, // 65535 65535 maxdigits_hex = 2 + 4, // 65535 0xffff maxdigits_bin_nopfx = 16, // 65535 0b1111111111111111 maxdigits_oct_nopfx = 6, // 65535 0o177777 maxdigits_dec_nopfx = 6, // 65535 65535 maxdigits_hex_nopfx = 4, // 65535 0xffff }; static constexpr csubstr max_value_dec() noexcept { return csubstr("65535"); } static constexpr bool is_oct_overflow(csubstr str) noexcept { return !((str.len < 6) || (str.len == 6 && str[0] <= '1')); } }; template<> struct charconv_digits_<4u, true> // int32_t { enum : size_t { maxdigits_bin = 1 + 2 + 32, // len=35: -2147483648 -0b10000000000000000000000000000000 maxdigits_oct = 1 + 2 + 11, // len=14: -2147483648 -0o20000000000 maxdigits_dec = 1 + 10, // len=11: -2147483648 -2147483648 maxdigits_hex = 1 + 2 + 8, // len=11: -2147483648 -0x80000000 maxdigits_bin_nopfx = 32, // len=35: -2147483648 -0b10000000000000000000000000000000 maxdigits_oct_nopfx = 11, // len=14: -2147483648 -0o20000000000 maxdigits_dec_nopfx = 10, // len=11: -2147483648 -2147483648 maxdigits_hex_nopfx = 8, // len=11: -2147483648 -0x80000000 }; // min values without sign! static constexpr csubstr min_value_dec() noexcept { return csubstr("2147483648"); } static constexpr csubstr min_value_hex() noexcept { return csubstr("80000000"); } static constexpr csubstr min_value_oct() noexcept { return csubstr("20000000000"); } static constexpr csubstr min_value_bin() noexcept { return csubstr("10000000000000000000000000000000"); } static constexpr csubstr max_value_dec() noexcept { return csubstr("2147483647"); } static constexpr bool is_oct_overflow(csubstr str) noexcept { return !((str.len < 11) || (str.len == 11 && str[0] <= '1')); } }; template<> struct charconv_digits_<4u, false> // uint32_t { enum : size_t { maxdigits_bin = 2 + 32, // len=34: 4294967295 0b11111111111111111111111111111111 maxdigits_oct = 2 + 11, // len=13: 4294967295 0o37777777777 maxdigits_dec = 10, // len=10: 4294967295 4294967295 maxdigits_hex = 2 + 8, // len=10: 4294967295 0xffffffff maxdigits_bin_nopfx = 32, // len=34: 4294967295 0b11111111111111111111111111111111 maxdigits_oct_nopfx = 11, // len=13: 4294967295 0o37777777777 maxdigits_dec_nopfx = 10, // len=10: 4294967295 4294967295 maxdigits_hex_nopfx = 8, // len=10: 4294967295 0xffffffff }; static constexpr csubstr max_value_dec() noexcept { return csubstr("4294967295"); } static constexpr bool is_oct_overflow(csubstr str) noexcept { return !((str.len < 11) || (str.len == 11 && str[0] <= '3')); } }; template<> struct charconv_digits_<8u, true> // int64_t { enum : size_t { maxdigits_bin = 1 + 2 + 64, // len=67: -9223372036854775808 -0b1000000000000000000000000000000000000000000000000000000000000000 maxdigits_oct = 1 + 2 + 22, // len=25: -9223372036854775808 -0o1000000000000000000000 maxdigits_dec = 1 + 19, // len=20: -9223372036854775808 -9223372036854775808 maxdigits_hex = 1 + 2 + 16, // len=19: -9223372036854775808 -0x8000000000000000 maxdigits_bin_nopfx = 64, // len=67: -9223372036854775808 -0b1000000000000000000000000000000000000000000000000000000000000000 maxdigits_oct_nopfx = 22, // len=25: -9223372036854775808 -0o1000000000000000000000 maxdigits_dec_nopfx = 19, // len=20: -9223372036854775808 -9223372036854775808 maxdigits_hex_nopfx = 16, // len=19: -9223372036854775808 -0x8000000000000000 }; static constexpr csubstr min_value_dec() noexcept { return csubstr("9223372036854775808"); } static constexpr csubstr min_value_hex() noexcept { return csubstr("8000000000000000"); } static constexpr csubstr min_value_oct() noexcept { return csubstr("1000000000000000000000"); } static constexpr csubstr min_value_bin() noexcept { return csubstr("1000000000000000000000000000000000000000000000000000000000000000"); } static constexpr csubstr max_value_dec() noexcept { return csubstr("9223372036854775807"); } static constexpr bool is_oct_overflow(csubstr str) noexcept { return !((str.len < 22)); } }; template<> struct charconv_digits_<8u, false> // uint64_t { enum : size_t { maxdigits_bin = 2 + 64, // len=66: 18446744073709551615 0b1111111111111111111111111111111111111111111111111111111111111111 maxdigits_oct = 2 + 22, // len=24: 18446744073709551615 0o1777777777777777777777 maxdigits_dec = 20, // len=20: 18446744073709551615 18446744073709551615 maxdigits_hex = 2 + 16, // len=18: 18446744073709551615 0xffffffffffffffff maxdigits_bin_nopfx = 64, // len=66: 18446744073709551615 0b1111111111111111111111111111111111111111111111111111111111111111 maxdigits_oct_nopfx = 22, // len=24: 18446744073709551615 0o1777777777777777777777 maxdigits_dec_nopfx = 20, // len=20: 18446744073709551615 18446744073709551615 maxdigits_hex_nopfx = 16, // len=18: 18446744073709551615 0xffffffffffffffff }; static constexpr csubstr max_value_dec() noexcept { return csubstr("18446744073709551615"); } static constexpr bool is_oct_overflow(csubstr str) noexcept { return !((str.len < 22) || (str.len == 22 && str[0] <= '1')); } }; } // namespace detail // Helper macros, undefined below #define _c4append(c) { if(C4_LIKELY(pos < buf.len)) { buf.str[pos++] = static_cast(c); } else { ++pos; } } #define _c4appendhex(i) { if(C4_LIKELY(pos < buf.len)) { buf.str[pos++] = hexchars[i]; } else { ++pos; } } /** @endcond */ //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /** @defgroup doc_digits Get number of digits * * @note At first sight this code may look heavily branchy and * therefore inefficient. However, measurements revealed this to be * the fastest among the alternatives. * * @see https://github.com/biojppm/c4core/pull/77 * * @{ */ /** decimal digits for 8 bit integers */ template C4_CONSTEXPR14 C4_ALWAYS_INLINE auto digits_dec(T v) noexcept -> typename std::enable_if::type { C4_STATIC_ASSERT(std::is_integral::value); C4_ASSERT(v >= 0); return ((v >= 100) ? 3u : ((v >= 10) ? 2u : 1u)); } /** decimal digits for 16 bit integers */ template C4_CONSTEXPR14 C4_ALWAYS_INLINE auto digits_dec(T v) noexcept -> typename std::enable_if::type { C4_STATIC_ASSERT(std::is_integral::value); C4_ASSERT(v >= 0); return ((v >= 10000) ? 5u : (v >= 1000) ? 4u : (v >= 100) ? 3u : (v >= 10) ? 2u : 1u); } /** decimal digits for 32 bit integers */ template C4_CONSTEXPR14 C4_ALWAYS_INLINE auto digits_dec(T v) noexcept -> typename std::enable_if::type { C4_STATIC_ASSERT(std::is_integral::value); C4_ASSERT(v >= 0); return ((v >= 1000000000) ? 10u : (v >= 100000000) ? 9u : (v >= 10000000) ? 8u : (v >= 1000000) ? 7u : (v >= 100000) ? 6u : (v >= 10000) ? 5u : (v >= 1000) ? 4u : (v >= 100) ? 3u : (v >= 10) ? 2u : 1u); } /** decimal digits for 64 bit integers */ template C4_CONSTEXPR14 C4_ALWAYS_INLINE auto digits_dec(T v) noexcept -> typename std::enable_if::type { // thanks @fargies!!! // https://github.com/biojppm/c4core/pull/77#issuecomment-1063753568 C4_STATIC_ASSERT(std::is_integral::value); C4_ASSERT(v >= 0); if(v >= 1000000000) // 10 { if(v >= 100000000000000) // 15 [15-20] range { if(v >= 100000000000000000) // 18 (15 + (20 - 15) / 2) { if((typename std::make_unsigned::type)v >= 10000000000000000000u) // 20 return 20u; else return (v >= 1000000000000000000) ? 19u : 18u; } else if(v >= 10000000000000000) // 17 return 17u; else return(v >= 1000000000000000) ? 16u : 15u; } else if(v >= 1000000000000) // 13 return (v >= 10000000000000) ? 14u : 13u; else if(v >= 100000000000) // 12 return 12; else return(v >= 10000000000) ? 11u : 10u; } else if(v >= 10000) // 5 [5-9] range { if(v >= 10000000) // 8 return (v >= 100000000) ? 9u : 8u; else if(v >= 1000000) // 7 return 7; else return (v >= 100000) ? 6u : 5u; } else if(v >= 100) return (v >= 1000) ? 4u : 3u; else return (v >= 10) ? 2u : 1u; } /** return the number of digits required to encode an hexadecimal number. */ template C4_CONSTEXPR14 C4_ALWAYS_INLINE unsigned digits_hex(T v) noexcept { C4_STATIC_ASSERT(std::is_integral::value); C4_ASSERT(v >= 0); return v ? 1u + (msb((typename std::make_unsigned::type)v) >> 2u) : 1u; } /** return the number of digits required to encode a binary number. */ template C4_CONSTEXPR14 C4_ALWAYS_INLINE unsigned digits_bin(T v) noexcept { C4_STATIC_ASSERT(std::is_integral::value); C4_ASSERT(v >= 0); return v ? 1u + msb((typename std::make_unsigned::type)v) : 1u; } /** return the number of digits required to encode an octal number. */ template C4_CONSTEXPR14 C4_ALWAYS_INLINE unsigned digits_oct(T v_) noexcept { // TODO: is there a better way? C4_STATIC_ASSERT(std::is_integral::value); C4_ASSERT(v_ >= 0); using U = typename std::conditional::type>::type; U v = (U) v_; // safe because we require v_ >= 0 // NOLINT uint32_t __n = 1; enum : U { __b2 = 64u, __b3 = 64u * 8u, __b4 = 64u * 8u * 8u, }; while(true) { if(v < 8u) return __n; else if(v < __b2) return __n + 1; else if(v < __b3) return __n + 2; else if(v < __b4) return __n + 3; v /= (U) __b4; __n += 4; } } /** @} */ //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /** @cond dev */ namespace detail { C4_INLINE_CONSTEXPR const char hexchars[] = "0123456789abcdef"; C4_INLINE_CONSTEXPR const char digits0099[] = "0001020304050607080910111213141516171819" "2021222324252627282930313233343536373839" "4041424344454647484950515253545556575859" "6061626364656667686970717273747576777879" "8081828384858687888990919293949596979899"; } // namespace detail /** @endcond */ C4_SUPPRESS_WARNING_GCC_PUSH C4_SUPPRESS_WARNING_GCC("-Warray-bounds") // gcc has false positives here #if (defined(__GNUC__) && (__GNUC__ >= 7)) C4_SUPPRESS_WARNING_GCC("-Wstringop-overflow") // gcc has false positives here #endif /** @defgroup doc_write_unchecked Write with known number of digits * * Writes a value without checking the buffer length with regards to * the required number of digits to encode the value. It is the * responsibility of the caller to ensure that the provided number of * digits is enough to write the given value. Notwithstanding the * name, assertions are liberally performed, so this code is safe. * * @{ */ template C4_HOT C4_ALWAYS_INLINE void write_dec_unchecked(substr buf, T v, unsigned digits_v) noexcept { C4_STATIC_ASSERT(std::is_integral::value); C4_ASSERT(v >= 0); C4_ASSERT(buf.len >= digits_v); C4_XASSERT(digits_v == digits_dec(v)); // in bm_xtoa: checkoncelog_singlediv_write2 while(v >= T(100)) { T quo = v; quo /= T(100); const auto num = (v - quo * T(100)) << 1u; // NOLINT v = quo; buf.str[--digits_v] = detail::digits0099[num + 1]; buf.str[--digits_v] = detail::digits0099[num]; } if(v >= T(10)) { C4_ASSERT(digits_v == 2); const auto num = v << 1u; buf.str[1] = detail::digits0099[num + 1]; buf.str[0] = detail::digits0099[num]; } else { C4_ASSERT(digits_v == 1); buf.str[0] = (char)('0' + v); } } template C4_HOT C4_ALWAYS_INLINE void write_hex_unchecked(substr buf, T v, unsigned digits_v) noexcept { C4_STATIC_ASSERT(std::is_integral::value); C4_ASSERT(v >= 0); C4_ASSERT(buf.len >= digits_v); C4_XASSERT(digits_v == digits_hex(v)); do { buf.str[--digits_v] = detail::hexchars[v & T(15)]; v >>= 4; } while(v); C4_ASSERT(digits_v == 0); } template C4_HOT C4_ALWAYS_INLINE void write_oct_unchecked(substr buf, T v, unsigned digits_v) noexcept { C4_STATIC_ASSERT(std::is_integral::value); C4_ASSERT(v >= 0); C4_ASSERT(buf.len >= digits_v); C4_XASSERT(digits_v == digits_oct(v)); do { buf.str[--digits_v] = (char)('0' + (v & T(7))); v >>= 3; } while(v); C4_ASSERT(digits_v == 0); } template C4_HOT C4_ALWAYS_INLINE void write_bin_unchecked(substr buf, T v, unsigned digits_v) noexcept { C4_STATIC_ASSERT(std::is_integral::value); C4_ASSERT(v >= 0); C4_ASSERT(buf.len >= digits_v); C4_XASSERT(digits_v == digits_bin(v)); do { buf.str[--digits_v] = (char)('0' + (v & T(1))); v >>= 1; } while(v); C4_ASSERT(digits_v == 0); } /** @} */ // write_unchecked //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /** @defgroup doc_write Write a value * * Writes a value without checking the buffer length * decimal number -- but asserting. * * @{ */ /** write an integer to a string in decimal format. This is the * lowest level (and the fastest) function to do this task. * @note does not accept negative numbers * @note the resulting string is NOT zero-terminated. * @note it is ok to call this with an empty or too-small buffer; * no writes will occur, and the required size will be returned * @return the number of characters required for the buffer. */ template C4_ALWAYS_INLINE size_t write_dec(substr buf, T v) noexcept { C4_STATIC_ASSERT(std::is_integral::value); C4_ASSERT(v >= 0); unsigned digits = digits_dec(v); if(C4_LIKELY(buf.len >= digits)) write_dec_unchecked(buf, v, digits); return digits; } /** write an integer to a string in hexadecimal format. This is the * lowest level (and the fastest) function to do this task. * @note does not accept negative numbers * @note does not prefix with 0x * @note the resulting string is NOT zero-terminated. * @note it is ok to call this with an empty or too-small buffer; * no writes will occur, and the required size will be returned * @return the number of characters required for the buffer. */ template C4_ALWAYS_INLINE size_t write_hex(substr buf, T v) noexcept { C4_STATIC_ASSERT(std::is_integral::value); C4_ASSERT(v >= 0); unsigned digits = digits_hex(v); if(C4_LIKELY(buf.len >= digits)) write_hex_unchecked(buf, v, digits); return digits; } /** write an integer to a string in octal format. This is the * lowest level (and the fastest) function to do this task. * @note does not accept negative numbers * @note does not prefix with 0o * @note the resulting string is NOT zero-terminated. * @note it is ok to call this with an empty or too-small buffer; * no writes will occur, and the required size will be returned * @return the number of characters required for the buffer. */ template C4_ALWAYS_INLINE size_t write_oct(substr buf, T v) noexcept { C4_STATIC_ASSERT(std::is_integral::value); C4_ASSERT(v >= 0); unsigned digits = digits_oct(v); if(C4_LIKELY(buf.len >= digits)) write_oct_unchecked(buf, v, digits); return digits; } /** write an integer to a string in binary format. This is the * lowest level (and the fastest) function to do this task. * @note does not accept negative numbers * @note does not prefix with 0b * @note the resulting string is NOT zero-terminated. * @note it is ok to call this with an empty or too-small buffer; * no writes will occur, and the required size will be returned * @return the number of characters required for the buffer. */ template C4_ALWAYS_INLINE size_t write_bin(substr buf, T v) noexcept { C4_STATIC_ASSERT(std::is_integral::value); C4_ASSERT(v >= 0); unsigned digits = digits_bin(v); C4_ASSERT(digits > 0); if(C4_LIKELY(buf.len >= digits)) write_bin_unchecked(buf, v, digits); return digits; } /** @cond dev */ namespace detail { template using NumberWriter = size_t (*)(substr, U); template writer> size_t write_num_digits(substr buf, T v, size_t num_digits) noexcept { C4_STATIC_ASSERT(std::is_integral::value); const size_t ret = writer(buf, v); if(ret >= num_digits) return ret; else if(ret >= buf.len || num_digits > buf.len) return num_digits; C4_ASSERT(num_digits >= ret); const size_t delta = static_cast(num_digits - ret); // NOLINT C4_ASSERT(ret + delta <= buf.len); if(ret) memmove(buf.str + delta, buf.str, ret); if(delta) memset(buf.str, '0', delta); return num_digits; } } // namespace detail /** @endcond */ /** same as c4::write_dec(), but pad with zeroes on the left * such that the resulting string is @p num_digits wide. * If the given number is requires more than num_digits, then the number prevails. */ template C4_ALWAYS_INLINE size_t write_dec(substr buf, T val, size_t num_digits) noexcept { return detail::write_num_digits>(buf, val, num_digits); } /** same as c4::write_hex(), but pad with zeroes on the left * such that the resulting string is @p num_digits wide. * If the given number is requires more than num_digits, then the number prevails. */ template C4_ALWAYS_INLINE size_t write_hex(substr buf, T val, size_t num_digits) noexcept { return detail::write_num_digits>(buf, val, num_digits); } /** same as c4::write_bin(), but pad with zeroes on the left * such that the resulting string is @p num_digits wide. * If the given number is requires more than num_digits, then the number prevails. */ template C4_ALWAYS_INLINE size_t write_bin(substr buf, T val, size_t num_digits) noexcept { return detail::write_num_digits>(buf, val, num_digits); } /** same as c4::write_oct(), but pad with zeroes on the left * such that the resulting string is @p num_digits wide. * If the given number is requires more than num_digits, then the number prevails. */ template C4_ALWAYS_INLINE size_t write_oct(substr buf, T val, size_t num_digits) noexcept { return detail::write_num_digits>(buf, val, num_digits); } /** @} */ // write C4_SUPPRESS_WARNING_GCC_POP //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- C4_SUPPRESS_WARNING_MSVC_PUSH C4_SUPPRESS_WARNING_MSVC(4365) // '=': conversion from 'int' to 'I', signed/unsigned mismatch /** @defgroup doc_read Read a value * * @{ */ /** read a decimal integer from a string. This is the * lowest level (and the fastest) function to do this task. * @note does not accept negative numbers * @note The string must be trimmed. Whitespace is not accepted. * @note the string must not be empty * @note there is no check for overflow; the value wraps around * in a way similar to the standard C/C++ overflow behavior. * For example, `read_dec("128", &val)` returns true * and val will be set to 0 because 127 is the max i8 value. * @see overflows() to find out if a number string overflows a type range * @return true if the conversion was successful (no overflow check) */ template C4_NO_UBSAN_IOVRFLW C4_ALWAYS_INLINE bool read_dec(csubstr s, I *C4_RESTRICT v) noexcept { C4_STATIC_ASSERT(std::is_integral::value); C4_ASSERT(!s.empty()); *v = 0; for(char c : s) { if(C4_UNLIKELY(c < '0' || c > '9')) return false; *v = (*v) * I(10) + (I(c) - I('0')); } return true; } /** read an hexadecimal integer from a string. This is the * lowest level (and the fastest) function to do this task. * @note does not accept negative numbers * @note does not accept leading 0x or 0X * @note the string must not be empty * @note the string must be trimmed. Whitespace is not accepted. * @note there is no check for overflow; the value wraps around * in a way similar to the standard C/C++ overflow behavior. * For example, `read_hex("80", &val)` returns true * and val will be set to 0 because 7f is the max i8 value. * @see overflows() to find out if a number string overflows a type range * @return true if the conversion was successful (no overflow check) */ template C4_NO_UBSAN_IOVRFLW C4_ALWAYS_INLINE bool read_hex(csubstr s, I *C4_RESTRICT v) noexcept { C4_STATIC_ASSERT(std::is_integral::value); C4_ASSERT(!s.empty()); *v = 0; for(char c : s) { I cv; if(c >= '0' && c <= '9') cv = I(c) - I('0'); else if(c >= 'a' && c <= 'f') cv = I(10) + (I(c) - I('a')); else if(c >= 'A' && c <= 'F') cv = I(10) + (I(c) - I('A')); else return false; *v = (*v) * I(16) + cv; } return true; } /** read a binary integer from a string. This is the * lowest level (and the fastest) function to do this task. * @note does not accept negative numbers * @note does not accept leading 0b or 0B * @note the string must not be empty * @note the string must be trimmed. Whitespace is not accepted. * @note there is no check for overflow; the value wraps around * in a way similar to the standard C/C++ overflow behavior. * For example, `read_bin("10000000", &val)` returns true * and val will be set to 0 because 1111111 is the max i8 value. * @see overflows() to find out if a number string overflows a type range * @return true if the conversion was successful (no overflow check) */ template C4_NO_UBSAN_IOVRFLW C4_ALWAYS_INLINE bool read_bin(csubstr s, I *C4_RESTRICT v) noexcept { C4_STATIC_ASSERT(std::is_integral::value); C4_ASSERT(!s.empty()); *v = 0; for(char c : s) { *v <<= 1; if(c == '1') *v |= 1; else if(c != '0') return false; } return true; } /** read an octal integer from a string. This is the * lowest level (and the fastest) function to do this task. * @note does not accept negative numbers * @note does not accept leading 0o or 0O * @note the string must not be empty * @note the string must be trimmed. Whitespace is not accepted. * @note there is no check for overflow; the value wraps around * in a way similar to the standard C/C++ overflow behavior. * For example, `read_oct("200", &val)` returns true * and val will be set to 0 because 177 is the max i8 value. * @see overflows() to find out if a number string overflows a type range * @return true if the conversion was successful (no overflow check) */ template C4_NO_UBSAN_IOVRFLW C4_ALWAYS_INLINE bool read_oct(csubstr s, I *C4_RESTRICT v) noexcept { C4_STATIC_ASSERT(std::is_integral::value); C4_ASSERT(!s.empty()); *v = 0; for(char c : s) { if(C4_UNLIKELY(c < '0' || c > '7')) return false; *v = (*v) * I(8) + (I(c) - I('0')); } return true; } /** @} */ C4_SUPPRESS_WARNING_MSVC_POP //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- C4_SUPPRESS_WARNING_GCC_WITH_PUSH("-Wswitch-default") /** @cond dev */ namespace detail { inline size_t _itoa2buf(substr buf, size_t pos, csubstr val) noexcept { C4_ASSERT(pos < buf.len); C4_ASSERT(pos + val.len <= buf.len); C4_ASSERT(val.len > 0); memcpy(buf.str + pos, val.str, val.len); return pos + val.len; } inline size_t _itoa2bufwithdigits(substr buf, size_t pos, size_t num_digits, csubstr val) noexcept { num_digits = num_digits > val.len ? num_digits - val.len : 0; C4_ASSERT(num_digits + val.len <= buf.len); for(size_t i = 0; i < num_digits; ++i) _c4append('0'); return detail::_itoa2buf(buf, pos, val); } template C4_NO_INLINE size_t _itoadec2buf(substr buf) noexcept { using digits_type = detail::charconv_digits; if(C4_UNLIKELY(buf.len < digits_type::maxdigits_dec)) return digits_type::maxdigits_dec; buf.str[0] = '-'; return detail::_itoa2buf(buf, 1, digits_type::min_value_dec()); } template C4_NO_INLINE size_t _itoa2buf(substr buf, I radix) noexcept { using digits_type = detail::charconv_digits; size_t pos = 0; if(C4_LIKELY(buf.len > 0)) buf.str[pos++] = '-'; switch(radix) // NOLINT(hicpp-multiway-paths-covered) { case I(10): if(C4_UNLIKELY(buf.len < digits_type::maxdigits_dec)) return digits_type::maxdigits_dec; pos =_itoa2buf(buf, pos, digits_type::min_value_dec()); break; case I(16): if(C4_UNLIKELY(buf.len < digits_type::maxdigits_hex)) return digits_type::maxdigits_hex; buf.str[pos++] = '0'; buf.str[pos++] = 'x'; pos = _itoa2buf(buf, pos, digits_type::min_value_hex()); break; case I( 2): if(C4_UNLIKELY(buf.len < digits_type::maxdigits_bin)) return digits_type::maxdigits_bin; buf.str[pos++] = '0'; buf.str[pos++] = 'b'; pos = _itoa2buf(buf, pos, digits_type::min_value_bin()); break; case I( 8): if(C4_UNLIKELY(buf.len < digits_type::maxdigits_oct)) return digits_type::maxdigits_oct; buf.str[pos++] = '0'; buf.str[pos++] = 'o'; pos = _itoa2buf(buf, pos, digits_type::min_value_oct()); break; } return pos; } template C4_NO_INLINE size_t _itoa2buf(substr buf, I radix, size_t num_digits) noexcept { using digits_type = detail::charconv_digits; size_t pos = 0; size_t needed_digits = 0; if(C4_LIKELY(buf.len > 0)) buf.str[pos++] = '-'; switch(radix) // NOLINT(hicpp-multiway-paths-covered) { case I(10): // add 1 to account for - needed_digits = num_digits+1 > digits_type::maxdigits_dec ? num_digits+1 : digits_type::maxdigits_dec; if(C4_UNLIKELY(buf.len < needed_digits)) return needed_digits; pos = _itoa2bufwithdigits(buf, pos, num_digits, digits_type::min_value_dec()); break; case I(16): // add 3 to account for -0x needed_digits = num_digits+3 > digits_type::maxdigits_hex ? num_digits+3 : digits_type::maxdigits_hex; if(C4_UNLIKELY(buf.len < needed_digits)) return needed_digits; buf.str[pos++] = '0'; buf.str[pos++] = 'x'; pos = _itoa2bufwithdigits(buf, pos, num_digits, digits_type::min_value_hex()); break; case I(2): // add 3 to account for -0b needed_digits = num_digits+3 > digits_type::maxdigits_bin ? num_digits+3 : digits_type::maxdigits_bin; if(C4_UNLIKELY(buf.len < needed_digits)) return needed_digits; C4_ASSERT(buf.len >= digits_type::maxdigits_bin); buf.str[pos++] = '0'; buf.str[pos++] = 'b'; pos = _itoa2bufwithdigits(buf, pos, num_digits, digits_type::min_value_bin()); break; case I(8): // add 3 to account for -0o needed_digits = num_digits+3 > digits_type::maxdigits_oct ? num_digits+3 : digits_type::maxdigits_oct; if(C4_UNLIKELY(buf.len < needed_digits)) return needed_digits; C4_ASSERT(buf.len >= digits_type::maxdigits_oct); buf.str[pos++] = '0'; buf.str[pos++] = 'o'; pos = _itoa2bufwithdigits(buf, pos, num_digits, digits_type::min_value_oct()); break; } return pos; } } // namespace detail /** @endcond */ /** @defgroup doc_itoa itoa: signed to chars * * @{ */ /** convert an integral signed decimal to a string. * @note the resulting string is NOT zero-terminated. * @note it is ok to call this with an empty or too-small buffer; * no writes will occur, and the needed size will be returned * @return the number of characters required for the buffer. */ template C4_ALWAYS_INLINE size_t itoa(substr buf, T v) noexcept { C4_STATIC_ASSERT(std::is_signed::value); if(v >= T(0)) { // write_dec() checks the buffer size, so no need to check here return write_dec(buf, v); } // when T is the min value (eg i8: -128), negating it // will overflow, so treat the min as a special case if(C4_LIKELY(v != std::numeric_limits::min())) { v = -v; unsigned digits = digits_dec(v); if(C4_LIKELY(buf.len >= digits + 1u)) { buf.str[0] = '-'; write_dec_unchecked(buf.sub(1), v, digits); } return digits + 1u; } return detail::_itoadec2buf(buf); } /** convert an integral signed integer to a string, using a specific * radix. The radix must be 2, 8, 10 or 16. * * @note the resulting string is NOT zero-terminated. * @note it is ok to call this with an empty or too-small buffer; * no writes will occur, and the needed size will be returned * @return the number of characters required for the buffer. */ template C4_ALWAYS_INLINE size_t itoa(substr buf, T v, T radix) noexcept { C4_STATIC_ASSERT(std::is_signed::value); C4_ASSERT(radix == 2 || radix == 8 || radix == 10 || radix == 16); C4_SUPPRESS_WARNING_GCC_PUSH #if (defined(__GNUC__) && (__GNUC__ >= 7)) C4_SUPPRESS_WARNING_GCC("-Wstringop-overflow") // gcc has a false positive here #endif // when T is the min value (eg i8: -128), negating it // will overflow, so treat the min as a special case if(C4_LIKELY(v != std::numeric_limits::min())) { unsigned pos = 0; if(v < 0) { v = -v; if(C4_LIKELY(buf.len > 0)) buf.str[pos] = '-'; ++pos; } unsigned digits = 0; switch(radix) // NOLINT(hicpp-multiway-paths-covered) { case T(10): digits = digits_dec(v); if(C4_LIKELY(buf.len >= pos + digits)) write_dec_unchecked(buf.sub(pos), v, digits); break; case T(16): digits = digits_hex(v); if(C4_LIKELY(buf.len >= pos + 2u + digits)) { buf.str[pos + 0] = '0'; buf.str[pos + 1] = 'x'; write_hex_unchecked(buf.sub(pos + 2), v, digits); } digits += 2u; break; case T(2): digits = digits_bin(v); if(C4_LIKELY(buf.len >= pos + 2u + digits)) { buf.str[pos + 0] = '0'; buf.str[pos + 1] = 'b'; write_bin_unchecked(buf.sub(pos + 2), v, digits); } digits += 2u; break; case T(8): digits = digits_oct(v); if(C4_LIKELY(buf.len >= pos + 2u + digits)) { buf.str[pos + 0] = '0'; buf.str[pos + 1] = 'o'; write_oct_unchecked(buf.sub(pos + 2), v, digits); } digits += 2u; break; } return pos + digits; } C4_SUPPRESS_WARNING_GCC_POP // when T is the min value (eg i8: -128), negating it // will overflow return detail::_itoa2buf(buf, radix); } /** same as c4::itoa(), but pad with zeroes on the left such that the * resulting string is @p num_digits wide, not accounting for radix * prefix (0x,0o,0b). The @p radix must be 2, 8, 10 or 16. * * @note the resulting string is NOT zero-terminated. * @note it is ok to call this with an empty or too-small buffer; * no writes will occur, and the needed size will be returned * @return the number of characters required for the buffer. */ template C4_ALWAYS_INLINE size_t itoa(substr buf, T v, T radix, size_t num_digits) noexcept { C4_STATIC_ASSERT(std::is_signed::value); C4_ASSERT(radix == 2 || radix == 8 || radix == 10 || radix == 16); C4_SUPPRESS_WARNING_GCC_PUSH #if (defined(__GNUC__) && (__GNUC__ >= 7)) C4_SUPPRESS_WARNING_GCC("-Wstringop-overflow") // gcc has a false positive here #endif // when T is the min value (eg i8: -128), negating it // will overflow, so treat the min as a special case if(C4_LIKELY(v != std::numeric_limits::min())) { unsigned pos = 0; if(v < 0) { v = -v; if(C4_LIKELY(buf.len > 0)) buf.str[pos] = '-'; ++pos; } unsigned total_digits = 0; switch(radix) // NOLINT(hicpp-multiway-paths-covered) { case T(10): total_digits = digits_dec(v); total_digits = pos + (unsigned)(num_digits > total_digits ? num_digits : total_digits); if(C4_LIKELY(buf.len >= total_digits)) write_dec(buf.sub(pos), v, num_digits); break; case T(16): total_digits = digits_hex(v); total_digits = pos + 2u + (unsigned)(num_digits > total_digits ? num_digits : total_digits); if(C4_LIKELY(buf.len >= total_digits)) { buf.str[pos + 0] = '0'; buf.str[pos + 1] = 'x'; write_hex(buf.sub(pos + 2), v, num_digits); } break; case T(2): total_digits = digits_bin(v); total_digits = pos + 2u + (unsigned)(num_digits > total_digits ? num_digits : total_digits); if(C4_LIKELY(buf.len >= total_digits)) { buf.str[pos + 0] = '0'; buf.str[pos + 1] = 'b'; write_bin(buf.sub(pos + 2), v, num_digits); } break; case T(8): total_digits = digits_oct(v); total_digits = pos + 2u + (unsigned)(num_digits > total_digits ? num_digits : total_digits); if(C4_LIKELY(buf.len >= total_digits)) { buf.str[pos + 0] = '0'; buf.str[pos + 1] = 'o'; write_oct(buf.sub(pos + 2), v, num_digits); } break; } return total_digits; } C4_SUPPRESS_WARNING_GCC_POP // when T is the min value (eg i8: -128), negating it // will overflow return detail::_itoa2buf(buf, radix, num_digits); } /** @} */ //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /** @defgroup doc_utoa utoa: unsigned to chars * * @{ */ /** convert an integral unsigned decimal to a string. * * @note the resulting string is NOT zero-terminated. * @note it is ok to call this with an empty or too-small buffer; * no writes will occur, and the needed size will be returned * @return the number of characters required for the buffer. */ template C4_ALWAYS_INLINE size_t utoa(substr buf, T v) noexcept { C4_STATIC_ASSERT(std::is_unsigned::value); // write_dec() does the buffer length check, so no need to check here return write_dec(buf, v); } /** convert an integral unsigned integer to a string, using a specific * radix. The radix must be 2, 8, 10 or 16. * * @note the resulting string is NOT zero-terminated. * @note it is ok to call this with an empty or too-small buffer; * no writes will occur, and the needed size will be returned * @return the number of characters required for the buffer. */ template C4_ALWAYS_INLINE size_t utoa(substr buf, T v, T radix) noexcept { C4_STATIC_ASSERT(std::is_unsigned::value); C4_ASSERT(radix == 10 || radix == 16 || radix == 2 || radix == 8); unsigned digits = 0; switch(radix) // NOLINT(hicpp-multiway-paths-covered) { case T(10): digits = digits_dec(v); if(C4_LIKELY(buf.len >= digits)) write_dec_unchecked(buf, v, digits); break; case T(16): digits = digits_hex(v); if(C4_LIKELY(buf.len >= digits+2u)) { buf.str[0] = '0'; buf.str[1] = 'x'; write_hex_unchecked(buf.sub(2), v, digits); } digits += 2u; break; case T(2): digits = digits_bin(v); if(C4_LIKELY(buf.len >= digits+2u)) { buf.str[0] = '0'; buf.str[1] = 'b'; write_bin_unchecked(buf.sub(2), v, digits); } digits += 2u; break; case T(8): digits = digits_oct(v); if(C4_LIKELY(buf.len >= digits+2u)) { buf.str[0] = '0'; buf.str[1] = 'o'; write_oct_unchecked(buf.sub(2), v, digits); } digits += 2u; break; } return digits; } /** same as c4::utoa(), but pad with zeroes on the left such that the * resulting string is @p num_digits wide. The @p radix must be 2, * 8, 10 or 16. * * @note the resulting string is NOT zero-terminated. * @note it is ok to call this with an empty or too-small buffer; * no writes will occur, and the needed size will be returned * @return the number of characters required for the buffer. */ template C4_ALWAYS_INLINE size_t utoa(substr buf, T v, T radix, size_t num_digits) noexcept { C4_STATIC_ASSERT(std::is_unsigned::value); C4_ASSERT(radix == 10 || radix == 16 || radix == 2 || radix == 8); unsigned total_digits = 0; switch(radix) // NOLINT(hicpp-multiway-paths-covered) { case T(10): total_digits = digits_dec(v); total_digits = (unsigned)(num_digits > total_digits ? num_digits : total_digits); if(C4_LIKELY(buf.len >= total_digits)) write_dec(buf, v, num_digits); break; case T(16): total_digits = digits_hex(v); total_digits = 2u + (unsigned)(num_digits > total_digits ? num_digits : total_digits); if(C4_LIKELY(buf.len >= total_digits)) { buf.str[0] = '0'; buf.str[1] = 'x'; write_hex(buf.sub(2), v, num_digits); } break; case T(2): total_digits = digits_bin(v); total_digits = 2u + (unsigned)(num_digits > total_digits ? num_digits : total_digits); if(C4_LIKELY(buf.len >= total_digits)) { buf.str[0] = '0'; buf.str[1] = 'b'; write_bin(buf.sub(2), v, num_digits); } break; case T(8): total_digits = digits_oct(v); total_digits = 2u + (unsigned)(num_digits > total_digits ? num_digits : total_digits); if(C4_LIKELY(buf.len >= total_digits)) { buf.str[0] = '0'; buf.str[1] = 'o'; write_oct(buf.sub(2), v, num_digits); } break; } return total_digits; } C4_SUPPRESS_WARNING_GCC_POP /** @} */ //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /** @defgroup doc_atoi atoi: chars to signed * * @{ */ /** Convert a trimmed string to a signed integral value. The input * string can be formatted as decimal, binary (prefix 0b or 0B), octal * (prefix 0o or 0O) or hexadecimal (prefix 0x or 0X). Strings with * leading zeroes are considered as decimal and not octal (unlike the * C/C++ convention). Every character in the input string is read for * the conversion; the input string must not contain any leading or * trailing whitespace. * * @return true if the conversion was successful. * * @note a positive sign is not accepted. ie, the string must not * start with '+' * * @note overflow is not detected: the return status is true even if * the conversion would return a value outside of the type's range, in * which case the result will wrap around the type's range. This is * similar to native behavior. See @ref doc_overflows and @ref * doc_overflow_checked for overflow checking utilities. * * @see atoi_first() if the string is not trimmed to the value to read. */ template C4_NO_UBSAN_IOVRFLW C4_ALWAYS_INLINE bool atoi(csubstr str, T * C4_RESTRICT v) noexcept { C4_STATIC_ASSERT(std::is_integral::value); C4_STATIC_ASSERT(std::is_signed::value); if(C4_UNLIKELY(str.len == 0)) return false; C4_ASSERT(str.str[0] != '+'); T sign = 1; size_t start = 0; if(str.str[0] == '-') { if(C4_UNLIKELY(str.len == ++start)) return false; sign = -1; } bool parsed_ok = true; if(str.str[start] != '0') // this should be the common case, so put it first { parsed_ok = read_dec(str.sub(start), v); } else if(str.len > start + 1) { // starts with 0: is it 0x, 0o, 0b? const char pfx = str.str[start + 1]; if(pfx == 'x' || pfx == 'X') parsed_ok = str.len > start + 2 && read_hex(str.sub(start + 2), v); else if(pfx == 'b' || pfx == 'B') parsed_ok = str.len > start + 2 && read_bin(str.sub(start + 2), v); else if(pfx == 'o' || pfx == 'O') parsed_ok = str.len > start + 2 && read_oct(str.sub(start + 2), v); else parsed_ok = read_dec(str.sub(start + 1), v); } else { parsed_ok = read_dec(str.sub(start), v); } if(C4_LIKELY(parsed_ok)) *v *= sign; return parsed_ok; } /** Select the next range of characters in the string that can be parsed * as a signed integral value, and convert it using atoi(). Leading * whitespace (space, newline, tabs) is skipped. * @return the number of characters read for conversion, or csubstr::npos if the conversion failed * @see atoi() if the string is already trimmed to the value to read. * @see csubstr::first_int_span() */ template C4_ALWAYS_INLINE size_t atoi_first(csubstr str, T * C4_RESTRICT v) { csubstr trimmed = str.first_int_span(); if(trimmed.len == 0) return csubstr::npos; if(atoi(trimmed, v)) return static_cast(trimmed.end() - str.begin()); return csubstr::npos; } /** @} */ //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /** @defgroup doc_atou atou: chars to unsigned * * @{ */ /** Convert a trimmed string to an unsigned integral value. The string can be * formatted as decimal, binary (prefix 0b or 0B), octal (prefix 0o or 0O) * or hexadecimal (prefix 0x or 0X). Every character in the input string is read * for the conversion; it must not contain any leading or trailing whitespace. * * @return true if the conversion was successful. * * @note overflow is not detected: the return status is true even if * the conversion would return a value outside of the type's range, in * which case the result will wrap around the type's range. See @ref * doc_overflows and @ref doc_overflow_checked for overflow checking * utilities. * * @note If the string has a minus character, the return status * will be false. * * @see atou_first() if the string is not trimmed to the value to read. */ template bool atou(csubstr str, T * C4_RESTRICT v) noexcept { C4_STATIC_ASSERT(std::is_integral::value); if(C4_UNLIKELY(str.len == 0 || str.front() == '-')) return false; bool parsed_ok = true; if(str.str[0] != '0') { parsed_ok = read_dec(str, v); } else { if(str.len > 1) { const char pfx = str.str[1]; if(pfx == 'x' || pfx == 'X') parsed_ok = str.len > 2 && read_hex(str.sub(2), v); else if(pfx == 'b' || pfx == 'B') parsed_ok = str.len > 2 && read_bin(str.sub(2), v); else if(pfx == 'o' || pfx == 'O') parsed_ok = str.len > 2 && read_oct(str.sub(2), v); else parsed_ok = read_dec(str, v); } else { *v = 0; // we know the first character is 0 } } return parsed_ok; } /** Select the next range of characters in the string that can be parsed * as an unsigned integral value, and convert it using atou(). Leading * whitespace (space, newline, tabs) is skipped. * @return the number of characters read for conversion, or csubstr::npos if the conversion faileds * @see atou() if the string is already trimmed to the value to read. * @see csubstr::first_uint_span() */ template C4_ALWAYS_INLINE size_t atou_first(csubstr str, T *v) { csubstr trimmed = str.first_uint_span(); if(trimmed.len == 0) return csubstr::npos; if(atou(trimmed, v)) return static_cast(trimmed.end() - str.begin()); return csubstr::npos; } /** @} */ #if defined(_MSC_VER) && !defined(__clang__) # pragma warning(pop) #elif defined(__clang__) # pragma clang diagnostic pop #elif defined(__GNUC__) # pragma GCC diagnostic pop #endif //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /** @cond dev */ namespace detail { inline bool check_overflow(csubstr str, csubstr limit) noexcept { if(str.len != limit.len) return str.len > limit.len; for(size_t i = 0; i < limit.len; ++i) { if(str[i] < limit[i]) return false; else if(str[i] > limit[i]) return true; } return false; } } // namespace detail /** @endcond */ /** @defgroup doc_overflows overflows: does a number string overflow a type * * @{ */ /** Test if the following string would overflow when converted to * associated integral types; this function is dispatched with SFINAE * to handle differently signed and unsigned types. * @return true if number will overflow, false if it fits (or doesn't parse) * @see doc_overflow_checked for format specifiers to enforce no-overflow reads */ template auto overflows(csubstr str) noexcept -> typename std::enable_if::value, bool>::type { C4_STATIC_ASSERT(std::is_integral::value); if(C4_UNLIKELY(str.len == 0)) { return false; } else if(str.str[0] == '0') { if (str.len == 1) return false; switch (str.str[1]) { case 'x': case 'X': { size_t fno = str.first_not_of('0', 2); if (fno == csubstr::npos) return false; return !(str.len <= fno + (sizeof(T) * 2)); } case 'b': case 'B': { size_t fno = str.first_not_of('0', 2); if (fno == csubstr::npos) return false; return !(str.len <= fno +(sizeof(T) * 8)); } case 'o': case 'O': { size_t fno = str.first_not_of('0', 2); if(fno == csubstr::npos) return false; return detail::charconv_digits::is_oct_overflow(str.sub(fno)); } default: { size_t fno = str.first_not_of('0', 1); if(fno == csubstr::npos) return false; return detail::check_overflow(str.sub(fno), detail::charconv_digits::max_value_dec()); } } } else if(C4_UNLIKELY(str[0] == '-')) { return true; } else { return detail::check_overflow(str, detail::charconv_digits::max_value_dec()); } } /** Test if the following string would overflow when converted to * associated integral types; this function is dispatched with SFINAE * to handle differently signed and unsigned types. * * @return true if number will overflow, false if it fits (or doesn't parse) * @see doc_overflow_checked for format specifiers to enforce no-overflow reads */ template auto overflows(csubstr str) noexcept -> typename std::enable_if::value, bool>::type { C4_STATIC_ASSERT(std::is_integral::value); if(C4_UNLIKELY(str.len == 0)) return false; if(str.str[0] == '-') { if(str.str[1] == '0') { if(str.len == 2) return false; switch(str.str[2]) { case 'x': case 'X': { size_t fno = str.first_not_of('0', 3); if (fno == csubstr::npos) return false; return detail::check_overflow(str.sub(fno), detail::charconv_digits::min_value_hex()); } case 'b': case 'B': { size_t fno = str.first_not_of('0', 3); if (fno == csubstr::npos) return false; return detail::check_overflow(str.sub(fno), detail::charconv_digits::min_value_bin()); } case 'o': case 'O': { size_t fno = str.first_not_of('0', 3); if(fno == csubstr::npos) return false; return detail::check_overflow(str.sub(fno), detail::charconv_digits::min_value_oct()); } default: { size_t fno = str.first_not_of('0', 2); if(fno == csubstr::npos) return false; return detail::check_overflow(str.sub(fno), detail::charconv_digits::min_value_dec()); } } } else { return detail::check_overflow(str.sub(1), detail::charconv_digits::min_value_dec()); } } else if(str.str[0] == '0') { if (str.len == 1) return false; switch(str.str[1]) { case 'x': case 'X': { size_t fno = str.first_not_of('0', 2); if (fno == csubstr::npos) return false; const size_t len = str.len - fno; return !((len < sizeof (T) * 2) || (len == sizeof(T) * 2 && str[fno] <= '7')); } case 'b': case 'B': { size_t fno = str.first_not_of('0', 2); if (fno == csubstr::npos) return false; return !(str.len <= fno + (sizeof(T) * 8 - 1)); } case 'o': case 'O': { size_t fno = str.first_not_of('0', 2); if(fno == csubstr::npos) return false; return detail::charconv_digits::is_oct_overflow(str.sub(fno)); } default: { size_t fno = str.first_not_of('0', 1); if(fno == csubstr::npos) return false; return detail::check_overflow(str.sub(fno), detail::charconv_digits::max_value_dec()); } } } else { return detail::check_overflow(str, detail::charconv_digits::max_value_dec()); } } /** @} */ //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /** @cond dev */ namespace detail { #if (!C4CORE_HAVE_STD_FROMCHARS) /** @see http://www.exploringbinary.com/ for many good examples on float-str conversion */ template void get_real_format_str(char (& C4_RESTRICT fmt)[N], int precision, RealFormat_e formatting, const char* length_modifier="") { int iret; if(precision == -1) iret = snprintf(fmt, sizeof(fmt), "%%%s%c", length_modifier, formatting); else if(precision == 0) iret = snprintf(fmt, sizeof(fmt), "%%.%s%c", length_modifier, formatting); else iret = snprintf(fmt, sizeof(fmt), "%%.%d%s%c", precision, length_modifier, formatting); C4_ASSERT(iret >= 2 && size_t(iret) < sizeof(fmt)); C4_UNUSED(iret); } /** @todo we're depending on snprintf()/sscanf() for converting to/from * floating point numbers. Apparently, this increases the binary size * by a considerable amount. There are some lightweight printf * implementations: * * @see http://www.sparetimelabs.com/tinyprintf/tinyprintf.php (BSD) * @see https://github.com/weiss/c99-snprintf * @see https://github.com/nothings/stb/blob/master/stb_sprintf.h * @see http://www.exploringbinary.com/ * @see https://blog.benoitblanchon.fr/lightweight-float-to-string/ * @see http://www.ryanjuckett.com/programming/printing-floating-point-numbers/ */ template size_t print_one(substr str, const char* full_fmt, T v) { #ifdef _MSC_VER /** use _snprintf() to prevent early termination of the output * for writing the null character at the last position * @see https://msdn.microsoft.com/en-us/library/2ts7cx93.aspx */ int iret = _snprintf(str.str, str.len, full_fmt, v); if(iret < 0) { /* when buf.len is not enough, VS returns a negative value. * so call it again with a negative value for getting an * actual length of the string */ iret = snprintf(nullptr, 0, full_fmt, v); C4_ASSERT(iret > 0); } size_t ret = (size_t) iret; return ret; #else int iret = snprintf(str.str, str.len, full_fmt, v); C4_ASSERT(iret >= 0); size_t ret = (size_t) iret; if(ret >= str.len) ++ret; /* snprintf() reserves the last character to write \0 */ return ret; #endif } #endif // (!C4CORE_HAVE_STD_FROMCHARS) #if (!C4CORE_HAVE_STD_FROMCHARS) && (!C4CORE_HAVE_FAST_FLOAT) /** scans a string using the given type format, while at the same time * allowing non-null-terminated strings AND guaranteeing that the given * string length is strictly respected, so that no buffer overflows * might occur. */ template inline size_t scan_one(csubstr str, const char *type_fmt, T *v) { /* snscanf() is absolutely needed here as we must be sure that * str.len is strictly respected, because substr is * generally not null-terminated. * * Alas, there is no snscanf(). * * So we fake it by using a dynamic format with an explicit * field size set to the length of the given span. * This trick is taken from: * https://stackoverflow.com/a/18368910/5875572 */ /* this is the actual format we'll use for scanning */ char fmt[16]; /* write the length into it. Eg "%12f". * Also, get the number of characters read from the string. * So the final format ends up as "%12f%n"*/ int iret = std::snprintf(fmt, sizeof(fmt), "%%" "%zu" "%s" "%%n", str.len, type_fmt); /* no nasty surprises, please! */ C4_ASSERT(iret >= 0 && size_t(iret) < C4_COUNTOF(fmt)); /* now we scan with confidence that the span length is respected */ int num_chars; iret = std::sscanf(str.str, fmt, v, &num_chars); /* scanf returns the number of successful conversions */ if(iret != 1) return csubstr::npos; C4_ASSERT(num_chars >= 0); return (size_t)(num_chars); } #endif // (!C4CORE_HAVE_STD_FROMCHARS) && (!C4CORE_HAVE_FAST_FLOAT) #if C4CORE_HAVE_STD_TOCHARS template C4_ALWAYS_INLINE size_t rtoa(substr buf, T v, int precision=-1, RealFormat_e formatting=FTOA_FLEX) noexcept { std::to_chars_result result; size_t pos = 0; if(formatting == FTOA_HEXA) { if(buf.len > size_t(2)) { buf.str[0] = '0'; buf.str[1] = 'x'; } pos += size_t(2); } if(precision == -1) result = std::to_chars(buf.str + pos, buf.str + buf.len, v, (std::chars_format)formatting); else result = std::to_chars(buf.str + pos, buf.str + buf.len, v, (std::chars_format)formatting, precision); if(result.ec == std::errc()) { // all good, no errors. C4_ASSERT(result.ptr >= buf.str); ptrdiff_t delta = result.ptr - buf.str; return static_cast(delta); } C4_ASSERT(result.ec == std::errc::value_too_large); // This is unfortunate. // // When the result can't fit in the given buffer, // std::to_chars() returns the end pointer it was originally // given, which is useless because here we would like to know // _exactly_ how many characters the buffer must have to fit // the result. // // So we take the pessimistic view, and assume as many digits // as could ever be required: size_t ret = static_cast(std::numeric_limits::max_digits10); return ret > buf.len ? ret : buf.len + 1; } #endif // C4CORE_HAVE_STD_TOCHARS #if C4CORE_HAVE_FAST_FLOAT template C4_ALWAYS_INLINE bool scan_rhex(csubstr s, T *C4_RESTRICT val) noexcept { C4_ASSERT(s.len > 0); C4_ASSERT(s.str[0] != '-'); C4_ASSERT(s.str[0] != '+'); C4_ASSERT(!s.begins_with("0x")); C4_ASSERT(!s.begins_with("0X")); size_t pos = 0; // integer part for( ; pos < s.len; ++pos) { const char c = s.str[pos]; if(c >= '0' && c <= '9') *val = *val * T(16) + T(c - '0'); else if(c >= 'a' && c <= 'f') *val = *val * T(16) + T(c - 'a'); else if(c >= 'A' && c <= 'F') *val = *val * T(16) + T(c - 'A'); else if(c == '.') { ++pos; break; // follow on to mantissa } else if(c == 'p' || c == 'P') { ++pos; goto power; // no mantissa given, jump to power // NOLINT } else { return false; } } // mantissa { // 0.0625 == 1/16 == value of first digit after the comma for(T digit = T(0.0625); pos < s.len; ++pos, digit /= T(16)) // NOLINT { const char c = s.str[pos]; if(c >= '0' && c <= '9') *val += digit * T(c - '0'); else if(c >= 'a' && c <= 'f') *val += digit * T(c - 'a'); else if(c >= 'A' && c <= 'F') *val += digit * T(c - 'A'); else if(c == 'p' || c == 'P') { ++pos; goto power; // mantissa finished, jump to power // NOLINT } else { return false; } } } return true; power: if(C4_LIKELY(pos < s.len)) { if(s.str[pos] == '+') // atoi() cannot handle a leading '+' ++pos; if(C4_LIKELY(pos < s.len)) { int16_t powval = {}; if(C4_LIKELY(atoi(s.sub(pos), &powval))) { *val *= ipow(powval); return true; } } } return false; } #endif } // namespace detail /** @endcond */ #undef _c4appendhex #undef _c4append /** @defgroup doc_ftoa ftoa: float32 to chars * * @{ */ /** Convert a single-precision real number to string. The string will * in general be NOT null-terminated. For FTOA_FLEX, \p precision is * the number of significand digits. Otherwise \p precision is the * number of decimals. It is safe to call this function with an empty * or too-small buffer. * * @return the size of the buffer needed to write the number */ C4_ALWAYS_INLINE size_t ftoa(substr str, float v, int precision=-1, RealFormat_e formatting=FTOA_FLEX) noexcept { #if C4CORE_HAVE_STD_TOCHARS return detail::rtoa(str, v, precision, formatting); #else char fmt[16]; detail::get_real_format_str(fmt, precision, formatting, /*length_modifier*/""); return detail::print_one(str, fmt, v); #endif } /** @} */ /** @defgroup doc_dtoa dtoa: float64 to chars * * @{ */ /** Convert a double-precision real number to string. The string will * in general be NOT null-terminated. For FTOA_FLEX, \p precision is * the number of significand digits. Otherwise \p precision is the * number of decimals. It is safe to call this function with an empty * or too-small buffer. * * @return the size of the buffer needed to write the number */ C4_ALWAYS_INLINE size_t dtoa(substr str, double v, int precision=-1, RealFormat_e formatting=FTOA_FLEX) noexcept { #if C4CORE_HAVE_STD_TOCHARS return detail::rtoa(str, v, precision, formatting); #else char fmt[16]; detail::get_real_format_str(fmt, precision, formatting, /*length_modifier*/"l"); return detail::print_one(str, fmt, v); #endif } /** @} */ /** @defgroup doc_atof atof: chars to float32 * * @{ */ /** Convert a string to a single precision real number. * The input string must be trimmed to the value, ie * no leading or trailing whitespace can be present. * @return true iff the conversion succeeded * @see atof_first() if the string is not trimmed */ C4_ALWAYS_INLINE bool atof(csubstr str, float * C4_RESTRICT v) noexcept { C4_ASSERT(str.len > 0); C4_ASSERT(str.triml(" \r\t\n").len == str.len); #if C4CORE_HAVE_FAST_FLOAT // fastfloat cannot parse hexadecimal floats bool isneg = (str.str[0] == '-'); csubstr rem = str.sub(isneg || str.str[0] == '+'); if(!(rem.len >= 2 && (rem.str[0] == '0' && (rem.str[1] == 'x' || rem.str[1] == 'X')))) { fast_float::from_chars_result result; result = fast_float::from_chars(str.str, str.str + str.len, *v); return result.ec == std::errc(); } else if(detail::scan_rhex(rem.sub(2), v)) { *v *= isneg ? -1.f : 1.f; return true; } return false; #elif C4CORE_HAVE_STD_FROMCHARS std::from_chars_result result; result = std::from_chars(str.str, str.str + str.len, *v); return result.ec == std::errc(); #else csubstr rem = str.sub(str.str[0] == '-' || str.str[0] == '+'); if(!(rem.len >= 2 && (rem.str[0] == '0' && (rem.str[1] == 'x' || rem.str[1] == 'X')))) return detail::scan_one(str, "f", v) != csubstr::npos; else return detail::scan_one(str, "a", v) != csubstr::npos; #endif } /** Convert a string to a single precision real number. * Leading whitespace is skipped until valid characters are found. * @return the number of characters read from the string, or npos if * conversion was not successful or if the string was empty */ inline size_t atof_first(csubstr str, float * C4_RESTRICT v) noexcept { csubstr trimmed = str.first_real_span(); if(trimmed.len == 0) return csubstr::npos; if(atof(trimmed, v)) return static_cast(trimmed.end() - str.begin()); return csubstr::npos; } /** @} */ /** @defgroup doc_atod atod: chars to float64 * * @{ */ /** Convert a string to a double precision real number. * The input string must be trimmed to the value, ie * no leading or trailing whitespace can be present. * @return true iff the conversion succeeded * @see atod_first() if the string is not trimmed */ C4_ALWAYS_INLINE bool atod(csubstr str, double * C4_RESTRICT v) noexcept { C4_ASSERT(str.len > 0); C4_ASSERT(str.triml(" \r\t\n").len == str.len); #if C4CORE_HAVE_FAST_FLOAT // fastfloat cannot parse hexadecimal floats bool isneg = (str.str[0] == '-'); csubstr rem = str.sub(isneg || str.str[0] == '+'); if(!(rem.len >= 2 && (rem.str[0] == '0' && (rem.str[1] == 'x' || rem.str[1] == 'X')))) { fast_float::from_chars_result result; result = fast_float::from_chars(str.str, str.str + str.len, *v); return result.ec == std::errc(); } else if(detail::scan_rhex(rem.sub(2), v)) { *v *= isneg ? -1. : 1.; return true; } return false; #elif C4CORE_HAVE_STD_FROMCHARS std::from_chars_result result; result = std::from_chars(str.str, str.str + str.len, *v); return result.ec == std::errc(); #else csubstr rem = str.sub(str.str[0] == '-' || str.str[0] == '+'); if(!(rem.len >= 2 && (rem.str[0] == '0' && (rem.str[1] == 'x' || rem.str[1] == 'X')))) return detail::scan_one(str, "lf", v) != csubstr::npos; else return detail::scan_one(str, "la", v) != csubstr::npos; #endif } /** Convert a string to a double precision real number. * Leading whitespace is skipped until valid characters are found. * @return the number of characters read from the string, or npos if * conversion was not successful or if the string was empty */ inline size_t atod_first(csubstr str, double * C4_RESTRICT v) noexcept { csubstr trimmed = str.first_real_span(); if(trimmed.len == 0) return csubstr::npos; if(atod(trimmed, v)) return static_cast(trimmed.end() - str.begin()); return csubstr::npos; } /** @} */ //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // generic versions /** @cond dev */ // on some platforms, (unsigned) int and (unsigned) long // are not any of the fixed length types above #define _C4_IF_NOT_FIXED_LENGTH_I(T, ty) typename std::enable_if::value && !is_fixed_length::value_i, ty> #define _C4_IF_NOT_FIXED_LENGTH_U(T, ty) typename std::enable_if::value && !is_fixed_length::value_u, ty> /** @endcond*/ /** @defgroup doc_xtoa xtoa: generic value to chars * * Dispatches to the most appropriate and efficient conversion * function * * @{ */ C4_ALWAYS_INLINE size_t xtoa(substr s, uint8_t v) noexcept { return write_dec(s, v); } C4_ALWAYS_INLINE size_t xtoa(substr s, uint16_t v) noexcept { return write_dec(s, v); } C4_ALWAYS_INLINE size_t xtoa(substr s, uint32_t v) noexcept { return write_dec(s, v); } C4_ALWAYS_INLINE size_t xtoa(substr s, uint64_t v) noexcept { return write_dec(s, v); } C4_ALWAYS_INLINE size_t xtoa(substr s, int8_t v) noexcept { return itoa(s, v); } C4_ALWAYS_INLINE size_t xtoa(substr s, int16_t v) noexcept { return itoa(s, v); } C4_ALWAYS_INLINE size_t xtoa(substr s, int32_t v) noexcept { return itoa(s, v); } C4_ALWAYS_INLINE size_t xtoa(substr s, int64_t v) noexcept { return itoa(s, v); } C4_ALWAYS_INLINE size_t xtoa(substr s, float v) noexcept { return ftoa(s, v); } C4_ALWAYS_INLINE size_t xtoa(substr s, double v) noexcept { return dtoa(s, v); } C4_ALWAYS_INLINE size_t xtoa(substr s, uint8_t v, uint8_t radix) noexcept { return utoa(s, v, radix); } C4_ALWAYS_INLINE size_t xtoa(substr s, uint16_t v, uint16_t radix) noexcept { return utoa(s, v, radix); } C4_ALWAYS_INLINE size_t xtoa(substr s, uint32_t v, uint32_t radix) noexcept { return utoa(s, v, radix); } C4_ALWAYS_INLINE size_t xtoa(substr s, uint64_t v, uint64_t radix) noexcept { return utoa(s, v, radix); } C4_ALWAYS_INLINE size_t xtoa(substr s, int8_t v, int8_t radix) noexcept { return itoa(s, v, radix); } C4_ALWAYS_INLINE size_t xtoa(substr s, int16_t v, int16_t radix) noexcept { return itoa(s, v, radix); } C4_ALWAYS_INLINE size_t xtoa(substr s, int32_t v, int32_t radix) noexcept { return itoa(s, v, radix); } C4_ALWAYS_INLINE size_t xtoa(substr s, int64_t v, int64_t radix) noexcept { return itoa(s, v, radix); } C4_ALWAYS_INLINE size_t xtoa(substr s, uint8_t v, uint8_t radix, size_t num_digits) noexcept { return utoa(s, v, radix, num_digits); } C4_ALWAYS_INLINE size_t xtoa(substr s, uint16_t v, uint16_t radix, size_t num_digits) noexcept { return utoa(s, v, radix, num_digits); } C4_ALWAYS_INLINE size_t xtoa(substr s, uint32_t v, uint32_t radix, size_t num_digits) noexcept { return utoa(s, v, radix, num_digits); } C4_ALWAYS_INLINE size_t xtoa(substr s, uint64_t v, uint64_t radix, size_t num_digits) noexcept { return utoa(s, v, radix, num_digits); } C4_ALWAYS_INLINE size_t xtoa(substr s, int8_t v, int8_t radix, size_t num_digits) noexcept { return itoa(s, v, radix, num_digits); } C4_ALWAYS_INLINE size_t xtoa(substr s, int16_t v, int16_t radix, size_t num_digits) noexcept { return itoa(s, v, radix, num_digits); } C4_ALWAYS_INLINE size_t xtoa(substr s, int32_t v, int32_t radix, size_t num_digits) noexcept { return itoa(s, v, radix, num_digits); } C4_ALWAYS_INLINE size_t xtoa(substr s, int64_t v, int64_t radix, size_t num_digits) noexcept { return itoa(s, v, radix, num_digits); } C4_ALWAYS_INLINE size_t xtoa(substr s, float v, int precision, RealFormat_e formatting=FTOA_FLEX) noexcept { return ftoa(s, v, precision, formatting); } C4_ALWAYS_INLINE size_t xtoa(substr s, double v, int precision, RealFormat_e formatting=FTOA_FLEX) noexcept { return dtoa(s, v, precision, formatting); } template C4_ALWAYS_INLINE auto xtoa(substr buf, T v) noexcept -> _C4_IF_NOT_FIXED_LENGTH_I(T, size_t)::type { return itoa(buf, v); } template C4_ALWAYS_INLINE auto xtoa(substr buf, T v) noexcept -> _C4_IF_NOT_FIXED_LENGTH_U(T, size_t)::type { return write_dec(buf, v); } template C4_ALWAYS_INLINE size_t xtoa(substr s, T *v) noexcept { return itoa(s, (intptr_t)v, (intptr_t)16); } /** @} */ /** @defgroup doc_atox atox: generic chars to value * * Dispatches to the most appropriate and efficient conversion * function * * @{ */ C4_ALWAYS_INLINE bool atox(csubstr s, uint8_t *C4_RESTRICT v) noexcept { return atou(s, v); } C4_ALWAYS_INLINE bool atox(csubstr s, uint16_t *C4_RESTRICT v) noexcept { return atou(s, v); } C4_ALWAYS_INLINE bool atox(csubstr s, uint32_t *C4_RESTRICT v) noexcept { return atou(s, v); } C4_ALWAYS_INLINE bool atox(csubstr s, uint64_t *C4_RESTRICT v) noexcept { return atou(s, v); } C4_ALWAYS_INLINE bool atox(csubstr s, int8_t *C4_RESTRICT v) noexcept { return atoi(s, v); } C4_ALWAYS_INLINE bool atox(csubstr s, int16_t *C4_RESTRICT v) noexcept { return atoi(s, v); } C4_ALWAYS_INLINE bool atox(csubstr s, int32_t *C4_RESTRICT v) noexcept { return atoi(s, v); } C4_ALWAYS_INLINE bool atox(csubstr s, int64_t *C4_RESTRICT v) noexcept { return atoi(s, v); } C4_ALWAYS_INLINE bool atox(csubstr s, float *C4_RESTRICT v) noexcept { return atof(s, v); } C4_ALWAYS_INLINE bool atox(csubstr s, double *C4_RESTRICT v) noexcept { return atod(s, v); } template C4_ALWAYS_INLINE auto atox(csubstr buf, T *C4_RESTRICT v) noexcept -> _C4_IF_NOT_FIXED_LENGTH_I(T, bool)::type { return atoi(buf, v); } template C4_ALWAYS_INLINE auto atox(csubstr buf, T *C4_RESTRICT v) noexcept -> _C4_IF_NOT_FIXED_LENGTH_U(T, bool)::type { return atou(buf, v); } template C4_ALWAYS_INLINE bool atox(csubstr s, T **v) noexcept { intptr_t tmp; bool ret = atox(s, &tmp); if(ret) { *v = (T*)tmp; } return ret; } /** @} */ /** @defgroup doc_to_chars to_chars: generalized chars to value * * Convert the given value, writing into the string. The resulting * string will NOT be null-terminated. Return the number of * characters needed. This function is safe to call when the string * is too small - no writes will occur beyond the string's last * character. * * Dispatches to the most appropriate and efficient conversion * function. * * @see write_dec, doc_utoa, doc_itoa, doc_ftoa, doc_dtoa * * @warning When serializing floating point values (float or double), * be aware that because it uses defaults, to_chars() may cause a * truncation of the precision. To enforce a particular precision, use * for example @ref c4::fmt::real, or call directly @ref c4::ftoa or * @ref c4::dtoa. * * @{ */ C4_ALWAYS_INLINE size_t to_chars(substr buf, uint8_t v) noexcept { return write_dec(buf, v); } C4_ALWAYS_INLINE size_t to_chars(substr buf, uint16_t v) noexcept { return write_dec(buf, v); } C4_ALWAYS_INLINE size_t to_chars(substr buf, uint32_t v) noexcept { return write_dec(buf, v); } C4_ALWAYS_INLINE size_t to_chars(substr buf, uint64_t v) noexcept { return write_dec(buf, v); } C4_ALWAYS_INLINE size_t to_chars(substr buf, int8_t v) noexcept { return itoa(buf, v); } C4_ALWAYS_INLINE size_t to_chars(substr buf, int16_t v) noexcept { return itoa(buf, v); } C4_ALWAYS_INLINE size_t to_chars(substr buf, int32_t v) noexcept { return itoa(buf, v); } C4_ALWAYS_INLINE size_t to_chars(substr buf, int64_t v) noexcept { return itoa(buf, v); } C4_ALWAYS_INLINE size_t to_chars(substr buf, float v) noexcept { return ftoa(buf, v); } C4_ALWAYS_INLINE size_t to_chars(substr buf, double v) noexcept { return dtoa(buf, v); } template C4_ALWAYS_INLINE auto to_chars(substr buf, T v) noexcept -> _C4_IF_NOT_FIXED_LENGTH_I(T, size_t)::type { return itoa(buf, v); } template C4_ALWAYS_INLINE auto to_chars(substr buf, T v) noexcept -> _C4_IF_NOT_FIXED_LENGTH_U(T, size_t)::type { return write_dec(buf, v); } template C4_ALWAYS_INLINE size_t to_chars(substr s, T *v) noexcept { return itoa(s, (intptr_t)v, (intptr_t)16); } /** @} */ /** @defgroup doc_from_chars from_chars: generalized chars to value * * Read a value from the string, which must be trimmed to the value * (ie, no leading/trailing whitespace). return true if the * conversion succeeded. There is no check for overflow; the value * wraps around in a way similar to the standard C/C++ overflow * behavior. For example, from_chars("128", &val) returns true * and val will be set tot 0. See @ref doc_overflows and @ref * doc_overflow_checked for facilities enforcing no-overflow. * * Dispatches to the most appropriate and efficient conversion * function * * @see doc_from_chars_first, atou, atoi, atof, atod * @{ */ C4_ALWAYS_INLINE bool from_chars(csubstr buf, uint8_t *C4_RESTRICT v) noexcept { return atou(buf, v); } C4_ALWAYS_INLINE bool from_chars(csubstr buf, uint16_t *C4_RESTRICT v) noexcept { return atou(buf, v); } C4_ALWAYS_INLINE bool from_chars(csubstr buf, uint32_t *C4_RESTRICT v) noexcept { return atou(buf, v); } C4_ALWAYS_INLINE bool from_chars(csubstr buf, uint64_t *C4_RESTRICT v) noexcept { return atou(buf, v); } C4_ALWAYS_INLINE bool from_chars(csubstr buf, int8_t *C4_RESTRICT v) noexcept { return atoi(buf, v); } C4_ALWAYS_INLINE bool from_chars(csubstr buf, int16_t *C4_RESTRICT v) noexcept { return atoi(buf, v); } C4_ALWAYS_INLINE bool from_chars(csubstr buf, int32_t *C4_RESTRICT v) noexcept { return atoi(buf, v); } C4_ALWAYS_INLINE bool from_chars(csubstr buf, int64_t *C4_RESTRICT v) noexcept { return atoi(buf, v); } C4_ALWAYS_INLINE bool from_chars(csubstr buf, float *C4_RESTRICT v) noexcept { return atof(buf, v); } C4_ALWAYS_INLINE bool from_chars(csubstr buf, double *C4_RESTRICT v) noexcept { return atod(buf, v); } template C4_ALWAYS_INLINE auto from_chars(csubstr buf, T *C4_RESTRICT v) noexcept -> _C4_IF_NOT_FIXED_LENGTH_I(T, bool)::type { return atoi(buf, v); } template C4_ALWAYS_INLINE auto from_chars(csubstr buf, T *C4_RESTRICT v) noexcept -> _C4_IF_NOT_FIXED_LENGTH_U(T, bool)::type { return atou(buf, v); } template C4_ALWAYS_INLINE bool from_chars(csubstr buf, T **v) noexcept { intptr_t tmp; bool ret = from_chars(buf, &tmp); if(ret) { *v = (T*)tmp; } return ret; } /** @defgroup doc_from_chars_first from_chars_first: generalized chars to value * * Read the first valid sequence of characters from the string, * skipping leading whitespace, and convert it using @ref doc_from_chars . * Return the number of characters read for converting. * * Dispatches to the most appropriate and efficient conversion * function. * * @see atou_first, atoi_first, atof_first, atod_first * @{ */ C4_ALWAYS_INLINE size_t from_chars_first(csubstr buf, uint8_t *C4_RESTRICT v) noexcept { return atou_first(buf, v); } C4_ALWAYS_INLINE size_t from_chars_first(csubstr buf, uint16_t *C4_RESTRICT v) noexcept { return atou_first(buf, v); } C4_ALWAYS_INLINE size_t from_chars_first(csubstr buf, uint32_t *C4_RESTRICT v) noexcept { return atou_first(buf, v); } C4_ALWAYS_INLINE size_t from_chars_first(csubstr buf, uint64_t *C4_RESTRICT v) noexcept { return atou_first(buf, v); } C4_ALWAYS_INLINE size_t from_chars_first(csubstr buf, int8_t *C4_RESTRICT v) noexcept { return atoi_first(buf, v); } C4_ALWAYS_INLINE size_t from_chars_first(csubstr buf, int16_t *C4_RESTRICT v) noexcept { return atoi_first(buf, v); } C4_ALWAYS_INLINE size_t from_chars_first(csubstr buf, int32_t *C4_RESTRICT v) noexcept { return atoi_first(buf, v); } C4_ALWAYS_INLINE size_t from_chars_first(csubstr buf, int64_t *C4_RESTRICT v) noexcept { return atoi_first(buf, v); } C4_ALWAYS_INLINE size_t from_chars_first(csubstr buf, float *C4_RESTRICT v) noexcept { return atof_first(buf, v); } C4_ALWAYS_INLINE size_t from_chars_first(csubstr buf, double *C4_RESTRICT v) noexcept { return atod_first(buf, v); } template C4_ALWAYS_INLINE auto from_chars_first(csubstr buf, T *C4_RESTRICT v) noexcept -> _C4_IF_NOT_FIXED_LENGTH_I(T, size_t)::type { return atoi_first(buf, v); } template C4_ALWAYS_INLINE auto from_chars_first(csubstr buf, T *C4_RESTRICT v) noexcept -> _C4_IF_NOT_FIXED_LENGTH_U(T, size_t)::type { return atou_first(buf, v); } template C4_ALWAYS_INLINE size_t from_chars_first(csubstr buf, T **v) noexcept { intptr_t tmp; bool ret = from_chars_first(buf, &tmp); if(ret) { *v = (T*)tmp; } return ret; } /** @} */ /** @} */ #undef _C4_IF_NOT_FIXED_LENGTH_I #undef _C4_IF_NOT_FIXED_LENGTH_U //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /** call to_chars() and return a substr consisting of the * written portion of the input buffer. Ie, same as to_chars(), * but return a substr instead of a size_t. * Convert the given value to a string using to_chars(), and * return the resulting string, up to and including the last * written character. * @ingroup doc_to_chars * @see to_chars() */ template C4_ALWAYS_INLINE substr to_chars_sub(substr buf, T const& C4_RESTRICT v) noexcept { size_t sz = to_chars(buf, v); return buf.left_of(sz <= buf.len ? sz : buf.len); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // bool implementation /** @ingroup doc_to_chars */ C4_ALWAYS_INLINE size_t to_chars(substr buf, bool v) noexcept { int val = v; return to_chars(buf, val); } /** @ingroup doc_from_chars */ inline bool from_chars(csubstr buf, bool * C4_RESTRICT v) noexcept { if(buf == '0') { *v = false; return true; } else if(buf == '1') { *v = true; return true; } else if(buf == "false") { *v = false; return true; } else if(buf == "true") { *v = true; return true; } else if(buf == "False") { *v = false; return true; } else if(buf == "True") { *v = true; return true; } else if(buf == "FALSE") { *v = false; return true; } else if(buf == "TRUE") { *v = true; return true; } // fallback to c-style int bools int val = 0; bool ret = from_chars(buf, &val); if(C4_LIKELY(ret)) { *v = (val != 0); } return ret; } /** @ingroup doc_from_chars_first */ inline size_t from_chars_first(csubstr buf, bool * C4_RESTRICT v) noexcept { csubstr trimmed = buf.first_non_empty_span(); if(trimmed.len == 0 || !from_chars(buf, v)) return csubstr::npos; return trimmed.len; } //----------------------------------------------------------------------------- // single-char implementation /** @ingroup doc_to_chars */ inline size_t to_chars(substr buf, char v) noexcept { if(buf.len > 0) { C4_XASSERT(buf.str); buf.str[0] = v; } return 1; } /** extract a single character from a substring * @note to extract a string instead and not just a single character, use the csubstr overload * @ingroup doc_from_chars * */ inline bool from_chars(csubstr buf, char * C4_RESTRICT v) noexcept { if(buf.len != 1) return false; C4_XASSERT(buf.str); *v = buf.str[0]; return true; } /** @ingroup doc_from_chars_first */ inline size_t from_chars_first(csubstr buf, char * C4_RESTRICT v) noexcept { if(buf.len < 1) return csubstr::npos; *v = buf.str[0]; return 1; } //----------------------------------------------------------------------------- // csubstr implementation /** @ingroup doc_to_chars */ inline size_t to_chars(substr buf, csubstr v) noexcept { C4_ASSERT(!buf.overlaps(v)); size_t len = buf.len < v.len ? buf.len : v.len; // calling memcpy with null strings is undefined behavior // and will wreak havoc in calling code's branches. // see https://github.com/biojppm/rapidyaml/pull/264#issuecomment-1262133637 if(len) { C4_ASSERT(buf.str != nullptr); C4_ASSERT(v.str != nullptr); memcpy(buf.str, v.str, len); } return v.len; } /** @ingroup doc_from_chars */ inline bool from_chars(csubstr buf, csubstr *C4_RESTRICT v) noexcept { *v = buf; return true; } /** @ingroup doc_from_chars_first */ inline size_t from_chars_first(substr buf, csubstr * C4_RESTRICT v) noexcept { csubstr trimmed = buf.first_non_empty_span(); if(trimmed.len == 0) return csubstr::npos; *v = trimmed; return static_cast(trimmed.end() - buf.begin()); } //----------------------------------------------------------------------------- // substr /** @ingroup doc_to_chars */ inline size_t to_chars(substr buf, substr v) noexcept { C4_ASSERT(!buf.overlaps(v)); size_t len = buf.len < v.len ? buf.len : v.len; // calling memcpy with null strings is undefined behavior // and will wreak havoc in calling code's branches. // see https://github.com/biojppm/rapidyaml/pull/264#issuecomment-1262133637 if(len) { C4_ASSERT(buf.str != nullptr); C4_ASSERT(v.str != nullptr); memcpy(buf.str, v.str, len); } return v.len; } /** @ingroup doc_from_chars */ inline bool from_chars(csubstr buf, substr * C4_RESTRICT v) noexcept { C4_ASSERT(!buf.overlaps(*v)); // is the destination buffer wide enough? if(v->len >= buf.len) { // calling memcpy with null strings is undefined behavior // and will wreak havoc in calling code's branches. // see https://github.com/biojppm/rapidyaml/pull/264#issuecomment-1262133637 if(buf.len) { C4_ASSERT(buf.str != nullptr); C4_ASSERT(v->str != nullptr); memcpy(v->str, buf.str, buf.len); } v->len = buf.len; return true; } return false; } /** @ingroup doc_from_chars_first */ inline size_t from_chars_first(csubstr buf, substr * C4_RESTRICT v) noexcept { csubstr trimmed = buf.first_non_empty_span(); C4_ASSERT(!trimmed.overlaps(*v)); if(C4_UNLIKELY(trimmed.len == 0)) return csubstr::npos; size_t len = trimmed.len > v->len ? v->len : trimmed.len; // calling memcpy with null strings is undefined behavior // and will wreak havoc in calling code's branches. // see https://github.com/biojppm/rapidyaml/pull/264#issuecomment-1262133637 if(len) { C4_ASSERT(buf.str != nullptr); C4_ASSERT(v->str != nullptr); memcpy(v->str, trimmed.str, len); } if(C4_UNLIKELY(trimmed.len > v->len)) return csubstr::npos; return static_cast(trimmed.end() - buf.begin()); } //----------------------------------------------------------------------------- /** @ingroup doc_to_chars */ template inline size_t to_chars(substr buf, const char (& C4_RESTRICT v)[N]) noexcept { csubstr sp(v); return to_chars(buf, sp); } /** @ingroup doc_to_chars */ inline size_t to_chars(substr buf, const char * C4_RESTRICT v) noexcept { return to_chars(buf, to_csubstr(v)); } /** @} */ } // namespace c4 // NOLINTEND(hicpp-signed-bitwise) #if defined(_MSC_VER) && !defined(__clang__) # pragma warning(pop) #elif defined(__clang__) # pragma clang diagnostic pop #elif defined(__GNUC__) # pragma GCC diagnostic pop #endif #endif /* _C4_CHARCONV_HPP_ */ c4core-0.2.6/src/c4/common.hpp000066400000000000000000000004371477602032300160040ustar00rootroot00000000000000#ifndef _C4_COMMON_HPP_ #define _C4_COMMON_HPP_ #include "c4/config.hpp" #include "c4/preprocessor.hpp" #include "c4/platform.hpp" #include "c4/cpu.hpp" #include "c4/compiler.hpp" #include "c4/language.hpp" #include "c4/error.hpp" #include "c4/types.hpp" #endif /* _C4_COMMON_HPP_ */ c4core-0.2.6/src/c4/compiler.hpp000066400000000000000000000105711477602032300163260ustar00rootroot00000000000000#ifndef _C4_COMPILER_HPP_ #define _C4_COMPILER_HPP_ /** @file compiler.hpp Provides compiler information macros * @ingroup basic_headers */ #include "c4/platform.hpp" // Compilers: // C4_MSVC // Visual Studio 2022: MSVC++ 17, 1930 // Visual Studio 2019: MSVC++ 16, 1920 // Visual Studio 2017: MSVC++ 15 // Visual Studio 2015: MSVC++ 14 // Visual Studio 2013: MSVC++ 13 // Visual Studio 2013: MSVC++ 12 // Visual Studio 2012: MSVC++ 11 // Visual Studio 2010: MSVC++ 10 // Visual Studio 2008: MSVC++ 09 // Visual Studio 2005: MSVC++ 08 // C4_CLANG // C4_GCC // C4_ICC (intel compiler) /** @see http://sourceforge.net/p/predef/wiki/Compilers/ for a list of compiler identifier macros */ /** @see https://msdn.microsoft.com/en-us/library/b0084kay.aspx for VS2013 predefined macros */ #if defined(_MSC_VER) && !defined(__clang__) # define C4_MSVC # define C4_MSVC_VERSION_2022 17 # define C4_MSVC_VERSION_2019 16 # define C4_MSVC_VERSION_2017 15 # define C4_MSVC_VERSION_2015 14 # define C4_MSVC_VERSION_2013 12 # define C4_MSVC_VERSION_2012 11 # if _MSC_VER >= 1930 # define C4_MSVC_VERSION C4_MSVC_VERSION_2022 // visual studio 2022 # define C4_MSVC_2022 # elif _MSC_VER >= 1920 # define C4_MSVC_VERSION C4_MSVC_VERSION_2019 // visual studio 2019 # define C4_MSVC_2019 # elif _MSC_VER >= 1910 # define C4_MSVC_VERSION C4_MSVC_VERSION_2017 // visual studio 2017 # define C4_MSVC_2017 # elif _MSC_VER == 1900 # define C4_MSVC_VERSION C4_MSVC_VERSION_2015 // visual studio 2015 # define C4_MSVC_2015 # elif _MSC_VER == 1800 # error "MSVC version not supported" # define C4_MSVC_VERSION C4_MSVC_VERSION_2013 // visual studio 2013 # define C4_MSVC_2013 # elif _MSC_VER == 1700 # error "MSVC version not supported" # define C4_MSVC_VERSION C4_MSVC_VERSION_2012 // visual studio 2012 # define C4_MSVC_2012 # elif _MSC_VER == 1600 # error "MSVC version not supported" # define C4_MSVC_VERSION 10 // visual studio 2010 # define C4_MSVC_2010 # elif _MSC_VER == 1500 # error "MSVC version not supported" # define C4_MSVC_VERSION 09 // visual studio 2008 # define C4_MSVC_2008 # elif _MSC_VER == 1400 # error "MSVC version not supported" # define C4_MSVC_VERSION 08 // visual studio 2005 # define C4_MSVC_2005 # else # error "MSVC version not supported" # endif // _MSC_VER #else # define C4_MSVC_VERSION 0 // visual studio not present # define C4_GCC_LIKE # ifdef __INTEL_COMPILER // check ICC before checking GCC, as ICC defines __GNUC__ too # define C4_ICC # define C4_ICC_VERSION __INTEL_COMPILER # elif defined(__APPLE_CC__) # define C4_XCODE # if defined(__clang__) # define C4_CLANG # ifndef __apple_build_version__ # define C4_CLANG_VERSION C4_VERSION_ENCODED(__clang_major__, __clang_minor__, __clang_patchlevel__) # else # define C4_CLANG_VERSION __apple_build_version__ # endif # else # define C4_XCODE_VERSION __APPLE_CC__ # endif # elif defined(__clang__) # define C4_CLANG # ifndef __apple_build_version__ # define C4_CLANG_VERSION C4_VERSION_ENCODED(__clang_major__, __clang_minor__, __clang_patchlevel__) # else # define C4_CLANG_VERSION __apple_build_version__ # endif # elif defined(__GNUC__) # ifdef __MINGW32__ # define C4_MINGW # endif # define C4_GCC # if defined(__GNUC_PATCHLEVEL__) # define C4_GCC_VERSION C4_VERSION_ENCODED(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__) # else # define C4_GCC_VERSION C4_VERSION_ENCODED(__GNUC__, __GNUC_MINOR__, 0) # endif # if __GNUC__ < 5 # if __GNUC__ == 4 && __GNUC_MINOR__ >= 8 // provided by cmake sub-project # include "c4/gcc-4.8.hpp" # else // we do not support GCC < 4.8: // * misses std::is_trivially_copyable // * misses std::align // * -Wshadow has false positives when a local function parameter has the same name as a method # error "GCC < 4.8 is not supported" # endif # endif # endif #endif // defined(C4_WIN) && defined(_MSC_VER) #endif /* _C4_COMPILER_HPP_ */ c4core-0.2.6/src/c4/config.hpp000066400000000000000000000016131477602032300157560ustar00rootroot00000000000000#ifndef _C4_CONFIG_HPP_ #define _C4_CONFIG_HPP_ /** @defgroup basic_headers Basic headers * @brief Headers providing basic macros, platform+cpu+compiler information, * C++ facilities and basic typedefs. */ /** @file config.hpp Contains configuration defines and includes the basic_headers. * @ingroup basic_headers */ //#define C4_DEBUG #define C4_ERROR_SHOWS_FILELINE //#define C4_ERROR_SHOWS_FUNC //#define C4_ERROR_THROWS_EXCEPTION //#define C4_NO_ALLOC_DEFAULTS //#define C4_REDEFINE_CPPNEW #ifndef C4_SIZE_TYPE # define C4_SIZE_TYPE size_t #endif #ifndef C4_STR_SIZE_TYPE # define C4_STR_SIZE_TYPE C4_SIZE_TYPE #endif #ifndef C4_TIME_TYPE # define C4_TIME_TYPE double #endif #include "c4/export.hpp" #include "c4/preprocessor.hpp" #include "c4/platform.hpp" #include "c4/cpu.hpp" #include "c4/compiler.hpp" #include "c4/language.hpp" #include "c4/types.hpp" #endif // _C4_CONFIG_HPP_ c4core-0.2.6/src/c4/cpu.hpp000066400000000000000000000162251477602032300153050ustar00rootroot00000000000000#ifndef _C4_CPU_HPP_ #define _C4_CPU_HPP_ /** @file cpu.hpp Provides processor information macros * @ingroup basic_headers */ // see also https://sourceforge.net/p/predef/wiki/Architectures/ // see also https://sourceforge.net/p/predef/wiki/Endianness/ // see also https://github.com/googlesamples/android-ndk/blob/android-mk/hello-jni/jni/hello-jni.c // see also http://code.qt.io/cgit/qt/qtbase.git/tree/src/corelib/global/qprocessordetection.h #ifdef __ORDER_LITTLE_ENDIAN__ # define _C4EL __ORDER_LITTLE_ENDIAN__ #else # define _C4EL 1234 #endif #ifdef __ORDER_BIG_ENDIAN__ # define _C4EB __ORDER_BIG_ENDIAN__ #else # define _C4EB 4321 #endif // mixed byte order (eg, PowerPC or ia64) #define _C4EM 1111 // NOLINT // NOTE: to find defined macros in a platform, // g++ -dM -E - = 8) \ || (defined(__TARGET_ARCH_ARM) && __TARGET_ARCH_ARM >= 8) # define C4_CPU_ARMV8 # elif defined(__ARM_ARCH_7__) || defined(_ARM_ARCH_7) \ || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) \ || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__) \ || defined(__ARM_ARCH_7EM__) \ || (defined(__TARGET_ARCH_ARM) && __TARGET_ARCH_ARM >= 7) \ || (defined(_M_ARM) && _M_ARM >= 7) # define C4_CPU_ARMV7 # elif defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) \ || defined(__ARM_ARCH_6T2__) || defined(__ARM_ARCH_6Z__) \ || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6ZK__) \ || defined(__ARM_ARCH_6M__) || defined(__ARM_ARCH_6KZ__) \ || (defined(__TARGET_ARCH_ARM) && __TARGET_ARCH_ARM >= 6) # define C4_CPU_ARMV6 # elif (defined(__ARM_ARCH) && __ARM_ARCH == 5) \ || defined(__ARM_ARCH_5TEJ__) \ || defined(__ARM_ARCH_5TE__) \ || defined(__ARM_ARCH_5T__) \ || (defined(__TARGET_ARCH_ARM) && __TARGET_ARCH_ARM >= 5) # define C4_CPU_ARMV5 # elif (defined(__ARM_ARCH) && __ARM_ARCH == 4) \ || defined(__ARM_ARCH_4T__) \ || defined(__ARM_ARCH_4__) \ || (defined(__TARGET_ARCH_ARM) && __TARGET_ARCH_ARM >= 4) # define C4_CPU_ARMV4 # else # error "unknown CPU architecture: ARM" # endif # endif # if defined(__ARMEL__) || defined(__LITTLE_ENDIAN__) || defined(__AARCH64EL__) \ || (defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)) \ || defined(_MSC_VER) // winarm64 does not provide any of the above macros, // but advises little-endianess: // https://docs.microsoft.com/en-us/cpp/build/overview-of-arm-abi-conventions?view=msvc-170 // So if it is visual studio compiling, we'll assume little endian. # define C4_BYTE_ORDER _C4EL # elif defined(__ARMEB__) || defined(__BIG_ENDIAN__) || defined(__AARCH64EB__) \ || (defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)) # define C4_BYTE_ORDER _C4EB # elif defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_PDP_ENDIAN__) # define C4_BYTE_ORDER _C4EM # else # error "unknown endianness" # endif #elif defined(__ia64) || defined(__ia64__) || defined(_M_IA64) # define C4_CPU_IA64 # define C4_WORDSIZE 8 # define C4_BYTE_ORDER _C4EM // itanium is bi-endian - check byte order below #elif defined(__ppc__) || defined(__ppc) || defined(__powerpc__) \ || defined(_ARCH_COM) || defined(_ARCH_PWR) || defined(_ARCH_PPC) \ || defined(_M_MPPC) || defined(_M_PPC) # if defined(__ppc64__) || defined(__powerpc64__) || defined(__64BIT__) # define C4_CPU_PPC64 # define C4_WORDSIZE 8 # else # define C4_CPU_PPC # define C4_WORDSIZE 4 # endif # define C4_BYTE_ORDER _C4EM // ppc is bi-endian - check byte order below #elif defined(__s390x__) || defined(__zarch__) || defined(__SYSC_ZARCH_) # define C4_CPU_S390_X # define C4_WORDSIZE 8 # define C4_BYTE_ORDER _C4EB #elif defined(__xtensa__) || defined(__XTENSA__) # define C4_CPU_XTENSA # define C4_WORDSIZE 4 // not sure about this... # if defined(__XTENSA_EL__) || defined(__xtensa_el__) # define C4_BYTE_ORDER _C4EL # else # define C4_BYTE_ORDER _C4EB # endif #elif defined(__riscv) # if __riscv_xlen == 64 # define C4_CPU_RISCV64 # define C4_WORDSIZE 8 # else # define C4_CPU_RISCV32 # define C4_WORDSIZE 4 # endif # define C4_BYTE_ORDER _C4EL #elif defined(__EMSCRIPTEN__) # define C4_BYTE_ORDER _C4EL # define C4_WORDSIZE 4 #elif defined(__loongarch__) # if defined(__loongarch64) # define C4_CPU_LOONGARCH64 # define C4_WORDSIZE 8 # else # define C4_CPU_LOONGARCH # define C4_WORDSIZE 4 # endif # define C4_BYTE_ORDER _C4EL #elif defined(__mips__) || defined(_mips) || defined(mips) # if defined(__mips) # if __mips == 64 # define C4_CPU_MIPS64 # define C4_WORDSIZE 8 # elif __mips == 32 # define C4_CPU_MIPS32 # define C4_WORDSIZE 4 # endif # elif defined(__arch64__) || (defined(__SIZE_WIDTH__) && __SIZE_WIDTH__ == 64) || (defined(__LP64__) && __LP64__) # define C4_CPU_MIPS64 # define C4_WORDSIZE 8 # elif defined(__arch32__) || (defined(__SIZE_WIDTH__) && __SIZE_WIDTH__ == 32) || (defined(__LP32__) && __LP32__) # define C4_CPU_MIPS32 # define C4_WORDSIZE 4 # else # error "unknown mips architecture" # endif # if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ # define C4_BYTE_ORDER _C4EB # elif __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ # define C4_BYTE_ORDER _C4EL # else # error "unknown mips endianness" # endif #elif defined(__sparc__) || defined(__sparc) || defined(sparc) # if defined(__arch64__) || (defined(__SIZE_WIDTH__) && __SIZE_WIDTH__ == 64) || (defined(__LP64__) && __LP64__) # define C4_CPU_SPARC64 # define C4_WORDSIZE 8 # elif defined(__arch32__) || (defined(__SIZE_WIDTH__) && __SIZE_WIDTH__ == 32) || (defined(__LP32__) && __LP32__) # define C4_CPU_SPARC32 # define C4_WORDSIZE 4 # else # error "unknown sparc architecture" # endif # define C4_BYTE_ORDER _C4EB #elif defined(SWIG) # error "please define CPU architecture macros when compiling with swig" #else # error "unknown CPU architecture" #endif #define C4_LITTLE_ENDIAN (C4_BYTE_ORDER == _C4EL) #define C4_BIG_ENDIAN (C4_BYTE_ORDER == _C4EB) #define C4_MIXED_ENDIAN (C4_BYTE_ORDER == _C4EM) #endif /* _C4_CPU_HPP_ */ c4core-0.2.6/src/c4/ctor_dtor.hpp000066400000000000000000000351731477602032300165200ustar00rootroot00000000000000#ifndef _C4_CTOR_DTOR_HPP_ #define _C4_CTOR_DTOR_HPP_ #include "c4/preprocessor.hpp" #include "c4/language.hpp" #include "c4/memory_util.hpp" #include "c4/error.hpp" #include #include // std::forward /** @file ctor_dtor.hpp object construction and destruction facilities. * Some of these are not yet available in C++11. */ namespace c4 { C4_SUPPRESS_WARNING_GCC_CLANG_WITH_PUSH("-Wold-style-cast") /** default-construct an object, trivial version */ template C4_ALWAYS_INLINE typename std::enable_if::value, void>::type construct(U *ptr) noexcept { memset(ptr, 0, sizeof(U)); } /** default-construct an object, non-trivial version */ template C4_ALWAYS_INLINE typename std ::enable_if< ! std::is_trivially_default_constructible::value, void>::type construct(U* ptr) noexcept { new ((void*)ptr) U(); } /** default-construct n objects, trivial version */ template C4_ALWAYS_INLINE typename std::enable_if::value, void>::type construct_n(U* ptr, I n) noexcept { memset(ptr, 0, n * sizeof(U)); } /** default-construct n objects, non-trivial version */ template C4_ALWAYS_INLINE typename std::enable_if< ! std::is_trivially_default_constructible::value, void>::type construct_n(U* ptr, I n) noexcept { for(I i = 0; i < n; ++i) { new ((void*)(ptr + i)) U(); } } #ifdef __clang__ # pragma clang diagnostic push #elif defined(__GNUC__) # pragma GCC diagnostic push # if __GNUC__ >= 6 # pragma GCC diagnostic ignored "-Wnull-dereference" # endif #endif template inline void construct(U* ptr, Args&&... args) { new ((void*)ptr) U(std::forward(args)...); } template inline void construct_n(U* ptr, I n, Args&&... args) // NOLINT { for(I i = 0; i < n; ++i) { new ((void*)(ptr + i)) U(args...); } } #ifdef __clang__ # pragma clang diagnostic pop #elif defined(__GNUC__) # pragma GCC diagnostic pop #endif //----------------------------------------------------------------------------- // copy-construct template C4_ALWAYS_INLINE typename std::enable_if::value, void>::type copy_construct(U* dst, U const* src) noexcept { C4_ASSERT(dst != src); memcpy(dst, src, sizeof(U)); } template C4_ALWAYS_INLINE typename std::enable_if< ! std::is_trivially_copy_constructible::value, void>::type copy_construct(U* dst, U const* src) { C4_ASSERT(dst != src); new ((void*)dst) U(*src); } template C4_ALWAYS_INLINE typename std::enable_if::value, void>::type copy_construct_n(U* dst, U const* src, I n) noexcept { C4_ASSERT(dst != src); memcpy(dst, src, n * sizeof(U)); } template C4_ALWAYS_INLINE typename std::enable_if< ! std::is_trivially_copy_constructible::value, void>::type copy_construct_n(U* dst, U const* src, I n) { C4_ASSERT(dst != src); for(I i = 0; i < n; ++i) { new ((void*)(dst + i)) U(*(src + i)); } } template C4_ALWAYS_INLINE typename std::enable_if::value, void>::type copy_construct(U* dst, U src) noexcept // pass by value for scalar types { *dst = src; } template C4_ALWAYS_INLINE typename std::enable_if< ! std::is_scalar::value, void>::type copy_construct(U* dst, U const& src) // pass by reference for non-scalar types { C4_ASSERT(dst != &src); new ((void*)dst) U(src); } template C4_ALWAYS_INLINE typename std::enable_if::value, void>::type copy_construct_n(U* dst, U src, I n) noexcept // pass by value for scalar types { for(I i = 0; i < n; ++i) { dst[i] = src; } } template C4_ALWAYS_INLINE typename std::enable_if< ! std::is_scalar::value, void>::type copy_construct_n(U* dst, U const& src, I n) // pass by reference for non-scalar types { C4_ASSERT(dst != &src); for(I i = 0; i < n; ++i) { new ((void*)(dst + i)) U(src); } } template C4_ALWAYS_INLINE void copy_construct(U (&dst)[N], U const (&src)[N]) noexcept { copy_construct_n(dst, src, N); } //----------------------------------------------------------------------------- // copy-assign template C4_ALWAYS_INLINE typename std::enable_if::value, void>::type copy_assign(U* dst, U const* src) noexcept { C4_ASSERT(dst != src); memcpy(dst, src, sizeof(U)); } template C4_ALWAYS_INLINE typename std::enable_if< ! std::is_trivially_copy_assignable::value, void>::type copy_assign(U* dst, U const* src) noexcept { C4_ASSERT(dst != src); *dst = *src; } template C4_ALWAYS_INLINE typename std::enable_if::value, void>::type copy_assign_n(U* dst, U const* src, I n) noexcept { C4_ASSERT(dst != src); memcpy(dst, src, n * sizeof(U)); } template C4_ALWAYS_INLINE typename std::enable_if< ! std::is_trivially_copy_assignable::value, void>::type copy_assign_n(U* dst, U const* src, I n) noexcept { C4_ASSERT(dst != src); for(I i = 0; i < n; ++i) { dst[i] = src[i]; } } template C4_ALWAYS_INLINE typename std::enable_if::value, void>::type copy_assign(U* dst, U src) noexcept // pass by value for scalar types { *dst = src; } template C4_ALWAYS_INLINE typename std::enable_if< ! std::is_scalar::value, void>::type copy_assign(U* dst, U const& src) noexcept // pass by reference for non-scalar types { C4_ASSERT(dst != &src); *dst = src; } template C4_ALWAYS_INLINE typename std::enable_if::value, void>::type copy_assign_n(U* dst, U src, I n) noexcept // pass by value for scalar types { for(I i = 0; i < n; ++i) { dst[i] = src; } } template C4_ALWAYS_INLINE typename std::enable_if< ! std::is_scalar::value, void>::type copy_assign_n(U* dst, U const& src, I n) noexcept // pass by reference for non-scalar types { C4_ASSERT(dst != &src); for(I i = 0; i < n; ++i) { dst[i] = src; } } template C4_ALWAYS_INLINE void copy_assign(U (&dst)[N], U const (&src)[N]) noexcept { copy_assign_n(dst, src, N); } //----------------------------------------------------------------------------- // move-construct template C4_ALWAYS_INLINE typename std::enable_if::value, void>::type move_construct(U* dst, U* src) noexcept { C4_ASSERT(dst != src); memcpy(dst, src, sizeof(U)); } template C4_ALWAYS_INLINE typename std::enable_if< ! std::is_trivially_move_constructible::value, void>::type move_construct(U* dst, U* src) noexcept { C4_ASSERT(dst != src); new ((void*)dst) U(std::move(*src)); } template C4_ALWAYS_INLINE typename std::enable_if::value, void>::type move_construct_n(U* dst, U* src, I n) noexcept { C4_ASSERT(dst != src); memcpy(dst, src, n * sizeof(U)); } template C4_ALWAYS_INLINE typename std::enable_if< ! std::is_trivially_move_constructible::value, void>::type move_construct_n(U* dst, U* src, I n) noexcept { C4_ASSERT(dst != src); for(I i = 0; i < n; ++i) { new ((void*)(dst + i)) U(std::move(src[i])); } } //----------------------------------------------------------------------------- // move-assign template C4_ALWAYS_INLINE typename std::enable_if::value, void>::type move_assign(U* dst, U* src) noexcept { C4_ASSERT(dst != src); memcpy(dst, src, sizeof(U)); } template C4_ALWAYS_INLINE typename std::enable_if< ! std::is_trivially_move_assignable::value, void>::type move_assign(U* dst, U* src) noexcept { C4_ASSERT(dst != src); *dst = std::move(*src); } template C4_ALWAYS_INLINE typename std::enable_if::value, void>::type move_assign_n(U* dst, U* src, I n) noexcept { C4_ASSERT(dst != src); memcpy(dst, src, n * sizeof(U)); } template C4_ALWAYS_INLINE typename std::enable_if< ! std::is_trivially_move_assignable::value, void>::type move_assign_n(U* dst, U* src, I n) noexcept { C4_ASSERT(dst != src); for(I i = 0; i < n; ++i) { *(dst + i) = std::move(*(src + i)); } } //----------------------------------------------------------------------------- // destroy template C4_ALWAYS_INLINE typename std::enable_if::value, void>::type destroy(U* ptr) noexcept { C4_UNUSED(ptr); // nothing to do } template C4_ALWAYS_INLINE typename std::enable_if< ! std::is_trivially_destructible::value, void>::type destroy(U* ptr) noexcept { ptr->~U(); } template C4_ALWAYS_INLINE typename std::enable_if::value, void>::type destroy_n(U* ptr, I n) noexcept { C4_UNUSED(ptr); C4_UNUSED(n); // nothing to do } template C4_ALWAYS_INLINE typename std::enable_if< ! std::is_trivially_destructible::value, void>::type destroy_n(U* ptr, I n) noexcept { for(I i = 0; i C4_ALWAYS_INLINE typename std::enable_if::value, void>::type make_room(U *buf, I bufsz, I room) C4_NOEXCEPT_A { C4_ASSERT(bufsz >= 0 && room >= 0); if(room >= bufsz) { memcpy (buf + room, buf, bufsz * sizeof(U)); } else { memmove(buf + room, buf, bufsz * sizeof(U)); } } /** makes room at the beginning of buf, which has a current size of bufsz */ template C4_ALWAYS_INLINE typename std::enable_if< ! std::is_trivially_move_constructible::value, void>::type make_room(U *buf, I bufsz, I room) C4_NOEXCEPT_A { C4_ASSERT(bufsz >= 0 && room >= 0); if(room >= bufsz) { for(I i = 0; i < bufsz; ++i) { new ((void*)(buf + (i + room))) U(std::move(buf[i])); } } else { for(I i = 0; i < bufsz; ++i) { I w = bufsz-1 - i; // do a backwards loop new ((void*)(buf + (w + room))) U(std::move(buf[w])); } } } /** make room to the right of pos */ template C4_ALWAYS_INLINE void make_room(U *buf, I bufsz, I currsz, I pos, I room) { C4_ASSERT(pos >= 0 && pos <= currsz); C4_ASSERT(currsz <= bufsz); C4_ASSERT(room + currsz <= bufsz); C4_UNUSED(bufsz); make_room(buf + pos, currsz - pos, room); } /** make room to the right of pos, copying to the beginning of a different buffer */ template C4_ALWAYS_INLINE typename std::enable_if::value, void>::type make_room(U *dst, U const* src, I srcsz, I room, I pos) C4_NOEXCEPT_A { C4_ASSERT(srcsz >= 0 && room >= 0 && pos >= 0); C4_ASSERT(pos < srcsz || (pos == 0 && srcsz == 0)); memcpy(dst , src , pos * sizeof(U)); memcpy(dst + room + pos, src + pos, (srcsz - pos) * sizeof(U)); } /** make room to the right of pos, copying to the beginning of a different buffer */ template C4_ALWAYS_INLINE typename std::enable_if< ! std::is_trivially_move_constructible::value, void>::type make_room(U *dst, U const* src, I srcsz, I room, I pos) { C4_ASSERT(srcsz >= 0 && room >= 0 && pos >= 0); C4_ASSERT(pos < srcsz || (pos == 0 && srcsz == 0)); for(I i = 0; i < pos; ++i) { new ((void*)(dst + i)) U(std::move(src[i])); } src += pos; dst += room + pos; for(I i = 0, e = srcsz - pos; i < e; ++i) { new ((void*)(dst + i)) U(std::move(src[i])); } } template C4_ALWAYS_INLINE void make_room ( U * dst, I dstsz, U const* src, I srcsz, I room, I pos ) { C4_ASSERT(pos >= 0 && pos < srcsz || (srcsz == 0 && pos == 0)); C4_ASSERT(pos >= 0 && pos < dstsz || (dstsz == 0 && pos == 0)); C4_ASSERT(srcsz+room <= dstsz); C4_UNUSED(dstsz); make_room(dst, src, srcsz, room, pos); } //----------------------------------------------------------------------------- /** destroy room at the beginning of buf, which has a current size of n */ template C4_ALWAYS_INLINE typename std::enable_if::value || (std::is_standard_layout::value && std::is_trivial::value), void>::type destroy_room(U *buf, I n, I room) C4_NOEXCEPT_A { C4_ASSERT(n >= 0 && room >= 0); C4_ASSERT(room <= n); if(room < n) { memmove(buf, buf + room, (n - room) * sizeof(U)); } else { // nothing to do - no need to destroy scalar types } } /** destroy room at the beginning of buf, which has a current size of n */ template C4_ALWAYS_INLINE typename std::enable_if< ! (std::is_scalar::value || (std::is_standard_layout::value && std::is_trivial::value)), void>::type destroy_room(U *buf, I n, I room) { C4_ASSERT(n >= 0 && room >= 0); C4_ASSERT(room <= n); if(room < n) { for(I i = 0, e = n - room; i < e; ++i) { buf[i] = std::move(buf[i + room]); } } else { for(I i = 0; i < n; ++i) { buf[i].~U(); } } } /** destroy room to the right of pos, copying to a different buffer */ template C4_ALWAYS_INLINE typename std::enable_if::value, void>::type destroy_room(U *dst, U const* src, I n, I room, I pos) C4_NOEXCEPT_A { C4_ASSERT(n >= 0 && room >= 0 && pos >= 0); C4_ASSERT(pos C4_ALWAYS_INLINE typename std::enable_if< ! std::is_trivially_move_constructible::value, void>::type destroy_room(U *dst, U const* src, I n, I room, I pos) { C4_ASSERT(n >= 0 && room >= 0 && pos >= 0); C4_ASSERT(pos < n); C4_ASSERT(pos + room <= n); for(I i = 0; i < pos; ++i) { new ((void*)(dst + i)) U(std::move(src[i])); } src += room + pos; dst += pos; for(I i = 0, e = n - pos - room; i < e; ++i) { new ((void*)(dst + i)) U(std::move(src[i])); } } C4_SUPPRESS_WARNING_GCC_CLANG_POP } // namespace c4 #endif /* _C4_CTOR_DTOR_HPP_ */ c4core-0.2.6/src/c4/dump.hpp000066400000000000000000000733341477602032300154670ustar00rootroot00000000000000#ifndef C4_DUMP_HPP_ #define C4_DUMP_HPP_ #include /** @file dump.hpp This file provides functions to dump several * arguments as strings to a user-provided function sink, for example * to implement a type-safe printf()-like function (where the sink * would just be a plain call to putchars()). The function sink can be * passed either by dynamic dispatching or by static dispatching (as a * template argument). There are analogs to @ref c4::cat() (@ref * c4::cat_dump() and @ref c4::cat_dump_resume()), @ref c4::catsep() * (@ref catsetp_dump() and @ref catsep_dump_resume()) and @ref * c4::format() (@ref c4::format_dump() and @ref * c4::format_dump_resume()). The analogs have two types: immediate * and resuming. An analog of immediate type cannot be retried when * the work buffer is too small; this means that successful dumps in * the first (successful) arguments will be dumped again in the * subsequent attempt to call. An analog of resuming type will only * ever dump as-yet-undumped arguments, through the use of @ref * DumpResults return type. */ namespace c4 { C4_SUPPRESS_WARNING_GCC_CLANG_WITH_PUSH("-Wold-style-cast") //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /** @defgroup dump_building_blocks Basic building blocks for dumping. * * The basic building block: given an argument and a * buffer, serialize the argument to the buffer using @ref * c4::to_chars(), and dump the buffer to the provided sink * function. When the argument is a string, no serialization is * performed, and the argument is dumped directly to the sink. * * @{ */ /** Type of the function to be used as the sink. This function * receives as its argument the string with characters to send to the * sink. * * @warning the string passed to the sink may have zero length. If the * user sink uses memcpy(), the call to memcpy() should be defended * with a check for zero length (calling memcpy with zero length is * undefined behavior). * */ using SinkPfn = void (*)(csubstr str); /** a traits class to use in SFINAE with @ref c4::dump() to select if * a type is treated as string type (which is dumped directly to the * sink, using to_csubstr()), or if the type is treated as a value, * which is first serialized to a buffer using to_chars(), and then * the serialization serialized as */ template struct dump_directly : public std::false_type {}; template<> struct dump_directly : public std::true_type {}; template<> struct dump_directly< substr> : public std::true_type {}; template<> struct dump_directly : public std::true_type {}; template<> struct dump_directly< char*> : public std::true_type {}; template struct dump_directly : public std::true_type {}; template struct dump_directly< char (&)[N]> : public std::true_type {}; template struct dump_directly : public std::true_type {}; template struct dump_directly< char[N]> : public std::true_type {}; /** Dump a string-type object to the (statically dispatched) sink. The * string is dumped directly, without any intermediate serialization. * * @return the number of bytes needed to serialize the string-type * object, which is always 0 because there is no serialization * * @note the argument is considered a value when @ref * dump_directly is a false type, which is the default. To enable * the argument to be treated as a string type, which is dumped * directly to the sink without intermediate serialization, define * dump_directly to a true type. * * @warning the string passed to the sink may have zero length. If the * user sink uses memcpy(), the call to memcpy() should be defended * with a check for zero length (calling memcpy with zero length is * undefined behavior). * * @see dump_directly */ template inline auto dump(substr buf, Arg const& a) -> typename std::enable_if::value, size_t>::type { C4_ASSERT(!buf.overlaps(a)); C4_UNUSED(buf); // dump directly, no need to serialize to the buffer sinkfn(to_csubstr(a)); return 0; // no space was used in the buffer } /** Dump a string-type object to the (dynamically dispatched) * sink. The string is dumped directly, without any intermediate * serialization to the buffer. * * @return the number of bytes needed to serialize the string-type * object, which is always 0 because there is no serialization * * @note the argument is considered a value when @ref * dump_directly is a false type, which is the default. To enable * the argument to be treated as a string type, which is dumped * directly to the sink without intermediate serialization, define * dump_directly to a true type. * * @warning the string passed to the sink may have zero length. If the * user sink uses memcpy(), the call to memcpy() should be defended * with a check for zero length (calling memcpy with zero length is * undefined behavior). * * @see dump_directly * */ template inline auto dump(SinkFn &&sinkfn, substr buf, Arg const& a) -> typename std::enable_if::value, size_t>::type { C4_UNUSED(buf); C4_ASSERT(!buf.overlaps(a)); // dump directly, no need to serialize to the buffer std::forward(sinkfn)(to_csubstr(a)); return 0; // no space was used in the buffer } /** Dump a value to the sink. Given an argument @p a and a buffer @p * buf, serialize the argument to the buffer using @ref to_chars(), * and then dump the buffer to the (statically dispatched) sink * function passed as the template argument. If the buffer is too * small to serialize the argument, the sink function is not called. * * @note the argument is considered a value when @ref * dump_directly is a false type, which is the default. To enable * the argument to be treated as a string type, which is dumped * directly to the sink without intermediate serialization, define * dump_directly to a true type. * * @see dump_directly * * @return the number of characters required to serialize the * argument. */ template inline auto dump(substr buf, Arg const& a) -> typename std::enable_if::value, size_t>::type { // serialize to the buffer const size_t sz = to_chars(buf, a); // dump the buffer to the sink if(C4_LIKELY(sz <= buf.len)) { // NOTE: don't do this: //sinkfn(buf.first(sz)); // ... but do this instead: sinkfn({buf.str, sz}); // ... this is needed because Release builds for armv5 and // armv6 were failing for the first call, with the wrong // buffer being passed into the function (!) } return sz; } /** Dump a value to the sink. Given an argument @p a and a buffer @p * buf, serialize the argument to the buffer using @ref * c4::to_chars(), and then dump the buffer to the (dynamically * dispatched) sink function, passed as @p sinkfn. If the buffer is too * small to serialize the argument, the sink function is not called. * * @note the argument is considered a value when @ref * dump_directly is a false type, which is the default. To enable * the argument to be treated as a string type, which is dumped * directly to the sink without intermediate serialization, define * dump_directly to a true type. * * @see @ref dump_directly * * @return the number of characters required to serialize the * argument. */ template inline auto dump(SinkFn &&sinkfn, substr buf, Arg const& a) -> typename std::enable_if::value, size_t>::type { // serialize to the buffer const size_t sz = to_chars(buf, a); // dump the buffer to the sink if(C4_LIKELY(sz <= buf.len)) { // NOTE: don't do this: //std::forward(sinkfn)(buf.first(sz)); // ... but do this instead: std::forward(sinkfn)({buf.str, sz}); // ... this is needed because Release builds for armv5 and // armv6 were failing for the first call, with the wrong // buffer being passed into the function (!) } return sz; } /** An opaque type used by resumeable dump functions like @ref * cat_dump_resume(), @ref catsep_dump_resume() or @ref * format_dump_resume(). */ struct DumpResults { enum : size_t { noarg = (size_t)-1 }; size_t bufsize = 0; size_t lastok = noarg; bool success_until(size_t expected) const { return lastok == noarg ? false : lastok >= expected; } bool write_arg(size_t arg) const { return lastok == noarg || arg > lastok; } size_t argfail() const { return lastok + 1; } }; /** @} */ //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /** @defgroup cat_dump Dump several arguments to a sink, * concatenated. This is the analog to @ref c4::cat(), with the * significant difference that each argument is immediately sent to * the sink (resulting in multiple calls to the sink function, once * per argument), whereas equivalent usage of c4::cat() would first * serialize all the arguments to the buffer, and then call the sink * once at the end. As a consequence, the size needed for the buffer * is only the maximum of the size needed for the arguments, whereas * with c4::cat(), the size needed for the buffer would be the sum of * the size needed for the arguments. When the size of dump * * @{ */ /// @cond dev // terminates the variadic recursion template size_t cat_dump(SinkFn &&, substr) // NOLINT { return 0; } // terminates the variadic recursion template size_t cat_dump(substr) // NOLINT { return 0; } /// @endcond /** Dump several arguments to the (dynamically dispatched) sink * function, as if through c4::cat(). For each argument, @ref dump() * is called with the buffer and sink. If any of the arguments is too * large for the buffer, no subsequent argument is sent to the sink, * (but all the arguments are still processed to compute the size * required for the buffer). This function can be safely called with an * empty buffer. * * @return the size required for the buffer, which is the maximum size * across all arguments * * @note subsequent calls with the same set of arguments will dump * again the first successful arguments. If each argument must only be * sent once to the sink (for example with printf-like behavior), use * instead @ref cat_dump_resume(). */ template size_t cat_dump(SinkFn &&sinkfn, substr buf, Arg const& a, Args const& ...more) { const size_t size_for_a = dump(std::forward(sinkfn), buf, a); if(C4_UNLIKELY(size_for_a > buf.len)) buf.len = 0; // ensure no more calls to the sink const size_t size_for_more = cat_dump(std::forward(sinkfn), buf, more...); return size_for_more > size_for_a ? size_for_more : size_for_a; } /** Dump several arguments to the (statically dispatched) sink * function, as if through c4::cat(). For each argument, @ref dump() * is called with the buffer and sink. If any of the arguments is too * large for the buffer, no subsequent argument is sent to the sink, * (but all the arguments are still processed to compute the size * required for the buffer). This function can be safely called with an * empty buffer. * * @return the size required for the buffer, which is the maximum size * across all arguments * * @note subsequent calls with the same set of arguments will dump * again the first successful arguments. If each argument must only be * sent once to the sink (for example with printf-like behavior), use * instead @ref cat_dump_resume(). */ template size_t cat_dump(substr buf, Arg const& a, Args const& ...more) { const size_t size_for_a = dump(buf, a); if(C4_UNLIKELY(size_for_a > buf.len)) buf.len = 0; // ensure no more calls to the sink const size_t size_for_more = cat_dump(buf, more...); return size_for_more > size_for_a ? size_for_more : size_for_a; } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /// @cond dev namespace detail { // terminates the variadic recursion template C4_ALWAYS_INLINE DumpResults cat_dump_resume(size_t, DumpResults results, substr) { return results; } // terminates the variadic recursion template C4_ALWAYS_INLINE DumpResults cat_dump_resume(size_t, SinkFn &&, DumpResults results, substr) // NOLINT { return results; } template DumpResults cat_dump_resume(size_t currarg, DumpResults results, substr buf, Arg const& C4_RESTRICT a, Args const& ...more) { if(C4_LIKELY(results.write_arg(currarg))) { size_t sz = dump(buf, a); // yield to the specialized function if(currarg == results.lastok + 1 && sz <= buf.len) results.lastok = currarg; results.bufsize = sz > results.bufsize ? sz : results.bufsize; } return detail::cat_dump_resume(currarg + 1u, results, buf, more...); } template DumpResults cat_dump_resume(size_t currarg, SinkFn &&sinkfn, DumpResults results, substr buf, Arg const& C4_RESTRICT a, Args const& ...more) { if(C4_LIKELY(results.write_arg(currarg))) { size_t sz = dump(std::forward(sinkfn), buf, a); // yield to the specialized function if(currarg == results.lastok + 1 && sz <= buf.len) results.lastok = currarg; results.bufsize = sz > results.bufsize ? sz : results.bufsize; } return detail::cat_dump_resume(currarg + 1u, std::forward(sinkfn), results, buf, more...); } } // namespace detail /// @endcond template C4_ALWAYS_INLINE DumpResults cat_dump_resume(substr buf, Arg const& C4_RESTRICT a, Args const& ...more) { return detail::cat_dump_resume(0u, DumpResults{}, buf, a, more...); } template C4_ALWAYS_INLINE DumpResults cat_dump_resume(SinkFn &&sinkfn, substr buf, Arg const& C4_RESTRICT a, Args const& ...more) { return detail::cat_dump_resume(0u, std::forward(sinkfn), DumpResults{}, buf, a, more...); } template C4_ALWAYS_INLINE DumpResults cat_dump_resume(DumpResults results, substr buf, Arg const& C4_RESTRICT a, Args const& ...more) { if(results.bufsize > buf.len) return results; return detail::cat_dump_resume(0u, results, buf, a, more...); } template C4_ALWAYS_INLINE DumpResults cat_dump_resume(SinkFn &&sinkfn, DumpResults results, substr buf, Arg const& C4_RESTRICT a, Args const& ...more) { if(results.bufsize > buf.len) return results; return detail::cat_dump_resume(0u, std::forward(sinkfn), results, buf, a, more...); } /** @} */ //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /// @cond dev // terminate the recursion template size_t catsep_dump(SinkFn &&, substr, Sep const& C4_RESTRICT) // NOLINT { return 0; } // terminate the recursion template size_t catsep_dump(substr, Sep const& C4_RESTRICT) // NOLINT { return 0; } /// @endcond /** take the function pointer as a function argument */ template size_t catsep_dump(SinkFn &&sinkfn, substr buf, Sep const& sep, Arg const& a, Args const& ...more) { size_t sz = dump(std::forward(sinkfn), buf, a); if(C4_UNLIKELY(sz > buf.len)) buf.len = 0; // ensure no more calls if C4_IF_CONSTEXPR (sizeof...(more) > 0) { size_t szsep = dump(std::forward(sinkfn), buf, sep); if(C4_UNLIKELY(szsep > buf.len)) buf.len = 0; // ensure no more calls sz = sz > szsep ? sz : szsep; } size_t size_for_more = catsep_dump(std::forward(sinkfn), buf, sep, more...); return size_for_more > sz ? size_for_more : sz; } /** take the function pointer as a template argument */ template size_t catsep_dump(substr buf, Sep const& sep, Arg const& a, Args const& ...more) { size_t sz = dump(buf, a); if(C4_UNLIKELY(sz > buf.len)) buf.len = 0; // ensure no more calls if C4_IF_CONSTEXPR (sizeof...(more) > 0) { size_t szsep = dump(buf, sep); if(C4_UNLIKELY(szsep > buf.len)) buf.len = 0; // ensure no more calls sz = sz > szsep ? sz : szsep; } size_t size_for_more = catsep_dump(buf, sep, more...); return size_for_more > sz ? size_for_more : sz; } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /// @cond dev namespace detail { template void catsep_dump_resume_(size_t currarg, DumpResults *C4_RESTRICT results, substr *buf, Arg const& a) { if(C4_LIKELY(results->write_arg(currarg))) { size_t sz = dump(*buf, a); results->bufsize = sz > results->bufsize ? sz : results->bufsize; if(C4_LIKELY(sz <= buf->len)) results->lastok = currarg; else buf->len = 0; } } template void catsep_dump_resume_(size_t currarg, SinkFn &&sinkfn, DumpResults *C4_RESTRICT results, substr *C4_RESTRICT buf, Arg const& C4_RESTRICT a) { if(C4_LIKELY(results->write_arg(currarg))) { size_t sz = dump(std::forward(sinkfn), *buf, a); results->bufsize = sz > results->bufsize ? sz : results->bufsize; if(C4_LIKELY(sz <= buf->len)) results->lastok = currarg; else buf->len = 0; } } template C4_ALWAYS_INLINE void catsep_dump_resume(size_t currarg, DumpResults *C4_RESTRICT results, substr *C4_RESTRICT buf, Sep const&, Arg const& a) { detail::catsep_dump_resume_(currarg, results, buf, a); } template C4_ALWAYS_INLINE void catsep_dump_resume(size_t currarg, SinkFn &&sinkfn, DumpResults *C4_RESTRICT results, substr *C4_RESTRICT buf, Sep const&, Arg const& a) { detail::catsep_dump_resume_(currarg, std::forward(sinkfn), results, buf, a); } template C4_ALWAYS_INLINE void catsep_dump_resume(size_t currarg, DumpResults *C4_RESTRICT results, substr *C4_RESTRICT buf, Sep const& sep, Arg const& a, Args const& ...more) { detail::catsep_dump_resume_(currarg , results, buf, a); detail::catsep_dump_resume_(currarg + 1u, results, buf, sep); detail::catsep_dump_resume (currarg + 2u, results, buf, sep, more...); } template C4_ALWAYS_INLINE void catsep_dump_resume(size_t currarg, SinkFn &&sinkfn, DumpResults *C4_RESTRICT results, substr *C4_RESTRICT buf, Sep const& sep, Arg const& a, Args const& ...more) { detail::catsep_dump_resume_(currarg , std::forward(sinkfn), results, buf, a); detail::catsep_dump_resume_(currarg + 1u, std::forward(sinkfn), results, buf, sep); detail::catsep_dump_resume (currarg + 2u, std::forward(sinkfn), results, buf, sep, more...); } } // namespace detail /// @endcond template C4_ALWAYS_INLINE DumpResults catsep_dump_resume(substr buf, Sep const& sep, Args const& ...args) { DumpResults results; detail::catsep_dump_resume(0u, &results, &buf, sep, args...); return results; } template C4_ALWAYS_INLINE DumpResults catsep_dump_resume(SinkFn &&sinkfn, substr buf, Sep const& sep, Args const& ...args) { DumpResults results; detail::catsep_dump_resume(0u, std::forward(sinkfn), &results, &buf, sep, args...); return results; } template C4_ALWAYS_INLINE DumpResults catsep_dump_resume(DumpResults results, substr buf, Sep const& sep, Args const& ...args) { detail::catsep_dump_resume(0u, &results, &buf, sep, args...); return results; } template C4_ALWAYS_INLINE DumpResults catsep_dump_resume(SinkFn &&sinkfn, DumpResults results, substr buf, Sep const& sep, Args const& ...args) { detail::catsep_dump_resume(0u, std::forward(sinkfn), &results, &buf, sep, args...); return results; } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /// @cond dev namespace detail { // terminate the recursion C4_ALWAYS_INLINE size_t _format_dump_compute_size() { return 0u; } template C4_ALWAYS_INLINE auto _format_dump_compute_size(T const&) -> typename std::enable_if::value, size_t>::type { return 0u; // no buffer needed } template C4_ALWAYS_INLINE auto _format_dump_compute_size(T const& v) -> typename std::enable_if::value, size_t>::type { return to_chars({}, v); } template size_t _format_dump_compute_size(Arg const& a, Args const& ...more) { const size_t sz = _format_dump_compute_size(a); // don't call to_chars() directly const size_t rest = _format_dump_compute_size(more...); return sz > rest ? sz : rest; } } // namespace detail // terminate the recursion template C4_ALWAYS_INLINE size_t format_dump(SinkFn &&sinkfn, substr, csubstr fmt) { // we can dump without using buf, so no need to check it std::forward(sinkfn)(fmt); return 0u; } // terminate the recursion /** take the function pointer as a template argument */ template C4_ALWAYS_INLINE size_t format_dump(substr, csubstr fmt) { // we can dump without using buf, so no need to check it sinkfn(fmt); return 0u; } /// @endcond /** take the function pointer as a function argument */ template C4_NO_INLINE size_t format_dump(SinkFn &&sinkfn, substr buf, csubstr fmt, Arg const& a, Args const& ...more) { // we can dump without using buf // but we'll only dump if the buffer is ok size_t pos = fmt.find("{}"); // @todo use _find_fmt() if(C4_UNLIKELY(pos == csubstr::npos)) { std::forward(sinkfn)(fmt); return 0u; } std::forward(sinkfn)(fmt.first(pos)); // we can dump without using buf fmt = fmt.sub(pos + 2); // skip {} do this before assigning to pos again pos = dump(std::forward(sinkfn), buf, a); // reuse pos to get needed_size // dump no more if the buffer was exhausted size_t size_for_more; if(C4_LIKELY(pos <= buf.len)) size_for_more = format_dump(std::forward(sinkfn), buf, fmt, more...); else size_for_more = detail::_format_dump_compute_size(more...); return size_for_more > pos ? size_for_more : pos; } /** take the function pointer as a template argument */ template C4_NO_INLINE size_t format_dump(substr buf, csubstr fmt, Arg const& C4_RESTRICT a, Args const& ...more) { // we can dump without using buf // but we'll only dump if the buffer is ok size_t pos = fmt.find("{}"); // @todo use _find_fmt() if(C4_UNLIKELY(pos == csubstr::npos)) { sinkfn(fmt); return 0u; } sinkfn(fmt.first(pos)); // we can dump without using buf fmt = fmt.sub(pos + 2); // skip {} do this before assigning to pos again pos = dump(buf, a); // reuse pos to get needed_size // dump no more if the buffer was exhausted size_t size_for_more; if(C4_LIKELY(pos <= buf.len)) size_for_more = format_dump(buf, fmt, more...); else size_for_more = detail::_format_dump_compute_size(more...); return size_for_more > pos ? size_for_more : pos; } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /// @cond dev namespace detail { // terminate the recursion template DumpResults format_dump_resume(size_t currarg, DumpResults results, substr, csubstr fmt) { if(C4_LIKELY(results.write_arg(currarg))) { // we can dump without using buf sinkfn(fmt); results.lastok = currarg; } return results; } // terminate the recursion template DumpResults format_dump_resume(size_t currarg, SinkFn &&sinkfn, DumpResults results, substr, csubstr fmt) { if(C4_LIKELY(results.write_arg(currarg))) { // we can dump without using buf std::forward(sinkfn)(fmt); results.lastok = currarg; } return results; } template DumpResults format_dump_resume(size_t currarg, DumpResults results, substr buf, csubstr fmt, Arg const& a, Args const& ...more) { // we need to process the format even if we're not // going to print the first arguments because we're resuming const size_t pos = fmt.find("{}"); // @todo use _find_fmt() if(C4_LIKELY(pos != csubstr::npos)) { if(C4_LIKELY(results.write_arg(currarg))) { sinkfn(fmt.first(pos)); results.lastok = currarg; } if(C4_LIKELY(results.write_arg(currarg + 1u))) { const size_t len = dump(buf, a); results.bufsize = len > results.bufsize ? len : results.bufsize; if(C4_LIKELY(len <= buf.len)) { results.lastok = currarg + 1u; } else { const size_t rest = _format_dump_compute_size(more...); results.bufsize = rest > results.bufsize ? rest : results.bufsize; return results; } } } else { if(C4_LIKELY(results.write_arg(currarg))) { sinkfn(fmt); results.lastok = currarg; } return results; } // NOTE: sparc64 had trouble with reassignment to fmt, and // was passing the original fmt to the recursion: //fmt = fmt.sub(pos + 2); // DONT! return detail::format_dump_resume(currarg + 2u, results, buf, fmt.sub(pos + 2), more...); } template DumpResults format_dump_resume(size_t currarg, SinkFn &&sinkfn, DumpResults results, substr buf, csubstr fmt, Arg const& a, Args const& ...more) { // we need to process the format even if we're not // going to print the first arguments because we're resuming const size_t pos = fmt.find("{}"); // @todo use _find_fmt() if(C4_LIKELY(pos != csubstr::npos)) { if(C4_LIKELY(results.write_arg(currarg))) { std::forward(sinkfn)(fmt.first(pos)); results.lastok = currarg; } if(C4_LIKELY(results.write_arg(currarg + 1u))) { const size_t len = dump(std::forward(sinkfn), buf, a); results.bufsize = len > results.bufsize ? len : results.bufsize; if(C4_LIKELY(len <= buf.len)) { results.lastok = currarg + 1u; } else { const size_t rest = _format_dump_compute_size(more...); results.bufsize = rest > results.bufsize ? rest : results.bufsize; return results; } } } else { if(C4_LIKELY(results.write_arg(currarg))) { std::forward(sinkfn)(fmt); results.lastok = currarg; } return results; } // NOTE: sparc64 had trouble with reassignment to fmt, and // was passing the original fmt to the recursion: //fmt = fmt.sub(pos + 2); // DONT! return detail::format_dump_resume(currarg + 2u, std::forward(sinkfn), results, buf, fmt.sub(pos + 2), more...); } } // namespace detail /// @endcond template C4_ALWAYS_INLINE DumpResults format_dump_resume(substr buf, csubstr fmt, Args const& ...args) { return detail::format_dump_resume(0u, DumpResults{}, buf, fmt, args...); } template C4_ALWAYS_INLINE DumpResults format_dump_resume(SinkFn &&sinkfn, substr buf, csubstr fmt, Args const& ...args) { return detail::format_dump_resume(0u, std::forward(sinkfn), DumpResults{}, buf, fmt, args...); } template C4_ALWAYS_INLINE DumpResults format_dump_resume(DumpResults results, substr buf, csubstr fmt, Args const& ...args) { return detail::format_dump_resume(0u, results, buf, fmt, args...); } template C4_ALWAYS_INLINE DumpResults format_dump_resume(SinkFn &&sinkfn, DumpResults results, substr buf, csubstr fmt, Args const& ...args) { return detail::format_dump_resume(0u, std::forward(sinkfn), results, buf, fmt, args...); } C4_SUPPRESS_WARNING_GCC_CLANG_POP } // namespace c4 #endif /* C4_DUMP_HPP_ */ c4core-0.2.6/src/c4/enum.hpp000066400000000000000000000174021477602032300154600ustar00rootroot00000000000000#ifndef _C4_ENUM_HPP_ #define _C4_ENUM_HPP_ #include "c4/error.hpp" #include #include /** @file enum.hpp utilities for enums: convert to/from string */ namespace c4 { C4_SUPPRESS_WARNING_GCC_CLANG_WITH_PUSH("-Wold-style-cast") //! taken from http://stackoverflow.com/questions/15586163/c11-type-trait-to-differentiate-between-enum-class-and-regular-enum template using is_scoped_enum = std::integral_constant::value && !std::is_convertible::value>; //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- typedef enum { EOFFS_NONE = 0, ///< no offset EOFFS_CLS = 1, ///< get the enum offset for the class name. @see eoffs_cls() EOFFS_PFX = 2, ///< get the enum offset for the enum prefix. @see eoffs_pfx() _EOFFS_LAST ///< reserved } EnumOffsetType; //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /** A simple (proxy) container for the value-name pairs of an enum type. * Uses linear search for finds; this could be improved for time-critical * code. */ template class EnumSymbols { public: struct Sym { Enum value; const char *name; bool cmp(const char *s) const; bool cmp(const char *s, size_t len) const; const char *name_offs(EnumOffsetType t) const; }; using const_iterator = Sym const*; public: template EnumSymbols(Sym const (&p)[N]) : m_symbols(p), m_num(N) {} size_t size() const { return m_num; } bool empty() const { return m_num == 0; } Sym const* get(Enum v) const { auto p = find(v); C4_CHECK_MSG(p != nullptr, "could not find symbol=%zd", (std::ptrdiff_t)v); return p; } Sym const* get(const char *s) const { auto p = find(s); C4_CHECK_MSG(p != nullptr, "could not find symbol \"%s\"", s); return p; } Sym const* get(const char *s, size_t len) const { auto p = find(s, len); C4_CHECK_MSG(p != nullptr, "could not find symbol \"%.*s\"", len, s); return p; } Sym const* find(Enum v) const; Sym const* find(const char *s) const; Sym const* find(const char *s, size_t len) const; Sym const& operator[] (size_t i) const { C4_CHECK(i < m_num); return m_symbols[i]; } Sym const* begin() const { return m_symbols; } Sym const* end () const { return m_symbols + m_num; } private: Sym const* m_symbols; size_t const m_num; // NOLINT(*avoid-const*) }; //----------------------------------------------------------------------------- /** return an EnumSymbols object for the enum type T * * @warning SPECIALIZE! This needs to be specialized for each enum * type. Failure to provide a specialization will cause a linker * error. */ template EnumSymbols const esyms(); /** return the offset for an enum symbol class. For example, * eoffs_cls() would be 13=strlen("MyEnumClass::"). * * With this function you can announce that the full prefix (including * an eventual enclosing class or C++11 enum class) is of a certain * length. * * @warning Needs to be specialized for each enum class type that * wants to use this. When no specialization is given, will return * 0. */ template size_t eoffs_cls() { return 0; } /** return the offset for an enum symbol prefix. This includes * eoffs_cls(). With this function you can announce that the full * prefix (including an eventual enclosing class or C++11 enum class * plus the string prefix) is of a certain length. * * @warning Needs to be specialized for each enum class type that * wants to use this. When no specialization is given, will return * 0. */ template size_t eoffs_pfx() { return 0; } template size_t eoffs(EnumOffsetType which) { switch(which) { case EOFFS_NONE: return 0; case EOFFS_CLS: return eoffs_cls(); case EOFFS_PFX: { size_t pfx = eoffs_pfx(); return pfx > 0 ? pfx : eoffs_cls(); } default: C4_ERROR("unknown offset type %d", (int)which); } } //----------------------------------------------------------------------------- /** get the enum value corresponding to a c-string */ #ifdef __clang__ # pragma clang diagnostic push #elif defined(__GNUC__) # pragma GCC diagnostic push # if __GNUC__ >= 6 # pragma GCC diagnostic ignored "-Wnull-dereference" # endif #endif template Enum str2e(const char* str) { auto pairs = esyms(); auto *p = pairs.get(str); C4_CHECK_MSG(p != nullptr, "no valid enum pair name for '%s'", str); return p->value; } /** get the c-string corresponding to an enum value */ template const char* e2str(Enum e) { auto es = esyms(); auto *p = es.get(e); C4_CHECK_MSG(p != nullptr, "no valid enum pair name"); return p->name; } /** like e2str(), but add an offset. */ template const char* e2stroffs(Enum e, EnumOffsetType ot=EOFFS_PFX) { const char *s = e2str(e) + eoffs(ot); return s; } #ifdef __clang__ # pragma clang diagnostic pop #elif defined(__GNUC__) # pragma GCC diagnostic pop #endif //----------------------------------------------------------------------------- /** Find a symbol by value. Returns nullptr when none is found */ template typename EnumSymbols::Sym const* EnumSymbols::find(Enum v) const { for(Sym const* p = this->m_symbols, *e = p+this->m_num; p < e; ++p) if(p->value == v) return p; return nullptr; } /** Find a symbol by name. Returns nullptr when none is found */ template typename EnumSymbols::Sym const* EnumSymbols::find(const char *s) const { for(Sym const* p = this->m_symbols, *e = p+this->m_num; p < e; ++p) if(p->cmp(s)) return p; return nullptr; } /** Find a symbol by name. Returns nullptr when none is found */ template typename EnumSymbols::Sym const* EnumSymbols::find(const char *s, size_t len) const { for(Sym const* p = this->m_symbols, *e = p+this->m_num; p < e; ++p) if(p->cmp(s, len)) return p; return nullptr; } //----------------------------------------------------------------------------- template bool EnumSymbols::Sym::cmp(const char *s) const { if(strcmp(name, s) == 0) return true; for(int i = 1; i < _EOFFS_LAST; ++i) { auto o = eoffs((EnumOffsetType)i); if(o > 0) if(strcmp(name + o, s) == 0) return true; } return false; } template bool EnumSymbols::Sym::cmp(const char *s, size_t len) const { if(strncmp(name, s, len) == 0) return true; size_t nlen = 0; for(int i = 1; i <_EOFFS_LAST; ++i) { auto o = eoffs((EnumOffsetType)i); if(o > 0) { if(!nlen) { nlen = strlen(name); } C4_ASSERT(o < nlen); size_t rem = nlen - o; auto m = len > rem ? len : rem; if(len >= m && strncmp(name + o, s, m) == 0) return true; } } return false; } //----------------------------------------------------------------------------- template const char* EnumSymbols::Sym::name_offs(EnumOffsetType t) const { C4_ASSERT(eoffs(t) < strlen(name)); return name + eoffs(t); } C4_SUPPRESS_WARNING_GCC_CLANG_POP } // namespace c4 #endif // _C4_ENUM_HPP_ c4core-0.2.6/src/c4/error.cpp000066400000000000000000000161031477602032300156350ustar00rootroot00000000000000#include "c4/error.hpp" #include #include #include #define C4_LOGF_ERR(...) (void)fprintf(stderr, __VA_ARGS__); (void)fflush(stderr) #define C4_LOGF_WARN(...) (void)fprintf(stderr, __VA_ARGS__); (void)fflush(stderr) #define C4_LOGP(msg, ...) (void)printf(msg) #if defined(C4_XBOX) || (defined(C4_WIN) && defined(C4_MSVC)) # include "c4/windows.hpp" #elif defined(C4_PS4) # include #elif defined(C4_UNIX) || defined(C4_LINUX) # include # include # include #elif defined(C4_MACOS) || defined(C4_IOS) # include # include # include # include #endif // the amalgamation tool is dumb and was omitting this include under MACOS. // So do it only once: #if defined(C4_UNIX) || defined(C4_LINUX) || defined(C4_MACOS) || defined(C4_IOS) # include #endif #if defined(C4_EXCEPTIONS_ENABLED) && defined(C4_ERROR_THROWS_EXCEPTION) # include #endif #ifdef __clang__ # pragma clang diagnostic push # pragma clang diagnostic ignored "-Wformat-nonliteral" # pragma clang diagnostic ignored "-Wold-style-cast" #elif defined(__GNUC__) # pragma GCC diagnostic push # pragma GCC diagnostic ignored "-Wformat-nonliteral" # pragma GCC diagnostic ignored "-Wold-style-cast" #endif // NOLINTBEGIN(*use-anonymous-namespace*,cert-dcl50-cpp) //----------------------------------------------------------------------------- namespace c4 { static error_flags s_error_flags = ON_ERROR_DEFAULTS; static error_callback_type s_error_callback = nullptr; //----------------------------------------------------------------------------- error_flags get_error_flags() { return s_error_flags; } void set_error_flags(error_flags flags) { s_error_flags = flags; } error_callback_type get_error_callback() { return s_error_callback; } /** Set the function which is called when an error occurs. */ void set_error_callback(error_callback_type cb) { s_error_callback = cb; } //----------------------------------------------------------------------------- void handle_error(srcloc where, const char *fmt, ...) { char buf[1024]; size_t msglen = 0; if(s_error_flags & (ON_ERROR_LOG|ON_ERROR_CALLBACK)) { va_list args; va_start(args, fmt); int ilen = vsnprintf(buf, sizeof(buf), fmt, args); // NOLINT(clang-analyzer-valist.Uninitialized) va_end(args); msglen = ilen >= 0 && ilen < (int)sizeof(buf) ? static_cast(ilen) : sizeof(buf)-1; } if(s_error_flags & ON_ERROR_LOG) { C4_LOGF_ERR("\n"); #if defined(C4_ERROR_SHOWS_FILELINE) && defined(C4_ERROR_SHOWS_FUNC) C4_LOGF_ERR("%s:%d: ERROR: %s\n", where.file, where.line, buf); C4_LOGF_ERR("%s:%d: ERROR here: %s\n", where.file, where.line, where.func); #elif defined(C4_ERROR_SHOWS_FILELINE) C4_LOGF_ERR("%s:%d: ERROR: %s\n", where.file, where.line, buf); #elif ! defined(C4_ERROR_SHOWS_FUNC) C4_LOGF_ERR("ERROR: %s\n", buf); #endif } if(s_error_flags & ON_ERROR_CALLBACK) { if(s_error_callback) { s_error_callback(buf, msglen); } } if(s_error_flags & ON_ERROR_THROW) { #if defined(C4_EXCEPTIONS_ENABLED) && defined(C4_ERROR_THROWS_EXCEPTION) throw std::runtime_error(buf); #endif } if(s_error_flags & ON_ERROR_ABORT) { abort(); } abort(); // abort anyway, in case nothing was set C4_UNREACHABLE_AFTER_ERR(); } //----------------------------------------------------------------------------- void handle_warning(srcloc where, const char *fmt, ...) { va_list args; char buf[1024]; va_start(args, fmt); int ret = vsnprintf(buf, sizeof(buf), fmt, args); // NOLINT(clang-analyzer-valist.Uninitialized) if(ret+1 > (int)sizeof(buf)) buf[sizeof(buf) - 1] = '\0'; // truncate else if(ret < 0) buf[0] = '\0'; // output/format error va_end(args); C4_LOGF_WARN("\n"); #if defined(C4_ERROR_SHOWS_FILELINE) && defined(C4_ERROR_SHOWS_FUNC) C4_LOGF_WARN("%s:%d: WARNING: %s\n", where.file, where.line, buf); C4_LOGF_WARN("%s:%d: WARNING: here: %s\n", where.file, where.line, where.func); #elif defined(C4_ERROR_SHOWS_FILELINE) C4_LOGF_WARN("%s:%d: WARNING: %s\n", where.file, where.line, buf); #elif ! defined(C4_ERROR_SHOWS_FUNC) C4_LOGF_WARN("WARNING: %s\n", buf); #endif } //----------------------------------------------------------------------------- bool is_debugger_attached() { #if defined(C4_UNIX) || defined(C4_LINUX) static bool first_call = true; static bool first_call_result = false; if(first_call) { first_call = false; C4_SUPPRESS_WARNING_GCC_PUSH #if defined(__GNUC__) && __GNUC__ > 9 C4_SUPPRESS_WARNING_GCC("-Wanalyzer-fd-leak") #endif //! @see http://stackoverflow.com/questions/3596781/how-to-detect-if-the-current-process-is-being-run-by-gdb //! (this answer: http://stackoverflow.com/a/24969863/3968589 ) char buf[1024] = ""; int status_fd = open("/proc/self/status", O_RDONLY); // NOLINT if (status_fd == -1) return false; ssize_t num_read = ::read(status_fd, buf, sizeof(buf)); if (num_read > 0) { static const char TracerPid[] = "TracerPid:"; char *tracer_pid; if(num_read < 1024) buf[num_read] = 0; tracer_pid = strstr(buf, TracerPid); if(tracer_pid) first_call_result = !!::atoi(tracer_pid + sizeof(TracerPid) - 1); // NOLINT } close(status_fd); C4_SUPPRESS_WARNING_GCC_POP } return first_call_result; #elif defined(C4_PS4) return (sceDbgIsDebuggerAttached() != 0); #elif defined(C4_XBOX) || (defined(C4_WIN) && defined(C4_MSVC)) return IsDebuggerPresent() != 0; #elif defined(C4_MACOS) || defined(C4_IOS) // https://stackoverflow.com/questions/2200277/detecting-debugger-on-mac-os-x // Returns true if the current process is being debugged (either // running under the debugger or has a debugger attached post facto). int junk; int mib[4]; struct kinfo_proc info; size_t size; // Initialize the flags so that, if sysctl fails for some bizarre // reason, we get a predictable result. info.kp_proc.p_flag = 0; // Initialize mib, which tells sysctl the info we want, in this case // we're looking for information about a specific process ID. mib[0] = CTL_KERN; mib[1] = KERN_PROC; mib[2] = KERN_PROC_PID; mib[3] = getpid(); // Call sysctl. size = sizeof(info); junk = sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, NULL, 0); assert(junk == 0); (void)junk; // We're being debugged if the P_TRACED flag is set. return ((info.kp_proc.p_flag & P_TRACED) != 0); #else return false; #endif } // is_debugger_attached() } // namespace c4 // NOLINTEND(*use-anonymous-namespace*,cert-dcl50-cpp) #ifdef __clang__ # pragma clang diagnostic pop #elif defined(__GNUC__) # pragma GCC diagnostic pop #endif c4core-0.2.6/src/c4/error.hpp000066400000000000000000000357511477602032300156540ustar00rootroot00000000000000#ifndef _C4_ERROR_HPP_ #define _C4_ERROR_HPP_ /** @file error.hpp Facilities for error reporting and runtime assertions. */ /** @defgroup error_checking Error checking */ #include "c4/config.hpp" #ifdef _DOXYGEN_ /** if this is defined and exceptions are enabled, then calls to C4_ERROR() * will throw an exception * @ingroup error_checking */ # define C4_EXCEPTIONS_ENABLED /** if this is defined and exceptions are enabled, then calls to C4_ERROR() * will throw an exception * @see C4_EXCEPTIONS_ENABLED * @ingroup error_checking */ # define C4_ERROR_THROWS_EXCEPTION /** evaluates to noexcept when C4_ERROR might be called and * exceptions are disabled. Otherwise, defaults to nothing. * @ingroup error_checking */ # define C4_NOEXCEPT #endif // _DOXYGEN_ #if defined(C4_EXCEPTIONS_ENABLED) && defined(C4_ERROR_THROWS_EXCEPTION) # define C4_NOEXCEPT #else # define C4_NOEXCEPT noexcept #endif namespace c4 { namespace detail { struct fail_type__ {}; } // detail } // c4 #define C4_STATIC_ERROR(dummy_type, errmsg) \ static_assert(std::is_same::value, errmsg) //----------------------------------------------------------------------------- #define C4_ASSERT_SAME_TYPE(ty1, ty2) \ C4_STATIC_ASSERT(std::is_same::value) #define C4_ASSERT_DIFF_TYPE(ty1, ty2) \ C4_STATIC_ASSERT( ! std::is_same::value) //----------------------------------------------------------------------------- #ifdef _DOXYGEN_ /** utility macro that triggers a breakpoint when * the debugger is attached and NDEBUG is not defined. * @ingroup error_checking */ # define C4_DEBUG_BREAK() #endif // _DOXYGEN_ #if defined(NDEBUG) || defined(C4_NO_DEBUG_BREAK) # define C4_DEBUG_BREAK() #else # ifdef __clang__ # pragma clang diagnostic push # pragma clang diagnostic ignored "-Wundef" # if !defined(__APPLE_CC__) # if __clang_major__ >= 10 # pragma clang diagnostic ignored "-Wgnu-inline-cpp-without-extern" // debugbreak/debugbreak.h:50:16: error: 'gnu_inline' attribute without 'extern' in C++ treated as externally available, this changed in Clang 10 [-Werror,-Wgnu-inline-cpp-without-extern] # endif # else # if __clang_major__ >= 13 # pragma clang diagnostic ignored "-Wgnu-inline-cpp-without-extern" // debugbreak/debugbreak.h:50:16: error: 'gnu_inline' attribute without 'extern' in C++ treated as externally available, this changed in Clang 10 [-Werror,-Wgnu-inline-cpp-without-extern] # endif # endif # elif defined(__GNUC__) # pragma GCC diagnostic push # pragma GCC diagnostic ignored "-Wundef" # endif # include # define C4_DEBUG_BREAK() if(c4::is_debugger_attached()) { ::debug_break(); } # ifdef __clang__ # pragma clang diagnostic pop # elif defined(__GNUC__) # pragma GCC diagnostic pop # endif #endif namespace c4 { C4CORE_EXPORT bool is_debugger_attached(); } // namespace c4 //----------------------------------------------------------------------------- #ifdef __clang__ /* NOTE: using , ## __VA_ARGS__ to deal with zero-args calls to * variadic macros is not portable, but works in clang, gcc, msvc, icc. * clang requires switching off compiler warnings for pedantic mode. * @see http://stackoverflow.com/questions/32047685/variadic-macro-without-arguments */ # pragma clang diagnostic push # pragma clang diagnostic ignored "-Wgnu-zero-variadic-macro-arguments" // warning: token pasting of ',' and __VA_ARGS__ is a GNU extension #elif defined(__GNUC__) /* GCC also issues a warning for zero-args calls to variadic macros. * This warning is switched on with -pedantic and apparently there is no * easy way to turn it off as with clang. But marking this as a system * header works. * @see https://gcc.gnu.org/onlinedocs/cpp/System-Headers.html * @see http://stackoverflow.com/questions/35587137/ */ # pragma GCC system_header #endif //----------------------------------------------------------------------------- namespace c4 { typedef enum : uint32_t { /** when an error happens and the debugger is attached, call C4_DEBUG_BREAK(). * Without effect otherwise. */ ON_ERROR_DEBUGBREAK = 0x01u << 0u, /** when an error happens log a message. */ ON_ERROR_LOG = 0x01u << 1u, /** when an error happens invoke a callback if it was set with * set_error_callback(). */ ON_ERROR_CALLBACK = 0x01u << 2u, /** when an error happens call std::terminate(). */ ON_ERROR_ABORT = 0x01u << 3u, /** when an error happens and exceptions are enabled throw an exception. * Without effect otherwise. */ ON_ERROR_THROW = 0x01u << 4u, /** the default flags. */ ON_ERROR_DEFAULTS = ON_ERROR_DEBUGBREAK|ON_ERROR_LOG|ON_ERROR_CALLBACK|ON_ERROR_ABORT } ErrorFlags_e; using error_flags = uint32_t; C4CORE_EXPORT void set_error_flags(error_flags f); C4CORE_EXPORT error_flags get_error_flags(); using error_callback_type = void (*)(const char* msg, size_t msg_size); C4CORE_EXPORT void set_error_callback(error_callback_type cb); C4CORE_EXPORT error_callback_type get_error_callback(); //----------------------------------------------------------------------------- /** RAII class controling the error settings inside a scope. */ struct ScopedErrorSettings // NOLINT(cppcoreguidelines-special-member-functions,hicpp-special-member-functions) { error_flags m_flags; error_callback_type m_callback; explicit ScopedErrorSettings(error_callback_type cb) : m_flags(get_error_flags()), m_callback(get_error_callback()) { set_error_callback(cb); } explicit ScopedErrorSettings(error_flags flags) : m_flags(get_error_flags()), m_callback(get_error_callback()) { set_error_flags(flags); } explicit ScopedErrorSettings(error_flags flags, error_callback_type cb) : m_flags(get_error_flags()), m_callback(get_error_callback()) { set_error_flags(flags); set_error_callback(cb); } ~ScopedErrorSettings() { set_error_flags(m_flags); set_error_callback(m_callback); } }; //----------------------------------------------------------------------------- /** source location */ struct srcloc; // watchout: for VS the [[noreturn]] needs to come before other annotations like C4CORE_EXPORT [[noreturn]] C4CORE_EXPORT void handle_error(srcloc s, const char *fmt, ...); C4CORE_EXPORT void handle_warning(srcloc s, const char *fmt, ...); # define C4_ERROR(msg, ...) \ do { \ if(c4::get_error_flags() & c4::ON_ERROR_DEBUGBREAK) \ { \ C4_DEBUG_BREAK() \ } \ c4::handle_error(C4_SRCLOC(), msg, ## __VA_ARGS__); \ } while(0) # define C4_WARNING(msg, ...) \ c4::handle_warning(C4_SRCLOC(), msg, ## __VA_ARGS__) #if defined(C4_ERROR_SHOWS_FILELINE) && defined(C4_ERROR_SHOWS_FUNC) struct srcloc { const char *file = ""; const char *func = ""; int line = 0; }; #define C4_SRCLOC() c4::srcloc{__FILE__, C4_PRETTY_FUNC, __LINE__} #elif defined(C4_ERROR_SHOWS_FILELINE) struct srcloc { const char *file; int line; }; #define C4_SRCLOC() c4::srcloc{__FILE__, __LINE__} #elif ! defined(C4_ERROR_SHOWS_FUNC) struct srcloc { }; #define C4_SRCLOC() c4::srcloc() #else # error not implemented #endif //----------------------------------------------------------------------------- // assertions // Doxygen needs this so that only one definition counts #ifdef _DOXYGEN_ /** Explicitly enables assertions, independently of NDEBUG status. * This is meant to allow enabling assertions even when NDEBUG is defined. * Defaults to undefined. * @ingroup error_checking */ # define C4_USE_ASSERT /** assert that a condition is true; this is turned off when NDEBUG * is defined and C4_USE_ASSERT is not true. * @ingroup error_checking */ # define C4_ASSERT /** same as C4_ASSERT(), additionally prints a printf-formatted message * @ingroup error_checking */ # define C4_ASSERT_MSG /** evaluates to C4_NOEXCEPT when C4_XASSERT is disabled; otherwise, defaults * to noexcept * @ingroup error_checking */ # define C4_NOEXCEPT_A #endif // _DOXYGEN_ #ifndef C4_USE_ASSERT # ifdef NDEBUG # define C4_USE_ASSERT 0 # else # define C4_USE_ASSERT 1 # endif #endif #if C4_USE_ASSERT # define C4_ASSERT(cond) C4_CHECK(cond) # define C4_ASSERT_MSG(cond, /*fmt, */...) C4_CHECK_MSG(cond, ## __VA_ARGS__) # define C4_ASSERT_IF(predicate, cond) if(predicate) { C4_ASSERT(cond); } # define C4_NOEXCEPT_A C4_NOEXCEPT #else # define C4_ASSERT(cond) # define C4_ASSERT_MSG(cond, /*fmt, */...) # define C4_ASSERT_IF(predicate, cond) # define C4_NOEXCEPT_A noexcept #endif //----------------------------------------------------------------------------- // extreme assertions // Doxygen needs this so that only one definition counts #ifdef _DOXYGEN_ /** Explicitly enables extreme assertions; this is meant to allow enabling * assertions even when NDEBUG is defined. Defaults to undefined. * @ingroup error_checking */ # define C4_USE_XASSERT /** extreme assertion: can be switched off independently of * the regular assertion; use for example for bounds checking in hot code. * Turned on only when C4_USE_XASSERT is defined * @ingroup error_checking */ # define C4_XASSERT /** same as C4_XASSERT(), and additionally prints a printf-formatted message * @ingroup error_checking */ # define C4_XASSERT_MSG /** evaluates to C4_NOEXCEPT when C4_XASSERT is disabled; otherwise, defaults to noexcept * @ingroup error_checking */ # define C4_NOEXCEPT_X #endif // _DOXYGEN_ #ifndef C4_USE_XASSERT # define C4_USE_XASSERT C4_USE_ASSERT #endif #if C4_USE_XASSERT # define C4_XASSERT(cond) C4_CHECK(cond) # define C4_XASSERT_MSG(cond, /*fmt, */...) C4_CHECK_MSG(cond, ## __VA_ARGS__) # define C4_XASSERT_IF(predicate, cond) if(predicate) { C4_XASSERT(cond); } # define C4_NOEXCEPT_X C4_NOEXCEPT #else # define C4_XASSERT(cond) # define C4_XASSERT_MSG(cond, /*fmt, */...) # define C4_XASSERT_IF(predicate, cond) # define C4_NOEXCEPT_X noexcept #endif //----------------------------------------------------------------------------- // checks: never switched-off /** Check that a condition is true, or raise an error when not * true. Unlike C4_ASSERT(), this check is not disabled in non-debug * builds. * @see C4_ASSERT * @ingroup error_checking * * @todo add constexpr-compatible compile-time assert: * https://akrzemi1.wordpress.com/2017/05/18/asserts-in-constexpr-functions/ */ #define C4_CHECK(cond) \ do { \ if(C4_UNLIKELY(!(cond))) \ { \ C4_ERROR("check failed: %s", #cond); \ } \ } while(0) /** like C4_CHECK(), and additionally log a printf-style message. * @see C4_CHECK * @ingroup error_checking */ #define C4_CHECK_MSG(cond, fmt, ...) \ do { \ if(C4_UNLIKELY(!(cond))) \ { \ C4_ERROR("check failed: " #cond "\n" fmt, ## __VA_ARGS__); \ } \ } while(0) //----------------------------------------------------------------------------- // Common error conditions #define C4_NOT_IMPLEMENTED() C4_ERROR("NOT IMPLEMENTED") #define C4_NOT_IMPLEMENTED_MSG(/*msg, */...) C4_ERROR("NOT IMPLEMENTED: " __VA_ARGS__) #define C4_NOT_IMPLEMENTED_IF(condition) do { if(C4_UNLIKELY(condition)) { C4_ERROR("NOT IMPLEMENTED"); } } while(0) #define C4_NOT_IMPLEMENTED_IF_MSG(condition, /*msg, */...) do { if(C4_UNLIKELY(condition)) { C4_ERROR("NOT IMPLEMENTED: " __VA_ARGS__); } } while(0) #define C4_NEVER_REACH() do { C4_ERROR("never reach this point"); C4_UNREACHABLE(); } while(0) #define C4_NEVER_REACH_MSG(/*msg, */...) do { C4_ERROR("never reach this point: " __VA_ARGS__); C4_UNREACHABLE(); } while(0) //----------------------------------------------------------------------------- // helpers for warning suppression // idea adapted from https://github.com/onqtam/doctest/ // TODO: add C4_MESSAGE() https://stackoverflow.com/questions/18252351/custom-preprocessor-macro-for-a-conditional-pragma-message-xxx?rq=1 #ifdef C4_MSVC #define C4_SUPPRESS_WARNING_MSVC_PUSH __pragma(warning(push)) #define C4_SUPPRESS_WARNING_MSVC(w) __pragma(warning(disable : w)) #define C4_SUPPRESS_WARNING_MSVC_POP __pragma(warning(pop)) #else // C4_MSVC #define C4_SUPPRESS_WARNING_MSVC_PUSH #define C4_SUPPRESS_WARNING_MSVC(w) #define C4_SUPPRESS_WARNING_MSVC_POP #endif // C4_MSVC #ifdef C4_CLANG #define C4_PRAGMA_TO_STR(x) _Pragma(#x) #define C4_SUPPRESS_WARNING_CLANG_PUSH _Pragma("clang diagnostic push") #define C4_SUPPRESS_WARNING_CLANG(w) C4_PRAGMA_TO_STR(clang diagnostic ignored w) #define C4_SUPPRESS_WARNING_CLANG_POP _Pragma("clang diagnostic pop") #else // C4_CLANG #define C4_SUPPRESS_WARNING_CLANG_PUSH #define C4_SUPPRESS_WARNING_CLANG(w) #define C4_SUPPRESS_WARNING_CLANG_POP #endif // C4_CLANG #ifdef C4_GCC #define C4_PRAGMA_TO_STR(x) _Pragma(#x) #define C4_SUPPRESS_WARNING_GCC_PUSH _Pragma("GCC diagnostic push") #define C4_SUPPRESS_WARNING_GCC(w) C4_PRAGMA_TO_STR(GCC diagnostic ignored w) #define C4_SUPPRESS_WARNING_GCC_POP _Pragma("GCC diagnostic pop") #else // C4_GCC #define C4_SUPPRESS_WARNING_GCC_PUSH #define C4_SUPPRESS_WARNING_GCC(w) #define C4_SUPPRESS_WARNING_GCC_POP #endif // C4_GCC #define C4_SUPPRESS_WARNING_MSVC_WITH_PUSH(w) \ C4_SUPPRESS_WARNING_MSVC_PUSH \ C4_SUPPRESS_WARNING_MSVC(w) #define C4_SUPPRESS_WARNING_CLANG_WITH_PUSH(w) \ C4_SUPPRESS_WARNING_CLANG_PUSH \ C4_SUPPRESS_WARNING_CLANG(w) #define C4_SUPPRESS_WARNING_GCC_WITH_PUSH(w) \ C4_SUPPRESS_WARNING_GCC_PUSH \ C4_SUPPRESS_WARNING_GCC(w) #define C4_SUPPRESS_WARNING_GCC_CLANG_PUSH \ C4_SUPPRESS_WARNING_GCC_PUSH \ C4_SUPPRESS_WARNING_CLANG_PUSH #define C4_SUPPRESS_WARNING_GCC_CLANG(w) \ C4_SUPPRESS_WARNING_GCC(w) \ C4_SUPPRESS_WARNING_CLANG(w) #define C4_SUPPRESS_WARNING_GCC_CLANG_WITH_PUSH(w) \ C4_SUPPRESS_WARNING_GCC_WITH_PUSH(w) \ C4_SUPPRESS_WARNING_CLANG_WITH_PUSH(w) #define C4_SUPPRESS_WARNING_GCC_CLANG_POP \ C4_SUPPRESS_WARNING_GCC_POP \ C4_SUPPRESS_WARNING_CLANG_POP } // namespace c4 #ifdef __clang__ # pragma clang diagnostic pop #endif #endif /* _C4_ERROR_HPP_ */ c4core-0.2.6/src/c4/export.hpp000066400000000000000000000005741477602032300160370ustar00rootroot00000000000000#ifndef C4_EXPORT_HPP_ #define C4_EXPORT_HPP_ #ifdef _WIN32 #ifdef C4CORE_SHARED #ifdef C4CORE_EXPORTS #define C4CORE_EXPORT __declspec(dllexport) #else #define C4CORE_EXPORT __declspec(dllimport) #endif #else #define C4CORE_EXPORT #endif #else #define C4CORE_EXPORT #endif #endif /* C4CORE_EXPORT_HPP_ */ c4core-0.2.6/src/c4/ext/000077500000000000000000000000001477602032300145775ustar00rootroot00000000000000c4core-0.2.6/src/c4/ext/debugbreak/000077500000000000000000000000001477602032300166725ustar00rootroot00000000000000c4core-0.2.6/src/c4/ext/fast_float/000077500000000000000000000000001477602032300167215ustar00rootroot00000000000000c4core-0.2.6/src/c4/ext/fast_float.hpp000066400000000000000000000026441477602032300174400ustar00rootroot00000000000000#ifndef _C4_EXT_FAST_FLOAT_HPP_ #define _C4_EXT_FAST_FLOAT_HPP_ #if defined(_MSC_VER) && !defined(__clang__) # pragma warning(push) # pragma warning(disable: 4365) // '=': conversion from 'const _Ty' to 'fast_float::limb', signed/unsigned mismatch # pragma warning(disable: 4996) // snprintf/scanf: this function or variable may be unsafe #elif defined(__clang__) || defined(__APPLE_CC__) || defined(_LIBCPP_VERSION) # pragma clang diagnostic push # if (defined(__clang_major__) && (__clang_major__ >= 9)) || defined(__APPLE_CC__) # pragma clang diagnostic ignored "-Wfortify-source" # endif # pragma clang diagnostic ignored "-Wshift-count-overflow" # pragma clang diagnostic ignored "-Wold-style-cast" #elif defined(__GNUC__) # pragma GCC diagnostic push # pragma GCC diagnostic ignored "-Wnarrowing" # pragma GCC diagnostic ignored "-Wconversion" # pragma GCC diagnostic ignored "-Wsign-conversion" # pragma GCC diagnostic ignored "-Wuseless-cast" # pragma GCC diagnostic ignored "-Wold-style-cast" # pragma GCC diagnostic ignored "-Warray-bounds" # if __GNUC__ >= 5 # pragma GCC diagnostic ignored "-Wshift-count-overflow" # endif #endif #include "c4/ext/fast_float_all.h" #ifdef _MSC_VER # pragma warning(pop) #elif defined(__clang__) || defined(__APPLE_CC__) # pragma clang diagnostic pop #elif defined(__GNUC__) # pragma GCC diagnostic pop #endif #endif // _C4_EXT_FAST_FLOAT_HPP_ c4core-0.2.6/src/c4/ext/fast_float_all.h000066400000000000000000004505461477602032300177400ustar00rootroot00000000000000// fast_float by Daniel Lemire // fast_float by Joรฃo Paulo Magalhaes // // // with contributions from Eugene Golushkov // with contributions from Maksim Kita // with contributions from Marcin Wojdyr // with contributions from Neal Richardson // with contributions from Tim Paine // with contributions from Fabio Pellacini // with contributions from Lรฉnรกrd Szolnoki // with contributions from Jan Pharago // with contributions from Maya Warrier // with contributions from Taha Khokhar // with contributions from Anders Dalvander // // // MIT License Notice // // MIT License // // Copyright (c) 2021 The fast_float authors // // 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR // IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. // #ifndef FASTFLOAT_CONSTEXPR_FEATURE_DETECT_H #define FASTFLOAT_CONSTEXPR_FEATURE_DETECT_H #ifdef __has_include #if __has_include() #include #endif #endif // Testing for https://wg21.link/N3652, adopted in C++14 #if defined(__cpp_constexpr) && __cpp_constexpr >= 201304 #define FASTFLOAT_CONSTEXPR14 constexpr #else #define FASTFLOAT_CONSTEXPR14 #endif #if defined(__cpp_lib_bit_cast) && __cpp_lib_bit_cast >= 201806L #define FASTFLOAT_HAS_BIT_CAST 1 #else #define FASTFLOAT_HAS_BIT_CAST 0 #endif #if defined(__cpp_lib_is_constant_evaluated) && \ __cpp_lib_is_constant_evaluated >= 201811L #define FASTFLOAT_HAS_IS_CONSTANT_EVALUATED 1 #else #define FASTFLOAT_HAS_IS_CONSTANT_EVALUATED 0 #endif // Testing for relevant C++20 constexpr library features #if FASTFLOAT_HAS_IS_CONSTANT_EVALUATED && FASTFLOAT_HAS_BIT_CAST && \ defined(__cpp_lib_constexpr_algorithms) && \ __cpp_lib_constexpr_algorithms >= 201806L /*For std::copy and std::fill*/ #define FASTFLOAT_CONSTEXPR20 constexpr #define FASTFLOAT_IS_CONSTEXPR 1 #else #define FASTFLOAT_CONSTEXPR20 #define FASTFLOAT_IS_CONSTEXPR 0 #endif #if __cplusplus >= 201703L || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) #define FASTFLOAT_DETAIL_MUST_DEFINE_CONSTEXPR_VARIABLE 0 #else #define FASTFLOAT_DETAIL_MUST_DEFINE_CONSTEXPR_VARIABLE 1 #endif #endif // FASTFLOAT_CONSTEXPR_FEATURE_DETECT_H #ifndef FASTFLOAT_FLOAT_COMMON_H #define FASTFLOAT_FLOAT_COMMON_H #include #include #include #include #include #include #include #ifdef __has_include #if __has_include() && (__cplusplus > 202002L || (defined(_MSVC_LANG) && (_MSVC_LANG > 202002L))) #include #endif #endif #define FASTFLOAT_VERSION_MAJOR 8 #define FASTFLOAT_VERSION_MINOR 0 #define FASTFLOAT_VERSION_PATCH 0 #define FASTFLOAT_STRINGIZE_IMPL(x) #x #define FASTFLOAT_STRINGIZE(x) FASTFLOAT_STRINGIZE_IMPL(x) #define FASTFLOAT_VERSION_STR \ FASTFLOAT_STRINGIZE(FASTFLOAT_VERSION_MAJOR) \ "." FASTFLOAT_STRINGIZE(FASTFLOAT_VERSION_MINOR) "." FASTFLOAT_STRINGIZE( \ FASTFLOAT_VERSION_PATCH) #define FASTFLOAT_VERSION \ (FASTFLOAT_VERSION_MAJOR * 10000 + FASTFLOAT_VERSION_MINOR * 100 + \ FASTFLOAT_VERSION_PATCH) namespace fast_float { enum class chars_format : uint64_t; namespace detail { constexpr chars_format basic_json_fmt = chars_format(1 << 5); constexpr chars_format basic_fortran_fmt = chars_format(1 << 6); } // namespace detail enum class chars_format : uint64_t { scientific = 1 << 0, fixed = 1 << 2, hex = 1 << 3, no_infnan = 1 << 4, // RFC 8259: https://datatracker.ietf.org/doc/html/rfc8259#section-6 json = uint64_t(detail::basic_json_fmt) | fixed | scientific | no_infnan, // Extension of RFC 8259 where, e.g., "inf" and "nan" are allowed. json_or_infnan = uint64_t(detail::basic_json_fmt) | fixed | scientific, fortran = uint64_t(detail::basic_fortran_fmt) | fixed | scientific, general = fixed | scientific, allow_leading_plus = 1 << 7, skip_white_space = 1 << 8, }; template struct from_chars_result_t { UC const *ptr; std::errc ec; }; using from_chars_result = from_chars_result_t; template struct parse_options_t { constexpr explicit parse_options_t(chars_format fmt = chars_format::general, UC dot = UC('.'), int b = 10) : format(fmt), decimal_point(dot), base(b) {} /** Which number formats are accepted */ chars_format format; /** The character used as decimal point */ UC decimal_point; /** The base used for integers */ int base; }; using parse_options = parse_options_t; } // namespace fast_float #if FASTFLOAT_HAS_BIT_CAST #include #endif #if (defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || \ defined(__amd64) || defined(__aarch64__) || defined(_M_ARM64) || \ defined(__MINGW64__) || defined(__s390x__) || \ (defined(__ppc64__) || defined(__PPC64__) || defined(__ppc64le__) || \ defined(__PPC64LE__)) || \ defined(__loongarch64)) #define FASTFLOAT_64BIT 1 #elif (defined(__i386) || defined(__i386__) || defined(_M_IX86) || \ defined(__arm__) || defined(_M_ARM) || defined(__ppc__) || \ defined(__MINGW32__) || defined(__EMSCRIPTEN__)) #define FASTFLOAT_32BIT 1 #else // Need to check incrementally, since SIZE_MAX is a size_t, avoid overflow. // We can never tell the register width, but the SIZE_MAX is a good // approximation. UINTPTR_MAX and INTPTR_MAX are optional, so avoid them for max // portability. #if SIZE_MAX == 0xffff #error Unknown platform (16-bit, unsupported) #elif SIZE_MAX == 0xffffffff #define FASTFLOAT_32BIT 1 #elif SIZE_MAX == 0xffffffffffffffff #define FASTFLOAT_64BIT 1 #else #error Unknown platform (not 32-bit, not 64-bit?) #endif #endif #if ((defined(_WIN32) || defined(_WIN64)) && !defined(__clang__)) || \ (defined(_M_ARM64) && !defined(__MINGW32__)) #include #endif #if defined(_MSC_VER) && !defined(__clang__) #define FASTFLOAT_VISUAL_STUDIO 1 #endif #if defined __BYTE_ORDER__ && defined __ORDER_BIG_ENDIAN__ #define FASTFLOAT_IS_BIG_ENDIAN (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) #elif defined _WIN32 #define FASTFLOAT_IS_BIG_ENDIAN 0 #else #if defined(__APPLE__) || defined(__FreeBSD__) #include #elif defined(sun) || defined(__sun) #include #elif defined(__MVS__) #include #else #ifdef __has_include #if __has_include() #include #endif //__has_include() #endif //__has_include #endif # #ifndef __BYTE_ORDER__ // safe choice #define FASTFLOAT_IS_BIG_ENDIAN 0 #endif # #ifndef __ORDER_LITTLE_ENDIAN__ // safe choice #define FASTFLOAT_IS_BIG_ENDIAN 0 #endif # #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ #define FASTFLOAT_IS_BIG_ENDIAN 0 #else #define FASTFLOAT_IS_BIG_ENDIAN 1 #endif #endif #if defined(__SSE2__) || (defined(FASTFLOAT_VISUAL_STUDIO) && \ (defined(_M_AMD64) || defined(_M_X64) || \ (defined(_M_IX86_FP) && _M_IX86_FP == 2))) #define FASTFLOAT_SSE2 1 #endif #if defined(__aarch64__) || defined(_M_ARM64) #define FASTFLOAT_NEON 1 #endif #if defined(FASTFLOAT_SSE2) || defined(FASTFLOAT_NEON) #define FASTFLOAT_HAS_SIMD 1 #endif #if defined(__GNUC__) // disable -Wcast-align=strict (GCC only) #define FASTFLOAT_SIMD_DISABLE_WARNINGS \ _Pragma("GCC diagnostic push") \ _Pragma("GCC diagnostic ignored \"-Wcast-align\"") #else #define FASTFLOAT_SIMD_DISABLE_WARNINGS #endif #if defined(__GNUC__) #define FASTFLOAT_SIMD_RESTORE_WARNINGS _Pragma("GCC diagnostic pop") #else #define FASTFLOAT_SIMD_RESTORE_WARNINGS #endif #ifdef FASTFLOAT_VISUAL_STUDIO #define fastfloat_really_inline __forceinline #else #define fastfloat_really_inline inline __attribute__((always_inline)) #endif #ifndef FASTFLOAT_ASSERT #define FASTFLOAT_ASSERT(x) \ { ((void)(x)); } #endif #ifndef FASTFLOAT_DEBUG_ASSERT #define FASTFLOAT_DEBUG_ASSERT(x) \ { ((void)(x)); } #endif // rust style `try!()` macro, or `?` operator #define FASTFLOAT_TRY(x) \ { \ if (!(x)) \ return false; \ } #define FASTFLOAT_ENABLE_IF(...) \ typename std::enable_if<(__VA_ARGS__), int>::type namespace fast_float { fastfloat_really_inline constexpr bool cpp20_and_in_constexpr() { #if FASTFLOAT_HAS_IS_CONSTANT_EVALUATED return std::is_constant_evaluated(); #else return false; #endif } template struct is_supported_float_type : std::integral_constant< bool, std::is_same::value || std::is_same::value #ifdef __STDCPP_FLOAT64_T__ || std::is_same::value #endif #ifdef __STDCPP_FLOAT32_T__ || std::is_same::value #endif #ifdef __STDCPP_FLOAT16_T__ || std::is_same::value #endif #ifdef __STDCPP_BFLOAT16_T__ || std::is_same::value #endif > { }; template using equiv_uint_t = typename std::conditional< sizeof(T) == 1, uint8_t, typename std::conditional< sizeof(T) == 2, uint16_t, typename std::conditional::type>::type>::type; template struct is_supported_integer_type : std::is_integral {}; template struct is_supported_char_type : std::integral_constant::value || std::is_same::value || std::is_same::value || std::is_same::value #ifdef __cpp_char8_t || std::is_same::value #endif > { }; // Compares two ASCII strings in a case insensitive manner. template inline FASTFLOAT_CONSTEXPR14 bool fastfloat_strncasecmp(UC const *actual_mixedcase, UC const *expected_lowercase, size_t length) { for (size_t i = 0; i < length; ++i) { UC const actual = actual_mixedcase[i]; if ((actual < 256 ? actual | 32 : actual) != expected_lowercase[i]) { return false; } } return true; } #ifndef FLT_EVAL_METHOD #error "FLT_EVAL_METHOD should be defined, please include cfloat." #endif // a pointer and a length to a contiguous block of memory template struct span { T const *ptr; size_t length; constexpr span(T const *_ptr, size_t _length) : ptr(_ptr), length(_length) {} constexpr span() : ptr(nullptr), length(0) {} constexpr size_t len() const noexcept { return length; } FASTFLOAT_CONSTEXPR14 const T &operator[](size_t index) const noexcept { FASTFLOAT_DEBUG_ASSERT(index < length); return ptr[index]; } }; struct value128 { uint64_t low; uint64_t high; constexpr value128(uint64_t _low, uint64_t _high) : low(_low), high(_high) {} constexpr value128() : low(0), high(0) {} }; /* Helper C++14 constexpr generic implementation of leading_zeroes */ fastfloat_really_inline FASTFLOAT_CONSTEXPR14 int leading_zeroes_generic(uint64_t input_num, int last_bit = 0) { if (input_num & uint64_t(0xffffffff00000000)) { input_num >>= 32; last_bit |= 32; } if (input_num & uint64_t(0xffff0000)) { input_num >>= 16; last_bit |= 16; } if (input_num & uint64_t(0xff00)) { input_num >>= 8; last_bit |= 8; } if (input_num & uint64_t(0xf0)) { input_num >>= 4; last_bit |= 4; } if (input_num & uint64_t(0xc)) { input_num >>= 2; last_bit |= 2; } if (input_num & uint64_t(0x2)) { /* input_num >>= 1; */ last_bit |= 1; } return 63 - last_bit; } /* result might be undefined when input_num is zero */ fastfloat_really_inline FASTFLOAT_CONSTEXPR20 int leading_zeroes(uint64_t input_num) { assert(input_num > 0); if (cpp20_and_in_constexpr()) { return leading_zeroes_generic(input_num); } #ifdef FASTFLOAT_VISUAL_STUDIO #if defined(_M_X64) || defined(_M_ARM64) unsigned long leading_zero = 0; // Search the mask data from most significant bit (MSB) // to least significant bit (LSB) for a set bit (1). _BitScanReverse64(&leading_zero, input_num); return (int)(63 - leading_zero); #else return leading_zeroes_generic(input_num); #endif #else return __builtin_clzll(input_num); #endif } // slow emulation routine for 32-bit fastfloat_really_inline constexpr uint64_t emulu(uint32_t x, uint32_t y) { return x * (uint64_t)y; } fastfloat_really_inline FASTFLOAT_CONSTEXPR14 uint64_t umul128_generic(uint64_t ab, uint64_t cd, uint64_t *hi) { uint64_t ad = emulu((uint32_t)(ab >> 32), (uint32_t)cd); uint64_t bd = emulu((uint32_t)ab, (uint32_t)cd); uint64_t adbc = ad + emulu((uint32_t)ab, (uint32_t)(cd >> 32)); uint64_t adbc_carry = (uint64_t)(adbc < ad); uint64_t lo = bd + (adbc << 32); *hi = emulu((uint32_t)(ab >> 32), (uint32_t)(cd >> 32)) + (adbc >> 32) + (adbc_carry << 32) + (uint64_t)(lo < bd); return lo; } #ifdef FASTFLOAT_32BIT // slow emulation routine for 32-bit #if !defined(__MINGW64__) fastfloat_really_inline FASTFLOAT_CONSTEXPR14 uint64_t _umul128(uint64_t ab, uint64_t cd, uint64_t *hi) { return umul128_generic(ab, cd, hi); } #endif // !__MINGW64__ #endif // FASTFLOAT_32BIT // compute 64-bit a*b fastfloat_really_inline FASTFLOAT_CONSTEXPR20 value128 full_multiplication(uint64_t a, uint64_t b) { if (cpp20_and_in_constexpr()) { value128 answer; answer.low = umul128_generic(a, b, &answer.high); return answer; } value128 answer; #if defined(_M_ARM64) && !defined(__MINGW32__) // ARM64 has native support for 64-bit multiplications, no need to emulate // But MinGW on ARM64 doesn't have native support for 64-bit multiplications answer.high = __umulh(a, b); answer.low = a * b; #elif defined(FASTFLOAT_32BIT) || \ (defined(_WIN64) && !defined(__clang__) && !defined(_M_ARM64)) answer.low = _umul128(a, b, &answer.high); // _umul128 not available on ARM64 #elif defined(FASTFLOAT_64BIT) && defined(__SIZEOF_INT128__) __uint128_t r = ((__uint128_t)a) * b; answer.low = uint64_t(r); answer.high = uint64_t(r >> 64); #else answer.low = umul128_generic(a, b, &answer.high); #endif return answer; } struct adjusted_mantissa { uint64_t mantissa{0}; int32_t power2{0}; // a negative value indicates an invalid result adjusted_mantissa() = default; constexpr bool operator==(adjusted_mantissa const &o) const { return mantissa == o.mantissa && power2 == o.power2; } constexpr bool operator!=(adjusted_mantissa const &o) const { return mantissa != o.mantissa || power2 != o.power2; } }; // Bias so we can get the real exponent with an invalid adjusted_mantissa. constexpr static int32_t invalid_am_bias = -0x8000; // used for binary_format_lookup_tables::max_mantissa constexpr uint64_t constant_55555 = 5 * 5 * 5 * 5 * 5; template struct binary_format_lookup_tables; template struct binary_format : binary_format_lookup_tables { using equiv_uint = equiv_uint_t; static constexpr int mantissa_explicit_bits(); static constexpr int minimum_exponent(); static constexpr int infinite_power(); static constexpr int sign_index(); static constexpr int min_exponent_fast_path(); // used when fegetround() == FE_TONEAREST static constexpr int max_exponent_fast_path(); static constexpr int max_exponent_round_to_even(); static constexpr int min_exponent_round_to_even(); static constexpr uint64_t max_mantissa_fast_path(int64_t power); static constexpr uint64_t max_mantissa_fast_path(); // used when fegetround() == FE_TONEAREST static constexpr int largest_power_of_ten(); static constexpr int smallest_power_of_ten(); static constexpr T exact_power_of_ten(int64_t power); static constexpr size_t max_digits(); static constexpr equiv_uint exponent_mask(); static constexpr equiv_uint mantissa_mask(); static constexpr equiv_uint hidden_bit_mask(); }; template struct binary_format_lookup_tables { static constexpr double powers_of_ten[] = { 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19, 1e20, 1e21, 1e22}; // Largest integer value v so that (5**index * v) <= 1<<53. // 0x20000000000000 == 1 << 53 static constexpr uint64_t max_mantissa[] = { 0x20000000000000, 0x20000000000000 / 5, 0x20000000000000 / (5 * 5), 0x20000000000000 / (5 * 5 * 5), 0x20000000000000 / (5 * 5 * 5 * 5), 0x20000000000000 / (constant_55555), 0x20000000000000 / (constant_55555 * 5), 0x20000000000000 / (constant_55555 * 5 * 5), 0x20000000000000 / (constant_55555 * 5 * 5 * 5), 0x20000000000000 / (constant_55555 * 5 * 5 * 5 * 5), 0x20000000000000 / (constant_55555 * constant_55555), 0x20000000000000 / (constant_55555 * constant_55555 * 5), 0x20000000000000 / (constant_55555 * constant_55555 * 5 * 5), 0x20000000000000 / (constant_55555 * constant_55555 * 5 * 5 * 5), 0x20000000000000 / (constant_55555 * constant_55555 * constant_55555), 0x20000000000000 / (constant_55555 * constant_55555 * constant_55555 * 5), 0x20000000000000 / (constant_55555 * constant_55555 * constant_55555 * 5 * 5), 0x20000000000000 / (constant_55555 * constant_55555 * constant_55555 * 5 * 5 * 5), 0x20000000000000 / (constant_55555 * constant_55555 * constant_55555 * 5 * 5 * 5 * 5), 0x20000000000000 / (constant_55555 * constant_55555 * constant_55555 * constant_55555), 0x20000000000000 / (constant_55555 * constant_55555 * constant_55555 * constant_55555 * 5), 0x20000000000000 / (constant_55555 * constant_55555 * constant_55555 * constant_55555 * 5 * 5), 0x20000000000000 / (constant_55555 * constant_55555 * constant_55555 * constant_55555 * 5 * 5 * 5), 0x20000000000000 / (constant_55555 * constant_55555 * constant_55555 * constant_55555 * 5 * 5 * 5 * 5)}; }; #if FASTFLOAT_DETAIL_MUST_DEFINE_CONSTEXPR_VARIABLE template constexpr double binary_format_lookup_tables::powers_of_ten[]; template constexpr uint64_t binary_format_lookup_tables::max_mantissa[]; #endif template struct binary_format_lookup_tables { static constexpr float powers_of_ten[] = {1e0f, 1e1f, 1e2f, 1e3f, 1e4f, 1e5f, 1e6f, 1e7f, 1e8f, 1e9f, 1e10f}; // Largest integer value v so that (5**index * v) <= 1<<24. // 0x1000000 == 1<<24 static constexpr uint64_t max_mantissa[] = { 0x1000000, 0x1000000 / 5, 0x1000000 / (5 * 5), 0x1000000 / (5 * 5 * 5), 0x1000000 / (5 * 5 * 5 * 5), 0x1000000 / (constant_55555), 0x1000000 / (constant_55555 * 5), 0x1000000 / (constant_55555 * 5 * 5), 0x1000000 / (constant_55555 * 5 * 5 * 5), 0x1000000 / (constant_55555 * 5 * 5 * 5 * 5), 0x1000000 / (constant_55555 * constant_55555), 0x1000000 / (constant_55555 * constant_55555 * 5)}; }; #if FASTFLOAT_DETAIL_MUST_DEFINE_CONSTEXPR_VARIABLE template constexpr float binary_format_lookup_tables::powers_of_ten[]; template constexpr uint64_t binary_format_lookup_tables::max_mantissa[]; #endif template <> inline constexpr int binary_format::min_exponent_fast_path() { #if (FLT_EVAL_METHOD != 1) && (FLT_EVAL_METHOD != 0) return 0; #else return -22; #endif } template <> inline constexpr int binary_format::min_exponent_fast_path() { #if (FLT_EVAL_METHOD != 1) && (FLT_EVAL_METHOD != 0) return 0; #else return -10; #endif } template <> inline constexpr int binary_format::mantissa_explicit_bits() { return 52; } template <> inline constexpr int binary_format::mantissa_explicit_bits() { return 23; } template <> inline constexpr int binary_format::max_exponent_round_to_even() { return 23; } template <> inline constexpr int binary_format::max_exponent_round_to_even() { return 10; } template <> inline constexpr int binary_format::min_exponent_round_to_even() { return -4; } template <> inline constexpr int binary_format::min_exponent_round_to_even() { return -17; } template <> inline constexpr int binary_format::minimum_exponent() { return -1023; } template <> inline constexpr int binary_format::minimum_exponent() { return -127; } template <> inline constexpr int binary_format::infinite_power() { return 0x7FF; } template <> inline constexpr int binary_format::infinite_power() { return 0xFF; } template <> inline constexpr int binary_format::sign_index() { return 63; } template <> inline constexpr int binary_format::sign_index() { return 31; } template <> inline constexpr int binary_format::max_exponent_fast_path() { return 22; } template <> inline constexpr int binary_format::max_exponent_fast_path() { return 10; } template <> inline constexpr uint64_t binary_format::max_mantissa_fast_path() { return uint64_t(2) << mantissa_explicit_bits(); } template <> inline constexpr uint64_t binary_format::max_mantissa_fast_path() { return uint64_t(2) << mantissa_explicit_bits(); } // credit: Jakub Jelรญnek #ifdef __STDCPP_FLOAT16_T__ template struct binary_format_lookup_tables { static constexpr std::float16_t powers_of_ten[] = {1e0f16, 1e1f16, 1e2f16, 1e3f16, 1e4f16}; // Largest integer value v so that (5**index * v) <= 1<<11. // 0x800 == 1<<11 static constexpr uint64_t max_mantissa[] = {0x800, 0x800 / 5, 0x800 / (5 * 5), 0x800 / (5 * 5 * 5), 0x800 / (5 * 5 * 5 * 5), 0x800 / (constant_55555)}; }; #if FASTFLOAT_DETAIL_MUST_DEFINE_CONSTEXPR_VARIABLE template constexpr std::float16_t binary_format_lookup_tables::powers_of_ten[]; template constexpr uint64_t binary_format_lookup_tables::max_mantissa[]; #endif template <> inline constexpr std::float16_t binary_format::exact_power_of_ten(int64_t power) { // Work around clang bug https://godbolt.org/z/zedh7rrhc return (void)powers_of_ten[0], powers_of_ten[power]; } template <> inline constexpr binary_format::equiv_uint binary_format::exponent_mask() { return 0x7C00; } template <> inline constexpr binary_format::equiv_uint binary_format::mantissa_mask() { return 0x03FF; } template <> inline constexpr binary_format::equiv_uint binary_format::hidden_bit_mask() { return 0x0400; } template <> inline constexpr int binary_format::max_exponent_fast_path() { return 4; } template <> inline constexpr int binary_format::mantissa_explicit_bits() { return 10; } template <> inline constexpr uint64_t binary_format::max_mantissa_fast_path() { return uint64_t(2) << mantissa_explicit_bits(); } template <> inline constexpr uint64_t binary_format::max_mantissa_fast_path(int64_t power) { // caller is responsible to ensure that // power >= 0 && power <= 4 // // Work around clang bug https://godbolt.org/z/zedh7rrhc return (void)max_mantissa[0], max_mantissa[power]; } template <> inline constexpr int binary_format::min_exponent_fast_path() { return 0; } template <> inline constexpr int binary_format::max_exponent_round_to_even() { return 5; } template <> inline constexpr int binary_format::min_exponent_round_to_even() { return -22; } template <> inline constexpr int binary_format::minimum_exponent() { return -15; } template <> inline constexpr int binary_format::infinite_power() { return 0x1F; } template <> inline constexpr int binary_format::sign_index() { return 15; } template <> inline constexpr int binary_format::largest_power_of_ten() { return 4; } template <> inline constexpr int binary_format::smallest_power_of_ten() { return -27; } template <> inline constexpr size_t binary_format::max_digits() { return 22; } #endif // __STDCPP_FLOAT16_T__ // credit: Jakub Jelรญnek #ifdef __STDCPP_BFLOAT16_T__ template struct binary_format_lookup_tables { static constexpr std::bfloat16_t powers_of_ten[] = {1e0bf16, 1e1bf16, 1e2bf16, 1e3bf16}; // Largest integer value v so that (5**index * v) <= 1<<8. // 0x100 == 1<<8 static constexpr uint64_t max_mantissa[] = {0x100, 0x100 / 5, 0x100 / (5 * 5), 0x100 / (5 * 5 * 5), 0x100 / (5 * 5 * 5 * 5)}; }; #if FASTFLOAT_DETAIL_MUST_DEFINE_CONSTEXPR_VARIABLE template constexpr std::bfloat16_t binary_format_lookup_tables::powers_of_ten[]; template constexpr uint64_t binary_format_lookup_tables::max_mantissa[]; #endif template <> inline constexpr std::bfloat16_t binary_format::exact_power_of_ten(int64_t power) { // Work around clang bug https://godbolt.org/z/zedh7rrhc return (void)powers_of_ten[0], powers_of_ten[power]; } template <> inline constexpr int binary_format::max_exponent_fast_path() { return 3; } template <> inline constexpr binary_format::equiv_uint binary_format::exponent_mask() { return 0x7F80; } template <> inline constexpr binary_format::equiv_uint binary_format::mantissa_mask() { return 0x007F; } template <> inline constexpr binary_format::equiv_uint binary_format::hidden_bit_mask() { return 0x0080; } template <> inline constexpr int binary_format::mantissa_explicit_bits() { return 7; } template <> inline constexpr uint64_t binary_format::max_mantissa_fast_path() { return uint64_t(2) << mantissa_explicit_bits(); } template <> inline constexpr uint64_t binary_format::max_mantissa_fast_path(int64_t power) { // caller is responsible to ensure that // power >= 0 && power <= 3 // // Work around clang bug https://godbolt.org/z/zedh7rrhc return (void)max_mantissa[0], max_mantissa[power]; } template <> inline constexpr int binary_format::min_exponent_fast_path() { return 0; } template <> inline constexpr int binary_format::max_exponent_round_to_even() { return 3; } template <> inline constexpr int binary_format::min_exponent_round_to_even() { return -24; } template <> inline constexpr int binary_format::minimum_exponent() { return -127; } template <> inline constexpr int binary_format::infinite_power() { return 0xFF; } template <> inline constexpr int binary_format::sign_index() { return 15; } template <> inline constexpr int binary_format::largest_power_of_ten() { return 38; } template <> inline constexpr int binary_format::smallest_power_of_ten() { return -60; } template <> inline constexpr size_t binary_format::max_digits() { return 98; } #endif // __STDCPP_BFLOAT16_T__ template <> inline constexpr uint64_t binary_format::max_mantissa_fast_path(int64_t power) { // caller is responsible to ensure that // power >= 0 && power <= 22 // // Work around clang bug https://godbolt.org/z/zedh7rrhc return (void)max_mantissa[0], max_mantissa[power]; } template <> inline constexpr uint64_t binary_format::max_mantissa_fast_path(int64_t power) { // caller is responsible to ensure that // power >= 0 && power <= 10 // // Work around clang bug https://godbolt.org/z/zedh7rrhc return (void)max_mantissa[0], max_mantissa[power]; } template <> inline constexpr double binary_format::exact_power_of_ten(int64_t power) { // Work around clang bug https://godbolt.org/z/zedh7rrhc return (void)powers_of_ten[0], powers_of_ten[power]; } template <> inline constexpr float binary_format::exact_power_of_ten(int64_t power) { // Work around clang bug https://godbolt.org/z/zedh7rrhc return (void)powers_of_ten[0], powers_of_ten[power]; } template <> inline constexpr int binary_format::largest_power_of_ten() { return 308; } template <> inline constexpr int binary_format::largest_power_of_ten() { return 38; } template <> inline constexpr int binary_format::smallest_power_of_ten() { return -342; } template <> inline constexpr int binary_format::smallest_power_of_ten() { return -64; } template <> inline constexpr size_t binary_format::max_digits() { return 769; } template <> inline constexpr size_t binary_format::max_digits() { return 114; } template <> inline constexpr binary_format::equiv_uint binary_format::exponent_mask() { return 0x7F800000; } template <> inline constexpr binary_format::equiv_uint binary_format::exponent_mask() { return 0x7FF0000000000000; } template <> inline constexpr binary_format::equiv_uint binary_format::mantissa_mask() { return 0x007FFFFF; } template <> inline constexpr binary_format::equiv_uint binary_format::mantissa_mask() { return 0x000FFFFFFFFFFFFF; } template <> inline constexpr binary_format::equiv_uint binary_format::hidden_bit_mask() { return 0x00800000; } template <> inline constexpr binary_format::equiv_uint binary_format::hidden_bit_mask() { return 0x0010000000000000; } template fastfloat_really_inline FASTFLOAT_CONSTEXPR20 void to_float(bool negative, adjusted_mantissa am, T &value) { using equiv_uint = equiv_uint_t; equiv_uint word = equiv_uint(am.mantissa); word = equiv_uint(word | equiv_uint(am.power2) << binary_format::mantissa_explicit_bits()); word = equiv_uint(word | equiv_uint(negative) << binary_format::sign_index()); #if FASTFLOAT_HAS_BIT_CAST value = std::bit_cast(word); #else ::memcpy(&value, &word, sizeof(T)); #endif } template struct space_lut { static constexpr bool value[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; }; #if FASTFLOAT_DETAIL_MUST_DEFINE_CONSTEXPR_VARIABLE template constexpr bool space_lut::value[]; #endif template constexpr bool is_space(UC c) { return c < 256 && space_lut<>::value[uint8_t(c)]; } template static constexpr uint64_t int_cmp_zeros() { static_assert((sizeof(UC) == 1) || (sizeof(UC) == 2) || (sizeof(UC) == 4), "Unsupported character size"); return (sizeof(UC) == 1) ? 0x3030303030303030 : (sizeof(UC) == 2) ? (uint64_t(UC('0')) << 48 | uint64_t(UC('0')) << 32 | uint64_t(UC('0')) << 16 | UC('0')) : (uint64_t(UC('0')) << 32 | UC('0')); } template static constexpr int int_cmp_len() { return sizeof(uint64_t) / sizeof(UC); } template constexpr UC const *str_const_nan(); template <> constexpr char const *str_const_nan() { return "nan"; } template <> constexpr wchar_t const *str_const_nan() { return L"nan"; } template <> constexpr char16_t const *str_const_nan() { return u"nan"; } template <> constexpr char32_t const *str_const_nan() { return U"nan"; } #ifdef __cpp_char8_t template <> constexpr char8_t const *str_const_nan() { return u8"nan"; } #endif template constexpr UC const *str_const_inf(); template <> constexpr char const *str_const_inf() { return "infinity"; } template <> constexpr wchar_t const *str_const_inf() { return L"infinity"; } template <> constexpr char16_t const *str_const_inf() { return u"infinity"; } template <> constexpr char32_t const *str_const_inf() { return U"infinity"; } #ifdef __cpp_char8_t template <> constexpr char8_t const *str_const_inf() { return u8"infinity"; } #endif template struct int_luts { static constexpr uint8_t chdigit[] = { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 255, 255, 255, 255, 255, 255, 255, 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, 255, 255, 255, 255, 255, 255, 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, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255}; static constexpr size_t maxdigits_u64[] = { 64, 41, 32, 28, 25, 23, 22, 21, 20, 19, 18, 18, 17, 17, 16, 16, 16, 16, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13}; static constexpr uint64_t min_safe_u64[] = { 9223372036854775808ull, 12157665459056928801ull, 4611686018427387904, 7450580596923828125, 4738381338321616896, 3909821048582988049, 9223372036854775808ull, 12157665459056928801ull, 10000000000000000000ull, 5559917313492231481, 2218611106740436992, 8650415919381337933, 2177953337809371136, 6568408355712890625, 1152921504606846976, 2862423051509815793, 6746640616477458432, 15181127029874798299ull, 1638400000000000000, 3243919932521508681, 6221821273427820544, 11592836324538749809ull, 876488338465357824, 1490116119384765625, 2481152873203736576, 4052555153018976267, 6502111422497947648, 10260628712958602189ull, 15943230000000000000ull, 787662783788549761, 1152921504606846976, 1667889514952984961, 2386420683693101056, 3379220508056640625, 4738381338321616896}; }; #if FASTFLOAT_DETAIL_MUST_DEFINE_CONSTEXPR_VARIABLE template constexpr uint8_t int_luts::chdigit[]; template constexpr size_t int_luts::maxdigits_u64[]; template constexpr uint64_t int_luts::min_safe_u64[]; #endif template fastfloat_really_inline constexpr uint8_t ch_to_digit(UC c) { return int_luts<>::chdigit[static_cast(c)]; } fastfloat_really_inline constexpr size_t max_digits_u64(int base) { return int_luts<>::maxdigits_u64[base - 2]; } // If a u64 is exactly max_digits_u64() in length, this is // the value below which it has definitely overflowed. fastfloat_really_inline constexpr uint64_t min_safe_u64(int base) { return int_luts<>::min_safe_u64[base - 2]; } static_assert(std::is_same, uint64_t>::value, "equiv_uint should be uint64_t for double"); static_assert(std::numeric_limits::is_iec559, "double must fulfill the requirements of IEC 559 (IEEE 754)"); static_assert(std::is_same, uint32_t>::value, "equiv_uint should be uint32_t for float"); static_assert(std::numeric_limits::is_iec559, "float must fulfill the requirements of IEC 559 (IEEE 754)"); #ifdef __STDCPP_FLOAT64_T__ static_assert(std::is_same, uint64_t>::value, "equiv_uint should be uint64_t for std::float64_t"); static_assert( std::numeric_limits::is_iec559, "std::float64_t must fulfill the requirements of IEC 559 (IEEE 754)"); #endif // __STDCPP_FLOAT64_T__ #ifdef __STDCPP_FLOAT32_T__ static_assert(std::is_same, uint32_t>::value, "equiv_uint should be uint32_t for std::float32_t"); static_assert( std::numeric_limits::is_iec559, "std::float32_t must fulfill the requirements of IEC 559 (IEEE 754)"); #endif // __STDCPP_FLOAT32_T__ #ifdef __STDCPP_FLOAT16_T__ static_assert( std::is_same::equiv_uint, uint16_t>::value, "equiv_uint should be uint16_t for std::float16_t"); static_assert( std::numeric_limits::is_iec559, "std::float16_t must fulfill the requirements of IEC 559 (IEEE 754)"); #endif // __STDCPP_FLOAT16_T__ #ifdef __STDCPP_BFLOAT16_T__ static_assert( std::is_same::equiv_uint, uint16_t>::value, "equiv_uint should be uint16_t for std::bfloat16_t"); static_assert( std::numeric_limits::is_iec559, "std::bfloat16_t must fulfill the requirements of IEC 559 (IEEE 754)"); #endif // __STDCPP_BFLOAT16_T__ constexpr chars_format operator~(chars_format rhs) noexcept { using int_type = std::underlying_type::type; return static_cast(~static_cast(rhs)); } constexpr chars_format operator&(chars_format lhs, chars_format rhs) noexcept { using int_type = std::underlying_type::type; return static_cast(static_cast(lhs) & static_cast(rhs)); } constexpr chars_format operator|(chars_format lhs, chars_format rhs) noexcept { using int_type = std::underlying_type::type; return static_cast(static_cast(lhs) | static_cast(rhs)); } constexpr chars_format operator^(chars_format lhs, chars_format rhs) noexcept { using int_type = std::underlying_type::type; return static_cast(static_cast(lhs) ^ static_cast(rhs)); } fastfloat_really_inline FASTFLOAT_CONSTEXPR14 chars_format & operator&=(chars_format &lhs, chars_format rhs) noexcept { return lhs = (lhs & rhs); } fastfloat_really_inline FASTFLOAT_CONSTEXPR14 chars_format & operator|=(chars_format &lhs, chars_format rhs) noexcept { return lhs = (lhs | rhs); } fastfloat_really_inline FASTFLOAT_CONSTEXPR14 chars_format & operator^=(chars_format &lhs, chars_format rhs) noexcept { return lhs = (lhs ^ rhs); } namespace detail { // adjust for deprecated feature macros constexpr chars_format adjust_for_feature_macros(chars_format fmt) { return fmt #ifdef FASTFLOAT_ALLOWS_LEADING_PLUS | chars_format::allow_leading_plus #endif #ifdef FASTFLOAT_SKIP_WHITE_SPACE | chars_format::skip_white_space #endif ; } } // namespace detail } // namespace fast_float #endif #ifndef FASTFLOAT_FAST_FLOAT_H #define FASTFLOAT_FAST_FLOAT_H namespace fast_float { /** * This function parses the character sequence [first,last) for a number. It * parses floating-point numbers expecting a locale-indepent format equivalent * to what is used by std::strtod in the default ("C") locale. The resulting * floating-point value is the closest floating-point values (using either float * or double), using the "round to even" convention for values that would * otherwise fall right in-between two values. That is, we provide exact parsing * according to the IEEE standard. * * Given a successful parse, the pointer (`ptr`) in the returned value is set to * point right after the parsed number, and the `value` referenced is set to the * parsed value. In case of error, the returned `ec` contains a representative * error, otherwise the default (`std::errc()`) value is stored. * * The implementation does not throw and does not allocate memory (e.g., with * `new` or `malloc`). * * Like the C++17 standard, the `fast_float::from_chars` functions take an * optional last argument of the type `fast_float::chars_format`. It is a bitset * value: we check whether `fmt & fast_float::chars_format::fixed` and `fmt & * fast_float::chars_format::scientific` are set to determine whether we allow * the fixed point and scientific notation respectively. The default is * `fast_float::chars_format::general` which allows both `fixed` and * `scientific`. */ template ::value)> FASTFLOAT_CONSTEXPR20 from_chars_result_t from_chars(UC const *first, UC const *last, T &value, chars_format fmt = chars_format::general) noexcept; /** * Like from_chars, but accepts an `options` argument to govern number parsing. * Both for floating-point types and integer types. */ template FASTFLOAT_CONSTEXPR20 from_chars_result_t from_chars_advanced(UC const *first, UC const *last, T &value, parse_options_t options) noexcept; /** * from_chars for integer types. */ template ::value)> FASTFLOAT_CONSTEXPR20 from_chars_result_t from_chars(UC const *first, UC const *last, T &value, int base = 10) noexcept; } // namespace fast_float #endif // FASTFLOAT_FAST_FLOAT_H #ifndef FASTFLOAT_ASCII_NUMBER_H #define FASTFLOAT_ASCII_NUMBER_H #include #include #include #include #include #include #ifdef FASTFLOAT_SSE2 #include #endif #ifdef FASTFLOAT_NEON #include #endif namespace fast_float { template fastfloat_really_inline constexpr bool has_simd_opt() { #ifdef FASTFLOAT_HAS_SIMD return std::is_same::value; #else return false; #endif } // Next function can be micro-optimized, but compilers are entirely // able to optimize it well. template fastfloat_really_inline constexpr bool is_integer(UC c) noexcept { return !(c > UC('9') || c < UC('0')); } fastfloat_really_inline constexpr uint64_t byteswap(uint64_t val) { return (val & 0xFF00000000000000) >> 56 | (val & 0x00FF000000000000) >> 40 | (val & 0x0000FF0000000000) >> 24 | (val & 0x000000FF00000000) >> 8 | (val & 0x00000000FF000000) << 8 | (val & 0x0000000000FF0000) << 24 | (val & 0x000000000000FF00) << 40 | (val & 0x00000000000000FF) << 56; } // Read 8 UC into a u64. Truncates UC if not char. template fastfloat_really_inline FASTFLOAT_CONSTEXPR20 uint64_t read8_to_u64(UC const *chars) { if (cpp20_and_in_constexpr() || !std::is_same::value) { uint64_t val = 0; for (int i = 0; i < 8; ++i) { val |= uint64_t(uint8_t(*chars)) << (i * 8); ++chars; } return val; } uint64_t val; ::memcpy(&val, chars, sizeof(uint64_t)); #if FASTFLOAT_IS_BIG_ENDIAN == 1 // Need to read as-if the number was in little-endian order. val = byteswap(val); #endif return val; } #ifdef FASTFLOAT_SSE2 fastfloat_really_inline uint64_t simd_read8_to_u64(__m128i const data) { FASTFLOAT_SIMD_DISABLE_WARNINGS __m128i const packed = _mm_packus_epi16(data, data); #ifdef FASTFLOAT_64BIT return uint64_t(_mm_cvtsi128_si64(packed)); #else uint64_t value; // Visual Studio + older versions of GCC don't support _mm_storeu_si64 _mm_storel_epi64(reinterpret_cast<__m128i *>(&value), packed); return value; #endif FASTFLOAT_SIMD_RESTORE_WARNINGS } fastfloat_really_inline uint64_t simd_read8_to_u64(char16_t const *chars) { FASTFLOAT_SIMD_DISABLE_WARNINGS return simd_read8_to_u64( _mm_loadu_si128(reinterpret_cast<__m128i const *>(chars))); FASTFLOAT_SIMD_RESTORE_WARNINGS } #elif defined(FASTFLOAT_NEON) fastfloat_really_inline uint64_t simd_read8_to_u64(uint16x8_t const data) { FASTFLOAT_SIMD_DISABLE_WARNINGS uint8x8_t utf8_packed = vmovn_u16(data); return vget_lane_u64(vreinterpret_u64_u8(utf8_packed), 0); FASTFLOAT_SIMD_RESTORE_WARNINGS } fastfloat_really_inline uint64_t simd_read8_to_u64(char16_t const *chars) { FASTFLOAT_SIMD_DISABLE_WARNINGS return simd_read8_to_u64( vld1q_u16(reinterpret_cast(chars))); FASTFLOAT_SIMD_RESTORE_WARNINGS } #endif // FASTFLOAT_SSE2 // MSVC SFINAE is broken pre-VS2017 #if defined(_MSC_VER) && _MSC_VER <= 1900 template #else template ()) = 0> #endif // dummy for compile uint64_t simd_read8_to_u64(UC const *) { return 0; } // credit @aqrit fastfloat_really_inline FASTFLOAT_CONSTEXPR14 uint32_t parse_eight_digits_unrolled(uint64_t val) { uint64_t const mask = 0x000000FF000000FF; uint64_t const mul1 = 0x000F424000000064; // 100 + (1000000ULL << 32) uint64_t const mul2 = 0x0000271000000001; // 1 + (10000ULL << 32) val -= 0x3030303030303030; val = (val * 10) + (val >> 8); // val = (val * 2561) >> 8; val = (((val & mask) * mul1) + (((val >> 16) & mask) * mul2)) >> 32; return uint32_t(val); } // Call this if chars are definitely 8 digits. template fastfloat_really_inline FASTFLOAT_CONSTEXPR20 uint32_t parse_eight_digits_unrolled(UC const *chars) noexcept { if (cpp20_and_in_constexpr() || !has_simd_opt()) { return parse_eight_digits_unrolled(read8_to_u64(chars)); // truncation okay } return parse_eight_digits_unrolled(simd_read8_to_u64(chars)); } // credit @aqrit fastfloat_really_inline constexpr bool is_made_of_eight_digits_fast(uint64_t val) noexcept { return !((((val + 0x4646464646464646) | (val - 0x3030303030303030)) & 0x8080808080808080)); } #ifdef FASTFLOAT_HAS_SIMD // Call this if chars might not be 8 digits. // Using this style (instead of is_made_of_eight_digits_fast() then // parse_eight_digits_unrolled()) ensures we don't load SIMD registers twice. fastfloat_really_inline FASTFLOAT_CONSTEXPR20 bool simd_parse_if_eight_digits_unrolled(char16_t const *chars, uint64_t &i) noexcept { if (cpp20_and_in_constexpr()) { return false; } #ifdef FASTFLOAT_SSE2 FASTFLOAT_SIMD_DISABLE_WARNINGS __m128i const data = _mm_loadu_si128(reinterpret_cast<__m128i const *>(chars)); // (x - '0') <= 9 // http://0x80.pl/articles/simd-parsing-int-sequences.html __m128i const t0 = _mm_add_epi16(data, _mm_set1_epi16(32720)); __m128i const t1 = _mm_cmpgt_epi16(t0, _mm_set1_epi16(-32759)); if (_mm_movemask_epi8(t1) == 0) { i = i * 100000000 + parse_eight_digits_unrolled(simd_read8_to_u64(data)); return true; } else return false; FASTFLOAT_SIMD_RESTORE_WARNINGS #elif defined(FASTFLOAT_NEON) FASTFLOAT_SIMD_DISABLE_WARNINGS uint16x8_t const data = vld1q_u16(reinterpret_cast(chars)); // (x - '0') <= 9 // http://0x80.pl/articles/simd-parsing-int-sequences.html uint16x8_t const t0 = vsubq_u16(data, vmovq_n_u16('0')); uint16x8_t const mask = vcltq_u16(t0, vmovq_n_u16('9' - '0' + 1)); if (vminvq_u16(mask) == 0xFFFF) { i = i * 100000000 + parse_eight_digits_unrolled(simd_read8_to_u64(data)); return true; } else return false; FASTFLOAT_SIMD_RESTORE_WARNINGS #else (void)chars; (void)i; return false; #endif // FASTFLOAT_SSE2 } #endif // FASTFLOAT_HAS_SIMD // MSVC SFINAE is broken pre-VS2017 #if defined(_MSC_VER) && _MSC_VER <= 1900 template #else template ()) = 0> #endif // dummy for compile bool simd_parse_if_eight_digits_unrolled(UC const *, uint64_t &) { return 0; } template ::value) = 0> fastfloat_really_inline FASTFLOAT_CONSTEXPR20 void loop_parse_if_eight_digits(UC const *&p, UC const *const pend, uint64_t &i) { if (!has_simd_opt()) { return; } while ((std::distance(p, pend) >= 8) && simd_parse_if_eight_digits_unrolled( p, i)) { // in rare cases, this will overflow, but that's ok p += 8; } } fastfloat_really_inline FASTFLOAT_CONSTEXPR20 void loop_parse_if_eight_digits(char const *&p, char const *const pend, uint64_t &i) { // optimizes better than parse_if_eight_digits_unrolled() for UC = char. while ((std::distance(p, pend) >= 8) && is_made_of_eight_digits_fast(read8_to_u64(p))) { i = i * 100000000 + parse_eight_digits_unrolled(read8_to_u64( p)); // in rare cases, this will overflow, but that's ok p += 8; } } enum class parse_error { no_error, // [JSON-only] The minus sign must be followed by an integer. missing_integer_after_sign, // A sign must be followed by an integer or dot. missing_integer_or_dot_after_sign, // [JSON-only] The integer part must not have leading zeros. leading_zeros_in_integer_part, // [JSON-only] The integer part must have at least one digit. no_digits_in_integer_part, // [JSON-only] If there is a decimal point, there must be digits in the // fractional part. no_digits_in_fractional_part, // The mantissa must have at least one digit. no_digits_in_mantissa, // Scientific notation requires an exponential part. missing_exponential_part, }; template struct parsed_number_string_t { int64_t exponent{0}; uint64_t mantissa{0}; UC const *lastmatch{nullptr}; bool negative{false}; bool valid{false}; bool too_many_digits{false}; // contains the range of the significant digits span integer{}; // non-nullable span fraction{}; // nullable parse_error error{parse_error::no_error}; }; using byte_span = span; using parsed_number_string = parsed_number_string_t; template fastfloat_really_inline FASTFLOAT_CONSTEXPR20 parsed_number_string_t report_parse_error(UC const *p, parse_error error) { parsed_number_string_t answer; answer.valid = false; answer.lastmatch = p; answer.error = error; return answer; } // Assuming that you use no more than 19 digits, this will // parse an ASCII string. template fastfloat_really_inline FASTFLOAT_CONSTEXPR20 parsed_number_string_t parse_number_string(UC const *p, UC const *pend, parse_options_t options) noexcept { chars_format const fmt = detail::adjust_for_feature_macros(options.format); UC const decimal_point = options.decimal_point; parsed_number_string_t answer; answer.valid = false; answer.too_many_digits = false; // assume p < pend, so dereference without checks; answer.negative = (*p == UC('-')); // C++17 20.19.3.(7.1) explicitly forbids '+' sign here if ((*p == UC('-')) || (uint64_t(fmt & chars_format::allow_leading_plus) && !uint64_t(fmt & detail::basic_json_fmt) && *p == UC('+'))) { ++p; if (p == pend) { return report_parse_error( p, parse_error::missing_integer_or_dot_after_sign); } if (uint64_t(fmt & detail::basic_json_fmt)) { if (!is_integer(*p)) { // a sign must be followed by an integer return report_parse_error(p, parse_error::missing_integer_after_sign); } } else { if (!is_integer(*p) && (*p != decimal_point)) { // a sign must be followed by an integer or the dot return report_parse_error( p, parse_error::missing_integer_or_dot_after_sign); } } } UC const *const start_digits = p; uint64_t i = 0; // an unsigned int avoids signed overflows (which are bad) while ((p != pend) && is_integer(*p)) { // a multiplication by 10 is cheaper than an arbitrary integer // multiplication i = 10 * i + uint64_t(*p - UC('0')); // might overflow, we will handle the overflow later ++p; } UC const *const end_of_integer_part = p; int64_t digit_count = int64_t(end_of_integer_part - start_digits); answer.integer = span(start_digits, size_t(digit_count)); if (uint64_t(fmt & detail::basic_json_fmt)) { // at least 1 digit in integer part, without leading zeros if (digit_count == 0) { return report_parse_error(p, parse_error::no_digits_in_integer_part); } if ((start_digits[0] == UC('0') && digit_count > 1)) { return report_parse_error(start_digits, parse_error::leading_zeros_in_integer_part); } } int64_t exponent = 0; bool const has_decimal_point = (p != pend) && (*p == decimal_point); if (has_decimal_point) { ++p; UC const *before = p; // can occur at most twice without overflowing, but let it occur more, since // for integers with many digits, digit parsing is the primary bottleneck. loop_parse_if_eight_digits(p, pend, i); while ((p != pend) && is_integer(*p)) { uint8_t digit = uint8_t(*p - UC('0')); ++p; i = i * 10 + digit; // in rare cases, this will overflow, but that's ok } exponent = before - p; answer.fraction = span(before, size_t(p - before)); digit_count -= exponent; } if (uint64_t(fmt & detail::basic_json_fmt)) { // at least 1 digit in fractional part if (has_decimal_point && exponent == 0) { return report_parse_error(p, parse_error::no_digits_in_fractional_part); } } else if (digit_count == 0) { // we must have encountered at least one integer! return report_parse_error(p, parse_error::no_digits_in_mantissa); } int64_t exp_number = 0; // explicit exponential part if ((uint64_t(fmt & chars_format::scientific) && (p != pend) && ((UC('e') == *p) || (UC('E') == *p))) || (uint64_t(fmt & detail::basic_fortran_fmt) && (p != pend) && ((UC('+') == *p) || (UC('-') == *p) || (UC('d') == *p) || (UC('D') == *p)))) { UC const *location_of_e = p; if ((UC('e') == *p) || (UC('E') == *p) || (UC('d') == *p) || (UC('D') == *p)) { ++p; } bool neg_exp = false; if ((p != pend) && (UC('-') == *p)) { neg_exp = true; ++p; } else if ((p != pend) && (UC('+') == *p)) { // '+' on exponent is allowed by C++17 20.19.3.(7.1) ++p; } if ((p == pend) || !is_integer(*p)) { if (!uint64_t(fmt & chars_format::fixed)) { // The exponential part is invalid for scientific notation, so it must // be a trailing token for fixed notation. However, fixed notation is // disabled, so report a scientific notation error. return report_parse_error(p, parse_error::missing_exponential_part); } // Otherwise, we will be ignoring the 'e'. p = location_of_e; } else { while ((p != pend) && is_integer(*p)) { uint8_t digit = uint8_t(*p - UC('0')); if (exp_number < 0x10000000) { exp_number = 10 * exp_number + digit; } ++p; } if (neg_exp) { exp_number = -exp_number; } exponent += exp_number; } } else { // If it scientific and not fixed, we have to bail out. if (uint64_t(fmt & chars_format::scientific) && !uint64_t(fmt & chars_format::fixed)) { return report_parse_error(p, parse_error::missing_exponential_part); } } answer.lastmatch = p; answer.valid = true; // If we frequently had to deal with long strings of digits, // we could extend our code by using a 128-bit integer instead // of a 64-bit integer. However, this is uncommon. // // We can deal with up to 19 digits. if (digit_count > 19) { // this is uncommon // It is possible that the integer had an overflow. // We have to handle the case where we have 0.0000somenumber. // We need to be mindful of the case where we only have zeroes... // E.g., 0.000000000...000. UC const *start = start_digits; while ((start != pend) && (*start == UC('0') || *start == decimal_point)) { if (*start == UC('0')) { digit_count--; } start++; } if (digit_count > 19) { answer.too_many_digits = true; // Let us start again, this time, avoiding overflows. // We don't need to check if is_integer, since we use the // pre-tokenized spans from above. i = 0; p = answer.integer.ptr; UC const *int_end = p + answer.integer.len(); uint64_t const minimal_nineteen_digit_integer{1000000000000000000}; while ((i < minimal_nineteen_digit_integer) && (p != int_end)) { i = i * 10 + uint64_t(*p - UC('0')); ++p; } if (i >= minimal_nineteen_digit_integer) { // We have a big integers exponent = end_of_integer_part - p + exp_number; } else { // We have a value with a fractional component. p = answer.fraction.ptr; UC const *frac_end = p + answer.fraction.len(); while ((i < minimal_nineteen_digit_integer) && (p != frac_end)) { i = i * 10 + uint64_t(*p - UC('0')); ++p; } exponent = answer.fraction.ptr - p + exp_number; } // We have now corrected both exponent and i, to a truncated value } } answer.exponent = exponent; answer.mantissa = i; return answer; } template fastfloat_really_inline FASTFLOAT_CONSTEXPR20 from_chars_result_t parse_int_string(UC const *p, UC const *pend, T &value, parse_options_t options) { chars_format const fmt = detail::adjust_for_feature_macros(options.format); int const base = options.base; from_chars_result_t answer; UC const *const first = p; bool const negative = (*p == UC('-')); #ifdef FASTFLOAT_VISUAL_STUDIO #pragma warning(push) #pragma warning(disable : 4127) #endif if (!std::is_signed::value && negative) { #ifdef FASTFLOAT_VISUAL_STUDIO #pragma warning(pop) #endif answer.ec = std::errc::invalid_argument; answer.ptr = first; return answer; } if ((*p == UC('-')) || (uint64_t(fmt & chars_format::allow_leading_plus) && (*p == UC('+')))) { ++p; } UC const *const start_num = p; while (p != pend && *p == UC('0')) { ++p; } bool const has_leading_zeros = p > start_num; UC const *const start_digits = p; uint64_t i = 0; if (base == 10) { loop_parse_if_eight_digits(p, pend, i); // use SIMD if possible } while (p != pend) { uint8_t digit = ch_to_digit(*p); if (digit >= base) { break; } i = uint64_t(base) * i + digit; // might overflow, check this later p++; } size_t digit_count = size_t(p - start_digits); if (digit_count == 0) { if (has_leading_zeros) { value = 0; answer.ec = std::errc(); answer.ptr = p; } else { answer.ec = std::errc::invalid_argument; answer.ptr = first; } return answer; } answer.ptr = p; // check u64 overflow size_t max_digits = max_digits_u64(base); if (digit_count > max_digits) { answer.ec = std::errc::result_out_of_range; return answer; } // this check can be eliminated for all other types, but they will all require // a max_digits(base) equivalent if (digit_count == max_digits && i < min_safe_u64(base)) { answer.ec = std::errc::result_out_of_range; return answer; } // check other types overflow if (!std::is_same::value) { if (i > uint64_t(std::numeric_limits::max()) + uint64_t(negative)) { answer.ec = std::errc::result_out_of_range; return answer; } } if (negative) { #ifdef FASTFLOAT_VISUAL_STUDIO #pragma warning(push) #pragma warning(disable : 4146) #endif // this weird workaround is required because: // - converting unsigned to signed when its value is greater than signed max // is UB pre-C++23. // - reinterpret_casting (~i + 1) would work, but it is not constexpr // this is always optimized into a neg instruction (note: T is an integer // type) value = T(-std::numeric_limits::max() - T(i - uint64_t(std::numeric_limits::max()))); #ifdef FASTFLOAT_VISUAL_STUDIO #pragma warning(pop) #endif } else { value = T(i); } answer.ec = std::errc(); return answer; } } // namespace fast_float #endif #ifndef FASTFLOAT_FAST_TABLE_H #define FASTFLOAT_FAST_TABLE_H #include namespace fast_float { /** * When mapping numbers from decimal to binary, * we go from w * 10^q to m * 2^p but we have * 10^q = 5^q * 2^q, so effectively * we are trying to match * w * 2^q * 5^q to m * 2^p. Thus the powers of two * are not a concern since they can be represented * exactly using the binary notation, only the powers of five * affect the binary significand. */ /** * The smallest non-zero float (binary64) is 2^-1074. * We take as input numbers of the form w x 10^q where w < 2^64. * We have that w * 10^-343 < 2^(64-344) 5^-343 < 2^-1076. * However, we have that * (2^64-1) * 10^-342 = (2^64-1) * 2^-342 * 5^-342 > 2^-1074. * Thus it is possible for a number of the form w * 10^-342 where * w is a 64-bit value to be a non-zero floating-point number. ********* * Any number of form w * 10^309 where w>= 1 is going to be * infinite in binary64 so we never need to worry about powers * of 5 greater than 308. */ template struct powers_template { constexpr static int smallest_power_of_five = binary_format::smallest_power_of_ten(); constexpr static int largest_power_of_five = binary_format::largest_power_of_ten(); constexpr static int number_of_entries = 2 * (largest_power_of_five - smallest_power_of_five + 1); // Powers of five from 5^-342 all the way to 5^308 rounded toward one. constexpr static uint64_t power_of_five_128[number_of_entries] = { 0xeef453d6923bd65a, 0x113faa2906a13b3f, 0x9558b4661b6565f8, 0x4ac7ca59a424c507, 0xbaaee17fa23ebf76, 0x5d79bcf00d2df649, 0xe95a99df8ace6f53, 0xf4d82c2c107973dc, 0x91d8a02bb6c10594, 0x79071b9b8a4be869, 0xb64ec836a47146f9, 0x9748e2826cdee284, 0xe3e27a444d8d98b7, 0xfd1b1b2308169b25, 0x8e6d8c6ab0787f72, 0xfe30f0f5e50e20f7, 0xb208ef855c969f4f, 0xbdbd2d335e51a935, 0xde8b2b66b3bc4723, 0xad2c788035e61382, 0x8b16fb203055ac76, 0x4c3bcb5021afcc31, 0xaddcb9e83c6b1793, 0xdf4abe242a1bbf3d, 0xd953e8624b85dd78, 0xd71d6dad34a2af0d, 0x87d4713d6f33aa6b, 0x8672648c40e5ad68, 0xa9c98d8ccb009506, 0x680efdaf511f18c2, 0xd43bf0effdc0ba48, 0x212bd1b2566def2, 0x84a57695fe98746d, 0x14bb630f7604b57, 0xa5ced43b7e3e9188, 0x419ea3bd35385e2d, 0xcf42894a5dce35ea, 0x52064cac828675b9, 0x818995ce7aa0e1b2, 0x7343efebd1940993, 0xa1ebfb4219491a1f, 0x1014ebe6c5f90bf8, 0xca66fa129f9b60a6, 0xd41a26e077774ef6, 0xfd00b897478238d0, 0x8920b098955522b4, 0x9e20735e8cb16382, 0x55b46e5f5d5535b0, 0xc5a890362fddbc62, 0xeb2189f734aa831d, 0xf712b443bbd52b7b, 0xa5e9ec7501d523e4, 0x9a6bb0aa55653b2d, 0x47b233c92125366e, 0xc1069cd4eabe89f8, 0x999ec0bb696e840a, 0xf148440a256e2c76, 0xc00670ea43ca250d, 0x96cd2a865764dbca, 0x380406926a5e5728, 0xbc807527ed3e12bc, 0xc605083704f5ecf2, 0xeba09271e88d976b, 0xf7864a44c633682e, 0x93445b8731587ea3, 0x7ab3ee6afbe0211d, 0xb8157268fdae9e4c, 0x5960ea05bad82964, 0xe61acf033d1a45df, 0x6fb92487298e33bd, 0x8fd0c16206306bab, 0xa5d3b6d479f8e056, 0xb3c4f1ba87bc8696, 0x8f48a4899877186c, 0xe0b62e2929aba83c, 0x331acdabfe94de87, 0x8c71dcd9ba0b4925, 0x9ff0c08b7f1d0b14, 0xaf8e5410288e1b6f, 0x7ecf0ae5ee44dd9, 0xdb71e91432b1a24a, 0xc9e82cd9f69d6150, 0x892731ac9faf056e, 0xbe311c083a225cd2, 0xab70fe17c79ac6ca, 0x6dbd630a48aaf406, 0xd64d3d9db981787d, 0x92cbbccdad5b108, 0x85f0468293f0eb4e, 0x25bbf56008c58ea5, 0xa76c582338ed2621, 0xaf2af2b80af6f24e, 0xd1476e2c07286faa, 0x1af5af660db4aee1, 0x82cca4db847945ca, 0x50d98d9fc890ed4d, 0xa37fce126597973c, 0xe50ff107bab528a0, 0xcc5fc196fefd7d0c, 0x1e53ed49a96272c8, 0xff77b1fcbebcdc4f, 0x25e8e89c13bb0f7a, 0x9faacf3df73609b1, 0x77b191618c54e9ac, 0xc795830d75038c1d, 0xd59df5b9ef6a2417, 0xf97ae3d0d2446f25, 0x4b0573286b44ad1d, 0x9becce62836ac577, 0x4ee367f9430aec32, 0xc2e801fb244576d5, 0x229c41f793cda73f, 0xf3a20279ed56d48a, 0x6b43527578c1110f, 0x9845418c345644d6, 0x830a13896b78aaa9, 0xbe5691ef416bd60c, 0x23cc986bc656d553, 0xedec366b11c6cb8f, 0x2cbfbe86b7ec8aa8, 0x94b3a202eb1c3f39, 0x7bf7d71432f3d6a9, 0xb9e08a83a5e34f07, 0xdaf5ccd93fb0cc53, 0xe858ad248f5c22c9, 0xd1b3400f8f9cff68, 0x91376c36d99995be, 0x23100809b9c21fa1, 0xb58547448ffffb2d, 0xabd40a0c2832a78a, 0xe2e69915b3fff9f9, 0x16c90c8f323f516c, 0x8dd01fad907ffc3b, 0xae3da7d97f6792e3, 0xb1442798f49ffb4a, 0x99cd11cfdf41779c, 0xdd95317f31c7fa1d, 0x40405643d711d583, 0x8a7d3eef7f1cfc52, 0x482835ea666b2572, 0xad1c8eab5ee43b66, 0xda3243650005eecf, 0xd863b256369d4a40, 0x90bed43e40076a82, 0x873e4f75e2224e68, 0x5a7744a6e804a291, 0xa90de3535aaae202, 0x711515d0a205cb36, 0xd3515c2831559a83, 0xd5a5b44ca873e03, 0x8412d9991ed58091, 0xe858790afe9486c2, 0xa5178fff668ae0b6, 0x626e974dbe39a872, 0xce5d73ff402d98e3, 0xfb0a3d212dc8128f, 0x80fa687f881c7f8e, 0x7ce66634bc9d0b99, 0xa139029f6a239f72, 0x1c1fffc1ebc44e80, 0xc987434744ac874e, 0xa327ffb266b56220, 0xfbe9141915d7a922, 0x4bf1ff9f0062baa8, 0x9d71ac8fada6c9b5, 0x6f773fc3603db4a9, 0xc4ce17b399107c22, 0xcb550fb4384d21d3, 0xf6019da07f549b2b, 0x7e2a53a146606a48, 0x99c102844f94e0fb, 0x2eda7444cbfc426d, 0xc0314325637a1939, 0xfa911155fefb5308, 0xf03d93eebc589f88, 0x793555ab7eba27ca, 0x96267c7535b763b5, 0x4bc1558b2f3458de, 0xbbb01b9283253ca2, 0x9eb1aaedfb016f16, 0xea9c227723ee8bcb, 0x465e15a979c1cadc, 0x92a1958a7675175f, 0xbfacd89ec191ec9, 0xb749faed14125d36, 0xcef980ec671f667b, 0xe51c79a85916f484, 0x82b7e12780e7401a, 0x8f31cc0937ae58d2, 0xd1b2ecb8b0908810, 0xb2fe3f0b8599ef07, 0x861fa7e6dcb4aa15, 0xdfbdcece67006ac9, 0x67a791e093e1d49a, 0x8bd6a141006042bd, 0xe0c8bb2c5c6d24e0, 0xaecc49914078536d, 0x58fae9f773886e18, 0xda7f5bf590966848, 0xaf39a475506a899e, 0x888f99797a5e012d, 0x6d8406c952429603, 0xaab37fd7d8f58178, 0xc8e5087ba6d33b83, 0xd5605fcdcf32e1d6, 0xfb1e4a9a90880a64, 0x855c3be0a17fcd26, 0x5cf2eea09a55067f, 0xa6b34ad8c9dfc06f, 0xf42faa48c0ea481e, 0xd0601d8efc57b08b, 0xf13b94daf124da26, 0x823c12795db6ce57, 0x76c53d08d6b70858, 0xa2cb1717b52481ed, 0x54768c4b0c64ca6e, 0xcb7ddcdda26da268, 0xa9942f5dcf7dfd09, 0xfe5d54150b090b02, 0xd3f93b35435d7c4c, 0x9efa548d26e5a6e1, 0xc47bc5014a1a6daf, 0xc6b8e9b0709f109a, 0x359ab6419ca1091b, 0xf867241c8cc6d4c0, 0xc30163d203c94b62, 0x9b407691d7fc44f8, 0x79e0de63425dcf1d, 0xc21094364dfb5636, 0x985915fc12f542e4, 0xf294b943e17a2bc4, 0x3e6f5b7b17b2939d, 0x979cf3ca6cec5b5a, 0xa705992ceecf9c42, 0xbd8430bd08277231, 0x50c6ff782a838353, 0xece53cec4a314ebd, 0xa4f8bf5635246428, 0x940f4613ae5ed136, 0x871b7795e136be99, 0xb913179899f68584, 0x28e2557b59846e3f, 0xe757dd7ec07426e5, 0x331aeada2fe589cf, 0x9096ea6f3848984f, 0x3ff0d2c85def7621, 0xb4bca50b065abe63, 0xfed077a756b53a9, 0xe1ebce4dc7f16dfb, 0xd3e8495912c62894, 0x8d3360f09cf6e4bd, 0x64712dd7abbbd95c, 0xb080392cc4349dec, 0xbd8d794d96aacfb3, 0xdca04777f541c567, 0xecf0d7a0fc5583a0, 0x89e42caaf9491b60, 0xf41686c49db57244, 0xac5d37d5b79b6239, 0x311c2875c522ced5, 0xd77485cb25823ac7, 0x7d633293366b828b, 0x86a8d39ef77164bc, 0xae5dff9c02033197, 0xa8530886b54dbdeb, 0xd9f57f830283fdfc, 0xd267caa862a12d66, 0xd072df63c324fd7b, 0x8380dea93da4bc60, 0x4247cb9e59f71e6d, 0xa46116538d0deb78, 0x52d9be85f074e608, 0xcd795be870516656, 0x67902e276c921f8b, 0x806bd9714632dff6, 0xba1cd8a3db53b6, 0xa086cfcd97bf97f3, 0x80e8a40eccd228a4, 0xc8a883c0fdaf7df0, 0x6122cd128006b2cd, 0xfad2a4b13d1b5d6c, 0x796b805720085f81, 0x9cc3a6eec6311a63, 0xcbe3303674053bb0, 0xc3f490aa77bd60fc, 0xbedbfc4411068a9c, 0xf4f1b4d515acb93b, 0xee92fb5515482d44, 0x991711052d8bf3c5, 0x751bdd152d4d1c4a, 0xbf5cd54678eef0b6, 0xd262d45a78a0635d, 0xef340a98172aace4, 0x86fb897116c87c34, 0x9580869f0e7aac0e, 0xd45d35e6ae3d4da0, 0xbae0a846d2195712, 0x8974836059cca109, 0xe998d258869facd7, 0x2bd1a438703fc94b, 0x91ff83775423cc06, 0x7b6306a34627ddcf, 0xb67f6455292cbf08, 0x1a3bc84c17b1d542, 0xe41f3d6a7377eeca, 0x20caba5f1d9e4a93, 0x8e938662882af53e, 0x547eb47b7282ee9c, 0xb23867fb2a35b28d, 0xe99e619a4f23aa43, 0xdec681f9f4c31f31, 0x6405fa00e2ec94d4, 0x8b3c113c38f9f37e, 0xde83bc408dd3dd04, 0xae0b158b4738705e, 0x9624ab50b148d445, 0xd98ddaee19068c76, 0x3badd624dd9b0957, 0x87f8a8d4cfa417c9, 0xe54ca5d70a80e5d6, 0xa9f6d30a038d1dbc, 0x5e9fcf4ccd211f4c, 0xd47487cc8470652b, 0x7647c3200069671f, 0x84c8d4dfd2c63f3b, 0x29ecd9f40041e073, 0xa5fb0a17c777cf09, 0xf468107100525890, 0xcf79cc9db955c2cc, 0x7182148d4066eeb4, 0x81ac1fe293d599bf, 0xc6f14cd848405530, 0xa21727db38cb002f, 0xb8ada00e5a506a7c, 0xca9cf1d206fdc03b, 0xa6d90811f0e4851c, 0xfd442e4688bd304a, 0x908f4a166d1da663, 0x9e4a9cec15763e2e, 0x9a598e4e043287fe, 0xc5dd44271ad3cdba, 0x40eff1e1853f29fd, 0xf7549530e188c128, 0xd12bee59e68ef47c, 0x9a94dd3e8cf578b9, 0x82bb74f8301958ce, 0xc13a148e3032d6e7, 0xe36a52363c1faf01, 0xf18899b1bc3f8ca1, 0xdc44e6c3cb279ac1, 0x96f5600f15a7b7e5, 0x29ab103a5ef8c0b9, 0xbcb2b812db11a5de, 0x7415d448f6b6f0e7, 0xebdf661791d60f56, 0x111b495b3464ad21, 0x936b9fcebb25c995, 0xcab10dd900beec34, 0xb84687c269ef3bfb, 0x3d5d514f40eea742, 0xe65829b3046b0afa, 0xcb4a5a3112a5112, 0x8ff71a0fe2c2e6dc, 0x47f0e785eaba72ab, 0xb3f4e093db73a093, 0x59ed216765690f56, 0xe0f218b8d25088b8, 0x306869c13ec3532c, 0x8c974f7383725573, 0x1e414218c73a13fb, 0xafbd2350644eeacf, 0xe5d1929ef90898fa, 0xdbac6c247d62a583, 0xdf45f746b74abf39, 0x894bc396ce5da772, 0x6b8bba8c328eb783, 0xab9eb47c81f5114f, 0x66ea92f3f326564, 0xd686619ba27255a2, 0xc80a537b0efefebd, 0x8613fd0145877585, 0xbd06742ce95f5f36, 0xa798fc4196e952e7, 0x2c48113823b73704, 0xd17f3b51fca3a7a0, 0xf75a15862ca504c5, 0x82ef85133de648c4, 0x9a984d73dbe722fb, 0xa3ab66580d5fdaf5, 0xc13e60d0d2e0ebba, 0xcc963fee10b7d1b3, 0x318df905079926a8, 0xffbbcfe994e5c61f, 0xfdf17746497f7052, 0x9fd561f1fd0f9bd3, 0xfeb6ea8bedefa633, 0xc7caba6e7c5382c8, 0xfe64a52ee96b8fc0, 0xf9bd690a1b68637b, 0x3dfdce7aa3c673b0, 0x9c1661a651213e2d, 0x6bea10ca65c084e, 0xc31bfa0fe5698db8, 0x486e494fcff30a62, 0xf3e2f893dec3f126, 0x5a89dba3c3efccfa, 0x986ddb5c6b3a76b7, 0xf89629465a75e01c, 0xbe89523386091465, 0xf6bbb397f1135823, 0xee2ba6c0678b597f, 0x746aa07ded582e2c, 0x94db483840b717ef, 0xa8c2a44eb4571cdc, 0xba121a4650e4ddeb, 0x92f34d62616ce413, 0xe896a0d7e51e1566, 0x77b020baf9c81d17, 0x915e2486ef32cd60, 0xace1474dc1d122e, 0xb5b5ada8aaff80b8, 0xd819992132456ba, 0xe3231912d5bf60e6, 0x10e1fff697ed6c69, 0x8df5efabc5979c8f, 0xca8d3ffa1ef463c1, 0xb1736b96b6fd83b3, 0xbd308ff8a6b17cb2, 0xddd0467c64bce4a0, 0xac7cb3f6d05ddbde, 0x8aa22c0dbef60ee4, 0x6bcdf07a423aa96b, 0xad4ab7112eb3929d, 0x86c16c98d2c953c6, 0xd89d64d57a607744, 0xe871c7bf077ba8b7, 0x87625f056c7c4a8b, 0x11471cd764ad4972, 0xa93af6c6c79b5d2d, 0xd598e40d3dd89bcf, 0xd389b47879823479, 0x4aff1d108d4ec2c3, 0x843610cb4bf160cb, 0xcedf722a585139ba, 0xa54394fe1eedb8fe, 0xc2974eb4ee658828, 0xce947a3da6a9273e, 0x733d226229feea32, 0x811ccc668829b887, 0x806357d5a3f525f, 0xa163ff802a3426a8, 0xca07c2dcb0cf26f7, 0xc9bcff6034c13052, 0xfc89b393dd02f0b5, 0xfc2c3f3841f17c67, 0xbbac2078d443ace2, 0x9d9ba7832936edc0, 0xd54b944b84aa4c0d, 0xc5029163f384a931, 0xa9e795e65d4df11, 0xf64335bcf065d37d, 0x4d4617b5ff4a16d5, 0x99ea0196163fa42e, 0x504bced1bf8e4e45, 0xc06481fb9bcf8d39, 0xe45ec2862f71e1d6, 0xf07da27a82c37088, 0x5d767327bb4e5a4c, 0x964e858c91ba2655, 0x3a6a07f8d510f86f, 0xbbe226efb628afea, 0x890489f70a55368b, 0xeadab0aba3b2dbe5, 0x2b45ac74ccea842e, 0x92c8ae6b464fc96f, 0x3b0b8bc90012929d, 0xb77ada0617e3bbcb, 0x9ce6ebb40173744, 0xe55990879ddcaabd, 0xcc420a6a101d0515, 0x8f57fa54c2a9eab6, 0x9fa946824a12232d, 0xb32df8e9f3546564, 0x47939822dc96abf9, 0xdff9772470297ebd, 0x59787e2b93bc56f7, 0x8bfbea76c619ef36, 0x57eb4edb3c55b65a, 0xaefae51477a06b03, 0xede622920b6b23f1, 0xdab99e59958885c4, 0xe95fab368e45eced, 0x88b402f7fd75539b, 0x11dbcb0218ebb414, 0xaae103b5fcd2a881, 0xd652bdc29f26a119, 0xd59944a37c0752a2, 0x4be76d3346f0495f, 0x857fcae62d8493a5, 0x6f70a4400c562ddb, 0xa6dfbd9fb8e5b88e, 0xcb4ccd500f6bb952, 0xd097ad07a71f26b2, 0x7e2000a41346a7a7, 0x825ecc24c873782f, 0x8ed400668c0c28c8, 0xa2f67f2dfa90563b, 0x728900802f0f32fa, 0xcbb41ef979346bca, 0x4f2b40a03ad2ffb9, 0xfea126b7d78186bc, 0xe2f610c84987bfa8, 0x9f24b832e6b0f436, 0xdd9ca7d2df4d7c9, 0xc6ede63fa05d3143, 0x91503d1c79720dbb, 0xf8a95fcf88747d94, 0x75a44c6397ce912a, 0x9b69dbe1b548ce7c, 0xc986afbe3ee11aba, 0xc24452da229b021b, 0xfbe85badce996168, 0xf2d56790ab41c2a2, 0xfae27299423fb9c3, 0x97c560ba6b0919a5, 0xdccd879fc967d41a, 0xbdb6b8e905cb600f, 0x5400e987bbc1c920, 0xed246723473e3813, 0x290123e9aab23b68, 0x9436c0760c86e30b, 0xf9a0b6720aaf6521, 0xb94470938fa89bce, 0xf808e40e8d5b3e69, 0xe7958cb87392c2c2, 0xb60b1d1230b20e04, 0x90bd77f3483bb9b9, 0xb1c6f22b5e6f48c2, 0xb4ecd5f01a4aa828, 0x1e38aeb6360b1af3, 0xe2280b6c20dd5232, 0x25c6da63c38de1b0, 0x8d590723948a535f, 0x579c487e5a38ad0e, 0xb0af48ec79ace837, 0x2d835a9df0c6d851, 0xdcdb1b2798182244, 0xf8e431456cf88e65, 0x8a08f0f8bf0f156b, 0x1b8e9ecb641b58ff, 0xac8b2d36eed2dac5, 0xe272467e3d222f3f, 0xd7adf884aa879177, 0x5b0ed81dcc6abb0f, 0x86ccbb52ea94baea, 0x98e947129fc2b4e9, 0xa87fea27a539e9a5, 0x3f2398d747b36224, 0xd29fe4b18e88640e, 0x8eec7f0d19a03aad, 0x83a3eeeef9153e89, 0x1953cf68300424ac, 0xa48ceaaab75a8e2b, 0x5fa8c3423c052dd7, 0xcdb02555653131b6, 0x3792f412cb06794d, 0x808e17555f3ebf11, 0xe2bbd88bbee40bd0, 0xa0b19d2ab70e6ed6, 0x5b6aceaeae9d0ec4, 0xc8de047564d20a8b, 0xf245825a5a445275, 0xfb158592be068d2e, 0xeed6e2f0f0d56712, 0x9ced737bb6c4183d, 0x55464dd69685606b, 0xc428d05aa4751e4c, 0xaa97e14c3c26b886, 0xf53304714d9265df, 0xd53dd99f4b3066a8, 0x993fe2c6d07b7fab, 0xe546a8038efe4029, 0xbf8fdb78849a5f96, 0xde98520472bdd033, 0xef73d256a5c0f77c, 0x963e66858f6d4440, 0x95a8637627989aad, 0xdde7001379a44aa8, 0xbb127c53b17ec159, 0x5560c018580d5d52, 0xe9d71b689dde71af, 0xaab8f01e6e10b4a6, 0x9226712162ab070d, 0xcab3961304ca70e8, 0xb6b00d69bb55c8d1, 0x3d607b97c5fd0d22, 0xe45c10c42a2b3b05, 0x8cb89a7db77c506a, 0x8eb98a7a9a5b04e3, 0x77f3608e92adb242, 0xb267ed1940f1c61c, 0x55f038b237591ed3, 0xdf01e85f912e37a3, 0x6b6c46dec52f6688, 0x8b61313bbabce2c6, 0x2323ac4b3b3da015, 0xae397d8aa96c1b77, 0xabec975e0a0d081a, 0xd9c7dced53c72255, 0x96e7bd358c904a21, 0x881cea14545c7575, 0x7e50d64177da2e54, 0xaa242499697392d2, 0xdde50bd1d5d0b9e9, 0xd4ad2dbfc3d07787, 0x955e4ec64b44e864, 0x84ec3c97da624ab4, 0xbd5af13bef0b113e, 0xa6274bbdd0fadd61, 0xecb1ad8aeacdd58e, 0xcfb11ead453994ba, 0x67de18eda5814af2, 0x81ceb32c4b43fcf4, 0x80eacf948770ced7, 0xa2425ff75e14fc31, 0xa1258379a94d028d, 0xcad2f7f5359a3b3e, 0x96ee45813a04330, 0xfd87b5f28300ca0d, 0x8bca9d6e188853fc, 0x9e74d1b791e07e48, 0x775ea264cf55347e, 0xc612062576589dda, 0x95364afe032a819e, 0xf79687aed3eec551, 0x3a83ddbd83f52205, 0x9abe14cd44753b52, 0xc4926a9672793543, 0xc16d9a0095928a27, 0x75b7053c0f178294, 0xf1c90080baf72cb1, 0x5324c68b12dd6339, 0x971da05074da7bee, 0xd3f6fc16ebca5e04, 0xbce5086492111aea, 0x88f4bb1ca6bcf585, 0xec1e4a7db69561a5, 0x2b31e9e3d06c32e6, 0x9392ee8e921d5d07, 0x3aff322e62439fd0, 0xb877aa3236a4b449, 0x9befeb9fad487c3, 0xe69594bec44de15b, 0x4c2ebe687989a9b4, 0x901d7cf73ab0acd9, 0xf9d37014bf60a11, 0xb424dc35095cd80f, 0x538484c19ef38c95, 0xe12e13424bb40e13, 0x2865a5f206b06fba, 0x8cbccc096f5088cb, 0xf93f87b7442e45d4, 0xafebff0bcb24aafe, 0xf78f69a51539d749, 0xdbe6fecebdedd5be, 0xb573440e5a884d1c, 0x89705f4136b4a597, 0x31680a88f8953031, 0xabcc77118461cefc, 0xfdc20d2b36ba7c3e, 0xd6bf94d5e57a42bc, 0x3d32907604691b4d, 0x8637bd05af6c69b5, 0xa63f9a49c2c1b110, 0xa7c5ac471b478423, 0xfcf80dc33721d54, 0xd1b71758e219652b, 0xd3c36113404ea4a9, 0x83126e978d4fdf3b, 0x645a1cac083126ea, 0xa3d70a3d70a3d70a, 0x3d70a3d70a3d70a4, 0xcccccccccccccccc, 0xcccccccccccccccd, 0x8000000000000000, 0x0, 0xa000000000000000, 0x0, 0xc800000000000000, 0x0, 0xfa00000000000000, 0x0, 0x9c40000000000000, 0x0, 0xc350000000000000, 0x0, 0xf424000000000000, 0x0, 0x9896800000000000, 0x0, 0xbebc200000000000, 0x0, 0xee6b280000000000, 0x0, 0x9502f90000000000, 0x0, 0xba43b74000000000, 0x0, 0xe8d4a51000000000, 0x0, 0x9184e72a00000000, 0x0, 0xb5e620f480000000, 0x0, 0xe35fa931a0000000, 0x0, 0x8e1bc9bf04000000, 0x0, 0xb1a2bc2ec5000000, 0x0, 0xde0b6b3a76400000, 0x0, 0x8ac7230489e80000, 0x0, 0xad78ebc5ac620000, 0x0, 0xd8d726b7177a8000, 0x0, 0x878678326eac9000, 0x0, 0xa968163f0a57b400, 0x0, 0xd3c21bcecceda100, 0x0, 0x84595161401484a0, 0x0, 0xa56fa5b99019a5c8, 0x0, 0xcecb8f27f4200f3a, 0x0, 0x813f3978f8940984, 0x4000000000000000, 0xa18f07d736b90be5, 0x5000000000000000, 0xc9f2c9cd04674ede, 0xa400000000000000, 0xfc6f7c4045812296, 0x4d00000000000000, 0x9dc5ada82b70b59d, 0xf020000000000000, 0xc5371912364ce305, 0x6c28000000000000, 0xf684df56c3e01bc6, 0xc732000000000000, 0x9a130b963a6c115c, 0x3c7f400000000000, 0xc097ce7bc90715b3, 0x4b9f100000000000, 0xf0bdc21abb48db20, 0x1e86d40000000000, 0x96769950b50d88f4, 0x1314448000000000, 0xbc143fa4e250eb31, 0x17d955a000000000, 0xeb194f8e1ae525fd, 0x5dcfab0800000000, 0x92efd1b8d0cf37be, 0x5aa1cae500000000, 0xb7abc627050305ad, 0xf14a3d9e40000000, 0xe596b7b0c643c719, 0x6d9ccd05d0000000, 0x8f7e32ce7bea5c6f, 0xe4820023a2000000, 0xb35dbf821ae4f38b, 0xdda2802c8a800000, 0xe0352f62a19e306e, 0xd50b2037ad200000, 0x8c213d9da502de45, 0x4526f422cc340000, 0xaf298d050e4395d6, 0x9670b12b7f410000, 0xdaf3f04651d47b4c, 0x3c0cdd765f114000, 0x88d8762bf324cd0f, 0xa5880a69fb6ac800, 0xab0e93b6efee0053, 0x8eea0d047a457a00, 0xd5d238a4abe98068, 0x72a4904598d6d880, 0x85a36366eb71f041, 0x47a6da2b7f864750, 0xa70c3c40a64e6c51, 0x999090b65f67d924, 0xd0cf4b50cfe20765, 0xfff4b4e3f741cf6d, 0x82818f1281ed449f, 0xbff8f10e7a8921a4, 0xa321f2d7226895c7, 0xaff72d52192b6a0d, 0xcbea6f8ceb02bb39, 0x9bf4f8a69f764490, 0xfee50b7025c36a08, 0x2f236d04753d5b4, 0x9f4f2726179a2245, 0x1d762422c946590, 0xc722f0ef9d80aad6, 0x424d3ad2b7b97ef5, 0xf8ebad2b84e0d58b, 0xd2e0898765a7deb2, 0x9b934c3b330c8577, 0x63cc55f49f88eb2f, 0xc2781f49ffcfa6d5, 0x3cbf6b71c76b25fb, 0xf316271c7fc3908a, 0x8bef464e3945ef7a, 0x97edd871cfda3a56, 0x97758bf0e3cbb5ac, 0xbde94e8e43d0c8ec, 0x3d52eeed1cbea317, 0xed63a231d4c4fb27, 0x4ca7aaa863ee4bdd, 0x945e455f24fb1cf8, 0x8fe8caa93e74ef6a, 0xb975d6b6ee39e436, 0xb3e2fd538e122b44, 0xe7d34c64a9c85d44, 0x60dbbca87196b616, 0x90e40fbeea1d3a4a, 0xbc8955e946fe31cd, 0xb51d13aea4a488dd, 0x6babab6398bdbe41, 0xe264589a4dcdab14, 0xc696963c7eed2dd1, 0x8d7eb76070a08aec, 0xfc1e1de5cf543ca2, 0xb0de65388cc8ada8, 0x3b25a55f43294bcb, 0xdd15fe86affad912, 0x49ef0eb713f39ebe, 0x8a2dbf142dfcc7ab, 0x6e3569326c784337, 0xacb92ed9397bf996, 0x49c2c37f07965404, 0xd7e77a8f87daf7fb, 0xdc33745ec97be906, 0x86f0ac99b4e8dafd, 0x69a028bb3ded71a3, 0xa8acd7c0222311bc, 0xc40832ea0d68ce0c, 0xd2d80db02aabd62b, 0xf50a3fa490c30190, 0x83c7088e1aab65db, 0x792667c6da79e0fa, 0xa4b8cab1a1563f52, 0x577001b891185938, 0xcde6fd5e09abcf26, 0xed4c0226b55e6f86, 0x80b05e5ac60b6178, 0x544f8158315b05b4, 0xa0dc75f1778e39d6, 0x696361ae3db1c721, 0xc913936dd571c84c, 0x3bc3a19cd1e38e9, 0xfb5878494ace3a5f, 0x4ab48a04065c723, 0x9d174b2dcec0e47b, 0x62eb0d64283f9c76, 0xc45d1df942711d9a, 0x3ba5d0bd324f8394, 0xf5746577930d6500, 0xca8f44ec7ee36479, 0x9968bf6abbe85f20, 0x7e998b13cf4e1ecb, 0xbfc2ef456ae276e8, 0x9e3fedd8c321a67e, 0xefb3ab16c59b14a2, 0xc5cfe94ef3ea101e, 0x95d04aee3b80ece5, 0xbba1f1d158724a12, 0xbb445da9ca61281f, 0x2a8a6e45ae8edc97, 0xea1575143cf97226, 0xf52d09d71a3293bd, 0x924d692ca61be758, 0x593c2626705f9c56, 0xb6e0c377cfa2e12e, 0x6f8b2fb00c77836c, 0xe498f455c38b997a, 0xb6dfb9c0f956447, 0x8edf98b59a373fec, 0x4724bd4189bd5eac, 0xb2977ee300c50fe7, 0x58edec91ec2cb657, 0xdf3d5e9bc0f653e1, 0x2f2967b66737e3ed, 0x8b865b215899f46c, 0xbd79e0d20082ee74, 0xae67f1e9aec07187, 0xecd8590680a3aa11, 0xda01ee641a708de9, 0xe80e6f4820cc9495, 0x884134fe908658b2, 0x3109058d147fdcdd, 0xaa51823e34a7eede, 0xbd4b46f0599fd415, 0xd4e5e2cdc1d1ea96, 0x6c9e18ac7007c91a, 0x850fadc09923329e, 0x3e2cf6bc604ddb0, 0xa6539930bf6bff45, 0x84db8346b786151c, 0xcfe87f7cef46ff16, 0xe612641865679a63, 0x81f14fae158c5f6e, 0x4fcb7e8f3f60c07e, 0xa26da3999aef7749, 0xe3be5e330f38f09d, 0xcb090c8001ab551c, 0x5cadf5bfd3072cc5, 0xfdcb4fa002162a63, 0x73d9732fc7c8f7f6, 0x9e9f11c4014dda7e, 0x2867e7fddcdd9afa, 0xc646d63501a1511d, 0xb281e1fd541501b8, 0xf7d88bc24209a565, 0x1f225a7ca91a4226, 0x9ae757596946075f, 0x3375788de9b06958, 0xc1a12d2fc3978937, 0x52d6b1641c83ae, 0xf209787bb47d6b84, 0xc0678c5dbd23a49a, 0x9745eb4d50ce6332, 0xf840b7ba963646e0, 0xbd176620a501fbff, 0xb650e5a93bc3d898, 0xec5d3fa8ce427aff, 0xa3e51f138ab4cebe, 0x93ba47c980e98cdf, 0xc66f336c36b10137, 0xb8a8d9bbe123f017, 0xb80b0047445d4184, 0xe6d3102ad96cec1d, 0xa60dc059157491e5, 0x9043ea1ac7e41392, 0x87c89837ad68db2f, 0xb454e4a179dd1877, 0x29babe4598c311fb, 0xe16a1dc9d8545e94, 0xf4296dd6fef3d67a, 0x8ce2529e2734bb1d, 0x1899e4a65f58660c, 0xb01ae745b101e9e4, 0x5ec05dcff72e7f8f, 0xdc21a1171d42645d, 0x76707543f4fa1f73, 0x899504ae72497eba, 0x6a06494a791c53a8, 0xabfa45da0edbde69, 0x487db9d17636892, 0xd6f8d7509292d603, 0x45a9d2845d3c42b6, 0x865b86925b9bc5c2, 0xb8a2392ba45a9b2, 0xa7f26836f282b732, 0x8e6cac7768d7141e, 0xd1ef0244af2364ff, 0x3207d795430cd926, 0x8335616aed761f1f, 0x7f44e6bd49e807b8, 0xa402b9c5a8d3a6e7, 0x5f16206c9c6209a6, 0xcd036837130890a1, 0x36dba887c37a8c0f, 0x802221226be55a64, 0xc2494954da2c9789, 0xa02aa96b06deb0fd, 0xf2db9baa10b7bd6c, 0xc83553c5c8965d3d, 0x6f92829494e5acc7, 0xfa42a8b73abbf48c, 0xcb772339ba1f17f9, 0x9c69a97284b578d7, 0xff2a760414536efb, 0xc38413cf25e2d70d, 0xfef5138519684aba, 0xf46518c2ef5b8cd1, 0x7eb258665fc25d69, 0x98bf2f79d5993802, 0xef2f773ffbd97a61, 0xbeeefb584aff8603, 0xaafb550ffacfd8fa, 0xeeaaba2e5dbf6784, 0x95ba2a53f983cf38, 0x952ab45cfa97a0b2, 0xdd945a747bf26183, 0xba756174393d88df, 0x94f971119aeef9e4, 0xe912b9d1478ceb17, 0x7a37cd5601aab85d, 0x91abb422ccb812ee, 0xac62e055c10ab33a, 0xb616a12b7fe617aa, 0x577b986b314d6009, 0xe39c49765fdf9d94, 0xed5a7e85fda0b80b, 0x8e41ade9fbebc27d, 0x14588f13be847307, 0xb1d219647ae6b31c, 0x596eb2d8ae258fc8, 0xde469fbd99a05fe3, 0x6fca5f8ed9aef3bb, 0x8aec23d680043bee, 0x25de7bb9480d5854, 0xada72ccc20054ae9, 0xaf561aa79a10ae6a, 0xd910f7ff28069da4, 0x1b2ba1518094da04, 0x87aa9aff79042286, 0x90fb44d2f05d0842, 0xa99541bf57452b28, 0x353a1607ac744a53, 0xd3fa922f2d1675f2, 0x42889b8997915ce8, 0x847c9b5d7c2e09b7, 0x69956135febada11, 0xa59bc234db398c25, 0x43fab9837e699095, 0xcf02b2c21207ef2e, 0x94f967e45e03f4bb, 0x8161afb94b44f57d, 0x1d1be0eebac278f5, 0xa1ba1ba79e1632dc, 0x6462d92a69731732, 0xca28a291859bbf93, 0x7d7b8f7503cfdcfe, 0xfcb2cb35e702af78, 0x5cda735244c3d43e, 0x9defbf01b061adab, 0x3a0888136afa64a7, 0xc56baec21c7a1916, 0x88aaa1845b8fdd0, 0xf6c69a72a3989f5b, 0x8aad549e57273d45, 0x9a3c2087a63f6399, 0x36ac54e2f678864b, 0xc0cb28a98fcf3c7f, 0x84576a1bb416a7dd, 0xf0fdf2d3f3c30b9f, 0x656d44a2a11c51d5, 0x969eb7c47859e743, 0x9f644ae5a4b1b325, 0xbc4665b596706114, 0x873d5d9f0dde1fee, 0xeb57ff22fc0c7959, 0xa90cb506d155a7ea, 0x9316ff75dd87cbd8, 0x9a7f12442d588f2, 0xb7dcbf5354e9bece, 0xc11ed6d538aeb2f, 0xe5d3ef282a242e81, 0x8f1668c8a86da5fa, 0x8fa475791a569d10, 0xf96e017d694487bc, 0xb38d92d760ec4455, 0x37c981dcc395a9ac, 0xe070f78d3927556a, 0x85bbe253f47b1417, 0x8c469ab843b89562, 0x93956d7478ccec8e, 0xaf58416654a6babb, 0x387ac8d1970027b2, 0xdb2e51bfe9d0696a, 0x6997b05fcc0319e, 0x88fcf317f22241e2, 0x441fece3bdf81f03, 0xab3c2fddeeaad25a, 0xd527e81cad7626c3, 0xd60b3bd56a5586f1, 0x8a71e223d8d3b074, 0x85c7056562757456, 0xf6872d5667844e49, 0xa738c6bebb12d16c, 0xb428f8ac016561db, 0xd106f86e69d785c7, 0xe13336d701beba52, 0x82a45b450226b39c, 0xecc0024661173473, 0xa34d721642b06084, 0x27f002d7f95d0190, 0xcc20ce9bd35c78a5, 0x31ec038df7b441f4, 0xff290242c83396ce, 0x7e67047175a15271, 0x9f79a169bd203e41, 0xf0062c6e984d386, 0xc75809c42c684dd1, 0x52c07b78a3e60868, 0xf92e0c3537826145, 0xa7709a56ccdf8a82, 0x9bbcc7a142b17ccb, 0x88a66076400bb691, 0xc2abf989935ddbfe, 0x6acff893d00ea435, 0xf356f7ebf83552fe, 0x583f6b8c4124d43, 0x98165af37b2153de, 0xc3727a337a8b704a, 0xbe1bf1b059e9a8d6, 0x744f18c0592e4c5c, 0xeda2ee1c7064130c, 0x1162def06f79df73, 0x9485d4d1c63e8be7, 0x8addcb5645ac2ba8, 0xb9a74a0637ce2ee1, 0x6d953e2bd7173692, 0xe8111c87c5c1ba99, 0xc8fa8db6ccdd0437, 0x910ab1d4db9914a0, 0x1d9c9892400a22a2, 0xb54d5e4a127f59c8, 0x2503beb6d00cab4b, 0xe2a0b5dc971f303a, 0x2e44ae64840fd61d, 0x8da471a9de737e24, 0x5ceaecfed289e5d2, 0xb10d8e1456105dad, 0x7425a83e872c5f47, 0xdd50f1996b947518, 0xd12f124e28f77719, 0x8a5296ffe33cc92f, 0x82bd6b70d99aaa6f, 0xace73cbfdc0bfb7b, 0x636cc64d1001550b, 0xd8210befd30efa5a, 0x3c47f7e05401aa4e, 0x8714a775e3e95c78, 0x65acfaec34810a71, 0xa8d9d1535ce3b396, 0x7f1839a741a14d0d, 0xd31045a8341ca07c, 0x1ede48111209a050, 0x83ea2b892091e44d, 0x934aed0aab460432, 0xa4e4b66b68b65d60, 0xf81da84d5617853f, 0xce1de40642e3f4b9, 0x36251260ab9d668e, 0x80d2ae83e9ce78f3, 0xc1d72b7c6b426019, 0xa1075a24e4421730, 0xb24cf65b8612f81f, 0xc94930ae1d529cfc, 0xdee033f26797b627, 0xfb9b7cd9a4a7443c, 0x169840ef017da3b1, 0x9d412e0806e88aa5, 0x8e1f289560ee864e, 0xc491798a08a2ad4e, 0xf1a6f2bab92a27e2, 0xf5b5d7ec8acb58a2, 0xae10af696774b1db, 0x9991a6f3d6bf1765, 0xacca6da1e0a8ef29, 0xbff610b0cc6edd3f, 0x17fd090a58d32af3, 0xeff394dcff8a948e, 0xddfc4b4cef07f5b0, 0x95f83d0a1fb69cd9, 0x4abdaf101564f98e, 0xbb764c4ca7a4440f, 0x9d6d1ad41abe37f1, 0xea53df5fd18d5513, 0x84c86189216dc5ed, 0x92746b9be2f8552c, 0x32fd3cf5b4e49bb4, 0xb7118682dbb66a77, 0x3fbc8c33221dc2a1, 0xe4d5e82392a40515, 0xfabaf3feaa5334a, 0x8f05b1163ba6832d, 0x29cb4d87f2a7400e, 0xb2c71d5bca9023f8, 0x743e20e9ef511012, 0xdf78e4b2bd342cf6, 0x914da9246b255416, 0x8bab8eefb6409c1a, 0x1ad089b6c2f7548e, 0xae9672aba3d0c320, 0xa184ac2473b529b1, 0xda3c0f568cc4f3e8, 0xc9e5d72d90a2741e, 0x8865899617fb1871, 0x7e2fa67c7a658892, 0xaa7eebfb9df9de8d, 0xddbb901b98feeab7, 0xd51ea6fa85785631, 0x552a74227f3ea565, 0x8533285c936b35de, 0xd53a88958f87275f, 0xa67ff273b8460356, 0x8a892abaf368f137, 0xd01fef10a657842c, 0x2d2b7569b0432d85, 0x8213f56a67f6b29b, 0x9c3b29620e29fc73, 0xa298f2c501f45f42, 0x8349f3ba91b47b8f, 0xcb3f2f7642717713, 0x241c70a936219a73, 0xfe0efb53d30dd4d7, 0xed238cd383aa0110, 0x9ec95d1463e8a506, 0xf4363804324a40aa, 0xc67bb4597ce2ce48, 0xb143c6053edcd0d5, 0xf81aa16fdc1b81da, 0xdd94b7868e94050a, 0x9b10a4e5e9913128, 0xca7cf2b4191c8326, 0xc1d4ce1f63f57d72, 0xfd1c2f611f63a3f0, 0xf24a01a73cf2dccf, 0xbc633b39673c8cec, 0x976e41088617ca01, 0xd5be0503e085d813, 0xbd49d14aa79dbc82, 0x4b2d8644d8a74e18, 0xec9c459d51852ba2, 0xddf8e7d60ed1219e, 0x93e1ab8252f33b45, 0xcabb90e5c942b503, 0xb8da1662e7b00a17, 0x3d6a751f3b936243, 0xe7109bfba19c0c9d, 0xcc512670a783ad4, 0x906a617d450187e2, 0x27fb2b80668b24c5, 0xb484f9dc9641e9da, 0xb1f9f660802dedf6, 0xe1a63853bbd26451, 0x5e7873f8a0396973, 0x8d07e33455637eb2, 0xdb0b487b6423e1e8, 0xb049dc016abc5e5f, 0x91ce1a9a3d2cda62, 0xdc5c5301c56b75f7, 0x7641a140cc7810fb, 0x89b9b3e11b6329ba, 0xa9e904c87fcb0a9d, 0xac2820d9623bf429, 0x546345fa9fbdcd44, 0xd732290fbacaf133, 0xa97c177947ad4095, 0x867f59a9d4bed6c0, 0x49ed8eabcccc485d, 0xa81f301449ee8c70, 0x5c68f256bfff5a74, 0xd226fc195c6a2f8c, 0x73832eec6fff3111, 0x83585d8fd9c25db7, 0xc831fd53c5ff7eab, 0xa42e74f3d032f525, 0xba3e7ca8b77f5e55, 0xcd3a1230c43fb26f, 0x28ce1bd2e55f35eb, 0x80444b5e7aa7cf85, 0x7980d163cf5b81b3, 0xa0555e361951c366, 0xd7e105bcc332621f, 0xc86ab5c39fa63440, 0x8dd9472bf3fefaa7, 0xfa856334878fc150, 0xb14f98f6f0feb951, 0x9c935e00d4b9d8d2, 0x6ed1bf9a569f33d3, 0xc3b8358109e84f07, 0xa862f80ec4700c8, 0xf4a642e14c6262c8, 0xcd27bb612758c0fa, 0x98e7e9cccfbd7dbd, 0x8038d51cb897789c, 0xbf21e44003acdd2c, 0xe0470a63e6bd56c3, 0xeeea5d5004981478, 0x1858ccfce06cac74, 0x95527a5202df0ccb, 0xf37801e0c43ebc8, 0xbaa718e68396cffd, 0xd30560258f54e6ba, 0xe950df20247c83fd, 0x47c6b82ef32a2069, 0x91d28b7416cdd27e, 0x4cdc331d57fa5441, 0xb6472e511c81471d, 0xe0133fe4adf8e952, 0xe3d8f9e563a198e5, 0x58180fddd97723a6, 0x8e679c2f5e44ff8f, 0x570f09eaa7ea7648, }; }; #if FASTFLOAT_DETAIL_MUST_DEFINE_CONSTEXPR_VARIABLE template constexpr uint64_t powers_template::power_of_five_128[number_of_entries]; #endif using powers = powers_template<>; } // namespace fast_float #endif #ifndef FASTFLOAT_DECIMAL_TO_BINARY_H #define FASTFLOAT_DECIMAL_TO_BINARY_H #include #include #include #include #include #include namespace fast_float { // This will compute or rather approximate w * 5**q and return a pair of 64-bit // words approximating the result, with the "high" part corresponding to the // most significant bits and the low part corresponding to the least significant // bits. // template fastfloat_really_inline FASTFLOAT_CONSTEXPR20 value128 compute_product_approximation(int64_t q, uint64_t w) { int const index = 2 * int(q - powers::smallest_power_of_five); // For small values of q, e.g., q in [0,27], the answer is always exact // because The line value128 firstproduct = full_multiplication(w, // power_of_five_128[index]); gives the exact answer. value128 firstproduct = full_multiplication(w, powers::power_of_five_128[index]); static_assert((bit_precision >= 0) && (bit_precision <= 64), " precision should be in (0,64]"); constexpr uint64_t precision_mask = (bit_precision < 64) ? (uint64_t(0xFFFFFFFFFFFFFFFF) >> bit_precision) : uint64_t(0xFFFFFFFFFFFFFFFF); if ((firstproduct.high & precision_mask) == precision_mask) { // could further guard with (lower + w < lower) // regarding the second product, we only need secondproduct.high, but our // expectation is that the compiler will optimize this extra work away if // needed. value128 secondproduct = full_multiplication(w, powers::power_of_five_128[index + 1]); firstproduct.low += secondproduct.high; if (secondproduct.high > firstproduct.low) { firstproduct.high++; } } return firstproduct; } namespace detail { /** * For q in (0,350), we have that * f = (((152170 + 65536) * q ) >> 16); * is equal to * floor(p) + q * where * p = log(5**q)/log(2) = q * log(5)/log(2) * * For negative values of q in (-400,0), we have that * f = (((152170 + 65536) * q ) >> 16); * is equal to * -ceil(p) + q * where * p = log(5**-q)/log(2) = -q * log(5)/log(2) */ constexpr fastfloat_really_inline int32_t power(int32_t q) noexcept { return (((152170 + 65536) * q) >> 16) + 63; } } // namespace detail // create an adjusted mantissa, biased by the invalid power2 // for significant digits already multiplied by 10 ** q. template fastfloat_really_inline FASTFLOAT_CONSTEXPR14 adjusted_mantissa compute_error_scaled(int64_t q, uint64_t w, int lz) noexcept { int hilz = int(w >> 63) ^ 1; adjusted_mantissa answer; answer.mantissa = w << hilz; int bias = binary::mantissa_explicit_bits() - binary::minimum_exponent(); answer.power2 = int32_t(detail::power(int32_t(q)) + bias - hilz - lz - 62 + invalid_am_bias); return answer; } // w * 10 ** q, without rounding the representation up. // the power2 in the exponent will be adjusted by invalid_am_bias. template fastfloat_really_inline FASTFLOAT_CONSTEXPR20 adjusted_mantissa compute_error(int64_t q, uint64_t w) noexcept { int lz = leading_zeroes(w); w <<= lz; value128 product = compute_product_approximation(q, w); return compute_error_scaled(q, product.high, lz); } // Computers w * 10 ** q. // The returned value should be a valid number that simply needs to be // packed. However, in some very rare cases, the computation will fail. In such // cases, we return an adjusted_mantissa with a negative power of 2: the caller // should recompute in such cases. template fastfloat_really_inline FASTFLOAT_CONSTEXPR20 adjusted_mantissa compute_float(int64_t q, uint64_t w) noexcept { adjusted_mantissa answer; if ((w == 0) || (q < binary::smallest_power_of_ten())) { answer.power2 = 0; answer.mantissa = 0; // result should be zero return answer; } if (q > binary::largest_power_of_ten()) { // we want to get infinity: answer.power2 = binary::infinite_power(); answer.mantissa = 0; return answer; } // At this point in time q is in [powers::smallest_power_of_five, // powers::largest_power_of_five]. // We want the most significant bit of i to be 1. Shift if needed. int lz = leading_zeroes(w); w <<= lz; // The required precision is binary::mantissa_explicit_bits() + 3 because // 1. We need the implicit bit // 2. We need an extra bit for rounding purposes // 3. We might lose a bit due to the "upperbit" routine (result too small, // requiring a shift) value128 product = compute_product_approximation(q, w); // The computed 'product' is always sufficient. // Mathematical proof: // Noble Mushtak and Daniel Lemire, Fast Number Parsing Without Fallback (to // appear) See script/mushtak_lemire.py // The "compute_product_approximation" function can be slightly slower than a // branchless approach: value128 product = compute_product(q, w); but in // practice, we can win big with the compute_product_approximation if its // additional branch is easily predicted. Which is best is data specific. int upperbit = int(product.high >> 63); int shift = upperbit + 64 - binary::mantissa_explicit_bits() - 3; answer.mantissa = product.high >> shift; answer.power2 = int32_t(detail::power(int32_t(q)) + upperbit - lz - binary::minimum_exponent()); if (answer.power2 <= 0) { // we have a subnormal? // Here have that answer.power2 <= 0 so -answer.power2 >= 0 if (-answer.power2 + 1 >= 64) { // if we have more than 64 bits below the minimum exponent, you // have a zero for sure. answer.power2 = 0; answer.mantissa = 0; // result should be zero return answer; } // next line is safe because -answer.power2 + 1 < 64 answer.mantissa >>= -answer.power2 + 1; // Thankfully, we can't have both "round-to-even" and subnormals because // "round-to-even" only occurs for powers close to 0 in the 32-bit and // and 64-bit case (with no more than 19 digits). answer.mantissa += (answer.mantissa & 1); // round up answer.mantissa >>= 1; // There is a weird scenario where we don't have a subnormal but just. // Suppose we start with 2.2250738585072013e-308, we end up // with 0x3fffffffffffff x 2^-1023-53 which is technically subnormal // whereas 0x40000000000000 x 2^-1023-53 is normal. Now, we need to round // up 0x3fffffffffffff x 2^-1023-53 and once we do, we are no longer // subnormal, but we can only know this after rounding. // So we only declare a subnormal if we are smaller than the threshold. answer.power2 = (answer.mantissa < (uint64_t(1) << binary::mantissa_explicit_bits())) ? 0 : 1; return answer; } // usually, we round *up*, but if we fall right in between and and we have an // even basis, we need to round down // We are only concerned with the cases where 5**q fits in single 64-bit word. if ((product.low <= 1) && (q >= binary::min_exponent_round_to_even()) && (q <= binary::max_exponent_round_to_even()) && ((answer.mantissa & 3) == 1)) { // we may fall between two floats! // To be in-between two floats we need that in doing // answer.mantissa = product.high >> (upperbit + 64 - // binary::mantissa_explicit_bits() - 3); // ... we dropped out only zeroes. But if this happened, then we can go // back!!! if ((answer.mantissa << shift) == product.high) { answer.mantissa &= ~uint64_t(1); // flip it so that we do not round up } } answer.mantissa += (answer.mantissa & 1); // round up answer.mantissa >>= 1; if (answer.mantissa >= (uint64_t(2) << binary::mantissa_explicit_bits())) { answer.mantissa = (uint64_t(1) << binary::mantissa_explicit_bits()); answer.power2++; // undo previous addition } answer.mantissa &= ~(uint64_t(1) << binary::mantissa_explicit_bits()); if (answer.power2 >= binary::infinite_power()) { // infinity answer.power2 = binary::infinite_power(); answer.mantissa = 0; } return answer; } } // namespace fast_float #endif #ifndef FASTFLOAT_BIGINT_H #define FASTFLOAT_BIGINT_H #include #include #include #include namespace fast_float { // the limb width: we want efficient multiplication of double the bits in // limb, or for 64-bit limbs, at least 64-bit multiplication where we can // extract the high and low parts efficiently. this is every 64-bit // architecture except for sparc, which emulates 128-bit multiplication. // we might have platforms where `CHAR_BIT` is not 8, so let's avoid // doing `8 * sizeof(limb)`. #if defined(FASTFLOAT_64BIT) && !defined(__sparc) #define FASTFLOAT_64BIT_LIMB 1 typedef uint64_t limb; constexpr size_t limb_bits = 64; #else #define FASTFLOAT_32BIT_LIMB typedef uint32_t limb; constexpr size_t limb_bits = 32; #endif typedef span limb_span; // number of bits in a bigint. this needs to be at least the number // of bits required to store the largest bigint, which is // `log2(10**(digits + max_exp))`, or `log2(10**(767 + 342))`, or // ~3600 bits, so we round to 4000. constexpr size_t bigint_bits = 4000; constexpr size_t bigint_limbs = bigint_bits / limb_bits; // vector-like type that is allocated on the stack. the entire // buffer is pre-allocated, and only the length changes. template struct stackvec { limb data[size]; // we never need more than 150 limbs uint16_t length{0}; stackvec() = default; stackvec(stackvec const &) = delete; stackvec &operator=(stackvec const &) = delete; stackvec(stackvec &&) = delete; stackvec &operator=(stackvec &&other) = delete; // create stack vector from existing limb span. FASTFLOAT_CONSTEXPR20 stackvec(limb_span s) { FASTFLOAT_ASSERT(try_extend(s)); } FASTFLOAT_CONSTEXPR14 limb &operator[](size_t index) noexcept { FASTFLOAT_DEBUG_ASSERT(index < length); return data[index]; } FASTFLOAT_CONSTEXPR14 const limb &operator[](size_t index) const noexcept { FASTFLOAT_DEBUG_ASSERT(index < length); return data[index]; } // index from the end of the container FASTFLOAT_CONSTEXPR14 const limb &rindex(size_t index) const noexcept { FASTFLOAT_DEBUG_ASSERT(index < length); size_t rindex = length - index - 1; return data[rindex]; } // set the length, without bounds checking. FASTFLOAT_CONSTEXPR14 void set_len(size_t len) noexcept { length = uint16_t(len); } constexpr size_t len() const noexcept { return length; } constexpr bool is_empty() const noexcept { return length == 0; } constexpr size_t capacity() const noexcept { return size; } // append item to vector, without bounds checking FASTFLOAT_CONSTEXPR14 void push_unchecked(limb value) noexcept { data[length] = value; length++; } // append item to vector, returning if item was added FASTFLOAT_CONSTEXPR14 bool try_push(limb value) noexcept { if (len() < capacity()) { push_unchecked(value); return true; } else { return false; } } // add items to the vector, from a span, without bounds checking FASTFLOAT_CONSTEXPR20 void extend_unchecked(limb_span s) noexcept { limb *ptr = data + length; std::copy_n(s.ptr, s.len(), ptr); set_len(len() + s.len()); } // try to add items to the vector, returning if items were added FASTFLOAT_CONSTEXPR20 bool try_extend(limb_span s) noexcept { if (len() + s.len() <= capacity()) { extend_unchecked(s); return true; } else { return false; } } // resize the vector, without bounds checking // if the new size is longer than the vector, assign value to each // appended item. FASTFLOAT_CONSTEXPR20 void resize_unchecked(size_t new_len, limb value) noexcept { if (new_len > len()) { size_t count = new_len - len(); limb *first = data + len(); limb *last = first + count; ::std::fill(first, last, value); set_len(new_len); } else { set_len(new_len); } } // try to resize the vector, returning if the vector was resized. FASTFLOAT_CONSTEXPR20 bool try_resize(size_t new_len, limb value) noexcept { if (new_len > capacity()) { return false; } else { resize_unchecked(new_len, value); return true; } } // check if any limbs are non-zero after the given index. // this needs to be done in reverse order, since the index // is relative to the most significant limbs. FASTFLOAT_CONSTEXPR14 bool nonzero(size_t index) const noexcept { while (index < len()) { if (rindex(index) != 0) { return true; } index++; } return false; } // normalize the big integer, so most-significant zero limbs are removed. FASTFLOAT_CONSTEXPR14 void normalize() noexcept { while (len() > 0 && rindex(0) == 0) { length--; } } }; fastfloat_really_inline FASTFLOAT_CONSTEXPR14 uint64_t empty_hi64(bool &truncated) noexcept { truncated = false; return 0; } fastfloat_really_inline FASTFLOAT_CONSTEXPR20 uint64_t uint64_hi64(uint64_t r0, bool &truncated) noexcept { truncated = false; int shl = leading_zeroes(r0); return r0 << shl; } fastfloat_really_inline FASTFLOAT_CONSTEXPR20 uint64_t uint64_hi64(uint64_t r0, uint64_t r1, bool &truncated) noexcept { int shl = leading_zeroes(r0); if (shl == 0) { truncated = r1 != 0; return r0; } else { int shr = 64 - shl; truncated = (r1 << shl) != 0; return (r0 << shl) | (r1 >> shr); } } fastfloat_really_inline FASTFLOAT_CONSTEXPR20 uint64_t uint32_hi64(uint32_t r0, bool &truncated) noexcept { return uint64_hi64(r0, truncated); } fastfloat_really_inline FASTFLOAT_CONSTEXPR20 uint64_t uint32_hi64(uint32_t r0, uint32_t r1, bool &truncated) noexcept { uint64_t x0 = r0; uint64_t x1 = r1; return uint64_hi64((x0 << 32) | x1, truncated); } fastfloat_really_inline FASTFLOAT_CONSTEXPR20 uint64_t uint32_hi64(uint32_t r0, uint32_t r1, uint32_t r2, bool &truncated) noexcept { uint64_t x0 = r0; uint64_t x1 = r1; uint64_t x2 = r2; return uint64_hi64(x0, (x1 << 32) | x2, truncated); } // add two small integers, checking for overflow. // we want an efficient operation. for msvc, where // we don't have built-in intrinsics, this is still // pretty fast. fastfloat_really_inline FASTFLOAT_CONSTEXPR20 limb scalar_add(limb x, limb y, bool &overflow) noexcept { limb z; // gcc and clang #if defined(__has_builtin) #if __has_builtin(__builtin_add_overflow) if (!cpp20_and_in_constexpr()) { overflow = __builtin_add_overflow(x, y, &z); return z; } #endif #endif // generic, this still optimizes correctly on MSVC. z = x + y; overflow = z < x; return z; } // multiply two small integers, getting both the high and low bits. fastfloat_really_inline FASTFLOAT_CONSTEXPR20 limb scalar_mul(limb x, limb y, limb &carry) noexcept { #ifdef FASTFLOAT_64BIT_LIMB #if defined(__SIZEOF_INT128__) // GCC and clang both define it as an extension. __uint128_t z = __uint128_t(x) * __uint128_t(y) + __uint128_t(carry); carry = limb(z >> limb_bits); return limb(z); #else // fallback, no native 128-bit integer multiplication with carry. // on msvc, this optimizes identically, somehow. value128 z = full_multiplication(x, y); bool overflow; z.low = scalar_add(z.low, carry, overflow); z.high += uint64_t(overflow); // cannot overflow carry = z.high; return z.low; #endif #else uint64_t z = uint64_t(x) * uint64_t(y) + uint64_t(carry); carry = limb(z >> limb_bits); return limb(z); #endif } // add scalar value to bigint starting from offset. // used in grade school multiplication template inline FASTFLOAT_CONSTEXPR20 bool small_add_from(stackvec &vec, limb y, size_t start) noexcept { size_t index = start; limb carry = y; bool overflow; while (carry != 0 && index < vec.len()) { vec[index] = scalar_add(vec[index], carry, overflow); carry = limb(overflow); index += 1; } if (carry != 0) { FASTFLOAT_TRY(vec.try_push(carry)); } return true; } // add scalar value to bigint. template fastfloat_really_inline FASTFLOAT_CONSTEXPR20 bool small_add(stackvec &vec, limb y) noexcept { return small_add_from(vec, y, 0); } // multiply bigint by scalar value. template inline FASTFLOAT_CONSTEXPR20 bool small_mul(stackvec &vec, limb y) noexcept { limb carry = 0; for (size_t index = 0; index < vec.len(); index++) { vec[index] = scalar_mul(vec[index], y, carry); } if (carry != 0) { FASTFLOAT_TRY(vec.try_push(carry)); } return true; } // add bigint to bigint starting from index. // used in grade school multiplication template FASTFLOAT_CONSTEXPR20 bool large_add_from(stackvec &x, limb_span y, size_t start) noexcept { // the effective x buffer is from `xstart..x.len()`, so exit early // if we can't get that current range. if (x.len() < start || y.len() > x.len() - start) { FASTFLOAT_TRY(x.try_resize(y.len() + start, 0)); } bool carry = false; for (size_t index = 0; index < y.len(); index++) { limb xi = x[index + start]; limb yi = y[index]; bool c1 = false; bool c2 = false; xi = scalar_add(xi, yi, c1); if (carry) { xi = scalar_add(xi, 1, c2); } x[index + start] = xi; carry = c1 | c2; } // handle overflow if (carry) { FASTFLOAT_TRY(small_add_from(x, 1, y.len() + start)); } return true; } // add bigint to bigint. template fastfloat_really_inline FASTFLOAT_CONSTEXPR20 bool large_add_from(stackvec &x, limb_span y) noexcept { return large_add_from(x, y, 0); } // grade-school multiplication algorithm template FASTFLOAT_CONSTEXPR20 bool long_mul(stackvec &x, limb_span y) noexcept { limb_span xs = limb_span(x.data, x.len()); stackvec z(xs); limb_span zs = limb_span(z.data, z.len()); if (y.len() != 0) { limb y0 = y[0]; FASTFLOAT_TRY(small_mul(x, y0)); for (size_t index = 1; index < y.len(); index++) { limb yi = y[index]; stackvec zi; if (yi != 0) { // re-use the same buffer throughout zi.set_len(0); FASTFLOAT_TRY(zi.try_extend(zs)); FASTFLOAT_TRY(small_mul(zi, yi)); limb_span zis = limb_span(zi.data, zi.len()); FASTFLOAT_TRY(large_add_from(x, zis, index)); } } } x.normalize(); return true; } // grade-school multiplication algorithm template FASTFLOAT_CONSTEXPR20 bool large_mul(stackvec &x, limb_span y) noexcept { if (y.len() == 1) { FASTFLOAT_TRY(small_mul(x, y[0])); } else { FASTFLOAT_TRY(long_mul(x, y)); } return true; } template struct pow5_tables { static constexpr uint32_t large_step = 135; static constexpr uint64_t small_power_of_5[] = { 1UL, 5UL, 25UL, 125UL, 625UL, 3125UL, 15625UL, 78125UL, 390625UL, 1953125UL, 9765625UL, 48828125UL, 244140625UL, 1220703125UL, 6103515625UL, 30517578125UL, 152587890625UL, 762939453125UL, 3814697265625UL, 19073486328125UL, 95367431640625UL, 476837158203125UL, 2384185791015625UL, 11920928955078125UL, 59604644775390625UL, 298023223876953125UL, 1490116119384765625UL, 7450580596923828125UL, }; #ifdef FASTFLOAT_64BIT_LIMB constexpr static limb large_power_of_5[] = { 1414648277510068013UL, 9180637584431281687UL, 4539964771860779200UL, 10482974169319127550UL, 198276706040285095UL}; #else constexpr static limb large_power_of_5[] = { 4279965485U, 329373468U, 4020270615U, 2137533757U, 4287402176U, 1057042919U, 1071430142U, 2440757623U, 381945767U, 46164893U}; #endif }; #if FASTFLOAT_DETAIL_MUST_DEFINE_CONSTEXPR_VARIABLE template constexpr uint32_t pow5_tables::large_step; template constexpr uint64_t pow5_tables::small_power_of_5[]; template constexpr limb pow5_tables::large_power_of_5[]; #endif // big integer type. implements a small subset of big integer // arithmetic, using simple algorithms since asymptotically // faster algorithms are slower for a small number of limbs. // all operations assume the big-integer is normalized. struct bigint : pow5_tables<> { // storage of the limbs, in little-endian order. stackvec vec; FASTFLOAT_CONSTEXPR20 bigint() : vec() {} bigint(bigint const &) = delete; bigint &operator=(bigint const &) = delete; bigint(bigint &&) = delete; bigint &operator=(bigint &&other) = delete; FASTFLOAT_CONSTEXPR20 bigint(uint64_t value) : vec() { #ifdef FASTFLOAT_64BIT_LIMB vec.push_unchecked(value); #else vec.push_unchecked(uint32_t(value)); vec.push_unchecked(uint32_t(value >> 32)); #endif vec.normalize(); } // get the high 64 bits from the vector, and if bits were truncated. // this is to get the significant digits for the float. FASTFLOAT_CONSTEXPR20 uint64_t hi64(bool &truncated) const noexcept { #ifdef FASTFLOAT_64BIT_LIMB if (vec.len() == 0) { return empty_hi64(truncated); } else if (vec.len() == 1) { return uint64_hi64(vec.rindex(0), truncated); } else { uint64_t result = uint64_hi64(vec.rindex(0), vec.rindex(1), truncated); truncated |= vec.nonzero(2); return result; } #else if (vec.len() == 0) { return empty_hi64(truncated); } else if (vec.len() == 1) { return uint32_hi64(vec.rindex(0), truncated); } else if (vec.len() == 2) { return uint32_hi64(vec.rindex(0), vec.rindex(1), truncated); } else { uint64_t result = uint32_hi64(vec.rindex(0), vec.rindex(1), vec.rindex(2), truncated); truncated |= vec.nonzero(3); return result; } #endif } // compare two big integers, returning the large value. // assumes both are normalized. if the return value is // negative, other is larger, if the return value is // positive, this is larger, otherwise they are equal. // the limbs are stored in little-endian order, so we // must compare the limbs in ever order. FASTFLOAT_CONSTEXPR20 int compare(bigint const &other) const noexcept { if (vec.len() > other.vec.len()) { return 1; } else if (vec.len() < other.vec.len()) { return -1; } else { for (size_t index = vec.len(); index > 0; index--) { limb xi = vec[index - 1]; limb yi = other.vec[index - 1]; if (xi > yi) { return 1; } else if (xi < yi) { return -1; } } return 0; } } // shift left each limb n bits, carrying over to the new limb // returns true if we were able to shift all the digits. FASTFLOAT_CONSTEXPR20 bool shl_bits(size_t n) noexcept { // Internally, for each item, we shift left by n, and add the previous // right shifted limb-bits. // For example, we transform (for u8) shifted left 2, to: // b10100100 b01000010 // b10 b10010001 b00001000 FASTFLOAT_DEBUG_ASSERT(n != 0); FASTFLOAT_DEBUG_ASSERT(n < sizeof(limb) * 8); size_t shl = n; size_t shr = limb_bits - shl; limb prev = 0; for (size_t index = 0; index < vec.len(); index++) { limb xi = vec[index]; vec[index] = (xi << shl) | (prev >> shr); prev = xi; } limb carry = prev >> shr; if (carry != 0) { return vec.try_push(carry); } return true; } // move the limbs left by `n` limbs. FASTFLOAT_CONSTEXPR20 bool shl_limbs(size_t n) noexcept { FASTFLOAT_DEBUG_ASSERT(n != 0); if (n + vec.len() > vec.capacity()) { return false; } else if (!vec.is_empty()) { // move limbs limb *dst = vec.data + n; limb const *src = vec.data; std::copy_backward(src, src + vec.len(), dst + vec.len()); // fill in empty limbs limb *first = vec.data; limb *last = first + n; ::std::fill(first, last, 0); vec.set_len(n + vec.len()); return true; } else { return true; } } // move the limbs left by `n` bits. FASTFLOAT_CONSTEXPR20 bool shl(size_t n) noexcept { size_t rem = n % limb_bits; size_t div = n / limb_bits; if (rem != 0) { FASTFLOAT_TRY(shl_bits(rem)); } if (div != 0) { FASTFLOAT_TRY(shl_limbs(div)); } return true; } // get the number of leading zeros in the bigint. FASTFLOAT_CONSTEXPR20 int ctlz() const noexcept { if (vec.is_empty()) { return 0; } else { #ifdef FASTFLOAT_64BIT_LIMB return leading_zeroes(vec.rindex(0)); #else // no use defining a specialized leading_zeroes for a 32-bit type. uint64_t r0 = vec.rindex(0); return leading_zeroes(r0 << 32); #endif } } // get the number of bits in the bigint. FASTFLOAT_CONSTEXPR20 int bit_length() const noexcept { int lz = ctlz(); return int(limb_bits * vec.len()) - lz; } FASTFLOAT_CONSTEXPR20 bool mul(limb y) noexcept { return small_mul(vec, y); } FASTFLOAT_CONSTEXPR20 bool add(limb y) noexcept { return small_add(vec, y); } // multiply as if by 2 raised to a power. FASTFLOAT_CONSTEXPR20 bool pow2(uint32_t exp) noexcept { return shl(exp); } // multiply as if by 5 raised to a power. FASTFLOAT_CONSTEXPR20 bool pow5(uint32_t exp) noexcept { // multiply by a power of 5 size_t large_length = sizeof(large_power_of_5) / sizeof(limb); limb_span large = limb_span(large_power_of_5, large_length); while (exp >= large_step) { FASTFLOAT_TRY(large_mul(vec, large)); exp -= large_step; } #ifdef FASTFLOAT_64BIT_LIMB uint32_t small_step = 27; limb max_native = 7450580596923828125UL; #else uint32_t small_step = 13; limb max_native = 1220703125U; #endif while (exp >= small_step) { FASTFLOAT_TRY(small_mul(vec, max_native)); exp -= small_step; } if (exp != 0) { // Work around clang bug https://godbolt.org/z/zedh7rrhc // This is similar to https://github.com/llvm/llvm-project/issues/47746, // except the workaround described there don't work here FASTFLOAT_TRY(small_mul( vec, limb(((void)small_power_of_5[0], small_power_of_5[exp])))); } return true; } // multiply as if by 10 raised to a power. FASTFLOAT_CONSTEXPR20 bool pow10(uint32_t exp) noexcept { FASTFLOAT_TRY(pow5(exp)); return pow2(exp); } }; } // namespace fast_float #endif #ifndef FASTFLOAT_DIGIT_COMPARISON_H #define FASTFLOAT_DIGIT_COMPARISON_H #include #include #include #include namespace fast_float { // 1e0 to 1e19 constexpr static uint64_t powers_of_ten_uint64[] = {1UL, 10UL, 100UL, 1000UL, 10000UL, 100000UL, 1000000UL, 10000000UL, 100000000UL, 1000000000UL, 10000000000UL, 100000000000UL, 1000000000000UL, 10000000000000UL, 100000000000000UL, 1000000000000000UL, 10000000000000000UL, 100000000000000000UL, 1000000000000000000UL, 10000000000000000000UL}; // calculate the exponent, in scientific notation, of the number. // this algorithm is not even close to optimized, but it has no practical // effect on performance: in order to have a faster algorithm, we'd need // to slow down performance for faster algorithms, and this is still fast. template fastfloat_really_inline FASTFLOAT_CONSTEXPR14 int32_t scientific_exponent(parsed_number_string_t &num) noexcept { uint64_t mantissa = num.mantissa; int32_t exponent = int32_t(num.exponent); while (mantissa >= 10000) { mantissa /= 10000; exponent += 4; } while (mantissa >= 100) { mantissa /= 100; exponent += 2; } while (mantissa >= 10) { mantissa /= 10; exponent += 1; } return exponent; } // this converts a native floating-point number to an extended-precision float. template fastfloat_really_inline FASTFLOAT_CONSTEXPR20 adjusted_mantissa to_extended(T value) noexcept { using equiv_uint = equiv_uint_t; constexpr equiv_uint exponent_mask = binary_format::exponent_mask(); constexpr equiv_uint mantissa_mask = binary_format::mantissa_mask(); constexpr equiv_uint hidden_bit_mask = binary_format::hidden_bit_mask(); adjusted_mantissa am; int32_t bias = binary_format::mantissa_explicit_bits() - binary_format::minimum_exponent(); equiv_uint bits; #if FASTFLOAT_HAS_BIT_CAST bits = std::bit_cast(value); #else ::memcpy(&bits, &value, sizeof(T)); #endif if ((bits & exponent_mask) == 0) { // denormal am.power2 = 1 - bias; am.mantissa = bits & mantissa_mask; } else { // normal am.power2 = int32_t((bits & exponent_mask) >> binary_format::mantissa_explicit_bits()); am.power2 -= bias; am.mantissa = (bits & mantissa_mask) | hidden_bit_mask; } return am; } // get the extended precision value of the halfway point between b and b+u. // we are given a native float that represents b, so we need to adjust it // halfway between b and b+u. template fastfloat_really_inline FASTFLOAT_CONSTEXPR20 adjusted_mantissa to_extended_halfway(T value) noexcept { adjusted_mantissa am = to_extended(value); am.mantissa <<= 1; am.mantissa += 1; am.power2 -= 1; return am; } // round an extended-precision float to the nearest machine float. template fastfloat_really_inline FASTFLOAT_CONSTEXPR14 void round(adjusted_mantissa &am, callback cb) noexcept { int32_t mantissa_shift = 64 - binary_format::mantissa_explicit_bits() - 1; if (-am.power2 >= mantissa_shift) { // have a denormal float int32_t shift = -am.power2 + 1; cb(am, std::min(shift, 64)); // check for round-up: if rounding-nearest carried us to the hidden bit. am.power2 = (am.mantissa < (uint64_t(1) << binary_format::mantissa_explicit_bits())) ? 0 : 1; return; } // have a normal float, use the default shift. cb(am, mantissa_shift); // check for carry if (am.mantissa >= (uint64_t(2) << binary_format::mantissa_explicit_bits())) { am.mantissa = (uint64_t(1) << binary_format::mantissa_explicit_bits()); am.power2++; } // check for infinite: we could have carried to an infinite power am.mantissa &= ~(uint64_t(1) << binary_format::mantissa_explicit_bits()); if (am.power2 >= binary_format::infinite_power()) { am.power2 = binary_format::infinite_power(); am.mantissa = 0; } } template fastfloat_really_inline FASTFLOAT_CONSTEXPR14 void round_nearest_tie_even(adjusted_mantissa &am, int32_t shift, callback cb) noexcept { uint64_t const mask = (shift == 64) ? UINT64_MAX : (uint64_t(1) << shift) - 1; uint64_t const halfway = (shift == 0) ? 0 : uint64_t(1) << (shift - 1); uint64_t truncated_bits = am.mantissa & mask; bool is_above = truncated_bits > halfway; bool is_halfway = truncated_bits == halfway; // shift digits into position if (shift == 64) { am.mantissa = 0; } else { am.mantissa >>= shift; } am.power2 += shift; bool is_odd = (am.mantissa & 1) == 1; am.mantissa += uint64_t(cb(is_odd, is_halfway, is_above)); } fastfloat_really_inline FASTFLOAT_CONSTEXPR14 void round_down(adjusted_mantissa &am, int32_t shift) noexcept { if (shift == 64) { am.mantissa = 0; } else { am.mantissa >>= shift; } am.power2 += shift; } template fastfloat_really_inline FASTFLOAT_CONSTEXPR20 void skip_zeros(UC const *&first, UC const *last) noexcept { uint64_t val; while (!cpp20_and_in_constexpr() && std::distance(first, last) >= int_cmp_len()) { ::memcpy(&val, first, sizeof(uint64_t)); if (val != int_cmp_zeros()) { break; } first += int_cmp_len(); } while (first != last) { if (*first != UC('0')) { break; } first++; } } // determine if any non-zero digits were truncated. // all characters must be valid digits. template fastfloat_really_inline FASTFLOAT_CONSTEXPR20 bool is_truncated(UC const *first, UC const *last) noexcept { // do 8-bit optimizations, can just compare to 8 literal 0s. uint64_t val; while (!cpp20_and_in_constexpr() && std::distance(first, last) >= int_cmp_len()) { ::memcpy(&val, first, sizeof(uint64_t)); if (val != int_cmp_zeros()) { return true; } first += int_cmp_len(); } while (first != last) { if (*first != UC('0')) { return true; } ++first; } return false; } template fastfloat_really_inline FASTFLOAT_CONSTEXPR20 bool is_truncated(span s) noexcept { return is_truncated(s.ptr, s.ptr + s.len()); } template fastfloat_really_inline FASTFLOAT_CONSTEXPR20 void parse_eight_digits(UC const *&p, limb &value, size_t &counter, size_t &count) noexcept { value = value * 100000000 + parse_eight_digits_unrolled(p); p += 8; counter += 8; count += 8; } template fastfloat_really_inline FASTFLOAT_CONSTEXPR14 void parse_one_digit(UC const *&p, limb &value, size_t &counter, size_t &count) noexcept { value = value * 10 + limb(*p - UC('0')); p++; counter++; count++; } fastfloat_really_inline FASTFLOAT_CONSTEXPR20 void add_native(bigint &big, limb power, limb value) noexcept { big.mul(power); big.add(value); } fastfloat_really_inline FASTFLOAT_CONSTEXPR20 void round_up_bigint(bigint &big, size_t &count) noexcept { // need to round-up the digits, but need to avoid rounding // ....9999 to ...10000, which could cause a false halfway point. add_native(big, 10, 1); count++; } // parse the significant digits into a big integer template inline FASTFLOAT_CONSTEXPR20 void parse_mantissa(bigint &result, parsed_number_string_t &num, size_t max_digits, size_t &digits) noexcept { // try to minimize the number of big integer and scalar multiplication. // therefore, try to parse 8 digits at a time, and multiply by the largest // scalar value (9 or 19 digits) for each step. size_t counter = 0; digits = 0; limb value = 0; #ifdef FASTFLOAT_64BIT_LIMB size_t step = 19; #else size_t step = 9; #endif // process all integer digits. UC const *p = num.integer.ptr; UC const *pend = p + num.integer.len(); skip_zeros(p, pend); // process all digits, in increments of step per loop while (p != pend) { while ((std::distance(p, pend) >= 8) && (step - counter >= 8) && (max_digits - digits >= 8)) { parse_eight_digits(p, value, counter, digits); } while (counter < step && p != pend && digits < max_digits) { parse_one_digit(p, value, counter, digits); } if (digits == max_digits) { // add the temporary value, then check if we've truncated any digits add_native(result, limb(powers_of_ten_uint64[counter]), value); bool truncated = is_truncated(p, pend); if (num.fraction.ptr != nullptr) { truncated |= is_truncated(num.fraction); } if (truncated) { round_up_bigint(result, digits); } return; } else { add_native(result, limb(powers_of_ten_uint64[counter]), value); counter = 0; value = 0; } } // add our fraction digits, if they're available. if (num.fraction.ptr != nullptr) { p = num.fraction.ptr; pend = p + num.fraction.len(); if (digits == 0) { skip_zeros(p, pend); } // process all digits, in increments of step per loop while (p != pend) { while ((std::distance(p, pend) >= 8) && (step - counter >= 8) && (max_digits - digits >= 8)) { parse_eight_digits(p, value, counter, digits); } while (counter < step && p != pend && digits < max_digits) { parse_one_digit(p, value, counter, digits); } if (digits == max_digits) { // add the temporary value, then check if we've truncated any digits add_native(result, limb(powers_of_ten_uint64[counter]), value); bool truncated = is_truncated(p, pend); if (truncated) { round_up_bigint(result, digits); } return; } else { add_native(result, limb(powers_of_ten_uint64[counter]), value); counter = 0; value = 0; } } } if (counter != 0) { add_native(result, limb(powers_of_ten_uint64[counter]), value); } } template inline FASTFLOAT_CONSTEXPR20 adjusted_mantissa positive_digit_comp(bigint &bigmant, int32_t exponent) noexcept { FASTFLOAT_ASSERT(bigmant.pow10(uint32_t(exponent))); adjusted_mantissa answer; bool truncated; answer.mantissa = bigmant.hi64(truncated); int bias = binary_format::mantissa_explicit_bits() - binary_format::minimum_exponent(); answer.power2 = bigmant.bit_length() - 64 + bias; round(answer, [truncated](adjusted_mantissa &a, int32_t shift) { round_nearest_tie_even( a, shift, [truncated](bool is_odd, bool is_halfway, bool is_above) -> bool { return is_above || (is_halfway && truncated) || (is_odd && is_halfway); }); }); return answer; } // the scaling here is quite simple: we have, for the real digits `m * 10^e`, // and for the theoretical digits `n * 2^f`. Since `e` is always negative, // to scale them identically, we do `n * 2^f * 5^-f`, so we now have `m * 2^e`. // we then need to scale by `2^(f- e)`, and then the two significant digits // are of the same magnitude. template inline FASTFLOAT_CONSTEXPR20 adjusted_mantissa negative_digit_comp( bigint &bigmant, adjusted_mantissa am, int32_t exponent) noexcept { bigint &real_digits = bigmant; int32_t real_exp = exponent; // get the value of `b`, rounded down, and get a bigint representation of b+h adjusted_mantissa am_b = am; // gcc7 buf: use a lambda to remove the noexcept qualifier bug with // -Wnoexcept-type. round(am_b, [](adjusted_mantissa &a, int32_t shift) { round_down(a, shift); }); T b; to_float(false, am_b, b); adjusted_mantissa theor = to_extended_halfway(b); bigint theor_digits(theor.mantissa); int32_t theor_exp = theor.power2; // scale real digits and theor digits to be same power. int32_t pow2_exp = theor_exp - real_exp; uint32_t pow5_exp = uint32_t(-real_exp); if (pow5_exp != 0) { FASTFLOAT_ASSERT(theor_digits.pow5(pow5_exp)); } if (pow2_exp > 0) { FASTFLOAT_ASSERT(theor_digits.pow2(uint32_t(pow2_exp))); } else if (pow2_exp < 0) { FASTFLOAT_ASSERT(real_digits.pow2(uint32_t(-pow2_exp))); } // compare digits, and use it to director rounding int ord = real_digits.compare(theor_digits); adjusted_mantissa answer = am; round(answer, [ord](adjusted_mantissa &a, int32_t shift) { round_nearest_tie_even( a, shift, [ord](bool is_odd, bool _, bool __) -> bool { (void)_; // not needed, since we've done our comparison (void)__; // not needed, since we've done our comparison if (ord > 0) { return true; } else if (ord < 0) { return false; } else { return is_odd; } }); }); return answer; } // parse the significant digits as a big integer to unambiguously round the // the significant digits. here, we are trying to determine how to round // an extended float representation close to `b+h`, halfway between `b` // (the float rounded-down) and `b+u`, the next positive float. this // algorithm is always correct, and uses one of two approaches. when // the exponent is positive relative to the significant digits (such as // 1234), we create a big-integer representation, get the high 64-bits, // determine if any lower bits are truncated, and use that to direct // rounding. in case of a negative exponent relative to the significant // digits (such as 1.2345), we create a theoretical representation of // `b` as a big-integer type, scaled to the same binary exponent as // the actual digits. we then compare the big integer representations // of both, and use that to direct rounding. template inline FASTFLOAT_CONSTEXPR20 adjusted_mantissa digit_comp(parsed_number_string_t &num, adjusted_mantissa am) noexcept { // remove the invalid exponent bias am.power2 -= invalid_am_bias; int32_t sci_exp = scientific_exponent(num); size_t max_digits = binary_format::max_digits(); size_t digits = 0; bigint bigmant; parse_mantissa(bigmant, num, max_digits, digits); // can't underflow, since digits is at most max_digits. int32_t exponent = sci_exp + 1 - int32_t(digits); if (exponent >= 0) { return positive_digit_comp(bigmant, exponent); } else { return negative_digit_comp(bigmant, am, exponent); } } } // namespace fast_float #endif #ifndef FASTFLOAT_PARSE_NUMBER_H #define FASTFLOAT_PARSE_NUMBER_H #include #include #include #include namespace fast_float { namespace detail { /** * Special case +inf, -inf, nan, infinity, -infinity. * The case comparisons could be made much faster given that we know that the * strings a null-free and fixed. **/ template from_chars_result_t FASTFLOAT_CONSTEXPR14 parse_infnan(UC const *first, UC const *last, T &value, chars_format fmt) noexcept { from_chars_result_t answer{}; answer.ptr = first; answer.ec = std::errc(); // be optimistic // assume first < last, so dereference without checks; bool const minusSign = (*first == UC('-')); // C++17 20.19.3.(7.1) explicitly forbids '+' sign here if ((*first == UC('-')) || (uint64_t(fmt & chars_format::allow_leading_plus) && (*first == UC('+')))) { ++first; } if (last - first >= 3) { if (fastfloat_strncasecmp(first, str_const_nan(), 3)) { answer.ptr = (first += 3); value = minusSign ? -std::numeric_limits::quiet_NaN() : std::numeric_limits::quiet_NaN(); // Check for possible nan(n-char-seq-opt), C++17 20.19.3.7, // C11 7.20.1.3.3. At least MSVC produces nan(ind) and nan(snan). if (first != last && *first == UC('(')) { for (UC const *ptr = first + 1; ptr != last; ++ptr) { if (*ptr == UC(')')) { answer.ptr = ptr + 1; // valid nan(n-char-seq-opt) break; } else if (!((UC('a') <= *ptr && *ptr <= UC('z')) || (UC('A') <= *ptr && *ptr <= UC('Z')) || (UC('0') <= *ptr && *ptr <= UC('9')) || *ptr == UC('_'))) break; // forbidden char, not nan(n-char-seq-opt) } } return answer; } if (fastfloat_strncasecmp(first, str_const_inf(), 3)) { if ((last - first >= 8) && fastfloat_strncasecmp(first + 3, str_const_inf() + 3, 5)) { answer.ptr = first + 8; } else { answer.ptr = first + 3; } value = minusSign ? -std::numeric_limits::infinity() : std::numeric_limits::infinity(); return answer; } } answer.ec = std::errc::invalid_argument; return answer; } /** * Returns true if the floating-pointing rounding mode is to 'nearest'. * It is the default on most system. This function is meant to be inexpensive. * Credit : @mwalcott3 */ fastfloat_really_inline bool rounds_to_nearest() noexcept { // https://lemire.me/blog/2020/06/26/gcc-not-nearest/ #if (FLT_EVAL_METHOD != 1) && (FLT_EVAL_METHOD != 0) return false; #endif // See // A fast function to check your floating-point rounding mode // https://lemire.me/blog/2022/11/16/a-fast-function-to-check-your-floating-point-rounding-mode/ // // This function is meant to be equivalent to : // prior: #include // return fegetround() == FE_TONEAREST; // However, it is expected to be much faster than the fegetround() // function call. // // The volatile keyword prevents the compiler from computing the function // at compile-time. // There might be other ways to prevent compile-time optimizations (e.g., // asm). The value does not need to be std::numeric_limits::min(), any // small value so that 1 + x should round to 1 would do (after accounting for // excess precision, as in 387 instructions). static float volatile fmin = std::numeric_limits::min(); float fmini = fmin; // we copy it so that it gets loaded at most once. // // Explanation: // Only when fegetround() == FE_TONEAREST do we have that // fmin + 1.0f == 1.0f - fmin. // // FE_UPWARD: // fmin + 1.0f > 1 // 1.0f - fmin == 1 // // FE_DOWNWARD or FE_TOWARDZERO: // fmin + 1.0f == 1 // 1.0f - fmin < 1 // // Note: This may fail to be accurate if fast-math has been // enabled, as rounding conventions may not apply. #ifdef FASTFLOAT_VISUAL_STUDIO #pragma warning(push) // todo: is there a VS warning? // see // https://stackoverflow.com/questions/46079446/is-there-a-warning-for-floating-point-equality-checking-in-visual-studio-2013 #elif defined(__clang__) #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wfloat-equal" #elif defined(__GNUC__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wfloat-equal" #endif return (fmini + 1.0f == 1.0f - fmini); #ifdef FASTFLOAT_VISUAL_STUDIO #pragma warning(pop) #elif defined(__clang__) #pragma clang diagnostic pop #elif defined(__GNUC__) #pragma GCC diagnostic pop #endif } } // namespace detail template struct from_chars_caller { template FASTFLOAT_CONSTEXPR20 static from_chars_result_t call(UC const *first, UC const *last, T &value, parse_options_t options) noexcept { return from_chars_advanced(first, last, value, options); } }; #ifdef __STDCPP_FLOAT32_T__ template <> struct from_chars_caller { template FASTFLOAT_CONSTEXPR20 static from_chars_result_t call(UC const *first, UC const *last, std::float32_t &value, parse_options_t options) noexcept { // if std::float32_t is defined, and we are in C++23 mode; macro set for // float32; set value to float due to equivalence between float and // float32_t float val; auto ret = from_chars_advanced(first, last, val, options); value = val; return ret; } }; #endif #ifdef __STDCPP_FLOAT64_T__ template <> struct from_chars_caller { template FASTFLOAT_CONSTEXPR20 static from_chars_result_t call(UC const *first, UC const *last, std::float64_t &value, parse_options_t options) noexcept { // if std::float64_t is defined, and we are in C++23 mode; macro set for // float64; set value as double due to equivalence between double and // float64_t double val; auto ret = from_chars_advanced(first, last, val, options); value = val; return ret; } }; #endif template FASTFLOAT_CONSTEXPR20 from_chars_result_t from_chars(UC const *first, UC const *last, T &value, chars_format fmt /*= chars_format::general*/) noexcept { return from_chars_caller::call(first, last, value, parse_options_t(fmt)); } /** * This function overload takes parsed_number_string_t structure that is created * and populated either by from_chars_advanced function taking chars range and * parsing options or other parsing custom function implemented by user. */ template FASTFLOAT_CONSTEXPR20 from_chars_result_t from_chars_advanced(parsed_number_string_t &pns, T &value) noexcept { static_assert(is_supported_float_type::value, "only some floating-point types are supported"); static_assert(is_supported_char_type::value, "only char, wchar_t, char16_t and char32_t are supported"); from_chars_result_t answer; answer.ec = std::errc(); // be optimistic answer.ptr = pns.lastmatch; // The implementation of the Clinger's fast path is convoluted because // we want round-to-nearest in all cases, irrespective of the rounding mode // selected on the thread. // We proceed optimistically, assuming that detail::rounds_to_nearest() // returns true. if (binary_format::min_exponent_fast_path() <= pns.exponent && pns.exponent <= binary_format::max_exponent_fast_path() && !pns.too_many_digits) { // Unfortunately, the conventional Clinger's fast path is only possible // when the system rounds to the nearest float. // // We expect the next branch to almost always be selected. // We could check it first (before the previous branch), but // there might be performance advantages at having the check // be last. if (!cpp20_and_in_constexpr() && detail::rounds_to_nearest()) { // We have that fegetround() == FE_TONEAREST. // Next is Clinger's fast path. if (pns.mantissa <= binary_format::max_mantissa_fast_path()) { value = T(pns.mantissa); if (pns.exponent < 0) { value = value / binary_format::exact_power_of_ten(-pns.exponent); } else { value = value * binary_format::exact_power_of_ten(pns.exponent); } if (pns.negative) { value = -value; } return answer; } } else { // We do not have that fegetround() == FE_TONEAREST. // Next is a modified Clinger's fast path, inspired by Jakub Jelรญnek's // proposal if (pns.exponent >= 0 && pns.mantissa <= binary_format::max_mantissa_fast_path(pns.exponent)) { #if defined(__clang__) || defined(FASTFLOAT_32BIT) // Clang may map 0 to -0.0 when fegetround() == FE_DOWNWARD if (pns.mantissa == 0) { value = pns.negative ? T(-0.) : T(0.); return answer; } #endif value = T(pns.mantissa) * binary_format::exact_power_of_ten(pns.exponent); if (pns.negative) { value = -value; } return answer; } } } adjusted_mantissa am = compute_float>(pns.exponent, pns.mantissa); if (pns.too_many_digits && am.power2 >= 0) { if (am != compute_float>(pns.exponent, pns.mantissa + 1)) { am = compute_error>(pns.exponent, pns.mantissa); } } // If we called compute_float>(pns.exponent, pns.mantissa) // and we have an invalid power (am.power2 < 0), then we need to go the long // way around again. This is very uncommon. if (am.power2 < 0) { am = digit_comp(pns, am); } to_float(pns.negative, am, value); // Test for over/underflow. if ((pns.mantissa != 0 && am.mantissa == 0 && am.power2 == 0) || am.power2 == binary_format::infinite_power()) { answer.ec = std::errc::result_out_of_range; } return answer; } template FASTFLOAT_CONSTEXPR20 from_chars_result_t from_chars_float_advanced(UC const *first, UC const *last, T &value, parse_options_t options) noexcept { static_assert(is_supported_float_type::value, "only some floating-point types are supported"); static_assert(is_supported_char_type::value, "only char, wchar_t, char16_t and char32_t are supported"); chars_format const fmt = detail::adjust_for_feature_macros(options.format); from_chars_result_t answer; if (uint64_t(fmt & chars_format::skip_white_space)) { while ((first != last) && fast_float::is_space(*first)) { first++; } } if (first == last) { answer.ec = std::errc::invalid_argument; answer.ptr = first; return answer; } parsed_number_string_t pns = parse_number_string(first, last, options); if (!pns.valid) { if (uint64_t(fmt & chars_format::no_infnan)) { answer.ec = std::errc::invalid_argument; answer.ptr = first; return answer; } else { return detail::parse_infnan(first, last, value, fmt); } } // call overload that takes parsed_number_string_t directly. return from_chars_advanced(pns, value); } template FASTFLOAT_CONSTEXPR20 from_chars_result_t from_chars(UC const *first, UC const *last, T &value, int base) noexcept { static_assert(is_supported_integer_type::value, "only integer types are supported"); static_assert(is_supported_char_type::value, "only char, wchar_t, char16_t and char32_t are supported"); parse_options_t options; options.base = base; return from_chars_advanced(first, last, value, options); } template FASTFLOAT_CONSTEXPR20 from_chars_result_t from_chars_int_advanced(UC const *first, UC const *last, T &value, parse_options_t options) noexcept { static_assert(is_supported_integer_type::value, "only integer types are supported"); static_assert(is_supported_char_type::value, "only char, wchar_t, char16_t and char32_t are supported"); chars_format const fmt = detail::adjust_for_feature_macros(options.format); int const base = options.base; from_chars_result_t answer; if (uint64_t(fmt & chars_format::skip_white_space)) { while ((first != last) && fast_float::is_space(*first)) { first++; } } if (first == last || base < 2 || base > 36) { answer.ec = std::errc::invalid_argument; answer.ptr = first; return answer; } return parse_int_string(first, last, value, options); } template struct from_chars_advanced_caller { static_assert(TypeIx > 0, "unsupported type"); }; template <> struct from_chars_advanced_caller<1> { template FASTFLOAT_CONSTEXPR20 static from_chars_result_t call(UC const *first, UC const *last, T &value, parse_options_t options) noexcept { return from_chars_float_advanced(first, last, value, options); } }; template <> struct from_chars_advanced_caller<2> { template FASTFLOAT_CONSTEXPR20 static from_chars_result_t call(UC const *first, UC const *last, T &value, parse_options_t options) noexcept { return from_chars_int_advanced(first, last, value, options); } }; template FASTFLOAT_CONSTEXPR20 from_chars_result_t from_chars_advanced(UC const *first, UC const *last, T &value, parse_options_t options) noexcept { return from_chars_advanced_caller< size_t(is_supported_float_type::value) + 2 * size_t(is_supported_integer_type::value)>::call(first, last, value, options); } } // namespace fast_float #endif c4core-0.2.6/src/c4/ext/rng/000077500000000000000000000000001477602032300153655ustar00rootroot00000000000000c4core-0.2.6/src/c4/ext/rng/rng.hpp000066400000000000000000000123151477602032300166660ustar00rootroot00000000000000/* Copyright (c) 2018 Arvid Gerstmann. * * https://arvid.io/2018/07/02/better-cxx-prng/ * * This code is licensed under MIT license. */ #ifndef AG_RANDOM_H #define AG_RANDOM_H #include #include #ifdef __clang__ # pragma clang diagnostic push # pragma clang diagnostic ignored "-Wold-style-cast" #elif defined(__GNUC__) # pragma GCC diagnostic push # pragma GCC diagnostic ignored "-Wold-style-cast" #endif namespace c4 { namespace rng { class splitmix { public: using result_type = uint32_t; static constexpr result_type (min)() { return 0; } static constexpr result_type (max)() { return UINT32_MAX; } friend bool operator==(splitmix const &, splitmix const &); friend bool operator!=(splitmix const &, splitmix const &); splitmix() : m_seed(1) {} explicit splitmix(uint64_t s) : m_seed(s) {} explicit splitmix(std::random_device &rd) { seed(rd); } void seed(uint64_t s) { m_seed = s; } void seed(std::random_device &rd) { m_seed = uint64_t(rd()) << 31 | uint64_t(rd()); } result_type operator()() { uint64_t z = (m_seed += UINT64_C(0x9E3779B97F4A7C15)); z = (z ^ (z >> 30)) * UINT64_C(0xBF58476D1CE4E5B9); z = (z ^ (z >> 27)) * UINT64_C(0x94D049BB133111EB); return result_type((z ^ (z >> 31)) >> 31); } void discard(unsigned long long n) { for (unsigned long long i = 0; i < n; ++i) operator()(); } private: uint64_t m_seed; }; inline bool operator==(splitmix const &lhs, splitmix const &rhs) { return lhs.m_seed == rhs.m_seed; } inline bool operator!=(splitmix const &lhs, splitmix const &rhs) { return lhs.m_seed != rhs.m_seed; } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- class xorshift { public: using result_type = uint32_t; static constexpr result_type (min)() { return 0; } static constexpr result_type (max)() { return UINT32_MAX; } friend bool operator==(xorshift const &, xorshift const &); friend bool operator!=(xorshift const &, xorshift const &); xorshift() : m_seed(0xc1f651c67c62c6e0ull) {} explicit xorshift(std::random_device &rd) { seed(rd); } void seed(uint64_t s) { m_seed = s; } void seed(std::random_device &rd) { m_seed = uint64_t(rd()) << 31 | uint64_t(rd()); } result_type operator()() { uint64_t result = m_seed * 0xd989bcacc137dcd5ull; m_seed ^= m_seed >> 11; m_seed ^= m_seed << 31; m_seed ^= m_seed >> 18; return uint32_t(result >> 32ull); } void discard(unsigned long long n) { for (unsigned long long i = 0; i < n; ++i) operator()(); } private: uint64_t m_seed; }; inline bool operator==(xorshift const &lhs, xorshift const &rhs) { return lhs.m_seed == rhs.m_seed; } inline bool operator!=(xorshift const &lhs, xorshift const &rhs) { return lhs.m_seed != rhs.m_seed; } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- class pcg { public: using result_type = uint32_t; static constexpr result_type (min)() { return 0; } static constexpr result_type (max)() { return UINT32_MAX; } friend bool operator==(pcg const &, pcg const &); friend bool operator!=(pcg const &, pcg const &); pcg() : m_state(0x853c49e6748fea9bULL) , m_inc(0xda3e39cb94b95bdbULL) {} explicit pcg(uint64_t s) { m_state = s; m_inc = m_state << 1; } explicit pcg(std::random_device &rd) { seed(rd); } void seed(uint64_t s) { m_state = s; } void seed(std::random_device &rd) { uint64_t s0 = uint64_t(rd()) << 31 | uint64_t(rd()); uint64_t s1 = uint64_t(rd()) << 31 | uint64_t(rd()); m_state = 0; m_inc = (s1 << 1) | 1; (void)operator()(); m_state += s0; (void)operator()(); } result_type operator()() { uint64_t oldstate = m_state; m_state = oldstate * 6364136223846793005ULL + m_inc; uint32_t xorshifted = uint32_t(((oldstate >> 18u) ^ oldstate) >> 27u); //int rot = oldstate >> 59u; // the original. error? int64_t rot = (int64_t)oldstate >> 59u; // error? return (xorshifted >> rot) | (xorshifted << ((uint64_t)(-rot) & 31)); } void discard(unsigned long long n) { for (unsigned long long i = 0; i < n; ++i) operator()(); } private: uint64_t m_state; uint64_t m_inc; }; inline bool operator==(pcg const &lhs, pcg const &rhs) { return lhs.m_state == rhs.m_state && lhs.m_inc == rhs.m_inc; } inline bool operator!=(pcg const &lhs, pcg const &rhs) { return lhs.m_state != rhs.m_state || lhs.m_inc != rhs.m_inc; } } // namespace rng } // namespace c4 #ifdef __clang__ # pragma clang diagnostic pop #elif defined(__GNUC__) # pragma GCC diagnostic pop #endif #endif /* AG_RANDOM_H */ c4core-0.2.6/src/c4/ext/sg14/000077500000000000000000000000001477602032300153555ustar00rootroot00000000000000c4core-0.2.6/src/c4/ext/sg14/README.md000066400000000000000000000001061477602032300166310ustar00rootroot00000000000000https://github.com/WG21-SG14/SG14/blob/master/SG14/inplace_function.h c4core-0.2.6/src/c4/ext/sg14/inplace_function.h000066400000000000000000000261141477602032300210520ustar00rootroot00000000000000/* * Boost Software License - Version 1.0 - August 17th, 2003 * * Permission is hereby granted, free of charge, to any person or organization * obtaining a copy of the software and accompanying documentation covered by * this license (the "Software") to use, reproduce, display, distribute, * execute, and transmit the Software, and to prepare derivative works of the * Software, and to permit third-parties to whom the Software is furnished to * do so, all subject to the following: * * The copyright notices in the Software and this entire statement, including * the above license grant, this restriction and the following disclaimer, * must be included in all copies of the Software, in whole or in part, and * all derivative works of the Software, unless such copies or derivative * works are solely in the form of machine-executable object code generated by * a source language processor. * * 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, TITLE AND NON-INFRINGEMENT. IN NO EVENT * SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE * FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #ifndef _C4_EXT_SG14_INPLACE_FUNCTION_H_ #define _C4_EXT_SG14_INPLACE_FUNCTION_H_ #include #include #include #include namespace stdext { namespace inplace_function_detail { static constexpr size_t InplaceFunctionDefaultCapacity = 32; #if defined(__GLIBCXX__) // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61458 template union aligned_storage_helper { struct double1 { double a; }; struct double4 { double a[4]; }; template using maybe = typename std::conditional<(Cap >= sizeof(T)), T, char>::type; char real_data[Cap]; maybe a; maybe b; maybe c; maybe d; maybe e; maybe f; maybe g; maybe h; }; template>::value> struct aligned_storage { using type = typename std::aligned_storage::type; }; #else using std::aligned_storage; #endif template struct wrapper { using type = T; }; template struct vtable { using storage_ptr_t = void*; using invoke_ptr_t = R(*)(storage_ptr_t, Args&&...); using process_ptr_t = void(*)(storage_ptr_t, storage_ptr_t); using destructor_ptr_t = void(*)(storage_ptr_t); const invoke_ptr_t invoke_ptr; const process_ptr_t copy_ptr; const process_ptr_t move_ptr; const destructor_ptr_t destructor_ptr; explicit constexpr vtable() noexcept : invoke_ptr{ [](storage_ptr_t, Args&&...) -> R { #if (defined(_MSC_VER) && (defined(_CPPUNWIND) && (__CPPUNWIND == 1))) \ || \ (defined(__EXCEPTIONS) || defined(__cpp_exceptions)) throw std::bad_function_call(); #else std::abort(); #endif } }, copy_ptr{ [](storage_ptr_t, storage_ptr_t) noexcept -> void {} }, move_ptr{ [](storage_ptr_t, storage_ptr_t) noexcept -> void {} }, destructor_ptr{ [](storage_ptr_t) noexcept -> void {} } {} template explicit constexpr vtable(wrapper) noexcept : invoke_ptr{ [](storage_ptr_t storage_ptr, Args&&... args) noexcept(noexcept(std::declval()(args...))) -> R { return (*static_cast(storage_ptr))( std::forward(args)... ); } }, copy_ptr{ [](storage_ptr_t dst_ptr, storage_ptr_t src_ptr) noexcept(std::is_nothrow_copy_constructible::value) -> void { new (dst_ptr) C{ (*static_cast(src_ptr)) }; } }, move_ptr{ [](storage_ptr_t dst_ptr, storage_ptr_t src_ptr) noexcept(std::is_nothrow_move_constructible::value) -> void { new (dst_ptr) C{ std::move(*static_cast(src_ptr)) }; } }, destructor_ptr{ [](storage_ptr_t storage_ptr) noexcept -> void { static_cast(storage_ptr)->~C(); } } {} vtable(const vtable&) = delete; vtable(vtable&&) = delete; vtable& operator= (const vtable&) = delete; vtable& operator= (vtable&&) = delete; ~vtable() = default; }; template struct is_valid_inplace_dst : std::true_type { static_assert(DstCap >= SrcCap, "Can't squeeze larger inplace_function into a smaller one" ); static_assert(DstAlign % SrcAlign == 0, "Incompatible inplace_function alignments" ); }; } // namespace inplace_function_detail template< typename Signature, size_t Capacity = inplace_function_detail::InplaceFunctionDefaultCapacity, size_t Alignment = std::alignment_of::type>::value > class inplace_function; // unspecified template< typename R, typename... Args, size_t Capacity, size_t Alignment > class inplace_function { static const constexpr inplace_function_detail::vtable empty_vtable{}; public: using capacity = std::integral_constant; using alignment = std::integral_constant; using storage_t = typename inplace_function_detail::aligned_storage::type; using vtable_t = inplace_function_detail::vtable; using vtable_ptr_t = const vtable_t*; template friend class inplace_function; inplace_function() noexcept : vtable_ptr_{std::addressof(empty_vtable)} {} template< typename T, typename C = typename std::decay::type, typename = typename std::enable_if< !(std::is_same::value || std::is_convertible::value) >::type > inplace_function(T&& closure) { #if __cplusplus >= 201703L static_assert(std::is_invocable_r::value, "inplace_function cannot be constructed from non-callable type" ); #endif static_assert(std::is_copy_constructible::value, "inplace_function cannot be constructed from non-copyable type" ); static_assert(sizeof(C) <= Capacity, "inplace_function cannot be constructed from object with this (large) size" ); static_assert(Alignment % std::alignment_of::value == 0, "inplace_function cannot be constructed from object with this (large) alignment" ); static const vtable_t vt{inplace_function_detail::wrapper{}}; vtable_ptr_ = std::addressof(vt); new (std::addressof(storage_)) C{std::forward(closure)}; } inplace_function(std::nullptr_t) noexcept : vtable_ptr_{std::addressof(empty_vtable)} {} inplace_function(const inplace_function& other) : vtable_ptr_{other.vtable_ptr_} { vtable_ptr_->copy_ptr( std::addressof(storage_), std::addressof(other.storage_) ); } inplace_function(inplace_function&& other) : vtable_ptr_{other.vtable_ptr_} { vtable_ptr_->move_ptr( std::addressof(storage_), std::addressof(other.storage_) ); } inplace_function& operator= (std::nullptr_t) noexcept { vtable_ptr_->destructor_ptr(std::addressof(storage_)); vtable_ptr_ = std::addressof(empty_vtable); return *this; } inplace_function& operator= (const inplace_function& other) { if(this != std::addressof(other)) { vtable_ptr_->destructor_ptr(std::addressof(storage_)); vtable_ptr_ = other.vtable_ptr_; vtable_ptr_->copy_ptr( std::addressof(storage_), std::addressof(other.storage_) ); } return *this; } inplace_function& operator= (inplace_function&& other) { if(this != std::addressof(other)) { vtable_ptr_->destructor_ptr(std::addressof(storage_)); vtable_ptr_ = other.vtable_ptr_; vtable_ptr_->move_ptr( std::addressof(storage_), std::addressof(other.storage_) ); } return *this; } ~inplace_function() { vtable_ptr_->destructor_ptr(std::addressof(storage_)); } R operator() (Args... args) const { return vtable_ptr_->invoke_ptr( std::addressof(storage_), std::forward(args)... ); } constexpr bool operator== (std::nullptr_t) const noexcept { return !operator bool(); } constexpr bool operator!= (std::nullptr_t) const noexcept { return operator bool(); } explicit constexpr operator bool() const noexcept { return vtable_ptr_ != std::addressof(empty_vtable); } template operator inplace_function() const& { static_assert(inplace_function_detail::is_valid_inplace_dst< Cap, Align, Capacity, Alignment >::value, "conversion not allowed"); return {vtable_ptr_, vtable_ptr_->copy_ptr, std::addressof(storage_)}; } template operator inplace_function() && { static_assert(inplace_function_detail::is_valid_inplace_dst< Cap, Align, Capacity, Alignment >::value, "conversion not allowed"); return {vtable_ptr_, vtable_ptr_->move_ptr, std::addressof(storage_)}; } void swap(inplace_function& other) { if (this == std::addressof(other)) return; storage_t tmp; vtable_ptr_->move_ptr( std::addressof(tmp), std::addressof(storage_) ); vtable_ptr_->destructor_ptr(std::addressof(storage_)); other.vtable_ptr_->move_ptr( std::addressof(storage_), std::addressof(other.storage_) ); other.vtable_ptr_->destructor_ptr(std::addressof(other.storage_)); vtable_ptr_->move_ptr( std::addressof(other.storage_), std::addressof(tmp) ); vtable_ptr_->destructor_ptr(std::addressof(tmp)); std::swap(vtable_ptr_, other.vtable_ptr_); } private: vtable_ptr_t vtable_ptr_; mutable storage_t storage_; inplace_function( vtable_ptr_t vtable_ptr, typename vtable_t::process_ptr_t process_ptr, typename vtable_t::storage_ptr_t storage_ptr ) : vtable_ptr_{vtable_ptr} { process_ptr(std::addressof(storage_), storage_ptr); } }; } // namespace stdext #endif /* _C4_EXT_SG14_INPLACE_FUNCTION_H_ */ c4core-0.2.6/src/c4/format.cpp000066400000000000000000000032311477602032300157720ustar00rootroot00000000000000#include "c4/format.hpp" #include // for std::align #ifdef __clang__ # pragma clang diagnostic push # pragma clang diagnostic ignored "-Wformat-nonliteral" # pragma clang diagnostic ignored "-Wold-style-cast" #elif defined(__GNUC__) # pragma GCC diagnostic push # pragma GCC diagnostic ignored "-Wformat-nonliteral" # pragma GCC diagnostic ignored "-Wold-style-cast" #endif namespace c4 { size_t to_chars(substr buf, fmt::const_raw_wrapper r) { void * vptr = buf.str; size_t space = buf.len; char * ptr = (char*) std::align(r.alignment, r.len, vptr, space); if(ptr == nullptr) { // if it was not possible to align, return a conservative estimate // of the required space return r.alignment + r.len; } C4_CHECK(ptr >= buf.begin() && ptr <= buf.end()); size_t sz = static_cast(ptr - buf.str) + r.len; if(sz <= buf.len) { memcpy(ptr, r.buf, r.len); } return sz; } bool from_chars(csubstr buf, fmt::raw_wrapper *r) { C4_SUPPRESS_WARNING_GCC_WITH_PUSH("-Wcast-qual") void * vptr = (void*)buf.str; C4_SUPPRESS_WARNING_GCC_POP size_t space = buf.len; char * ptr = (char*) std::align(r->alignment, r->len, vptr, space); C4_CHECK(ptr != nullptr); C4_CHECK(ptr >= buf.begin() && ptr <= buf.end()); C4_SUPPRESS_WARNING_GCC_PUSH #if defined(__GNUC__) && __GNUC__ > 9 C4_SUPPRESS_WARNING_GCC("-Wanalyzer-null-argument") #endif memcpy(r->buf, ptr, r->len); C4_SUPPRESS_WARNING_GCC_POP return true; } } // namespace c4 #ifdef __clang__ # pragma clang diagnostic pop #elif defined(__GNUC__) # pragma GCC diagnostic pop #endif c4core-0.2.6/src/c4/format.hpp000066400000000000000000000772071477602032300160150ustar00rootroot00000000000000#ifndef _C4_FORMAT_HPP_ #define _C4_FORMAT_HPP_ /** @file format.hpp provides type-safe facilities for formatting arguments * to string buffers */ #include "c4/charconv.hpp" #include "c4/blob.hpp" #if defined(_MSC_VER) && !defined(__clang__) # pragma warning(push) # if C4_MSVC_VERSION != C4_MSVC_VERSION_2017 # pragma warning(disable: 4800) // forcing value to bool 'true' or 'false' (performance warning) # endif # pragma warning(disable: 4996) // snprintf/scanf: this function or variable may be unsafe #elif defined(__clang__) # pragma clang diagnostic push #elif defined(__GNUC__) # pragma GCC diagnostic push # pragma GCC diagnostic ignored "-Wuseless-cast" #endif // NOLINTBEGIN(cppcoreguidelines-pro-type-reinterpret-cast,*avoid-goto*) /** @defgroup doc_format_utils Format utilities * * @brief Provides generic and type-safe formatting/scanning utilities * built on top of @ref doc_to_chars() and @ref doc_from_chars, * forwarding the arguments to these functions, which in turn use the * @ref doc_charconv utilities. Like @ref doc_charconv, the formatting * facilities are very efficient and many times faster than printf(). * * @see [a formatting sample in rapidyaml's docs](https://rapidyaml.readthedocs.io/latest/doxygen/group__doc__quickstart.html#gac2425b515eb552589708cfff70c52b14) * */ /** @defgroup doc_format_specifiers Format specifiers * * @brief Format specifiers are tag types and functions that are used * together with @ref doc_to_chars and @ref doc_from_chars * * @see [a formatting sample in rapidyaml's docs](https://rapidyaml.readthedocs.io/latest/doxygen/group__doc__quickstart.html#gac2425b515eb552589708cfff70c52b14) * @ingroup doc_format_utils */ namespace c4 { /** @addtogroup doc_format_utils * @{ */ //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // formatting truthy types as booleans namespace fmt { /** @addtogroup doc_format_specifiers * @{ */ /** @defgroup doc_boolean_specifiers boolean specifiers * @{ */ /** write a variable as an alphabetic boolean, ie as either true or false * @param strict_read */ template struct boolalpha_ { boolalpha_(T val_, bool strict_read_=false) : val(val_ ? true : false), strict_read(strict_read_) {} bool val; bool strict_read; }; template boolalpha_ boolalpha(T const& val, bool strict_read=false) { return boolalpha_(val, strict_read); } /** @} */ /** @} */ } // namespace fmt /** write a variable as an alphabetic boolean, ie as either true or * false * @ingroup doc_to_chars */ template inline size_t to_chars(substr buf, fmt::boolalpha_ fmt) { return to_chars(buf, fmt.val ? "true" : "false"); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // formatting integral types namespace fmt { /** @addtogroup doc_format_specifiers * @{ */ /** @defgroup doc_integer_specifiers Integer specifiers * @{ */ /** format an integral type with a custom radix */ template struct integral_ { C4_STATIC_ASSERT(std::is_integral::value); T val; T radix; C4_ALWAYS_INLINE integral_(T val_, T radix_) : val(val_), radix(radix_) {} }; /** format an integral type with a custom radix, and pad with zeroes on the left */ template struct integral_padded_ { C4_STATIC_ASSERT(std::is_integral::value); T val; T radix; size_t num_digits; C4_ALWAYS_INLINE integral_padded_(T val_, T radix_, size_t nd) : val(val_), radix(radix_), num_digits(nd) {} }; /** format an integral type with a custom radix */ template C4_ALWAYS_INLINE integral_ integral(T val, T radix=10) { return integral_(val, radix); } /** format an integral type with a custom radix */ template C4_ALWAYS_INLINE integral_ integral(T const* val, T radix=10) { return integral_(reinterpret_cast(val), static_cast(radix)); } /** format an integral type with a custom radix */ template C4_ALWAYS_INLINE integral_ integral(std::nullptr_t, T radix=10) { return integral_(intptr_t(0), static_cast(radix)); } /** format the pointer as an hexadecimal value */ template inline integral_ hex(T * v) { return integral_(reinterpret_cast(v), intptr_t(16)); } /** format the pointer as an hexadecimal value */ template inline integral_ hex(T const* v) { return integral_(reinterpret_cast(v), intptr_t(16)); } /** format null as an hexadecimal value * @overload hex */ inline integral_ hex(std::nullptr_t) { return integral_(0, intptr_t(16)); } /** format the integral_ argument as an hexadecimal value * @overload hex */ template inline integral_ hex(T v) { return integral_(v, T(16)); } /** format the pointer as an octal value */ template inline integral_ oct(T const* v) { return integral_(reinterpret_cast(v), intptr_t(8)); } /** format the pointer as an octal value */ template inline integral_ oct(T * v) { return integral_(reinterpret_cast(v), intptr_t(8)); } /** format null as an octal value */ inline integral_ oct(std::nullptr_t) { return integral_(intptr_t(0), intptr_t(8)); } /** format the integral_ argument as an octal value */ template inline integral_ oct(T v) { return integral_(v, T(8)); } /** format the pointer as a binary 0-1 value * @see c4::raw() if you want to use a binary memcpy instead of 0-1 formatting */ template inline integral_ bin(T const* v) { return integral_(reinterpret_cast(v), intptr_t(2)); } /** format the pointer as a binary 0-1 value * @see c4::raw() if you want to use a binary memcpy instead of 0-1 formatting */ template inline integral_ bin(T * v) { return integral_(reinterpret_cast(v), intptr_t(2)); } /** format null as a binary 0-1 value * @see c4::raw() if you want to use a binary memcpy instead of 0-1 formatting */ inline integral_ bin(std::nullptr_t) { return integral_(intptr_t(0), intptr_t(2)); } /** format the integral_ argument as a binary 0-1 value * @see c4::raw() if you want to use a raw memcpy-based binary dump instead of 0-1 formatting */ template inline integral_ bin(T v) { return integral_(v, T(2)); } /** @} */ // integer_specifiers /** @defgroup doc_zpad Pad the number with zeroes on the left * @{ */ /** pad the argument with zeroes on the left, with decimal radix */ template C4_ALWAYS_INLINE integral_padded_ zpad(T val, size_t num_digits) { return integral_padded_(val, T(10), num_digits); } /** pad the argument with zeroes on the left */ template C4_ALWAYS_INLINE integral_padded_ zpad(integral_ val, size_t num_digits) { return integral_padded_(val.val, val.radix, num_digits); } /** pad the argument with zeroes on the left */ C4_ALWAYS_INLINE integral_padded_ zpad(std::nullptr_t, size_t num_digits) { return integral_padded_(0, 16, num_digits); } /** pad the argument with zeroes on the left */ template C4_ALWAYS_INLINE integral_padded_ zpad(T const* val, size_t num_digits) { return integral_padded_(reinterpret_cast(val), 16, num_digits); } template C4_ALWAYS_INLINE integral_padded_ zpad(T * val, size_t num_digits) { return integral_padded_(reinterpret_cast(val), 16, num_digits); } /** @} */ // zpad /** @defgroup doc_overflow_checked Check read for overflow * @{ */ template struct overflow_checked_ { static_assert(std::is_integral::value, "range checking only for integral types"); C4_ALWAYS_INLINE overflow_checked_(T &val_) : val(&val_) {} T *val; }; template C4_ALWAYS_INLINE overflow_checked_ overflow_checked(T &val) { return overflow_checked_(val); } /** @} */ // overflow_checked /** @} */ // format_specifiers } // namespace fmt /** format an integer signed type * @ingroup doc_to_chars */ template C4_ALWAYS_INLINE typename std::enable_if::value, size_t>::type to_chars(substr buf, fmt::integral_ fmt) { return itoa(buf, fmt.val, fmt.radix); } /** format an integer signed type, pad with zeroes * @ingroup doc_to_chars */ template C4_ALWAYS_INLINE typename std::enable_if::value, size_t>::type to_chars(substr buf, fmt::integral_padded_ fmt) { return itoa(buf, fmt.val, fmt.radix, fmt.num_digits); } /** format an integer unsigned type * @ingroup doc_to_chars */ template C4_ALWAYS_INLINE typename std::enable_if::value, size_t>::type to_chars(substr buf, fmt::integral_ fmt) { return utoa(buf, fmt.val, fmt.radix); } /** format an integer unsigned type, pad with zeroes * @ingroup doc_to_chars */ template C4_ALWAYS_INLINE typename std::enable_if::value, size_t>::type to_chars(substr buf, fmt::integral_padded_ fmt) { return utoa(buf, fmt.val, fmt.radix, fmt.num_digits); } /** read an integer type, detecting overflow (returns false on overflow) * @ingroup doc_from_chars */ template C4_ALWAYS_INLINE bool from_chars(csubstr s, fmt::overflow_checked_ wrapper) { if(C4_LIKELY(!overflows(s))) return atox(s, wrapper.val); return false; } /** read an integer type, detecting overflow (returns false on overflow) * @ingroup doc_from_chars */ template C4_ALWAYS_INLINE bool from_chars(csubstr s, fmt::overflow_checked_ *wrapper) { if(C4_LIKELY(!overflows(s))) return atox(s, wrapper->val); return false; } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // formatting real types namespace fmt { /** @addtogroup doc_format_specifiers * @{ */ /** @defgroup doc_real_specifiers Real specifiers * @{ */ template struct real_ { T val; int precision; RealFormat_e fmt; real_(T v, int prec=-1, RealFormat_e f=FTOA_FLOAT) : val(v), precision(prec), fmt(f) {} }; template real_ real(T val, int precision, RealFormat_e fmt=FTOA_FLOAT) { return real_(val, precision, fmt); } /** @} */ // real_specifiers /** @} */ // format_specifiers } // namespace fmt /** @ingroup doc_to_chars */ inline size_t to_chars(substr buf, fmt::real_< float> fmt) { return ftoa(buf, fmt.val, fmt.precision, fmt.fmt); } /** @ingroup doc_to_chars */ inline size_t to_chars(substr buf, fmt::real_ fmt) { return dtoa(buf, fmt.val, fmt.precision, fmt.fmt); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // writing raw binary data namespace fmt { /** @addtogroup doc_format_specifiers * @{ */ /** @defgroup doc_raw_binary_specifiers Raw binary data * @{ */ /** @see blob_ */ template struct raw_wrapper_ : public blob_ { size_t alignment; C4_ALWAYS_INLINE raw_wrapper_(blob_ data, size_t alignment_) noexcept : blob_(data), alignment(alignment_) { C4_ASSERT_MSG(alignment > 0 && (alignment & (alignment - 1)) == 0, "alignment must be a power of two"); } }; using const_raw_wrapper = raw_wrapper_; using raw_wrapper = raw_wrapper_; /** mark a variable to be written in raw binary format, using memcpy * @see blob_ */ inline const_raw_wrapper craw(cblob data, size_t alignment=alignof(max_align_t)) { return const_raw_wrapper(data, alignment); } /** mark a variable to be written in raw binary format, using memcpy * @see blob_ */ inline const_raw_wrapper raw(cblob data, size_t alignment=alignof(max_align_t)) { return const_raw_wrapper(data, alignment); } /** mark a variable to be written in raw binary format, using memcpy * @see blob_ */ template inline const_raw_wrapper craw(T const& C4_RESTRICT data, size_t alignment=alignof(T)) { return const_raw_wrapper(cblob(data), alignment); } /** mark a variable to be written in raw binary format, using memcpy * @see blob_ */ template inline const_raw_wrapper raw(T const& C4_RESTRICT data, size_t alignment=alignof(T)) { return const_raw_wrapper(cblob(data), alignment); } /** mark a variable to be read in raw binary format, using memcpy */ inline raw_wrapper raw(blob data, size_t alignment=alignof(max_align_t)) { return raw_wrapper(data, alignment); } /** mark a variable to be read in raw binary format, using memcpy */ template inline raw_wrapper raw(T & C4_RESTRICT data, size_t alignment=alignof(T)) { return raw_wrapper(blob(data), alignment); } /** @} */ // raw_binary_specifiers /** @} */ // format_specifiers } // namespace fmt /** write a variable in raw binary format, using memcpy * @ingroup doc_to_chars */ C4CORE_EXPORT size_t to_chars(substr buf, fmt::const_raw_wrapper r); /** read a variable in raw binary format, using memcpy * @ingroup doc_from_chars */ C4CORE_EXPORT bool from_chars(csubstr buf, fmt::raw_wrapper *r); /** read a variable in raw binary format, using memcpy * @ingroup doc_from_chars */ inline bool from_chars(csubstr buf, fmt::raw_wrapper r) { return from_chars(buf, &r); } /** read a variable in raw binary format, using memcpy * @ingroup doc_from_chars_first */ inline size_t from_chars_first(csubstr buf, fmt::raw_wrapper *r) { return from_chars(buf, r); } /** read a variable in raw binary format, using memcpy * @ingroup doc_from_chars_first */ inline size_t from_chars_first(csubstr buf, fmt::raw_wrapper r) { return from_chars(buf, &r); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // formatting aligned to left/right namespace fmt { /** @addtogroup doc_format_specifiers * @{ */ /** @defgroup doc_alignment_specifiers Alignment specifiers * @{ */ template struct left_ { T val; size_t width; char pad; left_(T v, size_t w, char p) : val(v), width(w), pad(p) {} }; template struct right_ { T val; size_t width; char pad; right_(T v, size_t w, char p) : val(v), width(w), pad(p) {} }; /** mark an argument to be aligned left */ template left_ left(T val, size_t width, char padchar=' ') { return left_(val, width, padchar); } /** mark an argument to be aligned right */ template right_ right(T val, size_t width, char padchar=' ') { return right_(val, width, padchar); } /** @} */ // alignment_specifiers /** @} */ // format_specifiers } // namespace fmt /** @ingroup doc_to_chars */ template size_t to_chars(substr buf, fmt::left_ const& C4_RESTRICT align) { size_t ret = to_chars(buf, align.val); if(ret >= buf.len || ret >= align.width) return ret > align.width ? ret : align.width; buf.first(align.width).sub(ret).fill(align.pad); to_chars(buf, align.val); return align.width; } /** @ingroup doc_to_chars */ template size_t to_chars(substr buf, fmt::right_ const& C4_RESTRICT align) { size_t ret = to_chars(buf, align.val); if(ret >= buf.len || ret >= align.width) return ret > align.width ? ret : align.width; size_t rem = static_cast(align.width - ret); buf.first(rem).fill(align.pad); to_chars(buf.sub(rem), align.val); return align.width; } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /** @defgroup doc_cat cat: concatenate arguments to string * @{ */ /** @cond dev */ // terminates the variadic recursion inline size_t cat(substr /*buf*/) { return 0; } /** @endcond */ /** serialize the arguments, concatenating them to the given fixed-size buffer. * The buffer size is strictly respected: no writes will occur beyond its end. * @return the number of characters needed to write all the arguments into the buffer. * @see c4::catrs() if instead of a fixed-size buffer, a resizeable container is desired * @see c4::uncat() for the inverse function * @see c4::catsep() if a separator between each argument is to be used * @see c4::format() if a format string is desired */ template size_t cat(substr buf, Arg const& C4_RESTRICT a, Args const& C4_RESTRICT ...more) { size_t num = to_chars(buf, a); buf = buf.len >= num ? buf.sub(num) : substr{}; num += cat(buf, more...); return num; } /** like c4::cat() but return a substr instead of a size */ template substr cat_sub(substr buf, Args && ...args) { size_t sz = cat(buf, std::forward(args)...); C4_CHECK(sz <= buf.len); return {buf.str, sz <= buf.len ? sz : buf.len}; } /** @} */ //----------------------------------------------------------------------------- /** @defgroup doc_uncat uncat: read concatenated arguments from string * @{ */ /** @cond dev */ // terminates the variadic recursion inline size_t uncat(csubstr /*buf*/) { return 0; } /** @endcond */ /** deserialize the arguments from the given buffer. * * @return the number of characters read from the buffer, or csubstr::npos * if a conversion was not successful. * @see c4::cat(). c4::uncat() is the inverse of c4::cat(). */ template size_t uncat(csubstr buf, Arg & C4_RESTRICT a, Args & C4_RESTRICT ...more) { size_t out = from_chars_first(buf, &a); if(C4_UNLIKELY(out == csubstr::npos)) return csubstr::npos; buf = buf.len >= out ? buf.sub(out) : substr{}; size_t num = uncat(buf, more...); if(C4_UNLIKELY(num == csubstr::npos)) return csubstr::npos; return out + num; } /** @} */ //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /** @defgroup doc_catsep catsep: cat arguments to string with separator * @{ */ /** @cond dev */ namespace detail { template C4_ALWAYS_INLINE size_t catsep_more(substr /*buf*/, Sep const& C4_RESTRICT /*sep*/) { return 0; } template size_t catsep_more(substr buf, Sep const& C4_RESTRICT sep, Arg const& C4_RESTRICT a, Args const& C4_RESTRICT ...more) { size_t ret = to_chars(buf, sep); size_t num = ret; buf = buf.len >= ret ? buf.sub(ret) : substr{}; ret = to_chars(buf, a); num += ret; buf = buf.len >= ret ? buf.sub(ret) : substr{}; ret = catsep_more(buf, sep, more...); num += ret; return num; } template inline size_t uncatsep_more(csubstr /*buf*/, Sep & /*sep*/) { return 0; } template size_t uncatsep_more(csubstr buf, Sep & C4_RESTRICT sep, Arg & C4_RESTRICT a, Args & C4_RESTRICT ...more) { size_t ret = from_chars_first(buf, &sep); size_t num = ret; if(C4_UNLIKELY(ret == csubstr::npos)) return csubstr::npos; buf = buf.len >= ret ? buf.sub(ret) : substr{}; ret = from_chars_first(buf, &a); if(C4_UNLIKELY(ret == csubstr::npos)) return csubstr::npos; num += ret; buf = buf.len >= ret ? buf.sub(ret) : substr{}; ret = uncatsep_more(buf, sep, more...); if(C4_UNLIKELY(ret == csubstr::npos)) return csubstr::npos; num += ret; return num; } } // namespace detail template size_t catsep(substr /*buf*/, Sep const& C4_RESTRICT /*sep*/) { return 0; } /** @endcond */ /** serialize the arguments, concatenating them to the given fixed-size * buffer, using a separator between each argument. * The buffer size is strictly respected: no writes will occur beyond its end. * @return the number of characters needed to write all the arguments into the buffer. * @see c4::catseprs() if instead of a fixed-size buffer, a resizeable container is desired * @see c4::uncatsep() for the inverse function (ie, reading instead of writing) * @see c4::cat() if no separator is needed * @see c4::format() if a format string is desired */ template size_t catsep(substr buf, Sep const& C4_RESTRICT sep, Arg const& C4_RESTRICT a, Args const& C4_RESTRICT ...more) { size_t num = to_chars(buf, a); buf = buf.len >= num ? buf.sub(num) : substr{}; num += detail::catsep_more(buf, sep, more...); return num; } /** like c4::catsep() but return a substr instead of a size * @see c4::catsep(). c4::uncatsep() is the inverse of c4::catsep(). */ template substr catsep_sub(substr buf, Args && ...args) { size_t sz = catsep(buf, std::forward(args)...); C4_CHECK(sz <= buf.len); return {buf.str, sz <= buf.len ? sz : buf.len}; } /** @} */ //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /** @defgroup doc_uncatsep uncatsep: deserialize the separated arguments from a string * @{ */ /** deserialize the arguments from the given buffer. * * @return the number of characters read from the buffer, or csubstr::npos * if a conversion was not successful. * @see c4::cat(). c4::uncat() is the inverse of c4::cat(). */ /** deserialize the arguments from the given buffer, using a separator. * * @return the number of characters read from the buffer, or csubstr::npos * if a conversion was not successful * @see c4::catsep(). c4::uncatsep() is the inverse of c4::catsep(). */ template size_t uncatsep(csubstr buf, Sep & C4_RESTRICT sep, Arg & C4_RESTRICT a, Args & C4_RESTRICT ...more) { size_t ret = from_chars_first(buf, &a), num = ret; if(C4_UNLIKELY(ret == csubstr::npos)) return csubstr::npos; buf = buf.len >= ret ? buf.sub(ret) : substr{}; ret = detail::uncatsep_more(buf, sep, more...); if(C4_UNLIKELY(ret == csubstr::npos)) return csubstr::npos; num += ret; return num; } /** @} */ //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /** @defgroup doc_format format: formatted string interpolation * @{ */ /// @cond dev // terminates the variadic recursion inline size_t format(substr buf, csubstr fmt) { return to_chars(buf, fmt); } /// @endcond /** using a format string, serialize the arguments into the given * fixed-size buffer. * The buffer size is strictly respected: no writes will occur beyond its end. * In the format string, each argument is marked with a compact * curly-bracket pair: {}. Arguments beyond the last curly bracket pair * are silently ignored. For example: * @code{.cpp} * c4::format(buf, "the {} drank {} {}", "partier", 5, "beers"); // the partier drank 5 beers * c4::format(buf, "the {} drank {} {}", "programmer", 6, "coffees"); // the programmer drank 6 coffees * @endcode * @return the number of characters needed to write into the buffer. * @see c4::formatrs() if instead of a fixed-size buffer, a resizeable container is desired * @see c4::unformat() for the inverse function * @see c4::cat() if no format or separator is needed * @see c4::catsep() if no format is needed, but a separator must be used */ template size_t format(substr buf, csubstr fmt, Arg const& C4_RESTRICT a, Args const& C4_RESTRICT ...more) { size_t pos = fmt.find("{}"); // @todo use _find_fmt() if(C4_UNLIKELY(pos == csubstr::npos)) return to_chars(buf, fmt); size_t num = to_chars(buf, fmt.sub(0, pos)); size_t out = num; buf = buf.len >= num ? buf.sub(num) : substr{}; num = to_chars(buf, a); out += num; buf = buf.len >= num ? buf.sub(num) : substr{}; num = format(buf, fmt.sub(pos + 2), more...); out += num; return out; } /** like c4::format() but return a substr instead of a size * @see c4::format() * @see c4::catsep(). uncatsep() is the inverse of catsep(). */ template substr format_sub(substr buf, csubstr fmt, Args const& C4_RESTRICT ...args) { size_t sz = c4::format(buf, fmt, args...); C4_CHECK(sz <= buf.len); return {buf.str, sz <= buf.len ? sz : buf.len}; } /** @} */ //----------------------------------------------------------------------------- /** @defgroup doc_unformat unformat: formatted read from string * @{ */ /// @cond dev // terminates the variadic recursion inline size_t unformat(csubstr /*buf*/, csubstr fmt) { return fmt.len; } /// @endcond /** using a format string, deserialize the arguments from the given * buffer. * @return the number of characters read from the buffer, or npos if a conversion failed. * @see c4::format(). c4::unformat() is the inverse function to format(). */ template size_t unformat(csubstr buf, csubstr fmt, Arg & C4_RESTRICT a, Args & C4_RESTRICT ...more) { const size_t pos = fmt.find("{}"); if(C4_UNLIKELY(pos == csubstr::npos)) return unformat(buf, fmt); size_t num = pos; size_t out = num; buf = buf.len >= num ? buf.sub(num) : substr{}; num = from_chars_first(buf, &a); if(C4_UNLIKELY(num == csubstr::npos)) return csubstr::npos; out += num; buf = buf.len >= num ? buf.sub(num) : substr{}; num = unformat(buf, fmt.sub(pos + 2), more...); if(C4_UNLIKELY(num == csubstr::npos)) return csubstr::npos; out += num; return out; } /** @} */ //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /** cat+resize: like c4::cat(), but receives a container, and resizes * it as needed to contain the result. The container is * overwritten. To append to it, use the append overload. * @see c4::cat() * @ingroup doc_cat */ template inline void catrs(CharOwningContainer * C4_RESTRICT cont, Args const& C4_RESTRICT ...args) { retry: substr buf = to_substr(*cont); size_t ret = cat(buf, args...); cont->resize(ret); if(ret > buf.len) goto retry; } /** cat+resize: like c4::cat(), but creates and returns a new * container sized as needed to contain the result. * @see c4::cat() * @ingroup doc_cat */ template inline CharOwningContainer catrs(Args const& C4_RESTRICT ...args) { CharOwningContainer cont; catrs(&cont, args...); return cont; } /** cat+resize+append: like c4::cat(), but receives a container, and * appends to it instead of overwriting it. The container is resized * as needed to contain the result. * * @return the region newly appended to the original container * @see c4::cat() * @see c4::catrs() * @ingroup doc_cat */ template inline csubstr catrs_append(CharOwningContainer * C4_RESTRICT cont, Args const& C4_RESTRICT ...args) { const size_t pos = cont->size(); retry: substr buf = to_substr(*cont).sub(pos); size_t ret = cat(buf, args...); cont->resize(pos + ret); if(ret > buf.len) goto retry; return to_csubstr(*cont).range(pos, cont->size()); } //----------------------------------------------------------------------------- /** catsep+resize: like c4::catsep(), but receives a container, and * resizes it as needed to contain the result. The container is * overwritten. To append to the container use the append overload. * * @see c4::catsep() * @ingroup doc_catsep */ template inline void catseprs(CharOwningContainer * C4_RESTRICT cont, Sep const& C4_RESTRICT sep, Args const& C4_RESTRICT ...args) { retry: substr buf = to_substr(*cont); size_t ret = catsep(buf, sep, args...); cont->resize(ret); if(ret > buf.len) goto retry; } /** catsep+resize: like c4::catsep(), but create a new container with * the result. * * @return the requested container * @ingroup doc_catsep */ template inline CharOwningContainer catseprs(Sep const& C4_RESTRICT sep, Args const& C4_RESTRICT ...args) { CharOwningContainer cont; catseprs(&cont, sep, args...); return cont; } /** catsep+resize+append: like catsep(), but receives a container, and * appends the arguments, resizing the container as needed to contain * the result. The buffer is appended to. * * @return a csubstr of the appended part * @ingroup doc_catsep */ template inline csubstr catseprs_append(CharOwningContainer * C4_RESTRICT cont, Sep const& C4_RESTRICT sep, Args const& C4_RESTRICT ...args) { const size_t pos = cont->size(); retry: substr buf = to_substr(*cont).sub(pos); size_t ret = catsep(buf, sep, args...); cont->resize(pos + ret); if(ret > buf.len) goto retry; return to_csubstr(*cont).range(pos, cont->size()); } //----------------------------------------------------------------------------- /** format+resize: like c4::format(), but receives a container, and * resizes it as needed to contain the result. The container is * overwritten. To append to the container use the append overload. * * @see c4::format() * @ingroup doc_format */ template inline void formatrs(CharOwningContainer * C4_RESTRICT cont, csubstr fmt, Args const& C4_RESTRICT ...args) { retry: substr buf = to_substr(*cont); size_t ret = format(buf, fmt, args...); cont->resize(ret); if(ret > buf.len) goto retry; } /** format+resize: like c4::format(), but create a new container with * the result. * * @return the requested container * @ingroup doc_format */ template inline CharOwningContainer formatrs(csubstr fmt, Args const& C4_RESTRICT ...args) { CharOwningContainer cont; formatrs(&cont, fmt, args...); return cont; } /** format+resize+append: like format(), but receives a container, and appends the * arguments, resizing the container as needed to contain the * result. The buffer is appended to. * @return the region newly appended to the original container * @ingroup doc_format */ template inline csubstr formatrs_append(CharOwningContainer * C4_RESTRICT cont, csubstr fmt, Args const& C4_RESTRICT ...args) { const size_t pos = cont->size(); retry: substr buf = to_substr(*cont).sub(pos); size_t ret = format(buf, fmt, args...); cont->resize(pos + ret); if(ret > buf.len) goto retry; return to_csubstr(*cont).range(pos, cont->size()); } /** @} */ } // namespace c4 // NOLINTEND(cppcoreguidelines-pro-type-reinterpret-cast,*avoid-goto*) #ifdef _MSC_VER # pragma warning(pop) #elif defined(__clang__) # pragma clang diagnostic pop #elif defined(__GNUC__) # pragma GCC diagnostic pop #endif #endif /* _C4_FORMAT_HPP_ */ c4core-0.2.6/src/c4/gcc-4.8.hpp000066400000000000000000000036011477602032300155530ustar00rootroot00000000000000#ifndef _C4_GCC_4_8_HPP_ #define _C4_GCC_4_8_HPP_ #if __GNUC__ == 4 && __GNUC_MINOR__ >= 8 /* STL polyfills for old GNU compilers */ _Pragma("GCC diagnostic ignored \"-Wshadow\"") _Pragma("GCC diagnostic ignored \"-Wmissing-field-initializers\"") #if __cplusplus #include #include namespace std { template struct is_trivially_copyable : public integral_constant::value && __has_trivial_destructor(_Tp) && (__has_trivial_constructor(_Tp) || __has_trivial_copy(_Tp) || __has_trivial_assign(_Tp))> { }; template using is_trivially_copy_constructible = has_trivial_copy_constructor<_Tp>; template using is_trivially_default_constructible = has_trivial_default_constructor<_Tp>; template using is_trivially_copy_assignable = has_trivial_copy_assign<_Tp>; /* not supported */ template struct is_trivially_move_constructible : false_type { }; /* not supported */ template struct is_trivially_move_assignable : false_type { }; inline void *align(size_t __align, size_t __size, void*& __ptr, size_t& __space) noexcept { if (__space < __size) return nullptr; const auto __intptr = reinterpret_cast(__ptr); const auto __aligned = (__intptr - 1u + __align) & -__align; const auto __diff = __aligned - __intptr; if (__diff > (__space - __size)) return nullptr; else { __space -= __diff; return __ptr = reinterpret_cast(__aligned); } } #if __GNUC__ == 4 && __GNUC_MINOR__ == 8 typedef long double max_align_t ; #endif } #else // __cplusplus #include // see https://sourceware.org/bugzilla/show_bug.cgi?id=25399 (ubuntu gcc-4.8) #define memset(s, c, count) __builtin_memset(s, c, count) #endif // __cplusplus #endif // __GNUC__ == 4 && __GNUC_MINOR__ >= 8 #endif // _C4_GCC_4_8_HPP_ c4core-0.2.6/src/c4/hash.hpp000066400000000000000000000042721477602032300154400ustar00rootroot00000000000000#ifndef _C4_HASH_HPP_ #define _C4_HASH_HPP_ #include "c4/config.hpp" #include /** @file hash.hpp */ /** @defgroup hash Hash utils * @see http://aras-p.info/blog/2016/08/02/Hash-Functions-all-the-way-down/ */ namespace c4 { namespace detail { /** @internal * @ingroup hash * @see this was taken a great answer in stackoverflow: * https://stackoverflow.com/a/34597785/5875572 * @see http://aras-p.info/blog/2016/08/02/Hash-Functions-all-the-way-down/ */ template class basic_fnv1a final { static_assert(std::is_unsigned::value, "need unsigned integer"); public: using result_type = ResultT; private: result_type state_ {}; public: C4_CONSTEXPR14 basic_fnv1a() noexcept : state_ {OffsetBasis} {} C4_CONSTEXPR14 void update(const void *const data, const size_t size) noexcept { auto const* cdata = static_cast(data); auto acc = this->state_; for(size_t i = 0; i < size; ++i) { const auto next = size_t(cdata[i]); acc = (acc ^ next) * Prime; } this->state_ = acc; } C4_CONSTEXPR14 result_type digest() const noexcept { return this->state_; } }; using fnv1a_32 = basic_fnv1a; using fnv1a_64 = basic_fnv1a; template struct fnv1a; template<> struct fnv1a<32> { using type = fnv1a_32; }; template<> struct fnv1a<64> { using type = fnv1a_64; }; } // namespace detail /** @ingroup hash */ template using fnv1a_t = typename detail::fnv1a::type; /** @ingroup hash */ C4_CONSTEXPR14 inline size_t hash_bytes(const void *const data, const size_t size) noexcept { fnv1a_t fn{}; fn.update(data, size); return fn.digest(); } /** * @overload hash_bytes * @ingroup hash */ template C4_CONSTEXPR14 inline size_t hash_bytes(const char (&str)[N]) noexcept { fnv1a_t fn{}; fn.update(str, N); return fn.digest(); } } // namespace c4 #endif // _C4_HASH_HPP_ c4core-0.2.6/src/c4/language.cpp000066400000000000000000000004071477602032300162670ustar00rootroot00000000000000#include "c4/language.hpp" namespace c4 { namespace detail { #ifndef __GNUC__ void use_char_pointer(char const volatile* v) { C4_UNUSED(v); } #else void foo() {} // to avoid empty file warning from the linker #endif } // namespace detail } // namespace c4 c4core-0.2.6/src/c4/language.hpp000066400000000000000000000274641477602032300163100ustar00rootroot00000000000000#ifndef _C4_LANGUAGE_HPP_ #define _C4_LANGUAGE_HPP_ /** @file language.hpp Provides language standard information macros and * compiler agnostic utility macros: namespace facilities, function attributes, * variable attributes, etc. * @ingroup basic_headers */ #include "c4/preprocessor.hpp" #include "c4/compiler.hpp" /* Detect C++ standard. * @see http://stackoverflow.com/a/7132549/5875572 */ #ifndef C4_CPP # if defined(_MSC_VER) && !defined(__clang__) # if _MSC_VER >= 1910 // >VS2015: VS2017, VS2019, VS2022 # if (!defined(_MSVC_LANG)) # error _MSVC not defined # endif # if _MSVC_LANG >= 201705L # define C4_CPP 20 # define C4_CPP20 # elif _MSVC_LANG == 201703L # define C4_CPP 17 # define C4_CPP17 # elif _MSVC_LANG >= 201402L # define C4_CPP 14 # define C4_CPP14 # elif _MSVC_LANG >= 201103L # define C4_CPP 11 # define C4_CPP11 # else # error C++ lesser than C++11 not supported # endif # else # if _MSC_VER == 1900 # define C4_CPP 14 // VS2015 is c++14 https://devblogs.microsoft.com/cppblog/c111417-features-in-vs-2015-rtm/ # define C4_CPP14 # elif _MSC_VER == 1800 // VS2013 # define C4_CPP 11 # define C4_CPP11 # else # error C++ lesser than C++11 not supported # endif # endif # elif defined(__INTEL_COMPILER) // https://software.intel.com/en-us/node/524490 # ifdef __INTEL_CXX20_MODE__ // not sure about this # define C4_CPP 20 # define C4_CPP20 # elif defined __INTEL_CXX17_MODE__ // not sure about this # define C4_CPP 17 # define C4_CPP17 # elif defined __INTEL_CXX14_MODE__ // not sure about this # define C4_CPP 14 # define C4_CPP14 # elif defined __INTEL_CXX11_MODE__ # define C4_CPP 11 # define C4_CPP11 # else # error C++ lesser than C++11 not supported # endif # else # ifndef __cplusplus # error __cplusplus is not defined? # endif # if __cplusplus == 1 # error cannot handle __cplusplus==1 # elif __cplusplus >= 201709L # define C4_CPP 20 # define C4_CPP20 # elif __cplusplus >= 201703L # define C4_CPP 17 # define C4_CPP17 # elif __cplusplus >= 201402L # define C4_CPP 14 # define C4_CPP14 # elif __cplusplus >= 201103L # define C4_CPP 11 # define C4_CPP11 # elif __cplusplus >= 199711L # error C++ lesser than C++11 not supported # endif # endif #else # ifdef C4_CPP == 20 # define C4_CPP20 # elif C4_CPP == 17 # define C4_CPP17 # elif C4_CPP == 14 # define C4_CPP14 # elif C4_CPP == 11 # define C4_CPP11 # elif C4_CPP == 98 # define C4_CPP98 # error C++ lesser than C++11 not supported # else # error C4_CPP must be one of 20, 17, 14, 11, 98 # endif #endif #ifdef C4_CPP20 # define C4_CPP17 # define C4_CPP14 # define C4_CPP11 #elif defined(C4_CPP17) # define C4_CPP14 # define C4_CPP11 #elif defined(C4_CPP14) # define C4_CPP11 #endif /** lifted from this answer: http://stackoverflow.com/a/20170989/5875572 */ #if defined(_MSC_VER) && !defined(__clang__) # if _MSC_VER < 1900 # define C4_CONSTEXPR11 # define C4_CONSTEXPR14 # elif _MSC_VER < 2000 # define C4_CONSTEXPR11 constexpr # define C4_CONSTEXPR14 # else # define C4_CONSTEXPR11 constexpr # define C4_CONSTEXPR14 constexpr # endif #else # if __cplusplus < 201103 # define C4_CONSTEXPR11 # define C4_CONSTEXPR14 # elif __cplusplus == 201103 # define C4_CONSTEXPR11 constexpr # define C4_CONSTEXPR14 # else # define C4_CONSTEXPR11 constexpr # define C4_CONSTEXPR14 constexpr # endif #endif // _MSC_VER #if C4_CPP < 17 #define C4_IF_CONSTEXPR #define C4_INLINE_CONSTEXPR constexpr #else #define C4_IF_CONSTEXPR constexpr #define C4_INLINE_CONSTEXPR inline constexpr #endif #if defined(_MSC_VER) && !defined(__clang__) # if (defined(_CPPUNWIND) && (_CPPUNWIND == 1)) # define C4_EXCEPTIONS # endif #else # if defined(__EXCEPTIONS) || defined(__cpp_exceptions) # define C4_EXCEPTIONS # endif #endif #ifdef C4_EXCEPTIONS # define C4_IF_EXCEPTIONS_(exc_code, setjmp_code) exc_code # define C4_IF_EXCEPTIONS(exc_code, setjmp_code) do { exc_code } while(0) #else # define C4_IF_EXCEPTIONS_(exc_code, setjmp_code) setjmp_code # define C4_IF_EXCEPTIONS(exc_code, setjmp_code) do { setjmp_code } while(0) #endif #if defined(_MSC_VER) && !defined(__clang__) # if defined(_CPPRTTI) # define C4_RTTI # endif #else # if defined(__GXX_RTTI) # define C4_RTTI # endif #endif #ifdef C4_RTTI # define C4_IF_RTTI_(code_rtti, code_no_rtti) code_rtti # define C4_IF_RTTI(code_rtti, code_no_rtti) do { code_rtti } while(0) #else # define C4_IF_RTTI_(code_rtti, code_no_rtti) code_no_rtti # define C4_IF_RTTI(code_rtti, code_no_rtti) do { code_no_rtti } while(0) #endif //------------------------------------------------------------ #define _C4_BEGIN_NAMESPACE(ns) namespace ns { #define _C4_END_NAMESPACE(ns) } // MSVC cant handle the C4_FOR_EACH macro... need to fix this //#define C4_BEGIN_NAMESPACE(...) C4_FOR_EACH_SEP(_C4_BEGIN_NAMESPACE, , __VA_ARGS__) //#define C4_END_NAMESPACE(...) C4_FOR_EACH_SEP(_C4_END_NAMESPACE, , __VA_ARGS__) #define C4_BEGIN_NAMESPACE(ns) namespace ns { #define C4_END_NAMESPACE(ns) } #define C4_BEGIN_HIDDEN_NAMESPACE namespace /*hidden*/ { #define C4_END_HIDDEN_NAMESPACE } /* namespace hidden */ //------------------------------------------------------------ #ifndef C4_API # if defined(_MSC_VER) && !defined(__clang__) # if defined(C4_EXPORT) # define C4_API __declspec(dllexport) # elif defined(C4_IMPORT) # define C4_API __declspec(dllimport) # else # define C4_API # endif # else # define C4_API # endif #endif #if defined(_MSC_VER) && !defined(__clang__) # define C4_RESTRICT __restrict # define C4_RESTRICT_FN __declspec(restrict) # define C4_NO_INLINE __declspec(noinline) # define C4_ALWAYS_INLINE inline __forceinline /** these are not available in VS AFAIK */ # define C4_CONST # define C4_PURE # define C4_FLATTEN # define C4_HOT /** @todo */ # define C4_COLD /** @todo */ # define C4_ASSUME(...) __assume(__VA_ARGS__) # define C4_EXPECT(x, y) x /** @todo */ # define C4_LIKELY(x) x # define C4_UNLIKELY(x) x # define C4_UNREACHABLE() _c4_msvc_unreachable() # define C4_ATTR_FORMAT(...) /** */ # define C4_NORETURN [[noreturn]] # if _MSC_VER >= 1700 // VS2012 # define C4_NODISCARD _Check_return_ # else # define C4_NODISCARD # endif [[noreturn]] __forceinline void _c4_msvc_unreachable() { __assume(false); } ///< https://stackoverflow.com/questions/60802864/emulating-gccs-builtin-unreachable-in-visual-studio # define C4_UNREACHABLE_AFTER_ERR() /* */ #else ///< @todo assuming gcc-like compiler. check it is actually so. /** for function attributes in GCC, * @see https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#Common-Function-Attributes */ /** for __builtin functions in GCC, * @see https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html */ # define C4_RESTRICT __restrict__ # define C4_RESTRICT_FN __attribute__((restrict)) # define C4_NO_INLINE __attribute__((noinline)) # define C4_ALWAYS_INLINE inline __attribute__((always_inline)) # define C4_CONST __attribute__((const)) # define C4_PURE __attribute__((pure)) /** force inlining of every callee function */ # define C4_FLATTEN __atribute__((flatten)) /** mark a function as hot, ie as having a visible impact in CPU time * thus making it more likely to inline, etc * @see http://stackoverflow.com/questions/15028990/semantics-of-gcc-hot-attribute */ # define C4_HOT __attribute__((hot)) /** mark a function as cold, ie as NOT having a visible impact in CPU time * @see http://stackoverflow.com/questions/15028990/semantics-of-gcc-hot-attribute */ # define C4_COLD __attribute__((cold)) # define C4_EXPECT(x, y) __builtin_expect(x, y) ///< @see https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html # define C4_LIKELY(x) __builtin_expect(x, 1) # define C4_UNLIKELY(x) __builtin_expect(x, 0) # define C4_UNREACHABLE() __builtin_unreachable() # define C4_ATTR_FORMAT(...) //__attribute__((format (__VA_ARGS__))) ///< @see https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#Common-Function-Attributes # define C4_NORETURN __attribute__((noreturn)) # define C4_NODISCARD __attribute__((warn_unused_result)) # define C4_UNREACHABLE_AFTER_ERR() C4_UNREACHABLE() // C4_ASSUME // see https://stackoverflow.com/questions/63493968/reproducing-clangs-builtin-assume-for-gcc // preferred option: C++ standard attribute # ifdef __has_cpp_attribute # if __has_cpp_attribute(assume) >= 202207L # define C4_ASSUME(...) [[assume(__VA_ARGS__)]] # endif # endif // first fallback: compiler intrinsics/attributes for assumptions # ifndef C4_ASSUME # if defined(__clang__) # define C4_ASSUME(...) __builtin_assume(__VA_ARGS__) # elif defined(__GNUC__) # if __GNUC__ >= 13 # define C4_ASSUME(...) __attribute__((__assume__(__VA_ARGS__))) # endif # endif # endif // second fallback: possibly evaluating uses of unreachable() // Set this to 1 if you want to allow assumptions to possibly evaluate. # ifndef C4_ASSUME_ALLOW_EVAL # define C4_ASSUME_ALLOW_EVAL 0 # endif # if !defined(C4_ASSUME) && (C4_ASSUME_ALLOW_EVAL) # define C4_ASSUME(...) do { if (!bool(__VA_ARGS__)) C4_UNREACHABLE(); ) while(0) # endif // last fallback: define macro as doing nothing # ifndef C4_ASSUME # define C4_ASSUME(...) # endif #endif #if C4_CPP >= 14 # define C4_DEPRECATED(msg) [[deprecated(msg)]] #else # if defined(_MSC_VER) # define C4_DEPRECATED(msg) __declspec(deprecated(msg)) # else // defined(__GNUC__) || defined(__clang__) # define C4_DEPRECATED(msg) __attribute__((deprecated(msg))) # endif #endif #ifdef _MSC_VER # define C4_FUNC __FUNCTION__ # define C4_PRETTY_FUNC __FUNCSIG__ #else /// @todo assuming gcc-like compiler. check it is actually so. # define C4_FUNC __FUNCTION__ # define C4_PRETTY_FUNC __PRETTY_FUNCTION__ #endif /** prevent compiler warnings about a specific var being unused */ #define C4_UNUSED(var) (void)var #if C4_CPP >= 17 #define C4_STATIC_ASSERT(cond) static_assert(cond) #else #define C4_STATIC_ASSERT(cond) static_assert((cond), #cond) #endif #define C4_STATIC_ASSERT_MSG(cond, msg) static_assert((cond), #cond ": " msg) /** @def C4_DONT_OPTIMIZE idea lifted from GoogleBenchmark. * @see https://github.com/google/benchmark/blob/master/include/benchmark/benchmark_api.h */ namespace c4 { namespace detail { #ifdef __GNUC__ # define C4_DONT_OPTIMIZE(var) c4::detail::dont_optimize(var) template< class T > C4_ALWAYS_INLINE void dont_optimize(T const& value) { asm volatile("" : : "g"(value) : "memory"); } // NOLINT #else # define C4_DONT_OPTIMIZE(var) c4::detail::use_char_pointer(reinterpret_cast< const char* >(&var)) void use_char_pointer(char const volatile*); #endif } // namespace detail } // namespace c4 /** @def C4_KEEP_EMPTY_LOOP prevent an empty loop from being optimized out. * @see http://stackoverflow.com/a/7084193/5875572 */ #if defined(_MSC_VER) && !defined(__clang__) # define C4_KEEP_EMPTY_LOOP { char c; C4_DONT_OPTIMIZE(c); } #else # define C4_KEEP_EMPTY_LOOP { asm(""); } #endif /** @def C4_VA_LIST_REUSE_MUST_COPY * @todo I strongly suspect that this is actually only in UNIX platforms. revisit this. */ #ifdef __GNUC__ # define C4_VA_LIST_REUSE_MUST_COPY #endif #endif /* _C4_LANGUAGE_HPP_ */ c4core-0.2.6/src/c4/memory_resource.cpp000066400000000000000000000215651477602032300177330ustar00rootroot00000000000000#include "c4/memory_resource.hpp" #include "c4/memory_util.hpp" #include #include #if defined(C4_POSIX) || defined(C4_IOS) || defined(C4_MACOS) || defined(C4_ARM) # include #endif #if defined(C4_ARM) # include #endif #include namespace c4 { C4_SUPPRESS_WARNING_GCC_CLANG_WITH_PUSH("-Wold-style-cast") namespace detail { #ifdef C4_NO_ALLOC_DEFAULTS aalloc_pfn s_aalloc = nullptr; free_pfn s_afree = nullptr; arealloc_pfn s_arealloc = nullptr; #else void afree_impl(void *ptr) { #if defined(C4_WIN) || defined(C4_XBOX) ::_aligned_free(ptr); #else ::free(ptr); #endif } void* aalloc_impl(size_t size, size_t alignment) { // alignment must be nonzero and a power of 2 C4_CHECK(alignment > 0 && (alignment & (alignment - 1u)) == 0); // NOTE: alignment needs to be sized in multiples of sizeof(void*) if(C4_UNLIKELY(alignment < sizeof(void*))) alignment = sizeof(void*); static_assert((sizeof(void*) & (sizeof(void*)-1u)) == 0, "sizeof(void*) must be a power of 2"); C4_CHECK(((alignment & (sizeof(void*) - 1u))) == 0u); void *mem; #if defined(C4_WIN) || defined(C4_XBOX) mem = ::_aligned_malloc(size, alignment); C4_CHECK(mem != nullptr || size == 0); #elif defined(C4_POSIX) || defined(C4_IOS) || defined(C4_MACOS) int ret = ::posix_memalign(&mem, alignment, size); if(C4_UNLIKELY(ret)) { C4_ASSERT(ret != EINVAL); // this was already handled above if(ret == ENOMEM) { C4_ERROR("There was insufficient memory to fulfill the " "allocation request of %zu bytes (alignment=%lu)", size, size); } return nullptr; } #elif defined(C4_ARM) || defined(C4_ANDROID) // https://stackoverflow.com/questions/53614538/undefined-reference-to-posix-memalign-in-arm-gcc // https://electronics.stackexchange.com/questions/467382/e2-studio-undefined-reference-to-posix-memalign/467753 mem = memalign(alignment, size); C4_CHECK(mem != nullptr || size == 0); #else (void)size; (void)alignment; mem = nullptr; C4_NOT_IMPLEMENTED_MSG("need to implement an aligned allocation for this platform"); #endif C4_ASSERT_MSG((uintptr_t(mem) & (alignment-1)) == 0, "address %p is not aligned to %zu boundary", mem, alignment); return mem; } void* arealloc_impl(void* ptr, size_t oldsz, size_t newsz, size_t alignment) { /** @todo make this more efficient * @see https://stackoverflow.com/questions/9078259/does-realloc-keep-the-memory-alignment-of-posix-memalign * @see look for qReallocAligned() in http://code.qt.io/cgit/qt/qtbase.git/tree/src/corelib/global/qmalloc.cpp */ void *tmp = aalloc(newsz, alignment); size_t min = newsz < oldsz ? newsz : oldsz; if(mem_overlaps(ptr, tmp, oldsz, newsz)) { ::memmove(tmp, ptr, min); } else { ::memcpy(tmp, ptr, min); } afree(ptr); return tmp; } aalloc_pfn s_aalloc = aalloc_impl; afree_pfn s_afree = afree_impl; arealloc_pfn s_arealloc = arealloc_impl; #endif // C4_NO_ALLOC_DEFAULTS } // namespace detail aalloc_pfn get_aalloc() { return detail::s_aalloc; } void set_aalloc(aalloc_pfn fn) { detail::s_aalloc = fn; } afree_pfn get_afree() { return detail::s_afree; } void set_afree(afree_pfn fn) { detail::s_afree = fn; } arealloc_pfn get_arealloc() { return detail::s_arealloc; } void set_arealloc(arealloc_pfn fn) { detail::s_arealloc = fn; } void* aalloc(size_t sz, size_t alignment) { C4_ASSERT_MSG(c4::get_aalloc() != nullptr, "did you forget to call set_aalloc()?"); auto fn = c4::get_aalloc(); void* ptr = fn(sz, alignment); return ptr; } void afree(void* ptr) { C4_ASSERT_MSG(c4::get_afree() != nullptr, "did you forget to call set_afree()?"); auto fn = c4::get_afree(); fn(ptr); } void* arealloc(void *ptr, size_t oldsz, size_t newsz, size_t alignment) { C4_ASSERT_MSG(c4::get_arealloc() != nullptr, "did you forget to call set_arealloc()?"); auto fn = c4::get_arealloc(); void* nptr = fn(ptr, oldsz, newsz, alignment); return nptr; } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- void detail::_MemoryResourceSingleChunk::release() { if(m_mem && m_owner) { impl_type::deallocate(m_mem, m_size); } m_mem = nullptr; m_size = 0; m_owner = false; m_pos = 0; } void detail::_MemoryResourceSingleChunk::acquire(size_t sz) { clear(); m_owner = true; m_mem = (char*) impl_type::allocate(sz, alignof(max_align_t)); m_size = sz; m_pos = 0; } void detail::_MemoryResourceSingleChunk::acquire(void *mem, size_t sz) { clear(); m_owner = false; m_mem = (char*) mem; m_size = sz; m_pos = 0; } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- void* MemoryResourceLinear::do_allocate(size_t sz, size_t alignment, void *hint) { C4_UNUSED(hint); if(sz == 0) return nullptr; // make sure there's enough room to allocate if(m_pos + sz > m_size) { C4_ERROR("out of memory"); } void *mem = m_mem + m_pos; size_t space = m_size - m_pos; if(std::align(alignment, sz, mem, space)) { C4_ASSERT(m_pos <= m_size); C4_ASSERT(m_size - m_pos >= space); m_pos += (m_size - m_pos) - space; m_pos += sz; C4_ASSERT(m_pos <= m_size); } else { C4_ERROR("could not align memory"); } return mem; } void MemoryResourceLinear::do_deallocate(void* ptr, size_t sz, size_t alignment) { C4_UNUSED(ptr); C4_UNUSED(sz); C4_UNUSED(alignment); // nothing to do!! } void* MemoryResourceLinear::do_reallocate(void* ptr, size_t oldsz, size_t newsz, size_t alignment) { if(newsz == oldsz) return ptr; // is ptr the most recently allocated (MRA) block? char *cptr = (char*)ptr; bool same_pos = (m_mem + m_pos == cptr + oldsz); // no need to get more memory when shrinking if(newsz < oldsz) { // if this is the MRA, we can safely shrink the position if(same_pos) { m_pos -= oldsz - newsz; } return ptr; } // we're growing the block, and it fits in size else if(same_pos && cptr + newsz <= m_mem + m_size) { // if this is the MRA, we can safely shrink the position m_pos += newsz - oldsz; return ptr; } // we're growing the block or it doesn't fit - // delegate any of these situations to do_deallocate() return do_allocate(newsz, alignment, ptr); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /** @todo add a free list allocator. A good candidate because of its * small size is TLSF. * * @see https://github.com/mattconte/tlsf * * Comparisons: * * @see https://www.researchgate.net/publication/262375150_A_Comparative_Study_on_Memory_Allocators_in_Multicore_and_Multithreaded_Applications_-_SBESC_2011_-_Presentation_Slides * @see http://webkit.sed.hu/blog/20100324/war-allocators-tlsf-action * @see https://github.com/emeryberger/Malloc-Implementations/tree/master/allocators * * */ C4_SUPPRESS_WARNING_GCC_CLANG_POP } // namespace c4 //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- #ifdef C4_REDEFINE_CPPNEW #include void* operator new(size_t size) { auto *mr = ::c4::get_memory_resource(); return mr->allocate(size); } void operator delete(void *p) noexcept { C4_NEVER_REACH(); } void operator delete(void *p, size_t size) { auto *mr = ::c4::get_memory_resource(); mr->deallocate(p, size); } void* operator new[](size_t size) { return operator new(size); } void operator delete[](void *p) noexcept { operator delete(p); } void operator delete[](void *p, size_t size) { operator delete(p, size); } void* operator new(size_t size, std::nothrow_t) { return operator new(size); } void operator delete(void *p, std::nothrow_t) { operator delete(p); } void operator delete(void *p, size_t size, std::nothrow_t) { operator delete(p, size); } void* operator new[](size_t size, std::nothrow_t) { return operator new(size); } void operator delete[](void *p, std::nothrow_t) { operator delete(p); } void operator delete[](void *p, size_t, std::nothrow_t) { operator delete(p, size); } #endif // C4_REDEFINE_CPPNEW c4core-0.2.6/src/c4/memory_resource.hpp000066400000000000000000000411261477602032300177330ustar00rootroot00000000000000#ifndef _C4_MEMORY_RESOURCE_HPP_ #define _C4_MEMORY_RESOURCE_HPP_ /** @file memory_resource.hpp Provides facilities to allocate typeless * memory, via the memory resource model consecrated with C++17. */ /** @defgroup memory memory utilities */ /** @defgroup raw_memory_alloc Raw memory allocation * @ingroup memory */ /** @defgroup memory_resources Memory resources * @ingroup memory */ #include "c4/config.hpp" #include "c4/error.hpp" namespace c4 { // need these forward decls here struct MemoryResource; struct MemoryResourceMalloc; struct MemoryResourceStack; MemoryResourceMalloc* get_memory_resource_malloc(); MemoryResourceStack* get_memory_resource_stack(); namespace detail { MemoryResource*& get_memory_resource(); } // c-style allocation --------------------------------------------------------- // this API provides aligned allocation functions. // These functions forward the call to a user-modifiable function. // aligned allocation. /** Aligned allocation. Merely calls the current get_aalloc() function. * @see get_aalloc() * @ingroup raw_memory_alloc */ void* aalloc(size_t sz, size_t alignment); /** Aligned free. Merely calls the current get_afree() function. * @see get_afree() * @ingroup raw_memory_alloc */ void afree(void* ptr); /** Aligned reallocation. Merely calls the current get_arealloc() function. * @see get_arealloc() * @ingroup raw_memory_alloc */ void* arealloc(void* ptr, size_t oldsz, size_t newsz, size_t alignment); // allocation setup facilities. /** Function pointer type for aligned allocation * @see set_aalloc() * @ingroup raw_memory_alloc */ using aalloc_pfn = void* (*)(size_t size, size_t alignment); /** Function pointer type for aligned deallocation * @see set_afree() * @ingroup raw_memory_alloc */ using afree_pfn = void (*)(void *ptr); /** Function pointer type for aligned reallocation * @see set_arealloc() * @ingroup raw_memory_alloc */ using arealloc_pfn = void* (*)(void *ptr, size_t oldsz, size_t newsz, size_t alignment); // allocation function pointer setters/getters /** Set the global aligned allocation function. * @see aalloc() * @see get_aalloc() * @ingroup raw_memory_alloc */ void set_aalloc(aalloc_pfn fn); /** Set the global aligned deallocation function. * @see afree() * @see get_afree() * @ingroup raw_memory_alloc */ void set_afree(afree_pfn fn); /** Set the global aligned reallocation function. * @see arealloc() * @see get_arealloc() * @ingroup raw_memory_alloc */ void set_arealloc(arealloc_pfn fn); /** Get the global aligned reallocation function. * @see arealloc() * @ingroup raw_memory_alloc */ aalloc_pfn get_aalloc(); /** Get the global aligned deallocation function. * @see afree() * @ingroup raw_memory_alloc */ afree_pfn get_afree(); /** Get the global aligned reallocation function. * @see arealloc() * @ingroup raw_memory_alloc */ arealloc_pfn get_arealloc(); //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // c++-style allocation ------------------------------------------------------- /** C++17-style memory_resource base class. See http://en.cppreference.com/w/cpp/experimental/memory_resource * @ingroup memory_resources */ struct MemoryResource // NOLINT(*-member-functions) { const char *name = nullptr; virtual ~MemoryResource() = default; void* allocate(size_t sz, size_t alignment=alignof(max_align_t), void *hint=nullptr) { void *mem = this->do_allocate(sz, alignment, hint); C4_CHECK_MSG(mem != nullptr, "could not allocate %lu bytes", sz); return mem; } void* reallocate(void* ptr, size_t oldsz, size_t newsz, size_t alignment=alignof(max_align_t)) { void *mem = this->do_reallocate(ptr, oldsz, newsz, alignment); C4_CHECK_MSG(mem != nullptr, "could not reallocate from %lu to %lu bytes", oldsz, newsz); return mem; } void deallocate(void* ptr, size_t sz, size_t alignment=alignof(max_align_t)) { this->do_deallocate(ptr, sz, alignment); } protected: virtual void* do_allocate(size_t sz, size_t alignment, void* hint) = 0; virtual void* do_reallocate(void* ptr, size_t oldsz, size_t newsz, size_t alignment) = 0; virtual void do_deallocate(void* ptr, size_t sz, size_t alignment) = 0; }; /** get the current global memory resource. To avoid static initialization * order problems, this is implemented using a function call to ensure * that it is available when first used. * @ingroup memory_resources */ C4_ALWAYS_INLINE MemoryResource* get_memory_resource() { return detail::get_memory_resource(); } /** set the global memory resource * @ingroup memory_resources */ C4_ALWAYS_INLINE void set_memory_resource(MemoryResource* mr) { C4_ASSERT(mr != nullptr); detail::get_memory_resource() = mr; } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /** A c4::aalloc-based memory resource. Thread-safe if the implementation * called by c4::aalloc() is safe. * @ingroup memory_resources */ struct MemoryResourceMalloc : public MemoryResource // NOLINT(*-member-functions) { MemoryResourceMalloc() { name = "malloc"; } protected: void* do_allocate(size_t sz, size_t alignment, void *hint) override { C4_UNUSED(hint); return c4::aalloc(sz, alignment); } void do_deallocate(void* ptr, size_t sz, size_t alignment) override { C4_UNUSED(sz); C4_UNUSED(alignment); c4::afree(ptr); } void* do_reallocate(void* ptr, size_t oldsz, size_t newsz, size_t alignment) override { return c4::arealloc(ptr, oldsz, newsz, alignment); } }; /** returns a malloc-based memory resource * @ingroup memory_resources */ C4_ALWAYS_INLINE MemoryResourceMalloc* get_memory_resource_malloc() { /** @todo use a nifty counter: * https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Nifty_Counter */ static MemoryResourceMalloc mr; return &mr; } namespace detail { C4_ALWAYS_INLINE MemoryResource* & get_memory_resource() { /** @todo use a nifty counter: * https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Nifty_Counter */ thread_local static MemoryResource* mr = get_memory_resource_malloc(); return mr; } } // namespace detail //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- namespace detail { /** Allows a memory resource to obtain its memory from another memory resource. * @ingroup memory_resources */ struct DerivedMemoryResource : public MemoryResource { public: DerivedMemoryResource(MemoryResource *mr_=nullptr) : m_local(mr_ ? mr_ : get_memory_resource()) {} private: MemoryResource *m_local; protected: void* do_allocate(size_t sz, size_t alignment, void* hint) override { return m_local->allocate(sz, alignment, hint); } void* do_reallocate(void* ptr, size_t oldsz, size_t newsz, size_t alignment) override { return m_local->reallocate(ptr, oldsz, newsz, alignment); } void do_deallocate(void* ptr, size_t sz, size_t alignment) override { m_local->deallocate(ptr, sz, alignment); } }; /** Provides common facilities for memory resource consisting of a single memory block * @ingroup memory_resources */ struct _MemoryResourceSingleChunk : public DerivedMemoryResource { C4_NO_COPY_OR_MOVE(_MemoryResourceSingleChunk); using impl_type = DerivedMemoryResource; public: _MemoryResourceSingleChunk(MemoryResource *impl=nullptr) : DerivedMemoryResource(impl) { name = "linear_malloc"; } /** initialize with owned memory, allocated from the given (or the global) memory resource */ _MemoryResourceSingleChunk(size_t sz, MemoryResource *impl=nullptr) : _MemoryResourceSingleChunk(impl) { acquire(sz); } /** initialize with borrowed memory */ _MemoryResourceSingleChunk(void *mem, size_t sz) : _MemoryResourceSingleChunk() { acquire(mem, sz); } ~_MemoryResourceSingleChunk() override { release(); } public: void const* mem() const { return m_mem; } size_t capacity() const { return m_size; } size_t size() const { return m_pos; } size_t slack() const { C4_ASSERT(m_size >= m_pos); return m_size - m_pos; } public: char *m_mem{nullptr}; size_t m_size{0}; size_t m_pos{0}; bool m_owner; public: /** set the internal pointer to the beginning of the linear buffer */ void clear() { m_pos = 0; } /** initialize with owned memory, allocated from the global memory resource */ void acquire(size_t sz); /** initialize with borrowed memory */ void acquire(void *mem, size_t sz); /** release the memory */ void release(); }; } // namespace detail //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /** provides a linear memory resource. Allocates incrementally from a linear * buffer, without ever deallocating. Deallocations are a no-op, and the * memory is freed only when the resource is release()d. The memory used by * this object can be either owned or borrowed. When borrowed, no calls to * malloc/free take place. * * @ingroup memory_resources */ struct MemoryResourceLinear : public detail::_MemoryResourceSingleChunk // NOLINT(*-member-functions) { C4_NO_COPY_OR_MOVE(MemoryResourceLinear); public: using detail::_MemoryResourceSingleChunk::_MemoryResourceSingleChunk; protected: void* do_allocate(size_t sz, size_t alignment, void *hint) override; void do_deallocate(void* ptr, size_t sz, size_t alignment) override; void* do_reallocate(void* ptr, size_t oldsz, size_t newsz, size_t alignment) override; }; //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /** provides a stack-type malloc-based memory resource. * @ingroup memory_resources */ struct MemoryResourceStack : public detail::_MemoryResourceSingleChunk // NOLINT(*-member-functions) { C4_NO_COPY_OR_MOVE(MemoryResourceStack); public: using detail::_MemoryResourceSingleChunk::_MemoryResourceSingleChunk; protected: void* do_allocate(size_t sz, size_t alignment, void *hint) override; void do_deallocate(void* ptr, size_t sz, size_t alignment) override; void* do_reallocate(void* ptr, size_t oldsz, size_t newsz, size_t alignment) override; }; //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /** provides a linear array-based memory resource. * @see MemoryResourceLinear * @ingroup memory_resources */ template struct MemoryResourceLinearArr : public MemoryResourceLinear { C4_SUPPRESS_WARNING_MSVC_WITH_PUSH(4324) // structure was padded due to alignment specifier alignas(alignof(max_align_t)) char m_arr[N]; C4_SUPPRESS_WARNING_MSVC_POP MemoryResourceLinearArr() : MemoryResourceLinear(m_arr, N) { name = "linear_arr"; } // NOLINT }; //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- struct AllocationCounts { struct Item { ssize_t allocs; ssize_t size; void add(size_t sz) { ++allocs; size += static_cast(sz); } void rem(size_t sz) { --allocs; size -= static_cast(sz); } Item max(Item const& that) const { Item r(*this); r.allocs = r.allocs > that.allocs ? r.allocs : that.allocs; r.size = r.size > that.size ? r.size : that.size; return r; } }; Item curr = {0, 0}; Item total = {0, 0}; Item max = {0, 0}; void clear_counts() { curr = {0, 0}; total = {0, 0}; max = {0, 0}; } void update(AllocationCounts const& that) { curr.allocs += that.curr.allocs; curr.size += that.curr.size; total.allocs += that.total.allocs; total.size += that.total.size; max.allocs += that.max.allocs; max.size += that.max.size; } void add_counts(void* ptr, size_t sz) { if(ptr == nullptr) return; curr.add(sz); total.add(sz); max = max.max(curr); } void rem_counts(void *ptr, size_t sz) { if(ptr == nullptr) return; curr.rem(sz); } AllocationCounts operator- (AllocationCounts const& that) const { AllocationCounts r(*this); r.curr.allocs -= that.curr.allocs; r.curr.size -= that.curr.size; r.total.allocs -= that.total.allocs; r.total.size -= that.total.size; r.max.allocs -= that.max.allocs; r.max.size -= that.max.size; return r; } AllocationCounts operator+ (AllocationCounts const& that) const { AllocationCounts r(*this); r.curr.allocs += that.curr.allocs; r.curr.size += that.curr.size; r.total.allocs += that.total.allocs; r.total.size += that.total.size; r.max.allocs += that.max.allocs; r.max.size += that.max.size; return r; } }; //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /** a MemoryResource which latches onto another MemoryResource * and counts allocations and sizes. * @ingroup memory_resources */ class MemoryResourceCounts : public MemoryResource { public: MemoryResourceCounts() : m_resource(get_memory_resource()) { C4_ASSERT(m_resource != this); name = "MemoryResourceCounts"; } MemoryResourceCounts(MemoryResource *res) : m_resource(res) { C4_ASSERT(m_resource != this); name = "MemoryResourceCounts"; } MemoryResource *resource() { return m_resource; } AllocationCounts const& counts() const { return m_counts; } protected: MemoryResource *m_resource; // NOLINT AllocationCounts m_counts; // NOLINT protected: void* do_allocate(size_t sz, size_t alignment, void * /*hint*/) override { void *ptr = m_resource->allocate(sz, alignment); m_counts.add_counts(ptr, sz); return ptr; } void do_deallocate(void* ptr, size_t sz, size_t alignment) override { m_counts.rem_counts(ptr, sz); m_resource->deallocate(ptr, sz, alignment); } void* do_reallocate(void* ptr, size_t oldsz, size_t newsz, size_t alignment) override { m_counts.rem_counts(ptr, oldsz); void* nptr = m_resource->reallocate(ptr, oldsz, newsz, alignment); m_counts.add_counts(nptr, newsz); return nptr; } }; //----------------------------------------------------------------------------- /** RAII class which binds a memory resource with a scope duration. * @ingroup memory_resources */ struct ScopedMemoryResource // NOLINT(*-member-functions) { MemoryResource *m_original; ScopedMemoryResource(MemoryResource *r) : m_original(get_memory_resource()) { set_memory_resource(r); } ~ScopedMemoryResource() { set_memory_resource(m_original); } }; //----------------------------------------------------------------------------- /** RAII class which counts allocations and frees inside a scope. Can * optionally set also the memory resource to be used. * @ingroup memory_resources */ struct ScopedMemoryResourceCounts // NOLINT(*-member-functions) { MemoryResourceCounts mr; ScopedMemoryResourceCounts() : mr() { set_memory_resource(&mr); } ScopedMemoryResourceCounts(MemoryResource *m) : mr(m) { set_memory_resource(&mr); } ~ScopedMemoryResourceCounts() { set_memory_resource(mr.resource()); } }; } // namespace c4 #endif /* _C4_MEMORY_RESOURCE_HPP_ */ c4core-0.2.6/src/c4/memory_util.cpp000066400000000000000000000016211477602032300170500ustar00rootroot00000000000000#include "c4/memory_util.hpp" #include "c4/error.hpp" namespace c4 { /** Fills 'dest' with the first 'pattern_size' bytes at 'pattern', 'num_times'. */ void mem_repeat(void* dest, void const* pattern, size_t pattern_size, size_t num_times) { if(C4_UNLIKELY(num_times == 0)) return; C4_ASSERT( ! mem_overlaps(dest, pattern, num_times*pattern_size, pattern_size)); char *begin = static_cast(dest); char *end = begin + num_times * pattern_size; // copy the pattern once ::memcpy(begin, pattern, pattern_size); // now copy from dest to itself, doubling up every time size_t n = pattern_size; while(begin + 2*n < end) { ::memcpy(begin + n, begin, n); n <<= 1u; // double n } // copy the missing part if(begin + n < end) { ::memcpy(begin + n, begin, static_cast(end - (begin + n))); } } } // namespace c4 c4core-0.2.6/src/c4/memory_util.hpp000066400000000000000000000572661477602032300170750ustar00rootroot00000000000000#ifndef _C4_MEMORY_UTIL_HPP_ #define _C4_MEMORY_UTIL_HPP_ #include "c4/config.hpp" #include "c4/error.hpp" #include "c4/compiler.hpp" #include "c4/cpu.hpp" #ifdef C4_MSVC #include #endif #include #if (defined(__GNUC__) && __GNUC__ >= 10) || defined(__has_builtin) #define _C4_USE_LSB_INTRINSIC(which) __has_builtin(which) #define _C4_USE_MSB_INTRINSIC(which) __has_builtin(which) #elif defined(C4_MSVC) #define _C4_USE_LSB_INTRINSIC(which) true #define _C4_USE_MSB_INTRINSIC(which) true #else // let's try our luck #define _C4_USE_LSB_INTRINSIC(which) true #define _C4_USE_MSB_INTRINSIC(which) true #endif /** @file memory_util.hpp Some memory utilities. */ // NOLINTBEGIN(google-runtime-int) namespace c4 { C4_SUPPRESS_WARNING_GCC_CLANG_WITH_PUSH("-Wold-style-cast") /** set the given memory to zero */ C4_ALWAYS_INLINE void mem_zero(void* mem, size_t num_bytes) { memset(mem, 0, num_bytes); } /** set the given memory to zero */ template C4_ALWAYS_INLINE void mem_zero(T* mem, size_t num_elms) { memset(mem, 0, sizeof(T) * num_elms); } /** set the given memory to zero */ template C4_ALWAYS_INLINE void mem_zero(T* mem) { memset(mem, 0, sizeof(T)); } C4_ALWAYS_INLINE C4_CONST bool mem_overlaps(void const* a, void const* b, size_t sza, size_t szb) { // thanks @timwynants return (((const char*)b + szb) > a && b < ((const char*)a+sza)); } void mem_repeat(void* dest, void const* pattern, size_t pattern_size, size_t num_times); //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- template C4_ALWAYS_INLINE C4_CONST bool is_aligned(T *ptr, uintptr_t alignment=alignof(T)) { return (uintptr_t(ptr) & (alignment - uintptr_t(1))) == uintptr_t(0); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // least significant bit /** @name msb Compute the least significant bit * @note the input value must be nonzero * @note the input type must be unsigned */ /** @{ */ // https://graphics.stanford.edu/~seander/bithacks.html#ZerosOnRightLinear #define _c4_lsb_fallback \ unsigned c = 0; \ v = (v ^ (v - 1)) >> 1; /* Set v's trailing 0s to 1s and zero rest */ \ for(; v; ++c) \ v >>= 1; \ return (unsigned) c // u8 template C4_CONSTEXPR14 auto lsb(I v) noexcept -> typename std::enable_if::type { C4_STATIC_ASSERT(std::is_unsigned::value); C4_ASSERT(v != 0); #if _C4_USE_LSB_INTRINSIC(__builtin_ctz) // upcast to use the intrinsic, it's cheaper. #ifdef C4_MSVC #if !defined(C4_CPU_ARM64) && !defined(C4_CPU_ARM) unsigned long bit; _BitScanForward(&bit, (unsigned long)v); return bit; #else _c4_lsb_fallback; #endif #else return (unsigned)__builtin_ctz((unsigned)v); #endif #else _c4_lsb_fallback; #endif } // u16 template C4_CONSTEXPR14 auto lsb(I v) noexcept -> typename std::enable_if::type { C4_STATIC_ASSERT(std::is_unsigned::value); C4_ASSERT(v != 0); #if _C4_USE_LSB_INTRINSIC(__builtin_ctz) // upcast to use the intrinsic, it's cheaper. // Then remember that the upcast makes it to 31bits #ifdef C4_MSVC #if !defined(C4_CPU_ARM64) && !defined(C4_CPU_ARM) unsigned long bit; _BitScanForward(&bit, (unsigned long)v); return bit; #else _c4_lsb_fallback; #endif #else return (unsigned)__builtin_ctz((unsigned)v); #endif #else _c4_lsb_fallback; #endif } // u32 template C4_CONSTEXPR14 auto lsb(I v) noexcept -> typename std::enable_if::type { C4_STATIC_ASSERT(std::is_unsigned::value); C4_ASSERT(v != 0); #if _C4_USE_LSB_INTRINSIC(__builtin_ctz) #ifdef C4_MSVC #if !defined(C4_CPU_ARM64) && !defined(C4_CPU_ARM) unsigned long bit; _BitScanForward(&bit, v); return bit; #else _c4_lsb_fallback; #endif #else return (unsigned)__builtin_ctz((unsigned)v); #endif #else _c4_lsb_fallback; #endif } // u64 in 64bits template C4_CONSTEXPR14 auto lsb(I v) noexcept -> typename std::enable_if::type { C4_STATIC_ASSERT(std::is_unsigned::value); C4_ASSERT(v != 0); #if _C4_USE_LSB_INTRINSIC(__builtin_ctzl) #if defined(C4_MSVC) #if !defined(C4_CPU_ARM64) && !defined(C4_CPU_ARM) unsigned long bit; _BitScanForward64(&bit, v); return bit; #else _c4_lsb_fallback; #endif #else return (unsigned)__builtin_ctzl((unsigned long)v); #endif #else _c4_lsb_fallback; #endif } // u64 in 32bits template C4_CONSTEXPR14 auto lsb(I v) noexcept -> typename std::enable_if::type { C4_STATIC_ASSERT(std::is_unsigned::value); C4_ASSERT(v != 0); #if _C4_USE_LSB_INTRINSIC(__builtin_ctzll) #if defined(C4_MSVC) #if !defined(C4_CPU_X86) && !defined(C4_CPU_ARM64) && !defined(C4_CPU_ARM) unsigned long bit; _BitScanForward64(&bit, v); return bit; #else _c4_lsb_fallback; #endif #else return (unsigned)__builtin_ctzll((unsigned long long)v); #endif #else _c4_lsb_fallback; #endif } #undef _c4_lsb_fallback /** @} */ namespace detail { template struct _lsb11; template struct _lsb11 { enum : unsigned { num = _lsb11>1), num_bits+I(1), (((val>>1)&I(1))!=I(0))>::num }; }; template struct _lsb11 { enum : unsigned { num = num_bits }; }; } // namespace detail /** TMP version of lsb(); this needs to be implemented with template * meta-programming because C++11 cannot use a constexpr function with * local variables * @see lsb */ template struct lsb11 { static_assert(number != 0, "lsb: number must be nonzero"); enum : unsigned { value = detail::_lsb11::num}; }; //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // most significant bit /** @name msb Compute the most significant bit * @note the input value must be nonzero * @note the input type must be unsigned */ /** @{ */ #define _c4_msb8_fallback \ unsigned n = 0; \ if(v & I(0xf0)) v >>= 4, n |= I(4); \ if(v & I(0x0c)) v >>= 2, n |= I(2); \ if(v & I(0x02)) v >>= 1, n |= I(1); \ return n #define _c4_msb16_fallback \ unsigned n = 0; \ if(v & I(0xff00)) v >>= 8, n |= I(8); \ if(v & I(0x00f0)) v >>= 4, n |= I(4); \ if(v & I(0x000c)) v >>= 2, n |= I(2); \ if(v & I(0x0002)) v >>= 1, n |= I(1); \ return n #define _c4_msb32_fallback \ unsigned n = 0; \ if(v & I(0xffff0000)) v >>= 16, n |= 16; \ if(v & I(0x0000ff00)) v >>= 8, n |= 8; \ if(v & I(0x000000f0)) v >>= 4, n |= 4; \ if(v & I(0x0000000c)) v >>= 2, n |= 2; \ if(v & I(0x00000002)) v >>= 1, n |= 1; \ return n #define _c4_msb64_fallback \ unsigned n = 0; \ if(v & I(0xffffffff00000000)) v >>= 32, n |= I(32); \ if(v & I(0x00000000ffff0000)) v >>= 16, n |= I(16); \ if(v & I(0x000000000000ff00)) v >>= 8, n |= I(8); \ if(v & I(0x00000000000000f0)) v >>= 4, n |= I(4); \ if(v & I(0x000000000000000c)) v >>= 2, n |= I(2); \ if(v & I(0x0000000000000002)) v >>= 1, n |= I(1); \ return n // u8 template C4_CONSTEXPR14 auto msb(I v) noexcept -> typename std::enable_if::type { C4_STATIC_ASSERT(std::is_unsigned::value); C4_ASSERT(v != 0); #if _C4_USE_MSB_INTRINSIC(__builtin_clz) // upcast to use the intrinsic, it's cheaper. // Then remember that the upcast makes it to 31bits #ifdef C4_MSVC #if !defined(C4_CPU_ARM64) && !defined(C4_CPU_ARM) unsigned long bit; _BitScanReverse(&bit, (unsigned long)v); return bit; #else _c4_msb8_fallback; #endif #else return 31u - (unsigned)__builtin_clz((unsigned)v); #endif #else _c4_msb8_fallback; #endif } // u16 template C4_CONSTEXPR14 auto msb(I v) noexcept -> typename std::enable_if::type { C4_STATIC_ASSERT(std::is_unsigned::value); C4_ASSERT(v != 0); #if _C4_USE_MSB_INTRINSIC(__builtin_clz) // upcast to use the intrinsic, it's cheaper. // Then remember that the upcast makes it to 31bits #ifdef C4_MSVC #if !defined(C4_CPU_ARM64) && !defined(C4_CPU_ARM) unsigned long bit; _BitScanReverse(&bit, (unsigned long)v); return bit; #else _c4_msb16_fallback; #endif #else return 31u - (unsigned)__builtin_clz((unsigned)v); #endif #else _c4_msb16_fallback; #endif } // u32 template C4_CONSTEXPR14 auto msb(I v) noexcept -> typename std::enable_if::type { C4_STATIC_ASSERT(std::is_unsigned::value); C4_ASSERT(v != 0); #if _C4_USE_MSB_INTRINSIC(__builtin_clz) #ifdef C4_MSVC #if !defined(C4_CPU_ARM64) && !defined(C4_CPU_ARM) unsigned long bit; _BitScanReverse(&bit, v); return bit; #else _c4_msb32_fallback; #endif #else return 31u - (unsigned)__builtin_clz((unsigned)v); #endif #else _c4_msb32_fallback; #endif } // u64 in 64bits template C4_CONSTEXPR14 auto msb(I v) noexcept -> typename std::enable_if::type { C4_STATIC_ASSERT(std::is_unsigned::value); C4_ASSERT(v != 0); #if _C4_USE_MSB_INTRINSIC(__builtin_clzl) #ifdef C4_MSVC #if !defined(C4_CPU_ARM64) && !defined(C4_CPU_ARM) unsigned long bit; _BitScanReverse64(&bit, v); return bit; #else _c4_msb64_fallback; #endif #else return 63u - (unsigned)__builtin_clzl((unsigned long)v); #endif #else _c4_msb64_fallback; #endif } // u64 in 32bits template C4_CONSTEXPR14 auto msb(I v) noexcept -> typename std::enable_if::type { C4_STATIC_ASSERT(std::is_unsigned::value); C4_ASSERT(v != 0); #if _C4_USE_MSB_INTRINSIC(__builtin_clzll) #ifdef C4_MSVC #if !defined(C4_CPU_X86) && !defined(C4_CPU_ARM64) && !defined(C4_CPU_ARM) unsigned long bit; _BitScanReverse64(&bit, v); return bit; #else _c4_msb64_fallback; #endif #else return 63u - (unsigned)__builtin_clzll((unsigned long long)v); #endif #else _c4_msb64_fallback; #endif } #undef _c4_msb8_fallback #undef _c4_msb16_fallback #undef _c4_msb32_fallback #undef _c4_msb64_fallback /** @} */ namespace detail { template struct _msb11; template struct _msb11< I, val, num_bits, false> { enum : unsigned { num = _msb11>1), num_bits+I(1), ((val>>1)==I(0))>::num }; }; template struct _msb11 { static_assert(val == 0, "bad implementation"); enum : unsigned { num = (unsigned)(num_bits-1) }; }; } // namespace detail /** TMP version of msb(); this needs to be implemented with template * meta-programming because C++11 cannot use a constexpr function with * local variables * @see msb */ template struct msb11 { enum : unsigned { value = detail::_msb11::num }; }; #undef _C4_USE_LSB_INTRINSIC #undef _C4_USE_MSB_INTRINSIC //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // there is an implicit conversion below; it happens when E or B are // narrower than int, and thus any operation will upcast the result to // int, and then downcast to assign C4_SUPPRESS_WARNING_GCC_CLANG_WITH_PUSH("-Wconversion") /** integer power; this function is constexpr-14 because of the local * variables */ template C4_CONSTEXPR14 C4_CONST auto ipow(B base, E exponent) noexcept -> typename std::enable_if::value, B>::type { C4_STATIC_ASSERT(std::is_integral::value); B r = B(1); if(exponent >= 0) { for(E e = 0; e < exponent; ++e) r *= base; } else { exponent *= E(-1); for(E e = 0; e < exponent; ++e) r /= base; } return r; } /** integer power; this function is constexpr-14 because of the local * variables */ template C4_CONSTEXPR14 C4_CONST auto ipow(E exponent) noexcept -> typename std::enable_if::value, B>::type { C4_STATIC_ASSERT(std::is_integral::value); B r = B(1); if(exponent >= 0) { for(E e = 0; e < exponent; ++e) r *= base; } else { exponent *= E(-1); for(E e = 0; e < exponent; ++e) r /= base; } return r; } /** integer power; this function is constexpr-14 because of the local * variables */ template C4_CONSTEXPR14 C4_CONST auto ipow(E exponent) noexcept -> typename std::enable_if::value, B>::type { C4_STATIC_ASSERT(std::is_integral::value); B r = B(1); B bbase = B(base); if(exponent >= 0) { for(E e = 0; e < exponent; ++e) r *= bbase; } else { exponent *= E(-1); for(E e = 0; e < exponent; ++e) r /= bbase; } return r; } /** integer power; this function is constexpr-14 because of the local * variables */ template C4_CONSTEXPR14 C4_CONST auto ipow(B base, E exponent) noexcept -> typename std::enable_if::value, B>::type { C4_STATIC_ASSERT(std::is_integral::value); B r = B(1); for(E e = 0; e < exponent; ++e) r *= base; return r; } /** integer power; this function is constexpr-14 because of the local * variables */ template C4_CONSTEXPR14 C4_CONST auto ipow(E exponent) noexcept -> typename std::enable_if::value, B>::type { C4_STATIC_ASSERT(std::is_integral::value); B r = B(1); for(E e = 0; e < exponent; ++e) r *= base; return r; } /** integer power; this function is constexpr-14 because of the local * variables */ template C4_CONSTEXPR14 C4_CONST auto ipow(E exponent) noexcept -> typename std::enable_if::value, B>::type { C4_STATIC_ASSERT(std::is_integral::value); B r = B(1); B bbase = B(base); for(E e = 0; e < exponent; ++e) r *= bbase; return r; } C4_SUPPRESS_WARNING_GCC_CLANG_POP //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /** return a mask with all bits set [first_bit,last_bit[; this function * is constexpr-14 because of the local variables */ template C4_CONSTEXPR14 I contiguous_mask(I first_bit, I last_bit) { I r = 0; for(I i = first_bit; i < last_bit; ++i) { r |= (I(1) << i); } return r; } namespace detail { template struct _ctgmsk11; template struct _ctgmsk11< I, val, first, last, true> { enum : I { value = _ctgmsk11::value }; }; template struct _ctgmsk11< I, val, first, last, false> { enum : I { value = val }; }; } // namespace detail /** TMP version of contiguous_mask(); this needs to be implemented with template * meta-programming because C++11 cannot use a constexpr function with * local variables * @see contiguous_mask */ template struct contiguous_mask11 { enum : I { value = detail::_ctgmsk11::value }; }; //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /** use Empty Base Class Optimization to reduce the size of a pair of * potentially empty types*/ namespace detail { typedef enum { tpc_same, tpc_same_empty, tpc_both_empty, tpc_first_empty, tpc_second_empty, tpc_general } TightPairCase_e; template constexpr TightPairCase_e tpc_which_case() { return std::is_same::value ? std::is_empty::value ? tpc_same_empty : tpc_same : std::is_empty::value && std::is_empty::value ? tpc_both_empty : std::is_empty::value ? tpc_first_empty : std::is_empty::value ? tpc_second_empty : tpc_general ; } template struct tight_pair { private: First m_first; Second m_second; public: using first_type = First; using second_type = Second; tight_pair() : m_first(), m_second() {} tight_pair(First const& f, Second const& s) : m_first(f), m_second(s) {} C4_ALWAYS_INLINE C4_CONSTEXPR14 First & first () { return m_first; } C4_ALWAYS_INLINE C4_CONSTEXPR14 First const& first () const { return m_first; } C4_ALWAYS_INLINE C4_CONSTEXPR14 Second & second() { return m_second; } C4_ALWAYS_INLINE C4_CONSTEXPR14 Second const& second() const { return m_second; } }; template struct tight_pair : public First { static_assert(std::is_same::value, "bad implementation"); using first_type = First; using second_type = Second; tight_pair() : First() {} tight_pair(First const& f, Second const& /*s*/) : First(f) {} C4_ALWAYS_INLINE C4_CONSTEXPR14 First & first () { return static_cast(*this); } C4_ALWAYS_INLINE C4_CONSTEXPR14 First const& first () const { return static_cast(*this); } C4_ALWAYS_INLINE C4_CONSTEXPR14 Second & second() { return reinterpret_cast(*this); } // NOLINT C4_ALWAYS_INLINE C4_CONSTEXPR14 Second const& second() const { return reinterpret_cast(*this); } // NOLINT }; template struct tight_pair : public First, public Second { using first_type = First; using second_type = Second; tight_pair() : First(), Second() {} tight_pair(First const& f, Second const& s) : First(f), Second(s) {} C4_ALWAYS_INLINE C4_CONSTEXPR14 First & first () { return static_cast(*this); } C4_ALWAYS_INLINE C4_CONSTEXPR14 First const& first () const { return static_cast(*this); } C4_ALWAYS_INLINE C4_CONSTEXPR14 Second & second() { return static_cast(*this); } C4_ALWAYS_INLINE C4_CONSTEXPR14 Second const& second() const { return static_cast(*this); } }; template struct tight_pair : public First { Second m_second; using first_type = First; using second_type = Second; tight_pair() : First() {} tight_pair(First const& f, Second const& s) : First(f), m_second(s) {} C4_ALWAYS_INLINE C4_CONSTEXPR14 First & first () { return static_cast(*this); } C4_ALWAYS_INLINE C4_CONSTEXPR14 First const& first () const { return static_cast(*this); } C4_ALWAYS_INLINE C4_CONSTEXPR14 Second & second() { return m_second; } C4_ALWAYS_INLINE C4_CONSTEXPR14 Second const& second() const { return m_second; } }; template struct tight_pair : public First { Second m_second; using first_type = First; using second_type = Second; tight_pair() : First(), m_second() {} tight_pair(First const& f, Second const& s) : First(f), m_second(s) {} C4_ALWAYS_INLINE C4_CONSTEXPR14 First & first () { return static_cast(*this); } C4_ALWAYS_INLINE C4_CONSTEXPR14 First const& first () const { return static_cast(*this); } C4_ALWAYS_INLINE C4_CONSTEXPR14 Second & second() { return m_second; } C4_ALWAYS_INLINE C4_CONSTEXPR14 Second const& second() const { return m_second; } }; template struct tight_pair : public Second { First m_first; using first_type = First; using second_type = Second; tight_pair() : Second(), m_first() {} tight_pair(First const& f, Second const& s) : Second(s), m_first(f) {} C4_ALWAYS_INLINE C4_CONSTEXPR14 First & first () { return m_first; } C4_ALWAYS_INLINE C4_CONSTEXPR14 First const& first () const { return m_first; } C4_ALWAYS_INLINE C4_CONSTEXPR14 Second & second() { return static_cast(*this); } C4_ALWAYS_INLINE C4_CONSTEXPR14 Second const& second() const { return static_cast(*this); } }; } // namespace detail template using tight_pair = detail::tight_pair()>; C4_SUPPRESS_WARNING_GCC_CLANG_POP } // namespace c4 // NOLINTEND(google-runtime-int) #endif /* _C4_MEMORY_UTIL_HPP_ */ c4core-0.2.6/src/c4/platform.hpp000066400000000000000000000021371477602032300163370ustar00rootroot00000000000000#ifndef _C4_PLATFORM_HPP_ #define _C4_PLATFORM_HPP_ /** @file platform.hpp Provides platform information macros * @ingroup basic_headers */ // see also https://sourceforge.net/p/predef/wiki/OperatingSystems/ #if defined(_WIN64) # define C4_WIN # define C4_WIN64 #elif defined(_WIN32) # define C4_WIN # define C4_WIN32 #elif defined(__ANDROID__) # define C4_ANDROID #elif defined(__APPLE__) # include "TargetConditionals.h" # if TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR # define C4_IOS # elif TARGET_OS_MAC || TARGET_OS_OSX # define C4_MACOS # else # error "Unknown Apple platform" # endif #elif defined(__linux__) || defined(__linux) # define C4_UNIX # define C4_LINUX #elif defined(__unix__) || defined(__unix) # define C4_UNIX #elif defined(__arm__) || defined(__aarch64__) # define C4_ARM #elif defined(__xtensa__) || defined(__XTENSA__) # define C4_XTENSA #elif defined(SWIG) # define C4_SWIG #else # error "unknown platform" #endif #if defined(__posix) || defined(C4_UNIX) || defined(C4_LINUX) # define C4_POSIX #endif #endif /* _C4_PLATFORM_HPP_ */ c4core-0.2.6/src/c4/preprocessor.hpp000066400000000000000000000146631477602032300172500ustar00rootroot00000000000000#ifndef _C4_PREPROCESSOR_HPP_ #define _C4_PREPROCESSOR_HPP_ /** @file preprocessor.hpp Contains basic macros and preprocessor utilities. * @ingroup basic_headers */ #ifdef __clang__ /* NOTE: using , ## __VA_ARGS__ to deal with zero-args calls to * variadic macros is not portable, but works in clang, gcc, msvc, icc. * clang requires switching off compiler warnings for pedantic mode. * @see http://stackoverflow.com/questions/32047685/variadic-macro-without-arguments */ # pragma clang diagnostic push # pragma clang diagnostic ignored "-Wgnu-zero-variadic-macro-arguments" // warning: token pasting of ',' and __VA_ARGS__ is a GNU extension #elif defined(__GNUC__) /* GCC also issues a warning for zero-args calls to variadic macros. * This warning is switched on with -pedantic and apparently there is no * easy way to turn it off as with clang. But marking this as a system * header works. * @see https://gcc.gnu.org/onlinedocs/cpp/System-Headers.html * @see http://stackoverflow.com/questions/35587137/ */ # pragma GCC system_header #endif #define C4_WIDEN(str) L"" str #define C4_COUNTOF(arr) (sizeof(arr)/sizeof((arr)[0])) #define C4_EXPAND(arg) arg /** useful in some macro calls with template arguments */ #define C4_COMMA , /** useful in some macro calls with template arguments * @see C4_COMMA */ #define C4_COMMA_X C4_COMMA /** expand and quote */ #define C4_XQUOTE(arg) _C4_XQUOTE(arg) #define _C4_XQUOTE(arg) C4_QUOTE(arg) #define C4_QUOTE(arg) #arg /** expand and concatenate */ #define C4_XCAT(arg1, arg2) _C4_XCAT(arg1, arg2) #define _C4_XCAT(arg1, arg2) C4_CAT(arg1, arg2) #define C4_CAT(arg1, arg2) arg1##arg2 #define C4_VERSION_CAT(major, minor, patch) ((major)*10000 + (minor)*100 + (patch)) /** A preprocessor foreach. Spectacular trick taken from: * http://stackoverflow.com/a/1872506/5875572 * The first argument is for a macro receiving a single argument, * which will be called with every subsequent argument. There is * currently a limit of 32 arguments, and at least 1 must be provided. * Example: @code{.cpp} struct Example { int a; int b; int c; }; // define a one-arg macro to be called #define PRN_STRUCT_OFFSETS(field) PRN_STRUCT_OFFSETS_(Example, field) #define PRN_STRUCT_OFFSETS_(structure, field) printf(C4_XQUOTE(structure) ":" C4_XQUOTE(field)" - offset=%zu\n", offsetof(structure, field)); // now call the macro for a, b and c C4_FOR_EACH(PRN_STRUCT_OFFSETS, a, b, c); @endcode */ #define C4_FOR_EACH(what, ...) C4_FOR_EACH_SEP(what, ;, __VA_ARGS__) /** same as C4_FOR_EACH(), but use a custom separator between statements. * If a comma is needed as the separator, use the C4_COMMA macro. * @see C4_FOR_EACH * @see C4_COMMA */ #define C4_FOR_EACH_SEP(what, sep, ...) _C4_FOR_EACH_(_C4_FOR_EACH_NARG(__VA_ARGS__), what, sep, __VA_ARGS__) /// @cond dev #define _C4_FOR_EACH_01(what, sep, x) what(x) sep #define _C4_FOR_EACH_02(what, sep, x, ...) what(x) sep _C4_FOR_EACH_01(what, sep, __VA_ARGS__) #define _C4_FOR_EACH_03(what, sep, x, ...) what(x) sep _C4_FOR_EACH_02(what, sep, __VA_ARGS__) #define _C4_FOR_EACH_04(what, sep, x, ...) what(x) sep _C4_FOR_EACH_03(what, sep, __VA_ARGS__) #define _C4_FOR_EACH_05(what, sep, x, ...) what(x) sep _C4_FOR_EACH_04(what, sep, __VA_ARGS__) #define _C4_FOR_EACH_06(what, sep, x, ...) what(x) sep _C4_FOR_EACH_05(what, sep, __VA_ARGS__) #define _C4_FOR_EACH_07(what, sep, x, ...) what(x) sep _C4_FOR_EACH_06(what, sep, __VA_ARGS__) #define _C4_FOR_EACH_08(what, sep, x, ...) what(x) sep _C4_FOR_EACH_07(what, sep, __VA_ARGS__) #define _C4_FOR_EACH_09(what, sep, x, ...) what(x) sep _C4_FOR_EACH_08(what, sep, __VA_ARGS__) #define _C4_FOR_EACH_10(what, sep, x, ...) what(x) sep _C4_FOR_EACH_09(what, sep, __VA_ARGS__) #define _C4_FOR_EACH_11(what, sep, x, ...) what(x) sep _C4_FOR_EACH_10(what, sep, __VA_ARGS__) #define _C4_FOR_EACH_12(what, sep, x, ...) what(x) sep _C4_FOR_EACH_11(what, sep, __VA_ARGS__) #define _C4_FOR_EACH_13(what, sep, x, ...) what(x) sep _C4_FOR_EACH_12(what, sep, __VA_ARGS__) #define _C4_FOR_EACH_14(what, sep, x, ...) what(x) sep _C4_FOR_EACH_13(what, sep, __VA_ARGS__) #define _C4_FOR_EACH_15(what, sep, x, ...) what(x) sep _C4_FOR_EACH_14(what, sep, __VA_ARGS__) #define _C4_FOR_EACH_16(what, sep, x, ...) what(x) sep _C4_FOR_EACH_15(what, sep, __VA_ARGS__) #define _C4_FOR_EACH_17(what, sep, x, ...) what(x) sep _C4_FOR_EACH_16(what, sep, __VA_ARGS__) #define _C4_FOR_EACH_18(what, sep, x, ...) what(x) sep _C4_FOR_EACH_17(what, sep, __VA_ARGS__) #define _C4_FOR_EACH_19(what, sep, x, ...) what(x) sep _C4_FOR_EACH_18(what, sep, __VA_ARGS__) #define _C4_FOR_EACH_20(what, sep, x, ...) what(x) sep _C4_FOR_EACH_19(what, sep, __VA_ARGS__) #define _C4_FOR_EACH_21(what, sep, x, ...) what(x) sep _C4_FOR_EACH_20(what, sep, __VA_ARGS__) #define _C4_FOR_EACH_22(what, sep, x, ...) what(x) sep _C4_FOR_EACH_21(what, sep, __VA_ARGS__) #define _C4_FOR_EACH_23(what, sep, x, ...) what(x) sep _C4_FOR_EACH_22(what, sep, __VA_ARGS__) #define _C4_FOR_EACH_24(what, sep, x, ...) what(x) sep _C4_FOR_EACH_23(what, sep, __VA_ARGS__) #define _C4_FOR_EACH_25(what, sep, x, ...) what(x) sep _C4_FOR_EACH_24(what, sep, __VA_ARGS__) #define _C4_FOR_EACH_26(what, sep, x, ...) what(x) sep _C4_FOR_EACH_25(what, sep, __VA_ARGS__) #define _C4_FOR_EACH_27(what, sep, x, ...) what(x) sep _C4_FOR_EACH_26(what, sep, __VA_ARGS__) #define _C4_FOR_EACH_28(what, sep, x, ...) what(x) sep _C4_FOR_EACH_27(what, sep, __VA_ARGS__) #define _C4_FOR_EACH_29(what, sep, x, ...) what(x) sep _C4_FOR_EACH_28(what, sep, __VA_ARGS__) #define _C4_FOR_EACH_30(what, sep, x, ...) what(x) sep _C4_FOR_EACH_29(what, sep, __VA_ARGS__) #define _C4_FOR_EACH_31(what, sep, x, ...) what(x) sep _C4_FOR_EACH_30(what, sep, __VA_ARGS__) #define _C4_FOR_EACH_32(what, sep, x, ...) what(x) sep _C4_FOR_EACH_31(what, sep, __VA_ARGS__) #define _C4_FOR_EACH_NARG(...) _C4_FOR_EACH_NARG_(__VA_ARGS__, _C4_FOR_EACH_RSEQ_N()) #define _C4_FOR_EACH_NARG_(...) _C4_FOR_EACH_ARG_N(__VA_ARGS__) #define _C4_FOR_EACH_ARG_N(_01, _02, _03, _04, _05, _06, _07, _08, _09, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, N, ...) N #define _C4_FOR_EACH_RSEQ_N() 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 09, 08, 07, 06, 05, 04, 03, 02, 01 #define _C4_FOR_EACH_(N, what, sep, ...) C4_XCAT(_C4_FOR_EACH_, N)(what, sep, __VA_ARGS__) /// @endcond #ifdef __clang__ # pragma clang diagnostic pop #endif #endif /* _C4_PREPROCESSOR_HPP_ */ c4core-0.2.6/src/c4/restrict.hpp000066400000000000000000000026541477602032300163560ustar00rootroot00000000000000#ifndef _C4_RESTRICT_HPP_ #define _C4_RESTRICT_HPP_ /** @file restrict.hpp macros defining shorthand symbols for restricted * pointers and references * @see unrestrict.hpp * @see restrict */ /** @defgroup restrict Restrict utilities * macros defining shorthand symbols for restricted * pointers and references * ```cpp * void sum_arrays(size_t sz, float const* C4_RESTRICT a, float const *C4_RESTRICT b, float *result); * float * C4_RESTRICT ptr; * float & C4_RESTRICT ref = *ptr; * float const* C4_RESTRICT cptr; * float const& C4_RESTRICT cref = *cptr; * * // becomes this: * #include * void sum_arrays(size_t sz, float c$ a, float c$ b, float * result); * float $ ptr; * float $$ ref = *ptr; * float c$ cptr; * float c$$ cref = *cptr; * ``` * @ingroup types * @{ */ /** @def \$ a restricted pointer */ /** @def c\$ a restricted pointer to const data */ /** @def \$\$ a restricted reference */ /** @def c\$\$ a restricted reference to const data */ #ifdef __clang__ # pragma clang diagnostic push # pragma clang diagnostic ignored "-Wdollar-in-identifier-extension" #elif defined(__GNUC__) #endif #define $ * C4_RESTRICT // a restricted pointer #define c$ const* C4_RESTRICT // a restricted pointer to const data #define $$ & C4_RESTRICT // restricted reference #define c$$ const& C4_RESTRICT // restricted reference to const data /** @} */ #endif /* _C4_RESTRICT_HPP_ */ c4core-0.2.6/src/c4/span.hpp000066400000000000000000000511071477602032300154550ustar00rootroot00000000000000#ifndef _C4_SPAN_HPP_ #define _C4_SPAN_HPP_ /** @file span.hpp Provides span classes. */ #include "c4/config.hpp" #include "c4/error.hpp" #include "c4/szconv.hpp" #include namespace c4 { C4_SUPPRESS_WARNING_GCC_CLANG_WITH_PUSH("-Wold-style-cast") // NOLINTBEGIN(misc-confusable-identifiers) //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /** a crtp base for implementing span classes * * A span is a non-owning range of elements contiguously stored in memory. * Unlike STL's array_view, the span allows write-access to its members. * * To obtain subspans from a span, the following const member functions * are available: * - subspan(first, num) * - range(first, last) * - first(num) * - last(num) * * A span can also be resized via the following non-const member functions: * - resize(sz) * - ltrim(num) * - rtrim(num) * * @see span * @see cspan * @see spanrs * @see cspanrs * @see spanrsl * @see cspanrsl */ template class span_crtp { // some utility defines, undefined at the end of this class #define _c4this ((SpanImpl *)this) #define _c4cthis ((SpanImpl const*)this) #define _c4ptr ((SpanImpl *)this)->m_ptr #define _c4cptr ((SpanImpl const*)this)->m_ptr #define _c4sz ((SpanImpl *)this)->m_size #define _c4csz ((SpanImpl const*)this)->m_size public: _c4_DEFINE_ARRAY_TYPES(T, I); public: C4_ALWAYS_INLINE constexpr I value_size() const noexcept { return sizeof(T); } C4_ALWAYS_INLINE constexpr I elm_size () const noexcept { return sizeof(T); } C4_ALWAYS_INLINE constexpr I type_size () const noexcept { return sizeof(T); } C4_ALWAYS_INLINE I byte_size () const noexcept { return _c4csz*sizeof(T); } C4_ALWAYS_INLINE bool empty() const noexcept { return _c4csz == 0; } C4_ALWAYS_INLINE I size() const noexcept { return _c4csz; } //C4_ALWAYS_INLINE I capacity() const noexcept { return _c4sz; } // this must be defined by impl classes C4_ALWAYS_INLINE void clear() noexcept { _c4sz = 0; } C4_ALWAYS_INLINE T * data() noexcept { return _c4ptr; } C4_ALWAYS_INLINE T const* data() const noexcept { return _c4cptr; } C4_ALWAYS_INLINE iterator begin() noexcept { return _c4ptr; } C4_ALWAYS_INLINE const_iterator begin() const noexcept { return _c4cptr; } C4_ALWAYS_INLINE const_iterator cbegin() const noexcept { return _c4cptr; } C4_ALWAYS_INLINE iterator end() noexcept { return _c4ptr + _c4sz; } C4_ALWAYS_INLINE const_iterator end() const noexcept { return _c4cptr + _c4csz; } C4_ALWAYS_INLINE const_iterator cend() const noexcept { return _c4cptr + _c4csz; } C4_ALWAYS_INLINE reverse_iterator rbegin() noexcept { return reverse_iterator(_c4ptr + _c4sz); } C4_ALWAYS_INLINE const_reverse_iterator rbegin() const noexcept { return reverse_iterator(_c4cptr + _c4csz); } C4_ALWAYS_INLINE const_reverse_iterator crbegin() const noexcept { return reverse_iterator(_c4cptr + _c4csz); } C4_ALWAYS_INLINE reverse_iterator rend() noexcept { return const_reverse_iterator(_c4ptr); } C4_ALWAYS_INLINE const_reverse_iterator rend() const noexcept { return const_reverse_iterator(_c4cptr); } C4_ALWAYS_INLINE const_reverse_iterator crend() const noexcept { return const_reverse_iterator(_c4cptr); } C4_ALWAYS_INLINE T & front() C4_NOEXCEPT_X { C4_XASSERT(!empty()); return _c4ptr [0]; } C4_ALWAYS_INLINE T const& front() const C4_NOEXCEPT_X { C4_XASSERT(!empty()); return _c4cptr[0]; } C4_ALWAYS_INLINE T & back() C4_NOEXCEPT_X { C4_XASSERT(!empty()); return _c4ptr [_c4sz - 1]; } C4_ALWAYS_INLINE T const& back() const C4_NOEXCEPT_X { C4_XASSERT(!empty()); return _c4cptr[_c4csz - 1]; } C4_ALWAYS_INLINE T & operator[] (I i) C4_NOEXCEPT_X { C4_XASSERT(i >= 0 && i < _c4sz ); return _c4ptr [i]; } C4_ALWAYS_INLINE T const& operator[] (I i) const C4_NOEXCEPT_X { C4_XASSERT(i >= 0 && i < _c4csz); return _c4cptr[i]; } C4_ALWAYS_INLINE SpanImpl subspan(I first, I num) const C4_NOEXCEPT_X { C4_XASSERT((first >= 0 && first < _c4csz) || (first == _c4csz && num == 0)); C4_XASSERT((first + num >= 0) && (first + num <= _c4csz)); return _c4cthis->_select(_c4cptr + first, num); } C4_ALWAYS_INLINE SpanImpl subspan(I first) const C4_NOEXCEPT_X ///< goes up until the end of the span { C4_XASSERT(first >= 0 && first <= _c4csz); return _c4cthis->_select(_c4cptr + first, _c4csz - first); } C4_ALWAYS_INLINE SpanImpl range(I first, I last) const C4_NOEXCEPT_X ///< last element is NOT included { C4_XASSERT(((first >= 0) && (first < _c4csz)) || (first == _c4csz && first == last)); C4_XASSERT((last >= 0) && (last <= _c4csz)); C4_XASSERT(last >= first); return _c4cthis->_select(_c4cptr + first, last - first); } C4_ALWAYS_INLINE SpanImpl range(I first) const C4_NOEXCEPT_X ///< goes up until the end of the span { C4_XASSERT(((first >= 0) && (first <= _c4csz))); return _c4cthis->_select(_c4cptr + first, _c4csz - first); } C4_ALWAYS_INLINE SpanImpl first(I num) const C4_NOEXCEPT_X ///< get the first num elements, starting at 0 { C4_XASSERT((num >= 0) && (num <= _c4csz)); return _c4cthis->_select(_c4cptr, num); } C4_ALWAYS_INLINE SpanImpl last(I num) const C4_NOEXCEPT_X ///< get the last num elements, starting at size()-num { C4_XASSERT((num >= 0) && (num <= _c4csz)); return _c4cthis->_select(_c4cptr + _c4csz - num, num); } bool is_subspan(span_crtp const& ss) const noexcept { if(_c4cptr == nullptr) return false; auto *b = begin(), *e = end(); auto *ssb = ss.begin(), *sse = ss.end(); if(ssb >= b && sse <= e) { return true; } else { return false; } } /** COMPLement Left: return the complement to the left of the beginning of the given subspan. * If ss does not begin inside this, returns an empty substring. */ SpanImpl compll(span_crtp const& ss) const C4_NOEXCEPT_X { auto ssb = ss.begin(); auto b = begin(); auto e = end(); if(ssb >= b && ssb <= e) { return subspan(0, static_cast(ssb - b)); } else { return subspan(0, 0); } } /** COMPLement Right: return the complement to the right of the end of the given subspan. * If ss does not end inside this, returns an empty substring. */ SpanImpl complr(span_crtp const& ss) const C4_NOEXCEPT_X { auto sse = ss.end(); auto b = begin(); auto e = end(); if(sse >= b && sse <= e) { return subspan(static_cast(sse - b), static_cast(e - sse)); } else { return subspan(0, 0); } } C4_ALWAYS_INLINE bool same_span(span_crtp const& that) const noexcept { return size() == that.size() && data() == that.data(); } template C4_ALWAYS_INLINE bool same_span(span_crtp const& that) const C4_NOEXCEPT_X { I tsz = szconv(that.size()); // x-asserts that the size does not overflow return size() == tsz && data() == that.data(); } #undef _c4this #undef _c4cthis #undef _c4ptr #undef _c4cptr #undef _c4sz #undef _c4csz }; //----------------------------------------------------------------------------- // NOLINTBEGIN(*-redundant-inline*) template inline constexpr bool operator== ( span_crtp const& l, span_crtp const& r ) { #if C4_CPP >= 14 return std::equal(l.begin(), l.end(), r.begin(), r.end()); #else return l.same_span(r) || std::equal(l.begin(), l.end(), r.begin()); #endif } template inline constexpr bool operator!= ( span_crtp const& l, span_crtp const& r ) { return ! (l == r); } //----------------------------------------------------------------------------- template inline constexpr bool operator< ( span_crtp const& l, span_crtp const& r ) { return std::lexicographical_compare(l.begin(), l.end(), r.begin(), r.end()); } template inline constexpr bool operator<= ( span_crtp const& l, span_crtp const& r ) { return ! (l > r); } //----------------------------------------------------------------------------- template inline constexpr bool operator> ( span_crtp const& l, span_crtp const& r ) { return r < l; } //----------------------------------------------------------------------------- template inline constexpr bool operator>= ( span_crtp const& l, span_crtp const& r ) { return ! (l < r); } // NOLINTEND(*-redundant-inline*) //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /** A non-owning span of elements contiguously stored in memory. */ template class span : public span_crtp> // NOLINT(*-special-member-functions) { friend class span_crtp>; T * C4_RESTRICT m_ptr; I m_size; C4_ALWAYS_INLINE span _select(T *p, I sz) const { return span(p, sz); } public: _c4_DEFINE_ARRAY_TYPES(T, I); using NCT = typename std::remove_const::type; //!< NCT=non const type using CT = typename std::add_const::type; //!< CT=const type using const_type = span; /// convert automatically to span of const T operator span () const { span s(m_ptr, m_size); return s; } public: C4_ALWAYS_INLINE C4_CONSTEXPR14 span() noexcept : m_ptr{nullptr}, m_size{0} {} span(span const&) = default; span(span &&) = default; span& operator= (span const&) = default; span& operator= (span &&) = default; public: /** @name Construction and assignment from same type */ /** @{ */ template C4_ALWAYS_INLINE C4_CONSTEXPR14 span (T (&arr)[N]) noexcept : m_ptr{arr}, m_size{N} {} template C4_ALWAYS_INLINE C4_CONSTEXPR14 void assign(T (&arr)[N]) noexcept { m_ptr = arr; m_size = N; } C4_ALWAYS_INLINE C4_CONSTEXPR14 span(T *p, I sz) noexcept : m_ptr{p}, m_size{sz} {} C4_ALWAYS_INLINE C4_CONSTEXPR14 void assign(T *p, I sz) noexcept { m_ptr = p; m_size = sz; } C4_ALWAYS_INLINE C4_CONSTEXPR14 span (c4::aggregate_t, std::initializer_list il) noexcept : m_ptr{&*il.begin()}, m_size{il.size()} {} C4_ALWAYS_INLINE C4_CONSTEXPR14 void assign(c4::aggregate_t, std::initializer_list il) noexcept { m_ptr = &*il.begin(); m_size = il.size(); } /** @} */ public: C4_ALWAYS_INLINE I capacity() const noexcept { return m_size; } C4_ALWAYS_INLINE void resize(I sz) C4_NOEXCEPT_A { C4_ASSERT(sz <= m_size); m_size = sz; } C4_ALWAYS_INLINE void rtrim (I n ) C4_NOEXCEPT_A { C4_ASSERT(n >= 0 && n < m_size); m_size -= n; } C4_ALWAYS_INLINE void ltrim (I n ) C4_NOEXCEPT_A { C4_ASSERT(n >= 0 && n < m_size); m_size -= n; m_ptr += n; } }; template using cspan = span; //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /** A non-owning span resizeable up to a capacity. Subselection or resizing * will keep the original provided it starts at begin(). If subselection or * resizing change the pointer, then the original capacity information will * be lost. * * Thus, resizing via resize() and ltrim() and subselecting via first() * or any of subspan() or range() when starting from the beginning will keep * the original capacity. OTOH, using last(), or any of subspan() or range() * with an offset from the start will remove from capacity (shifting the * pointer) by the corresponding offset. If this is undesired, then consider * using spanrsl. * * @see spanrs for a span resizeable on the right * @see spanrsl for a span resizeable on the right and left */ template class spanrs : public span_crtp> // NOLINT(*-special-member-functions) { friend class span_crtp>; T * C4_RESTRICT m_ptr; I m_size; I m_capacity; C4_ALWAYS_INLINE spanrs _select(T *p, I sz) const noexcept { C4_ASSERT(p >= m_ptr); size_t delta = static_cast(p - m_ptr); C4_ASSERT(m_capacity >= delta); return spanrs(p, sz, static_cast(m_capacity - delta)); } public: _c4_DEFINE_ARRAY_TYPES(T, I); using NCT = typename std::remove_const::type; //!< NCT=non const type using CT = typename std::add_const::type; //!< CT=const type using const_type = spanrs; /// convert automatically to span of T C4_ALWAYS_INLINE operator span () const noexcept { return span(m_ptr, m_size); } /// convert automatically to span of const T //C4_ALWAYS_INLINE operator span () const noexcept { span s(m_ptr, m_size); return s; } /// convert automatically to spanrs of const T C4_ALWAYS_INLINE operator spanrs () const noexcept { spanrs s(m_ptr, m_size, m_capacity); return s; } public: C4_ALWAYS_INLINE spanrs() noexcept : m_ptr{nullptr}, m_size{0}, m_capacity{0} {} spanrs(spanrs const&) = default; spanrs(spanrs &&) = default; spanrs& operator= (spanrs const&) = default; spanrs& operator= (spanrs &&) = default; public: /** @name Construction and assignment from same type */ /** @{ */ C4_ALWAYS_INLINE spanrs(T *p, I sz) noexcept : m_ptr{p}, m_size{sz}, m_capacity{sz} {} /** @warning will reset the capacity to sz */ C4_ALWAYS_INLINE void assign(T *p, I sz) noexcept { m_ptr = p; m_size = sz; m_capacity = sz; } C4_ALWAYS_INLINE spanrs(T *p, I sz, I cap) noexcept : m_ptr{p}, m_size{sz}, m_capacity{cap} {} C4_ALWAYS_INLINE void assign(T *p, I sz, I cap) noexcept { m_ptr = p; m_size = sz; m_capacity = cap; } template C4_ALWAYS_INLINE spanrs(T (&arr)[N]) noexcept : m_ptr{arr}, m_size{N}, m_capacity{N} {} template C4_ALWAYS_INLINE void assign(T (&arr)[N]) noexcept { m_ptr = arr; m_size = N; m_capacity = N; } C4_ALWAYS_INLINE spanrs(c4::aggregate_t, std::initializer_list il) noexcept : m_ptr{il.begin()}, m_size{il.size()}, m_capacity{il.size()} {} C4_ALWAYS_INLINE void assign(c4::aggregate_t, std::initializer_list il) noexcept { m_ptr = il.begin(); m_size = il.size(); m_capacity = il.size(); } /** @} */ public: C4_ALWAYS_INLINE I capacity() const noexcept { return m_capacity; } C4_ALWAYS_INLINE void resize(I sz) C4_NOEXCEPT_A { C4_ASSERT(sz <= m_capacity); m_size = sz; } C4_ALWAYS_INLINE void rtrim (I n ) C4_NOEXCEPT_A { C4_ASSERT(n >= 0 && n < m_size); m_size -= n; } C4_ALWAYS_INLINE void ltrim (I n ) C4_NOEXCEPT_A { C4_ASSERT(n >= 0 && n < m_size); m_size -= n; m_ptr += n; m_capacity -= n; } }; template using cspanrs = spanrs; //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /** A non-owning span which always retains the capacity of the original * range it was taken from (though it may loose its original size). * The resizing methods resize(), ltrim(), rtrim() as well * as the subselection methods subspan(), range(), first() and last() can be * used at will without loosing the original capacity; the full capacity span * can always be recovered by calling original(). */ template class spanrsl : public span_crtp> // NOLINT(*-special-member-functions) { friend class span_crtp>; T *C4_RESTRICT m_ptr; ///< the current ptr. the original ptr is (m_ptr - m_offset). I m_size; ///< the current size. the original size is unrecoverable. I m_capacity; ///< the current capacity. the original capacity is (m_capacity + m_offset). I m_offset; ///< the offset of the current m_ptr to the start of the original memory block. C4_ALWAYS_INLINE spanrsl _select(T *p, I sz) const noexcept { C4_ASSERT(p >= m_ptr); I delta = static_cast(p - m_ptr); C4_ASSERT(m_capacity >= delta); return spanrsl(p, sz, static_cast(m_capacity - delta), m_offset + delta); } public: _c4_DEFINE_ARRAY_TYPES(T, I); using NCT = typename std::remove_const::type; //!< NCT=non const type using CT = typename std::add_const::type; //!< CT=const type using const_type = spanrsl; C4_ALWAYS_INLINE operator span () const noexcept { return span(m_ptr, m_size); } C4_ALWAYS_INLINE operator spanrs () const noexcept { return spanrs(m_ptr, m_size, m_capacity); } C4_ALWAYS_INLINE operator spanrsl () const noexcept { return spanrsl(m_ptr, m_size, m_capacity, m_offset); } public: C4_ALWAYS_INLINE spanrsl() noexcept : m_ptr{nullptr}, m_size{0}, m_capacity{0}, m_offset{0} {} spanrsl(spanrsl const&) = default; spanrsl(spanrsl &&) = default; spanrsl& operator= (spanrsl const&) = default; spanrsl& operator= (spanrsl &&) = default; public: C4_ALWAYS_INLINE spanrsl(T *p, I sz) noexcept : m_ptr{p}, m_size{sz}, m_capacity{sz}, m_offset{0} {} C4_ALWAYS_INLINE void assign(T *p, I sz) noexcept { m_ptr = p; m_size = sz; m_capacity = sz; m_offset = 0; } C4_ALWAYS_INLINE spanrsl(T *p, I sz, I cap) noexcept : m_ptr{p}, m_size{sz}, m_capacity{cap}, m_offset{0} {} C4_ALWAYS_INLINE void assign(T *p, I sz, I cap) noexcept { m_ptr = p; m_size = sz; m_capacity = cap; m_offset = 0; } C4_ALWAYS_INLINE spanrsl(T *p, I sz, I cap, I offs) noexcept : m_ptr{p}, m_size{sz}, m_capacity{cap}, m_offset{offs} {} C4_ALWAYS_INLINE void assign(T *p, I sz, I cap, I offs) noexcept { m_ptr = p; m_size = sz; m_capacity = cap; m_offset = offs; } template C4_ALWAYS_INLINE spanrsl(T (&arr)[N]) noexcept : m_ptr{arr}, m_size{N}, m_capacity{N}, m_offset{0} {} template C4_ALWAYS_INLINE void assign(T (&arr)[N]) noexcept { m_ptr = arr; m_size = N; m_capacity = N; m_offset = 0; } C4_ALWAYS_INLINE spanrsl(c4::aggregate_t, std::initializer_list il) noexcept : m_ptr{il.begin()}, m_size{il.size()}, m_capacity{il.size()}, m_offset{0} {} C4_ALWAYS_INLINE void assign (c4::aggregate_t, std::initializer_list il) noexcept { m_ptr = il.begin(); m_size = il.size(); m_capacity = il.size(); m_offset = 0; } public: C4_ALWAYS_INLINE I offset() const noexcept { return m_offset; } C4_ALWAYS_INLINE I capacity() const noexcept { return m_capacity; } C4_ALWAYS_INLINE void resize(I sz) C4_NOEXCEPT_A { C4_ASSERT(sz <= m_capacity); m_size = sz; } C4_ALWAYS_INLINE void rtrim (I n ) C4_NOEXCEPT_A { C4_ASSERT(n >= 0 && n < m_size); m_size -= n; } C4_ALWAYS_INLINE void ltrim (I n ) C4_NOEXCEPT_A { C4_ASSERT(n >= 0 && n < m_size); m_size -= n; m_ptr += n; m_offset += n; m_capacity -= n; } /** recover the original span as an spanrsl */ C4_ALWAYS_INLINE spanrsl original() const { return spanrsl(m_ptr - m_offset, m_capacity + m_offset, m_capacity + m_offset, 0); } /** recover the original span as a different span type. Example: spanrs<...> orig = s.original(); */ template class OtherSpanType> C4_ALWAYS_INLINE OtherSpanType original() { return OtherSpanType(m_ptr - m_offset, m_capacity + m_offset); } }; template using cspanrsl = spanrsl; // NOLINTEND(misc-confusable-identifiers) C4_SUPPRESS_WARNING_GCC_CLANG_POP } // namespace c4 #endif /* _C4_SPAN_HPP_ */ c4core-0.2.6/src/c4/std/000077500000000000000000000000001477602032300145715ustar00rootroot00000000000000c4core-0.2.6/src/c4/std/std.hpp000066400000000000000000000003771477602032300161030ustar00rootroot00000000000000#ifndef _C4_STD_STD_HPP_ #define _C4_STD_STD_HPP_ /** @file std.hpp includes all c4-std interop files */ #include "c4/std/vector.hpp" #include "c4/std/string.hpp" #include "c4/std/string_view.hpp" #include "c4/std/tuple.hpp" #endif // _C4_STD_STD_HPP_ c4core-0.2.6/src/c4/std/std_fwd.hpp000066400000000000000000000003771477602032300167430ustar00rootroot00000000000000#ifndef _C4_STD_STD_FWD_HPP_ #define _C4_STD_STD_FWD_HPP_ /** @file std_fwd.hpp includes all c4-std interop fwd files */ #include "c4/std/vector_fwd.hpp" #include "c4/std/string_fwd.hpp" //#include "c4/std/tuple_fwd.hpp" #endif // _C4_STD_STD_FWD_HPP_ c4core-0.2.6/src/c4/std/string.hpp000066400000000000000000000100561477602032300166120ustar00rootroot00000000000000#ifndef _C4_STD_STRING_HPP_ #define _C4_STD_STRING_HPP_ /** @file string.hpp */ #ifndef C4CORE_SINGLE_HEADER #include "c4/substr.hpp" #endif #include namespace c4 { //----------------------------------------------------------------------------- /** get a writeable view to an existing std::string. * When the string is empty, the returned view will be pointing * at the character with value '\0', but the size will be zero. * @see https://en.cppreference.com/w/cpp/string/basic_string/operator_at */ C4_ALWAYS_INLINE c4::substr to_substr(std::string &s) noexcept { #if C4_CPP < 11 #error this function will have undefined behavior #endif // since c++11 it is legal to call s[s.size()]. return c4::substr(&s[0], s.size()); // NOLINT(readability-container-data-pointer) } /** get a readonly view to an existing std::string. * When the string is empty, the returned view will be pointing * at the character with value '\0', but the size will be zero. * @see https://en.cppreference.com/w/cpp/string/basic_string/operator_at */ C4_ALWAYS_INLINE c4::csubstr to_csubstr(std::string const& s) noexcept { #if C4_CPP < 11 #error this function will have undefined behavior #endif // since c++11 it is legal to call s[s.size()]. return c4::csubstr(&s[0], s.size()); // NOLINT(readability-container-data-pointer) } //----------------------------------------------------------------------------- C4_ALWAYS_INLINE bool operator== (c4::csubstr ss, std::string const& s) { return ss.compare(to_csubstr(s)) == 0; } C4_ALWAYS_INLINE bool operator!= (c4::csubstr ss, std::string const& s) { return ss.compare(to_csubstr(s)) != 0; } C4_ALWAYS_INLINE bool operator>= (c4::csubstr ss, std::string const& s) { return ss.compare(to_csubstr(s)) >= 0; } C4_ALWAYS_INLINE bool operator> (c4::csubstr ss, std::string const& s) { return ss.compare(to_csubstr(s)) > 0; } C4_ALWAYS_INLINE bool operator<= (c4::csubstr ss, std::string const& s) { return ss.compare(to_csubstr(s)) <= 0; } C4_ALWAYS_INLINE bool operator< (c4::csubstr ss, std::string const& s) { return ss.compare(to_csubstr(s)) < 0; } C4_ALWAYS_INLINE bool operator== (std::string const& s, c4::csubstr ss) { return ss.compare(to_csubstr(s)) == 0; } C4_ALWAYS_INLINE bool operator!= (std::string const& s, c4::csubstr ss) { return ss.compare(to_csubstr(s)) != 0; } C4_ALWAYS_INLINE bool operator>= (std::string const& s, c4::csubstr ss) { return ss.compare(to_csubstr(s)) <= 0; } C4_ALWAYS_INLINE bool operator> (std::string const& s, c4::csubstr ss) { return ss.compare(to_csubstr(s)) < 0; } C4_ALWAYS_INLINE bool operator<= (std::string const& s, c4::csubstr ss) { return ss.compare(to_csubstr(s)) >= 0; } C4_ALWAYS_INLINE bool operator< (std::string const& s, c4::csubstr ss) { return ss.compare(to_csubstr(s)) > 0; } //----------------------------------------------------------------------------- /** copy an std::string to a writeable string view */ inline size_t to_chars(c4::substr buf, std::string const& s) { C4_ASSERT(!buf.overlaps(to_csubstr(s))); size_t len = buf.len < s.size() ? buf.len : s.size(); // calling memcpy with null strings is undefined behavior // and will wreak havoc in calling code's branches. // see https://github.com/biojppm/rapidyaml/pull/264#issuecomment-1262133637 if(len) { C4_ASSERT(s.data() != nullptr); C4_ASSERT(buf.str != nullptr); memcpy(buf.str, s.data(), len); } return s.size(); // return the number of needed chars } /** copy a string view to an existing std::string */ inline bool from_chars(c4::csubstr buf, std::string * s) { s->resize(buf.len); C4_ASSERT(!buf.overlaps(to_csubstr(*s))); // calling memcpy with null strings is undefined behavior // and will wreak havoc in calling code's branches. // see https://github.com/biojppm/rapidyaml/pull/264#issuecomment-1262133637 if(buf.len) { C4_ASSERT(buf.str != nullptr); memcpy(&(*s)[0], buf.str, buf.len); // NOLINT(readability-container-data-pointer) } return true; } } // namespace c4 #endif // _C4_STD_STRING_HPP_ c4core-0.2.6/src/c4/std/string_fwd.hpp000066400000000000000000000037071477602032300174570ustar00rootroot00000000000000#ifndef _C4_STD_STRING_FWD_HPP_ #define _C4_STD_STRING_FWD_HPP_ /** @file string_fwd.hpp */ #ifndef DOXYGEN #ifndef C4CORE_SINGLE_HEADER #include "c4/substr_fwd.hpp" #endif #include // forward declarations for std::string #if defined(__GLIBCXX__) || defined(__GLIBCPP__) #include // use the fwd header in glibcxx #elif defined(_LIBCPP_VERSION) || defined(__APPLE_CC__) #include // use the fwd header in stdlibc++ #elif defined(_MSC_VER) #include "c4/error.hpp" //! @todo is there a fwd header in msvc? namespace std { C4_SUPPRESS_WARNING_MSVC_WITH_PUSH(4643) // Forward declaring 'char_traits' in namespace std is not permitted by the C++ Standard. template struct char_traits; template class allocator; template class basic_string; using string = basic_string, allocator>; C4_SUPPRESS_WARNING_MSVC_POP } /* namespace std */ #else #error "unknown standard library" #endif namespace c4 { c4::substr to_substr(std::string &s) noexcept; c4::csubstr to_csubstr(std::string const& s) noexcept; bool operator== (c4::csubstr ss, std::string const& s); bool operator!= (c4::csubstr ss, std::string const& s); bool operator>= (c4::csubstr ss, std::string const& s); bool operator> (c4::csubstr ss, std::string const& s); bool operator<= (c4::csubstr ss, std::string const& s); bool operator< (c4::csubstr ss, std::string const& s); bool operator== (std::string const& s, c4::csubstr ss); bool operator!= (std::string const& s, c4::csubstr ss); bool operator>= (std::string const& s, c4::csubstr ss); bool operator> (std::string const& s, c4::csubstr ss); bool operator<= (std::string const& s, c4::csubstr ss); bool operator< (std::string const& s, c4::csubstr ss); size_t to_chars(c4::substr buf, std::string const& s); bool from_chars(c4::csubstr buf, std::string * s); } // namespace c4 #endif // DOXYGEN #endif // _C4_STD_STRING_FWD_HPP_ c4core-0.2.6/src/c4/std/string_view.hpp000066400000000000000000000055251477602032300176510ustar00rootroot00000000000000#ifndef _C4_STD_STRING_VIEW_HPP_ #define _C4_STD_STRING_VIEW_HPP_ /** @file string_view.hpp */ #ifndef C4CORE_SINGLE_HEADER #include "c4/language.hpp" #endif #if (C4_CPP >= 17 && defined(__cpp_lib_string_view)) || defined(__DOXYGEN__) #ifndef C4CORE_SINGLE_HEADER #include "c4/substr.hpp" #endif #include namespace c4 { //----------------------------------------------------------------------------- /** create a csubstr from an existing std::string_view. */ C4_ALWAYS_INLINE c4::csubstr to_csubstr(std::string_view s) noexcept { return c4::csubstr(s.data(), s.size()); } //----------------------------------------------------------------------------- C4_ALWAYS_INLINE bool operator== (c4::csubstr ss, std::string_view s) { return ss.compare(s.data(), s.size()) == 0; } C4_ALWAYS_INLINE bool operator!= (c4::csubstr ss, std::string_view s) { return ss.compare(s.data(), s.size()) != 0; } C4_ALWAYS_INLINE bool operator>= (c4::csubstr ss, std::string_view s) { return ss.compare(s.data(), s.size()) >= 0; } C4_ALWAYS_INLINE bool operator> (c4::csubstr ss, std::string_view s) { return ss.compare(s.data(), s.size()) > 0; } C4_ALWAYS_INLINE bool operator<= (c4::csubstr ss, std::string_view s) { return ss.compare(s.data(), s.size()) <= 0; } C4_ALWAYS_INLINE bool operator< (c4::csubstr ss, std::string_view s) { return ss.compare(s.data(), s.size()) < 0; } C4_ALWAYS_INLINE bool operator== (std::string_view s, c4::csubstr ss) { return ss.compare(s.data(), s.size()) == 0; } C4_ALWAYS_INLINE bool operator!= (std::string_view s, c4::csubstr ss) { return ss.compare(s.data(), s.size()) != 0; } C4_ALWAYS_INLINE bool operator<= (std::string_view s, c4::csubstr ss) { return ss.compare(s.data(), s.size()) >= 0; } C4_ALWAYS_INLINE bool operator< (std::string_view s, c4::csubstr ss) { return ss.compare(s.data(), s.size()) > 0; } C4_ALWAYS_INLINE bool operator>= (std::string_view s, c4::csubstr ss) { return ss.compare(s.data(), s.size()) <= 0; } C4_ALWAYS_INLINE bool operator> (std::string_view s, c4::csubstr ss) { return ss.compare(s.data(), s.size()) < 0; } //----------------------------------------------------------------------------- /** copy an std::string_view to a writeable substr */ inline size_t to_chars(c4::substr buf, std::string_view s) { C4_ASSERT(!buf.overlaps(to_csubstr(s))); size_t sz = s.size(); size_t len = buf.len < sz ? buf.len : sz; // calling memcpy with null strings is undefined behavior // and will wreak havoc in calling code's branches. // see https://github.com/biojppm/rapidyaml/pull/264#issuecomment-1262133637 if(len) { C4_ASSERT(s.data() != nullptr); C4_ASSERT(buf.str != nullptr); memcpy(buf.str, s.data(), len); } return sz; // return the number of needed chars } } // namespace c4 #endif // C4_STRING_VIEW_AVAILABLE #endif // _C4_STD_STRING_VIEW_HPP_ c4core-0.2.6/src/c4/std/tuple.hpp000066400000000000000000000134741477602032300164440ustar00rootroot00000000000000#ifndef _C4_STD_TUPLE_HPP_ #define _C4_STD_TUPLE_HPP_ /** @file tuple.hpp */ #ifndef C4CORE_SINGLE_HEADER #include "c4/format.hpp" #endif #include /** this is a work in progress */ #undef C4_TUPLE_TO_CHARS namespace c4 { #ifdef C4_TUPLE_TO_CHARS namespace detail { template< size_t Curr, class... Types > struct tuple_helper { static size_t do_cat(substr buf, std::tuple< Types... > const& tp) { size_t num = to_chars(buf, std::get(tp)); buf = buf.len >= num ? buf.sub(num) : substr{}; num += tuple_helper< Curr+1, Types... >::do_cat(buf, tp); return num; } static size_t do_uncat(csubstr buf, std::tuple< Types... > & tp) { size_t num = from_str_trim(buf, &std::get(tp)); if(num == csubstr::npos) return csubstr::npos; buf = buf.len >= num ? buf.sub(num) : substr{}; num += tuple_helper< Curr+1, Types... >::do_uncat(buf, tp); return num; } template< class Sep > static size_t do_catsep_more(substr buf, Sep const& sep, std::tuple< Types... > const& tp) { size_t ret = to_chars(buf, sep), num = ret; buf = buf.len >= ret ? buf.sub(ret) : substr{}; ret = to_chars(buf, std::get(tp)); num += ret; buf = buf.len >= ret ? buf.sub(ret) : substr{}; ret = tuple_helper< Curr+1, Types... >::do_catsep_more(buf, sep, tp); num += ret; return num; } template< class Sep > static size_t do_uncatsep_more(csubstr buf, Sep & sep, std::tuple< Types... > & tp) { size_t ret = from_str_trim(buf, &sep), num = ret; if(ret == csubstr::npos) return csubstr::npos; buf = buf.len >= ret ? buf.sub(ret) : substr{}; ret = from_str_trim(buf, &std::get(tp)); if(ret == csubstr::npos) return csubstr::npos; num += ret; buf = buf.len >= ret ? buf.sub(ret) : substr{}; ret = tuple_helper< Curr+1, Types... >::do_uncatsep_more(buf, sep, tp); if(ret == csubstr::npos) return csubstr::npos; num += ret; return num; } static size_t do_format(substr buf, csubstr fmt, std::tuple< Types... > const& tp) { auto pos = fmt.find("{}"); if(pos != csubstr::npos) { size_t num = to_chars(buf, fmt.sub(0, pos)); size_t out = num; buf = buf.len >= num ? buf.sub(num) : substr{}; num = to_chars(buf, std::get(tp)); out += num; buf = buf.len >= num ? buf.sub(num) : substr{}; num = tuple_helper< Curr+1, Types... >::do_format(buf, fmt.sub(pos + 2), tp); out += num; return out; } else { return format(buf, fmt); } } static size_t do_unformat(csubstr buf, csubstr fmt, std::tuple< Types... > & tp) { auto pos = fmt.find("{}"); if(pos != csubstr::npos) { size_t num = pos; size_t out = num; buf = buf.len >= num ? buf.sub(num) : substr{}; num = from_str_trim(buf, &std::get(tp)); out += num; buf = buf.len >= num ? buf.sub(num) : substr{}; num = tuple_helper< Curr+1, Types... >::do_unformat(buf, fmt.sub(pos + 2), tp); out += num; return out; } else { return tuple_helper< sizeof...(Types), Types... >::do_unformat(buf, fmt, tp); } } }; /** @todo VS compilation fails for this class */ template< class... Types > struct tuple_helper< sizeof...(Types), Types... > { static size_t do_cat(substr /*buf*/, std::tuple const& /*tp*/) { return 0; } static size_t do_uncat(csubstr /*buf*/, std::tuple & /*tp*/) { return 0; } template< class Sep > static size_t do_catsep_more(substr /*buf*/, Sep const& /*sep*/, std::tuple const& /*tp*/) { return 0; } template< class Sep > static size_t do_uncatsep_more(csubstr /*buf*/, Sep & /*sep*/, std::tuple & /*tp*/) { return 0; } static size_t do_format(substr buf, csubstr fmt, std::tuple const& /*tp*/) { return to_chars(buf, fmt); } static size_t do_unformat(csubstr buf, csubstr fmt, std::tuple const& /*tp*/) { return 0; } }; } // namespace detail template< class... Types > inline size_t cat(substr buf, std::tuple< Types... > const& tp) { return detail::tuple_helper< 0, Types... >::do_cat(buf, tp); } template< class... Types > inline size_t uncat(csubstr buf, std::tuple< Types... > & tp) { return detail::tuple_helper< 0, Types... >::do_uncat(buf, tp); } template< class Sep, class... Types > inline size_t catsep(substr buf, Sep const& sep, std::tuple< Types... > const& tp) { size_t num = to_chars(buf, std::cref(std::get<0>(tp))); buf = buf.len >= num ? buf.sub(num) : substr{}; num += detail::tuple_helper< 1, Types... >::do_catsep_more(buf, sep, tp); return num; } template< class Sep, class... Types > inline size_t uncatsep(csubstr buf, Sep & sep, std::tuple< Types... > & tp) { size_t ret = from_str_trim(buf, &std::get<0>(tp)), num = ret; if(ret == csubstr::npos) return csubstr::npos; buf = buf.len >= ret ? buf.sub(ret) : substr{}; ret = detail::tuple_helper< 1, Types... >::do_uncatsep_more(buf, sep, tp); if(ret == csubstr::npos) return csubstr::npos; num += ret; return num; } template< class... Types > inline size_t format(substr buf, csubstr fmt, std::tuple< Types... > const& tp) { return detail::tuple_helper< 0, Types... >::do_format(buf, fmt, tp); } template< class... Types > inline size_t unformat(csubstr buf, csubstr fmt, std::tuple< Types... > & tp) { return detail::tuple_helper< 0, Types... >::do_unformat(buf, fmt, tp); } #endif // C4_TUPLE_TO_CHARS } // namespace c4 #endif /* _C4_STD_TUPLE_HPP_ */ c4core-0.2.6/src/c4/std/vector.hpp000066400000000000000000000100141477602032300166000ustar00rootroot00000000000000#ifndef _C4_STD_VECTOR_HPP_ #define _C4_STD_VECTOR_HPP_ /** @file vector.hpp provides conversion and comparison facilities * from/between std::vector to c4::substr and c4::csubstr. * @todo add to_span() and friends */ #ifndef C4CORE_SINGLE_HEADER #include "c4/substr.hpp" #endif #include namespace c4 { //----------------------------------------------------------------------------- /** get a substr (writeable string view) of an existing std::vector */ template c4::substr to_substr(std::vector &vec) { char *data = vec.empty() ? nullptr : vec.data(); // data() may or may not return a null pointer. return c4::substr(data, vec.size()); } /** get a csubstr (read-only string) view of an existing std::vector */ template c4::csubstr to_csubstr(std::vector const& vec) { const char *data = vec.empty() ? nullptr : vec.data(); // data() may or may not return a null pointer. return c4::csubstr(data, vec.size()); } //----------------------------------------------------------------------------- // comparisons between substrings and std::vector template C4_ALWAYS_INLINE bool operator!= (c4::csubstr ss, std::vector const& s) { return ss != to_csubstr(s); } template C4_ALWAYS_INLINE bool operator== (c4::csubstr ss, std::vector const& s) { return ss == to_csubstr(s); } template C4_ALWAYS_INLINE bool operator>= (c4::csubstr ss, std::vector const& s) { return ss >= to_csubstr(s); } template C4_ALWAYS_INLINE bool operator> (c4::csubstr ss, std::vector const& s) { return ss > to_csubstr(s); } template C4_ALWAYS_INLINE bool operator<= (c4::csubstr ss, std::vector const& s) { return ss <= to_csubstr(s); } template C4_ALWAYS_INLINE bool operator< (c4::csubstr ss, std::vector const& s) { return ss < to_csubstr(s); } template C4_ALWAYS_INLINE bool operator!= (std::vector const& s, c4::csubstr ss) { return ss != to_csubstr(s); } template C4_ALWAYS_INLINE bool operator== (std::vector const& s, c4::csubstr ss) { return ss == to_csubstr(s); } template C4_ALWAYS_INLINE bool operator>= (std::vector const& s, c4::csubstr ss) { return ss <= to_csubstr(s); } template C4_ALWAYS_INLINE bool operator> (std::vector const& s, c4::csubstr ss) { return ss < to_csubstr(s); } template C4_ALWAYS_INLINE bool operator<= (std::vector const& s, c4::csubstr ss) { return ss >= to_csubstr(s); } template C4_ALWAYS_INLINE bool operator< (std::vector const& s, c4::csubstr ss) { return ss > to_csubstr(s); } //----------------------------------------------------------------------------- /** copy a std::vector to a writeable string view */ template inline size_t to_chars(c4::substr buf, std::vector const& s) { C4_ASSERT(!buf.overlaps(to_csubstr(s))); size_t len = buf.len < s.size() ? buf.len : s.size(); // calling memcpy with null strings is undefined behavior // and will wreak havoc in calling code's branches. // see https://github.com/biojppm/rapidyaml/pull/264#issuecomment-1262133637 if(len > 0) { memcpy(buf.str, s.data(), len); } return s.size(); // return the number of needed chars } /** copy a string view to an existing std::vector */ template inline bool from_chars(c4::csubstr buf, std::vector * s) { s->resize(buf.len); C4_ASSERT(!buf.overlaps(to_csubstr(*s))); // calling memcpy with null strings is undefined behavior // and will wreak havoc in calling code's branches. // see https://github.com/biojppm/rapidyaml/pull/264#issuecomment-1262133637 if(buf.len > 0) { memcpy(&(*s)[0], buf.str, buf.len); // NOLINT(readability-container-data-pointer) } return true; } } // namespace c4 #endif // _C4_STD_VECTOR_HPP_ c4core-0.2.6/src/c4/std/vector_fwd.hpp000066400000000000000000000047201477602032300174470ustar00rootroot00000000000000#ifndef _C4_STD_VECTOR_FWD_HPP_ #define _C4_STD_VECTOR_FWD_HPP_ /** @file vector_fwd.hpp */ #include // NOLINTBEGIN(cert-dcl58-cpp) // forward declarations for std::vector #if defined(__GLIBCXX__) || defined(__GLIBCPP__) || defined(_MSC_VER) #if defined(_MSC_VER) __pragma(warning(push)) __pragma(warning(disable : 4643)) #endif namespace std { template class allocator; #ifdef _GLIBCXX_DEBUG inline namespace __debug { template class vector; } #else template class vector; #endif } // namespace std #if defined(_MSC_VER) __pragma(warning(pop)) #endif #elif defined(_LIBCPP_ABI_NAMESPACE) namespace std { inline namespace _LIBCPP_ABI_NAMESPACE { template class allocator; template class vector; } // namespace _LIBCPP_ABI_NAMESPACE } // namespace std #else #error "unknown standard library" #endif #ifndef C4CORE_SINGLE_HEADER #include "c4/substr_fwd.hpp" #endif namespace c4 { template c4::substr to_substr(std::vector &vec); template c4::csubstr to_csubstr(std::vector const& vec); template bool operator!= (c4::csubstr ss, std::vector const& s); template bool operator== (c4::csubstr ss, std::vector const& s); template bool operator>= (c4::csubstr ss, std::vector const& s); template bool operator> (c4::csubstr ss, std::vector const& s); template bool operator<= (c4::csubstr ss, std::vector const& s); template bool operator< (c4::csubstr ss, std::vector const& s); template bool operator!= (std::vector const& s, c4::csubstr ss); template bool operator== (std::vector const& s, c4::csubstr ss); template bool operator>= (std::vector const& s, c4::csubstr ss); template bool operator> (std::vector const& s, c4::csubstr ss); template bool operator<= (std::vector const& s, c4::csubstr ss); template bool operator< (std::vector const& s, c4::csubstr ss); template size_t to_chars(c4::substr buf, std::vector const& s); template bool from_chars(c4::csubstr buf, std::vector * s); } // namespace c4 // NOLINTEND(cert-dcl58-cpp) #endif // _C4_STD_VECTOR_FWD_HPP_ c4core-0.2.6/src/c4/substr.hpp000066400000000000000000002254571477602032300160510ustar00rootroot00000000000000#ifndef _C4_SUBSTR_HPP_ #define _C4_SUBSTR_HPP_ /** @file substr.hpp read+write string views */ #include #include #include #include "c4/config.hpp" #include "c4/error.hpp" #include "c4/substr_fwd.hpp" #ifdef __clang__ # pragma clang diagnostic push # pragma clang diagnostic ignored "-Wold-style-cast" #elif defined(__GNUC__) # pragma GCC diagnostic push # pragma GCC diagnostic ignored "-Wtype-limits" // disable warnings on size_t>=0, used heavily in assertions below. These assertions are a preparation step for providing the index type as a template parameter. # pragma GCC diagnostic ignored "-Wuseless-cast" # pragma GCC diagnostic ignored "-Wold-style-cast" #endif namespace c4 { /** @defgroup doc_substr Substring: read/write string views * @{ */ //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /** @cond dev */ namespace detail { template static inline void _do_reverse(C *C4_RESTRICT first, C *C4_RESTRICT last) { while(last > first) { C tmp = *last; *last-- = *first; *first++ = tmp; } } } // namespace detail /** @endcond */ //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /** @cond dev */ // utility macros to deuglify SFINAE code; undefined after the class. // https://stackoverflow.com/questions/43051882/how-to-disable-a-class-member-funrtion-for-certain-template-types #define C4_REQUIRE_RW(ret_type) \ template \ typename std::enable_if< ! std::is_const::value, ret_type>::type /** @endcond */ /** a non-owning string-view, consisting of a character pointer * and a length. * * @note The pointer is explicitly restricted. * * @see a [quickstart * sample](https://rapidyaml.readthedocs.io/latest/doxygen/group__doc__quickstart.html#ga43e253da0692c13967019446809c1113) * in rapidyaml's documentation. */ template struct C4CORE_EXPORT basic_substring // NOLINT(cppcoreguidelines-special-member-functions,hicpp-special-member-functions) { public: /** a restricted pointer to the first character of the substring */ C * C4_RESTRICT str; /** the length of the substring */ size_t len; public: /** @name Types */ /** @{ */ using CC = typename std::add_const::type; //!< CC=const char using NCC_ = typename std::remove_const::type; //!< NCC_=non const char using ro_substr = basic_substring; using rw_substr = basic_substring; using char_type = C; using size_type = size_t; using iterator = C*; using const_iterator = CC*; enum : size_t { npos = (size_t)-1, NONE = (size_t)-1 }; /// convert automatically to substring of const C template C4_ALWAYS_INLINE operator typename std::enable_if::value, ro_substr const&>::type () const noexcept { return *(ro_substr const*)this; // don't call the str+len ctor because it does a check } /** @} */ public: /** @name Default construction and assignment */ /** @{ */ C4_ALWAYS_INLINE constexpr basic_substring() noexcept : str(), len() {} C4_ALWAYS_INLINE basic_substring(basic_substring const&) noexcept = default; C4_ALWAYS_INLINE basic_substring(basic_substring &&) noexcept = default; C4_ALWAYS_INLINE basic_substring(std::nullptr_t) noexcept : str(nullptr), len(0) {} C4_ALWAYS_INLINE basic_substring& operator= (basic_substring const&) noexcept = default; C4_ALWAYS_INLINE basic_substring& operator= (basic_substring &&) noexcept = default; C4_ALWAYS_INLINE basic_substring& operator= (std::nullptr_t) noexcept { str = nullptr; len = 0; return *this; } C4_ALWAYS_INLINE void clear() noexcept { str = nullptr; len = 0; } /** @} */ public: /** @name Construction and assignment from characters with the same type */ /** @{ */ /** Construct from an array. * @warning the input string need not be zero terminated, but the * length is taken as if the string was zero terminated */ template C4_ALWAYS_INLINE constexpr basic_substring(C (&s_)[N]) noexcept : str(s_), len(N-1) {} /** Construct from a pointer and length. * @warning the input string need not be zero terminated. */ C4_ALWAYS_INLINE basic_substring(C *s_, size_t len_) noexcept : str(s_), len(len_) { C4_ASSERT(str || !len_); } /** Construct from two pointers. * @warning the end pointer MUST BE larger than or equal to the begin pointer * @warning the input string need not be zero terminated */ C4_ALWAYS_INLINE basic_substring(C *beg_, C *end_) noexcept : str(beg_), len(static_cast(end_ - beg_)) { C4_ASSERT(end_ >= beg_); } /** Construct from a C-string (zero-terminated string) * @warning the input string MUST BE zero terminated. * @warning will call strlen() * @note this overload uses SFINAE to prevent it from overriding the array ctor * @see For a more detailed explanation on why the plain overloads cannot * coexist, see http://cplusplus.bordoon.com/specializeForCharacterArrays.html */ template::value || std::is_same::value, int>::type=0> C4_ALWAYS_INLINE basic_substring(U s_) noexcept : str(s_), len(s_ ? strlen(s_) : 0) {} /** Assign from an array. * @warning the input string need not be zero terminated, but the * length is taken as if the string was zero terminated */ template C4_ALWAYS_INLINE void assign(C (&s_)[N]) noexcept { str = (s_); len = (N-1); } /** Assign from a pointer and length. * @warning the input string need not be zero terminated. */ C4_ALWAYS_INLINE void assign(C *s_, size_t len_) noexcept { str = s_; len = len_; C4_ASSERT(str || !len_); } /** Assign from two pointers. * @warning the end pointer MUST BE larger than or equal to the begin pointer * @warning the input string need not be zero terminated. */ C4_ALWAYS_INLINE void assign(C *beg_, C *end_) noexcept { C4_ASSERT(end_ >= beg_); str = (beg_); len = static_cast(end_ - beg_); } /** Assign from a C-string (zero-terminated string) * @warning the input string must be zero terminated. * @warning will call strlen() * @note this overload uses SFINAE to prevent it from overriding the array ctor * @see For a more detailed explanation on why the plain overloads cannot * coexist, see http://cplusplus.bordoon.com/specializeForCharacterArrays.html */ template::value || std::is_same::value, int>::type=0> C4_ALWAYS_INLINE void assign(U s_) noexcept { str = (s_); len = (s_ ? strlen(s_) : 0); } /** Assign from an array. * @warning the input string need not be zero terminated. */ template C4_ALWAYS_INLINE basic_substring& operator= (C (&s_)[N]) noexcept { str = (s_); len = (N-1); return *this; } /** Assign from a C-string (zero-terminated string) * @warning the input string MUST BE zero terminated. * @warning will call strlen() * @note this overload uses SFINAE to prevent it from overriding the array ctor * @see For a more detailed explanation on why the plain overloads cannot * coexist, see http://cplusplus.bordoon.com/specializeForCharacterArrays.html */ template::value || std::is_same::value, int>::type=0> C4_ALWAYS_INLINE basic_substring& operator= (U s_) noexcept { str = s_; len = s_ ? strlen(s_) : 0; return *this; } /** @} */ public: /** @name Standard accessor methods */ /** @{ */ C4_ALWAYS_INLINE C4_PURE bool has_str() const noexcept { return ! empty() && str[0] != C(0); } C4_ALWAYS_INLINE C4_PURE bool empty() const noexcept { return (len == 0 || str == nullptr); } C4_ALWAYS_INLINE C4_PURE bool not_empty() const noexcept { return (len != 0 && str != nullptr); } C4_ALWAYS_INLINE C4_PURE size_t size() const noexcept { return len; } C4_ALWAYS_INLINE C4_PURE iterator begin() noexcept { return str; } C4_ALWAYS_INLINE C4_PURE iterator end () noexcept { return str + len; } C4_ALWAYS_INLINE C4_PURE const_iterator begin() const noexcept { return str; } C4_ALWAYS_INLINE C4_PURE const_iterator end () const noexcept { return str + len; } C4_ALWAYS_INLINE C4_PURE C * data() noexcept { return str; } C4_ALWAYS_INLINE C4_PURE C const* data() const noexcept { return str; } C4_ALWAYS_INLINE C4_PURE C & operator[] (size_t i) noexcept { C4_ASSERT(i >= 0 && i < len); return str[i]; } C4_ALWAYS_INLINE C4_PURE C const& operator[] (size_t i) const noexcept { C4_ASSERT(i >= 0 && i < len); return str[i]; } C4_ALWAYS_INLINE C4_PURE C & front() noexcept { C4_ASSERT(len > 0 && str != nullptr); return *str; } C4_ALWAYS_INLINE C4_PURE C const& front() const noexcept { C4_ASSERT(len > 0 && str != nullptr); return *str; } C4_ALWAYS_INLINE C4_PURE C & back() noexcept { C4_ASSERT(len > 0 && str != nullptr); return *(str + len - 1); } C4_ALWAYS_INLINE C4_PURE C const& back() const noexcept { C4_ASSERT(len > 0 && str != nullptr); return *(str + len - 1); } /** @} */ public: /** @name Comparison methods */ /** @{ */ C4_PURE int compare(C const c) const noexcept { C4_XASSERT((str != nullptr) || len == 0); if(C4_LIKELY(str != nullptr && len > 0)) return (*str != c) ? *str - c : (static_cast(len) - 1); else return -1; } C4_PURE int compare(const char *C4_RESTRICT that, size_t sz) const noexcept { C4_XASSERT(that || sz == 0); C4_XASSERT(str || len == 0); if(C4_LIKELY(str && that)) { { const size_t min = len < sz ? len : sz; for(size_t i = 0; i < min; ++i) if(str[i] != that[i]) return str[i] < that[i] ? -1 : 1; } if(len < sz) return -1; else if(len == sz) return 0; else return 1; } else if(len == sz) { C4_XASSERT(len == 0 && sz == 0); return 0; } return len < sz ? -1 : 1; } C4_ALWAYS_INLINE C4_PURE int compare(ro_substr const that) const noexcept { return this->compare(that.str, that.len); } C4_ALWAYS_INLINE C4_PURE bool operator== (std::nullptr_t) const noexcept { return str == nullptr; } C4_ALWAYS_INLINE C4_PURE bool operator!= (std::nullptr_t) const noexcept { return str != nullptr; } C4_ALWAYS_INLINE C4_PURE bool operator== (C const c) const noexcept { return this->compare(c) == 0; } C4_ALWAYS_INLINE C4_PURE bool operator!= (C const c) const noexcept { return this->compare(c) != 0; } C4_ALWAYS_INLINE C4_PURE bool operator< (C const c) const noexcept { return this->compare(c) < 0; } C4_ALWAYS_INLINE C4_PURE bool operator> (C const c) const noexcept { return this->compare(c) > 0; } C4_ALWAYS_INLINE C4_PURE bool operator<= (C const c) const noexcept { return this->compare(c) <= 0; } C4_ALWAYS_INLINE C4_PURE bool operator>= (C const c) const noexcept { return this->compare(c) >= 0; } template C4_ALWAYS_INLINE C4_PURE bool operator== (basic_substring const that) const noexcept { return this->compare(that) == 0; } template C4_ALWAYS_INLINE C4_PURE bool operator!= (basic_substring const that) const noexcept { return this->compare(that) != 0; } template C4_ALWAYS_INLINE C4_PURE bool operator< (basic_substring const that) const noexcept { return this->compare(that) < 0; } template C4_ALWAYS_INLINE C4_PURE bool operator> (basic_substring const that) const noexcept { return this->compare(that) > 0; } template C4_ALWAYS_INLINE C4_PURE bool operator<= (basic_substring const that) const noexcept { return this->compare(that) <= 0; } template C4_ALWAYS_INLINE C4_PURE bool operator>= (basic_substring const that) const noexcept { return this->compare(that) >= 0; } template C4_ALWAYS_INLINE C4_PURE bool operator== (const char (&that)[N]) const noexcept { return this->compare(that, N-1) == 0; } template C4_ALWAYS_INLINE C4_PURE bool operator!= (const char (&that)[N]) const noexcept { return this->compare(that, N-1) != 0; } template C4_ALWAYS_INLINE C4_PURE bool operator< (const char (&that)[N]) const noexcept { return this->compare(that, N-1) < 0; } template C4_ALWAYS_INLINE C4_PURE bool operator> (const char (&that)[N]) const noexcept { return this->compare(that, N-1) > 0; } template C4_ALWAYS_INLINE C4_PURE bool operator<= (const char (&that)[N]) const noexcept { return this->compare(that, N-1) <= 0; } template C4_ALWAYS_INLINE C4_PURE bool operator>= (const char (&that)[N]) const noexcept { return this->compare(that, N-1) >= 0; } /** @} */ public: /** @name Sub-selection methods */ /** @{ */ /** true if *this is a substring of that (ie, from the same buffer) */ C4_ALWAYS_INLINE C4_PURE bool is_sub(ro_substr const that) const noexcept { return that.is_super(*this); } /** true if that is a substring of *this (ie, from the same buffer) */ C4_ALWAYS_INLINE C4_PURE bool is_super(ro_substr const that) const noexcept { if(C4_LIKELY(len > 0)) return that.str >= str && that.str+that.len <= str+len; else return that.len == 0 && that.str == str && str != nullptr; } /** true if there is overlap of at least one element between that and *this */ C4_ALWAYS_INLINE C4_PURE bool overlaps(ro_substr const that) const noexcept { // thanks @timwynants return that.str+that.len > str && that.str < str+len; } public: /** return [first,len[ */ C4_ALWAYS_INLINE C4_PURE basic_substring sub(size_t first) const noexcept { C4_ASSERT(first >= 0 && first <= len); return basic_substring(str + first, len - first); } /** return [first,first+num[. If num==npos, return [first,len[ */ C4_ALWAYS_INLINE C4_PURE basic_substring sub(size_t first, size_t num) const noexcept { C4_ASSERT(first >= 0 && first <= len); C4_ASSERT((num >= 0 && num <= len) || (num == npos)); size_t rnum = num != npos ? num : len - first; C4_ASSERT((first >= 0 && first + rnum <= len) || (num == 0)); return basic_substring(str + first, rnum); } /** return [first,last[. If last==npos, return [first,len[ */ C4_ALWAYS_INLINE C4_PURE basic_substring range(size_t first, size_t last=npos) const noexcept { C4_ASSERT(first >= 0 && first <= len); last = last != npos ? last : len; C4_ASSERT(first <= last); C4_ASSERT(last >= 0 && last <= len); return basic_substring(str + first, last - first); } /** return the first @p num elements: [0,num[*/ C4_ALWAYS_INLINE C4_PURE basic_substring first(size_t num) const noexcept { C4_ASSERT(num <= len || num == npos); return basic_substring(str, num != npos ? num : len); } /** return the last @p num elements: [len-num,len[*/ C4_ALWAYS_INLINE C4_PURE basic_substring last(size_t num) const noexcept { C4_ASSERT(num <= len || num == npos); return num != npos ? basic_substring(str + len - num, num) : *this; } /** offset from the ends: return [left,len-right[ ; ie, trim a number of characters from the left and right. This is equivalent to python's negative list indices. */ C4_ALWAYS_INLINE C4_PURE basic_substring offs(size_t left, size_t right) const noexcept { C4_ASSERT(left >= 0 && left <= len); C4_ASSERT(right >= 0 && right <= len); C4_ASSERT(left <= len - right + 1); return basic_substring(str + left, len - right - left); } /** return [0, pos[ . Same as .first(pos), but provided for compatibility with .right_of() */ C4_ALWAYS_INLINE C4_PURE basic_substring left_of(size_t pos) const noexcept { C4_ASSERT(pos <= len || pos == npos); return (pos != npos) ? basic_substring(str, pos) : *this; } /** return [0, pos+include_pos[ . Same as .first(pos+1), but provided for compatibility with .right_of() */ C4_ALWAYS_INLINE C4_PURE basic_substring left_of(size_t pos, bool include_pos) const noexcept { C4_ASSERT(pos <= len || pos == npos); return (pos != npos) ? basic_substring(str, pos+include_pos) : *this; } /** return [pos+1, len[ */ C4_ALWAYS_INLINE C4_PURE basic_substring right_of(size_t pos) const noexcept { C4_ASSERT(pos <= len || pos == npos); return (pos != npos) ? basic_substring(str + (pos + 1), len - (pos + 1)) : basic_substring(str + len, size_t(0)); } /** return [pos+!include_pos, len[ */ C4_ALWAYS_INLINE C4_PURE basic_substring right_of(size_t pos, bool include_pos) const noexcept { C4_ASSERT(pos <= len || pos == npos); return (pos != npos) ? basic_substring(str + (pos + !include_pos), len - (pos + !include_pos)) : basic_substring(str + len, size_t(0)); } public: /** given @p subs a substring of the current string, get the * portion of the current string to the left of it */ C4_ALWAYS_INLINE C4_PURE basic_substring left_of(ro_substr const subs) const noexcept { C4_ASSERT(is_super(subs) || subs.empty()); auto ssb = subs.begin(); auto b = begin(); auto e = end(); if(ssb >= b && ssb <= e) return sub(0, static_cast(ssb - b)); else return sub(0, 0); } /** given @p subs a substring of the current string, get the * portion of the current string to the right of it */ C4_ALWAYS_INLINE C4_PURE basic_substring right_of(ro_substr const subs) const noexcept { C4_ASSERT(is_super(subs) || subs.empty()); auto sse = subs.end(); auto b = begin(); auto e = end(); if(sse >= b && sse <= e) return sub(static_cast(sse - b), static_cast(e - sse)); else return sub(0, 0); } /** @} */ public: /** @name Removing characters (trim()) / patterns (strip()) from the tips of the string */ /** @{ */ /** trim left */ basic_substring triml(const C c) const { if( ! empty()) { size_t pos = first_not_of(c); if(pos != npos) return sub(pos); } return sub(0, 0); } /** trim left ANY of the characters. * @see stripl() to remove a pattern from the left */ basic_substring triml(ro_substr chars) const { if( ! empty()) { size_t pos = first_not_of(chars); if(pos != npos) return sub(pos); } return sub(0, 0); } /** trim the character c from the right */ basic_substring trimr(const C c) const { if( ! empty()) { size_t pos = last_not_of(c, npos); if(pos != npos) return sub(0, pos+1); } return sub(0, 0); } /** trim right ANY of the characters * @see stripr() to remove a pattern from the right */ basic_substring trimr(ro_substr chars) const { if( ! empty()) { size_t pos = last_not_of(chars, npos); if(pos != npos) return sub(0, pos+1); } return sub(0, 0); } /** trim the character c left and right */ basic_substring trim(const C c) const { return triml(c).trimr(c); } /** trim left and right ANY of the characters * @see strip() to remove a pattern from the left and right */ basic_substring trim(ro_substr const chars) const { return triml(chars).trimr(chars); } /** remove a pattern from the left * @see triml() to remove characters*/ basic_substring stripl(ro_substr pattern) const { if( ! begins_with(pattern)) return *this; return sub(pattern.len < len ? pattern.len : len); } /** remove a pattern from the right * @see trimr() to remove characters*/ basic_substring stripr(ro_substr pattern) const { if( ! ends_with(pattern)) return *this; return left_of(len - (pattern.len < len ? pattern.len : len)); } /** @} */ public: /** @name Lookup methods */ /** @{ */ size_t find(const C c, size_t start_pos=0) const { return first_of(c, start_pos); } size_t find(ro_substr pattern, size_t start_pos=0) const { C4_ASSERT(start_pos == npos || (start_pos >= 0 && start_pos <= len)); if(len < pattern.len) return npos; for(size_t i = start_pos, e = len - pattern.len + 1; i < e; ++i) { bool gotit = true; for(size_t j = 0; j < pattern.len; ++j) { C4_ASSERT(i + j < len); if(str[i + j] != pattern.str[j]) { gotit = false; break; } } if(gotit) { return i; } } return npos; } public: /** count the number of occurrences of c */ size_t count(const C c, size_t pos=0) const { C4_ASSERT(pos >= 0 && pos <= len); size_t num = 0; pos = find(c, pos); while(pos != npos) { ++num; pos = find(c, pos + 1); } return num; } /** count the number of occurrences of s */ size_t count(ro_substr c, size_t pos=0) const { C4_ASSERT(pos >= 0 && pos <= len); size_t num = 0; pos = find(c, pos); while(pos != npos) { ++num; pos = find(c, pos + c.len); } return num; } /** get the substr consisting of the first occurrence of @p c after @p pos, or an empty substr if none occurs */ basic_substring select(const C c, size_t pos=0) const { pos = find(c, pos); return pos != npos ? sub(pos, 1) : basic_substring(); } /** get the substr consisting of the first occurrence of @p pattern after @p pos, or an empty substr if none occurs */ basic_substring select(ro_substr pattern, size_t pos=0) const { pos = find(pattern, pos); return pos != npos ? sub(pos, pattern.len) : basic_substring(); } public: struct first_of_any_result { size_t which; size_t pos; operator bool() const { return which != NONE && pos != npos; } }; first_of_any_result first_of_any(ro_substr s0, ro_substr s1) const { ro_substr s[2] = {s0, s1}; return first_of_any_iter(&s[0], &s[0] + 2); } first_of_any_result first_of_any(ro_substr s0, ro_substr s1, ro_substr s2) const { ro_substr s[3] = {s0, s1, s2}; return first_of_any_iter(&s[0], &s[0] + 3); } first_of_any_result first_of_any(ro_substr s0, ro_substr s1, ro_substr s2, ro_substr s3) const { ro_substr s[4] = {s0, s1, s2, s3}; return first_of_any_iter(&s[0], &s[0] + 4); } first_of_any_result first_of_any(ro_substr s0, ro_substr s1, ro_substr s2, ro_substr s3, ro_substr s4) const { ro_substr s[5] = {s0, s1, s2, s3, s4}; return first_of_any_iter(&s[0], &s[0] + 5); } template first_of_any_result first_of_any_iter(It first_span, It last_span) const { for(size_t i = 0; i < len; ++i) { size_t curr = 0; for(It it = first_span; it != last_span; ++curr, ++it) { auto const& chars = *it; if((i + chars.len) > len) continue; bool gotit = true; for(size_t j = 0; j < chars.len; ++j) { C4_ASSERT(i + j < len); if(str[i + j] != chars[j]) { gotit = false; break; } } if(gotit) { return {curr, i}; } } } return {NONE, npos}; } public: /** true if the first character of the string is @p c */ bool begins_with(const C c) const { return len > 0 ? str[0] == c : false; } /** true if the first @p num characters of the string are @p c */ bool begins_with(const C c, size_t num) const { if(len < num) { return false; } for(size_t i = 0; i < num; ++i) { if(str[i] != c) { return false; } } return true; } /** true if the string begins with the given @p pattern */ bool begins_with(ro_substr pattern) const { if(len < pattern.len) { return false; } for(size_t i = 0; i < pattern.len; ++i) { if(str[i] != pattern[i]) { return false; } } return true; } /** true if the first character of the string is any of the given @p chars */ bool begins_with_any(ro_substr chars) const { if(len == 0) { return false; } for(size_t i = 0; i < chars.len; ++i) { if(str[0] == chars.str[i]) { return true; } } return false; } /** true if the last character of the string is @p c */ bool ends_with(const C c) const { return len > 0 ? str[len-1] == c : false; } /** true if the last @p num characters of the string are @p c */ bool ends_with(const C c, size_t num) const { if(len < num) { return false; } for(size_t i = len - num; i < len; ++i) { if(str[i] != c) { return false; } } return true; } /** true if the string ends with the given @p pattern */ bool ends_with(ro_substr pattern) const { if(len < pattern.len) { return false; } for(size_t i = 0, s = len-pattern.len; i < pattern.len; ++i) { if(str[s+i] != pattern[i]) { return false; } } return true; } /** true if the last character of the string is any of the given @p chars */ bool ends_with_any(ro_substr chars) const { if(len == 0) { return false; } for(size_t i = 0; i < chars.len; ++i) { if(str[len - 1] == chars[i]) { return true; } } return false; } public: /** @return the first position where c is found in the string, or npos if none is found */ size_t first_of(const C c, size_t start=0) const { C4_ASSERT(start == npos || (start >= 0 && start <= len)); for(size_t i = start; i < len; ++i) { if(str[i] == c) return i; } return npos; } /** @return the last position where c is found in the string, or npos if none is found */ size_t last_of(const C c, size_t start=npos) const { C4_ASSERT(start == npos || (start >= 0 && start <= len)); if(start == npos) start = len; for(size_t i = start-1; i != size_t(-1); --i) { if(str[i] == c) return i; } return npos; } /** @return the first position where ANY of the chars is found in the string, or npos if none is found */ size_t first_of(ro_substr chars, size_t start=0) const { C4_ASSERT(start == npos || (start >= 0 && start <= len)); for(size_t i = start; i < len; ++i) { for(size_t j = 0; j < chars.len; ++j) { if(str[i] == chars[j]) return i; } } return npos; } /** @return the last position where ANY of the chars is found in the string, or npos if none is found */ size_t last_of(ro_substr chars, size_t start=npos) const { C4_ASSERT(start == npos || (start >= 0 && start <= len)); if(start == npos) start = len; for(size_t i = start-1; i != size_t(-1); --i) { for(size_t j = 0; j < chars.len; ++j) { if(str[i] == chars[j]) return i; } } return npos; } public: size_t first_not_of(const C c) const { for(size_t i = 0; i < len; ++i) { if(str[i] != c) return i; } return npos; } size_t first_not_of(const C c, size_t start) const { C4_ASSERT((start >= 0 && start <= len) || (start == len && len == 0)); for(size_t i = start; i < len; ++i) { if(str[i] != c) return i; } return npos; } size_t last_not_of(const C c) const { for(size_t i = len-1; i != size_t(-1); --i) { if(str[i] != c) return i; } return npos; } size_t last_not_of(const C c, size_t start) const { C4_ASSERT(start == npos || (start >= 0 && start <= len)); if(start == npos) start = len; for(size_t i = start-1; i != size_t(-1); --i) { if(str[i] != c) return i; } return npos; } size_t first_not_of(ro_substr chars) const { for(size_t i = 0; i < len; ++i) { bool gotit = true; for(size_t j = 0; j < chars.len; ++j) { if(str[i] == chars.str[j]) { gotit = false; break; } } if(gotit) { return i; } } return npos; } size_t first_not_of(ro_substr chars, size_t start) const { C4_ASSERT((start >= 0 && start <= len) || (start == len && len == 0)); for(size_t i = start; i < len; ++i) { bool gotit = true; for(size_t j = 0; j < chars.len; ++j) { if(str[i] == chars.str[j]) { gotit = false; break; } } if(gotit) { return i; } } return npos; } size_t last_not_of(ro_substr chars) const { for(size_t i = len-1; i != size_t(-1); --i) { bool gotit = true; for(size_t j = 0; j < chars.len; ++j) { if(str[i] == chars.str[j]) { gotit = false; break; } } if(gotit) { return i; } } return npos; } size_t last_not_of(ro_substr chars, size_t start) const { C4_ASSERT(start == npos || (start >= 0 && start <= len)); if(start == npos) start = len; for(size_t i = start-1; i != size_t(-1); --i) { bool gotit = true; for(size_t j = 0; j < chars.len; ++j) { if(str[i] == chars.str[j]) { gotit = false; break; } } if(gotit) { return i; } } return npos; } /** @} */ public: /** @name Range lookup methods */ /** @{ */ /** get the range delimited by an open-close pair of characters. * @note There must be no nested pairs. * @note No checks for escapes are performed. */ basic_substring pair_range(CC open, CC close) const { size_t b = find(open); if(b == npos) return basic_substring(); size_t e = find(close, b+1); if(e == npos) return basic_substring(); basic_substring ret = range(b, e+1); C4_ASSERT(ret.sub(1).find(open) == npos); return ret; } /** get the range delimited by a single open-close character (eg, quotes). * @note The open-close character can be escaped. */ basic_substring pair_range_esc(CC open_close, CC escape=CC('\\')) { size_t b = find(open_close); if(b == npos) return basic_substring(); for(size_t i = b+1; i < len; ++i) { CC c = str[i]; if(c == open_close) { if(str[i-1] != escape) { return range(b, i+1); } } } return basic_substring(); } /** get the range delimited by an open-close pair of characters, * with possibly nested occurrences. No checks for escapes are * performed. */ basic_substring pair_range_nested(CC open, CC close) const { size_t b = find(open); if(b == npos) return basic_substring(); size_t e, curr = b+1, count = 0; const char both[] = {open, close, '\0'}; while((e = first_of(both, curr)) != npos) { if(str[e] == open) { ++count; curr = e+1; } else if(str[e] == close) { if(count == 0) return range(b, e+1); --count; curr = e+1; } } return basic_substring(); } basic_substring unquoted() const { constexpr const C dq('"'), sq('\''); if(len >= 2 && (str[len - 2] != C('\\')) && ((begins_with(sq) && ends_with(sq)) || (begins_with(dq) && ends_with(dq)))) { return range(1, len -1); } return *this; } /** @} */ public: /** @name Number-matching query methods */ /** @{ */ /** @return true if the substring contents are a floating-point or integer number. * @note any leading or trailing whitespace will return false. */ bool is_number() const { if(empty() || (first_non_empty_span().empty())) return false; if(first_uint_span() == *this) return true; if(first_int_span() == *this) return true; if(first_real_span() == *this) return true; return false; } /** @return true if the substring contents are a real number. * @note any leading or trailing whitespace will return false. */ bool is_real() const { if(empty() || (first_non_empty_span().empty())) return false; if(first_real_span() == *this) return true; return false; } /** @return true if the substring contents are an integer number. * @note any leading or trailing whitespace will return false. */ bool is_integer() const { if(empty() || (first_non_empty_span().empty())) return false; if(first_uint_span() == *this) return true; if(first_int_span() == *this) return true; return false; } /** @return true if the substring contents are an unsigned integer number. * @note any leading or trailing whitespace will return false. */ bool is_unsigned_integer() const { if(empty() || (first_non_empty_span().empty())) return false; if(first_uint_span() == *this) return true; return false; } /** get the first span consisting exclusively of non-empty characters */ basic_substring first_non_empty_span() const { constexpr const ro_substr empty_chars(" \n\r\t"); size_t pos = first_not_of(empty_chars); if(pos == npos) return first(0); auto ret = sub(pos); pos = ret.first_of(empty_chars); return ret.first(pos); } /** get the first span which can be interpreted as an unsigned integer */ basic_substring first_uint_span() const { basic_substring ne = first_non_empty_span(); if(ne.empty()) return ne; if(ne.str[0] == '-') return first(0); size_t skip_start = size_t(ne.str[0] == '+'); return ne._first_integral_span(skip_start); } /** get the first span which can be interpreted as a signed integer */ basic_substring first_int_span() const { basic_substring ne = first_non_empty_span(); if(ne.empty()) return ne; size_t skip_start = size_t(ne.str[0] == '+' || ne.str[0] == '-'); return ne._first_integral_span(skip_start); } basic_substring _first_integral_span(size_t skip_start) const { C4_ASSERT(!empty()); if(skip_start == len) return first(0); C4_ASSERT(skip_start < len); if(len >= skip_start + 3) { if(str[skip_start] != '0') { for(size_t i = skip_start; i < len; ++i) { char c = str[i]; if(c < '0' || c > '9') return i > skip_start && _is_delim_char(c) ? first(i) : first(0); } } else { char next = str[skip_start + 1]; if(next == 'x' || next == 'X') { skip_start += 2; for(size_t i = skip_start; i < len; ++i) { const char c = str[i]; if( ! _is_hex_char(c)) return i > skip_start && _is_delim_char(c) ? first(i) : first(0); } return *this; } else if(next == 'b' || next == 'B') { skip_start += 2; for(size_t i = skip_start; i < len; ++i) { const char c = str[i]; if(c != '0' && c != '1') return i > skip_start && _is_delim_char(c) ? first(i) : first(0); } return *this; } else if(next == 'o' || next == 'O') { skip_start += 2; for(size_t i = skip_start; i < len; ++i) { const char c = str[i]; if(c < '0' || c > '7') return i > skip_start && _is_delim_char(c) ? first(i) : first(0); } return *this; } } } // must be a decimal, or it is not a an number for(size_t i = skip_start; i < len; ++i) { const char c = str[i]; if(c < '0' || c > '9') return i > skip_start && _is_delim_char(c) ? first(i) : first(0); } return *this; } /** get the first span which can be interpreted as a real (floating-point) number */ basic_substring first_real_span() const { basic_substring ne = first_non_empty_span(); if(ne.empty()) return ne; const size_t skip_start = (ne.str[0] == '+' || ne.str[0] == '-'); C4_ASSERT(skip_start == 0 || skip_start == 1); // if we have at least three digits after the leading sign, it // can be decimal, or hex, or bin or oct. Ex: // non-decimal: 0x0, 0b0, 0o0 // decimal: 1.0, 10., 1e1, 100, inf, nan, infinity if(ne.len >= skip_start+3) { // if it does not have leading 0, it must be decimal, or it is not a real if(ne.str[skip_start] != '0') { if(ne.str[skip_start] == 'i') // is it infinity or inf? { basic_substring word = ne._word_follows(skip_start + 1, "nfinity"); if(word.len) return word; return ne._word_follows(skip_start + 1, "nf"); } else if(ne.str[skip_start] == 'n') // is it nan? { return ne._word_follows(skip_start + 1, "an"); } else // must be a decimal, or it is not a real { return ne._first_real_span_dec(skip_start); } } else // starts with 0. is it 0x, 0b or 0o? { const char next = ne.str[skip_start + 1]; // hexadecimal if(next == 'x' || next == 'X') return ne._first_real_span_hex(skip_start + 2); // binary else if(next == 'b' || next == 'B') return ne._first_real_span_bin(skip_start + 2); // octal else if(next == 'o' || next == 'O') return ne._first_real_span_oct(skip_start + 2); // none of the above. may still be a decimal. else return ne._first_real_span_dec(skip_start); // do not skip the 0. } } // less than 3 chars after the leading sign. It is either a // decimal or it is not a real. (cannot be any of 0x0, etc). return ne._first_real_span_dec(skip_start); } /** true if the character is a delimiter character *at the end* */ static constexpr C4_ALWAYS_INLINE C4_CONST bool _is_delim_char(char c) noexcept { return c == ' ' || c == '\n' || c == ']' || c == ')' || c == '}' || c == ',' || c == ';' || c == '\r' || c == '\t' || c == '\0'; } /** true if the character is in [0-9a-fA-F] */ static constexpr C4_ALWAYS_INLINE C4_CONST bool _is_hex_char(char c) noexcept { return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F'); } C4_NO_INLINE C4_PURE basic_substring _word_follows(size_t pos, csubstr word) const noexcept { size_t posend = pos + word.len; if(len >= posend && sub(pos, word.len) == word) if(len == posend || _is_delim_char(str[posend])) return first(posend); return first(0); } // this function is declared inside the class to avoid a VS error with __declspec(dllimport) C4_NO_INLINE C4_PURE basic_substring _first_real_span_dec(size_t pos) const noexcept { bool intchars = false; bool fracchars = false; bool powchars; // integral part for( ; pos < len; ++pos) { const char c = str[pos]; if(c >= '0' && c <= '9') { intchars = true; } else if(c == '.') { ++pos; goto fractional_part_dec; // NOLINT } else if(c == 'e' || c == 'E') { ++pos; goto power_part_dec; // NOLINT } else if(_is_delim_char(c)) { return intchars ? first(pos) : first(0); } else { return first(0); } } // no . or p were found; this is either an integral number // or not a number at all return intchars ? *this : first(0); fractional_part_dec: C4_ASSERT(pos > 0); C4_ASSERT(str[pos - 1] == '.'); for( ; pos < len; ++pos) { const char c = str[pos]; if(c >= '0' && c <= '9') { fracchars = true; } else if(c == 'e' || c == 'E') { ++pos; goto power_part_dec; // NOLINT } else if(_is_delim_char(c)) { return intchars || fracchars ? first(pos) : first(0); } else { return first(0); } } return intchars || fracchars ? *this : first(0); power_part_dec: C4_ASSERT(pos > 0); C4_ASSERT(str[pos - 1] == 'e' || str[pos - 1] == 'E'); // either digits, or +, or - are expected here, followed by more digits. if((len == pos) || ((!intchars) && (!fracchars))) return first(0); if(str[pos] == '-' || str[pos] == '+') ++pos; // skip the sign powchars = false; for( ; pos < len; ++pos) { const char c = str[pos]; if(c >= '0' && c <= '9') powchars = true; else if(powchars && _is_delim_char(c)) return first(pos); else return first(0); } return powchars ? *this : first(0); } // this function is declared inside the class to avoid a VS error with __declspec(dllimport) C4_NO_INLINE C4_PURE basic_substring _first_real_span_hex(size_t pos) const noexcept { bool intchars = false; bool fracchars = false; bool powchars; // integral part for( ; pos < len; ++pos) { const char c = str[pos]; if(_is_hex_char(c)) { intchars = true; } else if(c == '.') { ++pos; goto fractional_part_hex; // NOLINT } else if(c == 'p' || c == 'P') { ++pos; goto power_part_hex; // NOLINT } else if(_is_delim_char(c)) { return intchars ? first(pos) : first(0); } else { return first(0); } } // no . or p were found; this is either an integral number // or not a number at all return intchars ? *this : first(0); fractional_part_hex: C4_ASSERT(pos > 0); C4_ASSERT(str[pos - 1] == '.'); for( ; pos < len; ++pos) { const char c = str[pos]; if(_is_hex_char(c)) { fracchars = true; } else if(c == 'p' || c == 'P') { ++pos; goto power_part_hex; // NOLINT } else if(_is_delim_char(c)) { return intchars || fracchars ? first(pos) : first(0); } else { return first(0); } } return intchars || fracchars ? *this : first(0); power_part_hex: C4_ASSERT(pos > 0); C4_ASSERT(str[pos - 1] == 'p' || str[pos - 1] == 'P'); // either a + or a - is expected here, followed by more chars. // also, using (pos+1) in this check will cause an early // return when no more chars follow the sign. if(len <= (pos+1) || (str[pos] != '+' && str[pos] != '-') || ((!intchars) && (!fracchars))) return first(0); ++pos; // this was the sign. // ... so the (pos+1) ensures that we enter the loop and // hence that there exist chars in the power part powchars = false; for( ; pos < len; ++pos) { const char c = str[pos]; if(c >= '0' && c <= '9') powchars = true; else if(powchars && _is_delim_char(c)) return first(pos); else return first(0); } return *this; } // this function is declared inside the class to avoid a VS error with __declspec(dllimport) C4_NO_INLINE C4_PURE basic_substring _first_real_span_bin(size_t pos) const noexcept { bool intchars = false; bool fracchars = false; bool powchars; // integral part for( ; pos < len; ++pos) { const char c = str[pos]; if(c == '0' || c == '1') { intchars = true; } else if(c == '.') { ++pos; goto fractional_part_bin; // NOLINT } else if(c == 'p' || c == 'P') { ++pos; goto power_part_bin; // NOLINT } else if(_is_delim_char(c)) { return intchars ? first(pos) : first(0); } else { return first(0); } } // no . or p were found; this is either an integral number // or not a number at all return intchars ? *this : first(0); fractional_part_bin: C4_ASSERT(pos > 0); C4_ASSERT(str[pos - 1] == '.'); for( ; pos < len; ++pos) { const char c = str[pos]; if(c == '0' || c == '1') { fracchars = true; } else if(c == 'p' || c == 'P') { ++pos; goto power_part_bin; // NOLINT } else if(_is_delim_char(c)) { return intchars || fracchars ? first(pos) : first(0); } else { return first(0); } } return intchars || fracchars ? *this : first(0); power_part_bin: C4_ASSERT(pos > 0); C4_ASSERT(str[pos - 1] == 'p' || str[pos - 1] == 'P'); // either a + or a - is expected here, followed by more chars. // also, using (pos+1) in this check will cause an early // return when no more chars follow the sign. if(len <= (pos+1) || (str[pos] != '+' && str[pos] != '-') || ((!intchars) && (!fracchars))) return first(0); ++pos; // this was the sign. // ... so the (pos+1) ensures that we enter the loop and // hence that there exist chars in the power part powchars = false; for( ; pos < len; ++pos) { const char c = str[pos]; if(c >= '0' && c <= '9') powchars = true; else if(powchars && _is_delim_char(c)) return first(pos); else return first(0); } return *this; } // this function is declared inside the class to avoid a VS error with __declspec(dllimport) C4_NO_INLINE C4_PURE basic_substring _first_real_span_oct(size_t pos) const noexcept { bool intchars = false; bool fracchars = false; bool powchars; // integral part for( ; pos < len; ++pos) { const char c = str[pos]; if(c >= '0' && c <= '7') { intchars = true; } else if(c == '.') { ++pos; goto fractional_part_oct; // NOLINT } else if(c == 'p' || c == 'P') { ++pos; goto power_part_oct; // NOLINT } else if(_is_delim_char(c)) { return intchars ? first(pos) : first(0); } else { return first(0); } } // no . or p were found; this is either an integral number // or not a number at all return intchars ? *this : first(0); fractional_part_oct: C4_ASSERT(pos > 0); C4_ASSERT(str[pos - 1] == '.'); for( ; pos < len; ++pos) { const char c = str[pos]; if(c >= '0' && c <= '7') { fracchars = true; } else if(c == 'p' || c == 'P') { ++pos; goto power_part_oct; // NOLINT } else if(_is_delim_char(c)) { return intchars || fracchars ? first(pos) : first(0); } else { return first(0); } } return intchars || fracchars ? *this : first(0); power_part_oct: C4_ASSERT(pos > 0); C4_ASSERT(str[pos - 1] == 'p' || str[pos - 1] == 'P'); // either a + or a - is expected here, followed by more chars. // also, using (pos+1) in this check will cause an early // return when no more chars follow the sign. if(len <= (pos+1) || (str[pos] != '+' && str[pos] != '-') || ((!intchars) && (!fracchars))) return first(0); ++pos; // this was the sign. // ... so the (pos+1) ensures that we enter the loop and // hence that there exist chars in the power part powchars = false; for( ; pos < len; ++pos) { const char c = str[pos]; if(c >= '0' && c <= '9') powchars = true; else if(powchars && _is_delim_char(c)) return first(pos); else return first(0); } return *this; } /** @} */ public: /** @name Splitting methods */ /** @{ */ /** returns true if the string has not been exhausted yet, meaning * it's ok to call next_split() again. When no instance of sep * exists in the string, returns the full string. When the input * is an empty string, the output string is the empty string. */ bool next_split(C sep, size_t *C4_RESTRICT start_pos, basic_substring *C4_RESTRICT out) const { if(C4_LIKELY(*start_pos < len)) { for(size_t i = *start_pos; i < len; i++) { if(str[i] == sep) { out->assign(str + *start_pos, i - *start_pos); *start_pos = i+1; return true; } } out->assign(str + *start_pos, len - *start_pos); *start_pos = len + 1; return true; } else { bool valid = len > 0 && (*start_pos == len); if(valid && str && str[len-1] == sep) { out->assign(str + len, size_t(0)); // the cast is needed to prevent overload ambiguity } else { out->assign(str + len + 1, size_t(0)); // the cast is needed to prevent overload ambiguity } *start_pos = len + 1; return valid; } } private: struct split_proxy_impl { struct split_iterator_impl { split_proxy_impl const* m_proxy; basic_substring m_str; size_t m_pos; NCC_ m_sep; split_iterator_impl(split_proxy_impl const* proxy, size_t pos, C sep) : m_proxy(proxy), m_pos(pos), m_sep(sep) { _tick(); } void _tick() { m_proxy->m_str.next_split(m_sep, &m_pos, &m_str); } split_iterator_impl& operator++ () { _tick(); return *this; } split_iterator_impl operator++ (int) { split_iterator_impl it = *this; _tick(); return it; } // NOLINT basic_substring& operator* () { return m_str; } basic_substring* operator-> () { return &m_str; } bool operator!= (split_iterator_impl const& that) const { return !(this->operator==(that)); } bool operator== (split_iterator_impl const& that) const { C4_XASSERT((m_sep == that.m_sep) && "cannot compare split iterators with different separators"); if(m_str.size() != that.m_str.size()) return false; if(m_str.data() != that.m_str.data()) return false; return m_pos == that.m_pos; } }; basic_substring m_str; size_t m_start_pos; C m_sep; split_proxy_impl(basic_substring str_, size_t start_pos, C sep) : m_str(str_), m_start_pos(start_pos), m_sep(sep) { } split_iterator_impl begin() const { auto it = split_iterator_impl(this, m_start_pos, m_sep); return it; } split_iterator_impl end() const { size_t pos = m_str.size() + 1; auto it = split_iterator_impl(this, pos, m_sep); return it; } }; public: using split_proxy = split_proxy_impl; /** a view into the splits */ split_proxy split(C sep, size_t start_pos=0) const { C4_XASSERT((start_pos >= 0 && start_pos < len) || empty()); auto ss = sub(0, len); auto it = split_proxy(ss, start_pos, sep); return it; } public: /** pop right: return the first split from the right. Use * gpop_left() to get the reciprocal part. */ basic_substring pop_right(C sep=C('/'), bool skip_empty=false) const { if(C4_LIKELY(len > 1)) { auto pos = last_of(sep); if(pos != npos) { if(pos + 1 < len) // does not end with sep { return sub(pos + 1); // return from sep to end } else // the string ends with sep { if( ! skip_empty) { return sub(pos + 1, 0); } auto ppos = last_not_of(sep); // skip repeated seps if(ppos == npos) // the string is all made of seps { return sub(0, 0); } // find the previous sep auto pos0 = last_of(sep, ppos); if(pos0 == npos) // only the last sep exists { return sub(0); // return the full string (because skip_empty is true) } ++pos0; return sub(pos0); } } else // no sep was found, return the full string { return *this; } } else if(len == 1) { if(begins_with(sep)) { return sub(0, 0); } return *this; } else // an empty string { return basic_substring(); } } /** return the first split from the left. Use gpop_right() to get * the reciprocal part. */ basic_substring pop_left(C sep = C('/'), bool skip_empty=false) const { if(C4_LIKELY(len > 1)) { auto pos = first_of(sep); if(pos != npos) { if(pos > 0) // does not start with sep { return sub(0, pos); // return everything up to it } else // the string starts with sep { if( ! skip_empty) { return sub(0, 0); } auto ppos = first_not_of(sep); // skip repeated seps if(ppos == npos) // the string is all made of seps { return sub(0, 0); } // find the next sep auto pos0 = first_of(sep, ppos); if(pos0 == npos) // only the first sep exists { return sub(0); // return the full string (because skip_empty is true) } C4_XASSERT(pos0 > 0); // return everything up to the second sep return sub(0, pos0); } } else // no sep was found, return the full string { return sub(0); } } else if(len == 1) { if(begins_with(sep)) { return sub(0, 0); } return sub(0); } else // an empty string { return basic_substring(); } } public: /** greedy pop left. eg, csubstr("a/b/c").gpop_left('/')="c" */ basic_substring gpop_left(C sep = C('/'), bool skip_empty=false) const { auto ss = pop_right(sep, skip_empty); ss = left_of(ss); if(ss.find(sep) != npos) { if(ss.ends_with(sep)) { if(skip_empty) { ss = ss.trimr(sep); } else { ss = ss.sub(0, ss.len-1); // safe to subtract because ends_with(sep) is true } } } return ss; } /** greedy pop right. eg, csubstr("a/b/c").gpop_right('/')="a" */ basic_substring gpop_right(C sep = C('/'), bool skip_empty=false) const { auto ss = pop_left(sep, skip_empty); ss = right_of(ss); if(ss.find(sep) != npos) { if(ss.begins_with(sep)) { if(skip_empty) { ss = ss.triml(sep); } else { ss = ss.sub(1); } } } return ss; } /** @} */ public: /** @name Path-like manipulation methods */ /** @{ */ basic_substring basename(C sep=C('/')) const { auto ss = pop_right(sep, /*skip_empty*/true); ss = ss.trimr(sep); return ss; } basic_substring dirname(C sep=C('/')) const { auto ss = basename(sep); ss = ss.empty() ? *this : left_of(ss); return ss; } C4_ALWAYS_INLINE basic_substring name_wo_extshort() const { return gpop_left('.'); } C4_ALWAYS_INLINE basic_substring name_wo_extlong() const { return pop_left('.'); } C4_ALWAYS_INLINE basic_substring extshort() const { return pop_right('.'); } C4_ALWAYS_INLINE basic_substring extlong() const { return gpop_right('.'); } /** @} */ public: /** @name Content-modification methods (only for non-const C) */ /** @{ */ /** convert the string to upper-case * @note this method requires that the string memory is writeable and is SFINAEd out for const C */ C4_REQUIRE_RW(void) toupper() { for(size_t i = 0; i < len; ++i) { str[i] = static_cast(::toupper(str[i])); } } /** convert the string to lower-case * @note this method requires that the string memory is writeable and is SFINAEd out for const C */ C4_REQUIRE_RW(void) tolower() { for(size_t i = 0; i < len; ++i) { str[i] = static_cast(::tolower(str[i])); } } public: /** fill the entire contents with the given @p val * @note this method requires that the string memory is writeable and is SFINAEd out for const C */ C4_REQUIRE_RW(void) fill(C val) { for(size_t i = 0; i < len; ++i) { str[i] = val; } } public: /** set the current substring to a copy of the given csubstr * @note this method requires that the string memory is writeable and is SFINAEd out for const C */ C4_REQUIRE_RW(void) copy_from(ro_substr that, size_t ifirst=0, size_t num=npos) { C4_ASSERT(ifirst >= 0 && ifirst <= len); num = num != npos ? num : len - ifirst; num = num < that.len ? num : that.len; C4_ASSERT(ifirst + num >= 0 && ifirst + num <= len); // calling memcpy with null strings is undefined behavior // and will wreak havoc in calling code's branches. // see https://github.com/biojppm/rapidyaml/pull/264#issuecomment-1262133637 if(num) memcpy(str + sizeof(C) * ifirst, that.str, sizeof(C) * num); } public: /** reverse in place * @note this method requires that the string memory is writeable and is SFINAEd out for const C */ C4_REQUIRE_RW(void) reverse() { if(len == 0) return; detail::_do_reverse(str, str + len - 1); } /** revert a subpart in place * @note this method requires that the string memory is writeable and is SFINAEd out for const C */ C4_REQUIRE_RW(void) reverse_sub(size_t ifirst, size_t num) { C4_ASSERT(ifirst >= 0 && ifirst <= len); C4_ASSERT(ifirst + num >= 0 && ifirst + num <= len); if(num == 0) return; detail::_do_reverse(str + ifirst, str + ifirst + num - 1); } /** revert a range in place * @note this method requires that the string memory is writeable and is SFINAEd out for const C */ C4_REQUIRE_RW(void) reverse_range(size_t ifirst, size_t ilast) { C4_ASSERT(ifirst >= 0 && ifirst <= len); C4_ASSERT(ilast >= 0 && ilast <= len); if(ifirst == ilast) return; detail::_do_reverse(str + ifirst, str + ilast - 1); } public: /** erase part of the string. eg, with char s[] = "0123456789", * substr(s).erase(3, 2) = "01256789", and s is now "01245678989" * @note this method requires that the string memory is writeable and is SFINAEd out for const C */ C4_REQUIRE_RW(basic_substring) erase(size_t pos, size_t num) { C4_ASSERT(pos >= 0 && pos+num <= len); size_t num_to_move = len - pos - num; memmove(str + pos, str + pos + num, sizeof(C) * num_to_move); return basic_substring{str, len - num}; } /** @note this method requires that the string memory is writeable and is SFINAEd out for const C */ C4_REQUIRE_RW(basic_substring) erase_range(size_t first, size_t last) { C4_ASSERT(first <= last); return erase(first, static_cast(last-first)); // NOLINT } /** erase a part of the string. * @note @p sub must be a substring of this string * @note this method requires that the string memory is writeable and is SFINAEd out for const C */ C4_REQUIRE_RW(basic_substring) erase(ro_substr sub) { C4_ASSERT(is_super(sub)); C4_ASSERT(sub.str >= str); return erase(static_cast(sub.str - str), sub.len); } public: /** replace every occurrence of character @p value with the character @p repl * @return the number of characters that were replaced * @note this method requires that the string memory is writeable and is SFINAEd out for const C */ C4_REQUIRE_RW(size_t) replace(C value, C repl, size_t pos=0) { C4_ASSERT((pos >= 0 && pos <= len) || pos == npos); size_t did_it = 0; while((pos = find(value, pos)) != npos) { str[pos++] = repl; ++did_it; } return did_it; } /** replace every occurrence of each character in @p value with * the character @p repl. * @return the number of characters that were replaced * @note this method requires that the string memory is writeable and is SFINAEd out for const C */ C4_REQUIRE_RW(size_t) replace(ro_substr chars, C repl, size_t pos=0) { C4_ASSERT((pos >= 0 && pos <= len) || pos == npos); size_t did_it = 0; while((pos = first_of(chars, pos)) != npos) { str[pos++] = repl; ++did_it; } return did_it; } /** replace @p pattern with @p repl, and write the result into * @p dst. pattern and repl don't need equal sizes. * * @return the required size for dst. No overflow occurs if * dst.len is smaller than the required size; this can be used to * determine the required size for an existing container. */ size_t replace_all(rw_substr dst, ro_substr pattern, ro_substr repl, size_t pos=0) const { C4_ASSERT( ! pattern.empty()); //!< @todo relax this precondition C4_ASSERT( ! this ->overlaps(dst)); //!< @todo relax this precondition C4_ASSERT( ! pattern.overlaps(dst)); C4_ASSERT( ! repl .overlaps(dst)); C4_ASSERT((pos >= 0 && pos <= len) || pos == npos); C4_SUPPRESS_WARNING_GCC_PUSH C4_SUPPRESS_WARNING_GCC("-Warray-bounds") // gcc11 has a false positive here #if (!defined(__clang__)) && (defined(__GNUC__) && (__GNUC__ >= 7)) C4_SUPPRESS_WARNING_GCC("-Wstringop-overflow") // gcc11 has a false positive here #endif #define _c4append(first, last) \ { \ C4_ASSERT((last) >= (first)); \ size_t num = static_cast((last) - (first)); \ if(num > 0 && sz + num <= dst.len) \ { \ memcpy(dst.str + sz, first, num * sizeof(C)); \ } \ sz += num; \ } size_t sz = 0; size_t b = pos; _c4append(str, str + pos); do { size_t e = find(pattern, b); if(e == npos) { _c4append(str + b, str + len); break; } _c4append(str + b, str + e); _c4append(repl.begin(), repl.end()); b = e + pattern.size(); } while(b < len && b != npos); return sz; #undef _c4append C4_SUPPRESS_WARNING_GCC_POP } /** @} */ }; // template class basic_substring #undef C4_REQUIRE_RW //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /** @defgroup doc_substr_adapters substr adapters * * to_substr() and to_csubstr() is used in generic code like * format(), and allow adding construction of substrings from new * types like containers. * @{ */ /** neutral version for use in generic code */ C4_ALWAYS_INLINE substr to_substr(substr s) noexcept { return s; } /** neutral version for use in generic code */ C4_ALWAYS_INLINE csubstr to_csubstr(substr s) noexcept { return s; } /** neutral version for use in generic code */ C4_ALWAYS_INLINE csubstr to_csubstr(csubstr s) noexcept { return s; } template C4_ALWAYS_INLINE substr to_substr(char (&s)[N]) noexcept { substr ss(s, N-1); return ss; } template C4_ALWAYS_INLINE csubstr to_csubstr(const char (&s)[N]) noexcept { csubstr ss(s, N-1); return ss; } /** @note this overload uses SFINAE to prevent it from overriding the array overload * @see For a more detailed explanation on why the plain overloads cannot * coexist, see http://cplusplus.bordoon.com/specializeForCharacterArrays.html */ template C4_ALWAYS_INLINE typename std::enable_if::value, substr>::type to_substr(U s) noexcept { substr ss(s); return ss; } /** @note this overload uses SFINAE to prevent it from overriding the array overload * @see For a more detailed explanation on why the plain overloads cannot * coexist, see http://cplusplus.bordoon.com/specializeForCharacterArrays.html */ template C4_ALWAYS_INLINE typename std::enable_if::value || std::is_same::value, csubstr>::type to_csubstr(U s) noexcept { csubstr ss(s); return ss; } /** @} */ //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /** @defgroup doc_substr_cmp substr comparison operators * @{ */ template inline bool operator== (const char (&s)[N], basic_substring const that) noexcept { return that.compare(s, N-1) == 0; } template inline bool operator!= (const char (&s)[N], basic_substring const that) noexcept { return that.compare(s, N-1) != 0; } template inline bool operator< (const char (&s)[N], basic_substring const that) noexcept { return that.compare(s, N-1) > 0; } template inline bool operator> (const char (&s)[N], basic_substring const that) noexcept { return that.compare(s, N-1) < 0; } template inline bool operator<= (const char (&s)[N], basic_substring const that) noexcept { return that.compare(s, N-1) >= 0; } template inline bool operator>= (const char (&s)[N], basic_substring const that) noexcept { return that.compare(s, N-1) <= 0; } template inline bool operator== (const char c, basic_substring const that) noexcept { return that.compare(c) == 0; } template inline bool operator!= (const char c, basic_substring const that) noexcept { return that.compare(c) != 0; } template inline bool operator< (const char c, basic_substring const that) noexcept { return that.compare(c) > 0; } template inline bool operator> (const char c, basic_substring const that) noexcept { return that.compare(c) < 0; } template inline bool operator<= (const char c, basic_substring const that) noexcept { return that.compare(c) >= 0; } template inline bool operator>= (const char c, basic_substring const that) noexcept { return that.compare(c) <= 0; } /** @} */ //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /* C4_SUBSTR_NO_OSTREAM_LSHIFT doctest does not deal well with * template operator<< * @see https://github.com/onqtam/doctest/pull/431 */ #ifndef C4_SUBSTR_NO_OSTREAM_LSHIFT #ifdef __clang__ # pragma clang diagnostic push # pragma clang diagnostic ignored "-Wsign-conversion" #elif defined(__GNUC__) # pragma GCC diagnostic push # pragma GCC diagnostic ignored "-Wsign-conversion" #endif /** output the string to a stream */ template inline OStream& operator<< (OStream& os, basic_substring s) { os.write(s.str, s.len); return os; } // this causes ambiguity ///** this is used by google test */ //template //inline void PrintTo(basic_substring s, OStream* os) //{ // os->write(s.str, s.len); //} #ifdef __clang__ # pragma clang diagnostic pop #elif defined(__GNUC__) # pragma GCC diagnostic pop #endif #endif // !C4_SUBSTR_NO_OSTREAM_LSHIFT /** @} */ } // namespace c4 #ifdef __clang__ # pragma clang diagnostic pop #elif defined(__GNUC__) # pragma GCC diagnostic pop #endif #endif /* _C4_SUBSTR_HPP_ */ c4core-0.2.6/src/c4/substr_fwd.hpp000066400000000000000000000005241477602032300166730ustar00rootroot00000000000000#ifndef _C4_SUBSTR_FWD_HPP_ #define _C4_SUBSTR_FWD_HPP_ #include "c4/export.hpp" namespace c4 { #ifndef DOXYGEN template struct basic_substring; using csubstr = C4CORE_EXPORT basic_substring; using substr = C4CORE_EXPORT basic_substring; #endif // !DOXYGEN } // namespace c4 #endif /* _C4_SUBSTR_FWD_HPP_ */ c4core-0.2.6/src/c4/szconv.hpp000066400000000000000000000035601477602032300160360ustar00rootroot00000000000000#ifndef _C4_SZCONV_HPP_ #define _C4_SZCONV_HPP_ /** @file szconv.hpp utilities to deal safely with narrowing conversions */ #include "c4/config.hpp" #include "c4/error.hpp" #include namespace c4 { C4_SUPPRESS_WARNING_GCC_CLANG_WITH_PUSH("-Wold-style-cast") /** @todo this would be so much easier with calls to numeric_limits::max()... */ template struct is_narrower_size : std::conditional < (std::is_signed::value == std::is_signed::value) ? (sizeof(SizeOut) < sizeof(SizeIn)) : ( (sizeof(SizeOut) < sizeof(SizeIn)) || ( (sizeof(SizeOut) == sizeof(SizeIn)) && (std::is_signed::value && std::is_unsigned::value) ) ), std::true_type, std::false_type >::type { static_assert(std::is_integral::value, "must be integral type"); static_assert(std::is_integral::value, "must be integral type"); }; /** when SizeOut is wider than SizeIn, assignment can occur without reservations */ template C4_ALWAYS_INLINE typename std::enable_if< ! is_narrower_size::value, SizeOut>::type szconv(SizeIn sz) noexcept { return static_cast(sz); } /** when SizeOut is narrower than SizeIn, narrowing will occur, so we check * for overflow. Note that this check is done only if C4_XASSERT is enabled. * @see C4_XASSERT */ template C4_ALWAYS_INLINE typename std::enable_if::value, SizeOut>::type szconv(SizeIn sz) { C4_XASSERT(sz >= 0); C4_XASSERT_MSG((SizeIn)sz <= (SizeIn)std::numeric_limits::max(), "size conversion overflow: in=%zu", (size_t)sz); SizeOut szo = static_cast(sz); return szo; } C4_SUPPRESS_WARNING_GCC_CLANG_POP } // namespace c4 #endif /* _C4_SZCONV_HPP_ */ c4core-0.2.6/src/c4/type_name.hpp000066400000000000000000000065211477602032300164750ustar00rootroot00000000000000#ifndef _C4_TYPENAME_HPP_ #define _C4_TYPENAME_HPP_ /** @file type_name.hpp compile-time type name */ #include "c4/span.hpp" #include "c4/compiler.hpp" /// @cond dev struct _c4t { const char *str; size_t sz; template constexpr _c4t(const char (&s)[N]) : str(s), sz(N-1) {} // take off the \0 }; // this is a more abbreviated way of getting the type name // (if we used span in the return type, the name would involve // templates and would create longer type name strings, // as well as larger differences between compilers) template C4_CONSTEXPR14 C4_ALWAYS_INLINE _c4t _c4tn() { auto p = _c4t(C4_PRETTY_FUNC); return p; } /// @endcond namespace c4 { /** compile-time type name * @see http://stackoverflow.com/a/20170989/5875572 */ template C4_CONSTEXPR14 cspan type_name() { const _c4t p = _c4tn(); #if (0) // enable this to debug and find the offsets for(size_t index = 0; index < p.sz; ++index) printf(" %2c", p.str[index]); printf("\n"); for(size_t index = 0; index < p.sz; ++index) printf(" %2zu", index); printf("\n"); #endif #if defined(_MSC_VER) # if defined(__clang__) // Visual Studio has the clang toolset # if (_MSC_VER >= 1930) // do not use this: defined(C4_MSVC_2022) // ..............................xxx. // _c4t __cdecl _c4tn(void) [T = int] enum : size_t { tstart = 30, tend = 1}; # else // example: // ..........................xxx. // _c4t __cdecl _c4tn() [T = int] enum : size_t { tstart = 26, tend = 1}; # endif # elif defined(C4_MSVC_2015) || defined(C4_MSVC_2017) || defined(C4_MSVC_2019) || defined(C4_MSVC_2022) // Note: subtract 7 at the end because the function terminates with ">(void)" in VS2015+ cspan::size_type tstart = 26, tend = 7; const char *C4_RESTRICT s = p.str + tstart; // look at the start // we're not using strcmp() or memcmp() to spare the #include // does it start with 'class '? if(p.sz > 6 && s[0] == 'c' && s[1] == 'l' && s[2] == 'a' && s[3] == 's' && s[4] == 's' && s[5] == ' ') { tstart += 6; } // does it start with 'struct '? else if(p.sz > 7 && s[0] == 's' && s[1] == 't' && s[2] == 'r' && s[3] == 'u' && s[4] == 'c' && s[5] == 't' && s[6] == ' ') { tstart += 7; } # else C4_NOT_IMPLEMENTED(); # endif #elif defined(__ICC) // example: // ........................xxx. // "_c4t _c4tn() [with T = int]" enum : size_t { tstart = 23, tend = 1}; #elif defined(__clang__) // example: // ...................xxx. // "_c4t _c4tn() [T = int]" enum : size_t { tstart = 18, tend = 1}; #elif defined(__GNUC__) #if __GNUC__ >= 7 && C4_CPP >= 14 // example: // ..................................xxx. // "constexpr _c4t _c4tn() [with T = int]" enum : size_t { tstart = 33, tend = 1 }; #else // example: // ........................xxx. // "_c4t _c4tn() [with T = int]" enum : size_t { tstart = 23, tend = 1 }; #endif #else C4_NOT_IMPLEMENTED(); #endif cspan o(p.str + tstart, p.sz - tstart - tend); return o; } /** compile-time type name * @overload */ template C4_CONSTEXPR14 C4_ALWAYS_INLINE cspan type_name(T const&) { return type_name(); } } // namespace c4 #endif //_C4_TYPENAME_HPP_ c4core-0.2.6/src/c4/types.hpp000066400000000000000000000450301477602032300156560ustar00rootroot00000000000000#ifndef _C4_TYPES_HPP_ #define _C4_TYPES_HPP_ #include #include #include #if __cplusplus >= 201103L #include // for integer_sequence and friends #endif #include "c4/preprocessor.hpp" #include "c4/language.hpp" /** @file types.hpp basic types, and utility macros and traits for types. * @ingroup basic_headers */ /** @defgroup types Type utilities */ // NOLINTBEGIN(bugprone-macro-parentheses) namespace c4 { /** @defgroup intrinsic_types Intrinsic types * @ingroup types * @{ */ using cbyte = const char; /**< a constant byte */ using byte = char; /**< a mutable byte */ using i8 = int8_t; using i16 = int16_t; using i32 = int32_t; using i64 = int64_t; using u8 = uint8_t; using u16 = uint16_t; using u32 = uint32_t; using u64 = uint64_t; using f32 = float; using f64 = double; using ssize_t = typename std::make_signed::type; /** @} */ //-------------------------------------------------- /** @defgroup utility_types Utility types * @ingroup types * @{ */ // some tag types #if !defined(__clang__) && defined(__GNUC__) #pragma GCC diagnostic push #if __GNUC__ >= 6 #pragma GCC diagnostic ignored "-Wunused-const-variable" #endif #endif /** a tag type for initializing the containers with variadic arguments a la * initializer_list, minus the initializer_list overload problems. */ struct aggregate_t {}; /** @see aggregate_t */ constexpr const aggregate_t aggregate{}; /** a tag type for specifying the initial capacity of allocatable contiguous storage */ struct with_capacity_t {}; /** @see with_capacity_t */ constexpr const with_capacity_t with_capacity{}; /** a tag type for disambiguating template parameter packs in variadic template overloads */ struct varargs_t {}; /** @see with_capacity_t */ constexpr const varargs_t varargs{}; #if !defined(__clang__) && defined(__GNUC__) #pragma GCC diagnostic pop #endif //-------------------------------------------------- /** whether a value should be used in place of a const-reference in argument passing. */ template struct cref_uses_val { enum { value = ( std::is_scalar::value || ( #if C4_CPP >= 20 (std::is_trivially_copyable::value && std::is_standard_layout::value) #else std::is_pod::value #endif && sizeof(T) <= sizeof(size_t))) }; }; /** utility macro to override the default behaviour for c4::fastcref @see fastcref */ #define C4_CREF_USES_VAL(T) \ template<> \ struct cref_uses_val \ { \ enum { value = true }; \ }; /** Whether to use pass-by-value or pass-by-const-reference in a function argument * or return type. */ template using fastcref = typename std::conditional::value, T, T const&>::type; //-------------------------------------------------- /** Just what its name says. Useful sometimes as a default empty policy class. */ struct EmptyStruct // NOLINT { template EmptyStruct(T && ...){} // NOLINT }; /** Just what its name says. Useful sometimes as a default policy class to * be inherited from. */ struct EmptyStructVirtual // NOLINT { virtual ~EmptyStructVirtual() = default; template EmptyStructVirtual(T && ...){} // NOLINT }; /** */ template struct inheritfrom : public T {}; //-------------------------------------------------- // Utilities to make a class obey size restrictions (eg, min size or size multiple of). // DirectX usually makes this restriction with uniform buffers. // This is also useful for padding to prevent false-sharing. /** how many bytes must be added to size such that the result is at least minsize? */ C4_ALWAYS_INLINE constexpr size_t min_remainder(size_t size, size_t minsize) noexcept { return size < minsize ? minsize-size : 0; } /** how many bytes must be added to size such that the result is a multiple of multipleof? */ C4_ALWAYS_INLINE constexpr size_t mult_remainder(size_t size, size_t multipleof) noexcept { return (((size % multipleof) != 0) ? (multipleof-(size % multipleof)) : 0); } /* force the following class to be tightly packed. */ #pragma pack(push, 1) /** pad a class with more bytes at the end. * @see http://stackoverflow.com/questions/21092415/force-c-structure-to-pack-tightly */ template struct Padded : public T { using T::T; using T::operator=; Padded(T const& val) : T(val) {} Padded(T && val) : T(std::forward(val)) {} // NOLINT char ___c4padspace___[BytesToPadAtEnd]; }; #pragma pack(pop) /** When the padding argument is 0, we cannot declare the char[] array. */ template struct Padded : public T { using T::T; using T::operator=; Padded(T const& val) : T(val) {} Padded(T && val) : T(std::forward(val)) {} // NOLINT }; /** make T have a size which is at least Min bytes */ template using MinSized = Padded; /** make T have a size which is a multiple of Mult bytes */ template using MultSized = Padded; /** make T have a size which is simultaneously: * -bigger or equal than Min * -a multiple of Mult */ template using MinMultSized = MultSized, Mult>; /** make T be suitable for use as a uniform buffer. (at least with DirectX). */ template using UbufSized = MinMultSized; //----------------------------------------------------------------------------- #define C4_NO_COPY_CTOR(ty) ty(ty const&) = delete #define C4_NO_MOVE_CTOR(ty) ty(ty &&) = delete #define C4_NO_COPY_ASSIGN(ty) ty& operator=(ty const&) = delete #define C4_NO_MOVE_ASSIGN(ty) ty& operator=(ty &&) = delete #define C4_DEFAULT_COPY_CTOR(ty) ty(ty const&) noexcept = default #define C4_DEFAULT_MOVE_CTOR(ty) ty(ty &&) noexcept = default #define C4_DEFAULT_COPY_ASSIGN(ty) ty& operator=(ty const&) noexcept = default #define C4_DEFAULT_MOVE_ASSIGN(ty) ty& operator=(ty &&) noexcept = default #define C4_NO_COPY_OR_MOVE_CTOR(ty) \ C4_NO_COPY_CTOR(ty); \ C4_NO_MOVE_CTOR(ty) #define C4_NO_COPY_OR_MOVE_ASSIGN(ty) \ C4_NO_COPY_ASSIGN(ty); \ C4_NO_MOVE_ASSIGN(ty) #define C4_NO_COPY_OR_MOVE(ty) \ C4_NO_COPY_OR_MOVE_CTOR(ty); \ C4_NO_COPY_OR_MOVE_ASSIGN(ty) #define C4_DEFAULT_COPY_AND_MOVE_CTOR(ty) \ C4_DEFAULT_COPY_CTOR(ty); \ C4_DEFAULT_MOVE_CTOR(ty) #define C4_DEFAULT_COPY_AND_MOVE_ASSIGN(ty) \ C4_DEFAULT_COPY_ASSIGN(ty); \ C4_DEFAULT_MOVE_ASSIGN(ty) #define C4_DEFAULT_COPY_AND_MOVE(ty) \ C4_DEFAULT_COPY_AND_MOVE_CTOR(ty); \ C4_DEFAULT_COPY_AND_MOVE_ASSIGN(ty) /** @see https://en.cppreference.com/w/cpp/named_req/TriviallyCopyable */ #define C4_MUST_BE_TRIVIAL_COPY(ty) \ static_assert(std::is_trivially_copyable::value, #ty " must be trivially copyable") /** @} */ //----------------------------------------------------------------------------- /** @defgroup traits_types Type traits utilities * @ingroup types * @{ */ // http://stackoverflow.com/questions/10821380/is-t-an-instance-of-a-template-in-c template class X, typename T> struct is_instance_of_tpl : std::false_type {}; template class X, typename... Y> struct is_instance_of_tpl> : std::true_type {}; //----------------------------------------------------------------------------- /** SFINAE. use this macro to enable a template function overload based on a compile-time condition. @code // define an overload for a non-pod type template::value)> void foo() { std::cout << "pod type\n"; } // define an overload for a non-pod type template::value)> void foo() { std::cout << "nonpod type\n"; } struct non_pod { non_pod() : name("asdfkjhasdkjh") {} const char *name; }; int main() { foo(); // prints "pod type" foo(); // prints "nonpod type" } @endcode */ #define C4_REQUIRE_T(cond) typename std::enable_if::type* = nullptr /** enable_if for a return type * @see C4_REQUIRE_T */ #define C4_REQUIRE_R(cond, type_) typename std::enable_if::type //----------------------------------------------------------------------------- /** define a traits class reporting whether a type provides a member typedef */ #define C4_DEFINE_HAS_TYPEDEF(member_typedef) \ template \ struct has_##stype \ { \ private: \ \ typedef char yes; \ typedef struct { char array[2]; } no; \ \ template \ static yes _test(typename C::member_typedef*); \ \ template \ static no _test(...); \ \ public: \ \ enum { value = (sizeof(_test(0)) == sizeof(yes)) }; \ \ } /** @} */ //----------------------------------------------------------------------------- /** @defgroup type_declarations Type declaration utilities * @ingroup types * @{ */ #define _c4_DEFINE_ARRAY_TYPES_WITHOUT_ITERATOR(T, I) \ \ using size_type = I; \ using ssize_type = typename std::make_signed::type; \ using difference_type = typename std::make_signed::type; \ \ using value_type = T; \ using pointer = T*; \ using const_pointer = T const*; \ using reference = T&; \ using const_reference = T const& #define _c4_DEFINE_TUPLE_ARRAY_TYPES_WITHOUT_ITERATOR(interior_types, I) \ \ using size_type = I; \ using ssize_type = typename std::make_signed::type; \ using difference_type = typename std::make_signed::type; \ \ template using value_type = typename std::tuple_element< n, std::tuple>::type; \ template using pointer = value_type*; \ template using const_pointer = value_type const*; \ template using reference = value_type&; \ template using const_reference = value_type const& #define _c4_DEFINE_ARRAY_TYPES(T, I) \ \ _c4_DEFINE_ARRAY_TYPES_WITHOUT_ITERATOR(T, I); \ \ using iterator = T*; \ using const_iterator = T const*; \ using reverse_iterator = std::reverse_iterator; \ using const_reverse_iterator = std::reverse_iterator #define _c4_DEFINE_TUPLE_ARRAY_TYPES(interior_types, I) \ \ _c4_DEFINE_TUPLE_ARRAY_TYPES_WITHOUT_ITERATOR(interior_types, I); \ \ template using iterator = value_type*; \ template using const_iterator = value_type const*; \ template using reverse_iterator = std::reverse_iterator< value_type*>; \ template using const_reverse_iterator = std::reverse_iterator< value_type const*> /** @} */ //----------------------------------------------------------------------------- /** @defgroup compatility_utilities Backport implementation of some Modern C++ utilities * @ingroup types * @{ */ //----------------------------------------------------------------------------- // index_sequence and friends are available only for C++14 and later. // A C++11 implementation is provided here. // This implementation was copied over from clang. // see http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/utility?revision=211563&view=markup#l687 #if __cplusplus > 201103L using std::integer_sequence; using std::index_sequence; using std::make_integer_sequence; using std::make_index_sequence; using std::index_sequence_for; #else /** C++11 implementation of integer sequence * @see https://en.cppreference.com/w/cpp/utility/integer_sequence * @see taken from clang: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/utility?revision=211563&view=markup#l687 */ template struct integer_sequence { static_assert(std::is_integral<_Tp>::value, "std::integer_sequence can only be instantiated with an integral type" ); using value_type = _Tp; static constexpr size_t size() noexcept { return sizeof...(_Ip); } }; /** C++11 implementation of index sequence * @see https://en.cppreference.com/w/cpp/utility/integer_sequence * @see taken from clang: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/utility?revision=211563&view=markup#l687 */ template using index_sequence = integer_sequence; /** @cond DONT_DOCUMENT_THIS */ namespace __detail { template struct __repeat; template struct __repeat, _Extra...> { using type = integer_sequence<_Tp, _Np..., sizeof...(_Np) + _Np..., 2 * sizeof...(_Np) + _Np..., 3 * sizeof...(_Np) + _Np..., 4 * sizeof...(_Np) + _Np..., 5 * sizeof...(_Np) + _Np..., 6 * sizeof...(_Np) + _Np..., 7 * sizeof...(_Np) + _Np..., _Extra...>; }; template struct __parity; template struct __make : __parity<_Np % 8>::template __pmake<_Np> {}; template<> struct __make<0> { using type = integer_sequence; }; template<> struct __make<1> { using type = integer_sequence; }; template<> struct __make<2> { using type = integer_sequence; }; template<> struct __make<3> { using type = integer_sequence; }; template<> struct __make<4> { using type = integer_sequence; }; template<> struct __make<5> { using type = integer_sequence; }; template<> struct __make<6> { using type = integer_sequence; }; template<> struct __make<7> { using type = integer_sequence; }; template<> struct __parity<0> { template struct __pmake : __repeat::type> {}; }; template<> struct __parity<1> { template struct __pmake : __repeat::type, _Np - 1> {}; }; template<> struct __parity<2> { template struct __pmake : __repeat::type, _Np - 2, _Np - 1> {}; }; template<> struct __parity<3> { template struct __pmake : __repeat::type, _Np - 3, _Np - 2, _Np - 1> {}; }; template<> struct __parity<4> { template struct __pmake : __repeat::type, _Np - 4, _Np - 3, _Np - 2, _Np - 1> {}; }; template<> struct __parity<5> { template struct __pmake : __repeat::type, _Np - 5, _Np - 4, _Np - 3, _Np - 2, _Np - 1> {}; }; template<> struct __parity<6> { template struct __pmake : __repeat::type, _Np - 6, _Np - 5, _Np - 4, _Np - 3, _Np - 2, _Np - 1> {}; }; template<> struct __parity<7> { template struct __pmake : __repeat::type, _Np - 7, _Np - 6, _Np - 5, _Np - 4, _Np - 3, _Np - 2, _Np - 1> {}; }; template struct __convert { template struct __result; template<_Tp ..._Np> struct __result> { using type = integer_sequence<_Up, _Np...>; }; }; template struct __convert<_Tp, _Tp> { template struct __result { using type = _Up; }; }; template using __make_integer_sequence_unchecked = typename __detail::__convert::template __result::type>::type; template struct __make_integer_sequence { static_assert(std::is_integral<_Tp>::value, "std::make_integer_sequence can only be instantiated with an integral type" ); static_assert(0 <= _Ep, "std::make_integer_sequence input shall not be negative"); typedef __make_integer_sequence_unchecked<_Tp, _Ep> type; }; } // namespace __detail /** @endcond */ /** C++11 implementation of index sequence * @see https://en.cppreference.com/w/cpp/utility/integer_sequence * @see taken from clang: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/utility?revision=211563&view=markup#l687 */ template using make_integer_sequence = typename __detail::__make_integer_sequence<_Tp, _Np>::type; /** C++11 implementation of index sequence * @see https://en.cppreference.com/w/cpp/utility/integer_sequence * @see taken from clang: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/utility?revision=211563&view=markup#l687 */ template using make_index_sequence = make_integer_sequence; /** C++11 implementation of index sequence * @see https://en.cppreference.com/w/cpp/utility/integer_sequence * @see taken from clang: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/utility?revision=211563&view=markup#l687 */ template using index_sequence_for = make_index_sequence; #endif /** @} */ } // namespace c4 // NOLINTEND(bugprone-macro-parentheses) #endif /* _C4_TYPES_HPP_ */ c4core-0.2.6/src/c4/unrestrict.hpp000066400000000000000000000004731477602032300167160ustar00rootroot00000000000000#ifdef _C4_RESTRICT_HPP_ // must match the include guard from restrict.hpp /** @file unrestrict.hpp cleans up restrict macros */ #undef $ #undef $$ #undef c$ #undef c$$ #undef _C4_RESTRICT_HPP_ #ifdef __clang__ # pragma clang diagnostic pop #elif defined(__GNUC__) #endif #endif /* _C4_RESTRICT_HPP_ */ c4core-0.2.6/src/c4/utf.cpp000066400000000000000000000074641477602032300153140ustar00rootroot00000000000000#include "c4/utf.hpp" #include "c4/charconv.hpp" namespace c4 { C4_SUPPRESS_WARNING_GCC_CLANG_WITH_PUSH("-Wold-style-cast") size_t decode_code_point(uint8_t *C4_RESTRICT buf, size_t buflen, const uint32_t code) { C4_ASSERT(buf); C4_ASSERT(buflen >= 4); C4_UNUSED(buflen); if (code <= UINT32_C(0x7f)) { buf[0] = (uint8_t)code; return 1u; } else if(code <= UINT32_C(0x7ff)) { buf[0] = (uint8_t)(UINT32_C(0xc0) | (code >> 6u)); /* 110xxxxx */ buf[1] = (uint8_t)(UINT32_C(0x80) | (code & UINT32_C(0x3f))); /* 10xxxxxx */ return 2u; } else if(code <= UINT32_C(0xffff)) { buf[0] = (uint8_t)(UINT32_C(0xe0) | ((code >> 12u))); /* 1110xxxx */ buf[1] = (uint8_t)(UINT32_C(0x80) | ((code >> 6u) & UINT32_C(0x3f))); /* 10xxxxxx */ buf[2] = (uint8_t)(UINT32_C(0x80) | ((code ) & UINT32_C(0x3f))); /* 10xxxxxx */ return 3u; } else if(code <= UINT32_C(0x10ffff)) { buf[0] = (uint8_t)(UINT32_C(0xf0) | ((code >> 18u))); /* 11110xxx */ buf[1] = (uint8_t)(UINT32_C(0x80) | ((code >> 12u) & UINT32_C(0x3f))); /* 10xxxxxx */ buf[2] = (uint8_t)(UINT32_C(0x80) | ((code >> 6u) & UINT32_C(0x3f))); /* 10xxxxxx */ buf[3] = (uint8_t)(UINT32_C(0x80) | ((code ) & UINT32_C(0x3f))); /* 10xxxxxx */ return 4u; } return 0; } substr decode_code_point(substr out, csubstr code_point) { C4_ASSERT(out.len >= 4); C4_ASSERT(!code_point.begins_with("U+")); C4_ASSERT(!code_point.begins_with("\\x")); C4_ASSERT(!code_point.begins_with("\\u")); C4_ASSERT(!code_point.begins_with("\\U")); C4_ASSERT(!code_point.begins_with('0')); C4_ASSERT(code_point.len <= 8); C4_ASSERT(code_point.len > 0); uint32_t code_point_val; C4_CHECK(read_hex(code_point, &code_point_val)); size_t ret = decode_code_point((uint8_t*)out.str, out.len, code_point_val); C4_ASSERT(ret <= 4); return out.first(ret); } size_t first_non_bom(csubstr s) { #define c4check2_(s, c0, c1) ((s).len >= 2) && (((s).str[0] == (c0)) && ((s).str[1] == (c1))) #define c4check3_(s, c0, c1, c2) ((s).len >= 3) && (((s).str[0] == (c0)) && ((s).str[1] == (c1)) && ((s).str[2] == (c2))) #define c4check4_(s, c0, c1, c2, c3) ((s).len >= 4) && (((s).str[0] == (c0)) && ((s).str[1] == (c1)) && ((s).str[2] == (c2)) && ((s).str[3] == (c3))) // see https://en.wikipedia.org/wiki/Byte_order_mark#Byte-order_marks_by_encoding if(s.len < 2u) return false; else if(c4check3_(s, '\xef', '\xbb', '\xbf')) // UTF-8 return 3u; else if(c4check4_(s, '\x00', '\x00', '\xfe', '\xff')) // UTF-32BE return 4u; else if(c4check4_(s, '\xff', '\xfe', '\x00', '\x00')) // UTF-32LE return 4u; else if(c4check2_(s, '\xfe', '\xff')) // UTF-16BE return 2u; else if(c4check2_(s, '\xff', '\xfe')) // UTF-16BE return 2u; else if(c4check3_(s, '\x2b', '\x2f', '\x76')) // UTF-7 return 3u; else if(c4check3_(s, '\xf7', '\x64', '\x4c')) // UTF-1 return 3u; else if(c4check4_(s, '\xdd', '\x73', '\x66', '\x73')) // UTF-EBCDIC return 4u; else if(c4check3_(s, '\x0e', '\xfe', '\xff')) // SCSU return 3u; else if(c4check3_(s, '\xfb', '\xee', '\x28')) // BOCU-1 return 3u; else if(c4check4_(s, '\x84', '\x31', '\x95', '\x33')) // GB18030 return 4u; return 0u; #undef c4check2_ #undef c4check3_ #undef c4check4_ } substr get_bom(substr s) { return s.first(first_non_bom(s)); } csubstr get_bom(csubstr s) { return s.first(first_non_bom(s)); } substr skip_bom(substr s) { return s.sub(first_non_bom(s)); } csubstr skip_bom(csubstr s) { return s.sub(first_non_bom(s)); } C4_SUPPRESS_WARNING_GCC_CLANG_POP } // namespace c4 c4core-0.2.6/src/c4/utf.hpp000066400000000000000000000052461477602032300153150ustar00rootroot00000000000000#ifndef C4_UTF_HPP_ #define C4_UTF_HPP_ #include "c4/language.hpp" #include "c4/substr_fwd.hpp" #include #include /** @file utf.hpp utilities for UTF and Byte Order Mark */ namespace c4 { /** @defgroup doc_utf UTF utilities * @{ */ /** skip the Byte Order Mark, or get the full string if there is Byte Order Mark. * @see Implements the Byte Order Marks as described in https://en.wikipedia.org/wiki/Byte_order_mark#Byte-order_marks_by_encoding */ C4CORE_EXPORT substr skip_bom(substr s); /** skip the Byte Order Mark, or get the full string if there is Byte Order Mark * @see Implements the Byte Order Marks as described in https://en.wikipedia.org/wiki/Byte_order_mark#Byte-order_marks_by_encoding */ C4CORE_EXPORT csubstr skip_bom(csubstr s); /** get the Byte Order Mark, or an empty string if there is no Byte Order Mark * @see Implements the Byte Order Marks as described in https://en.wikipedia.org/wiki/Byte_order_mark#Byte-order_marks_by_encoding */ C4CORE_EXPORT substr get_bom(substr s); /** get the Byte Order Mark, or an empty string if there is no Byte Order Mark * @see Implements the Byte Order Marks as described in https://en.wikipedia.org/wiki/Byte_order_mark#Byte-order_marks_by_encoding */ C4CORE_EXPORT csubstr get_bom(csubstr s); /** return the position of the first character not belonging to the * Byte Order Mark, or 0 if there is no Byte Order Mark. * @see Implements the Byte Order Marks as described in https://en.wikipedia.org/wiki/Byte_order_mark#Byte-order_marks_by_encoding */ C4CORE_EXPORT size_t first_non_bom(csubstr s); /** decode the given @p code_point, writing into the output string in * @p out. * * @param out the output string. must have at least 4 bytes (this is * asserted), and must not have a null string. * * @param code_point: must have length in ]0,8], and must not begin * with any of `U+`,`\\x`,`\\u,`\\U`,`0` (asserted) * * @return the part of @p out that was written, which will always be * at most 4 bytes. */ C4CORE_EXPORT substr decode_code_point(substr out, csubstr code_point); /** decode the given @p code point, writing into the output string @p * buf, of size @p buflen * * @param buf the output string. must have at least 4 bytes (this is * asserted), and must not be null * * @param buflen the length of the output string. must be at least 4 * * @param code: the code point must have length in ]0,8], and must not begin * with any of `U+`,`\\x`,`\\u,`\\U`,`0` (asserted) * * @return the part of @p out that was written, which will always be * at most 4 bytes. */ size_t decode_code_point(uint8_t *C4_RESTRICT buf, size_t buflen, uint32_t code); /** @} */ } // namespace c4 #endif // C4_UTF_HPP_ c4core-0.2.6/src/c4/version.cpp000066400000000000000000000004311477602032300161660ustar00rootroot00000000000000#include "c4/version.hpp" namespace c4 { const char* version() { return C4CORE_VERSION; } int version_major() { return C4CORE_VERSION_MAJOR; } int version_minor() { return C4CORE_VERSION_MINOR; } int version_patch() { return C4CORE_VERSION_PATCH; } } // namespace c4 c4core-0.2.6/src/c4/version.hpp000066400000000000000000000006641477602032300162030ustar00rootroot00000000000000#ifndef _C4_VERSION_HPP_ #define _C4_VERSION_HPP_ /** @file version.hpp */ #define C4CORE_VERSION "0.2.6" #define C4CORE_VERSION_MAJOR 0 #define C4CORE_VERSION_MINOR 2 #define C4CORE_VERSION_PATCH 6 #include namespace c4 { C4CORE_EXPORT const char* version(); C4CORE_EXPORT int version_major(); C4CORE_EXPORT int version_minor(); C4CORE_EXPORT int version_patch(); } // namespace c4 #endif /* _C4_VERSION_HPP_ */ c4core-0.2.6/src/c4/windows.hpp000066400000000000000000000003221477602032300161770ustar00rootroot00000000000000#ifndef _C4_WINDOWS_HPP_ #define _C4_WINDOWS_HPP_ #if defined(_WIN64) || defined(_WIN32) #include "c4/windows_push.hpp" #include #include "c4/windows_pop.hpp" #endif #endif /* _C4_WINDOWS_HPP_ */ c4core-0.2.6/src/c4/windows_pop.hpp000066400000000000000000000012511477602032300170570ustar00rootroot00000000000000#ifndef _C4_WINDOWS_POP_HPP_ #define _C4_WINDOWS_POP_HPP_ #if defined(_WIN64) || defined(_WIN32) #ifdef _c4_AMD64_ # undef _c4_AMD64_ # undef _AMD64_ #endif #ifdef _c4_X86_ # undef _c4_X86_ # undef _X86_ #endif #ifdef _c4_ARM_ # undef _c4_ARM_ # undef _ARM_ #endif #ifdef _c4_NOMINMAX # undef _c4_NOMINMAX # undef NOMINMAX #endif #ifdef NOGDI # undef _c4_NOGDI # undef NOGDI #endif #ifdef VC_EXTRALEAN # undef _c4_VC_EXTRALEAN # undef VC_EXTRALEAN #endif #ifdef WIN32_LEAN_AND_MEAN # undef _c4_WIN32_LEAN_AND_MEAN # undef WIN32_LEAN_AND_MEAN #endif #endif /* defined(_WIN64) || defined(_WIN32) */ #endif /* _C4_WINDOWS_POP_HPP_ */ c4core-0.2.6/src/c4/windows_push.hpp000066400000000000000000000060771477602032300172530ustar00rootroot00000000000000#ifndef _C4_WINDOWS_PUSH_HPP_ #define _C4_WINDOWS_PUSH_HPP_ /** @file windows_push.hpp sets up macros to include windows header files * without pulling in all of * * @see #include windows_pop.hpp to undefine these macros * * @see https://aras-p.info/blog/2018/01/12/Minimizing-windows.h/ */ #if defined(_WIN64) || defined(_WIN32) #if defined(_M_AMD64) # ifndef _AMD64_ # define _c4_AMD64_ # define _AMD64_ # endif #elif defined(_M_IX86) # ifndef _X86_ # define _c4_X86_ # define _X86_ # endif #elif defined(_M_ARM64) # ifndef _ARM64_ # define _c4_ARM64_ # define _ARM64_ # endif #elif defined(_M_ARM) # ifndef _ARM_ # define _c4_ARM_ # define _ARM_ # endif #endif #ifndef NOMINMAX # define _c4_NOMINMAX # define NOMINMAX #endif #ifndef NOGDI # define _c4_NOGDI # define NOGDI #endif #ifndef VC_EXTRALEAN # define _c4_VC_EXTRALEAN # define VC_EXTRALEAN #endif #ifndef WIN32_LEAN_AND_MEAN # define _c4_WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN #endif /* If defined, the following flags inhibit definition * of the indicated items. * * NOGDICAPMASKS - CC_*, LC_*, PC_*, CP_*, TC_*, RC_ * NOVIRTUALKEYCODES - VK_* * NOWINMESSAGES - WM_*, EM_*, LB_*, CB_* * NOWINSTYLES - WS_*, CS_*, ES_*, LBS_*, SBS_*, CBS_* * NOSYSMETRICS - SM_* * NOMENUS - MF_* * NOICONS - IDI_* * NOKEYSTATES - MK_* * NOSYSCOMMANDS - SC_* * NORASTEROPS - Binary and Tertiary raster ops * NOSHOWWINDOW - SW_* * OEMRESOURCE - OEM Resource values * NOATOM - Atom Manager routines * NOCLIPBOARD - Clipboard routines * NOCOLOR - Screen colors * NOCTLMGR - Control and Dialog routines * NODRAWTEXT - DrawText() and DT_* * NOGDI - All GDI defines and routines * NOKERNEL - All KERNEL defines and routines * NOUSER - All USER defines and routines * NONLS - All NLS defines and routines * NOMB - MB_* and MessageBox() * NOMEMMGR - GMEM_*, LMEM_*, GHND, LHND, associated routines * NOMETAFILE - typedef METAFILEPICT * NOMINMAX - Macros min(a,b) and max(a,b) * NOMSG - typedef MSG and associated routines * NOOPENFILE - OpenFile(), OemToAnsi, AnsiToOem, and OF_* * NOSCROLL - SB_* and scrolling routines * NOSERVICE - All Service Controller routines, SERVICE_ equates, etc. * NOSOUND - Sound driver routines * NOTEXTMETRIC - typedef TEXTMETRIC and associated routines * NOWH - SetWindowsHook and WH_* * NOWINOFFSETS - GWL_*, GCL_*, associated routines * NOCOMM - COMM driver routines * NOKANJI - Kanji support stuff. * NOHELP - Help engine interface. * NOPROFILER - Profiler interface. * NODEFERWINDOWPOS - DeferWindowPos routines * NOMCX - Modem Configuration Extensions */ #endif /* defined(_WIN64) || defined(_WIN32) */ #endif /* _C4_WINDOWS_PUSH_HPP_ */ c4core-0.2.6/tbump.toml000066400000000000000000000031621477602032300147300ustar00rootroot00000000000000# Uncomment this if your project is hosted on GitHub: # github_url = "https://github.com///" [version] current = "0.2.6" # Example of a semver regexp. # Make sure this matches current_version before # using tbump regex = ''' (?P\d+) \. (?P\d+) \. (?P\d+) .* ''' [git] message_template = "Bump to {new_version}" tag_template = "v{new_version}" # For each file to patch, add a [[file]] config # section containing the path of the file, relative to the # tbump.toml location. [[file]] src = "CMakeLists.txt" search = "c4_project\\(VERSION {current_version}" [[file]] src = "test/test_install/CMakeLists.txt" search = "c4_project\\(VERSION {current_version}" [[file]] src = "test/test_singleheader/CMakeLists.txt" search = "c4_project\\(VERSION {current_version}" [[file]] src = "src/c4/version.hpp" search = "#define C4CORE_VERSION ['\"]{current_version}['\"]" [[file]] src = "src/c4/version.hpp" version_template = "{major}" search = "#define C4CORE_VERSION_MAJOR {current_version}" [[file]] src = "src/c4/version.hpp" version_template = "{minor}" search = "#define C4CORE_VERSION_MINOR {current_version}" [[file]] src = "src/c4/version.hpp" version_template = "{patch}" search = "#define C4CORE_VERSION_PATCH {current_version}" # You can specify a list of commands to # run after the files have been patched # and before the git commit is made # [[before_commit]] # name = "check changelog" # cmd = "grep -q {new_version} Changelog.rst" # Or run some commands after the git tag and the branch # have been pushed: # [[after_push]] # name = "publish" # cmd = "./publish.sh" c4core-0.2.6/test/000077500000000000000000000000001477602032300136615ustar00rootroot00000000000000c4core-0.2.6/test/CMakeLists.txt000066400000000000000000000044171477602032300164270ustar00rootroot00000000000000if(NOT (CMAKE_VERSION VERSION_LESS "4.0.0")) c4_log(STATUS "setting CMAKE_POLICY_VERSION_MINIMUM=3.5 to build doctest") set(CMAKE_POLICY_VERSION_MINIMUM 3.5 CACHE STRING "" FORCE) endif() c4_setup_testing(DOCTEST) c4_add_library(c4core-_libtest LIBRARY_TYPE STATIC SOURCES c4/test.hpp c4/main.cpp c4/libtest/test.cpp c4/libtest/archetypes.cpp c4/libtest/archetypes.hpp c4/libtest/supprwarn_push.hpp c4/libtest/supprwarn_pop.hpp LIBS c4core doctest DEFS # doctest does not deal well with template operator<< for substr # see https://github.com/onqtam/doctest/pull/431 -DC4_SUBSTR_NO_OSTREAM_LSHIFT INC_DIRS ${CMAKE_CURRENT_LIST_DIR} FOLDER test ) if(C4CORE_DEFINED_FROM_SINGLEHEADER) target_compile_definitions(c4core-_libtest PUBLIC -DC4CORE_SINGLE_HEADER) endif() function(c4core_test name) c4_add_executable(c4core-test-${name} SOURCES ${ARGN} INC_DIRS ${CMAKE_CURRENT_LIST_DIR} LIBS c4core-_libtest FOLDER test) c4_add_test(c4core-test-${name} ARGS --duration=on --no-version=on) endfunction() c4core_test(version test_version.cpp) c4core_test(preprocessor test_preprocessor.cpp) c4core_test(type_name test_type_name.cpp) c4core_test(types test_types.cpp) c4core_test(szconv test_szconv.cpp) c4core_test(error test_error.cpp) c4core_test(error_exception test_error_exception.cpp) c4core_test(blob test_blob.cpp) c4core_test(memory_util test_memory_util.cpp) c4core_test(memory_resource test_memory_resource.cpp) c4core_test(allocator test_allocator.cpp) c4core_test(ctor_dtor test_ctor_dtor.cpp) c4core_test(chartraits test_char_traits.cpp) c4core_test(enum test_enum.cpp) c4core_test(bitmask test_bitmask.cpp) c4core_test(span test_span.cpp) c4core_test(substr test_substr.cpp) c4core_test(charconv test_charconv.cpp test_numbers.hpp) c4core_test(utf test_utf.cpp) c4core_test(format test_format.cpp) c4core_test(dump test_dump.cpp) c4core_test(base64 test_base64.cpp) c4core_test(std_string test_std_string.cpp) c4core_test(std_vector test_std_vector.cpp) c4core-0.2.6/test/c4/000077500000000000000000000000001477602032300141675ustar00rootroot00000000000000c4core-0.2.6/test/c4/libtest/000077500000000000000000000000001477602032300156355ustar00rootroot00000000000000c4core-0.2.6/test/c4/libtest/archetypes.cpp000066400000000000000000000002371477602032300205120ustar00rootroot00000000000000#include "c4/libtest/archetypes.hpp" namespace c4 { namespace archetypes { int IdOwner::s_current = 0; } // namespace archetypes } // namespace c4 c4core-0.2.6/test/c4/libtest/archetypes.hpp000066400000000000000000000452401477602032300205220ustar00rootroot00000000000000#ifndef _C4_TEST_ARCHETYPES_HPP_ #define _C4_TEST_ARCHETYPES_HPP_ #ifdef C4CORE_SINGLE_HEADER #include "c4/c4core_all.hpp" #else #include "c4/memory_resource.hpp" #include "c4/allocator.hpp" #include "c4/char_traits.hpp" #endif #include "c4/test.hpp" #include #include #include namespace c4 { C4_SUPPRESS_WARNING_GCC_CLANG_WITH_PUSH("-Wold-style-cast") template< class String > class sstream; //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- namespace archetypes { template< class T > void check_archetype(T const& a) { a.check(); } template< class T > void check_archetype(T const& a, T const& ref) { a.check(ref); } inline void check_archetype(char ) {} inline void check_archetype(wchar_t ) {} inline void check_archetype(int8_t ) {} inline void check_archetype(uint8_t ) {} inline void check_archetype(int16_t ) {} inline void check_archetype(uint16_t) {} inline void check_archetype(int32_t ) {} inline void check_archetype(uint32_t) {} inline void check_archetype(int64_t ) {} inline void check_archetype(uint64_t) {} inline void check_archetype(float ) {} inline void check_archetype(double ) {} inline void check_archetype(char a, char ref) { CHECK_EQ(a, ref); } inline void check_archetype(wchar_t a, wchar_t ref) { CHECK_EQ(a, ref); } inline void check_archetype(int8_t a, int8_t ref) { CHECK_EQ(a, ref); } inline void check_archetype(uint8_t a, uint8_t ref) { CHECK_EQ(a, ref); } inline void check_archetype(int16_t a, int16_t ref) { CHECK_EQ(a, ref); } inline void check_archetype(uint16_t a, uint16_t ref) { CHECK_EQ(a, ref); } inline void check_archetype(int32_t a, int32_t ref) { CHECK_EQ(a, ref); } inline void check_archetype(uint32_t a, uint32_t ref) { CHECK_EQ(a, ref); } inline void check_archetype(int64_t a, int64_t ref) { CHECK_EQ(a, ref); } inline void check_archetype(uint64_t a, uint64_t ref) { CHECK_EQ(a, ref); } inline void check_archetype(float a, float ref) { CHECK_EQ((double)a, doctest::Approx((double)ref)); } inline void check_archetype(double a, double ref) { CHECK_EQ(a, doctest::Approx(ref)); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- template< class T, class Proto > struct archetype_proto_base { static T const& get(size_t which) { auto const& a = Proto::arr(); C4_ASSERT(which < (int)a.size()); return a[which]; } static std::array< T, 8 > dup() { std::array< T, 8 > d = Proto::arr; return d; } static std::array< Counting, 8 > cdup() { std::array< Counting, 8 > d = Proto::carr; return d; } static std::vector< T > dup(size_t n) { auto const& a = Proto::arr(); std::vector< T > d; d.reserve(n); for(size_t i = 0, pos = 0; i < n; ++i, pos = ((pos+1)%a.size())) { d.push_back(a[pos]); } return d; } static std::vector< Counting > cdup(size_t n) { auto const& a = Proto::arr(); std::vector< Counting > d; d.reserve(n); for(size_t i = 0, pos = 0; i < n; ++i, pos = ((pos+1)%a.size())) { d.push_back(a[pos]); } return d; } }; #ifdef __clang__ # pragma clang diagnostic push # pragma clang diagnostic ignored "-Wmissing-braces" // warning : suggest braces around initialization of subobject [-Wmissing-braces] #endif // for scalar types: ints and floats template< class T > struct archetype_proto : public archetype_proto_base< T, archetype_proto > { static_assert(std::is_fundamental< T >::value, "T must be a fundamental type"); static std::array const& arr() { static const std::array arr_{0, 1, 2, 3, 4, 5, 6, 7}; return arr_; } static std::array, 8> const& carr() { static const std::array, 8> arr_ = {0, 1, 2, 3, 4, 5, 6, 7}; return arr_; } static std::initializer_list< T > il() { static const std::initializer_list< T > l{0, 1, 2, 3, 4, 5, 6, 7}; return l; } static std::initializer_list< Counting > cil() { static const std::initializer_list< Counting > l = {0, 1, 2, 3, 4, 5, 6, 7}; C4_ASSERT(l.size() == 8); return l; } }; #define _C4_DECLARE_ARCHETYPE_PROTO(ty, ...) \ template<> \ struct archetype_proto : public archetype_proto_base< ty, archetype_proto > \ { \ static std::array const& arr() \ { \ static const std::array arr_{__VA_ARGS__}; \ return arr_; \ } \ static std::array, 8> const& carr() \ { \ static const std::array, 8> arr_{__VA_ARGS__}; \ return arr_; \ } \ static std::initializer_list< ty > il() \ { \ static const std::initializer_list< ty > l{__VA_ARGS__}; \ return l; \ } \ static std::initializer_list< Counting > cil() \ { \ static const std::initializer_list< Counting > l{__VA_ARGS__}; \ return l; \ } \ } #define _C4_DECLARE_ARCHETYPE_PROTO_TPL1(tplparam1, ty, ...) \ template< tplparam1 > \ struct archetype_proto< ty > : public archetype_proto_base< ty, archetype_proto > \ { \ static std::array const& arr() \ { \ static const std::array arr_{__VA_ARGS__}; \ return arr_; \ } \ static std::array, 8> const& carr() \ { \ static const std::array, 8> arr_{__VA_ARGS__}; \ return arr_; \ } \ static std::initializer_list< ty > il() \ { \ static const std::initializer_list< ty > l{__VA_ARGS__}; \ return l; \ } \ static std::initializer_list< Counting > cil() \ { \ static const std::initializer_list< Counting > l{__VA_ARGS__}; \ return l; \ } \ } _C4_DECLARE_ARCHETYPE_PROTO(std::string, "str0", "str1", "str2", "str3", "str4", "str5", "str6", "str7"); //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /** Resource-owning archetype */ template< class T > struct exvec3 { T x, y, z; bool operator== (exvec3 const& that) const { return x == that.x && y == that.y && z == that.z; } }; template< class String, class T > sstream< String >& operator<< (sstream< String >& ss, exvec3 const& v) { using char_type = typename sstream< String >::char_type; ss.printp(C4_TXTTY("({},{},{})", char_type), v.x, v.y, v.z); return ss; } template< class String, class T > sstream< String >& operator>> (sstream< String >& ss, exvec3 & v) { using char_type = typename sstream< String >::char_type; ss.scanp(C4_TXTTY("({},{},{})", char_type), v.x, v.y, v.z); return ss; } #define _ C4_COMMA #define c4v(v0, v1, v2) exvec3{v0 _ v1 _ v2} _C4_DECLARE_ARCHETYPE_PROTO_TPL1(class T, exvec3, c4v(0, 1, 2), c4v(3, 4, 5), c4v(6, 7, 8), c4v(9, 10, 11), c4v(100, 101, 102), c4v(103, 104, 105), c4v(106, 107, 108), c4v(109, 110, 111) ); #undef c4v #undef _ //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /** Resource-owning archetype */ struct IdOwner { static int s_current; int id; int val; void check() const { CHECK_UNARY(id > 0); } void check(IdOwner const& that) const { check(); CHECK_NE(id, that.id); } IdOwner(int v = 0) { id = ++s_current; val = v; } ~IdOwner() { if(id > 0) --s_current; } IdOwner(IdOwner const& that) { id = ++s_current; val = that.val; } IdOwner(IdOwner && that) { id = that.id; val = that.val; that.id = 0; } IdOwner& operator= (IdOwner const& that) { C4_CHECK(id > 0); --s_current; id = ++s_current; val = that.val; return *this; } IdOwner& operator= (IdOwner && that) { C4_CHECK(id > 0); --s_current; id = that.id; val = that.val; that.id = 0; return *this; } bool operator== (IdOwner const& that) const { return val == that.val; } }; _C4_DECLARE_ARCHETYPE_PROTO(IdOwner, 0, 1, 2, 3, 4, 5, 6, 7); //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /** Memory-owning archetype, raw mem resource calls */ template< class T > struct MemOwner { T *mem; // prevent initialization order problems by using a memory resource here MemoryResourceMalloc mr; void check() const { EXPECT_NE(mem, nullptr); check_archetype(*mem); } void check(MemOwner const& that) const { EXPECT_NE(mem, that.mem); } ~MemOwner() { if(!mem) return; mem->~T(); mr.deallocate(mem, sizeof(T), alignof(T)); mem = nullptr; } MemOwner() { mem = (T*)mr.allocate(sizeof(T), alignof(T)); new (mem) T(); } template< class ...Args > MemOwner(varargs_t, Args && ...args) { mem = (T*)mr.allocate(sizeof(T), alignof(T)); new (mem) T(std::forward< Args >(args)...); } MemOwner(MemOwner const& that) { mem = (T*)mr.allocate(sizeof(T), alignof(T)); new (mem) T(*that.mem); } MemOwner(MemOwner && that) { mem = that.mem; that.mem = nullptr; } MemOwner& operator= (MemOwner const& that) { if(!mem) { mem = (T*)mr.allocate(sizeof(T), alignof(T)); } else { mem->~T(); } new (mem) T(*that.mem); return *this; } MemOwner& operator= (MemOwner && that) { if(mem) { mem->~T(); mr.deallocate(mem, sizeof(T), alignof(T)); } mem = that.mem; that.mem = nullptr; return *this; } bool operator== (MemOwner const& that) const { return *mem == *that.mem; } }; #define _ C4_COMMA #define c4v(which) MemOwner{varargs _ archetype_proto::get(which)} _C4_DECLARE_ARCHETYPE_PROTO_TPL1(class T, MemOwner, c4v(0), c4v(1), c4v(2), c4v(3), c4v(4), c4v(5), c4v(6), c4v(7) ); #undef c4v #undef _ //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /** Memory-owning archetype, with allocator */ template< class T > struct MemOwnerAlloc { T *mem; // prevent initialization order problems by using a memory resource here MemoryResourceMalloc mr; c4::Allocator< T > m_alloc; using alloc_traits = std::allocator_traits< c4::Allocator< T > >; void check() const { EXPECT_NE(mem, nullptr); check_archetype(*mem); } void check(MemOwnerAlloc const& that) const { check(); EXPECT_NE(mem, that.mem); } void free() { alloc_traits::destroy(m_alloc, mem); alloc_traits::deallocate(m_alloc, mem, 1); mem = nullptr; } ~MemOwnerAlloc() { if(!mem) return; free(); } MemOwnerAlloc() : m_alloc(&mr) { C4_ASSERT(m_alloc.resource() == &mr); mem = alloc_traits::allocate(m_alloc, 1); alloc_traits::construct(m_alloc, mem); } template< class ...Args > MemOwnerAlloc(varargs_t, Args && ...args) : m_alloc(&mr) { mem = alloc_traits::allocate(m_alloc, 1); alloc_traits::construct(m_alloc, mem, std::forward< Args >(args)...); } MemOwnerAlloc(MemOwnerAlloc const& that) : m_alloc(&mr) { mem = alloc_traits::allocate(m_alloc, 1); alloc_traits::construct(m_alloc, mem, *that.mem); } MemOwnerAlloc(MemOwnerAlloc && that) : m_alloc(&mr) { mem = that.mem; that.mem = nullptr; } MemOwnerAlloc& operator= (MemOwnerAlloc const& that) { if(!mem) { mem = alloc_traits::allocate(m_alloc, 1); } else { mem->~T(); } alloc_traits::construct(m_alloc, mem, *that.mem); return *this; } MemOwnerAlloc& operator= (MemOwnerAlloc && that) { if(mem) { free(); } mem = that.mem; that.mem = nullptr; return *this; } bool operator== (MemOwnerAlloc const& that) const { return *mem == *that.mem; } }; #define _ C4_COMMA #define c4v(which) MemOwnerAlloc{varargs _ archetype_proto::get(which)} _C4_DECLARE_ARCHETYPE_PROTO_TPL1(class T, MemOwnerAlloc, c4v(0), c4v(1), c4v(2), c4v(3), c4v(4), c4v(5), c4v(6), c4v(7) ); #undef c4v #undef _ //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /** base class archetype */ struct Base { virtual ~Base() = default; protected: Base() = default; }; /** derived class archetype */ struct Derived : public Base { }; //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- template< class T > struct InsidePtr { T a; T b; T c; T *ptr; InsidePtr(int which = 0) : a(), b(), c(), ptr(&a + (which % 3)) {} InsidePtr(InsidePtr const& that) : a(that.a), b(that.b), c(that.c), ptr(&a + (that.ptr - &that.a)) {} InsidePtr(InsidePtr && that) : a(std::move(that.a)), b(std::move(that.b)), c(std::move(that.c)), ptr(&a + (that.ptr - &that.a)) { that.ptr = nullptr; } InsidePtr& operator= (InsidePtr const& that) { a = (that.a); b = (that.b); c = (that.c); ptr = (&a + (that.ptr - &that.a)); return *this; } InsidePtr& operator= (InsidePtr && that) { a = std::move(that.a); b = std::move(that.b); c = std::move(that.c); ptr = (&a + (that.ptr - &that.a)); that.ptr = nullptr; return *this; } ~InsidePtr() { EXPECT_TRUE(ptr == &a || ptr == &b || ptr == &c || ptr == nullptr); } void check() const { EXPECT_TRUE(ptr == &a || ptr == &b || ptr == &c); } void check(InsidePtr const& that) const { check(); EXPECT_EQ(ptr - &a, that.ptr - &that.a); } bool operator== (InsidePtr const& that) const { return that.a == a && that.b == b && that.c == c && (ptr - &a) == (that.ptr - &that.a); } }; #define _ C4_COMMA _C4_DECLARE_ARCHETYPE_PROTO_TPL1(class T, InsidePtr, 0, 1, 2, 3, 4, 5, 6, 7 ); #undef _ //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- # define CALL_FOR_SCALAR_ARCHETYPES(mcr) \ mcr(int , int) \ mcr(uint64_t , uint64_t) # define CALL_FOR_CONTAINEE_ARCHETYPES(mcr) \ CALL_FOR_SCALAR_ARCHETYPES(mcr) \ mcr(MemOwnerAlloc_std_string , archetypes::MemOwnerAlloc) using scalars_quick = std::tuple; using scalars = std::tuple< char, wchar_t, int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t, float, double >; using containees_quick = std::tuple< int, uint64_t, archetypes::MemOwnerAlloc >; using containees = std::tuple< char, wchar_t, int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t, float, double, archetypes::exvec3, archetypes::exvec3, archetypes::IdOwner, archetypes::MemOwner, archetypes::MemOwner, archetypes::MemOwnerAlloc, archetypes::MemOwnerAlloc, archetypes::InsidePtr, archetypes::InsidePtr >; #ifdef __clang__ # pragma clang diagnostic pop #endif } // namespace archetypes C4_SUPPRESS_WARNING_GCC_CLANG_POP } // namespace c4 #endif // _C4_TEST_ARCHETYPES_HPP_ c4core-0.2.6/test/c4/libtest/supprwarn_pop.hpp000066400000000000000000000003731477602032300212700ustar00rootroot00000000000000#ifndef _C4_SUPPRWARN_POP_HPP_ #define _C4_SUPPRWARN_POP_HPP_ #ifdef __clang__ # pragma clang diagnostic pop #elif defined(__GNUC__) # pragma GCC diagnostic pop #elif defined(_MSC_VER) # pragma warning(pop) #endif #endif /* SUPPRWARN_POP_H */ c4core-0.2.6/test/c4/libtest/supprwarn_push.hpp000066400000000000000000000061151477602032300214510ustar00rootroot00000000000000#ifndef _C4_LIBTEST_SUPPRWARN_PUSH_HPP_ #define _C4_LIBTEST_SUPPRWARN_PUSH_HPP_ /** @file supprwarn_push.hpp this file contains directives to make the * compiler ignore warnings in test code. It should NOT be used for c4stl * itself, but only in test code. */ #ifdef __clang__ # pragma clang diagnostic push /* NOTE: using , ## __VA_ARGS__ to deal with zero-args calls to * variadic macros is not portable, but works in clang, gcc, msvc, icc. * clang requires switching off compiler warnings for pedantic mode. * @see http://stackoverflow.com/questions/32047685/variadic-macro-without-arguments */ # pragma clang diagnostic ignored "-Wgnu-zero-variadic-macro-arguments" // warning: token pasting of ',' and __VA_ARGS__ is a GNU extension # pragma clang diagnostic ignored "-Wunused-local-typedef" # pragma clang diagnostic ignored "-Wsign-compare" // warning: comparison of integers of different signs: 'const unsigned long' and 'const int' # pragma clang diagnostic ignored "-Wfloat-equal" // warning: comparing floating point with == or != is unsafe # pragma clang diagnostic ignored "-Wwritable-strings" // ISO C++11 does not allow conversion from string literal to char* # pragma clang diagnostic ignored "-Wunused-variable" # pragma clang diagnostic ignored "-Wunused-parameter" # pragma clang diagnostic ignored "-Wold-style-cast" #elif defined(__GNUC__) # pragma GCC diagnostic push /* GCC also issues a warning for zero-args calls to variadic macros. * This warning is switched on with -pedantic and apparently there is no * easy way to turn it off as with clang. But marking this as a system * header works. * @see https://gcc.gnu.org/onlinedocs/cpp/System-Headers.html * @see http://stackoverflow.com/questions/35587137/ */ # pragma GCC system_header # pragma GCC diagnostic ignored "-Wvariadic-macros" # pragma GCC diagnostic ignored "-Wwrite-strings" // ISO C++ forbids converting a string constant to โ€˜C* {aka char*}โ€™ # pragma GCC diagnostic ignored "-Wunused-local-typedefs" # pragma GCC diagnostic ignored "-Wunused-variable" # pragma GCC diagnostic ignored "-Wunused-parameter" # pragma GCC diagnostic ignored "-Wsign-compare" // warning: comparison of integers of different signs: 'const unsigned long' and 'const int' # pragma GCC diagnostic ignored "-Wfloat-equal" // warning: comparing floating point with == or != is unsafe # pragma GCC diagnostic ignored "-Wpedantic" # pragma GCC diagnostic ignored "-pedantic" # pragma GCC diagnostic ignored "-Wold-style-cast" #elif defined(_MSC_VER) # pragma warning(push) # pragma warning(disable:4018) // '>=': signed/unsigned mismatch # pragma warning(disable:4127) // conditional expression is constant # pragma warning(disable:4189) // local variable is initialized but not referenced # pragma warning(disable:4389) // '==': signed/unsigned mismatch # pragma warning(disable:4611) // interaction between '_setjmp' and C++ object destruction is non-portable # pragma warning(disable:4702) // unreachable code #endif #endif /* _C4_LIBTEST_SUPPRWARN_PUSH_HPP_ */ c4core-0.2.6/test/c4/libtest/test.cpp000066400000000000000000000003431477602032300173200ustar00rootroot00000000000000#include "c4/test.hpp" namespace c4 { size_t TestErrorOccurs::num_errors = 0; #ifndef C4_EXCEPTIONS std::jmp_buf TestErrorOccurs::s_jmp_env_expect_error = {}; std::string TestErrorOccurs::s_jmp_msg; #endif } // namespace c4 c4core-0.2.6/test/c4/main.cpp000066400000000000000000000004601477602032300156170ustar00rootroot00000000000000#ifdef C4CORE_SINGLE_HEADER #include "c4/c4core_all.hpp" #else #include #endif #define DOCTEST_CONFIG_SUPER_FAST_ASSERTS #define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN #if !defined(C4_EXCEPTIONS) #define DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS #endif #include c4core-0.2.6/test/c4/test.hpp000066400000000000000000000340031477602032300156570ustar00rootroot00000000000000#ifndef _C4_TEST_HPP_ #define _C4_TEST_HPP_ #ifdef C4CORE_SINGLE_HEADER #include "c4/c4core_all.hpp" #else #include "c4/config.hpp" #include "c4/memory_resource.hpp" #include "c4/allocator.hpp" #include "c4/substr.hpp" #endif #include #include #ifdef C4_EXCEPTIONS #include #else #include #endif // FIXME - these are just dumb placeholders #define C4_LOGF_ERR(...) fprintf(stderr, __VA_ARGS__) #define C4_LOGF_WARN(...) fprintf(stderr, __VA_ARGS__) #define C4_LOGP(msg, ...) printf(msg) #define DOCTEST_CONFIG_SUPER_FAST_ASSERTS #if !defined(C4_EXCEPTIONS) #define DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS #endif #include // doctest does not provide these macros when exceptions are disabled // see https://github.com/doctest/doctest/issues/439 #if !defined(C4_EXCEPTIONS) # ifndef _MSC_VER # ifndef DOCTEST_REQUIRE # define _C4_DEFINE_DOCTEST_REQUIRE # endif # else # define _C4_DEFINE_DOCTEST_REQUIRE # endif # ifdef _C4_DEFINE_DOCTEST_REQUIRE # undef DOCTEST_REQUIRE # undef REQUIRE # undef DOCTEST_REQUIRE_TRUE # undef REQUIRE_TRUE # undef DOCTEST_REQUIRE_FALSE # undef REQUIRE_FALSE # undef DOCTEST_REQUIRE_EQ # undef REQUIRE_EQ # undef DOCTEST_REQUIRE_NE # undef REQUIRE_NE # undef DOCTEST_REQUIRE_GE # undef REQUIRE_GE # undef DOCTEST_REQUIRE_LE # undef REQUIRE_LE # undef DOCTEST_REQUIRE_GT # undef REQUIRE_GT # undef DOCTEST_REQUIRE_LT # undef REQUIRE_LT # define _DOCTEST_FAIL_IF_NOT1(cond) if(cond) {} else { std::abort(); } # define _DOCTEST_FAIL_IF_NOT2(lhs, op, rhs) if((lhs) op (rhs)) {} else { std::abort(); } # define _DOCTEST_REQUIRE2(id, lhs, op, rhs) do { CHECK##id(lhs, rhs); _DOCTEST_FAIL_IF_NOT2(lhs, op, rhs) } while(0) # define DOCTEST_REQUIRE(cond) do { CHECK(cond); _DOCTEST_FAIL_IF_NOT1(cond) } while(0) # define REQUIRE(cond) do { CHECK(cond); _DOCTEST_FAIL_IF_NOT1(cond) } while(0) # define DOCTEST_REQUIRE_TRUE(cond) do { CHECK(cond); _DOCTEST_FAIL_IF_NOT1(cond) } while(0) # define REQUIRE_TRUE(cond) do { CHECK(cond); _DOCTEST_FAIL_IF_NOT1(cond) } while(0) # define DOCTEST_REQUIRE_FALSE(cond) do { CHECK_FALSE(cond); _DOCTEST_FAIL_IF_NOT1(!(cond)) } while(0) # define REQUIRE_FALSE(cond) do { CHECK_FALSE(cond); _DOCTEST_FAIL_IF_NOT1(!(cond)) } while(0) # define DOCTEST_REQUIRE_EQ(lhs, rhs) _DOCTEST_REQUIRE2(_EQ, lhs, ==, rhs) # define REQUIRE_EQ(lhs, rhs) _DOCTEST_REQUIRE2(_EQ, lhs, ==, rhs) # define DOCTEST_REQUIRE_NE(lhs, rhs) _DOCTEST_REQUIRE2(_NE, lhs, !=, rhs) # define REQUIRE_NE(lhs, rhs) _DOCTEST_REQUIRE2(_NE, lhs, !=, rhs) # define DOCTEST_REQUIRE_GE(lhs, rhs) _DOCTEST_REQUIRE2(_GE, lhs, >=, rhs) # define REQUIRE_GE(lhs, rhs) _DOCTEST_REQUIRE2(_GE, lhs, >=, rhs) # define DOCTEST_REQUIRE_LE(lhs, rhs) _DOCTEST_REQUIRE2(_LE, lhs, <=, rhs) # define REQUIRE_LE(lhs, rhs) _DOCTEST_REQUIRE2(_LE, lhs, <=, rhs) # define DOCTEST_REQUIRE_GT(lhs, rhs) _DOCTEST_REQUIRE2(_GT, lhs, > , rhs) # define REQUIRE_GT(lhs, rhs) _DOCTEST_REQUIRE2(_GT, lhs, > , rhs) # define DOCTEST_REQUIRE_LT(lhs, rhs) _DOCTEST_REQUIRE2(_LT, lhs, < , rhs) # define REQUIRE_LT(lhs, rhs) _DOCTEST_REQUIRE2(_LT, lhs, < , rhs) # endif #endif #define CHECK_STREQ(lhs, rhs) CHECK_EQ(c4::to_csubstr(lhs), c4::to_csubstr(rhs)) #define CHECK_FLOAT_EQ(lhs, rhs) CHECK((double)(lhs) == doctest::Approx((double)(rhs))) namespace c4 { template inline std::ostream& operator<< (std::ostream& stream, c4::basic_substring s) { stream.write(s.str, std::streamsize(s.len)); return stream; } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /** RAII class that tests whether an error occurs inside a scope. */ struct TestErrorOccurs { static void error_callback(const char* msg, size_t msg_size) { ++num_errors; #ifdef C4_EXCEPTIONS throw std::runtime_error({msg, msg_size}); #else s_jmp_msg.assign(msg, msg_size); std::longjmp(s_jmp_env_expect_error, 37); #endif } template TestErrorOccurs(Fn &&fn, const char *expected_msg=nullptr) : tmp_settings(c4::ON_ERROR_CALLBACK, &TestErrorOccurs::error_callback) { CHECK_EQ(get_error_callback(), &TestErrorOccurs::error_callback); num_errors = 0; #ifdef C4_EXCEPTIONS try { fn(); } catch (std::runtime_error const& exc) { if(expected_msg) CHECK_EQ(exc.what(), expected_msg); } catch (...) { CHECK_EQ(1, 0); // fail } #else switch(setjmp(s_jmp_env_expect_error)) { case 0: fn(); break; case 37: // got expected error from call to fn() if(expected_msg) CHECK_EQ(s_jmp_msg, expected_msg); break; } #endif CHECK_EQ(num_errors, 1); } static size_t num_errors; #ifndef C4_EXCEPTIONS static std::jmp_buf s_jmp_env_expect_error; static std::string s_jmp_msg; #endif ScopedErrorSettings tmp_settings; }; #define C4_EXPECT_ERROR_OCCURS(...) \ auto C4_XCAT(_testerroroccurs, __LINE__) = c4::TestErrorOccurs(__VA_ARGS__) #if C4_USE_ASSERT # define C4_EXPECT_ASSERT_TRIGGERS(...) C4_EXPECT_ERROR_OCCURS(__VA_ARGS__) #else # define C4_EXPECT_ASSERT_TRIGGERS(...) #endif #if C4_USE_XASSERT # define C4_EXPECT_XASSERT_TRIGGERS(...) C4_EXPECT_ERROR_OCCURS(__VA_ARGS__) #else # define C4_EXPECT_XASSERT_TRIGGERS(...) #endif //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /** count constructors, destructors and assigns */ template< class T > struct Counting { using value_type = T; T obj; bool operator== (T const& that) const { return obj == that; } static bool log_ctors; static size_t num_ctors; template< class ...Args > Counting(Args && ...args); static bool log_dtors; static size_t num_dtors; ~Counting(); static bool log_copy_ctors; static size_t num_copy_ctors; Counting(Counting const& that); static bool log_move_ctors; static size_t num_move_ctors; Counting(Counting && that); static bool log_copy_assigns; static size_t num_copy_assigns; Counting& operator= (Counting const& that); static bool log_move_assigns; static size_t num_move_assigns; Counting& operator= (Counting && that); struct check_num { char const* name; size_t const& what; size_t const initial; size_t const must_be_num; check_num(char const* nm, size_t const& w, size_t n) : name(nm), what(w), initial(what), must_be_num(n) {} ~check_num() { size_t del = what - initial; INFO("# of " << name << " calls: expected " << must_be_num << ", but got " << del); CHECK_EQ(del, must_be_num); } }; static check_num check_ctors(size_t n) { return check_num("ctor", num_ctors, n); } static check_num check_dtors(size_t n) { return check_num("dtor", num_dtors, n); } static check_num check_copy_ctors(size_t n) { return check_num("copy_ctor", num_copy_ctors, n); } static check_num check_move_ctors(size_t n) { return check_num("move_ctor", num_move_ctors, n); } static check_num check_copy_assigns(size_t n) { return check_num("copy_assign", num_copy_assigns, n); } static check_num check_move_assigns(size_t n) { return check_num("move_assign", num_move_assigns, n); } struct check_num_ctors_dtors { check_num ctors, dtors; check_num_ctors_dtors(size_t _ctors, size_t _dtors) : ctors(check_ctors(_ctors)), dtors(check_dtors(_dtors)) { } }; static check_num_ctors_dtors check_ctors_dtors(size_t _ctors, size_t _dtors) { return check_num_ctors_dtors(_ctors, _dtors); } struct check_num_all { check_num ctors, dtors, cp_ctors, mv_ctors, cp_assigns, mv_assigns; check_num_all(size_t _ctors, size_t _dtors, size_t _cp_ctors, size_t _mv_ctors, size_t _cp_assigns, size_t _mv_assigns) { ctors = check_ctors(_ctors); dtors = check_dtors(_dtors); cp_ctors = check_copy_ctors(_cp_ctors); mv_ctors = check_move_ctors(_mv_ctors); cp_assigns = check_copy_assigns(_cp_assigns); mv_assigns = check_move_assigns(_mv_assigns); } }; static check_num_all check_all(size_t _ctors, size_t _dtors, size_t _cp_ctors, size_t _move_ctors, size_t _cp_assigns, size_t _mv_assigns) { return check_num_all(_ctors, _dtors, _cp_ctors, _move_ctors, _cp_assigns, _mv_assigns); } static void reset() { num_ctors = 0; num_dtors = 0; num_copy_ctors = 0; num_move_ctors = 0; num_copy_assigns = 0; num_move_assigns = 0; } }; template< class T > size_t Counting< T >::num_ctors = 0; template< class T > bool Counting< T >::log_ctors = false; template< class T > size_t Counting< T >::num_dtors = 0; template< class T > bool Counting< T >::log_dtors = false; template< class T > size_t Counting< T >::num_copy_ctors = 0; template< class T > bool Counting< T >::log_copy_ctors = false; template< class T > size_t Counting< T >::num_move_ctors = 0; template< class T > bool Counting< T >::log_move_ctors = false; template< class T > size_t Counting< T >::num_copy_assigns = 0; template< class T > bool Counting< T >::log_copy_assigns = false; template< class T > size_t Counting< T >::num_move_assigns = 0; template< class T > bool Counting< T >::log_move_assigns = false; template< class T > template< class ...Args > Counting< T >::Counting(Args && ...args) : obj(std::forward< Args >(args)...) { if(log_ctors) C4_LOGP("Counting[{}]::ctor #{}\n", (void*)this, num_ctors); ++num_ctors; } template< class T > Counting< T >::~Counting() { if(log_dtors) C4_LOGP("Counting[{}]::dtor #{}\n", (void*)this, num_dtors); ++num_dtors; } template< class T > Counting< T >::Counting(Counting const& that) : obj(that.obj) { if(log_copy_ctors) C4_LOGP("Counting[{}]::copy_ctor #{}\n", (void*)this, num_copy_ctors); ++num_copy_ctors; } template< class T > Counting< T >::Counting(Counting && that) : obj(std::move(that.obj)) { if(log_move_ctors) C4_LOGP("Counting[{}]::move_ctor #{}\n", (void*)this, num_move_ctors); ++num_move_ctors; } template< class T > Counting< T >& Counting< T >::operator= (Counting const& that) { obj = that.obj; if(log_copy_assigns) C4_LOGP("Counting[{}]::copy_assign #{}\n", (void*)this, num_copy_assigns); ++num_copy_assigns; return *this; } template< class T > Counting< T >& Counting< T >::operator= (Counting && that) { obj = std::move(that.obj); if(log_move_assigns) C4_LOGP("Counting[{}]::move_assign #{}\n", (void*)this, num_move_assigns); ++num_move_assigns; return *this; } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /** @todo refactor to use RAII @see Counting */ struct AllocationCountsChecker : public ScopedMemoryResourceCounts { AllocationCounts first; public: AllocationCountsChecker() : ScopedMemoryResourceCounts(), first(mr.counts()) { } AllocationCountsChecker(MemoryResource *mr_) : ScopedMemoryResourceCounts(mr_), first(mr.counts()) { } void reset() { first = mr.counts(); } /** check value of curr allocations and size */ void check_curr(ssize_t expected_allocs, ssize_t expected_size) const { CHECK_EQ(mr.counts().curr.allocs, expected_allocs); CHECK_EQ(mr.counts().curr.size, expected_size); } /** check delta of curr allocations and size since construction or last reset() */ void check_curr_delta(ssize_t expected_allocs, ssize_t expected_size) const { AllocationCounts delta = mr.counts() - first; CHECK_EQ(delta.curr.allocs, expected_allocs); CHECK_EQ(delta.curr.size, expected_size); } /** check value of total allocations and size */ void check_total(ssize_t expected_allocs, ssize_t expected_size) const { CHECK_EQ(mr.counts().total.allocs, expected_allocs); CHECK_EQ(mr.counts().total.size, expected_size); } /** check delta of total allocations and size since construction or last reset() */ void check_total_delta(ssize_t expected_allocs, ssize_t expected_size) const { AllocationCounts delta = mr.counts() - first; CHECK_EQ(delta.total.allocs, expected_allocs); CHECK_EQ(delta.total.size, expected_size); } /** check value of max allocations and size */ void check_max(ssize_t expected_max_allocs, ssize_t expected_max_size) const { CHECK_EQ(mr.counts().max.allocs, expected_max_allocs); CHECK_EQ(mr.counts().max.size, expected_max_size); } /** check that since construction or the last reset(): * - num_allocs occcurred * - totaling total_size * - of which the largest is max_size */ void check_all_delta(ssize_t num_allocs, ssize_t total_size, ssize_t max_size) const { check_curr_delta(num_allocs, total_size); check_total_delta(num_allocs, total_size); check_max(num_allocs > mr.counts().max.allocs ? num_allocs : mr.counts().max.allocs, max_size > mr.counts().max.size ? max_size : mr.counts().max.size); } }; } // namespace c4 #endif // _C4_LIBTEST_TEST_HPP_ c4core-0.2.6/test/printintegers.py000066400000000000000000000034611477602032300171340ustar00rootroot00000000000000 def nb(val): return [val-1, val, val+1] def ipowers2(min, max): vals = [] v = int(min / 2) while v < -10: vals += nb(v) v = int(v / 2) vals += upowers2(max) return vals def upowers2(max): vals = [] v = 16 while v < max: vals += nb(v) v *= 2 return vals def ipowers10(min, max): vals = [] v = -100 while v > min: vals += nb(v) v *= 10 vals += upowers10(max) return vals def upowers10(max): vals = [] v = 10 while v < max: vals += nb(v) v *= 10 return vals def idiv10(min, max): vals = [] v = int(min / 10) while v < -10: vals.append(v) v = int(v / 10) vals += udiv10(max) return vals def udiv10(max): vals = [] v = int(max / 10) while v > 10: vals += nb(v) v = int(v / 10) return vals def ivals(bits): min = -(1 << (bits-1)) max = -min-1 vals = [min, min+1, min+2, min+3, min+4, min+5] vals += ipowers2(min, max) vals += ipowers10(min, max) vals += idiv10(min, max) vals += [-11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] vals += [max-5, max-4, max-3, max-2, max-1, max] return sorted(list(set(vals))) def uvals(bits): max = (1 << bits) - 1 vals = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] vals += upowers2(max) vals += upowers10(max) vals += udiv10(max) vals += [max-5, max-4, max-3, max-2, max-1, max] return sorted(list(set(vals))) def p(v): return f' nc({v}, "{v}", "{hex(v)}", "{oct(v)}", "{bin(v)}"),' def pn(numbits, fn): print() for a in fn(numbits): print(p(a)) pn(8, ivals) pn(8, uvals) pn(16, ivals) pn(16, uvals) pn(32, ivals) pn(32, uvals) pn(64, ivals) pn(64, uvals) c4core-0.2.6/test/test_allocator.cpp000066400000000000000000000141321477602032300174050ustar00rootroot00000000000000#ifndef C4CORE_SINGLE_HEADER #include "c4/allocator.hpp" #endif #include "c4/test.hpp" #include "c4/libtest/supprwarn_push.hpp" #include #include #include namespace c4 { template< class T > using small_adapter = c4::small_allocator< T >; template< class T > using small_adapter_mr = c4::small_allocator_mr< T >; #define _c4definealloctypes(Alloc) \ using AllocInt = typename Alloc::template rebind::other;\ using AllocChar = typename Alloc::template rebind::other;\ using _string = std::basic_string< char, std::char_traits, AllocChar >;\ using AllocString = typename Alloc::template rebind<_string>::other;\ using AllocPair = typename Alloc::template rebind>::other;\ using _vector_int = std::vector;\ using _vector_string = std::vector<_string, AllocString >;\ using _map_string_int = std::map<_string, int, std::less<_string>, AllocPair >; //----------------------------------------------------------------------------- template< class Alloc > void test_traits_compat_construct(typename Alloc::value_type const& val, Alloc &a) { using atraits = std::allocator_traits< Alloc >; using value_type = typename Alloc::value_type; value_type *mem = a.allocate(1); REQUIRE_NE(mem, nullptr); atraits::construct(a, mem, val); CHECK_EQ(*mem, val); atraits::destroy(a, mem); a.deallocate(mem, 1); } TEST_CASE("allocator.traits_compat_construct") { allocator a; test_traits_compat_construct(1, a); } TEST_CASE("small_allocator.traits_compat_construct") { small_allocator a; test_traits_compat_construct(1, a); } TEST_CASE("allocator_mr_global.traits_compat_construct") { allocator_mr a; test_traits_compat_construct(1, a); } TEST_CASE("allocator_mr_linear.traits_compat_construct") { MemoryResourceLinear mr(1024); allocator_mr a(&mr); test_traits_compat_construct(1, a); } TEST_CASE("allocator_mr_linear_arr.traits_compat_construct") { MemoryResourceLinearArr<1024> mr; allocator_mr a(&mr); test_traits_compat_construct(1, a); } TEST_CASE("small_allocator_mr_global.traits_compat_construct") { small_allocator_mr a; test_traits_compat_construct(1, a); } TEST_CASE("small_allocator_mr_linear.traits_compat_construct") { MemoryResourceLinear mr(1024); small_allocator_mr a(&mr); test_traits_compat_construct(1, a); } TEST_CASE("small_allocator_mr_linear_arr.traits_compat_construct") { MemoryResourceLinearArr<1024> mr; small_allocator_mr a(&mr); test_traits_compat_construct(1, a); } //----------------------------------------------------------------------------- template struct clear_mr { template static void clear(Alloc) { //std::cout << C4_PRETTY_FUNC << "\n"; std::cout.flush(); } }; template<> struct clear_mr { template static void clear(Alloc a) { //std::cout << C4_PRETTY_FUNC << "\n"; std::cout.flush(); MemoryResourceLinear* mrl = static_cast(a.resource()); mrl->clear(); } }; template void do_std_containers_test(Alloc alloc) { _c4definealloctypes(Alloc); { _string v(alloc); v.reserve(256); v = "adskjhsdfkjdflkjsdfkjhsdfkjh"; CHECK_EQ(v, "adskjhsdfkjdflkjsdfkjhsdfkjh"); } clear_mr::clear(alloc); { int arr[128]; for(int &i : arr) { i = 42; } _vector_int vi(arr, arr+C4_COUNTOF(arr), alloc); for(int i : vi) { CHECK_EQ(i, 42); } } clear_mr::clear(alloc); { AllocChar a = alloc; _vector_string v({"foo", "bar", "baz", "bat", "bax"}, a); CHECK_EQ(v.size(), 5); CHECK_EQ(v[0], "foo"); CHECK_EQ(v[1], "bar"); CHECK_EQ(v[2], "baz"); CHECK_EQ(v[3], "bat"); CHECK_EQ(v[4], "bax"); } clear_mr::clear(alloc); { AllocString a = alloc; _vector_string v(a); v.resize(4); int count = 0; for(auto &s : v) { _string ss(size_t(64), (char)('0' + count++)); s = ss; } } clear_mr::clear(alloc); { #if !defined(__GNUC__) || (__GNUC__ >= 5) /* constructor does not exist on gcc < 5) */ AllocPair a = alloc; _map_string_int v(a); #else _map_string_int v; #endif CHECK_EQ(v.size(), 0); v["foo"] = 0; v["bar"] = 1; v["baz"] = 2; v["bat"] = 3; CHECK_EQ(v.size(), 4); CHECK_EQ(v["foo"], 0); CHECK_EQ(v["bar"], 1); CHECK_EQ(v["baz"], 2); CHECK_EQ(v["bat"], 3); } clear_mr::clear(alloc); } TEST_CASE("allocator_global.std_containers") { allocator a; do_std_containers_test(a); } TEST_CASE("small_allocator_global.std_containers") { /* this is failing, investigate small_allocator a; do_std_containers_test(a); */ } TEST_CASE("allocator_mr_global.std_containers") { allocator_mr a; do_std_containers_test(a); } TEST_CASE("allocator_mr_linear.std_containers") { MemoryResourceLinear mr(1024); allocator_mr a(&mr); do_std_containers_test(a); } TEST_CASE("allocator_mr_linear_arr.std_containers") { MemoryResourceLinearArr<1024> mr; allocator_mr a(&mr); do_std_containers_test(a); } TEST_CASE("small_allocator_mr_global.std_containers") { /* this is failing, investigate small_allocator_mr a; do_std_containers_test(a); */ } TEST_CASE("small_allocator_mr_linear.std_containers") { /* this is failing, investigate MemoryResourceLinear mr(1024); small_allocator_mr a(&mr); do_std_containers_test(a); */ } TEST_CASE("small_allocator_mr_linear_arr.std_containers") { /* this is failing, investigate MemoryResourceLinearArr<1024> mr; small_allocator_mr a(&mr); do_std_containers_test(a); */ } } // namespace c4 #include "c4/libtest/supprwarn_pop.hpp" c4core-0.2.6/test/test_base64.cpp000066400000000000000000000220031477602032300165050ustar00rootroot00000000000000#include "c4/test.hpp" #ifndef C4CORE_SINGLE_HEADER #include "c4/std/string.hpp" #include "c4/std/vector.hpp" #include "c4/format.hpp" #include "c4/base64.hpp" #endif #include "c4/libtest/supprwarn_push.hpp" #include C4_SUPPRESS_WARNING_MSVC_WITH_PUSH(4310) // cast truncates constant value namespace c4 { namespace detail { void base64_test_tables(); TEST_CASE("base64.infrastructure") { #ifndef NDEBUG detail::base64_test_tables(); #endif } // Since some the macros in c4/cpu.cpp cannot identify endanness at compile // time, we use a simple runtime endianness-detection routine. bool is_little_endian() { unsigned long const v = 1UL; unsigned char b[sizeof(v)]; std::memcpy(&b[0], &v, sizeof(v)); return !!b[0]; } } // namespace detail csubstr native(csubstr little_endian, csubstr big_endian) { return detail::is_little_endian() ? little_endian : big_endian; } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- template void test_base64_str_roundtrip(T const& val, csubstr expected, U *ws) { char buf_[512]; substr buf(buf_); csubstr encoded = to_chars_sub(buf, fmt::base64(val)); CHECK(base64_valid(encoded)); CHECK_EQ(encoded, expected); CHECK_EQ(encoded.len % 4, 0); auto req = fmt::base64(*ws); size_t written = from_chars(encoded, &req); CHECK_EQ(ws->first(written), val); } template void test_base64_roundtrip(T const& val, csubstr expected) { char buf_[512]; substr buf(buf_); csubstr encoded = to_chars_sub(buf, fmt::base64(val)); CHECK(base64_valid(encoded)); CHECK_EQ(encoded, expected); CHECK_EQ(encoded.len % 4, 0); T ws = {}; auto req = fmt::base64(ws); size_t written = from_chars(encoded, &req); CHECK_EQ(written, sizeof(T)); CHECK_EQ(ws, val); } template struct base64_test_pair { T val; csubstr encoded; }; base64_test_pair base64_str_pairs[] = { #define __(val, expected) {csubstr(val), csubstr(expected)} __("" , "" ), __("0" , "MA==" ), __("1" , "MQ==" ), __("2" , "Mg==" ), __("3" , "Mw==" ), __("4" , "NA==" ), __("5" , "NQ==" ), __("6" , "Ng==" ), __("7" , "Nw==" ), __("8" , "OA==" ), __("9" , "OQ==" ), __("10" , "MTA=" ), __("123" , "MTIz" ), __("1234" , "MTIzNA==" ), __("1235" , "MTIzNQ==" ), __("Man" , "TWFu" ), __("Ma" , "TWE=" ), __("M" , "TQ==" ), __("deadbeef" , "ZGVhZGJlZWY=" ), __("any carnal pleasure.", "YW55IGNhcm5hbCBwbGVhc3VyZS4="), __("any carnal pleasure" , "YW55IGNhcm5hbCBwbGVhc3VyZQ=="), __("any carnal pleasur" , "YW55IGNhcm5hbCBwbGVhc3Vy" ), __("any carnal pleasu" , "YW55IGNhcm5hbCBwbGVhc3U=" ), __("any carnal pleas" , "YW55IGNhcm5hbCBwbGVhcw==" ), __( "pleasure.", "cGxlYXN1cmUu" ), __( "leasure.", "bGVhc3VyZS4=" ), __( "easure.", "ZWFzdXJlLg==" ), __( "asure.", "YXN1cmUu" ), __( "sure.", "c3VyZS4=" ), #undef __ }; TEST_CASE("base64.invalid") { csubstr enc = "YW55IGNhcm5hbCBwbGVhc3VyZS4="; CHECK_EQ(base64_valid({nullptr, size_t(0)}), true); CHECK_EQ(base64_valid(enc.first(0)), true); CHECK_EQ(base64_valid(enc.first(1)), false); CHECK_EQ(base64_valid(enc.first(2)), false); CHECK_EQ(base64_valid(enc.first(3)), false); CHECK_EQ(base64_valid(enc.first(4)), true); CHECK_EQ(base64_valid(enc.first(5)), false); CHECK_EQ(base64_valid(enc.first(6)), false); CHECK_EQ(base64_valid(enc.first(7)), false); CHECK_EQ(base64_valid(enc.first(8)), true); } TEST_CASE("base64.str") { char buf_[512]; substr buf(buf_); for(auto p : base64_str_pairs) { INFO(p.val); test_base64_str_roundtrip(p.val, p.encoded, &buf); } } TEST_CASE_TEMPLATE("base64.8bit", T, int8_t, uint8_t) { base64_test_pair pairs[] = { {(T) 0, csubstr("AA==")}, {(T) 1, csubstr("AQ==")}, {(T) 2, csubstr("Ag==")}, {(T) 3, csubstr("Aw==")}, {(T) 4, csubstr("BA==")}, {(T) 5, csubstr("BQ==")}, {(T) 6, csubstr("Bg==")}, {(T) 7, csubstr("Bw==")}, {(T) 8, csubstr("CA==")}, {(T) 9, csubstr("CQ==")}, {(T) 10, csubstr("Cg==")}, {(T) 11, csubstr("Cw==")}, {(T) 12, csubstr("DA==")}, {(T) 13, csubstr("DQ==")}, {(T) 14, csubstr("Dg==")}, {(T) 15, csubstr("Dw==")}, {(T) 16, csubstr("EA==")}, {(T) 17, csubstr("EQ==")}, {(T) 18, csubstr("Eg==")}, {(T) 19, csubstr("Ew==")}, {(T) 20, csubstr("FA==")}, {(T)127, csubstr("fw==")}, {(T)128, csubstr("gA==")}, {(T)254, csubstr("/g==")}, {(T)255, csubstr("/w==")}, }; for(auto p : pairs) { INFO("val=" << (int)p.val << " expected=" << p.encoded); test_base64_roundtrip(p.val, p.encoded); } } TEST_CASE_TEMPLATE("base64.16bit", T, int16_t, uint16_t) { base64_test_pair pairs[] = { { 0, native("AAA=", "AAA=")}, { 1, native("AQA=", "AAE=")}, { 2, native("AgA=", "AAI=")}, { 3, native("AwA=", "AAM=")}, { 4, native("BAA=", "AAQ=")}, { 5, native("BQA=", "AAU=")}, { 6, native("BgA=", "AAY=")}, { 7, native("BwA=", "AAc=")}, { 8, native("CAA=", "AAg=")}, { 9, native("CQA=", "AAk=")}, { 10, native("CgA=", "AAo=")}, {1234, native("0gQ=", "BNI=")}, }; for(auto p : pairs) { INFO("val=" << p.val << " expected=" << p.encoded); test_base64_roundtrip(p.val, p.encoded); } } TEST_CASE_TEMPLATE("base64.32bit", T, int32_t, uint32_t) { base64_test_pair pairs[] = { { 0, native("AAAAAA==", "AAAAAA==")}, { 1, native("AQAAAA==", "AAAAAQ==")}, { 2, native("AgAAAA==", "AAAAAg==")}, { 3, native("AwAAAA==", "AAAAAw==")}, { 4, native("BAAAAA==", "AAAABA==")}, { 5, native("BQAAAA==", "AAAABQ==")}, { 6, native("BgAAAA==", "AAAABg==")}, { 7, native("BwAAAA==", "AAAABw==")}, { 8, native("CAAAAA==", "AAAACA==")}, { 9, native("CQAAAA==", "AAAACQ==")}, { 10, native("CgAAAA==", "AAAACg==")}, {1234, native("0gQAAA==", "AAAE0g==")}, }; for(auto p : pairs) { INFO("val=" << p.val << " expected=" << p.encoded); test_base64_roundtrip(p.val, p.encoded); } } TEST_CASE_TEMPLATE("base64.64bit", T, int64_t, uint64_t) { base64_test_pair pairs[] = { { 0, native("AAAAAAAAAAA=", "AAAAAAAAAAA=")}, { 1, native("AQAAAAAAAAA=", "AAAAAAAAAAE=")}, { 2, native("AgAAAAAAAAA=", "AAAAAAAAAAI=")}, { 3, native("AwAAAAAAAAA=", "AAAAAAAAAAM=")}, { 4, native("BAAAAAAAAAA=", "AAAAAAAAAAQ=")}, { 5, native("BQAAAAAAAAA=", "AAAAAAAAAAU=")}, { 6, native("BgAAAAAAAAA=", "AAAAAAAAAAY=")}, { 7, native("BwAAAAAAAAA=", "AAAAAAAAAAc=")}, { 8, native("CAAAAAAAAAA=", "AAAAAAAAAAg=")}, { 9, native("CQAAAAAAAAA=", "AAAAAAAAAAk=")}, { 10, native("CgAAAAAAAAA=", "AAAAAAAAAAo=")}, {1234, native("0gQAAAAAAAA=", "AAAAAAAABNI=")}, {0xdeadbeef, native("776t3gAAAAA=", "AAAAAN6tvu8=")}, }; for(auto p : pairs) { INFO("val=" << p.val << " expected=" << p.encoded); test_base64_roundtrip(p.val, p.encoded); } } TEST_CASE("base64.high_bits_u32") { test_base64_roundtrip(UINT32_C(0xdeadbeef), native("776t3g==", "3q2+7w==")); test_base64_roundtrip(UINT32_MAX, native("/////w==", "/////w==")); } TEST_CASE("base64.high_bits_i32") { test_base64_roundtrip(INT32_C(0x7fffffff), native("////fw==", "f////w==")); test_base64_roundtrip(INT32_MAX, native("////fw==", "f////w==")); } TEST_CASE("base64.high_bits_u64") { test_base64_roundtrip(UINT64_MAX, native("//////////8=", "//////////8=")); } TEST_CASE("base64.high_bits_i64") { test_base64_roundtrip(INT64_MAX, native("/////////38=", "f/////////8=")); } } // namespace c4 C4_SUPPRESS_WARNING_MSVC_POP #include "c4/libtest/supprwarn_pop.hpp" c4core-0.2.6/test/test_bitmask.cpp000066400000000000000000000461601477602032300170650ustar00rootroot00000000000000#include #include #ifndef C4CORE_SINGLE_HEADER #include #include #endif #include #include "./test_enum_common.hpp" template void cmp_enum(Enum lhs, Enum rhs) { using I = typename std::underlying_type::type; CHECK_EQ(static_cast(lhs), static_cast(rhs)); } C4_SUPPRESS_WARNING_GCC_CLANG_WITH_PUSH("-Wold-style-cast") //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- TEST_CASE("str2bm.simple_bitmask") { using namespace c4; std::vector str; CHECK_EQ(BM_NONE, str2bm("BM_NONE")); CHECK_EQ(BM_NONE, str2bm("NONE")); CHECK_EQ(BM_NONE, str2bm("0")); CHECK_EQ(BM_NONE, str2bm("0x0")); CHECK_EQ(BM_FOO, str2bm("BM_FOO")); CHECK_EQ(BM_FOO, str2bm("FOO")); CHECK_EQ(BM_FOO, str2bm("1")); CHECK_EQ(BM_FOO, str2bm("0x1")); CHECK_EQ(BM_FOO, str2bm("BM_NONE|0x1")); CHECK_EQ(BM_BAR, str2bm("BM_BAR")); CHECK_EQ(BM_BAR, str2bm("BAR")); CHECK_EQ(BM_BAR, str2bm("2")); CHECK_EQ(BM_BAR, str2bm("0x2")); CHECK_EQ(BM_BAR, str2bm("BM_NONE|0x2")); CHECK_EQ(BM_BAZ, str2bm("BM_BAZ")); CHECK_EQ(BM_BAZ, str2bm("BAZ")); CHECK_EQ(BM_BAZ, str2bm("4")); CHECK_EQ(BM_BAZ, str2bm("0x4")); CHECK_EQ(BM_FOO_BAR, str2bm("BM_FOO|BM_BAR")); CHECK_EQ(BM_FOO_BAR, str2bm("BM_FOO|BAR")); CHECK_EQ(BM_FOO_BAR, str2bm("FOO|BM_BAR")); CHECK_EQ(BM_FOO_BAR, str2bm("BM_FOO_BAR")); CHECK_EQ(BM_FOO_BAR, str2bm("FOO_BAR")); CHECK_EQ(BM_FOO_BAR, str2bm("FOO|BAR")); CHECK_EQ(BM_FOO_BAR, str2bm("0x1|0x2")); CHECK_EQ(BM_FOO_BAR, str2bm("1|2")); CHECK_EQ(BM_FOO_BAR, str2bm("0x3")); CHECK_EQ(BM_FOO_BAR, str2bm("3")); CHECK_EQ(BM_FOO_BAR_BAZ, str2bm("BM_FOO|BM_BAR|BM_BAZ")); CHECK_EQ(BM_FOO_BAR_BAZ, str2bm("BM_FOO|BM_BAR|BAZ")); CHECK_EQ(BM_FOO_BAR_BAZ, str2bm("BM_FOO|BAR|BM_BAZ")); CHECK_EQ(BM_FOO_BAR_BAZ, str2bm("FOO|BM_BAR|BM_BAZ")); CHECK_EQ(BM_FOO_BAR_BAZ, str2bm("FOO|BM_BAR|BAZ")); CHECK_EQ(BM_FOO_BAR_BAZ, str2bm("FOO|BAR|BM_BAZ")); CHECK_EQ(BM_FOO_BAR_BAZ, str2bm("FOO|BAR|BAZ")); CHECK_EQ(BM_FOO_BAR_BAZ, str2bm("FOO_BAR|BAZ")); CHECK_EQ(BM_FOO_BAR_BAZ, str2bm("BM_FOO_BAR|BAZ")); CHECK_EQ(BM_FOO_BAR_BAZ, str2bm("0x1|BAR|BAZ")); CHECK_EQ(BM_FOO_BAR_BAZ, str2bm("FOO|0x2|BAZ")); CHECK_EQ(BM_FOO_BAR_BAZ, str2bm("FOO|BAR|0x4")); CHECK_EQ(BM_FOO_BAR_BAZ, str2bm("0x1|0x2|0x4")); CHECK_EQ(BM_FOO_BAR_BAZ, str2bm("0x7")); CHECK_EQ(BM_FOO_BAR_BAZ, str2bm("7")); } TEST_CASE("str2bm.scoped_bitmask") { using namespace c4; std::vector str; using bmt = MyBitmaskClass; cmp_enum(bmt::BM_NONE, (bmt)str2bm("MyBitmaskClass::BM_NONE")); cmp_enum(bmt::BM_FOO, (bmt)str2bm("MyBitmaskClass::BM_FOO")); cmp_enum(bmt::BM_BAR, (bmt)str2bm("MyBitmaskClass::BM_BAR")); cmp_enum(bmt::BM_BAZ, (bmt)str2bm("MyBitmaskClass::BM_BAZ")); cmp_enum(bmt::BM_FOO_BAR, (bmt)str2bm("MyBitmaskClass::BM_FOO_BAR")); cmp_enum(bmt::BM_FOO_BAR_BAZ, (bmt)str2bm("MyBitmaskClass::BM_FOO_BAR_BAZ")); cmp_enum(bmt::BM_NONE, (bmt)str2bm("BM_NONE")); cmp_enum(bmt::BM_FOO, (bmt)str2bm("BM_FOO")); cmp_enum(bmt::BM_BAR, (bmt)str2bm("BM_BAR")); cmp_enum(bmt::BM_BAZ, (bmt)str2bm("BM_BAZ")); cmp_enum(bmt::BM_FOO_BAR, (bmt)str2bm("BM_FOO_BAR")); cmp_enum(bmt::BM_FOO_BAR_BAZ, (bmt)str2bm("BM_FOO_BAR_BAZ")); cmp_enum(bmt::BM_NONE, (bmt)str2bm("NONE")); cmp_enum(bmt::BM_FOO, (bmt)str2bm("FOO")); cmp_enum(bmt::BM_BAR, (bmt)str2bm("BAR")); cmp_enum(bmt::BM_BAZ, (bmt)str2bm("BAZ")); cmp_enum(bmt::BM_FOO_BAR, (bmt)str2bm("FOO_BAR")); cmp_enum(bmt::BM_FOO_BAR_BAZ, (bmt)str2bm("FOO_BAR_BAZ")); cmp_enum(bmt::BM_NONE, (bmt)str2bm("NONE")); cmp_enum(bmt::BM_NONE, (bmt)str2bm("BM_NONE")); cmp_enum(bmt::BM_NONE, (bmt)str2bm("MyBitmaskClass::BM_NONE")); cmp_enum(bmt::BM_NONE, (bmt)str2bm("0")); cmp_enum(bmt::BM_NONE, (bmt)str2bm("0x0")); cmp_enum(bmt::BM_FOO, (bmt)str2bm("FOO")); cmp_enum(bmt::BM_FOO, (bmt)str2bm("BM_FOO")); cmp_enum(bmt::BM_FOO, (bmt)str2bm("MyBitmaskClass::BM_FOO")); cmp_enum(bmt::BM_FOO, (bmt)str2bm("1")); cmp_enum(bmt::BM_FOO, (bmt)str2bm("0x1")); cmp_enum(bmt::BM_FOO, (bmt)str2bm("NONE|0x1")); cmp_enum(bmt::BM_FOO, (bmt)str2bm("BM_NONE|0x1")); cmp_enum(bmt::BM_FOO, (bmt)str2bm("MyBitmaskClass::BM_NONE|0x1")); cmp_enum(bmt::BM_BAR, (bmt)str2bm("BAR")); cmp_enum(bmt::BM_BAR, (bmt)str2bm("BM_BAR")); cmp_enum(bmt::BM_BAR, (bmt)str2bm("MyBitmaskClass::BM_BAR")); cmp_enum(bmt::BM_BAR, (bmt)str2bm("2")); cmp_enum(bmt::BM_BAR, (bmt)str2bm("0x2")); cmp_enum(bmt::BM_BAZ, (bmt)str2bm("BAZ")); cmp_enum(bmt::BM_BAZ, (bmt)str2bm("BM_BAZ")); cmp_enum(bmt::BM_BAZ, (bmt)str2bm("MyBitmaskClass::BM_BAZ")); cmp_enum(bmt::BM_BAR, (bmt)str2bm("BM_NONE|0x2")); cmp_enum(bmt::BM_BAR, (bmt)str2bm("MyBitmaskClass::BM_NONE|0x2")); cmp_enum(bmt::BM_BAZ, (bmt)str2bm("4")); cmp_enum(bmt::BM_BAZ, (bmt)str2bm("0x4")); cmp_enum(bmt::BM_FOO_BAR, (bmt)str2bm("BM_FOO|BM_BAR")); cmp_enum(bmt::BM_FOO_BAR, (bmt)str2bm("MyBitmaskClass::BM_FOO|MyBitmaskClass::BM_BAR")); cmp_enum(bmt::BM_FOO_BAR, (bmt)str2bm("BM_FOO|BAR")); cmp_enum(bmt::BM_FOO_BAR, (bmt)str2bm("MyBitmaskClass::BM_FOO|BAR")); cmp_enum(bmt::BM_FOO_BAR, (bmt)str2bm("FOO|BM_BAR")); cmp_enum(bmt::BM_FOO_BAR, (bmt)str2bm("FOO|MyBitmaskClass::BM_BAR")); cmp_enum(bmt::BM_FOO_BAR, (bmt)str2bm("BM_FOO_BAR")); cmp_enum(bmt::BM_FOO_BAR, (bmt)str2bm("MyBitmaskClass::BM_FOO_BAR")); cmp_enum(bmt::BM_FOO_BAR, (bmt)str2bm("FOO_BAR")); cmp_enum(bmt::BM_FOO_BAR, (bmt)str2bm("FOO|BAR")); cmp_enum(bmt::BM_FOO_BAR, (bmt)str2bm("0x1|0x2")); cmp_enum(bmt::BM_FOO_BAR, (bmt)str2bm("1|2")); cmp_enum(bmt::BM_FOO_BAR, (bmt)str2bm("0x3")); cmp_enum(bmt::BM_FOO_BAR, (bmt)str2bm("3")); cmp_enum(bmt::BM_FOO_BAR_BAZ, (bmt)str2bm("BM_FOO|BM_BAR|BM_BAZ")); cmp_enum(bmt::BM_FOO_BAR_BAZ, (bmt)str2bm("MyBitmaskClass::BM_FOO|MyBitmaskClass::BM_BAR|MyBitmaskClass::BM_BAZ")); cmp_enum(bmt::BM_FOO_BAR_BAZ, (bmt)str2bm("BM_FOO|BM_BAR|BAZ")); cmp_enum(bmt::BM_FOO_BAR_BAZ, (bmt)str2bm("MyBitmaskClass::BM_FOO|MyBitmaskClass::BM_BAR|BAZ")); cmp_enum(bmt::BM_FOO_BAR_BAZ, (bmt)str2bm("BM_FOO|BAR|BM_BAZ")); cmp_enum(bmt::BM_FOO_BAR_BAZ, (bmt)str2bm("BM_FOO|BAR|MyBitmaskClass::BM_BAZ")); cmp_enum(bmt::BM_FOO_BAR_BAZ, (bmt)str2bm("FOO|BM_BAR|BM_BAZ")); cmp_enum(bmt::BM_FOO_BAR_BAZ, (bmt)str2bm("FOO|MyBitmaskClass::BM_BAR|MyBitmaskClass::BM_BAZ")); cmp_enum(bmt::BM_FOO_BAR_BAZ, (bmt)str2bm("FOO|BM_BAR|BAZ")); cmp_enum(bmt::BM_FOO_BAR_BAZ, (bmt)str2bm("FOO|MyBitmaskClass::BM_BAR|BAZ")); cmp_enum(bmt::BM_FOO_BAR_BAZ, (bmt)str2bm("FOO|BAR|BM_BAZ")); cmp_enum(bmt::BM_FOO_BAR_BAZ, (bmt)str2bm("FOO|BAR|MyBitmaskClass::BM_BAZ")); cmp_enum(bmt::BM_FOO_BAR_BAZ, (bmt)str2bm("FOO|BAR|BAZ")); cmp_enum(bmt::BM_FOO_BAR_BAZ, (bmt)str2bm("FOO_BAR|BAZ")); cmp_enum(bmt::BM_FOO_BAR_BAZ, (bmt)str2bm("MyBitmaskClass::BM_FOO_BAR|BAZ")); cmp_enum(bmt::BM_FOO_BAR_BAZ, (bmt)str2bm("0x1|BAR|BAZ")); cmp_enum(bmt::BM_FOO_BAR_BAZ, (bmt)str2bm("FOO|0x2|BAZ")); cmp_enum(bmt::BM_FOO_BAR_BAZ, (bmt)str2bm("FOO|BAR|0x4")); cmp_enum(bmt::BM_FOO_BAR_BAZ, (bmt)str2bm("0x1|0x2|0x4")); cmp_enum(bmt::BM_FOO_BAR_BAZ, (bmt)str2bm("0x7")); cmp_enum(bmt::BM_FOO_BAR_BAZ, (bmt)str2bm("0x7")); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //---------------------------------------------------------------------------- template const char* do_bm2str(Enum e, std::vector *s, c4::EnumOffsetType which) { size_t len = c4::bm2str(e, nullptr, 0, which); C4_CHECK(len > 0); s->resize(len); C4_CHECK(s->data() != nullptr); c4::bm2str(e, s->data(), s->size(), which); return s->data(); } TEST_CASE("bm2str.simple_bitmask") { using namespace c4; std::vector str; CHECK_STREQ(do_bm2str(BM_NONE, &str, EOFFS_NONE), "BM_NONE"); CHECK_STREQ(do_bm2str(BM_FOO, &str, EOFFS_NONE), "BM_FOO"); CHECK_STREQ(do_bm2str(BM_BAR, &str, EOFFS_NONE), "BM_BAR"); CHECK_STREQ(do_bm2str(BM_BAZ, &str, EOFFS_NONE), "BM_BAZ"); CHECK_STREQ(do_bm2str(BM_FOO_BAR, &str, EOFFS_NONE), "BM_FOO_BAR"); CHECK_STREQ(do_bm2str(BM_FOO_BAR_BAZ, &str, EOFFS_NONE), "BM_FOO_BAR_BAZ"); CHECK_STREQ(do_bm2str(BM_NONE, &str, EOFFS_CLS ), "BM_NONE"); CHECK_STREQ(do_bm2str(BM_FOO, &str, EOFFS_CLS ), "BM_FOO"); CHECK_STREQ(do_bm2str(BM_BAR, &str, EOFFS_CLS ), "BM_BAR"); CHECK_STREQ(do_bm2str(BM_BAZ, &str, EOFFS_CLS ), "BM_BAZ"); CHECK_STREQ(do_bm2str(BM_FOO_BAR, &str, EOFFS_CLS ), "BM_FOO_BAR"); CHECK_STREQ(do_bm2str(BM_FOO_BAR_BAZ, &str, EOFFS_CLS ), "BM_FOO_BAR_BAZ"); CHECK_STREQ(do_bm2str(BM_NONE, &str, EOFFS_PFX ), "NONE"); CHECK_STREQ(do_bm2str(BM_FOO, &str, EOFFS_PFX ), "FOO"); CHECK_STREQ(do_bm2str(BM_BAR, &str, EOFFS_PFX ), "BAR"); CHECK_STREQ(do_bm2str(BM_BAZ, &str, EOFFS_PFX ), "BAZ"); CHECK_STREQ(do_bm2str(BM_FOO_BAR, &str, EOFFS_PFX ), "FOO_BAR"); CHECK_STREQ(do_bm2str(BM_FOO_BAR_BAZ, &str, EOFFS_PFX ), "FOO_BAR_BAZ"); } TEST_CASE("bm2str.scoped_bitmask") { using namespace c4; std::vector str; CHECK_STREQ(do_bm2str(MyBitmaskClass::BM_NONE, &str, EOFFS_NONE), "MyBitmaskClass::BM_NONE"); CHECK_STREQ(do_bm2str(MyBitmaskClass::BM_FOO, &str, EOFFS_NONE), "MyBitmaskClass::BM_FOO"); CHECK_STREQ(do_bm2str(MyBitmaskClass::BM_BAR, &str, EOFFS_NONE), "MyBitmaskClass::BM_BAR"); CHECK_STREQ(do_bm2str(MyBitmaskClass::BM_BAZ, &str, EOFFS_NONE), "MyBitmaskClass::BM_BAZ"); CHECK_STREQ(do_bm2str(MyBitmaskClass::BM_FOO_BAR, &str, EOFFS_NONE), "MyBitmaskClass::BM_FOO_BAR"); CHECK_STREQ(do_bm2str(MyBitmaskClass::BM_FOO_BAR_BAZ, &str, EOFFS_NONE), "MyBitmaskClass::BM_FOO_BAR_BAZ"); CHECK_STREQ(do_bm2str(MyBitmaskClass::BM_NONE, &str, EOFFS_CLS ), "BM_NONE"); CHECK_STREQ(do_bm2str(MyBitmaskClass::BM_FOO, &str, EOFFS_CLS ), "BM_FOO"); CHECK_STREQ(do_bm2str(MyBitmaskClass::BM_BAR, &str, EOFFS_CLS ), "BM_BAR"); CHECK_STREQ(do_bm2str(MyBitmaskClass::BM_BAZ, &str, EOFFS_CLS ), "BM_BAZ"); CHECK_STREQ(do_bm2str(MyBitmaskClass::BM_FOO_BAR, &str, EOFFS_CLS ), "BM_FOO_BAR"); CHECK_STREQ(do_bm2str(MyBitmaskClass::BM_FOO_BAR_BAZ, &str, EOFFS_CLS ), "BM_FOO_BAR_BAZ"); CHECK_STREQ(do_bm2str(MyBitmaskClass::BM_NONE, &str, EOFFS_PFX ), "NONE"); CHECK_STREQ(do_bm2str(MyBitmaskClass::BM_FOO, &str, EOFFS_PFX ), "FOO"); CHECK_STREQ(do_bm2str(MyBitmaskClass::BM_BAR, &str, EOFFS_PFX ), "BAR"); CHECK_STREQ(do_bm2str(MyBitmaskClass::BM_BAZ, &str, EOFFS_PFX ), "BAZ"); CHECK_STREQ(do_bm2str(MyBitmaskClass::BM_FOO_BAR, &str, EOFFS_PFX ), "FOO_BAR"); CHECK_STREQ(do_bm2str(MyBitmaskClass::BM_FOO_BAR_BAZ, &str, EOFFS_PFX ), "FOO_BAR_BAZ"); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //---------------------------------------------------------------------------- template std::string do_bm2stream(Enum e, c4::EnumOffsetType which) { std::stringstream ss; c4::bm2stream(ss, e, which); return ss.str(); } TEST_CASE("bm2stream.simple_bitmask") { using namespace c4; CHECK_EQ(do_bm2stream(BM_NONE, EOFFS_NONE), "BM_NONE"); CHECK_EQ(do_bm2stream(BM_FOO, EOFFS_NONE), "BM_FOO"); CHECK_EQ(do_bm2stream(BM_BAR, EOFFS_NONE), "BM_BAR"); CHECK_EQ(do_bm2stream(BM_BAZ, EOFFS_NONE), "BM_BAZ"); CHECK_EQ(do_bm2stream(BM_FOO_BAR, EOFFS_NONE), "BM_FOO_BAR"); CHECK_EQ(do_bm2stream(BM_FOO_BAR_BAZ, EOFFS_NONE), "BM_FOO_BAR_BAZ"); CHECK_EQ(do_bm2stream(BM_NONE, EOFFS_CLS ), "BM_NONE"); CHECK_EQ(do_bm2stream(BM_FOO, EOFFS_CLS ), "BM_FOO"); CHECK_EQ(do_bm2stream(BM_BAR, EOFFS_CLS ), "BM_BAR"); CHECK_EQ(do_bm2stream(BM_BAZ, EOFFS_CLS ), "BM_BAZ"); CHECK_EQ(do_bm2stream(BM_FOO_BAR, EOFFS_CLS ), "BM_FOO_BAR"); CHECK_EQ(do_bm2stream(BM_FOO_BAR_BAZ, EOFFS_CLS ), "BM_FOO_BAR_BAZ"); CHECK_EQ(do_bm2stream(BM_NONE, EOFFS_PFX ), "NONE"); CHECK_EQ(do_bm2stream(BM_FOO, EOFFS_PFX ), "FOO"); CHECK_EQ(do_bm2stream(BM_BAR, EOFFS_PFX ), "BAR"); CHECK_EQ(do_bm2stream(BM_BAZ, EOFFS_PFX ), "BAZ"); CHECK_EQ(do_bm2stream(BM_FOO_BAR, EOFFS_PFX ), "FOO_BAR"); CHECK_EQ(do_bm2stream(BM_FOO_BAR_BAZ, EOFFS_PFX ), "FOO_BAR_BAZ"); } TEST_CASE("bm2stream.scoped_bitmask") { using namespace c4; CHECK_EQ(do_bm2stream(MyBitmaskClass::BM_NONE, EOFFS_NONE), "MyBitmaskClass::BM_NONE"); CHECK_EQ(do_bm2stream(MyBitmaskClass::BM_FOO, EOFFS_NONE), "MyBitmaskClass::BM_FOO"); CHECK_EQ(do_bm2stream(MyBitmaskClass::BM_BAR, EOFFS_NONE), "MyBitmaskClass::BM_BAR"); CHECK_EQ(do_bm2stream(MyBitmaskClass::BM_BAZ, EOFFS_NONE), "MyBitmaskClass::BM_BAZ"); CHECK_EQ(do_bm2stream(MyBitmaskClass::BM_FOO_BAR, EOFFS_NONE), "MyBitmaskClass::BM_FOO_BAR"); CHECK_EQ(do_bm2stream(MyBitmaskClass::BM_FOO_BAR_BAZ, EOFFS_NONE), "MyBitmaskClass::BM_FOO_BAR_BAZ"); CHECK_EQ(do_bm2stream(MyBitmaskClass::BM_NONE, EOFFS_CLS ), "BM_NONE"); CHECK_EQ(do_bm2stream(MyBitmaskClass::BM_FOO, EOFFS_CLS ), "BM_FOO"); CHECK_EQ(do_bm2stream(MyBitmaskClass::BM_BAR, EOFFS_CLS ), "BM_BAR"); CHECK_EQ(do_bm2stream(MyBitmaskClass::BM_BAZ, EOFFS_CLS ), "BM_BAZ"); CHECK_EQ(do_bm2stream(MyBitmaskClass::BM_FOO_BAR, EOFFS_CLS ), "BM_FOO_BAR"); CHECK_EQ(do_bm2stream(MyBitmaskClass::BM_FOO_BAR_BAZ, EOFFS_CLS ), "BM_FOO_BAR_BAZ"); CHECK_EQ(do_bm2stream(MyBitmaskClass::BM_NONE, EOFFS_PFX ), "NONE"); CHECK_EQ(do_bm2stream(MyBitmaskClass::BM_FOO, EOFFS_PFX ), "FOO"); CHECK_EQ(do_bm2stream(MyBitmaskClass::BM_BAR, EOFFS_PFX ), "BAR"); CHECK_EQ(do_bm2stream(MyBitmaskClass::BM_BAZ, EOFFS_PFX ), "BAZ"); CHECK_EQ(do_bm2stream(MyBitmaskClass::BM_FOO_BAR, EOFFS_PFX ), "FOO_BAR"); CHECK_EQ(do_bm2stream(MyBitmaskClass::BM_FOO_BAR_BAZ, EOFFS_PFX ), "FOO_BAR_BAZ"); } TEST_CASE("bm2stream.simple_bitmask_without_null_symbol") { using namespace c4; CHECK_EQ(do_bm2stream(BM_KABOOM, EOFFS_NONE), "KABOOM"); CHECK_EQ(do_bm2stream((BmWithoutNull)0, EOFFS_NONE), "0"); } TEST_CASE("bm2stream.bitmask_class_without_null_symbol") { using namespace c4; CHECK_EQ(do_bm2stream(BmClassWithoutNull::BM_KABOOM, EOFFS_PFX), "KABOOM"); CHECK_EQ(do_bm2stream((BmClassWithoutNull)0, EOFFS_NONE), "0"); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //---------------------------------------------------------------------------- // TODO template void test_bm2str() { using namespace c4; using I = typename std::underlying_type::type; int combination_depth = 4; auto syms = esyms(); std::vector indices; std::string str; std::vector ws; I val = 0, res; size_t len; for(int k = 1; k <= combination_depth; ++k) { indices.clear(); indices.resize(static_cast(k)); while(1) { str.clear(); val = 0; for(auto i : indices) { if(!str.empty()) str += '|'; str += syms[i].name; val |= static_cast(syms[i].value); //printf("%d", i); } //len = bm2str(val); // needed length //ws.resize(len); //bm2str(val, &ws[0], len); //printf(": %s (%zu) %s\n", str.c_str(), (uint64_t)val, ws.data()); res = str2bm(str.data()); CHECK_EQ(res, val); len = bm2str(res); // needed length ws.resize(len); bm2str(val, &ws[0], len); res = str2bm(ws.data()); CHECK_EQ(res, val); // write a string with the bitmask as an int c4::catrs(&ws, val); res = str2bm(str.data()); CHECK_EQ(res, val); bool carry = true; for(size_t i = static_cast(k-1); i != size_t(-1); --i) { if(indices[i] + 1 < syms.size()) { ++indices[i]; carry = false; break; } else { indices[i] = 0; } } if(carry) { break; } } // while(1) } // for k } C4_SUPPRESS_WARNING_GCC_CLANG_POP c4core-0.2.6/test/test_blob.cpp000066400000000000000000000046731477602032300163540ustar00rootroot00000000000000#ifndef C4CORE_SINGLE_HEADER #include "c4/blob.hpp" #endif #include "c4/test.hpp" #ifdef __clang__ # pragma clang diagnostic push # pragma clang diagnostic ignored "-Wcast-align" # pragma clang diagnostic ignored "-Wold-style-cast" #elif defined(__GNUC__) # pragma GCC diagnostic push # pragma GCC diagnostic ignored "-Wcast-align" # pragma GCC diagnostic ignored "-Wold-style-cast" #endif namespace c4 { TEST_CASE("blob.default_ctor") { { blob b = {}; CHECK_EQ(b.buf, nullptr); CHECK_EQ(b.len, 0u); } { cblob b = {}; CHECK_EQ(b.buf, nullptr); CHECK_EQ(b.len, 0u); } } template void test_blob_copy(blob const& b) { { blob_ b2(b); CHECK_EQ(b2.buf, b.buf); CHECK_EQ(b2.len, b.len); } { blob_ b2 = b; CHECK_EQ(b2.buf, b.buf); CHECK_EQ(b2.len, b.len); } { blob_ b3(b); CHECK_EQ(b3.buf, b.buf); CHECK_EQ(b3.len, b.len); } { blob_ b3 = b; CHECK_EQ(b3.buf, b.buf); CHECK_EQ(b3.len, b.len); } { blob_ b2(b); CHECK_EQ(b2.buf, b.buf); CHECK_EQ(b2.len, b.len); blob_ b4(b2); CHECK_EQ(b4.buf, b.buf); CHECK_EQ(b4.len, b.len); } { blob_ b2 = b; CHECK_EQ(b2.buf, b.buf); CHECK_EQ(b2.len, b.len); blob_ b4 = b2; CHECK_EQ(b4.buf, b.buf); CHECK_EQ(b4.len, b.len); } } void test_blob_copy(blob const& b) { test_blob_copy(b); test_blob_copy(b); } template void test_blob(T v) { blob b(v); CHECK_EQ((T*)b.buf, &v); CHECK_EQ(b.len, sizeof(T)); test_blob_copy(b); } TEST_CASE("blob.fundamental_type") { SUBCASE("int") { test_blob(1); } SUBCASE("u64") { test_blob(UINT64_C(1)); } SUBCASE("int.arr") { int arr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; cblob b(arr); CHECK_EQ((int const*)b.buf, arr); CHECK_EQ(b.len, sizeof(arr)); test_blob(arr); } SUBCASE("u64.arr") { uint64_t arr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; cblob b(arr); CHECK_EQ((uint64_t const*)b.buf, arr); CHECK_EQ(b.len, sizeof(arr)); test_blob(arr); } } } // namespace c4 #ifdef __clang__ # pragma clang diagnostic pop #elif defined(__GNUC__) # pragma GCC diagnostic pop #endif c4core-0.2.6/test/test_char_traits.cpp000066400000000000000000000043721477602032300177350ustar00rootroot00000000000000#ifndef C4CORE_SINGLE_HEADER #include "c4/char_traits.hpp" #endif #include "c4/test.hpp" namespace c4 { TEST_CASE("num_needed_chars.char") { CHECK_EQ(num_needed_chars(0), 0); CHECK_EQ(num_needed_chars(1), 1); CHECK_EQ(num_needed_chars(2), 2); CHECK_EQ(num_needed_chars(3), 3); CHECK_EQ(num_needed_chars(4), 4); for(int i = 0; i < 100; ++i) { CHECK_EQ(num_needed_chars(i), i); } } TEST_CASE("num_needed_chars.wchar_t") { #if defined(_MSC_VER) #pragma warning(push) #pragma warning(disable : 4127) // C4127: conditional expression is constant #endif if(sizeof(wchar_t) == 2) { CHECK_EQ(num_needed_chars( 0), 0); CHECK_EQ(num_needed_chars( 1), 1); CHECK_EQ(num_needed_chars( 2), 1); CHECK_EQ(num_needed_chars( 3), 2); CHECK_EQ(num_needed_chars( 4), 2); CHECK_EQ(num_needed_chars( 97), 49); CHECK_EQ(num_needed_chars( 98), 49); CHECK_EQ(num_needed_chars( 99), 50); CHECK_EQ(num_needed_chars(100), 50); CHECK_EQ(num_needed_chars(101), 51); } else if(sizeof(wchar_t) == 4) { CHECK_EQ(num_needed_chars( 0), 0); CHECK_EQ(num_needed_chars( 1), 1); CHECK_EQ(num_needed_chars( 2), 1); CHECK_EQ(num_needed_chars( 3), 1); CHECK_EQ(num_needed_chars( 4), 1); CHECK_EQ(num_needed_chars( 5), 2); CHECK_EQ(num_needed_chars( 6), 2); CHECK_EQ(num_needed_chars( 7), 2); CHECK_EQ(num_needed_chars( 8), 2); CHECK_EQ(num_needed_chars( 93), 24); CHECK_EQ(num_needed_chars( 94), 24); CHECK_EQ(num_needed_chars( 95), 24); CHECK_EQ(num_needed_chars( 96), 24); CHECK_EQ(num_needed_chars( 97), 25); CHECK_EQ(num_needed_chars( 98), 25); CHECK_EQ(num_needed_chars( 99), 25); CHECK_EQ(num_needed_chars(100), 25); CHECK_EQ(num_needed_chars(101), 26); } #if defined(_MSC_VER) #pragma warning(pop) #endif } } // namespace c4 c4core-0.2.6/test/test_charconv.cpp000066400000000000000000002757561477602032300172550ustar00rootroot00000000000000#ifdef C4CORE_SINGLE_HEADER #include "c4/c4core_all.hpp" #else #include "c4/std/std.hpp" #include "c4/charconv.hpp" #include "c4/format.hpp" #include "c4/type_name.hpp" #endif #include "c4/libtest/supprwarn_push.hpp" C4_SUPPRESS_WARNING_GCC_PUSH C4_SUPPRESS_WARNING_GCC("-Wfloat-equal") C4_SUPPRESS_WARNING_GCC("-Wuseless-cast") C4_SUPPRESS_WARNING_GCC("-Wconversion") C4_SUPPRESS_WARNING_GCC("-Wtype-limits") C4_SUPPRESS_WARNING_GCC("-Wfloat-equal") #if defined (__GNUC__) && __GNUC__ >= 9 C4_SUPPRESS_WARNING_GCC("-Wno-noexcept-type") #endif C4_SUPPRESS_WARNING_CLANG_PUSH C4_SUPPRESS_WARNING_CLANG("-Wfloat-equal") #include #include "./test_numbers.hpp" namespace c4 { // skip the radix prefix: 0x, -0x, 0X, -0X, 0b, -0B, etc csubstr nopfx(csubstr num) { if(num.begins_with('-')) num = num.sub(1); if(num.len >= 2 && num[0] == '0') { switch(num[1]) { case 'x': case 'X': case 'o': case 'O': case 'b': case 'B': num = num.sub(2); } } return num; } // filter out the radix prefix from anywhere: 0x, -0x, 0X, -0X, 0b, -0B, etc csubstr nopfx(substr buf, csubstr num) { REQUIRE_GE(buf.len, num.len); if(num.begins_with('-')) num = num.sub(1); size_t pos = 0; for(size_t i = 0; i < num.len; ++i) { const char c = num.str[i]; if(c == '0') { const char n = i+1 < num.len ? num.str[i+1] : '\0'; switch(n) { case 'x': case 'X': case 'o': case 'O': case 'b': case 'B': ++i; break; default: buf[pos++] = c; break; } } else { buf[pos++] = c; } } return buf.first(pos); } // capitalize the alphabetical characters // eg 0xdeadbeef --> 0XDEADBEEF substr capitalize(substr buf, csubstr str) { C4_ASSERT(!buf.overlaps(str)); if(str.len) memcpy(buf.str, str.str, str.len); substr ret = buf.first(str.len); ret.toupper(); return ret; } // prepend zeroes to the left of the number: // eg 1234 --> 00001234 // eg -1234 --> -00001234 // eg 0x1234 --> 0x00001234 // eg -0x1234 --> -0x00001234 substr zpad(substr buf, csubstr str, size_t num_zeroes) { C4_ASSERT(!buf.overlaps(str)); size_t pos = 0; if(str.len > 0 && str[0] == '-') buf.str[pos++] = '-'; if(str.len >= pos+2 && str[pos] == '0') { switch(str[pos+1]) { case 'x': case 'X': case 'o': case 'O': case 'b': case 'B': memcpy(buf.str + pos, str.str + pos, 2); pos += 2; } } memset(buf.str + pos, '0', num_zeroes); csubstr rem = str.sub(pos); if(rem.len) memcpy(buf.str + pos + num_zeroes, rem.str, rem.len); return buf.first(str.len + num_zeroes); } // get the front element of the type's test numbers template number_case const& front(size_t skip=0) { return *(numbers::vals + skip); } // get the back element of the type's test numbers template number_case const& back(size_t skip=0) { static_assert(std::is_array::vals)>::value, "must be array"); return *(numbers::vals + C4_COUNTOF(numbers::vals) - 1 - skip); } // given an element, get the n-th element previous to that template number_case const& prev(number_case const& curr, size_t less=1) { C4_ASSERT(less >= 0); size_t num = C4_COUNTOF(numbers::vals); C4_ASSERT(&curr >= numbers::vals); C4_ASSERT(&curr < numbers::vals + num); size_t icurr = (size_t)(&curr - numbers::vals); size_t prev = (icurr + num - less) % num; return *(numbers::vals + prev); } // given an element, get the n-th element after that template number_case const& next(number_case const& curr, size_t more=1) { C4_ASSERT(more >= 0); size_t num = C4_COUNTOF(numbers::vals); C4_ASSERT(&curr >= numbers::vals); C4_ASSERT(&curr < numbers::vals + num); size_t icurr = (size_t)(&curr - numbers::vals); size_t next = (icurr + more) % num; return *(numbers::vals + next); } // construct a string of a value such that it overflows an original value by a given amount template csubstr overflow_by(substr buf, T val, T how_much, T radix) { C4_STATIC_ASSERT(std::is_integral::value); C4_STATIC_ASSERT(sizeof(T) < sizeof(int64_t)); using upcast_t = typename std::conditional::value, int64_t, uint64_t>::type; upcast_t uval = (upcast_t) val; uval += (upcast_t) how_much; size_t len = xtoa(buf, uval, (upcast_t)radix); REQUIRE_GE(buf.len, len); return buf.first(len); } // construct a string of a value such that it underflows an original value by a given amount template csubstr underflow_by(substr buf, T val, T how_much, T radix) { C4_STATIC_ASSERT(std::is_integral::value); C4_STATIC_ASSERT(sizeof(T) < sizeof(int64_t)); using upcast_t = typename std::conditional::value, int64_t, uint64_t>::type; upcast_t uval = (upcast_t) val; uval -= (upcast_t) how_much; size_t len = xtoa(buf, uval, (upcast_t)radix); REQUIRE_GE(buf.len, len); return buf.first(len); } TEST_CASE("charconv.to_chars_format") { #if defined(C4CORE_HAVE_STD_TO_CHARS) CHECK(FTOA_FLOAT == static_cast::type>(std::chars_format::fixed)); CHECK(FTOA_SCIENT == static_cast::type>(std::chars_format::scientific)); CHECK(FTOA_FLEX == static_cast::type>(std::chars_format::general)); CHECK(FTOA_HEXA == static_cast::type>(std::chars_format::hex)); #elif !defined(C4CORE_HAVE_FAST_FLOAT) CHECK(FTOA_FLOAT == 'f'); CHECK(FTOA_SCIENT == 'e'); CHECK(FTOA_FLEX == 'g'); CHECK(FTOA_HEXA == 'a'); #endif } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- TEST_CASE_TEMPLATE("test_util.number_cases", T, int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t) { ITER_NUMBERS(T, number) { if(number.val < 0) continue; INFO(number); CHECK_GT(number.dec.len, 0); CHECK_GT(number.hex.len, 2); CHECK_GT(number.oct.len, 2); CHECK_GT(number.bin.len, 2); CHECK_UNARY(number.hex.begins_with("0x")); CHECK_UNARY(number.oct.begins_with("0o")); CHECK_UNARY(number.bin.begins_with("0b")); } REQUIRE_GT(C4_COUNTOF(numbers::vals), 2); // CHECK_EQ(&front(), numbers::vals + 0); CHECK_EQ(&front(0), numbers::vals + 0); CHECK_EQ(&front(1), numbers::vals + 1); // CHECK_EQ(&back(), numbers::vals + C4_COUNTOF(numbers::vals) - 1); CHECK_EQ(&back(0), numbers::vals + C4_COUNTOF(numbers::vals) - 1); CHECK_EQ(&back(1), numbers::vals + C4_COUNTOF(numbers::vals) - 2); // CHECK_EQ(&next(front() ), numbers::vals + 1); CHECK_EQ(&next(front(), T(1)), numbers::vals + 1); CHECK_EQ(&next(front(), T(2)), numbers::vals + 2); // CHECK_EQ(&next(back() ), numbers::vals + 0); CHECK_EQ(&next(back(), T(1)), numbers::vals + 0); CHECK_EQ(&next(back(), T(2)), numbers::vals + 1); CHECK_EQ(&next(back(), T(3)), numbers::vals + 2); // CHECK_EQ(&prev(front()), numbers::vals + C4_COUNTOF(numbers::vals) - 1); CHECK_EQ(&prev(front(), T(1)), numbers::vals + C4_COUNTOF(numbers::vals) - 1); CHECK_EQ(&prev(front(), T(2)), numbers::vals + C4_COUNTOF(numbers::vals) - 2); // CHECK_EQ(&prev(back()), numbers::vals + C4_COUNTOF(numbers::vals) - 2); CHECK_EQ(&prev(back(), T(1)), numbers::vals + C4_COUNTOF(numbers::vals) - 2); CHECK_EQ(&prev(back(), T(2)), numbers::vals + C4_COUNTOF(numbers::vals) - 3); } TEST_CASE("test_util.overflow_by") { char buf_[128]; substr buf = buf_; REQUIRE_EQ(overflow_by(buf, INT8_C(127), INT8_C(0), INT8_C(10)), "127"); REQUIRE_EQ(overflow_by(buf, INT8_C(127), INT8_C(0), INT8_C(16)), "0x7f"); REQUIRE_EQ(overflow_by(buf, INT8_C(127), INT8_C(1), INT8_C(10)), "128"); REQUIRE_EQ(overflow_by(buf, INT8_C(127), INT8_C(1), INT8_C(16)), "0x80"); REQUIRE_EQ(overflow_by(buf, INT8_C(127), INT8_C(2), INT8_C(10)), "129"); REQUIRE_EQ(overflow_by(buf, INT8_C(127), INT8_C(2), INT8_C(16)), "0x81"); } TEST_CASE("test_util.underflow_by") { char buf_[128]; substr buf = buf_; REQUIRE_EQ(underflow_by(buf, INT8_C(-128), INT8_C(0), INT8_C(10)), "-128"); REQUIRE_EQ(underflow_by(buf, INT8_C(-128), INT8_C(0), INT8_C(16)), "-0x80"); REQUIRE_EQ(underflow_by(buf, INT8_C(-128), INT8_C(1), INT8_C(10)), "-129"); REQUIRE_EQ(underflow_by(buf, INT8_C(-128), INT8_C(1), INT8_C(16)), "-0x81"); REQUIRE_EQ(underflow_by(buf, INT8_C(-128), INT8_C(2), INT8_C(10)), "-130"); REQUIRE_EQ(underflow_by(buf, INT8_C(-128), INT8_C(2), INT8_C(16)), "-0x82"); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- TEST_CASE_TEMPLATE("digits_dec", T, int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t) { ITER_NUMBERS(T, number) { if(number.val < 0) continue; INFO(number); CHECK_EQ(digits_dec(number.val), nopfx(number.dec).len); } } TEST_CASE_TEMPLATE("digits_hex", T, int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t) { ITER_NUMBERS(T, number) { if(number.val < 0) continue; INFO(number); CHECK_EQ(digits_hex(number.val), nopfx(number.hex).len); } } TEST_CASE_TEMPLATE("digits_oct", T, int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t) { ITER_NUMBERS(T, number) { if(number.val < 0) continue; INFO(number); CHECK_EQ(digits_oct(number.val), nopfx(number.oct).len); } } TEST_CASE_TEMPLATE("digits_bin", T, int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t) { ITER_NUMBERS(T, number) { if(number.val < 0) continue; INFO(number); CHECK_EQ(digits_bin(number.val), nopfx(number.bin).len); } } //----------------------------------------------------------------------------- TEST_CASE_TEMPLATE("write_dec_unchecked", T, int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t) { char buf_[128] = {}; substr buf = buf_; ITER_NUMBERS(T, number) { if(number.val < 0) continue; INFO(number); unsigned digits = digits_dec(number.val); REQUIRE_GE(buf.len, digits); write_dec_unchecked(buf, number.val, digits); CHECK_EQ(buf.first(digits), nopfx(number.dec)); } } TEST_CASE_TEMPLATE("write_hex_unchecked", T, int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t) { char buf_[128] = {}; substr buf = buf_; ITER_NUMBERS(T, number) { if(number.val < 0) continue; INFO(number); unsigned digits = digits_hex(number.val); REQUIRE_GE(buf.len, digits); write_hex_unchecked(buf, number.val, digits); CHECK_EQ(buf.first(digits), nopfx(number.hex)); } } TEST_CASE_TEMPLATE("write_oct_unchecked", T, int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t) { char buf_[128] = {}; substr buf = buf_; ITER_NUMBERS(T, number) { if(number.val < 0) continue; INFO(number); unsigned digits = digits_hex(number.val); REQUIRE_GE(buf.len, digits); write_hex_unchecked(buf, number.val, digits); CHECK_EQ(buf.first(digits), nopfx(number.hex)); } } TEST_CASE_TEMPLATE("write_bin_unchecked", T, int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t) { char buf_[128] = {}; substr buf = buf_; ITER_NUMBERS(T, number) { if(number.val < 0) continue; INFO(number); unsigned digits = digits_bin(number.val); REQUIRE_GE(buf.len, digits); write_bin_unchecked(buf, number.val, digits); CHECK_EQ(buf.first(digits), nopfx(number.bin)); } } //----------------------------------------------------------------------------- TEST_CASE_TEMPLATE("write_dec", T, int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t) { char buf_[128] = {}; substr buf = buf_; ITER_NUMBERS(T, number) { if(number.val < 0) continue; INFO(number); REQUIRE_GE(buf.len, number.dec.len); size_t retn = write_dec(substr{}, number.val); CHECK_EQ(retn, number.dec.len); size_t retb = write_dec(buf, number.val); CHECK_EQ(retb, retn); REQUIRE_EQ(retb, number.dec.len); CHECK_EQ(buf.first(retb), number.dec); } } TEST_CASE_TEMPLATE("write_hex", T, int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t) { char buf_[128] = {}; substr buf = buf_; ITER_NUMBERS(T, number) { if(number.val < 0) continue; INFO(number); REQUIRE_GE(buf.len, number.hex.sub(2).len); size_t retn = write_hex(substr{}, number.val); CHECK_EQ(retn, number.hex.sub(2).len); size_t retb = write_hex(buf, number.val); CHECK_EQ(retb, retn); REQUIRE_EQ(retb, number.hex.sub(2).len); CHECK_EQ(buf.first(retb), number.hex.sub(2)); } } TEST_CASE_TEMPLATE("write_oct", T, int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t) { char buf_[128] = {}; substr buf = buf_; ITER_NUMBERS(T, number) { if(number.val < 0) continue; INFO(number); REQUIRE_GE(buf.len, number.oct.sub(2).len); size_t retn = write_oct(substr{}, number.val); CHECK_EQ(retn, number.oct.sub(2).len); size_t retb = write_oct(buf, number.val); CHECK_EQ(retb, retn); REQUIRE_EQ(retb, number.oct.sub(2).len); CHECK_EQ(buf.first(retb), nopfx(number.oct)); } } TEST_CASE_TEMPLATE("write_bin", T, int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t) { char buf_[128] = {}; substr buf = buf_; ITER_NUMBERS(T, number) { if(number.val < 0) continue; INFO(number); REQUIRE_GE(buf.len, number.bin.sub(2).len); size_t retb = write_bin(substr{}, number.val); CHECK_EQ(retb, number.bin.sub(2).len); size_t retn = write_bin(buf, number.val); CHECK_EQ(retb, retn); REQUIRE_EQ(retb, number.bin.sub(2).len); CHECK_EQ(buf.first(retb), nopfx(number.bin)); } } //----------------------------------------------------------------------------- TEST_CASE_TEMPLATE("write_dec_digits", T, int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t) { char buf_[128] = {}; substr buf = buf_; SUBCASE("num digits smaller than length") { ITER_NUMBERS(T, number) { if(number.val < 0) continue; INFO(number); for(int less_ : {0, 1, 2, 4, 8, (int)number.dec.len}) { size_t less = (size_t) less_; if(less > number.dec.len) continue; size_t num_digits = number.dec.len - less; INFO("less=" << less << " num_digits=" << num_digits); size_t retn = write_dec(substr{}, number.val, num_digits); CHECK_EQ(retn, number.dec.len); // the number must always be written size_t retb = write_dec(buf, number.val, num_digits); CHECK_EQ(retb, retn); REQUIRE_EQ(retb, number.dec.len); CHECK_EQ(buf.first(retb), number.dec); } } } SUBCASE("num digits larger than length") { ITER_NUMBERS(T, number) { if(number.val < 0) continue; INFO(number); for(int more_ : {1, 2, 4, 8}) { size_t more = (size_t) more_; size_t num_digits = number.dec.len + more; INFO("more=" << more << " num_digits=" << num_digits); size_t retn = write_dec(substr{}, number.val, num_digits); CHECK_EQ(retn, num_digits); size_t retb = write_dec(buf, number.val, num_digits); CHECK_EQ(retb, retn); REQUIRE_EQ(retb, num_digits); csubstr result = buf.first(retb); CHECK_EQ(result.last(number.dec.len), number.dec); if(number.val) { CHECK_EQ(result.triml('0'), number.dec); CHECK_EQ(result.first_not_of('0'), more); } else { CHECK(result.begins_with('0')); CHECK_EQ(result.first_not_of('0'), csubstr::npos); } } } } } TEST_CASE_TEMPLATE("write_hex_digits", T, int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t) { char buf_[128] = {}; substr buf = buf_; SUBCASE("num digits smaller than length") { ITER_NUMBERS(T, number) { if(number.val < 0) continue; INFO(number); for(int less_ : {0, 1, 2, 4, 8, (int)number.hex.len}) { const csubstr hex = nopfx(number.hex); size_t less = (size_t) less_; if(less > hex.len) continue; size_t num_digits = hex.len - less; INFO("less=" << less << " num_digits=" << num_digits); size_t retn = write_hex(substr{}, number.val, num_digits); CHECK_EQ(retn, hex.len); // the number must always be written size_t retb = write_hex(buf, number.val, num_digits); CHECK_EQ(retb, retn); REQUIRE_EQ(retb, hex.len); CHECK_EQ(buf.first(retb), hex); } } } SUBCASE("num digits larger than length") { ITER_NUMBERS(T, number) { if(number.val < 0) continue; INFO(number); for(int more_ : {1, 2, 4, 8}) { const csubstr hex = nopfx(number.hex); size_t more = (size_t) more_; size_t num_digits = hex.len + more; INFO("more=" << more << " num_digits=" << num_digits); size_t retn = write_hex(substr{}, number.val, num_digits); CHECK_EQ(retn, num_digits); size_t retb = write_hex(buf, number.val, num_digits); CHECK_EQ(retb, retn); REQUIRE_EQ(retn, num_digits); csubstr result = buf.first(retn); CHECK_EQ(result.last(hex.len), hex); if(number.val) { CHECK_EQ(result.triml('0'), hex); CHECK_EQ(result.first_not_of('0'), more); } else { CHECK(result.begins_with('0')); CHECK_EQ(result.first_not_of('0'), csubstr::npos); } } } } } TEST_CASE_TEMPLATE("write_oct_digits", T, int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t) { char buf_[128] = {}; substr buf = buf_; SUBCASE("num digits smaller than length") { ITER_NUMBERS(T, number) { if(number.val < 0) continue; INFO(number); for(int less_ : {0, 1, 2, 4, 8, (int)number.oct.len}) { const csubstr oct = nopfx(number.oct); size_t less = (size_t) less_; if(less > oct.len) continue; size_t num_digits = oct.len - less; INFO("less=" << less << " num_digits=" << num_digits); size_t retn = write_oct(substr{}, number.val, num_digits); CHECK_EQ(retn, oct.len); // the number must always be written size_t retb = write_oct(buf, number.val, num_digits); CHECK_EQ(retb, retn); REQUIRE_EQ(retb, oct.len); CHECK_EQ(buf.first(retb), oct); } } } SUBCASE("num digits larger than length") { ITER_NUMBERS(T, number) { if(number.val < 0) continue; INFO(number); for(int more_ : {1, 2, 4, 8}) { const csubstr oct = nopfx(number.oct); size_t more = (size_t) more_; size_t num_digits = oct.len + more; INFO("more=" << more << " num_digits=" << num_digits); size_t retn = write_oct(substr{}, number.val, num_digits); CHECK_EQ(retn, num_digits); size_t retb = write_oct(buf, number.val, num_digits); CHECK_EQ(retb, retn); REQUIRE_EQ(retb, num_digits); csubstr result = buf.first(retb); CHECK_EQ(result.last(oct.len), oct); if(number.val) { CHECK_EQ(result.triml('0'), oct); CHECK_EQ(result.first_not_of('0'), more); } else { CHECK(result.begins_with('0')); CHECK_EQ(result.first_not_of('0'), csubstr::npos); } } } } } TEST_CASE_TEMPLATE("write_bin_digits", T, int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t) { char buf_[128] = {}; substr buf = buf_; SUBCASE("num digits smaller than length") { ITER_NUMBERS(T, number) { if(number.val < 0) continue; INFO(number); for(int less_ : {0, 1, 2, 4, 8, (int)number.bin.len}) { const csubstr bin = nopfx(number.bin); size_t less = (size_t) less_; if(less > bin.len) continue; size_t num_digits = bin.len - less; INFO("less=" << less << " num_digits=" << num_digits); size_t retn = write_bin(substr{}, number.val, num_digits); CHECK_EQ(retn, bin.len); // the number must always be written size_t retb = write_bin(buf, number.val, num_digits); CHECK_EQ(retb, retn); REQUIRE_EQ(retb, bin.len); CHECK_EQ(buf.first(retb), bin); } } } SUBCASE("num digits larger than length") { ITER_NUMBERS(T, number) { if(number.val < 0) continue; INFO(number); for(int more_ : {1, 2, 4, 8}) { const csubstr bin = nopfx(number.bin); size_t more = (size_t) more_; size_t num_digits = bin.len + more; INFO("more=" << more << " num_digits=" << num_digits); size_t retn = write_bin(substr{}, number.val, num_digits); CHECK_EQ(retn, num_digits); size_t retb = write_bin(buf, number.val, num_digits); CHECK_EQ(retb, retn); REQUIRE_EQ(retn, num_digits); csubstr result = buf.first(retn); CHECK_EQ(result.last(bin.len), bin); if(number.val) { CHECK_EQ(result.triml('0'), bin); CHECK_EQ(result.first_not_of('0'), more); } else { CHECK(result.begins_with('0')); CHECK_EQ(result.first_not_of('0'), csubstr::npos); } } } } } //----------------------------------------------------------------------------- // functions to suppress ubsan's warnings of signed integer overflow template C4_NO_UBSAN_IOVRFLW T add1(number_case const& n) { T result = n.val + T(1); if(n.val == std::numeric_limits::max()) { CHECK_EQ(result, std::numeric_limits::min()); } if(n.has_valp1) { CHECK_EQ(result, n.valp1); } return result; } template C4_NO_UBSAN_IOVRFLW T add1(overflow64case const& n) { return n.wrapped + T(1); } template C4_NO_UBSAN_IOVRFLW T add1(T val) { T result = val + T(1); if(val == std::numeric_limits::max()) { CHECK_EQ(result, std::numeric_limits::min()); } return result; } template C4_NO_UBSAN_IOVRFLW T rem1(T val) { T result = val - T(1); if(val == std::numeric_limits::min()) { CHECK_EQ(result, std::numeric_limits::max()); } return result; } template C4_NO_UBSAN_IOVRFLW constexpr T add1_(T val) { return val + T(1); } template C4_NO_UBSAN_IOVRFLW constexpr T rem1_(T val) { return val - T(1); } template C4_NO_UBSAN_IOVRFLW constexpr T add_(T val, int n) { return val + (T)n; } template C4_NO_UBSAN_IOVRFLW constexpr T rem_(T val, int n) { return val - (T)n; } // testing that signed overflow behaviors as expected (despite it // being undefined behavior) TEST_CASE("overflow.assumptions") { CHECK_EQ(rem1_(std::numeric_limits::min()), std::numeric_limits::max()); CHECK_EQ(add1_(std::numeric_limits::max()), std::numeric_limits::min()); CHECK_EQ(rem1_(std::numeric_limits::min()), std::numeric_limits::max()); CHECK_EQ(add1_(std::numeric_limits::max()), std::numeric_limits::min()); CHECK_EQ(rem1_(std::numeric_limits::min()), std::numeric_limits::max()); CHECK_EQ(add1_(std::numeric_limits::max()), std::numeric_limits::min()); CHECK_EQ(rem1_(std::numeric_limits::min()), std::numeric_limits::max()); CHECK_EQ(add1_(std::numeric_limits::max()), std::numeric_limits::min()); CHECK_EQ(rem1_(std::numeric_limits::min()), std::numeric_limits::max()); CHECK_EQ(add1_(std::numeric_limits::max()), std::numeric_limits::min()); CHECK_EQ(rem1_(std::numeric_limits::min()), std::numeric_limits::max()); CHECK_EQ(add1_(std::numeric_limits::max()), std::numeric_limits::min()); CHECK_EQ(rem1_(std::numeric_limits::min()), std::numeric_limits::max()); CHECK_EQ(add1_(std::numeric_limits::max()), std::numeric_limits::min()); CHECK_EQ(rem1_(std::numeric_limits::min()), std::numeric_limits::max()); CHECK_EQ(add1_(std::numeric_limits::max()), std::numeric_limits::min()); for(int i : {1, 2, 3, 4, 5, 10}) { INFO("i=" << i); CHECK_EQ(rem_(std::numeric_limits::min(), i), rem_(std::numeric_limits::max(), i-1)); CHECK_EQ(add_(std::numeric_limits::max(), i), add_(std::numeric_limits::min(), i-1)); CHECK_EQ(rem_(std::numeric_limits::min(), i), rem_(std::numeric_limits::max(), i-1)); CHECK_EQ(add_(std::numeric_limits::max(), i), add_(std::numeric_limits::min(), i-1)); CHECK_EQ(rem_(std::numeric_limits::min(), i), rem_(std::numeric_limits::max(), i-1)); CHECK_EQ(add_(std::numeric_limits::max(), i), add_(std::numeric_limits::min(), i-1)); CHECK_EQ(rem_(std::numeric_limits::min(), i), rem_(std::numeric_limits::max(), i-1)); CHECK_EQ(add_(std::numeric_limits::max(), i), add_(std::numeric_limits::min(), i-1)); CHECK_EQ(rem_(std::numeric_limits::min(), i), rem_(std::numeric_limits::max(), i-1)); CHECK_EQ(add_(std::numeric_limits::max(), i), add_(std::numeric_limits::min(), i-1)); CHECK_EQ(rem_(std::numeric_limits::min(), i), rem_(std::numeric_limits::max(), i-1)); CHECK_EQ(add_(std::numeric_limits::max(), i), add_(std::numeric_limits::min(), i-1)); CHECK_EQ(rem_(std::numeric_limits::min(), i), rem_(std::numeric_limits::max(), i-1)); CHECK_EQ(add_(std::numeric_limits::max(), i), add_(std::numeric_limits::min(), i-1)); CHECK_EQ(rem_(std::numeric_limits::min(), i), rem_(std::numeric_limits::max(), i-1)); CHECK_EQ(add_(std::numeric_limits::max(), i), add_(std::numeric_limits::min(), i-1)); } } //----------------------------------------------------------------------------- TEST_CASE_TEMPLATE("xtoa", T, int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t) { char buf_[128] = {}; substr buf = buf_; ITER_NUMBERS(T, number) { INFO(number); { buf.fill('?'); size_t retn = xtoa(substr{}, number.val); CHECK_EQ(retn, number.dec.len); CHECK_UNARY(buf.begins_with('?') && buf.first_not_of('?') == csubstr::npos); size_t retb = xtoa(buf, number.val); CHECK_EQ(retn, retb); REQUIRE_LE(retb, buf.len); CHECK_EQ(buf.first(retb), number.dec); T after_roundtrip = add1(number); CHECK(atox(buf.first(retb), &after_roundtrip)); CHECK_EQ(after_roundtrip, number.val); } } } //----------------------------------------------------------------------------- TEST_CASE_TEMPLATE("xtoa_radix.dec", T, int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t) { char buf_[128] = {}; substr buf = buf_; ITER_NUMBERS(T, number) { INFO(number); { buf.fill('?'); size_t retn = xtoa(substr{}, number.val, T(10)); CHECK_EQ(retn, number.dec.len); CHECK_UNARY(buf.begins_with('?') && buf.first_not_of('?') == csubstr::npos); size_t retb = xtoa(buf, number.val, T(10)); CHECK_EQ(retn, retb); REQUIRE_LE(retb, buf.len); CHECK_EQ(buf.first(retb), number.dec); T after_roundtrip = add1(number); CHECK(atox(buf.first(retb), &after_roundtrip)); CHECK_EQ(after_roundtrip, number.val); } const size_t adj = size_t(number.val < 0); REQUIRE_LT(adj, number.dec.len); const size_t dec_digits = number.dec.len - adj; for(size_t more_digits = 0; more_digits < 6; ++more_digits) { buf.fill('?'); size_t reqdigits = dec_digits + more_digits; INFO("dec_digits=" << dec_digits << " more_digits=" << more_digits << " req_digits=" << reqdigits); size_t retn = xtoa(substr{}, number.val, T(10), reqdigits); CHECK_EQ(retn, reqdigits + size_t(number.val < 0)); CHECK_UNARY(buf.begins_with('?') && buf.first_not_of('?') == csubstr::npos); size_t retb = xtoa(buf, number.val, T(10), reqdigits); CHECK_EQ(retn, retb); REQUIRE_LE(retb, buf.len); CHECK(buf.first(retb).ends_with(number.dec.sub(number.val < 0))); T after_roundtrip = add1(number); CHECK(atox(buf.first(retb), &after_roundtrip)); CHECK_EQ(after_roundtrip, number.val); } for(size_t less_digits = 0; less_digits < dec_digits; ++less_digits) { buf.fill('?'); size_t reqdigits = dec_digits - less_digits; INFO("dec_digits=" << dec_digits << " less_digits=" << less_digits << " req_digits=" << reqdigits); size_t retn = xtoa(substr{}, number.val, T(10), reqdigits); CHECK_EQ(retn, number.dec.len); CHECK_UNARY(buf.begins_with('?') && buf.first_not_of('?') == csubstr::npos); size_t retb = xtoa(buf, number.val, T(10), reqdigits); CHECK_EQ(retn, retb); REQUIRE_LE(retb, buf.len); CHECK(buf.first(retb).ends_with(number.dec.sub(number.val < 0))); T after_roundtrip = add1(number); CHECK(atox(buf.first(retb), &after_roundtrip)); CHECK_EQ(after_roundtrip, number.val); } } } TEST_CASE_TEMPLATE("xtoa_radix.hex", T, int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t) { char buf_[128] = {}; substr buf = buf_; ITER_NUMBERS(T, number) { INFO(number); { buf.fill('?'); size_t retn = xtoa(substr{}, number.val, T(16)); CHECK_EQ(retn, number.hex.len); CHECK_UNARY(buf.begins_with('?') && buf.first_not_of('?') == csubstr::npos); size_t retb = xtoa(buf, number.val, T(16)); CHECK_EQ(retn, retb); REQUIRE_LE(retb, buf.len); CHECK_EQ(buf.first(retb), number.hex); T after_roundtrip = add1(number); CHECK(atox(buf.first(retb), &after_roundtrip)); CHECK_EQ(after_roundtrip, number.val); } const size_t adj = size_t(number.val < 0) + size_t(2); // 2 for 0x REQUIRE_LT(adj, number.hex.len); const size_t hex_digits = number.hex.len - adj; for(size_t more_digits = 0; more_digits < 6; ++more_digits) { buf.fill('?'); size_t reqdigits = hex_digits + more_digits; INFO("more_digits=" << more_digits << " reqdigits=" << reqdigits); size_t retn = xtoa(substr{}, number.val, T(16), reqdigits); CHECK_EQ(retn, reqdigits + adj); CHECK_UNARY(buf.begins_with('?') && buf.first_not_of('?') == csubstr::npos); size_t retb = xtoa(buf, number.val, T(16), reqdigits); CHECK_EQ(retn, retb); REQUIRE_LE(retb, buf.len); csubstr result = buf.first(retb); csubstr ref = number.hex.sub(adj); INFO("result=" << result << " ref=" << ref); if(number.val < 0) CHECK(buf.first(retb).begins_with('-')); CHECK(result.ends_with(ref)); T after_roundtrip = add1(number); CHECK(atox(buf.first(retb), &after_roundtrip)); CHECK_EQ(after_roundtrip, number.val); } for(size_t less_digits = 0; less_digits < hex_digits; ++less_digits) { buf.fill('?'); size_t reqdigits = hex_digits - less_digits; INFO("hex_digits=" << hex_digits << " less_digits=" << less_digits << " req_digits=" << reqdigits); size_t retn = xtoa(substr{}, number.val, T(16), reqdigits); CHECK_EQ(retn, number.hex.len); CHECK_UNARY(buf.begins_with('?') && buf.first_not_of('?') == csubstr::npos); size_t retb = xtoa(buf, number.val, T(16), reqdigits); CHECK_EQ(retn, retb); REQUIRE_LE(retb, buf.len); CHECK(buf.first(retb).ends_with(number.hex.sub(number.val < 0))); T after_roundtrip = add1(number); CHECK(atox(buf.first(retb), &after_roundtrip)); CHECK_EQ(after_roundtrip, number.val); } } } TEST_CASE_TEMPLATE("xtoa_radix.oct", T, int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t) { char buf_[128] = {}; substr buf = buf_; ITER_NUMBERS(T, number) { INFO(number); { buf.fill('?'); size_t retn = xtoa(substr{}, number.val, T(8)); CHECK_EQ(retn, number.oct.len); CHECK_UNARY(buf.begins_with('?') && buf.first_not_of('?') == csubstr::npos); size_t retb = xtoa(buf, number.val, T(8)); CHECK_EQ(retn, retb); REQUIRE_LE(retb, buf.len); CHECK_EQ(buf.first(retb), number.oct); T after_roundtrip = add1(number); CHECK(atox(buf.first(retb), &after_roundtrip)); CHECK_EQ(after_roundtrip, number.val); } const size_t adj = size_t(number.val < 0) + size_t(2); // 2 for 0o REQUIRE_LT(adj, number.oct.len); const size_t oct_digits = number.oct.len - adj; for(size_t more_digits = 0; more_digits < 6; ++more_digits) { buf.fill('?'); size_t reqdigits = oct_digits + more_digits; INFO("more_digits=" << more_digits << " reqdigits=" << reqdigits); size_t retn = xtoa(substr{}, number.val, T(8), reqdigits); CHECK_EQ(retn, reqdigits + adj); CHECK_UNARY(buf.begins_with('?') && buf.first_not_of('?') == csubstr::npos); size_t retb = xtoa(buf, number.val, T(8), reqdigits); CHECK_EQ(retn, retb); REQUIRE_LE(retb, buf.len); csubstr result = buf.first(retb); csubstr ref = number.oct.sub(adj); INFO("result=" << result << " ref=" << ref); if(number.val < 0) CHECK(buf.first(retb).begins_with('-')); CHECK(result.ends_with(ref)); T after_roundtrip = add1(number); CHECK(atox(buf.first(retb), &after_roundtrip)); CHECK_EQ(after_roundtrip, number.val); } for(size_t less_digits = 0; less_digits < oct_digits; ++less_digits) { buf.fill('?'); size_t reqdigits = oct_digits - less_digits; INFO("oct_digits=" << oct_digits << " less_digits=" << less_digits << " req_digits=" << reqdigits); size_t retn = xtoa(substr{}, number.val, T(8), reqdigits); CHECK_EQ(retn, number.oct.len); CHECK_UNARY(buf.begins_with('?') && buf.first_not_of('?') == csubstr::npos); size_t retb = xtoa(buf, number.val, T(8), reqdigits); CHECK_EQ(retn, retb); REQUIRE_LE(retb, buf.len); CHECK(buf.first(retb).ends_with(number.oct.sub(number.val < 0))); T after_roundtrip = add1(number); CHECK(atox(buf.first(retb), &after_roundtrip)); CHECK_EQ(after_roundtrip, number.val); } } } TEST_CASE_TEMPLATE("xtoa_radix.bin", T, int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t) { char buf_[128] = {}; substr buf = buf_; ITER_NUMBERS(T, number) { INFO(number); { buf.fill('?'); size_t retn = xtoa(substr{}, number.val, T(2)); CHECK_EQ(retn, number.bin.len); CHECK_UNARY(buf.begins_with('?') && buf.first_not_of('?') == csubstr::npos); size_t retb = xtoa(buf, number.val, T(2)); CHECK_EQ(retn, retb); REQUIRE_LE(retb, buf.len); CHECK_EQ(buf.first(retb), number.bin); T after_roundtrip = add1(number); CHECK(atox(buf.first(retb), &after_roundtrip)); CHECK_EQ(after_roundtrip, number.val); } const size_t adj = size_t(number.val < 0) + size_t(2); // 2 for 0b REQUIRE_LT(adj, number.bin.len); const size_t bin_digits = number.bin.len - adj; for(size_t more_digits = 0; more_digits < 6; ++more_digits) { buf.fill('?'); size_t reqdigits = bin_digits + more_digits; INFO("more_digits=" << more_digits << " reqdigits=" << reqdigits); size_t retn = xtoa(substr{}, number.val, T(2), reqdigits); CHECK_EQ(retn, reqdigits + adj); CHECK_UNARY(buf.begins_with('?') && buf.first_not_of('?') == csubstr::npos); size_t retb = xtoa(buf, number.val, T(2), reqdigits); CHECK_EQ(retn, retb); REQUIRE_LE(retb, buf.len); csubstr result = buf.first(retb); csubstr ref = number.bin.sub(adj); INFO("result=" << result << " ref=" << ref); if(number.val < 0) CHECK(buf.first(retb).begins_with('-')); T after_roundtrip = add1(number); CHECK(atox(buf.first(retb), &after_roundtrip)); CHECK_EQ(after_roundtrip, number.val); } for(size_t less_digits = 0; less_digits < bin_digits; ++less_digits) { buf.fill('?'); size_t reqdigits = bin_digits - less_digits; INFO("bin_digits=" << bin_digits << " less_digits=" << less_digits << " req_digits=" << reqdigits); size_t retn = xtoa(substr{}, number.val, T(2), reqdigits); CHECK_EQ(retn, number.bin.len); CHECK_UNARY(buf.begins_with('?') && buf.first_not_of('?') == csubstr::npos); size_t retb = xtoa(buf, number.val, T(2), reqdigits); CHECK_EQ(retn, retb); REQUIRE_LE(retb, buf.len); CHECK(buf.first(retb).ends_with(number.bin.sub(number.val < 0))); T after_roundtrip = add1(number); CHECK(atox(buf.first(retb), &after_roundtrip)); CHECK_EQ(after_roundtrip, number.val); } } } //----------------------------------------------------------------------------- TEST_CASE_TEMPLATE("overflows.in_range_does_not_overflow", T, int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t) { char buf_[128] = {}; substr buf = buf_; SUBCASE("dec") { ITER_NUMBERS(T, number) { INFO(number); CHECK_FALSE(overflows(number.dec)); CHECK_FALSE(overflows(capitalize(buf, number.dec))); for(size_t numz : {1u, 4u, 6u}) { substr buf2 = zpad(buf, number.dec, numz); CHECK_FALSE(overflows(buf2)); buf2.toupper(); CHECK_FALSE(overflows(buf2)); } } } SUBCASE("hex") { ITER_NUMBERS(T, number) { INFO(number); CHECK_FALSE(overflows(number.hex)); CHECK_FALSE(overflows(capitalize(buf, number.hex))); for(size_t numz : {1u, 4u, 6u}) { substr buf2 = zpad(buf, number.hex, numz); CHECK_FALSE(overflows(buf2)); buf2.toupper(); CHECK_FALSE(overflows(buf2)); } } } SUBCASE("oct") { ITER_NUMBERS(T, number) { INFO(number); CHECK_FALSE(overflows(number.oct)); CHECK_FALSE(overflows(capitalize(buf, number.oct))); for(size_t numz : {1u, 4u, 6u}) { substr buf2 = zpad(buf, number.oct, numz); CHECK_FALSE(overflows(buf2)); buf2.toupper(); CHECK_FALSE(overflows(buf2)); } } } SUBCASE("bin") { ITER_NUMBERS(T, number) { INFO(number); CHECK_FALSE(overflows(number.bin)); CHECK_FALSE(overflows(capitalize(buf, number.bin))); for(size_t numz : {1u, 4u, 6u}) { substr buf2 = zpad(buf, number.bin, numz); CHECK_FALSE(overflows(buf2)); buf2.toupper(); CHECK_FALSE(overflows(buf2)); } } } } //----------------------------------------------------------------------------- TEST_CASE_TEMPLATE("read_dec", T, int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t) { (void)invalid_cases; char buf_[128] = {}; substr buf = buf_; SUBCASE("numbers") { ITER_NUMBERS(T, number) { if(number.val < T(0)) continue; INFO(number); { T val = add1(number); CHECK(read_dec(number.dec, &val)); CHECK_EQ(val, number.val); } // capitalize { T val = add1(number); csubstr cbuf = capitalize(buf, number.dec); CHECK(read_dec(cbuf, &val)); CHECK_EQ(val, number.val); } // zero-prefix for(size_t numz : {1u, 4u, 6u}) { T val = add1(number); substr buf2 = zpad(buf, number.dec, numz); INFO("zprefix=" << buf2); CHECK(read_dec(buf2, &val)); CHECK_EQ(val, number.val); buf2.toupper(); CHECK(read_dec(buf2, &val)); CHECK_EQ(val, number.val); } } } SUBCASE("fail") { T val = {}; for(auto ic : invalid_cases) { if(ic.dec.empty()) continue; INFO(ic.dec); CHECK(!read_dec(ic.dec, &val)); } } } TEST_CASE_TEMPLATE("read_hex", T, int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t) { char buf_[128] = {}; substr buf = buf_; SUBCASE("numbers") { ITER_NUMBERS(T, number) { if(number.val < T(0)) continue; INFO(number); // must not accept 0x prefix { T val = add1(number); CHECK(!read_hex(number.hex, &val)); } // must accept without prefix csubstr hex = nopfx(number.hex); INFO("nopfx(hex)=" << hex); { T val = add1(number); CHECK(read_hex(hex, &val)); CHECK_EQ(val, number.val); } // capitalize { csubstr cbuf = capitalize(buf, hex); INFO("capitalized=" << buf); REQUIRE_EQ(cbuf.len, hex.len); T val = add1(number); CHECK(read_hex(cbuf, &val)); CHECK_EQ(val, number.val); } // zero-prefix for(size_t numz : {1u, 4u, 6u}) { T val = add1(number); substr zprefix = zpad(buf, hex, numz); INFO("zprefix='" << zprefix << "'"); CHECK(read_hex(zprefix, &val)); CHECK_EQ(val, number.val); zprefix.toupper(); CHECK(read_hex(zprefix, &val)); CHECK_EQ(val, number.val); } } } SUBCASE("fail") { char buf2_[128] = {}; substr buf2 = buf2_; size_t icase = 0; for(auto const& ic : invalid_cases) { csubstr cbuf = nopfx(buf, ic.hex); csubstr cbuf2 = capitalize(buf2, cbuf); INFO("case#=" << icase << " hex='" << ic.hex << "' nopfx(hex)='" << cbuf << "' capitalize(nopfx(hex))='" << cbuf2 << "'"); REQUIRE_EQ(cbuf2.len, cbuf.len); // must not accept 0x prefix if(ic.hex.len) { T val = {}; CHECK(!read_hex(ic.hex, &val)); } // it is invalid; must not accept even without 0x prefix if(cbuf.len) { T val = {}; CHECK(!read_hex(cbuf, &val)); } // capitalize if(cbuf2.len) { T val = {}; CHECK(!read_hex(cbuf2, &val)); } ++icase; } } } TEST_CASE_TEMPLATE("read_oct", T, int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t) { char buf_[128] = {}; substr buf = buf_; SUBCASE("numbers") { ITER_NUMBERS(T, number) { if(number.val < T(0)) continue; INFO(number); // must not accept 0x prefix { T val = add1(number); CHECK(!read_oct(number.oct, &val)); } // must accept without prefix csubstr oct = nopfx(number.oct); INFO("nopfx(oct)=" << oct); { T val = add1(number); CHECK(read_oct(oct, &val)); CHECK_EQ(val, number.val); } // capitalize { csubstr cbuf = capitalize(buf, oct); INFO("capitalized=" << buf); REQUIRE_EQ(cbuf.len, oct.len); T val = add1(number); CHECK(read_oct(cbuf, &val)); CHECK_EQ(val, number.val); } // zero-prefix for(size_t numz : {1u, 4u, 6u}) { T val = add1(number); substr zprefix = zpad(buf, oct, numz); INFO("zprefix=" << zprefix); CHECK(read_oct(zprefix, &val)); CHECK_EQ(val, number.val); zprefix.toupper(); CHECK(read_oct(zprefix, &val)); CHECK_EQ(val, number.val); } } } SUBCASE("fail") { char buf2_[128] = {}; substr buf2 = buf2_; size_t icase = 0; for(auto const& ic : invalid_cases) { csubstr cbuf = nopfx(buf, ic.oct); csubstr cbuf2 = capitalize(buf2, cbuf); INFO("case#=" << icase << " oct='" << ic.oct << "' nopfx(oct)='" << cbuf << "' capitalize(nopfx(oct))='" << cbuf2 << "'"); REQUIRE_EQ(cbuf2.len, cbuf.len); // must not accept 0x prefix if(ic.oct.len) { T val = {}; CHECK(!read_oct(ic.oct, &val)); } // it is invalid; must not accept even without 0x prefix if(cbuf.len) { T val = {}; CHECK(!read_oct(cbuf, &val)); } // capitalize if(cbuf2.len) { T val = {}; CHECK(!read_oct(cbuf2, &val)); } ++icase; } } } TEST_CASE_TEMPLATE("read_bin", T, int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t) { char buf_[128] = {}; substr buf = buf_; SUBCASE("numbers") { ITER_NUMBERS(T, number) { if(number.val < T(0)) continue; INFO(number); // must not accept 0x prefix { T val = add1(number); CHECK(!read_bin(number.bin, &val)); } // must accept without prefix csubstr bin = nopfx(number.bin); INFO("nopfx(bin)=" << bin); { T val = add1(number); CHECK(read_bin(bin, &val)); CHECK_EQ(val, number.val); } // capitalize { csubstr cbuf = capitalize(buf, bin); INFO("capitalized=" << buf); REQUIRE_EQ(cbuf.len, bin.len); T val = add1(number); CHECK(read_bin(cbuf, &val)); CHECK_EQ(val, number.val); } // zero-prefix for(size_t numz : {1u, 4u, 6u}) { T val = add1(number); substr zprefix = zpad(buf, bin, numz); INFO("zprefix=" << zprefix); CHECK(read_bin(zprefix, &val)); CHECK_EQ(val, number.val); zprefix.toupper(); CHECK(read_bin(zprefix, &val)); CHECK_EQ(val, number.val); } } } SUBCASE("fail") { char buf2_[128] = {}; substr buf2 = buf2_; size_t icase = 0; for(auto const& ic : invalid_cases) { csubstr cbuf = nopfx(buf, ic.bin); csubstr cbuf2 = capitalize(buf2, cbuf); INFO("case#=" << icase << " bin='" << ic.bin << "' nopfx(bin)='" << cbuf << "' capitalize(nopfx(bin))='" << cbuf2 << "'"); REQUIRE_EQ(cbuf2.len, cbuf.len); // must not accept 0x prefix if(ic.bin.len) { T val = {}; CHECK(!read_bin(ic.bin, &val)); } // it is invalid; must not accept even without 0x prefix if(cbuf.len) { T val = {}; CHECK(!read_bin(cbuf, &val)); } // capitalize if(cbuf2.len) { T val = {}; CHECK(!read_bin(cbuf2, &val)); } ++icase; } } } //----------------------------------------------------------------------------- TEST_CASE_TEMPLATE("atox", T, int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t) { char buf_[128] = {}; substr buf = buf_; SUBCASE("dec") { ITER_NUMBERS(T, number) { INFO(number); { T val = add1(number); CHECK(atox(number.dec, &val)); CHECK_EQ(val, number.val); } // zero-prefix for(size_t numz : {1u, 4u, 6u}) { T val = add1(number); substr zprefix = zpad(buf, number.dec, numz); INFO("zprefix=" << zprefix); CHECK(atox(zprefix, &val)); CHECK_EQ(val, number.val); } } } SUBCASE("hex") { ITER_NUMBERS(T, number) { INFO(number); { T val = add1(number); CHECK(atox(number.hex, &val)); CHECK_EQ(val, number.val); } // capitalize { T val = add1(number); csubstr cbuf = capitalize(buf, number.hex); CHECK(atox(cbuf, &val)); CHECK_EQ(val, number.val); } // zero-prefix for(size_t numz : {1u, 4u, 6u}) { T val = add1(number); substr zprefix = zpad(buf, number.hex, numz); INFO("zprefix=" << zprefix); CHECK(atox(zprefix, &val)); CHECK_EQ(val, number.val); zprefix.toupper(); CHECK(atox(zprefix, &val)); CHECK_EQ(val, number.val); } } } SUBCASE("oct") { ITER_NUMBERS(T, number) { INFO(number); { T val = add1(number); CHECK(atox(number.oct, &val)); CHECK_EQ(val, number.val); } // capitalize { T val = add1(number); csubstr cbuf = capitalize(buf, number.oct); CHECK(atox(cbuf, &val)); CHECK_EQ(val, number.val); } // zero-prefix for(size_t numz : {1u, 4u, 6u}) { T val = add1(number); substr zprefix = zpad(buf, number.oct, numz); INFO("zprefix=" << zprefix); CHECK(atox(zprefix, &val)); CHECK_EQ(val, number.val); zprefix.toupper(); CHECK(atox(zprefix, &val)); CHECK_EQ(val, number.val); } } } SUBCASE("bin") { ITER_NUMBERS(T, number) { INFO(number); { T val = add1(number); CHECK(atox(number.bin, &val)); CHECK_EQ(val, number.val); } // capitalize { T val = add1(number); csubstr cbuf = capitalize(buf, number.bin); CHECK(atox(cbuf, &val)); CHECK_EQ(val, number.val); } // zero-prefix for(size_t numz : {1u, 4u, 6u}) { T val = add1(number); substr zprefix = zpad(buf, number.oct, numz); INFO("zprefix=" << zprefix); CHECK(atox(zprefix, &val)); CHECK_EQ(val, number.val); zprefix.toupper(); CHECK(atox(zprefix, &val)); CHECK_EQ(val, number.val); } } } } TEST_CASE_TEMPLATE("atox.fail", T, int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t) { char buf_[128] = {}; substr buf = buf_; SUBCASE("dec") { size_t icase = 0; for(auto const& ic : invalid_cases) { csubstr cdec = capitalize(buf, ic.dec); INFO("case#=" << icase << " dec='" << ic.dec << "' capitalize='" << cdec << "'"); REQUIRE_EQ(cdec.len, ic.dec.len); { T val = {}; CHECK(!atox(ic.dec, &val)); } { T val = {}; CHECK(!atox(cdec, &val)); } ++icase; } } SUBCASE("hex") { size_t icase = 0; for(auto const& ic : invalid_cases) { csubstr chex = capitalize(buf, ic.hex); INFO("case#=" << icase << " hex='" << ic.hex << "' capitalize='" << chex << "'"); REQUIRE_EQ(chex.len, ic.hex.len); { T val = {}; CHECK(!atox(ic.hex, &val)); } { T val = {}; CHECK(!atox(chex, &val)); } ++icase; } } SUBCASE("oct") { size_t icase = 0; for(auto const& ic : invalid_cases) { csubstr coct = capitalize(buf, ic.oct); INFO("case#=" << icase << " oct='" << ic.oct << "' capitalize='" << coct << "'"); REQUIRE_EQ(coct.len, ic.oct.len); { T val = {}; CHECK(!atox(ic.oct, &val)); } { T val = {}; CHECK(!atox(coct, &val)); } ++icase; } } SUBCASE("bin") { size_t icase = 0; for(auto const& ic : invalid_cases) { csubstr cbin = capitalize(buf, ic.bin); INFO("case#=" << icase << " bin='" << ic.bin << "' capitalize='" << cbin << "'"); REQUIRE_EQ(cbin.len, ic.bin.len); { T val = {}; CHECK(!atox(ic.bin, &val)); } { T val = {}; CHECK(!atox(cbin, &val)); } ++icase; } } } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- template void test_overflows(std::initializer_list args) { for(const char *s : args) CHECK_MESSAGE(overflows(to_csubstr(s)), "num=" << s); } template void test_no_overflows(std::initializer_list args) { for(const char *s : args) CHECK_MESSAGE(!overflows(to_csubstr(s)), "num=" << s); } template auto test_no_overflow_zeroes() -> typename std::enable_if::value, void>::type { test_no_overflows({ "-", "-0", "-000", "-0b0", "-0B0", "-0x0", "-0X0", "-0o0", "-0O0" }); test_no_overflows({ "", "0", "000", "0b0", "0B0", "0x0", "0X0", "0o0", "0O0" }); } template auto test_no_overflow_zeroes() -> typename std::enable_if::value, void>::type { test_no_overflows({ "", "0", "000", "0b0", "0B0", "0x0", "0X0", "0o0", "0O0" }); } // test overflow in sizes smaller than 64 bit by upcasting TEST_CASE_TEMPLATE("atox.overflow", T, int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t) { char buf_[128]; substr buf = buf_; auto do_test = [](bool is_overflow, number_case const& num, csubstr exceeded, number_case const& wrapped){ char buf2_[128] = {}; substr buf2 = buf2_; INFO("exceeded=" << exceeded << " is_overflow=" << is_overflow); INFO("num=" << num); INFO("wrapped=" << wrapped); CHECK_EQ(is_overflow, overflows(exceeded)); if(is_overflow) CHECK_NE(&num, &wrapped); else CHECK_EQ(&num, &wrapped); { T val = add1(num); CHECK(atox(exceeded, &val)); CHECK_EQ(val, wrapped.val); } // capitalize buf2 = capitalize(buf2_, exceeded); INFO(buf2); CHECK_EQ(is_overflow, overflows(buf2)); { T val = add1(num); CHECK(atox(buf2, &val)); CHECK_EQ(val, wrapped.val); } // zero-pad on the left for(size_t numz : {1u, 4u, 6u}) { buf2 = zpad(buf2_, exceeded, numz); CHECK_EQ(is_overflow, overflows(buf2)); { T val = add1(num); CHECK(atox(buf2, &val)); CHECK_EQ(val, wrapped.val); } buf2.toupper(); CHECK_EQ(is_overflow, overflows(buf2)); { T val = add1(num); CHECK(atox(buf2, &val)); CHECK_EQ(val, wrapped.val); } } }; C4_SUPPRESS_WARNING_MSVC_WITH_PUSH(4296) // '>=': expression is always true auto do_test_overflow = [&](T exceed_how_much, T radix){ REQUIRE(exceed_how_much >= 0); number_case const& backelm = back(); number_case const& wrapelm = next(backelm, (size_t)exceed_how_much); csubstr exceeded = overflow_by(buf, backelm.val, exceed_how_much, radix); do_test(exceed_how_much > 0, backelm, exceeded, wrapelm); }; auto do_test_underflow = [&](T exceed_how_much, T radix){ REQUIRE(exceed_how_much >= 0); number_case const& frntelm = front(); number_case const& wrapelm = prev(frntelm, (size_t)exceed_how_much); csubstr exceeded = underflow_by(buf, frntelm.val, exceed_how_much, radix); do_test(exceed_how_much > 0, frntelm, exceeded, wrapelm); }; C4_SUPPRESS_WARNING_MSVC_POP SUBCASE("zeroes") { test_no_overflow_zeroes(); } SUBCASE("dec") { do_test_underflow(T(0), T(10)); do_test_underflow(T(1), T(10)); do_test_underflow(T(2), T(10)); do_test_underflow(T(3), T(10)); do_test_underflow(T(4), T(10)); do_test_underflow(T(5), T(10)); do_test_overflow(T(0), T(10)); do_test_overflow(T(1), T(10)); do_test_overflow(T(2), T(10)); do_test_overflow(T(3), T(10)); do_test_overflow(T(4), T(10)); do_test_overflow(T(5), T(10)); } SUBCASE("hex") { do_test_underflow(T(0), T(16)); do_test_underflow(T(1), T(16)); do_test_underflow(T(2), T(16)); do_test_underflow(T(3), T(16)); do_test_underflow(T(4), T(16)); do_test_underflow(T(5), T(16)); do_test_overflow(T(0), T(16)); do_test_overflow(T(1), T(16)); do_test_overflow(T(2), T(16)); do_test_overflow(T(3), T(16)); do_test_overflow(T(4), T(16)); do_test_overflow(T(5), T(16)); } SUBCASE("oct") { do_test_underflow(T(0), T(8)); do_test_underflow(T(1), T(8)); do_test_underflow(T(2), T(8)); do_test_underflow(T(3), T(8)); do_test_underflow(T(4), T(8)); do_test_underflow(T(5), T(8)); do_test_overflow(T(0), T(8)); do_test_overflow(T(1), T(8)); do_test_overflow(T(2), T(8)); do_test_overflow(T(3), T(8)); do_test_overflow(T(4), T(8)); do_test_overflow(T(5), T(8)); } SUBCASE("bin") { do_test_underflow(T(0), T(2)); do_test_underflow(T(1), T(2)); do_test_underflow(T(2), T(2)); do_test_underflow(T(3), T(2)); do_test_underflow(T(4), T(2)); do_test_underflow(T(5), T(2)); do_test_overflow(T(0), T(2)); do_test_overflow(T(1), T(2)); do_test_overflow(T(2), T(2)); do_test_overflow(T(3), T(2)); do_test_overflow(T(4), T(2)); do_test_overflow(T(5), T(2)); } } TEST_CASE_TEMPLATE("atox.overflow64", T, int64_t, uint64_t) { char buf_[128] = {}; substr buf = buf_; auto test_atox = [](csubstr s, overflow64case const& c){ INFO("s=" << s); T val = add1(c); if(std::is_signed::value || !s.begins_with('-')) { CHECK(atox(s, &val)); CHECK_EQ(val, c.wrapped); } else { CHECK(!atox(s, &val)); } }; SUBCASE("zeroes") { test_no_overflow_zeroes(); } SUBCASE("dec") { for(auto c : overflow64cases::values) { INFO(c.dec); CHECK_EQ(c.is_overflow, overflows(c.dec)); test_atox(c.dec, c); csubstr capitalized = capitalize(buf, c.dec); CHECK_EQ(c.is_overflow, overflows(capitalized)); test_atox(capitalized, c); for(size_t numz : {1u, 4u, 6u}) { substr buf2 = zpad(buf, c.dec, numz); CHECK_EQ(c.is_overflow, overflows(buf2)); test_atox(buf2, c); buf2.toupper(); CHECK_EQ(c.is_overflow, overflows(buf2)); test_atox(buf2, c); } } } SUBCASE("hex") { for(auto c : overflow64cases::values) { INFO(c.hex); CHECK_EQ(c.is_overflow, overflows(c.hex)); test_atox(c.hex, c); csubstr capitalized = capitalize(buf, c.hex); CHECK_EQ(c.is_overflow, overflows(capitalized)); test_atox(capitalized, c); for(size_t numz : {1u, 4u, 6u}) { substr buf2 = zpad(buf, c.hex, numz); CHECK_EQ(c.is_overflow, overflows(buf2)); test_atox(buf2, c); buf2.toupper(); CHECK_EQ(c.is_overflow, overflows(buf2)); test_atox(buf2, c); } } } SUBCASE("oct") { for(auto c : overflow64cases::values) { INFO(c.oct); CHECK_EQ(c.is_overflow, overflows(c.oct)); test_atox(c.oct, c); csubstr capitalized = capitalize(buf, c.oct); CHECK_EQ(c.is_overflow, overflows(capitalized)); test_atox(capitalized, c); for(size_t numz : {1u, 4u, 6u}) { substr buf2 = zpad(buf, c.oct, numz); CHECK_EQ(c.is_overflow, overflows(buf2)); test_atox(buf2, c); buf2.toupper(); CHECK_EQ(c.is_overflow, overflows(buf2)); test_atox(buf2, c); } } } SUBCASE("bin") { for(auto c : overflow64cases::values) { INFO(c.bin); CHECK_EQ(c.is_overflow, overflows(c.bin)); test_atox(c.bin, c); csubstr capitalized = capitalize(buf, c.bin); CHECK_EQ(c.is_overflow, overflows(capitalized)); test_atox(capitalized, c); for(size_t numz : {1u, 4u, 6u}) { substr buf2 = zpad(buf, c.bin, numz); CHECK_EQ(c.is_overflow, overflows(buf2)); test_atox(buf2, c); buf2.toupper(); CHECK_EQ(c.is_overflow, overflows(buf2)); test_atox(buf2, c); } } } } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- template void test_overflows_hex() { T x = {}; std::string str; if (std::is_unsigned::value) { /* with leading zeroes */ str = "0x0" + std::string(sizeof (T) * 2, 'F'); CHECK_MESSAGE(!overflows(to_csubstr(str)), "num=" << str); CHECK(atox(to_csubstr(str), &x)); CHECK_EQ(std::numeric_limits::max(), x); str = "0x01" + std::string(sizeof (T) * 2, '0'); CHECK_MESSAGE(overflows(to_csubstr(str)), "num=" << str); CHECK(atox(to_csubstr(str), &x)); CHECK_EQ(std::numeric_limits::min(), x); } else { /* with leading zeroes */ str = "0x07" + std::string(sizeof (T) * 2 - 1, 'F'); CHECK_MESSAGE(!overflows(to_csubstr(str)), "num=" << str); CHECK(atox(to_csubstr(str), &x)); CHECK_EQ(std::numeric_limits::max(), x); str = "0x0" + std::string(sizeof (T) * 2, 'F'); CHECK_MESSAGE(overflows(to_csubstr(str)), "num=" << str); CHECK(atox(to_csubstr(str), &x)); CHECK_EQ(-1, x); str = "-0x08" + std::string(sizeof (T) * 2 - 1, '0'); CHECK_MESSAGE(!overflows(to_csubstr(str)), "num=" << str); CHECK(atox(to_csubstr(str), &x)); CHECK_EQ(std::numeric_limits::min(), x); str = "-0x08" + std::string(sizeof (T) * 2 - 2, '0') + "1"; CHECK_MESSAGE(overflows(to_csubstr(str)), "num=" << str); CHECK(atox(to_csubstr(str), &x)); CHECK_EQ(std::numeric_limits::max(), x); } } template void test_overflows_bin() { T x = {}; std::string str; if (std::is_unsigned::value) { /* with leading zeroes */ str = "0b0" + std::string(sizeof (T) * 8, '1'); CHECK_MESSAGE(!overflows(to_csubstr(str)), "num=" << str); CHECK(atox(to_csubstr(str), &x)); CHECK_EQ(std::numeric_limits::max(), x); str = "0b01" + std::string(sizeof (T) * 8, '0'); CHECK_MESSAGE(overflows(to_csubstr(str)), "num=" << str); CHECK(atox(to_csubstr(str), &x)); CHECK_EQ(std::numeric_limits::min(), x); } else { /* with leading zeroes */ str = "0b0" + std::string(sizeof (T) * 8 - 1, '1'); CHECK_MESSAGE(!overflows(to_csubstr(str)), "num=" << str); CHECK(atox(to_csubstr(str), &x)); CHECK_EQ(std::numeric_limits::max(), x); str = "0b0" + std::string(sizeof (T) * 8, '1'); CHECK_MESSAGE(overflows(to_csubstr(str)), "num=" << str); CHECK(atox(to_csubstr(str), &x)); CHECK_EQ(-1, x); str = "-0b01" + std::string(sizeof (T) * 8 - 1, '0'); CHECK_MESSAGE(!overflows(to_csubstr(str)), "num=" << str); CHECK(atox(to_csubstr(str), &x)); CHECK_EQ(std::numeric_limits::min(), x); str = "-0b01" + std::string(sizeof (T) * 8 - 2, '0') + "1"; CHECK_MESSAGE(overflows(to_csubstr(str)), "num=" << str); CHECK(atox(to_csubstr(str), &x)); CHECK_EQ(std::numeric_limits::max(), x); } } // TODO: test_overflows_oct template void expect_overflows_unsigned(int radix, uint64_t val, bool expected) { char bufc[100] = {0}; substr s(bufc, sizeof(bufc)); size_t sz = utoa(s, val, (uint64_t)radix); INFO("radix=" << radix << " val=" << val); REQUIRE_LE(sz, s.size()); s = s.first(sz); INFO("s=" << s); CHECK_EQ(overflows(s), expected); }; template void expect_overflows_signed(int radix, int64_t val, bool expected) { char bufc[100] = {0}; substr s(bufc, sizeof(bufc)); size_t sz = itoa(s, val, (int64_t)radix); INFO("radix=" << radix << " val=" << val); REQUIRE_LE(sz, s.size()); s = s.first(sz); INFO("s=" << s); CHECK_EQ(overflows(s), expected); }; template typename std::enable_if::value, void>::type test_overflows() { const uint64_t max = (uint64_t) std::numeric_limits::max(); const uint64_t min = (uint64_t) std::numeric_limits::min(); for(int radix : { 2, 8, 10, 16 }) { expect_overflows_unsigned(radix, max, false); expect_overflows_unsigned(radix, add1(max), true); } test_overflows_hex(); test_overflows_bin(); // TODO: octal } template typename std::enable_if::value, void>::type test_overflows() { const int64_t max = (int64_t) std::numeric_limits::max(); const int64_t min = (int64_t) std::numeric_limits::min(); for(int radix : { 2, 8, 10, 16 }) { expect_overflows_signed(radix, max, false); expect_overflows_signed(radix, add1(max), true); expect_overflows_signed(radix, min, false); expect_overflows_signed(radix, rem1(min), true); } test_overflows_hex(); test_overflows_bin(); // TODO: octal } TEST_CASE_TEMPLATE("overflows.8bit_32bit", T, uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t) { test_overflows(); } TEST_CASE("overflows.u64") { CHECK(!overflows("18446744073709551614")); CHECK(!overflows("18446744073709551615")); CHECK(overflows("18446744073709551616")); // more chars but leading zeroes CHECK(!overflows("0018446744073709551615")); { /* with leading zeroes */ std::string str; uint64_t x = {}; str = "0o01" + std::string(21, '7'); CHECK_MESSAGE(!overflows(to_csubstr(str)), "num=" << str); str = "0o02" + std::string(21, '0'); CHECK_MESSAGE(overflows(to_csubstr(str)), "num=" << str); CHECK(atox(to_csubstr(str), &x)); CHECK_EQ(0, x); } test_overflows_hex(); test_overflows_bin(); // TODO: octal } TEST_CASE("overflows.i64") { CHECK(!overflows("9223372036854775806")); CHECK(!overflows("9223372036854775807")); CHECK(overflows("9223372036854775808")); CHECK(!overflows("-9223372036854775808")); CHECK(overflows("-9223372036854775809")); // more chars, but leading zeroes CHECK(!overflows("0009223372036854775807")); CHECK(!overflows("-0009223372036854775807")); { /* with leading zeroes */ std::string str; int64_t x = {}; str = "0o0" + std::string(21, '7'); CHECK_MESSAGE(!overflows(to_csubstr(str)), "num=" << str); str = "0o01" + std::string(21, '0'); CHECK_MESSAGE(overflows(to_csubstr(str)), "num=" << str); CHECK(atox(to_csubstr(str), &x)); CHECK_EQ(std::numeric_limits::min(), x); } test_overflows_hex(); test_overflows_bin(); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /** remove trailing digits after precision */ template T remprec10(T val, int precision) { T fprec = T(1); for(int i = 0; i < precision; ++i) fprec *= T(10); T rval = val * fprec; return ((T)((int64_t)rval)) / fprec; } template T test_ator(csubstr s, T ref) { INFO("str=" << s << " ref=" << ref); T rval; CHECK(atox(s, &rval)); INFO("rval=" << rval); CHECK_EQ(memcmp(&rval, &ref, sizeof(T)), 0); return rval; } template void test_rtoa(substr buf, Real f, int precision, const char *scient, const char *flt, const char* flex, const char *hexa, const char *hexa_alternative=nullptr) { size_t ret; Real pf = remprec10(f, precision); { INFO("num=" << f << " precision=" << precision << " scient=" << scient); memset(buf.str, 0, buf.len); ret = xtoa(buf, f, precision, FTOA_SCIENT); REQUIRE_LE(ret, buf.len); CHECK_EQ(buf.first(ret), to_csubstr(scient)); test_ator(buf.first(ret), pf); } { INFO("num=" << f << " precision=" << precision << " flt=" << flt); memset(buf.str, 0, ret); ret = xtoa(buf, f, precision, FTOA_FLOAT); REQUIRE_LE(ret, buf.len); CHECK_EQ(buf.first(ret), to_csubstr(flt)); test_ator(buf.first(ret), pf); } { INFO("num=" << f << " precision=" << precision << " flex=" << flex); memset(buf.str, 0, ret); ret = xtoa(buf, f, precision+1, FTOA_FLEX); REQUIRE_LE(ret, buf.len); CHECK_EQ(buf.first(ret), to_csubstr(flex)); test_ator(buf.first(ret), pf); } { if(!hexa_alternative) hexa_alternative = hexa; INFO("num=" << f << " precision=" << precision << " hexa=" << hexa << " hexa_alternative=" << hexa_alternative); memset(buf.str, 0, ret); ret = xtoa(buf, f, precision, FTOA_HEXA); REQUIRE_LE(ret, buf.len); INFO("buf='" << buf.first(ret) << "'"); CHECK((buf.first(ret) == to_csubstr(hexa) || buf.first(ret) == to_csubstr(hexa_alternative))); Real readback = {}; CHECK(atox(buf.first(ret), &readback)); INFO("readback=" << readback); REQUIRE_EQ(xtoa(buf, readback, precision, FTOA_HEXA), ret); Real readback2 = {}; CHECK(atox(buf.first(ret), &readback2)); INFO("readback2=" << readback2); CHECK_EQ(memcmp(&readback2, &readback, sizeof(Real)), 0); } } TEST_CASE("ftoa.basic") { char bufc[128]; substr buf(bufc); C4_ASSERT(buf.len == sizeof(bufc)-1); // earlier versions of emscripten's sprintf() do not respect some // precision values when printing in hexadecimal format. // // @see https://github.com/biojppm/c4core/pull/52 #if defined(__EMSCRIPTEN__) && __EMSCRIPTEN__ < 3 #define _c4emscripten_alt(alt) , alt #define _c4emscripten_alt2(alt1, alt2) , alt2 #else #define _c4emscripten_alt(alt) #define _c4emscripten_alt2(alt1, alt2) , alt1 #endif float f = 1.1234123f; double d = 1.1234123; test_rtoa(buf, f, 0, /*scient*/"1e+00", /*flt*/"1", /*flex*/"1", /*hexa*/"0x1p+0"); test_rtoa(buf, d, 0, /*scient*/"1e+00", /*flt*/"1", /*flex*/"1", /*hexa*/"0x1p+0"); test_rtoa(buf, f, 1, /*scient*/"1.1e+00", /*flt*/"1.1", /*flex*/"1.1", /*hexa*/"0x1.2p+0"); test_rtoa(buf, d, 1, /*scient*/"1.1e+00", /*flt*/"1.1", /*flex*/"1.1", /*hexa*/"0x1.2p+0"); test_rtoa(buf, f, 2, /*scient*/"1.12e+00", /*flt*/"1.12", /*flex*/"1.12", /*hexa*/"0x1.20p+0" _c4emscripten_alt("0x1.1f8p+0")); test_rtoa(buf, d, 2, /*scient*/"1.12e+00", /*flt*/"1.12", /*flex*/"1.12", /*hexa*/"0x1.20p+0" _c4emscripten_alt("0x1.1f8p+0")); test_rtoa(buf, f, 3, /*scient*/"1.123e+00", /*flt*/"1.123", /*flex*/"1.123", /*hexa*/"0x1.1f9p+0" _c4emscripten_alt("0x1.1f98p+0")); test_rtoa(buf, d, 3, /*scient*/"1.123e+00", /*flt*/"1.123", /*flex*/"1.123", /*hexa*/"0x1.1f9p+0" _c4emscripten_alt("0x1.1f98p+0")); test_rtoa(buf, f, 4, /*scient*/"1.1234e+00", /*flt*/"1.1234", /*flex*/"1.1234", /*hexa*/"0x1.1f98p+0"); test_rtoa(buf, d, 4, /*scient*/"1.1234e+00", /*flt*/"1.1234", /*flex*/"1.1234", /*hexa*/"0x1.1f98p+0"); f = 1.01234123f; d = 1.01234123; test_rtoa(buf, f, 0, /*scient*/"1e+00", /*flt*/"1", /*flex*/"1", /*hexa*/"0x1p+0"); test_rtoa(buf, d, 0, /*scient*/"1e+00", /*flt*/"1", /*flex*/"1", /*hexa*/"0x1p+0"); test_rtoa(buf, f, 1, /*scient*/"1.0e+00", /*flt*/"1.0", /*flex*/"1", /*hexa*/"0x1.0p+0"); test_rtoa(buf, d, 1, /*scient*/"1.0e+00", /*flt*/"1.0", /*flex*/"1", /*hexa*/"0x1.0p+0"); test_rtoa(buf, f, 2, /*scient*/"1.01e+00", /*flt*/"1.01", /*flex*/"1.01", /*hexa*/"0x1.03p+0"); test_rtoa(buf, d, 2, /*scient*/"1.01e+00", /*flt*/"1.01", /*flex*/"1.01", /*hexa*/"0x1.03p+0"); test_rtoa(buf, f, 3, /*scient*/"1.012e+00", /*flt*/"1.012", /*flex*/"1.012", /*hexa*/"0x1.033p+0" _c4emscripten_alt2("0x1.032p+0", "0x1.0328p+0")); test_rtoa(buf, d, 3, /*scient*/"1.012e+00", /*flt*/"1.012", /*flex*/"1.012", /*hexa*/"0x1.033p+0" _c4emscripten_alt2("0x1.032p+0", "0x1.0328p+0")); test_rtoa(buf, f, 4, /*scient*/"1.0123e+00", /*flt*/"1.0123", /*flex*/"1.0123", /*hexa*/"0x1.0329p+0"); test_rtoa(buf, d, 4, /*scient*/"1.0123e+00", /*flt*/"1.0123", /*flex*/"1.0123", /*hexa*/"0x1.0329p+0"); f = 0.f; d = 0.; test_rtoa(buf, f, 0, /*scient*/"0e+00", /*flt*/"0", /*flex*/"0", /*hexa*/"0x0p+0"); test_rtoa(buf, d, 0, /*scient*/"0e+00", /*flt*/"0", /*flex*/"0", /*hexa*/"0x0p+0"); test_rtoa(buf, f, 1, /*scient*/"0.0e+00", /*flt*/"0.0", /*flex*/"0", /*hexa*/"0x0.0p+0"); test_rtoa(buf, d, 1, /*scient*/"0.0e+00", /*flt*/"0.0", /*flex*/"0", /*hexa*/"0x0.0p+0"); test_rtoa(buf, f, 2, /*scient*/"0.00e+00", /*flt*/"0.00", /*flex*/"0", /*hexa*/"0x0.00p+0"); test_rtoa(buf, d, 2, /*scient*/"0.00e+00", /*flt*/"0.00", /*flex*/"0", /*hexa*/"0x0.00p+0"); test_rtoa(buf, f, 3, /*scient*/"0.000e+00", /*flt*/"0.000", /*flex*/"0", /*hexa*/"0x0.000p+0" _c4emscripten_alt2("0x0.000p+0", "0x0.000p+0")); test_rtoa(buf, d, 3, /*scient*/"0.000e+00", /*flt*/"0.000", /*flex*/"0", /*hexa*/"0x0.000p+0" _c4emscripten_alt2("0x0.000p+0", "0x0.000p+0")); test_rtoa(buf, f, 4, /*scient*/"0.0000e+00", /*flt*/"0.0000", /*flex*/"0", /*hexa*/"0x0.0000p+0"); test_rtoa(buf, d, 4, /*scient*/"0.0000e+00", /*flt*/"0.0000", /*flex*/"0", /*hexa*/"0x0.0000p+0"); f = 1.f; d = 1.; test_rtoa(buf, f, 0, /*scient*/"1e+00", /*flt*/"1", /*flex*/"1", /*hexa*/"0x1p+0"); test_rtoa(buf, d, 0, /*scient*/"1e+00", /*flt*/"1", /*flex*/"1", /*hexa*/"0x1p+0"); test_rtoa(buf, f, 1, /*scient*/"1.0e+00", /*flt*/"1.0", /*flex*/"1", /*hexa*/"0x1.0p+0"); test_rtoa(buf, d, 1, /*scient*/"1.0e+00", /*flt*/"1.0", /*flex*/"1", /*hexa*/"0x1.0p+0"); test_rtoa(buf, f, 2, /*scient*/"1.00e+00", /*flt*/"1.00", /*flex*/"1", /*hexa*/"0x1.00p+0"); test_rtoa(buf, d, 2, /*scient*/"1.00e+00", /*flt*/"1.00", /*flex*/"1", /*hexa*/"0x1.00p+0"); test_rtoa(buf, f, 3, /*scient*/"1.000e+00", /*flt*/"1.000", /*flex*/"1", /*hexa*/"0x1.000p+0" _c4emscripten_alt2("0x1.000p+0", "0x1.000p+0")); test_rtoa(buf, d, 3, /*scient*/"1.000e+00", /*flt*/"1.000", /*flex*/"1", /*hexa*/"0x1.000p+0" _c4emscripten_alt2("0x1.000p+0", "0x1.000p+0")); test_rtoa(buf, f, 4, /*scient*/"1.0000e+00", /*flt*/"1.0000", /*flex*/"1", /*hexa*/"0x1.0000p+0"); test_rtoa(buf, d, 4, /*scient*/"1.0000e+00", /*flt*/"1.0000", /*flex*/"1", /*hexa*/"0x1.0000p+0"); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- TEST_CASE_TEMPLATE("atof.integral", T, float, double) { auto t_ = [](csubstr str, int val){ T rval = (T)10 * (T)val; INFO("str=" << str); bool ret = atox(str, &rval); CHECK_EQ(ret, true); CHECK_EQ(static_cast(rval), val); CHECK_EQ(rval, (T)val); }; csubstr s = "12345678"; t_(s, 12345678); t_(s.first(8), 12345678); t_(s.first(7), 1234567); t_(s.first(6), 123456); t_(s.first(5), 12345); t_(s.first(4), 1234); t_(s.first(3), 123); t_(s.first(2), 12); t_(s.first(1), 1); } TEST_CASE_TEMPLATE("atof.hexa", T, float, double) { auto t_ = [](csubstr str, bool isok){ T rval = {}; INFO("str=" << str); CHECK_EQ(atox(str, &rval), isok); }; #if defined(C4CORE_NO_FAST_FLOAT) #define _scanf_accepts(expected) !expected #else #define _scanf_accepts(expected) expected #endif t_("0x1.p+0", true); t_("0x1.p", _scanf_accepts(false)); t_("0x1.p+", _scanf_accepts(false)); t_("0x12p+0", true); t_("0x12p", _scanf_accepts(false)); t_("0xabcdef.abcdefp+0", true); t_("0xABCDEF.ABCDEFp+0", true); t_("0x1g", _scanf_accepts(false)); t_("0x1.2", true); t_("0x1.", true); t_("0x1.0329p+0", true); t_("0x1.0329P+0", true); t_("0x1.aAaAaAp+0", true); t_("0x1.agA+0", _scanf_accepts(false)); } TEST_CASE_TEMPLATE("atof.infnan", T, float, double) { T pinf = std::numeric_limits::infinity(); T ninf = -std::numeric_limits::infinity(); T nan = std::numeric_limits::quiet_NaN(); T rval = {}; test_ator("infinity", pinf); test_ator("inf", pinf); test_ator("-infinity", ninf); test_ator("-inf", ninf); test_ator("nan", nan); } TEST_CASE_TEMPLATE("atof.fail_parse", T, float, double) { auto t_ = [](csubstr str){ T rval; INFO("str=" << str << " rval=" << rval); CHECK_EQ(atox(str, &rval), false); }; t_(".inf"); t_("-.inf"); t_(".nan"); t_("-.nan"); t_("not a float!"); #ifndef C4CORE_NO_FAST_FLOAT t_("0xfonix!"); #endif //t_("123.45not a float!"); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- TEST_CASE_TEMPLATE("to_chars.empty_buffer", T, uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t, uint64_t, int64_t, void*) { char buf_[100]; substr buf = buf_; CHECK_EQ(to_chars({}, T(101)), to_chars(buf_, T(101))); CHECK_EQ(to_chars({}, T(101)), to_chars(buf , T(101))); } // due to an implementation quirk with sprintf, for floats the empty is GE TEST_CASE_TEMPLATE("to_chars.empty_buffer", T, float, double) { char buf_[100]; substr buf = buf_; CHECK_GE(to_chars({}, T(101)), to_chars(buf_, T(101))); CHECK_GE(to_chars({}, T(101)), to_chars(buf , T(101))); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- TEST_CASE("to_chars.std_string") { std::string foo("foo"); char buf_[32]; substr buf(buf_); size_t result = to_chars(buf, foo); CHECK_EQ(result, 3); CHECK_EQ(buf.first(3), "foo"); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- TEST_CASE("to_chars.bool") { char buf_[32]; substr buf(buf_); csubstr result = to_chars_sub(buf, true); CHECK_EQ(result, "1"); result = to_chars_sub(buf, false); CHECK_EQ(result, "0"); } TEST_CASE("from_chars.bool") { bool result = false; for(const char *s : {"1", "true", "True", "TRUE"}) { INFO("s='" << s << "'"); bool ok = from_chars(to_csubstr(s), &result); CHECK_UNARY(ok); CHECK_UNARY(result); } for(const char *s : {"0", "false", "False", "FALSE"}) { INFO("s='" << s << "'"); bool ok = from_chars(to_csubstr(s), &result); CHECK_UNARY(ok); CHECK_UNARY_FALSE(result); } } TEST_CASE("from_chars_first.bool") { bool result = false; for(const char *s : {"1", "10000", "2", "3", "10", "010", "001", "0001", "true", "True", "TRUE"}) { INFO("s='" << s << "'"); bool ok = from_chars(to_csubstr(s), &result); CHECK_UNARY(ok); CHECK_UNARY(result); } for(const char *s : {"0", "00", "000", "0000", "false", "False", "FALSE"}) { INFO("s='" << s << "'"); bool ok = from_chars(to_csubstr(s), &result); CHECK_UNARY(ok); CHECK_UNARY_FALSE(result); } } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // test that no characters are trimmed at the end of // the number due to printf-based implementations // needing space for the \0 template void test_trimmed_fit(T v, csubstr expected) { char buf_[128] = {}; char buf2_[128] = {}; substr buf(buf_); substr buf2(buf_); REQUIRE_GE(buf.len, expected.len); REQUIRE_GE(buf2.len, expected.len); csubstr result = to_chars_sub(buf, v); CHECK_EQ(result, expected); csubstr result2 = to_chars_sub(buf2.sub(result.len), v); CHECK_EQ(result2, result); std::string str; catrs(&str, v); CHECK_EQ(expected, to_csubstr(str)); CHECK_EQ(result, to_csubstr(str)); } TEST_CASE("to_chars.trimmed_fit_int") { test_trimmed_fit(12345678, "12345678"); } TEST_CASE("to_chars.trimmed_fit_float") { test_trimmed_fit(0.374f, "0.374"); test_trimmed_fit(12.374f, "12.374"); } TEST_CASE("to_chars.trimmed_fit_double") { test_trimmed_fit(0.374, "0.374"); test_trimmed_fit(12.374, "12.374"); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- template void to_chars_roundtrip(substr buf, T const& val, csubstr expected) { T cp = {}; INFO("val=" << val); csubstr res = to_chars_sub(buf, val); CHECK_EQ(res, expected); bool ok = from_chars(res, &cp); CHECK_UNARY(ok); CHECK_EQ(cp, val); } template void to_chars_roundtrip(char (&buf)[N], csubstr val) { char cp_[N] = {}; substr cp = cp_; INFO("val=" << val); REQUIRE_LE(val.len, N); csubstr res = to_chars_sub(buf, val); CHECK_EQ(res.len, val.len); CHECK_EQ(res, val); bool ok = from_chars(res, &cp); CHECK_UNARY(ok); CHECK_EQ(cp, val); } TEST_CASE("to_chars.roundtrip_bool") { char buf[128]; to_chars_roundtrip(buf, false, "0"); to_chars_roundtrip(buf, true, "1"); } TEST_CASE("to_chars.roundtrip_char") { char buf[128]; to_chars_roundtrip(buf, 'a', "a"); to_chars_roundtrip(buf, 'b', "b"); to_chars_roundtrip(buf, 'c', "c"); to_chars_roundtrip(buf, 'd', "d"); } #define C4_TEST_ROUNDTRIP_INT(ty) \ TEST_CASE("to_chars.roundtrip_" #ty)\ {\ char buf[128];\ to_chars_roundtrip(buf, 0, "0");\ to_chars_roundtrip(buf, 1, "1");\ to_chars_roundtrip(buf, 2, "2");\ to_chars_roundtrip(buf, 3, "3");\ to_chars_roundtrip(buf, 4, "4");\ } C4_TEST_ROUNDTRIP_INT(int8_t) C4_TEST_ROUNDTRIP_INT(int16_t) C4_TEST_ROUNDTRIP_INT(int32_t) C4_TEST_ROUNDTRIP_INT(int64_t) C4_TEST_ROUNDTRIP_INT(uint8_t) C4_TEST_ROUNDTRIP_INT(uint16_t) C4_TEST_ROUNDTRIP_INT(uint32_t) C4_TEST_ROUNDTRIP_INT(uint64_t) // some of the following types are not the same as above: using ulong = unsigned long; using uint = unsigned int; C4_TEST_ROUNDTRIP_INT(int) C4_TEST_ROUNDTRIP_INT(uint) C4_TEST_ROUNDTRIP_INT(long) C4_TEST_ROUNDTRIP_INT(ulong) C4_TEST_ROUNDTRIP_INT(size_t) C4_TEST_ROUNDTRIP_INT(intptr_t) C4_TEST_ROUNDTRIP_INT(uintptr_t) #define C4_TEST_ROUNDTRIP_REAL(ty) \ TEST_CASE("to_chars.roundtrip_" #ty)\ {\ char buf[128];\ to_chars_roundtrip(buf, ty(0.0), "0");\ to_chars_roundtrip(buf, ty(1.0), "1");\ to_chars_roundtrip(buf, ty(2.0), "2");\ to_chars_roundtrip(buf, ty(3.0), "3");\ to_chars_roundtrip(buf, ty(4.0), "4");\ } C4_TEST_ROUNDTRIP_REAL(float) C4_TEST_ROUNDTRIP_REAL(double) TEST_CASE("to_chars.roundtrip_substr") { char buf[128]; to_chars_roundtrip(buf, ""); to_chars_roundtrip(buf, "0"); to_chars_roundtrip(buf, "1"); to_chars_roundtrip(buf, "2"); to_chars_roundtrip(buf, "3"); to_chars_roundtrip(buf, "4"); to_chars_roundtrip(buf, "zhis iz a test"); } TEST_CASE("to_chars.substr_enough_size") { char orig_[] = "0123456789"; substr orig = orig_; char result_[20]; substr result = result_; size_t len = to_chars(result, orig); CHECK_EQ(len, orig.len); CHECK_NE(result.str, orig.str); CHECK_EQ(result.first(10), orig); } TEST_CASE("to_chars.substr_insufficient_size") { char orig_[] = "0123456789"; substr orig = orig_; char result_[11] = {}; substr result = result_; result.len = 5; size_t len = to_chars(result, orig); CHECK_EQ(len, orig.len); CHECK_NE(result.str, orig.str); CHECK_EQ(result.first(5), "01234"); CHECK_EQ(substr(result_).last(5), "\0\0\0\0\0"); } TEST_CASE("from_chars.csubstr") { csubstr orig = "0123456789"; csubstr result; CHECK_NE(result.str, orig.str); CHECK_NE(result.len, orig.len); bool ok = from_chars(orig, &result); CHECK(ok); CHECK_EQ(result.str, orig.str); CHECK_EQ(result.len, orig.len); } TEST_CASE("from_chars.substr_enough_size") { char buf_[128] = {}; substr result = buf_; for(char r : result) { CHECK_EQ(r, '\0'); } bool ok = from_chars("0123456789", &result); CHECK(ok); CHECK_EQ(result.len, 10); CHECK_EQ(result.str, buf_); CHECK_EQ(result, "0123456789"); } TEST_CASE("from_chars.substr_insufficient_size") { char buf_[128] = {}; substr buf = buf_; buf.len = 0; bool ok = from_chars("0123456789", &buf); CHECK_FALSE(ok); for(size_t i = 0; i < 10; ++i) { CHECK_EQ(buf_[i], '\0'); } } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- struct ptr_expected { void *ptr; c4::csubstr str; }; const ptr_expected ptr_cases[] = { {(void*)0x0, c4::csubstr("0x0")}, {(void*)0x1234, c4::csubstr("0x1234")}, {(void*)-0x1234, c4::csubstr("-0x1234")}, }; template void test_xtoa_ptr(const char *type_name) { INFO("type=" << type_name); char buf_[128] = {}; c4::substr buf(buf_); for(auto &pe : ptr_cases) { INFO("val=" << pe.str); size_t ret = xtoa(buf, (T const*)pe.ptr); CHECK_EQ(ret, pe.str.len); CHECK_EQ(buf.first(ret), pe.str); } } template void test_to_chars_ptr(const char *type_name) { INFO("type=" << type_name); char buf_[128] = {}; c4::substr buf(buf_); for(auto &pe : ptr_cases) { INFO("val=" << pe.str); size_t ret = to_chars(buf, (T const*)pe.ptr); CHECK_EQ(ret, pe.str.len); CHECK_EQ(buf.first(ret), pe.str); } } template void test_atox_ptr(const char *type_name) { INFO("type=" << type_name); for(auto &pe : ptr_cases) { T *ptr = nullptr; INFO("val=" << pe.str); bool ret = atox(pe.str, &ptr); CHECK(ret); CHECK_EQ((void*)ptr, pe.ptr); } } template void test_from_chars_ptr(const char *type_name) { INFO("type=" << type_name); for(auto &pe : ptr_cases) { T *ptr = nullptr; INFO("val=" << pe.str); bool ret = from_chars(pe.str, &ptr); CHECK(ret); CHECK_EQ((void*)ptr, pe.ptr); } } template void test_from_chars_first_ptr(const char *type_name) { INFO("type=" << type_name); for(auto &pe : ptr_cases) { T *ptr = nullptr; INFO("val=" << pe.str); bool ret = from_chars(pe.str, &ptr); CHECK(ret); CHECK_EQ((void*)ptr, pe.ptr); } } TEST_CASE("xtoa.ptr") { test_xtoa_ptr("void"); test_xtoa_ptr("int"); test_xtoa_ptr>("std::vector"); } TEST_CASE("atox.ptr") { test_atox_ptr("void"); test_atox_ptr("int"); test_atox_ptr>("std::vector"); } TEST_CASE("to_chars.ptr") { test_to_chars_ptr("void"); test_to_chars_ptr("int"); test_to_chars_ptr>("std::vector"); } TEST_CASE("from_chars.ptr") { test_from_chars_ptr("void"); test_from_chars_ptr("int"); test_from_chars_ptr>("std::vector"); } TEST_CASE("from_chars_first.ptr") { test_from_chars_first_ptr("void"); test_from_chars_first_ptr("int"); test_from_chars_first_ptr>("std::vector"); } } // namespace c4 C4_SUPPRESS_WARNING_GCC_POP C4_SUPPRESS_WARNING_CLANG_POP #include "c4/libtest/supprwarn_pop.hpp" c4core-0.2.6/test/test_ctor_dtor.cpp000066400000000000000000000177651477602032300174430ustar00rootroot00000000000000#ifndef C4CORE_SINGLE_HEADER #include "c4/ctor_dtor.hpp" #endif #include "c4/libtest/supprwarn_push.hpp" #include #include #include namespace c4 { namespace { struct subject { static size_t ct_cp, ct_mv, cp, mv; static void clear() { ct_cp = ct_mv = cp = mv = 0; } subject(Counting const&) { ++ct_cp; } subject(Counting &&) { ++ct_mv; } subject(subject const&) { ++cp; } subject(subject &&) { ++mv; } }; size_t subject::ct_cp = 0; size_t subject::ct_mv = 0; size_t subject::cp = 0; size_t subject::mv = 0; } // empty namespace TEST_CASE("ctor_dtor.construct_n") { using T = Counting; C4_STATIC_ASSERT(sizeof(T) % alignof(T) == 0); alignas(T) char buf1[100 * sizeof(T)]; T* mem1 = reinterpret_cast(buf1); using cs = Counting; decltype(subject::ct_cp) num = 10; { auto chc = T::check_num_ctors_dtors(num, 0); auto ch = cs::check_num_ctors_dtors(1, 1); cs s("bla"); construct_n(mem1, num, s); CHECK_EQ(subject::ct_cp, num); subject::clear(); } { auto chc = T::check_num_ctors_dtors(num, 0); auto ch = cs::check_num_ctors_dtors(1, 1); construct_n(mem1, num, cs("bla")); // BAD!!! will call 10 moves CHECK_EQ(subject::ct_cp, num); subject::clear(); } } //----------------------------------------------------------------------------- template void create_make_room_buffer(std::vector &orig) { C4_STATIC_ASSERT(std::is_integral::value); for(int i = 0, e = (int)orig.size(); i < e; ++i) { orig[static_cast(i)] = (T)(33 + i % (122 - 33)); // assign characters } } template<> void create_make_room_buffer(std::vector &orig) { for(int i = 0, e = (int)orig.size(); i < e; ++i) { char c = (char)(33 + i % (122 - 33)); orig[static_cast(i)].assign(10, c); } } template void do_make_room_inplace(std::vector const& orig, std::vector & buf, size_t bufsz, size_t room, size_t pos) { buf = orig; make_room(buf.data() + pos, bufsz, room); } template void do_make_room_srcdst(std::vector const& orig, std::vector & buf, size_t bufsz, size_t room, size_t pos) { buf.resize(orig.size()); for(auto &t : buf) { t = T(); } make_room(buf.data(), orig.data(), bufsz, room, pos); } template void do_make_room_check(std::vector const& orig, std::vector & buf, size_t bufsz, size_t room, size_t pos) { for(size_t i = 0, e = orig.size(); i < e; ++i) { INFO("i=" << (int)i); if(i < pos) { // memory before the move, must be untouched CHECK_EQ(buf[i], orig[i]); } else { if(i >= pos && i < pos + room) { // this is the memory that was moved (at its origin) //CHECK_EQ(buf[i], orig[i]) << "i=" << (int)i; } else if(i >= pos + room && i < pos + room + bufsz) { // this is the memory that was moved (at its destination) CHECK_EQ(buf[i], orig[i - room]); } else { // this is memory at the end, must be untouched CHECK_EQ(buf[i], orig[i]); } } } }; template void do_make_room_inplace_test(std::vector const& orig, std::vector & buf, size_t bufsz, size_t room, size_t pos) { do_make_room_inplace(orig, buf, bufsz, room, pos); do_make_room_check(orig, buf, bufsz, room, pos); } template void do_make_room_srcdst_test(std::vector const& orig, std::vector & buf, size_t /*bufsz*/, size_t room, size_t pos) { do_make_room_srcdst(orig, buf, buf.size() - room, room, pos); do_make_room_check(orig, buf, buf.size() - room, room, pos); } template void test_make_room(Func test_func) { std::vector orig(100), buf(100); create_make_room_buffer(orig); { INFO("in the beginning without overlap"); test_func(orig, buf, /*bufsz*/10, /*room*/10, /*pos*/0); } { INFO("in the beginning with overlap"); test_func(orig, buf, /*bufsz*/10, /*room*/15, /*pos*/0); } { INFO("in the middle without overlap"); test_func(orig, buf, /*bufsz*/10, /*room*/10, /*pos*/10); } { INFO("in the middle with overlap"); test_func(orig, buf, /*bufsz*/10, /*room*/15, /*pos*/10); } } TEST_CASE_TEMPLATE("ctor_dtor.make_room_inplace", T, uint8_t, uint64_t, std::string) { test_make_room(do_make_room_inplace_test); } TEST_CASE_TEMPLATE("ctor_dtor.make_room_srcdst", T, uint8_t, uint64_t, std::string) { test_make_room(&do_make_room_srcdst_test); } //----------------------------------------------------------------------------- template void do_destroy_room_inplace(std::vector const& orig, std::vector & buf, size_t bufsz, size_t room, size_t pos) { buf = orig; destroy_room(buf.data() + pos, bufsz - pos, room); } template void do_destroy_room_srcdst(std::vector const& orig, std::vector & buf, size_t bufsz, size_t room, size_t pos) { buf = orig; destroy_room(buf.data(), orig.data(), bufsz, room, pos); } template void do_destroy_room_check(std::vector const& orig, std::vector & buf, size_t bufsz, size_t room, size_t pos) { for(size_t i = 0, e = orig.size(); i < e; ++i) { INFO("i=" << (int)i << " room=" << room << " pos=" << pos); if(i < pos) { // memory before the destroy, should be untouched CHECK_EQ(buf[i], orig[i]); } else { if(i >= pos && i < pos + room) { // this is the memory that was destroyed (at its origin) } else if(i >= pos + room && i < pos + room + bufsz) { // this is the memory that was moved (at its destination) CHECK_EQ(buf[i - room], orig[i]); } else { // this is memory at the end, should be untouched CHECK_EQ(buf[i], orig[i]); } } } }; template void do_destroy_room_inplace_test(std::vector const& orig, std::vector & buf, size_t room, size_t pos) { do_destroy_room_inplace(orig, buf, buf.size(), room, pos); do_destroy_room_check(orig, buf, buf.size(), room, pos); } template void do_destroy_room_srcdst_test(std::vector const& orig, std::vector & buf, size_t room, size_t pos) { do_destroy_room_srcdst(orig, buf, buf.size(), room, pos); do_destroy_room_check(orig, buf, buf.size(), room, pos); } template void test_destroy_room(Func test_func) { std::vector orig(100), buf(100); create_make_room_buffer(orig); { INFO("in the beginning, room=10"); test_func(orig, buf, /*room*/10, /*pos*/0); } { INFO("in the beginning, room=20"); test_func(orig, buf, /*room*/20, /*pos*/0); } { INFO("in the middle, room=10"); test_func(orig, buf, /*room*/10, /*pos*/10); } { INFO("in the middle, room=20"); test_func(orig, buf, /*room*/20, /*pos*/10); } } TEST_CASE_TEMPLATE("ctor_dtor.destroy_room_inplace", T, uint8_t, uint64_t, std::string) { test_destroy_room(do_destroy_room_inplace_test); } TEST_CASE_TEMPLATE("ctor_dtor.destroy_room_srcdst", T, uint8_t, uint64_t, std::string) { test_destroy_room(&do_destroy_room_srcdst_test); } } // namespace c4 #include "c4/libtest/supprwarn_pop.hpp" c4core-0.2.6/test/test_dump.cpp000066400000000000000000001760701477602032300164040ustar00rootroot00000000000000#ifndef C4CORE_SINGLE_HEADER #include "c4/substr.hpp" #include "c4/std/std.hpp" #include "c4/dump.hpp" #include "c4/format.hpp" #endif #include #include "c4/libtest/supprwarn_push.hpp" #ifdef __clang__ # pragma clang diagnostic push #elif defined(__GNUC__) # pragma GCC diagnostic push # pragma GCC diagnostic ignored "-Wuseless-cast" #endif namespace c4 { namespace example { std::string test_dumper_target = {}; void test_dumper(csubstr str) { test_dumper_target.append(str.str, str.len); } template void printf(csubstr fmt, Args&& ...args) { static thread_local std::string writebuf(16, '\0'); DumpResults results = format_dump_resume<&test_dumper>(c4::to_substr(writebuf), fmt, std::forward(args)...); if(C4_UNLIKELY(results.bufsize > writebuf.size())) // bufsize will be that of the largest element serialized. Eg int(1), will require 1 byte. { size_t dup = 2 * writebuf.size(); writebuf.resize(dup > results.bufsize ? dup : results.bufsize); format_dump_resume<&test_dumper>(results, c4::to_substr(writebuf), fmt, std::forward(args)...); } } } // namespace example TEST_CASE("printf_example") { example::test_dumper_target.clear(); SUBCASE("1") { example::printf("{} coffees per day.\n", 3); CHECK_EQ(example::test_dumper_target, "3 coffees per day.\n"); } SUBCASE("2") { example::printf("{} would be {}.", "brecky", "nice"); CHECK_EQ(example::test_dumper_target, "brecky would be nice."); } SUBCASE("resize writebuf") { // printed strings will not use the writebuf, so we write a zero-padded integer size_t dim = 128; // pad with 128 zeroes std::string s1(dim, '0'); std::string s2(dim, '0'); s1.back() = '1'; s2.back() = '2'; example::printf("{} cannot be {}", fmt::zpad(1, dim), fmt::zpad(2, dim)); CHECK_EQ(example::test_dumper_target, s1 + " cannot be " + s2); } } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- TEST_CASE("DumpResults") { DumpResults dr = {}; CHECK_EQ(dr.bufsize, 0u); CHECK_EQ(dr.lastok, DumpResults::noarg); CHECK_UNARY(dr.write_arg(0)); CHECK_FALSE(dr.success_until(0)); CHECK_EQ(dr.argfail(), 0); } struct DumpChecker { static size_t s_num_calls; static char s_workspace[100]; static size_t s_accum_pos; static char s_accum[100]; static void s_reset() { s_num_calls = 0; s_accum_pos = 0; for(size_t i = 0; i < sizeof(s_workspace); ++i) s_workspace[i] = '+'; for(size_t i = 0; i < sizeof(s_accum); ++i) s_accum[i] = '.'; } static C4_NO_INLINE void s_dump(csubstr buf) { substr rem = substr(s_accum, sizeof(s_accum)).sub(s_accum_pos); REQUIRE_FALSE(rem.overlaps(buf)); REQUIRE_FALSE(buf.overlaps(rem)); REQUIRE_LT(buf.len, sizeof(s_workspace)); REQUIRE_LE(s_accum_pos + buf.len, sizeof(s_accum)); REQUIRE_LE(buf.len, rem.len); ++s_num_calls; if(buf.len) memcpy(rem.str, buf.str, buf.len); s_accum_pos += buf.len; } }; size_t DumpChecker::s_num_calls = 0; char DumpChecker::s_workspace[100] = {}; size_t DumpChecker::s_accum_pos = {}; char DumpChecker::s_accum[100] = {}; struct SinkArgTpl { template static size_t call_dump(Args&& ...args) { return dump<&DumpChecker::s_dump>(std::forward(args)...); } template static size_t call_cat_dump(Args&& ...args) { return cat_dump<&DumpChecker::s_dump>(std::forward(args)...); } template static DumpResults call_cat_dump_resume(Args&& ...args) { return cat_dump_resume<&DumpChecker::s_dump>(std::forward(args)...); } template static size_t call_catsep_dump(Args&& ...args) { return catsep_dump<&DumpChecker::s_dump>(std::forward(args)...); } template static DumpResults call_catsep_dump_resume(Args&& ...args) { return catsep_dump_resume<&DumpChecker::s_dump>(std::forward(args)...); } template static size_t call_format_dump(Args&& ...args) { return format_dump<&DumpChecker::s_dump>(std::forward(args)...); } template static DumpResults call_format_dump_resume(Args&& ...args) { return format_dump_resume<&DumpChecker::s_dump>(std::forward(args)...); } }; struct SinkArgPfn { template static size_t call_dump(Args&& ...args) { return dump(&DumpChecker::s_dump,std::forward(args)...); } template static size_t call_cat_dump(Args&& ...args) { return cat_dump(&DumpChecker::s_dump, std::forward(args)...); } template static DumpResults call_cat_dump_resume(Args&& ...args) { return cat_dump_resume(&DumpChecker::s_dump, std::forward(args)...); } template static size_t call_catsep_dump(Args&& ...args) { return catsep_dump(&DumpChecker::s_dump, std::forward(args)...); } template static DumpResults call_catsep_dump_resume(Args&& ...args) { return catsep_dump_resume(&DumpChecker::s_dump, std::forward(args)...); } template static size_t call_format_dump(Args&& ...args) { return format_dump(&DumpChecker::s_dump, std::forward(args)...); } template static DumpResults call_format_dump_resume(Args&& ...args) { return format_dump_resume(&DumpChecker::s_dump, std::forward(args)...); } }; namespace buffers { int b1 = 1; int b2 = 22; int b3 = 333; int b4 = 4444; char s1[] = "1"; char s2[] = "22"; char s3[] = "333"; char s4[] = "4444"; const char cs1[] = "1"; const char cs2[] = "22"; const char cs3[] = "333"; const char cs4[] = "4444"; int sep = 90009; size_t seplen = 5; } TEST_CASE_TEMPLATE("dump", T, SinkArgTpl, SinkArgPfn) { using namespace buffers; substr buf = {DumpChecker::s_workspace, sizeof(DumpChecker::s_workspace)}; csubstr dst = {DumpChecker::s_accum, sizeof(DumpChecker::s_accum)}; auto accum = [&]{ REQUIRE_LE(DumpChecker::s_accum_pos, dst.len); return dst.first(DumpChecker::s_accum_pos); }; SUBCASE("csubstr") { DumpChecker::s_reset(); CHECK_EQ(T::call_dump(buf.first(0), csubstr(cs1)), 0); CHECK_EQ(accum(), "1"); CHECK_EQ(T::call_dump(buf.first(0), csubstr(cs2)), 0); CHECK_EQ(accum(), "122"); CHECK_EQ(T::call_dump(buf.first(0), csubstr(cs3)), 0); CHECK_EQ(accum(), "122333"); CHECK_EQ(T::call_dump(buf.first(0), csubstr(cs4)), 0); CHECK_EQ(accum(), "1223334444"); } SUBCASE("substr") { DumpChecker::s_reset(); CHECK_EQ(0, T::call_dump(buf.first(0), substr(s1))); CHECK_EQ(accum(), "1"); CHECK_EQ(0, T::call_dump(buf.first(0), substr(s2))); CHECK_EQ(accum(), "122"); CHECK_EQ(0, T::call_dump(buf.first(0), substr(s3))); CHECK_EQ(accum(), "122333"); CHECK_EQ(0, T::call_dump(buf.first(0), substr(s4))); CHECK_EQ(accum(), "1223334444"); } SUBCASE("const char*") { DumpChecker::s_reset(); CHECK_EQ(0, T::call_dump(buf.first(0), (const char*)cs1)); CHECK_EQ(accum(), "1"); CHECK_EQ(0, T::call_dump(buf.first(0), (const char*)cs2)); CHECK_EQ(accum(), "122"); CHECK_EQ(0, T::call_dump(buf.first(0), (const char*)cs3)); CHECK_EQ(accum(), "122333"); CHECK_EQ(0, T::call_dump(buf.first(0), (const char*)cs4)); CHECK_EQ(accum(), "1223334444"); } SUBCASE("char*") { DumpChecker::s_reset(); CHECK_EQ(0, T::call_dump(buf.first(0), (char*)s1)); CHECK_EQ(accum(), "1"); CHECK_EQ(0, T::call_dump(buf.first(0), (char*)s2)); CHECK_EQ(accum(), "122"); CHECK_EQ(0, T::call_dump(buf.first(0), (char*)s3)); CHECK_EQ(accum(), "122333"); CHECK_EQ(0, T::call_dump(buf.first(0), (char*)s4)); CHECK_EQ(accum(), "1223334444"); } SUBCASE("const char[]") { static_assert(std::is_array::value, "a"); DumpChecker::s_reset(); CHECK_EQ(0, T::call_dump(buf.first(0), cs1)); CHECK_EQ(accum(), "1"); CHECK_EQ(0, T::call_dump(buf.first(0), cs2)); CHECK_EQ(accum(), "122"); CHECK_EQ(0, T::call_dump(buf.first(0), cs3)); CHECK_EQ(accum(), "122333"); CHECK_EQ(0, T::call_dump(buf.first(0), cs4)); CHECK_EQ(accum(), "1223334444"); } SUBCASE("char[]") { DumpChecker::s_reset(); CHECK_EQ(0, T::call_dump(buf.first(0), s1)); CHECK_EQ(accum(), "1"); CHECK_EQ(0, T::call_dump(buf.first(0), s2)); CHECK_EQ(accum(), "122"); CHECK_EQ(0, T::call_dump(buf.first(0), s3)); CHECK_EQ(accum(), "122333"); CHECK_EQ(0, T::call_dump(buf.first(0), s4)); CHECK_EQ(accum(), "1223334444"); } } TEST_CASE_TEMPLATE("cat_dump", T, SinkArgTpl, SinkArgPfn) { using namespace buffers; substr buf = {DumpChecker::s_workspace, sizeof(DumpChecker::s_workspace)}; csubstr dst = {DumpChecker::s_accum, sizeof(DumpChecker::s_accum)}; { substr buf_ = DumpChecker::s_workspace; substr dst_ = DumpChecker::s_accum; CHECK_EQ(buf_.len + 1, buf.len); CHECK_EQ(dst_.len + 1, dst.len); } { csubstr buf_ = DumpChecker::s_workspace; csubstr dst_ = DumpChecker::s_accum; CHECK_EQ(buf_.len + 1, buf.len); CHECK_EQ(dst_.len + 1, dst.len); } auto accum = [&]{ REQUIRE_LE(DumpChecker::s_accum_pos, dst.len); return dst.first(DumpChecker::s_accum_pos); }; SUBCASE("dont use the buffer with strings") { DumpChecker::s_reset(); size_t needed_size = T::call_cat_dump(buf.first(0), b1); CHECK_EQ(needed_size, 1); CHECK_EQ(accum(), csubstr("")); needed_size = T::call_cat_dump(buf.first(0), b1, b2); CHECK_EQ(needed_size, 2); CHECK_EQ(accum(), csubstr("")); needed_size = T::call_cat_dump(buf.first(0), b1, b2, b3); CHECK_EQ(needed_size, 3); CHECK_EQ(accum(), csubstr("")); needed_size = T::call_cat_dump(buf.first(0), b1, b2, b3, b4); CHECK_EQ(needed_size, 4); CHECK_EQ(accum(), csubstr("")); DumpChecker::s_reset(); needed_size = T::call_cat_dump(buf.first(1), csubstr(cs1)); CHECK_EQ(needed_size, 0); CHECK_EQ(accum(), csubstr("1")); needed_size = T::call_cat_dump(buf.first(1), csubstr(cs1), csubstr(cs2)); CHECK_EQ(needed_size, 0); CHECK_EQ(accum(), csubstr("1122")); needed_size = T::call_cat_dump(buf.first(1), csubstr(cs1), csubstr(cs2), csubstr(cs3)); CHECK_EQ(needed_size, 0); CHECK_EQ(accum(), csubstr("1122122333")); needed_size = T::call_cat_dump(buf.first(1), csubstr(cs1), csubstr(cs2), csubstr(cs3), csubstr(cs4)); CHECK_EQ(needed_size, 0); CHECK_EQ(accum(), csubstr("11221223331223334444")); DumpChecker::s_reset(); needed_size = T::call_cat_dump(buf.first(1), substr(s1)); CHECK_EQ(needed_size, 0); CHECK_EQ(accum(), csubstr("1")); needed_size = T::call_cat_dump(buf.first(1), substr(s1), substr(s2)); CHECK_EQ(needed_size, 0); CHECK_EQ(accum(), csubstr("1122")); needed_size = T::call_cat_dump(buf.first(1), substr(s1), substr(s2), substr(s3)); CHECK_EQ(needed_size, 0); CHECK_EQ(accum(), csubstr("1122122333")); needed_size = T::call_cat_dump(buf.first(1), substr(s1), substr(s2), substr(s3), substr(s4)); CHECK_EQ(needed_size, 0); CHECK_EQ(accum(), csubstr("11221223331223334444")); DumpChecker::s_reset(); needed_size = T::call_cat_dump(buf.first(1), cs1); CHECK_EQ(needed_size, 0); CHECK_EQ(accum(), csubstr("1")); needed_size = T::call_cat_dump(buf.first(1), cs1, cs2); CHECK_EQ(needed_size, 0); CHECK_EQ(accum(), csubstr("1122")); needed_size = T::call_cat_dump(buf.first(1), cs1, cs2, cs3); CHECK_EQ(needed_size, 0); CHECK_EQ(accum(), csubstr("1122122333")); needed_size = T::call_cat_dump(buf.first(1), cs1, cs2, cs3, cs4); CHECK_EQ(needed_size, 0); CHECK_EQ(accum(), csubstr("11221223331223334444")); DumpChecker::s_reset(); needed_size = T::call_cat_dump(buf.first(1), s1); CHECK_EQ(needed_size, 0); CHECK_EQ(accum(), csubstr("1")); needed_size = T::call_cat_dump(buf.first(1), s1, s2); CHECK_EQ(needed_size, 0); CHECK_EQ(accum(), csubstr("1122")); needed_size = T::call_cat_dump(buf.first(1), s1, s2, s3); CHECK_EQ(needed_size, 0); CHECK_EQ(accum(), csubstr("1122122333")); needed_size = T::call_cat_dump(buf.first(1), s1, s2, s3, s4); CHECK_EQ(needed_size, 0); CHECK_EQ(accum(), csubstr("11221223331223334444")); DumpChecker::s_reset(); needed_size = T::call_cat_dump(buf.first(1), (const char*)cs1); CHECK_EQ(needed_size, 0); CHECK_EQ(accum(), csubstr("1")); needed_size = T::call_cat_dump(buf.first(1), (const char*)cs1, (const char*)cs2); CHECK_EQ(needed_size, 0); CHECK_EQ(accum(), csubstr("1122")); needed_size = T::call_cat_dump(buf.first(1), (const char*)cs1, (const char*)cs2, (const char*)cs3); CHECK_EQ(needed_size, 0); CHECK_EQ(accum(), csubstr("1122122333")); needed_size = T::call_cat_dump(buf.first(1), (const char*)cs1, (const char*)cs2, (const char*)cs3, (const char*)cs4); CHECK_EQ(needed_size, 0); CHECK_EQ(accum(), csubstr("11221223331223334444")); DumpChecker::s_reset(); needed_size = T::call_cat_dump(buf.first(1), (char*)s1); CHECK_EQ(needed_size, 0); CHECK_EQ(accum(), csubstr("1")); needed_size = T::call_cat_dump(buf.first(1), (char*)s1, (char*)s2); CHECK_EQ(needed_size, 0); CHECK_EQ(accum(), csubstr("1122")); needed_size = T::call_cat_dump(buf.first(1), (char*)s1, (char*)s2, (char*)s3); CHECK_EQ(needed_size, 0); CHECK_EQ(accum(), csubstr("1122122333")); needed_size = T::call_cat_dump(buf.first(1), (char*)s1, (char*)s2, (char*)s3, (char*)s4); CHECK_EQ(needed_size, 0); CHECK_EQ(accum(), csubstr("11221223331223334444")); DumpChecker::s_reset(); CHECK_EQ(to_chars({}, b1), 1); CHECK_EQ(to_chars({}, b2), 2); CHECK_EQ(to_chars({}, b3), 3); CHECK_EQ(to_chars({}, b4), 4); needed_size = T::call_cat_dump(buf.first(1), b1); CHECK_EQ(needed_size, 1); CHECK_EQ(accum(), csubstr("1")); needed_size = T::call_cat_dump(buf.first(1), b1, b2); CHECK_EQ(needed_size, 2); CHECK_EQ(accum(), csubstr("11")); needed_size = T::call_cat_dump(buf.first(1), b1, b2, b3); CHECK_EQ(needed_size, 3); CHECK_EQ(accum(), csubstr("111")); needed_size = T::call_cat_dump(buf.first(1), b1, b2, b3, b4); CHECK_EQ(needed_size, 4); CHECK_EQ(accum(), csubstr("1111")); DumpChecker::s_reset(); needed_size = T::call_cat_dump(buf.first(1), ("1")); CHECK_EQ(needed_size, 0); CHECK_EQ(accum(), csubstr("1")); needed_size = T::call_cat_dump(buf.first(1), ("1"), ("22")); CHECK_EQ(needed_size, 0); CHECK_EQ(accum(), csubstr("1122")); needed_size = T::call_cat_dump(buf.first(1), ("1"), ("22"), ("333")); CHECK_EQ(needed_size, 0); CHECK_EQ(accum(), csubstr("1122122333")); needed_size = T::call_cat_dump(buf.first(1), ("1"), ("22"), ("333"), ("4444")); CHECK_EQ(needed_size, 0); CHECK_EQ(accum(), csubstr("11221223331223334444")); DumpChecker::s_reset(); needed_size = T::call_cat_dump(buf.first(1), csubstr("1")); CHECK_EQ(needed_size, 0); CHECK_EQ(accum(), csubstr("1")); needed_size = T::call_cat_dump(buf.first(1), csubstr("1"), csubstr("22")); CHECK_EQ(needed_size, 0); CHECK_EQ(accum(), csubstr("1122")); needed_size = T::call_cat_dump(buf.first(1), csubstr("1"), csubstr("22"), csubstr("333")); CHECK_EQ(needed_size, 0); CHECK_EQ(accum(), csubstr("1122122333")); needed_size = T::call_cat_dump(buf.first(1), csubstr("1"), csubstr("22"), csubstr("333"), csubstr("4444")); CHECK_EQ(needed_size, 0); CHECK_EQ(accum(), csubstr("11221223331223334444")); } SUBCASE("1") { DumpChecker::s_reset(); size_t needed_size = T::call_cat_dump(buf.first(0), b1); CHECK_EQ(needed_size, 1u); CHECK_EQ(DumpChecker::s_num_calls, 0); // no calls to dump CHECK_EQ(buf.first(1), csubstr("+")); // nothing was written CHECK_EQ(accum(), csubstr("")); // nothing was written DumpChecker::s_reset(); needed_size = T::call_cat_dump(buf, b1); CHECK_EQ(needed_size, 1u); CHECK_EQ(DumpChecker::s_num_calls, 1); CHECK_EQ(buf.first(1), csubstr("1")); CHECK_EQ(accum(), csubstr("1")); } SUBCASE("1 2") { DumpChecker::s_reset(); size_t needed_size = T::call_cat_dump(buf.first(0), b1, b2); CHECK_EQ(needed_size, 2); CHECK_EQ(DumpChecker::s_num_calls, 0); CHECK_EQ(buf.first(needed_size), csubstr("++")); // nothing was written CHECK_EQ(accum(), csubstr("")); DumpChecker::s_reset(); needed_size = T::call_cat_dump(buf.first(1), b1); CHECK_EQ(needed_size, 1); CHECK_EQ(DumpChecker::s_num_calls, 1); CHECK_EQ(buf.first(needed_size), csubstr("1")); // only the first character of b2 was written CHECK_EQ(accum(), csubstr("1")); DumpChecker::s_reset(); needed_size = T::call_cat_dump(buf.first(1), b1, b2); CHECK_EQ(needed_size, 2); CHECK_EQ(DumpChecker::s_num_calls, 1); CHECK_EQ(buf.first(needed_size), csubstr("1+")); // only the first character of b2 was written CHECK_EQ(accum(), csubstr("1")); DumpChecker::s_reset(); needed_size = T::call_cat_dump(buf, b1); CHECK_EQ(needed_size, 1); CHECK_EQ(DumpChecker::s_num_calls, 1); CHECK_EQ(buf.first(needed_size), csubstr("1")); CHECK_EQ(accum(), csubstr("1")); DumpChecker::s_reset(); needed_size = T::call_cat_dump(buf, b1, b2); CHECK_EQ(needed_size, 2); CHECK_EQ(DumpChecker::s_num_calls, 2); CHECK_EQ(buf.first(needed_size), csubstr("22")); CHECK_EQ(DumpChecker::s_accum_pos, 3); CHECK_EQ(accum(), csubstr("122")); } SUBCASE("2 1") { DumpChecker::s_reset(); size_t needed_size = T::call_cat_dump(buf, b2); CHECK_EQ(needed_size, 2); CHECK_EQ(DumpChecker::s_num_calls, 1); CHECK_EQ(buf.first(2), csubstr("22")); CHECK_EQ(accum(), csubstr("22")); DumpChecker::s_reset(); needed_size = T::call_cat_dump(buf, b2, b1); CHECK_EQ(needed_size, 2); CHECK_EQ(DumpChecker::s_num_calls, 2); CHECK_EQ(buf.first(2), csubstr("12")); // wrote 2 then 1 CHECK_EQ(accum(), csubstr("221")); } SUBCASE("1 2 3 4") { DumpChecker::s_reset(); size_t needed_size = T::call_cat_dump(buf.first(0), b1, b2, b3, b4); CHECK_EQ(needed_size, 4); CHECK_EQ(DumpChecker::s_num_calls, 0); CHECK_EQ(buf.first(4), csubstr("++++")); CHECK_EQ(accum(), csubstr("")); DumpChecker::s_reset(); needed_size = T::call_cat_dump(buf.first(1), b1, b2, b3, b4); CHECK_EQ(needed_size, 4); CHECK_EQ(DumpChecker::s_num_calls, 1); CHECK_EQ(buf.first(4), csubstr("1+++")); CHECK_EQ(accum(), csubstr("1")); DumpChecker::s_reset(); needed_size = T::call_cat_dump(buf.first(2), b1, b2, b3, b4); CHECK_EQ(needed_size, 4); CHECK_EQ(DumpChecker::s_num_calls, 2); CHECK_EQ(buf.first(4), csubstr("22++")); CHECK_EQ(accum(), csubstr("122")); DumpChecker::s_reset(); needed_size = T::call_cat_dump(buf.first(3), b1, b2, b3, b4); CHECK_EQ(needed_size, 4); CHECK_EQ(DumpChecker::s_num_calls, 3); CHECK_EQ(buf.first(4), csubstr("333+")); CHECK_EQ(accum(), csubstr("122333")); DumpChecker::s_reset(); INFO("buf.len=" << buf.len); INFO("dst.len=" << dst.len); DumpChecker::s_reset(); CHECK_EQ(accum(), csubstr("")); needed_size = T::call_cat_dump(buf, b1); CHECK_EQ(needed_size, 1); CHECK_EQ(buf.first(needed_size), csubstr("1")); DumpChecker::s_reset(); needed_size = T::call_cat_dump(buf, b1, b2); CHECK_EQ(needed_size, 2); CHECK_EQ(buf.first(needed_size), csubstr("22")); DumpChecker::s_reset(); needed_size = T::call_cat_dump(buf, b1, b2, b3); CHECK_EQ(needed_size, 3); CHECK_EQ(buf.first(needed_size), csubstr("333")); DumpChecker::s_reset(); needed_size = T::call_cat_dump(buf, b1, b2, b3, b4); CHECK_EQ(needed_size, 4); CHECK_EQ(DumpChecker::s_num_calls, 4); CHECK_EQ(buf.first(4), csubstr("4444")); CHECK_EQ(accum().len, csubstr("1223334444").len); CHECK_EQ(accum(), csubstr("1223334444")); } SUBCASE("4 3 2 1") { DumpChecker::s_reset(); size_t needed_size = T::call_cat_dump(buf.first(0), b4, b3, b2, b1); CHECK_EQ(needed_size, 4); CHECK_EQ(DumpChecker::s_num_calls, 0); CHECK_EQ(buf.first(4), csubstr("++++")); CHECK_EQ(accum(), csubstr("")); DumpChecker::s_reset(); needed_size = T::call_cat_dump(buf.first(1), b4, b3, b2, b1); CHECK_EQ(needed_size, 4); CHECK_EQ(DumpChecker::s_num_calls, 0); CHECK_EQ(buf.first(4), csubstr("++++")); CHECK_EQ(accum(), csubstr("")); DumpChecker::s_reset(); needed_size = T::call_cat_dump(buf.first(2), b4, b3, b2, b1); CHECK_EQ(needed_size, 4); CHECK_EQ(DumpChecker::s_num_calls, 0); CHECK_EQ(buf.first(4), csubstr("++++")); CHECK_EQ(accum(), csubstr("")); DumpChecker::s_reset(); needed_size = T::call_cat_dump(buf.first(3), b4, b3, b2, b1); CHECK_EQ(needed_size, 4); CHECK_EQ(DumpChecker::s_num_calls, 0); CHECK_EQ(buf.first(4), csubstr("++++")); CHECK_EQ(accum(), csubstr("")); DumpChecker::s_reset(); needed_size = T::call_cat_dump(buf, b4, b3, b2, b1); CHECK_EQ(needed_size, 4); CHECK_EQ(DumpChecker::s_num_calls, 4); CHECK_EQ(buf.first(4), csubstr("1234")); CHECK_EQ(accum(), csubstr("4444333221")); } } TEST_CASE_TEMPLATE("cat_dump_resume", T, SinkArgTpl, SinkArgPfn) { using namespace buffers; substr buf = DumpChecker::s_workspace; auto accum = [&]{ return csubstr(DumpChecker::s_accum).first(DumpChecker::s_accum_pos); }; SUBCASE("1") { DumpChecker::s_reset(); DumpResults ret = T::call_cat_dump_resume(buf.first(0), b1); CHECK_UNARY(!ret.success_until(0)); CHECK_UNARY(!ret.success_until(1)); CHECK_UNARY(!ret.success_until(2)); CHECK_EQ(ret.bufsize, 1); CHECK_EQ(ret.lastok, DumpResults::noarg); CHECK_EQ(ret.argfail(), 0); CHECK_EQ(DumpChecker::s_num_calls, 0); // no calls to dump CHECK_EQ(buf.first(1), csubstr("+")); // nothing was written CHECK_EQ(accum(), csubstr("")); DumpResults retry = T::call_cat_dump_resume(ret, buf.first(1), b1); CHECK_UNARY(retry.success_until(0)); CHECK_UNARY(!retry.success_until(1)); CHECK_UNARY(!retry.success_until(2)); CHECK_EQ(retry.bufsize, 1); CHECK_EQ(retry.lastok, 0); CHECK_EQ(retry.argfail(), 1); CHECK_EQ(DumpChecker::s_num_calls, 1); CHECK_EQ(buf.first(1), csubstr("1")); CHECK_EQ(accum(), csubstr("1")); } SUBCASE("1 2") { DumpChecker::s_reset(); DumpResults ret = T::call_cat_dump_resume(buf.first(0), b1, b2); CHECK_UNARY(!ret.success_until(0)); CHECK_UNARY(!ret.success_until(1)); CHECK_UNARY(!ret.success_until(2)); CHECK_EQ(ret.bufsize, 2); // finds the buf size at once CHECK_EQ(ret.lastok, DumpResults::noarg); CHECK_EQ(ret.argfail(), 0); CHECK_EQ(DumpChecker::s_num_calls, 0); // no calls to dump CHECK_EQ(buf.first(2), csubstr("++")); // nothing was written CHECK_EQ(accum(), csubstr("")); ret = T::call_cat_dump_resume(ret, buf.first(1), b1, b2); CHECK_UNARY(!ret.success_until(0)); // ret.bufsize signals buffer is at least 2 CHECK_UNARY(!ret.success_until(1)); CHECK_UNARY(!ret.success_until(2)); CHECK_EQ(ret.bufsize, 2); CHECK_EQ(ret.lastok, DumpResults::noarg); CHECK_EQ(ret.argfail(), 0); CHECK_EQ(DumpChecker::s_num_calls, 0); CHECK_EQ(buf.first(2), csubstr("++")); CHECK_EQ(accum(), csubstr("")); ret = T::call_cat_dump_resume(ret, buf.first(2), b1, b2); CHECK_UNARY(ret.success_until(0)); CHECK_UNARY(ret.success_until(1)); CHECK_UNARY(!ret.success_until(2)); CHECK_EQ(ret.bufsize, 2); CHECK_EQ(ret.lastok, 1); CHECK_EQ(ret.argfail(), 2); CHECK_EQ(DumpChecker::s_num_calls, 2); CHECK_EQ(buf.first(2), csubstr("22")); CHECK_EQ(accum(), csubstr("122")); } SUBCASE("1 2 3 4") { DumpChecker::s_reset(); DumpResults ret = T::call_cat_dump_resume(buf.first(0), b1, b2, b3, b4); CHECK_UNARY(!ret.success_until(0)); CHECK_UNARY(!ret.success_until(1)); CHECK_UNARY(!ret.success_until(2)); CHECK_UNARY(!ret.success_until(3)); CHECK_EQ(ret.bufsize, 4); CHECK_EQ(ret.lastok, DumpResults::noarg); CHECK_EQ(ret.argfail(), 0); CHECK_EQ(DumpChecker::s_num_calls, 0); // no calls to dump CHECK_EQ(buf.first(4), csubstr("++++")); // nothing was written CHECK_EQ(accum(), csubstr("")); ret = T::call_cat_dump_resume(ret, buf.first(1), b1, b2, b3, b4); CHECK_UNARY(!ret.success_until(0)); CHECK_UNARY(!ret.success_until(1)); CHECK_UNARY(!ret.success_until(2)); CHECK_UNARY(!ret.success_until(3)); CHECK_EQ(ret.bufsize, 4); CHECK_EQ(ret.lastok, DumpResults::noarg); CHECK_EQ(ret.argfail(), 0); CHECK_EQ(DumpChecker::s_num_calls, 0); CHECK_EQ(buf.first(4), csubstr("++++")); CHECK_EQ(accum(), csubstr("")); ret = T::call_cat_dump_resume(ret, buf.first(2), b1, b2, b3, b4); CHECK_UNARY(!ret.success_until(0)); CHECK_UNARY(!ret.success_until(1)); CHECK_UNARY(!ret.success_until(2)); CHECK_UNARY(!ret.success_until(3)); CHECK_EQ(ret.bufsize, 4); CHECK_EQ(ret.lastok, DumpResults::noarg); CHECK_EQ(ret.argfail(), 0); CHECK_EQ(DumpChecker::s_num_calls, 0); CHECK_EQ(buf.first(4), csubstr("++++")); CHECK_EQ(accum(), csubstr("")); ret = T::call_cat_dump_resume(ret, buf.first(3), b1, b2, b3, b4); CHECK_UNARY(!ret.success_until(0)); CHECK_UNARY(!ret.success_until(1)); CHECK_UNARY(!ret.success_until(2)); CHECK_UNARY(!ret.success_until(3)); CHECK_EQ(ret.bufsize, 4); CHECK_EQ(ret.lastok, DumpResults::noarg); CHECK_EQ(ret.argfail(), 0); CHECK_EQ(DumpChecker::s_num_calls, 0); CHECK_EQ(buf.first(4), csubstr("++++")); CHECK_EQ(accum(), csubstr("")); ret = T::call_cat_dump_resume(ret, buf.first(4), b1, b2, b3, b4); CHECK_UNARY(ret.success_until(0)); CHECK_UNARY(ret.success_until(1)); CHECK_UNARY(ret.success_until(2)); CHECK_UNARY(ret.success_until(3)); CHECK_EQ(ret.bufsize, 4); CHECK_EQ(ret.lastok, 3); CHECK_EQ(ret.argfail(), 4); CHECK_EQ(DumpChecker::s_num_calls, 4); CHECK_EQ(buf.first(4), csubstr("4444")); CHECK_EQ(accum(), csubstr("1223334444")); } SUBCASE("4 3 2 1") { DumpChecker::s_reset(); DumpResults ret = T::call_cat_dump_resume(buf.first(0), b4, b3, b2, b1); CHECK_UNARY(!ret.success_until(0)); CHECK_UNARY(!ret.success_until(1)); CHECK_UNARY(!ret.success_until(2)); CHECK_UNARY(!ret.success_until(3)); CHECK_EQ(ret.bufsize, 4); CHECK_EQ(ret.lastok, DumpResults::noarg); CHECK_EQ(ret.argfail(), 0); CHECK_EQ(DumpChecker::s_num_calls, 0); // no calls to dump CHECK_EQ(buf.first(4), csubstr("++++")); // nothing was written CHECK_EQ(accum(), csubstr("")); ret = T::call_cat_dump_resume(ret, buf.first(1), b4, b3, b2, b1); CHECK_UNARY(!ret.success_until(0)); CHECK_UNARY(!ret.success_until(1)); CHECK_UNARY(!ret.success_until(2)); CHECK_UNARY(!ret.success_until(3)); CHECK_EQ(ret.bufsize, 4); CHECK_EQ(ret.lastok, DumpResults::noarg); CHECK_EQ(ret.argfail(), 0); CHECK_EQ(DumpChecker::s_num_calls, 0); CHECK_EQ(buf.first(4), csubstr("++++")); CHECK_EQ(accum(), csubstr("")); ret = T::call_cat_dump_resume(ret, buf.first(2), b4, b3, b2, b1); CHECK_UNARY(!ret.success_until(0)); CHECK_UNARY(!ret.success_until(1)); CHECK_UNARY(!ret.success_until(2)); CHECK_UNARY(!ret.success_until(3)); CHECK_EQ(ret.bufsize, 4); CHECK_EQ(ret.lastok, DumpResults::noarg); CHECK_EQ(ret.argfail(), 0); CHECK_EQ(DumpChecker::s_num_calls, 0); CHECK_EQ(buf.first(4), csubstr("++++")); CHECK_EQ(accum(), csubstr("")); ret = T::call_cat_dump_resume(ret, buf.first(3), b4, b3, b2, b1); CHECK_UNARY(!ret.success_until(0)); CHECK_UNARY(!ret.success_until(1)); CHECK_UNARY(!ret.success_until(2)); CHECK_UNARY(!ret.success_until(3)); CHECK_EQ(ret.bufsize, 4); CHECK_EQ(ret.lastok, DumpResults::noarg); CHECK_EQ(ret.argfail(), 0); CHECK_EQ(DumpChecker::s_num_calls, 0); CHECK_EQ(buf.first(4), csubstr("++++")); CHECK_EQ(accum(), csubstr("")); ret = T::call_cat_dump_resume(ret, buf.first(4), b4, b3, b2, b1); CHECK_UNARY(ret.success_until(0)); CHECK_UNARY(ret.success_until(1)); CHECK_UNARY(ret.success_until(2)); CHECK_UNARY(ret.success_until(3)); CHECK_EQ(ret.bufsize, 4); CHECK_EQ(ret.lastok, 3); CHECK_EQ(ret.argfail(), 4); CHECK_EQ(DumpChecker::s_num_calls, 4); CHECK_EQ(buf.first(4), csubstr("1234")); CHECK_EQ(accum(), csubstr("4444333221")); } } TEST_CASE_TEMPLATE("catsep_dump", T, SinkArgTpl, SinkArgPfn) { using namespace buffers; size_t needed_size; substr buf = DumpChecker::s_workspace; auto accum = [&]{ return csubstr(DumpChecker::s_accum).first(DumpChecker::s_accum_pos); }; SUBCASE("1") { DumpChecker::s_reset(); needed_size = T::call_catsep_dump(buf.first(0), sep, b1); CHECK_EQ(needed_size, 1); CHECK_EQ(DumpChecker::s_num_calls, 0); // no calls to dump CHECK_EQ(buf.first(1), csubstr("+")); // nothing was written CHECK_EQ(accum(), csubstr("")); // nothing was written DumpChecker::s_reset(); needed_size = T::call_catsep_dump(buf.first(1), sep, b1); CHECK_EQ(needed_size, 1); CHECK_EQ(DumpChecker::s_num_calls, 1); CHECK_EQ(buf.first(1), csubstr("1")); CHECK_EQ(accum(), csubstr("1")); DumpChecker::s_reset(); needed_size = T::call_catsep_dump(buf.first(1 + seplen), sep, b1); CHECK_EQ(needed_size, 1); CHECK_EQ(DumpChecker::s_num_calls, 1); // sep was not written CHECK_EQ(buf.first(1), csubstr("1")); CHECK_EQ(accum(), csubstr("1")); DumpChecker::s_reset(); needed_size = T::call_catsep_dump(buf, sep, b1); CHECK_EQ(needed_size, 1); CHECK_EQ(DumpChecker::s_num_calls, 1); // sep was not written CHECK_EQ(buf.first(1), csubstr("1")); CHECK_EQ(accum(), csubstr("1")); } SUBCASE("1 2") { DumpChecker::s_reset(); needed_size = T::call_catsep_dump(buf.first(0), sep, b1, b2); CHECK_EQ(needed_size, seplen); CHECK_EQ(DumpChecker::s_num_calls, 0); CHECK_EQ(buf.first(2), csubstr("++")); // nothing was written CHECK_EQ(accum(), csubstr("")); DumpChecker::s_reset(); needed_size = T::call_catsep_dump(buf.first(1), sep, b1, b2); CHECK_EQ(needed_size, seplen); CHECK_EQ(DumpChecker::s_num_calls, 1); CHECK_EQ(buf.first(2), csubstr("1+")); CHECK_EQ(accum(), csubstr("1")); DumpChecker::s_reset(); needed_size = T::call_catsep_dump(buf.first(seplen), sep, b1, b2); CHECK_EQ(needed_size, seplen); CHECK_EQ(DumpChecker::s_num_calls, 3); CHECK_EQ(buf.first(2), csubstr("22")); CHECK_EQ(accum(), csubstr("19000922")); DumpChecker::s_reset(); needed_size = T::call_catsep_dump(buf, sep, b1, b2); CHECK_EQ(needed_size, seplen); CHECK_EQ(DumpChecker::s_num_calls, 3); CHECK_EQ(buf.first(2), csubstr("22")); CHECK_EQ(accum(), csubstr("19000922")); } SUBCASE("2 1") { DumpChecker::s_reset(); needed_size = T::call_catsep_dump(buf.first(0), sep, b2, b1); CHECK_EQ(needed_size, seplen); CHECK_EQ(DumpChecker::s_num_calls, 0); CHECK_EQ(buf.first(2), csubstr("++")); // nothing was written CHECK_EQ(accum(), csubstr("")); DumpChecker::s_reset(); needed_size = T::call_catsep_dump(buf.first(1), sep, b2, b1); CHECK_EQ(needed_size, seplen); CHECK_EQ(DumpChecker::s_num_calls, 0); CHECK_EQ(buf.first(2), csubstr("++")); CHECK_EQ(accum(), csubstr("")); DumpChecker::s_reset(); needed_size = T::call_catsep_dump(buf.first(seplen), sep, b2, b1); CHECK_EQ(needed_size, seplen); CHECK_EQ(DumpChecker::s_num_calls, 3); CHECK_EQ(buf.first(2), csubstr("10")); CHECK_EQ(accum(), csubstr("22900091")); DumpChecker::s_reset(); needed_size = T::call_catsep_dump(buf, sep, b2, b1); CHECK_EQ(needed_size, seplen); CHECK_EQ(DumpChecker::s_num_calls, 3); CHECK_EQ(buf.first(2), csubstr("10")); CHECK_EQ(accum(), csubstr("22900091")); } SUBCASE("1 2 3 4") { DumpChecker::s_reset(); needed_size = T::call_catsep_dump(buf.first(0), sep, b1, b2, b3, b4); CHECK_EQ(needed_size, seplen); CHECK_EQ(DumpChecker::s_num_calls, 0); CHECK_EQ(buf.first(4), csubstr("++++")); CHECK_EQ(accum(), csubstr("")); DumpChecker::s_reset(); needed_size = T::call_catsep_dump(buf.first(1), sep, b1, b2, b3, b4); CHECK_EQ(needed_size, seplen); CHECK_EQ(DumpChecker::s_num_calls, 1); CHECK_EQ(buf.first(4), csubstr("1+++")); CHECK_EQ(accum(), csubstr("1")); DumpChecker::s_reset(); needed_size = T::call_catsep_dump(buf.first(2), sep, b1, b2, b3, b4); CHECK_EQ(needed_size, seplen); CHECK_EQ(DumpChecker::s_num_calls, 1); CHECK_EQ(buf.first(4), csubstr("1+++")); CHECK_EQ(accum(), csubstr("1")); DumpChecker::s_reset(); needed_size = T::call_catsep_dump(buf.first(3), sep, b1, b2, b3, b4); CHECK_EQ(needed_size, seplen); CHECK_EQ(DumpChecker::s_num_calls, 1); CHECK_EQ(buf.first(4), csubstr("1+++")); CHECK_EQ(accum(), csubstr("1")); DumpChecker::s_reset(); needed_size = T::call_catsep_dump(buf, sep, b1, b2, b3, b4); CHECK_EQ(needed_size, seplen); CHECK_EQ(DumpChecker::s_num_calls, 7); CHECK_EQ(buf.first(4), csubstr("4444")); CHECK_EQ(accum(), csubstr("1900092290009333900094444")); } SUBCASE("4 3 2 1") { DumpChecker::s_reset(); needed_size = T::call_catsep_dump(buf.first(0), sep, b4, b3, b2, b1); CHECK_EQ(needed_size, seplen); CHECK_EQ(DumpChecker::s_num_calls, 0); CHECK_EQ(buf.first(4), csubstr("++++")); CHECK_EQ(accum(), csubstr("")); DumpChecker::s_reset(); needed_size = T::call_catsep_dump(buf.first(1), sep, b4, b3, b2, b1); CHECK_EQ(needed_size, seplen); CHECK_EQ(DumpChecker::s_num_calls, 0); CHECK_EQ(buf.first(4), csubstr("++++")); CHECK_EQ(accum(), csubstr("")); DumpChecker::s_reset(); needed_size = T::call_catsep_dump(buf.first(2), sep, b4, b3, b2, b1); CHECK_EQ(needed_size, seplen); CHECK_EQ(DumpChecker::s_num_calls, 0); CHECK_EQ(buf.first(4), csubstr("++++")); CHECK_EQ(accum(), csubstr("")); DumpChecker::s_reset(); needed_size = T::call_catsep_dump(buf.first(3), sep, b4, b3, b2, b1); CHECK_EQ(needed_size, seplen); CHECK_EQ(DumpChecker::s_num_calls, 0); CHECK_EQ(buf.first(4), csubstr("++++")); CHECK_EQ(accum(), csubstr("")); DumpChecker::s_reset(); needed_size = T::call_catsep_dump(buf, sep, b4, b3, b2, b1); CHECK_EQ(needed_size, seplen); CHECK_EQ(DumpChecker::s_num_calls, 7); CHECK_EQ(buf.first(4), csubstr("1000")); CHECK_EQ(accum(), csubstr("4444900093339000922900091")); } } TEST_CASE_TEMPLATE("catsep_dump_resume", T, SinkArgTpl, SinkArgPfn) { using namespace buffers; substr buf = DumpChecker::s_workspace; auto accum = [&]{ return csubstr(DumpChecker::s_accum).first(DumpChecker::s_accum_pos); }; SUBCASE("1") { DumpChecker::s_reset(); DumpResults ret = T::call_catsep_dump_resume(buf.first(0), sep, b1); CHECK_UNARY(!ret.success_until(0)); CHECK_UNARY(!ret.success_until(1)); CHECK_UNARY(!ret.success_until(2)); CHECK_EQ(ret.bufsize, 1); CHECK_EQ(ret.lastok, DumpResults::noarg); CHECK_EQ(ret.argfail(), 0); CHECK_EQ(DumpChecker::s_num_calls, 0); // no calls to dump CHECK_EQ(buf.first(1), csubstr("+")); // nothing was written CHECK_EQ(accum(), csubstr("")); ret = T::call_catsep_dump_resume(ret, buf.first(1), sep, b1); CHECK_UNARY(ret.success_until(0)); CHECK_UNARY(!ret.success_until(1)); CHECK_UNARY(!ret.success_until(2)); CHECK_EQ(ret.bufsize, 1); CHECK_EQ(ret.lastok, 0); CHECK_EQ(ret.argfail(), 1); CHECK_EQ(DumpChecker::s_num_calls, 1); CHECK_EQ(buf.first(1), csubstr("1")); CHECK_EQ(accum(), csubstr("1")); ret = T::call_catsep_dump_resume(ret, buf, sep, b1); CHECK_UNARY(ret.success_until(0)); CHECK_UNARY(!ret.success_until(1)); CHECK_UNARY(!ret.success_until(2)); CHECK_EQ(ret.bufsize, 1); CHECK_EQ(ret.lastok, 0); CHECK_EQ(ret.argfail(), 1); CHECK_EQ(DumpChecker::s_num_calls, 1); CHECK_EQ(buf.first(1), csubstr("1")); CHECK_EQ(accum(), csubstr("1")); } SUBCASE("1 2") { DumpChecker::s_reset(); DumpResults ret = T::call_catsep_dump_resume(buf.first(0), sep, b1, b2); CHECK_UNARY(!ret.success_until(0)); CHECK_UNARY(!ret.success_until(1)); CHECK_UNARY(!ret.success_until(2)); CHECK_EQ(ret.bufsize, seplen); // finds the buf size at once CHECK_EQ(ret.lastok, DumpResults::noarg); CHECK_EQ(ret.argfail(), 0); CHECK_EQ(DumpChecker::s_num_calls, 0); // no calls to dump CHECK_EQ(buf.first(2), csubstr("++")); // nothing was written CHECK_EQ(accum(), csubstr("")); ret = T::call_catsep_dump_resume(ret, buf.first(1), sep, b1, b2); CHECK_UNARY(ret.success_until(0)); // b1 CHECK_UNARY(!ret.success_until(1)); // sep CHECK_UNARY(!ret.success_until(2)); // b2 CHECK_EQ(ret.bufsize, seplen); CHECK_EQ(ret.lastok, 0); CHECK_EQ(ret.argfail(), 1); // sep CHECK_EQ(DumpChecker::s_num_calls, 1); CHECK_EQ(buf.first(2), csubstr("1+")); CHECK_EQ(accum(), csubstr("1")); ret = T::call_catsep_dump_resume(ret, buf.first(2), sep, b1, b2); CHECK_UNARY(ret.success_until(0)); // b1 CHECK_UNARY(!ret.success_until(1)); // sep CHECK_UNARY(!ret.success_until(2)); // b2 CHECK_EQ(ret.bufsize, seplen); CHECK_EQ(ret.lastok, 0); CHECK_EQ(ret.argfail(), 1); // sep CHECK_EQ(DumpChecker::s_num_calls, 1); CHECK_EQ(buf.first(2), csubstr("1+")); CHECK_EQ(accum(), csubstr("1")); ret = T::call_catsep_dump_resume(ret, buf.first(seplen), sep, b1, b2); CHECK_UNARY(ret.success_until(0)); CHECK_UNARY(ret.success_until(1)); CHECK_UNARY(ret.success_until(2)); CHECK_EQ(ret.bufsize, seplen); CHECK_EQ(ret.lastok, 2); CHECK_EQ(ret.argfail(), 3); CHECK_EQ(DumpChecker::s_num_calls, 3); CHECK_EQ(buf.first(2), csubstr("22")); CHECK_EQ(accum(), csubstr("19000922")); } SUBCASE("1 2 3 4") { DumpChecker::s_reset(); DumpResults ret = T::call_catsep_dump_resume(buf.first(0), sep, b1, b2, b3, b4); CHECK_UNARY(!ret.success_until(0)); CHECK_EQ(ret.bufsize, seplen); CHECK_EQ(ret.lastok, DumpResults::noarg); CHECK_EQ(ret.argfail(), 0); CHECK_EQ(DumpChecker::s_num_calls, 0); // no calls to dump CHECK_EQ(buf.first(4), csubstr("++++")); // nothing was written CHECK_EQ(accum(), csubstr("")); ret = T::call_catsep_dump_resume(ret, buf.first(1), sep, b1, b2, b3, b4); CHECK_UNARY(ret.success_until(0)); CHECK_UNARY(!ret.success_until(1)); CHECK_EQ(ret.bufsize, seplen); CHECK_EQ(ret.lastok, 0); CHECK_EQ(ret.argfail(), 1); CHECK_EQ(DumpChecker::s_num_calls, 1); CHECK_EQ(buf.first(4), csubstr("1+++")); // failed while writing sep CHECK_EQ(accum(), csubstr("1")); ret = T::call_catsep_dump_resume(ret, buf.first(2), sep, b1, b2, b3, b4); CHECK_UNARY(ret.success_until(0)); CHECK_UNARY(!ret.success_until(1)); CHECK_EQ(ret.bufsize, seplen); CHECK_EQ(ret.lastok, 0); CHECK_EQ(ret.argfail(), 1); CHECK_EQ(DumpChecker::s_num_calls, 1); CHECK_EQ(buf.first(4), csubstr("1+++")); // failed while writing sep CHECK_EQ(accum(), csubstr("1")); ret = T::call_catsep_dump_resume(ret, buf.first(3), sep, b1, b2, b3, b4); CHECK_UNARY(ret.success_until(0)); CHECK_UNARY(!ret.success_until(1)); CHECK_EQ(ret.bufsize, seplen); CHECK_EQ(ret.lastok, 0); CHECK_EQ(ret.argfail(), 1); CHECK_EQ(DumpChecker::s_num_calls, 1); CHECK_EQ(buf.first(4), csubstr("1+++")); CHECK_EQ(accum(), csubstr("1")); ret = T::call_catsep_dump_resume(ret, buf.first(4), sep, b1, b2, b3, b4); CHECK_UNARY(ret.success_until(0)); CHECK_UNARY(!ret.success_until(1)); CHECK_EQ(ret.bufsize, seplen); CHECK_EQ(ret.lastok, 0); CHECK_EQ(ret.argfail(), 1); CHECK_EQ(DumpChecker::s_num_calls, 1); CHECK_EQ(buf.first(4), csubstr("1+++")); CHECK_EQ(accum(), csubstr("1")); ret = T::call_catsep_dump_resume(ret, buf.first(seplen), sep, b1, b2, b3, b4); CHECK_UNARY(ret.success_until(0)); CHECK_UNARY(ret.success_until(1)); CHECK_UNARY(ret.success_until(2)); CHECK_UNARY(ret.success_until(3)); CHECK_UNARY(ret.success_until(4)); CHECK_UNARY(ret.success_until(5)); CHECK_UNARY(ret.success_until(6)); CHECK_UNARY(!ret.success_until(7)); CHECK_EQ(ret.bufsize, seplen); CHECK_EQ(ret.lastok, 6); CHECK_EQ(ret.argfail(), 7); CHECK_EQ(DumpChecker::s_num_calls, 7); CHECK_EQ(buf.first(seplen), csubstr("44449")); CHECK_EQ(accum(), csubstr("1900092290009333900094444")); } SUBCASE("4 3 2 1") { DumpChecker::s_reset(); DumpResults ret = T::call_catsep_dump_resume(buf.first(0), sep, b4, b3, b2, b1); CHECK_UNARY(!ret.success_until(0)); CHECK_EQ(ret.bufsize, seplen); CHECK_EQ(ret.lastok, DumpResults::noarg); CHECK_EQ(ret.argfail(), 0); CHECK_EQ(DumpChecker::s_num_calls, 0); // no calls to dump CHECK_EQ(buf.first(4), csubstr("++++")); // nothing was written CHECK_EQ(accum(), csubstr("")); ret = T::call_catsep_dump_resume(ret, buf.first(1), sep, b4, b3, b2, b1); CHECK_UNARY(!ret.success_until(0)); CHECK_EQ(ret.bufsize, seplen); CHECK_EQ(ret.lastok, DumpResults::noarg); CHECK_EQ(ret.argfail(), 0); CHECK_EQ(DumpChecker::s_num_calls, 0); CHECK_EQ(buf.first(4), csubstr("++++")); CHECK_EQ(accum(), csubstr("")); ret = T::call_catsep_dump_resume(ret, buf.first(2), sep, b4, b3, b2, b1); CHECK_UNARY(!ret.success_until(0)); CHECK_EQ(ret.bufsize, seplen); CHECK_EQ(ret.lastok, DumpResults::noarg); CHECK_EQ(ret.argfail(), 0); CHECK_EQ(DumpChecker::s_num_calls, 0); CHECK_EQ(buf.first(4), csubstr("++++")); CHECK_EQ(accum(), csubstr("")); ret = T::call_catsep_dump_resume(ret, buf.first(seplen), sep, b4, b3, b2, b1); CHECK_UNARY(ret.success_until(0)); CHECK_UNARY(ret.success_until(1)); CHECK_UNARY(ret.success_until(2)); CHECK_UNARY(ret.success_until(3)); CHECK_UNARY(ret.success_until(4)); CHECK_UNARY(ret.success_until(5)); CHECK_UNARY(ret.success_until(6)); CHECK_UNARY(!ret.success_until(7)); CHECK_EQ(ret.bufsize, seplen); CHECK_EQ(ret.lastok, 6); CHECK_EQ(ret.argfail(), 7); CHECK_EQ(DumpChecker::s_num_calls, 7); CHECK_EQ(buf.first(seplen), csubstr("10009")); CHECK_EQ(accum(), csubstr("4444900093339000922900091")); } SUBCASE("1 2 3 4 with seplen==3") { int s = 999; DumpChecker::s_reset(); DumpResults ret = T::call_catsep_dump_resume(buf.first(0), s, b1, b2, b3, b4); CHECK_UNARY(!ret.success_until(0)); CHECK_EQ(ret.bufsize, 4); CHECK_EQ(ret.lastok, DumpResults::noarg); CHECK_EQ(ret.argfail(), 0); CHECK_EQ(DumpChecker::s_num_calls, 0); // no calls to dump CHECK_EQ(buf.first(4), csubstr("++++")); // nothing was written CHECK_EQ(accum(), csubstr("")); ret = T::call_catsep_dump_resume(ret, buf.first(1), s, b1, b2, b3, b4); CHECK_UNARY(ret.success_until(0)); CHECK_UNARY(!ret.success_until(1)); CHECK_EQ(ret.bufsize, 4); CHECK_EQ(ret.lastok, 0); CHECK_EQ(ret.argfail(), 1); CHECK_EQ(DumpChecker::s_num_calls, 1); CHECK_EQ(buf.first(4), csubstr("1+++")); // failed while writing sep CHECK_EQ(accum(), csubstr("1")); ret = T::call_catsep_dump_resume(ret, buf.first(2), s, b1, b2, b3, b4); CHECK_UNARY(ret.success_until(0)); // b1 CHECK_UNARY(!ret.success_until(1)); // s CHECK_UNARY(!ret.success_until(2)); // b2 CHECK_EQ(ret.bufsize, 4); CHECK_EQ(ret.lastok, 0); CHECK_EQ(ret.argfail(), 1); CHECK_EQ(DumpChecker::s_num_calls, 1); CHECK_EQ(buf.first(4), csubstr("1+++")); // failed while writing sep CHECK_EQ(accum(), csubstr("1")); ret = T::call_catsep_dump_resume(ret, buf.first(3), s, b1, b2, b3, b4); CHECK_UNARY(ret.success_until(0)); CHECK_UNARY(ret.success_until(1)); CHECK_UNARY(ret.success_until(2)); CHECK_UNARY(ret.success_until(3)); CHECK_UNARY(ret.success_until(4)); CHECK_UNARY(ret.success_until(5)); CHECK_EQ(ret.bufsize, 4); CHECK_EQ(ret.lastok, 5); CHECK_EQ(ret.argfail(), 6); CHECK_EQ(DumpChecker::s_num_calls, 6); CHECK_EQ(buf.first(4), csubstr("999+")); // failed while writing b4 CHECK_EQ(accum(), csubstr("199922999333999")); ret = T::call_catsep_dump_resume(ret, buf.first(4), s, b1, b2, b3, b4); CHECK_UNARY(ret.success_until(0)); CHECK_UNARY(ret.success_until(1)); CHECK_UNARY(ret.success_until(2)); CHECK_UNARY(ret.success_until(3)); CHECK_UNARY(ret.success_until(4)); CHECK_UNARY(ret.success_until(5)); CHECK_UNARY(ret.success_until(6)); CHECK_UNARY(!ret.success_until(7)); CHECK_EQ(ret.bufsize, 4); CHECK_EQ(ret.lastok, 6); CHECK_EQ(ret.argfail(), 7); CHECK_EQ(DumpChecker::s_num_calls, 7); CHECK_EQ(buf.first(5), csubstr("4444+")); CHECK_EQ(accum(), csubstr("1999229993339994444")); } } template void test_no_buffer_needed_for_strings(V1 const& v1, V2 const& v2, V3 const& v3, V4 const &v4) { C4_STATIC_ASSERT(dump_directly::value); C4_STATIC_ASSERT(dump_directly::value); C4_STATIC_ASSERT(dump_directly::value); C4_STATIC_ASSERT(dump_directly::value); // csubstr fmt = "{}-{}-{}-{}"; size_t needed_size; substr buf = DumpChecker::s_workspace; auto accum = [&]{ return csubstr(DumpChecker::s_accum).first(DumpChecker::s_accum_pos); }; // DumpChecker::s_reset(); needed_size = T::call_format_dump(buf.first(0), fmt, v1, v2, v3, v4); // no buffer! CHECK_EQ(needed_size, 0); // no intermediate serialization is needed, since these are strings CHECK_EQ(DumpChecker::s_num_calls, 9); CHECK_EQ(buf.first(1), csubstr("+")); CHECK_EQ(accum(), csubstr("1-22-333-4444")); // dumped the full formatted string // DumpChecker::s_reset(); CHECK_EQ(DumpChecker::s_num_calls, 0); needed_size = T::call_format_dump(buf.first(1), fmt, v1, v2, v3, v4); // no buffer! CHECK_EQ(needed_size, 0); // no intermediate serialization is needed, since these are strings CHECK_EQ(buf.first(1), csubstr("+")); CHECK_EQ(DumpChecker::s_num_calls, 9); // calls everything even when the buffer is empty CHECK_EQ(accum(), csubstr("1-22-333-4444")); // dumped the full formatted string // // exhaust the buffer, then compute the needed size DumpChecker::s_reset(); CHECK_EQ(DumpChecker::s_num_calls, 0); needed_size = T::call_format_dump(buf.first(0), fmt, /*int*/1, v2, v3, v4); // no buffer! CHECK_EQ(needed_size, 1); CHECK_EQ(buf.first(1), csubstr("+")); CHECK_EQ(DumpChecker::s_num_calls, 1); // calls everything even when the buffer is empty CHECK_EQ(accum(), csubstr("")); // dumped the full formatted string // DumpChecker::s_reset(); CHECK_EQ(DumpChecker::s_num_calls, 0); needed_size = T::call_format_dump(buf.first(0), fmt, /*int*/1, v2, /*int*/333, v4); // no buffer! CHECK_EQ(needed_size, 3); CHECK_EQ(buf.first(1), csubstr("+")); CHECK_EQ(DumpChecker::s_num_calls, 1); // calls everything even when the buffer is empty CHECK_EQ(accum(), csubstr("")); // dumped the full formatted string } TEST_CASE_TEMPLATE("format_dump", T, SinkArgTpl, SinkArgPfn) { using namespace buffers; size_t needed_size; substr buf = DumpChecker::s_workspace; auto accum = [&]{ return csubstr(DumpChecker::s_accum).first(DumpChecker::s_accum_pos); }; SUBCASE("no buffer is needed for strings: const char[]") { test_no_buffer_needed_for_strings(cs1, cs2, cs3, cs4); } SUBCASE("no buffer is needed for strings: char[]") { test_no_buffer_needed_for_strings(s1, s2, s3, s4); } SUBCASE("no buffer is needed for strings: const char*") { test_no_buffer_needed_for_strings((const char*)cs1, (const char*)cs2, (const char*)cs3, (const char*)cs4); } SUBCASE("no buffer is needed for strings: char*") { test_no_buffer_needed_for_strings((char*)s1, (char*)s2, (char*)s3, (char*)s4); } SUBCASE("no buffer is needed for strings: csubstr") { test_no_buffer_needed_for_strings(csubstr(cs1), csubstr(cs2), csubstr(cs3), csubstr(cs4)); } SUBCASE("no buffer is needed for strings: substr") { test_no_buffer_needed_for_strings(substr(s1), substr(s2), substr(s3), substr(s4)); } SUBCASE("0") { csubstr fmt = "0123456789"; DumpChecker::s_reset(); needed_size = T::call_format_dump(buf.first(0), fmt, b1, b2, b3, b4); CHECK_EQ(needed_size, 0); CHECK_EQ(DumpChecker::s_num_calls, 1); // dump the whole format string at once CHECK_EQ(buf.first(needed_size), csubstr("")); // nothing was written to the tmp buf CHECK_EQ(accum(), fmt); // dumped the full format string DumpChecker::s_reset(); needed_size = T::call_format_dump(buf, fmt, b1, b2, b3, b4); CHECK_EQ(needed_size, 0); // the longest sized argument format argument CHECK_EQ(DumpChecker::s_num_calls, 1); CHECK_EQ(buf.first(needed_size), csubstr("")); // nothing was written CHECK_EQ(accum(), fmt); // dumped the full format string } SUBCASE("1") { // ____1____ 2 __3__ csubstr fmt = "012345678_{}_34567"; DumpChecker::s_reset(); needed_size = T::call_format_dump(buf.first(0), fmt, b1); CHECK_EQ(needed_size, 1); // the longest sized argument format argument CHECK_EQ(DumpChecker::s_num_calls, 1); CHECK_EQ(buf.first(2), csubstr("++")); // nothing was written CHECK_EQ(accum(), csubstr("012345678_")); // dumped first part of the format string DumpChecker::s_reset(); needed_size = T::call_format_dump(buf.first(1), fmt, b1); CHECK_EQ(needed_size, 1); CHECK_EQ(DumpChecker::s_num_calls, 3); CHECK_EQ(buf.first(2), csubstr("1+")); CHECK_EQ(accum(), csubstr("012345678_1_34567")); DumpChecker::s_reset(); needed_size = T::call_format_dump(buf.first(1), fmt, b1, b2, b3, b4); // check that extra arguments are ignored CHECK_EQ(needed_size, 1); CHECK_EQ(DumpChecker::s_num_calls, 3); CHECK_EQ(buf.first(2), csubstr("1+")); CHECK_EQ(accum(), csubstr("012345678_1_34567")); DumpChecker::s_reset(); needed_size = T::call_format_dump(buf.first(1), fmt); // check that missing arguments are skipped CHECK_EQ(needed_size, 0u); CHECK_EQ(DumpChecker::s_num_calls, 1); CHECK_EQ(buf.first(2), csubstr("++")); CHECK_EQ(accum(), csubstr("012345678_{}_34567")); } SUBCASE("1 2") { // ____1____ 2 __3__ 4 _5_ csubstr fmt = "012345678_{}_34567_{}_aaa"; DumpChecker::s_reset(); needed_size = T::call_format_dump(buf.first(0), fmt, b1, b2); CHECK_EQ(needed_size, 2); // the longest sized argument format argument CHECK_EQ(DumpChecker::s_num_calls, 1); CHECK_EQ(buf.first(2), csubstr("++")); // nothing was written CHECK_EQ(accum(), csubstr("012345678_")); // dumped first part of the format string DumpChecker::s_reset(); needed_size = T::call_format_dump(buf.first(1), fmt, b1, b2); CHECK_EQ(needed_size, 2); CHECK_EQ(DumpChecker::s_num_calls, 3); CHECK_EQ(buf.first(2), csubstr("1+")); CHECK_EQ(accum(), csubstr("012345678_1_34567_")); DumpChecker::s_reset(); needed_size = T::call_format_dump(buf.first(2), fmt, b1, b2); CHECK_EQ(needed_size, 2); CHECK_EQ(DumpChecker::s_num_calls, 5); CHECK_EQ(buf.first(2), csubstr("22")); CHECK_EQ(accum(), csubstr("012345678_1_34567_22_aaa")); DumpChecker::s_reset(); needed_size = T::call_format_dump(buf.first(1), fmt); // check that missing arguments are skipped CHECK_EQ(needed_size, 0u); CHECK_EQ(DumpChecker::s_num_calls, 1); CHECK_EQ(buf.first(2), csubstr("++")); CHECK_EQ(accum(), csubstr("012345678_{}_34567_{}_aaa")); } SUBCASE("1 2 3") { // 1 2 3 4 5 6 csubstr fmt = "012345678_{}_34567_{}_aaa___{}"; DumpChecker::s_reset(); needed_size = T::call_format_dump(buf.first(0), fmt, b1, b2, b3); CHECK_EQ(needed_size, 3); // the longest sized argument format argument CHECK_EQ(DumpChecker::s_num_calls, 1); CHECK_EQ(buf.first(2), csubstr("++")); // nothing was written CHECK_EQ(accum(), csubstr("012345678_")); // dumped first part of the format string DumpChecker::s_reset(); needed_size = T::call_format_dump(buf.first(1), fmt, b1, b2, b3); CHECK_EQ(needed_size, 3); CHECK_EQ(DumpChecker::s_num_calls, 3); CHECK_EQ(buf.first(2), csubstr("1+")); CHECK_EQ(accum(), csubstr("012345678_1_34567_")); DumpChecker::s_reset(); needed_size = T::call_format_dump(buf.first(2), fmt, b1, b2, b3); CHECK_EQ(needed_size, 3); CHECK_EQ(DumpChecker::s_num_calls, 5); CHECK_EQ(buf.first(2), csubstr("22")); CHECK_EQ(accum(), csubstr("012345678_1_34567_22_aaa___")); DumpChecker::s_reset(); needed_size = T::call_format_dump(buf.first(3), fmt, b1, b2, b3); CHECK_EQ(needed_size, 3); CHECK_EQ(DumpChecker::s_num_calls, 7); CHECK_EQ(buf.first(2), csubstr("33")); CHECK_EQ(accum(), csubstr("012345678_1_34567_22_aaa___333")); DumpChecker::s_reset(); needed_size = T::call_format_dump(buf, fmt); // check that missing arguments are skipped CHECK_EQ(needed_size, 0u); CHECK_EQ(DumpChecker::s_num_calls, 1); CHECK_EQ(buf.first(2), csubstr("++")); CHECK_EQ(accum(), csubstr("012345678_{}_34567_{}_aaa___{}")); DumpChecker::s_reset(); needed_size = T::call_format_dump(buf, fmt, b1); // check that missing arguments are skipped CHECK_EQ(needed_size, 1); CHECK_EQ(DumpChecker::s_num_calls, 3); CHECK_EQ(buf.first(2), csubstr("1+")); CHECK_EQ(accum(), csubstr("012345678_1_34567_{}_aaa___{}")); } } TEST_CASE_TEMPLATE("format_dump_resume", T, SinkArgTpl, SinkArgPfn) { using namespace buffers; substr buf = DumpChecker::s_workspace; auto accum = [&]{ return csubstr(DumpChecker::s_accum).first(DumpChecker::s_accum_pos); }; INFO("accum_pos=" << DumpChecker::s_accum_pos); INFO("accum=" << accum()); SUBCASE("1") { csubstr fmt = "aaa_then_{}_then_bbb"; DumpChecker::s_reset(); DumpResults ret = T::call_format_dump_resume(buf.first(0), fmt, b1); CHECK_EQ(ret.bufsize, 1); CHECK_EQ(ret.lastok, 0); CHECK_EQ(ret.argfail(), 1); CHECK_UNARY(ret.success_until(0)); CHECK_UNARY(!ret.success_until(1)); CHECK_EQ(DumpChecker::s_num_calls, 1); CHECK_EQ(buf.first(1), csubstr("+")); // buf was not used CHECK_EQ(accum(), csubstr("aaa_then_")); ret = T::call_format_dump_resume(ret, buf.first(1), fmt, b1); CHECK_EQ(ret.bufsize, 1); CHECK_EQ(ret.lastok, 2); CHECK_EQ(ret.argfail(), 3); CHECK_UNARY(ret.success_until(0)); CHECK_UNARY(ret.success_until(1)); CHECK_UNARY(ret.success_until(2)); CHECK_UNARY(!ret.success_until(3)); CHECK_EQ(DumpChecker::s_num_calls, 3); CHECK_EQ(buf.first(2), csubstr("1+")); CHECK_EQ(accum(), csubstr("aaa_then_1_then_bbb")); } SUBCASE("2") { csubstr fmt = "aaa_then_{}_then_bbb_then_{}__then_epilogue"; DumpChecker::s_reset(); DumpResults ret = T::call_format_dump_resume(buf.first(0), fmt, b1, b2); CHECK_EQ(ret.bufsize, 2); CHECK_EQ(ret.argfail(), 1); CHECK_EQ(ret.lastok, 0); CHECK_UNARY(ret.success_until(0)); CHECK_UNARY(!ret.success_until(1)); CHECK_UNARY(!ret.success_until(2)); CHECK_EQ(DumpChecker::s_num_calls, 1); CHECK_EQ(buf.first(1), csubstr("+")); // buf was not used CHECK_EQ(accum(), csubstr("aaa_then_")); ret = T::call_format_dump_resume(ret, buf.first(1), fmt, b1, b2); CHECK_UNARY(ret.success_until(0)); CHECK_UNARY(ret.success_until(1)); CHECK_UNARY(ret.success_until(2)); CHECK_UNARY(!ret.success_until(3)); CHECK_EQ(ret.bufsize, 2); CHECK_EQ(ret.lastok, 2); CHECK_EQ(ret.argfail(), 3); CHECK_EQ(DumpChecker::s_num_calls, 3); CHECK_EQ(buf.first(2), csubstr("1+")); CHECK_EQ(accum(), csubstr("aaa_then_1_then_bbb_then_")); ret = T::call_format_dump_resume(ret, buf.first(2), fmt, b1, b2); CHECK_UNARY(ret.success_until(0)); CHECK_UNARY(ret.success_until(1)); CHECK_UNARY(ret.success_until(2)); CHECK_UNARY(ret.success_until(3)); CHECK_UNARY(ret.success_until(4)); CHECK_EQ(ret.bufsize, 2); CHECK_EQ(ret.lastok, 4); CHECK_EQ(ret.argfail(), 5); CHECK_EQ(DumpChecker::s_num_calls, 5); CHECK_EQ(buf.first(2), csubstr("22")); CHECK_EQ(accum(), csubstr("aaa_then_1_then_bbb_then_22__then_epilogue")); } SUBCASE("2 bookended") { csubstr fmt = "{}_then_{}"; DumpChecker::s_reset(); DumpResults ret = T::call_format_dump_resume(buf.first(0), fmt, b1, b2); CHECK_UNARY(ret.success_until(0)); CHECK_UNARY(!ret.success_until(1)); CHECK_EQ(ret.bufsize, 2); CHECK_EQ(ret.lastok, 0); // from the empty fmt before b1 CHECK_EQ(ret.argfail(), 1); CHECK_EQ(DumpChecker::s_num_calls, 1); CHECK_EQ(buf.first(1), csubstr("+")); // nothing was written CHECK_EQ(accum(), csubstr("")); ret = T::call_format_dump_resume(ret, buf.first(1), fmt, b1, b2); CHECK_UNARY(ret.success_until(0)); CHECK_UNARY(ret.success_until(1)); CHECK_UNARY(ret.success_until(2)); CHECK_UNARY(!ret.success_until(3)); CHECK_EQ(ret.bufsize, 2); CHECK_EQ(ret.lastok, 2); CHECK_EQ(ret.argfail(), 3); CHECK_EQ(DumpChecker::s_num_calls, 3); CHECK_EQ(buf.first(2), csubstr("1+")); CHECK_EQ(accum(), csubstr("1_then_")); ret = T::call_format_dump_resume(ret, buf.first(2), fmt, b1, b2); CHECK_UNARY(ret.success_until(0)); CHECK_UNARY(ret.success_until(1)); CHECK_UNARY(ret.success_until(2)); CHECK_UNARY(ret.success_until(3)); CHECK_UNARY(ret.success_until(4)); CHECK_EQ(ret.bufsize, 2); CHECK_EQ(ret.lastok, 4); CHECK_EQ(ret.argfail(), 5); CHECK_EQ(DumpChecker::s_num_calls, 5); CHECK_EQ(buf.first(2), csubstr("22")); CHECK_EQ(accum(), csubstr("1_then_22")); } SUBCASE("no args") { csubstr fmt = "no args { -- }"; DumpChecker::s_reset(); DumpResults ret = T::call_format_dump_resume(buf.first(0), fmt, b1, b2); CHECK_EQ(ret.bufsize, 0); CHECK_EQ(ret.lastok, 0); CHECK_EQ(ret.argfail(), 1); CHECK_UNARY(ret.success_until(0)); CHECK_UNARY(!ret.success_until(1)); CHECK_EQ(DumpChecker::s_num_calls, 1); CHECK_EQ(buf.first(1), csubstr("+")); // nothing was written CHECK_EQ(accum(), fmt); ret = T::call_format_dump_resume(ret, buf.first(1), fmt, b1, b2); CHECK_EQ(ret.bufsize, 0); CHECK_EQ(ret.lastok, 0); CHECK_EQ(ret.argfail(), 1); CHECK_UNARY(ret.success_until(0)); CHECK_UNARY(!ret.success_until(1)); CHECK_EQ(DumpChecker::s_num_calls, 1); CHECK_EQ(buf.first(2), "++"); CHECK_EQ(accum(), fmt); } } } // namespace c4 #ifdef __clang__ # pragma clang diagnostic pop #elif defined(__GNUC__) # pragma GCC diagnostic pop #endif #include "c4/libtest/supprwarn_pop.hpp" c4core-0.2.6/test/test_enum.cpp000066400000000000000000000074341477602032300164000ustar00rootroot00000000000000#ifndef C4CORE_SINGLE_HEADER #include #include #include #endif #include #include "./test_enum_common.hpp" #include "c4/libtest/supprwarn_push.hpp" #include TEST_CASE("eoffs.simple_enum") { using namespace c4; CHECK_EQ(eoffs_cls(), 0); CHECK_EQ(eoffs_pfx(), 0); } TEST_CASE("eoffs.scoped_enum") { using namespace c4; CHECK_EQ(eoffs_cls(), strlen("MyEnumClass::")); CHECK_EQ(eoffs_pfx(), 0); } TEST_CASE("eoffs.simple_bitmask") { using namespace c4; CHECK_EQ(eoffs_cls(), 0); CHECK_EQ(eoffs_pfx(), strlen("BM_")); } TEST_CASE("eoffs.scoped_bitmask") { using namespace c4; CHECK_EQ(eoffs_cls(), strlen("MyBitmaskClass::")); CHECK_EQ(eoffs_pfx(), strlen("MyBitmaskClass::BM_")); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- #ifdef __clang__ # pragma clang diagnostic push #elif defined(__GNUC__) # pragma GCC diagnostic push # if __GNUC__ >= 6 # pragma GCC diagnostic ignored "-Wnull-dereference" # endif #endif template void cmp_enum(Enum lhs, Enum rhs) { using I = typename std::underlying_type::type; CHECK_EQ(static_cast(lhs), static_cast(rhs)); } template void test_esyms() { auto ss = c4::esyms(); CHECK_NE(ss.size(), 0); CHECK_FALSE(ss.empty()); for(auto s : ss) { REQUIRE_NE(ss.find(s.name), nullptr); REQUIRE_NE(ss.find(s.value), nullptr); CHECK_STREQ(ss.find(s.name)->name, s.name); CHECK_STREQ(ss.find(s.value)->name, s.name); cmp_enum(ss.find(s.name)->value, s.value); cmp_enum(ss.find(s.value)->value, s.value); } } #ifdef __clang__ # pragma clang diagnostic pop #elif defined(__GNUC__) # pragma GCC diagnostic pop #endif TEST_CASE("esyms.simple_enum") { test_esyms(); } TEST_CASE("esyms.scoped_enum") { test_esyms(); } TEST_CASE("esyms.simple_bitmask") { test_esyms(); } TEST_CASE("esyms.scoped_bitmask") { test_esyms(); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- template void test_e2str() { using namespace c4; using I = typename std::underlying_type::type; auto ss = esyms(); CHECK_NE(ss.size(), 0); CHECK_FALSE(ss.empty()); for(auto const& p : ss) { // test round trips cmp_enum(str2e(e2str(p.value)), p.value); CHECK_STREQ(e2str(str2e(p.name)), p.name); } } TEST_CASE("e2str.simple_enum") { test_e2str(); } TEST_CASE("e2str.scoped_enum") { test_e2str(); cmp_enum(c4::str2e("MyEnumClass::FOO"), MyEnumClass::FOO); cmp_enum(c4::str2e("FOO"), MyEnumClass::FOO); } TEST_CASE("e2str.simple_bitmask") { test_e2str(); cmp_enum(c4::str2e("BM_FOO"), BM_FOO); cmp_enum(c4::str2e("FOO"), BM_FOO); } TEST_CASE("e2str.scoped_bitmask") { using I = typename std::underlying_type::type; test_e2str(); cmp_enum(c4::str2e("MyBitmaskClass::BM_FOO"), MyBitmaskClass::BM_FOO); cmp_enum(c4::str2e("BM_FOO"), MyBitmaskClass::BM_FOO); cmp_enum(c4::str2e("FOO"), MyBitmaskClass::BM_FOO); } #include "c4/libtest/supprwarn_pop.hpp" c4core-0.2.6/test/test_enum_common.hpp000066400000000000000000000115741477602032300177550ustar00rootroot00000000000000#ifndef _C4_ENUM_COMMON_HPP_ #define _C4_ENUM_COMMON_HPP_ #ifndef C4CORE_SINGLE_HEADER #include #endif typedef enum { FOO = 0, BAR, BAZ, } MyEnum; namespace c4 { template<> inline const EnumSymbols esyms() { static const EnumSymbols::Sym rs[] = { {FOO, "FOO"}, {BAR, "BAR"}, {BAZ, "BAZ"}, }; EnumSymbols r(rs); return r; } } // namespace c4 //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- enum class MyEnumClass { FOO = 0, BAR, BAZ, }; namespace c4 { template<> inline const EnumSymbols esyms() { static const EnumSymbols::Sym rs[] = { {MyEnumClass::FOO, "MyEnumClass::FOO"}, {MyEnumClass::BAR, "MyEnumClass::BAR"}, {MyEnumClass::BAZ, "MyEnumClass::BAZ"}, }; EnumSymbols r(rs); return r; } template<> inline size_t eoffs_cls() { return 13; // same as strlen("MyEnumClass::") } } // namespace c4 //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- typedef enum { BM_NONE = 0, BM_FOO = 1 << 0, BM_BAR = 1 << 1, BM_BAZ = 1 << 2, BM_FOO_BAR = BM_FOO|BM_BAR, BM_FOO_BAR_BAZ = BM_FOO|BM_BAR|BM_BAZ, } MyBitmask; namespace c4 { template<> inline const EnumSymbols esyms() { static const EnumSymbols::Sym rs[] = { {BM_NONE, "BM_NONE"}, {BM_FOO, "BM_FOO"}, {BM_BAR, "BM_BAR"}, {BM_BAZ, "BM_BAZ"}, {BM_FOO_BAR, "BM_FOO_BAR"}, {BM_FOO_BAR_BAZ, "BM_FOO_BAR_BAZ"}, }; EnumSymbols r(rs); return r; } template<> inline size_t eoffs_pfx() { return 3; // same as strlen("BM_") } } // namespace c4 typedef enum { // no null value BM_KABOOM = 1, BM_PAFF = 2, BM_PEW = 4, BM_POW = 7, } BmWithoutNull; namespace c4 { template<> inline const c4::EnumSymbols esyms() { static const EnumSymbols::Sym rs[] = { {BM_KABOOM, "KABOOM"}, {BM_PAFF , "PAFF"}, {BM_PEW , "PEW"}, {BM_POW , "POW"}, }; EnumSymbols r(rs); return r; } template<> inline size_t eoffs_pfx() { return 3; // same as strlen("BM_") } } // namespace c4 //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- enum class MyBitmaskClass { BM_NONE = 0, BM_FOO = 1 << 0, BM_BAR = 1 << 1, BM_BAZ = 1 << 2, BM_FOO_BAR = BM_FOO|BM_BAR, BM_FOO_BAR_BAZ = BM_FOO|BM_BAR|BM_BAZ, }; namespace c4 { template<> inline const EnumSymbols esyms() { static const EnumSymbols::Sym rs[] = { {MyBitmaskClass::BM_NONE, "MyBitmaskClass::BM_NONE"}, {MyBitmaskClass::BM_FOO, "MyBitmaskClass::BM_FOO"}, {MyBitmaskClass::BM_BAR, "MyBitmaskClass::BM_BAR"}, {MyBitmaskClass::BM_BAZ, "MyBitmaskClass::BM_BAZ"}, {MyBitmaskClass::BM_FOO_BAR, "MyBitmaskClass::BM_FOO_BAR"}, {MyBitmaskClass::BM_FOO_BAR_BAZ, "MyBitmaskClass::BM_FOO_BAR_BAZ"}, }; EnumSymbols r(rs); return r; } template<> inline size_t eoffs_cls< MyBitmaskClass >() { return 16; // same as strlen("MyBitmaskClass::") } template<> inline size_t eoffs_pfx< MyBitmaskClass >() { return 19; // same as strlen("MyBitmaskClass::BM_") } } // namespace c4 enum class BmClassWithoutNull { // no null value BM_KABOOM = 1, BM_PAFF = 2, BM_PEW = 4, BM_POW = 7, }; namespace c4 { template<> inline const c4::EnumSymbols esyms() { static const EnumSymbols::Sym rs[] = { {BmClassWithoutNull::BM_KABOOM, "BmClassWithoutNull::BM_KABOOM"}, {BmClassWithoutNull::BM_PAFF , "BmClassWithoutNull::BM_PAFF"}, {BmClassWithoutNull::BM_PEW , "BmClassWithoutNull::BM_PEW"}, {BmClassWithoutNull::BM_POW , "BmClassWithoutNull::BM_POW"}, }; EnumSymbols r(rs); return r; } template<> inline size_t eoffs_cls() { return strlen("BmClassWithoutNull::"); } template<> inline size_t eoffs_pfx() { return strlen("BmClassWithoutNull::BM_"); } } // namespace c4 #endif /* _C4_ENUM_COMMON_HPP_ */ c4core-0.2.6/test/test_error.cpp000066400000000000000000000437171477602032300165710ustar00rootroot00000000000000#ifndef C4CORE_SINGLE_HEADER #include "c4/error.hpp" #endif #include "c4/test.hpp" #include "c4/libtest/supprwarn_push.hpp" #ifndef C4_EXCEPTIONS #include #endif C4_SUPPRESS_WARNING_MSVC_WITH_PUSH(4611) // interaction between '_setjmp' and C++ object destruction is non-portable namespace c4 { TEST_CASE("Error.scoped_callback") { auto orig = get_error_callback(); C4_EXPECT_ERROR_OCCURS([&]{ CHECK_EQ(get_error_callback() != orig, true); C4_ERROR("bla bla"); }); } } // namespace c4 TEST_CASE("Error.outside_of_c4_namespace") { auto orig = c4::get_error_callback(); C4_EXPECT_ERROR_OCCURS([&]{ CHECK_EQ(c4::get_error_callback() != orig, true); C4_ERROR("bla bla"); }); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // WIP: new error handling code #include // temporary; just for the exception example #include // temporary; just for the exception example C4_IF_EXCEPTIONS_( , static std::jmp_buf s_jmp_buf; static std::string s_jmp_errmsg; ); namespace c4 { #define C4_ERR_FMT_BUFFER_SIZE 256 using locref = c4::srcloc const& C4_RESTRICT; using pfn_err = void (*)(locref loc, void *data); using pfn_warn = void (*)(locref loc, void *data); using pfn_msg_begin = void (*)(locref loc, void *data); using pfn_msg_part = void (*)(const char* msg, size_t size, void *data); using pfn_msg_end = void (*)(void *data); struct ErrorCallbacks { void *user_data; pfn_err err; pfn_warn warn; pfn_msg_begin msg_begin; pfn_msg_part msg_part; pfn_msg_end msg_end; bool msg_enabled() const { return msg_begin != nullptr; } template void msg(const char (&s)[N]) { msg_part(s, N-1, user_data); } void msg(const char *msg, size_t sz) { msg_part(msg, sz, user_data); } void msg(char c) { msg_part(&c, 1, user_data); } }; #if defined(__GNUC__) && __GNUC__ >= 4 && __GNUC_MINOR__ >= 8 && __GNUC__ < 5 #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wmissing-field-initializers" #endif TEST_CASE("ErrorCallbacks.default_obj") { ErrorCallbacks cb {}; CHECK_EQ(cb.user_data, nullptr); CHECK_EQ(cb.err, nullptr); CHECK_EQ(cb.warn, nullptr); CHECK_EQ(cb.msg_begin, nullptr); CHECK_EQ(cb.msg_part, nullptr); CHECK_EQ(cb.msg_end, nullptr); } #if defined(__GNUC__) && __GNUC__ >= 4 && __GNUC_MINOR__ >= 8 && __GNUC__ < 5 #pragma GCC diagnostic pop #endif template struct ErrorCallbacksBridgeFull { ErrorCallbacks callbacks() const { C4_SUPPRESS_WARNING_GCC_CLANG_WITH_PUSH("-Wcast-qual") return { (ErrBhv*)this, ErrorCallbacksBridgeFull::on_err, ErrorCallbacksBridgeFull::on_warn, ErrorCallbacksBridgeFull::on_msg_begin, ErrorCallbacksBridgeFull::on_msg_part, ErrorCallbacksBridgeFull::on_msg_end, }; C4_SUPPRESS_WARNING_GCC_CLANG_POP } static void on_err(locref loc, void *data) { ((ErrBhv*)data)->err(loc); } static void on_warn(locref loc, void *data) { ((ErrBhv*)data)->warn(loc); } static void on_msg_begin(locref loc, void *data) { ((ErrBhv*)data)->msg_begin(loc); } static void on_msg_part(const char *part, size_t size, void *data) { ((ErrBhv*)data)->msg_part(part, size); } static void on_msg_end(void *data) { ((ErrBhv*)data)->msg_end(); } }; template struct ErrorCallbacksBridge { ErrorCallbacks callbacks() const { C4_SUPPRESS_WARNING_GCC_CLANG_WITH_PUSH("-Wcast-qual") return { (ErrBhv*)this, ErrorCallbacksBridge::on_err, ErrorCallbacksBridge::on_warn, (pfn_msg_begin)nullptr, (pfn_msg_part)nullptr, (pfn_msg_end)nullptr }; C4_SUPPRESS_WARNING_GCC_CLANG_POP } static void on_err(locref loc, void *data) { ((ErrBhv*)data)->err(loc); } static void on_warn(locref loc, void *data) { ((ErrBhv*)data)->warn(loc); } }; void fputi(int val, FILE *f); void _errmsg(locref loc) { fputs(loc.file, stderr); fputc(':', stderr); fputi(loc.line, stderr); fputs(": ", stderr); fflush(stderr); } void _errmsg(const char *part, size_t part_size) { fwrite(part, 1u, part_size, stderr); fflush(stderr); } /** example implementation using old-style abort */ struct ErrorBehaviorAbort : public ErrorCallbacksBridgeFull { static void msg_begin(locref loc) { fputc('\n', stderr); _errmsg(loc); } static void msg_part(const char *part, size_t part_size) { _errmsg(part, part_size); } static void msg_end() { fputc('\n', stderr); fflush(stderr); } static void err(locref) { abort(); } static void warn(locref) { // nothing to do } }; TEST_CASE("ErrorBehaviorAbort.default_obj") { ErrorBehaviorAbort bhv; auto cb = bhv.callbacks(); CHECK_NE(cb.user_data, nullptr); CHECK_NE(cb.err, nullptr); CHECK_NE(cb.warn, nullptr); CHECK_NE(cb.msg_begin, nullptr); CHECK_NE(cb.msg_part, nullptr); CHECK_NE(cb.msg_end, nullptr); } void fputi(int val, FILE *f); void _append(std::string *s, int line); /** example implementation using vanilla c++ std::runtime_error (or setjmp when exceptions are disabled) */ struct ErrorBehaviorRuntimeError : public ErrorCallbacksBridgeFull { std::string exc_msg{}; void msg_begin(locref loc) { exc_msg.reserve(strlen(loc.file) + 16); exc_msg = '\n'; exc_msg += loc.file; exc_msg += ':'; _append(&exc_msg, loc.line); exc_msg += ": "; } void msg_part(const char *part, size_t part_size) { exc_msg.append(part, part_size); } void msg_end() { std::cerr << exc_msg << "\n"; } void err(locref) { C4_IF_EXCEPTIONS_(throw std::runtime_error(exc_msg), { s_jmp_errmsg = exc_msg; std::longjmp(s_jmp_buf, 1); }); } void warn(locref) { // nothing to do } }; TEST_CASE("ErrorBehaviorRuntimeError.default_obj") { ErrorBehaviorRuntimeError bhv; auto cb = bhv.callbacks(); CHECK_NE(cb.user_data, nullptr); CHECK_NE(cb.err, nullptr); CHECK_NE(cb.warn, nullptr); CHECK_NE(cb.msg_begin, nullptr); CHECK_NE(cb.msg_part, nullptr); CHECK_NE(cb.msg_end, nullptr); } ErrorBehaviorAbort s_err_abort = ErrorBehaviorAbort(); ErrorCallbacks s_err_callbacks = s_err_abort.callbacks(); void new_handle_error(locref loc, size_t msg_size, const char *msg) { if(s_err_callbacks.msg_enabled()) { s_err_callbacks.msg_begin(loc, s_err_callbacks.user_data); s_err_callbacks.msg("ERROR: "); s_err_callbacks.msg(msg, msg_size); s_err_callbacks.msg_end(s_err_callbacks.user_data); } s_err_callbacks.err(loc, s_err_callbacks.user_data); } void new_handle_warning(locref loc, size_t msg_size, const char *msg) { if(s_err_callbacks.msg_enabled()) { s_err_callbacks.msg_begin(loc, s_err_callbacks.user_data); s_err_callbacks.msg("WARNING: "); s_err_callbacks.msg(msg, msg_size); s_err_callbacks.msg_end(s_err_callbacks.user_data); } s_err_callbacks.warn(loc, s_err_callbacks.user_data); } template C4_ALWAYS_INLINE void new_handle_error(locref loc, const char (&msg)[N]) { new_handle_error(loc, N-1, msg); } template C4_ALWAYS_INLINE void new_handle_warning(locref loc, const char (&msg)[N]) { new_handle_warning(loc, N-1, msg); } #define C4_ERROR_NEW(msg) c4::new_handle_error(C4_SRCLOC(), msg) #define C4_WARNING_NEW(msg) c4::new_handle_warning(C4_SRCLOC(), msg) #define C4_ERROR_NEW_SZ(msg, msglen) c4::new_handle_error(C4_SRCLOC(), msglen, msg) #define C4_WARNING_NEW_SZ(msg, msglen) c4::new_handle_warning(C4_SRCLOC(), msglen, msg) } // namespace c4 #ifndef C4CORE_SINGLE_HEADER #include #include #endif namespace c4 { void fputi(int val, FILE *f) { char buf[16]; size_t ret = c4::itoa(buf, val); ret = ret < sizeof(buf) ? ret : sizeof(buf); fwrite(buf, 1u, ret, f); } // to avoid using std::to_string() void _append(std::string *s, int line) { auto sz = s->size(); s->resize(sz + 16); auto ret = itoa(substr(&((*s)[0]) + sz, 16u), line); s->resize(sz + ret); if(ret >= sz) { itoa(substr(&((*s)[0]) + sz, 16u), line); } } } // namespace c4 template struct ScopedErrorBehavior { c4::ErrorCallbacks m_prev; ErrorBehavior m_tmp; const char *m_name; ScopedErrorBehavior(const char* name) : m_prev(c4::s_err_callbacks), m_tmp(), m_name(name) { c4::s_err_callbacks = m_tmp.callbacks(); } ~ScopedErrorBehavior() { c4::s_err_callbacks = m_prev; } }; #define C4_TMP_ERR_BHV(bhv_ty) ScopedErrorBehavior(#bhv_ty) template void test_error_exception(const char (&msg)[N]) { INFO(msg); { auto tmp1 = C4_TMP_ERR_BHV(ErrorBehaviorAbort); { auto tmp2 = C4_TMP_ERR_BHV(ErrorBehaviorRuntimeError); { bool got_exc = false; C4_IF_EXCEPTIONS_(try, if(setjmp(s_jmp_buf) == 0)) { C4_ERROR_NEW(msg); } C4_IF_EXCEPTIONS_(catch(std::exception const& e), else) { // check that the given message is found verbatim on the error message c4::csubstr errmsg = c4::to_csubstr(C4_IF_EXCEPTIONS_(e.what(), s_jmp_errmsg.c_str())); INFO("full message: '''" << errmsg << "'''"); size_t pos = errmsg.find(msg); CHECK_NE(pos, c4::csubstr::npos); got_exc = (pos != c4::csubstr::npos); } CHECK(got_exc); } { bool got_exc = false; C4_IF_EXCEPTIONS_(try, if(setjmp(s_jmp_buf) == 0)) { C4_ERROR_NEW_SZ(msg, N-1); } C4_IF_EXCEPTIONS_(catch(std::exception const& e), else) { // check that the given message is found verbatim on the error message c4::csubstr errmsg = c4::to_csubstr(C4_IF_EXCEPTIONS_(e.what(), s_jmp_errmsg.c_str())); INFO("full message: '''" << errmsg << "'''"); size_t pos = errmsg.find(msg); CHECK_NE(pos, c4::csubstr::npos); got_exc = (pos != c4::csubstr::npos); } CHECK(got_exc); } } } } template void test_warning_exception(const char (&msg)[N]) { auto tmp = C4_TMP_ERR_BHV(ErrorBehaviorRuntimeError); C4_WARNING_NEW(msg); auto const& wmsg = tmp.m_tmp.exc_msg; REQUIRE_FALSE(wmsg.empty()); REQUIRE_GT(wmsg.size(), N); auto what = c4::to_csubstr(wmsg.c_str()).last(N-1); CHECK_EQ(what, msg); C4_WARNING_NEW_SZ(msg, N-1); REQUIRE_FALSE(wmsg.empty()); REQUIRE_GT(wmsg.size(), N); what = c4::to_csubstr(wmsg.c_str()).last(N-1); CHECK_EQ(what, msg); } TEST_CASE("error.exception") { test_error_exception("some error with some message"); test_error_exception("some error with another message"); } TEST_CASE("warning.exception") { test_warning_exception("some warning"); test_warning_exception("some other warning"); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- #ifndef C4CORE_SINGLE_HEADER #include #include #endif namespace c4 { template void _err_send(T const& arg) { char buf[C4_ERR_FMT_BUFFER_SIZE]; size_t num = to_chars(buf, arg); num = num < C4_ERR_FMT_BUFFER_SIZE ? num : C4_ERR_FMT_BUFFER_SIZE; s_err_callbacks.msg_part(buf, num, s_err_callbacks.user_data); } size_t _find_fmt(const char *C4_RESTRICT fmt, size_t len) { for(size_t i = 0; i < len; ++i) { if(fmt[i] != '{') { continue; } if(i + 1 == len) { break; } if(fmt[i+1] == '}') { return i; } } return (size_t)-1; } void _err_fmt(size_t fmt_size, const char *C4_RESTRICT fmt) { s_err_callbacks.msg_part(fmt, fmt_size, s_err_callbacks.user_data); } template void _err_fmt(size_t fmt_size, const char *C4_RESTRICT fmt, Arg const& C4_RESTRICT arg, Args const& C4_RESTRICT ...args) { size_t pos = _find_fmt(fmt, fmt_size); if(pos == (size_t)-1) { s_err_callbacks.msg_part(fmt, fmt_size, s_err_callbacks.user_data); return; } s_err_callbacks.msg_part(fmt, pos, s_err_callbacks.user_data); _err_send(arg); pos += 2; _err_fmt(fmt_size - pos, fmt + pos, args...); } template void err_fmt(locref loc, size_t fmt_size, const char *fmt, Args const& C4_RESTRICT ...args) { s_err_callbacks.msg_begin(loc, s_err_callbacks.user_data); s_err_callbacks.msg("ERROR: "); _err_fmt(fmt_size, fmt, args...); s_err_callbacks.msg_end(s_err_callbacks.user_data); s_err_callbacks.err(loc, s_err_callbacks.user_data); } template void warn_fmt(locref loc, size_t fmt_size, const char *fmt, Args const& C4_RESTRICT ...args) { s_err_callbacks.msg_begin(loc, s_err_callbacks.user_data); s_err_callbacks.msg("WARNING: "); _err_fmt(fmt_size, fmt, args...); s_err_callbacks.msg_end(s_err_callbacks.user_data); s_err_callbacks.warn(loc, s_err_callbacks.user_data); } template void err_fmt(locref loc, const char (&fmt)[N], Args const& C4_RESTRICT ...args) { err_fmt(loc, N-1, fmt, args...); } template void warn_fmt(locref loc, const char (&fmt)[N], Args const& C4_RESTRICT ...args) { warn_fmt(loc, N-1, fmt, args...); } } // namespace c4 template void test_error_fmt_exception(const char (&expected)[M], const char (&fmt)[N], Args const& ...args) { INFO("expected is: '" << expected << "'"); { auto tmp1 = C4_TMP_ERR_BHV(ErrorBehaviorAbort); { auto tmp2 = C4_TMP_ERR_BHV(ErrorBehaviorRuntimeError); { bool got_exc = false; C4_IF_EXCEPTIONS_(try, if(setjmp(s_jmp_buf) == 0)) { c4::err_fmt(C4_SRCLOC(), fmt, args...); } C4_IF_EXCEPTIONS_(catch(std::exception const& e), else) { // check that the given message is found verbatim on the error message c4::csubstr errmsg = c4::to_csubstr(C4_IF_EXCEPTIONS_(e.what(), s_jmp_errmsg.c_str())); INFO("full message: '''" << errmsg << "'''"); size_t pos = errmsg.find(expected); CHECK_NE(pos, c4::csubstr::npos); got_exc = (pos != c4::csubstr::npos); } CHECK(got_exc); } { bool got_exc = false; C4_IF_EXCEPTIONS_(try, if(setjmp(s_jmp_buf) == 0)) { c4 ::err_fmt(C4_SRCLOC(), N - 1, fmt, args...); } C4_IF_EXCEPTIONS_(catch(std::exception const& e), else) { // check that the given message is found verbatim on the error message c4::csubstr errmsg = c4::to_csubstr(C4_IF_EXCEPTIONS_(e.what(), s_jmp_errmsg.c_str())); INFO("full message: '''" << errmsg << "'''"); size_t pos = errmsg.find(expected); CHECK_NE(pos, c4::csubstr::npos); got_exc = (pos != c4::csubstr::npos); } CHECK(got_exc); } } } } template void test_warning_fmt_exception(const char (&expected)[M], const char (&fmt)[N], Args const& ...args) { INFO(expected); auto tmp = C4_TMP_ERR_BHV(ErrorBehaviorRuntimeError); auto const& wmsg = tmp.m_tmp.exc_msg; c4 ::warn_fmt(C4_SRCLOC(), fmt, args...); REQUIRE_FALSE(wmsg.empty()); REQUIRE_GT(wmsg.size(), M); auto what = c4::to_csubstr(wmsg.c_str()).last(M-1); CHECK_EQ(what, expected); c4 ::warn_fmt(C4_SRCLOC(), N - 1, fmt, args...); REQUIRE_FALSE(wmsg.empty()); REQUIRE_GT(wmsg.size(), M); what = c4::to_csubstr(wmsg.c_str()).last(M-1); CHECK_EQ(what, expected); } TEST_CASE("error.fmt") { test_error_fmt_exception("abc is 2 is it not?", "{} is {} is it not?", "abc", 2); test_error_fmt_exception("abc is bbb is it not?", "{} is {} is it not?", "abc", "bbb"); test_error_fmt_exception("abc is {} is it not?", "{} is {} is it not?", "abc"); test_error_fmt_exception("abc is {} is it not?", "{} is {} is it not?", "abc"); } TEST_CASE("warning.fmt") { test_warning_fmt_exception("abc is 2 is it not?", "{} is {} is it not?", "abc", 2); test_warning_fmt_exception("abc is bbb is it not?", "{} is {} is it not?", "abc", "bbb"); test_warning_fmt_exception("abc is {} is it not?", "{} is {} is it not?", "abc"); test_warning_fmt_exception("abc is {} is it not?", "{} is {} is it not?", "abc"); } C4_SUPPRESS_WARNING_MSVC_POP #include "c4/libtest/supprwarn_pop.hpp" c4core-0.2.6/test/test_error_exception.cpp000066400000000000000000000122221477602032300206320ustar00rootroot00000000000000#ifndef C4CORE_SINGLE_HEADER #include "c4/error.hpp" #endif #include "c4/test.hpp" #include #ifdef C4_EXCEPTIONS #include #else #include #endif C4_SUPPRESS_WARNING_MSVC_WITH_PUSH(4611) // interaction between '_setjmp' and C++ object destruction is non-portable C4_SUPPRESS_WARNING_MSVC_WITH_PUSH(4702) // unreachable code C4_BEGIN_HIDDEN_NAMESPACE bool got_an_error = false; bool got_an_exception = false; C4_IF_EXCEPTIONS_( , std::jmp_buf s_jmp_env; int s_jmp_val; std::string s_jmp_msg;) C4_END_HIDDEN_NAMESPACE void error_callback_throwing_exception(const char *msg_, size_t msg_sz) { got_an_error = true; c4::csubstr s(msg_, msg_sz); if (s == "err1") C4_IF_EXCEPTIONS(throw 1; , s_jmp_val = 1; std::longjmp(s_jmp_env, s_jmp_val);); else if(s == "err2") C4_IF_EXCEPTIONS(throw 2; , s_jmp_val = 2; std::longjmp(s_jmp_env, s_jmp_val);); else if(s == "err3") C4_IF_EXCEPTIONS(throw 3; , s_jmp_val = 3; std::longjmp(s_jmp_env, s_jmp_val);); else if(s == "err4") C4_IF_EXCEPTIONS(throw 4; , s_jmp_val = 4; std::longjmp(s_jmp_env, s_jmp_val);); else C4_IF_EXCEPTIONS( throw std::runtime_error({msg_, msg_+msg_sz}); , s_jmp_val = 100; s_jmp_msg.assign(msg_, msg_sz); std::longjmp(s_jmp_env, s_jmp_val); ); } inline c4::ScopedErrorSettings tmp_err() { got_an_error = false; return c4::ScopedErrorSettings(c4::ON_ERROR_CALLBACK, error_callback_throwing_exception); } C4_IF_EXCEPTIONS_( , std::jmp_buf s_jmp_env_fwd;) void test_exception(const int which) { if(which == 0) return; INFO("which=" << which); C4_CHECK(!got_an_exception); C4_CHECK(c4::get_error_callback() == error_callback_throwing_exception); { auto tmp = tmp_err(); CHECK_EQ(got_an_error, false); CHECK_EQ(c4::get_error_callback() == error_callback_throwing_exception, true); C4_IF_EXCEPTIONS_(try, if(setjmp(s_jmp_env) == 0)) { if (which == 1) { C4_ERROR("err1"); } else if(which == 2) { C4_ERROR("err2"); } else if(which == 3) { C4_ERROR("err3"); } else if(which == 4) { C4_ERROR("err4"); } else { C4_ERROR("unknown error"); } } C4_IF_EXCEPTIONS_(catch(int i), else if(s_jmp_val < 5)) { got_an_exception = true; CHECK_EQ(got_an_error, true); CHECK_EQ(C4_IF_EXCEPTIONS_(i, s_jmp_val), which); C4_IF_EXCEPTIONS_(throw, std::longjmp(s_jmp_env_fwd, s_jmp_val)); } C4_IF_EXCEPTIONS_(catch(std::runtime_error const& e), else) { got_an_exception = true; CHECK_EQ(got_an_error, true); const c4::csubstr expected = "unknown error"; const c4::csubstr actual = C4_IF_EXCEPTIONS_(c4::to_csubstr(e.what()), c4::csubstr(s_jmp_msg.data(), s_jmp_msg.size())); CHECK_EQ(actual.size(), expected.size()); CHECK_EQ(actual, expected); C4_IF_EXCEPTIONS_(throw, std::longjmp(s_jmp_env_fwd, s_jmp_val)); } // if we get here it means no exception was thrown // so the test failed FAIL("an exception was thrown"); } CHECK_EQ(c4::get_error_callback() == error_callback_throwing_exception, false); } // Although c4core does not use exceptions by default, you can have // your error callback throw an exception which you can then catch on // your code. // // This test covers that possibility. TEST_CASE("error.exception_from_callback") { // works! auto tmp = tmp_err(); #ifdef C4_EXCEPTIONS #define CHECK_FAILURE_IS(code, failure_exc, failure_setjmp) \ { \ got_an_exception = false; \ CHECK_THROWS_AS(code, failure_exc); \ CHECK(got_an_exception); \ } #else #define CHECK_FAILURE_IS(code, failure_exc, failure_setjmp) \ { \ INFO("expected case: " << failure_setjmp); \ got_an_exception = false; \ if(setjmp(s_jmp_env_fwd) == 0) \ { \ code; \ } \ CHECK_EQ(s_jmp_val, failure_setjmp); \ CHECK(got_an_exception); \ } #endif CHECK_FAILURE_IS(test_exception(-1), std::runtime_error, 100); CHECK_FAILURE_IS(test_exception(1), int, 1); CHECK_FAILURE_IS(test_exception(2), int, 2); CHECK_FAILURE_IS(test_exception(3), int, 3); CHECK_FAILURE_IS(test_exception(4), int, 4); CHECK_FAILURE_IS(test_exception(5), std::runtime_error, 100); CHECK_FAILURE_IS(test_exception(6), std::runtime_error, 100); } C4_SUPPRESS_WARNING_MSVC_POP c4core-0.2.6/test/test_format.cpp000066400000000000000000001302001477602032300167100ustar00rootroot00000000000000#ifndef C4CORE_SINGLE_HEADER #include "c4/substr.hpp" #include "c4/std/std.hpp" #include "c4/format.hpp" #endif #include #include "c4/libtest/supprwarn_push.hpp" #ifdef __clang__ # pragma clang diagnostic push #elif defined(__GNUC__) # pragma GCC diagnostic push # pragma GCC diagnostic ignored "-Wuseless-cast" #endif namespace c4 { //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- TEST_CASE_TEMPLATE("to_chars.fmt.bin", T, uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t, uint64_t, int64_t) { char bufc[128]; substr buf(bufc); CHECK_EQ(to_chars_sub(buf, fmt::integral(T(21), T(2))), "0b10101"); CHECK_EQ(to_chars_sub(buf, fmt::integral((T*)21, T(2))), "0b10101"); CHECK_EQ(to_chars_sub(buf, fmt::integral((T const*)21, T(2))), "0b10101"); CHECK_EQ(to_chars_sub(buf, fmt::integral(nullptr, T(2))), "0b0"); CHECK_EQ(to_chars_sub(buf, fmt::bin(T(21))), "0b10101"); CHECK_EQ(to_chars_sub(buf, fmt::bin((T*)21)), "0b10101"); CHECK_EQ(to_chars_sub(buf, fmt::bin((T const*)21)), "0b10101"); CHECK_EQ(to_chars_sub(buf, fmt::bin(nullptr)), "0b0"); } TEST_CASE_TEMPLATE("to_chars.fmt.zpad.bin", T, uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t, uint64_t, int64_t) { char bufc[128]; substr buf(bufc); using namespace fmt; CHECK_EQ(to_chars_sub(buf, zpad(integral(T(21), T(2)), 8u)), "0b00010101"); CHECK_EQ(to_chars_sub(buf, zpad(integral((T*)21, T(2)), 8u)), "0b00010101"); CHECK_EQ(to_chars_sub(buf, zpad(integral((T const*)21, T(2)), 8u)), "0b00010101"); CHECK_EQ(to_chars_sub(buf, zpad(bin(T(21)), 8u)), "0b00010101"); CHECK_EQ(to_chars_sub(buf, zpad(bin((T*)21), 8u)), "0b00010101"); CHECK_EQ(to_chars_sub(buf, zpad(bin((T const*)21), 8u)), "0b00010101"); } TEST_CASE_TEMPLATE("to_chars.fmt.oct", T, uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t, uint64_t, int64_t) { char bufc[128]; substr buf(bufc); CHECK_EQ(to_chars_sub(buf, fmt::integral(T(65), T(8))), "0o101"); CHECK_EQ(to_chars_sub(buf, fmt::integral((T*)65, T(8))), "0o101"); CHECK_EQ(to_chars_sub(buf, fmt::integral((T const*)65, T(8))), "0o101"); CHECK_EQ(to_chars_sub(buf, fmt::integral(nullptr, T(8))), "0o0"); CHECK_EQ(to_chars_sub(buf, fmt::oct(T(65))), "0o101"); CHECK_EQ(to_chars_sub(buf, fmt::oct((T*)65)), "0o101"); CHECK_EQ(to_chars_sub(buf, fmt::oct((T const*)65)), "0o101"); CHECK_EQ(to_chars_sub(buf, fmt::oct(nullptr)), "0o0"); } TEST_CASE_TEMPLATE("to_chars.fmt.zpad.oct", T, uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t, uint64_t, int64_t) { char bufc[128]; substr buf(bufc); using namespace fmt; CHECK_EQ(to_chars_sub(buf, zpad(integral(T(65), T(8)), 5u)), "0o00101"); CHECK_EQ(to_chars_sub(buf, zpad(integral((T*)65, T(8)), 5u)), "0o00101"); CHECK_EQ(to_chars_sub(buf, zpad(integral((T const*)65, T(8)), 5u)), "0o00101"); CHECK_EQ(to_chars_sub(buf, zpad(oct(T(65)), 5u)), "0o00101"); CHECK_EQ(to_chars_sub(buf, zpad(oct((T*)65), 5u)), "0o00101"); CHECK_EQ(to_chars_sub(buf, zpad(oct((T const*)65), 5u)), "0o00101"); } TEST_CASE_TEMPLATE("to_chars.fmt.hex", T, uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t, uint64_t, int64_t) { char bufc[128]; substr buf(bufc); CHECK_EQ(to_chars_sub(buf, fmt::integral(T(0x7f), T(16))), "0x7f"); CHECK_EQ(to_chars_sub(buf, fmt::integral((T*)0x7f, T(16))), "0x7f"); CHECK_EQ(to_chars_sub(buf, fmt::integral((T const*)0x7f, T(16))), "0x7f"); CHECK_EQ(to_chars_sub(buf, fmt::integral(nullptr, T(16))), "0x0"); CHECK_EQ(to_chars_sub(buf, fmt::hex(T(0x7f))), "0x7f"); CHECK_EQ(to_chars_sub(buf, fmt::hex((T*)0x7f)), "0x7f"); CHECK_EQ(to_chars_sub(buf, fmt::hex((T const*)0x7f)), "0x7f"); CHECK_EQ(to_chars_sub(buf, fmt::hex(nullptr)), "0x0"); } TEST_CASE_TEMPLATE("to_chars.fmt.zpad.hex", T, uint8_t, int8_t) { char bufc[128]; substr buf(bufc); using namespace fmt; buf.fill('?'); CHECK_EQ(to_chars_sub(buf, zpad(integral(T(0x7f), T(16)), 5u)), "0x0007f"); CHECK_EQ(to_chars_sub(buf, zpad(integral((T*)0x7f, T(16)), 5u)), "0x0007f"); CHECK_EQ(to_chars_sub(buf, zpad(integral((T const*)0x7f, T(16)), 5u)), "0x0007f"); CHECK_EQ(to_chars_sub(buf, zpad(hex(T(0x7f)), 5u)), "0x0007f"); CHECK_EQ(to_chars_sub(buf, zpad(hex((T*)0x7f), 5u)), "0x0007f"); CHECK_EQ(to_chars_sub(buf, zpad(hex((T const*)0x7f), 5u)), "0x0007f"); } TEST_CASE_TEMPLATE("to_chars.fmt.zpad", T, uint8_t, int8_t) { char bufc[128]; substr buf(bufc); using namespace fmt; CHECK_EQ(to_chars_sub(buf, zpad(T(10), 0)), "10"); CHECK_EQ(to_chars_sub(buf, zpad(T(10), 1)), "10"); CHECK_EQ(to_chars_sub(buf, zpad(T(10), 2)), "10"); CHECK_EQ(to_chars_sub(buf, zpad(T(10), 3)), "010"); CHECK_EQ(to_chars_sub(buf, zpad(T(10), 4)), "0010"); CHECK_EQ(to_chars_sub(buf, zpad((T const*)17, 0)), "0x11"); CHECK_EQ(to_chars_sub(buf, zpad((T const*)17, 1)), "0x11"); CHECK_EQ(to_chars_sub(buf, zpad((T const*)17, 2)), "0x11"); CHECK_EQ(to_chars_sub(buf, zpad((T const*)17, 3)), "0x011"); CHECK_EQ(to_chars_sub(buf, zpad((T const*)17, 4)), "0x0011"); CHECK_EQ(to_chars_sub(buf, zpad((T *)17, 0)), "0x11"); CHECK_EQ(to_chars_sub(buf, zpad((T *)17, 1)), "0x11"); CHECK_EQ(to_chars_sub(buf, zpad((T *)17, 2)), "0x11"); CHECK_EQ(to_chars_sub(buf, zpad((T *)17, 3)), "0x011"); CHECK_EQ(to_chars_sub(buf, zpad((T *)17, 4)), "0x0011"); CHECK_EQ(to_chars_sub(buf, zpad(nullptr, 0)), "0x0"); CHECK_EQ(to_chars_sub(buf, zpad(nullptr, 1)), "0x0"); CHECK_EQ(to_chars_sub(buf, zpad(nullptr, 2)), "0x00"); CHECK_EQ(to_chars_sub(buf, zpad(nullptr, 3)), "0x000"); CHECK_EQ(to_chars_sub(buf, zpad(nullptr, 4)), "0x0000"); CHECK_EQ(to_chars_sub(buf, zpad(integral(nullptr, T(10)), 0u)), "0"); CHECK_EQ(to_chars_sub(buf, zpad(integral(nullptr, T(16)), 0u)), "0x0"); CHECK_EQ(to_chars_sub(buf, zpad(integral(nullptr, T(2)), 0u)), "0b0"); CHECK_EQ(to_chars_sub(buf, zpad(integral(nullptr, T(8)), 0u)), "0o0"); CHECK_EQ(to_chars_sub(buf, zpad(hex(nullptr), 0u)), "0x0"); CHECK_EQ(to_chars_sub(buf, zpad(bin(nullptr), 0u)), "0b0"); CHECK_EQ(to_chars_sub(buf, zpad(oct(nullptr), 0u)), "0o0"); CHECK_EQ(to_chars_sub(buf, zpad(integral(nullptr, T(10)), 5u)), "00000"); CHECK_EQ(to_chars_sub(buf, zpad(integral(nullptr, T(16)), 5u)), "0x00000"); CHECK_EQ(to_chars_sub(buf, zpad(integral(nullptr, T(2)), 5u)), "0b00000"); CHECK_EQ(to_chars_sub(buf, zpad(integral(nullptr, T(8)), 5u)), "0o00000"); CHECK_EQ(to_chars_sub(buf, zpad(hex(nullptr), 5u)), "0x00000"); CHECK_EQ(to_chars_sub(buf, zpad(bin(nullptr), 5u)), "0b00000"); CHECK_EQ(to_chars_sub(buf, zpad(oct(nullptr), 5u)), "0o00000"); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- template void test_to_chars_real(T f, int precision, const char* flt, T fltv, const char *scient, T scientv) { char bufc[64]; substr buf(bufc); substr r; T copy; INFO("num=" << f); r = to_chars_sub(buf, fmt::real(f, precision)); CHECK_EQ(r, to_csubstr(flt)); from_chars(r, ©); if(sizeof(T) == sizeof(float)) { CHECK_FLOAT_EQ((float)fltv, (float)copy); } else { CHECK_FLOAT_EQ(fltv, copy); } r = to_chars_sub(buf, fmt::real(f, precision, FTOA_SCIENT)); CHECK_EQ(r, to_csubstr(scient)); from_chars(r, ©); if(sizeof(T) == sizeof(float)) { CHECK_FLOAT_EQ((float)scientv, (float)copy); } else { CHECK_FLOAT_EQ(scientv, copy); } } TEST_CASE_TEMPLATE("to_chars.fmt.real", T, float, double) { char bufc[128]; substr buf(bufc); T f = static_cast(256.064); test_to_chars_real(f, 0, "256", T(256.), "3e+02", T(300.)); test_to_chars_real(f, 1, "256.1", T(256.1), "2.6e+02", T(260.)); test_to_chars_real(f, 2, "256.06", T(256.06), "2.56e+02", T(256.)); test_to_chars_real(f, 3, "256.064", T(256.064), "2.561e+02", T(256.1)); test_to_chars_real(f, 4, "256.0640", T(256.0640), "2.5606e+02", T(256.06)); test_to_chars_real(f, 5, "256.06400", T(256.06400), "2.56064e+02", T(256.064)); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- TEST_CASE("to_chars.fmt.boolalpha") { char bufc[128]; substr buf(bufc); CHECK_EQ(to_chars_sub(buf, true), "1"); CHECK_EQ(to_chars_sub(buf, false), "0"); CHECK_EQ(to_chars_sub(buf, fmt::boolalpha(true)), "true"); CHECK_EQ(to_chars_sub(buf, 1), "1"); CHECK_EQ(to_chars_sub(buf, fmt::boolalpha(1)), "true"); CHECK_EQ(to_chars_sub(buf, fmt::boolalpha(10)), "true"); CHECK_EQ(to_chars_sub(buf, fmt::boolalpha(false)), "false"); CHECK_EQ(to_chars_sub(buf, fmt::boolalpha(0)), "false"); CHECK_EQ(to_chars_sub(buf, fmt::boolalpha(0u)), "false"); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- TEST_CASE("align.left.overflow") { CHECK_EQ(to_chars(substr(), fmt::left(' ', 91u)), 91u); CHECK_EQ(to_chars(substr(), fmt::left("0123456789.123456789.123456789.123456789", 91u)), 91u); CHECK_EQ(to_chars(substr(), fmt::left("0123456789.123456789.123456789.123456789", 30u)), 40u); } TEST_CASE("align.right.overflow") { CHECK_EQ(to_chars(substr(), fmt::right(' ', 91u)), 91u); CHECK_EQ(to_chars(substr(), fmt::right("0123456789.123456789.123456789.123456789", 91u)), 91u); CHECK_EQ(to_chars(substr(), fmt::right("0123456789.123456789.123456789.123456789", 30u)), 40u); } TEST_CASE("align.left") { char buf[128] = {}; CHECK_EQ(to_chars_sub(buf, fmt::left("1", 1)), "1"); CHECK_EQ(to_chars_sub(buf, fmt::left("1", 2)), "1 "); CHECK_EQ(to_chars_sub(buf, fmt::left("1", 3)), "1 "); CHECK_EQ(to_chars_sub(buf, fmt::left("1", 4)), "1 "); CHECK_EQ(to_chars_sub(buf, fmt::left("1", 5)), "1 "); CHECK_EQ(to_chars_sub(buf, fmt::left("1", 6)), "1 "); CHECK_EQ(to_chars_sub(buf, fmt::left("1", 7)), "1 "); CHECK_EQ(to_chars_sub(buf, fmt::left("1", 8)), "1 "); CHECK_EQ(to_chars_sub(buf, fmt::left("1", 9)), "1 "); CHECK_EQ(to_chars_sub(buf, fmt::left("1", 1, '+')), "1"); CHECK_EQ(to_chars_sub(buf, fmt::left("1", 2, '+')), "1+"); CHECK_EQ(to_chars_sub(buf, fmt::left("1", 3, '+')), "1++"); CHECK_EQ(to_chars_sub(buf, fmt::left("1", 4, '+')), "1+++"); CHECK_EQ(to_chars_sub(buf, fmt::left("1", 5, '+')), "1++++"); CHECK_EQ(to_chars_sub(buf, fmt::left("1", 6, '+')), "1+++++"); CHECK_EQ(to_chars_sub(buf, fmt::left("1", 7, '+')), "1++++++"); CHECK_EQ(to_chars_sub(buf, fmt::left("1", 8, '+')), "1+++++++"); CHECK_EQ(to_chars_sub(buf, fmt::left("1", 9, '+')), "1++++++++"); CHECK_EQ(to_chars_sub(buf, fmt::left("01234", 0)), "01234"); CHECK_EQ(to_chars_sub(buf, fmt::left("01234", 1)), "01234"); CHECK_EQ(to_chars_sub(buf, fmt::left("01234", 2)), "01234"); CHECK_EQ(to_chars_sub(buf, fmt::left("01234", 3)), "01234"); CHECK_EQ(to_chars_sub(buf, fmt::left("01234", 4)), "01234"); CHECK_EQ(to_chars_sub(buf, fmt::left("01234", 5)), "01234"); CHECK_EQ(to_chars_sub(buf, fmt::left("01234", 6)), "01234 "); CHECK_EQ(to_chars_sub(buf, fmt::left("01234", 7)), "01234 "); CHECK_EQ(to_chars_sub(buf, fmt::left("01234", 8)), "01234 "); CHECK_EQ(to_chars_sub(buf, fmt::left("01234", 9)), "01234 "); CHECK_EQ(to_chars_sub(buf, fmt::left(1234, 0)), "1234"); CHECK_EQ(to_chars_sub(buf, fmt::left(1234, 1)), "1234"); CHECK_EQ(to_chars_sub(buf, fmt::left(1234, 2)), "1234"); CHECK_EQ(to_chars_sub(buf, fmt::left(1234, 3)), "1234"); CHECK_EQ(to_chars_sub(buf, fmt::left(1234, 4)), "1234"); CHECK_EQ(to_chars_sub(buf, fmt::left(1234, 5)), "1234 "); CHECK_EQ(to_chars_sub(buf, fmt::left(1234, 6)), "1234 "); CHECK_EQ(to_chars_sub(buf, fmt::left(1234, 7)), "1234 "); CHECK_EQ(to_chars_sub(buf, fmt::left(1234, 8)), "1234 "); CHECK_EQ(to_chars_sub(buf, fmt::left(1234, 9)), "1234 "); } TEST_CASE("align.right") { char buf[128] = {}; CHECK_EQ(to_chars_sub(buf, fmt::right("1", 1)), "1"); CHECK_EQ(to_chars_sub(buf, fmt::right("1", 2)), " 1"); CHECK_EQ(to_chars_sub(buf, fmt::right("1", 3)), " 1"); CHECK_EQ(to_chars_sub(buf, fmt::right("1", 4)), " 1"); CHECK_EQ(to_chars_sub(buf, fmt::right("1", 5)), " 1"); CHECK_EQ(to_chars_sub(buf, fmt::right("1", 6)), " 1"); CHECK_EQ(to_chars_sub(buf, fmt::right("1", 7)), " 1"); CHECK_EQ(to_chars_sub(buf, fmt::right("1", 8)), " 1"); CHECK_EQ(to_chars_sub(buf, fmt::right("1", 9)), " 1"); CHECK_EQ(to_chars_sub(buf, fmt::right("1", 1, '+')), "1"); CHECK_EQ(to_chars_sub(buf, fmt::right("1", 2, '+')), "+1"); CHECK_EQ(to_chars_sub(buf, fmt::right("1", 3, '+')), "++1"); CHECK_EQ(to_chars_sub(buf, fmt::right("1", 4, '+')), "+++1"); CHECK_EQ(to_chars_sub(buf, fmt::right("1", 5, '+')), "++++1"); CHECK_EQ(to_chars_sub(buf, fmt::right("1", 6, '+')), "+++++1"); CHECK_EQ(to_chars_sub(buf, fmt::right("1", 7, '+')), "++++++1"); CHECK_EQ(to_chars_sub(buf, fmt::right("1", 8, '+')), "+++++++1"); CHECK_EQ(to_chars_sub(buf, fmt::right("1", 9, '+')), "++++++++1"); CHECK_EQ(to_chars_sub(buf, fmt::right("01234", 0)), "01234"); CHECK_EQ(to_chars_sub(buf, fmt::right("01234", 1)), "01234"); CHECK_EQ(to_chars_sub(buf, fmt::right("01234", 2)), "01234"); CHECK_EQ(to_chars_sub(buf, fmt::right("01234", 3)), "01234"); CHECK_EQ(to_chars_sub(buf, fmt::right("01234", 4)), "01234"); CHECK_EQ(to_chars_sub(buf, fmt::right("01234", 5)), "01234"); CHECK_EQ(to_chars_sub(buf, fmt::right("01234", 6)), " 01234"); CHECK_EQ(to_chars_sub(buf, fmt::right("01234", 7)), " 01234"); CHECK_EQ(to_chars_sub(buf, fmt::right("01234", 8)), " 01234"); CHECK_EQ(to_chars_sub(buf, fmt::right("01234", 9)), " 01234"); CHECK_EQ(to_chars_sub(buf, fmt::right(1234, 0)), "1234"); CHECK_EQ(to_chars_sub(buf, fmt::right(1234, 1)), "1234"); CHECK_EQ(to_chars_sub(buf, fmt::right(1234, 2)), "1234"); CHECK_EQ(to_chars_sub(buf, fmt::right(1234, 3)), "1234"); CHECK_EQ(to_chars_sub(buf, fmt::right(1234, 4)), "1234"); CHECK_EQ(to_chars_sub(buf, fmt::right(1234, 5)), " 1234"); CHECK_EQ(to_chars_sub(buf, fmt::right(1234, 6)), " 1234"); CHECK_EQ(to_chars_sub(buf, fmt::right(1234, 7)), " 1234"); CHECK_EQ(to_chars_sub(buf, fmt::right(1234, 8)), " 1234"); CHECK_EQ(to_chars_sub(buf, fmt::right(1234, 9)), " 1234"); CHECK_EQ(to_chars_sub(buf, fmt::real(0.124, 1)), "0.1"); // we assume this in what follows CHECK_EQ(to_chars_sub(buf, fmt::real(0.124, 2)), "0.12"); CHECK_EQ(to_chars_sub(buf, fmt::real(0.124, 3)), "0.124"); CHECK_EQ(to_chars_sub(buf, fmt::right(fmt::real(0.124, 1), 0)), "0.1"); CHECK_EQ(to_chars_sub(buf, fmt::right(fmt::real(0.124, 1), 1)), "0.1"); CHECK_EQ(to_chars_sub(buf, fmt::right(fmt::real(0.124, 1), 2)), "0.1"); CHECK_EQ(to_chars_sub(buf, fmt::right(fmt::real(0.124, 1), 3)), "0.1"); CHECK_EQ(to_chars_sub(buf, fmt::right(fmt::real(0.124, 1), 4)), " 0.1"); CHECK_EQ(to_chars_sub(buf, fmt::right(fmt::real(0.124, 1), 5)), " 0.1"); CHECK_EQ(to_chars_sub(buf, fmt::right(fmt::real(0.124, 1), 6)), " 0.1"); CHECK_EQ(to_chars_sub(buf, fmt::right(fmt::real(0.124, 1), 7)), " 0.1"); CHECK_EQ(to_chars_sub(buf, fmt::right(fmt::real(0.124, 2), 0)), "0.12"); CHECK_EQ(to_chars_sub(buf, fmt::right(fmt::real(0.124, 2), 1)), "0.12"); CHECK_EQ(to_chars_sub(buf, fmt::right(fmt::real(0.124, 2), 2)), "0.12"); CHECK_EQ(to_chars_sub(buf, fmt::right(fmt::real(0.124, 2), 3)), "0.12"); CHECK_EQ(to_chars_sub(buf, fmt::right(fmt::real(0.124, 2), 4)), "0.12"); CHECK_EQ(to_chars_sub(buf, fmt::right(fmt::real(0.124, 2), 5)), " 0.12"); CHECK_EQ(to_chars_sub(buf, fmt::right(fmt::real(0.124, 2), 6)), " 0.12"); CHECK_EQ(to_chars_sub(buf, fmt::right(fmt::real(0.124, 2), 7)), " 0.12"); CHECK_EQ(to_chars_sub(buf, fmt::right(fmt::real(0.124, 3), 0)), "0.124"); CHECK_EQ(to_chars_sub(buf, fmt::right(fmt::real(0.124, 3), 1)), "0.124"); CHECK_EQ(to_chars_sub(buf, fmt::right(fmt::real(0.124, 3), 2)), "0.124"); CHECK_EQ(to_chars_sub(buf, fmt::right(fmt::real(0.124, 3), 3)), "0.124"); CHECK_EQ(to_chars_sub(buf, fmt::right(fmt::real(0.124, 3), 4)), "0.124"); CHECK_EQ(to_chars_sub(buf, fmt::right(fmt::real(0.124, 3), 5)), "0.124"); CHECK_EQ(to_chars_sub(buf, fmt::right(fmt::real(0.124, 3), 6)), " 0.124"); CHECK_EQ(to_chars_sub(buf, fmt::right(fmt::real(0.124, 3), 7)), " 0.124"); CHECK_EQ(to_chars_sub(buf, fmt::right(fmt::real(1234.5222, 1), 7)), " 1234.5"); auto r = [](double val, size_t width) { return fmt::right(fmt::real(val, 1), width); }; CHECK_EQ(to_chars_sub(buf, r(1234.5, 7)), " 1234.5"); c4::format(buf, "freq={}Hz\0", r(1234.5, 7)); CHECK_EQ(to_csubstr((const char*)buf).len, to_csubstr("freq= 1234.5Hz").len); CHECK_EQ(to_csubstr((const char*)buf), "freq= 1234.5Hz"); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- TEST_CASE("cat.vars") { char buf[256]; substr sp(buf); csubstr result; size_t sz; sz = cat({}, 1, 2, 3, 4); CHECK_EQ(sz, 4); sp.fill('+'); sz = cat(sp.first(2), 1, 2, 3, 4); CHECK_EQ(sz, 4); CHECK_EQ(sp.right_of(sz).first(sz - 2), "++"); sz = cat(buf, 1, 2, 3, 4); CHECK_EQ(sz, 4); result = sp.first(sz); CHECK_EQ(result, "1234"); sz = cat({}, 1, 2, 3); CHECK_EQ(sz, 3); sp.fill('+'); sz = cat(sp.first(2), 1, 2, 3); CHECK_EQ(sz, 3); CHECK_EQ(sp.right_of(sz).first(sz - 2), "+"); sz = cat(buf, 1, 2, 3); CHECK_EQ(sz, 3); result = sp.first(sz); CHECK_EQ(result, "123"); sz = cat({}, 1, 2); CHECK_EQ(sz, 2); sp.fill('+'); sz = cat(sp.first(1), 1, 2); CHECK_EQ(sz, 2); CHECK_EQ(sp.right_of(sz).first(sz - 1), "+"); sz = cat(buf, 1, 2); CHECK_EQ(sz, 2); result = sp.first(sz); CHECK_EQ(result, "12"); sz = cat({}, 1); CHECK_EQ(sz, 1); sz = cat(buf, 1); CHECK_EQ(sz, 1); result = sp.first(sz); CHECK_EQ(result, "1"); sz = cat({}); CHECK_EQ(sz, 0); sz = cat(buf); CHECK_EQ(sz, 0); result = sp.first(sz); CHECK_EQ(result, ""); sz = cat({}, 1, ' ', 2, ' ', 3, ' ', 4); CHECK_EQ(sz, 7); sz = cat(buf, 1, ' ', 2, ' ', 3, ' ', 4); CHECK_EQ(sz, 7); result = sp.first(sz); CHECK_EQ(result, "1 2 3 4"); } #ifdef C4_TUPLE_TO_STR TEST_CASE("cat.tuple") { char buf[256]; substr sp(buf); csubstr result; size_t sz; sz = cat(buf, std::forward_as_tuple(1, ' ', 2, ' ', 3, ' ', 4)); result = sp.left_of(sz); CHECK_EQ(result, "1 2 3 4"); } #endif // C4_TUPLE_TO_STR TEST_CASE("uncat.vars") { size_t sz; size_t npos = csubstr::npos; int v1 = 0, v2 = 0, v3 = 0, v4 = 0; sz = uncat("1 2 3 4", v1, v2, v3, v4); CHECK_NE(sz, npos); CHECK_EQ(sz, 7); CHECK_EQ(v1, 1); CHECK_EQ(v2, 2); CHECK_EQ(v3, 3); CHECK_EQ(v4, 4); } #ifdef C4_TUPLE_TO_STR TEST_CASE("uncat.tuple") { size_t sz; int v1 = 0, v2 = 0, v3 = 0, v4 = 0; auto tp = std::forward_as_tuple(v1, v2, v3, v4); sz = uncat("1 2 3 4", tp); CHECK_NE(sz, csubstr::npos); CHECK_EQ(sz, 7); CHECK_EQ(v1, 1); CHECK_EQ(v2, 2); CHECK_EQ(v3, 3); CHECK_EQ(v4, 4); } #endif // C4_TUPLE_TO_STR TEST_CASE("catsep.vars") { char buf[256]; substr sp(buf); csubstr result; size_t sz; sz = catsep({}, ' '); CHECK_EQ(sz, 0); sz = catsep(buf, ' '); CHECK_EQ(sz, 0); sz = catsep({}, ' ', 1); CHECK_EQ(sz, 1); sz = catsep(buf, ' ', 1); CHECK_EQ(sz, 1); CHECK_EQ(sp.first(1), "1"); sz = catsep({}, ' ', 1, 2); CHECK_EQ(sz, 3); sz = catsep(buf, ' ', 1, 2); CHECK_EQ(sz, 3); result = sp.left_of(sz); CHECK_EQ(result, "1 2"); sp.fill('+'); sz = catsep(sp.first(1), ' ', 1, 2); CHECK_EQ(sz, 3); result = sp.left_of(sz); CHECK_EQ(result, "1++"); sp.fill('+'); sz = catsep(sp.first(2), ' ', 1, 2); CHECK_EQ(sz, 3); result = sp.left_of(sz); CHECK_EQ(result, "1 +"); sz = catsep({}, '/', 1, 2); CHECK_EQ(sz, 3); sz = catsep(buf, '/', 1, 2); CHECK_EQ(sz, 3); result = sp.left_of(sz); CHECK_EQ(result, "1/2"); sz = catsep({}, ' ', 1, 2, 3, 4); CHECK_EQ(sz, 7); sz = catsep(buf, ' ', 1, 2, 3, 4); CHECK_EQ(sz, 7); result = sp.left_of(sz); CHECK_EQ(result, "1 2 3 4"); sp.fill('+'); sz = catsep(sp.first(3), ' ', 1, 2, 3, 4); CHECK_EQ(sz, 7); result = sp.left_of(sz); CHECK_EQ(result, "1 2++++"); sp.fill('+'); sz = catsep(sp.first(4), ' ', 1, 2, 3, 4); CHECK_EQ(sz, 7); result = sp.left_of(sz); CHECK_EQ(result, "1 2 +++"); sp.fill('+'); sz = catsep(sp.first(5), ' ', 1, 2, 3, 4); CHECK_EQ(sz, 7); result = sp.left_of(sz); CHECK_EQ(result, "1 2 3++"); sp.fill('+'); sz = catsep(sp.first(6), ' ', 1, 2, 3, 4); CHECK_EQ(sz, 7); result = sp.left_of(sz); CHECK_EQ(result, "1 2 3 +"); sz = catsep(buf, '/', 1, 2, 3, 4); CHECK_EQ(sz, 7); result = sp.left_of(sz); CHECK_EQ(result, "1/2/3/4"); } #ifdef C4_TUPLE_TO_STR TEST_CASE("catsep.tuple") { char buf[256]; substr sp(buf); csubstr result; size_t sz; sz = catsep(buf, ' ', std::forward_as_tuple(1, 2)); CHECK_EQ(sz, 3); result = sp.left_of(sz); CHECK_EQ(result, "1 2"); sz = catsep(buf, '/', std::forward_as_tuple(1, 2)); CHECK_EQ(sz, 3); result = sp.left_of(sz); CHECK_EQ(result, "1/2"); sz = catsep(buf, ' ', std::forward_as_tuple(1, 2, 3, 4)); CHECK_EQ(sz, 7); result = sp.left_of(sz); CHECK_EQ(result, "1 2 3 4"); sz = catsep(buf, '/', std::forward_as_tuple(1, 2, 3, 4)); CHECK_EQ(sz, 7); result = sp.left_of(sz); CHECK_EQ(result, "1/2/3/4"); } #endif // C4_TUPLE_TO_STR TEST_CASE("uncatsep.vars") { size_t sz; int v1 = 0, v2 = 0, v3 = 0, v4 = 0; char sep; sz = uncatsep("1 2 3 4", sep, v1, v2, v3, v4); CHECK_EQ(sz, 7); CHECK_EQ(v1, 1); CHECK_EQ(v2, 2); CHECK_EQ(v3, 3); CHECK_EQ(v4, 4); } #ifdef C4_TUPLE_TO_STR TEST_CASE("uncatsep.tuple") { size_t sz; int v1 = 0, v2 = 0, v3 = 0, v4 = 0; char sep; auto tp = std::forward_as_tuple(v1, v2, v3, v4); sz = uncatsep("1 2 3 4", sep, tp); CHECK_EQ(sz, 7); CHECK_EQ(v1, 1); CHECK_EQ(v2, 2); CHECK_EQ(v3, 3); CHECK_EQ(v4, 4); } #endif // C4_TUPLE_TO_STR TEST_CASE("format.vars") { char buf[256]; substr sp(buf); csubstr result; size_t sz; sz = format({}, "{} and {} and {} and {}"); CHECK_EQ(sz, strlen("{} and {} and {} and {}")); sz = format(buf, "{} and {} and {} and {}"); CHECK_EQ(sz, strlen("{} and {} and {} and {}")); result = sp.left_of(sz); CHECK_EQ(result, "{} and {} and {} and {}"); sz = format({}, "{} and {} and {} and {}", 1); CHECK_EQ(sz, strlen("1 and {} and {} and {}")); sz = format(buf, "{} and {} and {} and {}", 1); CHECK_EQ(sz, strlen("1 and {} and {} and {}")); result = sp.left_of(sz); CHECK_EQ(result, "1 and {} and {} and {}"); sz = format({}, "{} and {} and {} and {}", 1, 2); CHECK_EQ(sz, strlen("1 and 2 and {} and {}")); sz = format(buf, "{} and {} and {} and {}", 1, 2); CHECK_EQ(sz, strlen("1 and 2 and {} and {}")); result = sp.left_of(sz); CHECK_EQ(result, "1 and 2 and {} and {}"); sz = format({}, "{} and {} and {} and {}", 1, 2, 3); CHECK_EQ(sz, strlen("1 and 2 and 3 and {}")); sz = format(buf, "{} and {} and {} and {}", 1, 2, 3); CHECK_EQ(sz, strlen("1 and 2 and 3 and {}")); result = sp.left_of(sz); CHECK_EQ(result, "1 and 2 and 3 and {}"); sz = format({}, "{} and {} and {} and {}", 1, 2, 3, 4); CHECK_EQ(sz, strlen("1 and 2 and 3 and 4")); sz = format(buf, "{} and {} and {} and {}", 1, 2, 3, 4); CHECK_EQ(sz, strlen("1 and 2 and 3 and 4")); result = sp.left_of(sz); CHECK_EQ(result, "1 and 2 and 3 and 4"); sp.fill('+'); sz = format(sp.first(1), "{} and {} and {} and {}", 1, 2, 3, 4); CHECK_EQ(sz, strlen("1 and 2 and 3 and 4")); result = sp.left_of(sz); CHECK_EQ(result, "1++++++++++++++++++"); sp.fill('+'); sz = format(sp.first(4), "{} and {} and {} and {}", 1, 2, 3, 4); CHECK_EQ(sz, strlen("1 and 2 and 3 and 4")); result = sp.left_of(sz); CHECK_EQ(result, "1 an+++++++++++++++"); sp.fill('+'); sz = format(sp.first(6), "{} and {} and {} and {}", 1, 2, 3, 4); CHECK_EQ(sz, strlen("1 and 2 and 3 and 4")); result = sp.left_of(sz); CHECK_EQ(result, "1 and +++++++++++++"); sp.fill('+'); sz = format(sp.first(7), "{} and {} and {} and {}", 1, 2, 3, 4); CHECK_EQ(sz, strlen("1 and 2 and 3 and 4")); result = sp.left_of(sz); CHECK_EQ(result, "1 and 2++++++++++++"); sp.fill('+'); sz = format(sp.first(8), "{} and {} and {} and {}", 1, 2, 3, 4); CHECK_EQ(sz, strlen("1 and 2 and 3 and 4")); result = sp.left_of(sz); CHECK_EQ(result, "1 and 2 +++++++++++"); sp.fill('+'); sz = format(sp.first(10), "{} and {} and {} and {}", 1, 2, 3, 4); CHECK_EQ(sz, strlen("1 and 2 and 3 and 4")); result = sp.left_of(sz); CHECK_EQ(result, "1 and 2 an+++++++++"); sp.fill('+'); sz = format(sp.first(2), "{} and {} and {} and {}", 111, 222, 333, 444); CHECK_EQ(sz, strlen("111 and 222 and 333 and 444")); result = sp.left_of(sz); CHECK_EQ(result, "+++++++++++++++++++++++++++"); sp.fill('+'); sz = format(sp.first(3), "{} and {} and {} and {}", 111, 222, 333, 444); CHECK_EQ(sz, strlen("111 and 222 and 333 and 444")); result = sp.left_of(sz); CHECK_EQ(result, "111++++++++++++++++++++++++"); sp.fill('+'); sz = format(sp.first(4), "{} and {} and {} and {}", 111, 222, 333, 444); CHECK_EQ(sz, strlen("111 and 222 and 333 and 444")); result = sp.left_of(sz); CHECK_EQ(result, "111 +++++++++++++++++++++++"); sp.fill('+'); sz = format(sp.first(8), "{} and {} and {} and {}", 111, 222, 333, 444); CHECK_EQ(sz, strlen("111 and 222 and 333 and 444")); result = sp.left_of(sz); CHECK_EQ(result, "111 and +++++++++++++++++++"); sp.fill('+'); sz = format(sp.first(11), "{} and {} and {} and {}", 111, 222, 333, 444); CHECK_EQ(sz, strlen("111 and 222 and 333 and 444")); result = sp.left_of(sz); CHECK_EQ(result, "111 and 222++++++++++++++++"); sp.fill('+'); sz = format(sp.first(16), "{} and {} and {} and {}", 111, 222, 333, 444); CHECK_EQ(sz, strlen("111 and 222 and 333 and 444")); result = sp.left_of(sz); CHECK_EQ(result, "111 and 222 and +++++++++++"); sp.fill('+'); sz = format(sp.first(20), "{} and {} and {} and {}", 111, 222, 333, 444); CHECK_EQ(sz, strlen("111 and 222 and 333 and 444")); result = sp.left_of(sz); CHECK_EQ(result, "111 and 222 and 333 +++++++"); sp.fill('+'); sz = format(sp.first(25), "{} and {} and {} and {}", 111, 222, 333, 444); CHECK_EQ(sz, strlen("111 and 222 and 333 and 444")); result = sp.left_of(sz); CHECK_EQ(result, "111 and 222 and 333 and +++"); sp.fill('+'); sz = format(sp.first(26), "{} and {} and {} and {}", 111, 222, 333, 444); CHECK_EQ(sz, strlen("111 and 222 and 333 and 444")); result = sp.left_of(sz); CHECK_EQ(result, "111 and 222 and 333 and +++"); sp.fill('+'); sz = format(sp.first(28), "{} and {} and {} and {}", 111, 222, 333, 444); CHECK_EQ(sz, strlen("111 and 222 and 333 and 444")); result = sp.left_of(sz); CHECK_EQ(result, "111 and 222 and 333 and 444"); sp.fill('+'); sz = format(sp.first(30), "{} and {} and {} and {}", 111, 222, 333, 444); CHECK_EQ(sz, strlen("111 and 222 and 333 and 444")); result = sp.left_of(sz); CHECK_EQ(result, "111 and 222 and 333 and 444"); sz = format(buf, "{} and {} and {} and {}", 1, 2, 3, 4, 5, 6, 7); CHECK_EQ(sz, strlen("1 and 2 and 3 and 4")); result = sp.left_of(sz); CHECK_EQ(result, "1 and 2 and 3 and 4"); sz = format(buf, "{} and {} and {} and {}", 1, 2, 3); CHECK_EQ(sz, 20); result = sp.left_of(sz); CHECK_EQ(result, "1 and 2 and 3 and {}"); sz = format(buf, "{} and {} and {} and {}", 1, 2); CHECK_EQ(sz, 21); result = sp.left_of(sz); CHECK_EQ(result, "1 and 2 and {} and {}"); sz = format(buf, "{} and {} and {} and {}", 1); CHECK_EQ(sz, 22); result = sp.left_of(sz); CHECK_EQ(result, "1 and {} and {} and {}"); sz = format(buf, "{} and {} and {} and {}"); CHECK_EQ(sz, 23); result = sp.left_of(sz); CHECK_EQ(result, "{} and {} and {} and {}"); sz = format(buf, "{} args only at the begin", 1); CHECK_EQ(sz, csubstr("1 args only at the begin").len); result = sp.left_of(sz); CHECK_EQ(result, csubstr("1 args only at the begin")); } TEST_CASE("format.empty_buffer") { size_t sz = format({}, "{} and {} and {} and {}", 1, 2, 3, 4); CHECK_EQ(sz, strlen("1 and 2 and 3 and 4")); char buf_[128]; substr buf = buf_; sz = format(buf, "{} and {} and {} and {}", 1, 2, 3, 4); CHECK_EQ(sz, strlen("1 and 2 and 3 and 4")); CHECK_EQ(format(buf, "{} and {} and {} and {}", 1, 2, 3, 4), format({} , "{} and {} and {} and {}", 1, 2, 3, 4)); CHECK_EQ(to_chars({}, 101), to_chars(buf, 101)); // eq for all integers CHECK_GE(to_chars({}, 0.1f), to_chars(buf, 0.1f)); // ge for all floats, due to a sprintf quirk CHECK_EQ(format(buf, "a={} foo {} {} bar {}", 101, 10, 11, 12), format({} , "a={} foo {} {} bar {}", 101, 10, 11, 12)); } #ifdef C4_TUPLE_TO_STR TEST_CASE("format.tuple") { char buf[256]; substr sp(buf); csubstr result; size_t sz; sz = format(buf, "{} and {} and {} and {}", std::forward_as_tuple(1, 2, 3, 4)); CHECK_EQ(sz, 19); result = sp.left_of(sz); CHECK_EQ(result, "1 and 2 and 3 and 4"); sz = format(buf, "{} and {} and {} and {}", std::forward_as_tuple(1, 2, 3, 4, 5, 6, 7)); CHECK_EQ(sz, 19); result = sp.left_of(sz); CHECK_EQ(result, "1 and 2 and 3 and 4"); sz = format(buf, "{} and {} and {} and {}", std::forward_as_tuple(1, 2, 3)); CHECK_EQ(sz, 20); result = sp.left_of(sz); CHECK_EQ(result, "1 and 2 and 3 and {}"); sz = format(buf, "{} and {} and {} and {}", std::forward_as_tuple(1, 2)); CHECK_EQ(sz, 21); result = sp.left_of(sz); CHECK_EQ(result, "1 and 2 and {} and {}"); sz = format(buf, "{} and {} and {} and {}", std::forward_as_tuple(1)); CHECK_EQ(sz, 22); result = sp.left_of(sz); CHECK_EQ(result, "1 and {} and {} and {}"); sz = format(buf, "{} and {} and {} and {}"); CHECK_EQ(sz, 23); result = sp.left_of(sz); CHECK_EQ(result, "{} and {} and {} and {}"); } #endif // C4_TUPLE_TO_STR TEST_CASE("unformat.vars") { size_t sz; int v1 = 0, v2 = 0, v3 = 0, v4 = 0; sz = unformat("1 and 2 and 3 and 4", "{} and {} and {} and {}", v1, v2, v3, v4); CHECK_EQ(sz, 19); CHECK_EQ(v1, 1); CHECK_EQ(v2, 2); CHECK_EQ(v3, 3); CHECK_EQ(v4, 4); v1 = 0; sz = unformat("1 and 2 and 3 and 4" , "3", v1); CHECK_EQ(sz, 1); CHECK_EQ(v1, 0); v1 = 0; sz = unformat("1,2,3,,,", "{},{},{}", v1, v2, v3); CHECK_EQ(sz, 5); CHECK_EQ(v1, 1); CHECK_EQ(v2, 2); CHECK_EQ(v3, 3); v1 = v2 = v3 = 0; sz = unformat("1,2,3,,,", "{},{},{},,,", v1, v2, v3); CHECK_EQ(sz, 8); // make sure we count the trailing characters in the format CHECK_EQ(v1, 1); CHECK_EQ(v2, 2); CHECK_EQ(v3, 3); } #ifdef C4_TUPLE_TO_STR TEST_CASE("unformat.tuple") { size_t sz; int v1 = 0, v2 = 0, v3 = 0, v4 = 0; auto tp = std::forward_as_tuple(v1, v2, v3, v4); sz = unformat("1 and 2 and 3 and 4", "{} and {} and {} and {}", tp); CHECK_EQ(sz, 19); CHECK_EQ(v1, 1); CHECK_EQ(v2, 2); CHECK_EQ(v3, 3); CHECK_EQ(v4, 4); } #endif // C4_TUPLE_TO_STR //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- TEST_CASE("catrs.basic") { std::vector buf; catrs(&buf); CHECK_EQ(to_csubstr(buf), ""); catrs(&buf, 1, 2, 3, 4); CHECK_EQ(to_csubstr(buf), "1234"); catrs(&buf, 5, 6, 7, 8); CHECK_EQ(to_csubstr(buf), "5678"); } TEST_CASE("catrs.basic_return") { auto bufv = catrs>(9, 8, 7, 6, 5, 4, 3, 2, 1, 0); CHECK_EQ(to_csubstr(bufv), "9876543210"); bufv = catrs>(); CHECK_EQ(to_csubstr(bufv), ""); CHECK(bufv.empty()); auto bufs = catrs(9, 8, 7, 6, 5, 4, 3, 2, 1, 0); CHECK_EQ(to_csubstr(bufs), "9876543210"); } TEST_CASE("catrs.basic_append") { std::vector buf; catrs_append(&buf); CHECK_EQ(to_csubstr(buf), ""); catrs_append(&buf, 1, 2, 3, 4); CHECK_EQ(to_csubstr(buf), "1234"); catrs_append(&buf, 5, 6, 7, 8); CHECK_EQ(to_csubstr(buf), "12345678"); catrs_append(&buf, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8); CHECK_EQ(to_csubstr(buf), "123456789012345678"); } template void catrs_perfect_fwd(Args && ...args) { catrs(std::forward(args)...); } TEST_CASE("catrs.perfect_fwd") { std::vector buf; catrs_perfect_fwd(&buf, 1, 2, 3, 4); CHECK_EQ(to_csubstr(buf), "1234"); catrs_perfect_fwd(&buf, 5, 6, 7, 8); CHECK_EQ(to_csubstr(buf), "5678"); } template void catrs_const_fwd(Args const& ...args) { catrs(args...); } TEST_CASE("catrs.const_fwd") { std::vector buf; catrs_const_fwd(&buf, 1, 2, 3, 4); CHECK_EQ(to_csubstr(buf), "1234"); catrs_const_fwd(&buf, 5, 6, 7, 8); CHECK_EQ(to_csubstr(buf), "5678"); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- TEST_CASE("catseprs.basic") { std::vector buf; catseprs(&buf, ' '); CHECK_EQ(to_csubstr(buf), ""); catseprs(&buf, ' ', 1, 2, 3, 4); CHECK_EQ(to_csubstr(buf), "1 2 3 4"); catseprs(&buf, ' ', 5, 6, 7, 8); CHECK_EQ(to_csubstr(buf), "5 6 7 8"); catseprs(&buf, ',', 1, 2, 3, 4); CHECK_EQ(to_csubstr(buf), "1,2,3,4"); catseprs(&buf, ',', 5, 6, 7, 8); CHECK_EQ(to_csubstr(buf), "5,6,7,8"); catseprs(&buf, '/', 1, 2, 3, 4); CHECK_EQ(to_csubstr(buf), "1/2/3/4"); catseprs(&buf, '/', 5, 6, 7, 8); CHECK_EQ(to_csubstr(buf), "5/6/7/8"); catseprs(&buf, "///", 1, 2, 3, 4); CHECK_EQ(to_csubstr(buf), "1///2///3///4"); catseprs(&buf, "///", 5, 6, 7, 8); CHECK_EQ(to_csubstr(buf), "5///6///7///8"); catseprs(&buf, 5678, 1, 2, 3, 4); CHECK_EQ(to_csubstr(buf), "1567825678356784"); catseprs(&buf, 1234, 5, 6, 7, 8); CHECK_EQ(to_csubstr(buf), "5123461234712348"); } TEST_CASE("catseprs.basic_return") { auto bufv = catseprs>('a', 9, 8, 7, 6, 5, 4, 3, 2, 1, 0); CHECK_EQ(to_csubstr(bufv), "9a8a7a6a5a4a3a2a1a0"); auto bufs = catseprs('a', 9, 8, 7, 6, 5, 4, 3, 2, 1, 0); CHECK_EQ(to_csubstr(bufs), "9a8a7a6a5a4a3a2a1a0"); } TEST_CASE("catseprs.basic_append") { std::vector buf; auto ret = catseprs_append(&buf, ' '); CHECK_EQ(to_csubstr(buf), ""); CHECK_EQ(ret, ""); ret = catseprs_append(&buf, ' ', 1, 2, 3, 4); CHECK_EQ(to_csubstr(buf), "1 2 3 4"); CHECK_EQ(ret, "1 2 3 4"); ret = catseprs_append(&buf, ' ', 5, 6, 7, 8); CHECK_EQ(to_csubstr(buf), "1 2 3 45 6 7 8"); CHECK_EQ(ret, "5 6 7 8"); ret = catseprs_append(&buf, ' ', 9, 0, 1, 2, 3, 4, 5, 6, 7, 8); CHECK_EQ(to_csubstr(buf), "1 2 3 45 6 7 89 0 1 2 3 4 5 6 7 8"); CHECK_EQ(ret, "9 0 1 2 3 4 5 6 7 8"); ret = catseprs_append(&buf, ' '); CHECK_EQ(to_csubstr(buf), "1 2 3 45 6 7 89 0 1 2 3 4 5 6 7 8"); CHECK_EQ(ret, ""); } template void catseprs_perfect_fwd(Args && ...args) { catseprs(std::forward(args)...); } template void catseprs_const_fwd(Args const& ...args) { catseprs(args...); } TEST_CASE("catseprs.perfect_fwd") { std::vector buf; catseprs_perfect_fwd(&buf, '.', 1, 2, 3, 4); CHECK_EQ(to_csubstr(buf), "1.2.3.4"); catseprs_perfect_fwd(&buf, 0, 5, 6, 7, 8); CHECK_EQ(to_csubstr(buf), "5060708"); } TEST_CASE("catseprs.const_fwd") { std::vector buf; catseprs_const_fwd(&buf, '.', 1, 2, 3, 4); CHECK_EQ(to_csubstr(buf), "1.2.3.4"); catseprs_const_fwd(&buf, 0, 5, 6, 7, 8); CHECK_EQ(to_csubstr(buf), "5060708"); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- TEST_CASE("formatrs.basic") { std::vector buf; formatrs(&buf, ""); CHECK(buf.empty()); formatrs(&buf, "{} goes with food, {} goes with heat, {} anytime", "wine", "beer", "coffee"); CHECK_EQ(to_csubstr(buf), "wine goes with food, beer goes with heat, coffee anytime"); formatrs(&buf, ""); CHECK(buf.empty()); } TEST_CASE("formatrs.basic_return") { auto bufv = formatrs>("{} goes with food, {} goes with heat, {} anytime", "wine", "beer", "coffee"); CHECK_EQ(to_csubstr(bufv), "wine goes with food, beer goes with heat, coffee anytime"); auto bufs = formatrs("{} goes with food, {} goes with heat, {} anytime", "wine", "beer", "coffee"); CHECK_EQ(to_csubstr(bufs), "wine goes with food, beer goes with heat, coffee anytime"); } TEST_CASE("formatrs.basic_append") { std::vector buf; formatrs_append(&buf, "{} goes with food", "wine"); CHECK_EQ(to_csubstr(buf), "wine goes with food"); formatrs_append(&buf, ", {} goes with heat", "beer"); CHECK_EQ(to_csubstr(buf), "wine goes with food, beer goes with heat"); formatrs_append(&buf, ", {} anytime", "coffee"); CHECK_EQ(to_csubstr(buf), "wine goes with food, beer goes with heat, coffee anytime"); formatrs_append(&buf, ". And water. {} glass of {}cl in the morning clears you up for the day", 1, 40); CHECK_EQ(to_csubstr(buf), "wine goes with food, beer goes with heat, coffee anytime. And water. 1 glass of 40cl in the morning clears you up for the day"); } template void formatrs_perfect_fwd(Args && ...args) { formatrs(std::forward(args)...); } template void formatrs_const_fwd(Args const& ...args) { formatrs(args...); } TEST_CASE("formatrs.perfect_fwd") { std::vector buf; formatrs_perfect_fwd(&buf, "Too much of anything is bad, but too much {} is {}.", "Champagne", "just right"); CHECK_EQ(to_csubstr(buf), "Too much of anything is bad, but too much Champagne is just right."); formatrs_perfect_fwd(&buf, "{}, I am tasting the {}", "Come quickly", "stars!"); CHECK_EQ(to_csubstr(buf), "Come quickly, I am tasting the stars!"); formatrs_perfect_fwd(&buf, "{} the only wine that leaves a {} {} after {}.", "Champagne is", "woman", "beautiful", "drinking it"); CHECK_EQ(to_csubstr(buf), "Champagne is the only wine that leaves a woman beautiful after drinking it."); formatrs_perfect_fwd(&buf, "Remember {}, it's not just {} we are fighting for, it's {}", "gentlemen", "France", "Champagne!"); CHECK_EQ(to_csubstr(buf), "Remember gentlemen, it's not just France we are fighting for, it's Champagne!"); // https://www.townandcountrymag.com/leisure/drinks/how-to/g828/the-10-best-quotes-about-champagne/ } TEST_CASE("formatrs.const_fwd") { std::vector buf; formatrs_const_fwd(&buf, "Too much of anything is bad, but too much {} is {}.", "Champagne", "just right"); CHECK_EQ(to_csubstr(buf), "Too much of anything is bad, but too much Champagne is just right."); formatrs_const_fwd(&buf, "{}, I am tasting the {}", "Come quickly", "stars!"); CHECK_EQ(to_csubstr(buf), "Come quickly, I am tasting the stars!"); formatrs_const_fwd(&buf, "{} the only wine that leaves a {} {} after {}.", "Champagne is", "woman", "beautiful", "drinking it"); CHECK_EQ(to_csubstr(buf), "Champagne is the only wine that leaves a woman beautiful after drinking it."); formatrs_const_fwd(&buf, "Remember {}, it's not just {} we are fighting for, it's {}", "gentlemen", "France", "Champagne!"); CHECK_EQ(to_csubstr(buf), "Remember gentlemen, it's not just France we are fighting for, it's Champagne!"); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- template void test_hex(T in, csubstr expected) { INFO("expected=" << expected); SUBCASE("charbuf") { char buf_[128] = {}; substr buf = buf_; buf.fill('?'); // this will be executed before each case SUBCASE("sz=0") { CHECK_EQ(cat(buf.first(0), fmt::hex(in)), expected.len); CHECK_EQ(buf[0], '?'); CHECK_EQ(buf.trimr('?'), ""); } SUBCASE("sz=1") { CHECK_EQ(cat(buf.first(1), fmt::hex(in)), expected.len); CHECK_EQ(buf[0], '?'); CHECK_EQ(buf.trimr('?'), ""); } SUBCASE("sz=2") { CHECK_EQ(cat(buf.first(2), fmt::hex(in)), expected.len); CHECK_EQ(buf[0], '?'); CHECK_EQ(buf.trimr('?'), ""); } SUBCASE("full") { REQUIRE_EQ(cat(buf, fmt::hex(in)), expected.len); CHECK_EQ(buf.first(expected.len), expected); CHECK_EQ(buf.trimr('?'), expected); } } SUBCASE("vector") { std::vector buf; catrs(&buf, fmt::hex(in)); CHECK_EQ(buf.size(), expected.len); CHECK_EQ(to_csubstr(buf), expected); } } TEST_CASE("fmt.hex") { test_hex(0, "0x0"); test_hex(nullptr, "0x0"); test_hex(254, "0xfe"); test_hex(255, "0xff"); test_hex(256, "0x100"); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- template void test_raw_roundtrip(const char *valstr, T const& orig) { INFO("valstr=" << valstr); alignas(alignof(T)) char buf_[2 * (sizeof(T) + alignof(T))] = {}; substr buf = buf_; fmt::const_raw_wrapper rawwrap = fmt::raw(orig); REQUIRE_EQ((void const*)rawwrap.buf, (void const*)&orig); REQUIRE_EQ(rawwrap.len, sizeof(orig)); for(size_t i = 0; i < alignof(T); ++i) { INFO(" i=" << i); // make sure to cover unaligned buffers substr sbuf = buf.sub(i); size_t szwrite = c4::to_chars(sbuf, fmt::raw(orig)); REQUIRE_LE(szwrite, sbuf.len); if(i == 0) { REQUIRE_EQ(szwrite, sizeof(T)); } else { REQUIRE_GT(szwrite, sizeof(T)); } T copy = {}; REQUIRE_NE(copy, orig); bool ok = c4::from_chars_first(sbuf, fmt::raw(copy)); REQUIRE_EQ(ok, true); CHECK_EQ(copy, orig); // cover also insufficient buffers sbuf = sbuf.first(sizeof(T)-1); memset(buf.str, 0, buf.len); szwrite = c4::to_chars(sbuf, fmt::raw(orig)); REQUIRE_GT(szwrite, sbuf.len); for(char c : buf) { CHECK_EQ(c, 0); } } } TEST_CASE("fmt.raw_int") { #define _(v) test_raw_roundtrip(#v, v) _(int(1)); _(int(2)); _(int(-1)); _(int(-2)); #undef _ } } // namespace c4 #ifdef __clang__ # pragma clang diagnostic pop #elif defined(__GNUC__) # pragma GCC diagnostic pop #endif #include "c4/libtest/supprwarn_pop.hpp" c4core-0.2.6/test/test_install/000077500000000000000000000000001477602032300163665ustar00rootroot00000000000000c4core-0.2.6/test/test_install/CMakeLists.txt000066400000000000000000000016011477602032300211240ustar00rootroot00000000000000cmake_minimum_required(VERSION 3.12 FATAL_ERROR) project(c4core DESCRIPTION "Test project for an installed c4core" HOMEPAGE_URL "https://github.com/biojppm/c4core" LANGUAGES CXX) include(../../cmake/c4Project.cmake) c4_project(VERSION 0.2.6 AUTHOR "Joao Paulo Magalhaes ") if(C4CORE_TEST_INSTALL_PACKAGE_MODE) find_package(c4core REQUIRED) add_library(c4core ALIAS c4core::c4core) else() find_path(SUBSTR_HPP substr.hpp PATH_SUFFIXES c4 REQUIRED) find_library(C4CORE_LIBRARY c4core REQUIRED) get_filename_component(C4CORE_INCLUDE_DIR "${SUBSTR_HPP}" DIRECTORY) add_library(c4core UNKNOWN IMPORTED) set_target_properties(c4core PROPERTIES IMPORTED_LOCATION "${C4CORE_LIBRARY}") target_include_directories(c4core INTERFACE "${C4CORE_INCLUDE_DIR}") endif() enable_testing() set(C4CORE_INSTALL_TEST ON) add_subdirectory(../../test test) c4core-0.2.6/test/test_log.cpp000066400000000000000000000047371477602032300162200ustar00rootroot00000000000000#include "c4/log.hpp" #include "c4/libtest/supprwarn_push.hpp" #include "c4/test.hpp" namespace c4 { TEST(LogBuffer, basic) { #define _CHECK(s, str) \ EXPECT_EQ(strncmp(s.rd(), str, s.pos), 0) << " string was '" << s.rd() << "'"; \ s.clear(); \ EXPECT_EQ(s.pos, 0);\ EXPECT_EQ(s.buf[0], '\0') LogBuffer b; const char *foo = "Foo"; const char *bars_str = "123"; int bars = 123; // raw writing b.write("hello world I am "); b.write(foo); b.write(" and I frobnicate "); b.write(bars_str); // only accepts const char* b.write(" Bars"); _CHECK(b, "hello world I am Foo and I frobnicate 123 Bars"); // chevron-style AKA iostream-style b << "hello world I am " << foo << " and I frobnicate " << bars << " Bars"; _CHECK(b, "hello world I am Foo and I frobnicate 123 Bars"); // c-style, not type safe b.printf("hello world I am %s and I frobnicate %d Bars", foo, bars); _CHECK(b, "hello world I am Foo and I frobnicate 123 Bars"); // python-style, type safe b.print("hello world I am {} and I frobnicate {} Bars", foo, bars); _CHECK(b, "hello world I am Foo and I frobnicate 123 Bars"); // r-style, type safe b.cat("hello world I am ", foo, " and I frobnicate ", bars, " Bars"); _CHECK(b, "hello world I am Foo and I frobnicate 123 Bars"); // using separators: this is unpractical... const char *s[] = {"now", "we", "have", "11", "strings", "to", "cat", "one", "after", "the", "other"}; b.cat(s[0], ' ', s[1], ' ', s[2], ' ', s[3], ' ', s[4], ' ', s[5], ' ', s[6], ' ', s[7], ' ', s[8], ' ', s[9], ' ', s[10]); _CHECK(b, "now we have 11 strings to cat one after the other"); // ... and this resolves it b.catsep(' ', s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7], s[8], s[9], s[10]); _CHECK(b, "now we have 11 strings to cat one after the other"); b.catsep('_', s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7], s[8], s[9], s[10]); _CHECK(b, "now_we_have_11_strings_to_cat_one_after_the_other"); // can be a full string b.catsep("____", s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7], s[8], s[9], s[10]); _CHECK(b, "now____we____have____11____strings____to____cat____one____after____the____other"); // or just a general object b.catsep(22, s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7], s[8], s[9], s[10]); _CHECK(b, "now22we22have221122strings22to22cat22one22after22the22other"); } } // namespace c4 #include "c4/libtest/supprwarn_pop.hpp" c4core-0.2.6/test/test_memory_resource.cpp000066400000000000000000000147261477602032300206550ustar00rootroot00000000000000#ifndef C4CORE_SINGLE_HEADER #include "c4/memory_resource.hpp" #endif #include "c4/libtest/supprwarn_push.hpp" #include #include "c4/test.hpp" namespace c4 { C4_SUPPRESS_WARNING_GCC_CLANG_WITH_PUSH("-Wold-style-cast") TEST_CASE("set_aalloc.basic") { auto a = get_aalloc(); set_aalloc(nullptr); CHECK_EQ(get_aalloc(), nullptr); set_aalloc(a); CHECK_EQ(get_aalloc(), a); } TEST_CASE("set_afree.basic") { auto a = get_afree(); set_afree(nullptr); CHECK_EQ(get_afree(), nullptr); set_afree(a); CHECK_EQ(get_afree(), a); } TEST_CASE("set_arealloc.basic") { auto a = get_arealloc(); set_arealloc(nullptr); CHECK_EQ(get_arealloc(), nullptr); set_arealloc(a); CHECK_EQ(get_arealloc(), a); } //----------------------------------------------------------------------------- namespace detail { void* aalloc_impl(size_t size, size_t alignment=alignof(max_align_t)); void* arealloc_impl(void *ptr, size_t oldsz, size_t newsz, size_t alignment=alignof(max_align_t)); void afree_impl(void *ptr); } // namespace detail TEST_CASE("aalloc_impl.error_bad_align") { #if defined(C4_POSIX) #if !defined(C4_ASAN) && !defined(C4_LSAN) && !defined(C4_TSAN) && !defined(C4_UBSAN) C4_EXPECT_ERROR_OCCURS([&]{ auto *mem = detail::aalloc_impl(64, 9); // allocating with a non-power of two value is invalid (void)mem; }); #endif #endif } TEST_CASE("aalloc_impl.error_out_of_mem") { #if defined(C4_POSIX) #if !defined(C4_ASAN) && !defined(C4_LSAN) && !defined(C4_TSAN) && !defined(C4_UBSAN) if(sizeof(size_t) != 8) return; // valgrind complains that size is -1 C4_EXPECT_ERROR_OCCURS([&]{ size_t sz = std::numeric_limits::max() / 2u; void const* mem = detail::aalloc_impl(sz); (void)mem; }); #endif #endif } //----------------------------------------------------------------------------- void do_test_realloc(arealloc_pfn fn) { #define _set(dim) for(uint8_t i = 0; i < dim; ++i) { mem[i] = static_cast(i); } #define _check(dim) for(uint8_t i = 0; i < dim; ++i) { CHECK_EQ(mem[i], i); } char *mem = (char*) aalloc(16, alignof(max_align_t)); _set(16u); _check(16u); mem = (char*) fn(mem, 16, 20, alignof(max_align_t)); _check(16u); mem = (char*) fn(mem, 8, 20, alignof(max_align_t)); _check(8u); afree(mem); #undef _set #undef _check } TEST_CASE("realloc_impl.basic") { do_test_realloc(&detail::arealloc_impl); } TEST_CASE("realloc.basic") { do_test_realloc(&arealloc); } //----------------------------------------------------------------------------- void do_memreslinear_realloc_test(MemoryResourceLinear &mr) { C4_ASSERT(mr.capacity() >= 128); // this is needed for the tests below char * mem = (char*) mr.allocate(32); CHECK_EQ(mem-(const char*)mr.mem(), 0); CHECK_EQ(mr.size(), 32); CHECK_EQ(mr.slack(), mr.capacity() - 32); mem = (char*) mr.reallocate(mem, 32, 16); CHECK_EQ(mem-(const char*)mr.mem(), 0); CHECK_EQ(mr.size(), 16); CHECK_EQ(mr.slack(), mr.capacity() - 16); mem = (char*) mr.reallocate(mem, 16, 64); CHECK_EQ(mem-(const char*)mr.mem(), 0); CHECK_EQ(mr.size(), 64); CHECK_EQ(mr.slack(), mr.capacity() - 64); mem = (char*) mr.reallocate(mem, 64, 32); CHECK_EQ(mem-(const char*)mr.mem(), 0); CHECK_EQ(mr.size(), 32); CHECK_EQ(mr.slack(), mr.capacity() - 32); char *mem2 = (char*) mr.allocate(32); CHECK_EQ(mem-(const char*)mr.mem(), 0); CHECK_EQ(mem2-(const char*)mr.mem(), 32); CHECK_EQ(mr.size(), 64); CHECK_EQ(mr.slack(), mr.capacity() - 64); mem = (char*) mr.reallocate(mem, 32, 16); CHECK_EQ(mem-(const char*)mr.mem(), 0); CHECK_EQ(mr.size(), 64); CHECK_EQ(mr.slack(), mr.capacity() - 64); } TEST_CASE("MemoryResourceLinear.reallocate") { MemoryResourceLinear mr(128); do_memreslinear_realloc_test(mr); } TEST_CASE("MemoryResourceLinearArr.reallocate") { MemoryResourceLinearArr<128> mr; do_memreslinear_realloc_test(mr); } //----------------------------------------------------------------------------- TEST_CASE("MemoryResourceLinear.error_out_of_mem") { { MemoryResourceLinear mr(8); mr.allocate(2); } { MemoryResourceLinear mr(8); C4_EXPECT_ERROR_OCCURS([&]{ mr.allocate(9); }); } } TEST_CASE("MemoryResourceLinearArr.error_out_of_mem") { { MemoryResourceLinearArr<8> mr; mr.allocate(2); } { MemoryResourceLinearArr<8> mr; C4_EXPECT_ERROR_OCCURS([&]{ mr.allocate(9); }); } } //----------------------------------------------------------------------------- TEST_CASE("ScopedMemoryResource.basic") { auto *before = get_memory_resource(); { MemoryResourceCounts mrc; ScopedMemoryResource smr(&mrc); CHECK_EQ(get_memory_resource(), &mrc); } CHECK_EQ(get_memory_resource(), before); } TEST_CASE("ScopedMemoryResourceCounts.basic") { auto *before = get_memory_resource(); { auto sac = ScopedMemoryResourceCounts{}; CHECK_EQ(get_memory_resource(), &sac.mr); } CHECK_EQ(get_memory_resource(), before); } TEST_CASE("ScopedMemoryResourceCounts.counts") { auto *before = get_memory_resource(); C4_UNUSED(before); { auto checker = AllocationCountsChecker(); auto *mr = &checker.mr; for(size_t sz : {16u, 32u, 64u, 128u}) { void *mem = mr->allocate(sz); checker.check_all_delta(1, static_cast(sz), static_cast(sz)); mr->deallocate(mem, sz); checker.reset(); } checker.check_curr(0, 0); checker.check_total(4, 240); checker.check_max(1, 128); } { auto checker = AllocationCountsChecker(); auto *mr = &checker.mr; std::pair mem[4] = {{0,16}, {0,32}, {0,64}, {0,128}}; for(auto& m : mem) { m.first = mr->allocate(m.second); checker.check_curr_delta(1, static_cast(m.second)); checker.reset(); } checker.check_curr(4, 240); checker.check_total(4, 240); checker.check_max(4, 240); for(auto& m : mem) { mr->deallocate(m.first, m.second); } checker.check_curr(0, 0); checker.check_total(4, 240); checker.check_max(4, 240); } } C4_SUPPRESS_WARNING_GCC_CLANG_POP } // namespace c4 #include "c4/libtest/supprwarn_pop.hpp" c4core-0.2.6/test/test_memory_util.cpp000066400000000000000000000331421477602032300177740ustar00rootroot00000000000000#ifndef C4CORE_SINGLE_HEADER #include "c4/memory_util.hpp" #endif #include "c4/libtest/supprwarn_push.hpp" #include #include namespace c4 { TEST_CASE("mem_overlaps") { csubstr buf = "0123456789012345678901234567890123456789"; CHECK_EQ(buf.len, 40); auto overlaps = [](csubstr lhs, csubstr rhs){ bool res = mem_overlaps(lhs.str, rhs.str, lhs.len, rhs.len); CHECK(res == lhs.overlaps(rhs)); return res; }; CHECK(!overlaps(buf.first(0), buf.last(0))); CHECK(!overlaps(buf.first(5), buf.last(5))); CHECK(!overlaps(buf.first(10), buf.last(10))); CHECK(!overlaps(buf.first(20), buf.last(20))); CHECK(overlaps(buf.first(21), buf.last(20))); CHECK(overlaps(buf.first(20), buf.last(21))); CHECK(!overlaps(buf.first(0), buf)); CHECK(overlaps(buf.first(1), buf)); CHECK(!overlaps(buf, buf.last(0))); CHECK(overlaps(buf, buf.last(1))); CHECK(!overlaps(buf.first(20), buf.last(20))); CHECK(overlaps(buf.first(21), buf.last(20))); CHECK(overlaps(buf.first(20), buf.first(21))); } TEST_CASE("mem_repeatT.one_repetition") { char buf[120] = {0}; mem_repeat(buf, "123", 2, 1); CHECK_EQ(strcmp(buf, "12"), 0); mem_repeat(buf, "123", 3, 1); CHECK_EQ(strcmp(buf, "123"), 0); } TEST_CASE("mem_repeatT.basic") { char buf[120] = {0}; mem_zero(buf); mem_repeat(buf, "123", 2, 2); CHECK_EQ(strcmp(buf, "1212"), 0); CHECK_EQ(buf[4], '\0'); mem_zero(buf); mem_repeat(buf, "123", 3, 2); CHECK_EQ(strcmp(buf, "123123"), 0); CHECK_EQ(buf[6], '\0'); mem_zero(buf); mem_repeat(buf, "123", 2, 3); CHECK_EQ(strcmp(buf, "121212"), 0); CHECK_EQ(buf[6], '\0'); mem_zero(buf, sizeof(buf)); mem_repeat(buf, "123", 3, 3); CHECK_EQ(strcmp(buf, "123123123"), 0); CHECK_EQ(buf[9], '\0'); mem_zero(buf, sizeof(buf)); mem_repeat(buf, "123", 2, 4); CHECK_EQ(strcmp(buf, "12121212"), 0); CHECK_EQ(buf[8], '\0'); mem_zero(buf, sizeof(buf)); mem_repeat(buf, "123", 3, 4); CHECK_EQ(strcmp(buf, "123123123123"), 0); CHECK_EQ(buf[12], '\0'); mem_zero(buf, sizeof(buf)); mem_repeat(buf, "123", 2, 5); CHECK_EQ(strcmp(buf, "1212121212"), 0); CHECK_EQ(buf[10], '\0'); mem_zero(buf, sizeof(buf)); mem_repeat(buf, "123", 3, 5); CHECK_EQ(strcmp(buf, "123123123123123"), 0); CHECK_EQ(buf[15], '\0'); mem_zero(buf, sizeof(buf)); mem_repeat(buf, "123", 2, 6); CHECK_EQ(strcmp(buf, "121212121212"), 0); CHECK_EQ(buf[12], '\0'); mem_zero(buf, sizeof(buf)); mem_repeat(buf, "123", 3, 6); CHECK_EQ(strcmp(buf, "123123123123123123"), 0); CHECK_EQ(buf[18], '\0'); } //----------------------------------------------------------------------------- TEST_CASE("is_aligned.basic") { CHECK(is_aligned((int*)0x0)); CHECK_FALSE(is_aligned((int*)0x1)); CHECK_FALSE(is_aligned((int*)0x2)); CHECK_FALSE(is_aligned((int*)0x3)); CHECK_FALSE(is_aligned((int*)0x3)); CHECK(is_aligned((int*)0x4)); } //----------------------------------------------------------------------------- TEST_CASE_TEMPLATE("lsb.basic", T, uint8_t, uint16_t, uint32_t, uint64_t) { //CHECK_EQ(lsb( 0), T(0)); CHECK_EQ(lsb( 1), T(0)); CHECK_EQ(lsb( 2), T(1)); CHECK_EQ(lsb( 3), T(0)); CHECK_EQ(lsb( 4), T(2)); CHECK_EQ(lsb( 5), T(0)); CHECK_EQ(lsb( 6), T(1)); CHECK_EQ(lsb( 7), T(0)); CHECK_EQ(lsb( 8), T(3)); CHECK_EQ(lsb( 9), T(0)); CHECK_EQ(lsb(10), T(1)); CHECK_EQ(lsb(11), T(0)); CHECK_EQ(lsb(12), T(2)); CHECK_EQ(lsb(13), T(0)); CHECK_EQ(lsb(14), T(1)); CHECK_EQ(lsb(15), T(0)); CHECK_EQ(lsb(16), T(4)); } TEST_CASE_TEMPLATE("lsb11.basic", T, uint8_t, uint16_t, uint32_t, uint64_t) { //CHECK_EQ((lsb11::value), T(0)); CHECK_EQ((lsb11::value), T(0)); CHECK_EQ((lsb11::value), T(1)); CHECK_EQ((lsb11::value), T(0)); CHECK_EQ((lsb11::value), T(2)); CHECK_EQ((lsb11::value), T(0)); CHECK_EQ((lsb11::value), T(1)); CHECK_EQ((lsb11::value), T(0)); CHECK_EQ((lsb11::value), T(3)); CHECK_EQ((lsb11::value), T(0)); CHECK_EQ((lsb11::value), T(1)); CHECK_EQ((lsb11::value), T(0)); CHECK_EQ((lsb11::value), T(2)); CHECK_EQ((lsb11::value), T(0)); CHECK_EQ((lsb11::value), T(1)); CHECK_EQ((lsb11::value), T(0)); CHECK_EQ((lsb11::value), T(4)); } //----------------------------------------------------------------------------- TEST_CASE_TEMPLATE("ipow.float", T, float, double) { SUBCASE("base 1, signed exponent") { CHECK_FLOAT_EQ(ipow(T(1), int(0)), T(1)); CHECK_FLOAT_EQ(ipow(T(1), int(1)), T(1)); CHECK_FLOAT_EQ(ipow(T(1), int(2)), T(1)); CHECK_FLOAT_EQ(ipow(T(1), -int(1)), T(1)); CHECK_FLOAT_EQ(ipow(T(1), -int(2)), T(1)); CHECK_FLOAT_EQ((ipow(int(0))), T(1)); CHECK_FLOAT_EQ((ipow(int(1))), T(1)); CHECK_FLOAT_EQ((ipow(int(2))), T(1)); CHECK_FLOAT_EQ((ipow(-int(1))), T(1)); CHECK_FLOAT_EQ((ipow(-int(2))), T(1)); } SUBCASE("base 1, unsigned exponent") { CHECK_FLOAT_EQ(ipow(T(1), unsigned(0)), T(1)); CHECK_FLOAT_EQ(ipow(T(1), unsigned(1)), T(1)); CHECK_FLOAT_EQ(ipow(T(1), unsigned(2)), T(1)); CHECK_FLOAT_EQ((ipow(unsigned(0))), T(1)); CHECK_FLOAT_EQ((ipow(unsigned(1))), T(1)); CHECK_FLOAT_EQ((ipow(unsigned(2))), T(1)); } SUBCASE("base 2, signed exponent") { CHECK_FLOAT_EQ(ipow(T(2), int(0)), T(1)); CHECK_FLOAT_EQ(ipow(T(2), int(1)), T(2)); CHECK_FLOAT_EQ(ipow(T(2), int(2)), T(4)); CHECK_FLOAT_EQ(ipow(T(2), int(7)), T(128)); CHECK_FLOAT_EQ(ipow(T(2), -int(1)), T(0.5)); CHECK_FLOAT_EQ(ipow(T(2), -int(2)), T(0.25)); CHECK_FLOAT_EQ(ipow(T(2), -int(3)), T(0.125)); CHECK_FLOAT_EQ(ipow(T(2), -int(4)), T(0.0625)); CHECK_FLOAT_EQ((ipow(int(0))), T(1)); CHECK_FLOAT_EQ((ipow(int(1))), T(2)); CHECK_FLOAT_EQ((ipow(int(2))), T(4)); CHECK_FLOAT_EQ((ipow(int(7))), T(128)); CHECK_FLOAT_EQ((ipow(-int(1))), T(0.5)); CHECK_FLOAT_EQ((ipow(-int(2))), T(0.25)); CHECK_FLOAT_EQ((ipow(-int(3))), T(0.125)); CHECK_FLOAT_EQ((ipow(-int(4))), T(0.0625)); } SUBCASE("base 2, unsigned exponent") { CHECK_FLOAT_EQ(ipow(T(2), unsigned(0)), T(1)); CHECK_FLOAT_EQ(ipow(T(2), unsigned(1)), T(2)); CHECK_FLOAT_EQ(ipow(T(2), unsigned(2)), T(4)); CHECK_FLOAT_EQ(ipow(T(2), unsigned(6)), T(64)); CHECK_FLOAT_EQ((ipow(unsigned(0))), T(1)); CHECK_FLOAT_EQ((ipow(unsigned(1))), T(2)); CHECK_FLOAT_EQ((ipow(unsigned(2))), T(4)); CHECK_FLOAT_EQ((ipow(unsigned(6))), T(64)); } } TEST_CASE_TEMPLATE("ipow", T, int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t) { SUBCASE("base 1, signed exponent") { CHECK_EQ(ipow(T(1), int(0)), T(1)); CHECK_EQ(ipow(T(1), int(1)), T(1)); CHECK_EQ(ipow(T(1), int(2)), T(1)); CHECK_EQ(ipow(T(1), -int(1)), T(1)); CHECK_EQ(ipow(T(1), -int(2)), T(1)); CHECK_EQ(ipow(int(0)), T(1)); CHECK_EQ(ipow(int(1)), T(1)); CHECK_EQ(ipow(int(2)), T(1)); CHECK_EQ(ipow(-int(1)), T(1)); CHECK_EQ(ipow(-int(2)), T(1)); } SUBCASE("base 1, unsigned exponent") { CHECK_EQ(ipow(T(1), unsigned(0)), T(1)); CHECK_EQ(ipow(T(1), unsigned(1)), T(1)); CHECK_EQ(ipow(T(1), unsigned(2)), T(1)); CHECK_EQ(ipow(unsigned(0)), T(1)); CHECK_EQ(ipow(unsigned(1)), T(1)); CHECK_EQ(ipow(unsigned(2)), T(1)); } SUBCASE("base 2, signed exponent") { CHECK_EQ(ipow(T(2), int(0)), T(1)); CHECK_EQ(ipow(T(2), int(1)), T(2)); CHECK_EQ(ipow(T(2), int(2)), T(4)); CHECK_EQ(ipow(T(2), int(6)), T(64)); CHECK_EQ(ipow(T(2), -int(1)), T(0)); CHECK_EQ(ipow(T(2), -int(2)), T(0)); CHECK_EQ(ipow(T(2), -int(6)), T(0)); CHECK_EQ(ipow(int(0)), T(1)); CHECK_EQ(ipow(int(1)), T(2)); CHECK_EQ(ipow(int(2)), T(4)); CHECK_EQ(ipow(int(6)), T(64)); CHECK_EQ(ipow(-int(1)), T(0)); CHECK_EQ(ipow(-int(2)), T(0)); CHECK_EQ(ipow(-int(7)), T(0)); } SUBCASE("base 2, unsigned exponent") { CHECK_EQ(ipow(T(2), unsigned(0)), T(1)); CHECK_EQ(ipow(T(2), unsigned(1)), T(2)); CHECK_EQ(ipow(T(2), unsigned(2)), T(4)); CHECK_EQ(ipow(T(2), unsigned(6)), T(64)); CHECK_EQ(ipow(unsigned(0)), T(1)); CHECK_EQ(ipow(unsigned(1)), T(2)); CHECK_EQ(ipow(unsigned(2)), T(4)); CHECK_EQ(ipow(unsigned(6)), T(64)); } } //----------------------------------------------------------------------------- TEST_CASE_TEMPLATE("msb.basic", T, uint8_t, uint16_t, uint32_t, uint64_t) { CHECK_EQ(msb(T( 1)), 0u); CHECK_EQ(msb(T( 2)), 1u); CHECK_EQ(msb(T( 3)), 1u); CHECK_EQ(msb(T( 4)), 2u); CHECK_EQ(msb(T( 5)), 2u); CHECK_EQ(msb(T( 6)), 2u); CHECK_EQ(msb(T( 7)), 2u); CHECK_EQ(msb(T( 8)), 3u); CHECK_EQ(msb(T( 9)), 3u); CHECK_EQ(msb(T(10)), 3u); CHECK_EQ(msb(T(11)), 3u); CHECK_EQ(msb(T(12)), 3u); CHECK_EQ(msb(T(13)), 3u); CHECK_EQ(msb(T(14)), 3u); CHECK_EQ(msb(T(15)), 3u); CHECK_EQ(msb(T(16)), 4u); CHECK_EQ(msb(std::numeric_limits::max()), 8u * sizeof(T) - 1u); } TEST_CASE_TEMPLATE("msb11.basic", T, uint8_t, uint16_t, uint32_t, uint64_t) { CHECK_EQ((msb11::value), T(0)); CHECK_EQ((msb11::value), T(1)); CHECK_EQ((msb11::value), T(1)); CHECK_EQ((msb11::value), T(2)); CHECK_EQ((msb11::value), T(2)); CHECK_EQ((msb11::value), T(2)); CHECK_EQ((msb11::value), T(2)); CHECK_EQ((msb11::value), T(3)); CHECK_EQ((msb11::value), T(3)); CHECK_EQ((msb11::value), T(3)); CHECK_EQ((msb11::value), T(3)); CHECK_EQ((msb11::value), T(3)); CHECK_EQ((msb11::value), T(3)); CHECK_EQ((msb11::value), T(3)); CHECK_EQ((msb11::value), T(3)); CHECK_EQ((msb11::value), T(4)); CHECK_EQ((msb11::max()>::value), 8u * sizeof(T) - 1u); } //----------------------------------------------------------------------------- // contiguous mask template T _mask() { return T(0); } template T _mask(int bit, Bits ...bits) { return (T)(T(1) << bit | _mask(bits...)); } TEST_CASE_TEMPLATE("contiguous_mask.basic", T, int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t) { CHECK_EQ(contiguous_mask(0, 0), _mask()); CHECK_EQ(contiguous_mask(0, 1), _mask(0)); CHECK_EQ(contiguous_mask(0, 2), _mask(0, 1)); CHECK_EQ(contiguous_mask(0, 3), _mask(0, 1, 2)); CHECK_EQ(contiguous_mask(0, 4), _mask(0, 1, 2, 3)); CHECK_EQ(contiguous_mask(1, 4), _mask( 1, 2, 3)); CHECK_EQ(contiguous_mask(2, 4), _mask( 2, 3)); CHECK_EQ(contiguous_mask(3, 4), _mask( 3)); CHECK_EQ(contiguous_mask(4, 4), _mask()); } TEST_CASE_TEMPLATE("contiguous_mask11.basic", T, int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t) { CHECK_EQ((contiguous_mask11::value), _mask()); CHECK_EQ((contiguous_mask11::value), _mask(0)); CHECK_EQ((contiguous_mask11::value), _mask(0, 1)); CHECK_EQ((contiguous_mask11::value), _mask(0, 1, 2)); CHECK_EQ((contiguous_mask11::value), _mask(0, 1, 2, 3)); CHECK_EQ((contiguous_mask11::value), _mask( 1, 2, 3)); CHECK_EQ((contiguous_mask11::value), _mask( 2, 3)); CHECK_EQ((contiguous_mask11::value), _mask( 3)); CHECK_EQ((contiguous_mask11::value), _mask()); } //----------------------------------------------------------------------------- template struct sz { char buf[N]; }; template< > struct sz<0> { }; template void check_tp() { #if defined(__clang__) # pragma clang diagnostic push #elif defined(__GNUC__) # pragma GCC diagnostic push # if __GNUC__ >= 7 # pragma GCC diagnostic ignored "-Wduplicated-branches" # endif #endif size_t expected; if(F != 0 && S != 0) expected = F+S; else if(F == 0 && S != 0) expected = S; else if(F != 0 && S == 0) expected = F; // -Wduplicated-branches: false positive here else /* F == 0 && S == 0)*/expected = 1; #if defined(__clang__) # pragma clang diagnostic pop #elif defined(__GNUC__) # pragma GCC diagnostic pop #endif INFO("F=" << F << " S=" << S); CHECK_EQ(sizeof(tight_pair, sz>), expected); } TEST_CASE("tight_pair.basic") { check_tp<0,0>(); check_tp<0,1>(); check_tp<0,2>(); check_tp<0,3>(); check_tp<0,4>(); check_tp<0,0>(); check_tp<1,0>(); check_tp<2,0>(); check_tp<3,0>(); check_tp<4,0>(); check_tp<0,0>(); check_tp<1,1>(); check_tp<2,2>(); check_tp<3,3>(); check_tp<4,4>(); } } // namespace c4 #include "c4/libtest/supprwarn_pop.hpp" c4core-0.2.6/test/test_numbers.hpp000066400000000000000000004741661477602032300171260ustar00rootroot00000000000000#ifndef C4CORE_SINGLE_HEADER #include #include #endif #include namespace c4 { template struct overflow64case { bool is_overflow; T wrapped; csubstr dec; csubstr hex; csubstr oct; csubstr bin; }; template struct overflow64cases; #define INT64_1(v) INT64_C(v) - INT64_C(1) // the min value is not representable! #define oc(T, is_overflow, wrapped, dec, hex, oct, bin) \ overflow64case{is_overflow, wrapped, csubstr{dec}, csubstr{hex}, csubstr{oct}, csubstr{bin}} template<> struct overflow64cases { static constexpr const overflow64case values[] = { oc(int64_t, true , INT64_C( 9223372036854775803), "-9223372036854775813", "-0x8000000000000005", "-0o1000000000000000000005", "-0b1000000000000000000000000000000000000000000000000000000000000101"), oc(int64_t, true , INT64_C( 9223372036854775804), "-9223372036854775812", "-0x8000000000000004", "-0o1000000000000000000004", "-0b1000000000000000000000000000000000000000000000000000000000000100"), oc(int64_t, true , INT64_C( 9223372036854775805), "-9223372036854775811", "-0x8000000000000003", "-0o1000000000000000000003", "-0b1000000000000000000000000000000000000000000000000000000000000011"), oc(int64_t, true , INT64_C( 9223372036854775806), "-9223372036854775810", "-0x8000000000000002", "-0o1000000000000000000002", "-0b1000000000000000000000000000000000000000000000000000000000000010"), oc(int64_t, true , INT64_C( 9223372036854775807), "-9223372036854775809", "-0x8000000000000001", "-0o1000000000000000000001", "-0b1000000000000000000000000000000000000000000000000000000000000001"), oc(int64_t, false, INT64_1(-9223372036854775807), "-9223372036854775808", "-0x8000000000000000", "-0o1000000000000000000000", "-0b1000000000000000000000000000000000000000000000000000000000000000"), oc(int64_t, false, INT64_C(-9223372036854775807), "-9223372036854775807", "-0x7fffffffffffffff", "-0o777777777777777777777" , "-0b111111111111111111111111111111111111111111111111111111111111111"), oc(int64_t, false, INT64_C(-9223372036854775806), "-9223372036854775806", "-0x7ffffffffffffffe", "-0o777777777777777777776" , "-0b111111111111111111111111111111111111111111111111111111111111110"), oc(int64_t, false, INT64_C(-9223372036854775805), "-9223372036854775805", "-0x7ffffffffffffffd", "-0o777777777777777777775" , "-0b111111111111111111111111111111111111111111111111111111111111101"), oc(int64_t, false, INT64_C( 9223372036854775804), "9223372036854775804", "0x7ffffffffffffffc", "0o777777777777777777774" , "0b111111111111111111111111111111111111111111111111111111111111100"), oc(int64_t, false, INT64_C( 9223372036854775805), "9223372036854775805", "0x7ffffffffffffffd", "0o777777777777777777775" , "0b111111111111111111111111111111111111111111111111111111111111101"), oc(int64_t, false, INT64_C( 9223372036854775806), "9223372036854775806", "0x7ffffffffffffffe", "0o777777777777777777776" , "0b111111111111111111111111111111111111111111111111111111111111110"), oc(int64_t, false, INT64_C( 9223372036854775807), "9223372036854775807", "0x7fffffffffffffff", "0o777777777777777777777" , "0b111111111111111111111111111111111111111111111111111111111111111"), oc(int64_t, true , INT64_1(-9223372036854775807), "9223372036854775808", "0x8000000000000000", "0o1000000000000000000000", "0b1000000000000000000000000000000000000000000000000000000000000000"), oc(int64_t, true , INT64_C(-9223372036854775807), "9223372036854775809", "0x8000000000000001", "0o1000000000000000000001", "0b1000000000000000000000000000000000000000000000000000000000000001"), oc(int64_t, true , INT64_C(-9223372036854775806), "9223372036854775810", "0x8000000000000002", "0o1000000000000000000002", "0b1000000000000000000000000000000000000000000000000000000000000010"), oc(int64_t, true , INT64_C(-9223372036854775805), "9223372036854775811", "0x8000000000000003", "0o1000000000000000000003", "0b1000000000000000000000000000000000000000000000000000000000000011"), oc(int64_t, true , INT64_C(-9223372036854775804), "9223372036854775812", "0x8000000000000004", "0o1000000000000000000004", "0b1000000000000000000000000000000000000000000000000000000000000100"), }; }; template<> struct overflow64cases { static constexpr const overflow64case values[] = { oc(uint64_t, true , UINT64_C(18446744073709551611), "-5" , "-0x5" , "-0o5" , "-0b101"), oc(uint64_t, true , UINT64_C(18446744073709551612), "-4" , "-0x4" , "-0o4" , "-0b100"), oc(uint64_t, true , UINT64_C(18446744073709551613), "-3" , "-0x3" , "-0o3" , "-0b11"), oc(uint64_t, true , UINT64_C(18446744073709551614), "-2" , "-0x2" , "-0o2" , "-0b10"), oc(uint64_t, true , UINT64_C(18446744073709551615), "-1" , "-0x1" , "-0o1" , "-0b1"), oc(uint64_t, false, UINT64_C( 0), "0" , "0x0" , "0o0" , "0b0"), oc(uint64_t, false, UINT64_C( 1), "1" , "0x1" , "0o1" , "0b1"), oc(uint64_t, false, UINT64_C( 2), "2" , "0x2" , "0o2" , "0b10"), oc(uint64_t, false, UINT64_C( 3), "3" , "0x3" , "0o3" , "0b11"), oc(uint64_t, false, UINT64_C(18446744073709551612), "18446744073709551612", "0xfffffffffffffffc" , "0o1777777777777777777774" , "0b1111111111111111111111111111111111111111111111111111111111111100"), oc(uint64_t, false, UINT64_C(18446744073709551613), "18446744073709551613", "0xfffffffffffffffd" , "0o1777777777777777777775" , "0b1111111111111111111111111111111111111111111111111111111111111101"), oc(uint64_t, false, UINT64_C(18446744073709551614), "18446744073709551614", "0xfffffffffffffffe" , "0o1777777777777777777776" , "0b1111111111111111111111111111111111111111111111111111111111111110"), oc(uint64_t, false, UINT64_C(18446744073709551615), "18446744073709551615", "0xffffffffffffffff" , "0o1777777777777777777777" , "0b1111111111111111111111111111111111111111111111111111111111111111"), oc(uint64_t, true , UINT64_C( 0), "18446744073709551616", "0x10000000000000000", "0o20000000000000000000000", "0b10000000000000000000000000000000000000000000000000000000000000000"), oc(uint64_t, true , UINT64_C( 1), "18446744073709551617", "0x10000000000000001", "0o20000000000000000000001", "0b10000000000000000000000000000000000000000000000000000000000000001"), oc(uint64_t, true , UINT64_C( 2), "18446744073709551618", "0x10000000000000002", "0o20000000000000000000002", "0b10000000000000000000000000000000000000000000000000000000000000010"), oc(uint64_t, true , UINT64_C( 3), "18446744073709551619", "0x10000000000000003", "0o20000000000000000000003", "0b10000000000000000000000000000000000000000000000000000000000000011"), oc(uint64_t, true , UINT64_C( 4), "18446744073709551620", "0x10000000000000004", "0o20000000000000000000004", "0b10000000000000000000000000000000000000000000000000000000000000100"), oc(uint64_t, true , UINT64_C( 5), "18446744073709551621", "0x10000000000000005", "0o20000000000000000000005", "0b10000000000000000000000000000000000000000000000000000000000000101"), }; }; constexpr const overflow64case overflow64cases::values[]; constexpr const overflow64case overflow64cases::values[]; #undef oc //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- struct invalid_case { csubstr dec, hex, oct, bin; }; C4_INLINE_CONSTEXPR const invalid_case invalid_cases[] = { #define ic(dec, hex, oct, bin) \ invalid_case{csubstr{dec}, csubstr{hex}, csubstr{oct}, csubstr{bin}} ic("" , "" , "" , ""), ic(" " , " " , " " , " "), ic("." , "." , "." , "."), ic("-" , "-" , "-" , "-"), ic("\t" , "\t" , "\t" , "\t"), ic("\n" , "\n" , "\n" , "\n"), ic("...", "..." , "..." , "..."), ic("===", "===" , "===" , "==="), ic("=??", "???" , "???" , "???"), ic("12a", "0x12g", "0o128", "0b102"), ic("0.1", "0x1.2", "0o1.2", "0b1.1"), ic("0,1", "0x1,2", "0o1,2", "0b1,1"), ic("zz" , "0xzz" , "0ozz" , "0bzz"), ic("" , "0x" , "0o" , "0b"), ic("- " , "-0x" , "-0o" , "-0b"), ic("2 0", "0x2 0", "0o2 0", "0b1 0"), ic(" 2" , " 0x2" , " 0o2" , " 0b1"), ic("\t2", "\t0x2", "\t0o2", "\t0b1"), ic("\n2", "nt0x2", "\n0o2", "\n0b1"), ic("2 " , "0x2 " , "0o2 " , "0b1 "), ic("2\t", "0x2\t", "0o2\t", "0b1\t"), ic("2\n", "0x2\n", "0o2\n", "0b1\n"), ic("nan", "nan", "nan", "nan"), ic("NaN", "NaN", "NaN", "NaN"), ic("Inf", "Inf", "Inf", "Inf"), ic("inf", "inf", "inf", "inf"), ic("infinity", "infinity", "infinity", "infinity"), ic("Infinity", "Infinity", "Infinity", "Infinity"), ic("somevalue", "somevalue", "somevalue", "somevalue"), ic("2345kjhiuy3245", "2345kjhiuy3245", "2345kjhiuy3245", "2345kjhiuy3245"), #undef ic }; //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- template struct number_case { T val; csubstr dec; csubstr hex; csubstr oct; csubstr bin; T valp1; T has_valp1; constexpr number_case() noexcept = default; constexpr number_case(T val_, csubstr dec_, csubstr hex_, csubstr oct_, csubstr bin_, T valp1_) noexcept : val(val_) , dec(dec_) , hex(hex_) , oct(oct_) , bin(bin_) , valp1(valp1_) , has_valp1(true) { } constexpr number_case(T val_, csubstr dec_, csubstr hex_, csubstr oct_, csubstr bin_) noexcept : val(val_) , dec(dec_) , hex(hex_) , oct(oct_) , bin(bin_) , valp1() , has_valp1(false) { } }; template std::ostream& operator<< (std::ostream& s, number_case const& nc) { using upcast_t = typename std::conditional::value, int64_t, uint64_t>::type>::type; s << "val=" << (upcast_t)nc.val << " " << "dec=" << nc.dec << " " << "hex=" << nc.hex << " " << "oct=" << nc.oct << " " << "bin=" << nc.bin; return s; } template struct numbers; #define ITER_NUMBERS(ty, number_name) for(number_case const& C4_RESTRICT number_name : numbers::vals) C4_SUPPRESS_WARNING_MSVC_PUSH C4_SUPPRESS_WARNING_MSVC(4146) C4_SUPPRESS_WARNING_MSVC(4305) C4_SUPPRESS_WARNING_MSVC(4310) // these numbers were generated with printintegers.py, in this dir. #define ncp__(tyval, val, dec, hex, bin, oct, tyvalp1, valp1) number_case((value_type)(tyval(val)), csubstr{dec}, csubstr{hex}, csubstr{bin}, csubstr{oct}, (value_type)(tyvalp1(valp1))) #define ncp_(ty, val, dec, hex, bin, oct, valp1) number_case((value_type)(ty(val)), csubstr{dec}, csubstr{hex}, csubstr{bin}, csubstr{oct}, (value_type)(ty(valp1))) #define nc_(ty, val, dec, hex, bin, oct) number_case((value_type)(ty(val)), csubstr{dec}, csubstr{hex}, csubstr{bin}, csubstr{oct}) template<> struct numbers { using value_type = int8_t; static C4_INLINE_CONSTEXPR const number_case vals[] = { #define nc(val, dec, hex, bin, oct, valp1) ncp_(INT8_C, val, dec, hex, bin, oct, valp1) nc(-128, "-128", "-0x80", "-0o200", "-0b10000000", -127), nc(-127, "-127", "-0x7f", "-0o177", "-0b1111111", -126), nc(-126, "-126", "-0x7e", "-0o176", "-0b1111110", -125), nc(-125, "-125", "-0x7d", "-0o175", "-0b1111101", -124), nc(-124, "-124", "-0x7c", "-0o174", "-0b1111100", -123), nc(-123, "-123", "-0x7b", "-0o173", "-0b1111011", -122), nc(-101, "-101", "-0x65", "-0o145", "-0b1100101", -100), nc(-100, "-100", "-0x64", "-0o144", "-0b1100100", -99), nc(-99, "-99", "-0x63", "-0o143", "-0b1100011", -98), nc(-65, "-65", "-0x41", "-0o101", "-0b1000001", -64), nc(-64, "-64", "-0x40", "-0o100", "-0b1000000", -63), nc(-63, "-63", "-0x3f", "-0o77", "-0b111111", -62), nc(-33, "-33", "-0x21", "-0o41", "-0b100001", -32), nc(-32, "-32", "-0x20", "-0o40", "-0b100000", -31), nc(-31, "-31", "-0x1f", "-0o37", "-0b11111", -30), nc(-17, "-17", "-0x11", "-0o21", "-0b10001", -16), nc(-16, "-16", "-0x10", "-0o20", "-0b10000", -15), nc(-15, "-15", "-0xf", "-0o17", "-0b1111", -14), nc(-12, "-12", "-0xc", "-0o14", "-0b1100", -11), nc(-11, "-11", "-0xb", "-0o13", "-0b1011", -10), nc(-10, "-10", "-0xa", "-0o12", "-0b1010", -9), nc(-9, "-9", "-0x9", "-0o11", "-0b1001", -8), nc(-8, "-8", "-0x8", "-0o10", "-0b1000", -7), nc(-7, "-7", "-0x7", "-0o7", "-0b111", -6), nc(-6, "-6", "-0x6", "-0o6", "-0b110", -5), nc(-5, "-5", "-0x5", "-0o5", "-0b101", -4), nc(-4, "-4", "-0x4", "-0o4", "-0b100", -3), nc(-3, "-3", "-0x3", "-0o3", "-0b11", -2), nc(-2, "-2", "-0x2", "-0o2", "-0b10", -1), nc(-1, "-1", "-0x1", "-0o1", "-0b1", 0), nc(0, "0", "0x0", "0o0", "0b0", 1), nc(1, "1", "0x1", "0o1", "0b1", 2), nc(2, "2", "0x2", "0o2", "0b10", 3), nc(3, "3", "0x3", "0o3", "0b11", 4), nc(4, "4", "0x4", "0o4", "0b100", 5), nc(5, "5", "0x5", "0o5", "0b101", 6), nc(6, "6", "0x6", "0o6", "0b110", 7), nc(7, "7", "0x7", "0o7", "0b111", 8), nc(8, "8", "0x8", "0o10", "0b1000", 9), nc(9, "9", "0x9", "0o11", "0b1001", 10), nc(10, "10", "0xa", "0o12", "0b1010", 11), nc(11, "11", "0xb", "0o13", "0b1011", 12), nc(12, "12", "0xc", "0o14", "0b1100", 13), nc(13, "13", "0xd", "0o15", "0b1101", 14), nc(15, "15", "0xf", "0o17", "0b1111", 16), nc(16, "16", "0x10", "0o20", "0b10000", 17), nc(17, "17", "0x11", "0o21", "0b10001", 18), nc(31, "31", "0x1f", "0o37", "0b11111", 32), nc(32, "32", "0x20", "0o40", "0b100000", 33), nc(33, "33", "0x21", "0o41", "0b100001", 34), nc(63, "63", "0x3f", "0o77", "0b111111", 64), nc(64, "64", "0x40", "0o100", "0b1000000", 65), nc(65, "65", "0x41", "0o101", "0b1000001", 66), nc(99, "99", "0x63", "0o143", "0b1100011", 100), nc(100, "100", "0x64", "0o144", "0b1100100", 101), nc(101, "101", "0x65", "0o145", "0b1100101", 102), nc(122, "122", "0x7a", "0o172", "0b1111010", 123), nc(123, "123", "0x7b", "0o173", "0b1111011", 124), nc(124, "124", "0x7c", "0o174", "0b1111100", 125), nc(125, "125", "0x7d", "0o175", "0b1111101", 126), nc(126, "126", "0x7e", "0o176", "0b1111110", 127), nc(127, "127", "0x7f", "0o177", "0b1111111", -128), #undef nc }; }; template<> struct numbers { using value_type = uint8_t; static C4_INLINE_CONSTEXPR const number_case vals[] = { #define nc(val, dec, hex, bin, oct, valp1) ncp_(UINT8_C, val, dec, hex, bin, oct, valp1) nc(0, "0", "0x0", "0o0", "0b0", 1), nc(1, "1", "0x1", "0o1", "0b1", 2), nc(2, "2", "0x2", "0o2", "0b10", 3), nc(3, "3", "0x3", "0o3", "0b11", 4), nc(4, "4", "0x4", "0o4", "0b100", 5), nc(5, "5", "0x5", "0o5", "0b101", 6), nc(6, "6", "0x6", "0o6", "0b110", 7), nc(7, "7", "0x7", "0o7", "0b111", 8), nc(8, "8", "0x8", "0o10", "0b1000", 9), nc(9, "9", "0x9", "0o11", "0b1001", 10), nc(10, "10", "0xa", "0o12", "0b1010", 11), nc(11, "11", "0xb", "0o13", "0b1011", 12), nc(15, "15", "0xf", "0o17", "0b1111", 16), nc(16, "16", "0x10", "0o20", "0b10000", 17), nc(17, "17", "0x11", "0o21", "0b10001", 18), nc(24, "24", "0x18", "0o30", "0b11000", 25), nc(25, "25", "0x19", "0o31", "0b11001", 26), nc(26, "26", "0x1a", "0o32", "0b11010", 27), nc(31, "31", "0x1f", "0o37", "0b11111", 32), nc(32, "32", "0x20", "0o40", "0b100000", 33), nc(33, "33", "0x21", "0o41", "0b100001", 34), nc(63, "63", "0x3f", "0o77", "0b111111", 64), nc(64, "64", "0x40", "0o100", "0b1000000", 65), nc(65, "65", "0x41", "0o101", "0b1000001", 66), nc(99, "99", "0x63", "0o143", "0b1100011", 100), nc(100, "100", "0x64", "0o144", "0b1100100", 101), nc(101, "101", "0x65", "0o145", "0b1100101", 102), nc(127, "127", "0x7f", "0o177", "0b1111111", 128), nc(128, "128", "0x80", "0o200", "0b10000000", 129), nc(129, "129", "0x81", "0o201", "0b10000001", 130), nc(251, "251", "0xfb", "0o373", "0b11111011", 252), nc(252, "252", "0xfc", "0o374", "0b11111100", 253), nc(253, "253", "0xfd", "0o375", "0b11111101", 254), nc(254, "254", "0xfe", "0o376", "0b11111110", 255), nc(255, "255", "0xff", "0o377", "0b11111111", 0), #undef nc }; }; template<> struct numbers { using value_type = int16_t; static C4_INLINE_CONSTEXPR const number_case vals[] = { #define nc(val, dec, hex, bin, oct) nc_(INT16_C, val, dec, hex, bin, oct) #define pc(val, dec, hex, bin, oct, valp1) ncp_(INT16_C, val, dec, hex, bin, oct, valp1) pc(-32768, "-32768", "-0x8000", "-0o100000", "-0b1000000000000000", -32767), pc(-32767, "-32767", "-0x7fff", "-0o77777", "-0b111111111111111", -32766), pc(-32766, "-32766", "-0x7ffe", "-0o77776", "-0b111111111111110", -32765), pc(-32765, "-32765", "-0x7ffd", "-0o77775", "-0b111111111111101", -32764), pc(-32764, "-32764", "-0x7ffc", "-0o77774", "-0b111111111111100", -32763), pc(-32763, "-32763", "-0x7ffb", "-0o77773", "-0b111111111111011", -32762), pc(-16385, "-16385", "-0x4001", "-0o40001", "-0b100000000000001", -16384), pc(-16384, "-16384", "-0x4000", "-0o40000", "-0b100000000000000", -16383), pc(-16383, "-16383", "-0x3fff", "-0o37777", "-0b11111111111111", -16382), pc(-10001, "-10001", "-0x2711", "-0o23421", "-0b10011100010001", -10000), pc(-10000, "-10000", "-0x2710", "-0o23420", "-0b10011100010000", -9999), pc(-9999, "-9999", "-0x270f", "-0o23417", "-0b10011100001111", -9998), pc(-8193, "-8193", "-0x2001", "-0o20001", "-0b10000000000001", -8192), pc(-8192, "-8192", "-0x2000", "-0o20000", "-0b10000000000000", -8191), nc(-8191, "-8191", "-0x1fff", "-0o17777", "-0b1111111111111"), nc(-4097, "-4097", "-0x1001", "-0o10001", "-0b1000000000001"), nc(-4096, "-4096", "-0x1000", "-0o10000", "-0b1000000000000"), nc(-4095, "-4095", "-0xfff", "-0o7777", "-0b111111111111"), nc(-3276, "-3276", "-0xccc", "-0o6314", "-0b110011001100"), nc(-2049, "-2049", "-0x801", "-0o4001", "-0b100000000001"), nc(-2048, "-2048", "-0x800", "-0o4000", "-0b100000000000"), nc(-2047, "-2047", "-0x7ff", "-0o3777", "-0b11111111111"), nc(-1025, "-1025", "-0x401", "-0o2001", "-0b10000000001"), nc(-1024, "-1024", "-0x400", "-0o2000", "-0b10000000000"), nc(-1023, "-1023", "-0x3ff", "-0o1777", "-0b1111111111"), nc(-1001, "-1001", "-0x3e9", "-0o1751", "-0b1111101001"), nc(-1000, "-1000", "-0x3e8", "-0o1750", "-0b1111101000"), nc(-999, "-999", "-0x3e7", "-0o1747", "-0b1111100111"), nc(-513, "-513", "-0x201", "-0o1001", "-0b1000000001"), nc(-512, "-512", "-0x200", "-0o1000", "-0b1000000000"), nc(-511, "-511", "-0x1ff", "-0o777", "-0b111111111"), nc(-327, "-327", "-0x147", "-0o507", "-0b101000111"), nc(-257, "-257", "-0x101", "-0o401", "-0b100000001"), nc(-256, "-256", "-0x100", "-0o400", "-0b100000000"), nc(-255, "-255", "-0xff", "-0o377", "-0b11111111"), nc(-129, "-129", "-0x81", "-0o201", "-0b10000001"), nc(-128, "-128", "-0x80", "-0o200", "-0b10000000"), nc(-127, "-127", "-0x7f", "-0o177", "-0b1111111"), nc(-101, "-101", "-0x65", "-0o145", "-0b1100101"), nc(-100, "-100", "-0x64", "-0o144", "-0b1100100"), nc(-99, "-99", "-0x63", "-0o143", "-0b1100011"), nc(-65, "-65", "-0x41", "-0o101", "-0b1000001"), nc(-64, "-64", "-0x40", "-0o100", "-0b1000000"), nc(-63, "-63", "-0x3f", "-0o77", "-0b111111"), nc(-33, "-33", "-0x21", "-0o41", "-0b100001"), nc(-32, "-32", "-0x20", "-0o40", "-0b100000"), nc(-31, "-31", "-0x1f", "-0o37", "-0b11111"), nc(-17, "-17", "-0x11", "-0o21", "-0b10001"), nc(-16, "-16", "-0x10", "-0o20", "-0b10000"), nc(-15, "-15", "-0xf", "-0o17", "-0b1111"), nc(-11, "-11", "-0xb", "-0o13", "-0b1011"), nc(-10, "-10", "-0xa", "-0o12", "-0b1010"), nc(-9, "-9", "-0x9", "-0o11", "-0b1001"), nc(-8, "-8", "-0x8", "-0o10", "-0b1000"), nc(-7, "-7", "-0x7", "-0o7", "-0b111"), nc(-6, "-6", "-0x6", "-0o6", "-0b110"), nc(-5, "-5", "-0x5", "-0o5", "-0b101"), nc(-4, "-4", "-0x4", "-0o4", "-0b100"), nc(-3, "-3", "-0x3", "-0o3", "-0b11"), nc(-2, "-2", "-0x2", "-0o2", "-0b10"), nc(-1, "-1", "-0x1", "-0o1", "-0b1"), nc(0, "0", "0x0", "0o0", "0b0"), nc(1, "1", "0x1", "0o1", "0b1"), nc(2, "2", "0x2", "0o2", "0b10"), nc(3, "3", "0x3", "0o3", "0b11"), nc(4, "4", "0x4", "0o4", "0b100"), nc(5, "5", "0x5", "0o5", "0b101"), nc(6, "6", "0x6", "0o6", "0b110"), nc(7, "7", "0x7", "0o7", "0b111"), nc(8, "8", "0x8", "0o10", "0b1000"), nc(9, "9", "0x9", "0o11", "0b1001"), nc(10, "10", "0xa", "0o12", "0b1010"), nc(11, "11", "0xb", "0o13", "0b1011"), nc(15, "15", "0xf", "0o17", "0b1111"), nc(16, "16", "0x10", "0o20", "0b10000"), nc(17, "17", "0x11", "0o21", "0b10001"), nc(31, "31", "0x1f", "0o37", "0b11111"), nc(32, "32", "0x20", "0o40", "0b100000"), nc(33, "33", "0x21", "0o41", "0b100001"), nc(63, "63", "0x3f", "0o77", "0b111111"), nc(64, "64", "0x40", "0o100", "0b1000000"), nc(65, "65", "0x41", "0o101", "0b1000001"), nc(99, "99", "0x63", "0o143", "0b1100011"), nc(100, "100", "0x64", "0o144", "0b1100100"), nc(101, "101", "0x65", "0o145", "0b1100101"), nc(127, "127", "0x7f", "0o177", "0b1111111"), nc(128, "128", "0x80", "0o200", "0b10000000"), nc(129, "129", "0x81", "0o201", "0b10000001"), nc(255, "255", "0xff", "0o377", "0b11111111"), nc(256, "256", "0x100", "0o400", "0b100000000"), nc(257, "257", "0x101", "0o401", "0b100000001"), nc(326, "326", "0x146", "0o506", "0b101000110"), nc(327, "327", "0x147", "0o507", "0b101000111"), nc(328, "328", "0x148", "0o510", "0b101001000"), nc(511, "511", "0x1ff", "0o777", "0b111111111"), nc(512, "512", "0x200", "0o1000", "0b1000000000"), nc(513, "513", "0x201", "0o1001", "0b1000000001"), nc(999, "999", "0x3e7", "0o1747", "0b1111100111"), nc(1000, "1000", "0x3e8", "0o1750", "0b1111101000"), nc(1001, "1001", "0x3e9", "0o1751", "0b1111101001"), nc(1023, "1023", "0x3ff", "0o1777", "0b1111111111"), nc(1024, "1024", "0x400", "0o2000", "0b10000000000"), nc(1025, "1025", "0x401", "0o2001", "0b10000000001"), nc(2047, "2047", "0x7ff", "0o3777", "0b11111111111"), nc(2048, "2048", "0x800", "0o4000", "0b100000000000"), nc(2049, "2049", "0x801", "0o4001", "0b100000000001"), nc(3275, "3275", "0xccb", "0o6313", "0b110011001011"), nc(3276, "3276", "0xccc", "0o6314", "0b110011001100"), nc(3277, "3277", "0xccd", "0o6315", "0b110011001101"), nc(4095, "4095", "0xfff", "0o7777", "0b111111111111"), nc(4096, "4096", "0x1000", "0o10000", "0b1000000000000"), nc(4097, "4097", "0x1001", "0o10001", "0b1000000000001"), nc(8191, "8191", "0x1fff", "0o17777", "0b1111111111111"), nc(8192, "8192", "0x2000", "0o20000", "0b10000000000000"), nc(8193, "8193", "0x2001", "0o20001", "0b10000000000001"), nc(9999, "9999", "0x270f", "0o23417", "0b10011100001111"), nc(10000, "10000", "0x2710", "0o23420", "0b10011100010000"), nc(10001, "10001", "0x2711", "0o23421", "0b10011100010001"), nc(16383, "16383", "0x3fff", "0o37777", "0b11111111111111"), nc(16384, "16384", "0x4000", "0o40000", "0b100000000000000"), nc(16385, "16385", "0x4001", "0o40001", "0b100000000000001"), nc(32762, "32762", "0x7ffa", "0o77772", "0b111111111111010"), nc(32763, "32763", "0x7ffb", "0o77773", "0b111111111111011"), nc(32764, "32764", "0x7ffc", "0o77774", "0b111111111111100"), nc(32765, "32765", "0x7ffd", "0o77775", "0b111111111111101"), pc(32766, "32766", "0x7ffe", "0o77776", "0b111111111111110", 32767), pc(32767, "32767", "0x7fff", "0o77777", "0b111111111111111", -32768), #undef nc #undef pc }; }; template<> struct numbers { using value_type = uint16_t; static C4_INLINE_CONSTEXPR const number_case vals[] = { #define nc(val, dec, hex, bin, oct) nc_(UINT16_C, val, dec, hex, bin, oct) #define pc(val, dec, hex, bin, oct, valp1) ncp_(UINT16_C, val, dec, hex, bin, oct, valp1) pc(0, "0", "0x0", "0o0", "0b0", 1), nc(1, "1", "0x1", "0o1", "0b1"), nc(2, "2", "0x2", "0o2", "0b10"), nc(3, "3", "0x3", "0o3", "0b11"), nc(4, "4", "0x4", "0o4", "0b100"), nc(5, "5", "0x5", "0o5", "0b101"), nc(6, "6", "0x6", "0o6", "0b110"), nc(7, "7", "0x7", "0o7", "0b111"), nc(8, "8", "0x8", "0o10", "0b1000"), nc(9, "9", "0x9", "0o11", "0b1001"), nc(10, "10", "0xa", "0o12", "0b1010"), nc(11, "11", "0xb", "0o13", "0b1011"), nc(15, "15", "0xf", "0o17", "0b1111"), nc(16, "16", "0x10", "0o20", "0b10000"), nc(17, "17", "0x11", "0o21", "0b10001"), nc(31, "31", "0x1f", "0o37", "0b11111"), nc(32, "32", "0x20", "0o40", "0b100000"), nc(33, "33", "0x21", "0o41", "0b100001"), nc(63, "63", "0x3f", "0o77", "0b111111"), nc(64, "64", "0x40", "0o100", "0b1000000"), nc(65, "65", "0x41", "0o101", "0b1000001"), nc(66, "66", "0x42", "0o102", "0b1000010"), nc(99, "99", "0x63", "0o143", "0b1100011"), nc(100, "100", "0x64", "0o144", "0b1100100"), nc(101, "101", "0x65", "0o145", "0b1100101"), nc(127, "127", "0x7f", "0o177", "0b1111111"), nc(128, "128", "0x80", "0o200", "0b10000000"), nc(129, "129", "0x81", "0o201", "0b10000001"), nc(255, "255", "0xff", "0o377", "0b11111111"), nc(256, "256", "0x100", "0o400", "0b100000000"), nc(257, "257", "0x101", "0o401", "0b100000001"), nc(511, "511", "0x1ff", "0o777", "0b111111111"), nc(512, "512", "0x200", "0o1000", "0b1000000000"), nc(513, "513", "0x201", "0o1001", "0b1000000001"), nc(654, "654", "0x28e", "0o1216", "0b1010001110"), nc(655, "655", "0x28f", "0o1217", "0b1010001111"), nc(656, "656", "0x290", "0o1220", "0b1010010000"), nc(999, "999", "0x3e7", "0o1747", "0b1111100111"), nc(1000, "1000", "0x3e8", "0o1750", "0b1111101000"), nc(1001, "1001", "0x3e9", "0o1751", "0b1111101001"), nc(1023, "1023", "0x3ff", "0o1777", "0b1111111111"), nc(1024, "1024", "0x400", "0o2000", "0b10000000000"), nc(1025, "1025", "0x401", "0o2001", "0b10000000001"), nc(2047, "2047", "0x7ff", "0o3777", "0b11111111111"), nc(2048, "2048", "0x800", "0o4000", "0b100000000000"), nc(2049, "2049", "0x801", "0o4001", "0b100000000001"), nc(4095, "4095", "0xfff", "0o7777", "0b111111111111"), nc(4096, "4096", "0x1000", "0o10000", "0b1000000000000"), nc(4097, "4097", "0x1001", "0o10001", "0b1000000000001"), nc(6552, "6552", "0x1998", "0o14630", "0b1100110011000"), nc(6553, "6553", "0x1999", "0o14631", "0b1100110011001"), nc(6554, "6554", "0x199a", "0o14632", "0b1100110011010"), nc(8191, "8191", "0x1fff", "0o17777", "0b1111111111111"), nc(8192, "8192", "0x2000", "0o20000", "0b10000000000000"), nc(8193, "8193", "0x2001", "0o20001", "0b10000000000001"), nc(9999, "9999", "0x270f", "0o23417", "0b10011100001111"), nc(10000, "10000", "0x2710", "0o23420", "0b10011100010000"), nc(10001, "10001", "0x2711", "0o23421", "0b10011100010001"), nc(16383, "16383", "0x3fff", "0o37777", "0b11111111111111"), nc(16384, "16384", "0x4000", "0o40000", "0b100000000000000"), nc(16385, "16385", "0x4001", "0o40001", "0b100000000000001"), nc(32767, "32767", "0x7fff", "0o77777", "0b111111111111111"), nc(32768, "32768", "0x8000", "0o100000", "0b1000000000000000"), nc(32769, "32769", "0x8001", "0o100001", "0b1000000000000001"), nc(65531, "65531", "0xfffb", "0o177773", "0b1111111111111011"), nc(65532, "65532", "0xfffc", "0o177774", "0b1111111111111100"), nc(65533, "65533", "0xfffd", "0o177775", "0b1111111111111101"), pc(65534, "65534", "0xfffe", "0o177776", "0b1111111111111110", 65535), pc(65535, "65535", "0xffff", "0o177777", "0b1111111111111111", 0), #undef nc #undef pc }; }; template<> struct numbers { using value_type = int32_t; static C4_INLINE_CONSTEXPR const number_case vals[] = { #define nc(val, dec, hex, bin, oct) nc_(INT32_C, val, dec, hex, bin, oct) #define pc(val, dec, hex, bin, oct, valp1) ncp_(INT32_C, val, dec, hex, bin, oct, valp1) nc(-2147483648, "-2147483648", "-0x80000000", "-0o20000000000", "-0b10000000000000000000000000000000"), nc(-2147483647, "-2147483647", "-0x7fffffff", "-0o17777777777", "-0b1111111111111111111111111111111"), nc(-2147483646, "-2147483646", "-0x7ffffffe", "-0o17777777776", "-0b1111111111111111111111111111110"), nc(-2147483645, "-2147483645", "-0x7ffffffd", "-0o17777777775", "-0b1111111111111111111111111111101"), nc(-2147483644, "-2147483644", "-0x7ffffffc", "-0o17777777774", "-0b1111111111111111111111111111100"), nc(-2147483643, "-2147483643", "-0x7ffffffb", "-0o17777777773", "-0b1111111111111111111111111111011"), nc(-1073741825, "-1073741825", "-0x40000001", "-0o10000000001", "-0b1000000000000000000000000000001"), nc(-1073741824, "-1073741824", "-0x40000000", "-0o10000000000", "-0b1000000000000000000000000000000"), nc(-1073741823, "-1073741823", "-0x3fffffff", "-0o7777777777", "-0b111111111111111111111111111111"), nc(-1000000001, "-1000000001", "-0x3b9aca01", "-0o7346545001", "-0b111011100110101100101000000001"), nc(-1000000000, "-1000000000", "-0x3b9aca00", "-0o7346545000", "-0b111011100110101100101000000000"), nc(-999999999, "-999999999", "-0x3b9ac9ff", "-0o7346544777", "-0b111011100110101100100111111111"), nc(-536870913, "-536870913", "-0x20000001", "-0o4000000001", "-0b100000000000000000000000000001"), nc(-536870912, "-536870912", "-0x20000000", "-0o4000000000", "-0b100000000000000000000000000000"), nc(-536870911, "-536870911", "-0x1fffffff", "-0o3777777777", "-0b11111111111111111111111111111"), nc(-268435457, "-268435457", "-0x10000001", "-0o2000000001", "-0b10000000000000000000000000001"), nc(-268435456, "-268435456", "-0x10000000", "-0o2000000000", "-0b10000000000000000000000000000"), nc(-268435455, "-268435455", "-0xfffffff", "-0o1777777777", "-0b1111111111111111111111111111"), nc(-214748364, "-214748364", "-0xccccccc", "-0o1463146314", "-0b1100110011001100110011001100"), nc(-134217729, "-134217729", "-0x8000001", "-0o1000000001", "-0b1000000000000000000000000001"), nc(-134217728, "-134217728", "-0x8000000", "-0o1000000000", "-0b1000000000000000000000000000"), nc(-134217727, "-134217727", "-0x7ffffff", "-0o777777777", "-0b111111111111111111111111111"), nc(-100000001, "-100000001", "-0x5f5e101", "-0o575360401", "-0b101111101011110000100000001"), nc(-100000000, "-100000000", "-0x5f5e100", "-0o575360400", "-0b101111101011110000100000000"), nc(-99999999, "-99999999", "-0x5f5e0ff", "-0o575360377", "-0b101111101011110000011111111"), nc(-67108865, "-67108865", "-0x4000001", "-0o400000001", "-0b100000000000000000000000001"), nc(-67108864, "-67108864", "-0x4000000", "-0o400000000", "-0b100000000000000000000000000"), nc(-67108863, "-67108863", "-0x3ffffff", "-0o377777777", "-0b11111111111111111111111111"), nc(-33554433, "-33554433", "-0x2000001", "-0o200000001", "-0b10000000000000000000000001"), nc(-33554432, "-33554432", "-0x2000000", "-0o200000000", "-0b10000000000000000000000000"), nc(-33554431, "-33554431", "-0x1ffffff", "-0o177777777", "-0b1111111111111111111111111"), nc(-21474836, "-21474836", "-0x147ae14", "-0o121727024", "-0b1010001111010111000010100"), nc(-16777217, "-16777217", "-0x1000001", "-0o100000001", "-0b1000000000000000000000001"), nc(-16777216, "-16777216", "-0x1000000", "-0o100000000", "-0b1000000000000000000000000"), nc(-16777215, "-16777215", "-0xffffff", "-0o77777777", "-0b111111111111111111111111"), nc(-10000001, "-10000001", "-0x989681", "-0o46113201", "-0b100110001001011010000001"), nc(-10000000, "-10000000", "-0x989680", "-0o46113200", "-0b100110001001011010000000"), nc(-9999999, "-9999999", "-0x98967f", "-0o46113177", "-0b100110001001011001111111"), nc(-8388609, "-8388609", "-0x800001", "-0o40000001", "-0b100000000000000000000001"), nc(-8388608, "-8388608", "-0x800000", "-0o40000000", "-0b100000000000000000000000"), nc(-8388607, "-8388607", "-0x7fffff", "-0o37777777", "-0b11111111111111111111111"), nc(-4194305, "-4194305", "-0x400001", "-0o20000001", "-0b10000000000000000000001"), nc(-4194304, "-4194304", "-0x400000", "-0o20000000", "-0b10000000000000000000000"), nc(-4194303, "-4194303", "-0x3fffff", "-0o17777777", "-0b1111111111111111111111"), nc(-2147483, "-2147483", "-0x20c49b", "-0o10142233", "-0b1000001100010010011011"), nc(-2097153, "-2097153", "-0x200001", "-0o10000001", "-0b1000000000000000000001"), nc(-2097152, "-2097152", "-0x200000", "-0o10000000", "-0b1000000000000000000000"), nc(-2097151, "-2097151", "-0x1fffff", "-0o7777777", "-0b111111111111111111111"), nc(-1048577, "-1048577", "-0x100001", "-0o4000001", "-0b100000000000000000001"), nc(-1048576, "-1048576", "-0x100000", "-0o4000000", "-0b100000000000000000000"), nc(-1048575, "-1048575", "-0xfffff", "-0o3777777", "-0b11111111111111111111"), nc(-1000001, "-1000001", "-0xf4241", "-0o3641101", "-0b11110100001001000001"), nc(-1000000, "-1000000", "-0xf4240", "-0o3641100", "-0b11110100001001000000"), nc(-999999, "-999999", "-0xf423f", "-0o3641077", "-0b11110100001000111111"), nc(-524289, "-524289", "-0x80001", "-0o2000001", "-0b10000000000000000001"), nc(-524288, "-524288", "-0x80000", "-0o2000000", "-0b10000000000000000000"), nc(-524287, "-524287", "-0x7ffff", "-0o1777777", "-0b1111111111111111111"), nc(-262145, "-262145", "-0x40001", "-0o1000001", "-0b1000000000000000001"), nc(-262144, "-262144", "-0x40000", "-0o1000000", "-0b1000000000000000000"), nc(-262143, "-262143", "-0x3ffff", "-0o777777", "-0b111111111111111111"), nc(-214748, "-214748", "-0x346dc", "-0o643334", "-0b110100011011011100"), nc(-131073, "-131073", "-0x20001", "-0o400001", "-0b100000000000000001"), nc(-131072, "-131072", "-0x20000", "-0o400000", "-0b100000000000000000"), nc(-131071, "-131071", "-0x1ffff", "-0o377777", "-0b11111111111111111"), nc(-100001, "-100001", "-0x186a1", "-0o303241", "-0b11000011010100001"), nc(-100000, "-100000", "-0x186a0", "-0o303240", "-0b11000011010100000"), nc(-99999, "-99999", "-0x1869f", "-0o303237", "-0b11000011010011111"), nc(-65537, "-65537", "-0x10001", "-0o200001", "-0b10000000000000001"), nc(-65536, "-65536", "-0x10000", "-0o200000", "-0b10000000000000000"), nc(-65535, "-65535", "-0xffff", "-0o177777", "-0b1111111111111111"), nc(-32769, "-32769", "-0x8001", "-0o100001", "-0b1000000000000001"), nc(-32768, "-32768", "-0x8000", "-0o100000", "-0b1000000000000000"), nc(-32767, "-32767", "-0x7fff", "-0o77777", "-0b111111111111111"), nc(-21474, "-21474", "-0x53e2", "-0o51742", "-0b101001111100010"), nc(-16385, "-16385", "-0x4001", "-0o40001", "-0b100000000000001"), nc(-16384, "-16384", "-0x4000", "-0o40000", "-0b100000000000000"), nc(-16383, "-16383", "-0x3fff", "-0o37777", "-0b11111111111111"), nc(-10001, "-10001", "-0x2711", "-0o23421", "-0b10011100010001"), nc(-10000, "-10000", "-0x2710", "-0o23420", "-0b10011100010000"), nc(-9999, "-9999", "-0x270f", "-0o23417", "-0b10011100001111"), nc(-8193, "-8193", "-0x2001", "-0o20001", "-0b10000000000001"), nc(-8192, "-8192", "-0x2000", "-0o20000", "-0b10000000000000"), nc(-8191, "-8191", "-0x1fff", "-0o17777", "-0b1111111111111"), nc(-4097, "-4097", "-0x1001", "-0o10001", "-0b1000000000001"), nc(-4096, "-4096", "-0x1000", "-0o10000", "-0b1000000000000"), nc(-4095, "-4095", "-0xfff", "-0o7777", "-0b111111111111"), nc(-2147, "-2147", "-0x863", "-0o4143", "-0b100001100011"), nc(-2049, "-2049", "-0x801", "-0o4001", "-0b100000000001"), nc(-2048, "-2048", "-0x800", "-0o4000", "-0b100000000000"), nc(-2047, "-2047", "-0x7ff", "-0o3777", "-0b11111111111"), nc(-1025, "-1025", "-0x401", "-0o2001", "-0b10000000001"), nc(-1024, "-1024", "-0x400", "-0o2000", "-0b10000000000"), nc(-1023, "-1023", "-0x3ff", "-0o1777", "-0b1111111111"), nc(-1001, "-1001", "-0x3e9", "-0o1751", "-0b1111101001"), nc(-1000, "-1000", "-0x3e8", "-0o1750", "-0b1111101000"), nc(-999, "-999", "-0x3e7", "-0o1747", "-0b1111100111"), nc(-513, "-513", "-0x201", "-0o1001", "-0b1000000001"), nc(-512, "-512", "-0x200", "-0o1000", "-0b1000000000"), nc(-511, "-511", "-0x1ff", "-0o777", "-0b111111111"), nc(-257, "-257", "-0x101", "-0o401", "-0b100000001"), nc(-256, "-256", "-0x100", "-0o400", "-0b100000000"), nc(-255, "-255", "-0xff", "-0o377", "-0b11111111"), nc(-214, "-214", "-0xd6", "-0o326", "-0b11010110"), nc(-129, "-129", "-0x81", "-0o201", "-0b10000001"), nc(-128, "-128", "-0x80", "-0o200", "-0b10000000"), nc(-127, "-127", "-0x7f", "-0o177", "-0b1111111"), nc(-101, "-101", "-0x65", "-0o145", "-0b1100101"), nc(-100, "-100", "-0x64", "-0o144", "-0b1100100"), nc(-99, "-99", "-0x63", "-0o143", "-0b1100011"), nc(-65, "-65", "-0x41", "-0o101", "-0b1000001"), nc(-64, "-64", "-0x40", "-0o100", "-0b1000000"), nc(-63, "-63", "-0x3f", "-0o77", "-0b111111"), nc(-33, "-33", "-0x21", "-0o41", "-0b100001"), nc(-32, "-32", "-0x20", "-0o40", "-0b100000"), nc(-31, "-31", "-0x1f", "-0o37", "-0b11111"), nc(-21, "-21", "-0x15", "-0o25", "-0b10101"), nc(-17, "-17", "-0x11", "-0o21", "-0b10001"), nc(-16, "-16", "-0x10", "-0o20", "-0b10000"), nc(-15, "-15", "-0xf", "-0o17", "-0b1111"), nc(-11, "-11", "-0xb", "-0o13", "-0b1011"), nc(-10, "-10", "-0xa", "-0o12", "-0b1010"), nc(-9, "-9", "-0x9", "-0o11", "-0b1001"), nc(-8, "-8", "-0x8", "-0o10", "-0b1000"), nc(-7, "-7", "-0x7", "-0o7", "-0b111"), nc(-6, "-6", "-0x6", "-0o6", "-0b110"), nc(-5, "-5", "-0x5", "-0o5", "-0b101"), nc(-4, "-4", "-0x4", "-0o4", "-0b100"), nc(-3, "-3", "-0x3", "-0o3", "-0b11"), nc(-2, "-2", "-0x2", "-0o2", "-0b10"), nc(-1, "-1", "-0x1", "-0o1", "-0b1"), nc(0, "0", "0x0", "0o0", "0b0"), nc(1, "1", "0x1", "0o1", "0b1"), nc(2, "2", "0x2", "0o2", "0b10"), nc(3, "3", "0x3", "0o3", "0b11"), nc(4, "4", "0x4", "0o4", "0b100"), nc(5, "5", "0x5", "0o5", "0b101"), nc(6, "6", "0x6", "0o6", "0b110"), nc(7, "7", "0x7", "0o7", "0b111"), nc(8, "8", "0x8", "0o10", "0b1000"), nc(9, "9", "0x9", "0o11", "0b1001"), nc(10, "10", "0xa", "0o12", "0b1010"), nc(11, "11", "0xb", "0o13", "0b1011"), nc(15, "15", "0xf", "0o17", "0b1111"), nc(16, "16", "0x10", "0o20", "0b10000"), nc(17, "17", "0x11", "0o21", "0b10001"), nc(20, "20", "0x14", "0o24", "0b10100"), nc(21, "21", "0x15", "0o25", "0b10101"), nc(22, "22", "0x16", "0o26", "0b10110"), nc(31, "31", "0x1f", "0o37", "0b11111"), nc(32, "32", "0x20", "0o40", "0b100000"), nc(33, "33", "0x21", "0o41", "0b100001"), nc(63, "63", "0x3f", "0o77", "0b111111"), nc(64, "64", "0x40", "0o100", "0b1000000"), nc(65, "65", "0x41", "0o101", "0b1000001"), nc(99, "99", "0x63", "0o143", "0b1100011"), nc(100, "100", "0x64", "0o144", "0b1100100"), nc(101, "101", "0x65", "0o145", "0b1100101"), nc(127, "127", "0x7f", "0o177", "0b1111111"), nc(128, "128", "0x80", "0o200", "0b10000000"), nc(129, "129", "0x81", "0o201", "0b10000001"), nc(213, "213", "0xd5", "0o325", "0b11010101"), nc(214, "214", "0xd6", "0o326", "0b11010110"), nc(215, "215", "0xd7", "0o327", "0b11010111"), nc(255, "255", "0xff", "0o377", "0b11111111"), nc(256, "256", "0x100", "0o400", "0b100000000"), nc(257, "257", "0x101", "0o401", "0b100000001"), nc(511, "511", "0x1ff", "0o777", "0b111111111"), nc(512, "512", "0x200", "0o1000", "0b1000000000"), nc(513, "513", "0x201", "0o1001", "0b1000000001"), nc(999, "999", "0x3e7", "0o1747", "0b1111100111"), nc(1000, "1000", "0x3e8", "0o1750", "0b1111101000"), nc(1001, "1001", "0x3e9", "0o1751", "0b1111101001"), nc(1023, "1023", "0x3ff", "0o1777", "0b1111111111"), nc(1024, "1024", "0x400", "0o2000", "0b10000000000"), nc(1025, "1025", "0x401", "0o2001", "0b10000000001"), nc(2047, "2047", "0x7ff", "0o3777", "0b11111111111"), nc(2048, "2048", "0x800", "0o4000", "0b100000000000"), nc(2049, "2049", "0x801", "0o4001", "0b100000000001"), nc(2146, "2146", "0x862", "0o4142", "0b100001100010"), nc(2147, "2147", "0x863", "0o4143", "0b100001100011"), nc(2148, "2148", "0x864", "0o4144", "0b100001100100"), nc(4095, "4095", "0xfff", "0o7777", "0b111111111111"), nc(4096, "4096", "0x1000", "0o10000", "0b1000000000000"), nc(4097, "4097", "0x1001", "0o10001", "0b1000000000001"), nc(8191, "8191", "0x1fff", "0o17777", "0b1111111111111"), nc(8192, "8192", "0x2000", "0o20000", "0b10000000000000"), nc(8193, "8193", "0x2001", "0o20001", "0b10000000000001"), nc(9999, "9999", "0x270f", "0o23417", "0b10011100001111"), nc(10000, "10000", "0x2710", "0o23420", "0b10011100010000"), nc(10001, "10001", "0x2711", "0o23421", "0b10011100010001"), nc(16383, "16383", "0x3fff", "0o37777", "0b11111111111111"), nc(16384, "16384", "0x4000", "0o40000", "0b100000000000000"), nc(16385, "16385", "0x4001", "0o40001", "0b100000000000001"), nc(21473, "21473", "0x53e1", "0o51741", "0b101001111100001"), nc(21474, "21474", "0x53e2", "0o51742", "0b101001111100010"), nc(21475, "21475", "0x53e3", "0o51743", "0b101001111100011"), nc(32767, "32767", "0x7fff", "0o77777", "0b111111111111111"), nc(32768, "32768", "0x8000", "0o100000", "0b1000000000000000"), nc(32769, "32769", "0x8001", "0o100001", "0b1000000000000001"), nc(65535, "65535", "0xffff", "0o177777", "0b1111111111111111"), nc(65536, "65536", "0x10000", "0o200000", "0b10000000000000000"), nc(65537, "65537", "0x10001", "0o200001", "0b10000000000000001"), nc(99999, "99999", "0x1869f", "0o303237", "0b11000011010011111"), nc(100000, "100000", "0x186a0", "0o303240", "0b11000011010100000"), nc(100001, "100001", "0x186a1", "0o303241", "0b11000011010100001"), nc(131071, "131071", "0x1ffff", "0o377777", "0b11111111111111111"), nc(131072, "131072", "0x20000", "0o400000", "0b100000000000000000"), nc(131073, "131073", "0x20001", "0o400001", "0b100000000000000001"), nc(214747, "214747", "0x346db", "0o643333", "0b110100011011011011"), nc(214748, "214748", "0x346dc", "0o643334", "0b110100011011011100"), nc(214749, "214749", "0x346dd", "0o643335", "0b110100011011011101"), nc(262143, "262143", "0x3ffff", "0o777777", "0b111111111111111111"), nc(262144, "262144", "0x40000", "0o1000000", "0b1000000000000000000"), nc(262145, "262145", "0x40001", "0o1000001", "0b1000000000000000001"), nc(524287, "524287", "0x7ffff", "0o1777777", "0b1111111111111111111"), nc(524288, "524288", "0x80000", "0o2000000", "0b10000000000000000000"), nc(524289, "524289", "0x80001", "0o2000001", "0b10000000000000000001"), nc(999999, "999999", "0xf423f", "0o3641077", "0b11110100001000111111"), nc(1000000, "1000000", "0xf4240", "0o3641100", "0b11110100001001000000"), nc(1000001, "1000001", "0xf4241", "0o3641101", "0b11110100001001000001"), nc(1048575, "1048575", "0xfffff", "0o3777777", "0b11111111111111111111"), nc(1048576, "1048576", "0x100000", "0o4000000", "0b100000000000000000000"), nc(1048577, "1048577", "0x100001", "0o4000001", "0b100000000000000000001"), nc(2097151, "2097151", "0x1fffff", "0o7777777", "0b111111111111111111111"), nc(2097152, "2097152", "0x200000", "0o10000000", "0b1000000000000000000000"), nc(2097153, "2097153", "0x200001", "0o10000001", "0b1000000000000000000001"), nc(2147482, "2147482", "0x20c49a", "0o10142232", "0b1000001100010010011010"), nc(2147483, "2147483", "0x20c49b", "0o10142233", "0b1000001100010010011011"), nc(2147484, "2147484", "0x20c49c", "0o10142234", "0b1000001100010010011100"), nc(4194303, "4194303", "0x3fffff", "0o17777777", "0b1111111111111111111111"), nc(4194304, "4194304", "0x400000", "0o20000000", "0b10000000000000000000000"), nc(4194305, "4194305", "0x400001", "0o20000001", "0b10000000000000000000001"), nc(8388607, "8388607", "0x7fffff", "0o37777777", "0b11111111111111111111111"), nc(8388608, "8388608", "0x800000", "0o40000000", "0b100000000000000000000000"), nc(8388609, "8388609", "0x800001", "0o40000001", "0b100000000000000000000001"), nc(9999999, "9999999", "0x98967f", "0o46113177", "0b100110001001011001111111"), nc(10000000, "10000000", "0x989680", "0o46113200", "0b100110001001011010000000"), nc(10000001, "10000001", "0x989681", "0o46113201", "0b100110001001011010000001"), nc(16777215, "16777215", "0xffffff", "0o77777777", "0b111111111111111111111111"), nc(16777216, "16777216", "0x1000000", "0o100000000", "0b1000000000000000000000000"), nc(16777217, "16777217", "0x1000001", "0o100000001", "0b1000000000000000000000001"), nc(21474835, "21474835", "0x147ae13", "0o121727023", "0b1010001111010111000010011"), nc(21474836, "21474836", "0x147ae14", "0o121727024", "0b1010001111010111000010100"), nc(21474837, "21474837", "0x147ae15", "0o121727025", "0b1010001111010111000010101"), nc(33554431, "33554431", "0x1ffffff", "0o177777777", "0b1111111111111111111111111"), nc(33554432, "33554432", "0x2000000", "0o200000000", "0b10000000000000000000000000"), nc(33554433, "33554433", "0x2000001", "0o200000001", "0b10000000000000000000000001"), nc(67108863, "67108863", "0x3ffffff", "0o377777777", "0b11111111111111111111111111"), nc(67108864, "67108864", "0x4000000", "0o400000000", "0b100000000000000000000000000"), nc(67108865, "67108865", "0x4000001", "0o400000001", "0b100000000000000000000000001"), nc(99999999, "99999999", "0x5f5e0ff", "0o575360377", "0b101111101011110000011111111"), nc(100000000, "100000000", "0x5f5e100", "0o575360400", "0b101111101011110000100000000"), nc(100000001, "100000001", "0x5f5e101", "0o575360401", "0b101111101011110000100000001"), nc(134217727, "134217727", "0x7ffffff", "0o777777777", "0b111111111111111111111111111"), nc(134217728, "134217728", "0x8000000", "0o1000000000", "0b1000000000000000000000000000"), nc(134217729, "134217729", "0x8000001", "0o1000000001", "0b1000000000000000000000000001"), nc(214748363, "214748363", "0xccccccb", "0o1463146313", "0b1100110011001100110011001011"), nc(214748364, "214748364", "0xccccccc", "0o1463146314", "0b1100110011001100110011001100"), nc(214748365, "214748365", "0xccccccd", "0o1463146315", "0b1100110011001100110011001101"), nc(268435455, "268435455", "0xfffffff", "0o1777777777", "0b1111111111111111111111111111"), nc(268435456, "268435456", "0x10000000", "0o2000000000", "0b10000000000000000000000000000"), nc(268435457, "268435457", "0x10000001", "0o2000000001", "0b10000000000000000000000000001"), nc(536870911, "536870911", "0x1fffffff", "0o3777777777", "0b11111111111111111111111111111"), nc(536870912, "536870912", "0x20000000", "0o4000000000", "0b100000000000000000000000000000"), nc(536870913, "536870913", "0x20000001", "0o4000000001", "0b100000000000000000000000000001"), nc(999999999, "999999999", "0x3b9ac9ff", "0o7346544777", "0b111011100110101100100111111111"), nc(1000000000, "1000000000", "0x3b9aca00", "0o7346545000", "0b111011100110101100101000000000"), nc(1000000001, "1000000001", "0x3b9aca01", "0o7346545001", "0b111011100110101100101000000001"), nc(1073741823, "1073741823", "0x3fffffff", "0o7777777777", "0b111111111111111111111111111111"), nc(1073741824, "1073741824", "0x40000000", "0o10000000000", "0b1000000000000000000000000000000"), nc(1073741825, "1073741825", "0x40000001", "0o10000000001", "0b1000000000000000000000000000001"), nc(2147483642, "2147483642", "0x7ffffffa", "0o17777777772", "0b1111111111111111111111111111010"), nc(2147483643, "2147483643", "0x7ffffffb", "0o17777777773", "0b1111111111111111111111111111011"), nc(2147483644, "2147483644", "0x7ffffffc", "0o17777777774", "0b1111111111111111111111111111100"), nc(2147483645, "2147483645", "0x7ffffffd", "0o17777777775", "0b1111111111111111111111111111101"), pc(2147483646, "2147483646", "0x7ffffffe", "0o17777777776", "0b1111111111111111111111111111110", 2147483647), pc(2147483647, "2147483647", "0x7fffffff", "0o17777777777", "0b1111111111111111111111111111111", -2147483648), #undef nc #undef pc }; }; template<> struct numbers { using value_type = uint32_t; static C4_INLINE_CONSTEXPR const number_case vals[] = { #define nc(val, dec, hex, bin, oct) nc_(UINT32_C, val, dec, hex, bin, oct) #define pc(val, dec, hex, bin, oct, valp1) ncp_(UINT32_C, val, dec, hex, bin, oct, valp1) pc(0, "0", "0x0", "0o0", "0b0", 1), nc(1, "1", "0x1", "0o1", "0b1"), nc(2, "2", "0x2", "0o2", "0b10"), nc(3, "3", "0x3", "0o3", "0b11"), nc(4, "4", "0x4", "0o4", "0b100"), nc(5, "5", "0x5", "0o5", "0b101"), nc(6, "6", "0x6", "0o6", "0b110"), nc(7, "7", "0x7", "0o7", "0b111"), nc(8, "8", "0x8", "0o10", "0b1000"), nc(9, "9", "0x9", "0o11", "0b1001"), nc(10, "10", "0xa", "0o12", "0b1010"), nc(11, "11", "0xb", "0o13", "0b1011"), nc(15, "15", "0xf", "0o17", "0b1111"), nc(16, "16", "0x10", "0o20", "0b10000"), nc(17, "17", "0x11", "0o21", "0b10001"), nc(31, "31", "0x1f", "0o37", "0b11111"), nc(32, "32", "0x20", "0o40", "0b100000"), nc(33, "33", "0x21", "0o41", "0b100001"), nc(41, "41", "0x29", "0o51", "0b101001"), nc(42, "42", "0x2a", "0o52", "0b101010"), nc(43, "43", "0x2b", "0o53", "0b101011"), nc(63, "63", "0x3f", "0o77", "0b111111"), nc(64, "64", "0x40", "0o100", "0b1000000"), nc(65, "65", "0x41", "0o101", "0b1000001"), nc(99, "99", "0x63", "0o143", "0b1100011"), nc(100, "100", "0x64", "0o144", "0b1100100"), nc(101, "101", "0x65", "0o145", "0b1100101"), nc(127, "127", "0x7f", "0o177", "0b1111111"), nc(128, "128", "0x80", "0o200", "0b10000000"), nc(129, "129", "0x81", "0o201", "0b10000001"), nc(255, "255", "0xff", "0o377", "0b11111111"), nc(256, "256", "0x100", "0o400", "0b100000000"), nc(257, "257", "0x101", "0o401", "0b100000001"), nc(428, "428", "0x1ac", "0o654", "0b110101100"), nc(429, "429", "0x1ad", "0o655", "0b110101101"), nc(430, "430", "0x1ae", "0o656", "0b110101110"), nc(511, "511", "0x1ff", "0o777", "0b111111111"), nc(512, "512", "0x200", "0o1000", "0b1000000000"), nc(513, "513", "0x201", "0o1001", "0b1000000001"), nc(999, "999", "0x3e7", "0o1747", "0b1111100111"), nc(1000, "1000", "0x3e8", "0o1750", "0b1111101000"), nc(1001, "1001", "0x3e9", "0o1751", "0b1111101001"), nc(1023, "1023", "0x3ff", "0o1777", "0b1111111111"), nc(1024, "1024", "0x400", "0o2000", "0b10000000000"), nc(1025, "1025", "0x401", "0o2001", "0b10000000001"), nc(2047, "2047", "0x7ff", "0o3777", "0b11111111111"), nc(2048, "2048", "0x800", "0o4000", "0b100000000000"), nc(2049, "2049", "0x801", "0o4001", "0b100000000001"), nc(4095, "4095", "0xfff", "0o7777", "0b111111111111"), nc(4096, "4096", "0x1000", "0o10000", "0b1000000000000"), nc(4097, "4097", "0x1001", "0o10001", "0b1000000000001"), nc(4293, "4293", "0x10c5", "0o10305", "0b1000011000101"), nc(4294, "4294", "0x10c6", "0o10306", "0b1000011000110"), nc(4295, "4295", "0x10c7", "0o10307", "0b1000011000111"), nc(8191, "8191", "0x1fff", "0o17777", "0b1111111111111"), nc(8192, "8192", "0x2000", "0o20000", "0b10000000000000"), nc(8193, "8193", "0x2001", "0o20001", "0b10000000000001"), nc(9999, "9999", "0x270f", "0o23417", "0b10011100001111"), nc(10000, "10000", "0x2710", "0o23420", "0b10011100010000"), nc(10001, "10001", "0x2711", "0o23421", "0b10011100010001"), nc(16383, "16383", "0x3fff", "0o37777", "0b11111111111111"), nc(16384, "16384", "0x4000", "0o40000", "0b100000000000000"), nc(16385, "16385", "0x4001", "0o40001", "0b100000000000001"), nc(32767, "32767", "0x7fff", "0o77777", "0b111111111111111"), nc(32768, "32768", "0x8000", "0o100000", "0b1000000000000000"), nc(32769, "32769", "0x8001", "0o100001", "0b1000000000000001"), nc(42948, "42948", "0xa7c4", "0o123704", "0b1010011111000100"), nc(42949, "42949", "0xa7c5", "0o123705", "0b1010011111000101"), nc(42950, "42950", "0xa7c6", "0o123706", "0b1010011111000110"), nc(65535, "65535", "0xffff", "0o177777", "0b1111111111111111"), nc(65536, "65536", "0x10000", "0o200000", "0b10000000000000000"), nc(65537, "65537", "0x10001", "0o200001", "0b10000000000000001"), nc(99999, "99999", "0x1869f", "0o303237", "0b11000011010011111"), nc(100000, "100000", "0x186a0", "0o303240", "0b11000011010100000"), nc(100001, "100001", "0x186a1", "0o303241", "0b11000011010100001"), nc(131071, "131071", "0x1ffff", "0o377777", "0b11111111111111111"), nc(131072, "131072", "0x20000", "0o400000", "0b100000000000000000"), nc(131073, "131073", "0x20001", "0o400001", "0b100000000000000001"), nc(262143, "262143", "0x3ffff", "0o777777", "0b111111111111111111"), nc(262144, "262144", "0x40000", "0o1000000", "0b1000000000000000000"), nc(262145, "262145", "0x40001", "0o1000001", "0b1000000000000000001"), nc(429495, "429495", "0x68db7", "0o1506667", "0b1101000110110110111"), nc(429496, "429496", "0x68db8", "0o1506670", "0b1101000110110111000"), nc(429497, "429497", "0x68db9", "0o1506671", "0b1101000110110111001"), nc(524287, "524287", "0x7ffff", "0o1777777", "0b1111111111111111111"), nc(524288, "524288", "0x80000", "0o2000000", "0b10000000000000000000"), nc(524289, "524289", "0x80001", "0o2000001", "0b10000000000000000001"), nc(999999, "999999", "0xf423f", "0o3641077", "0b11110100001000111111"), nc(1000000, "1000000", "0xf4240", "0o3641100", "0b11110100001001000000"), nc(1000001, "1000001", "0xf4241", "0o3641101", "0b11110100001001000001"), nc(1048575, "1048575", "0xfffff", "0o3777777", "0b11111111111111111111"), nc(1048576, "1048576", "0x100000", "0o4000000", "0b100000000000000000000"), nc(1048577, "1048577", "0x100001", "0o4000001", "0b100000000000000000001"), nc(2097151, "2097151", "0x1fffff", "0o7777777", "0b111111111111111111111"), nc(2097152, "2097152", "0x200000", "0o10000000", "0b1000000000000000000000"), nc(2097153, "2097153", "0x200001", "0o10000001", "0b1000000000000000000001"), nc(4194303, "4194303", "0x3fffff", "0o17777777", "0b1111111111111111111111"), nc(4194304, "4194304", "0x400000", "0o20000000", "0b10000000000000000000000"), nc(4194305, "4194305", "0x400001", "0o20000001", "0b10000000000000000000001"), nc(4294966, "4294966", "0x418936", "0o20304466", "0b10000011000100100110110"), nc(4294967, "4294967", "0x418937", "0o20304467", "0b10000011000100100110111"), nc(4294968, "4294968", "0x418938", "0o20304470", "0b10000011000100100111000"), nc(8388607, "8388607", "0x7fffff", "0o37777777", "0b11111111111111111111111"), nc(8388608, "8388608", "0x800000", "0o40000000", "0b100000000000000000000000"), nc(8388609, "8388609", "0x800001", "0o40000001", "0b100000000000000000000001"), nc(9999999, "9999999", "0x98967f", "0o46113177", "0b100110001001011001111111"), nc(10000000, "10000000", "0x989680", "0o46113200", "0b100110001001011010000000"), nc(10000001, "10000001", "0x989681", "0o46113201", "0b100110001001011010000001"), nc(16777215, "16777215", "0xffffff", "0o77777777", "0b111111111111111111111111"), nc(16777216, "16777216", "0x1000000", "0o100000000", "0b1000000000000000000000000"), nc(16777217, "16777217", "0x1000001", "0o100000001", "0b1000000000000000000000001"), nc(33554431, "33554431", "0x1ffffff", "0o177777777", "0b1111111111111111111111111"), nc(33554432, "33554432", "0x2000000", "0o200000000", "0b10000000000000000000000000"), nc(33554433, "33554433", "0x2000001", "0o200000001", "0b10000000000000000000000001"), nc(42949671, "42949671", "0x28f5c27", "0o243656047", "0b10100011110101110000100111"), nc(42949672, "42949672", "0x28f5c28", "0o243656050", "0b10100011110101110000101000"), nc(42949673, "42949673", "0x28f5c29", "0o243656051", "0b10100011110101110000101001"), nc(67108863, "67108863", "0x3ffffff", "0o377777777", "0b11111111111111111111111111"), nc(67108864, "67108864", "0x4000000", "0o400000000", "0b100000000000000000000000000"), nc(67108865, "67108865", "0x4000001", "0o400000001", "0b100000000000000000000000001"), nc(99999999, "99999999", "0x5f5e0ff", "0o575360377", "0b101111101011110000011111111"), nc(100000000, "100000000", "0x5f5e100", "0o575360400", "0b101111101011110000100000000"), nc(100000001, "100000001", "0x5f5e101", "0o575360401", "0b101111101011110000100000001"), nc(134217727, "134217727", "0x7ffffff", "0o777777777", "0b111111111111111111111111111"), nc(134217728, "134217728", "0x8000000", "0o1000000000", "0b1000000000000000000000000000"), nc(134217729, "134217729", "0x8000001", "0o1000000001", "0b1000000000000000000000000001"), nc(268435455, "268435455", "0xfffffff", "0o1777777777", "0b1111111111111111111111111111"), nc(268435456, "268435456", "0x10000000", "0o2000000000", "0b10000000000000000000000000000"), nc(268435457, "268435457", "0x10000001", "0o2000000001", "0b10000000000000000000000000001"), nc(429496728, "429496728", "0x19999998", "0o3146314630", "0b11001100110011001100110011000"), nc(429496729, "429496729", "0x19999999", "0o3146314631", "0b11001100110011001100110011001"), nc(429496730, "429496730", "0x1999999a", "0o3146314632", "0b11001100110011001100110011010"), nc(536870911, "536870911", "0x1fffffff", "0o3777777777", "0b11111111111111111111111111111"), nc(536870912, "536870912", "0x20000000", "0o4000000000", "0b100000000000000000000000000000"), nc(536870913, "536870913", "0x20000001", "0o4000000001", "0b100000000000000000000000000001"), nc(999999999, "999999999", "0x3b9ac9ff", "0o7346544777", "0b111011100110101100100111111111"), nc(1000000000, "1000000000", "0x3b9aca00", "0o7346545000", "0b111011100110101100101000000000"), nc(1000000001, "1000000001", "0x3b9aca01", "0o7346545001", "0b111011100110101100101000000001"), nc(1073741823, "1073741823", "0x3fffffff", "0o7777777777", "0b111111111111111111111111111111"), nc(1073741824, "1073741824", "0x40000000", "0o10000000000", "0b1000000000000000000000000000000"), nc(1073741825, "1073741825", "0x40000001", "0o10000000001", "0b1000000000000000000000000000001"), nc(2147483647, "2147483647", "0x7fffffff", "0o17777777777", "0b1111111111111111111111111111111"), nc(2147483648, "2147483648", "0x80000000", "0o20000000000", "0b10000000000000000000000000000000"), nc(2147483649, "2147483649", "0x80000001", "0o20000000001", "0b10000000000000000000000000000001"), pc(4294967291, "4294967291", "0xfffffffb", "0o37777777773", "0b11111111111111111111111111111011", 4294967292), pc(4294967292, "4294967292", "0xfffffffc", "0o37777777774", "0b11111111111111111111111111111100", 4294967293), pc(4294967293, "4294967293", "0xfffffffd", "0o37777777775", "0b11111111111111111111111111111101", 4294967294), pc(4294967294, "4294967294", "0xfffffffe", "0o37777777776", "0b11111111111111111111111111111110", 4294967295), pc(4294967295, "4294967295", "0xffffffff", "0o37777777777", "0b11111111111111111111111111111111", 0), #undef nc #undef pc }; }; template<> struct numbers { using value_type = int64_t; static C4_INLINE_CONSTEXPR const number_case vals[] = { #define nc(val, dec, hex, bin, oct) nc_(INT64_C, val, dec, hex, bin, oct) #define ncm1(val, dec, hex, bin, oct) nc_(INT64_1, val, dec, hex, bin, oct) #define pc(val, dec, hex, bin, oct, valp1) ncp_(INT64_C, val, dec, hex, bin, oct, valp1) #define pcm1(val, dec, hex, bin, oct, valp1) ncp__(INT64_C, val, dec, hex, bin, oct, INT64_1, valp1) ncm1(-9223372036854775807, "-9223372036854775808", "-0x8000000000000000", "-0o1000000000000000000000", "-0b1000000000000000000000000000000000000000000000000000000000000000"), nc(-9223372036854775807, "-9223372036854775807", "-0x7fffffffffffffff", "-0o777777777777777777777", "-0b111111111111111111111111111111111111111111111111111111111111111"), nc(-9223372036854775806, "-9223372036854775806", "-0x7ffffffffffffffe", "-0o777777777777777777776", "-0b111111111111111111111111111111111111111111111111111111111111110"), nc(-9223372036854775805, "-9223372036854775805", "-0x7ffffffffffffffd", "-0o777777777777777777775", "-0b111111111111111111111111111111111111111111111111111111111111101"), nc(-9223372036854775804, "-9223372036854775804", "-0x7ffffffffffffffc", "-0o777777777777777777774", "-0b111111111111111111111111111111111111111111111111111111111111100"), nc(-9223372036854775803, "-9223372036854775803", "-0x7ffffffffffffffb", "-0o777777777777777777773", "-0b111111111111111111111111111111111111111111111111111111111111011"), nc(-4611686018427387905, "-4611686018427387905", "-0x4000000000000001", "-0o400000000000000000001", "-0b100000000000000000000000000000000000000000000000000000000000001"), nc(-4611686018427387904, "-4611686018427387904", "-0x4000000000000000", "-0o400000000000000000000", "-0b100000000000000000000000000000000000000000000000000000000000000"), nc(-4611686018427387903, "-4611686018427387903", "-0x3fffffffffffffff", "-0o377777777777777777777", "-0b11111111111111111111111111111111111111111111111111111111111111"), nc(-2305843009213693953, "-2305843009213693953", "-0x2000000000000001", "-0o200000000000000000001", "-0b10000000000000000000000000000000000000000000000000000000000001"), nc(-2305843009213693952, "-2305843009213693952", "-0x2000000000000000", "-0o200000000000000000000", "-0b10000000000000000000000000000000000000000000000000000000000000"), nc(-2305843009213693951, "-2305843009213693951", "-0x1fffffffffffffff", "-0o177777777777777777777", "-0b1111111111111111111111111111111111111111111111111111111111111"), nc(-1152921504606846977, "-1152921504606846977", "-0x1000000000000001", "-0o100000000000000000001", "-0b1000000000000000000000000000000000000000000000000000000000001"), nc(-1152921504606846976, "-1152921504606846976", "-0x1000000000000000", "-0o100000000000000000000", "-0b1000000000000000000000000000000000000000000000000000000000000"), nc(-1152921504606846975, "-1152921504606846975", "-0xfffffffffffffff", "-0o77777777777777777777", "-0b111111111111111111111111111111111111111111111111111111111111"), nc(-1000000000000000001, "-1000000000000000001", "-0xde0b6b3a7640001", "-0o67405553164731000001", "-0b110111100000101101101011001110100111011001000000000000000001"), nc(-1000000000000000000, "-1000000000000000000", "-0xde0b6b3a7640000", "-0o67405553164731000000", "-0b110111100000101101101011001110100111011001000000000000000000"), nc(-999999999999999999, "-999999999999999999", "-0xde0b6b3a763ffff", "-0o67405553164730777777", "-0b110111100000101101101011001110100111011000111111111111111111"), nc(-922337203685477632, "-922337203685477632", "-0xccccccccccccd00", "-0o63146314631463146400", "-0b110011001100110011001100110011001100110011001100110100000000"), nc(-576460752303423489, "-576460752303423489", "-0x800000000000001", "-0o40000000000000000001", "-0b100000000000000000000000000000000000000000000000000000000001"), nc(-576460752303423488, "-576460752303423488", "-0x800000000000000", "-0o40000000000000000000", "-0b100000000000000000000000000000000000000000000000000000000000"), nc(-576460752303423487, "-576460752303423487", "-0x7ffffffffffffff", "-0o37777777777777777777", "-0b11111111111111111111111111111111111111111111111111111111111"), nc(-288230376151711745, "-288230376151711745", "-0x400000000000001", "-0o20000000000000000001", "-0b10000000000000000000000000000000000000000000000000000000001"), nc(-288230376151711744, "-288230376151711744", "-0x400000000000000", "-0o20000000000000000000", "-0b10000000000000000000000000000000000000000000000000000000000"), nc(-288230376151711743, "-288230376151711743", "-0x3ffffffffffffff", "-0o17777777777777777777", "-0b1111111111111111111111111111111111111111111111111111111111"), nc(-144115188075855873, "-144115188075855873", "-0x200000000000001", "-0o10000000000000000001", "-0b1000000000000000000000000000000000000000000000000000000001"), nc(-144115188075855872, "-144115188075855872", "-0x200000000000000", "-0o10000000000000000000", "-0b1000000000000000000000000000000000000000000000000000000000"), nc(-144115188075855871, "-144115188075855871", "-0x1ffffffffffffff", "-0o7777777777777777777", "-0b111111111111111111111111111111111111111111111111111111111"), nc(-100000000000000001, "-100000000000000001", "-0x16345785d8a0001", "-0o5432127413542400001", "-0b101100011010001010111100001011101100010100000000000000001"), nc(-100000000000000000, "-100000000000000000", "-0x16345785d8a0000", "-0o5432127413542400000", "-0b101100011010001010111100001011101100010100000000000000000"), nc(-99999999999999999, "-99999999999999999", "-0x16345785d89ffff", "-0o5432127413542377777", "-0b101100011010001010111100001011101100010011111111111111111"), nc(-92233720368547760, "-92233720368547760", "-0x147ae147ae147b0", "-0o5075341217270243660", "-0b101000111101011100001010001111010111000010100011110110000"), nc(-72057594037927937, "-72057594037927937", "-0x100000000000001", "-0o4000000000000000001", "-0b100000000000000000000000000000000000000000000000000000001"), nc(-72057594037927936, "-72057594037927936", "-0x100000000000000", "-0o4000000000000000000", "-0b100000000000000000000000000000000000000000000000000000000"), nc(-72057594037927935, "-72057594037927935", "-0xffffffffffffff", "-0o3777777777777777777", "-0b11111111111111111111111111111111111111111111111111111111"), nc(-36028797018963969, "-36028797018963969", "-0x80000000000001", "-0o2000000000000000001", "-0b10000000000000000000000000000000000000000000000000000001"), nc(-36028797018963968, "-36028797018963968", "-0x80000000000000", "-0o2000000000000000000", "-0b10000000000000000000000000000000000000000000000000000000"), nc(-36028797018963967, "-36028797018963967", "-0x7fffffffffffff", "-0o1777777777777777777", "-0b1111111111111111111111111111111111111111111111111111111"), nc(-18014398509481985, "-18014398509481985", "-0x40000000000001", "-0o1000000000000000001", "-0b1000000000000000000000000000000000000000000000000000001"), nc(-18014398509481984, "-18014398509481984", "-0x40000000000000", "-0o1000000000000000000", "-0b1000000000000000000000000000000000000000000000000000000"), nc(-18014398509481983, "-18014398509481983", "-0x3fffffffffffff", "-0o777777777777777777", "-0b111111111111111111111111111111111111111111111111111111"), nc(-10000000000000001, "-10000000000000001", "-0x2386f26fc10001", "-0o434157115760200001", "-0b100011100001101111001001101111110000010000000000000001"), nc(-10000000000000000, "-10000000000000000", "-0x2386f26fc10000", "-0o434157115760200000", "-0b100011100001101111001001101111110000010000000000000000"), nc(-9999999999999999, "-9999999999999999", "-0x2386f26fc0ffff", "-0o434157115760177777", "-0b100011100001101111001001101111110000001111111111111111"), nc(-9223372036854776, "-9223372036854776", "-0x20c49ba5e353f8", "-0o406111564570651770", "-0b100000110001001001101110100101111000110101001111111000"), nc(-9007199254740993, "-9007199254740993", "-0x20000000000001", "-0o400000000000000001", "-0b100000000000000000000000000000000000000000000000000001"), nc(-9007199254740992, "-9007199254740992", "-0x20000000000000", "-0o400000000000000000", "-0b100000000000000000000000000000000000000000000000000000"), nc(-9007199254740991, "-9007199254740991", "-0x1fffffffffffff", "-0o377777777777777777", "-0b11111111111111111111111111111111111111111111111111111"), nc(-4503599627370497, "-4503599627370497", "-0x10000000000001", "-0o200000000000000001", "-0b10000000000000000000000000000000000000000000000000001"), nc(-4503599627370496, "-4503599627370496", "-0x10000000000000", "-0o200000000000000000", "-0b10000000000000000000000000000000000000000000000000000"), nc(-4503599627370495, "-4503599627370495", "-0xfffffffffffff", "-0o177777777777777777", "-0b1111111111111111111111111111111111111111111111111111"), nc(-2251799813685249, "-2251799813685249", "-0x8000000000001", "-0o100000000000000001", "-0b1000000000000000000000000000000000000000000000000001"), nc(-2251799813685248, "-2251799813685248", "-0x8000000000000", "-0o100000000000000000", "-0b1000000000000000000000000000000000000000000000000000"), nc(-2251799813685247, "-2251799813685247", "-0x7ffffffffffff", "-0o77777777777777777", "-0b111111111111111111111111111111111111111111111111111"), nc(-1125899906842625, "-1125899906842625", "-0x4000000000001", "-0o40000000000000001", "-0b100000000000000000000000000000000000000000000000001"), nc(-1125899906842624, "-1125899906842624", "-0x4000000000000", "-0o40000000000000000", "-0b100000000000000000000000000000000000000000000000000"), nc(-1125899906842623, "-1125899906842623", "-0x3ffffffffffff", "-0o37777777777777777", "-0b11111111111111111111111111111111111111111111111111"), nc(-1000000000000001, "-1000000000000001", "-0x38d7ea4c68001", "-0o34327724461500001", "-0b11100011010111111010100100110001101000000000000001"), nc(-1000000000000000, "-1000000000000000", "-0x38d7ea4c68000", "-0o34327724461500000", "-0b11100011010111111010100100110001101000000000000000"), nc(-999999999999999, "-999999999999999", "-0x38d7ea4c67fff", "-0o34327724461477777", "-0b11100011010111111010100100110001100111111111111111"), nc(-922337203685477, "-922337203685477", "-0x346dc5d638865", "-0o32155613530704145", "-0b11010001101101110001011101011000111000100001100101"), nc(-562949953421313, "-562949953421313", "-0x2000000000001", "-0o20000000000000001", "-0b10000000000000000000000000000000000000000000000001"), nc(-562949953421312, "-562949953421312", "-0x2000000000000", "-0o20000000000000000", "-0b10000000000000000000000000000000000000000000000000"), nc(-562949953421311, "-562949953421311", "-0x1ffffffffffff", "-0o17777777777777777", "-0b1111111111111111111111111111111111111111111111111"), nc(-281474976710657, "-281474976710657", "-0x1000000000001", "-0o10000000000000001", "-0b1000000000000000000000000000000000000000000000001"), nc(-281474976710656, "-281474976710656", "-0x1000000000000", "-0o10000000000000000", "-0b1000000000000000000000000000000000000000000000000"), nc(-281474976710655, "-281474976710655", "-0xffffffffffff", "-0o7777777777777777", "-0b111111111111111111111111111111111111111111111111"), nc(-140737488355329, "-140737488355329", "-0x800000000001", "-0o4000000000000001", "-0b100000000000000000000000000000000000000000000001"), nc(-140737488355328, "-140737488355328", "-0x800000000000", "-0o4000000000000000", "-0b100000000000000000000000000000000000000000000000"), nc(-140737488355327, "-140737488355327", "-0x7fffffffffff", "-0o3777777777777777", "-0b11111111111111111111111111111111111111111111111"), nc(-100000000000001, "-100000000000001", "-0x5af3107a4001", "-0o2657142036440001", "-0b10110101111001100010000011110100100000000000001"), nc(-100000000000000, "-100000000000000", "-0x5af3107a4000", "-0o2657142036440000", "-0b10110101111001100010000011110100100000000000000"), nc(-99999999999999, "-99999999999999", "-0x5af3107a3fff", "-0o2657142036437777", "-0b10110101111001100010000011110100011111111111111"), nc(-92233720368547, "-92233720368547", "-0x53e2d6238da3", "-0o2476132610706643", "-0b10100111110001011010110001000111000110110100011"), nc(-70368744177665, "-70368744177665", "-0x400000000001", "-0o2000000000000001", "-0b10000000000000000000000000000000000000000000001"), nc(-70368744177664, "-70368744177664", "-0x400000000000", "-0o2000000000000000", "-0b10000000000000000000000000000000000000000000000"), nc(-70368744177663, "-70368744177663", "-0x3fffffffffff", "-0o1777777777777777", "-0b1111111111111111111111111111111111111111111111"), nc(-35184372088833, "-35184372088833", "-0x200000000001", "-0o1000000000000001", "-0b1000000000000000000000000000000000000000000001"), nc(-35184372088832, "-35184372088832", "-0x200000000000", "-0o1000000000000000", "-0b1000000000000000000000000000000000000000000000"), nc(-35184372088831, "-35184372088831", "-0x1fffffffffff", "-0o777777777777777", "-0b111111111111111111111111111111111111111111111"), nc(-17592186044417, "-17592186044417", "-0x100000000001", "-0o400000000000001", "-0b100000000000000000000000000000000000000000001"), nc(-17592186044416, "-17592186044416", "-0x100000000000", "-0o400000000000000", "-0b100000000000000000000000000000000000000000000"), nc(-17592186044415, "-17592186044415", "-0xfffffffffff", "-0o377777777777777", "-0b11111111111111111111111111111111111111111111"), nc(-10000000000001, "-10000000000001", "-0x9184e72a001", "-0o221411634520001", "-0b10010001100001001110011100101010000000000001"), nc(-10000000000000, "-10000000000000", "-0x9184e72a000", "-0o221411634520000", "-0b10010001100001001110011100101010000000000000"), nc(-9999999999999, "-9999999999999", "-0x9184e729fff", "-0o221411634517777", "-0b10010001100001001110011100101001111111111111"), nc(-9223372036854, "-9223372036854", "-0x8637bd05af6", "-0o206157364055366", "-0b10000110001101111011110100000101101011110110"), nc(-8796093022209, "-8796093022209", "-0x80000000001", "-0o200000000000001", "-0b10000000000000000000000000000000000000000001"), nc(-8796093022208, "-8796093022208", "-0x80000000000", "-0o200000000000000", "-0b10000000000000000000000000000000000000000000"), nc(-8796093022207, "-8796093022207", "-0x7ffffffffff", "-0o177777777777777", "-0b1111111111111111111111111111111111111111111"), nc(-4398046511105, "-4398046511105", "-0x40000000001", "-0o100000000000001", "-0b1000000000000000000000000000000000000000001"), nc(-4398046511104, "-4398046511104", "-0x40000000000", "-0o100000000000000", "-0b1000000000000000000000000000000000000000000"), nc(-4398046511103, "-4398046511103", "-0x3ffffffffff", "-0o77777777777777", "-0b111111111111111111111111111111111111111111"), nc(-2199023255553, "-2199023255553", "-0x20000000001", "-0o40000000000001", "-0b100000000000000000000000000000000000000001"), nc(-2199023255552, "-2199023255552", "-0x20000000000", "-0o40000000000000", "-0b100000000000000000000000000000000000000000"), nc(-2199023255551, "-2199023255551", "-0x1ffffffffff", "-0o37777777777777", "-0b11111111111111111111111111111111111111111"), nc(-1099511627777, "-1099511627777", "-0x10000000001", "-0o20000000000001", "-0b10000000000000000000000000000000000000001"), nc(-1099511627776, "-1099511627776", "-0x10000000000", "-0o20000000000000", "-0b10000000000000000000000000000000000000000"), nc(-1099511627775, "-1099511627775", "-0xffffffffff", "-0o17777777777777", "-0b1111111111111111111111111111111111111111"), nc(-1000000000001, "-1000000000001", "-0xe8d4a51001", "-0o16432451210001", "-0b1110100011010100101001010001000000000001"), nc(-1000000000000, "-1000000000000", "-0xe8d4a51000", "-0o16432451210000", "-0b1110100011010100101001010001000000000000"), nc(-999999999999, "-999999999999", "-0xe8d4a50fff", "-0o16432451207777", "-0b1110100011010100101001010000111111111111"), nc(-922337203685, "-922337203685", "-0xd6bf94d5e5", "-0o15327745152745", "-0b1101011010111111100101001101010111100101"), nc(-549755813889, "-549755813889", "-0x8000000001", "-0o10000000000001", "-0b1000000000000000000000000000000000000001"), nc(-549755813888, "-549755813888", "-0x8000000000", "-0o10000000000000", "-0b1000000000000000000000000000000000000000"), nc(-549755813887, "-549755813887", "-0x7fffffffff", "-0o7777777777777", "-0b111111111111111111111111111111111111111"), nc(-274877906945, "-274877906945", "-0x4000000001", "-0o4000000000001", "-0b100000000000000000000000000000000000001"), nc(-274877906944, "-274877906944", "-0x4000000000", "-0o4000000000000", "-0b100000000000000000000000000000000000000"), nc(-274877906943, "-274877906943", "-0x3fffffffff", "-0o3777777777777", "-0b11111111111111111111111111111111111111"), nc(-137438953473, "-137438953473", "-0x2000000001", "-0o2000000000001", "-0b10000000000000000000000000000000000001"), nc(-137438953472, "-137438953472", "-0x2000000000", "-0o2000000000000", "-0b10000000000000000000000000000000000000"), nc(-137438953471, "-137438953471", "-0x1fffffffff", "-0o1777777777777", "-0b1111111111111111111111111111111111111"), nc(-100000000001, "-100000000001", "-0x174876e801", "-0o1351035564001", "-0b1011101001000011101101110100000000001"), nc(-100000000000, "-100000000000", "-0x174876e800", "-0o1351035564000", "-0b1011101001000011101101110100000000000"), nc(-99999999999, "-99999999999", "-0x174876e7ff", "-0o1351035563777", "-0b1011101001000011101101110011111111111"), nc(-92233720368, "-92233720368", "-0x15798ee230", "-0o1257143561060", "-0b1010101111001100011101110001000110000"), nc(-68719476737, "-68719476737", "-0x1000000001", "-0o1000000000001", "-0b1000000000000000000000000000000000001"), nc(-68719476736, "-68719476736", "-0x1000000000", "-0o1000000000000", "-0b1000000000000000000000000000000000000"), nc(-68719476735, "-68719476735", "-0xfffffffff", "-0o777777777777", "-0b111111111111111111111111111111111111"), nc(-34359738369, "-34359738369", "-0x800000001", "-0o400000000001", "-0b100000000000000000000000000000000001"), nc(-34359738368, "-34359738368", "-0x800000000", "-0o400000000000", "-0b100000000000000000000000000000000000"), nc(-34359738367, "-34359738367", "-0x7ffffffff", "-0o377777777777", "-0b11111111111111111111111111111111111"), nc(-17179869185, "-17179869185", "-0x400000001", "-0o200000000001", "-0b10000000000000000000000000000000001"), nc(-17179869184, "-17179869184", "-0x400000000", "-0o200000000000", "-0b10000000000000000000000000000000000"), nc(-17179869183, "-17179869183", "-0x3ffffffff", "-0o177777777777", "-0b1111111111111111111111111111111111"), nc(-10000000001, "-10000000001", "-0x2540be401", "-0o112402762001", "-0b1001010100000010111110010000000001"), nc(-10000000000, "-10000000000", "-0x2540be400", "-0o112402762000", "-0b1001010100000010111110010000000000"), nc(-9999999999, "-9999999999", "-0x2540be3ff", "-0o112402761777", "-0b1001010100000010111110001111111111"), nc(-9223372036, "-9223372036", "-0x225c17d04", "-0o104560276404", "-0b1000100101110000010111110100000100"), nc(-8589934593, "-8589934593", "-0x200000001", "-0o100000000001", "-0b1000000000000000000000000000000001"), nc(-8589934592, "-8589934592", "-0x200000000", "-0o100000000000", "-0b1000000000000000000000000000000000"), nc(-8589934591, "-8589934591", "-0x1ffffffff", "-0o77777777777", "-0b111111111111111111111111111111111"), nc(-4294967297, "-4294967297", "-0x100000001", "-0o40000000001", "-0b100000000000000000000000000000001"), nc(-4294967296, "-4294967296", "-0x100000000", "-0o40000000000", "-0b100000000000000000000000000000000"), nc(-4294967295, "-4294967295", "-0xffffffff", "-0o37777777777", "-0b11111111111111111111111111111111"), nc(-2147483649, "-2147483649", "-0x80000001", "-0o20000000001", "-0b10000000000000000000000000000001"), nc(-2147483648, "-2147483648", "-0x80000000", "-0o20000000000", "-0b10000000000000000000000000000000"), nc(-2147483647, "-2147483647", "-0x7fffffff", "-0o17777777777", "-0b1111111111111111111111111111111"), nc(-1073741825, "-1073741825", "-0x40000001", "-0o10000000001", "-0b1000000000000000000000000000001"), nc(-1073741824, "-1073741824", "-0x40000000", "-0o10000000000", "-0b1000000000000000000000000000000"), nc(-1073741823, "-1073741823", "-0x3fffffff", "-0o7777777777", "-0b111111111111111111111111111111"), nc(-1000000001, "-1000000001", "-0x3b9aca01", "-0o7346545001", "-0b111011100110101100101000000001"), nc(-1000000000, "-1000000000", "-0x3b9aca00", "-0o7346545000", "-0b111011100110101100101000000000"), nc(-999999999, "-999999999", "-0x3b9ac9ff", "-0o7346544777", "-0b111011100110101100100111111111"), nc(-922337203, "-922337203", "-0x36f9bfb3", "-0o6676337663", "-0b110110111110011011111110110011"), nc(-536870913, "-536870913", "-0x20000001", "-0o4000000001", "-0b100000000000000000000000000001"), nc(-536870912, "-536870912", "-0x20000000", "-0o4000000000", "-0b100000000000000000000000000000"), nc(-536870911, "-536870911", "-0x1fffffff", "-0o3777777777", "-0b11111111111111111111111111111"), nc(-268435457, "-268435457", "-0x10000001", "-0o2000000001", "-0b10000000000000000000000000001"), nc(-268435456, "-268435456", "-0x10000000", "-0o2000000000", "-0b10000000000000000000000000000"), nc(-268435455, "-268435455", "-0xfffffff", "-0o1777777777", "-0b1111111111111111111111111111"), nc(-134217729, "-134217729", "-0x8000001", "-0o1000000001", "-0b1000000000000000000000000001"), nc(-134217728, "-134217728", "-0x8000000", "-0o1000000000", "-0b1000000000000000000000000000"), nc(-134217727, "-134217727", "-0x7ffffff", "-0o777777777", "-0b111111111111111111111111111"), nc(-100000001, "-100000001", "-0x5f5e101", "-0o575360401", "-0b101111101011110000100000001"), nc(-100000000, "-100000000", "-0x5f5e100", "-0o575360400", "-0b101111101011110000100000000"), nc(-99999999, "-99999999", "-0x5f5e0ff", "-0o575360377", "-0b101111101011110000011111111"), nc(-92233720, "-92233720", "-0x57f5ff8", "-0o537657770", "-0b101011111110101111111111000"), nc(-67108865, "-67108865", "-0x4000001", "-0o400000001", "-0b100000000000000000000000001"), nc(-67108864, "-67108864", "-0x4000000", "-0o400000000", "-0b100000000000000000000000000"), nc(-67108863, "-67108863", "-0x3ffffff", "-0o377777777", "-0b11111111111111111111111111"), nc(-33554433, "-33554433", "-0x2000001", "-0o200000001", "-0b10000000000000000000000001"), nc(-33554432, "-33554432", "-0x2000000", "-0o200000000", "-0b10000000000000000000000000"), nc(-33554431, "-33554431", "-0x1ffffff", "-0o177777777", "-0b1111111111111111111111111"), nc(-16777217, "-16777217", "-0x1000001", "-0o100000001", "-0b1000000000000000000000001"), nc(-16777216, "-16777216", "-0x1000000", "-0o100000000", "-0b1000000000000000000000000"), nc(-16777215, "-16777215", "-0xffffff", "-0o77777777", "-0b111111111111111111111111"), nc(-10000001, "-10000001", "-0x989681", "-0o46113201", "-0b100110001001011010000001"), nc(-10000000, "-10000000", "-0x989680", "-0o46113200", "-0b100110001001011010000000"), nc(-9999999, "-9999999", "-0x98967f", "-0o46113177", "-0b100110001001011001111111"), nc(-9223372, "-9223372", "-0x8cbccc", "-0o43136314", "-0b100011001011110011001100"), nc(-8388609, "-8388609", "-0x800001", "-0o40000001", "-0b100000000000000000000001"), nc(-8388608, "-8388608", "-0x800000", "-0o40000000", "-0b100000000000000000000000"), nc(-8388607, "-8388607", "-0x7fffff", "-0o37777777", "-0b11111111111111111111111"), nc(-4194305, "-4194305", "-0x400001", "-0o20000001", "-0b10000000000000000000001"), nc(-4194304, "-4194304", "-0x400000", "-0o20000000", "-0b10000000000000000000000"), nc(-4194303, "-4194303", "-0x3fffff", "-0o17777777", "-0b1111111111111111111111"), nc(-2097153, "-2097153", "-0x200001", "-0o10000001", "-0b1000000000000000000001"), nc(-2097152, "-2097152", "-0x200000", "-0o10000000", "-0b1000000000000000000000"), nc(-2097151, "-2097151", "-0x1fffff", "-0o7777777", "-0b111111111111111111111"), nc(-1048577, "-1048577", "-0x100001", "-0o4000001", "-0b100000000000000000001"), nc(-1048576, "-1048576", "-0x100000", "-0o4000000", "-0b100000000000000000000"), nc(-1048575, "-1048575", "-0xfffff", "-0o3777777", "-0b11111111111111111111"), nc(-1000001, "-1000001", "-0xf4241", "-0o3641101", "-0b11110100001001000001"), nc(-1000000, "-1000000", "-0xf4240", "-0o3641100", "-0b11110100001001000000"), nc(-999999, "-999999", "-0xf423f", "-0o3641077", "-0b11110100001000111111"), nc(-922337, "-922337", "-0xe12e1", "-0o3411341", "-0b11100001001011100001"), nc(-524289, "-524289", "-0x80001", "-0o2000001", "-0b10000000000000000001"), nc(-524288, "-524288", "-0x80000", "-0o2000000", "-0b10000000000000000000"), nc(-524287, "-524287", "-0x7ffff", "-0o1777777", "-0b1111111111111111111"), nc(-262145, "-262145", "-0x40001", "-0o1000001", "-0b1000000000000000001"), nc(-262144, "-262144", "-0x40000", "-0o1000000", "-0b1000000000000000000"), nc(-262143, "-262143", "-0x3ffff", "-0o777777", "-0b111111111111111111"), nc(-131073, "-131073", "-0x20001", "-0o400001", "-0b100000000000000001"), nc(-131072, "-131072", "-0x20000", "-0o400000", "-0b100000000000000000"), nc(-131071, "-131071", "-0x1ffff", "-0o377777", "-0b11111111111111111"), nc(-100001, "-100001", "-0x186a1", "-0o303241", "-0b11000011010100001"), nc(-100000, "-100000", "-0x186a0", "-0o303240", "-0b11000011010100000"), nc(-99999, "-99999", "-0x1869f", "-0o303237", "-0b11000011010011111"), nc(-92233, "-92233", "-0x16849", "-0o264111", "-0b10110100001001001"), nc(-65537, "-65537", "-0x10001", "-0o200001", "-0b10000000000000001"), nc(-65536, "-65536", "-0x10000", "-0o200000", "-0b10000000000000000"), nc(-65535, "-65535", "-0xffff", "-0o177777", "-0b1111111111111111"), nc(-32769, "-32769", "-0x8001", "-0o100001", "-0b1000000000000001"), nc(-32768, "-32768", "-0x8000", "-0o100000", "-0b1000000000000000"), nc(-32767, "-32767", "-0x7fff", "-0o77777", "-0b111111111111111"), nc(-16385, "-16385", "-0x4001", "-0o40001", "-0b100000000000001"), nc(-16384, "-16384", "-0x4000", "-0o40000", "-0b100000000000000"), nc(-16383, "-16383", "-0x3fff", "-0o37777", "-0b11111111111111"), nc(-10001, "-10001", "-0x2711", "-0o23421", "-0b10011100010001"), nc(-10000, "-10000", "-0x2710", "-0o23420", "-0b10011100010000"), nc(-9999, "-9999", "-0x270f", "-0o23417", "-0b10011100001111"), nc(-9223, "-9223", "-0x2407", "-0o22007", "-0b10010000000111"), nc(-8193, "-8193", "-0x2001", "-0o20001", "-0b10000000000001"), nc(-8192, "-8192", "-0x2000", "-0o20000", "-0b10000000000000"), nc(-8191, "-8191", "-0x1fff", "-0o17777", "-0b1111111111111"), nc(-4097, "-4097", "-0x1001", "-0o10001", "-0b1000000000001"), nc(-4096, "-4096", "-0x1000", "-0o10000", "-0b1000000000000"), nc(-4095, "-4095", "-0xfff", "-0o7777", "-0b111111111111"), nc(-2049, "-2049", "-0x801", "-0o4001", "-0b100000000001"), nc(-2048, "-2048", "-0x800", "-0o4000", "-0b100000000000"), nc(-2047, "-2047", "-0x7ff", "-0o3777", "-0b11111111111"), nc(-1025, "-1025", "-0x401", "-0o2001", "-0b10000000001"), nc(-1024, "-1024", "-0x400", "-0o2000", "-0b10000000000"), nc(-1023, "-1023", "-0x3ff", "-0o1777", "-0b1111111111"), nc(-1001, "-1001", "-0x3e9", "-0o1751", "-0b1111101001"), nc(-1000, "-1000", "-0x3e8", "-0o1750", "-0b1111101000"), nc(-999, "-999", "-0x3e7", "-0o1747", "-0b1111100111"), nc(-922, "-922", "-0x39a", "-0o1632", "-0b1110011010"), nc(-513, "-513", "-0x201", "-0o1001", "-0b1000000001"), nc(-512, "-512", "-0x200", "-0o1000", "-0b1000000000"), nc(-511, "-511", "-0x1ff", "-0o777", "-0b111111111"), nc(-257, "-257", "-0x101", "-0o401", "-0b100000001"), nc(-256, "-256", "-0x100", "-0o400", "-0b100000000"), nc(-255, "-255", "-0xff", "-0o377", "-0b11111111"), nc(-129, "-129", "-0x81", "-0o201", "-0b10000001"), nc(-128, "-128", "-0x80", "-0o200", "-0b10000000"), nc(-127, "-127", "-0x7f", "-0o177", "-0b1111111"), nc(-101, "-101", "-0x65", "-0o145", "-0b1100101"), nc(-100, "-100", "-0x64", "-0o144", "-0b1100100"), nc(-99, "-99", "-0x63", "-0o143", "-0b1100011"), nc(-92, "-92", "-0x5c", "-0o134", "-0b1011100"), nc(-65, "-65", "-0x41", "-0o101", "-0b1000001"), nc(-64, "-64", "-0x40", "-0o100", "-0b1000000"), nc(-63, "-63", "-0x3f", "-0o77", "-0b111111"), nc(-33, "-33", "-0x21", "-0o41", "-0b100001"), nc(-32, "-32", "-0x20", "-0o40", "-0b100000"), nc(-31, "-31", "-0x1f", "-0o37", "-0b11111"), nc(-17, "-17", "-0x11", "-0o21", "-0b10001"), nc(-16, "-16", "-0x10", "-0o20", "-0b10000"), nc(-15, "-15", "-0xf", "-0o17", "-0b1111"), nc(-11, "-11", "-0xb", "-0o13", "-0b1011"), nc(-10, "-10", "-0xa", "-0o12", "-0b1010"), nc(-9, "-9", "-0x9", "-0o11", "-0b1001"), nc(-8, "-8", "-0x8", "-0o10", "-0b1000"), nc(-7, "-7", "-0x7", "-0o7", "-0b111"), nc(-6, "-6", "-0x6", "-0o6", "-0b110"), nc(-5, "-5", "-0x5", "-0o5", "-0b101"), nc(-4, "-4", "-0x4", "-0o4", "-0b100"), nc(-3, "-3", "-0x3", "-0o3", "-0b11"), nc(-2, "-2", "-0x2", "-0o2", "-0b10"), nc(-1, "-1", "-0x1", "-0o1", "-0b1"), nc(0, "0", "0x0", "0o0", "0b0"), nc(1, "1", "0x1", "0o1", "0b1"), nc(2, "2", "0x2", "0o2", "0b10"), nc(3, "3", "0x3", "0o3", "0b11"), nc(4, "4", "0x4", "0o4", "0b100"), nc(5, "5", "0x5", "0o5", "0b101"), nc(6, "6", "0x6", "0o6", "0b110"), nc(7, "7", "0x7", "0o7", "0b111"), nc(8, "8", "0x8", "0o10", "0b1000"), nc(9, "9", "0x9", "0o11", "0b1001"), nc(10, "10", "0xa", "0o12", "0b1010"), nc(11, "11", "0xb", "0o13", "0b1011"), nc(15, "15", "0xf", "0o17", "0b1111"), nc(16, "16", "0x10", "0o20", "0b10000"), nc(17, "17", "0x11", "0o21", "0b10001"), nc(31, "31", "0x1f", "0o37", "0b11111"), nc(32, "32", "0x20", "0o40", "0b100000"), nc(33, "33", "0x21", "0o41", "0b100001"), nc(63, "63", "0x3f", "0o77", "0b111111"), nc(64, "64", "0x40", "0o100", "0b1000000"), nc(65, "65", "0x41", "0o101", "0b1000001"), nc(91, "91", "0x5b", "0o133", "0b1011011"), nc(92, "92", "0x5c", "0o134", "0b1011100"), nc(93, "93", "0x5d", "0o135", "0b1011101"), nc(99, "99", "0x63", "0o143", "0b1100011"), nc(100, "100", "0x64", "0o144", "0b1100100"), nc(101, "101", "0x65", "0o145", "0b1100101"), nc(127, "127", "0x7f", "0o177", "0b1111111"), nc(128, "128", "0x80", "0o200", "0b10000000"), nc(129, "129", "0x81", "0o201", "0b10000001"), nc(255, "255", "0xff", "0o377", "0b11111111"), nc(256, "256", "0x100", "0o400", "0b100000000"), nc(257, "257", "0x101", "0o401", "0b100000001"), nc(511, "511", "0x1ff", "0o777", "0b111111111"), nc(512, "512", "0x200", "0o1000", "0b1000000000"), nc(513, "513", "0x201", "0o1001", "0b1000000001"), nc(921, "921", "0x399", "0o1631", "0b1110011001"), nc(922, "922", "0x39a", "0o1632", "0b1110011010"), nc(923, "923", "0x39b", "0o1633", "0b1110011011"), nc(999, "999", "0x3e7", "0o1747", "0b1111100111"), nc(1000, "1000", "0x3e8", "0o1750", "0b1111101000"), nc(1001, "1001", "0x3e9", "0o1751", "0b1111101001"), nc(1023, "1023", "0x3ff", "0o1777", "0b1111111111"), nc(1024, "1024", "0x400", "0o2000", "0b10000000000"), nc(1025, "1025", "0x401", "0o2001", "0b10000000001"), nc(2047, "2047", "0x7ff", "0o3777", "0b11111111111"), nc(2048, "2048", "0x800", "0o4000", "0b100000000000"), nc(2049, "2049", "0x801", "0o4001", "0b100000000001"), nc(4095, "4095", "0xfff", "0o7777", "0b111111111111"), nc(4096, "4096", "0x1000", "0o10000", "0b1000000000000"), nc(4097, "4097", "0x1001", "0o10001", "0b1000000000001"), nc(8191, "8191", "0x1fff", "0o17777", "0b1111111111111"), nc(8192, "8192", "0x2000", "0o20000", "0b10000000000000"), nc(8193, "8193", "0x2001", "0o20001", "0b10000000000001"), nc(9222, "9222", "0x2406", "0o22006", "0b10010000000110"), nc(9223, "9223", "0x2407", "0o22007", "0b10010000000111"), nc(9224, "9224", "0x2408", "0o22010", "0b10010000001000"), nc(9999, "9999", "0x270f", "0o23417", "0b10011100001111"), nc(10000, "10000", "0x2710", "0o23420", "0b10011100010000"), nc(10001, "10001", "0x2711", "0o23421", "0b10011100010001"), nc(16383, "16383", "0x3fff", "0o37777", "0b11111111111111"), nc(16384, "16384", "0x4000", "0o40000", "0b100000000000000"), nc(16385, "16385", "0x4001", "0o40001", "0b100000000000001"), nc(32767, "32767", "0x7fff", "0o77777", "0b111111111111111"), nc(32768, "32768", "0x8000", "0o100000", "0b1000000000000000"), nc(32769, "32769", "0x8001", "0o100001", "0b1000000000000001"), nc(65535, "65535", "0xffff", "0o177777", "0b1111111111111111"), nc(65536, "65536", "0x10000", "0o200000", "0b10000000000000000"), nc(65537, "65537", "0x10001", "0o200001", "0b10000000000000001"), nc(92232, "92232", "0x16848", "0o264110", "0b10110100001001000"), nc(92233, "92233", "0x16849", "0o264111", "0b10110100001001001"), nc(92234, "92234", "0x1684a", "0o264112", "0b10110100001001010"), nc(99999, "99999", "0x1869f", "0o303237", "0b11000011010011111"), nc(100000, "100000", "0x186a0", "0o303240", "0b11000011010100000"), nc(100001, "100001", "0x186a1", "0o303241", "0b11000011010100001"), nc(131071, "131071", "0x1ffff", "0o377777", "0b11111111111111111"), nc(131072, "131072", "0x20000", "0o400000", "0b100000000000000000"), nc(131073, "131073", "0x20001", "0o400001", "0b100000000000000001"), nc(262143, "262143", "0x3ffff", "0o777777", "0b111111111111111111"), nc(262144, "262144", "0x40000", "0o1000000", "0b1000000000000000000"), nc(262145, "262145", "0x40001", "0o1000001", "0b1000000000000000001"), nc(524287, "524287", "0x7ffff", "0o1777777", "0b1111111111111111111"), nc(524288, "524288", "0x80000", "0o2000000", "0b10000000000000000000"), nc(524289, "524289", "0x80001", "0o2000001", "0b10000000000000000001"), nc(922336, "922336", "0xe12e0", "0o3411340", "0b11100001001011100000"), nc(922337, "922337", "0xe12e1", "0o3411341", "0b11100001001011100001"), nc(922338, "922338", "0xe12e2", "0o3411342", "0b11100001001011100010"), nc(999999, "999999", "0xf423f", "0o3641077", "0b11110100001000111111"), nc(1000000, "1000000", "0xf4240", "0o3641100", "0b11110100001001000000"), nc(1000001, "1000001", "0xf4241", "0o3641101", "0b11110100001001000001"), nc(1048575, "1048575", "0xfffff", "0o3777777", "0b11111111111111111111"), nc(1048576, "1048576", "0x100000", "0o4000000", "0b100000000000000000000"), nc(1048577, "1048577", "0x100001", "0o4000001", "0b100000000000000000001"), nc(2097151, "2097151", "0x1fffff", "0o7777777", "0b111111111111111111111"), nc(2097152, "2097152", "0x200000", "0o10000000", "0b1000000000000000000000"), nc(2097153, "2097153", "0x200001", "0o10000001", "0b1000000000000000000001"), nc(4194303, "4194303", "0x3fffff", "0o17777777", "0b1111111111111111111111"), nc(4194304, "4194304", "0x400000", "0o20000000", "0b10000000000000000000000"), nc(4194305, "4194305", "0x400001", "0o20000001", "0b10000000000000000000001"), nc(8388607, "8388607", "0x7fffff", "0o37777777", "0b11111111111111111111111"), nc(8388608, "8388608", "0x800000", "0o40000000", "0b100000000000000000000000"), nc(8388609, "8388609", "0x800001", "0o40000001", "0b100000000000000000000001"), nc(9223371, "9223371", "0x8cbccb", "0o43136313", "0b100011001011110011001011"), nc(9223372, "9223372", "0x8cbccc", "0o43136314", "0b100011001011110011001100"), nc(9223373, "9223373", "0x8cbccd", "0o43136315", "0b100011001011110011001101"), nc(9999999, "9999999", "0x98967f", "0o46113177", "0b100110001001011001111111"), nc(10000000, "10000000", "0x989680", "0o46113200", "0b100110001001011010000000"), nc(10000001, "10000001", "0x989681", "0o46113201", "0b100110001001011010000001"), nc(16777215, "16777215", "0xffffff", "0o77777777", "0b111111111111111111111111"), nc(16777216, "16777216", "0x1000000", "0o100000000", "0b1000000000000000000000000"), nc(16777217, "16777217", "0x1000001", "0o100000001", "0b1000000000000000000000001"), nc(33554431, "33554431", "0x1ffffff", "0o177777777", "0b1111111111111111111111111"), nc(33554432, "33554432", "0x2000000", "0o200000000", "0b10000000000000000000000000"), nc(33554433, "33554433", "0x2000001", "0o200000001", "0b10000000000000000000000001"), nc(67108863, "67108863", "0x3ffffff", "0o377777777", "0b11111111111111111111111111"), nc(67108864, "67108864", "0x4000000", "0o400000000", "0b100000000000000000000000000"), nc(67108865, "67108865", "0x4000001", "0o400000001", "0b100000000000000000000000001"), nc(92233719, "92233719", "0x57f5ff7", "0o537657767", "0b101011111110101111111110111"), nc(92233720, "92233720", "0x57f5ff8", "0o537657770", "0b101011111110101111111111000"), nc(92233721, "92233721", "0x57f5ff9", "0o537657771", "0b101011111110101111111111001"), nc(99999999, "99999999", "0x5f5e0ff", "0o575360377", "0b101111101011110000011111111"), nc(100000000, "100000000", "0x5f5e100", "0o575360400", "0b101111101011110000100000000"), nc(100000001, "100000001", "0x5f5e101", "0o575360401", "0b101111101011110000100000001"), nc(134217727, "134217727", "0x7ffffff", "0o777777777", "0b111111111111111111111111111"), nc(134217728, "134217728", "0x8000000", "0o1000000000", "0b1000000000000000000000000000"), nc(134217729, "134217729", "0x8000001", "0o1000000001", "0b1000000000000000000000000001"), nc(268435455, "268435455", "0xfffffff", "0o1777777777", "0b1111111111111111111111111111"), nc(268435456, "268435456", "0x10000000", "0o2000000000", "0b10000000000000000000000000000"), nc(268435457, "268435457", "0x10000001", "0o2000000001", "0b10000000000000000000000000001"), nc(536870911, "536870911", "0x1fffffff", "0o3777777777", "0b11111111111111111111111111111"), nc(536870912, "536870912", "0x20000000", "0o4000000000", "0b100000000000000000000000000000"), nc(536870913, "536870913", "0x20000001", "0o4000000001", "0b100000000000000000000000000001"), nc(922337202, "922337202", "0x36f9bfb2", "0o6676337662", "0b110110111110011011111110110010"), nc(922337203, "922337203", "0x36f9bfb3", "0o6676337663", "0b110110111110011011111110110011"), nc(922337204, "922337204", "0x36f9bfb4", "0o6676337664", "0b110110111110011011111110110100"), nc(999999999, "999999999", "0x3b9ac9ff", "0o7346544777", "0b111011100110101100100111111111"), nc(1000000000, "1000000000", "0x3b9aca00", "0o7346545000", "0b111011100110101100101000000000"), nc(1000000001, "1000000001", "0x3b9aca01", "0o7346545001", "0b111011100110101100101000000001"), nc(1073741823, "1073741823", "0x3fffffff", "0o7777777777", "0b111111111111111111111111111111"), nc(1073741824, "1073741824", "0x40000000", "0o10000000000", "0b1000000000000000000000000000000"), nc(1073741825, "1073741825", "0x40000001", "0o10000000001", "0b1000000000000000000000000000001"), nc(2147483647, "2147483647", "0x7fffffff", "0o17777777777", "0b1111111111111111111111111111111"), nc(2147483648, "2147483648", "0x80000000", "0o20000000000", "0b10000000000000000000000000000000"), nc(2147483649, "2147483649", "0x80000001", "0o20000000001", "0b10000000000000000000000000000001"), nc(4294967295, "4294967295", "0xffffffff", "0o37777777777", "0b11111111111111111111111111111111"), nc(4294967296, "4294967296", "0x100000000", "0o40000000000", "0b100000000000000000000000000000000"), nc(4294967297, "4294967297", "0x100000001", "0o40000000001", "0b100000000000000000000000000000001"), nc(8589934591, "8589934591", "0x1ffffffff", "0o77777777777", "0b111111111111111111111111111111111"), nc(8589934592, "8589934592", "0x200000000", "0o100000000000", "0b1000000000000000000000000000000000"), nc(8589934593, "8589934593", "0x200000001", "0o100000000001", "0b1000000000000000000000000000000001"), nc(9223372035, "9223372035", "0x225c17d03", "0o104560276403", "0b1000100101110000010111110100000011"), nc(9223372036, "9223372036", "0x225c17d04", "0o104560276404", "0b1000100101110000010111110100000100"), nc(9223372037, "9223372037", "0x225c17d05", "0o104560276405", "0b1000100101110000010111110100000101"), nc(9999999999, "9999999999", "0x2540be3ff", "0o112402761777", "0b1001010100000010111110001111111111"), nc(10000000000, "10000000000", "0x2540be400", "0o112402762000", "0b1001010100000010111110010000000000"), nc(10000000001, "10000000001", "0x2540be401", "0o112402762001", "0b1001010100000010111110010000000001"), nc(17179869183, "17179869183", "0x3ffffffff", "0o177777777777", "0b1111111111111111111111111111111111"), nc(17179869184, "17179869184", "0x400000000", "0o200000000000", "0b10000000000000000000000000000000000"), nc(17179869185, "17179869185", "0x400000001", "0o200000000001", "0b10000000000000000000000000000000001"), nc(34359738367, "34359738367", "0x7ffffffff", "0o377777777777", "0b11111111111111111111111111111111111"), nc(34359738368, "34359738368", "0x800000000", "0o400000000000", "0b100000000000000000000000000000000000"), nc(34359738369, "34359738369", "0x800000001", "0o400000000001", "0b100000000000000000000000000000000001"), nc(68719476735, "68719476735", "0xfffffffff", "0o777777777777", "0b111111111111111111111111111111111111"), nc(68719476736, "68719476736", "0x1000000000", "0o1000000000000", "0b1000000000000000000000000000000000000"), nc(68719476737, "68719476737", "0x1000000001", "0o1000000000001", "0b1000000000000000000000000000000000001"), nc(92233720367, "92233720367", "0x15798ee22f", "0o1257143561057", "0b1010101111001100011101110001000101111"), nc(92233720368, "92233720368", "0x15798ee230", "0o1257143561060", "0b1010101111001100011101110001000110000"), nc(92233720369, "92233720369", "0x15798ee231", "0o1257143561061", "0b1010101111001100011101110001000110001"), nc(99999999999, "99999999999", "0x174876e7ff", "0o1351035563777", "0b1011101001000011101101110011111111111"), nc(100000000000, "100000000000", "0x174876e800", "0o1351035564000", "0b1011101001000011101101110100000000000"), nc(100000000001, "100000000001", "0x174876e801", "0o1351035564001", "0b1011101001000011101101110100000000001"), nc(137438953471, "137438953471", "0x1fffffffff", "0o1777777777777", "0b1111111111111111111111111111111111111"), nc(137438953472, "137438953472", "0x2000000000", "0o2000000000000", "0b10000000000000000000000000000000000000"), nc(137438953473, "137438953473", "0x2000000001", "0o2000000000001", "0b10000000000000000000000000000000000001"), nc(274877906943, "274877906943", "0x3fffffffff", "0o3777777777777", "0b11111111111111111111111111111111111111"), nc(274877906944, "274877906944", "0x4000000000", "0o4000000000000", "0b100000000000000000000000000000000000000"), nc(274877906945, "274877906945", "0x4000000001", "0o4000000000001", "0b100000000000000000000000000000000000001"), nc(549755813887, "549755813887", "0x7fffffffff", "0o7777777777777", "0b111111111111111111111111111111111111111"), nc(549755813888, "549755813888", "0x8000000000", "0o10000000000000", "0b1000000000000000000000000000000000000000"), nc(549755813889, "549755813889", "0x8000000001", "0o10000000000001", "0b1000000000000000000000000000000000000001"), nc(922337203684, "922337203684", "0xd6bf94d5e4", "0o15327745152744", "0b1101011010111111100101001101010111100100"), nc(922337203685, "922337203685", "0xd6bf94d5e5", "0o15327745152745", "0b1101011010111111100101001101010111100101"), nc(922337203686, "922337203686", "0xd6bf94d5e6", "0o15327745152746", "0b1101011010111111100101001101010111100110"), nc(999999999999, "999999999999", "0xe8d4a50fff", "0o16432451207777", "0b1110100011010100101001010000111111111111"), nc(1000000000000, "1000000000000", "0xe8d4a51000", "0o16432451210000", "0b1110100011010100101001010001000000000000"), nc(1000000000001, "1000000000001", "0xe8d4a51001", "0o16432451210001", "0b1110100011010100101001010001000000000001"), nc(1099511627775, "1099511627775", "0xffffffffff", "0o17777777777777", "0b1111111111111111111111111111111111111111"), nc(1099511627776, "1099511627776", "0x10000000000", "0o20000000000000", "0b10000000000000000000000000000000000000000"), nc(1099511627777, "1099511627777", "0x10000000001", "0o20000000000001", "0b10000000000000000000000000000000000000001"), nc(2199023255551, "2199023255551", "0x1ffffffffff", "0o37777777777777", "0b11111111111111111111111111111111111111111"), nc(2199023255552, "2199023255552", "0x20000000000", "0o40000000000000", "0b100000000000000000000000000000000000000000"), nc(2199023255553, "2199023255553", "0x20000000001", "0o40000000000001", "0b100000000000000000000000000000000000000001"), nc(4398046511103, "4398046511103", "0x3ffffffffff", "0o77777777777777", "0b111111111111111111111111111111111111111111"), nc(4398046511104, "4398046511104", "0x40000000000", "0o100000000000000", "0b1000000000000000000000000000000000000000000"), nc(4398046511105, "4398046511105", "0x40000000001", "0o100000000000001", "0b1000000000000000000000000000000000000000001"), nc(8796093022207, "8796093022207", "0x7ffffffffff", "0o177777777777777", "0b1111111111111111111111111111111111111111111"), nc(8796093022208, "8796093022208", "0x80000000000", "0o200000000000000", "0b10000000000000000000000000000000000000000000"), nc(8796093022209, "8796093022209", "0x80000000001", "0o200000000000001", "0b10000000000000000000000000000000000000000001"), nc(9223372036853, "9223372036853", "0x8637bd05af5", "0o206157364055365", "0b10000110001101111011110100000101101011110101"), nc(9223372036854, "9223372036854", "0x8637bd05af6", "0o206157364055366", "0b10000110001101111011110100000101101011110110"), nc(9223372036855, "9223372036855", "0x8637bd05af7", "0o206157364055367", "0b10000110001101111011110100000101101011110111"), nc(9999999999999, "9999999999999", "0x9184e729fff", "0o221411634517777", "0b10010001100001001110011100101001111111111111"), nc(10000000000000, "10000000000000", "0x9184e72a000", "0o221411634520000", "0b10010001100001001110011100101010000000000000"), nc(10000000000001, "10000000000001", "0x9184e72a001", "0o221411634520001", "0b10010001100001001110011100101010000000000001"), nc(17592186044415, "17592186044415", "0xfffffffffff", "0o377777777777777", "0b11111111111111111111111111111111111111111111"), nc(17592186044416, "17592186044416", "0x100000000000", "0o400000000000000", "0b100000000000000000000000000000000000000000000"), nc(17592186044417, "17592186044417", "0x100000000001", "0o400000000000001", "0b100000000000000000000000000000000000000000001"), nc(35184372088831, "35184372088831", "0x1fffffffffff", "0o777777777777777", "0b111111111111111111111111111111111111111111111"), nc(35184372088832, "35184372088832", "0x200000000000", "0o1000000000000000", "0b1000000000000000000000000000000000000000000000"), nc(35184372088833, "35184372088833", "0x200000000001", "0o1000000000000001", "0b1000000000000000000000000000000000000000000001"), nc(70368744177663, "70368744177663", "0x3fffffffffff", "0o1777777777777777", "0b1111111111111111111111111111111111111111111111"), nc(70368744177664, "70368744177664", "0x400000000000", "0o2000000000000000", "0b10000000000000000000000000000000000000000000000"), nc(70368744177665, "70368744177665", "0x400000000001", "0o2000000000000001", "0b10000000000000000000000000000000000000000000001"), nc(92233720368546, "92233720368546", "0x53e2d6238da2", "0o2476132610706642", "0b10100111110001011010110001000111000110110100010"), nc(92233720368547, "92233720368547", "0x53e2d6238da3", "0o2476132610706643", "0b10100111110001011010110001000111000110110100011"), nc(92233720368548, "92233720368548", "0x53e2d6238da4", "0o2476132610706644", "0b10100111110001011010110001000111000110110100100"), nc(99999999999999, "99999999999999", "0x5af3107a3fff", "0o2657142036437777", "0b10110101111001100010000011110100011111111111111"), nc(100000000000000, "100000000000000", "0x5af3107a4000", "0o2657142036440000", "0b10110101111001100010000011110100100000000000000"), nc(100000000000001, "100000000000001", "0x5af3107a4001", "0o2657142036440001", "0b10110101111001100010000011110100100000000000001"), nc(140737488355327, "140737488355327", "0x7fffffffffff", "0o3777777777777777", "0b11111111111111111111111111111111111111111111111"), nc(140737488355328, "140737488355328", "0x800000000000", "0o4000000000000000", "0b100000000000000000000000000000000000000000000000"), nc(140737488355329, "140737488355329", "0x800000000001", "0o4000000000000001", "0b100000000000000000000000000000000000000000000001"), nc(281474976710655, "281474976710655", "0xffffffffffff", "0o7777777777777777", "0b111111111111111111111111111111111111111111111111"), nc(281474976710656, "281474976710656", "0x1000000000000", "0o10000000000000000", "0b1000000000000000000000000000000000000000000000000"), nc(281474976710657, "281474976710657", "0x1000000000001", "0o10000000000000001", "0b1000000000000000000000000000000000000000000000001"), nc(562949953421311, "562949953421311", "0x1ffffffffffff", "0o17777777777777777", "0b1111111111111111111111111111111111111111111111111"), nc(562949953421312, "562949953421312", "0x2000000000000", "0o20000000000000000", "0b10000000000000000000000000000000000000000000000000"), nc(562949953421313, "562949953421313", "0x2000000000001", "0o20000000000000001", "0b10000000000000000000000000000000000000000000000001"), nc(922337203685476, "922337203685476", "0x346dc5d638864", "0o32155613530704144", "0b11010001101101110001011101011000111000100001100100"), nc(922337203685477, "922337203685477", "0x346dc5d638865", "0o32155613530704145", "0b11010001101101110001011101011000111000100001100101"), nc(922337203685478, "922337203685478", "0x346dc5d638866", "0o32155613530704146", "0b11010001101101110001011101011000111000100001100110"), nc(999999999999999, "999999999999999", "0x38d7ea4c67fff", "0o34327724461477777", "0b11100011010111111010100100110001100111111111111111"), nc(1000000000000000, "1000000000000000", "0x38d7ea4c68000", "0o34327724461500000", "0b11100011010111111010100100110001101000000000000000"), nc(1000000000000001, "1000000000000001", "0x38d7ea4c68001", "0o34327724461500001", "0b11100011010111111010100100110001101000000000000001"), nc(1125899906842623, "1125899906842623", "0x3ffffffffffff", "0o37777777777777777", "0b11111111111111111111111111111111111111111111111111"), nc(1125899906842624, "1125899906842624", "0x4000000000000", "0o40000000000000000", "0b100000000000000000000000000000000000000000000000000"), nc(1125899906842625, "1125899906842625", "0x4000000000001", "0o40000000000000001", "0b100000000000000000000000000000000000000000000000001"), nc(2251799813685247, "2251799813685247", "0x7ffffffffffff", "0o77777777777777777", "0b111111111111111111111111111111111111111111111111111"), nc(2251799813685248, "2251799813685248", "0x8000000000000", "0o100000000000000000", "0b1000000000000000000000000000000000000000000000000000"), nc(2251799813685249, "2251799813685249", "0x8000000000001", "0o100000000000000001", "0b1000000000000000000000000000000000000000000000000001"), nc(4503599627370495, "4503599627370495", "0xfffffffffffff", "0o177777777777777777", "0b1111111111111111111111111111111111111111111111111111"), nc(4503599627370496, "4503599627370496", "0x10000000000000", "0o200000000000000000", "0b10000000000000000000000000000000000000000000000000000"), nc(4503599627370497, "4503599627370497", "0x10000000000001", "0o200000000000000001", "0b10000000000000000000000000000000000000000000000000001"), nc(9007199254740991, "9007199254740991", "0x1fffffffffffff", "0o377777777777777777", "0b11111111111111111111111111111111111111111111111111111"), nc(9007199254740992, "9007199254740992", "0x20000000000000", "0o400000000000000000", "0b100000000000000000000000000000000000000000000000000000"), nc(9007199254740993, "9007199254740993", "0x20000000000001", "0o400000000000000001", "0b100000000000000000000000000000000000000000000000000001"), nc(9223372036854775, "9223372036854775", "0x20c49ba5e353f7", "0o406111564570651767", "0b100000110001001001101110100101111000110101001111110111"), nc(9223372036854776, "9223372036854776", "0x20c49ba5e353f8", "0o406111564570651770", "0b100000110001001001101110100101111000110101001111111000"), nc(9223372036854777, "9223372036854777", "0x20c49ba5e353f9", "0o406111564570651771", "0b100000110001001001101110100101111000110101001111111001"), nc(9999999999999999, "9999999999999999", "0x2386f26fc0ffff", "0o434157115760177777", "0b100011100001101111001001101111110000001111111111111111"), nc(10000000000000000, "10000000000000000", "0x2386f26fc10000", "0o434157115760200000", "0b100011100001101111001001101111110000010000000000000000"), nc(10000000000000001, "10000000000000001", "0x2386f26fc10001", "0o434157115760200001", "0b100011100001101111001001101111110000010000000000000001"), nc(18014398509481983, "18014398509481983", "0x3fffffffffffff", "0o777777777777777777", "0b111111111111111111111111111111111111111111111111111111"), nc(18014398509481984, "18014398509481984", "0x40000000000000", "0o1000000000000000000", "0b1000000000000000000000000000000000000000000000000000000"), nc(18014398509481985, "18014398509481985", "0x40000000000001", "0o1000000000000000001", "0b1000000000000000000000000000000000000000000000000000001"), nc(36028797018963967, "36028797018963967", "0x7fffffffffffff", "0o1777777777777777777", "0b1111111111111111111111111111111111111111111111111111111"), nc(36028797018963968, "36028797018963968", "0x80000000000000", "0o2000000000000000000", "0b10000000000000000000000000000000000000000000000000000000"), nc(36028797018963969, "36028797018963969", "0x80000000000001", "0o2000000000000000001", "0b10000000000000000000000000000000000000000000000000000001"), nc(72057594037927935, "72057594037927935", "0xffffffffffffff", "0o3777777777777777777", "0b11111111111111111111111111111111111111111111111111111111"), nc(72057594037927936, "72057594037927936", "0x100000000000000", "0o4000000000000000000", "0b100000000000000000000000000000000000000000000000000000000"), nc(72057594037927937, "72057594037927937", "0x100000000000001", "0o4000000000000000001", "0b100000000000000000000000000000000000000000000000000000001"), nc(92233720368547759, "92233720368547759", "0x147ae147ae147af", "0o5075341217270243657", "0b101000111101011100001010001111010111000010100011110101111"), nc(92233720368547760, "92233720368547760", "0x147ae147ae147b0", "0o5075341217270243660", "0b101000111101011100001010001111010111000010100011110110000"), nc(92233720368547761, "92233720368547761", "0x147ae147ae147b1", "0o5075341217270243661", "0b101000111101011100001010001111010111000010100011110110001"), nc(99999999999999999, "99999999999999999", "0x16345785d89ffff", "0o5432127413542377777", "0b101100011010001010111100001011101100010011111111111111111"), nc(100000000000000000, "100000000000000000", "0x16345785d8a0000", "0o5432127413542400000", "0b101100011010001010111100001011101100010100000000000000000"), nc(100000000000000001, "100000000000000001", "0x16345785d8a0001", "0o5432127413542400001", "0b101100011010001010111100001011101100010100000000000000001"), nc(144115188075855871, "144115188075855871", "0x1ffffffffffffff", "0o7777777777777777777", "0b111111111111111111111111111111111111111111111111111111111"), nc(144115188075855872, "144115188075855872", "0x200000000000000", "0o10000000000000000000", "0b1000000000000000000000000000000000000000000000000000000000"), nc(144115188075855873, "144115188075855873", "0x200000000000001", "0o10000000000000000001", "0b1000000000000000000000000000000000000000000000000000000001"), nc(288230376151711743, "288230376151711743", "0x3ffffffffffffff", "0o17777777777777777777", "0b1111111111111111111111111111111111111111111111111111111111"), nc(288230376151711744, "288230376151711744", "0x400000000000000", "0o20000000000000000000", "0b10000000000000000000000000000000000000000000000000000000000"), nc(288230376151711745, "288230376151711745", "0x400000000000001", "0o20000000000000000001", "0b10000000000000000000000000000000000000000000000000000000001"), nc(576460752303423487, "576460752303423487", "0x7ffffffffffffff", "0o37777777777777777777", "0b11111111111111111111111111111111111111111111111111111111111"), nc(576460752303423488, "576460752303423488", "0x800000000000000", "0o40000000000000000000", "0b100000000000000000000000000000000000000000000000000000000000"), nc(576460752303423489, "576460752303423489", "0x800000000000001", "0o40000000000000000001", "0b100000000000000000000000000000000000000000000000000000000001"), nc(922337203685477631, "922337203685477631", "0xcccccccccccccff", "0o63146314631463146377", "0b110011001100110011001100110011001100110011001100110011111111"), nc(922337203685477632, "922337203685477632", "0xccccccccccccd00", "0o63146314631463146400", "0b110011001100110011001100110011001100110011001100110100000000"), nc(922337203685477633, "922337203685477633", "0xccccccccccccd01", "0o63146314631463146401", "0b110011001100110011001100110011001100110011001100110100000001"), nc(999999999999999999, "999999999999999999", "0xde0b6b3a763ffff", "0o67405553164730777777", "0b110111100000101101101011001110100111011000111111111111111111"), nc(1000000000000000000, "1000000000000000000", "0xde0b6b3a7640000", "0o67405553164731000000", "0b110111100000101101101011001110100111011001000000000000000000"), nc(1000000000000000001, "1000000000000000001", "0xde0b6b3a7640001", "0o67405553164731000001", "0b110111100000101101101011001110100111011001000000000000000001"), nc(1152921504606846975, "1152921504606846975", "0xfffffffffffffff", "0o77777777777777777777", "0b111111111111111111111111111111111111111111111111111111111111"), nc(1152921504606846976, "1152921504606846976", "0x1000000000000000", "0o100000000000000000000", "0b1000000000000000000000000000000000000000000000000000000000000"), nc(1152921504606846977, "1152921504606846977", "0x1000000000000001", "0o100000000000000000001", "0b1000000000000000000000000000000000000000000000000000000000001"), nc(2305843009213693951, "2305843009213693951", "0x1fffffffffffffff", "0o177777777777777777777", "0b1111111111111111111111111111111111111111111111111111111111111"), nc(2305843009213693952, "2305843009213693952", "0x2000000000000000", "0o200000000000000000000", "0b10000000000000000000000000000000000000000000000000000000000000"), nc(2305843009213693953, "2305843009213693953", "0x2000000000000001", "0o200000000000000000001", "0b10000000000000000000000000000000000000000000000000000000000001"), nc(4611686018427387903, "4611686018427387903", "0x3fffffffffffffff", "0o377777777777777777777", "0b11111111111111111111111111111111111111111111111111111111111111"), nc(4611686018427387904, "4611686018427387904", "0x4000000000000000", "0o400000000000000000000", "0b100000000000000000000000000000000000000000000000000000000000000"), nc(4611686018427387905, "4611686018427387905", "0x4000000000000001", "0o400000000000000000001", "0b100000000000000000000000000000000000000000000000000000000000001"), nc(9223372036854775802, "9223372036854775802", "0x7ffffffffffffffa", "0o777777777777777777772", "0b111111111111111111111111111111111111111111111111111111111111010"), nc(9223372036854775803, "9223372036854775803", "0x7ffffffffffffffb", "0o777777777777777777773", "0b111111111111111111111111111111111111111111111111111111111111011"), nc(9223372036854775804, "9223372036854775804", "0x7ffffffffffffffc", "0o777777777777777777774", "0b111111111111111111111111111111111111111111111111111111111111100"), pc(9223372036854775805, "9223372036854775805", "0x7ffffffffffffffd", "0o777777777777777777775", "0b111111111111111111111111111111111111111111111111111111111111101", 9223372036854775806), pc(9223372036854775806, "9223372036854775806", "0x7ffffffffffffffe", "0o777777777777777777776", "0b111111111111111111111111111111111111111111111111111111111111110", 9223372036854775807), pcm1(9223372036854775807, "9223372036854775807", "0x7fffffffffffffff", "0o777777777777777777777", "0b111111111111111111111111111111111111111111111111111111111111111", -9223372036854775807), #undef nc #undef pc }; }; template<> struct numbers { using value_type = uint64_t; static C4_INLINE_CONSTEXPR const number_case vals[] = { #define nc(val, dec, hex, bin, oct) nc_(UINT64_C, val, dec, hex, bin, oct) #define pc(val, dec, hex, bin, oct, valp1) ncp_(UINT64_C, val, dec, hex, bin, oct, valp1) pc(0, "0", "0x0", "0o0", "0b0", 1), nc(1, "1", "0x1", "0o1", "0b1"), nc(2, "2", "0x2", "0o2", "0b10"), nc(3, "3", "0x3", "0o3", "0b11"), nc(4, "4", "0x4", "0o4", "0b100"), nc(5, "5", "0x5", "0o5", "0b101"), nc(6, "6", "0x6", "0o6", "0b110"), nc(7, "7", "0x7", "0o7", "0b111"), nc(8, "8", "0x8", "0o10", "0b1000"), nc(9, "9", "0x9", "0o11", "0b1001"), nc(10, "10", "0xa", "0o12", "0b1010"), nc(11, "11", "0xb", "0o13", "0b1011"), nc(15, "15", "0xf", "0o17", "0b1111"), nc(16, "16", "0x10", "0o20", "0b10000"), nc(17, "17", "0x11", "0o21", "0b10001"), nc(18, "18", "0x12", "0o22", "0b10010"), nc(19, "19", "0x13", "0o23", "0b10011"), nc(31, "31", "0x1f", "0o37", "0b11111"), nc(32, "32", "0x20", "0o40", "0b100000"), nc(33, "33", "0x21", "0o41", "0b100001"), nc(63, "63", "0x3f", "0o77", "0b111111"), nc(64, "64", "0x40", "0o100", "0b1000000"), nc(65, "65", "0x41", "0o101", "0b1000001"), nc(99, "99", "0x63", "0o143", "0b1100011"), nc(100, "100", "0x64", "0o144", "0b1100100"), nc(101, "101", "0x65", "0o145", "0b1100101"), nc(127, "127", "0x7f", "0o177", "0b1111111"), nc(128, "128", "0x80", "0o200", "0b10000000"), nc(129, "129", "0x81", "0o201", "0b10000001"), nc(183, "183", "0xb7", "0o267", "0b10110111"), nc(184, "184", "0xb8", "0o270", "0b10111000"), nc(185, "185", "0xb9", "0o271", "0b10111001"), nc(255, "255", "0xff", "0o377", "0b11111111"), nc(256, "256", "0x100", "0o400", "0b100000000"), nc(257, "257", "0x101", "0o401", "0b100000001"), nc(511, "511", "0x1ff", "0o777", "0b111111111"), nc(512, "512", "0x200", "0o1000", "0b1000000000"), nc(513, "513", "0x201", "0o1001", "0b1000000001"), nc(999, "999", "0x3e7", "0o1747", "0b1111100111"), nc(1000, "1000", "0x3e8", "0o1750", "0b1111101000"), nc(1001, "1001", "0x3e9", "0o1751", "0b1111101001"), nc(1023, "1023", "0x3ff", "0o1777", "0b1111111111"), nc(1024, "1024", "0x400", "0o2000", "0b10000000000"), nc(1025, "1025", "0x401", "0o2001", "0b10000000001"), nc(1843, "1843", "0x733", "0o3463", "0b11100110011"), nc(1844, "1844", "0x734", "0o3464", "0b11100110100"), nc(1845, "1845", "0x735", "0o3465", "0b11100110101"), nc(2047, "2047", "0x7ff", "0o3777", "0b11111111111"), nc(2048, "2048", "0x800", "0o4000", "0b100000000000"), nc(2049, "2049", "0x801", "0o4001", "0b100000000001"), nc(4095, "4095", "0xfff", "0o7777", "0b111111111111"), nc(4096, "4096", "0x1000", "0o10000", "0b1000000000000"), nc(4097, "4097", "0x1001", "0o10001", "0b1000000000001"), nc(8191, "8191", "0x1fff", "0o17777", "0b1111111111111"), nc(8192, "8192", "0x2000", "0o20000", "0b10000000000000"), nc(8193, "8193", "0x2001", "0o20001", "0b10000000000001"), nc(9999, "9999", "0x270f", "0o23417", "0b10011100001111"), nc(10000, "10000", "0x2710", "0o23420", "0b10011100010000"), nc(10001, "10001", "0x2711", "0o23421", "0b10011100010001"), nc(16383, "16383", "0x3fff", "0o37777", "0b11111111111111"), nc(16384, "16384", "0x4000", "0o40000", "0b100000000000000"), nc(16385, "16385", "0x4001", "0o40001", "0b100000000000001"), nc(18445, "18445", "0x480d", "0o44015", "0b100100000001101"), nc(18446, "18446", "0x480e", "0o44016", "0b100100000001110"), nc(18447, "18447", "0x480f", "0o44017", "0b100100000001111"), nc(32767, "32767", "0x7fff", "0o77777", "0b111111111111111"), nc(32768, "32768", "0x8000", "0o100000", "0b1000000000000000"), nc(32769, "32769", "0x8001", "0o100001", "0b1000000000000001"), nc(65535, "65535", "0xffff", "0o177777", "0b1111111111111111"), nc(65536, "65536", "0x10000", "0o200000", "0b10000000000000000"), nc(65537, "65537", "0x10001", "0o200001", "0b10000000000000001"), nc(99999, "99999", "0x1869f", "0o303237", "0b11000011010011111"), nc(100000, "100000", "0x186a0", "0o303240", "0b11000011010100000"), nc(100001, "100001", "0x186a1", "0o303241", "0b11000011010100001"), nc(131071, "131071", "0x1ffff", "0o377777", "0b11111111111111111"), nc(131072, "131072", "0x20000", "0o400000", "0b100000000000000000"), nc(131073, "131073", "0x20001", "0o400001", "0b100000000000000001"), nc(184466, "184466", "0x2d092", "0o550222", "0b101101000010010010"), nc(184467, "184467", "0x2d093", "0o550223", "0b101101000010010011"), nc(184468, "184468", "0x2d094", "0o550224", "0b101101000010010100"), nc(262143, "262143", "0x3ffff", "0o777777", "0b111111111111111111"), nc(262144, "262144", "0x40000", "0o1000000", "0b1000000000000000000"), nc(262145, "262145", "0x40001", "0o1000001", "0b1000000000000000001"), nc(524287, "524287", "0x7ffff", "0o1777777", "0b1111111111111111111"), nc(524288, "524288", "0x80000", "0o2000000", "0b10000000000000000000"), nc(524289, "524289", "0x80001", "0o2000001", "0b10000000000000000001"), nc(999999, "999999", "0xf423f", "0o3641077", "0b11110100001000111111"), nc(1000000, "1000000", "0xf4240", "0o3641100", "0b11110100001001000000"), nc(1000001, "1000001", "0xf4241", "0o3641101", "0b11110100001001000001"), nc(1048575, "1048575", "0xfffff", "0o3777777", "0b11111111111111111111"), nc(1048576, "1048576", "0x100000", "0o4000000", "0b100000000000000000000"), nc(1048577, "1048577", "0x100001", "0o4000001", "0b100000000000000000001"), nc(1844673, "1844673", "0x1c25c1", "0o7022701", "0b111000010010111000001"), nc(1844674, "1844674", "0x1c25c2", "0o7022702", "0b111000010010111000010"), nc(1844675, "1844675", "0x1c25c3", "0o7022703", "0b111000010010111000011"), nc(2097151, "2097151", "0x1fffff", "0o7777777", "0b111111111111111111111"), nc(2097152, "2097152", "0x200000", "0o10000000", "0b1000000000000000000000"), nc(2097153, "2097153", "0x200001", "0o10000001", "0b1000000000000000000001"), nc(4194303, "4194303", "0x3fffff", "0o17777777", "0b1111111111111111111111"), nc(4194304, "4194304", "0x400000", "0o20000000", "0b10000000000000000000000"), nc(4194305, "4194305", "0x400001", "0o20000001", "0b10000000000000000000001"), nc(8388607, "8388607", "0x7fffff", "0o37777777", "0b11111111111111111111111"), nc(8388608, "8388608", "0x800000", "0o40000000", "0b100000000000000000000000"), nc(8388609, "8388609", "0x800001", "0o40000001", "0b100000000000000000000001"), nc(9999999, "9999999", "0x98967f", "0o46113177", "0b100110001001011001111111"), nc(10000000, "10000000", "0x989680", "0o46113200", "0b100110001001011010000000"), nc(10000001, "10000001", "0x989681", "0o46113201", "0b100110001001011010000001"), nc(16777215, "16777215", "0xffffff", "0o77777777", "0b111111111111111111111111"), nc(16777216, "16777216", "0x1000000", "0o100000000", "0b1000000000000000000000000"), nc(16777217, "16777217", "0x1000001", "0o100000001", "0b1000000000000000000000001"), nc(18446743, "18446743", "0x1197997", "0o106274627", "0b1000110010111100110010111"), nc(18446744, "18446744", "0x1197998", "0o106274630", "0b1000110010111100110011000"), nc(18446745, "18446745", "0x1197999", "0o106274631", "0b1000110010111100110011001"), nc(33554431, "33554431", "0x1ffffff", "0o177777777", "0b1111111111111111111111111"), nc(33554432, "33554432", "0x2000000", "0o200000000", "0b10000000000000000000000000"), nc(33554433, "33554433", "0x2000001", "0o200000001", "0b10000000000000000000000001"), nc(67108863, "67108863", "0x3ffffff", "0o377777777", "0b11111111111111111111111111"), nc(67108864, "67108864", "0x4000000", "0o400000000", "0b100000000000000000000000000"), nc(67108865, "67108865", "0x4000001", "0o400000001", "0b100000000000000000000000001"), nc(99999999, "99999999", "0x5f5e0ff", "0o575360377", "0b101111101011110000011111111"), nc(100000000, "100000000", "0x5f5e100", "0o575360400", "0b101111101011110000100000000"), nc(100000001, "100000001", "0x5f5e101", "0o575360401", "0b101111101011110000100000001"), nc(134217727, "134217727", "0x7ffffff", "0o777777777", "0b111111111111111111111111111"), nc(134217728, "134217728", "0x8000000", "0o1000000000", "0b1000000000000000000000000000"), nc(134217729, "134217729", "0x8000001", "0o1000000001", "0b1000000000000000000000000001"), nc(184467439, "184467439", "0xafebfef", "0o1277537757", "0b1010111111101011111111101111"), nc(184467440, "184467440", "0xafebff0", "0o1277537760", "0b1010111111101011111111110000"), nc(184467441, "184467441", "0xafebff1", "0o1277537761", "0b1010111111101011111111110001"), nc(268435455, "268435455", "0xfffffff", "0o1777777777", "0b1111111111111111111111111111"), nc(268435456, "268435456", "0x10000000", "0o2000000000", "0b10000000000000000000000000000"), nc(268435457, "268435457", "0x10000001", "0o2000000001", "0b10000000000000000000000000001"), nc(536870911, "536870911", "0x1fffffff", "0o3777777777", "0b11111111111111111111111111111"), nc(536870912, "536870912", "0x20000000", "0o4000000000", "0b100000000000000000000000000000"), nc(536870913, "536870913", "0x20000001", "0o4000000001", "0b100000000000000000000000000001"), nc(999999999, "999999999", "0x3b9ac9ff", "0o7346544777", "0b111011100110101100100111111111"), nc(1000000000, "1000000000", "0x3b9aca00", "0o7346545000", "0b111011100110101100101000000000"), nc(1000000001, "1000000001", "0x3b9aca01", "0o7346545001", "0b111011100110101100101000000001"), nc(1073741823, "1073741823", "0x3fffffff", "0o7777777777", "0b111111111111111111111111111111"), nc(1073741824, "1073741824", "0x40000000", "0o10000000000", "0b1000000000000000000000000000000"), nc(1073741825, "1073741825", "0x40000001", "0o10000000001", "0b1000000000000000000000000000001"), nc(1844674406, "1844674406", "0x6df37f66", "0o15574677546", "0b1101101111100110111111101100110"), nc(1844674407, "1844674407", "0x6df37f67", "0o15574677547", "0b1101101111100110111111101100111"), nc(1844674408, "1844674408", "0x6df37f68", "0o15574677550", "0b1101101111100110111111101101000"), nc(2147483647, "2147483647", "0x7fffffff", "0o17777777777", "0b1111111111111111111111111111111"), nc(2147483648, "2147483648", "0x80000000", "0o20000000000", "0b10000000000000000000000000000000"), nc(2147483649, "2147483649", "0x80000001", "0o20000000001", "0b10000000000000000000000000000001"), nc(4294967295, "4294967295", "0xffffffff", "0o37777777777", "0b11111111111111111111111111111111"), nc(4294967296, "4294967296", "0x100000000", "0o40000000000", "0b100000000000000000000000000000000"), nc(4294967297, "4294967297", "0x100000001", "0o40000000001", "0b100000000000000000000000000000001"), nc(8589934591, "8589934591", "0x1ffffffff", "0o77777777777", "0b111111111111111111111111111111111"), nc(8589934592, "8589934592", "0x200000000", "0o100000000000", "0b1000000000000000000000000000000000"), nc(8589934593, "8589934593", "0x200000001", "0o100000000001", "0b1000000000000000000000000000000001"), nc(9999999999, "9999999999", "0x2540be3ff", "0o112402761777", "0b1001010100000010111110001111111111"), nc(10000000000, "10000000000", "0x2540be400", "0o112402762000", "0b1001010100000010111110010000000000"), nc(10000000001, "10000000001", "0x2540be401", "0o112402762001", "0b1001010100000010111110010000000001"), nc(17179869183, "17179869183", "0x3ffffffff", "0o177777777777", "0b1111111111111111111111111111111111"), nc(17179869184, "17179869184", "0x400000000", "0o200000000000", "0b10000000000000000000000000000000000"), nc(17179869185, "17179869185", "0x400000001", "0o200000000001", "0b10000000000000000000000000000000001"), nc(18446744072, "18446744072", "0x44b82fa08", "0o211340575010", "0b10001001011100000101111101000001000"), nc(18446744073, "18446744073", "0x44b82fa09", "0o211340575011", "0b10001001011100000101111101000001001"), nc(18446744074, "18446744074", "0x44b82fa0a", "0o211340575012", "0b10001001011100000101111101000001010"), nc(34359738367, "34359738367", "0x7ffffffff", "0o377777777777", "0b11111111111111111111111111111111111"), nc(34359738368, "34359738368", "0x800000000", "0o400000000000", "0b100000000000000000000000000000000000"), nc(34359738369, "34359738369", "0x800000001", "0o400000000001", "0b100000000000000000000000000000000001"), nc(68719476735, "68719476735", "0xfffffffff", "0o777777777777", "0b111111111111111111111111111111111111"), nc(68719476736, "68719476736", "0x1000000000", "0o1000000000000", "0b1000000000000000000000000000000000000"), nc(68719476737, "68719476737", "0x1000000001", "0o1000000000001", "0b1000000000000000000000000000000000001"), nc(99999999999, "99999999999", "0x174876e7ff", "0o1351035563777", "0b1011101001000011101101110011111111111"), nc(100000000000, "100000000000", "0x174876e800", "0o1351035564000", "0b1011101001000011101101110100000000000"), nc(100000000001, "100000000001", "0x174876e801", "0o1351035564001", "0b1011101001000011101101110100000000001"), nc(137438953471, "137438953471", "0x1fffffffff", "0o1777777777777", "0b1111111111111111111111111111111111111"), nc(137438953472, "137438953472", "0x2000000000", "0o2000000000000", "0b10000000000000000000000000000000000000"), nc(137438953473, "137438953473", "0x2000000001", "0o2000000000001", "0b10000000000000000000000000000000000001"), nc(184467440736, "184467440736", "0x2af31dc460", "0o2536307342140", "0b10101011110011000111011100010001100000"), nc(184467440737, "184467440737", "0x2af31dc461", "0o2536307342141", "0b10101011110011000111011100010001100001"), nc(184467440738, "184467440738", "0x2af31dc462", "0o2536307342142", "0b10101011110011000111011100010001100010"), nc(274877906943, "274877906943", "0x3fffffffff", "0o3777777777777", "0b11111111111111111111111111111111111111"), nc(274877906944, "274877906944", "0x4000000000", "0o4000000000000", "0b100000000000000000000000000000000000000"), nc(274877906945, "274877906945", "0x4000000001", "0o4000000000001", "0b100000000000000000000000000000000000001"), nc(549755813887, "549755813887", "0x7fffffffff", "0o7777777777777", "0b111111111111111111111111111111111111111"), nc(549755813888, "549755813888", "0x8000000000", "0o10000000000000", "0b1000000000000000000000000000000000000000"), nc(549755813889, "549755813889", "0x8000000001", "0o10000000000001", "0b1000000000000000000000000000000000000001"), nc(999999999999, "999999999999", "0xe8d4a50fff", "0o16432451207777", "0b1110100011010100101001010000111111111111"), nc(1000000000000, "1000000000000", "0xe8d4a51000", "0o16432451210000", "0b1110100011010100101001010001000000000000"), nc(1000000000001, "1000000000001", "0xe8d4a51001", "0o16432451210001", "0b1110100011010100101001010001000000000001"), nc(1099511627775, "1099511627775", "0xffffffffff", "0o17777777777777", "0b1111111111111111111111111111111111111111"), nc(1099511627776, "1099511627776", "0x10000000000", "0o20000000000000", "0b10000000000000000000000000000000000000000"), nc(1099511627777, "1099511627777", "0x10000000001", "0o20000000000001", "0b10000000000000000000000000000000000000001"), nc(1844674407369, "1844674407369", "0x1ad7f29abc9", "0o32657712325711", "0b11010110101111111001010011010101111001001"), nc(1844674407370, "1844674407370", "0x1ad7f29abca", "0o32657712325712", "0b11010110101111111001010011010101111001010"), nc(1844674407371, "1844674407371", "0x1ad7f29abcb", "0o32657712325713", "0b11010110101111111001010011010101111001011"), nc(2199023255551, "2199023255551", "0x1ffffffffff", "0o37777777777777", "0b11111111111111111111111111111111111111111"), nc(2199023255552, "2199023255552", "0x20000000000", "0o40000000000000", "0b100000000000000000000000000000000000000000"), nc(2199023255553, "2199023255553", "0x20000000001", "0o40000000000001", "0b100000000000000000000000000000000000000001"), nc(4398046511103, "4398046511103", "0x3ffffffffff", "0o77777777777777", "0b111111111111111111111111111111111111111111"), nc(4398046511104, "4398046511104", "0x40000000000", "0o100000000000000", "0b1000000000000000000000000000000000000000000"), nc(4398046511105, "4398046511105", "0x40000000001", "0o100000000000001", "0b1000000000000000000000000000000000000000001"), nc(8796093022207, "8796093022207", "0x7ffffffffff", "0o177777777777777", "0b1111111111111111111111111111111111111111111"), nc(8796093022208, "8796093022208", "0x80000000000", "0o200000000000000", "0b10000000000000000000000000000000000000000000"), nc(8796093022209, "8796093022209", "0x80000000001", "0o200000000000001", "0b10000000000000000000000000000000000000000001"), nc(9999999999999, "9999999999999", "0x9184e729fff", "0o221411634517777", "0b10010001100001001110011100101001111111111111"), nc(10000000000000, "10000000000000", "0x9184e72a000", "0o221411634520000", "0b10010001100001001110011100101010000000000000"), nc(10000000000001, "10000000000001", "0x9184e72a001", "0o221411634520001", "0b10010001100001001110011100101010000000000001"), nc(17592186044415, "17592186044415", "0xfffffffffff", "0o377777777777777", "0b11111111111111111111111111111111111111111111"), nc(17592186044416, "17592186044416", "0x100000000000", "0o400000000000000", "0b100000000000000000000000000000000000000000000"), nc(17592186044417, "17592186044417", "0x100000000001", "0o400000000000001", "0b100000000000000000000000000000000000000000001"), nc(18446744073708, "18446744073708", "0x10c6f7a0b5ec", "0o414336750132754", "0b100001100011011110111101000001011010111101100"), nc(18446744073709, "18446744073709", "0x10c6f7a0b5ed", "0o414336750132755", "0b100001100011011110111101000001011010111101101"), nc(18446744073710, "18446744073710", "0x10c6f7a0b5ee", "0o414336750132756", "0b100001100011011110111101000001011010111101110"), nc(35184372088831, "35184372088831", "0x1fffffffffff", "0o777777777777777", "0b111111111111111111111111111111111111111111111"), nc(35184372088832, "35184372088832", "0x200000000000", "0o1000000000000000", "0b1000000000000000000000000000000000000000000000"), nc(35184372088833, "35184372088833", "0x200000000001", "0o1000000000000001", "0b1000000000000000000000000000000000000000000001"), nc(70368744177663, "70368744177663", "0x3fffffffffff", "0o1777777777777777", "0b1111111111111111111111111111111111111111111111"), nc(70368744177664, "70368744177664", "0x400000000000", "0o2000000000000000", "0b10000000000000000000000000000000000000000000000"), nc(70368744177665, "70368744177665", "0x400000000001", "0o2000000000000001", "0b10000000000000000000000000000000000000000000001"), nc(99999999999999, "99999999999999", "0x5af3107a3fff", "0o2657142036437777", "0b10110101111001100010000011110100011111111111111"), nc(100000000000000, "100000000000000", "0x5af3107a4000", "0o2657142036440000", "0b10110101111001100010000011110100100000000000000"), nc(100000000000001, "100000000000001", "0x5af3107a4001", "0o2657142036440001", "0b10110101111001100010000011110100100000000000001"), nc(140737488355327, "140737488355327", "0x7fffffffffff", "0o3777777777777777", "0b11111111111111111111111111111111111111111111111"), nc(140737488355328, "140737488355328", "0x800000000000", "0o4000000000000000", "0b100000000000000000000000000000000000000000000000"), nc(140737488355329, "140737488355329", "0x800000000001", "0o4000000000000001", "0b100000000000000000000000000000000000000000000001"), nc(184467440737094, "184467440737094", "0xa7c5ac471b46", "0o5174265421615506", "0b101001111100010110101100010001110001101101000110"), nc(184467440737095, "184467440737095", "0xa7c5ac471b47", "0o5174265421615507", "0b101001111100010110101100010001110001101101000111"), nc(184467440737096, "184467440737096", "0xa7c5ac471b48", "0o5174265421615510", "0b101001111100010110101100010001110001101101001000"), nc(281474976710655, "281474976710655", "0xffffffffffff", "0o7777777777777777", "0b111111111111111111111111111111111111111111111111"), nc(281474976710656, "281474976710656", "0x1000000000000", "0o10000000000000000", "0b1000000000000000000000000000000000000000000000000"), nc(281474976710657, "281474976710657", "0x1000000000001", "0o10000000000000001", "0b1000000000000000000000000000000000000000000000001"), nc(562949953421311, "562949953421311", "0x1ffffffffffff", "0o17777777777777777", "0b1111111111111111111111111111111111111111111111111"), nc(562949953421312, "562949953421312", "0x2000000000000", "0o20000000000000000", "0b10000000000000000000000000000000000000000000000000"), nc(562949953421313, "562949953421313", "0x2000000000001", "0o20000000000000001", "0b10000000000000000000000000000000000000000000000001"), nc(999999999999999, "999999999999999", "0x38d7ea4c67fff", "0o34327724461477777", "0b11100011010111111010100100110001100111111111111111"), nc(1000000000000000, "1000000000000000", "0x38d7ea4c68000", "0o34327724461500000", "0b11100011010111111010100100110001101000000000000000"), nc(1000000000000001, "1000000000000001", "0x38d7ea4c68001", "0o34327724461500001", "0b11100011010111111010100100110001101000000000000001"), nc(1125899906842623, "1125899906842623", "0x3ffffffffffff", "0o37777777777777777", "0b11111111111111111111111111111111111111111111111111"), nc(1125899906842624, "1125899906842624", "0x4000000000000", "0o40000000000000000", "0b100000000000000000000000000000000000000000000000000"), nc(1125899906842625, "1125899906842625", "0x4000000000001", "0o40000000000000001", "0b100000000000000000000000000000000000000000000000001"), nc(1844674407370954, "1844674407370954", "0x68db8bac710ca", "0o64333427261610312", "0b110100011011011100010111010110001110001000011001010"), nc(1844674407370955, "1844674407370955", "0x68db8bac710cb", "0o64333427261610313", "0b110100011011011100010111010110001110001000011001011"), nc(1844674407370956, "1844674407370956", "0x68db8bac710cc", "0o64333427261610314", "0b110100011011011100010111010110001110001000011001100"), nc(2251799813685247, "2251799813685247", "0x7ffffffffffff", "0o77777777777777777", "0b111111111111111111111111111111111111111111111111111"), nc(2251799813685248, "2251799813685248", "0x8000000000000", "0o100000000000000000", "0b1000000000000000000000000000000000000000000000000000"), nc(2251799813685249, "2251799813685249", "0x8000000000001", "0o100000000000000001", "0b1000000000000000000000000000000000000000000000000001"), nc(4503599627370495, "4503599627370495", "0xfffffffffffff", "0o177777777777777777", "0b1111111111111111111111111111111111111111111111111111"), nc(4503599627370496, "4503599627370496", "0x10000000000000", "0o200000000000000000", "0b10000000000000000000000000000000000000000000000000000"), nc(4503599627370497, "4503599627370497", "0x10000000000001", "0o200000000000000001", "0b10000000000000000000000000000000000000000000000000001"), nc(9007199254740991, "9007199254740991", "0x1fffffffffffff", "0o377777777777777777", "0b11111111111111111111111111111111111111111111111111111"), nc(9007199254740992, "9007199254740992", "0x20000000000000", "0o400000000000000000", "0b100000000000000000000000000000000000000000000000000000"), nc(9007199254740993, "9007199254740993", "0x20000000000001", "0o400000000000000001", "0b100000000000000000000000000000000000000000000000000001"), nc(9999999999999999, "9999999999999999", "0x2386f26fc0ffff", "0o434157115760177777", "0b100011100001101111001001101111110000001111111111111111"), nc(10000000000000000, "10000000000000000", "0x2386f26fc10000", "0o434157115760200000", "0b100011100001101111001001101111110000010000000000000000"), nc(10000000000000001, "10000000000000001", "0x2386f26fc10001", "0o434157115760200001", "0b100011100001101111001001101111110000010000000000000001"), nc(18014398509481983, "18014398509481983", "0x3fffffffffffff", "0o777777777777777777", "0b111111111111111111111111111111111111111111111111111111"), nc(18014398509481984, "18014398509481984", "0x40000000000000", "0o1000000000000000000", "0b1000000000000000000000000000000000000000000000000000000"), nc(18014398509481985, "18014398509481985", "0x40000000000001", "0o1000000000000000001", "0b1000000000000000000000000000000000000000000000000000001"), nc(18446744073709551, "18446744073709551", "0x4189374bc6a7ef", "0o1014223351361523757", "0b1000001100010010011011101001011110001101010011111101111"), nc(18446744073709552, "18446744073709552", "0x4189374bc6a7f0", "0o1014223351361523760", "0b1000001100010010011011101001011110001101010011111110000"), nc(18446744073709553, "18446744073709553", "0x4189374bc6a7f1", "0o1014223351361523761", "0b1000001100010010011011101001011110001101010011111110001"), nc(36028797018963967, "36028797018963967", "0x7fffffffffffff", "0o1777777777777777777", "0b1111111111111111111111111111111111111111111111111111111"), nc(36028797018963968, "36028797018963968", "0x80000000000000", "0o2000000000000000000", "0b10000000000000000000000000000000000000000000000000000000"), nc(36028797018963969, "36028797018963969", "0x80000000000001", "0o2000000000000000001", "0b10000000000000000000000000000000000000000000000000000001"), nc(72057594037927935, "72057594037927935", "0xffffffffffffff", "0o3777777777777777777", "0b11111111111111111111111111111111111111111111111111111111"), nc(72057594037927936, "72057594037927936", "0x100000000000000", "0o4000000000000000000", "0b100000000000000000000000000000000000000000000000000000000"), nc(72057594037927937, "72057594037927937", "0x100000000000001", "0o4000000000000000001", "0b100000000000000000000000000000000000000000000000000000001"), nc(99999999999999999, "99999999999999999", "0x16345785d89ffff", "0o5432127413542377777", "0b101100011010001010111100001011101100010011111111111111111"), nc(100000000000000000, "100000000000000000", "0x16345785d8a0000", "0o5432127413542400000", "0b101100011010001010111100001011101100010100000000000000000"), nc(100000000000000001, "100000000000000001", "0x16345785d8a0001", "0o5432127413542400001", "0b101100011010001010111100001011101100010100000000000000001"), nc(144115188075855871, "144115188075855871", "0x1ffffffffffffff", "0o7777777777777777777", "0b111111111111111111111111111111111111111111111111111111111"), nc(144115188075855872, "144115188075855872", "0x200000000000000", "0o10000000000000000000", "0b1000000000000000000000000000000000000000000000000000000000"), nc(144115188075855873, "144115188075855873", "0x200000000000001", "0o10000000000000000001", "0b1000000000000000000000000000000000000000000000000000000001"), nc(184467440737095519, "184467440737095519", "0x28f5c28f5c28f5f", "0o12172702436560507537", "0b1010001111010111000010100011110101110000101000111101011111"), nc(184467440737095520, "184467440737095520", "0x28f5c28f5c28f60", "0o12172702436560507540", "0b1010001111010111000010100011110101110000101000111101100000"), nc(184467440737095521, "184467440737095521", "0x28f5c28f5c28f61", "0o12172702436560507541", "0b1010001111010111000010100011110101110000101000111101100001"), nc(288230376151711743, "288230376151711743", "0x3ffffffffffffff", "0o17777777777777777777", "0b1111111111111111111111111111111111111111111111111111111111"), nc(288230376151711744, "288230376151711744", "0x400000000000000", "0o20000000000000000000", "0b10000000000000000000000000000000000000000000000000000000000"), nc(288230376151711745, "288230376151711745", "0x400000000000001", "0o20000000000000000001", "0b10000000000000000000000000000000000000000000000000000000001"), nc(576460752303423487, "576460752303423487", "0x7ffffffffffffff", "0o37777777777777777777", "0b11111111111111111111111111111111111111111111111111111111111"), nc(576460752303423488, "576460752303423488", "0x800000000000000", "0o40000000000000000000", "0b100000000000000000000000000000000000000000000000000000000000"), nc(576460752303423489, "576460752303423489", "0x800000000000001", "0o40000000000000000001", "0b100000000000000000000000000000000000000000000000000000000001"), nc(999999999999999999, "999999999999999999", "0xde0b6b3a763ffff", "0o67405553164730777777", "0b110111100000101101101011001110100111011000111111111111111111"), nc(1000000000000000000, "1000000000000000000", "0xde0b6b3a7640000", "0o67405553164731000000", "0b110111100000101101101011001110100111011001000000000000000000"), nc(1000000000000000001, "1000000000000000001", "0xde0b6b3a7640001", "0o67405553164731000001", "0b110111100000101101101011001110100111011001000000000000000001"), nc(1152921504606846975, "1152921504606846975", "0xfffffffffffffff", "0o77777777777777777777", "0b111111111111111111111111111111111111111111111111111111111111"), nc(1152921504606846976, "1152921504606846976", "0x1000000000000000", "0o100000000000000000000", "0b1000000000000000000000000000000000000000000000000000000000000"), nc(1152921504606846977, "1152921504606846977", "0x1000000000000001", "0o100000000000000000001", "0b1000000000000000000000000000000000000000000000000000000000001"), nc(1844674407370955263, "1844674407370955263", "0x19999999999999ff", "0o146314631463146314777", "0b1100110011001100110011001100110011001100110011001100111111111"), nc(1844674407370955264, "1844674407370955264", "0x1999999999999a00", "0o146314631463146315000", "0b1100110011001100110011001100110011001100110011001101000000000"), nc(1844674407370955265, "1844674407370955265", "0x1999999999999a01", "0o146314631463146315001", "0b1100110011001100110011001100110011001100110011001101000000001"), nc(2305843009213693951, "2305843009213693951", "0x1fffffffffffffff", "0o177777777777777777777", "0b1111111111111111111111111111111111111111111111111111111111111"), nc(2305843009213693952, "2305843009213693952", "0x2000000000000000", "0o200000000000000000000", "0b10000000000000000000000000000000000000000000000000000000000000"), nc(2305843009213693953, "2305843009213693953", "0x2000000000000001", "0o200000000000000000001", "0b10000000000000000000000000000000000000000000000000000000000001"), nc(4611686018427387903, "4611686018427387903", "0x3fffffffffffffff", "0o377777777777777777777", "0b11111111111111111111111111111111111111111111111111111111111111"), nc(4611686018427387904, "4611686018427387904", "0x4000000000000000", "0o400000000000000000000", "0b100000000000000000000000000000000000000000000000000000000000000"), nc(4611686018427387905, "4611686018427387905", "0x4000000000000001", "0o400000000000000000001", "0b100000000000000000000000000000000000000000000000000000000000001"), nc(9223372036854775807, "9223372036854775807", "0x7fffffffffffffff", "0o777777777777777777777", "0b111111111111111111111111111111111111111111111111111111111111111"), nc(9223372036854775808, "9223372036854775808", "0x8000000000000000", "0o1000000000000000000000", "0b1000000000000000000000000000000000000000000000000000000000000000"), nc(9223372036854775809, "9223372036854775809", "0x8000000000000001", "0o1000000000000000000001", "0b1000000000000000000000000000000000000000000000000000000000000001"), nc(9999999999999999999, "9999999999999999999", "0x8ac7230489e7ffff", "0o1053071060221171777777", "0b1000101011000111001000110000010010001001111001111111111111111111"), nc(10000000000000000000, "10000000000000000000", "0x8ac7230489e80000", "0o1053071060221172000000", "0b1000101011000111001000110000010010001001111010000000000000000000"), nc(10000000000000000001, "10000000000000000001", "0x8ac7230489e80001", "0o1053071060221172000001", "0b1000101011000111001000110000010010001001111010000000000000000001"), nc(18446744073709551611, "18446744073709551611", "0xfffffffffffffffb", "0o1777777777777777777773", "0b1111111111111111111111111111111111111111111111111111111111111011"), nc(18446744073709551612, "18446744073709551612", "0xfffffffffffffffc", "0o1777777777777777777774", "0b1111111111111111111111111111111111111111111111111111111111111100"), nc(18446744073709551613, "18446744073709551613", "0xfffffffffffffffd", "0o1777777777777777777775", "0b1111111111111111111111111111111111111111111111111111111111111101"), pc(18446744073709551614, "18446744073709551614", "0xfffffffffffffffe", "0o1777777777777777777776", "0b1111111111111111111111111111111111111111111111111111111111111110", 18446744073709551615), pc(18446744073709551615, "18446744073709551615", "0xffffffffffffffff", "0o1777777777777777777777", "0b1111111111111111111111111111111111111111111111111111111111111111", 0), #undef nc #undef pc }; }; C4_INLINE_CONSTEXPR const number_case numbers::vals[]; C4_INLINE_CONSTEXPR const number_case numbers::vals[]; C4_INLINE_CONSTEXPR const number_case numbers::vals[]; C4_INLINE_CONSTEXPR const number_case numbers::vals[]; C4_INLINE_CONSTEXPR const number_case numbers::vals[]; C4_INLINE_CONSTEXPR const number_case numbers::vals[]; C4_INLINE_CONSTEXPR const number_case numbers::vals[]; C4_INLINE_CONSTEXPR const number_case numbers::vals[]; C4_SUPPRESS_WARNING_MSVC_POP } // namespace c4 c4core-0.2.6/test/test_preprocessor.cpp000066400000000000000000000022621477602032300201540ustar00rootroot00000000000000#ifndef C4CORE_SINGLE_HEADER #include "c4/preprocessor.hpp" #include "c4/language.hpp" #endif #ifdef WE_LL_GET_THERE___MSVC_CANT_HANDLE_THE_FOREACH_MACRO___NEEDS_TO_BE_FIXED #include #include struct SomeStruct { int32_t a; int32_t b; int32_t c; int32_t d; }; TEST(TestForEach, print_offsets) { #define M_OFFS_(structure, field) m[#field] = offsetof(structure, field) #define M_OFFS(field) M_OFFS_(SomeStruct, field) std::map< std::string, size_t > m; C4_FOR_EACH(M_OFFS, a, b, c); C4_FOR_EACH(M_OFFS, d); EXPECT_EQ(m["a"], 0); EXPECT_EQ(m["b"], 4); EXPECT_EQ(m["c"], 8); EXPECT_EQ(m["d"], 12); } //----------------------------------------------------------------------------- // C4_BEGIN_NAMESPACE()/C4_END_NAMESPACE() are implemented with C4_FOR_EACH(). // Test these here too. namespace a, b, c { int a_var = 0; } // namespace c, b int var = 1; // a::var namespace b { int var = 2; // a::b::var namespace c { int var = 3; // a::b::c::var } // namespace c, b, a TEST(TestForEach, begin_end_namespace) { EXPECT_EQ(a::b::c::a_var, 0); EXPECT_EQ(a::var, 1); EXPECT_EQ(a::b::var, 2); EXPECT_EQ(a::b::c::var, 3); } #endif c4core-0.2.6/test/test_singleheader/000077500000000000000000000000001477602032300173525ustar00rootroot00000000000000c4core-0.2.6/test/test_singleheader/CMakeLists.txt000066400000000000000000000030221477602032300221070ustar00rootroot00000000000000cmake_minimum_required(VERSION 3.15 FATAL_ERROR) project(c4core DESCRIPTION "Single header version of c4core library for testing" HOMEPAGE_URL "https://github.com/biojppm/c4core" LANGUAGES CXX) include(../../cmake/c4Project.cmake) c4_project(VERSION 0.2.6 AUTHOR "Joao Paulo Magalhaes ") # amalgamate c4core to get the single header function(amalgamate_c4core header_dir header_file) set(c4coredir "${CMAKE_CURRENT_LIST_DIR}/../..") set(singleheaderdir "${c4coredir}/src_singleheader") set(singleheader "${singleheaderdir}/c4/c4core_all.hpp") set(amscript "${c4coredir}/tools/amalgamate.py") file(GLOB_RECURSE srcfiles LIST_DIRECTORIES FALSE CONFIGURE_DEPENDS "${c4coredir}/src") add_custom_command(OUTPUT "${singleheader}" COMMAND python "${amscript}" "${singleheader}" COMMENT "python ${amscript} ${singleheader}" DEPENDS ${srcfiles} "${amscript}" "${c4coredir}/cmake/amalgamate_utils.py") set(${header_dir} "${singleheaderdir}" PARENT_SCOPE) set(${header_file} "${singleheader}" PARENT_SCOPE) endfunction() amalgamate_c4core(HEADER_DIR HEADER_FILE) c4_add_library(c4core INC_DIRS $ $ SOURCE_ROOT ${HEADER_DIR} SOURCES ${HEADER_FILE} ${CMAKE_CURRENT_LIST_DIR}/libc4core_singleheader.cpp) target_compile_definitions(c4core PUBLIC -DC4CORE_SINGLE_HEADER) enable_testing() set(C4CORE_DEFINED_FROM_SINGLEHEADER ON) add_subdirectory(../../test test) c4core-0.2.6/test/test_singleheader/libc4core_singleheader.cpp000066400000000000000000000001021477602032300244270ustar00rootroot00000000000000#define C4CORE_SINGLE_HDR_DEFINE_NOW #include c4core-0.2.6/test/test_span.cpp000066400000000000000000000623051477602032300163730ustar00rootroot00000000000000#ifndef C4CORE_SINGLE_HEADER #include "c4/span.hpp" #endif #include "c4/libtest/supprwarn_push.hpp" #include namespace c4 { //----------------------------------------------------------------------------- TEST_CASE_TEMPLATE("span.default_init", SpanClass, span, spanrs, spanrsl) { SpanClass s; CHECK_EQ(s.size(), 0); CHECK_EQ(s.capacity(), 0); CHECK_EQ(s.data(), nullptr); } template class Span, class T, class I> Span cvt_to_const(Span const& s) { Span ret = s; return ret; } TEST_CASE_TEMPLATE("span.convert_to_const", SpanClass, span, spanrs, spanrsl) { SpanClass s; auto cs = cvt_to_const(s); CHECK_EQ(s.size(), cs.size()); CHECK_EQ(s.data(), cs.data()); CHECK_EQ(s.end(), cs.end()); } //----------------------------------------------------------------------------- TEST_CASE("span.empty_init") { int arr[10]; span s(arr, 0); CHECK_EQ(s.size(), 0); CHECK_EQ(s.capacity(), 0); CHECK_NE(s.data(), nullptr); } TEST_CASE("spanrs.empty_init") { int arr[10]; { spanrs s(arr, 0); CHECK_EQ(s.size(), 0); CHECK_EQ(s.capacity(), 0); CHECK_EQ(s.data(), arr); } { spanrs s(arr, 0, C4_COUNTOF(arr)); CHECK_EQ(s.size(), 0); CHECK_EQ(s.capacity(), 10); CHECK_EQ(s.data(), arr); } } TEST_CASE("spanrsl.empty_init") { int arr[10]; { spanrsl s(arr, 0); CHECK_EQ(s.size(), 0); CHECK_EQ(s.capacity(), 0); CHECK_EQ(s.data(), arr); CHECK_EQ(s.offset(), 0); } { spanrsl s(arr, 0, C4_COUNTOF(arr)); CHECK_EQ(s.size(), 0); CHECK_EQ(s.capacity(), 10); CHECK_EQ(s.data(), arr); CHECK_EQ(s.offset(), 0); } } //----------------------------------------------------------------------------- TEST_CASE_TEMPLATE("span.fromArray", SpanClass, span, span, span, spanrs, spanrs, spanrs, spanrsl, spanrsl, spanrsl ) { using ConstSpanClass = typename SpanClass::const_type; using T = typename SpanClass::value_type; T arr1[10]; T arr2[20]; T a = 0; for(auto &v : arr1) { v = a; ++a; } for(auto &v : arr2) { v = a; ++a; } { SpanClass s(arr1); CHECK_EQ(s.size(), C4_COUNTOF(arr1)); CHECK_EQ(s.capacity(), C4_COUNTOF(arr1)); CHECK_EQ(s.data(), arr1); } { ConstSpanClass s(arr1); CHECK_EQ(s.size(), C4_COUNTOF(arr1)); CHECK_EQ(s.capacity(), C4_COUNTOF(arr1)); CHECK_EQ(s.data(), arr1); } { SpanClass s = arr1; CHECK_EQ(s.size(), C4_COUNTOF(arr1)); CHECK_EQ(s.capacity(), C4_COUNTOF(arr1)); CHECK_EQ(s.data(), arr1); } { ConstSpanClass s = arr1; CHECK_EQ(s.size(), C4_COUNTOF(arr1)); CHECK_EQ(s.capacity(), C4_COUNTOF(arr1)); CHECK_EQ(s.data(), arr1); } { SpanClass s = arr1; CHECK_EQ(s.size(), C4_COUNTOF(arr1)); CHECK_EQ(s.capacity(), C4_COUNTOF(arr1)); CHECK_EQ(s.data(), arr1); s = arr2; CHECK_EQ(s.size(), C4_COUNTOF(arr2)); CHECK_EQ(s.capacity(), C4_COUNTOF(arr2)); CHECK_EQ(s.data(), arr2); } { ConstSpanClass s = arr1; CHECK_EQ(s.size(), C4_COUNTOF(arr1)); CHECK_EQ(s.capacity(), C4_COUNTOF(arr1)); CHECK_EQ(s.data(), arr1); s = arr2; CHECK_EQ(s.size(), C4_COUNTOF(arr2)); CHECK_EQ(s.capacity(), C4_COUNTOF(arr2)); CHECK_EQ(s.data(), arr2); } } //----------------------------------------------------------------------------- TEST_CASE("span.subspan") { int arr[10]; span s(arr); C4_STATIC_ASSERT((std::is_same::value)); { auto ss = s.subspan(0, 5); CHECK_EQ(ss.size(), 5); CHECK_EQ(ss.capacity(), 5); CHECK_EQ(ss.data(), arr); ss = s.subspan(5); CHECK_EQ(ss.size(), 5); CHECK_EQ(ss.capacity(), 5); CHECK_EQ(ss.data(), &arr[5]); // fine to obtain an empty span at the end ss = s.subspan(10); CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.capacity(), 0); CHECK_EQ(ss.data(), std::end(arr)); // fine to obtain an empty span at the end ss = s.subspan(10, 0); CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.capacity(), 0); CHECK_EQ(ss.data(), std::end(arr)); } { int buf10[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; int buf_5[] = {-1, 0, 1, 2, 3, 4}; int *buf5 = buf_5 + 1; // to make sure that one does not immediately follow the other in memory span n(buf10); span m(buf5, 5); auto ss = n.subspan(0); CHECK_EQ(ss.data(), buf10); CHECK_EQ(ss.size(), 10); ss = m.subspan(0); CHECK_EQ(ss.data(), buf5); CHECK_EQ(ss.size(), 5); ss = n.subspan(0, 0); CHECK_NE(ss.data(), nullptr); CHECK_EQ(ss.data(), &buf10[0]); CHECK_EQ(ss.size(), 0); ss = m.subspan(0, 0); CHECK_NE(ss.data(), nullptr); CHECK_EQ(ss.data(), &buf5[0]); CHECK_EQ(ss.size(), 0); } } TEST_CASE("spanrs.subspan") { int arr[10]; spanrs s(arr); C4_STATIC_ASSERT((std::is_same::value)); auto ss = s.subspan(0, 5); CHECK_EQ(ss.size(), 5); CHECK_EQ(ss.capacity(), 10); CHECK_EQ(ss.data(), arr); ss = s.subspan(5); CHECK_EQ(ss.size(), 5); CHECK_EQ(ss.capacity(), 5); CHECK_EQ(ss.data(), &arr[5]); // fine to obtain an empty span at the end ss = s.subspan(10); CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.capacity(), 0); CHECK_EQ(ss.data(), std::end(arr)); // fine to obtain an empty span at the end ss = s.subspan(10, 0); CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.capacity(), 0); CHECK_EQ(ss.data(), std::end(arr)); } TEST_CASE("spanrsl.subspan") { int arr[10]; spanrsl s(arr); C4_STATIC_ASSERT((std::is_same::value)); auto ss = s.subspan(0, 5); CHECK_EQ(ss.size(), 5); CHECK_EQ(ss.capacity(), 10); CHECK_EQ(ss.data(), arr); CHECK_EQ(ss.offset(), 0); ss = ss.original(); CHECK_EQ(ss.size(), 10); CHECK_EQ(ss.capacity(), 10); CHECK_EQ(ss.data(), arr); CHECK_EQ(ss.offset(), 0); ss = s.subspan(5); CHECK_EQ(ss.size(), 5); CHECK_EQ(ss.capacity(), 5); CHECK_EQ(ss.data(), &arr[5]); CHECK_EQ(ss.offset(), 5); ss = ss.original(); CHECK_EQ(ss.size(), 10); CHECK_EQ(ss.capacity(), 10); CHECK_EQ(ss.data(), arr); CHECK_EQ(ss.offset(), 0); // fine to obtain an empty span at the end ss = s.subspan(10); CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.capacity(), 0); CHECK_EQ(ss.data(), std::end(arr)); // fine to obtain an empty span at the end ss = s.subspan(10, 0); CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.capacity(), 0); CHECK_EQ(ss.data(), std::end(arr)); } //----------------------------------------------------------------------------- TEST_CASE("span.range") { int arr[10]; span s(arr); C4_STATIC_ASSERT((std::is_same::value)); auto ss = s.range(0, 5); CHECK_EQ(ss.size(), 5); CHECK_EQ(ss.capacity(), 5); CHECK_EQ(ss.data(), arr); ss = s.range(5); CHECK_EQ(ss.size(), 5); CHECK_EQ(ss.capacity(), 5); CHECK_EQ(ss.data(), &arr[5]); ss = s.range(5, 10); CHECK_EQ(ss.size(), 5); CHECK_EQ(ss.capacity(), 5); CHECK_EQ(ss.data(), &arr[5]); ss = s.range(10, 10); CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.capacity(), 0); CHECK_EQ(ss.data(), std::end(arr)); SUBCASE("empty_span") { s = {}; ss = s.range(0, 0); CHECK(ss.empty()); CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.data(), nullptr); s = arr; ss = s.range(0, 0); CHECK(ss.empty()); CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.data(), arr); ss = s.range(10, 10); CHECK(ss.empty()); CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.data(), arr + 10); ss = s.range(10); CHECK(ss.empty()); CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.data(), arr + 10); } } TEST_CASE("spanrs.range") { int arr[10]; spanrs s(arr); C4_STATIC_ASSERT((std::is_same::value)); auto ss = s.range(0, 5); CHECK_EQ(ss.size(), 5); CHECK_EQ(ss.capacity(), 10); CHECK_EQ(ss.data(), arr); ss = s.range(5); CHECK_EQ(ss.size(), 5); CHECK_EQ(ss.capacity(), 5); CHECK_EQ(ss.data(), &arr[5]); ss = s.range(5, 10); CHECK_EQ(ss.size(), 5); CHECK_EQ(ss.capacity(), 5); CHECK_EQ(ss.data(), &arr[5]); ss = s.range(10, 10); CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.capacity(), 0); CHECK_EQ(ss.data(), std::end(arr)); SUBCASE("empty_span") { s = {}; ss = s.range(0, 0); CHECK(ss.empty()); CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.data(), nullptr); s = arr; ss = s.range(0, 0); CHECK(ss.empty()); CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.data(), arr); ss = s.range(10, 10); CHECK(ss.empty()); CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.data(), arr + 10); ss = s.range(10); CHECK(ss.empty()); CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.data(), arr + 10); } } TEST_CASE("spanrsl.range") { int arr[10]; spanrsl s(arr); C4_STATIC_ASSERT((std::is_same::value)); auto ss = s.range(0, 5); CHECK_EQ(ss.size(), 5); CHECK_EQ(ss.capacity(), 10); CHECK_EQ(ss.data(), arr); ss = ss.original(); CHECK_EQ(ss.size(), 10); CHECK_EQ(ss.capacity(), 10); CHECK_EQ(ss.data(), arr); ss = s.range(5); CHECK_EQ(ss.size(), 5); CHECK_EQ(ss.capacity(), 5); CHECK_EQ(ss.data(), &arr[5]); ss = s.range(5, 10); CHECK_EQ(ss.size(), 5); CHECK_EQ(ss.capacity(), 5); CHECK_EQ(ss.data(), &arr[5]); ss = ss.original(); CHECK_EQ(ss.size(), 10); CHECK_EQ(ss.capacity(), 10); CHECK_EQ(ss.data(), arr); ss = s.range(10, 10); CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.capacity(), 0); CHECK_EQ(ss.data(), std::end(arr)); SUBCASE("empty_span") { s = {}; ss = s.range(0, 0); CHECK(ss.empty()); CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.data(), nullptr); s = arr; ss = s.range(0, 0); CHECK(ss.empty()); CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.data(), arr); ss = s.range(10, 10); CHECK(ss.empty()); CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.data(), arr + 10); ss = s.range(10); CHECK(ss.empty()); CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.data(), arr + 10); } } //----------------------------------------------------------------------------- TEST_CASE("span.first") { int arr[10]; span s(arr); C4_STATIC_ASSERT((std::is_same::value)); auto ss = s.first(0); CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.capacity(), 0); CHECK_EQ(ss.data(), arr); ss = s.first(5); CHECK_EQ(ss.size(), 5); CHECK_EQ(ss.capacity(), 5); CHECK_EQ(ss.data(), arr); SUBCASE("empty") { s = {}; ss = s.first(0); CHECK(ss.empty()); CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.data(), nullptr); s = arr; ss = s.first(0); CHECK(ss.empty()); CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.data(), arr); } } TEST_CASE("spanrs.first") { int arr[10]; spanrs s(arr); C4_STATIC_ASSERT((std::is_same::value)); auto ss = s.first(0); CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.capacity(), 10); CHECK_EQ(ss.data(), arr); ss = s.first(5); CHECK_EQ(ss.size(), 5); CHECK_EQ(ss.capacity(), 10); CHECK_EQ(ss.data(), arr); SUBCASE("empty") { s = {}; ss = s.first(0); CHECK(ss.empty()); CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.data(), nullptr); s = arr; ss = s.first(0); CHECK(ss.empty()); CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.data(), arr); } } TEST_CASE("spanrsl.first") { int arr[10]; spanrsl s(arr); C4_STATIC_ASSERT((std::is_same::value)); auto ss = s.first(0); CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.capacity(), 10); CHECK_EQ(ss.data(), arr); ss = ss.original(); CHECK_EQ(ss.size(), 10); CHECK_EQ(ss.capacity(), 10); CHECK_EQ(ss.data(), arr); ss = s.first(5); CHECK_EQ(ss.size(), 5); CHECK_EQ(ss.capacity(), 10); CHECK_EQ(ss.data(), arr); ss = ss.original(); CHECK_EQ(ss.size(), 10); CHECK_EQ(ss.capacity(), 10); CHECK_EQ(ss.data(), arr); SUBCASE("empty") { s = {}; ss = s.first(0); CHECK(ss.empty()); CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.data(), nullptr); s = arr; ss = s.first(0); CHECK(ss.empty()); CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.data(), arr); } } //----------------------------------------------------------------------------- TEST_CASE("span.last") { int arr[10]; span s(arr); C4_STATIC_ASSERT((std::is_same::value)); auto ss = s.last(0); CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.capacity(), 0); CHECK_EQ(ss.data(), arr + s.size()); ss = s.last(5); CHECK_EQ(ss.size(), 5); CHECK_EQ(ss.capacity(), 5); CHECK_EQ(ss.data(), arr + 5); SUBCASE("empty") { s = {}; ss = s.last(0); CHECK(ss.empty()); CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.data(), nullptr); s = arr; ss = s.last(0); CHECK(ss.empty()); CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.data(), arr + 10); } } TEST_CASE("spanrs.last") { int arr[10]; spanrs s(arr); C4_STATIC_ASSERT((std::is_same::value)); auto ss = s.last(0); CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.capacity(), 0); CHECK_EQ(ss.data(), arr + s.size()); ss = s.last(5); CHECK_EQ(ss.size(), 5); CHECK_EQ(ss.capacity(), 5); CHECK_EQ(ss.data(), arr + 5); SUBCASE("empty") { s = {}; ss = s.last(0); CHECK(ss.empty()); CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.data(), nullptr); s = arr; ss = s.last(0); CHECK(ss.empty()); CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.data(), arr + 10); } } TEST_CASE("spanrsl.last") { int arr[10]; spanrsl s(arr); C4_STATIC_ASSERT((std::is_same::value)); auto ss = s.last(0); CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.capacity(), 0); CHECK_EQ(ss.data(), arr + s.size()); ss = ss.original(); CHECK_EQ(ss.size(), 10); CHECK_EQ(ss.capacity(), 10); CHECK_EQ(ss.data(), arr); ss = s.last(5); CHECK_EQ(ss.size(), 5); CHECK_EQ(ss.capacity(), 5); CHECK_EQ(ss.data(), arr + 5); ss = ss.original(); CHECK_EQ(ss.size(), 10); CHECK_EQ(ss.capacity(), 10); CHECK_EQ(ss.data(), arr); SUBCASE("empty") { s = {}; ss = s.last(0); CHECK(ss.empty()); CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.data(), nullptr); s = arr; ss = s.last(0); CHECK(ss.empty()); CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.data(), arr + 10); } } //----------------------------------------------------------------------------- TEST_CASE_TEMPLATE("span.is_subspan", SpanClass, span, spanrs, spanrsl) { int buf10[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; int buf_5[] = {-1, 0, 1, 2, 3, 4}; int *buf5 = buf_5 + 1; // to make sure that one does not immediately follow the other in memory SpanClass n(buf10); SpanClass m(buf5, 5); CHECK_EQ(n.data(), buf10); CHECK_EQ(m.data(), buf5); CHECK_UNARY(n.is_subspan(n.subspan(0 ))); CHECK_UNARY(n.is_subspan(n.subspan(0, 3))); CHECK_UNARY(n.is_subspan(n.subspan(0, 0))); CHECK_FALSE(n.is_subspan(m.subspan(0 ))); CHECK_FALSE(n.is_subspan(m.subspan(0, 3))); CHECK_FALSE(n.is_subspan(m.subspan(0, 0))); } //----------------------------------------------------------------------------- TEST_CASE_TEMPLATE("span.compll", SpanClass, span, spanrs, spanrsl) { int buf10[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; SpanClass n(buf10); CHECK_EQ(n.compll(n.subspan(0)), n.subspan(0, 0)); CHECK_EQ(n.is_subspan(n.compll(n.subspan(0))), true); CHECK_EQ(n.compll(n.subspan(0, 0)), n.subspan(0, 0)); CHECK_EQ(n.is_subspan(n.compll(n.subspan(0, 0))), true); CHECK_EQ(n.compll(n.subspan(0, 1)), n.subspan(0, 0)); CHECK_EQ(n.compll(n.subspan(0, 3)), n.subspan(0, 0)); CHECK_EQ(n.compll(n.range(5, 10)), n.subspan(0, 5)); CHECK_EQ(n.compll(n.range(5, 5)), n.subspan(0, 5)); CHECK_EQ(n.compll(n.subspan(n.size(), 0)), n); CHECK_EQ(n.compll(n.range(n.size(), n.size())), n); } //----------------------------------------------------------------------------- TEST_CASE_TEMPLATE("span.complr", SpanClass, span, spanrs, spanrsl) { int buf10[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; SpanClass n(buf10); CHECK_EQ(n.complr(n.subspan(0)), n.subspan(0, 0)); CHECK_EQ(n.is_subspan(n.complr(n.subspan(0))), true); CHECK_EQ(n.complr(n.subspan(0, 0)), n.subspan(0)); CHECK_EQ(n.is_subspan(n.complr(n.subspan(0, 0))), true); CHECK_EQ(n.complr(n.subspan(0, 1)), n.subspan(1)); CHECK_EQ(n.complr(n.subspan(0, 3)), n.subspan(3)); CHECK_EQ(n.complr(n.subspan(5)), n.subspan(0, 0)); CHECK_EQ(n.complr(n.range(5, 10)), n.subspan(0, 0)); CHECK_EQ(n.complr(n.subspan(5, 0)), n.subspan(5)); CHECK_EQ(n.complr(n.range(5, 5)), n.subspan(5)); CHECK_EQ(n.complr(n.subspan(0, 0)), n); CHECK_EQ(n.complr(n.range(0, 0)), n); } //----------------------------------------------------------------------------- TEST_CASE("span.rtrim") { int arr[10]; span s(arr); auto ss = s; ss.rtrim(0); CHECK_EQ(ss.size(), s.size()); CHECK_EQ(ss.capacity(), s.capacity()); CHECK_EQ(ss.data(), arr); ss.rtrim(5); CHECK_EQ(ss.size(), s.size() - 5); CHECK_EQ(ss.capacity(), s.capacity() - 5); CHECK_EQ(ss.data(), arr); } TEST_CASE("spanrs.rtrim") { int arr[10]; spanrs s(arr); auto ss = s; ss.rtrim(0); CHECK_EQ(ss.size(), s.size()); CHECK_EQ(ss.capacity(), s.capacity()); CHECK_EQ(ss.data(), arr); ss.rtrim(5); CHECK_EQ(ss.size(), s.size() - 5); CHECK_EQ(ss.capacity(), s.capacity()); CHECK_EQ(ss.data(), arr); } TEST_CASE("spanrsl.rtrim") { int arr[10]; spanrsl s(arr); auto ss = s; ss.rtrim(0); CHECK_EQ(ss.size(), s.size()); CHECK_EQ(ss.capacity(), s.capacity()); CHECK_EQ(ss.data(), arr); ss = ss.original(); CHECK_EQ(ss.size(), 10); CHECK_EQ(ss.capacity(), 10); CHECK_EQ(ss.data(), arr); ss.rtrim(5); CHECK_EQ(ss.size(), s.size() - 5); CHECK_EQ(ss.capacity(), s.capacity()); CHECK_EQ(ss.data(), arr); ss = ss.original(); CHECK_EQ(ss.size(), 10); CHECK_EQ(ss.capacity(), 10); CHECK_EQ(ss.data(), arr); } //----------------------------------------------------------------------------- TEST_CASE("span.ltrim") { int arr[10]; span s(arr); auto ss = s; ss.ltrim(0); CHECK_EQ(ss.size(), s.size()); CHECK_EQ(ss.capacity(), s.capacity()); CHECK_EQ(ss.data(), arr); ss.ltrim(5); CHECK_EQ(ss.size(), s.size() - 5); CHECK_EQ(ss.capacity(), s.capacity() - 5); CHECK_EQ(ss.data(), arr + 5); } TEST_CASE("spanrs.ltrim") { int arr[10]; spanrs s(arr); auto ss = s; ss.ltrim(0); CHECK_EQ(ss.size(), s.size()); CHECK_EQ(ss.capacity(), ss.capacity()); CHECK_EQ(ss.data(), arr); ss.ltrim(5); CHECK_EQ(ss.size(), s.size() - 5); CHECK_EQ(ss.capacity(), s.size() - 5); CHECK_EQ(ss.data(), arr + 5); } TEST_CASE("spanrsl.ltrim") { int arr[10]; spanrsl s(arr); auto ss = s; ss.ltrim(0); CHECK_EQ(ss.size(), s.size()); CHECK_EQ(ss.capacity(), ss.capacity()); CHECK_EQ(ss.data(), arr); ss = ss.original(); CHECK_EQ(ss.size(), 10); CHECK_EQ(ss.capacity(), 10); CHECK_EQ(ss.data(), arr); ss.ltrim(5); CHECK_EQ(ss.size(), s.size() - 5); CHECK_EQ(ss.capacity(), s.size() - 5); CHECK_EQ(ss.data(), arr + 5); ss = ss.original(); CHECK_EQ(ss.size(), 10); CHECK_EQ(ss.capacity(), 10); CHECK_EQ(ss.data(), arr); } //----------------------------------------------------------------------------- const char larrc[11] = "0123456789"; const char rarrc[11] = "1234567890"; const int larri[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; const int rarri[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}; TEST_CASE("span.reverse_iter") { cspan s(larri); REQUIRE_EQ(s.data(), larri); REQUIRE_EQ(s.begin(), std::begin(larri)); REQUIRE_EQ(s.end(), std::end(larri)); REQUIRE_EQ(&*s.rbegin(), s.end()-1); using rit = cspan::const_reverse_iterator; int pos = szconv(s.size()) - 1; size_t count = 0; //for(rit b = s.rbegin(), e = s.rend(); b != e; ++b) // BUG: b != e is never true on arm-eabi-g++-7 for(rit b = s.rbegin(), e = s.rend(); b < e; ++b) { CHECK_EQ(&(*b), s.data() + pos); auto spos = szconv(pos); REQUIRE_EQ(&*b, &s[spos]); REQUIRE_GE(pos, 0); REQUIRE_LT(pos, szconv(s.size())); REQUIRE_LT(count, s.size()); CHECK_EQ(*b, s[spos]); --pos; ++count; } CHECK_EQ(pos, -1); CHECK_EQ(count, s.size()); } //----------------------------------------------------------------------------- TEST_CASE("span_impl.eq") { CHECK_EQ(cspan (larrc), cspan (larrc)); CHECK_EQ(cspanrs(larrc), cspan (larrc)); CHECK_EQ(cspan (larrc), cspanrs(larrc)); CHECK_EQ(cspanrs(larrc), cspanrs(larrc)); CHECK_EQ(cspan (larri) , cspan (larri)); CHECK_EQ(cspanrs(larri) , cspan (larri)); CHECK_EQ(cspan (larri) , cspanrs(larri)); CHECK_EQ(cspanrs(larri) , cspanrs(larri)); } TEST_CASE("span_impl.lt") { CHECK_LT(cspan (larrc), cspan (rarrc)); CHECK_LT(cspanrs(larrc), cspan (rarrc)); CHECK_LT(cspan (larrc), cspanrs(rarrc)); CHECK_LT(cspanrs(larrc), cspanrs(rarrc)); CHECK_LT(cspan (larri) , cspan (rarri)); CHECK_LT(cspanrs(larri) , cspan (rarri)); CHECK_LT(cspan (larri) , cspanrs(rarri)); CHECK_LT(cspanrs(larri) , cspanrs(rarri)); } TEST_CASE("span_impl.gt") { CHECK_GT(cspan (rarrc), cspan (larrc)); CHECK_GT(cspan (rarrc), cspanrs(larrc)); CHECK_GT(cspanrs(rarrc), cspan (larrc)); CHECK_GT(cspanrs(rarrc), cspanrs(larrc)); CHECK_GT(cspan (rarri) , cspan (larri)); CHECK_GT(cspan (rarri) , cspanrs(larri)); CHECK_GT(cspanrs(rarri) , cspan (larri)); CHECK_GT(cspanrs(rarri) , cspanrs(larri)); } TEST_CASE("span_impl.ge") { CHECK_GE(cspan (rarrc), cspan (larrc)); CHECK_GE(cspan (rarrc), cspanrs(larrc)); CHECK_GE(cspanrs(rarrc), cspan (larrc)); CHECK_GE(cspanrs(rarrc), cspanrs(larrc)); CHECK_GE(cspan (larrc), cspan (larrc)); CHECK_GE(cspan (larrc), cspanrs(larrc)); CHECK_GE(cspanrs(larrc), cspan (larrc)); CHECK_GE(cspanrs(larrc), cspanrs(larrc)); CHECK_GE(cspan (rarri) , cspan (larri)); CHECK_GE(cspan (rarri) , cspanrs(larri)); CHECK_GE(cspanrs(rarri) , cspan (larri)); CHECK_GE(cspanrs(rarri) , cspanrs(larri)); CHECK_GE(cspan (larri) , cspan (larri)); CHECK_GE(cspan (larri) , cspanrs(larri)); CHECK_GE(cspanrs(larri) , cspan (larri)); CHECK_GE(cspanrs(larri) , cspanrs(larri)); } TEST_CASE("span_impl.le") { CHECK_LE(cspan (larrc), cspan (rarrc)); CHECK_LE(cspanrs(larrc), cspan (rarrc)); CHECK_LE(cspan (larrc), cspanrs(rarrc)); CHECK_LE(cspanrs(larrc), cspanrs(rarrc)); CHECK_LE(cspan (larrc), cspan (larrc)); CHECK_LE(cspanrs(larrc), cspan (larrc)); CHECK_LE(cspan (larrc), cspanrs(larrc)); CHECK_LE(cspanrs(larrc), cspanrs(larrc)); CHECK_LE(cspan (larri) , cspan (rarri)); CHECK_LE(cspanrs(larri) , cspan (rarri)); CHECK_LE(cspan (larri) , cspanrs(rarri)); CHECK_LE(cspanrs(larri) , cspanrs(rarri)); CHECK_LE(cspan (larri) , cspan (larri)); CHECK_LE(cspanrs(larri) , cspan (larri)); CHECK_LE(cspan (larri) , cspanrs(larri)); CHECK_LE(cspanrs(larri) , cspanrs(larri)); } } // namespace c4 #include "c4/libtest/supprwarn_pop.hpp" c4core-0.2.6/test/test_std_string.cpp000066400000000000000000000065161477602032300176140ustar00rootroot00000000000000#include "c4/test.hpp" #ifndef C4CORE_SINGLE_HEADER #include "c4/std/string_fwd.hpp" #include "c4/std/string.hpp" #include "c4/std/string_view.hpp" #endif namespace c4 { TEST_CASE("std_string.to_substr") { std::string s("barnabe"); substr ss = to_substr(s); CHECK_EQ(ss.str, s.data()); CHECK_EQ(ss.len, s.size()); s[0] = 'B'; CHECK_EQ(ss[0], 'B'); ss[0] = 'b'; CHECK_EQ(s[0], 'b'); } TEST_CASE("std_string.to_csubstr") { std::string s("barnabe"); csubstr ss = to_csubstr(s); CHECK_EQ(ss.str, s.data()); CHECK_EQ(ss.len, s.size()); s[0] = 'B'; CHECK_EQ(ss[0], 'B'); } #if (C4_CPP >= 17 && defined(__cpp_lib_string_view)) TEST_CASE("std_string_view.to_csubstr") { std::string_view s("barnabe"); csubstr ss = to_csubstr(s); CHECK_EQ(ss.str, s.data()); CHECK_EQ(ss.len, s.size()); } #endif #if (C4_CPP >= 17 && defined(__cpp_lib_string_view)) TEST_CASE_TEMPLATE("std_string.compare_csubstr", T, std::string, std::string_view) #else TEST_CASE_TEMPLATE("std_string.compare_csubstr", T, std::string) #endif { T s0 = "000"; T s1 = "111"; csubstr ss0 = csubstr("0001").first(3); csubstr ss1 = csubstr("1112").first(3); CHECK_NE(s0.data(), ss0.data()); CHECK_NE(s1.data(), ss1.data()); // CHECK_EQ(s0, ss0); CHECK_EQ(s1, ss1); CHECK_EQ(ss0, s0); CHECK_EQ(ss1, s1); // CHECK_NE(s1, ss0); CHECK_NE(s0, ss1); CHECK_NE(ss1, s0); CHECK_NE(ss0, s1); // CHECK_GE(s0, ss0); CHECK_LE(s1, ss1); CHECK_GE(ss0, s0); CHECK_LE(ss1, s1); CHECK_GE(s1, ss0); CHECK_LE(s0, ss1); CHECK_GE(ss1, s0); CHECK_LE(ss0, s1); // CHECK_GT(s1, ss0); CHECK_LT(s0, ss1); CHECK_GT(ss1, s0); CHECK_LT(ss0, s1); } #if (C4_CPP >= 17 && defined(__cpp_lib_string_view)) TEST_CASE_TEMPLATE("std_string.compare_substr", T, std::string, std::string_view) #else TEST_CASE_TEMPLATE("std_string.compare_substr", T, std::string) #endif { T s0 = "000"; T s1 = "111"; char buf0[] = "000"; char buf1[] = "111"; substr ss0 = buf0; substr ss1 = buf1; CHECK_NE(s0.data(), ss0.data()); CHECK_NE(s1.data(), ss1.data()); // CHECK_EQ(s0, ss0); CHECK_EQ(s1, ss1); CHECK_EQ(ss0, s0); CHECK_EQ(ss1, s1); // CHECK_NE(s1, ss0); CHECK_NE(s0, ss1); CHECK_NE(ss1, s0); CHECK_NE(ss0, s1); // CHECK_GE(s0, ss0); CHECK_LE(s1, ss1); CHECK_GE(ss0, s0); CHECK_LE(ss1, s1); CHECK_GE(s1, ss0); CHECK_LE(s0, ss1); CHECK_GE(ss1, s0); CHECK_LE(ss0, s1); // CHECK_GT(s1, ss0); CHECK_LT(s0, ss1); CHECK_GT(ss1, s0); CHECK_LT(ss0, s1); } #if (C4_CPP >= 17 && defined(__cpp_lib_string_view)) TEST_CASE_TEMPLATE("std_string.to_chars", T, std::string, std::string_view) #else TEST_CASE_TEMPLATE("std_string.to_chars", T, std::string) #endif { const T s0 = "000"; char buf_[100] = {}; substr buf = buf_; CHECK_NE(buf.data(), s0.data()); size_t ret = to_chars({}, s0); CHECK_EQ(ret, s0.size()); CHECK_NE(buf.first(ret), s0); ret = to_chars(buf, s0); CHECK_EQ(ret, s0.size()); CHECK_EQ(buf.first(ret), s0); } TEST_CASE("std_string.from_chars") { std::string s0; csubstr buf = "0123456798"; CHECK_NE(buf.data(), s0.data()); bool ok = from_chars(buf, &s0); CHECK(ok); CHECK_EQ(buf, s0); } } // namespace c4 c4core-0.2.6/test/test_std_vector.cpp000066400000000000000000000055231477602032300176050ustar00rootroot00000000000000#include "c4/test.hpp" #ifndef C4CORE_SINGLE_HEADER #include "c4/std/vector_fwd.hpp" #include "c4/std/vector.hpp" #endif namespace c4 { template std::vector ctor(const char (&s)[N]) { return std::vector(s, s+N-1); } TEST_CASE("std_vector.to_csubstr") { std::vector s = ctor("barnabe"); csubstr ss = to_csubstr(s); CHECK_EQ(ss, csubstr("barnabe")); CHECK_EQ(ss.str, s.data()); CHECK_EQ(ss.len, s.size()); } TEST_CASE("std_vector.to_substr") { std::vector s = ctor("barnabe"); substr ss = to_substr(s); CHECK_EQ(ss, csubstr("barnabe")); CHECK_EQ(ss.str, s.data()); CHECK_EQ(ss.len, s.size()); // CHECK_EQ(s[0], 'b'); ss[0] = 'B'; CHECK_EQ(s[0], 'B'); ss[0] = 'A'; CHECK_EQ(s[0], 'A'); } TEST_CASE("std_vector.compare_csubstr") { std::vector s0 = ctor("000"); std::vector s1 = ctor("111"); csubstr ss0 = "000"; csubstr ss1 = "111"; CHECK_NE(s0.data(), ss0.data()); CHECK_NE(s1.data(), ss1.data()); // CHECK_EQ(s0, ss0); CHECK_EQ(s1, ss1); CHECK_EQ(ss0, s0); CHECK_EQ(ss1, s1); // CHECK_NE(s1, ss0); CHECK_NE(s0, ss1); CHECK_NE(ss1, s0); CHECK_NE(ss0, s1); // CHECK_GE(s0, ss0); CHECK_LE(s1, ss1); CHECK_GE(ss0, s0); CHECK_LE(ss1, s1); CHECK_GE(s1, ss0); CHECK_LE(s0, ss1); CHECK_GE(ss1, s0); CHECK_LE(ss0, s1); // CHECK_GT(s1, ss0); CHECK_LT(s0, ss1); CHECK_GT(ss1, s0); CHECK_LT(ss0, s1); } TEST_CASE("std_vector.compare_substr") { std::vector s0 = ctor("000"); std::vector s1 = ctor("111"); char buf0[] = "000"; char buf1[] = "111"; substr ss0 = buf0; substr ss1 = buf1; CHECK_NE(s0.data(), ss0.data()); CHECK_NE(s1.data(), ss1.data()); // CHECK_EQ(s0, ss0); CHECK_EQ(s1, ss1); CHECK_EQ(ss0, s0); CHECK_EQ(ss1, s1); // CHECK_NE(s1, ss0); CHECK_NE(s0, ss1); CHECK_NE(ss1, s0); CHECK_NE(ss0, s1); // CHECK_GE(s0, ss0); CHECK_LE(s1, ss1); CHECK_GE(ss0, s0); CHECK_LE(ss1, s1); CHECK_GE(s1, ss0); CHECK_LE(s0, ss1); CHECK_GE(ss1, s0); CHECK_LE(ss0, s1); // CHECK_GT(s1, ss0); CHECK_LT(s0, ss1); CHECK_GT(ss1, s0); CHECK_LT(ss0, s1); } TEST_CASE("std_vector.to_chars") { const std::vector s0 = ctor("000"); char buf_[100] = {}; substr buf = buf_; CHECK_NE(buf.data(), s0.data()); size_t ret = to_chars({}, s0); CHECK_EQ(ret, s0.size()); CHECK_NE(buf.first(ret), s0); ret = to_chars(buf, s0); CHECK_EQ(ret, s0.size()); CHECK_EQ(buf.first(ret), s0); } TEST_CASE("std_vector.from_chars") { std::vector s0; csubstr buf = "0123456798"; CHECK_NE(buf.data(), s0.data()); bool ok = from_chars(buf, &s0); CHECK(ok); CHECK_EQ(buf, s0); } } // namespace c4 c4core-0.2.6/test/test_substr.cpp000066400000000000000000005710711477602032300167610ustar00rootroot00000000000000#ifndef C4CORE_SINGLE_HEADER #include "c4/std/std.hpp" #include "c4/substr.hpp" #endif #include #include "c4/libtest/supprwarn_push.hpp" #include namespace c4 { TEST_CASE("substr.empty_ctor") { { substr s; CHECK_EQ(s.str, nullptr); CHECK_EQ(s.len, 0u); } { csubstr s; CHECK_EQ(s.str, nullptr); CHECK_EQ(s.len, 0u); } { substr s = {}; CHECK_EQ(s.str, nullptr); CHECK_EQ(s.len, 0u); } { csubstr s = {}; CHECK_EQ(s.str, nullptr); CHECK_EQ(s.len, 0u); } } TEST_CASE("substr.ctor_from_char_arr") { SUBCASE("substr from char") { char buf1[] = "01"; char buf2[] = "012"; substr s(buf1); CHECK_EQ(s, "01"); CHECK_EQ(s.str, buf1); CHECK_EQ(s.len, strlen(buf1)); s = buf2; CHECK_EQ(s, "012"); CHECK_EQ(s.str, buf2); CHECK_EQ(s.len, strlen(buf2)); s.assign(buf1); CHECK_EQ(s, "01"); CHECK_EQ(s.str, buf1); CHECK_EQ(s.len, strlen(buf1)); s = to_substr(buf2); CHECK_EQ(s, "012"); CHECK_EQ(s.str, buf2); CHECK_EQ(s.len, strlen(buf2)); //s = to_csubstr(buf1); // deliberate compile error //CHECK_EQ(s, "01"); //CHECK_EQ(s.str, buf1); //CHECK_EQ(s.len, strlen(buf1)); } SUBCASE("csubstr from char") { char buf1[] = "01"; char buf2[] = "012"; csubstr s(buf1); CHECK_EQ(s, "01"); CHECK_EQ(s.str, buf1); CHECK_EQ(s.len, strlen(buf1)); s = buf2; CHECK_EQ(s, "012"); CHECK_EQ(s.str, buf2); CHECK_EQ(s.len, strlen(buf2)); s.assign(buf1); CHECK_EQ(s, "01"); CHECK_EQ(s.str, buf1); CHECK_EQ(s.len, strlen(buf1)); s = to_substr(buf2); CHECK_EQ(s, "012"); CHECK_EQ(s.str, buf2); CHECK_EQ(s.len, strlen(buf2)); s = to_csubstr(buf1); CHECK_EQ(s, "01"); CHECK_EQ(s.str, buf1); CHECK_EQ(s.len, strlen(buf1)); } SUBCASE("csubstr from const char") { const char buf1[] = "01"; const char buf2[] = "012"; csubstr s(buf1); CHECK_EQ(s, "01"); CHECK_EQ(s.str, buf1); CHECK_EQ(s.len, strlen(buf1)); s = buf2; CHECK_EQ(s, "012"); CHECK_EQ(s.str, buf2); CHECK_EQ(s.len, strlen(buf2)); s.assign(buf1); CHECK_EQ(s, "01"); CHECK_EQ(s.str, buf1); CHECK_EQ(s.len, strlen(buf1)); // s = to_substr(buf2); // deliberate compile error s = to_csubstr(buf2); CHECK_EQ(s, "012"); CHECK_EQ(s.str, buf2); CHECK_EQ(s.len, strlen(buf2)); } } TEST_CASE("substr.ctor_from_char_ptr") { { char buf1_[] = "01"; char buf2_[] = "012"; char *buf1 = buf1_; char *buf2 = buf2_; substr s(buf1); CHECK_EQ(s, "01"); CHECK_EQ(s.str, buf1); CHECK_EQ(s.len, strlen(buf1)); s = buf2; CHECK_EQ(s, "012"); CHECK_EQ(s.str, buf2); CHECK_EQ(s.len, strlen(buf2)); s.assign(buf1); CHECK_EQ(s, "01"); CHECK_EQ(s.str, buf1); CHECK_EQ(s.len, strlen(buf1)); s = to_substr(buf2); CHECK_EQ(s, "012"); CHECK_EQ(s.str, buf2); CHECK_EQ(s.len, strlen(buf2)); //s = to_csubstr(buf1); // deliberate compile error //CHECK_EQ(s, "01"); //CHECK_EQ(s.str, buf1); //CHECK_EQ(s.len, strlen(buf1)); } { char buf1_[] = "01"; char buf2_[] = "012"; char *buf1 = buf1_; char *buf2 = buf2_; csubstr s(buf1); CHECK_EQ(s, "01"); CHECK_EQ(s.str, buf1); CHECK_EQ(s.len, strlen(buf1)); s = buf2; CHECK_EQ(s, "012"); CHECK_EQ(s.str, buf2); CHECK_EQ(s.len, strlen(buf2)); s.assign(buf1); CHECK_EQ(s, "01"); CHECK_EQ(s.str, buf1); CHECK_EQ(s.len, strlen(buf1)); s = to_substr(buf2); CHECK_EQ(s, "012"); CHECK_EQ(s.str, buf2); CHECK_EQ(s.len, strlen(buf2)); s = to_csubstr(buf1); CHECK_EQ(s, "01"); CHECK_EQ(s.str, buf1); CHECK_EQ(s.len, strlen(buf1)); } { const char buf1_[] = "01"; const char buf2_[] = "012"; const char *buf1 = buf1_; const char *buf2 = buf2_; csubstr s(buf1); CHECK_EQ(s, "01"); CHECK_EQ(s.str, buf1); CHECK_EQ(s.len, strlen(buf1)); s = buf2; CHECK_EQ(s, "012"); CHECK_EQ(s.str, buf2); CHECK_EQ(s.len, strlen(buf2)); s.assign(buf1); CHECK_EQ(s, "01"); CHECK_EQ(s.str, buf1); CHECK_EQ(s.len, strlen(buf1)); //s = to_substr(buf2); // deliberate compile error s = to_csubstr(buf2); CHECK_EQ(s, "012"); CHECK_EQ(s.str, buf2); CHECK_EQ(s.len, strlen(buf2)); } } TEST_CASE("substr.ctor_from_two_ptrs") { { char buf1_[] = "0123456789"; char *buf1 = buf1_; substr s(buf1 + 1, buf1_ + 5); CHECK_EQ(s, "1234"); CHECK_EQ(s.str, buf1 + 1); CHECK_EQ(s.len, 4); s.assign(buf1, buf1 + 2); CHECK_EQ(s, "01"); CHECK_EQ(s.str, buf1); CHECK_EQ(s.len, 2); } { char buf1_[] = "0123456789"; char *buf1 = buf1_; csubstr s(buf1 + 1, buf1_ + 5); CHECK_EQ(s, "1234"); CHECK_EQ(s.str, buf1 + 1); CHECK_EQ(s.len, 4); s.assign(buf1, buf1 + 2); CHECK_EQ(s, "01"); CHECK_EQ(s.str, buf1); CHECK_EQ(s.len, 2); } { const char buf1_[] = "0123456789"; const char *buf1 = buf1_; csubstr s(buf1 + 1, buf1_ + 5); CHECK_EQ(s, "1234"); CHECK_EQ(s.str, buf1 + 1); CHECK_EQ(s.len, 4); s.assign(buf1, buf1 + 2); CHECK_EQ(s, "01"); CHECK_EQ(s.str, buf1); CHECK_EQ(s.len, 2); } } TEST_CASE("substr.ctor_from_ptr_len") { { char buf1_[] = "0123456789"; char *buf1 = buf1_; substr s(buf1 + 1, 4); CHECK_EQ(s, "1234"); CHECK_EQ(s.str, buf1 + 1); CHECK_EQ(s.len, 4); s.assign(buf1, 2); CHECK_EQ(s, "01"); CHECK_EQ(s.str, buf1); CHECK_EQ(s.len, 2); } { char buf1_[] = "0123456789"; char *buf1 = buf1_; csubstr s(buf1 + 1, 4); CHECK_EQ(s, "1234"); CHECK_EQ(s.str, buf1 + 1); CHECK_EQ(s.len, 4); s.assign(buf1, 2); CHECK_EQ(s, "01"); CHECK_EQ(s.str, buf1); CHECK_EQ(s.len, 2); } { const char buf1_[] = "0123456789"; const char *buf1 = buf1_; csubstr s(buf1 + 1, 4); CHECK_EQ(s, "1234"); CHECK_EQ(s.str, buf1 + 1); CHECK_EQ(s.len, 4); s.assign(buf1, 2); CHECK_EQ(s, "01"); CHECK_EQ(s.str, buf1); CHECK_EQ(s.len, 2); } } TEST_CASE("csubstr.empty_vs_null") { csubstr s; CHECK_UNARY(s.empty()); CHECK_UNARY(s.len == 0); CHECK_UNARY(s.str == nullptr); CHECK_UNARY(s == nullptr); s = ""; CHECK_UNARY(s.empty()); CHECK_UNARY(s.len == 0); CHECK_UNARY(s.str != nullptr); CHECK_UNARY(s != nullptr); s = nullptr; CHECK_UNARY(s.empty()); CHECK_UNARY(s.len == 0); CHECK_UNARY(s.str == nullptr); CHECK_UNARY(s == nullptr); s = ""; CHECK_UNARY(s.empty()); CHECK_UNARY(s.len == 0); CHECK_UNARY(s.str != nullptr); CHECK_UNARY(s != nullptr); s = {}; CHECK_UNARY(s.empty()); CHECK_UNARY(s.len == 0); CHECK_UNARY(s.str == nullptr); CHECK_UNARY(s == nullptr); csubstr pp(nullptr); CHECK_UNARY(pp.empty()); CHECK_UNARY(pp.len == 0); CHECK_UNARY(pp.str == nullptr); CHECK_UNARY(pp == nullptr); } TEST_CASE("substr.is_sub") { csubstr buf = "0123456789"; // ref csubstr s; csubstr ref = buf.select("345"); CHECK_EQ(ref, "345"); CHECK_UNARY(buf.is_super(ref)); CHECK_UNARY(ref.is_sub(buf)); CHECK_FALSE(ref.is_super(buf)); CHECK_FALSE(buf.is_sub(ref)); buf.clear(); ref.clear(); CHECK_FALSE(buf.is_super(ref)); CHECK_FALSE(ref.is_super(buf)); CHECK_FALSE(ref.is_sub(buf)); CHECK_FALSE(buf.is_sub(ref)); buf = ""; ref = buf; CHECK_FALSE(buf.is_super("a")); CHECK_UNARY(buf.is_super(ref)); } TEST_CASE("substr.overlaps") { csubstr buf = "0123456789"; // ref csubstr s; csubstr ref = buf.select("345"); CHECK_EQ(ref.len, 3); CHECK_EQ(ref, "345"); // all_left s = buf.sub(0, 2); CHECK_EQ(s, "01"); CHECK_FALSE(ref.overlaps(s)); CHECK_FALSE(s.overlaps(ref)); // all_left_tight s = buf.sub(0, 3); CHECK_EQ(s, "012"); CHECK_FALSE(ref.overlaps(s)); CHECK_FALSE(s.overlaps(ref)); // overlap_left s = buf.sub(0, 4); CHECK_EQ(s, "0123"); CHECK_UNARY(ref.overlaps(s)); CHECK_UNARY(s.overlaps(ref)); // inside_tight_left s = buf.sub(3, 1); CHECK_EQ(s, "3"); CHECK_UNARY(ref.overlaps(s)); CHECK_UNARY(s.overlaps(ref)); s = buf.sub(3, 2); CHECK_EQ(s, "34"); CHECK_UNARY(ref.overlaps(s)); CHECK_UNARY(s.overlaps(ref)); // all_inside_tight s = buf.sub(4, 1); CHECK_EQ(s, "4"); CHECK_UNARY(ref.overlaps(s)); CHECK_UNARY(s.overlaps(ref)); s = buf.sub(3, 3); CHECK_EQ(s, "345"); CHECK_UNARY(ref.overlaps(s)); CHECK_UNARY(s.overlaps(ref)); // inside_tight_right s = buf.sub(4, 2); CHECK_EQ(s, "45"); CHECK_UNARY(ref.overlaps(s)); CHECK_UNARY(s.overlaps(ref)); s = buf.sub(5, 1); CHECK_EQ(s, "5"); CHECK_UNARY(ref.overlaps(s)); CHECK_UNARY(s.overlaps(ref)); // overlap_right s = buf.sub(5, 2); CHECK_EQ(s, "56"); CHECK_UNARY(ref.overlaps(s)); CHECK_UNARY(s.overlaps(ref)); s = buf.sub(5, 3); CHECK_EQ(s, "567"); CHECK_UNARY(ref.overlaps(s)); CHECK_UNARY(s.overlaps(ref)); // all_right_tight s = buf.sub(6, 1); CHECK_EQ(s, "6"); CHECK_FALSE(ref.overlaps(s)); CHECK_FALSE(s.overlaps(ref)); s = buf.sub(6, 2); CHECK_EQ(s, "67"); CHECK_FALSE(ref.overlaps(s)); CHECK_FALSE(s.overlaps(ref)); // all_right s = buf.sub(7, 1); CHECK_EQ(s, "7"); CHECK_FALSE(ref.overlaps(s)); CHECK_FALSE(s.overlaps(ref)); s = buf.sub(7, 2); CHECK_EQ(s, "78"); CHECK_FALSE(ref.overlaps(s)); CHECK_FALSE(s.overlaps(ref)); // null vs null csubstr n1, n2; CHECK_EQ(n1.str, nullptr); CHECK_EQ(n2.str, nullptr); CHECK_EQ(n1.len, 0); CHECK_EQ(n2.len, 0); CHECK_FALSE(n1.overlaps(n2)); CHECK_FALSE(n2.overlaps(n1)); } TEST_CASE("substr.sub") { CHECK_EQ(csubstr("10]").sub(0, 2), "10"); } TEST_CASE("substr.range") { csubstr s = "0123456789"; CHECK_EQ(s.range(0, 10), "0123456789"); CHECK_EQ(s.range(0 ), "0123456789"); CHECK_EQ(s.range(1, 10), "123456789"); CHECK_EQ(s.range(1 ), "123456789"); CHECK_EQ(s.range(2, 10), "23456789"); CHECK_EQ(s.range(2 ), "23456789"); CHECK_EQ(s.range(3, 10), "3456789"); CHECK_EQ(s.range(3 ), "3456789"); CHECK_EQ(s.range(4, 10), "456789"); CHECK_EQ(s.range(4 ), "456789"); CHECK_EQ(s.range(5, 10), "56789"); CHECK_EQ(s.range(5 ), "56789"); CHECK_EQ(s.range(6, 10), "6789"); CHECK_EQ(s.range(6 ), "6789"); CHECK_EQ(s.range(7, 10), "789"); CHECK_EQ(s.range(7 ), "789"); CHECK_EQ(s.range(8, 10), "89"); CHECK_EQ(s.range(8 ), "89"); CHECK_EQ(s.range(9, 10), "9"); CHECK_EQ(s.range(9 ), "9"); CHECK_EQ(s.range(10, 10), ""); CHECK_EQ(s.range(10 ), ""); CHECK_EQ(s.range(0 , 9), "012345678"); CHECK_EQ(s.range(1 , 9), "12345678"); CHECK_EQ(s.range(2 , 9), "2345678"); CHECK_EQ(s.range(3 , 9), "345678"); CHECK_EQ(s.range(4 , 9), "45678"); CHECK_EQ(s.range(5 , 9), "5678"); CHECK_EQ(s.range(6 , 9), "678"); CHECK_EQ(s.range(7 , 9), "78"); CHECK_EQ(s.range(8 , 9), "8"); CHECK_EQ(s.range(9 , 9), ""); CHECK_EQ(s.range(0 , 7), "0123456"); CHECK_EQ(s.range(1 , 7), "123456"); CHECK_EQ(s.range(2 , 7), "23456"); CHECK_EQ(s.range(3 , 7), "3456"); CHECK_EQ(s.range(4 , 7), "456"); CHECK_EQ(s.range(5 , 7), "56"); CHECK_EQ(s.range(6 , 7), "6"); CHECK_EQ(s.range(7 , 7), ""); CHECK_EQ(s.range(0 , 5), "01234"); CHECK_EQ(s.range(1 , 5), "1234"); CHECK_EQ(s.range(2 , 5), "234"); CHECK_EQ(s.range(3 , 5), "34"); CHECK_EQ(s.range(4 , 5), "4"); CHECK_EQ(s.range(5 , 5), ""); CHECK_EQ(s.range(0 , 3), "012"); CHECK_EQ(s.range(1 , 3), "12"); CHECK_EQ(s.range(2 , 3), "2"); CHECK_EQ(s.range(3 , 3), ""); CHECK_EQ(s.range(0 , 2), "01"); CHECK_EQ(s.range(1 , 2), "1"); CHECK_EQ(s.range(2 , 2), ""); CHECK_EQ(s.range(0 , 1), "0"); CHECK_EQ(s.range(1 , 1), ""); } TEST_CASE("substr.first") { csubstr s = "0123456789"; CHECK_EQ(s.first(csubstr::npos), s); CHECK_EQ(s.first(10), "0123456789"); CHECK_EQ(s.first(9), "012345678"); CHECK_EQ(s.first(8), "01234567"); CHECK_EQ(s.first(7), "0123456"); CHECK_EQ(s.first(6), "012345"); CHECK_EQ(s.first(5), "01234"); CHECK_EQ(s.first(4), "0123"); CHECK_EQ(s.first(3), "012"); CHECK_EQ(s.first(2), "01"); CHECK_EQ(s.first(1), "0"); CHECK_EQ(s.first(0), ""); } TEST_CASE("substr.last") { csubstr s = "0123456789"; CHECK_EQ(s.last(csubstr::npos), s); CHECK_EQ(s.last(10), "0123456789"); CHECK_EQ(s.last(9), "123456789"); CHECK_EQ(s.last(8), "23456789"); CHECK_EQ(s.last(7), "3456789"); CHECK_EQ(s.last(6), "456789"); CHECK_EQ(s.last(5), "56789"); CHECK_EQ(s.last(4), "6789"); CHECK_EQ(s.last(3), "789"); CHECK_EQ(s.last(2), "89"); CHECK_EQ(s.last(1), "9"); CHECK_EQ(s.last(0), ""); } TEST_CASE("substr.offs") { csubstr s = "0123456789"; CHECK_EQ(s.offs(0, 0), s); CHECK_EQ(s.offs(1, 0), "123456789"); CHECK_EQ(s.offs(0, 1), "012345678"); CHECK_EQ(s.offs(1, 1), "12345678"); CHECK_EQ(s.offs(1, 2), "1234567"); CHECK_EQ(s.offs(2, 1), "2345678"); CHECK_EQ(s.offs(2, 2), "234567"); CHECK_EQ(s.offs(2, 3), "23456"); CHECK_EQ(s.offs(3, 2), "34567"); CHECK_EQ(s.offs(3, 3), "3456"); CHECK_EQ(s.offs(3, 4), "345"); CHECK_EQ(s.offs(4, 3), "456"); CHECK_EQ(s.offs(4, 4), "45"); CHECK_EQ(s.offs(4, 5), "4"); CHECK_EQ(s.offs(5, 4), "5"); CHECK_EQ(s.offs(5, 5), ""); } TEST_CASE("substr.count") { csubstr buf = "0123456789"; CHECK_EQ(buf.count('0'), 1); CHECK_EQ(buf.count('0', 0), 1); CHECK_EQ(buf.count('0', 1), 0); CHECK_EQ(buf.count('0', buf.len), 0); CHECK_EQ(buf.count("01"), 1); CHECK_EQ(buf.count("01", 0), 1); CHECK_EQ(buf.count("01", 1), 0); CHECK_EQ(buf.count("01", buf.len), 0); CHECK_EQ(buf.count('1'), 1); CHECK_EQ(buf.count('1', 0), 1); CHECK_EQ(buf.count('1', 1), 1); CHECK_EQ(buf.count('1', 2), 0); CHECK_EQ(buf.count('1', buf.len), 0); CHECK_EQ(buf.count("12"), 1); CHECK_EQ(buf.count("12", 0), 1); CHECK_EQ(buf.count("12", 1), 1); CHECK_EQ(buf.count("12", 2), 0); CHECK_EQ(buf.count("12", buf.len), 0); CHECK_EQ(buf.count('2'), 1); CHECK_EQ(buf.count('2', 0), 1); CHECK_EQ(buf.count('2', 1), 1); CHECK_EQ(buf.count('2', 2), 1); CHECK_EQ(buf.count('2', 3), 0); CHECK_EQ(buf.count('2', buf.len), 0); CHECK_EQ(buf.count("23"), 1); CHECK_EQ(buf.count("23", 0), 1); CHECK_EQ(buf.count("23", 1), 1); CHECK_EQ(buf.count("23", 2), 1); CHECK_EQ(buf.count("23", 3), 0); CHECK_EQ(buf.count("23", buf.len), 0); CHECK_EQ(buf.count('3'), 1); CHECK_EQ(buf.count('3', 0), 1); CHECK_EQ(buf.count('3', 1), 1); CHECK_EQ(buf.count('3', 2), 1); CHECK_EQ(buf.count('3', 3), 1); CHECK_EQ(buf.count('3', 4), 0); CHECK_EQ(buf.count('3', buf.len), 0); CHECK_EQ(buf.count("34"), 1); CHECK_EQ(buf.count("34", 0), 1); CHECK_EQ(buf.count("34", 1), 1); CHECK_EQ(buf.count("34", 2), 1); CHECK_EQ(buf.count("34", 3), 1); CHECK_EQ(buf.count("34", 4), 0); CHECK_EQ(buf.count("34", buf.len), 0); CHECK_EQ(buf.count('4'), 1); CHECK_EQ(buf.count('4', 0), 1); CHECK_EQ(buf.count('4', 1), 1); CHECK_EQ(buf.count('4', 2), 1); CHECK_EQ(buf.count('4', 3), 1); CHECK_EQ(buf.count('4', 4), 1); CHECK_EQ(buf.count('4', 5), 0); CHECK_EQ(buf.count('4', buf.len), 0); CHECK_EQ(buf.count("45"), 1); CHECK_EQ(buf.count("45", 0), 1); CHECK_EQ(buf.count("45", 1), 1); CHECK_EQ(buf.count("45", 2), 1); CHECK_EQ(buf.count("45", 3), 1); CHECK_EQ(buf.count("45", 4), 1); CHECK_EQ(buf.count("45", 5), 0); CHECK_EQ(buf.count("45", buf.len), 0); CHECK_EQ(buf.count('5'), 1); CHECK_EQ(buf.count('5', 0), 1); CHECK_EQ(buf.count('5', 1), 1); CHECK_EQ(buf.count('5', 2), 1); CHECK_EQ(buf.count('5', 3), 1); CHECK_EQ(buf.count('5', 4), 1); CHECK_EQ(buf.count('5', 5), 1); CHECK_EQ(buf.count('5', 6), 0); CHECK_EQ(buf.count('5', buf.len), 0); CHECK_EQ(buf.count("56"), 1); CHECK_EQ(buf.count("56", 0), 1); CHECK_EQ(buf.count("56", 1), 1); CHECK_EQ(buf.count("56", 2), 1); CHECK_EQ(buf.count("56", 3), 1); CHECK_EQ(buf.count("56", 4), 1); CHECK_EQ(buf.count("56", 5), 1); CHECK_EQ(buf.count("56", 6), 0); CHECK_EQ(buf.count("56", buf.len), 0); CHECK_EQ(buf.count('a'), 0); CHECK_EQ(buf.count('a', 0), 0); CHECK_EQ(buf.count('a', 1), 0); CHECK_EQ(buf.count('a', 2), 0); CHECK_EQ(buf.count('a', 3), 0); CHECK_EQ(buf.count('a', 4), 0); CHECK_EQ(buf.count('a', 5), 0); CHECK_EQ(buf.count('a', 6), 0); CHECK_EQ(buf.count('a', buf.len), 0); CHECK_EQ(buf.count("ab"), 0); CHECK_EQ(buf.count("ab", 0), 0); CHECK_EQ(buf.count("ab", 1), 0); CHECK_EQ(buf.count("ab", 2), 0); CHECK_EQ(buf.count("ab", 3), 0); CHECK_EQ(buf.count("ab", 4), 0); CHECK_EQ(buf.count("ab", 5), 0); CHECK_EQ(buf.count("ab", 6), 0); CHECK_EQ(buf.count("ab", buf.len), 0); buf = "00110022003300440055"; CHECK_EQ(buf.count('0', 0), 10); CHECK_EQ(buf.count('0', 1), 9); CHECK_EQ(buf.count('0', 2), 8); CHECK_EQ(buf.count('0', 3), 8); CHECK_EQ(buf.count('0', 4), 8); CHECK_EQ(buf.count('0', 5), 7); CHECK_EQ(buf.count('0', 6), 6); CHECK_EQ(buf.count('0', 7), 6); CHECK_EQ(buf.count('0', 8), 6); CHECK_EQ(buf.count('0', 9), 5); CHECK_EQ(buf.count('0', 10), 4); CHECK_EQ(buf.count('0', 11), 4); CHECK_EQ(buf.count('0', 12), 4); CHECK_EQ(buf.count('0', 13), 3); CHECK_EQ(buf.count('0', 14), 2); CHECK_EQ(buf.count('0', 15), 2); CHECK_EQ(buf.count('0', 16), 2); CHECK_EQ(buf.count('0', 17), 1); CHECK_EQ(buf.count('0', 18), 0); CHECK_EQ(buf.count('0', 19), 0); CHECK_EQ(buf.count('0', 20), 0); CHECK_EQ(buf.count('1', 0), 2); CHECK_EQ(buf.count('1', 1), 2); CHECK_EQ(buf.count('1', 2), 2); CHECK_EQ(buf.count('1', 3), 1); CHECK_EQ(buf.count('1', 4), 0); CHECK_EQ(buf.count('1', 5), 0); CHECK_EQ(buf.count("01" ), 1); CHECK_EQ(buf.count("01", 2), 0); CHECK_EQ(buf.count("10" ), 1); CHECK_EQ(buf.count("10", 4), 0); CHECK_EQ(buf.count("00", 0), 5); CHECK_EQ(buf.count("00", 1), 4); CHECK_EQ(buf.count("00", 2), 4); CHECK_EQ(buf.count("00", 3), 4); CHECK_EQ(buf.count("00", 4), 4); CHECK_EQ(buf.count("00", 5), 3); CHECK_EQ(buf.count("00", 6), 3); CHECK_EQ(buf.count("00", 7), 3); CHECK_EQ(buf.count("00", 8), 3); CHECK_EQ(buf.count("00", 9), 2); CHECK_EQ(buf.count("00", 10), 2); CHECK_EQ(buf.count("00", 11), 2); CHECK_EQ(buf.count("00", 12), 2); CHECK_EQ(buf.count("00", 13), 1); CHECK_EQ(buf.count("00", 14), 1); CHECK_EQ(buf.count("00", 15), 1); CHECK_EQ(buf.count("00", 16), 1); CHECK_EQ(buf.count("00", 17), 0); CHECK_EQ(buf.count("00", 18), 0); CHECK_EQ(buf.count("00", 19), 0); CHECK_EQ(buf.count("00", 20), 0); } TEST_CASE("substr.select") { csubstr buf = "0123456789"; CHECK_EQ(buf.select('0'), "0"); CHECK_EQ(buf.select('1'), "1"); CHECK_EQ(buf.select('2'), "2"); CHECK_EQ(buf.select('8'), "8"); CHECK_EQ(buf.select('9'), "9"); CHECK_EQ(buf.select('a').str, nullptr); CHECK_EQ(buf.select('a').len, 0); CHECK_EQ(buf.select('a'), ""); CHECK_EQ(buf.select("a").str, nullptr); CHECK_EQ(buf.select("a").len, 0); CHECK_EQ(buf.select("a"), ""); CHECK_EQ(buf.select("0"), "0"); CHECK_EQ(buf.select("0").str, buf.str+0); CHECK_EQ(buf.select("0").len, 1); CHECK_EQ(buf.select("1"), "1"); CHECK_EQ(buf.select("1").str, buf.str+1); CHECK_EQ(buf.select("1").len, 1); CHECK_EQ(buf.select("2"), "2"); CHECK_EQ(buf.select("2").str, buf.str+2); CHECK_EQ(buf.select("2").len, 1); CHECK_EQ(buf.select("9"), "9"); CHECK_EQ(buf.select("9").str, buf.str+9); CHECK_EQ(buf.select("9").len, 1); CHECK_EQ(buf.select("012"), "012"); CHECK_EQ(buf.select("012").str, buf.str+0); CHECK_EQ(buf.select("012").len, 3); CHECK_EQ(buf.select("345"), "345"); CHECK_EQ(buf.select("345").str, buf.str+3); CHECK_EQ(buf.select("345").len, 3); CHECK_EQ(buf.select("789"), "789"); CHECK_EQ(buf.select("789").str, buf.str+7); CHECK_EQ(buf.select("789").len, 3); CHECK_EQ(buf.select("89a"), ""); CHECK_EQ(buf.select("89a").str, nullptr); CHECK_EQ(buf.select("89a").len, 0); } TEST_CASE("substr.begins_with") { CHECK (csubstr(": ").begins_with(":" )); CHECK (csubstr(": ").begins_with(':' )); CHECK_FALSE(csubstr(":") .begins_with(": ")); CHECK (csubstr( "1234").begins_with('0', 0)); CHECK (csubstr( "01234").begins_with('0', 1)); CHECK_FALSE(csubstr( "01234").begins_with('0', 2)); CHECK (csubstr( "001234").begins_with('0', 1)); CHECK (csubstr( "001234").begins_with('0', 2)); CHECK_FALSE(csubstr( "001234").begins_with('0', 3)); CHECK (csubstr( "0001234").begins_with('0', 1)); CHECK (csubstr( "0001234").begins_with('0', 2)); CHECK (csubstr( "0001234").begins_with('0', 3)); CHECK_FALSE(csubstr( "0001234").begins_with('0', 4)); CHECK (csubstr("00001234").begins_with('0', 1)); CHECK (csubstr("00001234").begins_with('0', 2)); CHECK (csubstr("00001234").begins_with('0', 3)); CHECK (csubstr("00001234").begins_with('0', 4)); CHECK_FALSE(csubstr("00001234").begins_with('0', 5)); } TEST_CASE("substr.ends_with") { CHECK_UNARY(csubstr("{% if foo %}bar{% endif %}").ends_with("{% endif %}")); CHECK (csubstr("1234" ).ends_with('0', 0)); CHECK (csubstr("12340" ).ends_with('0', 1)); CHECK_FALSE(csubstr("12340" ).ends_with('0', 2)); CHECK (csubstr("123400" ).ends_with('0', 1)); CHECK (csubstr("123400" ).ends_with('0', 2)); CHECK_FALSE(csubstr("123400" ).ends_with('0', 3)); CHECK (csubstr("1234000" ).ends_with('0', 1)); CHECK (csubstr("1234000" ).ends_with('0', 2)); CHECK (csubstr("1234000" ).ends_with('0', 3)); CHECK_FALSE(csubstr("1234000" ).ends_with('0', 4)); CHECK (csubstr("12340000").ends_with('0', 1)); CHECK (csubstr("12340000").ends_with('0', 2)); CHECK (csubstr("12340000").ends_with('0', 3)); CHECK (csubstr("12340000").ends_with('0', 4)); CHECK_FALSE(csubstr("12340000").ends_with('0', 5)); } TEST_CASE("substr.find") { csubstr s012345 = "012345"; CHECK(s012345.find('a') == csubstr::npos); CHECK(s012345.find('0' ) == 0u); CHECK(s012345.find('0', 1u) == csubstr::npos); CHECK(s012345.find('1' ) == 1u); CHECK(s012345.find('1', 2u) == csubstr::npos); CHECK(s012345.find('2' ) == 2u); CHECK(s012345.find('2', 3u) == csubstr::npos); CHECK(s012345.find('3' ) == 3u); CHECK(s012345.find('3', 4u) == csubstr::npos); CHECK(s012345.find("ab" ) == csubstr::npos); CHECK(s012345.find("01" ) == 0u); CHECK(s012345.find("01", 1u) == csubstr::npos); CHECK(s012345.find("12" ) == 1u); CHECK(s012345.find("12", 2u) == csubstr::npos); CHECK(s012345.find("23" ) == 2u); CHECK(s012345.find("23", 3u) == csubstr::npos); } TEST_CASE("substr.first_of") { size_t npos = csubstr::npos; CHECK_EQ(csubstr("012345").first_of('a'), npos); CHECK_EQ(csubstr("012345").first_of("ab"), npos); CHECK_EQ(csubstr("012345").first_of('0'), 0u); CHECK_EQ(csubstr("012345").first_of("0"), 0u); CHECK_EQ(csubstr("012345").first_of("01"), 0u); CHECK_EQ(csubstr("012345").first_of("10"), 0u); CHECK_EQ(csubstr("012345").first_of("012"), 0u); CHECK_EQ(csubstr("012345").first_of("210"), 0u); CHECK_EQ(csubstr("012345").first_of("0123"), 0u); CHECK_EQ(csubstr("012345").first_of("3210"), 0u); CHECK_EQ(csubstr("012345").first_of("01234"), 0u); CHECK_EQ(csubstr("012345").first_of("43210"), 0u); CHECK_EQ(csubstr("012345").first_of("012345"), 0u); CHECK_EQ(csubstr("012345").first_of("543210"), 0u); CHECK_EQ(csubstr("012345").first_of('0', 2u), npos); CHECK_EQ(csubstr("012345").first_of("0", 2u), npos); CHECK_EQ(csubstr("012345").first_of("01", 2u), npos); CHECK_EQ(csubstr("012345").first_of("10", 2u), npos); CHECK_EQ(csubstr("012345").first_of("012", 2u), 2u); CHECK_EQ(csubstr("012345").first_of("210", 2u), 2u); CHECK_EQ(csubstr("012345").first_of("0123", 2u), 2u); CHECK_EQ(csubstr("012345").first_of("3210", 2u), 2u); CHECK_EQ(csubstr("012345").first_of("01234", 2u), 2u); CHECK_EQ(csubstr("012345").first_of("43210", 2u), 2u); CHECK_EQ(csubstr("012345").first_of("012345", 2u), 2u); CHECK_EQ(csubstr("012345").first_of("543210", 2u), 2u); CHECK_EQ(csubstr("012345").first_of('5'), 5u); CHECK_EQ(csubstr("012345").first_of("5"), 5u); CHECK_EQ(csubstr("012345").first_of("45"), 4u); CHECK_EQ(csubstr("012345").first_of("54"), 4u); CHECK_EQ(csubstr("012345").first_of("345"), 3u); CHECK_EQ(csubstr("012345").first_of("543"), 3u); CHECK_EQ(csubstr("012345").first_of("2345"), 2u); CHECK_EQ(csubstr("012345").first_of("5432"), 2u); CHECK_EQ(csubstr("012345").first_of("12345"), 1u); CHECK_EQ(csubstr("012345").first_of("54321"), 1u); CHECK_EQ(csubstr("012345").first_of("012345"), 0u); CHECK_EQ(csubstr("012345").first_of("543210"), 0u); CHECK_EQ(csubstr("012345").first_of('5', 2u), 5u); CHECK_EQ(csubstr("012345").first_of("5", 2u), 5u); CHECK_EQ(csubstr("012345").first_of("45", 2u), 4u); CHECK_EQ(csubstr("012345").first_of("54", 2u), 4u); CHECK_EQ(csubstr("012345").first_of("345", 2u), 3u); CHECK_EQ(csubstr("012345").first_of("543", 2u), 3u); CHECK_EQ(csubstr("012345").first_of("2345", 2u), 2u); CHECK_EQ(csubstr("012345").first_of("5432", 2u), 2u); CHECK_EQ(csubstr("012345").first_of("12345", 2u), 2u); CHECK_EQ(csubstr("012345").first_of("54321", 2u), 2u); CHECK_EQ(csubstr("012345").first_of("012345", 2u), 2u); CHECK_EQ(csubstr("012345").first_of("543210", 2u), 2u); CHECK_EQ(csubstr{}.first_of('0'), npos); CHECK_EQ(csubstr{}.first_of('0', 0u), npos); CHECK_EQ(csubstr("012345").first_of('0', 6u), npos); CHECK_EQ(csubstr("012345").first_of('5', 6u), npos); CHECK_EQ(csubstr("012345").first_of("012345", 6u), npos); } TEST_CASE("substr.last_of") { size_t npos = csubstr::npos; CHECK_EQ(csubstr("012345").last_of('a'), npos); CHECK_EQ(csubstr("012345").last_of("ab"), npos); CHECK_EQ(csubstr("012345").last_of('0'), 0u); CHECK_EQ(csubstr("012345").last_of("0"), 0u); CHECK_EQ(csubstr("012345").last_of("01"), 1u); CHECK_EQ(csubstr("012345").last_of("10"), 1u); CHECK_EQ(csubstr("012345").last_of("012"), 2u); CHECK_EQ(csubstr("012345").last_of("210"), 2u); CHECK_EQ(csubstr("012345").last_of("0123"), 3u); CHECK_EQ(csubstr("012345").last_of("3210"), 3u); CHECK_EQ(csubstr("012345").last_of("01234"), 4u); CHECK_EQ(csubstr("012345").last_of("43210"), 4u); CHECK_EQ(csubstr("012345").last_of("012345"), 5u); CHECK_EQ(csubstr("012345").last_of("543210"), 5u); CHECK_EQ(csubstr("012345").last_of('0', 2u), 0u); CHECK_EQ(csubstr("012345").last_of("0", 2u), 0u); CHECK_EQ(csubstr("012345").last_of("01", 2u), 1u); CHECK_EQ(csubstr("012345").last_of("10", 2u), 1u); CHECK_EQ(csubstr("012345").last_of("012", 2u), 1u); CHECK_EQ(csubstr("012345").last_of("210", 2u), 1u); CHECK_EQ(csubstr("012345").last_of("0123", 2u), 1u); CHECK_EQ(csubstr("012345").last_of("3210", 2u), 1u); CHECK_EQ(csubstr("012345").last_of("01234", 2u), 1u); CHECK_EQ(csubstr("012345").last_of("43210", 2u), 1u); CHECK_EQ(csubstr("012345").last_of("012345", 2u), 1u); CHECK_EQ(csubstr("012345").last_of("543210", 2u), 1u); CHECK_EQ(csubstr("012345").last_of('5'), 5u); CHECK_EQ(csubstr("012345").last_of("5"), 5u); CHECK_EQ(csubstr("012345").last_of("45"), 5u); CHECK_EQ(csubstr("012345").last_of("54"), 5u); CHECK_EQ(csubstr("012345").last_of("345"), 5u); CHECK_EQ(csubstr("012345").last_of("543"), 5u); CHECK_EQ(csubstr("012345").last_of("2345"), 5u); CHECK_EQ(csubstr("012345").last_of("5432"), 5u); CHECK_EQ(csubstr("012345").last_of("12345"), 5u); CHECK_EQ(csubstr("012345").last_of("54321"), 5u); CHECK_EQ(csubstr("012345").last_of("012345"), 5u); CHECK_EQ(csubstr("012345").last_of("543210"), 5u); CHECK_EQ(csubstr("012345").last_of('5', 2u), npos); CHECK_EQ(csubstr("012345").last_of("5", 2u), npos); CHECK_EQ(csubstr("012345").last_of("45", 2u), npos); CHECK_EQ(csubstr("012345").last_of("54", 2u), npos); CHECK_EQ(csubstr("012345").last_of("345", 2u), npos); CHECK_EQ(csubstr("012345").last_of("543", 2u), npos); CHECK_EQ(csubstr("012345").last_of("2345", 2u), npos); CHECK_EQ(csubstr("012345").last_of("5432", 2u), npos); CHECK_EQ(csubstr("012345").last_of("12345", 2u), 1u); CHECK_EQ(csubstr("012345").last_of("54321", 2u), 1u); CHECK_EQ(csubstr("012345").last_of("012345", 2u), 1u); CHECK_EQ(csubstr("012345").last_of("543210", 2u), 1u); CHECK_EQ(csubstr{}.last_of('?'), npos); CHECK_EQ(csubstr("012345").last_of('0', 6u), 0u); CHECK_EQ(csubstr("012345").last_of('5', 6u), 5u); CHECK_EQ(csubstr("012345").last_of("012345", 6u), 5u); } TEST_CASE("substr.first_not_of") { size_t npos = csubstr::npos; CHECK_EQ(csubstr("012345").first_not_of('a'), 0u); CHECK_EQ(csubstr("012345").first_not_of("ab"), 0u); CHECK_EQ(csubstr("012345").first_not_of('0'), 1u); CHECK_EQ(csubstr("012345").first_not_of("0"), 1u); CHECK_EQ(csubstr("012345").first_not_of("01"), 2u); CHECK_EQ(csubstr("012345").first_not_of("10"), 2u); CHECK_EQ(csubstr("012345").first_not_of("012"), 3u); CHECK_EQ(csubstr("012345").first_not_of("210"), 3u); CHECK_EQ(csubstr("012345").first_not_of("0123"), 4u); CHECK_EQ(csubstr("012345").first_not_of("3210"), 4u); CHECK_EQ(csubstr("012345").first_not_of("01234"), 5u); CHECK_EQ(csubstr("012345").first_not_of("43210"), 5u); CHECK_EQ(csubstr("012345").first_not_of("012345"), npos); CHECK_EQ(csubstr("012345").first_not_of("543210"), npos); CHECK_EQ(csubstr("012345").first_not_of('0', 2u), 2u); CHECK_EQ(csubstr("012345").first_not_of("0", 2u), 2u); CHECK_EQ(csubstr("012345").first_not_of("01", 2u), 2u); CHECK_EQ(csubstr("012345").first_not_of("10", 2u), 2u); CHECK_EQ(csubstr("012345").first_not_of("012", 2u), 3u); CHECK_EQ(csubstr("012345").first_not_of("210", 2u), 3u); CHECK_EQ(csubstr("012345").first_not_of("0123", 2u), 4u); CHECK_EQ(csubstr("012345").first_not_of("3210", 2u), 4u); CHECK_EQ(csubstr("012345").first_not_of("01234", 2u), 5u); CHECK_EQ(csubstr("012345").first_not_of("43210", 2u), 5u); CHECK_EQ(csubstr("012345").first_not_of("012345", 2u), npos); CHECK_EQ(csubstr("012345").first_not_of("543210", 2u), npos); CHECK_EQ(csubstr("012345").first_not_of('5'), 0u); CHECK_EQ(csubstr("012345").first_not_of("5"), 0u); CHECK_EQ(csubstr("012345").first_not_of("45"), 0u); CHECK_EQ(csubstr("012345").first_not_of("54"), 0u); CHECK_EQ(csubstr("012345").first_not_of("345"), 0u); CHECK_EQ(csubstr("012345").first_not_of("543"), 0u); CHECK_EQ(csubstr("012345").first_not_of("2345"), 0u); CHECK_EQ(csubstr("012345").first_not_of("5432"), 0u); CHECK_EQ(csubstr("012345").first_not_of("12345"), 0u); CHECK_EQ(csubstr("012345").first_not_of("54321"), 0u); CHECK_EQ(csubstr("012345").first_not_of("012345"), npos); CHECK_EQ(csubstr("012345").first_not_of("543210"), npos); CHECK_EQ(csubstr("012345").first_not_of('5', 2u), 2u); CHECK_EQ(csubstr("012345").first_not_of("5", 2u), 2u); CHECK_EQ(csubstr("012345").first_not_of("45", 2u), 2u); CHECK_EQ(csubstr("012345").first_not_of("54", 2u), 2u); CHECK_EQ(csubstr("012345").first_not_of("345", 2u), 2u); CHECK_EQ(csubstr("012345").first_not_of("543", 2u), 2u); CHECK_EQ(csubstr("012345").first_not_of("2345", 2u), npos); CHECK_EQ(csubstr("012345").first_not_of("5432", 2u), npos); CHECK_EQ(csubstr("012345").first_not_of("12345", 2u), npos); CHECK_EQ(csubstr("012345").first_not_of("54321", 2u), npos); CHECK_EQ(csubstr("012345").first_not_of("012345", 2u), npos); CHECK_EQ(csubstr("012345").first_not_of("543210", 2u), npos); CHECK_EQ(csubstr("").first_not_of('0', 0u), npos); CHECK_EQ(csubstr("012345").first_not_of('5', 6u), npos); CHECK_EQ(csubstr("012345").first_not_of("012345", 6u), npos); } TEST_CASE("substr.last_not_of") { size_t npos = csubstr::npos; CHECK_EQ(csubstr("012345").last_not_of('a'), 5u); CHECK_EQ(csubstr("012345").last_not_of("ab"), 5u); CHECK_EQ(csubstr("012345").last_not_of('5'), 4u); CHECK_EQ(csubstr("012345").last_not_of("5"), 4u); CHECK_EQ(csubstr("012345").last_not_of("45"), 3u); CHECK_EQ(csubstr("012345").last_not_of("54"), 3u); CHECK_EQ(csubstr("012345").last_not_of("345"), 2u); CHECK_EQ(csubstr("012345").last_not_of("543"), 2u); CHECK_EQ(csubstr("012345").last_not_of("2345"), 1u); CHECK_EQ(csubstr("012345").last_not_of("5432"), 1u); CHECK_EQ(csubstr("012345").last_not_of("12345"), 0u); CHECK_EQ(csubstr("012345").last_not_of("54321"), 0u); CHECK_EQ(csubstr("012345").last_not_of("012345"), npos); CHECK_EQ(csubstr("012345").last_not_of("543210"), npos); CHECK_EQ(csubstr("012345").last_not_of('5', 2u), 1u); CHECK_EQ(csubstr("012345").last_not_of("5", 2u), 1u); CHECK_EQ(csubstr("012345").last_not_of("45", 2u), 1u); CHECK_EQ(csubstr("012345").last_not_of("54", 2u), 1u); CHECK_EQ(csubstr("012345").last_not_of("345", 2u), 1u); CHECK_EQ(csubstr("012345").last_not_of("543", 2u), 1u); CHECK_EQ(csubstr("012345").last_not_of("2345", 2u), 1u); CHECK_EQ(csubstr("012345").last_not_of("5432", 2u), 1u); CHECK_EQ(csubstr("012345").last_not_of("12345", 2u), 0u); CHECK_EQ(csubstr("012345").last_not_of("54321", 2u), 0u); CHECK_EQ(csubstr("012345").last_not_of("012345", 2u), npos); CHECK_EQ(csubstr("012345").last_not_of("543210", 2u), npos); CHECK_EQ(csubstr("012345").last_not_of('0'), 5u); CHECK_EQ(csubstr("012345").last_not_of("0"), 5u); CHECK_EQ(csubstr("012345").last_not_of("01"), 5u); CHECK_EQ(csubstr("012345").last_not_of("10"), 5u); CHECK_EQ(csubstr("012345").last_not_of("012"), 5u); CHECK_EQ(csubstr("012345").last_not_of("210"), 5u); CHECK_EQ(csubstr("012345").last_not_of("0123"), 5u); CHECK_EQ(csubstr("012345").last_not_of("3210"), 5u); CHECK_EQ(csubstr("012345").last_not_of("01234"), 5u); CHECK_EQ(csubstr("012345").last_not_of("43210"), 5u); CHECK_EQ(csubstr("012345").last_not_of("012345"), npos); CHECK_EQ(csubstr("012345").last_not_of("543210"), npos); CHECK_EQ(csubstr("012345").last_not_of('0', 2u), 1u); CHECK_EQ(csubstr("012345").last_not_of("0", 2u), 1u); CHECK_EQ(csubstr("012345").last_not_of("01", 2u), npos); CHECK_EQ(csubstr("012345").last_not_of("10", 2u), npos); CHECK_EQ(csubstr("012345").last_not_of("012", 2u), npos); CHECK_EQ(csubstr("012345").last_not_of("210", 2u), npos); CHECK_EQ(csubstr("012345").last_not_of("0123", 2u), npos); CHECK_EQ(csubstr("012345").last_not_of("3210", 2u), npos); CHECK_EQ(csubstr("012345").last_not_of("01234", 2u), npos); CHECK_EQ(csubstr("012345").last_not_of("43210", 2u), npos); CHECK_EQ(csubstr("012345").last_not_of("012345", 2u), npos); CHECK_EQ(csubstr("012345").last_not_of("543210", 2u), npos); CHECK_EQ(csubstr("").last_not_of('0', 0u), npos); CHECK_EQ(csubstr("012345").last_not_of('5', 6u), 4u); } TEST_CASE("substr.left_of") { csubstr s = "012345"; CHECK_EQ(s.left_of(csubstr::npos), s); CHECK_EQ(s.left_of(csubstr::npos, /*include_pos*/false), s); CHECK_EQ(s.left_of(csubstr::npos, /*include_pos*/true), s); CHECK_EQ(s.left_of(0), ""); CHECK_EQ(s.left_of(1), "0"); CHECK_EQ(s.left_of(2), "01"); CHECK_EQ(s.left_of(3), "012"); CHECK_EQ(s.left_of(4), "0123"); CHECK_EQ(s.left_of(5), "01234"); CHECK_EQ(s.left_of(6), "012345"); CHECK_EQ(s.left_of(0, /*include_pos*/false), ""); CHECK_EQ(s.left_of(1, /*include_pos*/false), "0"); CHECK_EQ(s.left_of(2, /*include_pos*/false), "01"); CHECK_EQ(s.left_of(3, /*include_pos*/false), "012"); CHECK_EQ(s.left_of(4, /*include_pos*/false), "0123"); CHECK_EQ(s.left_of(5, /*include_pos*/false), "01234"); CHECK_EQ(s.left_of(6, /*include_pos*/false), "012345"); CHECK_UNARY(s.is_super(s.left_of(0, /*include_pos*/false))); CHECK_UNARY(s.is_super(s.left_of(1, /*include_pos*/false))); CHECK_UNARY(s.is_super(s.left_of(2, /*include_pos*/false))); CHECK_UNARY(s.is_super(s.left_of(3, /*include_pos*/false))); CHECK_UNARY(s.is_super(s.left_of(4, /*include_pos*/false))); CHECK_EQ(s.left_of(0, /*include_pos*/true), "0"); CHECK_EQ(s.left_of(1, /*include_pos*/true), "01"); CHECK_EQ(s.left_of(2, /*include_pos*/true), "012"); CHECK_EQ(s.left_of(3, /*include_pos*/true), "0123"); CHECK_EQ(s.left_of(4, /*include_pos*/true), "01234"); CHECK_EQ(s.left_of(5, /*include_pos*/true), "012345"); CHECK_UNARY(s.is_super(s.left_of(0, /*include_pos*/true))); CHECK_UNARY(s.is_super(s.left_of(1, /*include_pos*/true))); CHECK_UNARY(s.is_super(s.left_of(2, /*include_pos*/true))); CHECK_UNARY(s.is_super(s.left_of(3, /*include_pos*/true))); CHECK_UNARY(s.is_super(s.left_of(4, /*include_pos*/true))); CHECK_EQ(s.sub(5), "5"); CHECK_EQ(s.sub(4), "45"); CHECK_EQ(s.sub(3), "345"); CHECK_EQ(s.sub(2), "2345"); CHECK_EQ(s.sub(1), "12345"); CHECK_EQ(s.sub(0), "012345"); CHECK_EQ(s.left_of(s.sub(5)), "01234"); CHECK_EQ(s.left_of(s.sub(4)), "0123"); CHECK_EQ(s.left_of(s.sub(3)), "012"); CHECK_EQ(s.left_of(s.sub(2)), "01"); CHECK_EQ(s.left_of(s.sub(1)), "0"); CHECK_EQ(s.left_of(s.sub(0)), ""); CHECK_UNARY(s.is_super(s.left_of(s.sub(5)))); CHECK_UNARY(s.is_super(s.left_of(s.sub(4)))); CHECK_UNARY(s.is_super(s.left_of(s.sub(3)))); CHECK_UNARY(s.is_super(s.left_of(s.sub(2)))); CHECK_UNARY(s.is_super(s.left_of(s.sub(1)))); CHECK_UNARY(s.is_super(s.left_of(s.sub(0)))); } TEST_CASE("substr.right_of") { csubstr s = "012345"; CHECK_EQ(s.right_of(csubstr::npos), ""); CHECK_EQ(s.right_of(csubstr::npos), ""); CHECK_EQ(s.right_of(csubstr::npos, /*include_pos*/false), ""); CHECK_EQ(s.right_of(csubstr::npos, /*include_pos*/true), ""); CHECK_EQ(s.right_of(0), "12345"); CHECK_EQ(s.right_of(1), "2345"); CHECK_EQ(s.right_of(2), "345"); CHECK_EQ(s.right_of(3), "45"); CHECK_EQ(s.right_of(4), "5"); CHECK_EQ(s.right_of(5), ""); CHECK_EQ(s.right_of(0, /*include_pos*/false), "12345"); CHECK_EQ(s.right_of(1, /*include_pos*/false), "2345"); CHECK_EQ(s.right_of(2, /*include_pos*/false), "345"); CHECK_EQ(s.right_of(3, /*include_pos*/false), "45"); CHECK_EQ(s.right_of(4, /*include_pos*/false), "5"); CHECK_EQ(s.right_of(5, /*include_pos*/false), ""); CHECK_UNARY(s.is_super(s.right_of(0))); CHECK_UNARY(s.is_super(s.right_of(1))); CHECK_UNARY(s.is_super(s.right_of(2))); CHECK_UNARY(s.is_super(s.right_of(3))); CHECK_UNARY(s.is_super(s.right_of(4))); CHECK_UNARY(s.is_super(s.right_of(5))); CHECK_UNARY(s.is_super(s.right_of(0, /*include_pos*/false))); CHECK_UNARY(s.is_super(s.right_of(1, /*include_pos*/false))); CHECK_UNARY(s.is_super(s.right_of(2, /*include_pos*/false))); CHECK_UNARY(s.is_super(s.right_of(3, /*include_pos*/false))); CHECK_UNARY(s.is_super(s.right_of(4, /*include_pos*/false))); CHECK_UNARY(s.is_super(s.right_of(5, /*include_pos*/false))); CHECK_EQ(s.right_of(0, /*include_pos*/true), "012345"); CHECK_EQ(s.right_of(1, /*include_pos*/true), "12345"); CHECK_EQ(s.right_of(2, /*include_pos*/true), "2345"); CHECK_EQ(s.right_of(3, /*include_pos*/true), "345"); CHECK_EQ(s.right_of(4, /*include_pos*/true), "45"); CHECK_EQ(s.right_of(5, /*include_pos*/true), "5"); CHECK_EQ(s.right_of(6, /*include_pos*/true), ""); CHECK_UNARY(s.is_super(s.right_of(0, /*include_pos*/true))); CHECK_UNARY(s.is_super(s.right_of(1, /*include_pos*/true))); CHECK_UNARY(s.is_super(s.right_of(2, /*include_pos*/true))); CHECK_UNARY(s.is_super(s.right_of(3, /*include_pos*/true))); CHECK_UNARY(s.is_super(s.right_of(4, /*include_pos*/true))); CHECK_UNARY(s.is_super(s.right_of(5, /*include_pos*/true))); CHECK_UNARY(s.is_super(s.right_of(6, /*include_pos*/true))); CHECK_EQ(s.sub(0, 0), ""); CHECK_EQ(s.sub(0, 1), "0"); CHECK_EQ(s.sub(0, 2), "01"); CHECK_EQ(s.sub(0, 3), "012"); CHECK_EQ(s.sub(0, 4), "0123"); CHECK_EQ(s.sub(0, 5), "01234"); CHECK_EQ(s.sub(0, 6), "012345"); CHECK_EQ(s.right_of(s.sub(0, 0)), "012345"); CHECK_EQ(s.right_of(s.sub(0, 1)), "12345"); CHECK_EQ(s.right_of(s.sub(0, 2)), "2345"); CHECK_EQ(s.right_of(s.sub(0, 3)), "345"); CHECK_EQ(s.right_of(s.sub(0, 4)), "45"); CHECK_EQ(s.right_of(s.sub(0, 5)), "5"); CHECK_EQ(s.right_of(s.sub(0, 6)), ""); CHECK_UNARY(s.is_super(s.right_of(s.sub(0, 0)))); CHECK_UNARY(s.is_super(s.right_of(s.sub(0, 1)))); CHECK_UNARY(s.is_super(s.right_of(s.sub(0, 2)))); CHECK_UNARY(s.is_super(s.right_of(s.sub(0, 3)))); CHECK_UNARY(s.is_super(s.right_of(s.sub(0, 4)))); CHECK_UNARY(s.is_super(s.right_of(s.sub(0, 5)))); CHECK_UNARY(s.is_super(s.right_of(s.sub(0, 6)))); } TEST_CASE_TEMPLATE("substr.compare_different_length", SS, csubstr, substr) { typename SS::char_type s1[] = "one empty doc"; typename SS::char_type s2[] = "one empty doc, explicit termination"; SS c1(s1), c2(s2); CHECK_NE(c1, c2); CHECK_NE(c1, s2); CHECK_NE(s1, c2); CHECK_LT(c1, c2); CHECK_LT(c1, s2); CHECK_LT(s1, c2); CHECK_GT(c2, c1); CHECK_GT(c2, s1); CHECK_GT(s2, c1); CHECK_NE((c1 > c2), (c1 < c2)); CHECK_NE((c1 > s2), (c1 < s2)); CHECK_NE((s1 > c2), (s1 < c2)); CHECK_NE((c2 > c1), (c2 < c1)); CHECK_NE((c2 > s1), (c2 < s1)); CHECK_NE((s2 > c1), (s2 < c1)); CHECK_NE((c1 == c2), (c1 != c2)); CHECK_NE((c1 == s2), (c1 != s2)); CHECK_NE((s1 == c2), (s1 != c2)); CHECK_NE((c2 == c1), (c2 != c1)); CHECK_NE((c2 == s1), (c2 != s1)); CHECK_NE((s2 == c1), (s2 != c1)); } TEST_CASE_TEMPLATE("substr.compare_null", SS, csubstr, substr) { typename SS::char_type spbuf[] = " "; SS s1, s2, sp(spbuf); CHECK_EQ(s1, ""); CHECK_EQ(s1, s2); CHECK(!(s1 > s2)); CHECK(!(s1 < s2)); CHECK((s1 <= s2)); CHECK((s1 >= s2)); CHECK(!(s1 != s2)); CHECK_EQ(s1.compare('-'), -1); CHECK_EQ(sp.compare(' '), 0); CHECK_EQ(s1.compare("-", 1u), -1); CHECK_EQ(s1.compare("-", 0u), 0); CHECK_EQ(s1.compare((const char*)0, 0u), 0); CHECK_EQ(sp.compare((const char*)0, 0u), 1); CHECK_EQ(sp.compare(" ", 0u), 1); CHECK_EQ(sp.compare(" ", 1u), 0); } TEST_CASE_TEMPLATE("substr.compare_vs_char", SS, csubstr, substr) { CHECK_EQ(SS().compare('1'), -1); // str==null, len==0 typename SS::char_type numbuf[] = "0123"; SS num(numbuf); CHECK_EQ(num.first(0).compare('1'), -1); // str!=null, len==0 CHECK_EQ(num.first(1).compare('1'), -1); typename SS::char_type dashbuf[] = "-"; SS dash(dashbuf); CHECK_EQ(dash, '-'); CHECK_EQ(dash, "-"); CHECK_EQ('-', dash); CHECK_EQ("-", dash); typename SS::char_type plusbuf[] = "+"; SS plus(plusbuf); CHECK_NE(plus, '-'); CHECK_NE(plus, "-"); CHECK_NE('-', plus); CHECK_NE("-", plus); typename SS::char_type dash3buf[] = "---"; SS dash3(dash3buf); CHECK_NE(dash3, '-'); CHECK_NE(dash3, "-"); CHECK_NE('-', dash3); CHECK_NE("-", dash3); typename SS::char_type aaabuf[] = "aaa"; SS aaa(aaabuf); CHECK_NE(aaa, 'a'); CHECK_NE(aaa, "a"); CHECK_NE('a', aaa); CHECK_NE("a", aaa); CHECK_NE(aaa, 'b'); CHECK_NE(aaa, "b"); CHECK_NE('b', aaa); CHECK_NE("b", aaa); CHECK_LT(aaa, 'b'); CHECK_LT(aaa, "b"); CHECK_GT('b', aaa); CHECK_GT("b", aaa); CHECK_LE(aaa, 'b'); CHECK_LE(aaa, "b"); CHECK_GE('b', aaa); CHECK_GE("b", aaa); typename SS::char_type bbbbuf[] = "bbb"; SS bbb(bbbbuf); CHECK_NE(bbb, 'a'); CHECK_NE(bbb, "a"); CHECK_NE('a', bbb); CHECK_NE("a", bbb); CHECK_GT(bbb, 'a'); CHECK_GT(bbb, "a"); CHECK_LT('a', bbb); CHECK_LT("a", bbb); CHECK_GE(bbb, 'a'); CHECK_GE(bbb, "a"); CHECK_LE('a', bbb); CHECK_LE("a", bbb); } TEST_CASE("substr.mixed_cmp") { // c++20 introduced new comparison rules and clang10 fails: // // error: ISO C++20 considers use of overloaded operator '==' (with operand // types 'const c4::basic_substring' and 'const // c4::basic_substring') to be ambiguous despite there being a unique // best viable function [-Werror,-Wambiguous-reversed-operator] char sa_[] = "a"; char sb_[] = "b"; csubstr csa = "a"; substr sa = sa_; csubstr csb = "b"; substr sb = sb_; CHECK_EQ(csa, csa); CHECK_EQ(sa, sa); // this fails CHECK_EQ(csa, sa); CHECK_EQ(sa, csa); CHECK_NE(sa, sb); CHECK_NE(csa, csb); CHECK_NE(csa, sb); CHECK_NE(sa, csb); CHECK_LT(sa, sb); CHECK_LT(csa, csb); CHECK_LT(csa, sb); CHECK_LT(sa, csb); CHECK_LE(sa, sb); CHECK_LE(csa, csb); CHECK_LE(csa, sb); CHECK_LE(sa, csb); CHECK_LE(sa, sa); CHECK_LE(csa, csa); CHECK_LE(csa, sa); CHECK_LE(sa, csa); CHECK_GT(sb, sa); CHECK_GT(csb, csa); CHECK_GT(csb, sa); CHECK_GT( sb, csa); CHECK_GE(sb, sa); CHECK_GE(csb, csa); CHECK_GE(csb, sa); CHECK_GE( sb, csa); CHECK_GE(sb, sb); CHECK_GE(csb, csb); CHECK_GE(csb, sb); CHECK_GE( sb, csb); } TEST_CASE_TEMPLATE("substr.eqne", SS, csubstr, substr) { char buf[128]; for(size_t i = 0; i < 5; ++i) buf[i] = (char)('0' + i); SS cmp(buf, 5); typename SS::char_type buf2[] = "0123456789"; SS ref(buf2); CHECK_EQ(ref.first(5), cmp); CHECK_EQ("01234", cmp); CHECK_EQ(cmp, "01234"); CHECK_NE(ref.first(4), cmp); CHECK_NE("0123", cmp); CHECK_NE(cmp, "0123"); CHECK_NE(ref.first(6), cmp); CHECK_NE("012345", cmp); CHECK_NE(cmp, "012345"); } TEST_CASE("substr.substr2csubstr") { char b[] = "some string"; substr s(b); csubstr sc = s; CHECK_EQ(sc, s); const substr cs(b); const csubstr csc(b); } template void test_first_of_any(csubstr input, bool true_or_false, size_t which, size_t pos, Args... args) { csubstr::first_of_any_result r = input.first_of_any(to_csubstr(args)...); //std::cout << input << ": " << (bool(r) ? "true" : "false") << "/which:" << r.which << "/pos:" << r.pos << "\n"; CHECK_EQ(r, true_or_false); if(true_or_false) { CHECK_UNARY(r); } else { CHECK_FALSE(r); } CHECK_EQ(r.which, which); CHECK_EQ(r.pos, pos); } TEST_CASE("substr.first_of_any") { size_t NONE = csubstr::NONE; size_t npos = csubstr::npos; test_first_of_any("foobar" , true , 0u , 3u, "bar", "barbell", "bark", "barff"); test_first_of_any("foobar" , false, NONE, npos, "barbell", "bark", "barff"); test_first_of_any("foobart" , false, NONE, npos, "barbell", "bark", "barff"); test_first_of_any("10" , false, NONE, npos, "0x", "0X", "-0x", "-0X"); test_first_of_any("10]" , false, NONE, npos, "0x", "0X", "-0x", "-0X"); test_first_of_any(csubstr("10]").first(2), false, NONE, npos, "0x", "0X", "-0x", "-0X"); test_first_of_any("baz{% endif %}", true, 0u, 3u, "{% endif %}", "{% if " , "{% elif bar %}" , "{% else %}" ); test_first_of_any("baz{% endif %}", true, 1u, 3u, "{% if " , "{% endif %}" , "{% elif bar %}" , "{% else %}" ); test_first_of_any("baz{% endif %}", true, 2u, 3u, "{% if " , "{% elif bar %}" , "{% endif %}" , "{% else %}" ); test_first_of_any("baz{% endif %}", true, 3u, 3u, "{% if " , "{% elif bar %}" , "{% else %}" , "{% endif %}"); test_first_of_any("baz{% e..if %}", false, NONE, npos, "{% endif %}", "{% if " , "{% elif bar %}" , "{% else %}" ); test_first_of_any("baz{% e..if %}", false, NONE, npos, "{% if " , "{% endif %}" , "{% elif bar %}" , "{% else %}" ); test_first_of_any("baz{% e..if %}", false, NONE, npos, "{% if " , "{% elif bar %}" , "{% endif %}" , "{% else %}" ); test_first_of_any("baz{% e..if %}", false, NONE, npos, "{% if " , "{% elif bar %}" , "{% else %}" , "{% endif %}"); test_first_of_any("bar{% else %}baz{% endif %}", true, 0u, 3u, "{% else %}" , "{% if " , "{% elif bar %}" , "{% endif %}"); test_first_of_any("bar{% else %}baz{% endif %}", true, 1u, 3u, "{% if " , "{% else %}" , "{% elif bar %}" , "{% endif %}"); test_first_of_any("bar{% else %}baz{% endif %}", true, 2u, 3u, "{% if " , "{% elif bar %}" , "{% else %}" , "{% endif %}"); test_first_of_any("bar{% else %}baz{% endif %}", true, 3u, 3u, "{% if " , "{% elif bar %}" , "{% endif %}" , "{% else %}" ); test_first_of_any("bar{% e..e %}baz{% e..if %}", false, NONE, npos, "{% else %}" , "{% if " , "{% elif bar %}" , "{% endif %}"); test_first_of_any("bar{% e..e %}baz{% e..if %}", false, NONE, npos, "{% if " , "{% else %}" , "{% elif bar %}" , "{% endif %}"); test_first_of_any("bar{% e..e %}baz{% e..if %}", false, NONE, npos, "{% if " , "{% elif bar %}" , "{% else %}" , "{% endif %}"); test_first_of_any("bar{% e..e %}baz{% e..if %}", false, NONE, npos, "{% if " , "{% elif bar %}" , "{% endif %}" , "{% else %}" ); test_first_of_any("foo{% elif bar %}bar{% else %}baz{% endif %}", true, 0u, 3u, "{% elif bar %}" , "{% if " , "{% else %}" , "{% endif %}" ); test_first_of_any("foo{% elif bar %}bar{% else %}baz{% endif %}", true, 1u, 3u, "{% if " , "{% elif bar %}" , "{% else %}" , "{% endif %}" ); test_first_of_any("foo{% elif bar %}bar{% else %}baz{% endif %}", true, 2u, 3u, "{% if " , "{% else %}" , "{% elif bar %}" , "{% endif %}" ); test_first_of_any("foo{% elif bar %}bar{% else %}baz{% endif %}", true, 3u, 3u, "{% if " , "{% else %}" , "{% endif %}" , "{% elif bar %}"); test_first_of_any("foo{% e..f bar %}bar{% e..e %}baz{% e..if %}", false, NONE, npos, "{% elif bar %}" , "{% if " , "{% else %}" , "{% endif %}" ); test_first_of_any("foo{% e..f bar %}bar{% e..e %}baz{% e..if %}", false, NONE, npos, "{% if " , "{% elif bar %}" , "{% else %}" , "{% endif %}" ); test_first_of_any("foo{% e..f bar %}bar{% e..e %}baz{% e..if %}", false, NONE, npos, "{% if " , "{% else %}" , "{% elif bar %}" , "{% endif %}" ); test_first_of_any("foo{% e..f bar %}bar{% e..e %}baz{% e..if %}", false, NONE, npos, "{% if " , "{% else %}" , "{% endif %}" , "{% elif bar %}"); test_first_of_any("{% if foo %}foo{% elif bar %}bar{% else %}baz{% endif %}", true, 0u, 0u, "{% if " , "{% elif bar %}" , "{% else %}" , "{% endif %}" ); test_first_of_any("{% if foo %}foo{% elif bar %}bar{% else %}baz{% endif %}", true, 1u, 0u, "{% elif bar %}" , "{% if " , "{% else %}" , "{% endif %}" ); test_first_of_any("{% if foo %}foo{% elif bar %}bar{% else %}baz{% endif %}", true, 2u, 0u, "{% elif bar %}" , "{% else %}" , "{% if " , "{% endif %}" ); test_first_of_any("{% if foo %}foo{% elif bar %}bar{% else %}baz{% endif %}", true, 3u, 0u, "{% elif bar %}" , "{% else %}" , "{% endif %}", "{% if " ); test_first_of_any("{% .. foo %}foo{% e..f bar %}bar{% e..e %}baz{% e..if %}", false, NONE, npos, "{% if " , "{% elif bar %}" , "{% else %}" , "{% endif %}" ); test_first_of_any("{% .. foo %}foo{% e..f bar %}bar{% e..e %}baz{% e..if %}", false, NONE, npos, "{% elif bar %}" , "{% if " , "{% else %}" , "{% endif %}" ); test_first_of_any("{% .. foo %}foo{% e..f bar %}bar{% e..e %}baz{% e..if %}", false, NONE, npos, "{% elif bar %}" , "{% else %}" , "{% if " , "{% endif %}" ); test_first_of_any("{% .. foo %}foo{% e..f bar %}bar{% e..e %}baz{% e..if %}", false, NONE, npos, "{% elif bar %}" , "{% else %}" , "{% endif %}", "{% if " ); } TEST_CASE("substr.pair_range_esc") { const char q = '\''; CHECK_EQ(csubstr("").pair_range_esc(q), ""); CHECK_EQ(csubstr("'").pair_range_esc(q), ""); CHECK_EQ(csubstr("''").pair_range_esc(q), "''"); CHECK_EQ(csubstr("'\\'\\''").pair_range_esc(q), "'\\'\\''"); CHECK_EQ(csubstr("asdasdasd''asdasd").pair_range_esc(q), "''"); CHECK_EQ(csubstr("asdasdasd'abc'asdasda").pair_range_esc(q), "'abc'"); } TEST_CASE("substr.pair_range") { CHECK_EQ(csubstr("").pair_range('{', '}'), ""); CHECK_EQ(csubstr("{").pair_range('{', '}'), ""); CHECK_EQ(csubstr("}").pair_range('{', '}'), ""); CHECK_EQ(csubstr("{}").pair_range('{', '}'), "{}"); CHECK_EQ(csubstr("{abc}").pair_range('{', '}'), "{abc}"); CHECK_EQ(csubstr("123{abc}456").pair_range('{', '}'), "{abc}"); } TEST_CASE("substr.pair_range_nested") { CHECK_EQ(csubstr("").pair_range_nested('{', '}'), ""); CHECK_EQ(csubstr("{").pair_range_nested('{', '}'), ""); CHECK_EQ(csubstr("}").pair_range_nested('{', '}'), ""); CHECK_EQ(csubstr("{}").pair_range_nested('{', '}'), "{}"); CHECK_EQ(csubstr("{abc}").pair_range_nested('{', '}'), "{abc}"); CHECK_EQ(csubstr("123{abc}456").pair_range_nested('{', '}'), "{abc}"); CHECK_EQ(csubstr("123{abc}456{def}").pair_range_nested('{', '}'), "{abc}"); CHECK_EQ(csubstr( "{{}}").pair_range_nested('{', '}'), "{{}}"); CHECK_EQ(csubstr("123{{}}456").pair_range_nested('{', '}'), "{{}}"); CHECK_EQ(csubstr( "{a{}b{}c}").pair_range_nested('{', '}'), "{a{}b{}c}"); CHECK_EQ(csubstr("123{a{}b{}c}456").pair_range_nested('{', '}'), "{a{}b{}c}"); CHECK_EQ(csubstr( "{a{{}}b{{}}c}").pair_range_nested('{', '}'), "{a{{}}b{{}}c}"); CHECK_EQ(csubstr("123{a{{}}b{{}}c}456").pair_range_nested('{', '}'), "{a{{}}b{{}}c}"); CHECK_EQ(csubstr( "{{{}}a{{}}b{{}}c{{}}}").pair_range_nested('{', '}'), "{{{}}a{{}}b{{}}c{{}}}"); CHECK_EQ(csubstr("123{{{}}a{{}}b{{}}c{{}}}456").pair_range_nested('{', '}'), "{{{}}a{{}}b{{}}c{{}}}"); } TEST_CASE("substr.unquoted") { CHECK_EQ(csubstr("").unquoted(), ""); CHECK_EQ(csubstr("''").unquoted(), ""); CHECK_EQ(csubstr("\"\"").unquoted(), ""); CHECK_EQ(csubstr("'\''").unquoted(), "'"); CHECK_EQ(csubstr("aa").unquoted(), "aa"); CHECK_EQ(csubstr("'aa'").unquoted(), "aa"); CHECK_EQ(csubstr("\"aa\"").unquoted(), "aa"); CHECK_EQ(csubstr("'aa\''").unquoted(), "aa'"); } TEST_CASE("substr.first_non_empty_span") { CHECK_EQ(csubstr("foo bar").first_non_empty_span(), "foo"); CHECK_EQ(csubstr(" foo bar").first_non_empty_span(), "foo"); CHECK_EQ(csubstr("\n \r \t foo bar").first_non_empty_span(), "foo"); CHECK_EQ(csubstr("\n \r \t foo\n\r\t bar").first_non_empty_span(), "foo"); CHECK_EQ(csubstr("\n \r \t foo\n\r\t bar").first_non_empty_span(), "foo"); CHECK_EQ(csubstr(",\n \r \t foo\n\r\t bar").first_non_empty_span(), ","); } TEST_CASE("substr.first_uint_span") { CHECK_EQ(csubstr("1234").first_uint_span(), "1234"); CHECK_EQ(csubstr("+1234").first_uint_span(), "+1234"); CHECK_EQ(csubstr("-1234").first_uint_span(), ""); CHECK_EQ(csubstr("1234 asdkjh").first_uint_span(), "1234"); CHECK_EQ(csubstr("1234\rasdkjh").first_uint_span(), "1234"); CHECK_EQ(csubstr("1234\tasdkjh").first_uint_span(), "1234"); CHECK_EQ(csubstr("1234\nasdkjh").first_uint_span(), "1234"); CHECK_EQ(csubstr("1234]asdkjh").first_uint_span(), "1234"); CHECK_EQ(csubstr("1234)asdkjh").first_uint_span(), "1234"); CHECK_EQ(csubstr("1234gasdkjh").first_uint_span(), ""); CHECK_EQ(csubstr("1").first_uint_span(), "1"); CHECK_EQ(csubstr("+1").first_uint_span(), "+1"); CHECK_EQ(csubstr("-1").first_uint_span(), ""); CHECK_EQ(csubstr("-0").first_uint_span(), ""); CHECK_EQ(csubstr("0").first_uint_span(), "0"); CHECK_EQ(csubstr("+0").first_uint_span(), "+0"); CHECK_EQ(csubstr("-0").first_uint_span(), ""); CHECK_EQ(csubstr("1234 abc").first_uint_span(), "1234"); CHECK_EQ(csubstr("abc 1234 abc").first_uint_span(), ""); CHECK_EQ(csubstr("+0x1234 abc").first_uint_span(), "+0x1234"); CHECK_EQ(csubstr("-0x1234 abc").first_uint_span(), ""); CHECK_EQ(csubstr("0x1234 abc").first_uint_span(), "0x1234"); CHECK_EQ(csubstr("0x1234\rabc").first_uint_span(), "0x1234"); CHECK_EQ(csubstr("0x1234\nabc").first_uint_span(), "0x1234"); CHECK_EQ(csubstr("0x1234\tabc").first_uint_span(), "0x1234"); CHECK_EQ(csubstr("0x1234]abc").first_uint_span(), "0x1234"); CHECK_EQ(csubstr("0x1234)abc").first_uint_span(), "0x1234"); CHECK_EQ(csubstr("0x1234g").first_uint_span(), ""); CHECK_EQ(csubstr("0b01").first_uint_span(), "0b01"); CHECK_EQ(csubstr("+0b01").first_uint_span(), "+0b01"); CHECK_EQ(csubstr("-0b01").first_uint_span(), ""); CHECK_EQ(csubstr("0b01 asdasd").first_uint_span(), "0b01"); CHECK_EQ(csubstr("0b01\rasdasd").first_uint_span(), "0b01"); CHECK_EQ(csubstr("0b01\tasdasd").first_uint_span(), "0b01"); CHECK_EQ(csubstr("0b01\nasdasd").first_uint_span(), "0b01"); CHECK_EQ(csubstr("0b01]asdasd").first_uint_span(), "0b01"); CHECK_EQ(csubstr("0b01)asdasd").first_uint_span(), "0b01"); CHECK_EQ(csubstr("0b01hasdasd").first_uint_span(), ""); CHECK_EQ(csubstr("+").first_uint_span(), ""); CHECK_EQ(csubstr("-").first_uint_span(), ""); } TEST_CASE("substr.first_int_span") { CHECK_EQ(csubstr("1234").first_int_span(), "1234"); CHECK_EQ(csubstr("+1234").first_int_span(), "+1234"); CHECK_EQ(csubstr("-1234").first_int_span(), "-1234"); CHECK_EQ(csubstr("-1234 asdkjh").first_int_span(), "-1234"); CHECK_EQ(csubstr("-1234\rasdkjh").first_int_span(), "-1234"); CHECK_EQ(csubstr("-1234\tasdkjh").first_int_span(), "-1234"); CHECK_EQ(csubstr("-1234\nasdkjh").first_int_span(), "-1234"); CHECK_EQ(csubstr("-1234]asdkjh").first_int_span(), "-1234"); CHECK_EQ(csubstr("-1234)asdkjh").first_int_span(), "-1234"); CHECK_EQ(csubstr("-1234gasdkjh").first_int_span(), ""); CHECK_EQ(csubstr("1").first_int_span(), "1"); CHECK_EQ(csubstr("+1").first_int_span(), "+1"); CHECK_EQ(csubstr("-1").first_int_span(), "-1"); CHECK_EQ(csubstr("-0").first_int_span(), "-0"); CHECK_EQ(csubstr("0").first_int_span(), "0"); CHECK_EQ(csubstr("+0").first_int_span(), "+0"); CHECK_EQ(csubstr("-0").first_int_span(), "-0"); CHECK_EQ(csubstr("1234 abc").first_int_span(), "1234"); CHECK_EQ(csubstr("abc 1234 abc").first_int_span(), ""); CHECK_EQ(csubstr("+0x1234 abc").first_int_span(), "+0x1234"); CHECK_EQ(csubstr("-0x1234 abc").first_int_span(), "-0x1234"); CHECK_EQ(csubstr("0x1234 abc").first_int_span(), "0x1234"); CHECK_EQ(csubstr("0x1234\rabc").first_int_span(), "0x1234"); CHECK_EQ(csubstr("0x1234\nabc").first_int_span(), "0x1234"); CHECK_EQ(csubstr("0x1234\tabc").first_int_span(), "0x1234"); CHECK_EQ(csubstr("0x1234]abc").first_int_span(), "0x1234"); CHECK_EQ(csubstr("0x1234)abc").first_int_span(), "0x1234"); CHECK_EQ(csubstr("0x1234gabc").first_int_span(), ""); CHECK_EQ(csubstr("0b01").first_int_span(), "0b01"); CHECK_EQ(csubstr("+0b01").first_int_span(), "+0b01"); CHECK_EQ(csubstr("-0b01").first_int_span(), "-0b01"); CHECK_EQ(csubstr("0b01 asdasd").first_int_span(), "0b01"); CHECK_EQ(csubstr("0b01\rasdasd").first_int_span(), "0b01"); CHECK_EQ(csubstr("0b01\tasdasd").first_int_span(), "0b01"); CHECK_EQ(csubstr("0b01\nasdasd").first_int_span(), "0b01"); CHECK_EQ(csubstr("0b01]asdasd").first_int_span(), "0b01"); CHECK_EQ(csubstr("0b01)asdasd").first_int_span(), "0b01"); CHECK_EQ(csubstr("0b01gasdasd").first_int_span(), ""); } TEST_CASE("substr.first_real_span") { // all integers are reals CHECK_EQ(csubstr("1234").first_real_span(), "1234"); CHECK_EQ(csubstr("+1234").first_real_span(), "+1234"); CHECK_EQ(csubstr("-1234").first_real_span(), "-1234"); CHECK_EQ(csubstr("-1234 asdkjh").first_real_span(), "-1234"); CHECK_EQ(csubstr("-1234\rasdkjh").first_real_span(), "-1234"); CHECK_EQ(csubstr("-1234\tasdkjh").first_real_span(), "-1234"); CHECK_EQ(csubstr("-1234\nasdkjh").first_real_span(), "-1234"); CHECK_EQ(csubstr("-1234]asdkjh").first_real_span(), "-1234"); CHECK_EQ(csubstr("-1234)asdkjh").first_real_span(), "-1234"); CHECK_EQ(csubstr("-1234gasdkjh").first_real_span(), ""); CHECK_EQ(csubstr("1").first_real_span(), "1"); CHECK_EQ(csubstr("+1").first_real_span(), "+1"); CHECK_EQ(csubstr("-1").first_real_span(), "-1"); CHECK_EQ(csubstr("-0").first_real_span(), "-0"); CHECK_EQ(csubstr("0").first_real_span(), "0"); CHECK_EQ(csubstr("+0").first_real_span(), "+0"); CHECK_EQ(csubstr("-0").first_real_span(), "-0"); CHECK_EQ(csubstr("1.").first_real_span(), "1."); CHECK_EQ(csubstr("+1.").first_real_span(), "+1."); CHECK_EQ(csubstr("-1.").first_real_span(), "-1."); CHECK_EQ(csubstr("-0.").first_real_span(), "-0."); CHECK_EQ(csubstr("0.").first_real_span(), "0."); CHECK_EQ(csubstr("+0.").first_real_span(), "+0."); CHECK_EQ(csubstr("-0.").first_real_span(), "-0."); CHECK_EQ(csubstr("1.2").first_real_span(), "1.2"); CHECK_EQ(csubstr("+1.2").first_real_span(), "+1.2"); CHECK_EQ(csubstr("-1.2").first_real_span(), "-1.2"); CHECK_EQ(csubstr("-0.2").first_real_span(), "-0.2"); CHECK_EQ(csubstr("0.2").first_real_span(), "0.2"); CHECK_EQ(csubstr("+0.2").first_real_span(), "+0.2"); CHECK_EQ(csubstr("-0.2").first_real_span(), "-0.2"); CHECK_EQ(csubstr("1234 abc").first_real_span(), "1234"); CHECK_EQ(csubstr("abc 1234 abc").first_real_span(), ""); CHECK_EQ(csubstr("+0x1234 abc").first_real_span(), "+0x1234"); CHECK_EQ(csubstr("-0x1234 abc").first_real_span(), "-0x1234"); CHECK_EQ(csubstr("0x1234 abc").first_real_span(), "0x1234"); CHECK_EQ(csubstr("0x1234\rabc").first_real_span(), "0x1234"); CHECK_EQ(csubstr("0x1234\nabc").first_real_span(), "0x1234"); CHECK_EQ(csubstr("0x1234\tabc").first_real_span(), "0x1234"); CHECK_EQ(csubstr("0x1234]abc").first_real_span(), "0x1234"); CHECK_EQ(csubstr("0x1234)abc").first_real_span(), "0x1234"); CHECK_EQ(csubstr("0x1234gabc").first_real_span(), ""); CHECK_EQ(csubstr("0b01").first_real_span(), "0b01"); CHECK_EQ(csubstr("+0b01").first_real_span(), "+0b01"); CHECK_EQ(csubstr("-0b01").first_real_span(), "-0b01"); CHECK_EQ(csubstr("0b01 asdasd").first_real_span(), "0b01"); CHECK_EQ(csubstr("0b01\rasdasd").first_real_span(), "0b01"); CHECK_EQ(csubstr("0b01\tasdasd").first_real_span(), "0b01"); CHECK_EQ(csubstr("0b01\nasdasd").first_real_span(), "0b01"); CHECK_EQ(csubstr("0b01]asdasd").first_real_span(), "0b01"); CHECK_EQ(csubstr("0b01)asdasd").first_real_span(), "0b01"); CHECK_EQ(csubstr("0b01gasdasd").first_real_span(), ""); CHECK_EQ(csubstr("0b1.01 asdasd").first_real_span(), "0b1.01"); CHECK_EQ(csubstr("0b1.01\rasdasd").first_real_span(), "0b1.01"); CHECK_EQ(csubstr("0b1.01\tasdasd").first_real_span(), "0b1.01"); CHECK_EQ(csubstr("0b1.01\nasdasd").first_real_span(), "0b1.01"); CHECK_EQ(csubstr("0b1.01]asdasd").first_real_span(), "0b1.01"); CHECK_EQ(csubstr("0b1.01)asdasd").first_real_span(), "0b1.01"); CHECK_EQ(csubstr("0b1.01gasdasd").first_real_span(), ""); CHECK_EQ(csubstr("0b1.02 asdasd").first_real_span(), ""); CHECK_EQ(csubstr("0b1.02\rasdasd").first_real_span(), ""); CHECK_EQ(csubstr("0b1.02\tasdasd").first_real_span(), ""); CHECK_EQ(csubstr("0b1.02\nasdasd").first_real_span(), ""); CHECK_EQ(csubstr("0b1.02]asdasd").first_real_span(), ""); CHECK_EQ(csubstr("0b1.02)asdasd").first_real_span(), ""); CHECK_EQ(csubstr("0b1.02gasdasd").first_real_span(), ""); CHECK_EQ(csubstr("+").first_real_span(), ""); CHECK_EQ(csubstr("-").first_real_span(), ""); CHECK_EQ(csubstr("+0x").first_real_span(), ""); CHECK_EQ(csubstr("-0x").first_real_span(), ""); CHECK_EQ(csubstr("+0b").first_real_span(), ""); CHECK_EQ(csubstr("-0b").first_real_span(), ""); CHECK_EQ(csubstr("+0o").first_real_span(), ""); CHECK_EQ(csubstr("-0o").first_real_span(), ""); CHECK_EQ(csubstr("-1.234 asdkjh").first_real_span(), "-1.234"); CHECK_EQ(csubstr("-1.234e5 asdkjh").first_real_span(), "-1.234e5"); CHECK_EQ(csubstr("-1.234E5 asdkjh").first_real_span(), "-1.234E5"); CHECK_EQ(csubstr("-1.234e+5 asdkjh").first_real_span(), "-1.234e+5"); CHECK_EQ(csubstr("-1.234E+5 asdkjh").first_real_span(), "-1.234E+5"); CHECK_EQ(csubstr("-1.234e-5 asdkjh").first_real_span(), "-1.234e-5"); CHECK_EQ(csubstr("-1.234E-5 asdkjh").first_real_span(), "-1.234E-5"); CHECK_EQ(csubstr("9.5e7 asdkjh").first_real_span(), "9.5e7"); CHECK_EQ(csubstr("9.5E7 asdkjh").first_real_span(), "9.5E7"); CHECK_EQ(csubstr("9.5e+7 asdkjh").first_real_span(), "9.5e+7"); CHECK_EQ(csubstr("9.5E+7 asdkjh").first_real_span(), "9.5E+7"); CHECK_EQ(csubstr("9.5e-7 asdkjh").first_real_span(), "9.5e-7"); CHECK_EQ(csubstr("9.5E-7 asdkjh").first_real_span(), "9.5E-7"); CHECK_EQ(csubstr("-9.5e7 asdkjh").first_real_span(), "-9.5e7"); CHECK_EQ(csubstr("-9.5E7 asdkjh").first_real_span(), "-9.5E7"); CHECK_EQ(csubstr("-9.5e+7 asdkjh").first_real_span(), "-9.5e+7"); CHECK_EQ(csubstr("-9.5E+7 asdkjh").first_real_span(), "-9.5E+7"); CHECK_EQ(csubstr("-9.5e-7 asdkjh").first_real_span(), "-9.5e-7"); CHECK_EQ(csubstr("-9.5E-7 asdkjh").first_real_span(), "-9.5E-7"); CHECK_EQ(csubstr("+9.5e7 asdkjh").first_real_span(), "+9.5e7"); CHECK_EQ(csubstr("+9.5E7 asdkjh").first_real_span(), "+9.5E7"); CHECK_EQ(csubstr("+9.5e+7 asdkjh").first_real_span(), "+9.5e+7"); CHECK_EQ(csubstr("+9.5E+7 asdkjh").first_real_span(), "+9.5E+7"); CHECK_EQ(csubstr("+9.5e-7 asdkjh").first_real_span(), "+9.5e-7"); CHECK_EQ(csubstr("+9.5E-7 asdkjh").first_real_span(), "+9.5E-7"); CHECK_EQ(csubstr("9.5e17 asdkjh").first_real_span(), "9.5e17"); CHECK_EQ(csubstr("9.5E17 asdkjh").first_real_span(), "9.5E17"); CHECK_EQ(csubstr("9.5e+17 asdkjh").first_real_span(), "9.5e+17"); CHECK_EQ(csubstr("9.5E+17 asdkjh").first_real_span(), "9.5E+17"); CHECK_EQ(csubstr("9.5e-17 asdkjh").first_real_span(), "9.5e-17"); CHECK_EQ(csubstr("9.5E-17 asdkjh").first_real_span(), "9.5E-17"); CHECK_EQ(csubstr("-9.5e17 asdkjh").first_real_span(), "-9.5e17"); CHECK_EQ(csubstr("-9.5E17 asdkjh").first_real_span(), "-9.5E17"); CHECK_EQ(csubstr("-9.5e+17 asdkjh").first_real_span(), "-9.5e+17"); CHECK_EQ(csubstr("-9.5E+17 asdkjh").first_real_span(), "-9.5E+17"); CHECK_EQ(csubstr("-9.5e-17 asdkjh").first_real_span(), "-9.5e-17"); CHECK_EQ(csubstr("-9.5E-17 asdkjh").first_real_span(), "-9.5E-17"); CHECK_EQ(csubstr("+9.5e17 asdkjh").first_real_span(), "+9.5e17"); CHECK_EQ(csubstr("+9.5E17 asdkjh").first_real_span(), "+9.5E17"); CHECK_EQ(csubstr("+9.5e+17 asdkjh").first_real_span(), "+9.5e+17"); CHECK_EQ(csubstr("+9.5E+17 asdkjh").first_real_span(), "+9.5E+17"); CHECK_EQ(csubstr("+9.5e-17 asdkjh").first_real_span(), "+9.5e-17"); CHECK_EQ(csubstr("+9.5E-17 asdkjh").first_real_span(), "+9.5E-17"); CHECK_EQ(csubstr("129.532e7 asdkjh").first_real_span(), "129.532e7"); CHECK_EQ(csubstr("129.532E7 asdkjh").first_real_span(), "129.532E7"); CHECK_EQ(csubstr("129.532e+7 asdkjh").first_real_span(), "129.532e+7"); CHECK_EQ(csubstr("129.532E+7 asdkjh").first_real_span(), "129.532E+7"); CHECK_EQ(csubstr("129.532e-7 asdkjh").first_real_span(), "129.532e-7"); CHECK_EQ(csubstr("129.532E-7 asdkjh").first_real_span(), "129.532E-7"); CHECK_EQ(csubstr("-129.532e7 asdkjh").first_real_span(), "-129.532e7"); CHECK_EQ(csubstr("-129.532E7 asdkjh").first_real_span(), "-129.532E7"); CHECK_EQ(csubstr("-129.532e+7 asdkjh").first_real_span(), "-129.532e+7"); CHECK_EQ(csubstr("-129.532E+7 asdkjh").first_real_span(), "-129.532E+7"); CHECK_EQ(csubstr("-129.532e-7 asdkjh").first_real_span(), "-129.532e-7"); CHECK_EQ(csubstr("-129.532E-7 asdkjh").first_real_span(), "-129.532E-7"); CHECK_EQ(csubstr("+129.532e7 asdkjh").first_real_span(), "+129.532e7"); CHECK_EQ(csubstr("+129.532E7 asdkjh").first_real_span(), "+129.532E7"); CHECK_EQ(csubstr("+129.532e+7 asdkjh").first_real_span(), "+129.532e+7"); CHECK_EQ(csubstr("+129.532E+7 asdkjh").first_real_span(), "+129.532E+7"); CHECK_EQ(csubstr("+129.532e-7 asdkjh").first_real_span(), "+129.532e-7"); CHECK_EQ(csubstr("+129.532E-7 asdkjh").first_real_span(), "+129.532E-7"); CHECK_EQ(csubstr("129.532e17 asdkjh").first_real_span(), "129.532e17"); CHECK_EQ(csubstr("129.532E17 asdkjh").first_real_span(), "129.532E17"); CHECK_EQ(csubstr("129.532e+17 asdkjh").first_real_span(), "129.532e+17"); CHECK_EQ(csubstr("129.532E+17 asdkjh").first_real_span(), "129.532E+17"); CHECK_EQ(csubstr("129.532e-17 asdkjh").first_real_span(), "129.532e-17"); CHECK_EQ(csubstr("129.532E-17 asdkjh").first_real_span(), "129.532E-17"); CHECK_EQ(csubstr("-129.532e17 asdkjh").first_real_span(), "-129.532e17"); CHECK_EQ(csubstr("-129.532E17 asdkjh").first_real_span(), "-129.532E17"); CHECK_EQ(csubstr("-129.532e+17 asdkjh").first_real_span(), "-129.532e+17"); CHECK_EQ(csubstr("-129.532E+17 asdkjh").first_real_span(), "-129.532E+17"); CHECK_EQ(csubstr("-129.532e-17 asdkjh").first_real_span(), "-129.532e-17"); CHECK_EQ(csubstr("-129.532E-17 asdkjh").first_real_span(), "-129.532E-17"); CHECK_EQ(csubstr("+129.532e17 asdkjh").first_real_span(), "+129.532e17"); CHECK_EQ(csubstr("+129.532E17 asdkjh").first_real_span(), "+129.532E17"); CHECK_EQ(csubstr("+129.532e+17 asdkjh").first_real_span(), "+129.532e+17"); CHECK_EQ(csubstr("+129.532E+17 asdkjh").first_real_span(), "+129.532E+17"); CHECK_EQ(csubstr("+129.532e-17 asdkjh").first_real_span(), "+129.532e-17"); CHECK_EQ(csubstr("+129.532E-17 asdkjh").first_real_span(), "+129.532E-17"); CHECK_EQ(csubstr("129.532e asdkjh").first_real_span(), ""); CHECK_EQ(csubstr("129.532E asdkjh").first_real_span(), ""); CHECK_EQ(csubstr("129.532e+ asdkjh").first_real_span(), ""); CHECK_EQ(csubstr("129.532E+ asdkjh").first_real_span(), ""); CHECK_EQ(csubstr("129.532e- asdkjh").first_real_span(), ""); CHECK_EQ(csubstr("129.532E- asdkjh").first_real_span(), ""); CHECK_EQ(csubstr("-129.532e asdkjh").first_real_span(), ""); CHECK_EQ(csubstr("-129.532E asdkjh").first_real_span(), ""); CHECK_EQ(csubstr("-129.532e+ asdkjh").first_real_span(), ""); CHECK_EQ(csubstr("-129.532E+ asdkjh").first_real_span(), ""); CHECK_EQ(csubstr("-129.532e- asdkjh").first_real_span(), ""); CHECK_EQ(csubstr("-129.532E- asdkjh").first_real_span(), ""); CHECK_EQ(csubstr("+129.532e asdkjh").first_real_span(), ""); CHECK_EQ(csubstr("+129.532E asdkjh").first_real_span(), ""); CHECK_EQ(csubstr("+129.532e+ asdkjh").first_real_span(), ""); CHECK_EQ(csubstr("+129.532E+ asdkjh").first_real_span(), ""); CHECK_EQ(csubstr("+129.532e- asdkjh").first_real_span(), ""); CHECK_EQ(csubstr("+129.532E- asdkjh").first_real_span(), ""); CHECK_EQ(csubstr("0x1.e8480p+19 asdkjh").first_real_span(), "0x1.e8480p+19"); CHECK_EQ(csubstr("0x1.e8480p-19 asdkjh").first_real_span(), "0x1.e8480p-19"); CHECK_EQ(csubstr("-0x1.e8480p+19 asdkjh").first_real_span(), "-0x1.e8480p+19"); CHECK_EQ(csubstr("-0x1.e8480p-19 asdkjh").first_real_span(), "-0x1.e8480p-19"); CHECK_EQ(csubstr("+0x1.e8480p+19 asdkjh").first_real_span(), "+0x1.e8480p+19"); CHECK_EQ(csubstr("+0x1.e8480p-19 asdkjh").first_real_span(), "+0x1.e8480p-19"); CHECK_EQ(csubstr("0x1.e8480p+1 asdkjh").first_real_span(), "0x1.e8480p+1"); CHECK_EQ(csubstr("0x1.e8480p-1 asdkjh").first_real_span(), "0x1.e8480p-1"); CHECK_EQ(csubstr("-0x1.e8480p+1 asdkjh").first_real_span(), "-0x1.e8480p+1"); CHECK_EQ(csubstr("-0x1.e8480p-1 asdkjh").first_real_span(), "-0x1.e8480p-1"); CHECK_EQ(csubstr("+0x1.e8480p+1 asdkjh").first_real_span(), "+0x1.e8480p+1"); CHECK_EQ(csubstr("+0x1.e8480p-1 asdkjh").first_real_span(), "+0x1.e8480p-1"); CHECK_EQ(csubstr("0x1.e8480p+ asdkjh").first_real_span(), ""); CHECK_EQ(csubstr("0x1.e8480p- asdkjh").first_real_span(), ""); CHECK_EQ(csubstr("-0x1.e8480p+ asdkjh").first_real_span(), ""); CHECK_EQ(csubstr("-0x1.e8480p- asdkjh").first_real_span(), ""); CHECK_EQ(csubstr("+0x1.e8480p+ asdkjh").first_real_span(), ""); CHECK_EQ(csubstr("+0x1.e8480p- asdkjh").first_real_span(), ""); CHECK_EQ(csubstr("infinity").first_real_span(), "infinity"); CHECK_EQ(csubstr(" infinity").first_real_span(), "infinity"); CHECK_EQ(csubstr("-infinity").first_real_span(), "-infinity"); CHECK_EQ(csubstr(" -infinity").first_real_span(), "-infinity"); CHECK_EQ(csubstr("+infinity").first_real_span(), "+infinity"); CHECK_EQ(csubstr(" +infinity").first_real_span(), "+infinity"); CHECK_EQ(csubstr("infinity ").first_real_span(), "infinity"); CHECK_EQ(csubstr(" infinity ").first_real_span(), "infinity"); CHECK_EQ(csubstr("-infinity ").first_real_span(), "-infinity"); CHECK_EQ(csubstr(" -infinity ").first_real_span(), "-infinity"); CHECK_EQ(csubstr("+infinity ").first_real_span(), "+infinity"); CHECK_EQ(csubstr(" +infinity ").first_real_span(), "+infinity"); CHECK_EQ(csubstr("infinity1").first_real_span(), ""); CHECK_EQ(csubstr(" infinity1").first_real_span(), ""); CHECK_EQ(csubstr("-infinity1").first_real_span(), ""); CHECK_EQ(csubstr(" -infinity1").first_real_span(), ""); CHECK_EQ(csubstr("+infinity1").first_real_span(), ""); CHECK_EQ(csubstr(" +infinity1").first_real_span(), ""); CHECK_EQ(csubstr("infin").first_real_span(), ""); CHECK_EQ(csubstr(" infin").first_real_span(), ""); CHECK_EQ(csubstr("-infin").first_real_span(), ""); CHECK_EQ(csubstr(" -infin").first_real_span(), ""); CHECK_EQ(csubstr("+infin").first_real_span(), ""); CHECK_EQ(csubstr(" +infin").first_real_span(), ""); CHECK_EQ(csubstr("inflated").first_real_span(), ""); CHECK_EQ(csubstr(" inflated").first_real_span(), ""); CHECK_EQ(csubstr("-inflated").first_real_span(), ""); CHECK_EQ(csubstr(" -inflated").first_real_span(), ""); CHECK_EQ(csubstr("+inflated").first_real_span(), ""); CHECK_EQ(csubstr(" +inflated").first_real_span(), ""); CHECK_EQ(csubstr("inf").first_real_span(), "inf"); CHECK_EQ(csubstr(" inf").first_real_span(), "inf"); CHECK_EQ(csubstr("-inf").first_real_span(), "-inf"); CHECK_EQ(csubstr(" -inf").first_real_span(), "-inf"); CHECK_EQ(csubstr("+inf").first_real_span(), "+inf"); CHECK_EQ(csubstr(" +inf").first_real_span(), "+inf"); CHECK_EQ(csubstr("inf ").first_real_span(), "inf"); CHECK_EQ(csubstr(" inf ").first_real_span(), "inf"); CHECK_EQ(csubstr("-inf ").first_real_span(), "-inf"); CHECK_EQ(csubstr(" -inf ").first_real_span(), "-inf"); CHECK_EQ(csubstr("+inf ").first_real_span(), "+inf"); CHECK_EQ(csubstr(" +inf ").first_real_span(), "+inf"); CHECK_EQ(csubstr("inf1").first_real_span(), ""); CHECK_EQ(csubstr(" inf1").first_real_span(), ""); CHECK_EQ(csubstr("-inf1").first_real_span(), ""); CHECK_EQ(csubstr(" -inf1").first_real_span(), ""); CHECK_EQ(csubstr("+inf1").first_real_span(), ""); CHECK_EQ(csubstr(" +inf1").first_real_span(), ""); CHECK_EQ(csubstr("nan").first_real_span(), "nan"); CHECK_EQ(csubstr(" nan").first_real_span(), "nan"); CHECK_EQ(csubstr("-nan").first_real_span(), "-nan"); CHECK_EQ(csubstr(" -nan").first_real_span(), "-nan"); CHECK_EQ(csubstr("+nan").first_real_span(), "+nan"); CHECK_EQ(csubstr(" +nan").first_real_span(), "+nan"); CHECK_EQ(csubstr("nan ").first_real_span(), "nan"); CHECK_EQ(csubstr(" nan ").first_real_span(), "nan"); CHECK_EQ(csubstr("-nan ").first_real_span(), "-nan"); CHECK_EQ(csubstr(" -nan ").first_real_span(), "-nan"); CHECK_EQ(csubstr("+nan ").first_real_span(), "+nan"); CHECK_EQ(csubstr(" +nan ").first_real_span(), "+nan"); CHECK_EQ(csubstr("nan1").first_real_span(), ""); CHECK_EQ(csubstr(" nan1").first_real_span(), ""); CHECK_EQ(csubstr("-nan1").first_real_span(), ""); CHECK_EQ(csubstr(" -nan1").first_real_span(), ""); CHECK_EQ(csubstr("+nan1").first_real_span(), ""); CHECK_EQ(csubstr(" +nan1").first_real_span(), ""); } // start with some obvious direct tests TEST_CASE("substr.is_unsigned_integer") { SUBCASE("empty_string") { CHECK_FALSE(csubstr().is_unsigned_integer()); CHECK_FALSE(csubstr("").is_unsigned_integer()); } SUBCASE("signs") { CHECK_FALSE(csubstr("-").is_unsigned_integer()); CHECK_FALSE(csubstr("+").is_unsigned_integer()); CHECK_FALSE(csubstr("-1").is_unsigned_integer()); CHECK_UNARY(csubstr("+1").is_unsigned_integer()); } SUBCASE("whitespace_before") { CHECK_FALSE(csubstr(" 0").is_unsigned_integer()); CHECK_FALSE(csubstr(" 1").is_unsigned_integer()); CHECK_FALSE(csubstr(" -1").is_unsigned_integer()); CHECK_FALSE(csubstr(" 0.1").is_unsigned_integer()); CHECK_FALSE(csubstr(" -0.1").is_unsigned_integer()); } SUBCASE("whitespace_after") { CHECK_FALSE(csubstr("0 ").is_unsigned_integer()); CHECK_FALSE(csubstr("1 ").is_unsigned_integer()); CHECK_FALSE(csubstr("-1 ").is_unsigned_integer()); CHECK_FALSE(csubstr("0.1 ").is_unsigned_integer()); CHECK_FALSE(csubstr("-0.1 ").is_unsigned_integer()); } SUBCASE("whitespace_only") { CHECK_FALSE(csubstr(" ").is_unsigned_integer()); CHECK_FALSE(csubstr("\t\t\t\t").is_unsigned_integer()); CHECK_FALSE(csubstr("\n\n\n\n").is_unsigned_integer()); CHECK_FALSE(csubstr("\r\r\r\r").is_unsigned_integer()); } SUBCASE("decimal") { CHECK_UNARY(csubstr("0").is_unsigned_integer()); CHECK_UNARY(csubstr("1").is_unsigned_integer()); CHECK_FALSE(csubstr("-1").is_unsigned_integer()); CHECK_FALSE(csubstr("0.1").is_unsigned_integer()); CHECK_FALSE(csubstr("-0.1").is_unsigned_integer()); } SUBCASE("hexadecimal") { CHECK_FALSE(csubstr("0x").is_unsigned_integer()); CHECK_FALSE(csubstr("0X").is_unsigned_integer()); CHECK_UNARY(csubstr("0x1").is_unsigned_integer()); CHECK_UNARY(csubstr("0X1").is_unsigned_integer()); CHECK_UNARY(csubstr("0x0").is_unsigned_integer()); CHECK_UNARY(csubstr("0X0").is_unsigned_integer()); CHECK_UNARY(csubstr("0xa").is_unsigned_integer()); CHECK_UNARY(csubstr("0Xa").is_unsigned_integer()); CHECK_UNARY(csubstr("0xb").is_unsigned_integer()); CHECK_UNARY(csubstr("0Xb").is_unsigned_integer()); CHECK_UNARY(csubstr("0xc").is_unsigned_integer()); CHECK_UNARY(csubstr("0Xc").is_unsigned_integer()); CHECK_UNARY(csubstr("0xd").is_unsigned_integer()); CHECK_UNARY(csubstr("0Xd").is_unsigned_integer()); CHECK_UNARY(csubstr("0xe").is_unsigned_integer()); CHECK_UNARY(csubstr("0Xe").is_unsigned_integer()); CHECK_UNARY(csubstr("0xf").is_unsigned_integer()); CHECK_UNARY(csubstr("0Xf").is_unsigned_integer()); CHECK_UNARY(csubstr("0xA").is_unsigned_integer()); CHECK_UNARY(csubstr("0XA").is_unsigned_integer()); CHECK_UNARY(csubstr("0xB").is_unsigned_integer()); CHECK_UNARY(csubstr("0XB").is_unsigned_integer()); CHECK_UNARY(csubstr("0xC").is_unsigned_integer()); CHECK_UNARY(csubstr("0XC").is_unsigned_integer()); CHECK_UNARY(csubstr("0xD").is_unsigned_integer()); CHECK_UNARY(csubstr("0XD").is_unsigned_integer()); CHECK_UNARY(csubstr("0xE").is_unsigned_integer()); CHECK_UNARY(csubstr("0XE").is_unsigned_integer()); CHECK_UNARY(csubstr("0xF").is_unsigned_integer()); CHECK_UNARY(csubstr("0XF").is_unsigned_integer()); CHECK_FALSE(csubstr("0xg").is_unsigned_integer()); CHECK_FALSE(csubstr("0Xg").is_unsigned_integer()); CHECK_FALSE(csubstr("0xG").is_unsigned_integer()); CHECK_FALSE(csubstr("0XG").is_unsigned_integer()); CHECK_FALSE(csubstr("-0x1").is_unsigned_integer()); CHECK_FALSE(csubstr("-0X1").is_unsigned_integer()); CHECK_FALSE(csubstr("-0x0").is_unsigned_integer()); CHECK_FALSE(csubstr("-0X0").is_unsigned_integer()); CHECK_FALSE(csubstr("-0xa").is_unsigned_integer()); CHECK_FALSE(csubstr("-0Xa").is_unsigned_integer()); CHECK_FALSE(csubstr("-0xb").is_unsigned_integer()); CHECK_FALSE(csubstr("-0Xb").is_unsigned_integer()); CHECK_FALSE(csubstr("-0xc").is_unsigned_integer()); CHECK_FALSE(csubstr("-0Xc").is_unsigned_integer()); CHECK_FALSE(csubstr("-0xd").is_unsigned_integer()); CHECK_FALSE(csubstr("-0Xd").is_unsigned_integer()); CHECK_FALSE(csubstr("-0xe").is_unsigned_integer()); CHECK_FALSE(csubstr("-0Xe").is_unsigned_integer()); CHECK_FALSE(csubstr("-0xf").is_unsigned_integer()); CHECK_FALSE(csubstr("-0Xf").is_unsigned_integer()); CHECK_FALSE(csubstr("-0xA").is_unsigned_integer()); CHECK_FALSE(csubstr("-0XA").is_unsigned_integer()); CHECK_FALSE(csubstr("-0xB").is_unsigned_integer()); CHECK_FALSE(csubstr("-0XB").is_unsigned_integer()); CHECK_FALSE(csubstr("-0xC").is_unsigned_integer()); CHECK_FALSE(csubstr("-0XC").is_unsigned_integer()); CHECK_FALSE(csubstr("-0xD").is_unsigned_integer()); CHECK_FALSE(csubstr("-0XD").is_unsigned_integer()); CHECK_FALSE(csubstr("-0xE").is_unsigned_integer()); CHECK_FALSE(csubstr("-0XE").is_unsigned_integer()); CHECK_FALSE(csubstr("-0xF").is_unsigned_integer()); CHECK_FALSE(csubstr("-0XF").is_unsigned_integer()); CHECK_FALSE(csubstr("-0xg").is_unsigned_integer()); CHECK_FALSE(csubstr("-0Xg").is_unsigned_integer()); CHECK_FALSE(csubstr("-0xG").is_unsigned_integer()); CHECK_FALSE(csubstr("-0XG").is_unsigned_integer()); } SUBCASE("binary") { CHECK_FALSE(csubstr("0b").is_unsigned_integer()); CHECK_FALSE(csubstr("0B").is_unsigned_integer()); CHECK_UNARY(csubstr("0b0").is_unsigned_integer()); CHECK_UNARY(csubstr("0B0").is_unsigned_integer()); CHECK_UNARY(csubstr("0b1").is_unsigned_integer()); CHECK_UNARY(csubstr("0B1").is_unsigned_integer()); CHECK_FALSE(csubstr("0b2").is_unsigned_integer()); CHECK_FALSE(csubstr("0B2").is_unsigned_integer()); CHECK_FALSE(csubstr("-0b0").is_unsigned_integer()); CHECK_FALSE(csubstr("-0B0").is_unsigned_integer()); CHECK_FALSE(csubstr("-0b1").is_unsigned_integer()); CHECK_FALSE(csubstr("-0B1").is_unsigned_integer()); CHECK_FALSE(csubstr("-0b2").is_unsigned_integer()); CHECK_FALSE(csubstr("-0B2").is_unsigned_integer()); } SUBCASE("octal") { CHECK_FALSE(csubstr("0o").is_unsigned_integer()); CHECK_FALSE(csubstr("0O").is_unsigned_integer()); CHECK_UNARY(csubstr("0o0").is_unsigned_integer()); CHECK_UNARY(csubstr("0O0").is_unsigned_integer()); CHECK_UNARY(csubstr("0o1").is_unsigned_integer()); CHECK_UNARY(csubstr("0O1").is_unsigned_integer()); CHECK_UNARY(csubstr("0o6").is_unsigned_integer()); CHECK_UNARY(csubstr("0O6").is_unsigned_integer()); CHECK_UNARY(csubstr("0o6").is_unsigned_integer()); CHECK_UNARY(csubstr("0O6").is_unsigned_integer()); CHECK_UNARY(csubstr("0o7").is_unsigned_integer()); CHECK_UNARY(csubstr("0O7").is_unsigned_integer()); CHECK_FALSE(csubstr("0o8").is_unsigned_integer()); CHECK_FALSE(csubstr("0O8").is_unsigned_integer()); CHECK_FALSE(csubstr("0o9").is_unsigned_integer()); CHECK_FALSE(csubstr("0O9").is_unsigned_integer()); CHECK_FALSE(csubstr("-0o0").is_unsigned_integer()); CHECK_FALSE(csubstr("-0O0").is_unsigned_integer()); CHECK_FALSE(csubstr("-0o1").is_unsigned_integer()); CHECK_FALSE(csubstr("-0O1").is_unsigned_integer()); CHECK_FALSE(csubstr("-0o6").is_unsigned_integer()); CHECK_FALSE(csubstr("-0O6").is_unsigned_integer()); CHECK_FALSE(csubstr("-0o6").is_unsigned_integer()); CHECK_FALSE(csubstr("-0O6").is_unsigned_integer()); CHECK_FALSE(csubstr("-0o7").is_unsigned_integer()); CHECK_FALSE(csubstr("-0O7").is_unsigned_integer()); CHECK_FALSE(csubstr("-0o8").is_unsigned_integer()); CHECK_FALSE(csubstr("-0O8").is_unsigned_integer()); CHECK_FALSE(csubstr("-0o9").is_unsigned_integer()); CHECK_FALSE(csubstr("-0O9").is_unsigned_integer()); } } TEST_CASE("substr.is_integer") { SUBCASE("empty_string") { CHECK_FALSE(csubstr().is_integer()); CHECK_FALSE(csubstr("").is_integer()); } SUBCASE("signs") { CHECK_FALSE(csubstr("-").is_integer()); CHECK_FALSE(csubstr("+").is_integer()); CHECK_UNARY(csubstr("-1").is_integer()); CHECK_UNARY(csubstr("+1").is_integer()); } SUBCASE("whitespace_before") { CHECK_FALSE(csubstr(" 0").is_integer()); CHECK_FALSE(csubstr(" 1").is_integer()); CHECK_FALSE(csubstr(" -1").is_integer()); CHECK_FALSE(csubstr(" 0.1").is_integer()); CHECK_FALSE(csubstr(" -0.1").is_integer()); } SUBCASE("whitespace_after") { CHECK_FALSE(csubstr("0 ").is_integer()); CHECK_FALSE(csubstr("1 ").is_integer()); CHECK_FALSE(csubstr("-1 ").is_integer()); CHECK_FALSE(csubstr("0.1 ").is_integer()); CHECK_FALSE(csubstr("-0.1 ").is_integer()); } SUBCASE("whitespace_only") { CHECK_FALSE(csubstr(" ").is_integer()); CHECK_FALSE(csubstr("\t\t\t\t").is_integer()); CHECK_FALSE(csubstr("\n\n\n\n").is_integer()); CHECK_FALSE(csubstr("\r\r\r\r").is_integer()); } SUBCASE("decimal") { CHECK_UNARY(csubstr("0").is_integer()); CHECK_UNARY(csubstr("1").is_integer()); CHECK_UNARY(csubstr("-1").is_integer()); CHECK_FALSE(csubstr("0.1").is_integer()); CHECK_FALSE(csubstr("-0.1").is_integer()); } SUBCASE("hexadecimal") { CHECK_FALSE(csubstr("0x").is_integer()); CHECK_FALSE(csubstr("0X").is_integer()); CHECK_UNARY(csubstr("0x1").is_integer()); CHECK_UNARY(csubstr("0X1").is_integer()); CHECK_UNARY(csubstr("0x0").is_integer()); CHECK_UNARY(csubstr("0X0").is_integer()); CHECK_UNARY(csubstr("0xa").is_integer()); CHECK_UNARY(csubstr("0Xa").is_integer()); CHECK_UNARY(csubstr("0xb").is_integer()); CHECK_UNARY(csubstr("0Xb").is_integer()); CHECK_UNARY(csubstr("0xc").is_integer()); CHECK_UNARY(csubstr("0Xc").is_integer()); CHECK_UNARY(csubstr("0xd").is_integer()); CHECK_UNARY(csubstr("0Xd").is_integer()); CHECK_UNARY(csubstr("0xe").is_integer()); CHECK_UNARY(csubstr("0Xe").is_integer()); CHECK_UNARY(csubstr("0xf").is_integer()); CHECK_UNARY(csubstr("0Xf").is_integer()); CHECK_UNARY(csubstr("0xA").is_integer()); CHECK_UNARY(csubstr("0XA").is_integer()); CHECK_UNARY(csubstr("0xB").is_integer()); CHECK_UNARY(csubstr("0XB").is_integer()); CHECK_UNARY(csubstr("0xC").is_integer()); CHECK_UNARY(csubstr("0XC").is_integer()); CHECK_UNARY(csubstr("0xD").is_integer()); CHECK_UNARY(csubstr("0XD").is_integer()); CHECK_UNARY(csubstr("0xE").is_integer()); CHECK_UNARY(csubstr("0XE").is_integer()); CHECK_UNARY(csubstr("0xF").is_integer()); CHECK_UNARY(csubstr("0XF").is_integer()); CHECK_FALSE(csubstr("0xg").is_integer()); CHECK_FALSE(csubstr("0Xg").is_integer()); CHECK_FALSE(csubstr("0xG").is_integer()); CHECK_FALSE(csubstr("0XG").is_integer()); CHECK_UNARY(csubstr("-0x1").is_integer()); CHECK_UNARY(csubstr("-0X1").is_integer()); CHECK_UNARY(csubstr("-0x0").is_integer()); CHECK_UNARY(csubstr("-0X0").is_integer()); CHECK_UNARY(csubstr("-0xa").is_integer()); CHECK_UNARY(csubstr("-0Xa").is_integer()); CHECK_UNARY(csubstr("-0xb").is_integer()); CHECK_UNARY(csubstr("-0Xb").is_integer()); CHECK_UNARY(csubstr("-0xc").is_integer()); CHECK_UNARY(csubstr("-0Xc").is_integer()); CHECK_UNARY(csubstr("-0xd").is_integer()); CHECK_UNARY(csubstr("-0Xd").is_integer()); CHECK_UNARY(csubstr("-0xe").is_integer()); CHECK_UNARY(csubstr("-0Xe").is_integer()); CHECK_UNARY(csubstr("-0xf").is_integer()); CHECK_UNARY(csubstr("-0Xf").is_integer()); CHECK_UNARY(csubstr("-0xA").is_integer()); CHECK_UNARY(csubstr("-0XA").is_integer()); CHECK_UNARY(csubstr("-0xB").is_integer()); CHECK_UNARY(csubstr("-0XB").is_integer()); CHECK_UNARY(csubstr("-0xC").is_integer()); CHECK_UNARY(csubstr("-0XC").is_integer()); CHECK_UNARY(csubstr("-0xD").is_integer()); CHECK_UNARY(csubstr("-0XD").is_integer()); CHECK_UNARY(csubstr("-0xE").is_integer()); CHECK_UNARY(csubstr("-0XE").is_integer()); CHECK_UNARY(csubstr("-0xF").is_integer()); CHECK_UNARY(csubstr("-0XF").is_integer()); CHECK_FALSE(csubstr("-0xg").is_integer()); CHECK_FALSE(csubstr("-0Xg").is_integer()); CHECK_FALSE(csubstr("-0xG").is_integer()); CHECK_FALSE(csubstr("-0XG").is_integer()); } SUBCASE("binary") { CHECK_FALSE(csubstr("0b").is_integer()); CHECK_FALSE(csubstr("0B").is_integer()); CHECK_UNARY(csubstr("0b0").is_integer()); CHECK_UNARY(csubstr("0B0").is_integer()); CHECK_UNARY(csubstr("0b1").is_integer()); CHECK_UNARY(csubstr("0B1").is_integer()); CHECK_FALSE(csubstr("0b2").is_integer()); CHECK_FALSE(csubstr("0B2").is_integer()); CHECK_UNARY(csubstr("-0b0").is_integer()); CHECK_UNARY(csubstr("-0B0").is_integer()); CHECK_UNARY(csubstr("-0b1").is_integer()); CHECK_UNARY(csubstr("-0B1").is_integer()); CHECK_FALSE(csubstr("-0b2").is_integer()); CHECK_FALSE(csubstr("-0B2").is_integer()); } SUBCASE("octal") { CHECK_FALSE(csubstr("0o").is_integer()); CHECK_FALSE(csubstr("0O").is_integer()); CHECK_UNARY(csubstr("0o0").is_integer()); CHECK_UNARY(csubstr("0O0").is_integer()); CHECK_UNARY(csubstr("0o1").is_integer()); CHECK_UNARY(csubstr("0O1").is_integer()); CHECK_UNARY(csubstr("0o6").is_integer()); CHECK_UNARY(csubstr("0O6").is_integer()); CHECK_UNARY(csubstr("0o6").is_integer()); CHECK_UNARY(csubstr("0O6").is_integer()); CHECK_UNARY(csubstr("0o7").is_integer()); CHECK_UNARY(csubstr("0O7").is_integer()); CHECK_FALSE(csubstr("0o8").is_integer()); CHECK_FALSE(csubstr("0O8").is_integer()); CHECK_FALSE(csubstr("0o9").is_integer()); CHECK_FALSE(csubstr("0O9").is_integer()); CHECK_UNARY(csubstr("-0o0").is_integer()); CHECK_UNARY(csubstr("-0O0").is_integer()); CHECK_UNARY(csubstr("-0o1").is_integer()); CHECK_UNARY(csubstr("-0O1").is_integer()); CHECK_UNARY(csubstr("-0o6").is_integer()); CHECK_UNARY(csubstr("-0O6").is_integer()); CHECK_UNARY(csubstr("-0o6").is_integer()); CHECK_UNARY(csubstr("-0O6").is_integer()); CHECK_UNARY(csubstr("-0o7").is_integer()); CHECK_UNARY(csubstr("-0O7").is_integer()); CHECK_FALSE(csubstr("-0o8").is_integer()); CHECK_FALSE(csubstr("-0O8").is_integer()); CHECK_FALSE(csubstr("-0o9").is_integer()); CHECK_FALSE(csubstr("-0O9").is_integer()); } } TEST_CASE("substr.is_real") { SUBCASE("empty_string") { CHECK_FALSE(csubstr().is_real()); CHECK_FALSE(csubstr("").is_real()); } SUBCASE("signs") { CHECK_FALSE(csubstr("-").is_real()); CHECK_FALSE(csubstr("+").is_real()); CHECK_UNARY(csubstr("-1").is_real()); CHECK_UNARY(csubstr("+1").is_real()); } SUBCASE("whitespace_before") { CHECK_FALSE(csubstr(" 0").is_real()); CHECK_FALSE(csubstr(" 1").is_real()); CHECK_FALSE(csubstr(" -1").is_real()); CHECK_FALSE(csubstr(" 0.1").is_real()); CHECK_FALSE(csubstr(" -0.1").is_real()); } SUBCASE("whitespace_after") { CHECK_FALSE(csubstr("0 ").is_real()); CHECK_FALSE(csubstr("1 ").is_real()); CHECK_FALSE(csubstr("-1 ").is_real()); CHECK_FALSE(csubstr("0.1 ").is_real()); CHECK_FALSE(csubstr("-0.1 ").is_real()); } SUBCASE("whitespace_only") { CHECK_FALSE(csubstr(" ").is_real()); CHECK_FALSE(csubstr("\t\t\t\t").is_real()); CHECK_FALSE(csubstr("\n\n\n\n").is_real()); CHECK_FALSE(csubstr("\r\r\r\r").is_real()); } SUBCASE("decimal") { CHECK_UNARY(csubstr("0").is_real()); CHECK_UNARY(csubstr("1").is_real()); CHECK_UNARY(csubstr("-1").is_real()); CHECK_UNARY(csubstr("0.1").is_real()); CHECK_UNARY(csubstr("-0.1").is_real()); } SUBCASE("scientific") { CHECK_UNARY(csubstr("-1.234").is_real()); CHECK_UNARY(csubstr("-1.234e5").is_real()); CHECK_UNARY(csubstr("-1.234E5").is_real()); CHECK_UNARY(csubstr("-1.234e+5").is_real()); CHECK_UNARY(csubstr("-1.234E+5").is_real()); CHECK_UNARY(csubstr("-1.234e-5").is_real()); CHECK_UNARY(csubstr("-1.234E-5").is_real()); CHECK_UNARY(csubstr("9.5e7").is_real()); CHECK_UNARY(csubstr("9.5E7").is_real()); CHECK_UNARY(csubstr("9.5e+7").is_real()); CHECK_UNARY(csubstr("9.5E+7").is_real()); CHECK_UNARY(csubstr("9.5e-7").is_real()); CHECK_UNARY(csubstr("9.5E-7").is_real()); CHECK_UNARY(csubstr("-9.5e7").is_real()); CHECK_UNARY(csubstr("-9.5E7").is_real()); CHECK_UNARY(csubstr("-9.5e+7").is_real()); CHECK_UNARY(csubstr("-9.5E+7").is_real()); CHECK_UNARY(csubstr("-9.5e-7").is_real()); CHECK_UNARY(csubstr("-9.5E-7").is_real()); CHECK_UNARY(csubstr("+9.5e7").is_real()); CHECK_UNARY(csubstr("+9.5E7").is_real()); CHECK_UNARY(csubstr("+9.5e+7").is_real()); CHECK_UNARY(csubstr("+9.5E+7").is_real()); CHECK_UNARY(csubstr("+9.5e-7").is_real()); CHECK_UNARY(csubstr("+9.5E-7").is_real()); CHECK_UNARY(csubstr("9.5e17").is_real()); CHECK_UNARY(csubstr("9.5E17").is_real()); CHECK_UNARY(csubstr("9.5e+17").is_real()); CHECK_UNARY(csubstr("9.5E+17").is_real()); CHECK_UNARY(csubstr("9.5e-17").is_real()); CHECK_UNARY(csubstr("9.5E-17").is_real()); CHECK_UNARY(csubstr("-9.5e17").is_real()); CHECK_UNARY(csubstr("-9.5E17").is_real()); CHECK_UNARY(csubstr("-9.5e+17").is_real()); CHECK_UNARY(csubstr("-9.5E+17").is_real()); CHECK_UNARY(csubstr("-9.5e-17").is_real()); CHECK_UNARY(csubstr("-9.5E-17").is_real()); CHECK_UNARY(csubstr("+9.5e17").is_real()); CHECK_UNARY(csubstr("+9.5E17").is_real()); CHECK_UNARY(csubstr("+9.5e+17").is_real()); CHECK_UNARY(csubstr("+9.5E+17").is_real()); CHECK_UNARY(csubstr("+9.5e-17").is_real()); CHECK_UNARY(csubstr("+9.5E-17").is_real()); CHECK_UNARY(csubstr("129.532e7").is_real()); CHECK_UNARY(csubstr("129.532E7").is_real()); CHECK_UNARY(csubstr("129.532e+7").is_real()); CHECK_UNARY(csubstr("129.532E+7").is_real()); CHECK_UNARY(csubstr("129.532e-7").is_real()); CHECK_UNARY(csubstr("129.532E-7").is_real()); CHECK_UNARY(csubstr("-129.532e7").is_real()); CHECK_UNARY(csubstr("-129.532E7").is_real()); CHECK_UNARY(csubstr("-129.532e+7").is_real()); CHECK_UNARY(csubstr("-129.532E+7").is_real()); CHECK_UNARY(csubstr("-129.532e-7").is_real()); CHECK_UNARY(csubstr("-129.532E-7").is_real()); CHECK_UNARY(csubstr("+129.532e7").is_real()); CHECK_UNARY(csubstr("+129.532E7").is_real()); CHECK_UNARY(csubstr("+129.532e+7").is_real()); CHECK_UNARY(csubstr("+129.532E+7").is_real()); CHECK_UNARY(csubstr("+129.532e-7").is_real()); CHECK_UNARY(csubstr("+129.532E-7").is_real()); CHECK_UNARY(csubstr("129.532e17").is_real()); CHECK_UNARY(csubstr("129.532E17").is_real()); CHECK_UNARY(csubstr("129.532e+17").is_real()); CHECK_UNARY(csubstr("129.532E+17").is_real()); CHECK_UNARY(csubstr("129.532e-17").is_real()); CHECK_UNARY(csubstr("129.532E-17").is_real()); CHECK_UNARY(csubstr("-129.532e17").is_real()); CHECK_UNARY(csubstr("-129.532E17").is_real()); CHECK_UNARY(csubstr("-129.532e+17").is_real()); CHECK_UNARY(csubstr("-129.532E+17").is_real()); CHECK_UNARY(csubstr("-129.532e-17").is_real()); CHECK_UNARY(csubstr("-129.532E-17").is_real()); CHECK_UNARY(csubstr("+129.532e17").is_real()); CHECK_UNARY(csubstr("+129.532E17").is_real()); CHECK_UNARY(csubstr("+129.532e+17").is_real()); CHECK_UNARY(csubstr("+129.532E+17").is_real()); CHECK_UNARY(csubstr("+129.532e-17").is_real()); CHECK_UNARY(csubstr("+129.532E-17").is_real()); } SUBCASE("hexadecimal") { CHECK_FALSE(csubstr("0x").is_real()); CHECK_FALSE(csubstr("0X").is_real()); CHECK_UNARY(csubstr("0x1").is_real()); CHECK_UNARY(csubstr("0X1").is_real()); CHECK_UNARY(csubstr("0x0").is_real()); CHECK_UNARY(csubstr("0X0").is_real()); CHECK_UNARY(csubstr("0xa").is_real()); CHECK_UNARY(csubstr("0Xa").is_real()); CHECK_UNARY(csubstr("0xb").is_real()); CHECK_UNARY(csubstr("0Xb").is_real()); CHECK_UNARY(csubstr("0xc").is_real()); CHECK_UNARY(csubstr("0Xc").is_real()); CHECK_UNARY(csubstr("0xd").is_real()); CHECK_UNARY(csubstr("0Xd").is_real()); CHECK_UNARY(csubstr("0xe").is_real()); CHECK_UNARY(csubstr("0Xe").is_real()); CHECK_UNARY(csubstr("0xf").is_real()); CHECK_UNARY(csubstr("0Xf").is_real()); CHECK_UNARY(csubstr("0xA").is_real()); CHECK_UNARY(csubstr("0XA").is_real()); CHECK_UNARY(csubstr("0xB").is_real()); CHECK_UNARY(csubstr("0XB").is_real()); CHECK_UNARY(csubstr("0xC").is_real()); CHECK_UNARY(csubstr("0XC").is_real()); CHECK_UNARY(csubstr("0xD").is_real()); CHECK_UNARY(csubstr("0XD").is_real()); CHECK_UNARY(csubstr("0xE").is_real()); CHECK_UNARY(csubstr("0XE").is_real()); CHECK_UNARY(csubstr("0xF").is_real()); CHECK_UNARY(csubstr("0XF").is_real()); CHECK_FALSE(csubstr("0xg").is_real()); CHECK_FALSE(csubstr("0Xg").is_real()); CHECK_FALSE(csubstr("0xG").is_real()); CHECK_FALSE(csubstr("0XG").is_real()); CHECK_UNARY(csubstr("-0x1").is_real()); CHECK_UNARY(csubstr("-0X1").is_real()); CHECK_UNARY(csubstr("-0x0").is_real()); CHECK_UNARY(csubstr("-0X0").is_real()); CHECK_UNARY(csubstr("-0xa").is_real()); CHECK_UNARY(csubstr("-0Xa").is_real()); CHECK_UNARY(csubstr("-0xb").is_real()); CHECK_UNARY(csubstr("-0Xb").is_real()); CHECK_UNARY(csubstr("-0xc").is_real()); CHECK_UNARY(csubstr("-0Xc").is_real()); CHECK_UNARY(csubstr("-0xd").is_real()); CHECK_UNARY(csubstr("-0Xd").is_real()); CHECK_UNARY(csubstr("-0xe").is_real()); CHECK_UNARY(csubstr("-0Xe").is_real()); CHECK_UNARY(csubstr("-0xf").is_real()); CHECK_UNARY(csubstr("-0Xf").is_real()); CHECK_UNARY(csubstr("-0xA").is_real()); CHECK_UNARY(csubstr("-0XA").is_real()); CHECK_UNARY(csubstr("-0xB").is_real()); CHECK_UNARY(csubstr("-0XB").is_real()); CHECK_UNARY(csubstr("-0xC").is_real()); CHECK_UNARY(csubstr("-0XC").is_real()); CHECK_UNARY(csubstr("-0xD").is_real()); CHECK_UNARY(csubstr("-0XD").is_real()); CHECK_UNARY(csubstr("-0xE").is_real()); CHECK_UNARY(csubstr("-0XE").is_real()); CHECK_UNARY(csubstr("-0xF").is_real()); CHECK_UNARY(csubstr("-0XF").is_real()); CHECK_FALSE(csubstr("-0xg").is_real()); CHECK_FALSE(csubstr("-0Xg").is_real()); CHECK_FALSE(csubstr("-0xG").is_real()); CHECK_FALSE(csubstr("-0XG").is_real()); CHECK_UNARY(csubstr("0x1.e8480p+19").is_real()); CHECK_UNARY(csubstr("0X1.e8480P+19").is_real()); CHECK_UNARY(csubstr("0x1.e8480P+19").is_real()); CHECK_UNARY(csubstr("0X1.e8480p+19").is_real()); CHECK_UNARY(csubstr("-0x1.e8480p+19").is_real()); CHECK_UNARY(csubstr("-0X1.e8480P+19").is_real()); CHECK_UNARY(csubstr("-0x1.e8480P+19").is_real()); CHECK_UNARY(csubstr("-0X1.e8480p+19").is_real()); } SUBCASE("binary") { CHECK_FALSE(csubstr("0b").is_real()); CHECK_FALSE(csubstr("0B").is_real()); CHECK_UNARY(csubstr("0b0").is_real()); CHECK_UNARY(csubstr("0B0").is_real()); CHECK_UNARY(csubstr("0b1").is_real()); CHECK_UNARY(csubstr("0B1").is_real()); CHECK_FALSE(csubstr("0b2").is_real()); CHECK_FALSE(csubstr("0B2").is_real()); CHECK_UNARY(csubstr("-0b0").is_real()); CHECK_UNARY(csubstr("-0B0").is_real()); CHECK_UNARY(csubstr("-0b1").is_real()); CHECK_UNARY(csubstr("-0B1").is_real()); CHECK_FALSE(csubstr("-0b2").is_real()); CHECK_FALSE(csubstr("-0B2").is_real()); } SUBCASE("octal") { CHECK_FALSE(csubstr("0o").is_real()); CHECK_FALSE(csubstr("0O").is_real()); CHECK_UNARY(csubstr("0o0").is_real()); CHECK_UNARY(csubstr("0O0").is_real()); CHECK_UNARY(csubstr("0o1").is_real()); CHECK_UNARY(csubstr("0O1").is_real()); CHECK_UNARY(csubstr("0o6").is_real()); CHECK_UNARY(csubstr("0O6").is_real()); CHECK_UNARY(csubstr("0o6").is_real()); CHECK_UNARY(csubstr("0O6").is_real()); CHECK_UNARY(csubstr("0o7").is_real()); CHECK_UNARY(csubstr("0O7").is_real()); CHECK_FALSE(csubstr("0o8").is_real()); CHECK_FALSE(csubstr("0O8").is_real()); CHECK_FALSE(csubstr("0o9").is_real()); CHECK_FALSE(csubstr("0O9").is_real()); CHECK_UNARY(csubstr("-0o0").is_real()); CHECK_UNARY(csubstr("-0O0").is_real()); CHECK_UNARY(csubstr("-0o1").is_real()); CHECK_UNARY(csubstr("-0O1").is_real()); CHECK_UNARY(csubstr("-0o6").is_real()); CHECK_UNARY(csubstr("-0O6").is_real()); CHECK_UNARY(csubstr("-0o6").is_real()); CHECK_UNARY(csubstr("-0O6").is_real()); CHECK_UNARY(csubstr("-0o7").is_real()); CHECK_UNARY(csubstr("-0O7").is_real()); CHECK_FALSE(csubstr("-0o8").is_real()); CHECK_FALSE(csubstr("-0O8").is_real()); CHECK_FALSE(csubstr("-0o9").is_real()); CHECK_FALSE(csubstr("-0O9").is_real()); } SUBCASE("infinity") { CHECK_UNARY(csubstr("infinity").is_real()); CHECK_FALSE(csubstr(" infinity").is_real()); CHECK_UNARY(csubstr("-infinity").is_real()); CHECK_FALSE(csubstr(" -infinity").is_real()); CHECK_UNARY(csubstr("+infinity").is_real()); CHECK_FALSE(csubstr(" +infinity").is_real()); CHECK_FALSE(csubstr("infinity ").is_real()); CHECK_FALSE(csubstr(" infinity ").is_real()); CHECK_FALSE(csubstr("-infinity ").is_real()); CHECK_FALSE(csubstr(" -infinity ").is_real()); CHECK_FALSE(csubstr("+infinity ").is_real()); CHECK_FALSE(csubstr(" +infinity ").is_real()); CHECK_FALSE(csubstr("infinity1").is_real()); CHECK_FALSE(csubstr(" infinity1").is_real()); CHECK_FALSE(csubstr("-infinity1").is_real()); CHECK_FALSE(csubstr(" -infinity1").is_real()); CHECK_FALSE(csubstr("+infinity1").is_real()); CHECK_FALSE(csubstr(" +infinity1").is_real()); CHECK_FALSE(csubstr("infin").is_real()); CHECK_FALSE(csubstr(" infin").is_real()); CHECK_FALSE(csubstr("-infin").is_real()); CHECK_FALSE(csubstr(" -infin").is_real()); CHECK_FALSE(csubstr("+infin").is_real()); CHECK_FALSE(csubstr(" +infin").is_real()); CHECK_FALSE(csubstr("inflated").is_real()); CHECK_FALSE(csubstr(" inflated").is_real()); CHECK_FALSE(csubstr("-inflated").is_real()); CHECK_FALSE(csubstr(" -inflated").is_real()); CHECK_FALSE(csubstr("+inflated").is_real()); CHECK_FALSE(csubstr(" +inflated").is_real()); } SUBCASE("inf") { CHECK_UNARY(csubstr("inf").is_real()); CHECK_FALSE(csubstr(" inf").is_real()); CHECK_UNARY(csubstr("-inf").is_real()); CHECK_FALSE(csubstr(" -inf").is_real()); CHECK_UNARY(csubstr("+inf").is_real()); CHECK_FALSE(csubstr(" +inf").is_real()); CHECK_FALSE(csubstr("inf ").is_real()); CHECK_FALSE(csubstr(" inf ").is_real()); CHECK_FALSE(csubstr("-inf ").is_real()); CHECK_FALSE(csubstr(" -inf ").is_real()); CHECK_FALSE(csubstr("+inf ").is_real()); CHECK_FALSE(csubstr(" +inf ").is_real()); CHECK_FALSE(csubstr("inf1").is_real()); CHECK_FALSE(csubstr(" inf1").is_real()); CHECK_FALSE(csubstr("-inf1").is_real()); CHECK_FALSE(csubstr(" -inf1").is_real()); CHECK_FALSE(csubstr("+inf1").is_real()); CHECK_FALSE(csubstr(" +inf1").is_real()); } SUBCASE("nan") { CHECK_UNARY(csubstr("nan").is_real()); CHECK_FALSE(csubstr(" nan").is_real()); CHECK_UNARY(csubstr("-nan").is_real()); CHECK_FALSE(csubstr(" -nan").is_real()); CHECK_UNARY(csubstr("+nan").is_real()); CHECK_FALSE(csubstr(" +nan").is_real()); CHECK_FALSE(csubstr("nan ").is_real()); CHECK_FALSE(csubstr(" nan ").is_real()); CHECK_FALSE(csubstr("-nan ").is_real()); CHECK_FALSE(csubstr(" -nan ").is_real()); CHECK_FALSE(csubstr("+nan ").is_real()); CHECK_FALSE(csubstr(" +nan ").is_real()); CHECK_FALSE(csubstr("nan1").is_real()); CHECK_FALSE(csubstr(" nan1").is_real()); CHECK_FALSE(csubstr("-nan1").is_real()); CHECK_FALSE(csubstr(" -nan1").is_real()); CHECK_FALSE(csubstr("+nan1").is_real()); CHECK_FALSE(csubstr(" +nan1").is_real()); } } typedef enum : uint8_t { kIsNone = 0, kIsUint = 1, kIsInt = 3, kIsReal = 7 } NumberClass; struct number { csubstr num; NumberClass cls; template number(const char (&n)[N], NumberClass c) : num(n), cls(c) {} number(csubstr n, NumberClass c) : num(n), cls(c) {} void test(csubstr ref={}) { if(ref.empty()) ref = num; INFO("num=" << num); INFO("ref=" << ref); switch(cls) { case kIsUint: { INFO("uint"); CHECK_EQ(num.first_uint_span(), ref); CHECK_EQ(num.first_int_span(), ref); CHECK_EQ(num.first_real_span(), ref); CHECK_UNARY(num.first_uint_span().is_unsigned_integer()); CHECK_UNARY(num.first_uint_span().is_integer()); CHECK_UNARY(num.first_uint_span().is_number()); break; } case kIsInt: { INFO("int"); CHECK_EQ(num.first_uint_span(), ""); CHECK_EQ(num.first_int_span(), ref); CHECK_EQ(num.first_real_span(), ref); CHECK_FALSE(num.first_int_span().is_unsigned_integer()); CHECK_UNARY(num.first_int_span().is_integer()); CHECK_UNARY(num.first_int_span().is_number()); break; } case kIsReal: { INFO("real"); CHECK_EQ(num.first_uint_span(), ""); CHECK_EQ(num.first_int_span(), ""); CHECK_EQ(num.first_real_span(), ref); CHECK_FALSE(num.first_real_span().is_unsigned_integer()); CHECK_FALSE(num.first_real_span().is_integer()); CHECK_UNARY(num .first_real_span().is_number()); break; } case kIsNone: { INFO("none"); CHECK_EQ(num.first_uint_span(), ""); CHECK_EQ(num.first_int_span(), ""); CHECK_EQ(num.first_real_span(), ""); CHECK_FALSE(num.is_unsigned_integer()); CHECK_FALSE(num.is_integer()); CHECK_FALSE(num.is_number()); break; } default: { CHECK_UNARY(false);//FAIL(); break; } } } }; const number numbers[] = { {"", kIsNone}, {"0x", kIsNone}, {"0b", kIsNone}, {"0o", kIsNone}, {".", kIsNone}, {"0x.", kIsNone}, {"0b.", kIsNone}, {"0o.", kIsNone}, {"-", kIsNone}, {"0x-", kIsNone}, {"0b-", kIsNone}, {"0o-", kIsNone}, {"+", kIsNone}, {"0x+", kIsNone}, {"0b+", kIsNone}, {"0o+", kIsNone}, {".e", kIsNone}, {".e+", kIsNone}, {".e-", kIsNone}, {"0x.p", kIsNone}, {"0x.p+", kIsNone}, {"0x.p-", kIsNone}, {"0b.p", kIsNone}, {"0b.p+", kIsNone}, {"0b.p-", kIsNone}, {"0o.p", kIsNone}, {"0o.p+", kIsNone}, {"0o.p-", kIsNone}, {"0x.p+", kIsNone}, {"0x0.p+", kIsNone}, {"0x.0p+", kIsNone}, {"0x.p+0", kIsNone}, {"0x.p+00", kIsNone}, {"0x0.0p+", kIsNone}, {"0x.0p+0", kIsReal}, {"0x0.p+0", kIsReal}, {"0x0.0p+0", kIsReal}, {"0x0.0p+00", kIsReal}, {"0x00.00p+00", kIsReal}, {"0x0p0.00p+00", kIsNone}, {"0x00.0p0p+00", kIsNone}, {"0x00.00p+0p0", kIsNone}, {"0x00.00p+00p", kIsNone}, {"0b.p+", kIsNone}, {"0b0.p+", kIsNone}, {"0b.0p+", kIsNone}, {"0b.p+0", kIsNone}, {"0b.p+00", kIsNone}, {"0b0.0p+", kIsNone}, {"0b.0p+0", kIsReal}, {"0b0.p+0", kIsReal}, {"0b0.0p+0", kIsReal}, {"0b0.0p+00", kIsReal}, {"0b00.00p+00", kIsReal}, {"0b0p0.00p+00", kIsNone}, {"0b00.0p0p+00", kIsNone}, {"0b00.00p+0p0", kIsNone}, {"0b00.00p+00p", kIsNone}, {"0o.p+", kIsNone}, {"0o0.p+", kIsNone}, {"0o.0p+", kIsNone}, {"0o.p+0", kIsNone}, {"0o.p+00", kIsNone}, {"0o0.0p+", kIsNone}, {"0o.0p+0", kIsReal}, {"0o0.p+0", kIsReal}, {"0o0.0p+0", kIsReal}, {"0o0.0p+00", kIsReal}, {"0o00.00p+00", kIsReal}, {"0o0p0.00p+00", kIsNone}, {"0o00.0p0p+00", kIsNone}, {"0o00.00p+0p0", kIsNone}, {"0o00.00p+00p", kIsNone}, {".e+", kIsNone}, {"0.e+", kIsNone}, {".0e+", kIsNone}, {".e+0", kIsNone}, {".e+00", kIsNone}, {"0.0e+", kIsNone}, {".0e+0", kIsReal}, {"0.e+0", kIsReal}, {"0.0e+0", kIsReal}, {"0.0e+00", kIsReal}, {"00.00e+00", kIsReal}, {"0e0.00e+00", kIsNone}, {"00.0e0e+00", kIsNone}, {"00.00e+0e0", kIsNone}, {"00.00e+00e", kIsNone}, {"0x1234.", kIsReal}, {"+0x1234.", kIsReal}, {"-0x1234.", kIsReal}, {"0x.1234", kIsReal}, {"0x0.1.2.3", kIsNone}, {"0o0.1.2.3", kIsNone}, {"0b0.1.0.1", kIsNone}, {"a", kIsNone}, {"b", kIsNone}, {"?", kIsNone}, {"0.0.1", kIsNone}, {"0.0.9", kIsNone}, {"0.0.10", kIsNone}, {"0.1.0", kIsNone}, {"0.9.0", kIsNone}, {"0.10.0", kIsNone}, {"1.0.0", kIsNone}, {"9.0.0", kIsNone}, {"10.0.0", kIsNone}, {".0", kIsReal}, {"0.", kIsReal}, {"0.0", kIsReal}, {"1234", kIsUint}, {"+1234", kIsUint}, {"-1234", kIsInt}, {"1234.0", kIsReal}, {"+1234.0", kIsReal}, {"-1234.0", kIsReal}, {"0000", kIsUint}, {"0123", kIsUint}, {"0", kIsUint}, {"1", kIsUint}, {"1.", kIsReal}, {".1", kIsReal}, {"0x1234", kIsUint}, {"+0x1234", kIsUint}, {"-0x1234", kIsInt}, {"0b01", kIsUint}, {"1e+1", kIsReal}, {"1e-1", kIsReal}, {"1.e-1", kIsReal}, {"1.e+1", kIsReal}, {"1.0e-1", kIsReal}, {"1.0e+1", kIsReal}, {"1e+123", kIsReal}, {"1e-123", kIsReal}, {"1.e-123", kIsReal}, {"1.e+123", kIsReal}, {"1.0e123", kIsReal}, {"1.0e-123", kIsReal}, {"1.0e+123", kIsReal}, {"0x1.e8480p+19", kIsReal}, {"0x1.g8480p+19", kIsNone}, {"0xg.e8480p+19", kIsNone}, {"0b101.011p+19", kIsReal}, {"0b101.012p+19", kIsNone}, {"0b102.011p+19", kIsNone}, {"0o173.045p+19", kIsReal}, {"0o173.048p+19", kIsNone}, {"0o178.045p+19", kIsNone}, {"infinity", kIsReal}, {"inf", kIsReal}, {"nan", kIsReal}, {"-1.234", kIsReal}, {"-1.234e5", kIsReal}, {"-1.234E5", kIsReal}, {"-1.234e+5", kIsReal}, {"-1.234E+5", kIsReal}, {"-1.234e-5", kIsReal}, {"-1.234E-5", kIsReal}, {"9.5e7", kIsReal}, {"9.5E7", kIsReal}, {"9.5e+7", kIsReal}, {"9.5E+7", kIsReal}, {"9.5e-7", kIsReal}, {"9.5E-7", kIsReal}, {"-9.5e7", kIsReal}, {"-9.5E7", kIsReal}, {"-9.5e+7", kIsReal}, {"-9.5E+7", kIsReal}, {"-9.5e-7", kIsReal}, {"-9.5E-7", kIsReal}, {"+9.5e7", kIsReal}, {"+9.5E7", kIsReal}, {"+9.5e+7", kIsReal}, {"+9.5E+7", kIsReal}, {"+9.5e-7", kIsReal}, {"+9.5E-7", kIsReal}, {"9.5e17", kIsReal}, {"9.5E17", kIsReal}, {"9.5e+17", kIsReal}, {"9.5E+17", kIsReal}, {"9.5e-17", kIsReal}, {"9.5E-17", kIsReal}, {"-9.5e17", kIsReal}, {"-9.5E17", kIsReal}, {"-9.5e+17", kIsReal}, {"-9.5E+17", kIsReal}, {"-9.5e-17", kIsReal}, {"-9.5E-17", kIsReal}, {"+9.5e17", kIsReal}, {"+9.5E17", kIsReal}, {"+9.5e+17", kIsReal}, {"+9.5E+17", kIsReal}, {"+9.5e-17", kIsReal}, {"+9.5E-17", kIsReal}, {"129.532e7", kIsReal}, {"129.532E7", kIsReal}, {"129.532e+7", kIsReal}, {"129.532E+7", kIsReal}, {"129.532e-7", kIsReal}, {"129.532E-7", kIsReal}, {"-129.532e7", kIsReal}, {"-129.532E7", kIsReal}, {"-129.532e+7", kIsReal}, {"-129.532E+7", kIsReal}, {"-129.532e-7", kIsReal}, {"-129.532E-7", kIsReal}, {"+129.532e7", kIsReal}, {"+129.532E7", kIsReal}, {"+129.532e+7", kIsReal}, {"+129.532E+7", kIsReal}, {"+129.532e-7", kIsReal}, {"+129.532E-7", kIsReal}, {"129.532e17", kIsReal}, {"129.532E17", kIsReal}, {"129.532e+17", kIsReal}, {"129.532E+17", kIsReal}, {"129.532e-17", kIsReal}, {"129.532E-17", kIsReal}, {"-129.532e17", kIsReal}, {"-129.532E17", kIsReal}, {"-129.532e+17", kIsReal}, {"-129.532E+17", kIsReal}, {"-129.532e-17", kIsReal}, {"-129.532E-17", kIsReal}, {"+129.532e17", kIsReal}, {"+129.532E17", kIsReal}, {"+129.532e+17", kIsReal}, {"+129.532E+17", kIsReal}, {"+129.532e-17", kIsReal}, {"+129.532E-17", kIsReal}, }; TEST_CASE("substr.is_number") { SUBCASE("basic.hex") { CHECK_EQ(csubstr("0x.0p+0").first_real_span(), csubstr("0x.0p+0")); CHECK_EQ(csubstr("0x)sdkjhsdfkju").first_int_span(), csubstr{}); CHECK_EQ(csubstr("0x)sdkjhsdfkju").first_uint_span(), csubstr{}); CHECK_EQ(csubstr("0x)sdkjhsdfkju").first_real_span(), csubstr{}); CHECK_EQ(csubstr("0x0)sdkjhsdfkju").first_int_span(), csubstr("0x0")); CHECK_EQ(csubstr("0x0)sdkjhsdfkju").first_uint_span(), csubstr("0x0")); CHECK_EQ(csubstr("0x0)sdkjhsdfkju").first_real_span(), csubstr("0x0")); } SUBCASE("basic.dec") { CHECK_EQ(csubstr("+infinity").first_real_span(), csubstr("+infinity")); CHECK_EQ(csubstr("-infinity").first_real_span(), csubstr("-infinity")); CHECK_EQ(csubstr("+inf").first_real_span(), csubstr("+inf")); CHECK_EQ(csubstr("-inf").first_real_span(), csubstr("-inf")); CHECK_EQ(csubstr("0.e+0").first_real_span(), csubstr("0.e+0")); CHECK_EQ(csubstr("0.e-0").first_real_span(), csubstr("0.e-0")); } SUBCASE("plain") { for(number n : numbers) { n.test(); } } char buf[128]; SUBCASE("leading+") { for(number n : numbers) { INFO("orig=" << n.num); substr withplus = cat_sub(buf, '+', n.num); NumberClass cls = n.cls; if(withplus.begins_with("+-") || withplus.begins_with("++")) cls = kIsNone; number cp(withplus, cls); cp.test(); } } SUBCASE("leading-") { for(number n : numbers) { INFO("orig=" << n.num); substr withminus = cat_sub(buf, '-', n.num); NumberClass cls = n.cls; if(cls == kIsUint) cls = kIsInt; if(withminus.begins_with("--") || withminus.begins_with("-+")) cls = kIsNone; number cp(withminus, cls); cp.test(); } } SUBCASE("capital_e") { for(number n : numbers) { INFO("orig=" << n.num); substr replaced = cat_sub(buf, n.num); replaced.replace('e', 'E'); number cp(replaced, n.cls); cp.test(); } } SUBCASE("capital_p") { for(number n : numbers) { INFO("orig=" << n.num); substr replaced = cat_sub(buf, n.num); replaced.replace('p', 'P'); number cp(replaced, n.cls); cp.test(); } } SUBCASE("capital_0x") { for(number n : numbers) { INFO("orig=" << n.num); substr replaced = cat_sub(buf, n.num); replaced.replace('x', 'X'); number cp(replaced, n.cls); cp.test(); } } SUBCASE("capital_0b") { for(number n : numbers) { INFO("orig=" << n.num); substr replaced = cat_sub(buf, n.num); replaced.replace('b', 'B'); number cp(replaced, n.cls); cp.test(); } } SUBCASE("capital_0o") { for(number n : numbers) { INFO("orig=" << n.num); substr replaced = cat_sub(buf, n.num); replaced.replace('o', 'O'); number cp(replaced, n.cls); cp.test(); } } SUBCASE("numbers before") { char numbuf_[16] = {}; substr numbuf = numbuf_; for(number n : numbers) { INFO("orig=" << n.num); for(char c : {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}) { numbuf.fill(c); substr result = cat_sub(buf, numbuf, n.num); number cp(result.sub(numbuf.len), n.cls); cp.test(); } } } SUBCASE("numbers after") { char numbuf_[16] = {}; substr numbuf = numbuf_; for(number n : numbers) { INFO("orig=" << n.num); for(char c : {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}) { numbuf.fill(c); substr result = cat_sub(buf, n.num, numbuf); number cp(result.first(n.num.len), n.cls); cp.test(); } } } SUBCASE("delimiter after") { for(number n : numbers) { INFO("orig=" << n.num); for(char c : {' ', '\n', ']', ')', '}', ',', ';', '\r', '\t','\0'}) { INFO("delimiter='" << c << "'"); substr result = cat_sub(buf, n.num, c); number cp(result, n.cls); cp.test(n.num); } } } csubstr garbage = "sdkjhsdfkju"; SUBCASE("prepend") { // adding anything before the number will make it not be a number for(number n : numbers) { if(n.num.empty()) continue; INFO("orig=" << n.num); for(int i = 0; i < 127; ++i) { char c = (char)i; csubstr fmtd = cat_sub(buf, garbage, c, n.num); number cp(fmtd, kIsNone); cp.test(); } } } SUBCASE("append") { // adding after may or may not make it a number for(number const& n : numbers) { INFO("orig=" << n.num); for(int i = 0; i < 127; ++i) { number cp = n; char c = (char)i; cp.num = cat_sub(buf, n.num, c, garbage); if(!csubstr::_is_delim_char(c)) { cp.cls = kIsNone; } cp.test(n.num); } } } } TEST_CASE("substr.triml") { using S = csubstr; CHECK_EQ(S("aaabbb" ).triml('a' ), "bbb"); CHECK_EQ(S("aaabbb" ).triml('b' ), "aaabbb"); CHECK_EQ(S("aaabbb" ).triml('c' ), "aaabbb"); CHECK_EQ(S("aaabbb" ).triml("ab"), ""); CHECK_EQ(S("aaabbb" ).triml("ba"), ""); CHECK_EQ(S("aaabbb" ).triml("cd"), "aaabbb"); CHECK_EQ(S("aaa...bbb").triml('a' ), "...bbb"); CHECK_EQ(S("aaa...bbb").triml('b' ), "aaa...bbb"); CHECK_EQ(S("aaa...bbb").triml('c' ), "aaa...bbb"); CHECK_EQ(S("aaa...bbb").triml("ab"), "...bbb"); CHECK_EQ(S("aaa...bbb").triml("ba"), "...bbb"); CHECK_EQ(S("aaa...bbb").triml("ab."), ""); CHECK_EQ(S("aaa...bbb").triml("a."), "bbb"); CHECK_EQ(S("aaa...bbb").triml(".a"), "bbb"); CHECK_EQ(S("aaa...bbb").triml("b."), "aaa...bbb"); CHECK_EQ(S("aaa...bbb").triml(".b"), "aaa...bbb"); CHECK_EQ(S("aaa...bbb").triml("cd"), "aaa...bbb"); CHECK_EQ(S("ab" ).triml('a' ), "b"); CHECK_EQ(S("ab" ).triml('b' ), "ab"); CHECK_EQ(S("ab" ).triml('c' ), "ab"); CHECK_EQ(S("ab" ).triml("ab"), ""); CHECK_EQ(S("ab" ).triml("ba"), ""); CHECK_EQ(S("ab" ).triml("cd"), "ab"); CHECK_EQ(S("a...b").triml('a' ), "...b"); CHECK_EQ(S("a...b").triml('b' ), "a...b"); CHECK_EQ(S("a...b").triml('c' ), "a...b"); CHECK_EQ(S("a...b").triml("ab"), "...b"); CHECK_EQ(S("a...b").triml("ba"), "...b"); CHECK_EQ(S("a...b").triml("ab."), ""); CHECK_EQ(S("a...b").triml("a."), "b"); CHECK_EQ(S("a...b").triml(".a"), "b"); CHECK_EQ(S("a...b").triml("b."), "a...b"); CHECK_EQ(S("a...b").triml(".b"), "a...b"); CHECK_EQ(S("a...b").triml("cd"), "a...b"); } TEST_CASE("substr.trimr") { using S = csubstr; CHECK_EQ(S("aaabbb" ).trimr('a' ), "aaabbb"); CHECK_EQ(S("aaabbb" ).trimr('b' ), "aaa"); CHECK_EQ(S("aaabbb" ).trimr('c' ), "aaabbb"); CHECK_EQ(S("aaabbb" ).trimr("ab"), ""); CHECK_EQ(S("aaabbb" ).trimr("ba"), ""); CHECK_EQ(S("aaabbb" ).trimr("cd"), "aaabbb"); CHECK_EQ(S("aaa...bbb").trimr('a' ), "aaa...bbb"); CHECK_EQ(S("aaa...bbb").trimr('b' ), "aaa..."); CHECK_EQ(S("aaa...bbb").trimr('c' ), "aaa...bbb"); CHECK_EQ(S("aaa...bbb").trimr("ab"), "aaa..."); CHECK_EQ(S("aaa...bbb").trimr("ba"), "aaa..."); CHECK_EQ(S("aaa...bbb").trimr("ab."), ""); CHECK_EQ(S("aaa...bbb").trimr("a."), "aaa...bbb"); CHECK_EQ(S("aaa...bbb").trimr(".a"), "aaa...bbb"); CHECK_EQ(S("aaa...bbb").trimr("b."), "aaa"); CHECK_EQ(S("aaa...bbb").trimr(".b"), "aaa"); CHECK_EQ(S("aaa...bbb").trimr("cd"), "aaa...bbb"); CHECK_EQ(S("ab" ).trimr('a' ), "ab"); CHECK_EQ(S("ab" ).trimr('b' ), "a"); CHECK_EQ(S("ab" ).trimr('c' ), "ab"); CHECK_EQ(S("ab" ).trimr("ab"), ""); CHECK_EQ(S("ab" ).trimr("ba"), ""); CHECK_EQ(S("ab" ).trimr("cd"), "ab"); CHECK_EQ(S("a...b").trimr('a' ), "a...b"); CHECK_EQ(S("a...b").trimr('b' ), "a..."); CHECK_EQ(S("a...b").trimr('c' ), "a...b"); CHECK_EQ(S("a...b").trimr("ab"), "a..."); CHECK_EQ(S("a...b").trimr("ba"), "a..."); CHECK_EQ(S("a...b").trimr("ab."), ""); CHECK_EQ(S("a...b").trimr("a."), "a...b"); CHECK_EQ(S("a...b").trimr(".a"), "a...b"); CHECK_EQ(S("a...b").trimr("b."), "a"); CHECK_EQ(S("a...b").trimr(".b"), "a"); CHECK_EQ(S("a...b").trimr("cd"), "a...b"); } TEST_CASE("substr.trim") { using S = csubstr; CHECK_EQ(S("aaabbb" ).trim('a' ), "bbb"); CHECK_EQ(S("aaabbb" ).trim('b' ), "aaa"); CHECK_EQ(S("aaabbb" ).trim('c' ), "aaabbb"); CHECK_EQ(S("aaabbb" ).trim("ab"), ""); CHECK_EQ(S("aaabbb" ).trim("ba"), ""); CHECK_EQ(S("aaabbb" ).trim("cd"), "aaabbb"); CHECK_EQ(S("aaa...bbb").trim('a' ), "...bbb"); CHECK_EQ(S("aaa...bbb").trim('b' ), "aaa..."); CHECK_EQ(S("aaa...bbb").trim('c' ), "aaa...bbb"); CHECK_EQ(S("aaa...bbb").trim("ab"), "..."); CHECK_EQ(S("aaa...bbb").trim("ba"), "..."); CHECK_EQ(S("aaa...bbb").trim('c' ), "aaa...bbb"); CHECK_EQ(S("aaa...bbb").trim("ab."), ""); CHECK_EQ(S("aaa...bbb").trim("." ), "aaa...bbb"); CHECK_EQ(S("aaa...bbb").trim("a."), "bbb"); CHECK_EQ(S("aaa...bbb").trim(".a"), "bbb"); CHECK_EQ(S("aaa...bbb").trim("b."), "aaa"); CHECK_EQ(S("aaa...bbb").trim(".b"), "aaa"); CHECK_EQ(S("aaa...bbb").trim("cd"), "aaa...bbb"); CHECK_EQ(S("ab" ).trim('a' ), "b"); CHECK_EQ(S("ab" ).trim('b' ), "a"); CHECK_EQ(S("ab" ).trim('c' ), "ab"); CHECK_EQ(S("ab" ).trim("ab"), ""); CHECK_EQ(S("ab" ).trim("ba"), ""); CHECK_EQ(S("ab" ).trim("cd"), "ab"); CHECK_EQ(S("a...b").trim('a' ), "...b"); CHECK_EQ(S("a...b").trim('b' ), "a..."); CHECK_EQ(S("a...b").trim('c' ), "a...b"); CHECK_EQ(S("a...b").trim("ab"), "..."); CHECK_EQ(S("a...b").trim("ba"), "..."); CHECK_EQ(S("a...b").trim('c' ), "a...b"); CHECK_EQ(S("a...b").trim("ab."), ""); CHECK_EQ(S("a...b").trim("." ), "a...b"); CHECK_EQ(S("a...b").trim("a."), "b"); CHECK_EQ(S("a...b").trim(".a"), "b"); CHECK_EQ(S("a...b").trim("b."), "a"); CHECK_EQ(S("a...b").trim(".b"), "a"); CHECK_EQ(S("a...b").trim("cd"), "a...b"); } TEST_CASE("substr.pop_right") { using S = csubstr; CHECK_EQ(S("0/1/2" ).pop_right('/' ), "2"); CHECK_EQ(S("0/1/2" ).pop_right('/', true), "2"); CHECK_EQ(S("0/1/2/" ).pop_right('/' ), ""); CHECK_EQ(S("0/1/2/" ).pop_right('/', true), "2/"); CHECK_EQ(S("0/1/2///" ).pop_right('/' ), ""); CHECK_EQ(S("0/1/2///" ).pop_right('/', true), "2///"); CHECK_EQ(S("0/1//2" ).pop_right('/' ), "2"); CHECK_EQ(S("0/1//2" ).pop_right('/', true), "2"); CHECK_EQ(S("0/1//2/" ).pop_right('/' ), ""); CHECK_EQ(S("0/1//2/" ).pop_right('/', true), "2/"); CHECK_EQ(S("0/1//2///" ).pop_right('/' ), ""); CHECK_EQ(S("0/1//2///" ).pop_right('/', true), "2///"); CHECK_EQ(S("0/1///2" ).pop_right('/' ), "2"); CHECK_EQ(S("0/1///2" ).pop_right('/', true), "2"); CHECK_EQ(S("0/1///2/" ).pop_right('/' ), ""); CHECK_EQ(S("0/1///2/" ).pop_right('/', true), "2/"); CHECK_EQ(S("0/1///2///" ).pop_right('/' ), ""); CHECK_EQ(S("0/1///2///" ).pop_right('/', true), "2///"); CHECK_EQ(S("/0/1/2" ).pop_right('/' ), "2"); CHECK_EQ(S("/0/1/2" ).pop_right('/', true), "2"); CHECK_EQ(S("/0/1/2/" ).pop_right('/' ), ""); CHECK_EQ(S("/0/1/2/" ).pop_right('/', true), "2/"); CHECK_EQ(S("/0/1/2///").pop_right('/' ), ""); CHECK_EQ(S("/0/1/2///").pop_right('/', true), "2///"); CHECK_EQ(S("0" ).pop_right('/' ), "0"); CHECK_EQ(S("0" ).pop_right('/', true), "0"); CHECK_EQ(S("0/" ).pop_right('/' ), ""); CHECK_EQ(S("0/" ).pop_right('/', true), "0/"); CHECK_EQ(S("0///" ).pop_right('/' ), ""); CHECK_EQ(S("0///" ).pop_right('/', true), "0///"); CHECK_EQ(S("/0" ).pop_right('/' ), "0"); CHECK_EQ(S("/0" ).pop_right('/', true), "0"); CHECK_EQ(S("/0/" ).pop_right('/' ), ""); CHECK_EQ(S("/0/" ).pop_right('/', true), "0/"); CHECK_EQ(S("/0///" ).pop_right('/' ), ""); CHECK_EQ(S("/0///" ).pop_right('/', true), "0///"); CHECK_EQ(S("/" ).pop_right('/' ), ""); CHECK_EQ(S("/" ).pop_right('/', true), ""); CHECK_EQ(S("///" ).pop_right('/' ), ""); CHECK_EQ(S("///" ).pop_right('/', true), ""); CHECK_EQ(S("" ).pop_right('/' ), ""); CHECK_EQ(S("" ).pop_right('/', true), ""); CHECK_EQ(S("0-1-2" ).pop_right('-' ), "2"); CHECK_EQ(S("0-1-2" ).pop_right('-', true), "2"); CHECK_EQ(S("0-1-2-" ).pop_right('-' ), ""); CHECK_EQ(S("0-1-2-" ).pop_right('-', true), "2-"); CHECK_EQ(S("0-1-2---" ).pop_right('-' ), ""); CHECK_EQ(S("0-1-2---" ).pop_right('-', true), "2---"); CHECK_EQ(S("0-1--2" ).pop_right('-' ), "2"); CHECK_EQ(S("0-1--2" ).pop_right('-', true), "2"); CHECK_EQ(S("0-1--2-" ).pop_right('-' ), ""); CHECK_EQ(S("0-1--2-" ).pop_right('-', true), "2-"); CHECK_EQ(S("0-1--2---" ).pop_right('-' ), ""); CHECK_EQ(S("0-1--2---" ).pop_right('-', true), "2---"); CHECK_EQ(S("0-1---2" ).pop_right('-' ), "2"); CHECK_EQ(S("0-1---2" ).pop_right('-', true), "2"); CHECK_EQ(S("0-1---2-" ).pop_right('-' ), ""); CHECK_EQ(S("0-1---2-" ).pop_right('-', true), "2-"); CHECK_EQ(S("0-1---2---" ).pop_right('-' ), ""); CHECK_EQ(S("0-1---2---" ).pop_right('-', true), "2---"); CHECK_EQ(S("-0-1-2" ).pop_right('-' ), "2"); CHECK_EQ(S("-0-1-2" ).pop_right('-', true), "2"); CHECK_EQ(S("-0-1-2-" ).pop_right('-' ), ""); CHECK_EQ(S("-0-1-2-" ).pop_right('-', true), "2-"); CHECK_EQ(S("-0-1-2---").pop_right('-' ), ""); CHECK_EQ(S("-0-1-2---").pop_right('-', true), "2---"); CHECK_EQ(S("0" ).pop_right('-' ), "0"); CHECK_EQ(S("0" ).pop_right('-', true), "0"); CHECK_EQ(S("0-" ).pop_right('-' ), ""); CHECK_EQ(S("0-" ).pop_right('-', true), "0-"); CHECK_EQ(S("0---" ).pop_right('-' ), ""); CHECK_EQ(S("0---" ).pop_right('-', true), "0---"); CHECK_EQ(S("-0" ).pop_right('-' ), "0"); CHECK_EQ(S("-0" ).pop_right('-', true), "0"); CHECK_EQ(S("-0-" ).pop_right('-' ), ""); CHECK_EQ(S("-0-" ).pop_right('-', true), "0-"); CHECK_EQ(S("-0---" ).pop_right('-' ), ""); CHECK_EQ(S("-0---" ).pop_right('-', true), "0---"); CHECK_EQ(S("-" ).pop_right('-' ), ""); CHECK_EQ(S("-" ).pop_right('-', true), ""); CHECK_EQ(S("---" ).pop_right('-' ), ""); CHECK_EQ(S("---" ).pop_right('-', true), ""); CHECK_EQ(S("" ).pop_right('-' ), ""); CHECK_EQ(S("" ).pop_right('-', true), ""); } TEST_CASE("substr.pop_left") { using S = csubstr; CHECK_EQ(S("0/1/2" ).pop_left('/' ), "0"); CHECK_EQ(S("0/1/2" ).pop_left('/', true), "0"); CHECK_EQ(S("0/1/2/" ).pop_left('/' ), "0"); CHECK_EQ(S("0/1/2/" ).pop_left('/', true), "0"); CHECK_EQ(S("0/1/2///" ).pop_left('/' ), "0"); CHECK_EQ(S("0/1/2///" ).pop_left('/', true), "0"); CHECK_EQ(S("0//1/2" ).pop_left('/' ), "0"); CHECK_EQ(S("0//1/2" ).pop_left('/', true), "0"); CHECK_EQ(S("0//1/2/" ).pop_left('/' ), "0"); CHECK_EQ(S("0//1/2/" ).pop_left('/', true), "0"); CHECK_EQ(S("0//1/2///" ).pop_left('/' ), "0"); CHECK_EQ(S("0//1/2///" ).pop_left('/', true), "0"); CHECK_EQ(S("0///1/2" ).pop_left('/' ), "0"); CHECK_EQ(S("0///1/2" ).pop_left('/', true), "0"); CHECK_EQ(S("0///1/2/" ).pop_left('/' ), "0"); CHECK_EQ(S("0///1/2/" ).pop_left('/', true), "0"); CHECK_EQ(S("0///1/2///" ).pop_left('/' ), "0"); CHECK_EQ(S("0///1/2///" ).pop_left('/', true), "0"); CHECK_EQ(S("/0/1/2" ).pop_left('/' ), ""); CHECK_EQ(S("/0/1/2" ).pop_left('/', true), "/0"); CHECK_EQ(S("/0/1/2/" ).pop_left('/' ), ""); CHECK_EQ(S("/0/1/2/" ).pop_left('/', true), "/0"); CHECK_EQ(S("/0/1/2///").pop_left('/' ), ""); CHECK_EQ(S("/0/1/2///").pop_left('/', true), "/0"); CHECK_EQ(S("///0/1/2" ).pop_left('/' ), ""); CHECK_EQ(S("///0/1/2" ).pop_left('/', true), "///0"); CHECK_EQ(S("///0/1/2/").pop_left('/' ), ""); CHECK_EQ(S("///0/1/2/").pop_left('/', true), "///0"); CHECK_EQ(S("///0/1/2/").pop_left('/' ), ""); CHECK_EQ(S("///0/1/2/").pop_left('/', true), "///0"); CHECK_EQ(S("0" ).pop_left('/' ), "0"); CHECK_EQ(S("0" ).pop_left('/', true), "0"); CHECK_EQ(S("0/" ).pop_left('/' ), "0"); CHECK_EQ(S("0/" ).pop_left('/', true), "0"); CHECK_EQ(S("0///" ).pop_left('/' ), "0"); CHECK_EQ(S("0///" ).pop_left('/', true), "0"); CHECK_EQ(S("/0" ).pop_left('/' ), ""); CHECK_EQ(S("/0" ).pop_left('/', true), "/0"); CHECK_EQ(S("/0/" ).pop_left('/' ), ""); CHECK_EQ(S("/0/" ).pop_left('/', true), "/0"); CHECK_EQ(S("/0///" ).pop_left('/' ), ""); CHECK_EQ(S("/0///" ).pop_left('/', true), "/0"); CHECK_EQ(S("///0///" ).pop_left('/' ), ""); CHECK_EQ(S("///0///" ).pop_left('/', true), "///0"); CHECK_EQ(S("/" ).pop_left('/' ), ""); CHECK_EQ(S("/" ).pop_left('/', true), ""); CHECK_EQ(S("///" ).pop_left('/' ), ""); CHECK_EQ(S("///" ).pop_left('/', true), ""); CHECK_EQ(S("" ).pop_left('/' ), ""); CHECK_EQ(S("" ).pop_left('/', true), ""); CHECK_EQ(S("0-1-2" ).pop_left('-' ), "0"); CHECK_EQ(S("0-1-2" ).pop_left('-', true), "0"); CHECK_EQ(S("0-1-2-" ).pop_left('-' ), "0"); CHECK_EQ(S("0-1-2-" ).pop_left('-', true), "0"); CHECK_EQ(S("0-1-2---" ).pop_left('-' ), "0"); CHECK_EQ(S("0-1-2---" ).pop_left('-', true), "0"); CHECK_EQ(S("0--1-2" ).pop_left('-' ), "0"); CHECK_EQ(S("0--1-2" ).pop_left('-', true), "0"); CHECK_EQ(S("0--1-2-" ).pop_left('-' ), "0"); CHECK_EQ(S("0--1-2-" ).pop_left('-', true), "0"); CHECK_EQ(S("0--1-2---" ).pop_left('-' ), "0"); CHECK_EQ(S("0--1-2---" ).pop_left('-', true), "0"); CHECK_EQ(S("0---1-2" ).pop_left('-' ), "0"); CHECK_EQ(S("0---1-2" ).pop_left('-', true), "0"); CHECK_EQ(S("0---1-2-" ).pop_left('-' ), "0"); CHECK_EQ(S("0---1-2-" ).pop_left('-', true), "0"); CHECK_EQ(S("0---1-2---" ).pop_left('-' ), "0"); CHECK_EQ(S("0---1-2---" ).pop_left('-', true), "0"); CHECK_EQ(S("-0-1-2" ).pop_left('-' ), ""); CHECK_EQ(S("-0-1-2" ).pop_left('-', true), "-0"); CHECK_EQ(S("-0-1-2-" ).pop_left('-' ), ""); CHECK_EQ(S("-0-1-2-" ).pop_left('-', true), "-0"); CHECK_EQ(S("-0-1-2---").pop_left('-' ), ""); CHECK_EQ(S("-0-1-2---").pop_left('-', true), "-0"); CHECK_EQ(S("---0-1-2" ).pop_left('-' ), ""); CHECK_EQ(S("---0-1-2" ).pop_left('-', true), "---0"); CHECK_EQ(S("---0-1-2-").pop_left('-' ), ""); CHECK_EQ(S("---0-1-2-").pop_left('-', true), "---0"); CHECK_EQ(S("---0-1-2-").pop_left('-' ), ""); CHECK_EQ(S("---0-1-2-").pop_left('-', true), "---0"); CHECK_EQ(S("0" ).pop_left('-' ), "0"); CHECK_EQ(S("0" ).pop_left('-', true), "0"); CHECK_EQ(S("0-" ).pop_left('-' ), "0"); CHECK_EQ(S("0-" ).pop_left('-', true), "0"); CHECK_EQ(S("0---" ).pop_left('-' ), "0"); CHECK_EQ(S("0---" ).pop_left('-', true), "0"); CHECK_EQ(S("-0" ).pop_left('-' ), ""); CHECK_EQ(S("-0" ).pop_left('-', true), "-0"); CHECK_EQ(S("-0-" ).pop_left('-' ), ""); CHECK_EQ(S("-0-" ).pop_left('-', true), "-0"); CHECK_EQ(S("-0---" ).pop_left('-' ), ""); CHECK_EQ(S("-0---" ).pop_left('-', true), "-0"); CHECK_EQ(S("---0---" ).pop_left('-' ), ""); CHECK_EQ(S("---0---" ).pop_left('-', true), "---0"); CHECK_EQ(S("-" ).pop_left('-' ), ""); CHECK_EQ(S("-" ).pop_left('-', true), ""); CHECK_EQ(S("---" ).pop_left('-' ), ""); CHECK_EQ(S("---" ).pop_left('-', true), ""); CHECK_EQ(S("" ).pop_left('-' ), ""); CHECK_EQ(S("" ).pop_left('-', true), ""); } TEST_CASE("substr.gpop_left") { using S = csubstr; CHECK_EQ(S("0/1/2" ).gpop_left('/' ), "0/1"); CHECK_EQ(S("0/1/2" ).gpop_left('/', true), "0/1"); CHECK_EQ(S("0/1/2/" ).gpop_left('/' ), "0/1/2"); CHECK_EQ(S("0/1/2/" ).gpop_left('/', true), "0/1"); CHECK_EQ(S("0/1/2//" ).gpop_left('/' ), "0/1/2/"); CHECK_EQ(S("0/1/2//" ).gpop_left('/', true), "0/1"); CHECK_EQ(S("0/1/2///" ).gpop_left('/' ), "0/1/2//"); CHECK_EQ(S("0/1/2///" ).gpop_left('/', true), "0/1"); CHECK_EQ(S("0/1//2" ).gpop_left('/' ), "0/1/"); CHECK_EQ(S("0/1//2" ).gpop_left('/', true), "0/1"); CHECK_EQ(S("0/1//2/" ).gpop_left('/' ), "0/1//2"); CHECK_EQ(S("0/1//2/" ).gpop_left('/', true), "0/1"); CHECK_EQ(S("0/1//2//" ).gpop_left('/' ), "0/1//2/"); CHECK_EQ(S("0/1//2//" ).gpop_left('/', true), "0/1"); CHECK_EQ(S("0/1//2///" ).gpop_left('/' ), "0/1//2//"); CHECK_EQ(S("0/1//2///" ).gpop_left('/', true), "0/1"); CHECK_EQ(S("0/1///2" ).gpop_left('/' ), "0/1//"); CHECK_EQ(S("0/1///2" ).gpop_left('/', true), "0/1"); CHECK_EQ(S("0/1///2/" ).gpop_left('/' ), "0/1///2"); CHECK_EQ(S("0/1///2/" ).gpop_left('/', true), "0/1"); CHECK_EQ(S("0/1///2//" ).gpop_left('/' ), "0/1///2/"); CHECK_EQ(S("0/1///2//" ).gpop_left('/', true), "0/1"); CHECK_EQ(S("0/1///2///" ).gpop_left('/' ), "0/1///2//"); CHECK_EQ(S("0/1///2///" ).gpop_left('/', true), "0/1"); CHECK_EQ(S("/0/1/2" ).gpop_left('/' ), "/0/1"); CHECK_EQ(S("/0/1/2" ).gpop_left('/', true), "/0/1"); CHECK_EQ(S("/0/1/2/" ).gpop_left('/' ), "/0/1/2"); CHECK_EQ(S("/0/1/2/" ).gpop_left('/', true), "/0/1"); CHECK_EQ(S("/0/1/2//" ).gpop_left('/' ), "/0/1/2/"); CHECK_EQ(S("/0/1/2//" ).gpop_left('/', true), "/0/1"); CHECK_EQ(S("/0/1/2///" ).gpop_left('/' ), "/0/1/2//"); CHECK_EQ(S("/0/1/2///" ).gpop_left('/', true), "/0/1"); CHECK_EQ(S("//0/1/2" ).gpop_left('/' ), "//0/1"); CHECK_EQ(S("//0/1/2" ).gpop_left('/', true), "//0/1"); CHECK_EQ(S("//0/1/2/" ).gpop_left('/' ), "//0/1/2"); CHECK_EQ(S("//0/1/2/" ).gpop_left('/', true), "//0/1"); CHECK_EQ(S("//0/1/2//" ).gpop_left('/' ), "//0/1/2/"); CHECK_EQ(S("//0/1/2//" ).gpop_left('/', true), "//0/1"); CHECK_EQ(S("//0/1/2///" ).gpop_left('/' ), "//0/1/2//"); CHECK_EQ(S("//0/1/2///" ).gpop_left('/', true), "//0/1"); CHECK_EQ(S("///0/1/2" ).gpop_left('/' ), "///0/1"); CHECK_EQ(S("///0/1/2" ).gpop_left('/', true), "///0/1"); CHECK_EQ(S("///0/1/2/" ).gpop_left('/' ), "///0/1/2"); CHECK_EQ(S("///0/1/2/" ).gpop_left('/', true), "///0/1"); CHECK_EQ(S("///0/1/2//" ).gpop_left('/' ), "///0/1/2/"); CHECK_EQ(S("///0/1/2//" ).gpop_left('/', true), "///0/1"); CHECK_EQ(S("///0/1/2///").gpop_left('/' ), "///0/1/2//"); CHECK_EQ(S("///0/1/2///").gpop_left('/', true), "///0/1"); CHECK_EQ(S("0/1" ).gpop_left('/' ), "0"); CHECK_EQ(S("0/1" ).gpop_left('/', true), "0"); CHECK_EQ(S("0/1/" ).gpop_left('/' ), "0/1"); CHECK_EQ(S("0/1/" ).gpop_left('/', true), "0"); CHECK_EQ(S("0/1//" ).gpop_left('/' ), "0/1/"); CHECK_EQ(S("0/1//" ).gpop_left('/', true), "0"); CHECK_EQ(S("0/1///" ).gpop_left('/' ), "0/1//"); CHECK_EQ(S("0/1///" ).gpop_left('/', true), "0"); CHECK_EQ(S("0//1" ).gpop_left('/' ), "0/"); CHECK_EQ(S("0//1" ).gpop_left('/', true), "0"); CHECK_EQ(S("0//1/" ).gpop_left('/' ), "0//1"); CHECK_EQ(S("0//1/" ).gpop_left('/', true), "0"); CHECK_EQ(S("0//1//" ).gpop_left('/' ), "0//1/"); CHECK_EQ(S("0//1//" ).gpop_left('/', true), "0"); CHECK_EQ(S("0//1///" ).gpop_left('/' ), "0//1//"); CHECK_EQ(S("0//1///" ).gpop_left('/', true), "0"); CHECK_EQ(S("0///1" ).gpop_left('/' ), "0//"); CHECK_EQ(S("0///1" ).gpop_left('/', true), "0"); CHECK_EQ(S("0///1/" ).gpop_left('/' ), "0///1"); CHECK_EQ(S("0///1/" ).gpop_left('/', true), "0"); CHECK_EQ(S("0///1//" ).gpop_left('/' ), "0///1/"); CHECK_EQ(S("0///1//" ).gpop_left('/', true), "0"); CHECK_EQ(S("0///1///" ).gpop_left('/' ), "0///1//"); CHECK_EQ(S("0///1///" ).gpop_left('/', true), "0"); CHECK_EQ(S("/0/1" ).gpop_left('/' ), "/0"); CHECK_EQ(S("/0/1" ).gpop_left('/', true), "/0"); CHECK_EQ(S("/0/1/" ).gpop_left('/' ), "/0/1"); CHECK_EQ(S("/0/1/" ).gpop_left('/', true), "/0"); CHECK_EQ(S("/0/1//" ).gpop_left('/' ), "/0/1/"); CHECK_EQ(S("/0/1//" ).gpop_left('/', true), "/0"); CHECK_EQ(S("/0/1///" ).gpop_left('/' ), "/0/1//"); CHECK_EQ(S("/0/1///" ).gpop_left('/', true), "/0"); CHECK_EQ(S("/0//1" ).gpop_left('/' ), "/0/"); CHECK_EQ(S("/0//1" ).gpop_left('/', true), "/0"); CHECK_EQ(S("/0//1/" ).gpop_left('/' ), "/0//1"); CHECK_EQ(S("/0//1/" ).gpop_left('/', true), "/0"); CHECK_EQ(S("/0//1//" ).gpop_left('/' ), "/0//1/"); CHECK_EQ(S("/0//1//" ).gpop_left('/', true), "/0"); CHECK_EQ(S("/0//1///" ).gpop_left('/' ), "/0//1//"); CHECK_EQ(S("/0//1///" ).gpop_left('/', true), "/0"); CHECK_EQ(S("/0///1" ).gpop_left('/' ), "/0//"); CHECK_EQ(S("/0///1" ).gpop_left('/', true), "/0"); CHECK_EQ(S("/0///1/" ).gpop_left('/' ), "/0///1"); CHECK_EQ(S("/0///1/" ).gpop_left('/', true), "/0"); CHECK_EQ(S("/0///1//" ).gpop_left('/' ), "/0///1/"); CHECK_EQ(S("/0///1//" ).gpop_left('/', true), "/0"); CHECK_EQ(S("/0///1///" ).gpop_left('/' ), "/0///1//"); CHECK_EQ(S("/0///1///" ).gpop_left('/', true), "/0"); CHECK_EQ(S("//0/1" ).gpop_left('/' ), "//0"); CHECK_EQ(S("//0/1" ).gpop_left('/', true), "//0"); CHECK_EQ(S("//0/1/" ).gpop_left('/' ), "//0/1"); CHECK_EQ(S("//0/1/" ).gpop_left('/', true), "//0"); CHECK_EQ(S("//0/1//" ).gpop_left('/' ), "//0/1/"); CHECK_EQ(S("//0/1//" ).gpop_left('/', true), "//0"); CHECK_EQ(S("//0/1///" ).gpop_left('/' ), "//0/1//"); CHECK_EQ(S("//0/1///" ).gpop_left('/', true), "//0"); CHECK_EQ(S("//0//1" ).gpop_left('/' ), "//0/"); CHECK_EQ(S("//0//1" ).gpop_left('/', true), "//0"); CHECK_EQ(S("//0//1/" ).gpop_left('/' ), "//0//1"); CHECK_EQ(S("//0//1/" ).gpop_left('/', true), "//0"); CHECK_EQ(S("//0//1//" ).gpop_left('/' ), "//0//1/"); CHECK_EQ(S("//0//1//" ).gpop_left('/', true), "//0"); CHECK_EQ(S("//0//1///" ).gpop_left('/' ), "//0//1//"); CHECK_EQ(S("//0//1///" ).gpop_left('/', true), "//0"); CHECK_EQ(S("//0///1" ).gpop_left('/' ), "//0//"); CHECK_EQ(S("//0///1" ).gpop_left('/', true), "//0"); CHECK_EQ(S("//0///1/" ).gpop_left('/' ), "//0///1"); CHECK_EQ(S("//0///1/" ).gpop_left('/', true), "//0"); CHECK_EQ(S("//0///1//" ).gpop_left('/' ), "//0///1/"); CHECK_EQ(S("//0///1//" ).gpop_left('/', true), "//0"); CHECK_EQ(S("//0///1///" ).gpop_left('/' ), "//0///1//"); CHECK_EQ(S("//0///1///" ).gpop_left('/', true), "//0"); CHECK_EQ(S("0" ).gpop_left('/' ), ""); CHECK_EQ(S("0" ).gpop_left('/', true), ""); CHECK_EQ(S("0/" ).gpop_left('/' ), "0"); CHECK_EQ(S("0/" ).gpop_left('/', true), ""); CHECK_EQ(S("0//" ).gpop_left('/' ), "0/"); CHECK_EQ(S("0//" ).gpop_left('/', true), ""); CHECK_EQ(S("0///" ).gpop_left('/' ), "0//"); CHECK_EQ(S("0///" ).gpop_left('/', true), ""); CHECK_EQ(S("/0" ).gpop_left('/' ), ""); CHECK_EQ(S("/0" ).gpop_left('/', true), ""); CHECK_EQ(S("/0/" ).gpop_left('/' ), "/0"); CHECK_EQ(S("/0/" ).gpop_left('/', true), ""); CHECK_EQ(S("/0//" ).gpop_left('/' ), "/0/"); CHECK_EQ(S("/0//" ).gpop_left('/', true), ""); CHECK_EQ(S("/0///" ).gpop_left('/' ), "/0//"); CHECK_EQ(S("/0///" ).gpop_left('/', true), ""); CHECK_EQ(S("//0" ).gpop_left('/' ), "/"); CHECK_EQ(S("//0" ).gpop_left('/', true), ""); CHECK_EQ(S("//0/" ).gpop_left('/' ), "//0"); CHECK_EQ(S("//0/" ).gpop_left('/', true), ""); CHECK_EQ(S("//0//" ).gpop_left('/' ), "//0/"); CHECK_EQ(S("//0//" ).gpop_left('/', true), ""); CHECK_EQ(S("//0///" ).gpop_left('/' ), "//0//"); CHECK_EQ(S("//0///" ).gpop_left('/', true), ""); CHECK_EQ(S("///0" ).gpop_left('/' ), "//"); CHECK_EQ(S("///0" ).gpop_left('/', true), ""); CHECK_EQ(S("///0/" ).gpop_left('/' ), "///0"); CHECK_EQ(S("///0/" ).gpop_left('/', true), ""); CHECK_EQ(S("///0//" ).gpop_left('/' ), "///0/"); CHECK_EQ(S("///0//" ).gpop_left('/', true), ""); CHECK_EQ(S("///0///" ).gpop_left('/' ), "///0//"); CHECK_EQ(S("///0///" ).gpop_left('/', true), ""); CHECK_EQ(S("/" ).gpop_left('/' ), ""); CHECK_EQ(S("/" ).gpop_left('/', true), ""); CHECK_EQ(S("//" ).gpop_left('/' ), "/"); CHECK_EQ(S("//" ).gpop_left('/', true), ""); CHECK_EQ(S("///" ).gpop_left('/' ), "//"); CHECK_EQ(S("///" ).gpop_left('/', true), ""); CHECK_EQ(S("" ).gpop_left('/' ), ""); CHECK_EQ(S("" ).gpop_left('/', true), ""); } TEST_CASE("substr.gpop_right") { using S = csubstr; CHECK_EQ(S("0/1/2" ).gpop_right('/' ), "1/2"); CHECK_EQ(S("0/1/2" ).gpop_right('/', true), "1/2"); CHECK_EQ(S("0/1/2/" ).gpop_right('/' ), "1/2/"); CHECK_EQ(S("0/1/2/" ).gpop_right('/', true), "1/2/"); CHECK_EQ(S("0/1/2//" ).gpop_right('/' ), "1/2//"); CHECK_EQ(S("0/1/2//" ).gpop_right('/', true), "1/2//"); CHECK_EQ(S("0/1/2///" ).gpop_right('/' ), "1/2///"); CHECK_EQ(S("0/1/2///" ).gpop_right('/', true), "1/2///"); CHECK_EQ(S("0//1/2" ).gpop_right('/' ), "/1/2"); CHECK_EQ(S("0//1/2" ).gpop_right('/', true), "1/2"); CHECK_EQ(S("0//1/2/" ).gpop_right('/' ), "/1/2/"); CHECK_EQ(S("0//1/2/" ).gpop_right('/', true), "1/2/"); CHECK_EQ(S("0//1/2//" ).gpop_right('/' ), "/1/2//"); CHECK_EQ(S("0//1/2//" ).gpop_right('/', true), "1/2//"); CHECK_EQ(S("0//1/2///" ).gpop_right('/' ), "/1/2///"); CHECK_EQ(S("0//1/2///" ).gpop_right('/', true), "1/2///"); CHECK_EQ(S("0///1/2" ).gpop_right('/' ), "//1/2"); CHECK_EQ(S("0///1/2" ).gpop_right('/', true), "1/2"); CHECK_EQ(S("0///1/2/" ).gpop_right('/' ), "//1/2/"); CHECK_EQ(S("0///1/2/" ).gpop_right('/', true), "1/2/"); CHECK_EQ(S("0///1/2//" ).gpop_right('/' ), "//1/2//"); CHECK_EQ(S("0///1/2//" ).gpop_right('/', true), "1/2//"); CHECK_EQ(S("0///1/2///" ).gpop_right('/' ), "//1/2///"); CHECK_EQ(S("0///1/2///" ).gpop_right('/', true), "1/2///"); CHECK_EQ(S("/0/1/2" ).gpop_right('/' ), "0/1/2"); CHECK_EQ(S("/0/1/2" ).gpop_right('/', true), "1/2"); CHECK_EQ(S("/0/1/2/" ).gpop_right('/' ), "0/1/2/"); CHECK_EQ(S("/0/1/2/" ).gpop_right('/', true), "1/2/"); CHECK_EQ(S("/0/1/2//" ).gpop_right('/' ), "0/1/2//"); CHECK_EQ(S("/0/1/2//" ).gpop_right('/', true), "1/2//"); CHECK_EQ(S("/0/1/2///" ).gpop_right('/' ), "0/1/2///"); CHECK_EQ(S("/0/1/2///" ).gpop_right('/', true), "1/2///"); CHECK_EQ(S("/0//1/2" ).gpop_right('/' ), "0//1/2"); CHECK_EQ(S("/0//1/2" ).gpop_right('/', true), "1/2"); CHECK_EQ(S("/0//1/2/" ).gpop_right('/' ), "0//1/2/"); CHECK_EQ(S("/0//1/2/" ).gpop_right('/', true), "1/2/"); CHECK_EQ(S("/0//1/2//" ).gpop_right('/' ), "0//1/2//"); CHECK_EQ(S("/0//1/2//" ).gpop_right('/', true), "1/2//"); CHECK_EQ(S("/0//1/2///" ).gpop_right('/' ), "0//1/2///"); CHECK_EQ(S("/0//1/2///" ).gpop_right('/', true), "1/2///"); CHECK_EQ(S("/0///1/2" ).gpop_right('/' ), "0///1/2"); CHECK_EQ(S("/0///1/2" ).gpop_right('/', true), "1/2"); CHECK_EQ(S("/0///1/2/" ).gpop_right('/' ), "0///1/2/"); CHECK_EQ(S("/0///1/2/" ).gpop_right('/', true), "1/2/"); CHECK_EQ(S("/0///1/2//" ).gpop_right('/' ), "0///1/2//"); CHECK_EQ(S("/0///1/2//" ).gpop_right('/', true), "1/2//"); CHECK_EQ(S("/0///1/2///" ).gpop_right('/' ), "0///1/2///"); CHECK_EQ(S("/0///1/2///" ).gpop_right('/', true), "1/2///"); CHECK_EQ(S("//0/1/2" ).gpop_right('/' ), "/0/1/2"); CHECK_EQ(S("//0/1/2" ).gpop_right('/', true), "1/2"); CHECK_EQ(S("//0/1/2/" ).gpop_right('/' ), "/0/1/2/"); CHECK_EQ(S("//0/1/2/" ).gpop_right('/', true), "1/2/"); CHECK_EQ(S("//0/1/2//" ).gpop_right('/' ), "/0/1/2//"); CHECK_EQ(S("//0/1/2//" ).gpop_right('/', true), "1/2//"); CHECK_EQ(S("//0/1/2///" ).gpop_right('/' ), "/0/1/2///"); CHECK_EQ(S("//0/1/2///" ).gpop_right('/', true), "1/2///"); CHECK_EQ(S("//0//1/2" ).gpop_right('/' ), "/0//1/2"); CHECK_EQ(S("//0//1/2" ).gpop_right('/', true), "1/2"); CHECK_EQ(S("//0//1/2/" ).gpop_right('/' ), "/0//1/2/"); CHECK_EQ(S("//0//1/2/" ).gpop_right('/', true), "1/2/"); CHECK_EQ(S("//0//1/2//" ).gpop_right('/' ), "/0//1/2//"); CHECK_EQ(S("//0//1/2//" ).gpop_right('/', true), "1/2//"); CHECK_EQ(S("//0//1/2///" ).gpop_right('/' ), "/0//1/2///"); CHECK_EQ(S("//0//1/2///" ).gpop_right('/', true), "1/2///"); CHECK_EQ(S("//0///1/2" ).gpop_right('/' ), "/0///1/2"); CHECK_EQ(S("//0///1/2" ).gpop_right('/', true), "1/2"); CHECK_EQ(S("//0///1/2/" ).gpop_right('/' ), "/0///1/2/"); CHECK_EQ(S("//0///1/2/" ).gpop_right('/', true), "1/2/"); CHECK_EQ(S("//0///1/2//" ).gpop_right('/' ), "/0///1/2//"); CHECK_EQ(S("//0///1/2//" ).gpop_right('/', true), "1/2//"); CHECK_EQ(S("//0///1/2///" ).gpop_right('/' ), "/0///1/2///"); CHECK_EQ(S("//0///1/2///" ).gpop_right('/', true), "1/2///"); CHECK_EQ(S("0/1" ).gpop_right('/' ), "1"); CHECK_EQ(S("0/1" ).gpop_right('/', true), "1"); CHECK_EQ(S("0/1/" ).gpop_right('/' ), "1/"); CHECK_EQ(S("0/1/" ).gpop_right('/', true), "1/"); CHECK_EQ(S("0/1//" ).gpop_right('/' ), "1//"); CHECK_EQ(S("0/1//" ).gpop_right('/', true), "1//"); CHECK_EQ(S("0/1///" ).gpop_right('/' ), "1///"); CHECK_EQ(S("0/1///" ).gpop_right('/', true), "1///"); CHECK_EQ(S("0//1" ).gpop_right('/' ), "/1"); CHECK_EQ(S("0//1" ).gpop_right('/', true), "1"); CHECK_EQ(S("0//1/" ).gpop_right('/' ), "/1/"); CHECK_EQ(S("0//1/" ).gpop_right('/', true), "1/"); CHECK_EQ(S("0//1//" ).gpop_right('/' ), "/1//"); CHECK_EQ(S("0//1//" ).gpop_right('/', true), "1//"); CHECK_EQ(S("0//1///" ).gpop_right('/' ), "/1///"); CHECK_EQ(S("0//1///" ).gpop_right('/', true), "1///"); CHECK_EQ(S("0///1" ).gpop_right('/' ), "//1"); CHECK_EQ(S("0///1" ).gpop_right('/', true), "1"); CHECK_EQ(S("0///1/" ).gpop_right('/' ), "//1/"); CHECK_EQ(S("0///1/" ).gpop_right('/', true), "1/"); CHECK_EQ(S("0///1//" ).gpop_right('/' ), "//1//"); CHECK_EQ(S("0///1//" ).gpop_right('/', true), "1//"); CHECK_EQ(S("0///1///" ).gpop_right('/' ), "//1///"); CHECK_EQ(S("0///1///" ).gpop_right('/', true), "1///"); CHECK_EQ(S("/0/1" ).gpop_right('/' ), "0/1"); CHECK_EQ(S("/0/1" ).gpop_right('/', true), "1"); CHECK_EQ(S("/0/1/" ).gpop_right('/' ), "0/1/"); CHECK_EQ(S("/0/1/" ).gpop_right('/', true), "1/"); CHECK_EQ(S("/0/1//" ).gpop_right('/' ), "0/1//"); CHECK_EQ(S("/0/1//" ).gpop_right('/', true), "1//"); CHECK_EQ(S("/0/1///" ).gpop_right('/' ), "0/1///"); CHECK_EQ(S("/0/1///" ).gpop_right('/', true), "1///"); CHECK_EQ(S("/0//1" ).gpop_right('/' ), "0//1"); CHECK_EQ(S("/0//1" ).gpop_right('/', true), "1"); CHECK_EQ(S("/0//1/" ).gpop_right('/' ), "0//1/"); CHECK_EQ(S("/0//1/" ).gpop_right('/', true), "1/"); CHECK_EQ(S("/0//1//" ).gpop_right('/' ), "0//1//"); CHECK_EQ(S("/0//1//" ).gpop_right('/', true), "1//"); CHECK_EQ(S("/0//1///" ).gpop_right('/' ), "0//1///"); CHECK_EQ(S("/0//1///" ).gpop_right('/', true), "1///"); CHECK_EQ(S("/0///1" ).gpop_right('/' ), "0///1"); CHECK_EQ(S("/0///1" ).gpop_right('/', true), "1"); CHECK_EQ(S("/0///1/" ).gpop_right('/' ), "0///1/"); CHECK_EQ(S("/0///1/" ).gpop_right('/', true), "1/"); CHECK_EQ(S("/0///1//" ).gpop_right('/' ), "0///1//"); CHECK_EQ(S("/0///1//" ).gpop_right('/', true), "1//"); CHECK_EQ(S("/0///1///" ).gpop_right('/' ), "0///1///"); CHECK_EQ(S("/0///1///" ).gpop_right('/', true), "1///"); CHECK_EQ(S("//0/1" ).gpop_right('/' ), "/0/1"); CHECK_EQ(S("//0/1" ).gpop_right('/', true), "1"); CHECK_EQ(S("//0/1/" ).gpop_right('/' ), "/0/1/"); CHECK_EQ(S("//0/1/" ).gpop_right('/', true), "1/"); CHECK_EQ(S("//0/1//" ).gpop_right('/' ), "/0/1//"); CHECK_EQ(S("//0/1//" ).gpop_right('/', true), "1//"); CHECK_EQ(S("//0/1///" ).gpop_right('/' ), "/0/1///"); CHECK_EQ(S("//0/1///" ).gpop_right('/', true), "1///"); CHECK_EQ(S("//0//1" ).gpop_right('/' ), "/0//1"); CHECK_EQ(S("//0//1" ).gpop_right('/', true), "1"); CHECK_EQ(S("//0//1/" ).gpop_right('/' ), "/0//1/"); CHECK_EQ(S("//0//1/" ).gpop_right('/', true), "1/"); CHECK_EQ(S("//0//1//" ).gpop_right('/' ), "/0//1//"); CHECK_EQ(S("//0//1//" ).gpop_right('/', true), "1//"); CHECK_EQ(S("//0//1///" ).gpop_right('/' ), "/0//1///"); CHECK_EQ(S("//0//1///" ).gpop_right('/', true), "1///"); CHECK_EQ(S("//0///1" ).gpop_right('/' ), "/0///1"); CHECK_EQ(S("//0///1" ).gpop_right('/', true), "1"); CHECK_EQ(S("//0///1/" ).gpop_right('/' ), "/0///1/"); CHECK_EQ(S("//0///1/" ).gpop_right('/', true), "1/"); CHECK_EQ(S("//0///1//" ).gpop_right('/' ), "/0///1//"); CHECK_EQ(S("//0///1//" ).gpop_right('/', true), "1//"); CHECK_EQ(S("//0///1///" ).gpop_right('/' ), "/0///1///"); CHECK_EQ(S("//0///1///" ).gpop_right('/', true), "1///"); CHECK_EQ(S("0" ).gpop_right('/' ), ""); CHECK_EQ(S("0" ).gpop_right('/', true), ""); CHECK_EQ(S("0/" ).gpop_right('/' ), ""); CHECK_EQ(S("0/" ).gpop_right('/', true), ""); CHECK_EQ(S("0//" ).gpop_right('/' ), "/"); CHECK_EQ(S("0//" ).gpop_right('/', true), ""); CHECK_EQ(S("0///" ).gpop_right('/' ), "//"); CHECK_EQ(S("0///" ).gpop_right('/', true), ""); CHECK_EQ(S("/0" ).gpop_right('/' ), "0"); CHECK_EQ(S("/0" ).gpop_right('/', true), ""); CHECK_EQ(S("/0/" ).gpop_right('/' ), "0/"); CHECK_EQ(S("/0/" ).gpop_right('/', true), ""); CHECK_EQ(S("/0//" ).gpop_right('/' ), "0//"); CHECK_EQ(S("/0//" ).gpop_right('/', true), ""); CHECK_EQ(S("/0///" ).gpop_right('/' ), "0///"); CHECK_EQ(S("/0///" ).gpop_right('/', true), ""); CHECK_EQ(S("//0" ).gpop_right('/' ), "/0"); CHECK_EQ(S("//0" ).gpop_right('/', true), ""); CHECK_EQ(S("//0/" ).gpop_right('/' ), "/0/"); CHECK_EQ(S("//0/" ).gpop_right('/', true), ""); CHECK_EQ(S("//0//" ).gpop_right('/' ), "/0//"); CHECK_EQ(S("//0//" ).gpop_right('/', true), ""); CHECK_EQ(S("//0///" ).gpop_right('/' ), "/0///"); CHECK_EQ(S("//0///" ).gpop_right('/', true), ""); CHECK_EQ(S("///0" ).gpop_right('/' ), "//0"); CHECK_EQ(S("///0" ).gpop_right('/', true), ""); CHECK_EQ(S("///0/" ).gpop_right('/' ), "//0/"); CHECK_EQ(S("///0/" ).gpop_right('/', true), ""); CHECK_EQ(S("///0//" ).gpop_right('/' ), "//0//"); CHECK_EQ(S("///0//" ).gpop_right('/', true), ""); CHECK_EQ(S("///0///" ).gpop_right('/' ), "//0///"); CHECK_EQ(S("///0///" ).gpop_right('/', true), ""); CHECK_EQ(S("/" ).gpop_right('/' ), ""); CHECK_EQ(S("/" ).gpop_right('/', true), ""); CHECK_EQ(S("//" ).gpop_right('/' ), "/"); CHECK_EQ(S("//" ).gpop_right('/', true), ""); CHECK_EQ(S("///" ).gpop_right('/' ), "//"); CHECK_EQ(S("///" ).gpop_right('/', true), ""); CHECK_EQ(S("" ).gpop_right('/' ), ""); CHECK_EQ(S("" ).gpop_right('/', true), ""); } TEST_CASE("substr.basename") { using S = csubstr; CHECK_EQ(S("0/1/2").basename(), "2"); CHECK_EQ(S("0/1/2/").basename(), "2"); CHECK_EQ(S("0/1/2///").basename(), "2"); CHECK_EQ(S("/0/1/2").basename(), "2"); CHECK_EQ(S("/0/1/2/").basename(), "2"); CHECK_EQ(S("/0/1/2///").basename(), "2"); CHECK_EQ(S("///0/1/2").basename(), "2"); CHECK_EQ(S("///0/1/2/").basename(), "2"); CHECK_EQ(S("///0/1/2///").basename(), "2"); CHECK_EQ(S("/").basename(), ""); CHECK_EQ(S("//").basename(), ""); CHECK_EQ(S("///").basename(), ""); CHECK_EQ(S("////").basename(), ""); CHECK_EQ(S("").basename(), ""); } TEST_CASE("substr.dirname") { using S = csubstr; CHECK_EQ(S("0/1/2").dirname(), "0/1/"); CHECK_EQ(S("0/1/2/").dirname(), "0/1/"); CHECK_EQ(S("/0/1/2").dirname(), "/0/1/"); CHECK_EQ(S("/0/1/2/").dirname(), "/0/1/"); CHECK_EQ(S("///0/1/2").dirname(), "///0/1/"); CHECK_EQ(S("///0/1/2/").dirname(), "///0/1/"); CHECK_EQ(S("/0").dirname(), "/"); CHECK_EQ(S("/").dirname(), "/"); CHECK_EQ(S("//").dirname(), "//"); CHECK_EQ(S("///").dirname(), "///"); CHECK_EQ(S("////").dirname(), "////"); CHECK_EQ(S("").dirname(), ""); } TEST_CASE("substr.extshort") { using S = csubstr; CHECK_EQ(S("filename.with.ext").extshort(), "ext"); CHECK_EQ(S("filename.with.ext.").extshort(), ""); CHECK_EQ(S(".a.b").extshort(), "b"); CHECK_EQ(S(".a.b.").extshort(), ""); CHECK_EQ(S(".b..").extshort(), ""); CHECK_EQ(S("..b.").extshort(), ""); } TEST_CASE("substr.extlong") { using S = csubstr; CHECK_EQ(S("filename.with.ext").extlong(), "with.ext"); CHECK_EQ(S("filename.with.ext.").extlong(), "with.ext."); CHECK_EQ(S(".a.b").extlong(), "a.b"); CHECK_EQ(S(".a.b.").extlong(), "a.b."); CHECK_EQ(S(".b..").extlong(), "b.."); CHECK_EQ(S("..b.").extlong(), ".b."); } TEST_CASE("substr.next_split") { #ifndef C4_UBSAN // the tests succeed, so UBSAN can take a hike. using S = csubstr; { S const n; typename S::size_type pos = 0; S ss; CHECK_EQ(n.next_split(':', &pos, &ss), false); CHECK_EQ(ss.empty(), true); CHECK_EQ(n.next_split(':', &pos, &ss), false); CHECK_EQ(ss.empty(), true); pos = 0; CHECK_EQ(n.next_split(',', &pos, &ss), false); CHECK_EQ(ss.empty(), true); CHECK_EQ(n.next_split(',', &pos, &ss), false); CHECK_EQ(ss.empty(), true); } { S const n("0"); typename S::size_type pos = 0; S ss; CHECK_EQ(n.next_split(':', &pos, &ss), true); CHECK_EQ(ss.empty(), false); CHECK_EQ(n.next_split(':', &pos, &ss), false); CHECK_EQ(ss.empty(), true); CHECK_EQ(n.next_split(':', &pos, &ss), false); CHECK_EQ(ss.empty(), true); pos = 0; CHECK_EQ(n.next_split(',', &pos, &ss), true); CHECK_EQ(ss.empty(), false); CHECK_EQ(n.next_split(',', &pos, &ss), false); CHECK_EQ(ss.empty(), true); CHECK_EQ(n.next_split(',', &pos, &ss), false); CHECK_EQ(ss.empty(), true); } { S const n; typename S::size_type pos = 0; typename S::size_type count = 0; S ss; while(n.next_split(':', &pos, &ss)) { ++count; } CHECK_EQ(count, 0); } { S const n("0123456"); typename S::size_type pos = 0; typename S::size_type count = 0; S ss; while(n.next_split(':', &pos, &ss)) { switch(count) { case 0: CHECK_EQ(ss.size(), n.size()); CHECK_EQ(ss.empty(), false); break; default: CHECK_UNARY(false);//GTEST_FAIL(); break; } ++count; } CHECK_EQ(count, 1); } { S const n("0123456:"); typename S::size_type pos = 0; typename S::size_type count = 0; S ss; while(n.next_split(':', &pos, &ss)) { switch(count) { case 0: CHECK_EQ(ss.size(), n.size()-1); CHECK_EQ(ss.empty(), false); break; case 1: CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.empty(), true); break; default: CHECK_UNARY(false);//GTEST_FAIL(); break; } ++count; } CHECK_EQ(count, 2); } { S const n(":0123456:"); typename S::size_type pos = 0; typename S::size_type count = 0; S ss; while(n.next_split(':', &pos, &ss)) { switch(count) { case 0: CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.empty(), true); break; case 1: CHECK_EQ(ss.size(), n.size()-2); CHECK_EQ(ss.empty(), false); break; case 2: CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.empty(), true); break; default: CHECK_UNARY(false);//GTEST_FAIL(); break; } ++count; } CHECK_EQ(count, 3); } { S const n(":"); typename S::size_type pos = 0; typename S::size_type count = 0; S ss; while(n.next_split(':', &pos, &ss)) { switch(count) { case 0: CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.empty(), true); break; case 1: CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.empty(), true); break; default: CHECK_UNARY(false);//GTEST_FAIL(); break; } ++count; } CHECK_EQ(count, 2); } { S const n("01:23:45:67"); typename S::size_type pos = 0; typename S::size_type count = 0; S ss; while(n.next_split(':', &pos, &ss)) { switch(count) { case 0: CHECK_EQ(ss.size(), 2); CHECK_EQ(ss, "01"); CHECK_NE(ss, "01:"); CHECK_NE(ss, ":01:"); CHECK_NE(ss, ":01"); break; case 1: CHECK_EQ(ss.size(), 2); CHECK_EQ(ss, "23"); CHECK_NE(ss, "23:"); CHECK_NE(ss, ":23:"); CHECK_NE(ss, ":23"); break; case 2: CHECK_EQ(ss.size(), 2); CHECK_EQ(ss, "45"); CHECK_NE(ss, "45:"); CHECK_NE(ss, ":45:"); CHECK_NE(ss, ":45"); break; case 3: CHECK_EQ(ss.size(), 2); CHECK_EQ(ss, "67"); CHECK_NE(ss, "67:"); CHECK_NE(ss, ":67:"); CHECK_NE(ss, ":67"); break; default: CHECK_UNARY(false);//GTEST_FAIL(); break; } count++; } CHECK_EQ(count, 4); } { const S n(":01:23:45:67:"); typename S::size_type pos = 0; typename S::size_type count = 0; S ss; while(n.next_split(':', &pos, &ss)) { switch(count) { case 0: CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.empty(), true); break; case 1: CHECK_EQ(ss.size(), 2); CHECK_EQ(ss, "01"); CHECK_NE(ss, "01:"); CHECK_NE(ss, ":01:"); CHECK_NE(ss, ":01"); break; case 2: CHECK_EQ(ss.size(), 2); CHECK_EQ(ss, "23"); CHECK_NE(ss, "23:"); CHECK_NE(ss, ":23:"); CHECK_NE(ss, ":23"); break; case 3: CHECK_EQ(ss.size(), 2); CHECK_EQ(ss, "45"); CHECK_NE(ss, "45:"); CHECK_NE(ss, ":45:"); CHECK_NE(ss, ":45"); break; case 4: CHECK_EQ(ss.size(), 2); CHECK_EQ(ss, "67"); CHECK_NE(ss, "67:"); CHECK_NE(ss, ":67:"); CHECK_NE(ss, ":67"); break; case 5: CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.empty(), true); break; default: CHECK_UNARY(false);//GTEST_FAIL(); break; } count++; } CHECK_EQ(count, 6); } { const S n("::::01:23:45:67::::"); typename S::size_type pos = 0; typename S::size_type count = 0; S ss; while(n.next_split(':', &pos, &ss)) { switch(count) { case 0: CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.empty(), true); CHECK_NE(ss, "::"); break; case 1: CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.empty(), true); CHECK_NE(ss, "::"); break; case 2: CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.empty(), true); CHECK_NE(ss, "::"); break; case 3: CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.empty(), true); CHECK_NE(ss, "::"); break; case 4: CHECK_EQ(ss.size(), 2); CHECK_EQ(ss, "01"); CHECK_NE(ss, "01:"); CHECK_NE(ss, ":01:"); CHECK_NE(ss, ":01"); break; case 5: CHECK_EQ(ss.size(), 2); CHECK_EQ(ss, "23"); CHECK_NE(ss, "23:"); CHECK_NE(ss, ":23:"); CHECK_NE(ss, ":23"); break; case 6: CHECK_EQ(ss.size(), 2); CHECK_EQ(ss, "45"); CHECK_NE(ss, "45:"); CHECK_NE(ss, ":45:"); CHECK_NE(ss, ":45"); break; case 7: CHECK_EQ(ss.size(), 2); CHECK_EQ(ss, "67"); CHECK_NE(ss, "67:"); CHECK_NE(ss, ":67:"); CHECK_NE(ss, ":67"); break; case 8: CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.empty(), true); CHECK_NE(ss, "::"); break; case 9: CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.empty(), true); CHECK_NE(ss, "::"); break; case 10: CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.empty(), true); CHECK_NE(ss, "::"); break; case 11: CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.empty(), true); CHECK_NE(ss, "::"); break; default: CHECK_UNARY(false);//GTEST_FAIL(); break; } count++; } CHECK_EQ(count, 12); } #endif } TEST_CASE("substr.split") { #ifndef C4_UBSAN // the tests succeed, so UBSAN can take a hike. using S = csubstr; { S const n; { auto spl = n.split(':'); auto beg = spl.begin(); auto end = spl.end(); CHECK_UNARY(beg == end); } } { S const n("foo:bar:baz"); auto spl = n.split(':'); auto beg = spl.begin(); auto end = spl.end(); CHECK_EQ(beg->size(), 3); CHECK_EQ(end->size(), 0); CHECK_EQ(*beg, "foo"); CHECK_UNARY(beg != end); auto it = beg; CHECK_EQ(it->size(), 3); CHECK_EQ(*it, "foo"); CHECK_UNARY(it != end); CHECK_UNARY(it == beg); CHECK_EQ(beg->size(), 3); CHECK_EQ(*beg, "foo"); CHECK_UNARY(beg != end); ++it; CHECK_EQ(it->size(), 3); CHECK_EQ(*it, "bar"); CHECK_UNARY(it != end); CHECK_UNARY(it != beg); CHECK_EQ(beg->size(), 3); CHECK_EQ(*beg, "foo"); CHECK_UNARY(beg != end); ++it; CHECK_EQ(it->size(), 3); CHECK_EQ(*it, "baz"); CHECK_UNARY(it != end); CHECK_UNARY(it != beg); CHECK_EQ(beg->size(), 3); CHECK_EQ(*beg, "foo"); CHECK_UNARY(beg != end); ++it; CHECK_EQ(it->size(), 0); CHECK_UNARY(it == end); CHECK_UNARY(it != beg); CHECK_EQ(beg->size(), 3); CHECK_EQ(*beg, "foo"); CHECK_UNARY(beg != end); it = beg; CHECK_EQ(it->size(), 3); CHECK_EQ(*it, "foo"); CHECK_UNARY(it != end); CHECK_UNARY(it == beg); CHECK_EQ(beg->size(), 3); CHECK_EQ(*beg, "foo"); CHECK_UNARY(beg != end); it++; CHECK_EQ(it->size(), 3); CHECK_EQ(*it, "bar"); CHECK_UNARY(it != end); CHECK_UNARY(it != beg); CHECK_EQ(beg->size(), 3); CHECK_EQ(*beg, "foo"); CHECK_UNARY(beg != end); it++; CHECK_EQ(it->size(), 3); CHECK_EQ(*it, "baz"); CHECK_UNARY(it != end); CHECK_UNARY(it != beg); CHECK_EQ(beg->size(), 3); CHECK_EQ(*beg, "foo"); CHECK_UNARY(beg != end); it++; CHECK_EQ(it->size(), 0); CHECK_UNARY(it == end); CHECK_UNARY(it != beg); CHECK_EQ(beg->size(), 3); CHECK_EQ(*beg, "foo"); CHECK_UNARY(beg != end); } { S const n("foo:bar:baz:"); auto spl = n.split(':'); auto beg = spl.begin(); auto end = spl.end(); CHECK_EQ(beg->size(), 3); CHECK_EQ(end->size(), 0); CHECK_EQ(*beg, "foo"); CHECK_UNARY(beg != end); auto it = beg; CHECK_EQ(it->size(), 3); CHECK_EQ(*it, "foo"); CHECK_UNARY(it != end); CHECK_UNARY(it == beg); CHECK_EQ(beg->size(), 3); CHECK_EQ(*beg, "foo"); CHECK_UNARY(beg != end); ++it; CHECK_EQ(it->size(), 3); CHECK_EQ(*it, "bar"); CHECK_UNARY(it != end); CHECK_UNARY(it != beg); CHECK_EQ(beg->size(), 3); CHECK_EQ(*beg, "foo"); CHECK_UNARY(beg != end); ++it; CHECK_EQ(it->size(), 3); CHECK_EQ(*it, "baz"); CHECK_UNARY(it != end); CHECK_UNARY(it != beg); CHECK_EQ(beg->size(), 3); CHECK_EQ(*beg, "foo"); CHECK_UNARY(beg != end); ++it; CHECK_EQ(it->size(), 0); CHECK_EQ(*it, ""); CHECK_UNARY(it != end); CHECK_UNARY(it != beg); CHECK_EQ(beg->size(), 3); CHECK_EQ(*beg, "foo"); CHECK_UNARY(beg != end); ++it; CHECK_EQ(it->size(), 0); CHECK_UNARY(it == end); CHECK_UNARY(it != beg); CHECK_EQ(beg->size(), 3); CHECK_EQ(*beg, "foo"); CHECK_UNARY(beg != end); //-------------------------- it = beg; CHECK_EQ(it->size(), 3); CHECK_EQ(*it, "foo"); CHECK_UNARY(it != end); CHECK_UNARY(it == beg); CHECK_EQ(beg->size(), 3); CHECK_EQ(*beg, "foo"); CHECK_UNARY(beg != end); it++; CHECK_EQ(it->size(), 3); CHECK_EQ(*it, "bar"); CHECK_UNARY(it != end); CHECK_UNARY(it != beg); CHECK_EQ(beg->size(), 3); CHECK_EQ(*beg, "foo"); CHECK_UNARY(beg != end); it++; CHECK_EQ(it->size(), 3); CHECK_EQ(*it, "baz"); CHECK_UNARY(it != end); CHECK_UNARY(it != beg); CHECK_EQ(beg->size(), 3); CHECK_EQ(*beg, "foo"); CHECK_UNARY(beg != end); it++; CHECK_EQ(it->size(), 0); CHECK_EQ(*it, ""); CHECK_UNARY(it != end); CHECK_UNARY(it != beg); CHECK_EQ(beg->size(), 3); CHECK_EQ(*beg, "foo"); CHECK_UNARY(beg != end); it++; CHECK_EQ(it->size(), 0); CHECK_UNARY(it == end); CHECK_UNARY(it != beg); CHECK_EQ(beg->size(), 3); CHECK_EQ(*beg, "foo"); CHECK_UNARY(beg != end); } { S const n; auto s = n.split(':'); // check that multiple calls to begin() always yield the same result CHECK_EQ(*s.begin(), ""); CHECK_EQ(*s.begin(), ""); CHECK_EQ(*s.begin(), ""); // check that multiple calls to end() always yield the same result auto e = s.end(); CHECK_UNARY(s.end() == e); CHECK_UNARY(s.end() == e); // auto it = s.begin(); CHECK_EQ(*it, ""); CHECK_EQ(it->empty(), true); CHECK_EQ(it->size(), 0); ++it; CHECK_UNARY(it == e); } { S const n("01:23:45:67"); auto s = n.split(':'); // check that multiple calls to begin() always yield the same result CHECK_EQ(*s.begin(), "01"); CHECK_EQ(*s.begin(), "01"); CHECK_EQ(*s.begin(), "01"); // check that multiple calls to end() always yield the same result auto e = s.end(); CHECK_UNARY(s.end() == e); CHECK_UNARY(s.end() == e); CHECK_UNARY(s.end() == e); // auto it = s.begin(); CHECK_EQ(*it, "01"); CHECK_EQ(it->size(), 2); ++it; CHECK_EQ(*it, "23"); CHECK_EQ(it->size(), 2); ++it; CHECK_EQ(*it, "45"); CHECK_EQ(it->size(), 2); ++it; CHECK_EQ(*it, "67"); CHECK_EQ(it->size(), 2); ++it; CHECK_UNARY(it == s.end()); } { S const n; typename S::size_type count = 0; for(auto &ss : n.split(':')) { ++count; } CHECK_EQ(count, 0); } { S const n("0123456"); { auto spl = n.split(':'); auto beg = spl.begin(); auto end = spl.end(); CHECK_EQ(beg->size(), n.size()); CHECK_EQ(end->size(), 0); } typename S::size_type count = 0; for(auto &ss : n.split(':')) { switch(count) { case 0: CHECK_EQ(ss.size(), n.size()); CHECK_EQ(ss.empty(), false); break; } ++count; } CHECK_EQ(count, 1); } { S const n("foo:bar"); typename S::size_type count = 0; for(auto &ss : n.split(':')) { switch(count) { case 0: CHECK_EQ(ss.size(), 3); CHECK_EQ(ss.empty(), false); CHECK_EQ(ss, "foo"); break; case 1: CHECK_EQ(ss.size(), 3); CHECK_EQ(ss.empty(), false); CHECK_EQ(ss, "bar"); break; } ++count; } CHECK_EQ(count, 2); } { S const n("0123456:"); typename S::size_type count = 0; for(auto &ss : n.split(':')) { switch(count) { case 0: CHECK_EQ(ss.size(), n.size()-1); CHECK_EQ(ss.empty(), false); break; case 1: CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.empty(), true); break; } ++count; } CHECK_EQ(count, 2); } { S const n(":0123456:"); typename S::size_type count = 0; for(auto &ss : n.split(':')) { switch(count) { case 0: CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.empty(), true); break; case 1: CHECK_EQ(ss.size(), n.size()-2); CHECK_EQ(ss.empty(), false); break; case 2: CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.empty(), true); break; } ++count; } CHECK_EQ(count, 3); } { S const n(":"); typename S::size_type count = 0; for(auto &ss : n.split(':')) { switch(count) { case 0: CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.empty(), true); break; case 1: CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.empty(), true); break; } ++count; } CHECK_EQ(count, 2); } { S const n("01:23:45:67"); typename S::size_type count = 0; for(auto &ss : n.split(':')) { switch(count) { case 0: CHECK_EQ(ss, "01"); CHECK_NE(ss, "01:"); CHECK_NE(ss, ":01:"); CHECK_NE(ss, ":01"); break; case 1: CHECK_EQ(ss, "23"); CHECK_NE(ss, "23:"); CHECK_NE(ss, ":23:"); CHECK_NE(ss, ":23"); break; case 2: CHECK_EQ(ss, "45"); CHECK_NE(ss, "45:"); CHECK_NE(ss, ":45:"); CHECK_NE(ss, ":45"); break; case 3: CHECK_EQ(ss, "67"); CHECK_NE(ss, "67:"); CHECK_NE(ss, ":67:"); CHECK_NE(ss, ":67"); break; } count++; } CHECK_EQ(count, 4); } { const S n(":01:23:45:67:"); typename S::size_type count = 0; for(auto &ss : n.split(':')) { switch(count) { case 0: CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.empty(), true); break; case 1: CHECK_EQ(ss, "01"); CHECK_NE(ss, "01:"); CHECK_NE(ss, ":01:"); CHECK_NE(ss, ":01"); break; case 2: CHECK_EQ(ss, "23"); CHECK_NE(ss, "23:"); CHECK_NE(ss, ":23:"); CHECK_NE(ss, ":23"); break; case 3: CHECK_EQ(ss, "45"); CHECK_NE(ss, "45:"); CHECK_NE(ss, ":45:"); CHECK_NE(ss, ":45"); break; case 4: CHECK_EQ(ss, "67"); CHECK_NE(ss, "67:"); CHECK_NE(ss, ":67:"); CHECK_NE(ss, ":67"); break; case 5: CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.empty(), true); break; } count++; } CHECK_EQ(count, 6); } { const S n("::::01:23:45:67::::"); typename S::size_type count = 0; for(auto &ss : n.split(':')) { switch(count) { case 0: CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.empty(), true); CHECK_NE(ss, "::"); break; case 1: CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.empty(), true); CHECK_NE(ss, "::"); break; case 2: CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.empty(), true); CHECK_NE(ss, "::"); break; case 3: CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.empty(), true); CHECK_NE(ss, "::"); break; case 4: CHECK_EQ(ss, "01"); CHECK_NE(ss, "01:"); CHECK_NE(ss, ":01:"); CHECK_NE(ss, ":01"); break; case 5: CHECK_EQ(ss, "23"); CHECK_NE(ss, "23:"); CHECK_NE(ss, ":23:"); CHECK_NE(ss, ":23"); break; case 6: CHECK_EQ(ss, "45"); CHECK_NE(ss, "45:"); CHECK_NE(ss, ":45:"); CHECK_NE(ss, ":45"); break; case 7: CHECK_EQ(ss, "67"); CHECK_NE(ss, "67:"); CHECK_NE(ss, ":67:"); CHECK_NE(ss, ":67"); break; case 8: CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.empty(), true); CHECK_NE(ss, "::"); break; case 9: CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.empty(), true); CHECK_NE(ss, "::"); break; case 10: CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.empty(), true); CHECK_NE(ss, "::"); break; case 11: CHECK_EQ(ss.size(), 0); CHECK_EQ(ss.empty(), true); CHECK_NE(ss, "::"); break; } count++; } CHECK_EQ(count, 12); } #endif } //----------------------------------------------------------------------------- TEST_CASE("substr.copy_from") { char buf[128] = {0}; substr s = buf; CHECK_EQ(s.size(), sizeof(buf)-1); CHECK_NE(s.first(3), "123"); s.copy_from("123"); CHECK_EQ(s.first(3), "123"); CHECK_EQ(s.first(6), "123\0\0\0"); s.copy_from("+++", 3); CHECK_EQ(s.first(6), "123+++"); CHECK_EQ(s.first(9), "123+++\0\0\0"); s.copy_from("456", 6); CHECK_EQ(s.first(9), "123+++456"); CHECK_EQ(s.first(12), "123+++456\0\0\0"); s.copy_from("***", 3); CHECK_EQ(s.first(9), "123***456"); CHECK_EQ(s.first(12), "123***456\0\0\0"); // make sure that it's safe to pass source strings that don't fit // in the remaining destination space substr ss = s.first(9); ss.copy_from("987654321", 9); // should be a no-op CHECK_EQ(s.first(12), "123***456\0\0\0"); ss.copy_from("987654321", 6); CHECK_EQ(s.first(12), "123***987\0\0\0"); ss.copy_from("987654321", 3); CHECK_EQ(s.first(12), "123987654\0\0\0"); ss.first(3).copy_from("987654321"); CHECK_EQ(s.first(12), "987987654\0\0\0"); } //----------------------------------------------------------------------------- void do_test_reverse(substr s, csubstr orig, csubstr expected) { CHECK_EQ(s, orig); s.reverse(); CHECK_EQ(s, expected); s.reverse(); CHECK_EQ(s, orig); // CHECK_EQ(s, orig); s.reverse_sub(0, s.len); CHECK_EQ(s, expected); s.reverse_sub(0, s.len); CHECK_EQ(s, orig); // CHECK_EQ(s, orig); s.reverse_range(0, s.len); CHECK_EQ(s, expected); s.reverse_range(0, s.len); CHECK_EQ(s, orig); } TEST_CASE("substr.reverse") { char buf[] = "0123456789"; do_test_reverse(buf, "0123456789", "9876543210"); do_test_reverse(buf, "0123456789", "9876543210"); // in the middle substr s = buf; s.sub(2, 2).reverse(); CHECK_EQ(s, "0132456789"); s.sub(2, 2).reverse(); CHECK_EQ(s, "0123456789"); s.sub(4, 2).reverse(); CHECK_EQ(s, "0123546789"); s.sub(4, 2).reverse(); CHECK_EQ(s, "0123456789"); // at the beginning s.first(3).reverse(); CHECK_EQ(s, "2103456789"); s.first(3).reverse(); CHECK_EQ(s, "0123456789"); // at the end s.last(3).reverse(); CHECK_EQ(s, "0123456987"); s.last(3).reverse(); CHECK_EQ(s, "0123456789"); } TEST_CASE("substr.reverse_sub") { char buf[] = "0123456789"; substr s = buf; s.reverse_sub(0, s.len); CHECK_EQ(s, "9876543210"); s.reverse_sub(0, s.len); CHECK_EQ(s, "0123456789"); s.reverse_sub(0, 0); CHECK_EQ(s, "0123456789"); s.reverse_sub(s.len, 0); CHECK_EQ(s, "0123456789"); s.reverse_sub(1, 3); CHECK_EQ(s, "0321456789"); s.reverse_sub(1, 3); CHECK_EQ(s, "0123456789"); } TEST_CASE("substr.reverse_range") { char buf[] = "0123456789"; substr s = buf; s.reverse_range(0, s.len); CHECK_EQ(s, "9876543210"); s.reverse_range(0, s.len); CHECK_EQ(s, "0123456789"); s.reverse_range(0, 0); CHECK_EQ(s, "0123456789"); s.reverse_range(s.len, s.len); CHECK_EQ(s, "0123456789"); s.reverse_range(1, 3); CHECK_EQ(s, "0213456789"); s.reverse_range(1, 3); CHECK_EQ(s, "0123456789"); } //----------------------------------------------------------------------------- TEST_CASE("substr.erase") { char buf[] = "0123456789"; substr s = buf; CHECK_EQ(s.len, s.size()); CHECK_EQ(s.len, 10); CHECK_EQ(s, "0123456789"); substr ss = s.first(6); CHECK_EQ(ss.len, 6); for(size_t i = 0; i <= ss.len; ++i) { ss.erase(i, 0); // must be a no-op CHECK_EQ(s, "0123456789"); ss.erase_range(i, i); // must be a no-op CHECK_EQ(s, "0123456789"); ss.erase(ss.len-i, i); // must be a no-op CHECK_EQ(s, "0123456789"); } substr r; ss = ss.erase(0, 1); CHECK_EQ(ss.len, 5); CHECK_EQ(ss, "12345"); CHECK_EQ(s, "1234556789"); ss = ss.erase(0, 2); CHECK_EQ(ss.len, 3); CHECK_EQ(ss, "345"); CHECK_EQ(s, "3454556789"); csubstr s55 = s.sub(4, 2); ss = s.erase(s55); CHECK_EQ(s, "3454678989"); } //----------------------------------------------------------------------------- TEST_CASE("substr.replace") { char buf[] = "0.1.2.3.4.5.6.7.8.9"; substr s = buf; auto ret = s.replace('+', '.'); CHECK_EQ(ret, 0); ret = s.replace('.', '.', s.len); CHECK_EQ(s, "0.1.2.3.4.5.6.7.8.9"); CHECK_EQ(ret, 0); ret = s.replace('.', '.'); CHECK_EQ(ret, 9); CHECK_EQ(s, "0.1.2.3.4.5.6.7.8.9"); ret = s.replace('.', '+', s.len); CHECK_EQ(s, "0.1.2.3.4.5.6.7.8.9"); CHECK_EQ(ret, 0); ret = s.replace('.', '+'); CHECK_EQ(ret, 9); CHECK_EQ(s, "0+1+2+3+4+5+6+7+8+9"); ret = s.replace("16", '.', s.len); CHECK_EQ(s, "0+1+2+3+4+5+6+7+8+9"); CHECK_EQ(ret, 0); ret = s.replace("16", '.'); CHECK_EQ(ret, 2); CHECK_EQ(s, "0+.+2+3+4+5+.+7+8+9"); ret = s.replace("3+2", '_'); CHECK_EQ(ret, 11); CHECK_EQ(s, "0_._____4_5_._7_8_9"); // must accept empty string ret = s.sub(0, 0).replace('0', '1'); CHECK_EQ(ret, 0); CHECK_EQ(s, "0_._____4_5_._7_8_9"); ret = s.sub(0, 0).replace("0", '1'); CHECK_EQ(ret, 0); CHECK_EQ(s, "0_._____4_5_._7_8_9"); } TEST_CASE("substr.replace_all") { char buf[] = "0.1.2.3.4.5.6.7.8.9"; std::string tmp, out("0+1+2+3+4+5+6+7+8+9"); // must accept empty string substr(buf).sub(0, 0).replace_all(to_substr(tmp), "0", "X"); CHECK_EQ(csubstr(buf), "0.1.2.3.4.5.6.7.8.9"); substr r; auto replall = [&](csubstr pattern, csubstr repl) -> substr { tmp = out; csubstr rtmp = to_csubstr(tmp); out.resize(128); substr dst = to_substr(out); size_t sz = rtmp.replace_all(dst, pattern, repl); CHECK_LE(sz, out.size()); out.resize(sz); return dst.first(sz); }; r = replall("0+1", "0+++++1"); // the result must be a view of out CHECK_FALSE(r.empty()); CHECK_FALSE(out.empty()); CHECK_EQ(r.size(), out.size()); CHECK_EQ(r.front(), out.front()); CHECK_EQ(r.back(), out.back()); CHECK_EQ(r, "0+++++1+2+3+4+5+6+7+8+9"); r = replall("+", ""); CHECK_EQ(r, "0123456789"); r = replall("+", ""); CHECK_EQ(r, "0123456789"); // must not change r = replall("0123456789", "9876543210"); CHECK_EQ(r, "9876543210"); r = replall("987", "."); CHECK_EQ(r, ".6543210"); r = replall("210", "."); CHECK_EQ(r, ".6543."); r = replall("6543", ":"); CHECK_EQ(r, ".:."); r = replall(".:.", ""); CHECK_EQ(r, ""); } TEST_CASE("substr.short_integer") { char buf[] = "-"; CHECK_FALSE(substr(buf).is_integer()); CHECK_FALSE(csubstr("-").is_integer()); CHECK_FALSE(csubstr("+").is_integer()); } } // namespace c4 #include "c4/libtest/supprwarn_pop.hpp" c4core-0.2.6/test/test_szconv.cpp000066400000000000000000000142711477602032300167530ustar00rootroot00000000000000#ifndef C4CORE_SINGLE_HEADER #include "c4/szconv.hpp" #endif #include "c4/libtest/supprwarn_push.hpp" #include "c4/test.hpp" #define C4_EXPECT_NARROWER(yes_or_no, ty_out, ty_in) \ CHECK_UNARY(( yes_or_no (is_narrower_size::value))); namespace c4 { TEST_CASE("is_narrower_size.signed_types") { C4_EXPECT_NARROWER( ! , int8_t , int8_t ); C4_EXPECT_NARROWER( , int8_t , int16_t); C4_EXPECT_NARROWER( , int8_t , int32_t); C4_EXPECT_NARROWER( , int8_t , int64_t); C4_EXPECT_NARROWER( , int8_t , uint8_t ); C4_EXPECT_NARROWER( , int8_t , uint16_t); C4_EXPECT_NARROWER( , int8_t , uint32_t); C4_EXPECT_NARROWER( , int8_t , uint64_t); C4_EXPECT_NARROWER( ! , int16_t , int8_t ); C4_EXPECT_NARROWER( ! , int16_t , int16_t); C4_EXPECT_NARROWER( , int16_t , int32_t); C4_EXPECT_NARROWER( , int16_t , int64_t); C4_EXPECT_NARROWER( ! , int16_t , uint8_t ); C4_EXPECT_NARROWER( , int16_t , uint16_t); C4_EXPECT_NARROWER( , int16_t , uint32_t); C4_EXPECT_NARROWER( , int16_t , uint64_t); C4_EXPECT_NARROWER( ! , int32_t , int8_t ); C4_EXPECT_NARROWER( ! , int32_t , int16_t); C4_EXPECT_NARROWER( ! , int32_t , int32_t); C4_EXPECT_NARROWER( , int32_t , int64_t); C4_EXPECT_NARROWER( ! , int32_t , uint8_t ); C4_EXPECT_NARROWER( ! , int32_t , uint16_t); C4_EXPECT_NARROWER( , int32_t , uint32_t); C4_EXPECT_NARROWER( , int32_t , uint64_t); C4_EXPECT_NARROWER( ! , int64_t , int8_t ); C4_EXPECT_NARROWER( ! , int64_t , int16_t); C4_EXPECT_NARROWER( ! , int64_t , int32_t); C4_EXPECT_NARROWER( ! , int64_t , int64_t); C4_EXPECT_NARROWER( ! , int64_t , uint8_t ); C4_EXPECT_NARROWER( ! , int64_t , uint16_t); C4_EXPECT_NARROWER( ! , int64_t , uint32_t); C4_EXPECT_NARROWER( , int64_t , uint64_t); } TEST_CASE("is_narrower_size.unsigned_types") { C4_EXPECT_NARROWER( ! , uint8_t , int8_t ); C4_EXPECT_NARROWER( , uint8_t , int16_t); C4_EXPECT_NARROWER( , uint8_t , int32_t); C4_EXPECT_NARROWER( , uint8_t , int64_t); C4_EXPECT_NARROWER( ! , uint8_t , uint8_t ); C4_EXPECT_NARROWER( , uint8_t , uint16_t); C4_EXPECT_NARROWER( , uint8_t , uint32_t); C4_EXPECT_NARROWER( , uint8_t , uint64_t); C4_EXPECT_NARROWER( ! , uint16_t , int8_t ); C4_EXPECT_NARROWER( ! , uint16_t , int16_t); C4_EXPECT_NARROWER( , uint16_t , int32_t); C4_EXPECT_NARROWER( , uint16_t , int64_t); C4_EXPECT_NARROWER( ! , uint16_t , uint8_t ); C4_EXPECT_NARROWER( ! , uint16_t , uint16_t); C4_EXPECT_NARROWER( , uint16_t , uint32_t); C4_EXPECT_NARROWER( , uint16_t , uint64_t); C4_EXPECT_NARROWER( ! , uint32_t , int8_t ); C4_EXPECT_NARROWER( ! , uint32_t , int16_t); C4_EXPECT_NARROWER( ! , uint32_t , int32_t); C4_EXPECT_NARROWER( , uint32_t , int64_t); C4_EXPECT_NARROWER( ! , uint32_t , uint8_t ); C4_EXPECT_NARROWER( ! , uint32_t , uint16_t); C4_EXPECT_NARROWER( ! , uint32_t , uint32_t); C4_EXPECT_NARROWER( , uint32_t , uint64_t); C4_EXPECT_NARROWER( ! , uint64_t , int8_t ); C4_EXPECT_NARROWER( ! , uint64_t , int16_t); C4_EXPECT_NARROWER( ! , uint64_t , int32_t); C4_EXPECT_NARROWER( ! , uint64_t , int64_t); C4_EXPECT_NARROWER( ! , uint64_t , uint8_t ); C4_EXPECT_NARROWER( ! , uint64_t , uint16_t); C4_EXPECT_NARROWER( ! , uint64_t , uint32_t); C4_EXPECT_NARROWER( ! , uint64_t , uint64_t); } template typename std::enable_if::value, void>::type test_szconv() { // nothing to do here } template typename std::enable_if< ! std::is_same::value, void>::type test_szconv() { C4_STATIC_ASSERT(std::is_integral::value); C4_STATIC_ASSERT(std::is_integral::value); const I imax = std::numeric_limits::max(); const I imin = std::numeric_limits::min(); const O omax = std::numeric_limits::max(); const O omin = std::numeric_limits::min(); CHECK_EQ(szconv(I(0)), O(0)); CHECK_EQ(szconv(I(0)), I(0)); #if C4_USE_XASSERT if((uint64_t)omax < (uint64_t)imax) { C4_EXPECT_ERROR_OCCURS([&]{ O out = szconv(imax); }); } else if((uint64_t)omax > (uint64_t)imax) { C4_EXPECT_ERROR_OCCURS([&]{ I out = szconv(omax); }); } #endif } #define DO_TEST_SZCONV(ty) \ TEST_CASE("szconv." #ty "_to_int8") \ { \ test_szconv(); \ } \ TEST_CASE("zconv." #ty "_to_uint8") \ { \ test_szconv(); \ } \ TEST_CASE("zconv." #ty "_to_int16") \ { \ test_szconv(); \ } \ TEST_CASE("zconv." #ty "_to_uint16") \ { \ test_szconv(); \ } \ TEST_CASE("zconv." #ty "_to_int32") \ { \ test_szconv(); \ } \ TEST_CASE("zconv." #ty "_to_uint32") \ { \ test_szconv(); \ } \ TEST_CASE("zconv." #ty "_to_int64") \ { \ test_szconv(); \ } \ TEST_CASE("szconv." #ty "_to_uint64") \ { \ test_szconv(); \ } DO_TEST_SZCONV(int8) DO_TEST_SZCONV(uint8) DO_TEST_SZCONV(int16) DO_TEST_SZCONV(uint16) DO_TEST_SZCONV(int32) DO_TEST_SZCONV(uint32) DO_TEST_SZCONV(int64) DO_TEST_SZCONV(uint64) } // namespace c4 #include "c4/libtest/supprwarn_pop.hpp" c4core-0.2.6/test/test_type_name.cpp000066400000000000000000000030211477602032300174010ustar00rootroot00000000000000#include "c4/test.hpp" #ifndef C4CORE_SINGLE_HEADER #include "c4/type_name.hpp" #endif class SomeTypeName {}; struct SomeStructName {}; namespace c4 { class SomeTypeNameInsideANamespace {}; struct SomeStructNameInsideANamespace {}; template cspan cstr(const char (&s)[N]) { cspan o(s, N-1); return o; } TEST_CASE("type_name.intrinsic_types") { CHECK_EQ(type_name(), cstr("int")); CHECK_EQ(type_name(), cstr("float")); CHECK_EQ(type_name(), cstr("double")); } TEST_CASE("type_name.classes") { CHECK_EQ(type_name(), cstr("SomeTypeName")); CHECK_EQ(type_name<::SomeTypeName>(), cstr("SomeTypeName")); } TEST_CASE("type_name.structs") { CHECK_EQ(type_name(), cstr("SomeStructName")); CHECK_EQ(type_name<::SomeStructName>(), cstr("SomeStructName")); } TEST_CASE("type_name.inside_namespace") { CHECK_EQ(type_name(), cstr("c4::SomeTypeNameInsideANamespace")); CHECK_EQ(type_name(), cstr("c4::SomeTypeNameInsideANamespace")); CHECK_EQ(type_name<::c4::SomeTypeNameInsideANamespace>(), cstr("c4::SomeTypeNameInsideANamespace")); CHECK_EQ(type_name(), cstr("c4::SomeStructNameInsideANamespace")); CHECK_EQ(type_name(), cstr("c4::SomeStructNameInsideANamespace")); CHECK_EQ(type_name<::c4::SomeStructNameInsideANamespace>(), cstr("c4::SomeStructNameInsideANamespace")); } } // namespace c4 c4core-0.2.6/test/test_types.cpp000066400000000000000000000052271477602032300165760ustar00rootroot00000000000000#ifndef C4CORE_SINGLE_HEADER #include "c4/config.hpp" #endif #include #include "c4/libtest/supprwarn_push.hpp" #include "c4/test.hpp" namespace c4 { C4_STATIC_ASSERT((std::is_same< fastcref< char >, char >::value)); C4_STATIC_ASSERT((std::is_same< fastcref< i8 >, i8 >::value)); C4_STATIC_ASSERT((std::is_same< fastcref< u8 >, u8 >::value)); C4_STATIC_ASSERT((std::is_same< fastcref< i16 >, i16 >::value)); C4_STATIC_ASSERT((std::is_same< fastcref< u16 >, u16 >::value)); C4_STATIC_ASSERT((std::is_same< fastcref< i32 >, i32 >::value)); C4_STATIC_ASSERT((std::is_same< fastcref< u32 >, u32 >::value)); C4_STATIC_ASSERT((std::is_same< fastcref< i64 >, i64 >::value)); C4_STATIC_ASSERT((std::is_same< fastcref< u64 >, u64 >::value)); using carr64 = char[64]; C4_STATIC_ASSERT((std::is_same< fastcref< carr64 >, carr64 const& >::value)); C4_STATIC_ASSERT((std::is_same< fastcref< std::string >, std::string const& >::value)); //----------------------------------------------------------------------------- C4_BEGIN_HIDDEN_NAMESPACE template< class T > struct ufonix { T a; }; using F = ufonix< uint32_t >; C4_END_HIDDEN_NAMESPACE TEST_CASE("TestSizeStructs.min_remainder") { CHECK_EQ(min_remainder(4, 6), 2); CHECK_EQ(min_remainder(6, 6), 0); CHECK_EQ(min_remainder(8, 6), 0); } TEST_CASE("TestSizeStructs.mult_remainder") { CHECK_EQ(mult_remainder(6, 1), 0); CHECK_EQ(mult_remainder(6, 2), 0); CHECK_EQ(mult_remainder(6, 3), 0); CHECK_EQ(mult_remainder(6, 4), 2); CHECK_EQ(mult_remainder(6, 5), 4); CHECK_EQ(mult_remainder(6, 6), 0); CHECK_EQ(mult_remainder(6, 7), 1); } TEST_CASE("TestSizeStructs.Padded") { CHECK_EQ(sizeof(F), sizeof(uint32_t)); CHECK_EQ((sizeof(Padded< F, 0 >)), sizeof(F)); CHECK_EQ((sizeof(Padded< F, 1 >)), sizeof(F)+1); CHECK_EQ((sizeof(Padded< F, 2 >)), sizeof(F)+2); CHECK_EQ((sizeof(Padded< F, 3 >)), sizeof(F)+3); } TEST_CASE("TestSizeStructs.MinSized") { CHECK_EQ((sizeof(MinSized< F, 14 >)), 14); CHECK_EQ((sizeof(MinSized< F, 15 >)), 15); CHECK_EQ((sizeof(MinSized< F, 16 >)), 16); CHECK_EQ((sizeof(MinSized< F, 17 >)), 17); } TEST_CASE("TestSizeStructs.MultSized") { using G = ufonix< char[8] >; CHECK_EQ((sizeof(MultSized< G, 7 >)), 14); CHECK_EQ((sizeof(MultSized< G, 6 >)), 12); CHECK_EQ((sizeof(MultSized< G, 5 >)), 10); CHECK_EQ((sizeof(MultSized< G, 4 >)), 8); } TEST_CASE("TestSizeStructs.UbufSized") { CHECK_EQ((sizeof(UbufSized>)), 64); CHECK_EQ((sizeof(UbufSized>)), 64); CHECK_EQ((sizeof(UbufSized>)), 80); } } // namespace c4 #include "c4/libtest/supprwarn_pop.hpp" c4core-0.2.6/test/test_utf.cpp000066400000000000000000000105471477602032300162310ustar00rootroot00000000000000#include "c4/test.hpp" #ifndef C4CORE_SINGLE_HEADER #include "c4/std/string.hpp" #include "c4/std/vector.hpp" #include "c4/format.hpp" #include "c4/utf.hpp" #endif #include "c4/libtest/supprwarn_push.hpp" #include namespace c4 { struct utft { csubstr code_point; csubstr character; uint32_t character_val; csubstr character_val_hex; }; constexpr const utft utf_chars[] = { #include "./utfchars.inc" }; TEST_CASE("utf.decode_code_point") { size_t i = 0; char decoded_buf[64]; for(auto uc : utf_chars) { INFO("utfchars[", i, "]: codepoint=", uc.code_point, ' ', "character=", uc.character.empty() ? csubstr{} : uc.character, ' ', "val=", uc.character_val_hex, '(', uc.character_val, ')'); i++; csubstr cpstr = uc.code_point.sub(2).triml('0'); if(cpstr.empty()) continue; csubstr decoded = decode_code_point(decoded_buf, cpstr); CHECK_UNARY(uc.code_point.begins_with("U+")); if(uc.character.empty()) continue; CHECK_EQ(decoded.len, uc.character.len); CHECK_EQ(decoded, uc.character); } } void test_with_bom(substr input, csubstr bom) { CHECK_UNARY(input.begins_with(bom)); { csubstr s = input; CHECK_EQ(first_non_bom(s), bom.len); CHECK_EQ(get_bom(s).len, bom.len); CHECK_EQ(get_bom(s), bom); CHECK_UNARY(get_bom(s).is_sub(s)); CHECK_UNARY(skip_bom(s).is_sub(s)); CHECK_EQ(skip_bom(s).len, input.len - bom.len); } { substr s = input; CHECK_EQ(first_non_bom(s), bom.len); CHECK_EQ(get_bom(s), bom); CHECK_EQ(get_bom(s).len, bom.len); CHECK_UNARY(get_bom(s).is_sub(s)); CHECK_UNARY(skip_bom(s).is_sub(s)); CHECK_EQ(skip_bom(s).len, input.len - bom.len); } } void test_without_bom(substr input, csubstr bom) { CHECK_UNARY(!input.begins_with(bom)); { csubstr s = input; CHECK_EQ(first_non_bom(s), 0); CHECK_EQ(get_bom(s).len, 0); CHECK_EQ(skip_bom(s).len, s.len); } { substr s = input; CHECK_EQ(first_non_bom(s), 0); CHECK_EQ(get_bom(s).len, 0); CHECK_EQ(skip_bom(s).len, s.len); } } TEST_CASE("utf.bom") { csubstr strs[] = { csubstr(""), csubstr("1"), csubstr("12"), csubstr("123"), csubstr("1234"), csubstr("12345"), }; // https://en.wikipedia.org/wiki/Byte_order_mark#Byte-order_marks_by_encoding struct bomcase { csubstr name; csubstr bom; size_t bom_len; }; const bomcase boms[] = { bomcase{csubstr("UTF-8" ), csubstr("\xEF\xBB\xBF"), 3}, bomcase{csubstr("UTF-16 (BE)"), csubstr("\xFE\xFF"), 2}, bomcase{csubstr("UTF-16 (LE)"), csubstr("\xFF\xFE"), 2}, bomcase{csubstr("UTF-32 (BE)"), csubstr("\x00\x00\xFE\xFF"), 4}, bomcase{csubstr("UTF-32 (LE)"), csubstr("\xFF\xFE\x00\x00"), 4}, bomcase{csubstr("UTF-7" ), csubstr("\x2B\x2F\x76"), 3}, bomcase{csubstr("UTF-1" ), csubstr("\xF7\x64\x4C"), 3}, bomcase{csubstr("UTF-EBCDIC" ), csubstr("\xDD\x73\x66\x73"), 4}, bomcase{csubstr("SCSU" ), csubstr("\x0E\xFE\xFF"), 3}, bomcase{csubstr("BOCU-1" ), csubstr("\xFB\xEE\x28"), 3}, bomcase{csubstr("GB18030" ), csubstr("\x84\x31\x95\x33"), 4}, }; std::string buf; for(bomcase bomc : boms) { csubstr name = bomc.name; csubstr bom = bomc.bom; size_t bomlen = bomc.bom_len; INFO("name=[", name.len, "]~~~", name, "~~~"); INFO("bom=[", bom.len, "]~~~", bom, "~~~"); CHECK_EQ(bomlen, bom.len); for(csubstr str : strs) { INFO("str=[", str.len, "]~~~", str, "~~~"); { buf.clear(); buf.append(str.str, str.len); CHECK_EQ(buf.size(), str.len); test_without_bom(to_substr(buf), bom); } { buf.clear(); buf.append(bom.str, bom.len); CHECK_EQ(buf.size(), bom.len); buf.append(str.str, str.len); CHECK_EQ(buf.size(), bom.len + str.len); INFO("buf=[", buf.size(), "]~~~", buf, "~~~"); test_with_bom(to_substr(buf), bom); } } } } } // namespace c4 c4core-0.2.6/test/test_version.cpp000066400000000000000000000012571477602032300171160ustar00rootroot00000000000000#include "c4/test.hpp" #ifndef C4CORE_SINGLE_HEADER #include "c4/version.hpp" #endif TEST_CASE("version.major") { int v = c4::version_major(); CHECK_GE(v, 0); CHECK_EQ(v, C4CORE_VERSION_MAJOR); } TEST_CASE("version.minor") { int v = c4::version_minor(); CHECK_GE(v, 0); CHECK_EQ(v, C4CORE_VERSION_MINOR); } TEST_CASE("version.patch") { int v = c4::version_patch(); CHECK_GE(v, 0); CHECK_EQ(v, C4CORE_VERSION_PATCH); } TEST_CASE("version.str") { c4::csubstr v = c4::to_csubstr(c4::version()); CHECK_GE(v.len, 5); CHECK_EQ(v, C4_XQUOTE(C4CORE_VERSION_MAJOR) "." C4_XQUOTE(C4CORE_VERSION_MINOR) "." C4_XQUOTE(C4CORE_VERSION_PATCH) ""); } c4core-0.2.6/test/utfchars.inc000066400000000000000000005356061477602032300162120ustar00rootroot00000000000000// https://www.utf8-chartable.de/unicode-utf8-table.pl #define _c(cp, wysiwyg, hex) utft{csubstr{#cp}, csubstr{wysiwyg}, UINT32_C(0x##hex), csubstr{"0x" #hex}} _c(U+0000, "\0", 00), _c(U+0001, "", 01), _c(U+0002, "", 02), _c(U+0003, "", 03), _c(U+0004, "", 04), _c(U+0005, "", 05), _c(U+0006, "", 06), _c(U+0007, "", 07), _c(U+0008, "\b", 08), _c(U+0009, "\t", 09), _c(U+000A, "\n", 0a), _c(U+000B, "", 0b), _c(U+000C, "", 0c), _c(U+000D, "\r", 0d), _c(U+000E, "", 0e), _c(U+000F, "", 0f), _c(U+0010, "", 10), _c(U+0011, "", 11), _c(U+0012, "", 12), _c(U+0013, "", 13), _c(U+0014, "", 14), _c(U+0015, "", 15), _c(U+0016, "", 16), _c(U+0017, "", 17), _c(U+0018, "", 18), _c(U+0019, "", 19), _c(U+001A, "", 1a), _c(U+001B, "", 1b), _c(U+001C, "", 1c), _c(U+001D, "", 1d), _c(U+001E, "", 1e), _c(U+001F, "", 1f), _c(U+0020, " ", 20), _c(U+0021, "!", 21), _c(U+0022, "\"", 22), _c(U+0023, "#", 23), _c(U+0024, "$", 24), _c(U+0025, "%", 25), _c(U+0026, "&", 26), _c(U+0027, "'", 27), _c(U+0028, "(", 28), _c(U+0029, ")", 29), _c(U+002A, "*", 2a), _c(U+002B, "+", 2b), _c(U+002C, ",", 2c), _c(U+002D, "-", 2d), _c(U+002E, ".", 2e), _c(U+002F, "/", 2f), _c(U+0030, "0", 30), _c(U+0031, "1", 31), _c(U+0032, "2", 32), _c(U+0033, "3", 33), _c(U+0034, "4", 34), _c(U+0035, "5", 35), _c(U+0036, "6", 36), _c(U+0037, "7", 37), _c(U+0038, "8", 38), _c(U+0039, "9", 39), _c(U+003A, ":", 3a), _c(U+003B, ";", 3b), _c(U+003C, "<", 3c), _c(U+003D, "=", 3d), _c(U+003E, ">", 3e), _c(U+003F, "?", 3f), _c(U+0040, "@", 40), _c(U+0041, "A", 41), _c(U+0042, "B", 42), _c(U+0043, "C", 43), _c(U+0044, "D", 44), _c(U+0045, "E", 45), _c(U+0046, "F", 46), _c(U+0047, "G", 47), _c(U+0048, "H", 48), _c(U+0049, "I", 49), _c(U+004A, "J", 4a), _c(U+004B, "K", 4b), _c(U+004C, "L", 4c), _c(U+004D, "M", 4d), _c(U+004E, "N", 4e), _c(U+004F, "O", 4f), _c(U+0050, "P", 50), _c(U+0051, "Q", 51), _c(U+0052, "R", 52), _c(U+0053, "S", 53), _c(U+0054, "T", 54), _c(U+0055, "U", 55), _c(U+0056, "V", 56), _c(U+0057, "W", 57), _c(U+0058, "X", 58), _c(U+0059, "Y", 59), _c(U+005A, "Z", 5a), _c(U+005B, "[", 5b), _c(U+005C, "\\", 5c), _c(U+005D, "]", 5d), _c(U+005E, "^", 5e), _c(U+005F, "_", 5f), _c(U+0060, "`", 60), _c(U+0061, "a", 61), _c(U+0062, "b", 62), _c(U+0063, "c", 63), _c(U+0064, "d", 64), _c(U+0065, "e", 65), _c(U+0066, "f", 66), _c(U+0067, "g", 67), _c(U+0068, "h", 68), _c(U+0069, "i", 69), _c(U+006A, "j", 6a), _c(U+006B, "k", 6b), _c(U+006C, "l", 6c), _c(U+006D, "m", 6d), _c(U+006E, "n", 6e), _c(U+006F, "o", 6f), _c(U+0070, "p", 70), _c(U+0071, "q", 71), _c(U+0072, "r", 72), _c(U+0073, "s", 73), _c(U+0074, "t", 74), _c(U+0075, "u", 75), _c(U+0076, "v", 76), _c(U+0077, "w", 77), _c(U+0078, "x", 78), _c(U+0079, "y", 79), _c(U+007A, "z", 7a), _c(U+007B, "", 7b), _c(U+007C, "|", 7c), _c(U+007D, "}", 7d), _c(U+007E, "~", 7e), _c(U+007F, "", 7f), // del _c(U+0080, "", c280), _c(U+0081, "", c281), _c(U+0082, "", c282), _c(U+0083, "", c283), _c(U+0084, "", c284), _c(U+0085, "", c285), _c(U+0086, "", c286), _c(U+0087, "", c287), _c(U+0088, "", c288), _c(U+0089, "", c289), _c(U+008A, "", c28a), _c(U+008B, "", c28b), _c(U+008C, "", c28c), _c(U+008D, "", c28d), _c(U+008E, "", c28e), _c(U+008F, "", c28f), _c(U+0090, "", c290), _c(U+0091, "", c291), _c(U+0092, "", c292), _c(U+0093, "", c293), _c(U+0094, "", c294), _c(U+0095, "", c295), _c(U+0096, "", c296), _c(U+0097, "", c297), _c(U+0098, "", c298), _c(U+0099, "", c299), _c(U+009A, "", c29a), _c(U+009B, "", c29b), _c(U+009C, "", c29c), _c(U+009D, "", c29d), _c(U+009E, "", c29e), _c(U+009F, "", c29f), _c(U+00A0, "", c2a0), _c(U+00A1, "ยก", c2a1), _c(U+00A2, "ยข", c2a2), _c(U+00A3, "ยฃ", c2a3), _c(U+00A4, "ยค", c2a4), _c(U+00A5, "ยฅ", c2a5), _c(U+00A6, "ยฆ", c2a6), _c(U+00A7, "ยง", c2a7), _c(U+00A8, "ยจ", c2a8), _c(U+00A9, "ยฉ", c2a9), _c(U+00AA, "ยช", c2aa), _c(U+00AB, "ยซ", c2ab), _c(U+00AC, "ยฌ", c2ac), _c(U+00AD, "ยญ", c2ad), _c(U+00AE, "ยฎ", c2ae), _c(U+00AF, "ยฏ", c2af), _c(U+00B0, "ยฐ", c2b0), _c(U+00B1, "ยฑ", c2b1), _c(U+00B2, "ยฒ", c2b2), _c(U+00B3, "ยณ", c2b3), _c(U+00B4, "ยด", c2b4), _c(U+00B5, "ยต", c2b5), _c(U+00B6, "ยถ", c2b6), _c(U+00B7, "ยท", c2b7), _c(U+00B8, "ยธ", c2b8), _c(U+00B9, "ยน", c2b9), _c(U+00BA, "ยบ", c2ba), _c(U+00BB, "ยป", c2bb), _c(U+00BC, "ยผ", c2bc), _c(U+00BD, "ยฝ", c2bd), _c(U+00BE, "ยพ", c2be), _c(U+00BF, "ยฟ", c2bf), _c(U+00C0, "ร€", c380), _c(U+00C1, "ร", c381), _c(U+00C2, "ร‚", c382), _c(U+00C3, "รƒ", c383), _c(U+00C4, "ร„", c384), _c(U+00C5, "ร…", c385), _c(U+00C6, "ร†", c386), _c(U+00C7, "ร‡", c387), _c(U+00C8, "รˆ", c388), _c(U+00C9, "ร‰", c389), _c(U+00CA, "รŠ", c38a), _c(U+00CB, "ร‹", c38b), _c(U+00CC, "รŒ", c38c), _c(U+00CD, "ร", c38d), _c(U+00CE, "รŽ", c38e), _c(U+00CF, "ร", c38f), _c(U+00D0, "ร", c390), _c(U+00D1, "ร‘", c391), _c(U+00D2, "ร’", c392), _c(U+00D3, "ร“", c393), _c(U+00D4, "ร”", c394), _c(U+00D5, "ร•", c395), _c(U+00D6, "ร–", c396), _c(U+00D7, "ร—", c397), _c(U+00D8, "ร˜", c398), _c(U+00D9, "ร™", c399), _c(U+00DA, "รš", c39a), _c(U+00DB, "ร›", c39b), _c(U+00DC, "รœ", c39c), _c(U+00DD, "ร", c39d), _c(U+00DE, "รž", c39e), _c(U+00DF, "รŸ", c39f), _c(U+00E0, "ร ", c3a0), _c(U+00E1, "รก", c3a1), _c(U+00E2, "รข", c3a2), _c(U+00E3, "รฃ", c3a3), _c(U+00E4, "รค", c3a4), _c(U+00E5, "รฅ", c3a5), _c(U+00E6, "รฆ", c3a6), _c(U+00E7, "รง", c3a7), _c(U+00E8, "รจ", c3a8), _c(U+00E9, "รฉ", c3a9), _c(U+00EA, "รช", c3aa), _c(U+00EB, "รซ", c3ab), _c(U+00EC, "รฌ", c3ac), _c(U+00ED, "รญ", c3ad), _c(U+00EE, "รฎ", c3ae), _c(U+00EF, "รฏ", c3af), _c(U+00F0, "รฐ", c3b0), _c(U+00F1, "รฑ", c3b1), _c(U+00F2, "รฒ", c3b2), _c(U+00F3, "รณ", c3b3), _c(U+00F4, "รด", c3b4), _c(U+00F5, "รต", c3b5), _c(U+00F6, "รถ", c3b6), _c(U+00F7, "รท", c3b7), _c(U+00F8, "รธ", c3b8), _c(U+00F9, "รน", c3b9), _c(U+00FA, "รบ", c3ba), _c(U+00FB, "รป", c3bb), _c(U+00FC, "รผ", c3bc), _c(U+00FD, "รฝ", c3bd), _c(U+00FE, "รพ", c3be), _c(U+00FF, "รฟ", c3bf), _c(U+0100, "ฤ€", c480), _c(U+0101, "ฤ", c481), _c(U+0102, "ฤ‚", c482), _c(U+0103, "ฤƒ", c483), _c(U+0104, "ฤ„", c484), _c(U+0105, "ฤ…", c485), _c(U+0106, "ฤ†", c486), _c(U+0107, "ฤ‡", c487), _c(U+0108, "ฤˆ", c488), _c(U+0109, "ฤ‰", c489), _c(U+010A, "ฤŠ", c48a), _c(U+010B, "ฤ‹", c48b), _c(U+010C, "ฤŒ", c48c), _c(U+010D, "ฤ", c48d), _c(U+010E, "ฤŽ", c48e), _c(U+010F, "ฤ", c48f), _c(U+0110, "ฤ", c490), _c(U+0111, "ฤ‘", c491), _c(U+0112, "ฤ’", c492), _c(U+0113, "ฤ“", c493), _c(U+0114, "ฤ”", c494), _c(U+0115, "ฤ•", c495), _c(U+0116, "ฤ–", c496), _c(U+0117, "ฤ—", c497), _c(U+0118, "ฤ˜", c498), _c(U+0119, "ฤ™", c499), _c(U+011A, "ฤš", c49a), _c(U+011B, "ฤ›", c49b), _c(U+011C, "ฤœ", c49c), _c(U+011D, "ฤ", c49d), _c(U+011E, "ฤž", c49e), _c(U+011F, "ฤŸ", c49f), _c(U+0120, "ฤ ", c4a0), _c(U+0121, "ฤก", c4a1), _c(U+0122, "ฤข", c4a2), _c(U+0123, "ฤฃ", c4a3), _c(U+0124, "ฤค", c4a4), _c(U+0125, "ฤฅ", c4a5), _c(U+0126, "ฤฆ", c4a6), _c(U+0127, "ฤง", c4a7), _c(U+0128, "ฤจ", c4a8), _c(U+0129, "ฤฉ", c4a9), _c(U+012A, "ฤช", c4aa), _c(U+012B, "ฤซ", c4ab), _c(U+012C, "ฤฌ", c4ac), _c(U+012D, "ฤญ", c4ad), _c(U+012E, "ฤฎ", c4ae), _c(U+012F, "ฤฏ", c4af), _c(U+0130, "ฤฐ", c4b0), _c(U+0131, "ฤฑ", c4b1), _c(U+0132, "ฤฒ", c4b2), _c(U+0133, "ฤณ", c4b3), _c(U+0134, "ฤด", c4b4), _c(U+0135, "ฤต", c4b5), _c(U+0136, "ฤถ", c4b6), _c(U+0137, "ฤท", c4b7), _c(U+0138, "ฤธ", c4b8), _c(U+0139, "ฤน", c4b9), _c(U+013A, "ฤบ", c4ba), _c(U+013B, "ฤป", c4bb), _c(U+013C, "ฤผ", c4bc), _c(U+013D, "ฤฝ", c4bd), _c(U+013E, "ฤพ", c4be), _c(U+013F, "ฤฟ", c4bf), _c(U+0140, "ล€", c580), _c(U+0141, "ล", c581), _c(U+0142, "ล‚", c582), _c(U+0143, "ลƒ", c583), _c(U+0144, "ล„", c584), _c(U+0145, "ล…", c585), _c(U+0146, "ล†", c586), _c(U+0147, "ล‡", c587), _c(U+0148, "ลˆ", c588), _c(U+0149, "ล‰", c589), _c(U+014A, "ลŠ", c58a), _c(U+014B, "ล‹", c58b), _c(U+014C, "ลŒ", c58c), _c(U+014D, "ล", c58d), _c(U+014E, "ลŽ", c58e), _c(U+014F, "ล", c58f), _c(U+0150, "ล", c590), _c(U+0151, "ล‘", c591), _c(U+0152, "ล’", c592), _c(U+0153, "ล“", c593), _c(U+0154, "ล”", c594), _c(U+0155, "ล•", c595), _c(U+0156, "ล–", c596), _c(U+0157, "ล—", c597), _c(U+0158, "ล˜", c598), _c(U+0159, "ล™", c599), _c(U+015A, "ลš", c59a), _c(U+015B, "ล›", c59b), _c(U+015C, "ลœ", c59c), _c(U+015D, "ล", c59d), _c(U+015E, "ลž", c59e), _c(U+015F, "ลŸ", c59f), _c(U+0160, "ล ", c5a0), _c(U+0161, "ลก", c5a1), _c(U+0162, "ลข", c5a2), _c(U+0163, "ลฃ", c5a3), _c(U+0164, "ลค", c5a4), _c(U+0165, "ลฅ", c5a5), _c(U+0166, "ลฆ", c5a6), _c(U+0167, "ลง", c5a7), _c(U+0168, "ลจ", c5a8), _c(U+0169, "ลฉ", c5a9), _c(U+016A, "ลช", c5aa), _c(U+016B, "ลซ", c5ab), _c(U+016C, "ลฌ", c5ac), _c(U+016D, "ลญ", c5ad), _c(U+016E, "ลฎ", c5ae), _c(U+016F, "ลฏ", c5af), _c(U+0170, "ลฐ", c5b0), _c(U+0171, "ลฑ", c5b1), _c(U+0172, "ลฒ", c5b2), _c(U+0173, "ลณ", c5b3), _c(U+0174, "ลด", c5b4), _c(U+0175, "ลต", c5b5), _c(U+0176, "ลถ", c5b6), _c(U+0177, "ลท", c5b7), _c(U+0178, "ลธ", c5b8), _c(U+0179, "ลน", c5b9), _c(U+017A, "ลบ", c5ba), _c(U+017B, "ลป", c5bb), _c(U+017C, "ลผ", c5bc), _c(U+017D, "ลฝ", c5bd), _c(U+017E, "ลพ", c5be), _c(U+017F, "ลฟ", c5bf), _c(U+0180, "ฦ€", c680), _c(U+0181, "ฦ", c681), _c(U+0182, "ฦ‚", c682), _c(U+0183, "ฦƒ", c683), _c(U+0184, "ฦ„", c684), _c(U+0185, "ฦ…", c685), _c(U+0186, "ฦ†", c686), _c(U+0187, "ฦ‡", c687), _c(U+0188, "ฦˆ", c688), _c(U+0189, "ฦ‰", c689), _c(U+018A, "ฦŠ", c68a), _c(U+018B, "ฦ‹", c68b), _c(U+018C, "ฦŒ", c68c), _c(U+018D, "ฦ", c68d), _c(U+018E, "ฦŽ", c68e), _c(U+018F, "ฦ", c68f), _c(U+0190, "ฦ", c690), _c(U+0191, "ฦ‘", c691), _c(U+0192, "ฦ’", c692), _c(U+0193, "ฦ“", c693), _c(U+0194, "ฦ”", c694), _c(U+0195, "ฦ•", c695), _c(U+0196, "ฦ–", c696), _c(U+0197, "ฦ—", c697), _c(U+0198, "ฦ˜", c698), _c(U+0199, "ฦ™", c699), _c(U+019A, "ฦš", c69a), _c(U+019B, "ฦ›", c69b), _c(U+019C, "ฦœ", c69c), _c(U+019D, "ฦ", c69d), _c(U+019E, "ฦž", c69e), _c(U+019F, "ฦŸ", c69f), _c(U+01A0, "ฦ ", c6a0), _c(U+01A1, "ฦก", c6a1), _c(U+01A2, "ฦข", c6a2), _c(U+01A3, "ฦฃ", c6a3), _c(U+01A4, "ฦค", c6a4), _c(U+01A5, "ฦฅ", c6a5), _c(U+01A6, "ฦฆ", c6a6), _c(U+01A7, "ฦง", c6a7), _c(U+01A8, "ฦจ", c6a8), _c(U+01A9, "ฦฉ", c6a9), _c(U+01AA, "ฦช", c6aa), _c(U+01AB, "ฦซ", c6ab), _c(U+01AC, "ฦฌ", c6ac), _c(U+01AD, "ฦญ", c6ad), _c(U+01AE, "ฦฎ", c6ae), _c(U+01AF, "ฦฏ", c6af), _c(U+01B0, "ฦฐ", c6b0), _c(U+01B1, "ฦฑ", c6b1), _c(U+01B2, "ฦฒ", c6b2), _c(U+01B3, "ฦณ", c6b3), _c(U+01B4, "ฦด", c6b4), _c(U+01B5, "ฦต", c6b5), _c(U+01B6, "ฦถ", c6b6), _c(U+01B7, "ฦท", c6b7), _c(U+01B8, "ฦธ", c6b8), _c(U+01B9, "ฦน", c6b9), _c(U+01BA, "ฦบ", c6ba), _c(U+01BB, "ฦป", c6bb), _c(U+01BC, "ฦผ", c6bc), _c(U+01BD, "ฦฝ", c6bd), _c(U+01BE, "ฦพ", c6be), _c(U+01BF, "ฦฟ", c6bf), _c(U+01C0, "ว€", c780), _c(U+01C1, "ว", c781), _c(U+01C2, "ว‚", c782), _c(U+01C3, "วƒ", c783), _c(U+01C4, "ว„", c784), _c(U+01C5, "ว…", c785), _c(U+01C6, "ว†", c786), _c(U+01C7, "ว‡", c787), _c(U+01C8, "วˆ", c788), _c(U+01C9, "ว‰", c789), _c(U+01CA, "วŠ", c78a), _c(U+01CB, "ว‹", c78b), _c(U+01CC, "วŒ", c78c), _c(U+01CD, "ว", c78d), _c(U+01CE, "วŽ", c78e), _c(U+01CF, "ว", c78f), _c(U+01D0, "ว", c790), _c(U+01D1, "ว‘", c791), _c(U+01D2, "ว’", c792), _c(U+01D3, "ว“", c793), _c(U+01D4, "ว”", c794), _c(U+01D5, "ว•", c795), _c(U+01D6, "ว–", c796), _c(U+01D7, "ว—", c797), _c(U+01D8, "ว˜", c798), _c(U+01D9, "ว™", c799), _c(U+01DA, "วš", c79a), _c(U+01DB, "ว›", c79b), _c(U+01DC, "วœ", c79c), _c(U+01DD, "ว", c79d), _c(U+01DE, "วž", c79e), _c(U+01DF, "วŸ", c79f), _c(U+01E0, "ว ", c7a0), _c(U+01E1, "วก", c7a1), _c(U+01E2, "วข", c7a2), _c(U+01E3, "วฃ", c7a3), _c(U+01E4, "วค", c7a4), _c(U+01E5, "วฅ", c7a5), _c(U+01E6, "วฆ", c7a6), _c(U+01E7, "วง", c7a7), _c(U+01E8, "วจ", c7a8), _c(U+01E9, "วฉ", c7a9), _c(U+01EA, "วช", c7aa), _c(U+01EB, "วซ", c7ab), _c(U+01EC, "วฌ", c7ac), _c(U+01ED, "วญ", c7ad), _c(U+01EE, "วฎ", c7ae), _c(U+01EF, "วฏ", c7af), _c(U+01F0, "วฐ", c7b0), _c(U+01F1, "วฑ", c7b1), _c(U+01F2, "วฒ", c7b2), _c(U+01F3, "วณ", c7b3), _c(U+01F4, "วด", c7b4), _c(U+01F5, "วต", c7b5), _c(U+01F6, "วถ", c7b6), _c(U+01F7, "วท", c7b7), _c(U+01F8, "วธ", c7b8), _c(U+01F9, "วน", c7b9), _c(U+01FA, "วบ", c7ba), _c(U+01FB, "วป", c7bb), _c(U+01FC, "วผ", c7bc), _c(U+01FD, "วฝ", c7bd), _c(U+01FE, "วพ", c7be), _c(U+01FF, "วฟ", c7bf), _c(U+0200, "ศ€", c880), _c(U+0201, "ศ", c881), _c(U+0202, "ศ‚", c882), _c(U+0203, "ศƒ", c883), _c(U+0204, "ศ„", c884), _c(U+0205, "ศ…", c885), _c(U+0206, "ศ†", c886), _c(U+0207, "ศ‡", c887), _c(U+0208, "ศˆ", c888), _c(U+0209, "ศ‰", c889), _c(U+020A, "ศŠ", c88a), _c(U+020B, "ศ‹", c88b), _c(U+020C, "ศŒ", c88c), _c(U+020D, "ศ", c88d), _c(U+020E, "ศŽ", c88e), _c(U+020F, "ศ", c88f), _c(U+0210, "ศ", c890), _c(U+0211, "ศ‘", c891), _c(U+0212, "ศ’", c892), _c(U+0213, "ศ“", c893), _c(U+0214, "ศ”", c894), _c(U+0215, "ศ•", c895), _c(U+0216, "ศ–", c896), _c(U+0217, "ศ—", c897), _c(U+0218, "ศ˜", c898), _c(U+0219, "ศ™", c899), _c(U+021A, "ศš", c89a), _c(U+021B, "ศ›", c89b), _c(U+021C, "ศœ", c89c), _c(U+021D, "ศ", c89d), _c(U+021E, "ศž", c89e), _c(U+021F, "ศŸ", c89f), _c(U+0220, "ศ ", c8a0), _c(U+0221, "ศก", c8a1), _c(U+0222, "ศข", c8a2), _c(U+0223, "ศฃ", c8a3), _c(U+0224, "ศค", c8a4), _c(U+0225, "ศฅ", c8a5), _c(U+0226, "ศฆ", c8a6), _c(U+0227, "ศง", c8a7), _c(U+0228, "ศจ", c8a8), _c(U+0229, "ศฉ", c8a9), _c(U+022A, "ศช", c8aa), _c(U+022B, "ศซ", c8ab), _c(U+022C, "ศฌ", c8ac), _c(U+022D, "ศญ", c8ad), _c(U+022E, "ศฎ", c8ae), _c(U+022F, "ศฏ", c8af), _c(U+0230, "ศฐ", c8b0), _c(U+0231, "ศฑ", c8b1), _c(U+0232, "ศฒ", c8b2), _c(U+0233, "ศณ", c8b3), _c(U+0234, "ศด", c8b4), _c(U+0235, "ศต", c8b5), _c(U+0236, "ศถ", c8b6), _c(U+0237, "ศท", c8b7), _c(U+0238, "ศธ", c8b8), _c(U+0239, "ศน", c8b9), _c(U+023A, "ศบ", c8ba), _c(U+023B, "ศป", c8bb), _c(U+023C, "ศผ", c8bc), _c(U+023D, "ศฝ", c8bd), _c(U+023E, "ศพ", c8be), _c(U+023F, "ศฟ", c8bf), _c(U+0240, "ษ€", c980), _c(U+0241, "ษ", c981), _c(U+0242, "ษ‚", c982), _c(U+0243, "ษƒ", c983), _c(U+0244, "ษ„", c984), _c(U+0245, "ษ…", c985), _c(U+0246, "ษ†", c986), _c(U+0247, "ษ‡", c987), _c(U+0248, "ษˆ", c988), _c(U+0249, "ษ‰", c989), _c(U+024A, "ษŠ", c98a), _c(U+024B, "ษ‹", c98b), _c(U+024C, "ษŒ", c98c), _c(U+024D, "ษ", c98d), _c(U+024E, "ษŽ", c98e), _c(U+024F, "ษ", c98f), _c(U+0250, "ษ", c990), _c(U+0251, "ษ‘", c991), _c(U+0252, "ษ’", c992), _c(U+0253, "ษ“", c993), _c(U+0254, "ษ”", c994), _c(U+0255, "ษ•", c995), _c(U+0256, "ษ–", c996), _c(U+0257, "ษ—", c997), _c(U+0258, "ษ˜", c998), _c(U+0259, "ษ™", c999), _c(U+025A, "ษš", c99a), _c(U+025B, "ษ›", c99b), _c(U+025C, "ษœ", c99c), _c(U+025D, "ษ", c99d), _c(U+025E, "ษž", c99e), _c(U+025F, "ษŸ", c99f), _c(U+0260, "ษ ", c9a0), _c(U+0261, "ษก", c9a1), _c(U+0262, "ษข", c9a2), _c(U+0263, "ษฃ", c9a3), _c(U+0264, "ษค", c9a4), _c(U+0265, "ษฅ", c9a5), _c(U+0266, "ษฆ", c9a6), _c(U+0267, "ษง", c9a7), _c(U+0268, "ษจ", c9a8), _c(U+0269, "ษฉ", c9a9), _c(U+026A, "ษช", c9aa), _c(U+026B, "ษซ", c9ab), _c(U+026C, "ษฌ", c9ac), _c(U+026D, "ษญ", c9ad), _c(U+026E, "ษฎ", c9ae), _c(U+026F, "ษฏ", c9af), _c(U+0270, "ษฐ", c9b0), _c(U+0271, "ษฑ", c9b1), _c(U+0272, "ษฒ", c9b2), _c(U+0273, "ษณ", c9b3), _c(U+0274, "ษด", c9b4), _c(U+0275, "ษต", c9b5), _c(U+0276, "ษถ", c9b6), _c(U+0277, "ษท", c9b7), _c(U+0278, "ษธ", c9b8), _c(U+0279, "ษน", c9b9), _c(U+027A, "ษบ", c9ba), _c(U+027B, "ษป", c9bb), _c(U+027C, "ษผ", c9bc), _c(U+027D, "ษฝ", c9bd), _c(U+027E, "ษพ", c9be), _c(U+027F, "ษฟ", c9bf), _c(U+0280, "ส€", ca80), _c(U+0281, "ส", ca81), _c(U+0282, "ส‚", ca82), _c(U+0283, "สƒ", ca83), _c(U+0284, "ส„", ca84), _c(U+0285, "ส…", ca85), _c(U+0286, "ส†", ca86), _c(U+0287, "ส‡", ca87), _c(U+0288, "สˆ", ca88), _c(U+0289, "ส‰", ca89), _c(U+028A, "สŠ", ca8a), _c(U+028B, "ส‹", ca8b), _c(U+028C, "สŒ", ca8c), _c(U+028D, "ส", ca8d), _c(U+028E, "สŽ", ca8e), _c(U+028F, "ส", ca8f), _c(U+0290, "ส", ca90), _c(U+0291, "ส‘", ca91), _c(U+0292, "ส’", ca92), _c(U+0293, "ส“", ca93), _c(U+0294, "ส”", ca94), _c(U+0295, "ส•", ca95), _c(U+0296, "ส–", ca96), _c(U+0297, "ส—", ca97), _c(U+0298, "ส˜", ca98), _c(U+0299, "ส™", ca99), _c(U+029A, "สš", ca9a), _c(U+029B, "ส›", ca9b), _c(U+029C, "สœ", ca9c), _c(U+029D, "ส", ca9d), _c(U+029E, "สž", ca9e), _c(U+029F, "สŸ", ca9f), _c(U+02A0, "ส ", caa0), _c(U+02A1, "สก", caa1), _c(U+02A2, "สข", caa2), _c(U+02A3, "สฃ", caa3), _c(U+02A4, "สค", caa4), _c(U+02A5, "สฅ", caa5), _c(U+02A6, "สฆ", caa6), _c(U+02A7, "สง", caa7), _c(U+02A8, "สจ", caa8), _c(U+02A9, "สฉ", caa9), _c(U+02AA, "สช", caaa), _c(U+02AB, "สซ", caab), _c(U+02AC, "สฌ", caac), _c(U+02AD, "สญ", caad), _c(U+02AE, "สฎ", caae), _c(U+02AF, "สฏ", caaf), _c(U+02B0, "สฐ", cab0), _c(U+02B1, "สฑ", cab1), _c(U+02B2, "สฒ", cab2), _c(U+02B3, "สณ", cab3), _c(U+02B4, "สด", cab4), _c(U+02B5, "สต", cab5), _c(U+02B6, "สถ", cab6), _c(U+02B7, "สท", cab7), _c(U+02B8, "สธ", cab8), _c(U+02B9, "สน", cab9), _c(U+02BA, "สบ", caba), _c(U+02BB, "สป", cabb), _c(U+02BC, "สผ", cabc), _c(U+02BD, "สฝ", cabd), _c(U+02BE, "สพ", cabe), _c(U+02BF, "สฟ", cabf), _c(U+02C0, "ห€", cb80), _c(U+02C1, "ห", cb81), _c(U+02C2, "ห‚", cb82), _c(U+02C3, "หƒ", cb83), _c(U+02C4, "ห„", cb84), _c(U+02C5, "ห…", cb85), _c(U+02C6, "ห†", cb86), _c(U+02C7, "ห‡", cb87), _c(U+02C8, "หˆ", cb88), _c(U+02C9, "ห‰", cb89), _c(U+02CA, "หŠ", cb8a), _c(U+02CB, "ห‹", cb8b), _c(U+02CC, "หŒ", cb8c), _c(U+02CD, "ห", cb8d), _c(U+02CE, "หŽ", cb8e), _c(U+02CF, "ห", cb8f), _c(U+02D0, "ห", cb90), _c(U+02D1, "ห‘", cb91), _c(U+02D2, "ห’", cb92), _c(U+02D3, "ห“", cb93), _c(U+02D4, "ห”", cb94), _c(U+02D5, "ห•", cb95), _c(U+02D6, "ห–", cb96), _c(U+02D7, "ห—", cb97), _c(U+02D8, "ห˜", cb98), _c(U+02D9, "ห™", cb99), _c(U+02DA, "หš", cb9a), _c(U+02DB, "ห›", cb9b), _c(U+02DC, "หœ", cb9c), _c(U+02DD, "ห", cb9d), _c(U+02DE, "หž", cb9e), _c(U+02DF, "หŸ", cb9f), _c(U+02E0, "ห ", cba0), _c(U+02E1, "หก", cba1), _c(U+02E2, "หข", cba2), _c(U+02E3, "หฃ", cba3), _c(U+02E4, "หค", cba4), _c(U+02E5, "หฅ", cba5), _c(U+02E6, "หฆ", cba6), _c(U+02E7, "หง", cba7), _c(U+02E8, "หจ", cba8), _c(U+02E9, "หฉ", cba9), _c(U+02EA, "หช", cbaa), _c(U+02EB, "หซ", cbab), _c(U+02EC, "หฌ", cbac), _c(U+02ED, "หญ", cbad), _c(U+02EE, "หฎ", cbae), _c(U+02EF, "หฏ", cbaf), _c(U+02F0, "หฐ", cbb0), _c(U+02F1, "หฑ", cbb1), _c(U+02F2, "หฒ", cbb2), _c(U+02F3, "หณ", cbb3), _c(U+02F4, "หด", cbb4), _c(U+02F5, "หต", cbb5), _c(U+02F6, "หถ", cbb6), _c(U+02F7, "หท", cbb7), _c(U+02F8, "หธ", cbb8), _c(U+02F9, "หน", cbb9), _c(U+02FA, "หบ", cbba), _c(U+02FB, "หป", cbbb), _c(U+02FC, "หผ", cbbc), _c(U+02FD, "หฝ", cbbd), _c(U+02FE, "หพ", cbbe), //_c(U+02FF, "หฟ", cbbf), //_c(U+0300, ฬ€"ฬ€ ", cc80), //_c(U+0301, ฬ" ", cc81), //_c(U+0302, ฬ‚" ", cc82), //_c(U+0303, ฬƒ" ", cc83), //_c(U+0304, ฬ„" ", cc84), //_c(U+0305, "ฬ…" , cc85), //_c(U+0306, ฬ†" ", cc86), //_c(U+0307, ฬ‡" ", cc87), //_c(U+0308, ฬˆ" ", cc88), //_c(U+0309, ฬ‰" ", cc89), //_c(U+030A, ฬŠ" ", cc8a), //_c(U+030B, ฬ‹" ", cc8b), //_c(U+030C, ฬŒ" ", cc8c), //_c(U+030D, "ฬ" , cc8d), //_c(U+030E, "ฬŽ" , cc8e), //_c(U+030F, ฬ" ", cc8f), //_c(U+0310, "ฬ" , cc90), //_c(U+0311, ฬ‘" ", cc91), //_c(U+0312, ฬ’" ", cc92), //_c(U+0313, "ฬ“" , cc93), //_c(U+0314, "ฬ”" , cc94), //_c(U+0315, "ฬ•" , cc95), //_c(U+0316, "ฬ–" , cc96), //_c(U+0317, "ฬ—" , cc97), //_c(U+0318, "ฬ˜" , cc98), //_c(U+0319, "ฬ™" , cc99), //_c(U+031A, "ฬš" , cc9a), //_c(U+031B, ฬ›" ", cc9b), //_c(U+031C, "ฬœ" , cc9c), //_c(U+031D, "ฬ" , cc9d), //_c(U+031E, "ฬž" , cc9e), _c(U+031F, "ฬŸ" , cc9f), _c(U+0320, "ฬ " , cca0), _c(U+0321, "ฬก" , cca1), _c(U+0322, "ฬข" , cca2), //_c(U+0323, ฬฃ" ", cca3), //_c(U+0324, ฬค" ", cca4), _c(U+0325, "ฬฅ" , cca5), //_c(U+0326, ฬฆ" ", cca6), //_c(U+0327, ฬง" ", cca7), //_c(U+0328, ฬจ" ", cca8), //_c(U+0329, "ฬฉ" , cca9), _c(U+032A, "ฬช" , ccaa), _c(U+032B, "ฬซ" , ccab), _c(U+032C, "ฬฌ" , ccac), _c(U+032D, "ฬญ" , ccad), //_c(U+032E, ฬฎ" ", ccae), _c(U+032F, "ฬฏ" , ccaf), _c(U+0330, "ฬฐ" , ccb0), //_c(U+0331, ฬฑ" ", ccb1), _c(U+0332, "ฬฒ" , ccb2), _c(U+0333, "ฬณ" , ccb3), _c(U+0334, "ฬด" , ccb4), //_c(U+0335, ฬต" ", ccb5), //_c(U+0336, ฬถ" ", ccb6), _c(U+0337, "ฬท" , ccb7), _c(U+0338, "ฬธ" , ccb8), _c(U+0339, "ฬน" , ccb9), _c(U+033A, "ฬบ" , ccba), _c(U+033B, "ฬป" , ccbb), _c(U+033C, "ฬผ" , ccbc), _c(U+033D, "ฬฝ" , ccbd), _c(U+033E, "ฬพ" , ccbe), _c(U+033F, "ฬฟ" , ccbf), _c(U+0340, "อ€" , cd80), _c(U+0341, "อ" , cd81), _c(U+0342, "อ‚" , cd82), _c(U+0343, "อƒ" , cd83), _c(U+0344, "อ„" , cd84), _c(U+0345, "อ…" , cd85), _c(U+0346, "อ†" , cd86), _c(U+0347, "อ‡" , cd87), _c(U+0348, "อˆ" , cd88), _c(U+0349, "อ‰" , cd89), _c(U+034A, "อŠ" , cd8a), _c(U+034B, "อ‹" , cd8b), _c(U+034C, "อŒ" , cd8c), _c(U+034D, "อ" , cd8d), _c(U+034E, "อŽ" , cd8e), _c(U+034F, "อ" , cd8f), _c(U+0350, "อ" , cd90), _c(U+0351, "อ‘" , cd91), _c(U+0352, "อ’" , cd92), _c(U+0353, "อ“" , cd93), _c(U+0354, "อ”" , cd94), _c(U+0355, "อ•" , cd95), _c(U+0356, "อ–" , cd96), _c(U+0357, "อ—" , cd97), _c(U+0358, "อ˜" , cd98), _c(U+0359, "อ™" , cd99), _c(U+035A, "อš" , cd9a), _c(U+035B, "อ›" , cd9b), _c(U+035C, "อœ" , cd9c), _c(U+035D, "อ" , cd9d), _c(U+035E, "อž" , cd9e), _c(U+035F, "อŸ" , cd9f), _c(U+0360, "อ " , cda0), _c(U+0361, "อก" , cda1), _c(U+0362, "อข" , cda2), _c(U+0363, "อฃ" , cda3), _c(U+0364, "อค" , cda4), _c(U+0365, "อฅ" , cda5), _c(U+0366, "อฆ" , cda6), _c(U+0367, "อง" , cda7), _c(U+0368, "อจ" , cda8), _c(U+0369, "อฉ" , cda9), _c(U+036A, "อช" , cdaa), _c(U+036B, "อซ" , cdab), _c(U+036C, "อฌ" , cdac), _c(U+036D, "อญ" , cdad), _c(U+036E, "อฎ" , cdae), _c(U+036F, "อฏ" , cdaf), _c(U+0370, "อฐ", cdb0), _c(U+0371, "อฑ", cdb1), _c(U+0372, "อฒ", cdb2), _c(U+0373, "อณ", cdb3), _c(U+0374, "อด", cdb4), _c(U+0375, "อต", cdb5), _c(U+0376, "อถ", cdb6), _c(U+0377, "อท", cdb7), _c(U+0378, "อธ", cdb8), _c(U+0379, "อน", cdb9), _c(U+037A, "อบ", cdba), _c(U+037B, "อป", cdbb), _c(U+037C, "อผ", cdbc), _c(U+037D, "อฝ", cdbd), _c(U+037E, "อพ", cdbe), _c(U+037F, "อฟ", cdbf), _c(U+0380, "ฮ€", ce80), _c(U+0381, "ฮ", ce81), _c(U+0382, "ฮ‚", ce82), _c(U+0383, "ฮƒ", ce83), _c(U+0384, "ฮ„", ce84), _c(U+0385, "ฮ…", ce85), _c(U+0386, "ฮ†", ce86), _c(U+0387, "ฮ‡", ce87), _c(U+0388, "ฮˆ", ce88), _c(U+0389, "ฮ‰", ce89), _c(U+038A, "ฮŠ", ce8a), _c(U+038B, "ฮ‹", ce8b), _c(U+038C, "ฮŒ", ce8c), _c(U+038D, "ฮ", ce8d), _c(U+038E, "ฮŽ", ce8e), _c(U+038F, "ฮ", ce8f), _c(U+0390, "ฮ", ce90), _c(U+0391, "ฮ‘", ce91), _c(U+0392, "ฮ’", ce92), _c(U+0393, "ฮ“", ce93), _c(U+0394, "ฮ”", ce94), _c(U+0395, "ฮ•", ce95), _c(U+0396, "ฮ–", ce96), _c(U+0397, "ฮ—", ce97), _c(U+0398, "ฮ˜", ce98), _c(U+0399, "ฮ™", ce99), _c(U+039A, "ฮš", ce9a), _c(U+039B, "ฮ›", ce9b), _c(U+039C, "ฮœ", ce9c), _c(U+039D, "ฮ", ce9d), _c(U+039E, "ฮž", ce9e), _c(U+039F, "ฮŸ", ce9f), _c(U+03A0, "ฮ ", cea0), _c(U+03A1, "ฮก", cea1), _c(U+03A2, "ฮข", cea2), _c(U+03A3, "ฮฃ", cea3), _c(U+03A4, "ฮค", cea4), _c(U+03A5, "ฮฅ", cea5), _c(U+03A6, "ฮฆ", cea6), _c(U+03A7, "ฮง", cea7), _c(U+03A8, "ฮจ", cea8), _c(U+03A9, "ฮฉ", cea9), _c(U+03AA, "ฮช", ceaa), _c(U+03AB, "ฮซ", ceab), _c(U+03AC, "ฮฌ", ceac), _c(U+03AD, "ฮญ", cead), _c(U+03AE, "ฮฎ", ceae), _c(U+03AF, "ฮฏ", ceaf), _c(U+03B0, "ฮฐ", ceb0), _c(U+03B1, "ฮฑ", ceb1), _c(U+03B2, "ฮฒ", ceb2), _c(U+03B3, "ฮณ", ceb3), _c(U+03B4, "ฮด", ceb4), _c(U+03B5, "ฮต", ceb5), _c(U+03B6, "ฮถ", ceb6), _c(U+03B7, "ฮท", ceb7), _c(U+03B8, "ฮธ", ceb8), _c(U+03B9, "ฮน", ceb9), _c(U+03BA, "ฮบ", ceba), _c(U+03BB, "ฮป", cebb), _c(U+03BC, "ฮผ", cebc), _c(U+03BD, "ฮฝ", cebd), _c(U+03BE, "ฮพ", cebe), _c(U+03BF, "ฮฟ", cebf), _c(U+03C0, "ฯ€", cf80), _c(U+03C1, "ฯ", cf81), _c(U+03C2, "ฯ‚", cf82), _c(U+03C3, "ฯƒ", cf83), _c(U+03C4, "ฯ„", cf84), _c(U+03C5, "ฯ…", cf85), _c(U+03C6, "ฯ†", cf86), _c(U+03C7, "ฯ‡", cf87), _c(U+03C8, "ฯˆ", cf88), _c(U+03C9, "ฯ‰", cf89), _c(U+03CA, "ฯŠ", cf8a), _c(U+03CB, "ฯ‹", cf8b), _c(U+03CC, "ฯŒ", cf8c), _c(U+03CD, "ฯ", cf8d), _c(U+03CE, "ฯŽ", cf8e), _c(U+03CF, "ฯ", cf8f), _c(U+03D0, "ฯ", cf90), _c(U+03D1, "ฯ‘", cf91), _c(U+03D2, "ฯ’", cf92), _c(U+03D3, "ฯ“", cf93), _c(U+03D4, "ฯ”", cf94), _c(U+03D5, "ฯ•", cf95), _c(U+03D6, "ฯ–", cf96), _c(U+03D7, "ฯ—", cf97), _c(U+03D8, "ฯ˜", cf98), _c(U+03D9, "ฯ™", cf99), _c(U+03DA, "ฯš", cf9a), _c(U+03DB, "ฯ›", cf9b), _c(U+03DC, "ฯœ", cf9c), _c(U+03DD, "ฯ", cf9d), _c(U+03DE, "ฯž", cf9e), _c(U+03DF, "ฯŸ", cf9f), _c(U+03E0, "ฯ ", cfa0), _c(U+03E1, "ฯก", cfa1), _c(U+03E2, "ฯข", cfa2), _c(U+03E3, "ฯฃ", cfa3), _c(U+03E4, "ฯค", cfa4), _c(U+03E5, "ฯฅ", cfa5), _c(U+03E6, "ฯฆ", cfa6), _c(U+03E7, "ฯง", cfa7), _c(U+03E8, "ฯจ", cfa8), _c(U+03E9, "ฯฉ", cfa9), _c(U+03EA, "ฯช", cfaa), _c(U+03EB, "ฯซ", cfab), _c(U+03EC, "ฯฌ", cfac), _c(U+03ED, "ฯญ", cfad), _c(U+03EE, "ฯฎ", cfae), _c(U+03EF, "ฯฏ", cfaf), _c(U+03F0, "ฯฐ", cfb0), _c(U+03F1, "ฯฑ", cfb1), _c(U+03F2, "ฯฒ", cfb2), _c(U+03F3, "ฯณ", cfb3), _c(U+03F4, "ฯด", cfb4), _c(U+03F5, "ฯต", cfb5), _c(U+03F6, "ฯถ", cfb6), _c(U+03F7, "ฯท", cfb7), _c(U+03F8, "ฯธ", cfb8), _c(U+03F9, "ฯน", cfb9), _c(U+03FA, "ฯบ", cfba), _c(U+03FB, "ฯป", cfbb), _c(U+03FC, "ฯผ", cfbc), _c(U+03FD, "ฯฝ", cfbd), _c(U+03FE, "ฯพ", cfbe), _c(U+03FF, "ฯฟ", cfbf), _c(U+0400, "ะ€", d080), _c(U+0401, "ะ", d081), _c(U+0402, "ะ‚", d082), _c(U+0403, "ะƒ", d083), _c(U+0404, "ะ„", d084), _c(U+0405, "ะ…", d085), _c(U+0406, "ะ†", d086), _c(U+0407, "ะ‡", d087), _c(U+0408, "ะˆ", d088), _c(U+0409, "ะ‰", d089), _c(U+040A, "ะŠ", d08a), _c(U+040B, "ะ‹", d08b), _c(U+040C, "ะŒ", d08c), _c(U+040D, "ะ", d08d), _c(U+040E, "ะŽ", d08e), _c(U+040F, "ะ", d08f), _c(U+0410, "ะ", d090), _c(U+0411, "ะ‘", d091), _c(U+0412, "ะ’", d092), _c(U+0413, "ะ“", d093), _c(U+0414, "ะ”", d094), _c(U+0415, "ะ•", d095), _c(U+0416, "ะ–", d096), _c(U+0417, "ะ—", d097), _c(U+0418, "ะ˜", d098), _c(U+0419, "ะ™", d099), _c(U+041A, "ะš", d09a), _c(U+041B, "ะ›", d09b), _c(U+041C, "ะœ", d09c), _c(U+041D, "ะ", d09d), _c(U+041E, "ะž", d09e), _c(U+041F, "ะŸ", d09f), _c(U+0420, "ะ ", d0a0), _c(U+0421, "ะก", d0a1), _c(U+0422, "ะข", d0a2), _c(U+0423, "ะฃ", d0a3), _c(U+0424, "ะค", d0a4), _c(U+0425, "ะฅ", d0a5), _c(U+0426, "ะฆ", d0a6), _c(U+0427, "ะง", d0a7), _c(U+0428, "ะจ", d0a8), _c(U+0429, "ะฉ", d0a9), _c(U+042A, "ะช", d0aa), _c(U+042B, "ะซ", d0ab), _c(U+042C, "ะฌ", d0ac), _c(U+042D, "ะญ", d0ad), _c(U+042E, "ะฎ", d0ae), _c(U+042F, "ะฏ", d0af), _c(U+0430, "ะฐ", d0b0), _c(U+0431, "ะฑ", d0b1), _c(U+0432, "ะฒ", d0b2), _c(U+0433, "ะณ", d0b3), _c(U+0434, "ะด", d0b4), _c(U+0435, "ะต", d0b5), _c(U+0436, "ะถ", d0b6), _c(U+0437, "ะท", d0b7), _c(U+0438, "ะธ", d0b8), _c(U+0439, "ะน", d0b9), _c(U+043A, "ะบ", d0ba), _c(U+043B, "ะป", d0bb), _c(U+043C, "ะผ", d0bc), _c(U+043D, "ะฝ", d0bd), _c(U+043E, "ะพ", d0be), _c(U+043F, "ะฟ", d0bf), _c(U+0440, "ั€", d180), _c(U+0441, "ั", d181), _c(U+0442, "ั‚", d182), _c(U+0443, "ัƒ", d183), _c(U+0444, "ั„", d184), _c(U+0445, "ั…", d185), _c(U+0446, "ั†", d186), _c(U+0447, "ั‡", d187), _c(U+0448, "ัˆ", d188), _c(U+0449, "ั‰", d189), _c(U+044A, "ัŠ", d18a), _c(U+044B, "ั‹", d18b), _c(U+044C, "ัŒ", d18c), _c(U+044D, "ั", d18d), _c(U+044E, "ัŽ", d18e), _c(U+044F, "ั", d18f), _c(U+0450, "ั", d190), _c(U+0451, "ั‘", d191), _c(U+0452, "ั’", d192), _c(U+0453, "ั“", d193), _c(U+0454, "ั”", d194), _c(U+0455, "ั•", d195), _c(U+0456, "ั–", d196), _c(U+0457, "ั—", d197), _c(U+0458, "ั˜", d198), _c(U+0459, "ั™", d199), _c(U+045A, "ัš", d19a), _c(U+045B, "ั›", d19b), _c(U+045C, "ัœ", d19c), _c(U+045D, "ั", d19d), _c(U+045E, "ัž", d19e), _c(U+045F, "ัŸ", d19f), _c(U+0460, "ั ", d1a0), _c(U+0461, "ัก", d1a1), _c(U+0462, "ัข", d1a2), _c(U+0463, "ัฃ", d1a3), _c(U+0464, "ัค", d1a4), _c(U+0465, "ัฅ", d1a5), _c(U+0466, "ัฆ", d1a6), _c(U+0467, "ัง", d1a7), _c(U+0468, "ัจ", d1a8), _c(U+0469, "ัฉ", d1a9), _c(U+046A, "ัช", d1aa), _c(U+046B, "ัซ", d1ab), _c(U+046C, "ัฌ", d1ac), _c(U+046D, "ัญ", d1ad), _c(U+046E, "ัฎ", d1ae), _c(U+046F, "ัฏ", d1af), _c(U+0470, "ัฐ", d1b0), _c(U+0471, "ัฑ", d1b1), _c(U+0472, "ัฒ", d1b2), _c(U+0473, "ัณ", d1b3), _c(U+0474, "ัด", d1b4), _c(U+0475, "ัต", d1b5), _c(U+0476, "ัถ", d1b6), _c(U+0477, "ัท", d1b7), _c(U+0478, "ัธ", d1b8), _c(U+0479, "ัน", d1b9), _c(U+047A, "ับ", d1ba), _c(U+047B, "ัป", d1bb), _c(U+047C, "ัผ", d1bc), _c(U+047D, "ัฝ", d1bd), _c(U+047E, "ัพ", d1be), _c(U+047F, "ัฟ", d1bf), _c(U+20A0, "โ‚ ", e282a0), _c(U+20A1, "โ‚ก", e282a1), _c(U+20A2, "โ‚ข", e282a2), _c(U+20A3, "โ‚ฃ", e282a3), _c(U+20A4, "โ‚ค", e282a4), _c(U+20A5, "โ‚ฅ", e282a5), _c(U+20A6, "โ‚ฆ", e282a6), _c(U+20A7, "โ‚ง", e282a7), _c(U+20A8, "โ‚จ", e282a8), _c(U+20A9, "โ‚ฉ", e282a9), _c(U+20AA, "โ‚ช", e282aa), _c(U+20AB, "โ‚ซ", e282ab), _c(U+20AC, "โ‚ฌ", e282ac), _c(U+20AD, "โ‚ญ", e282ad), _c(U+20AE, "โ‚ฎ", e282ae), _c(U+20AF, "โ‚ฏ", e282af), _c(U+20B0, "โ‚ฐ", e282b0), _c(U+20B1, "โ‚ฑ", e282b1), _c(U+20B2, "โ‚ฒ", e282b2), _c(U+20B3, "โ‚ณ", e282b3), _c(U+20B4, "โ‚ด", e282b4), _c(U+20B5, "โ‚ต", e282b5), _c(U+20B6, "โ‚ถ", e282b6), _c(U+20B7, "โ‚ท", e282b7), _c(U+20B8, "โ‚ธ", e282b8), _c(U+20B9, "โ‚น", e282b9), _c(U+20BA, "โ‚บ", e282ba), _c(U+20BB, "โ‚ป", e282bb), _c(U+20BC, "โ‚ผ", e282bc), _c(U+20BD, "โ‚ฝ", e282bd), _c(U+20BE, "โ‚พ", e282be), _c(U+20BF, "โ‚ฟ", e282bf), _c(U+20C0, "โƒ€", e28380), _c(U+20C1, "โƒ", e28381), _c(U+20C2, "โƒ‚", e28382), _c(U+20C3, "โƒƒ", e28383), _c(U+20C4, "โƒ„", e28384), _c(U+20C5, "โƒ…", e28385), _c(U+20C6, "โƒ†", e28386), _c(U+20C7, "โƒ‡", e28387), _c(U+20C8, "โƒˆ", e28388), _c(U+20C9, "โƒ‰", e28389), _c(U+20CA, "โƒŠ", e2838a), _c(U+20CB, "โƒ‹", e2838b), _c(U+20CC, "โƒŒ", e2838c), _c(U+20CD, "โƒ", e2838d), _c(U+20CE, "โƒŽ", e2838e), _c(U+20CF, "โƒ", e2838f), _c(U+20D0, "โƒ", e28390), _c(U+20D1, "โƒ‘", e28391), _c(U+20D2, "โƒ’", e28392), _c(U+20D3, "โƒ“", e28393), _c(U+20D4, "โƒ”", e28394), _c(U+20D5, "โƒ•", e28395), _c(U+20D6, "โƒ–", e28396), _c(U+20D7, "โƒ—", e28397), _c(U+20D8, "โƒ˜", e28398), _c(U+20D9, "โƒ™", e28399), _c(U+20DA, "โƒš", e2839a), _c(U+20DB, "โƒ›", e2839b), _c(U+20DC, "โƒœ", e2839c), _c(U+20DD, "โƒ", e2839d), _c(U+20DE, "โƒž", e2839e), _c(U+20DF, "โƒŸ", e2839f), _c(U+20E0, "โƒ ", e283a0), _c(U+20E1, "โƒก", e283a1), _c(U+20E2, "โƒข", e283a2), _c(U+20E3, "โƒฃ", e283a3), _c(U+20E4, "โƒค", e283a4), _c(U+20E5, "โƒฅ", e283a5), _c(U+20E6, "โƒฆ", e283a6), _c(U+20E7, "โƒง", e283a7), _c(U+20E8, "โƒจ", e283a8), _c(U+20E9, "โƒฉ", e283a9), _c(U+20EA, "โƒช", e283aa), _c(U+20EB, "โƒซ", e283ab), _c(U+20EC, "โƒฌ", e283ac), _c(U+20ED, "โƒญ", e283ad), _c(U+20EE, "โƒฎ", e283ae), _c(U+20EF, "โƒฏ", e283af), _c(U+20F0, "โƒฐ", e283b0), _c(U+20F1, "โƒฑ", e283b1), _c(U+20F2, "โƒฒ", e283b2), _c(U+20F3, "โƒณ", e283b3), _c(U+20F4, "โƒด", e283b4), _c(U+20F5, "โƒต", e283b5), _c(U+20F6, "โƒถ", e283b6), _c(U+20F7, "โƒท", e283b7), _c(U+20F8, "โƒธ", e283b8), _c(U+20F9, "โƒน", e283b9), _c(U+20FA, "โƒบ", e283ba), _c(U+20FB, "โƒป", e283bb), _c(U+20FC, "โƒผ", e283bc), _c(U+20FD, "โƒฝ", e283bd), _c(U+20FE, "โƒพ", e283be), _c(U+20FF, "โƒฟ", e283bf), _c(U+2100, "โ„€", e28480), _c(U+2101, "โ„", e28481), _c(U+2102, "โ„‚", e28482), _c(U+2103, "โ„ƒ", e28483), _c(U+2104, "โ„„", e28484), _c(U+2105, "โ„…", e28485), _c(U+2106, "โ„†", e28486), _c(U+2107, "โ„‡", e28487), _c(U+2108, "โ„ˆ", e28488), _c(U+2109, "โ„‰", e28489), _c(U+210A, "โ„Š", e2848a), _c(U+210B, "โ„‹", e2848b), _c(U+210C, "โ„Œ", e2848c), _c(U+210D, "โ„", e2848d), _c(U+210E, "โ„Ž", e2848e), _c(U+210F, "โ„", e2848f), _c(U+2110, "โ„", e28490), _c(U+2111, "โ„‘", e28491), _c(U+2112, "โ„’", e28492), _c(U+2113, "โ„“", e28493), _c(U+2114, "โ„”", e28494), _c(U+2115, "โ„•", e28495), _c(U+2116, "โ„–", e28496), _c(U+2117, "โ„—", e28497), _c(U+2118, "โ„˜", e28498), _c(U+2119, "โ„™", e28499), _c(U+211A, "โ„š", e2849a), _c(U+211B, "โ„›", e2849b), _c(U+211C, "โ„œ", e2849c), _c(U+211D, "โ„", e2849d), _c(U+211E, "โ„ž", e2849e), _c(U+211F, "โ„Ÿ", e2849f), _c(U+2120, "โ„ ", e284a0), _c(U+2121, "โ„ก", e284a1), _c(U+2122, "โ„ข", e284a2), _c(U+2123, "โ„ฃ", e284a3), _c(U+2124, "โ„ค", e284a4), _c(U+2125, "โ„ฅ", e284a5), _c(U+2126, "โ„ฆ", e284a6), _c(U+2127, "โ„ง", e284a7), _c(U+2128, "โ„จ", e284a8), _c(U+2129, "โ„ฉ", e284a9), _c(U+212A, "โ„ช", e284aa), _c(U+212B, "โ„ซ", e284ab), _c(U+212C, "โ„ฌ", e284ac), _c(U+212D, "โ„ญ", e284ad), _c(U+212E, "โ„ฎ", e284ae), _c(U+212F, "โ„ฏ", e284af), _c(U+2130, "โ„ฐ", e284b0), _c(U+2131, "โ„ฑ", e284b1), _c(U+2132, "โ„ฒ", e284b2), _c(U+2133, "โ„ณ", e284b3), _c(U+2134, "โ„ด", e284b4), _c(U+2135, "โ„ต", e284b5), _c(U+2136, "โ„ถ", e284b6), _c(U+2137, "โ„ท", e284b7), _c(U+2138, "โ„ธ", e284b8), _c(U+2139, "โ„น", e284b9), _c(U+213A, "โ„บ", e284ba), _c(U+213B, "โ„ป", e284bb), _c(U+213C, "โ„ผ", e284bc), _c(U+213D, "โ„ฝ", e284bd), _c(U+213E, "โ„พ", e284be), _c(U+213F, "โ„ฟ", e284bf), _c(U+2140, "โ…€", e28580), _c(U+2141, "โ…", e28581), _c(U+2142, "โ…‚", e28582), _c(U+2143, "โ…ƒ", e28583), _c(U+2144, "โ…„", e28584), _c(U+2145, "โ……", e28585), _c(U+2146, "โ…†", e28586), _c(U+2147, "โ…‡", e28587), _c(U+2148, "โ…ˆ", e28588), _c(U+2149, "โ…‰", e28589), _c(U+214A, "โ…Š", e2858a), _c(U+214B, "โ…‹", e2858b), _c(U+214C, "โ…Œ", e2858c), _c(U+214D, "โ…", e2858d), _c(U+214E, "โ…Ž", e2858e), _c(U+214F, "โ…", e2858f), _c(U+2150, "โ…", e28590), _c(U+2151, "โ…‘", e28591), _c(U+2152, "โ…’", e28592), _c(U+2153, "โ…“", e28593), _c(U+2154, "โ…”", e28594), _c(U+2155, "โ…•", e28595), _c(U+2156, "โ…–", e28596), _c(U+2157, "โ…—", e28597), _c(U+2158, "โ…˜", e28598), _c(U+2159, "โ…™", e28599), _c(U+215A, "โ…š", e2859a), _c(U+215B, "โ…›", e2859b), _c(U+215C, "โ…œ", e2859c), _c(U+215D, "โ…", e2859d), _c(U+215E, "โ…ž", e2859e), _c(U+215F, "โ…Ÿ", e2859f), _c(U+2160, "โ… ", e285a0), _c(U+2161, "โ…ก", e285a1), _c(U+2162, "โ…ข", e285a2), _c(U+2163, "โ…ฃ", e285a3), _c(U+2164, "โ…ค", e285a4), _c(U+2165, "โ…ฅ", e285a5), _c(U+2166, "โ…ฆ", e285a6), _c(U+2167, "โ…ง", e285a7), _c(U+2168, "โ…จ", e285a8), _c(U+2169, "โ…ฉ", e285a9), _c(U+216A, "โ…ช", e285aa), _c(U+216B, "โ…ซ", e285ab), _c(U+216C, "โ…ฌ", e285ac), _c(U+216D, "โ…ญ", e285ad), _c(U+216E, "โ…ฎ", e285ae), _c(U+216F, "โ…ฏ", e285af), _c(U+2170, "โ…ฐ", e285b0), _c(U+2171, "โ…ฑ", e285b1), _c(U+2172, "โ…ฒ", e285b2), _c(U+2173, "โ…ณ", e285b3), _c(U+2174, "โ…ด", e285b4), _c(U+2175, "โ…ต", e285b5), _c(U+2176, "โ…ถ", e285b6), _c(U+2177, "โ…ท", e285b7), _c(U+2178, "โ…ธ", e285b8), _c(U+2179, "โ…น", e285b9), _c(U+217A, "โ…บ", e285ba), _c(U+217B, "โ…ป", e285bb), _c(U+217C, "โ…ผ", e285bc), _c(U+217D, "โ…ฝ", e285bd), _c(U+217E, "โ…พ", e285be), _c(U+217F, "โ…ฟ", e285bf), _c(U+2180, "โ†€", e28680), _c(U+2181, "โ†", e28681), _c(U+2182, "โ†‚", e28682), _c(U+2183, "โ†ƒ", e28683), _c(U+2184, "โ†„", e28684), _c(U+2185, "โ†…", e28685), _c(U+2186, "โ††", e28686), _c(U+2187, "โ†‡", e28687), _c(U+2188, "โ†ˆ", e28688), _c(U+2189, "โ†‰", e28689), _c(U+218A, "โ†Š", e2868a), _c(U+218B, "โ†‹", e2868b), _c(U+218C, "โ†Œ", e2868c), _c(U+218D, "โ†", e2868d), _c(U+218E, "โ†Ž", e2868e), _c(U+218F, "โ†", e2868f), _c(U+2190, "โ†", e28690), _c(U+2191, "โ†‘", e28691), _c(U+2192, "โ†’", e28692), _c(U+2193, "โ†“", e28693), _c(U+2194, "โ†”", e28694), _c(U+2195, "โ†•", e28695), _c(U+2196, "โ†–", e28696), _c(U+2197, "โ†—", e28697), _c(U+2198, "โ†˜", e28698), _c(U+2199, "โ†™", e28699), _c(U+219A, "โ†š", e2869a), _c(U+219B, "โ†›", e2869b), _c(U+219C, "โ†œ", e2869c), _c(U+219D, "โ†", e2869d), _c(U+219E, "โ†ž", e2869e), _c(U+219F, "โ†Ÿ", e2869f), _c(U+21A0, "โ† ", e286a0), _c(U+21A1, "โ†ก", e286a1), _c(U+21A2, "โ†ข", e286a2), _c(U+21A3, "โ†ฃ", e286a3), _c(U+21A4, "โ†ค", e286a4), _c(U+21A5, "โ†ฅ", e286a5), _c(U+21A6, "โ†ฆ", e286a6), _c(U+21A7, "โ†ง", e286a7), _c(U+21A8, "โ†จ", e286a8), _c(U+21A9, "โ†ฉ", e286a9), _c(U+21AA, "โ†ช", e286aa), _c(U+21AB, "โ†ซ", e286ab), _c(U+21AC, "โ†ฌ", e286ac), _c(U+21AD, "โ†ญ", e286ad), _c(U+21AE, "โ†ฎ", e286ae), _c(U+21AF, "โ†ฏ", e286af), _c(U+21B0, "โ†ฐ", e286b0), _c(U+21B1, "โ†ฑ", e286b1), _c(U+21B2, "โ†ฒ", e286b2), _c(U+21B3, "โ†ณ", e286b3), _c(U+21B4, "โ†ด", e286b4), _c(U+21B5, "โ†ต", e286b5), _c(U+21B6, "โ†ถ", e286b6), _c(U+21B7, "โ†ท", e286b7), _c(U+21B8, "โ†ธ", e286b8), _c(U+21B9, "โ†น", e286b9), _c(U+21BA, "โ†บ", e286ba), _c(U+21BB, "โ†ป", e286bb), _c(U+21BC, "โ†ผ", e286bc), _c(U+21BD, "โ†ฝ", e286bd), _c(U+21BE, "โ†พ", e286be), _c(U+21BF, "โ†ฟ", e286bf), _c(U+21C0, "โ‡€", e28780), _c(U+21C1, "โ‡", e28781), _c(U+21C2, "โ‡‚", e28782), _c(U+21C3, "โ‡ƒ", e28783), _c(U+21C4, "โ‡„", e28784), _c(U+21C5, "โ‡…", e28785), _c(U+21C6, "โ‡†", e28786), _c(U+21C7, "โ‡‡", e28787), _c(U+21C8, "โ‡ˆ", e28788), _c(U+21C9, "โ‡‰", e28789), _c(U+21CA, "โ‡Š", e2878a), _c(U+21CB, "โ‡‹", e2878b), _c(U+21CC, "โ‡Œ", e2878c), _c(U+21CD, "โ‡", e2878d), _c(U+21CE, "โ‡Ž", e2878e), _c(U+21CF, "โ‡", e2878f), _c(U+21D0, "โ‡", e28790), _c(U+21D1, "โ‡‘", e28791), _c(U+21D2, "โ‡’", e28792), _c(U+21D3, "โ‡“", e28793), _c(U+21D4, "โ‡”", e28794), _c(U+21D5, "โ‡•", e28795), _c(U+21D6, "โ‡–", e28796), _c(U+21D7, "โ‡—", e28797), _c(U+21D8, "โ‡˜", e28798), _c(U+21D9, "โ‡™", e28799), _c(U+21DA, "โ‡š", e2879a), _c(U+21DB, "โ‡›", e2879b), _c(U+21DC, "โ‡œ", e2879c), _c(U+21DD, "โ‡", e2879d), _c(U+21DE, "โ‡ž", e2879e), _c(U+21DF, "โ‡Ÿ", e2879f), _c(U+21E0, "โ‡ ", e287a0), _c(U+21E1, "โ‡ก", e287a1), _c(U+21E2, "โ‡ข", e287a2), _c(U+21E3, "โ‡ฃ", e287a3), _c(U+21E4, "โ‡ค", e287a4), _c(U+21E5, "โ‡ฅ", e287a5), _c(U+21E6, "โ‡ฆ", e287a6), _c(U+21E7, "โ‡ง", e287a7), _c(U+21E8, "โ‡จ", e287a8), _c(U+21E9, "โ‡ฉ", e287a9), _c(U+21EA, "โ‡ช", e287aa), _c(U+21EB, "โ‡ซ", e287ab), _c(U+21EC, "โ‡ฌ", e287ac), _c(U+21ED, "โ‡ญ", e287ad), _c(U+21EE, "โ‡ฎ", e287ae), _c(U+21EF, "โ‡ฏ", e287af), _c(U+21F0, "โ‡ฐ", e287b0), _c(U+21F1, "โ‡ฑ", e287b1), _c(U+21F2, "โ‡ฒ", e287b2), _c(U+21F3, "โ‡ณ", e287b3), _c(U+21F4, "โ‡ด", e287b4), _c(U+21F5, "โ‡ต", e287b5), _c(U+21F6, "โ‡ถ", e287b6), _c(U+21F7, "โ‡ท", e287b7), _c(U+21F8, "โ‡ธ", e287b8), _c(U+21F9, "โ‡น", e287b9), _c(U+21FA, "โ‡บ", e287ba), _c(U+21FB, "โ‡ป", e287bb), _c(U+21FC, "โ‡ผ", e287bc), _c(U+21FD, "โ‡ฝ", e287bd), _c(U+21FE, "โ‡พ", e287be), _c(U+21FF, "โ‡ฟ", e287bf), _c(U+2200, "โˆ€", e28880), _c(U+2201, "โˆ", e28881), _c(U+2202, "โˆ‚", e28882), _c(U+2203, "โˆƒ", e28883), _c(U+2204, "โˆ„", e28884), _c(U+2205, "โˆ…", e28885), _c(U+2206, "โˆ†", e28886), _c(U+2207, "โˆ‡", e28887), _c(U+2208, "โˆˆ", e28888), _c(U+2209, "โˆ‰", e28889), _c(U+220A, "โˆŠ", e2888a), _c(U+220B, "โˆ‹", e2888b), _c(U+220C, "โˆŒ", e2888c), _c(U+220D, "โˆ", e2888d), _c(U+220E, "โˆŽ", e2888e), _c(U+220F, "โˆ", e2888f), _c(U+2210, "โˆ", e28890), _c(U+2211, "โˆ‘", e28891), _c(U+2212, "โˆ’", e28892), _c(U+2213, "โˆ“", e28893), _c(U+2214, "โˆ”", e28894), _c(U+2215, "โˆ•", e28895), _c(U+2216, "โˆ–", e28896), _c(U+2217, "โˆ—", e28897), _c(U+2218, "โˆ˜", e28898), _c(U+2219, "โˆ™", e28899), _c(U+221A, "โˆš", e2889a), _c(U+221B, "โˆ›", e2889b), _c(U+221C, "โˆœ", e2889c), _c(U+221D, "โˆ", e2889d), _c(U+221E, "โˆž", e2889e), _c(U+221F, "โˆŸ", e2889f), _c(U+2220, "โˆ ", e288a0), _c(U+2221, "โˆก", e288a1), _c(U+2222, "โˆข", e288a2), _c(U+2223, "โˆฃ", e288a3), _c(U+2224, "โˆค", e288a4), _c(U+2225, "โˆฅ", e288a5), _c(U+2226, "โˆฆ", e288a6), _c(U+2227, "โˆง", e288a7), _c(U+2228, "โˆจ", e288a8), _c(U+2229, "โˆฉ", e288a9), _c(U+222A, "โˆช", e288aa), _c(U+222B, "โˆซ", e288ab), _c(U+222C, "โˆฌ", e288ac), _c(U+222D, "โˆญ", e288ad), _c(U+222E, "โˆฎ", e288ae), _c(U+222F, "โˆฏ", e288af), _c(U+2230, "โˆฐ", e288b0), _c(U+2231, "โˆฑ", e288b1), _c(U+2232, "โˆฒ", e288b2), _c(U+2233, "โˆณ", e288b3), _c(U+2234, "โˆด", e288b4), _c(U+2235, "โˆต", e288b5), _c(U+2236, "โˆถ", e288b6), _c(U+2237, "โˆท", e288b7), _c(U+2238, "โˆธ", e288b8), _c(U+2239, "โˆน", e288b9), _c(U+223A, "โˆบ", e288ba), _c(U+223B, "โˆป", e288bb), _c(U+223C, "โˆผ", e288bc), _c(U+223D, "โˆฝ", e288bd), _c(U+223E, "โˆพ", e288be), _c(U+223F, "โˆฟ", e288bf), _c(U+2240, "โ‰€", e28980), _c(U+2241, "โ‰", e28981), _c(U+2242, "โ‰‚", e28982), _c(U+2243, "โ‰ƒ", e28983), _c(U+2244, "โ‰„", e28984), _c(U+2245, "โ‰…", e28985), _c(U+2246, "โ‰†", e28986), _c(U+2247, "โ‰‡", e28987), _c(U+2248, "โ‰ˆ", e28988), _c(U+2249, "โ‰‰", e28989), _c(U+224A, "โ‰Š", e2898a), _c(U+224B, "โ‰‹", e2898b), _c(U+224C, "โ‰Œ", e2898c), _c(U+224D, "โ‰", e2898d), _c(U+224E, "โ‰Ž", e2898e), _c(U+224F, "โ‰", e2898f), _c(U+2250, "โ‰", e28990), _c(U+2251, "โ‰‘", e28991), _c(U+2252, "โ‰’", e28992), _c(U+2253, "โ‰“", e28993), _c(U+2254, "โ‰”", e28994), _c(U+2255, "โ‰•", e28995), _c(U+2256, "โ‰–", e28996), _c(U+2257, "โ‰—", e28997), _c(U+2258, "โ‰˜", e28998), _c(U+2259, "โ‰™", e28999), _c(U+225A, "โ‰š", e2899a), _c(U+225B, "โ‰›", e2899b), _c(U+225C, "โ‰œ", e2899c), _c(U+225D, "โ‰", e2899d), _c(U+225E, "โ‰ž", e2899e), _c(U+225F, "โ‰Ÿ", e2899f), _c(U+2260, "โ‰ ", e289a0), _c(U+2261, "โ‰ก", e289a1), _c(U+2262, "โ‰ข", e289a2), _c(U+2263, "โ‰ฃ", e289a3), _c(U+2264, "โ‰ค", e289a4), _c(U+2265, "โ‰ฅ", e289a5), _c(U+2266, "โ‰ฆ", e289a6), _c(U+2267, "โ‰ง", e289a7), _c(U+2268, "โ‰จ", e289a8), _c(U+2269, "โ‰ฉ", e289a9), _c(U+226A, "โ‰ช", e289aa), _c(U+226B, "โ‰ซ", e289ab), _c(U+226C, "โ‰ฌ", e289ac), _c(U+226D, "โ‰ญ", e289ad), _c(U+226E, "โ‰ฎ", e289ae), _c(U+226F, "โ‰ฏ", e289af), _c(U+2270, "โ‰ฐ", e289b0), _c(U+2271, "โ‰ฑ", e289b1), _c(U+2272, "โ‰ฒ", e289b2), _c(U+2273, "โ‰ณ", e289b3), _c(U+2274, "โ‰ด", e289b4), _c(U+2275, "โ‰ต", e289b5), _c(U+2276, "โ‰ถ", e289b6), _c(U+2277, "โ‰ท", e289b7), _c(U+2278, "โ‰ธ", e289b8), _c(U+2279, "โ‰น", e289b9), _c(U+227A, "โ‰บ", e289ba), _c(U+227B, "โ‰ป", e289bb), _c(U+227C, "โ‰ผ", e289bc), _c(U+227D, "โ‰ฝ", e289bd), _c(U+227E, "โ‰พ", e289be), _c(U+227F, "โ‰ฟ", e289bf), _c(U+2280, "โŠ€", e28a80), _c(U+2281, "โЁ", e28a81), _c(U+2282, "โŠ‚", e28a82), _c(U+2283, "โŠƒ", e28a83), _c(U+2284, "โŠ„", e28a84), _c(U+2285, "โŠ…", e28a85), _c(U+2286, "โІ", e28a86), _c(U+2287, "โЇ", e28a87), _c(U+2288, "โŠˆ", e28a88), _c(U+2289, "โЉ", e28a89), _c(U+228A, "โŠŠ", e28a8a), _c(U+228B, "โŠ‹", e28a8b), _c(U+228C, "โŠŒ", e28a8c), _c(U+228D, "โŠ", e28a8d), _c(U+228E, "โŠŽ", e28a8e), _c(U+228F, "โŠ", e28a8f), _c(U+2290, "โА", e28a90), _c(U+2291, "โŠ‘", e28a91), _c(U+2292, "โŠ’", e28a92), _c(U+2293, "โŠ“", e28a93), _c(U+2294, "โŠ”", e28a94), _c(U+2295, "โŠ•", e28a95), _c(U+2296, "โŠ–", e28a96), _c(U+2297, "โŠ—", e28a97), _c(U+2298, "โŠ˜", e28a98), _c(U+2299, "โŠ™", e28a99), _c(U+229A, "โŠš", e28a9a), _c(U+229B, "โŠ›", e28a9b), _c(U+229C, "โŠœ", e28a9c), _c(U+229D, "โŠ", e28a9d), _c(U+229E, "โŠž", e28a9e), _c(U+229F, "โŠŸ", e28a9f), _c(U+22A0, "โŠ ", e28aa0), _c(U+22A1, "โŠก", e28aa1), _c(U+22A2, "โŠข", e28aa2), _c(U+22A3, "โŠฃ", e28aa3), _c(U+22A4, "โŠค", e28aa4), _c(U+22A5, "โŠฅ", e28aa5), _c(U+22A6, "โŠฆ", e28aa6), _c(U+22A7, "โŠง", e28aa7), _c(U+22A8, "โŠจ", e28aa8), _c(U+22A9, "โŠฉ", e28aa9), _c(U+22AA, "โŠช", e28aaa), _c(U+22AB, "โŠซ", e28aab), _c(U+22AC, "โŠฌ", e28aac), _c(U+22AD, "โŠญ", e28aad), _c(U+22AE, "โŠฎ", e28aae), _c(U+22AF, "โŠฏ", e28aaf), _c(U+22B0, "โŠฐ", e28ab0), _c(U+22B1, "โŠฑ", e28ab1), _c(U+22B2, "โŠฒ", e28ab2), _c(U+22B3, "โŠณ", e28ab3), _c(U+22B4, "โŠด", e28ab4), _c(U+22B5, "โŠต", e28ab5), _c(U+22B6, "โŠถ", e28ab6), _c(U+22B7, "โŠท", e28ab7), _c(U+22B8, "โŠธ", e28ab8), _c(U+22B9, "โŠน", e28ab9), _c(U+22BA, "โŠบ", e28aba), _c(U+22BB, "โŠป", e28abb), _c(U+22BC, "โŠผ", e28abc), _c(U+22BD, "โŠฝ", e28abd), _c(U+22BE, "โŠพ", e28abe), _c(U+22BF, "โŠฟ", e28abf), _c(U+22C0, "โ‹€", e28b80), _c(U+22C1, "โ‹", e28b81), _c(U+22C2, "โ‹‚", e28b82), _c(U+22C3, "โ‹ƒ", e28b83), _c(U+22C4, "โ‹„", e28b84), _c(U+22C5, "โ‹…", e28b85), _c(U+22C6, "โ‹†", e28b86), _c(U+22C7, "โ‹‡", e28b87), _c(U+22C8, "โ‹ˆ", e28b88), _c(U+22C9, "โ‹‰", e28b89), _c(U+22CA, "โ‹Š", e28b8a), _c(U+22CB, "โ‹‹", e28b8b), _c(U+22CC, "โ‹Œ", e28b8c), _c(U+22CD, "โ‹", e28b8d), _c(U+22CE, "โ‹Ž", e28b8e), _c(U+22CF, "โ‹", e28b8f), _c(U+22D0, "โ‹", e28b90), _c(U+22D1, "โ‹‘", e28b91), _c(U+22D2, "โ‹’", e28b92), _c(U+22D3, "โ‹“", e28b93), _c(U+22D4, "โ‹”", e28b94), _c(U+22D5, "โ‹•", e28b95), _c(U+22D6, "โ‹–", e28b96), _c(U+22D7, "โ‹—", e28b97), _c(U+22D8, "โ‹˜", e28b98), _c(U+22D9, "โ‹™", e28b99), _c(U+22DA, "โ‹š", e28b9a), _c(U+22DB, "โ‹›", e28b9b), _c(U+22DC, "โ‹œ", e28b9c), _c(U+22DD, "โ‹", e28b9d), _c(U+22DE, "โ‹ž", e28b9e), _c(U+22DF, "โ‹Ÿ", e28b9f), _c(U+22E0, "โ‹ ", e28ba0), _c(U+22E1, "โ‹ก", e28ba1), _c(U+22E2, "โ‹ข", e28ba2), _c(U+22E3, "โ‹ฃ", e28ba3), _c(U+22E4, "โ‹ค", e28ba4), _c(U+22E5, "โ‹ฅ", e28ba5), _c(U+22E6, "โ‹ฆ", e28ba6), _c(U+22E7, "โ‹ง", e28ba7), _c(U+22E8, "โ‹จ", e28ba8), _c(U+22E9, "โ‹ฉ", e28ba9), _c(U+22EA, "โ‹ช", e28baa), _c(U+22EB, "โ‹ซ", e28bab), _c(U+22EC, "โ‹ฌ", e28bac), _c(U+22ED, "โ‹ญ", e28bad), _c(U+22EE, "โ‹ฎ", e28bae), _c(U+22EF, "โ‹ฏ", e28baf), _c(U+22F0, "โ‹ฐ", e28bb0), _c(U+22F1, "โ‹ฑ", e28bb1), _c(U+22F2, "โ‹ฒ", e28bb2), _c(U+22F3, "โ‹ณ", e28bb3), _c(U+22F4, "โ‹ด", e28bb4), _c(U+22F5, "โ‹ต", e28bb5), _c(U+22F6, "โ‹ถ", e28bb6), _c(U+22F7, "โ‹ท", e28bb7), _c(U+22F8, "โ‹ธ", e28bb8), _c(U+22F9, "โ‹น", e28bb9), _c(U+22FA, "โ‹บ", e28bba), _c(U+22FB, "โ‹ป", e28bbb), _c(U+22FC, "โ‹ผ", e28bbc), _c(U+22FD, "โ‹ฝ", e28bbd), _c(U+22FE, "โ‹พ", e28bbe), _c(U+22FF, "โ‹ฟ", e28bbf), _c(U+2300, "โŒ€", e28c80), _c(U+2301, "โŒ", e28c81), _c(U+2302, "โŒ‚", e28c82), _c(U+2303, "โŒƒ", e28c83), _c(U+2304, "โŒ„", e28c84), _c(U+2305, "โŒ…", e28c85), _c(U+2306, "โŒ†", e28c86), _c(U+2307, "โŒ‡", e28c87), _c(U+2308, "โŒˆ", e28c88), _c(U+2309, "โŒ‰", e28c89), _c(U+230A, "โŒŠ", e28c8a), _c(U+230B, "โŒ‹", e28c8b), _c(U+230C, "โŒŒ", e28c8c), _c(U+230D, "โŒ", e28c8d), _c(U+230E, "โŒŽ", e28c8e), _c(U+230F, "โŒ", e28c8f), _c(U+2310, "โŒ", e28c90), _c(U+2311, "โŒ‘", e28c91), _c(U+2312, "โŒ’", e28c92), _c(U+2313, "โŒ“", e28c93), _c(U+2314, "โŒ”", e28c94), _c(U+2315, "โŒ•", e28c95), _c(U+2316, "โŒ–", e28c96), _c(U+2317, "โŒ—", e28c97), _c(U+2318, "โŒ˜", e28c98), _c(U+2319, "โŒ™", e28c99), _c(U+231A, "โŒš", e28c9a), _c(U+231B, "โŒ›", e28c9b), _c(U+231C, "โŒœ", e28c9c), _c(U+231D, "โŒ", e28c9d), _c(U+231E, "โŒž", e28c9e), _c(U+231F, "โŒŸ", e28c9f), _c(U+2320, "โŒ ", e28ca0), _c(U+2321, "โŒก", e28ca1), _c(U+2322, "โŒข", e28ca2), _c(U+2323, "โŒฃ", e28ca3), _c(U+2324, "โŒค", e28ca4), _c(U+2325, "โŒฅ", e28ca5), _c(U+2326, "โŒฆ", e28ca6), _c(U+2327, "โŒง", e28ca7), _c(U+2328, "โŒจ", e28ca8), _c(U+2329, "โŒฉ", e28ca9), _c(U+232A, "โŒช", e28caa), _c(U+232B, "โŒซ", e28cab), _c(U+232C, "โŒฌ", e28cac), _c(U+232D, "โŒญ", e28cad), _c(U+232E, "โŒฎ", e28cae), _c(U+232F, "โŒฏ", e28caf), _c(U+2330, "โŒฐ", e28cb0), _c(U+2331, "โŒฑ", e28cb1), _c(U+2332, "โŒฒ", e28cb2), _c(U+2333, "โŒณ", e28cb3), _c(U+2334, "โŒด", e28cb4), _c(U+2335, "โŒต", e28cb5), _c(U+2336, "โŒถ", e28cb6), _c(U+2337, "โŒท", e28cb7), _c(U+2338, "โŒธ", e28cb8), _c(U+2339, "โŒน", e28cb9), _c(U+233A, "โŒบ", e28cba), _c(U+233B, "โŒป", e28cbb), _c(U+233C, "โŒผ", e28cbc), _c(U+233D, "โŒฝ", e28cbd), _c(U+233E, "โŒพ", e28cbe), _c(U+233F, "โŒฟ", e28cbf), _c(U+2340, "โ€", e28d80), _c(U+2341, "โ", e28d81), _c(U+2342, "โ‚", e28d82), _c(U+2343, "โƒ", e28d83), _c(U+2344, "โ„", e28d84), _c(U+2345, "โ…", e28d85), _c(U+2346, "โ†", e28d86), _c(U+2347, "โ‡", e28d87), _c(U+2348, "โˆ", e28d88), _c(U+2349, "โ‰", e28d89), _c(U+234A, "โŠ", e28d8a), _c(U+234B, "โ‹", e28d8b), _c(U+234C, "โŒ", e28d8c), _c(U+234D, "โ", e28d8d), _c(U+234E, "โŽ", e28d8e), _c(U+234F, "โ", e28d8f), _c(U+2350, "โ", e28d90), _c(U+2351, "โ‘", e28d91), _c(U+2352, "โ’", e28d92), _c(U+2353, "โ“", e28d93), _c(U+2354, "โ”", e28d94), _c(U+2355, "โ•", e28d95), _c(U+2356, "โ–", e28d96), _c(U+2357, "โ—", e28d97), _c(U+2358, "โ˜", e28d98), _c(U+2359, "โ™", e28d99), _c(U+235A, "โš", e28d9a), _c(U+235B, "โ›", e28d9b), _c(U+235C, "โœ", e28d9c), _c(U+235D, "โ", e28d9d), _c(U+235E, "โž", e28d9e), _c(U+235F, "โŸ", e28d9f), _c(U+2360, "โ ", e28da0), _c(U+2361, "โก", e28da1), _c(U+2362, "โข", e28da2), _c(U+2363, "โฃ", e28da3), _c(U+2364, "โค", e28da4), _c(U+2365, "โฅ", e28da5), _c(U+2366, "โฆ", e28da6), _c(U+2367, "โง", e28da7), _c(U+2368, "โจ", e28da8), _c(U+2369, "โฉ", e28da9), _c(U+236A, "โช", e28daa), _c(U+236B, "โซ", e28dab), _c(U+236C, "โฌ", e28dac), _c(U+236D, "โญ", e28dad), _c(U+236E, "โฎ", e28dae), _c(U+236F, "โฏ", e28daf), _c(U+2370, "โฐ", e28db0), _c(U+2371, "โฑ", e28db1), _c(U+2372, "โฒ", e28db2), _c(U+2373, "โณ", e28db3), _c(U+2374, "โด", e28db4), _c(U+2375, "โต", e28db5), _c(U+2376, "โถ", e28db6), _c(U+2377, "โท", e28db7), _c(U+2378, "โธ", e28db8), _c(U+2379, "โน", e28db9), _c(U+237A, "โบ", e28dba), _c(U+237B, "โป", e28dbb), _c(U+237C, "โผ", e28dbc), _c(U+237D, "โฝ", e28dbd), _c(U+237E, "โพ", e28dbe), _c(U+237F, "โฟ", e28dbf), _c(U+2380, "โŽ€", e28e80), _c(U+2381, "โށ", e28e81), _c(U+2382, "โŽ‚", e28e82), _c(U+2383, "โŽƒ", e28e83), _c(U+2384, "โŽ„", e28e84), _c(U+2385, "โŽ…", e28e85), _c(U+2386, "โކ", e28e86), _c(U+2387, "โއ", e28e87), _c(U+2388, "โŽˆ", e28e88), _c(U+2389, "โމ", e28e89), _c(U+238A, "โŽŠ", e28e8a), _c(U+238B, "โŽ‹", e28e8b), _c(U+238C, "โŽŒ", e28e8c), _c(U+238D, "โŽ", e28e8d), _c(U+238E, "โŽŽ", e28e8e), _c(U+238F, "โŽ", e28e8f), _c(U+2390, "โސ", e28e90), _c(U+2391, "โŽ‘", e28e91), _c(U+2392, "โŽ’", e28e92), _c(U+2393, "โŽ“", e28e93), _c(U+2394, "โŽ”", e28e94), _c(U+2395, "โŽ•", e28e95), _c(U+2396, "โŽ–", e28e96), _c(U+2397, "โŽ—", e28e97), _c(U+2398, "โŽ˜", e28e98), _c(U+2399, "โŽ™", e28e99), _c(U+239A, "โŽš", e28e9a), _c(U+239B, "โŽ›", e28e9b), _c(U+239C, "โŽœ", e28e9c), _c(U+239D, "โŽ", e28e9d), _c(U+239E, "โŽž", e28e9e), _c(U+239F, "โŽŸ", e28e9f), _c(U+23A0, "โŽ ", e28ea0), _c(U+23A1, "โŽก", e28ea1), _c(U+23A2, "โŽข", e28ea2), _c(U+23A3, "โŽฃ", e28ea3), _c(U+23A4, "โŽค", e28ea4), _c(U+23A5, "โŽฅ", e28ea5), _c(U+23A6, "โŽฆ", e28ea6), _c(U+23A7, "โŽง", e28ea7), _c(U+23A8, "โŽจ", e28ea8), _c(U+23A9, "โŽฉ", e28ea9), _c(U+23AA, "โŽช", e28eaa), _c(U+23AB, "โŽซ", e28eab), _c(U+23AC, "โŽฌ", e28eac), _c(U+23AD, "โŽญ", e28ead), _c(U+23AE, "โŽฎ", e28eae), _c(U+23AF, "โŽฏ", e28eaf), _c(U+23B0, "โŽฐ", e28eb0), _c(U+23B1, "โŽฑ", e28eb1), _c(U+23B2, "โŽฒ", e28eb2), _c(U+23B3, "โŽณ", e28eb3), _c(U+23B4, "โŽด", e28eb4), _c(U+23B5, "โŽต", e28eb5), _c(U+23B6, "โŽถ", e28eb6), _c(U+23B7, "โŽท", e28eb7), _c(U+23B8, "โŽธ", e28eb8), _c(U+23B9, "โŽน", e28eb9), _c(U+23BA, "โŽบ", e28eba), _c(U+23BB, "โŽป", e28ebb), _c(U+23BC, "โŽผ", e28ebc), _c(U+23BD, "โŽฝ", e28ebd), _c(U+23BE, "โŽพ", e28ebe), _c(U+23BF, "โŽฟ", e28ebf), _c(U+23C0, "โ€", e28f80), _c(U+23C1, "โ", e28f81), _c(U+23C2, "โ‚", e28f82), _c(U+23C3, "โƒ", e28f83), _c(U+23C4, "โ„", e28f84), _c(U+23C5, "โ…", e28f85), _c(U+23C6, "โ†", e28f86), _c(U+23C7, "โ‡", e28f87), _c(U+23C8, "โˆ", e28f88), _c(U+23C9, "โ‰", e28f89), _c(U+23CA, "โŠ", e28f8a), _c(U+23CB, "โ‹", e28f8b), _c(U+23CC, "โŒ", e28f8c), _c(U+23CD, "โ", e28f8d), _c(U+23CE, "โŽ", e28f8e), _c(U+23CF, "โ", e28f8f), _c(U+23D0, "โ", e28f90), _c(U+23D1, "โ‘", e28f91), _c(U+23D2, "โ’", e28f92), _c(U+23D3, "โ“", e28f93), _c(U+23D4, "โ”", e28f94), _c(U+23D5, "โ•", e28f95), _c(U+23D6, "โ–", e28f96), _c(U+23D7, "โ—", e28f97), _c(U+23D8, "โ˜", e28f98), _c(U+23D9, "โ™", e28f99), _c(U+23DA, "โš", e28f9a), _c(U+23DB, "โ›", e28f9b), _c(U+23DC, "โœ", e28f9c), _c(U+23DD, "โ", e28f9d), _c(U+23DE, "โž", e28f9e), _c(U+23DF, "โŸ", e28f9f), _c(U+23E0, "โ ", e28fa0), _c(U+23E1, "โก", e28fa1), _c(U+23E2, "โข", e28fa2), _c(U+23E3, "โฃ", e28fa3), _c(U+23E4, "โค", e28fa4), _c(U+23E5, "โฅ", e28fa5), _c(U+23E6, "โฆ", e28fa6), _c(U+23E7, "โง", e28fa7), _c(U+23E8, "โจ", e28fa8), _c(U+23E9, "โฉ", e28fa9), _c(U+23EA, "โช", e28faa), _c(U+23EB, "โซ", e28fab), _c(U+23EC, "โฌ", e28fac), _c(U+23ED, "โญ", e28fad), _c(U+23EE, "โฎ", e28fae), _c(U+23EF, "โฏ", e28faf), _c(U+23F0, "โฐ", e28fb0), _c(U+23F1, "โฑ", e28fb1), _c(U+23F2, "โฒ", e28fb2), _c(U+23F3, "โณ", e28fb3), _c(U+23F4, "โด", e28fb4), _c(U+23F5, "โต", e28fb5), _c(U+23F6, "โถ", e28fb6), _c(U+23F7, "โท", e28fb7), _c(U+23F8, "โธ", e28fb8), _c(U+23F9, "โน", e28fb9), _c(U+23FA, "โบ", e28fba), _c(U+23FB, "โป", e28fbb), _c(U+23FC, "โผ", e28fbc), _c(U+23FD, "โฝ", e28fbd), _c(U+23FE, "โพ", e28fbe), _c(U+23FF, "โฟ", e28fbf), _c(U+2400, "โ€", e29080), _c(U+2401, "โ", e29081), _c(U+2402, "โ‚", e29082), _c(U+2403, "โƒ", e29083), _c(U+2404, "โ„", e29084), _c(U+2405, "โ…", e29085), _c(U+2406, "โ†", e29086), _c(U+2407, "โ‡", e29087), _c(U+2408, "โˆ", e29088), _c(U+2409, "โ‰", e29089), _c(U+240A, "โŠ", e2908a), _c(U+240B, "โ‹", e2908b), _c(U+240C, "โŒ", e2908c), _c(U+240D, "โ", e2908d), _c(U+240E, "โŽ", e2908e), _c(U+240F, "โ", e2908f), _c(U+2410, "โ", e29090), _c(U+2411, "โ‘", e29091), _c(U+2412, "โ’", e29092), _c(U+2413, "โ“", e29093), _c(U+2414, "โ”", e29094), _c(U+2415, "โ•", e29095), _c(U+2416, "โ–", e29096), _c(U+2417, "โ—", e29097), _c(U+2418, "โ˜", e29098), _c(U+2419, "โ™", e29099), _c(U+241A, "โš", e2909a), _c(U+241B, "โ›", e2909b), _c(U+241C, "โœ", e2909c), _c(U+241D, "โ", e2909d), _c(U+241E, "โž", e2909e), _c(U+241F, "โŸ", e2909f), _c(U+2420, "โ ", e290a0), _c(U+2421, "โก", e290a1), _c(U+2422, "โข", e290a2), _c(U+2423, "โฃ", e290a3), _c(U+2424, "โค", e290a4), _c(U+2425, "โฅ", e290a5), _c(U+2426, "โฆ", e290a6), _c(U+2427, "โง", e290a7), _c(U+2428, "โจ", e290a8), _c(U+2429, "โฉ", e290a9), _c(U+242A, "โช", e290aa), _c(U+242B, "โซ", e290ab), _c(U+242C, "โฌ", e290ac), _c(U+242D, "โญ", e290ad), _c(U+242E, "โฎ", e290ae), _c(U+242F, "โฏ", e290af), _c(U+2430, "โฐ", e290b0), _c(U+2431, "โฑ", e290b1), _c(U+2432, "โฒ", e290b2), _c(U+2433, "โณ", e290b3), _c(U+2434, "โด", e290b4), _c(U+2435, "โต", e290b5), _c(U+2436, "โถ", e290b6), _c(U+2437, "โท", e290b7), _c(U+2438, "โธ", e290b8), _c(U+2439, "โน", e290b9), _c(U+243A, "โบ", e290ba), _c(U+243B, "โป", e290bb), _c(U+243C, "โผ", e290bc), _c(U+243D, "โฝ", e290bd), _c(U+243E, "โพ", e290be), _c(U+243F, "โฟ", e290bf), _c(U+2440, "โ‘€", e29180), _c(U+2441, "โ‘", e29181), _c(U+2442, "โ‘‚", e29182), _c(U+2443, "โ‘ƒ", e29183), _c(U+2444, "โ‘„", e29184), _c(U+2445, "โ‘…", e29185), _c(U+2446, "โ‘†", e29186), _c(U+2447, "โ‘‡", e29187), _c(U+2448, "โ‘ˆ", e29188), _c(U+2449, "โ‘‰", e29189), _c(U+244A, "โ‘Š", e2918a), _c(U+244B, "โ‘‹", e2918b), _c(U+244C, "โ‘Œ", e2918c), _c(U+244D, "โ‘", e2918d), _c(U+244E, "โ‘Ž", e2918e), _c(U+244F, "โ‘", e2918f), _c(U+2450, "โ‘", e29190), _c(U+2451, "โ‘‘", e29191), _c(U+2452, "โ‘’", e29192), _c(U+2453, "โ‘“", e29193), _c(U+2454, "โ‘”", e29194), _c(U+2455, "โ‘•", e29195), _c(U+2456, "โ‘–", e29196), _c(U+2457, "โ‘—", e29197), _c(U+2458, "โ‘˜", e29198), _c(U+2459, "โ‘™", e29199), _c(U+245A, "โ‘š", e2919a), _c(U+245B, "โ‘›", e2919b), _c(U+245C, "โ‘œ", e2919c), _c(U+245D, "โ‘", e2919d), _c(U+245E, "โ‘ž", e2919e), _c(U+245F, "โ‘Ÿ", e2919f), _c(U+2460, "โ‘ ", e291a0), _c(U+2461, "โ‘ก", e291a1), _c(U+2462, "โ‘ข", e291a2), _c(U+2463, "โ‘ฃ", e291a3), _c(U+2464, "โ‘ค", e291a4), _c(U+2465, "โ‘ฅ", e291a5), _c(U+2466, "โ‘ฆ", e291a6), _c(U+2467, "โ‘ง", e291a7), _c(U+2468, "โ‘จ", e291a8), _c(U+2469, "โ‘ฉ", e291a9), _c(U+246A, "โ‘ช", e291aa), _c(U+246B, "โ‘ซ", e291ab), _c(U+246C, "โ‘ฌ", e291ac), _c(U+246D, "โ‘ญ", e291ad), _c(U+246E, "โ‘ฎ", e291ae), _c(U+246F, "โ‘ฏ", e291af), _c(U+2470, "โ‘ฐ", e291b0), _c(U+2471, "โ‘ฑ", e291b1), _c(U+2472, "โ‘ฒ", e291b2), _c(U+2473, "โ‘ณ", e291b3), _c(U+2474, "โ‘ด", e291b4), _c(U+2475, "โ‘ต", e291b5), _c(U+2476, "โ‘ถ", e291b6), _c(U+2477, "โ‘ท", e291b7), _c(U+2478, "โ‘ธ", e291b8), _c(U+2479, "โ‘น", e291b9), _c(U+247A, "โ‘บ", e291ba), _c(U+247B, "โ‘ป", e291bb), _c(U+247C, "โ‘ผ", e291bc), _c(U+247D, "โ‘ฝ", e291bd), _c(U+247E, "โ‘พ", e291be), _c(U+247F, "โ‘ฟ", e291bf), _c(U+2480, "โ’€", e29280), _c(U+2481, "โ’", e29281), _c(U+2482, "โ’‚", e29282), _c(U+2483, "โ’ƒ", e29283), _c(U+2484, "โ’„", e29284), _c(U+2485, "โ’…", e29285), _c(U+2486, "โ’†", e29286), _c(U+2487, "โ’‡", e29287), _c(U+2488, "โ’ˆ", e29288), _c(U+2489, "โ’‰", e29289), _c(U+248A, "โ’Š", e2928a), _c(U+248B, "โ’‹", e2928b), _c(U+248C, "โ’Œ", e2928c), _c(U+248D, "โ’", e2928d), _c(U+248E, "โ’Ž", e2928e), _c(U+248F, "โ’", e2928f), _c(U+2490, "โ’", e29290), _c(U+2491, "โ’‘", e29291), _c(U+2492, "โ’’", e29292), _c(U+2493, "โ’“", e29293), _c(U+2494, "โ’”", e29294), _c(U+2495, "โ’•", e29295), _c(U+2496, "โ’–", e29296), _c(U+2497, "โ’—", e29297), _c(U+2498, "โ’˜", e29298), _c(U+2499, "โ’™", e29299), _c(U+249A, "โ’š", e2929a), _c(U+249B, "โ’›", e2929b), _c(U+249C, "โ’œ", e2929c), _c(U+249D, "โ’", e2929d), _c(U+249E, "โ’ž", e2929e), _c(U+249F, "โ’Ÿ", e2929f), _c(U+2601, "โ˜", e29881), _c(U+2602, "โ˜‚", e29882), _c(U+2603, "โ˜ƒ", e29883), _c(U+2604, "โ˜„", e29884), _c(U+2605, "โ˜…", e29885), _c(U+2606, "โ˜†", e29886), _c(U+2607, "โ˜‡", e29887), _c(U+2608, "โ˜ˆ", e29888), _c(U+2609, "โ˜‰", e29889), _c(U+260A, "โ˜Š", e2988a), _c(U+260B, "โ˜‹", e2988b), _c(U+260C, "โ˜Œ", e2988c), _c(U+260D, "โ˜", e2988d), _c(U+260E, "โ˜Ž", e2988e), _c(U+260F, "โ˜", e2988f), _c(U+2610, "โ˜", e29890), _c(U+2611, "โ˜‘", e29891), _c(U+2612, "โ˜’", e29892), _c(U+2613, "โ˜“", e29893), _c(U+2614, "โ˜”", e29894), _c(U+2615, "โ˜•", e29895), _c(U+2616, "โ˜–", e29896), _c(U+2617, "โ˜—", e29897), _c(U+2618, "โ˜˜", e29898), _c(U+2619, "โ˜™", e29899), _c(U+261A, "โ˜š", e2989a), _c(U+261B, "โ˜›", e2989b), _c(U+261C, "โ˜œ", e2989c), _c(U+261D, "โ˜", e2989d), _c(U+261E, "โ˜ž", e2989e), _c(U+261F, "โ˜Ÿ", e2989f), _c(U+2620, "โ˜ ", e298a0), _c(U+2621, "โ˜ก", e298a1), _c(U+2622, "โ˜ข", e298a2), _c(U+2623, "โ˜ฃ", e298a3), _c(U+2624, "โ˜ค", e298a4), _c(U+2625, "โ˜ฅ", e298a5), _c(U+2626, "โ˜ฆ", e298a6), _c(U+2627, "โ˜ง", e298a7), _c(U+2628, "โ˜จ", e298a8), _c(U+2629, "โ˜ฉ", e298a9), _c(U+262A, "โ˜ช", e298aa), _c(U+262B, "โ˜ซ", e298ab), _c(U+262C, "โ˜ฌ", e298ac), _c(U+262D, "โ˜ญ", e298ad), _c(U+262E, "โ˜ฎ", e298ae), _c(U+262F, "โ˜ฏ", e298af), _c(U+2630, "โ˜ฐ", e298b0), _c(U+2631, "โ˜ฑ", e298b1), _c(U+2632, "โ˜ฒ", e298b2), _c(U+2633, "โ˜ณ", e298b3), _c(U+2634, "โ˜ด", e298b4), _c(U+2635, "โ˜ต", e298b5), _c(U+2636, "โ˜ถ", e298b6), _c(U+2637, "โ˜ท", e298b7), _c(U+2638, "โ˜ธ", e298b8), _c(U+2639, "โ˜น", e298b9), _c(U+263A, "โ˜บ", e298ba), _c(U+263B, "โ˜ป", e298bb), _c(U+263C, "โ˜ผ", e298bc), _c(U+263D, "โ˜ฝ", e298bd), _c(U+263E, "โ˜พ", e298be), _c(U+263F, "โ˜ฟ", e298bf), _c(U+2640, "โ™€", e29980), _c(U+2641, "โ™", e29981), _c(U+2642, "โ™‚", e29982), _c(U+2643, "โ™ƒ", e29983), _c(U+2644, "โ™„", e29984), _c(U+2645, "โ™…", e29985), _c(U+2646, "โ™†", e29986), _c(U+2647, "โ™‡", e29987), _c(U+2648, "โ™ˆ", e29988), _c(U+2649, "โ™‰", e29989), _c(U+264A, "โ™Š", e2998a), _c(U+264B, "โ™‹", e2998b), _c(U+264C, "โ™Œ", e2998c), _c(U+264D, "โ™", e2998d), _c(U+264E, "โ™Ž", e2998e), _c(U+264F, "โ™", e2998f), _c(U+2650, "โ™", e29990), _c(U+2651, "โ™‘", e29991), _c(U+2652, "โ™’", e29992), _c(U+2653, "โ™“", e29993), _c(U+2654, "โ™”", e29994), _c(U+2655, "โ™•", e29995), _c(U+2656, "โ™–", e29996), _c(U+2657, "โ™—", e29997), _c(U+2658, "โ™˜", e29998), _c(U+2659, "โ™™", e29999), _c(U+265A, "โ™š", e2999a), _c(U+265B, "โ™›", e2999b), _c(U+265C, "โ™œ", e2999c), _c(U+265D, "โ™", e2999d), _c(U+265E, "โ™ž", e2999e), _c(U+265F, "โ™Ÿ", e2999f), _c(U+2660, "โ™ ", e299a0), _c(U+2661, "โ™ก", e299a1), _c(U+2662, "โ™ข", e299a2), _c(U+2663, "โ™ฃ", e299a3), _c(U+2664, "โ™ค", e299a4), _c(U+2665, "โ™ฅ", e299a5), _c(U+2666, "โ™ฆ", e299a6), _c(U+2667, "โ™ง", e299a7), _c(U+2668, "โ™จ", e299a8), _c(U+2669, "โ™ฉ", e299a9), _c(U+266A, "โ™ช", e299aa), _c(U+266B, "โ™ซ", e299ab), _c(U+266C, "โ™ฌ", e299ac), _c(U+266D, "โ™ญ", e299ad), _c(U+266E, "โ™ฎ", e299ae), _c(U+266F, "โ™ฏ", e299af), _c(U+2670, "โ™ฐ", e299b0), _c(U+2671, "โ™ฑ", e299b1), _c(U+2672, "โ™ฒ", e299b2), _c(U+2673, "โ™ณ", e299b3), _c(U+2674, "โ™ด", e299b4), _c(U+2675, "โ™ต", e299b5), _c(U+2676, "โ™ถ", e299b6), _c(U+2677, "โ™ท", e299b7), _c(U+2678, "โ™ธ", e299b8), _c(U+2679, "โ™น", e299b9), _c(U+267A, "โ™บ", e299ba), _c(U+267B, "โ™ป", e299bb), _c(U+267C, "โ™ผ", e299bc), _c(U+267D, "โ™ฝ", e299bd), _c(U+267E, "โ™พ", e299be), _c(U+267F, "โ™ฟ", e299bf), _c(U+2680, "โš€", e29a80), _c(U+2681, "โš", e29a81), _c(U+2682, "โš‚", e29a82), _c(U+2683, "โšƒ", e29a83), _c(U+2684, "โš„", e29a84), _c(U+2685, "โš…", e29a85), _c(U+2686, "โš†", e29a86), _c(U+2687, "โš‡", e29a87), _c(U+2688, "โšˆ", e29a88), _c(U+2689, "โš‰", e29a89), _c(U+268A, "โšŠ", e29a8a), _c(U+268B, "โš‹", e29a8b), _c(U+268C, "โšŒ", e29a8c), _c(U+268D, "โš", e29a8d), _c(U+268E, "โšŽ", e29a8e), _c(U+268F, "โš", e29a8f), _c(U+2690, "โš", e29a90), _c(U+2691, "โš‘", e29a91), _c(U+2692, "โš’", e29a92), _c(U+2693, "โš“", e29a93), _c(U+2694, "โš”", e29a94), _c(U+2695, "โš•", e29a95), _c(U+2696, "โš–", e29a96), _c(U+2697, "โš—", e29a97), _c(U+2698, "โš˜", e29a98), _c(U+2699, "โš™", e29a99), _c(U+269A, "โšš", e29a9a), _c(U+269B, "โš›", e29a9b), _c(U+269C, "โšœ", e29a9c), _c(U+269D, "โš", e29a9d), _c(U+269E, "โšž", e29a9e), _c(U+269F, "โšŸ", e29a9f), _c(U+26A0, "โš ", e29aa0), _c(U+26A1, "โšก", e29aa1), _c(U+26A2, "โšข", e29aa2), _c(U+26A3, "โšฃ", e29aa3), _c(U+26A4, "โšค", e29aa4), _c(U+26A5, "โšฅ", e29aa5), _c(U+26A6, "โšฆ", e29aa6), _c(U+26A7, "โšง", e29aa7), _c(U+26A8, "โšจ", e29aa8), _c(U+26A9, "โšฉ", e29aa9), _c(U+26AA, "โšช", e29aaa), _c(U+26AB, "โšซ", e29aab), _c(U+26AC, "โšฌ", e29aac), _c(U+26AD, "โšญ", e29aad), _c(U+26AE, "โšฎ", e29aae), _c(U+26AF, "โšฏ", e29aaf), _c(U+26B0, "โšฐ", e29ab0), _c(U+26B1, "โšฑ", e29ab1), _c(U+26B2, "โšฒ", e29ab2), _c(U+26B3, "โšณ", e29ab3), _c(U+26B4, "โšด", e29ab4), _c(U+26B5, "โšต", e29ab5), _c(U+26B6, "โšถ", e29ab6), _c(U+26B7, "โšท", e29ab7), _c(U+26B8, "โšธ", e29ab8), _c(U+26B9, "โšน", e29ab9), _c(U+26BA, "โšบ", e29aba), _c(U+26BB, "โšป", e29abb), _c(U+26BC, "โšผ", e29abc), _c(U+26BD, "โšฝ", e29abd), _c(U+26BE, "โšพ", e29abe), _c(U+26BF, "โšฟ", e29abf), _c(U+26C0, "โ›€", e29b80), _c(U+26C1, "โ›", e29b81), _c(U+26C2, "โ›‚", e29b82), _c(U+26C3, "โ›ƒ", e29b83), _c(U+26C4, "โ›„", e29b84), _c(U+26C5, "โ›…", e29b85), _c(U+26C6, "โ›†", e29b86), _c(U+26C7, "โ›‡", e29b87), _c(U+26C8, "โ›ˆ", e29b88), _c(U+26C9, "โ›‰", e29b89), _c(U+26CA, "โ›Š", e29b8a), _c(U+26CB, "โ›‹", e29b8b), _c(U+26CC, "โ›Œ", e29b8c), _c(U+26CD, "โ›", e29b8d), _c(U+26CE, "โ›Ž", e29b8e), _c(U+26CF, "โ›", e29b8f), _c(U+26D0, "โ›", e29b90), _c(U+26D1, "โ›‘", e29b91), _c(U+26D2, "โ›’", e29b92), _c(U+26D3, "โ›“", e29b93), _c(U+26D4, "โ›”", e29b94), _c(U+26D5, "โ›•", e29b95), _c(U+26D6, "โ›–", e29b96), _c(U+26D7, "โ›—", e29b97), _c(U+26D8, "โ›˜", e29b98), _c(U+26D9, "โ›™", e29b99), _c(U+26DA, "โ›š", e29b9a), _c(U+26DB, "โ››", e29b9b), _c(U+26DC, "โ›œ", e29b9c), _c(U+26DD, "โ›", e29b9d), _c(U+26DE, "โ›ž", e29b9e), _c(U+26DF, "โ›Ÿ", e29b9f), _c(U+26E0, "โ› ", e29ba0), _c(U+26E1, "โ›ก", e29ba1), _c(U+26E2, "โ›ข", e29ba2), _c(U+26E3, "โ›ฃ", e29ba3), _c(U+26E4, "โ›ค", e29ba4), _c(U+26E5, "โ›ฅ", e29ba5), _c(U+26E6, "โ›ฆ", e29ba6), _c(U+26E7, "โ›ง", e29ba7), _c(U+26E8, "โ›จ", e29ba8), _c(U+26E9, "โ›ฉ", e29ba9), _c(U+26EA, "โ›ช", e29baa), _c(U+26EB, "โ›ซ", e29bab), _c(U+26EC, "โ›ฌ", e29bac), _c(U+26ED, "โ›ญ", e29bad), _c(U+26EE, "โ›ฎ", e29bae), _c(U+26EF, "โ›ฏ", e29baf), _c(U+26F0, "โ›ฐ", e29bb0), _c(U+26F1, "โ›ฑ", e29bb1), _c(U+26F2, "โ›ฒ", e29bb2), _c(U+26F3, "โ›ณ", e29bb3), _c(U+26F4, "โ›ด", e29bb4), _c(U+26F5, "โ›ต", e29bb5), _c(U+26F6, "โ›ถ", e29bb6), _c(U+26F7, "โ›ท", e29bb7), _c(U+26F8, "โ›ธ", e29bb8), _c(U+26F9, "โ›น", e29bb9), _c(U+26FA, "โ›บ", e29bba), _c(U+26FB, "โ›ป", e29bbb), _c(U+26FC, "โ›ผ", e29bbc), _c(U+26FD, "โ›ฝ", e29bbd), _c(U+26FE, "โ›พ", e29bbe), _c(U+26FF, "โ›ฟ", e29bbf), _c(U+2700, "โœ€", e29c80), _c(U+2701, "โœ", e29c81), _c(U+2702, "โœ‚", e29c82), _c(U+2703, "โœƒ", e29c83), _c(U+2704, "โœ„", e29c84), _c(U+2705, "โœ…", e29c85), _c(U+2706, "โœ†", e29c86), _c(U+2707, "โœ‡", e29c87), _c(U+2708, "โœˆ", e29c88), _c(U+2709, "โœ‰", e29c89), _c(U+270A, "โœŠ", e29c8a), _c(U+270B, "โœ‹", e29c8b), _c(U+270C, "โœŒ", e29c8c), _c(U+270D, "โœ", e29c8d), _c(U+270E, "โœŽ", e29c8e), _c(U+270F, "โœ", e29c8f), _c(U+2710, "โœ", e29c90), _c(U+2711, "โœ‘", e29c91), _c(U+2712, "โœ’", e29c92), _c(U+2713, "โœ“", e29c93), _c(U+2714, "โœ”", e29c94), _c(U+2715, "โœ•", e29c95), _c(U+2716, "โœ–", e29c96), _c(U+2717, "โœ—", e29c97), _c(U+2718, "โœ˜", e29c98), _c(U+2719, "โœ™", e29c99), _c(U+271A, "โœš", e29c9a), _c(U+271B, "โœ›", e29c9b), _c(U+271C, "โœœ", e29c9c), _c(U+271D, "โœ", e29c9d), _c(U+271E, "โœž", e29c9e), _c(U+271F, "โœŸ", e29c9f), _c(U+2720, "โœ ", e29ca0), _c(U+2721, "โœก", e29ca1), _c(U+2722, "โœข", e29ca2), _c(U+2723, "โœฃ", e29ca3), _c(U+2724, "โœค", e29ca4), _c(U+2725, "โœฅ", e29ca5), _c(U+2726, "โœฆ", e29ca6), _c(U+2727, "โœง", e29ca7), _c(U+2728, "โœจ", e29ca8), _c(U+2729, "โœฉ", e29ca9), _c(U+272A, "โœช", e29caa), _c(U+272B, "โœซ", e29cab), _c(U+272C, "โœฌ", e29cac), _c(U+272D, "โœญ", e29cad), _c(U+272E, "โœฎ", e29cae), _c(U+272F, "โœฏ", e29caf), _c(U+2730, "โœฐ", e29cb0), _c(U+2731, "โœฑ", e29cb1), _c(U+2732, "โœฒ", e29cb2), _c(U+2733, "โœณ", e29cb3), _c(U+2734, "โœด", e29cb4), _c(U+2735, "โœต", e29cb5), _c(U+2736, "โœถ", e29cb6), _c(U+2737, "โœท", e29cb7), _c(U+2738, "โœธ", e29cb8), _c(U+2739, "โœน", e29cb9), _c(U+273A, "โœบ", e29cba), _c(U+273B, "โœป", e29cbb), _c(U+273C, "โœผ", e29cbc), _c(U+273D, "โœฝ", e29cbd), _c(U+273E, "โœพ", e29cbe), _c(U+273F, "โœฟ", e29cbf), _c(U+2740, "โ€", e29d80), _c(U+2741, "โ", e29d81), _c(U+2742, "โ‚", e29d82), _c(U+2743, "โƒ", e29d83), _c(U+2744, "โ„", e29d84), _c(U+2745, "โ…", e29d85), _c(U+2746, "โ†", e29d86), _c(U+2747, "โ‡", e29d87), _c(U+2748, "โˆ", e29d88), _c(U+2749, "โ‰", e29d89), _c(U+274A, "โŠ", e29d8a), _c(U+274B, "โ‹", e29d8b), _c(U+274C, "โŒ", e29d8c), _c(U+274D, "โ", e29d8d), _c(U+274E, "โŽ", e29d8e), _c(U+274F, "โ", e29d8f), _c(U+2750, "โ", e29d90), _c(U+2751, "โ‘", e29d91), _c(U+2752, "โ’", e29d92), _c(U+2753, "โ“", e29d93), _c(U+2754, "โ”", e29d94), _c(U+2755, "โ•", e29d95), _c(U+2756, "โ–", e29d96), _c(U+2757, "โ—", e29d97), _c(U+2758, "โ˜", e29d98), _c(U+2759, "โ™", e29d99), _c(U+275A, "โš", e29d9a), _c(U+275B, "โ›", e29d9b), _c(U+275C, "โœ", e29d9c), _c(U+275D, "โ", e29d9d), _c(U+275E, "โž", e29d9e), _c(U+275F, "โŸ", e29d9f), _c(U+2760, "โ ", e29da0), _c(U+2761, "โก", e29da1), _c(U+2762, "โข", e29da2), _c(U+2763, "โฃ", e29da3), _c(U+2764, "โค", e29da4), _c(U+2765, "โฅ", e29da5), _c(U+2766, "โฆ", e29da6), _c(U+2767, "โง", e29da7), _c(U+2768, "โจ", e29da8), _c(U+2769, "โฉ", e29da9), _c(U+276A, "โช", e29daa), _c(U+276B, "โซ", e29dab), _c(U+276C, "โฌ", e29dac), _c(U+276D, "โญ", e29dad), _c(U+276E, "โฎ", e29dae), _c(U+276F, "โฏ", e29daf), _c(U+2770, "โฐ", e29db0), _c(U+2771, "โฑ", e29db1), _c(U+2772, "โฒ", e29db2), _c(U+2773, "โณ", e29db3), _c(U+2774, "โด", e29db4), _c(U+2775, "โต", e29db5), _c(U+2776, "โถ", e29db6), _c(U+2777, "โท", e29db7), _c(U+2778, "โธ", e29db8), _c(U+2779, "โน", e29db9), _c(U+277A, "โบ", e29dba), _c(U+277B, "โป", e29dbb), _c(U+277C, "โผ", e29dbc), _c(U+277D, "โฝ", e29dbd), _c(U+277E, "โพ", e29dbe), _c(U+277F, "โฟ", e29dbf), _c(U+2780, "โž€", e29e80), _c(U+2781, "โž", e29e81), _c(U+2782, "โž‚", e29e82), _c(U+2783, "โžƒ", e29e83), _c(U+2784, "โž„", e29e84), _c(U+2785, "โž…", e29e85), _c(U+2786, "โž†", e29e86), _c(U+2787, "โž‡", e29e87), _c(U+2788, "โžˆ", e29e88), _c(U+2789, "โž‰", e29e89), _c(U+278A, "โžŠ", e29e8a), _c(U+278B, "โž‹", e29e8b), _c(U+278C, "โžŒ", e29e8c), _c(U+278D, "โž", e29e8d), _c(U+278E, "โžŽ", e29e8e), _c(U+278F, "โž", e29e8f), _c(U+2790, "โž", e29e90), _c(U+2791, "โž‘", e29e91), _c(U+2792, "โž’", e29e92), _c(U+2793, "โž“", e29e93), _c(U+2794, "โž”", e29e94), _c(U+2795, "โž•", e29e95), _c(U+2796, "โž–", e29e96), _c(U+2797, "โž—", e29e97), _c(U+2798, "โž˜", e29e98), _c(U+2799, "โž™", e29e99), _c(U+279A, "โžš", e29e9a), _c(U+279B, "โž›", e29e9b), _c(U+279C, "โžœ", e29e9c), _c(U+279D, "โž", e29e9d), _c(U+279E, "โžž", e29e9e), _c(U+279F, "โžŸ", e29e9f), _c(U+27A0, "โž ", e29ea0), _c(U+27A1, "โžก", e29ea1), _c(U+27A2, "โžข", e29ea2), _c(U+27A3, "โžฃ", e29ea3), _c(U+27A4, "โžค", e29ea4), _c(U+27A5, "โžฅ", e29ea5), _c(U+27A6, "โžฆ", e29ea6), _c(U+27A7, "โžง", e29ea7), _c(U+27A8, "โžจ", e29ea8), _c(U+27A9, "โžฉ", e29ea9), _c(U+27AA, "โžช", e29eaa), _c(U+27AB, "โžซ", e29eab), _c(U+27AC, "โžฌ", e29eac), _c(U+27AD, "โžญ", e29ead), _c(U+27AE, "โžฎ", e29eae), _c(U+27AF, "โžฏ", e29eaf), _c(U+27B0, "โžฐ", e29eb0), _c(U+27B1, "โžฑ", e29eb1), _c(U+27B2, "โžฒ", e29eb2), _c(U+27B3, "โžณ", e29eb3), _c(U+27B4, "โžด", e29eb4), _c(U+27B5, "โžต", e29eb5), _c(U+27B6, "โžถ", e29eb6), _c(U+27B7, "โžท", e29eb7), _c(U+27B8, "โžธ", e29eb8), _c(U+27B9, "โžน", e29eb9), _c(U+27BA, "โžบ", e29eba), _c(U+27BB, "โžป", e29ebb), _c(U+27BC, "โžผ", e29ebc), _c(U+27BD, "โžฝ", e29ebd), _c(U+27BE, "โžพ", e29ebe), _c(U+27BF, "โžฟ", e29ebf), _c(U+27C0, "โŸ€", e29f80), _c(U+27C1, "โŸ", e29f81), _c(U+27C2, "โŸ‚", e29f82), _c(U+27C3, "โŸƒ", e29f83), _c(U+27C4, "โŸ„", e29f84), _c(U+27C5, "โŸ…", e29f85), _c(U+27C6, "โŸ†", e29f86), _c(U+27C7, "โŸ‡", e29f87), _c(U+27C8, "โŸˆ", e29f88), _c(U+27C9, "โŸ‰", e29f89), _c(U+27CA, "โŸŠ", e29f8a), _c(U+27CB, "โŸ‹", e29f8b), _c(U+27CC, "โŸŒ", e29f8c), _c(U+27CD, "โŸ", e29f8d), _c(U+27CE, "โŸŽ", e29f8e), _c(U+27CF, "โŸ", e29f8f), _c(U+27D0, "โŸ", e29f90), _c(U+27D1, "โŸ‘", e29f91), _c(U+27D2, "โŸ’", e29f92), _c(U+27D3, "โŸ“", e29f93), _c(U+27D4, "โŸ”", e29f94), _c(U+27D5, "โŸ•", e29f95), _c(U+27D6, "โŸ–", e29f96), _c(U+27D7, "โŸ—", e29f97), _c(U+27D8, "โŸ˜", e29f98), _c(U+27D9, "โŸ™", e29f99), _c(U+27DA, "โŸš", e29f9a), _c(U+27DB, "โŸ›", e29f9b), _c(U+27DC, "โŸœ", e29f9c), _c(U+27DD, "โŸ", e29f9d), _c(U+27DE, "โŸž", e29f9e), _c(U+27DF, "โŸŸ", e29f9f), _c(U+27E0, "โŸ ", e29fa0), _c(U+27E1, "โŸก", e29fa1), _c(U+27E2, "โŸข", e29fa2), _c(U+27E3, "โŸฃ", e29fa3), _c(U+27E4, "โŸค", e29fa4), _c(U+27E5, "โŸฅ", e29fa5), _c(U+27E6, "โŸฆ", e29fa6), _c(U+27E7, "โŸง", e29fa7), _c(U+27E8, "โŸจ", e29fa8), _c(U+27E9, "โŸฉ", e29fa9), _c(U+27EA, "โŸช", e29faa), _c(U+27EB, "โŸซ", e29fab), _c(U+27EC, "โŸฌ", e29fac), _c(U+27ED, "โŸญ", e29fad), _c(U+27EE, "โŸฎ", e29fae), _c(U+27EF, "โŸฏ", e29faf), _c(U+27F0, "โŸฐ", e29fb0), _c(U+27F1, "โŸฑ", e29fb1), _c(U+27F2, "โŸฒ", e29fb2), _c(U+27F3, "โŸณ", e29fb3), _c(U+27F4, "โŸด", e29fb4), _c(U+27F5, "โŸต", e29fb5), _c(U+27F6, "โŸถ", e29fb6), _c(U+27F7, "โŸท", e29fb7), _c(U+27F8, "โŸธ", e29fb8), _c(U+27F9, "โŸน", e29fb9), _c(U+27FA, "โŸบ", e29fba), _c(U+27FB, "โŸป", e29fbb), _c(U+27FC, "โŸผ", e29fbc), _c(U+27FD, "โŸฝ", e29fbd), _c(U+27FE, "โŸพ", e29fbe), _c(U+27FF, "โŸฟ", e29fbf), _c(U+2800, "โ €", e2a080), _c(U+2801, "โ ", e2a081), _c(U+2802, "โ ‚", e2a082), _c(U+2803, "โ ƒ", e2a083), _c(U+2804, "โ „", e2a084), _c(U+2805, "โ …", e2a085), _c(U+2806, "โ †", e2a086), _c(U+2807, "โ ‡", e2a087), _c(U+2808, "โ ˆ", e2a088), _c(U+2809, "โ ‰", e2a089), _c(U+280A, "โ Š", e2a08a), _c(U+280B, "โ ‹", e2a08b), _c(U+280C, "โ Œ", e2a08c), _c(U+280D, "โ ", e2a08d), _c(U+280E, "โ Ž", e2a08e), _c(U+280F, "โ ", e2a08f), _c(U+2810, "โ ", e2a090), _c(U+2811, "โ ‘", e2a091), _c(U+2812, "โ ’", e2a092), _c(U+2813, "โ “", e2a093), _c(U+2814, "โ ”", e2a094), _c(U+2815, "โ •", e2a095), _c(U+2816, "โ –", e2a096), _c(U+2817, "โ —", e2a097), _c(U+2818, "โ ˜", e2a098), _c(U+2819, "โ ™", e2a099), _c(U+281A, "โ š", e2a09a), _c(U+281B, "โ ›", e2a09b), _c(U+281C, "โ œ", e2a09c), _c(U+281D, "โ ", e2a09d), _c(U+281E, "โ ž", e2a09e), _c(U+281F, "โ Ÿ", e2a09f), _c(U+2820, "โ  ", e2a0a0), _c(U+2821, "โ ก", e2a0a1), _c(U+2822, "โ ข", e2a0a2), _c(U+2823, "โ ฃ", e2a0a3), _c(U+2824, "โ ค", e2a0a4), _c(U+2825, "โ ฅ", e2a0a5), _c(U+2826, "โ ฆ", e2a0a6), _c(U+2827, "โ ง", e2a0a7), _c(U+2828, "โ จ", e2a0a8), _c(U+2829, "โ ฉ", e2a0a9), _c(U+282A, "โ ช", e2a0aa), _c(U+282B, "โ ซ", e2a0ab), _c(U+282C, "โ ฌ", e2a0ac), _c(U+282D, "โ ญ", e2a0ad), _c(U+282E, "โ ฎ", e2a0ae), _c(U+282F, "โ ฏ", e2a0af), _c(U+2830, "โ ฐ", e2a0b0), _c(U+2831, "โ ฑ", e2a0b1), _c(U+2832, "โ ฒ", e2a0b2), _c(U+2833, "โ ณ", e2a0b3), _c(U+2834, "โ ด", e2a0b4), _c(U+2835, "โ ต", e2a0b5), _c(U+2836, "โ ถ", e2a0b6), _c(U+2837, "โ ท", e2a0b7), _c(U+2838, "โ ธ", e2a0b8), _c(U+2839, "โ น", e2a0b9), _c(U+283A, "โ บ", e2a0ba), _c(U+283B, "โ ป", e2a0bb), _c(U+283C, "โ ผ", e2a0bc), _c(U+283D, "โ ฝ", e2a0bd), _c(U+283E, "โ พ", e2a0be), _c(U+283F, "โ ฟ", e2a0bf), _c(U+2840, "โก€", e2a180), _c(U+2841, "โก", e2a181), _c(U+2842, "โก‚", e2a182), _c(U+2843, "โกƒ", e2a183), _c(U+2844, "โก„", e2a184), _c(U+2845, "โก…", e2a185), _c(U+2846, "โก†", e2a186), _c(U+2847, "โก‡", e2a187), _c(U+2848, "โกˆ", e2a188), _c(U+2849, "โก‰", e2a189), _c(U+284A, "โกŠ", e2a18a), _c(U+284B, "โก‹", e2a18b), _c(U+284C, "โกŒ", e2a18c), _c(U+284D, "โก", e2a18d), _c(U+284E, "โกŽ", e2a18e), _c(U+284F, "โก", e2a18f), _c(U+2850, "โก", e2a190), _c(U+2851, "โก‘", e2a191), _c(U+2852, "โก’", e2a192), _c(U+2853, "โก“", e2a193), _c(U+2854, "โก”", e2a194), _c(U+2855, "โก•", e2a195), _c(U+2856, "โก–", e2a196), _c(U+2857, "โก—", e2a197), _c(U+2858, "โก˜", e2a198), _c(U+2859, "โก™", e2a199), _c(U+285A, "โกš", e2a19a), _c(U+285B, "โก›", e2a19b), _c(U+285C, "โกœ", e2a19c), _c(U+285D, "โก", e2a19d), _c(U+285E, "โกž", e2a19e), _c(U+285F, "โกŸ", e2a19f), _c(U+2860, "โก ", e2a1a0), _c(U+2861, "โกก", e2a1a1), _c(U+2862, "โกข", e2a1a2), _c(U+2863, "โกฃ", e2a1a3), _c(U+2864, "โกค", e2a1a4), _c(U+2865, "โกฅ", e2a1a5), _c(U+2866, "โกฆ", e2a1a6), _c(U+2867, "โกง", e2a1a7), _c(U+2868, "โกจ", e2a1a8), _c(U+2869, "โกฉ", e2a1a9), _c(U+286A, "โกช", e2a1aa), _c(U+286B, "โกซ", e2a1ab), _c(U+286C, "โกฌ", e2a1ac), _c(U+286D, "โกญ", e2a1ad), _c(U+286E, "โกฎ", e2a1ae), _c(U+286F, "โกฏ", e2a1af), _c(U+2870, "โกฐ", e2a1b0), _c(U+2871, "โกฑ", e2a1b1), _c(U+2872, "โกฒ", e2a1b2), _c(U+2873, "โกณ", e2a1b3), _c(U+2874, "โกด", e2a1b4), _c(U+2875, "โกต", e2a1b5), _c(U+2876, "โกถ", e2a1b6), _c(U+2877, "โกท", e2a1b7), _c(U+2878, "โกธ", e2a1b8), _c(U+2879, "โกน", e2a1b9), _c(U+287A, "โกบ", e2a1ba), _c(U+287B, "โกป", e2a1bb), _c(U+287C, "โกผ", e2a1bc), _c(U+287D, "โกฝ", e2a1bd), _c(U+287E, "โกพ", e2a1be), _c(U+287F, "โกฟ", e2a1bf), _c(U+2880, "โข€", e2a280), _c(U+2881, "โข", e2a281), _c(U+2882, "โข‚", e2a282), _c(U+2883, "โขƒ", e2a283), _c(U+2884, "โข„", e2a284), _c(U+2885, "โข…", e2a285), _c(U+2886, "โข†", e2a286), _c(U+2887, "โข‡", e2a287), _c(U+2888, "โขˆ", e2a288), _c(U+2889, "โข‰", e2a289), _c(U+288A, "โขŠ", e2a28a), _c(U+288B, "โข‹", e2a28b), _c(U+288C, "โขŒ", e2a28c), _c(U+288D, "โข", e2a28d), _c(U+288E, "โขŽ", e2a28e), _c(U+288F, "โข", e2a28f), _c(U+2890, "โข", e2a290), _c(U+2891, "โข‘", e2a291), _c(U+2892, "โข’", e2a292), _c(U+2893, "โข“", e2a293), _c(U+2894, "โข”", e2a294), _c(U+2895, "โข•", e2a295), _c(U+2896, "โข–", e2a296), _c(U+2897, "โข—", e2a297), _c(U+2898, "โข˜", e2a298), _c(U+2899, "โข™", e2a299), _c(U+289A, "โขš", e2a29a), _c(U+289B, "โข›", e2a29b), _c(U+289C, "โขœ", e2a29c), _c(U+289D, "โข", e2a29d), _c(U+289E, "โขž", e2a29e), _c(U+289F, "โขŸ", e2a29f), _c(U+28A0, "โข ", e2a2a0), _c(U+28A1, "โขก", e2a2a1), _c(U+28A2, "โขข", e2a2a2), _c(U+28A3, "โขฃ", e2a2a3), _c(U+28A4, "โขค", e2a2a4), _c(U+28A5, "โขฅ", e2a2a5), _c(U+28A6, "โขฆ", e2a2a6), _c(U+28A7, "โขง", e2a2a7), _c(U+28A8, "โขจ", e2a2a8), _c(U+28A9, "โขฉ", e2a2a9), _c(U+28AA, "โขช", e2a2aa), _c(U+28AB, "โขซ", e2a2ab), _c(U+28AC, "โขฌ", e2a2ac), _c(U+28AD, "โขญ", e2a2ad), _c(U+28AE, "โขฎ", e2a2ae), _c(U+28AF, "โขฏ", e2a2af), _c(U+28B0, "โขฐ", e2a2b0), _c(U+28B1, "โขฑ", e2a2b1), _c(U+28B2, "โขฒ", e2a2b2), _c(U+28B3, "โขณ", e2a2b3), _c(U+28B4, "โขด", e2a2b4), _c(U+28B5, "โขต", e2a2b5), _c(U+28B6, "โขถ", e2a2b6), _c(U+28B7, "โขท", e2a2b7), _c(U+28B8, "โขธ", e2a2b8), _c(U+28B9, "โขน", e2a2b9), _c(U+28BA, "โขบ", e2a2ba), _c(U+28BB, "โขป", e2a2bb), _c(U+28BC, "โขผ", e2a2bc), _c(U+28BD, "โขฝ", e2a2bd), _c(U+28BE, "โขพ", e2a2be), _c(U+28BF, "โขฟ", e2a2bf), _c(U+28C0, "โฃ€", e2a380), _c(U+28C1, "โฃ", e2a381), _c(U+28C2, "โฃ‚", e2a382), _c(U+28C3, "โฃƒ", e2a383), _c(U+28C4, "โฃ„", e2a384), _c(U+28C5, "โฃ…", e2a385), _c(U+28C6, "โฃ†", e2a386), _c(U+28C7, "โฃ‡", e2a387), _c(U+28C8, "โฃˆ", e2a388), _c(U+28C9, "โฃ‰", e2a389), _c(U+28CA, "โฃŠ", e2a38a), _c(U+28CB, "โฃ‹", e2a38b), _c(U+28CC, "โฃŒ", e2a38c), _c(U+28CD, "โฃ", e2a38d), _c(U+28CE, "โฃŽ", e2a38e), _c(U+28CF, "โฃ", e2a38f), _c(U+28D0, "โฃ", e2a390), _c(U+28D1, "โฃ‘", e2a391), _c(U+28D2, "โฃ’", e2a392), _c(U+28D3, "โฃ“", e2a393), _c(U+28D4, "โฃ”", e2a394), _c(U+28D5, "โฃ•", e2a395), _c(U+28D6, "โฃ–", e2a396), _c(U+28D7, "โฃ—", e2a397), _c(U+28D8, "โฃ˜", e2a398), _c(U+28D9, "โฃ™", e2a399), _c(U+28DA, "โฃš", e2a39a), _c(U+28DB, "โฃ›", e2a39b), _c(U+28DC, "โฃœ", e2a39c), _c(U+28DD, "โฃ", e2a39d), _c(U+28DE, "โฃž", e2a39e), _c(U+28DF, "โฃŸ", e2a39f), _c(U+28E0, "โฃ ", e2a3a0), _c(U+28E1, "โฃก", e2a3a1), _c(U+28E2, "โฃข", e2a3a2), _c(U+28E3, "โฃฃ", e2a3a3), _c(U+28E4, "โฃค", e2a3a4), _c(U+28E5, "โฃฅ", e2a3a5), _c(U+28E6, "โฃฆ", e2a3a6), _c(U+28E7, "โฃง", e2a3a7), _c(U+28E8, "โฃจ", e2a3a8), _c(U+28E9, "โฃฉ", e2a3a9), _c(U+28EA, "โฃช", e2a3aa), _c(U+28EB, "โฃซ", e2a3ab), _c(U+28EC, "โฃฌ", e2a3ac), _c(U+28ED, "โฃญ", e2a3ad), _c(U+28EE, "โฃฎ", e2a3ae), _c(U+28EF, "โฃฏ", e2a3af), _c(U+28F0, "โฃฐ", e2a3b0), _c(U+28F1, "โฃฑ", e2a3b1), _c(U+28F2, "โฃฒ", e2a3b2), _c(U+28F3, "โฃณ", e2a3b3), _c(U+28F4, "โฃด", e2a3b4), _c(U+28F5, "โฃต", e2a3b5), _c(U+28F6, "โฃถ", e2a3b6), _c(U+28F7, "โฃท", e2a3b7), _c(U+28F8, "โฃธ", e2a3b8), _c(U+28F9, "โฃน", e2a3b9), _c(U+28FA, "โฃบ", e2a3ba), _c(U+28FB, "โฃป", e2a3bb), _c(U+28FC, "โฃผ", e2a3bc), _c(U+28FD, "โฃฝ", e2a3bd), _c(U+28FE, "โฃพ", e2a3be), _c(U+28FF, "โฃฟ", e2a3bf), _c(U+2900, "โค€", e2a480), _c(U+2901, "โค", e2a481), _c(U+2902, "โค‚", e2a482), _c(U+2903, "โคƒ", e2a483), _c(U+2904, "โค„", e2a484), _c(U+2905, "โค…", e2a485), _c(U+2906, "โค†", e2a486), _c(U+2907, "โค‡", e2a487), _c(U+2908, "โคˆ", e2a488), _c(U+2909, "โค‰", e2a489), _c(U+290A, "โคŠ", e2a48a), _c(U+290B, "โค‹", e2a48b), _c(U+290C, "โคŒ", e2a48c), _c(U+290D, "โค", e2a48d), _c(U+290E, "โคŽ", e2a48e), _c(U+290F, "โค", e2a48f), _c(U+2910, "โค", e2a490), _c(U+2911, "โค‘", e2a491), _c(U+2912, "โค’", e2a492), _c(U+2913, "โค“", e2a493), _c(U+2914, "โค”", e2a494), _c(U+2915, "โค•", e2a495), _c(U+2916, "โค–", e2a496), _c(U+2917, "โค—", e2a497), _c(U+2918, "โค˜", e2a498), _c(U+2919, "โค™", e2a499), _c(U+291A, "โคš", e2a49a), _c(U+291B, "โค›", e2a49b), _c(U+291C, "โคœ", e2a49c), _c(U+291D, "โค", e2a49d), _c(U+291E, "โคž", e2a49e), _c(U+291F, "โคŸ", e2a49f), _c(U+2920, "โค ", e2a4a0), _c(U+2921, "โคก", e2a4a1), _c(U+2922, "โคข", e2a4a2), _c(U+2923, "โคฃ", e2a4a3), _c(U+2924, "โคค", e2a4a4), _c(U+2925, "โคฅ", e2a4a5), _c(U+2926, "โคฆ", e2a4a6), _c(U+2927, "โคง", e2a4a7), _c(U+2928, "โคจ", e2a4a8), _c(U+2929, "โคฉ", e2a4a9), _c(U+292A, "โคช", e2a4aa), _c(U+292B, "โคซ", e2a4ab), _c(U+292C, "โคฌ", e2a4ac), _c(U+292D, "โคญ", e2a4ad), _c(U+292E, "โคฎ", e2a4ae), _c(U+292F, "โคฏ", e2a4af), _c(U+2930, "โคฐ", e2a4b0), _c(U+2931, "โคฑ", e2a4b1), _c(U+2932, "โคฒ", e2a4b2), _c(U+2933, "โคณ", e2a4b3), _c(U+2934, "โคด", e2a4b4), _c(U+2935, "โคต", e2a4b5), _c(U+2936, "โคถ", e2a4b6), _c(U+2937, "โคท", e2a4b7), _c(U+2938, "โคธ", e2a4b8), _c(U+2939, "โคน", e2a4b9), _c(U+293A, "โคบ", e2a4ba), _c(U+293B, "โคป", e2a4bb), _c(U+293C, "โคผ", e2a4bc), _c(U+293D, "โคฝ", e2a4bd), _c(U+293E, "โคพ", e2a4be), _c(U+293F, "โคฟ", e2a4bf), _c(U+2940, "โฅ€", e2a580), _c(U+2941, "โฅ", e2a581), _c(U+2942, "โฅ‚", e2a582), _c(U+2943, "โฅƒ", e2a583), _c(U+2944, "โฅ„", e2a584), _c(U+2945, "โฅ…", e2a585), _c(U+2946, "โฅ†", e2a586), _c(U+2947, "โฅ‡", e2a587), _c(U+2948, "โฅˆ", e2a588), _c(U+2949, "โฅ‰", e2a589), _c(U+294A, "โฅŠ", e2a58a), _c(U+294B, "โฅ‹", e2a58b), _c(U+294C, "โฅŒ", e2a58c), _c(U+294D, "โฅ", e2a58d), _c(U+294E, "โฅŽ", e2a58e), _c(U+294F, "โฅ", e2a58f), _c(U+2950, "โฅ", e2a590), _c(U+2951, "โฅ‘", e2a591), _c(U+2952, "โฅ’", e2a592), _c(U+2953, "โฅ“", e2a593), _c(U+2954, "โฅ”", e2a594), _c(U+2955, "โฅ•", e2a595), _c(U+2956, "โฅ–", e2a596), _c(U+2957, "โฅ—", e2a597), _c(U+2958, "โฅ˜", e2a598), _c(U+2959, "โฅ™", e2a599), _c(U+295A, "โฅš", e2a59a), _c(U+295B, "โฅ›", e2a59b), _c(U+295C, "โฅœ", e2a59c), _c(U+295D, "โฅ", e2a59d), _c(U+295E, "โฅž", e2a59e), _c(U+295F, "โฅŸ", e2a59f), _c(U+2960, "โฅ ", e2a5a0), _c(U+2961, "โฅก", e2a5a1), _c(U+2962, "โฅข", e2a5a2), _c(U+2963, "โฅฃ", e2a5a3), _c(U+2964, "โฅค", e2a5a4), _c(U+2965, "โฅฅ", e2a5a5), _c(U+2966, "โฅฆ", e2a5a6), _c(U+2967, "โฅง", e2a5a7), _c(U+2968, "โฅจ", e2a5a8), _c(U+2969, "โฅฉ", e2a5a9), _c(U+296A, "โฅช", e2a5aa), _c(U+296B, "โฅซ", e2a5ab), _c(U+296C, "โฅฌ", e2a5ac), _c(U+296D, "โฅญ", e2a5ad), _c(U+296E, "โฅฎ", e2a5ae), _c(U+296F, "โฅฏ", e2a5af), _c(U+2970, "โฅฐ", e2a5b0), _c(U+2971, "โฅฑ", e2a5b1), _c(U+2972, "โฅฒ", e2a5b2), _c(U+2973, "โฅณ", e2a5b3), _c(U+2974, "โฅด", e2a5b4), _c(U+2975, "โฅต", e2a5b5), _c(U+2976, "โฅถ", e2a5b6), _c(U+2977, "โฅท", e2a5b7), _c(U+2978, "โฅธ", e2a5b8), _c(U+2979, "โฅน", e2a5b9), _c(U+297A, "โฅบ", e2a5ba), _c(U+297B, "โฅป", e2a5bb), _c(U+297C, "โฅผ", e2a5bc), _c(U+297D, "โฅฝ", e2a5bd), _c(U+297E, "โฅพ", e2a5be), _c(U+297F, "โฅฟ", e2a5bf), _c(U+2980, "โฆ€", e2a680), _c(U+2981, "โฆ", e2a681), _c(U+2982, "โฆ‚", e2a682), _c(U+2983, "โฆƒ", e2a683), _c(U+2984, "โฆ„", e2a684), _c(U+2985, "โฆ…", e2a685), _c(U+2986, "โฆ†", e2a686), _c(U+2987, "โฆ‡", e2a687), _c(U+2988, "โฆˆ", e2a688), _c(U+2989, "โฆ‰", e2a689), _c(U+298A, "โฆŠ", e2a68a), _c(U+298B, "โฆ‹", e2a68b), _c(U+298C, "โฆŒ", e2a68c), _c(U+298D, "โฆ", e2a68d), _c(U+298E, "โฆŽ", e2a68e), _c(U+298F, "โฆ", e2a68f), _c(U+2990, "โฆ", e2a690), _c(U+2991, "โฆ‘", e2a691), _c(U+2992, "โฆ’", e2a692), _c(U+2993, "โฆ“", e2a693), _c(U+2994, "โฆ”", e2a694), _c(U+2995, "โฆ•", e2a695), _c(U+2996, "โฆ–", e2a696), _c(U+2997, "โฆ—", e2a697), _c(U+2998, "โฆ˜", e2a698), _c(U+2999, "โฆ™", e2a699), _c(U+299A, "โฆš", e2a69a), _c(U+299B, "โฆ›", e2a69b), _c(U+299C, "โฆœ", e2a69c), _c(U+299D, "โฆ", e2a69d), _c(U+299E, "โฆž", e2a69e), _c(U+299F, "โฆŸ", e2a69f), _c(U+29A0, "โฆ ", e2a6a0), _c(U+29A1, "โฆก", e2a6a1), _c(U+29A2, "โฆข", e2a6a2), _c(U+29A3, "โฆฃ", e2a6a3), _c(U+29A4, "โฆค", e2a6a4), _c(U+29A5, "โฆฅ", e2a6a5), _c(U+29A6, "โฆฆ", e2a6a6), _c(U+29A7, "โฆง", e2a6a7), _c(U+29A8, "โฆจ", e2a6a8), _c(U+29A9, "โฆฉ", e2a6a9), _c(U+29AA, "โฆช", e2a6aa), _c(U+29AB, "โฆซ", e2a6ab), _c(U+29AC, "โฆฌ", e2a6ac), _c(U+29AD, "โฆญ", e2a6ad), _c(U+29AE, "โฆฎ", e2a6ae), _c(U+29AF, "โฆฏ", e2a6af), _c(U+29B0, "โฆฐ", e2a6b0), _c(U+29B1, "โฆฑ", e2a6b1), _c(U+29B2, "โฆฒ", e2a6b2), _c(U+29B3, "โฆณ", e2a6b3), _c(U+29B4, "โฆด", e2a6b4), _c(U+29B5, "โฆต", e2a6b5), _c(U+29B6, "โฆถ", e2a6b6), _c(U+29B7, "โฆท", e2a6b7), _c(U+29B8, "โฆธ", e2a6b8), _c(U+29B9, "โฆน", e2a6b9), _c(U+29BA, "โฆบ", e2a6ba), _c(U+29BB, "โฆป", e2a6bb), _c(U+29BC, "โฆผ", e2a6bc), _c(U+29BD, "โฆฝ", e2a6bd), _c(U+29BE, "โฆพ", e2a6be), _c(U+29BF, "โฆฟ", e2a6bf), _c(U+29C0, "โง€", e2a780), _c(U+29C1, "โง", e2a781), _c(U+29C2, "โง‚", e2a782), _c(U+29C3, "โงƒ", e2a783), _c(U+29C4, "โง„", e2a784), _c(U+29C5, "โง…", e2a785), _c(U+29C6, "โง†", e2a786), _c(U+29C7, "โง‡", e2a787), _c(U+29C8, "โงˆ", e2a788), _c(U+29C9, "โง‰", e2a789), _c(U+29CA, "โงŠ", e2a78a), _c(U+29CB, "โง‹", e2a78b), _c(U+29CC, "โงŒ", e2a78c), _c(U+29CD, "โง", e2a78d), _c(U+29CE, "โงŽ", e2a78e), _c(U+29CF, "โง", e2a78f), _c(U+29D0, "โง", e2a790), _c(U+29D1, "โง‘", e2a791), _c(U+29D2, "โง’", e2a792), _c(U+29D3, "โง“", e2a793), _c(U+29D4, "โง”", e2a794), _c(U+29D5, "โง•", e2a795), _c(U+29D6, "โง–", e2a796), _c(U+29D7, "โง—", e2a797), _c(U+29D8, "โง˜", e2a798), _c(U+29D9, "โง™", e2a799), _c(U+29DA, "โงš", e2a79a), _c(U+29DB, "โง›", e2a79b), _c(U+29DC, "โงœ", e2a79c), _c(U+29DD, "โง", e2a79d), _c(U+29DE, "โงž", e2a79e), _c(U+29DF, "โงŸ", e2a79f), _c(U+29E0, "โง ", e2a7a0), _c(U+29E1, "โงก", e2a7a1), _c(U+29E2, "โงข", e2a7a2), _c(U+29E3, "โงฃ", e2a7a3), _c(U+29E4, "โงค", e2a7a4), _c(U+29E5, "โงฅ", e2a7a5), _c(U+29E6, "โงฆ", e2a7a6), _c(U+29E7, "โงง", e2a7a7), _c(U+29E8, "โงจ", e2a7a8), _c(U+29E9, "โงฉ", e2a7a9), _c(U+29EA, "โงช", e2a7aa), _c(U+29EB, "โงซ", e2a7ab), _c(U+29EC, "โงฌ", e2a7ac), _c(U+29ED, "โงญ", e2a7ad), _c(U+29EE, "โงฎ", e2a7ae), _c(U+29EF, "โงฏ", e2a7af), _c(U+29F0, "โงฐ", e2a7b0), _c(U+29F1, "โงฑ", e2a7b1), _c(U+29F2, "โงฒ", e2a7b2), _c(U+29F3, "โงณ", e2a7b3), _c(U+29F4, "โงด", e2a7b4), _c(U+29F5, "โงต", e2a7b5), _c(U+29F6, "โงถ", e2a7b6), _c(U+29F7, "โงท", e2a7b7), _c(U+29F8, "โงธ", e2a7b8), _c(U+29F9, "โงน", e2a7b9), _c(U+29FA, "โงบ", e2a7ba), _c(U+29FB, "โงป", e2a7bb), _c(U+29FC, "โงผ", e2a7bc), _c(U+29FD, "โงฝ", e2a7bd), _c(U+29FE, "โงพ", e2a7be), _c(U+29FF, "โงฟ", e2a7bf), _c(U+1D100, "๐„€", f09d8480), _c(U+1D101, "๐„", f09d8481), _c(U+1D102, "๐„‚", f09d8482), _c(U+1D103, "๐„ƒ", f09d8483), _c(U+1D104, "๐„„", f09d8484), _c(U+1D105, "๐„…", f09d8485), _c(U+1D106, "๐„†", f09d8486), _c(U+1D107, "๐„‡", f09d8487), _c(U+1D108, "๐„ˆ", f09d8488), _c(U+1D109, "๐„‰", f09d8489), _c(U+1D10A, "๐„Š", f09d848a), _c(U+1D10B, "๐„‹", f09d848b), _c(U+1D10C, "๐„Œ", f09d848c), _c(U+1D10D, "๐„", f09d848d), _c(U+1D10E, "๐„Ž", f09d848e), _c(U+1D10F, "๐„", f09d848f), _c(U+1D110, "๐„", f09d8490), _c(U+1D111, "๐„‘", f09d8491), _c(U+1D112, "๐„’", f09d8492), _c(U+1D113, "๐„“", f09d8493), _c(U+1D114, "๐„”", f09d8494), _c(U+1D115, "๐„•", f09d8495), _c(U+1D116, "๐„–", f09d8496), _c(U+1D117, "๐„—", f09d8497), _c(U+1D118, "๐„˜", f09d8498), _c(U+1D119, "๐„™", f09d8499), _c(U+1D11A, "๐„š", f09d849a), _c(U+1D11B, "๐„›", f09d849b), _c(U+1D11C, "๐„œ", f09d849c), _c(U+1D11D, "๐„", f09d849d), _c(U+1D11E, "๐„ž", f09d849e), _c(U+1D11F, "๐„Ÿ", f09d849f), _c(U+1D120, "๐„ ", f09d84a0), _c(U+1D121, "๐„ก", f09d84a1), _c(U+1D122, "๐„ข", f09d84a2), _c(U+1D123, "๐„ฃ", f09d84a3), _c(U+1D124, "๐„ค", f09d84a4), _c(U+1D125, "๐„ฅ", f09d84a5), _c(U+1D126, "๐„ฆ", f09d84a6), _c(U+1D127, "๐„ง", f09d84a7), _c(U+1D128, "๐„จ", f09d84a8), _c(U+1D129, "๐„ฉ", f09d84a9), _c(U+1D12A, "๐„ช", f09d84aa), _c(U+1D12B, "๐„ซ", f09d84ab), _c(U+1D12C, "๐„ฌ", f09d84ac), _c(U+1D12D, "๐„ญ", f09d84ad), _c(U+1D12E, "๐„ฎ", f09d84ae), _c(U+1D12F, "๐„ฏ", f09d84af), _c(U+1D130, "๐„ฐ", f09d84b0), _c(U+1D131, "๐„ฑ", f09d84b1), _c(U+1D132, "๐„ฒ", f09d84b2), _c(U+1D133, "๐„ณ", f09d84b3), _c(U+1D134, "๐„ด", f09d84b4), _c(U+1D135, "๐„ต", f09d84b5), _c(U+1D136, "๐„ถ", f09d84b6), _c(U+1D137, "๐„ท", f09d84b7), _c(U+1D138, "๐„ธ", f09d84b8), _c(U+1D139, "๐„น", f09d84b9), _c(U+1D13A, "๐„บ", f09d84ba), _c(U+1D13B, "๐„ป", f09d84bb), _c(U+1D13C, "๐„ผ", f09d84bc), _c(U+1D13D, "๐„ฝ", f09d84bd), _c(U+1D13E, "๐„พ", f09d84be), _c(U+1D13F, "๐„ฟ", f09d84bf), _c(U+1D140, "๐…€", f09d8580), _c(U+1D141, "๐…", f09d8581), _c(U+1D142, "๐…‚", f09d8582), _c(U+1D143, "๐…ƒ", f09d8583), _c(U+1D144, "๐…„", f09d8584), _c(U+1D145, "๐……", f09d8585), _c(U+1D146, "๐…†", f09d8586), _c(U+1D147, "๐…‡", f09d8587), _c(U+1D148, "๐…ˆ", f09d8588), _c(U+1D149, "๐…‰", f09d8589), _c(U+1D14A, "๐…Š", f09d858a), _c(U+1D14B, "๐…‹", f09d858b), _c(U+1D14C, "๐…Œ", f09d858c), _c(U+1D14D, "๐…", f09d858d), _c(U+1D14E, "๐…Ž", f09d858e), _c(U+1D14F, "๐…", f09d858f), _c(U+1D150, "๐…", f09d8590), _c(U+1D151, "๐…‘", f09d8591), _c(U+1D152, "๐…’", f09d8592), _c(U+1D153, "๐…“", f09d8593), _c(U+1D154, "๐…”", f09d8594), _c(U+1D155, "๐…•", f09d8595), _c(U+1D156, "๐…–", f09d8596), _c(U+1D157, "๐…—", f09d8597), _c(U+1D158, "๐…˜", f09d8598), _c(U+1D159, "๐…™", f09d8599), _c(U+1D15A, "๐…š", f09d859a), _c(U+1D15B, "๐…›", f09d859b), _c(U+1D15C, "๐…œ", f09d859c), _c(U+1D15D, "๐…", f09d859d), _c(U+1D15E, "๐…ž", f09d859e), _c(U+1D15F, "๐…Ÿ", f09d859f), _c(U+1D160, "๐… ", f09d85a0), _c(U+1D161, "๐…ก", f09d85a1), _c(U+1D162, "๐…ข", f09d85a2), _c(U+1D163, "๐…ฃ", f09d85a3), _c(U+1D164, "๐…ค", f09d85a4), _c(U+1D165, "๐…ฅ", f09d85a5), _c(U+1D166, "๐…ฆ", f09d85a6), _c(U+1D167, "๐…ง", f09d85a7), _c(U+1D168, "๐…จ", f09d85a8), _c(U+1D169, "๐…ฉ", f09d85a9), _c(U+1D16A, "๐…ช", f09d85aa), _c(U+1D16B, "๐…ซ", f09d85ab), _c(U+1D16C, "๐…ฌ", f09d85ac), _c(U+1D16D, "๐…ญ", f09d85ad), _c(U+1D16E, "๐…ฎ", f09d85ae), _c(U+1D16F, "๐…ฏ", f09d85af), _c(U+1D170, "๐…ฐ", f09d85b0), _c(U+1D171, "๐…ฑ", f09d85b1), _c(U+1D172, "๐…ฒ", f09d85b2), _c(U+1D173, "๐…ณ", f09d85b3), _c(U+1D174, "๐…ด", f09d85b4), _c(U+1D175, "๐…ต", f09d85b5), _c(U+1D176, "๐…ถ", f09d85b6), _c(U+1D177, "๐…ท", f09d85b7), _c(U+1D178, "๐…ธ", f09d85b8), _c(U+1D179, "๐…น", f09d85b9), _c(U+1D17A, "๐…บ", f09d85ba), _c(U+1D17B, "๐…ป", f09d85bb), _c(U+1D17C, "๐…ผ", f09d85bc), _c(U+1D17D, "๐…ฝ", f09d85bd), _c(U+1D17E, "๐…พ", f09d85be), _c(U+1D17F, "๐…ฟ", f09d85bf), _c(U+1D180, "๐†€", f09d8680), _c(U+1D181, "๐†", f09d8681), _c(U+1D182, "๐†‚", f09d8682), _c(U+1D183, "๐†ƒ", f09d8683), _c(U+1D184, "๐†„", f09d8684), _c(U+1D185, "๐†…", f09d8685), _c(U+1D186, "๐††", f09d8686), _c(U+1D187, "๐†‡", f09d8687), _c(U+1D188, "๐†ˆ", f09d8688), _c(U+1D189, "๐†‰", f09d8689), _c(U+1D18A, "๐†Š", f09d868a), _c(U+1D18B, "๐†‹", f09d868b), _c(U+1D18C, "๐†Œ", f09d868c), _c(U+1D18D, "๐†", f09d868d), _c(U+1D18E, "๐†Ž", f09d868e), _c(U+1D18F, "๐†", f09d868f), _c(U+1D190, "๐†", f09d8690), _c(U+1D191, "๐†‘", f09d8691), _c(U+1D192, "๐†’", f09d8692), _c(U+1D193, "๐†“", f09d8693), _c(U+1D194, "๐†”", f09d8694), _c(U+1D195, "๐†•", f09d8695), _c(U+1D196, "๐†–", f09d8696), _c(U+1D197, "๐†—", f09d8697), _c(U+1D198, "๐†˜", f09d8698), _c(U+1D199, "๐†™", f09d8699), _c(U+1D19A, "๐†š", f09d869a), _c(U+1D19B, "๐†›", f09d869b), _c(U+1D19C, "๐†œ", f09d869c), _c(U+1D19D, "๐†", f09d869d), _c(U+1D19E, "๐†ž", f09d869e), _c(U+1D19F, "๐†Ÿ", f09d869f), _c(U+1D1A0, "๐† ", f09d86a0), _c(U+1D1A1, "๐†ก", f09d86a1), _c(U+1D1A2, "๐†ข", f09d86a2), _c(U+1D1A3, "๐†ฃ", f09d86a3), _c(U+1D1A4, "๐†ค", f09d86a4), _c(U+1D1A5, "๐†ฅ", f09d86a5), _c(U+1D1A6, "๐†ฆ", f09d86a6), _c(U+1D1A7, "๐†ง", f09d86a7), _c(U+1D1A8, "๐†จ", f09d86a8), _c(U+1D1A9, "๐†ฉ", f09d86a9), _c(U+1D1AA, "๐†ช", f09d86aa), _c(U+1D1AB, "๐†ซ", f09d86ab), _c(U+1D1AC, "๐†ฌ", f09d86ac), _c(U+1D1AD, "๐†ญ", f09d86ad), _c(U+1D1AE, "๐†ฎ", f09d86ae), _c(U+1D1AF, "๐†ฏ", f09d86af), _c(U+1D1B0, "๐†ฐ", f09d86b0), _c(U+1D1B1, "๐†ฑ", f09d86b1), _c(U+1D1B2, "๐†ฒ", f09d86b2), _c(U+1D1B3, "๐†ณ", f09d86b3), _c(U+1D1B4, "๐†ด", f09d86b4), _c(U+1D1B5, "๐†ต", f09d86b5), _c(U+1D1B6, "๐†ถ", f09d86b6), _c(U+1D1B7, "๐†ท", f09d86b7), _c(U+1D1B8, "๐†ธ", f09d86b8), _c(U+1D1B9, "๐†น", f09d86b9), _c(U+1D1BA, "๐†บ", f09d86ba), _c(U+1D1BB, "๐†ป", f09d86bb), _c(U+1D1BC, "๐†ผ", f09d86bc), _c(U+1D1BD, "๐†ฝ", f09d86bd), _c(U+1D1BE, "๐†พ", f09d86be), _c(U+1D1BF, "๐†ฟ", f09d86bf), _c(U+1D1C0, "๐‡€", f09d8780), _c(U+1D1C1, "๐‡", f09d8781), _c(U+1D1C2, "๐‡‚", f09d8782), _c(U+1D1C3, "๐‡ƒ", f09d8783), _c(U+1D1C4, "๐‡„", f09d8784), _c(U+1D1C5, "๐‡…", f09d8785), _c(U+1D1C6, "๐‡†", f09d8786), _c(U+1D1C7, "๐‡‡", f09d8787), _c(U+1D1C8, "๐‡ˆ", f09d8788), _c(U+1D1C9, "๐‡‰", f09d8789), _c(U+1D1CA, "๐‡Š", f09d878a), _c(U+1D1CB, "๐‡‹", f09d878b), _c(U+1D1CC, "๐‡Œ", f09d878c), _c(U+1D1CD, "๐‡", f09d878d), _c(U+1D1CE, "๐‡Ž", f09d878e), _c(U+1D1CF, "๐‡", f09d878f), _c(U+1D1D0, "๐‡", f09d8790), _c(U+1D1D1, "๐‡‘", f09d8791), _c(U+1D1D2, "๐‡’", f09d8792), _c(U+1D1D3, "๐‡“", f09d8793), _c(U+1D1D4, "๐‡”", f09d8794), _c(U+1D1D5, "๐‡•", f09d8795), _c(U+1D1D6, "๐‡–", f09d8796), _c(U+1D1D7, "๐‡—", f09d8797), _c(U+1D1D8, "๐‡˜", f09d8798), _c(U+1D1D9, "๐‡™", f09d8799), _c(U+1D1DA, "๐‡š", f09d879a), _c(U+1D1DB, "๐‡›", f09d879b), _c(U+1D1DC, "๐‡œ", f09d879c), _c(U+1D1DD, "๐‡", f09d879d), _c(U+1D1DE, "๐‡ž", f09d879e), _c(U+1D1DF, "๐‡Ÿ", f09d879f), _c(U+1D1E0, "๐‡ ", f09d87a0), _c(U+1D1E1, "๐‡ก", f09d87a1), _c(U+1D1E2, "๐‡ข", f09d87a2), _c(U+1D1E3, "๐‡ฃ", f09d87a3), _c(U+1D1E4, "๐‡ค", f09d87a4), _c(U+1D1E5, "๐‡ฅ", f09d87a5), _c(U+1D1E6, "๐‡ฆ", f09d87a6), _c(U+1D1E7, "๐‡ง", f09d87a7), _c(U+1D1E8, "๐‡จ", f09d87a8), _c(U+1D1E9, "๐‡ฉ", f09d87a9), _c(U+1D1EA, "๐‡ช", f09d87aa), _c(U+1D1EB, "๐‡ซ", f09d87ab), _c(U+1D1EC, "๐‡ฌ", f09d87ac), _c(U+1D1ED, "๐‡ญ", f09d87ad), _c(U+1D1EE, "๐‡ฎ", f09d87ae), _c(U+1D1EF, "๐‡ฏ", f09d87af), _c(U+1D1F0, "๐‡ฐ", f09d87b0), _c(U+1D1F1, "๐‡ฑ", f09d87b1), _c(U+1D1F2, "๐‡ฒ", f09d87b2), _c(U+1D1F3, "๐‡ณ", f09d87b3), _c(U+1D1F4, "๐‡ด", f09d87b4), _c(U+1D1F5, "๐‡ต", f09d87b5), _c(U+1D1F6, "๐‡ถ", f09d87b6), _c(U+1D1F7, "๐‡ท", f09d87b7), _c(U+1D1F8, "๐‡ธ", f09d87b8), _c(U+1D1F9, "๐‡น", f09d87b9), _c(U+1D1FA, "๐‡บ", f09d87ba), _c(U+1D1FB, "๐‡ป", f09d87bb), _c(U+1D1FC, "๐‡ผ", f09d87bc), _c(U+1D1FD, "๐‡ฝ", f09d87bd), _c(U+1D1FE, "๐‡พ", f09d87be), _c(U+1D1FF, "๐‡ฟ", f09d87bf), _c(U+1D200, "๐ˆ€", f09d8880), _c(U+1D201, "๐ˆ", f09d8881), _c(U+1D202, "๐ˆ‚", f09d8882), _c(U+1D203, "๐ˆƒ", f09d8883), _c(U+1D204, "๐ˆ„", f09d8884), _c(U+1D205, "๐ˆ…", f09d8885), _c(U+1D206, "๐ˆ†", f09d8886), _c(U+1D207, "๐ˆ‡", f09d8887), _c(U+1D208, "๐ˆˆ", f09d8888), _c(U+1D209, "๐ˆ‰", f09d8889), _c(U+1D20A, "๐ˆŠ", f09d888a), _c(U+1D20B, "๐ˆ‹", f09d888b), _c(U+1D20C, "๐ˆŒ", f09d888c), _c(U+1D20D, "๐ˆ", f09d888d), _c(U+1D20E, "๐ˆŽ", f09d888e), _c(U+1D20F, "๐ˆ", f09d888f), _c(U+1D210, "๐ˆ", f09d8890), _c(U+1D211, "๐ˆ‘", f09d8891), _c(U+1D212, "๐ˆ’", f09d8892), _c(U+1D213, "๐ˆ“", f09d8893), _c(U+1D214, "๐ˆ”", f09d8894), _c(U+1D215, "๐ˆ•", f09d8895), _c(U+1D216, "๐ˆ–", f09d8896), _c(U+1D217, "๐ˆ—", f09d8897), _c(U+1D218, "๐ˆ˜", f09d8898), _c(U+1D219, "๐ˆ™", f09d8899), _c(U+1D21A, "๐ˆš", f09d889a), _c(U+1D21B, "๐ˆ›", f09d889b), _c(U+1D21C, "๐ˆœ", f09d889c), _c(U+1D21D, "๐ˆ", f09d889d), _c(U+1D21E, "๐ˆž", f09d889e), _c(U+1D21F, "๐ˆŸ", f09d889f), _c(U+1D220, "๐ˆ ", f09d88a0), _c(U+1D221, "๐ˆก", f09d88a1), _c(U+1D222, "๐ˆข", f09d88a2), _c(U+1D223, "๐ˆฃ", f09d88a3), _c(U+1D224, "๐ˆค", f09d88a4), _c(U+1D225, "๐ˆฅ", f09d88a5), _c(U+1D226, "๐ˆฆ", f09d88a6), _c(U+1D227, "๐ˆง", f09d88a7), _c(U+1D228, "๐ˆจ", f09d88a8), _c(U+1D229, "๐ˆฉ", f09d88a9), _c(U+1D22A, "๐ˆช", f09d88aa), _c(U+1D22B, "๐ˆซ", f09d88ab), _c(U+1D22C, "๐ˆฌ", f09d88ac), _c(U+1D22D, "๐ˆญ", f09d88ad), _c(U+1D22E, "๐ˆฎ", f09d88ae), _c(U+1D22F, "๐ˆฏ", f09d88af), _c(U+1D230, "๐ˆฐ", f09d88b0), _c(U+1D231, "๐ˆฑ", f09d88b1), _c(U+1D232, "๐ˆฒ", f09d88b2), _c(U+1D233, "๐ˆณ", f09d88b3), _c(U+1D234, "๐ˆด", f09d88b4), _c(U+1D235, "๐ˆต", f09d88b5), _c(U+1D236, "๐ˆถ", f09d88b6), _c(U+1D237, "๐ˆท", f09d88b7), _c(U+1D238, "๐ˆธ", f09d88b8), _c(U+1D239, "๐ˆน", f09d88b9), _c(U+1D23A, "๐ˆบ", f09d88ba), _c(U+1D23B, "๐ˆป", f09d88bb), _c(U+1D23C, "๐ˆผ", f09d88bc), _c(U+1D23D, "๐ˆฝ", f09d88bd), _c(U+1D23E, "๐ˆพ", f09d88be), _c(U+1D23F, "๐ˆฟ", f09d88bf), _c(U+1D240, "๐‰€", f09d8980), _c(U+1D241, "๐‰", f09d8981), _c(U+1D242, "๐‰‚", f09d8982), _c(U+1D243, "๐‰ƒ", f09d8983), _c(U+1D244, "๐‰„", f09d8984), _c(U+1D245, "๐‰…", f09d8985), _c(U+1D246, "๐‰†", f09d8986), _c(U+1D247, "๐‰‡", f09d8987), _c(U+1D248, "๐‰ˆ", f09d8988), _c(U+1D249, "๐‰‰", f09d8989), _c(U+1D24A, "๐‰Š", f09d898a), _c(U+1D24B, "๐‰‹", f09d898b), _c(U+1D24C, "๐‰Œ", f09d898c), _c(U+1D24D, "๐‰", f09d898d), _c(U+1D24E, "๐‰Ž", f09d898e), _c(U+1D24F, "๐‰", f09d898f), _c(U+1D250, "๐‰", f09d8990), _c(U+1D251, "๐‰‘", f09d8991), _c(U+1D252, "๐‰’", f09d8992), _c(U+1D253, "๐‰“", f09d8993), _c(U+1D254, "๐‰”", f09d8994), _c(U+1D255, "๐‰•", f09d8995), _c(U+1D256, "๐‰–", f09d8996), _c(U+1D257, "๐‰—", f09d8997), _c(U+1D258, "๐‰˜", f09d8998), _c(U+1D259, "๐‰™", f09d8999), _c(U+1D25A, "๐‰š", f09d899a), _c(U+1D25B, "๐‰›", f09d899b), _c(U+1D25C, "๐‰œ", f09d899c), _c(U+1D25D, "๐‰", f09d899d), _c(U+1D25E, "๐‰ž", f09d899e), _c(U+1D25F, "๐‰Ÿ", f09d899f), _c(U+1D260, "๐‰ ", f09d89a0), _c(U+1D261, "๐‰ก", f09d89a1), _c(U+1D262, "๐‰ข", f09d89a2), _c(U+1D263, "๐‰ฃ", f09d89a3), _c(U+1D264, "๐‰ค", f09d89a4), _c(U+1D265, "๐‰ฅ", f09d89a5), _c(U+1D266, "๐‰ฆ", f09d89a6), _c(U+1D267, "๐‰ง", f09d89a7), _c(U+1D268, "๐‰จ", f09d89a8), _c(U+1D269, "๐‰ฉ", f09d89a9), _c(U+1D26A, "๐‰ช", f09d89aa), _c(U+1D26B, "๐‰ซ", f09d89ab), _c(U+1D26C, "๐‰ฌ", f09d89ac), _c(U+1D26D, "๐‰ญ", f09d89ad), _c(U+1D26E, "๐‰ฎ", f09d89ae), _c(U+1D26F, "๐‰ฏ", f09d89af), _c(U+1D270, "๐‰ฐ", f09d89b0), _c(U+1D271, "๐‰ฑ", f09d89b1), _c(U+1D272, "๐‰ฒ", f09d89b2), _c(U+1D273, "๐‰ณ", f09d89b3), _c(U+1D274, "๐‰ด", f09d89b4), _c(U+1D275, "๐‰ต", f09d89b5), _c(U+1D276, "๐‰ถ", f09d89b6), _c(U+1D277, "๐‰ท", f09d89b7), _c(U+1D278, "๐‰ธ", f09d89b8), _c(U+1D279, "๐‰น", f09d89b9), _c(U+1D27A, "๐‰บ", f09d89ba), _c(U+1D27B, "๐‰ป", f09d89bb), _c(U+1D27C, "๐‰ผ", f09d89bc), _c(U+1D27D, "๐‰ฝ", f09d89bd), _c(U+1D27E, "๐‰พ", f09d89be), _c(U+1D27F, "๐‰ฟ", f09d89bf), _c(U+1D280, "๐Š€", f09d8a80), _c(U+1D281, "๐Š", f09d8a81), _c(U+1D282, "๐Š‚", f09d8a82), _c(U+1D283, "๐Šƒ", f09d8a83), _c(U+1D284, "๐Š„", f09d8a84), _c(U+1D285, "๐Š…", f09d8a85), _c(U+1D286, "๐Š†", f09d8a86), _c(U+1D287, "๐Š‡", f09d8a87), _c(U+1D288, "๐Šˆ", f09d8a88), _c(U+1D289, "๐Š‰", f09d8a89), _c(U+1D28A, "๐ŠŠ", f09d8a8a), _c(U+1D28B, "๐Š‹", f09d8a8b), _c(U+1D28C, "๐ŠŒ", f09d8a8c), _c(U+1D28D, "๐Š", f09d8a8d), _c(U+1D28E, "๐ŠŽ", f09d8a8e), _c(U+1D28F, "๐Š", f09d8a8f), _c(U+1D290, "๐Š", f09d8a90), _c(U+1D291, "๐Š‘", f09d8a91), _c(U+1D292, "๐Š’", f09d8a92), _c(U+1D293, "๐Š“", f09d8a93), _c(U+1D294, "๐Š”", f09d8a94), _c(U+1D295, "๐Š•", f09d8a95), _c(U+1D296, "๐Š–", f09d8a96), _c(U+1D297, "๐Š—", f09d8a97), _c(U+1D298, "๐Š˜", f09d8a98), _c(U+1D299, "๐Š™", f09d8a99), _c(U+1D29A, "๐Šš", f09d8a9a), _c(U+1D29B, "๐Š›", f09d8a9b), _c(U+1D29C, "๐Šœ", f09d8a9c), _c(U+1D29D, "๐Š", f09d8a9d), _c(U+1D29E, "๐Šž", f09d8a9e), _c(U+1D29F, "๐ŠŸ", f09d8a9f), _c(U+1D2A0, "๐Š ", f09d8aa0), _c(U+1D2A1, "๐Šก", f09d8aa1), _c(U+1D2A2, "๐Šข", f09d8aa2), _c(U+1D2A3, "๐Šฃ", f09d8aa3), _c(U+1D2A4, "๐Šค", f09d8aa4), _c(U+1D2A5, "๐Šฅ", f09d8aa5), _c(U+1D2A6, "๐Šฆ", f09d8aa6), _c(U+1D2A7, "๐Šง", f09d8aa7), _c(U+1D2A8, "๐Šจ", f09d8aa8), _c(U+1D2A9, "๐Šฉ", f09d8aa9), _c(U+1D2AA, "๐Šช", f09d8aaa), _c(U+1D2AB, "๐Šซ", f09d8aab), _c(U+1D2AC, "๐Šฌ", f09d8aac), _c(U+1D2AD, "๐Šญ", f09d8aad), _c(U+1D2AE, "๐Šฎ", f09d8aae), _c(U+1D2AF, "๐Šฏ", f09d8aaf), _c(U+1D2B0, "๐Šฐ", f09d8ab0), _c(U+1D2B1, "๐Šฑ", f09d8ab1), _c(U+1D2B2, "๐Šฒ", f09d8ab2), _c(U+1D2B3, "๐Šณ", f09d8ab3), _c(U+1D2B4, "๐Šด", f09d8ab4), _c(U+1D2B5, "๐Šต", f09d8ab5), _c(U+1D2B6, "๐Šถ", f09d8ab6), _c(U+1D2B7, "๐Šท", f09d8ab7), _c(U+1D2B8, "๐Šธ", f09d8ab8), _c(U+1D2B9, "๐Šน", f09d8ab9), _c(U+1D2BA, "๐Šบ", f09d8aba), _c(U+1D2BB, "๐Šป", f09d8abb), _c(U+1D2BC, "๐Šผ", f09d8abc), _c(U+1D2BD, "๐Šฝ", f09d8abd), _c(U+1D2BE, "๐Šพ", f09d8abe), _c(U+1D2BF, "๐Šฟ", f09d8abf), _c(U+1D2C0, "๐‹€", f09d8b80), _c(U+1D2C1, "๐‹", f09d8b81), _c(U+1D2C2, "๐‹‚", f09d8b82), _c(U+1D2C3, "๐‹ƒ", f09d8b83), _c(U+1D2C4, "๐‹„", f09d8b84), _c(U+1D2C5, "๐‹…", f09d8b85), _c(U+1D2C6, "๐‹†", f09d8b86), _c(U+1D2C7, "๐‹‡", f09d8b87), _c(U+1D2C8, "๐‹ˆ", f09d8b88), _c(U+1D2C9, "๐‹‰", f09d8b89), _c(U+1D2CA, "๐‹Š", f09d8b8a), _c(U+1D2CB, "๐‹‹", f09d8b8b), _c(U+1D2CC, "๐‹Œ", f09d8b8c), _c(U+1D2CD, "๐‹", f09d8b8d), _c(U+1D2CE, "๐‹Ž", f09d8b8e), _c(U+1D2CF, "๐‹", f09d8b8f), _c(U+1D2D0, "๐‹", f09d8b90), _c(U+1D2D1, "๐‹‘", f09d8b91), _c(U+1D2D2, "๐‹’", f09d8b92), _c(U+1D2D3, "๐‹“", f09d8b93), _c(U+1D2D4, "๐‹”", f09d8b94), _c(U+1D2D5, "๐‹•", f09d8b95), _c(U+1D2D6, "๐‹–", f09d8b96), _c(U+1D2D7, "๐‹—", f09d8b97), _c(U+1D2D8, "๐‹˜", f09d8b98), _c(U+1D2D9, "๐‹™", f09d8b99), _c(U+1D2DA, "๐‹š", f09d8b9a), _c(U+1D2DB, "๐‹›", f09d8b9b), _c(U+1D2DC, "๐‹œ", f09d8b9c), _c(U+1D2DD, "๐‹", f09d8b9d), _c(U+1D2DE, "๐‹ž", f09d8b9e), _c(U+1D2DF, "๐‹Ÿ", f09d8b9f), _c(U+1D2E0, "๐‹ ", f09d8ba0), _c(U+1D2E1, "๐‹ก", f09d8ba1), _c(U+1D2E2, "๐‹ข", f09d8ba2), _c(U+1D2E3, "๐‹ฃ", f09d8ba3), _c(U+1D2E4, "๐‹ค", f09d8ba4), _c(U+1D2E5, "๐‹ฅ", f09d8ba5), _c(U+1D2E6, "๐‹ฆ", f09d8ba6), _c(U+1D2E7, "๐‹ง", f09d8ba7), _c(U+1D2E8, "๐‹จ", f09d8ba8), _c(U+1D2E9, "๐‹ฉ", f09d8ba9), _c(U+1D2EA, "๐‹ช", f09d8baa), _c(U+1D2EB, "๐‹ซ", f09d8bab), _c(U+1D2EC, "๐‹ฌ", f09d8bac), _c(U+1D2ED, "๐‹ญ", f09d8bad), _c(U+1D2EE, "๐‹ฎ", f09d8bae), _c(U+1D2EF, "๐‹ฏ", f09d8baf), _c(U+1D2F0, "๐‹ฐ", f09d8bb0), _c(U+1D2F1, "๐‹ฑ", f09d8bb1), _c(U+1D2F2, "๐‹ฒ", f09d8bb2), _c(U+1D2F3, "๐‹ณ", f09d8bb3), _c(U+1D2F4, "๐‹ด", f09d8bb4), _c(U+1D2F5, "๐‹ต", f09d8bb5), _c(U+1D2F6, "๐‹ถ", f09d8bb6), _c(U+1D2F7, "๐‹ท", f09d8bb7), _c(U+1D2F8, "๐‹ธ", f09d8bb8), _c(U+1D2F9, "๐‹น", f09d8bb9), _c(U+1D2FA, "๐‹บ", f09d8bba), _c(U+1D2FB, "๐‹ป", f09d8bbb), _c(U+1D2FC, "๐‹ผ", f09d8bbc), _c(U+1D2FD, "๐‹ฝ", f09d8bbd), _c(U+1D2FE, "๐‹พ", f09d8bbe), _c(U+1D2FF, "๐‹ฟ", f09d8bbf), _c(U+1D300, "๐Œ€", f09d8c80), _c(U+1D301, "๐Œ", f09d8c81), _c(U+1D302, "๐Œ‚", f09d8c82), _c(U+1D303, "๐Œƒ", f09d8c83), _c(U+1D304, "๐Œ„", f09d8c84), _c(U+1D305, "๐Œ…", f09d8c85), _c(U+1D306, "๐Œ†", f09d8c86), _c(U+1D307, "๐Œ‡", f09d8c87), _c(U+1D308, "๐Œˆ", f09d8c88), _c(U+1D309, "๐Œ‰", f09d8c89), _c(U+1D30A, "๐ŒŠ", f09d8c8a), _c(U+1D30B, "๐Œ‹", f09d8c8b), _c(U+1D30C, "๐ŒŒ", f09d8c8c), _c(U+1D30D, "๐Œ", f09d8c8d), _c(U+1D30E, "๐ŒŽ", f09d8c8e), _c(U+1D30F, "๐Œ", f09d8c8f), _c(U+1D310, "๐Œ", f09d8c90), _c(U+1D311, "๐Œ‘", f09d8c91), _c(U+1D312, "๐Œ’", f09d8c92), _c(U+1D313, "๐Œ“", f09d8c93), _c(U+1D314, "๐Œ”", f09d8c94), _c(U+1D315, "๐Œ•", f09d8c95), _c(U+1D316, "๐Œ–", f09d8c96), _c(U+1D317, "๐Œ—", f09d8c97), _c(U+1D318, "๐Œ˜", f09d8c98), _c(U+1D319, "๐Œ™", f09d8c99), _c(U+1D31A, "๐Œš", f09d8c9a), _c(U+1D31B, "๐Œ›", f09d8c9b), _c(U+1D31C, "๐Œœ", f09d8c9c), _c(U+1D31D, "๐Œ", f09d8c9d), _c(U+1D31E, "๐Œž", f09d8c9e), _c(U+1D31F, "๐ŒŸ", f09d8c9f), _c(U+1D320, "๐Œ ", f09d8ca0), _c(U+1D321, "๐Œก", f09d8ca1), _c(U+1D322, "๐Œข", f09d8ca2), _c(U+1D323, "๐Œฃ", f09d8ca3), _c(U+1D324, "๐Œค", f09d8ca4), _c(U+1D325, "๐Œฅ", f09d8ca5), _c(U+1D326, "๐Œฆ", f09d8ca6), _c(U+1D327, "๐Œง", f09d8ca7), _c(U+1D328, "๐Œจ", f09d8ca8), _c(U+1D329, "๐Œฉ", f09d8ca9), _c(U+1D32A, "๐Œช", f09d8caa), _c(U+1D32B, "๐Œซ", f09d8cab), _c(U+1D32C, "๐Œฌ", f09d8cac), _c(U+1D32D, "๐Œญ", f09d8cad), _c(U+1D32E, "๐Œฎ", f09d8cae), _c(U+1D32F, "๐Œฏ", f09d8caf), _c(U+1D330, "๐Œฐ", f09d8cb0), _c(U+1D331, "๐Œฑ", f09d8cb1), _c(U+1D332, "๐Œฒ", f09d8cb2), _c(U+1D333, "๐Œณ", f09d8cb3), _c(U+1D334, "๐Œด", f09d8cb4), _c(U+1D335, "๐Œต", f09d8cb5), _c(U+1D336, "๐Œถ", f09d8cb6), _c(U+1D337, "๐Œท", f09d8cb7), _c(U+1D338, "๐Œธ", f09d8cb8), _c(U+1D339, "๐Œน", f09d8cb9), _c(U+1D33A, "๐Œบ", f09d8cba), _c(U+1D33B, "๐Œป", f09d8cbb), _c(U+1D33C, "๐Œผ", f09d8cbc), _c(U+1D33D, "๐Œฝ", f09d8cbd), _c(U+1D33E, "๐Œพ", f09d8cbe), _c(U+1D33F, "๐Œฟ", f09d8cbf), _c(U+1D340, "๐€", f09d8d80), _c(U+1D341, "๐", f09d8d81), _c(U+1D342, "๐‚", f09d8d82), _c(U+1D343, "๐ƒ", f09d8d83), _c(U+1D344, "๐„", f09d8d84), _c(U+1D345, "๐…", f09d8d85), _c(U+1D346, "๐†", f09d8d86), _c(U+1D347, "๐‡", f09d8d87), _c(U+1D348, "๐ˆ", f09d8d88), _c(U+1D349, "๐‰", f09d8d89), _c(U+1D34A, "๐Š", f09d8d8a), _c(U+1D34B, "๐‹", f09d8d8b), _c(U+1D34C, "๐Œ", f09d8d8c), _c(U+1D34D, "๐", f09d8d8d), _c(U+1D34E, "๐Ž", f09d8d8e), _c(U+1D34F, "๐", f09d8d8f), _c(U+1D350, "๐", f09d8d90), _c(U+1D351, "๐‘", f09d8d91), _c(U+1D352, "๐’", f09d8d92), _c(U+1D353, "๐“", f09d8d93), _c(U+1D354, "๐”", f09d8d94), _c(U+1D355, "๐•", f09d8d95), _c(U+1D356, "๐–", f09d8d96), _c(U+1D357, "๐—", f09d8d97), _c(U+1D358, "๐˜", f09d8d98), _c(U+1D359, "๐™", f09d8d99), _c(U+1D35A, "๐š", f09d8d9a), _c(U+1D35B, "๐›", f09d8d9b), _c(U+1D35C, "๐œ", f09d8d9c), _c(U+1D35D, "๐", f09d8d9d), _c(U+1D35E, "๐ž", f09d8d9e), _c(U+1D35F, "๐Ÿ", f09d8d9f), _c(U+1D360, "๐ ", f09d8da0), _c(U+1D361, "๐ก", f09d8da1), _c(U+1D362, "๐ข", f09d8da2), _c(U+1D363, "๐ฃ", f09d8da3), _c(U+1D364, "๐ค", f09d8da4), _c(U+1D365, "๐ฅ", f09d8da5), _c(U+1D366, "๐ฆ", f09d8da6), _c(U+1D367, "๐ง", f09d8da7), _c(U+1D368, "๐จ", f09d8da8), _c(U+1D369, "๐ฉ", f09d8da9), _c(U+1D36A, "๐ช", f09d8daa), _c(U+1D36B, "๐ซ", f09d8dab), _c(U+1D36C, "๐ฌ", f09d8dac), _c(U+1D36D, "๐ญ", f09d8dad), _c(U+1D36E, "๐ฎ", f09d8dae), _c(U+1D36F, "๐ฏ", f09d8daf), _c(U+1D370, "๐ฐ", f09d8db0), _c(U+1D371, "๐ฑ", f09d8db1), _c(U+1D372, "๐ฒ", f09d8db2), _c(U+1D373, "๐ณ", f09d8db3), _c(U+1D374, "๐ด", f09d8db4), _c(U+1D375, "๐ต", f09d8db5), _c(U+1D376, "๐ถ", f09d8db6), _c(U+1D377, "๐ท", f09d8db7), _c(U+1D378, "๐ธ", f09d8db8), _c(U+1D379, "๐น", f09d8db9), _c(U+1D37A, "๐บ", f09d8dba), _c(U+1D37B, "๐ป", f09d8dbb), _c(U+1D37C, "๐ผ", f09d8dbc), _c(U+1D37D, "๐ฝ", f09d8dbd), _c(U+1D37E, "๐พ", f09d8dbe), _c(U+1D37F, "๐ฟ", f09d8dbf), _c(U+1D380, "๐Ž€", f09d8e80), _c(U+1D381, "๐Ž", f09d8e81), _c(U+1D382, "๐Ž‚", f09d8e82), _c(U+1D383, "๐Žƒ", f09d8e83), _c(U+1D384, "๐Ž„", f09d8e84), _c(U+1D385, "๐Ž…", f09d8e85), _c(U+1D386, "๐Ž†", f09d8e86), _c(U+1D387, "๐Ž‡", f09d8e87), _c(U+1D388, "๐Žˆ", f09d8e88), _c(U+1D389, "๐Ž‰", f09d8e89), _c(U+1D38A, "๐ŽŠ", f09d8e8a), _c(U+1D38B, "๐Ž‹", f09d8e8b), _c(U+1D38C, "๐ŽŒ", f09d8e8c), _c(U+1D38D, "๐Ž", f09d8e8d), _c(U+1D38E, "๐ŽŽ", f09d8e8e), _c(U+1D38F, "๐Ž", f09d8e8f), _c(U+1D390, "๐Ž", f09d8e90), _c(U+1D391, "๐Ž‘", f09d8e91), _c(U+1D392, "๐Ž’", f09d8e92), _c(U+1D393, "๐Ž“", f09d8e93), _c(U+1D394, "๐Ž”", f09d8e94), _c(U+1D395, "๐Ž•", f09d8e95), _c(U+1D396, "๐Ž–", f09d8e96), _c(U+1D397, "๐Ž—", f09d8e97), _c(U+1D398, "๐Ž˜", f09d8e98), _c(U+1D399, "๐Ž™", f09d8e99), _c(U+1D39A, "๐Žš", f09d8e9a), _c(U+1D39B, "๐Ž›", f09d8e9b), _c(U+1D39C, "๐Žœ", f09d8e9c), _c(U+1D39D, "๐Ž", f09d8e9d), _c(U+1D39E, "๐Žž", f09d8e9e), _c(U+1D39F, "๐ŽŸ", f09d8e9f), _c(U+1D3A0, "๐Ž ", f09d8ea0), _c(U+1D3A1, "๐Žก", f09d8ea1), _c(U+1D3A2, "๐Žข", f09d8ea2), _c(U+1D3A3, "๐Žฃ", f09d8ea3), _c(U+1D3A4, "๐Žค", f09d8ea4), _c(U+1D3A5, "๐Žฅ", f09d8ea5), _c(U+1D3A6, "๐Žฆ", f09d8ea6), _c(U+1D3A7, "๐Žง", f09d8ea7), _c(U+1D3A8, "๐Žจ", f09d8ea8), _c(U+1D3A9, "๐Žฉ", f09d8ea9), _c(U+1D3AA, "๐Žช", f09d8eaa), _c(U+1D3AB, "๐Žซ", f09d8eab), _c(U+1D3AC, "๐Žฌ", f09d8eac), _c(U+1D3AD, "๐Žญ", f09d8ead), _c(U+1D3AE, "๐Žฎ", f09d8eae), _c(U+1D3AF, "๐Žฏ", f09d8eaf), _c(U+1D3B0, "๐Žฐ", f09d8eb0), _c(U+1D3B1, "๐Žฑ", f09d8eb1), _c(U+1D3B2, "๐Žฒ", f09d8eb2), _c(U+1D3B3, "๐Žณ", f09d8eb3), _c(U+1D3B4, "๐Žด", f09d8eb4), _c(U+1D3B5, "๐Žต", f09d8eb5), _c(U+1D3B6, "๐Žถ", f09d8eb6), _c(U+1D3B7, "๐Žท", f09d8eb7), _c(U+1D3B8, "๐Žธ", f09d8eb8), _c(U+1D3B9, "๐Žน", f09d8eb9), _c(U+1D3BA, "๐Žบ", f09d8eba), _c(U+1D3BB, "๐Žป", f09d8ebb), _c(U+1D3BC, "๐Žผ", f09d8ebc), _c(U+1D3BD, "๐Žฝ", f09d8ebd), _c(U+1D3BE, "๐Žพ", f09d8ebe), _c(U+1D3BF, "๐Žฟ", f09d8ebf), _c(U+1D3C0, "๐€", f09d8f80), _c(U+1D3C1, "๐", f09d8f81), _c(U+1D3C2, "๐‚", f09d8f82), _c(U+1D3C3, "๐ƒ", f09d8f83), _c(U+1D3C4, "๐„", f09d8f84), _c(U+1D3C5, "๐…", f09d8f85), _c(U+1D3C6, "๐†", f09d8f86), _c(U+1D3C7, "๐‡", f09d8f87), _c(U+1D3C8, "๐ˆ", f09d8f88), _c(U+1D3C9, "๐‰", f09d8f89), _c(U+1D3CA, "๐Š", f09d8f8a), _c(U+1D3CB, "๐‹", f09d8f8b), _c(U+1D3CC, "๐Œ", f09d8f8c), _c(U+1D3CD, "๐", f09d8f8d), _c(U+1D3CE, "๐Ž", f09d8f8e), _c(U+1D3CF, "๐", f09d8f8f), _c(U+1D3D0, "๐", f09d8f90), _c(U+1D3D1, "๐‘", f09d8f91), _c(U+1D3D2, "๐’", f09d8f92), _c(U+1D3D3, "๐“", f09d8f93), _c(U+1D3D4, "๐”", f09d8f94), _c(U+1D3D5, "๐•", f09d8f95), _c(U+1D3D6, "๐–", f09d8f96), _c(U+1D3D7, "๐—", f09d8f97), _c(U+1D3D8, "๐˜", f09d8f98), _c(U+1D3D9, "๐™", f09d8f99), _c(U+1D3DA, "๐š", f09d8f9a), _c(U+1D3DB, "๐›", f09d8f9b), _c(U+1D3DC, "๐œ", f09d8f9c), _c(U+1D3DD, "๐", f09d8f9d), _c(U+1D3DE, "๐ž", f09d8f9e), _c(U+1D3DF, "๐Ÿ", f09d8f9f), _c(U+1D3E0, "๐ ", f09d8fa0), _c(U+1D3E1, "๐ก", f09d8fa1), _c(U+1D3E2, "๐ข", f09d8fa2), _c(U+1D3E3, "๐ฃ", f09d8fa3), _c(U+1D3E4, "๐ค", f09d8fa4), _c(U+1D3E5, "๐ฅ", f09d8fa5), _c(U+1D3E6, "๐ฆ", f09d8fa6), _c(U+1D3E7, "๐ง", f09d8fa7), _c(U+1D3E8, "๐จ", f09d8fa8), _c(U+1D3E9, "๐ฉ", f09d8fa9), _c(U+1D3EA, "๐ช", f09d8faa), _c(U+1D3EB, "๐ซ", f09d8fab), _c(U+1D3EC, "๐ฌ", f09d8fac), _c(U+1D3ED, "๐ญ", f09d8fad), _c(U+1D3EE, "๐ฎ", f09d8fae), _c(U+1D3EF, "๐ฏ", f09d8faf), _c(U+1D3F0, "๐ฐ", f09d8fb0), _c(U+1D3F1, "๐ฑ", f09d8fb1), _c(U+1D3F2, "๐ฒ", f09d8fb2), _c(U+1D3F3, "๐ณ", f09d8fb3), _c(U+1D3F4, "๐ด", f09d8fb4), _c(U+1D3F5, "๐ต", f09d8fb5), _c(U+1D3F6, "๐ถ", f09d8fb6), _c(U+1D3F7, "๐ท", f09d8fb7), _c(U+1D3F8, "๐ธ", f09d8fb8), _c(U+1D3F9, "๐น", f09d8fb9), _c(U+1D3FA, "๐บ", f09d8fba), _c(U+1D3FB, "๐ป", f09d8fbb), _c(U+1D3FC, "๐ผ", f09d8fbc), _c(U+1D3FD, "๐ฝ", f09d8fbd), _c(U+1D3FE, "๐พ", f09d8fbe), _c(U+1D3FF, "๐ฟ", f09d8fbf), _c(U+1D400, "๐€", f09d9080), _c(U+1D401, "๐", f09d9081), _c(U+1D402, "๐‚", f09d9082), _c(U+1D403, "๐ƒ", f09d9083), _c(U+1D404, "๐„", f09d9084), _c(U+1D405, "๐…", f09d9085), _c(U+1D406, "๐†", f09d9086), _c(U+1D407, "๐‡", f09d9087), _c(U+1D408, "๐ˆ", f09d9088), _c(U+1D409, "๐‰", f09d9089), _c(U+1D40A, "๐Š", f09d908a), _c(U+1D40B, "๐‹", f09d908b), _c(U+1D40C, "๐Œ", f09d908c), _c(U+1D40D, "๐", f09d908d), _c(U+1D40E, "๐Ž", f09d908e), _c(U+1D40F, "๐", f09d908f), _c(U+1D410, "๐", f09d9090), _c(U+1D411, "๐‘", f09d9091), _c(U+1D412, "๐’", f09d9092), _c(U+1D413, "๐“", f09d9093), _c(U+1D414, "๐”", f09d9094), _c(U+1D415, "๐•", f09d9095), _c(U+1D416, "๐–", f09d9096), _c(U+1D417, "๐—", f09d9097), _c(U+1D418, "๐˜", f09d9098), _c(U+1D419, "๐™", f09d9099), _c(U+1D41A, "๐š", f09d909a), _c(U+1D41B, "๐›", f09d909b), _c(U+1D41C, "๐œ", f09d909c), _c(U+1D41D, "๐", f09d909d), _c(U+1D41E, "๐ž", f09d909e), _c(U+1D41F, "๐Ÿ", f09d909f), _c(U+1D420, "๐ ", f09d90a0), _c(U+1D421, "๐ก", f09d90a1), _c(U+1D422, "๐ข", f09d90a2), _c(U+1D423, "๐ฃ", f09d90a3), _c(U+1D424, "๐ค", f09d90a4), _c(U+1D425, "๐ฅ", f09d90a5), _c(U+1D426, "๐ฆ", f09d90a6), _c(U+1D427, "๐ง", f09d90a7), _c(U+1D428, "๐จ", f09d90a8), _c(U+1D429, "๐ฉ", f09d90a9), _c(U+1D42A, "๐ช", f09d90aa), _c(U+1D42B, "๐ซ", f09d90ab), _c(U+1D42C, "๐ฌ", f09d90ac), _c(U+1D42D, "๐ญ", f09d90ad), _c(U+1D42E, "๐ฎ", f09d90ae), _c(U+1D42F, "๐ฏ", f09d90af), _c(U+1D430, "๐ฐ", f09d90b0), _c(U+1D431, "๐ฑ", f09d90b1), _c(U+1D432, "๐ฒ", f09d90b2), _c(U+1D433, "๐ณ", f09d90b3), _c(U+1D434, "๐ด", f09d90b4), _c(U+1D435, "๐ต", f09d90b5), _c(U+1D436, "๐ถ", f09d90b6), _c(U+1D437, "๐ท", f09d90b7), _c(U+1D438, "๐ธ", f09d90b8), _c(U+1D439, "๐น", f09d90b9), _c(U+1D43A, "๐บ", f09d90ba), _c(U+1D43B, "๐ป", f09d90bb), _c(U+1D43C, "๐ผ", f09d90bc), _c(U+1D43D, "๐ฝ", f09d90bd), _c(U+1D43E, "๐พ", f09d90be), _c(U+1D43F, "๐ฟ", f09d90bf), _c(U+1D440, "๐‘€", f09d9180), _c(U+1D441, "๐‘", f09d9181), _c(U+1D442, "๐‘‚", f09d9182), _c(U+1D443, "๐‘ƒ", f09d9183), _c(U+1D444, "๐‘„", f09d9184), _c(U+1D445, "๐‘…", f09d9185), _c(U+1D446, "๐‘†", f09d9186), _c(U+1D447, "๐‘‡", f09d9187), _c(U+1D448, "๐‘ˆ", f09d9188), _c(U+1D449, "๐‘‰", f09d9189), _c(U+1D44A, "๐‘Š", f09d918a), _c(U+1D44B, "๐‘‹", f09d918b), _c(U+1D44C, "๐‘Œ", f09d918c), _c(U+1D44D, "๐‘", f09d918d), _c(U+1D44E, "๐‘Ž", f09d918e), _c(U+1D44F, "๐‘", f09d918f), _c(U+1D450, "๐‘", f09d9190), _c(U+1D451, "๐‘‘", f09d9191), _c(U+1D452, "๐‘’", f09d9192), _c(U+1D453, "๐‘“", f09d9193), _c(U+1D454, "๐‘”", f09d9194), _c(U+1D455, "๐‘•", f09d9195), _c(U+1D456, "๐‘–", f09d9196), _c(U+1D457, "๐‘—", f09d9197), _c(U+1D458, "๐‘˜", f09d9198), _c(U+1D459, "๐‘™", f09d9199), _c(U+1D45A, "๐‘š", f09d919a), _c(U+1D45B, "๐‘›", f09d919b), _c(U+1D45C, "๐‘œ", f09d919c), _c(U+1D45D, "๐‘", f09d919d), _c(U+1D45E, "๐‘ž", f09d919e), _c(U+1D45F, "๐‘Ÿ", f09d919f), _c(U+1D460, "๐‘ ", f09d91a0), _c(U+1D461, "๐‘ก", f09d91a1), _c(U+1D462, "๐‘ข", f09d91a2), _c(U+1D463, "๐‘ฃ", f09d91a3), _c(U+1D464, "๐‘ค", f09d91a4), _c(U+1D465, "๐‘ฅ", f09d91a5), _c(U+1D466, "๐‘ฆ", f09d91a6), _c(U+1D467, "๐‘ง", f09d91a7), _c(U+1D468, "๐‘จ", f09d91a8), _c(U+1D469, "๐‘ฉ", f09d91a9), _c(U+1D46A, "๐‘ช", f09d91aa), _c(U+1D46B, "๐‘ซ", f09d91ab), _c(U+1D46C, "๐‘ฌ", f09d91ac), _c(U+1D46D, "๐‘ญ", f09d91ad), _c(U+1D46E, "๐‘ฎ", f09d91ae), _c(U+1D46F, "๐‘ฏ", f09d91af), _c(U+1D470, "๐‘ฐ", f09d91b0), _c(U+1D471, "๐‘ฑ", f09d91b1), _c(U+1D472, "๐‘ฒ", f09d91b2), _c(U+1D473, "๐‘ณ", f09d91b3), _c(U+1D474, "๐‘ด", f09d91b4), _c(U+1D475, "๐‘ต", f09d91b5), _c(U+1D476, "๐‘ถ", f09d91b6), _c(U+1D477, "๐‘ท", f09d91b7), _c(U+1D478, "๐‘ธ", f09d91b8), _c(U+1D479, "๐‘น", f09d91b9), _c(U+1D47A, "๐‘บ", f09d91ba), _c(U+1D47B, "๐‘ป", f09d91bb), _c(U+1D47C, "๐‘ผ", f09d91bc), _c(U+1D47D, "๐‘ฝ", f09d91bd), _c(U+1D47E, "๐‘พ", f09d91be), _c(U+1D47F, "๐‘ฟ", f09d91bf), _c(U+1D480, "๐’€", f09d9280), _c(U+1D481, "๐’", f09d9281), _c(U+1D482, "๐’‚", f09d9282), _c(U+1D483, "๐’ƒ", f09d9283), _c(U+1D484, "๐’„", f09d9284), _c(U+1D485, "๐’…", f09d9285), _c(U+1D486, "๐’†", f09d9286), _c(U+1D487, "๐’‡", f09d9287), _c(U+1D488, "๐’ˆ", f09d9288), _c(U+1D489, "๐’‰", f09d9289), _c(U+1D48A, "๐’Š", f09d928a), _c(U+1D48B, "๐’‹", f09d928b), _c(U+1D48C, "๐’Œ", f09d928c), _c(U+1D48D, "๐’", f09d928d), _c(U+1D48E, "๐’Ž", f09d928e), _c(U+1D48F, "๐’", f09d928f), _c(U+1D490, "๐’", f09d9290), _c(U+1D491, "๐’‘", f09d9291), _c(U+1D492, "๐’’", f09d9292), _c(U+1D493, "๐’“", f09d9293), _c(U+1D494, "๐’”", f09d9294), _c(U+1D495, "๐’•", f09d9295), _c(U+1D496, "๐’–", f09d9296), _c(U+1D497, "๐’—", f09d9297), _c(U+1D498, "๐’˜", f09d9298), _c(U+1D499, "๐’™", f09d9299), _c(U+1D49A, "๐’š", f09d929a), _c(U+1D49B, "๐’›", f09d929b), _c(U+1D49C, "๐’œ", f09d929c), _c(U+1D49D, "๐’", f09d929d), _c(U+1D49E, "๐’ž", f09d929e), _c(U+1D49F, "๐’Ÿ", f09d929f), _c(U+1D4A0, "๐’ ", f09d92a0), _c(U+1D4A1, "๐’ก", f09d92a1), _c(U+1D4A2, "๐’ข", f09d92a2), _c(U+1D4A3, "๐’ฃ", f09d92a3), _c(U+1D4A4, "๐’ค", f09d92a4), _c(U+1D4A5, "๐’ฅ", f09d92a5), _c(U+1D4A6, "๐’ฆ", f09d92a6), _c(U+1D4A7, "๐’ง", f09d92a7), _c(U+1D4A8, "๐’จ", f09d92a8), _c(U+1D4A9, "๐’ฉ", f09d92a9), _c(U+1D4AA, "๐’ช", f09d92aa), _c(U+1D4AB, "๐’ซ", f09d92ab), _c(U+1D4AC, "๐’ฌ", f09d92ac), _c(U+1D4AD, "๐’ญ", f09d92ad), _c(U+1D4AE, "๐’ฎ", f09d92ae), _c(U+1D4AF, "๐’ฏ", f09d92af), _c(U+1D4B0, "๐’ฐ", f09d92b0), _c(U+1D4B1, "๐’ฑ", f09d92b1), _c(U+1D4B2, "๐’ฒ", f09d92b2), _c(U+1D4B3, "๐’ณ", f09d92b3), _c(U+1D4B4, "๐’ด", f09d92b4), _c(U+1D4B5, "๐’ต", f09d92b5), _c(U+1D4B6, "๐’ถ", f09d92b6), _c(U+1D4B7, "๐’ท", f09d92b7), _c(U+1D4B8, "๐’ธ", f09d92b8), _c(U+1D4B9, "๐’น", f09d92b9), _c(U+1D4BA, "๐’บ", f09d92ba), _c(U+1D4BB, "๐’ป", f09d92bb), _c(U+1D4BC, "๐’ผ", f09d92bc), _c(U+1D4BD, "๐’ฝ", f09d92bd), _c(U+1D4BE, "๐’พ", f09d92be), _c(U+1D4BF, "๐’ฟ", f09d92bf), _c(U+1D4C0, "๐“€", f09d9380), _c(U+1D4C1, "๐“", f09d9381), _c(U+1D4C2, "๐“‚", f09d9382), _c(U+1D4C3, "๐“ƒ", f09d9383), _c(U+1D4C4, "๐“„", f09d9384), _c(U+1D4C5, "๐“…", f09d9385), _c(U+1D4C6, "๐“†", f09d9386), _c(U+1D4C7, "๐“‡", f09d9387), _c(U+1D4C8, "๐“ˆ", f09d9388), _c(U+1D4C9, "๐“‰", f09d9389), _c(U+1D4CA, "๐“Š", f09d938a), _c(U+1D4CB, "๐“‹", f09d938b), _c(U+1D4CC, "๐“Œ", f09d938c), _c(U+1D4CD, "๐“", f09d938d), _c(U+1D4CE, "๐“Ž", f09d938e), _c(U+1D4CF, "๐“", f09d938f), _c(U+1D4D0, "๐“", f09d9390), _c(U+1D4D1, "๐“‘", f09d9391), _c(U+1D4D2, "๐“’", f09d9392), _c(U+1D4D3, "๐““", f09d9393), _c(U+1D4D4, "๐“”", f09d9394), _c(U+1D4D5, "๐“•", f09d9395), _c(U+1D4D6, "๐“–", f09d9396), _c(U+1D4D7, "๐“—", f09d9397), _c(U+1D4D8, "๐“˜", f09d9398), _c(U+1D4D9, "๐“™", f09d9399), _c(U+1D4DA, "๐“š", f09d939a), _c(U+1D4DB, "๐“›", f09d939b), _c(U+1D4DC, "๐“œ", f09d939c), _c(U+1D4DD, "๐“", f09d939d), _c(U+1D4DE, "๐“ž", f09d939e), _c(U+1D4DF, "๐“Ÿ", f09d939f), _c(U+1D4E0, "๐“ ", f09d93a0), _c(U+1D4E1, "๐“ก", f09d93a1), _c(U+1D4E2, "๐“ข", f09d93a2), _c(U+1D4E3, "๐“ฃ", f09d93a3), _c(U+1D4E4, "๐“ค", f09d93a4), _c(U+1D4E5, "๐“ฅ", f09d93a5), _c(U+1D4E6, "๐“ฆ", f09d93a6), _c(U+1D4E7, "๐“ง", f09d93a7), _c(U+1D4E8, "๐“จ", f09d93a8), _c(U+1D4E9, "๐“ฉ", f09d93a9), _c(U+1D4EA, "๐“ช", f09d93aa), _c(U+1D4EB, "๐“ซ", f09d93ab), _c(U+1D4EC, "๐“ฌ", f09d93ac), _c(U+1D4ED, "๐“ญ", f09d93ad), _c(U+1D4EE, "๐“ฎ", f09d93ae), _c(U+1D4EF, "๐“ฏ", f09d93af), _c(U+1D4F0, "๐“ฐ", f09d93b0), _c(U+1D4F1, "๐“ฑ", f09d93b1), _c(U+1D4F2, "๐“ฒ", f09d93b2), _c(U+1D4F3, "๐“ณ", f09d93b3), _c(U+1D4F4, "๐“ด", f09d93b4), _c(U+1D4F5, "๐“ต", f09d93b5), _c(U+1D4F6, "๐“ถ", f09d93b6), _c(U+1D4F7, "๐“ท", f09d93b7), _c(U+1D4F8, "๐“ธ", f09d93b8), _c(U+1D4F9, "๐“น", f09d93b9), _c(U+1D4FA, "๐“บ", f09d93ba), _c(U+1D4FB, "๐“ป", f09d93bb), _c(U+1D4FC, "๐“ผ", f09d93bc), _c(U+1D4FD, "๐“ฝ", f09d93bd), _c(U+1D4FE, "๐“พ", f09d93be), _c(U+1D4FF, "๐“ฟ", f09d93bf), _c(U+1F600, "๐Ÿ˜€", f09f9880), _c(U+1F601, "๐Ÿ˜", f09f9881), _c(U+1F602, "๐Ÿ˜‚", f09f9882), _c(U+1F603, "๐Ÿ˜ƒ", f09f9883), _c(U+1F604, "๐Ÿ˜„", f09f9884), _c(U+1F605, "๐Ÿ˜…", f09f9885), _c(U+1F606, "๐Ÿ˜†", f09f9886), _c(U+1F607, "๐Ÿ˜‡", f09f9887), _c(U+1F608, "๐Ÿ˜ˆ", f09f9888), _c(U+1F609, "๐Ÿ˜‰", f09f9889), _c(U+1F60A, "๐Ÿ˜Š", f09f988a), _c(U+1F60B, "๐Ÿ˜‹", f09f988b), _c(U+1F60C, "๐Ÿ˜Œ", f09f988c), _c(U+1F60D, "๐Ÿ˜", f09f988d), _c(U+1F60E, "๐Ÿ˜Ž", f09f988e), _c(U+1F60F, "๐Ÿ˜", f09f988f), _c(U+1F610, "๐Ÿ˜", f09f9890), _c(U+1F611, "๐Ÿ˜‘", f09f9891), _c(U+1F612, "๐Ÿ˜’", f09f9892), _c(U+1F613, "๐Ÿ˜“", f09f9893), _c(U+1F614, "๐Ÿ˜”", f09f9894), _c(U+1F615, "๐Ÿ˜•", f09f9895), _c(U+1F616, "๐Ÿ˜–", f09f9896), _c(U+1F617, "๐Ÿ˜—", f09f9897), _c(U+1F618, "๐Ÿ˜˜", f09f9898), _c(U+1F619, "๐Ÿ˜™", f09f9899), _c(U+1F61A, "๐Ÿ˜š", f09f989a), _c(U+1F61B, "๐Ÿ˜›", f09f989b), _c(U+1F61C, "๐Ÿ˜œ", f09f989c), _c(U+1F61D, "๐Ÿ˜", f09f989d), _c(U+1F61E, "๐Ÿ˜ž", f09f989e), _c(U+1F61F, "๐Ÿ˜Ÿ", f09f989f), _c(U+1F620, "๐Ÿ˜ ", f09f98a0), _c(U+1F621, "๐Ÿ˜ก", f09f98a1), _c(U+1F622, "๐Ÿ˜ข", f09f98a2), _c(U+1F623, "๐Ÿ˜ฃ", f09f98a3), _c(U+1F624, "๐Ÿ˜ค", f09f98a4), _c(U+1F625, "๐Ÿ˜ฅ", f09f98a5), _c(U+1F626, "๐Ÿ˜ฆ", f09f98a6), _c(U+1F627, "๐Ÿ˜ง", f09f98a7), _c(U+1F628, "๐Ÿ˜จ", f09f98a8), _c(U+1F629, "๐Ÿ˜ฉ", f09f98a9), _c(U+1F62A, "๐Ÿ˜ช", f09f98aa), _c(U+1F62B, "๐Ÿ˜ซ", f09f98ab), _c(U+1F62C, "๐Ÿ˜ฌ", f09f98ac), _c(U+1F62D, "๐Ÿ˜ญ", f09f98ad), _c(U+1F62E, "๐Ÿ˜ฎ", f09f98ae), _c(U+1F62F, "๐Ÿ˜ฏ", f09f98af), _c(U+1F630, "๐Ÿ˜ฐ", f09f98b0), _c(U+1F631, "๐Ÿ˜ฑ", f09f98b1), _c(U+1F632, "๐Ÿ˜ฒ", f09f98b2), _c(U+1F633, "๐Ÿ˜ณ", f09f98b3), _c(U+1F634, "๐Ÿ˜ด", f09f98b4), _c(U+1F635, "๐Ÿ˜ต", f09f98b5), _c(U+1F636, "๐Ÿ˜ถ", f09f98b6), _c(U+1F637, "๐Ÿ˜ท", f09f98b7), _c(U+1F638, "๐Ÿ˜ธ", f09f98b8), _c(U+1F639, "๐Ÿ˜น", f09f98b9), _c(U+1F63A, "๐Ÿ˜บ", f09f98ba), _c(U+1F63B, "๐Ÿ˜ป", f09f98bb), _c(U+1F63C, "๐Ÿ˜ผ", f09f98bc), _c(U+1F63D, "๐Ÿ˜ฝ", f09f98bd), _c(U+1F63E, "๐Ÿ˜พ", f09f98be), _c(U+1F63F, "๐Ÿ˜ฟ", f09f98bf), _c(U+1F640, "๐Ÿ™€", f09f9980), _c(U+1F641, "๐Ÿ™", f09f9981), _c(U+1F642, "๐Ÿ™‚", f09f9982), _c(U+1F643, "๐Ÿ™ƒ", f09f9983), _c(U+1F644, "๐Ÿ™„", f09f9984), _c(U+1F645, "๐Ÿ™…", f09f9985), _c(U+1F646, "๐Ÿ™†", f09f9986), _c(U+1F647, "๐Ÿ™‡", f09f9987), _c(U+1F648, "๐Ÿ™ˆ", f09f9988), _c(U+1F649, "๐Ÿ™‰", f09f9989), _c(U+1F64A, "๐Ÿ™Š", f09f998a), _c(U+1F64B, "๐Ÿ™‹", f09f998b), _c(U+1F64C, "๐Ÿ™Œ", f09f998c), _c(U+1F64D, "๐Ÿ™", f09f998d), _c(U+1F64E, "๐Ÿ™Ž", f09f998e), _c(U+1F64F, "๐Ÿ™", f09f998f), _c(U+1F650, "๐Ÿ™", f09f9990), _c(U+1F651, "๐Ÿ™‘", f09f9991), _c(U+1F652, "๐Ÿ™’", f09f9992), _c(U+1F653, "๐Ÿ™“", f09f9993), _c(U+1F654, "๐Ÿ™”", f09f9994), _c(U+1F655, "๐Ÿ™•", f09f9995), _c(U+1F656, "๐Ÿ™–", f09f9996), _c(U+1F657, "๐Ÿ™—", f09f9997), _c(U+1F658, "๐Ÿ™˜", f09f9998), _c(U+1F659, "๐Ÿ™™", f09f9999), _c(U+1F65A, "๐Ÿ™š", f09f999a), _c(U+1F65B, "๐Ÿ™›", f09f999b), _c(U+1F65C, "๐Ÿ™œ", f09f999c), _c(U+1F65D, "๐Ÿ™", f09f999d), _c(U+1F65E, "๐Ÿ™ž", f09f999e), _c(U+1F65F, "๐Ÿ™Ÿ", f09f999f), _c(U+1F660, "๐Ÿ™ ", f09f99a0), _c(U+1F661, "๐Ÿ™ก", f09f99a1), _c(U+1F662, "๐Ÿ™ข", f09f99a2), _c(U+1F663, "๐Ÿ™ฃ", f09f99a3), _c(U+1F664, "๐Ÿ™ค", f09f99a4), _c(U+1F665, "๐Ÿ™ฅ", f09f99a5), _c(U+1F666, "๐Ÿ™ฆ", f09f99a6), _c(U+1F667, "๐Ÿ™ง", f09f99a7), _c(U+1F668, "๐Ÿ™จ", f09f99a8), _c(U+1F669, "๐Ÿ™ฉ", f09f99a9), _c(U+1F66A, "๐Ÿ™ช", f09f99aa), _c(U+1F66B, "๐Ÿ™ซ", f09f99ab), _c(U+1F66C, "๐Ÿ™ฌ", f09f99ac), _c(U+1F66D, "๐Ÿ™ญ", f09f99ad), _c(U+1F66E, "๐Ÿ™ฎ", f09f99ae), _c(U+1F66F, "๐Ÿ™ฏ", f09f99af), _c(U+1F670, "๐Ÿ™ฐ", f09f99b0), _c(U+1F671, "๐Ÿ™ฑ", f09f99b1), _c(U+1F672, "๐Ÿ™ฒ", f09f99b2), _c(U+1F673, "๐Ÿ™ณ", f09f99b3), _c(U+1F674, "๐Ÿ™ด", f09f99b4), _c(U+1F675, "๐Ÿ™ต", f09f99b5), _c(U+1F676, "๐Ÿ™ถ", f09f99b6), _c(U+1F677, "๐Ÿ™ท", f09f99b7), _c(U+1F678, "๐Ÿ™ธ", f09f99b8), _c(U+1F679, "๐Ÿ™น", f09f99b9), _c(U+1F67A, "๐Ÿ™บ", f09f99ba), _c(U+1F67B, "๐Ÿ™ป", f09f99bb), _c(U+1F67C, "๐Ÿ™ผ", f09f99bc), _c(U+1F67D, "๐Ÿ™ฝ", f09f99bd), _c(U+1F67E, "๐Ÿ™พ", f09f99be), _c(U+1F67F, "๐Ÿ™ฟ", f09f99bf), _c(U+1F680, "๐Ÿš€", f09f9a80), _c(U+1F681, "๐Ÿš", f09f9a81), _c(U+1F682, "๐Ÿš‚", f09f9a82), _c(U+1F683, "๐Ÿšƒ", f09f9a83), _c(U+1F684, "๐Ÿš„", f09f9a84), _c(U+1F685, "๐Ÿš…", f09f9a85), _c(U+1F686, "๐Ÿš†", f09f9a86), _c(U+1F687, "๐Ÿš‡", f09f9a87), _c(U+1F688, "๐Ÿšˆ", f09f9a88), _c(U+1F689, "๐Ÿš‰", f09f9a89), _c(U+1F68A, "๐ŸšŠ", f09f9a8a), _c(U+1F68B, "๐Ÿš‹", f09f9a8b), _c(U+1F68C, "๐ŸšŒ", f09f9a8c), _c(U+1F68D, "๐Ÿš", f09f9a8d), _c(U+1F68E, "๐ŸšŽ", f09f9a8e), _c(U+1F68F, "๐Ÿš", f09f9a8f), _c(U+1F690, "๐Ÿš", f09f9a90), _c(U+1F691, "๐Ÿš‘", f09f9a91), _c(U+1F692, "๐Ÿš’", f09f9a92), _c(U+1F693, "๐Ÿš“", f09f9a93), _c(U+1F694, "๐Ÿš”", f09f9a94), _c(U+1F695, "๐Ÿš•", f09f9a95), _c(U+1F696, "๐Ÿš–", f09f9a96), _c(U+1F697, "๐Ÿš—", f09f9a97), _c(U+1F698, "๐Ÿš˜", f09f9a98), _c(U+1F699, "๐Ÿš™", f09f9a99), _c(U+1F69A, "๐Ÿšš", f09f9a9a), _c(U+1F69B, "๐Ÿš›", f09f9a9b), _c(U+1F69C, "๐Ÿšœ", f09f9a9c), _c(U+1F69D, "๐Ÿš", f09f9a9d), _c(U+1F69E, "๐Ÿšž", f09f9a9e), _c(U+1F69F, "๐ŸšŸ", f09f9a9f), _c(U+1F6A0, "๐Ÿš ", f09f9aa0), _c(U+1F6A1, "๐Ÿšก", f09f9aa1), _c(U+1F6A2, "๐Ÿšข", f09f9aa2), _c(U+1F6A3, "๐Ÿšฃ", f09f9aa3), _c(U+1F6A4, "๐Ÿšค", f09f9aa4), _c(U+1F6A5, "๐Ÿšฅ", f09f9aa5), _c(U+1F6A6, "๐Ÿšฆ", f09f9aa6), _c(U+1F6A7, "๐Ÿšง", f09f9aa7), _c(U+1F6A8, "๐Ÿšจ", f09f9aa8), _c(U+1F6A9, "๐Ÿšฉ", f09f9aa9), _c(U+1F6AA, "๐Ÿšช", f09f9aaa), _c(U+1F6AB, "๐Ÿšซ", f09f9aab), _c(U+1F6AC, "๐Ÿšฌ", f09f9aac), _c(U+1F6AD, "๐Ÿšญ", f09f9aad), _c(U+1F6AE, "๐Ÿšฎ", f09f9aae), _c(U+1F6AF, "๐Ÿšฏ", f09f9aaf), _c(U+1F6B0, "๐Ÿšฐ", f09f9ab0), _c(U+1F6B1, "๐Ÿšฑ", f09f9ab1), _c(U+1F6B2, "๐Ÿšฒ", f09f9ab2), _c(U+1F6B3, "๐Ÿšณ", f09f9ab3), _c(U+1F6B4, "๐Ÿšด", f09f9ab4), _c(U+1F6B5, "๐Ÿšต", f09f9ab5), _c(U+1F6B6, "๐Ÿšถ", f09f9ab6), _c(U+1F6B7, "๐Ÿšท", f09f9ab7), _c(U+1F6B8, "๐Ÿšธ", f09f9ab8), _c(U+1F6B9, "๐Ÿšน", f09f9ab9), _c(U+1F6BA, "๐Ÿšบ", f09f9aba), _c(U+1F6BB, "๐Ÿšป", f09f9abb), _c(U+1F6BC, "๐Ÿšผ", f09f9abc), _c(U+1F6BD, "๐Ÿšฝ", f09f9abd), _c(U+1F6BE, "๐Ÿšพ", f09f9abe), _c(U+1F6BF, "๐Ÿšฟ", f09f9abf), _c(U+1F6C0, "๐Ÿ›€", f09f9b80), _c(U+1F6C1, "๐Ÿ›", f09f9b81), _c(U+1F6C2, "๐Ÿ›‚", f09f9b82), _c(U+1F6C3, "๐Ÿ›ƒ", f09f9b83), _c(U+1F6C4, "๐Ÿ›„", f09f9b84), _c(U+1F6C5, "๐Ÿ›…", f09f9b85), _c(U+1F6C6, "๐Ÿ›†", f09f9b86), _c(U+1F6C7, "๐Ÿ›‡", f09f9b87), _c(U+1F6C8, "๐Ÿ›ˆ", f09f9b88), _c(U+1F6C9, "๐Ÿ›‰", f09f9b89), _c(U+1F6CA, "๐Ÿ›Š", f09f9b8a), _c(U+1F6CB, "๐Ÿ›‹", f09f9b8b), _c(U+1F6CC, "๐Ÿ›Œ", f09f9b8c), _c(U+1F6CD, "๐Ÿ›", f09f9b8d), _c(U+1F6CE, "๐Ÿ›Ž", f09f9b8e), _c(U+1F6CF, "๐Ÿ›", f09f9b8f), _c(U+1F6D0, "๐Ÿ›", f09f9b90), _c(U+1F6D1, "๐Ÿ›‘", f09f9b91), _c(U+1F6D2, "๐Ÿ›’", f09f9b92), _c(U+1F6D3, "๐Ÿ›“", f09f9b93), _c(U+1F6D4, "๐Ÿ›”", f09f9b94), _c(U+1F6D5, "๐Ÿ›•", f09f9b95), _c(U+1F6D6, "๐Ÿ›–", f09f9b96), _c(U+1F6D7, "๐Ÿ›—", f09f9b97), _c(U+1F6D8, "๐Ÿ›˜", f09f9b98), _c(U+1F6D9, "๐Ÿ›™", f09f9b99), _c(U+1F6DA, "๐Ÿ›š", f09f9b9a), _c(U+1F6DB, "๐Ÿ››", f09f9b9b), _c(U+1F6DC, "๐Ÿ›œ", f09f9b9c), _c(U+1F6DD, "๐Ÿ›", f09f9b9d), _c(U+1F6DE, "๐Ÿ›ž", f09f9b9e), _c(U+1F6DF, "๐Ÿ›Ÿ", f09f9b9f), _c(U+1F6E0, "๐Ÿ› ", f09f9ba0), _c(U+1F6E1, "๐Ÿ›ก", f09f9ba1), _c(U+1F6E2, "๐Ÿ›ข", f09f9ba2), _c(U+1F6E3, "๐Ÿ›ฃ", f09f9ba3), _c(U+1F6E4, "๐Ÿ›ค", f09f9ba4), _c(U+1F6E5, "๐Ÿ›ฅ", f09f9ba5), _c(U+1F6E6, "๐Ÿ›ฆ", f09f9ba6), _c(U+1F6E7, "๐Ÿ›ง", f09f9ba7), _c(U+1F6E8, "๐Ÿ›จ", f09f9ba8), _c(U+1F6E9, "๐Ÿ›ฉ", f09f9ba9), _c(U+1F6EA, "๐Ÿ›ช", f09f9baa), _c(U+1F6EB, "๐Ÿ›ซ", f09f9bab), _c(U+1F6EC, "๐Ÿ›ฌ", f09f9bac), _c(U+1F6ED, "๐Ÿ›ญ", f09f9bad), _c(U+1F6EE, "๐Ÿ›ฎ", f09f9bae), _c(U+1F6EF, "๐Ÿ›ฏ", f09f9baf), _c(U+1F6F0, "๐Ÿ›ฐ", f09f9bb0), _c(U+1F6F1, "๐Ÿ›ฑ", f09f9bb1), _c(U+1F6F2, "๐Ÿ›ฒ", f09f9bb2), _c(U+1F6F3, "๐Ÿ›ณ", f09f9bb3), _c(U+1F6F4, "๐Ÿ›ด", f09f9bb4), _c(U+1F6F5, "๐Ÿ›ต", f09f9bb5), _c(U+1F6F6, "๐Ÿ›ถ", f09f9bb6), _c(U+1F6F7, "๐Ÿ›ท", f09f9bb7), _c(U+1F6F8, "๐Ÿ›ธ", f09f9bb8), _c(U+1F6F9, "๐Ÿ›น", f09f9bb9), _c(U+1F6FA, "๐Ÿ›บ", f09f9bba), _c(U+1F6FB, "๐Ÿ›ป", f09f9bbb), _c(U+1F6FC, "๐Ÿ›ผ", f09f9bbc), _c(U+1F6FD, "๐Ÿ›ฝ", f09f9bbd), _c(U+1F6FE, "๐Ÿ›พ", f09f9bbe), _c(U+1F6FF, "๐Ÿ›ฟ", f09f9bbf), _c(U+1F700, "๐Ÿœ€", f09f9c80), _c(U+1F701, "๐Ÿœ", f09f9c81), _c(U+1F702, "๐Ÿœ‚", f09f9c82), _c(U+1F703, "๐Ÿœƒ", f09f9c83), _c(U+1F704, "๐Ÿœ„", f09f9c84), _c(U+1F705, "๐Ÿœ…", f09f9c85), _c(U+1F706, "๐Ÿœ†", f09f9c86), _c(U+1F707, "๐Ÿœ‡", f09f9c87), _c(U+1F708, "๐Ÿœˆ", f09f9c88), _c(U+1F709, "๐Ÿœ‰", f09f9c89), _c(U+1F70A, "๐ŸœŠ", f09f9c8a), _c(U+1F70B, "๐Ÿœ‹", f09f9c8b), _c(U+1F70C, "๐ŸœŒ", f09f9c8c), _c(U+1F70D, "๐Ÿœ", f09f9c8d), _c(U+1F70E, "๐ŸœŽ", f09f9c8e), _c(U+1F70F, "๐Ÿœ", f09f9c8f), _c(U+1F710, "๐Ÿœ", f09f9c90), _c(U+1F711, "๐Ÿœ‘", f09f9c91), _c(U+1F712, "๐Ÿœ’", f09f9c92), _c(U+1F713, "๐Ÿœ“", f09f9c93), _c(U+1F714, "๐Ÿœ”", f09f9c94), _c(U+1F715, "๐Ÿœ•", f09f9c95), _c(U+1F716, "๐Ÿœ–", f09f9c96), _c(U+1F717, "๐Ÿœ—", f09f9c97), _c(U+1F718, "๐Ÿœ˜", f09f9c98), _c(U+1F719, "๐Ÿœ™", f09f9c99), _c(U+1F71A, "๐Ÿœš", f09f9c9a), _c(U+1F71B, "๐Ÿœ›", f09f9c9b), _c(U+1F71C, "๐Ÿœœ", f09f9c9c), _c(U+1F71D, "๐Ÿœ", f09f9c9d), _c(U+1F71E, "๐Ÿœž", f09f9c9e), _c(U+1F71F, "๐ŸœŸ", f09f9c9f), _c(U+1F720, "๐Ÿœ ", f09f9ca0), _c(U+1F721, "๐Ÿœก", f09f9ca1), _c(U+1F722, "๐Ÿœข", f09f9ca2), _c(U+1F723, "๐Ÿœฃ", f09f9ca3), _c(U+1F724, "๐Ÿœค", f09f9ca4), _c(U+1F725, "๐Ÿœฅ", f09f9ca5), _c(U+1F726, "๐Ÿœฆ", f09f9ca6), _c(U+1F727, "๐Ÿœง", f09f9ca7), _c(U+1F728, "๐Ÿœจ", f09f9ca8), _c(U+1F729, "๐Ÿœฉ", f09f9ca9), _c(U+1F72A, "๐Ÿœช", f09f9caa), _c(U+1F72B, "๐Ÿœซ", f09f9cab), _c(U+1F72C, "๐Ÿœฌ", f09f9cac), _c(U+1F72D, "๐Ÿœญ", f09f9cad), _c(U+1F72E, "๐Ÿœฎ", f09f9cae), _c(U+1F72F, "๐Ÿœฏ", f09f9caf), _c(U+1F730, "๐Ÿœฐ", f09f9cb0), _c(U+1F731, "๐Ÿœฑ", f09f9cb1), _c(U+1F732, "๐Ÿœฒ", f09f9cb2), _c(U+1F733, "๐Ÿœณ", f09f9cb3), _c(U+1F734, "๐Ÿœด", f09f9cb4), _c(U+1F735, "๐Ÿœต", f09f9cb5), _c(U+1F736, "๐Ÿœถ", f09f9cb6), _c(U+1F737, "๐Ÿœท", f09f9cb7), _c(U+1F738, "๐Ÿœธ", f09f9cb8), _c(U+1F739, "๐Ÿœน", f09f9cb9), _c(U+1F73A, "๐Ÿœบ", f09f9cba), _c(U+1F73B, "๐Ÿœป", f09f9cbb), _c(U+1F73C, "๐Ÿœผ", f09f9cbc), _c(U+1F73D, "๐Ÿœฝ", f09f9cbd), _c(U+1F73E, "๐Ÿœพ", f09f9cbe), _c(U+1F73F, "๐Ÿœฟ", f09f9cbf), _c(U+1F740, "๐Ÿ€", f09f9d80), _c(U+1F741, "๐Ÿ", f09f9d81), _c(U+1F742, "๐Ÿ‚", f09f9d82), _c(U+1F743, "๐Ÿƒ", f09f9d83), _c(U+1F744, "๐Ÿ„", f09f9d84), _c(U+1F745, "๐Ÿ…", f09f9d85), _c(U+1F746, "๐Ÿ†", f09f9d86), _c(U+1F747, "๐Ÿ‡", f09f9d87), _c(U+1F748, "๐Ÿˆ", f09f9d88), _c(U+1F749, "๐Ÿ‰", f09f9d89), _c(U+1F74A, "๐ŸŠ", f09f9d8a), _c(U+1F74B, "๐Ÿ‹", f09f9d8b), _c(U+1F74C, "๐ŸŒ", f09f9d8c), _c(U+1F74D, "๐Ÿ", f09f9d8d), _c(U+1F74E, "๐ŸŽ", f09f9d8e), _c(U+1F74F, "๐Ÿ", f09f9d8f), _c(U+1F750, "๐Ÿ", f09f9d90), _c(U+1F751, "๐Ÿ‘", f09f9d91), _c(U+1F752, "๐Ÿ’", f09f9d92), _c(U+1F753, "๐Ÿ“", f09f9d93), _c(U+1F754, "๐Ÿ”", f09f9d94), _c(U+1F755, "๐Ÿ•", f09f9d95), _c(U+1F756, "๐Ÿ–", f09f9d96), _c(U+1F757, "๐Ÿ—", f09f9d97), _c(U+1F758, "๐Ÿ˜", f09f9d98), _c(U+1F759, "๐Ÿ™", f09f9d99), _c(U+1F75A, "๐Ÿš", f09f9d9a), _c(U+1F75B, "๐Ÿ›", f09f9d9b), _c(U+1F75C, "๐Ÿœ", f09f9d9c), _c(U+1F75D, "๐Ÿ", f09f9d9d), _c(U+1F75E, "๐Ÿž", f09f9d9e), _c(U+1F75F, "๐ŸŸ", f09f9d9f), _c(U+1F760, "๐Ÿ ", f09f9da0), _c(U+1F761, "๐Ÿก", f09f9da1), _c(U+1F762, "๐Ÿข", f09f9da2), _c(U+1F763, "๐Ÿฃ", f09f9da3), _c(U+1F764, "๐Ÿค", f09f9da4), _c(U+1F765, "๐Ÿฅ", f09f9da5), _c(U+1F766, "๐Ÿฆ", f09f9da6), _c(U+1F767, "๐Ÿง", f09f9da7), _c(U+1F768, "๐Ÿจ", f09f9da8), _c(U+1F769, "๐Ÿฉ", f09f9da9), _c(U+1F76A, "๐Ÿช", f09f9daa), _c(U+1F76B, "๐Ÿซ", f09f9dab), _c(U+1F76C, "๐Ÿฌ", f09f9dac), _c(U+1F76D, "๐Ÿญ", f09f9dad), _c(U+1F76E, "๐Ÿฎ", f09f9dae), _c(U+1F76F, "๐Ÿฏ", f09f9daf), _c(U+1F770, "๐Ÿฐ", f09f9db0), _c(U+1F771, "๐Ÿฑ", f09f9db1), _c(U+1F772, "๐Ÿฒ", f09f9db2), _c(U+1F773, "๐Ÿณ", f09f9db3), _c(U+1F774, "๐Ÿด", f09f9db4), _c(U+1F775, "๐Ÿต", f09f9db5), _c(U+1F776, "๐Ÿถ", f09f9db6), _c(U+1F777, "๐Ÿท", f09f9db7), _c(U+1F778, "๐Ÿธ", f09f9db8), _c(U+1F779, "๐Ÿน", f09f9db9), _c(U+1F77A, "๐Ÿบ", f09f9dba), _c(U+1F77B, "๐Ÿป", f09f9dbb), _c(U+1F77C, "๐Ÿผ", f09f9dbc), _c(U+1F77D, "๐Ÿฝ", f09f9dbd), _c(U+1F77E, "๐Ÿพ", f09f9dbe), _c(U+1F77F, "๐Ÿฟ", f09f9dbf), _c(U+1F780, "๐Ÿž€", f09f9e80), _c(U+1F781, "๐Ÿž", f09f9e81), _c(U+1F782, "๐Ÿž‚", f09f9e82), _c(U+1F783, "๐Ÿžƒ", f09f9e83), _c(U+1F784, "๐Ÿž„", f09f9e84), _c(U+1F785, "๐Ÿž…", f09f9e85), _c(U+1F786, "๐Ÿž†", f09f9e86), _c(U+1F787, "๐Ÿž‡", f09f9e87), _c(U+1F788, "๐Ÿžˆ", f09f9e88), _c(U+1F789, "๐Ÿž‰", f09f9e89), _c(U+1F78A, "๐ŸžŠ", f09f9e8a), _c(U+1F78B, "๐Ÿž‹", f09f9e8b), _c(U+1F78C, "๐ŸžŒ", f09f9e8c), _c(U+1F78D, "๐Ÿž", f09f9e8d), _c(U+1F78E, "๐ŸžŽ", f09f9e8e), _c(U+1F78F, "๐Ÿž", f09f9e8f), _c(U+1F790, "๐Ÿž", f09f9e90), _c(U+1F791, "๐Ÿž‘", f09f9e91), _c(U+1F792, "๐Ÿž’", f09f9e92), _c(U+1F793, "๐Ÿž“", f09f9e93), _c(U+1F794, "๐Ÿž”", f09f9e94), _c(U+1F795, "๐Ÿž•", f09f9e95), _c(U+1F796, "๐Ÿž–", f09f9e96), _c(U+1F797, "๐Ÿž—", f09f9e97), _c(U+1F798, "๐Ÿž˜", f09f9e98), _c(U+1F799, "๐Ÿž™", f09f9e99), _c(U+1F79A, "๐Ÿžš", f09f9e9a), _c(U+1F79B, "๐Ÿž›", f09f9e9b), _c(U+1F79C, "๐Ÿžœ", f09f9e9c), _c(U+1F79D, "๐Ÿž", f09f9e9d), _c(U+1F79E, "๐Ÿžž", f09f9e9e), _c(U+1F79F, "๐ŸžŸ", f09f9e9f), _c(U+1F7A0, "๐Ÿž ", f09f9ea0), _c(U+1F7A1, "๐Ÿžก", f09f9ea1), _c(U+1F7A2, "๐Ÿžข", f09f9ea2), _c(U+1F7A3, "๐Ÿžฃ", f09f9ea3), _c(U+1F7A4, "๐Ÿžค", f09f9ea4), _c(U+1F7A5, "๐Ÿžฅ", f09f9ea5), _c(U+1F7A6, "๐Ÿžฆ", f09f9ea6), _c(U+1F7A7, "๐Ÿžง", f09f9ea7), _c(U+1F7A8, "๐Ÿžจ", f09f9ea8), _c(U+1F7A9, "๐Ÿžฉ", f09f9ea9), _c(U+1F7AA, "๐Ÿžช", f09f9eaa), _c(U+1F7AB, "๐Ÿžซ", f09f9eab), _c(U+1F7AC, "๐Ÿžฌ", f09f9eac), _c(U+1F7AD, "๐Ÿžญ", f09f9ead), _c(U+1F7AE, "๐Ÿžฎ", f09f9eae), _c(U+1F7AF, "๐Ÿžฏ", f09f9eaf), _c(U+1F7B0, "๐Ÿžฐ", f09f9eb0), _c(U+1F7B1, "๐Ÿžฑ", f09f9eb1), _c(U+1F7B2, "๐Ÿžฒ", f09f9eb2), _c(U+1F7B3, "๐Ÿžณ", f09f9eb3), _c(U+1F7B4, "๐Ÿžด", f09f9eb4), _c(U+1F7B5, "๐Ÿžต", f09f9eb5), _c(U+1F7B6, "๐Ÿžถ", f09f9eb6), _c(U+1F7B7, "๐Ÿžท", f09f9eb7), _c(U+1F7B8, "๐Ÿžธ", f09f9eb8), _c(U+1F7B9, "๐Ÿžน", f09f9eb9), _c(U+1F7BA, "๐Ÿžบ", f09f9eba), _c(U+1F7BB, "๐Ÿžป", f09f9ebb), _c(U+1F7BC, "๐Ÿžผ", f09f9ebc), _c(U+1F7BD, "๐Ÿžฝ", f09f9ebd), _c(U+1F7BE, "๐Ÿžพ", f09f9ebe), _c(U+1F7BF, "๐Ÿžฟ", f09f9ebf), _c(U+1F7C0, "๐ŸŸ€", f09f9f80), _c(U+1F7C1, "๐ŸŸ", f09f9f81), _c(U+1F7C2, "๐ŸŸ‚", f09f9f82), _c(U+1F7C3, "๐ŸŸƒ", f09f9f83), _c(U+1F7C4, "๐ŸŸ„", f09f9f84), _c(U+1F7C5, "๐ŸŸ…", f09f9f85), _c(U+1F7C6, "๐ŸŸ†", f09f9f86), _c(U+1F7C7, "๐ŸŸ‡", f09f9f87), _c(U+1F7C8, "๐ŸŸˆ", f09f9f88), _c(U+1F7C9, "๐ŸŸ‰", f09f9f89), _c(U+1F7CA, "๐ŸŸŠ", f09f9f8a), _c(U+1F7CB, "๐ŸŸ‹", f09f9f8b), _c(U+1F7CC, "๐ŸŸŒ", f09f9f8c), _c(U+1F7CD, "๐ŸŸ", f09f9f8d), _c(U+1F7CE, "๐ŸŸŽ", f09f9f8e), _c(U+1F7CF, "๐ŸŸ", f09f9f8f), _c(U+1F7D0, "๐ŸŸ", f09f9f90), _c(U+1F7D1, "๐ŸŸ‘", f09f9f91), _c(U+1F7D2, "๐ŸŸ’", f09f9f92), _c(U+1F7D3, "๐ŸŸ“", f09f9f93), _c(U+1F7D4, "๐ŸŸ”", f09f9f94), _c(U+1F7D5, "๐ŸŸ•", f09f9f95), _c(U+1F7D6, "๐ŸŸ–", f09f9f96), _c(U+1F7D7, "๐ŸŸ—", f09f9f97), _c(U+1F7D8, "๐ŸŸ˜", f09f9f98), _c(U+1F7D9, "๐ŸŸ™", f09f9f99), _c(U+1F7DA, "๐ŸŸš", f09f9f9a), _c(U+1F7DB, "๐ŸŸ›", f09f9f9b), _c(U+1F7DC, "๐ŸŸœ", f09f9f9c), _c(U+1F7DD, "๐ŸŸ", f09f9f9d), _c(U+1F7DE, "๐ŸŸž", f09f9f9e), _c(U+1F7DF, "๐ŸŸŸ", f09f9f9f), _c(U+1F7E0, "๐ŸŸ ", f09f9fa0), _c(U+1F7E1, "๐ŸŸก", f09f9fa1), _c(U+1F7E2, "๐ŸŸข", f09f9fa2), _c(U+1F7E3, "๐ŸŸฃ", f09f9fa3), _c(U+1F7E4, "๐ŸŸค", f09f9fa4), _c(U+1F7E5, "๐ŸŸฅ", f09f9fa5), _c(U+1F7E6, "๐ŸŸฆ", f09f9fa6), _c(U+1F7E7, "๐ŸŸง", f09f9fa7), _c(U+1F7E8, "๐ŸŸจ", f09f9fa8), _c(U+1F7E9, "๐ŸŸฉ", f09f9fa9), _c(U+1F7EA, "๐ŸŸช", f09f9faa), _c(U+1F7EB, "๐ŸŸซ", f09f9fab), _c(U+1F7EC, "๐ŸŸฌ", f09f9fac), _c(U+1F7ED, "๐ŸŸญ", f09f9fad), _c(U+1F7EE, "๐ŸŸฎ", f09f9fae), _c(U+1F7EF, "๐ŸŸฏ", f09f9faf), _c(U+1F7F0, "๐ŸŸฐ", f09f9fb0), _c(U+1F7F1, "๐ŸŸฑ", f09f9fb1), _c(U+1F7F2, "๐ŸŸฒ", f09f9fb2), _c(U+1F7F3, "๐ŸŸณ", f09f9fb3), _c(U+1F7F4, "๐ŸŸด", f09f9fb4), _c(U+1F7F5, "๐ŸŸต", f09f9fb5), _c(U+1F7F6, "๐ŸŸถ", f09f9fb6), _c(U+1F7F7, "๐ŸŸท", f09f9fb7), _c(U+1F7F8, "๐ŸŸธ", f09f9fb8), _c(U+1F7F9, "๐ŸŸน", f09f9fb9), _c(U+1F7FA, "๐ŸŸบ", f09f9fba), _c(U+1F7FB, "๐ŸŸป", f09f9fbb), _c(U+1F7FC, "๐ŸŸผ", f09f9fbc), _c(U+1F7FD, "๐ŸŸฝ", f09f9fbd), _c(U+1F7FE, "๐ŸŸพ", f09f9fbe), _c(U+1F7FF, "๐ŸŸฟ", f09f9fbf), _c(U+1F800, "๐Ÿ €", f09fa080), _c(U+1F801, "๐Ÿ ", f09fa081), _c(U+1F802, "๐Ÿ ‚", f09fa082), _c(U+1F803, "๐Ÿ ƒ", f09fa083), _c(U+1F804, "๐Ÿ „", f09fa084), _c(U+1F805, "๐Ÿ …", f09fa085), _c(U+1F806, "๐Ÿ †", f09fa086), _c(U+1F807, "๐Ÿ ‡", f09fa087), _c(U+1F808, "๐Ÿ ˆ", f09fa088), _c(U+1F809, "๐Ÿ ‰", f09fa089), _c(U+1F80A, "๐Ÿ Š", f09fa08a), _c(U+1F80B, "๐Ÿ ‹", f09fa08b), _c(U+1F80C, "๐Ÿ Œ", f09fa08c), _c(U+1F80D, "๐Ÿ ", f09fa08d), _c(U+1F80E, "๐Ÿ Ž", f09fa08e), _c(U+1F80F, "๐Ÿ ", f09fa08f), _c(U+1F810, "๐Ÿ ", f09fa090), _c(U+1F811, "๐Ÿ ‘", f09fa091), _c(U+1F812, "๐Ÿ ’", f09fa092), _c(U+1F813, "๐Ÿ “", f09fa093), _c(U+1F814, "๐Ÿ ”", f09fa094), _c(U+1F815, "๐Ÿ •", f09fa095), _c(U+1F816, "๐Ÿ –", f09fa096), _c(U+1F817, "๐Ÿ —", f09fa097), _c(U+1F818, "๐Ÿ ˜", f09fa098), _c(U+1F819, "๐Ÿ ™", f09fa099), _c(U+1F81A, "๐Ÿ š", f09fa09a), _c(U+1F81B, "๐Ÿ ›", f09fa09b), _c(U+1F81C, "๐Ÿ œ", f09fa09c), _c(U+1F81D, "๐Ÿ ", f09fa09d), _c(U+1F81E, "๐Ÿ ž", f09fa09e), _c(U+1F81F, "๐Ÿ Ÿ", f09fa09f), _c(U+1F820, "๐Ÿ  ", f09fa0a0), _c(U+1F821, "๐Ÿ ก", f09fa0a1), _c(U+1F822, "๐Ÿ ข", f09fa0a2), _c(U+1F823, "๐Ÿ ฃ", f09fa0a3), _c(U+1F824, "๐Ÿ ค", f09fa0a4), _c(U+1F825, "๐Ÿ ฅ", f09fa0a5), _c(U+1F826, "๐Ÿ ฆ", f09fa0a6), _c(U+1F827, "๐Ÿ ง", f09fa0a7), _c(U+1F828, "๐Ÿ จ", f09fa0a8), _c(U+1F829, "๐Ÿ ฉ", f09fa0a9), _c(U+1F82A, "๐Ÿ ช", f09fa0aa), _c(U+1F82B, "๐Ÿ ซ", f09fa0ab), _c(U+1F82C, "๐Ÿ ฌ", f09fa0ac), _c(U+1F82D, "๐Ÿ ญ", f09fa0ad), _c(U+1F82E, "๐Ÿ ฎ", f09fa0ae), _c(U+1F82F, "๐Ÿ ฏ", f09fa0af), _c(U+1F830, "๐Ÿ ฐ", f09fa0b0), _c(U+1F831, "๐Ÿ ฑ", f09fa0b1), _c(U+1F832, "๐Ÿ ฒ", f09fa0b2), _c(U+1F833, "๐Ÿ ณ", f09fa0b3), _c(U+1F834, "๐Ÿ ด", f09fa0b4), _c(U+1F835, "๐Ÿ ต", f09fa0b5), _c(U+1F836, "๐Ÿ ถ", f09fa0b6), _c(U+1F837, "๐Ÿ ท", f09fa0b7), _c(U+1F838, "๐Ÿ ธ", f09fa0b8), _c(U+1F839, "๐Ÿ น", f09fa0b9), _c(U+1F83A, "๐Ÿ บ", f09fa0ba), _c(U+1F83B, "๐Ÿ ป", f09fa0bb), _c(U+1F83C, "๐Ÿ ผ", f09fa0bc), _c(U+1F83D, "๐Ÿ ฝ", f09fa0bd), _c(U+1F83E, "๐Ÿ พ", f09fa0be), _c(U+1F83F, "๐Ÿ ฟ", f09fa0bf), _c(U+1F840, "๐Ÿก€", f09fa180), _c(U+1F841, "๐Ÿก", f09fa181), _c(U+1F842, "๐Ÿก‚", f09fa182), _c(U+1F843, "๐Ÿกƒ", f09fa183), _c(U+1F844, "๐Ÿก„", f09fa184), _c(U+1F845, "๐Ÿก…", f09fa185), _c(U+1F846, "๐Ÿก†", f09fa186), _c(U+1F847, "๐Ÿก‡", f09fa187), _c(U+1F848, "๐Ÿกˆ", f09fa188), _c(U+1F849, "๐Ÿก‰", f09fa189), _c(U+1F84A, "๐ŸกŠ", f09fa18a), _c(U+1F84B, "๐Ÿก‹", f09fa18b), _c(U+1F84C, "๐ŸกŒ", f09fa18c), _c(U+1F84D, "๐Ÿก", f09fa18d), _c(U+1F84E, "๐ŸกŽ", f09fa18e), _c(U+1F84F, "๐Ÿก", f09fa18f), _c(U+1F850, "๐Ÿก", f09fa190), _c(U+1F851, "๐Ÿก‘", f09fa191), _c(U+1F852, "๐Ÿก’", f09fa192), _c(U+1F853, "๐Ÿก“", f09fa193), _c(U+1F854, "๐Ÿก”", f09fa194), _c(U+1F855, "๐Ÿก•", f09fa195), _c(U+1F856, "๐Ÿก–", f09fa196), _c(U+1F857, "๐Ÿก—", f09fa197), _c(U+1F858, "๐Ÿก˜", f09fa198), _c(U+1F859, "๐Ÿก™", f09fa199), _c(U+1F85A, "๐Ÿกš", f09fa19a), _c(U+1F85B, "๐Ÿก›", f09fa19b), _c(U+1F85C, "๐Ÿกœ", f09fa19c), _c(U+1F85D, "๐Ÿก", f09fa19d), _c(U+1F85E, "๐Ÿกž", f09fa19e), _c(U+1F85F, "๐ŸกŸ", f09fa19f), _c(U+1F860, "๐Ÿก ", f09fa1a0), _c(U+1F861, "๐Ÿกก", f09fa1a1), _c(U+1F862, "๐Ÿกข", f09fa1a2), _c(U+1F863, "๐Ÿกฃ", f09fa1a3), _c(U+1F864, "๐Ÿกค", f09fa1a4), _c(U+1F865, "๐Ÿกฅ", f09fa1a5), _c(U+1F866, "๐Ÿกฆ", f09fa1a6), _c(U+1F867, "๐Ÿกง", f09fa1a7), _c(U+1F868, "๐Ÿกจ", f09fa1a8), _c(U+1F869, "๐Ÿกฉ", f09fa1a9), _c(U+1F86A, "๐Ÿกช", f09fa1aa), _c(U+1F86B, "๐Ÿกซ", f09fa1ab), _c(U+1F86C, "๐Ÿกฌ", f09fa1ac), _c(U+1F86D, "๐Ÿกญ", f09fa1ad), _c(U+1F86E, "๐Ÿกฎ", f09fa1ae), _c(U+1F86F, "๐Ÿกฏ", f09fa1af), _c(U+1F870, "๐Ÿกฐ", f09fa1b0), _c(U+1F871, "๐Ÿกฑ", f09fa1b1), _c(U+1F872, "๐Ÿกฒ", f09fa1b2), _c(U+1F873, "๐Ÿกณ", f09fa1b3), _c(U+1F874, "๐Ÿกด", f09fa1b4), _c(U+1F875, "๐Ÿกต", f09fa1b5), _c(U+1F876, "๐Ÿกถ", f09fa1b6), _c(U+1F877, "๐Ÿกท", f09fa1b7), _c(U+1F878, "๐Ÿกธ", f09fa1b8), _c(U+1F879, "๐Ÿกน", f09fa1b9), _c(U+1F87A, "๐Ÿกบ", f09fa1ba), _c(U+1F87B, "๐Ÿกป", f09fa1bb), _c(U+1F87C, "๐Ÿกผ", f09fa1bc), _c(U+1F87D, "๐Ÿกฝ", f09fa1bd), _c(U+1F87E, "๐Ÿกพ", f09fa1be), _c(U+1F87F, "๐Ÿกฟ", f09fa1bf), _c(U+1F880, "๐Ÿข€", f09fa280), _c(U+1F881, "๐Ÿข", f09fa281), _c(U+1F882, "๐Ÿข‚", f09fa282), _c(U+1F883, "๐Ÿขƒ", f09fa283), _c(U+1F884, "๐Ÿข„", f09fa284), _c(U+1F885, "๐Ÿข…", f09fa285), _c(U+1F886, "๐Ÿข†", f09fa286), _c(U+1F887, "๐Ÿข‡", f09fa287), _c(U+1F888, "๐Ÿขˆ", f09fa288), _c(U+1F889, "๐Ÿข‰", f09fa289), _c(U+1F88A, "๐ŸขŠ", f09fa28a), _c(U+1F88B, "๐Ÿข‹", f09fa28b), _c(U+1F88C, "๐ŸขŒ", f09fa28c), _c(U+1F88D, "๐Ÿข", f09fa28d), _c(U+1F88E, "๐ŸขŽ", f09fa28e), _c(U+1F88F, "๐Ÿข", f09fa28f), _c(U+1F890, "๐Ÿข", f09fa290), _c(U+1F891, "๐Ÿข‘", f09fa291), _c(U+1F892, "๐Ÿข’", f09fa292), _c(U+1F893, "๐Ÿข“", f09fa293), _c(U+1F894, "๐Ÿข”", f09fa294), _c(U+1F895, "๐Ÿข•", f09fa295), _c(U+1F896, "๐Ÿข–", f09fa296), _c(U+1F897, "๐Ÿข—", f09fa297), _c(U+1F898, "๐Ÿข˜", f09fa298), _c(U+1F899, "๐Ÿข™", f09fa299), _c(U+1F89A, "๐Ÿขš", f09fa29a), _c(U+1F89B, "๐Ÿข›", f09fa29b), _c(U+1F89C, "๐Ÿขœ", f09fa29c), _c(U+1F89D, "๐Ÿข", f09fa29d), _c(U+1F89E, "๐Ÿขž", f09fa29e), _c(U+1F89F, "๐ŸขŸ", f09fa29f), _c(U+1F8A0, "๐Ÿข ", f09fa2a0), _c(U+1F8A1, "๐Ÿขก", f09fa2a1), _c(U+1F8A2, "๐Ÿขข", f09fa2a2), _c(U+1F8A3, "๐Ÿขฃ", f09fa2a3), _c(U+1F8A4, "๐Ÿขค", f09fa2a4), _c(U+1F8A5, "๐Ÿขฅ", f09fa2a5), _c(U+1F8A6, "๐Ÿขฆ", f09fa2a6), _c(U+1F8A7, "๐Ÿขง", f09fa2a7), _c(U+1F8A8, "๐Ÿขจ", f09fa2a8), _c(U+1F8A9, "๐Ÿขฉ", f09fa2a9), _c(U+1F8AA, "๐Ÿขช", f09fa2aa), _c(U+1F8AB, "๐Ÿขซ", f09fa2ab), _c(U+1F8AC, "๐Ÿขฌ", f09fa2ac), _c(U+1F8AD, "๐Ÿขญ", f09fa2ad), _c(U+1F8AE, "๐Ÿขฎ", f09fa2ae), _c(U+1F8AF, "๐Ÿขฏ", f09fa2af), _c(U+1F8B0, "๐Ÿขฐ", f09fa2b0), _c(U+1F8B1, "๐Ÿขฑ", f09fa2b1), _c(U+1F8B2, "๐Ÿขฒ", f09fa2b2), _c(U+1F8B3, "๐Ÿขณ", f09fa2b3), _c(U+1F8B4, "๐Ÿขด", f09fa2b4), _c(U+1F8B5, "๐Ÿขต", f09fa2b5), _c(U+1F8B6, "๐Ÿขถ", f09fa2b6), _c(U+1F8B7, "๐Ÿขท", f09fa2b7), _c(U+1F8B8, "๐Ÿขธ", f09fa2b8), _c(U+1F8B9, "๐Ÿขน", f09fa2b9), _c(U+1F8BA, "๐Ÿขบ", f09fa2ba), _c(U+1F8BB, "๐Ÿขป", f09fa2bb), _c(U+1F8BC, "๐Ÿขผ", f09fa2bc), _c(U+1F8BD, "๐Ÿขฝ", f09fa2bd), _c(U+1F8BE, "๐Ÿขพ", f09fa2be), _c(U+1F8BF, "๐Ÿขฟ", f09fa2bf), _c(U+1F8C0, "๐Ÿฃ€", f09fa380), _c(U+1F8C1, "๐Ÿฃ", f09fa381), _c(U+1F8C2, "๐Ÿฃ‚", f09fa382), _c(U+1F8C3, "๐Ÿฃƒ", f09fa383), _c(U+1F8C4, "๐Ÿฃ„", f09fa384), _c(U+1F8C5, "๐Ÿฃ…", f09fa385), _c(U+1F8C6, "๐Ÿฃ†", f09fa386), _c(U+1F8C7, "๐Ÿฃ‡", f09fa387), _c(U+1F8C8, "๐Ÿฃˆ", f09fa388), _c(U+1F8C9, "๐Ÿฃ‰", f09fa389), _c(U+1F8CA, "๐ŸฃŠ", f09fa38a), _c(U+1F8CB, "๐Ÿฃ‹", f09fa38b), _c(U+1F8CC, "๐ŸฃŒ", f09fa38c), _c(U+1F8CD, "๐Ÿฃ", f09fa38d), _c(U+1F8CE, "๐ŸฃŽ", f09fa38e), _c(U+1F8CF, "๐Ÿฃ", f09fa38f), _c(U+1F8D0, "๐Ÿฃ", f09fa390), _c(U+1F8D1, "๐Ÿฃ‘", f09fa391), _c(U+1F8D2, "๐Ÿฃ’", f09fa392), _c(U+1F8D3, "๐Ÿฃ“", f09fa393), _c(U+1F8D4, "๐Ÿฃ”", f09fa394), _c(U+1F8D5, "๐Ÿฃ•", f09fa395), _c(U+1F8D6, "๐Ÿฃ–", f09fa396), _c(U+1F8D7, "๐Ÿฃ—", f09fa397), _c(U+1F8D8, "๐Ÿฃ˜", f09fa398), _c(U+1F8D9, "๐Ÿฃ™", f09fa399), _c(U+1F8DA, "๐Ÿฃš", f09fa39a), _c(U+1F8DB, "๐Ÿฃ›", f09fa39b), _c(U+1F8DC, "๐Ÿฃœ", f09fa39c), _c(U+1F8DD, "๐Ÿฃ", f09fa39d), _c(U+1F8DE, "๐Ÿฃž", f09fa39e), _c(U+1F8DF, "๐ŸฃŸ", f09fa39f), _c(U+1F8E0, "๐Ÿฃ ", f09fa3a0), _c(U+1F8E1, "๐Ÿฃก", f09fa3a1), _c(U+1F8E2, "๐Ÿฃข", f09fa3a2), _c(U+1F8E3, "๐Ÿฃฃ", f09fa3a3), _c(U+1F8E4, "๐Ÿฃค", f09fa3a4), _c(U+1F8E5, "๐Ÿฃฅ", f09fa3a5), _c(U+1F8E6, "๐Ÿฃฆ", f09fa3a6), _c(U+1F8E7, "๐Ÿฃง", f09fa3a7), _c(U+1F8E8, "๐Ÿฃจ", f09fa3a8), _c(U+1F8E9, "๐Ÿฃฉ", f09fa3a9), _c(U+1F8EA, "๐Ÿฃช", f09fa3aa), _c(U+1F8EB, "๐Ÿฃซ", f09fa3ab), _c(U+1F8EC, "๐Ÿฃฌ", f09fa3ac), _c(U+1F8ED, "๐Ÿฃญ", f09fa3ad), _c(U+1F8EE, "๐Ÿฃฎ", f09fa3ae), _c(U+1F8EF, "๐Ÿฃฏ", f09fa3af), _c(U+1F8F0, "๐Ÿฃฐ", f09fa3b0), _c(U+1F8F1, "๐Ÿฃฑ", f09fa3b1), _c(U+1F8F2, "๐Ÿฃฒ", f09fa3b2), _c(U+1F8F3, "๐Ÿฃณ", f09fa3b3), _c(U+1F8F4, "๐Ÿฃด", f09fa3b4), _c(U+1F8F5, "๐Ÿฃต", f09fa3b5), _c(U+1F8F6, "๐Ÿฃถ", f09fa3b6), _c(U+1F8F7, "๐Ÿฃท", f09fa3b7), _c(U+1F8F8, "๐Ÿฃธ", f09fa3b8), _c(U+1F8F9, "๐Ÿฃน", f09fa3b9), _c(U+1F8FA, "๐Ÿฃบ", f09fa3ba), _c(U+1F8FB, "๐Ÿฃป", f09fa3bb), _c(U+1F8FC, "๐Ÿฃผ", f09fa3bc), _c(U+1F8FD, "๐Ÿฃฝ", f09fa3bd), _c(U+1F8FE, "๐Ÿฃพ", f09fa3be), _c(U+1F8FF, "๐Ÿฃฟ", f09fa3bf), _c(U+1F900, "๐Ÿค€", f09fa480), _c(U+1F901, "๐Ÿค", f09fa481), _c(U+1F902, "๐Ÿค‚", f09fa482), _c(U+1F903, "๐Ÿคƒ", f09fa483), _c(U+1F904, "๐Ÿค„", f09fa484), _c(U+1F905, "๐Ÿค…", f09fa485), _c(U+1F906, "๐Ÿค†", f09fa486), _c(U+1F907, "๐Ÿค‡", f09fa487), _c(U+1F908, "๐Ÿคˆ", f09fa488), _c(U+1F909, "๐Ÿค‰", f09fa489), _c(U+1F90A, "๐ŸคŠ", f09fa48a), _c(U+1F90B, "๐Ÿค‹", f09fa48b), _c(U+1F90C, "๐ŸคŒ", f09fa48c), _c(U+1F90D, "๐Ÿค", f09fa48d), _c(U+1F90E, "๐ŸคŽ", f09fa48e), _c(U+1F90F, "๐Ÿค", f09fa48f), _c(U+1F910, "๐Ÿค", f09fa490), _c(U+1F911, "๐Ÿค‘", f09fa491), _c(U+1F912, "๐Ÿค’", f09fa492), _c(U+1F913, "๐Ÿค“", f09fa493), _c(U+1F914, "๐Ÿค”", f09fa494), _c(U+1F915, "๐Ÿค•", f09fa495), _c(U+1F916, "๐Ÿค–", f09fa496), _c(U+1F917, "๐Ÿค—", f09fa497), _c(U+1F918, "๐Ÿค˜", f09fa498), _c(U+1F919, "๐Ÿค™", f09fa499), _c(U+1F91A, "๐Ÿคš", f09fa49a), _c(U+1F91B, "๐Ÿค›", f09fa49b), _c(U+1F91C, "๐Ÿคœ", f09fa49c), _c(U+1F91D, "๐Ÿค", f09fa49d), _c(U+1F91E, "๐Ÿคž", f09fa49e), _c(U+1F91F, "๐ŸคŸ", f09fa49f), _c(U+1F920, "๐Ÿค ", f09fa4a0), _c(U+1F921, "๐Ÿคก", f09fa4a1), _c(U+1F922, "๐Ÿคข", f09fa4a2), _c(U+1F923, "๐Ÿคฃ", f09fa4a3), _c(U+1F924, "๐Ÿคค", f09fa4a4), _c(U+1F925, "๐Ÿคฅ", f09fa4a5), _c(U+1F926, "๐Ÿคฆ", f09fa4a6), _c(U+1F927, "๐Ÿคง", f09fa4a7), _c(U+1F928, "๐Ÿคจ", f09fa4a8), _c(U+1F929, "๐Ÿคฉ", f09fa4a9), _c(U+1F92A, "๐Ÿคช", f09fa4aa), _c(U+1F92B, "๐Ÿคซ", f09fa4ab), _c(U+1F92C, "๐Ÿคฌ", f09fa4ac), _c(U+1F92D, "๐Ÿคญ", f09fa4ad), _c(U+1F92E, "๐Ÿคฎ", f09fa4ae), _c(U+1F92F, "๐Ÿคฏ", f09fa4af), _c(U+1F930, "๐Ÿคฐ", f09fa4b0), _c(U+1F931, "๐Ÿคฑ", f09fa4b1), _c(U+1F932, "๐Ÿคฒ", f09fa4b2), _c(U+1F933, "๐Ÿคณ", f09fa4b3), _c(U+1F934, "๐Ÿคด", f09fa4b4), _c(U+1F935, "๐Ÿคต", f09fa4b5), _c(U+1F936, "๐Ÿคถ", f09fa4b6), _c(U+1F937, "๐Ÿคท", f09fa4b7), _c(U+1F938, "๐Ÿคธ", f09fa4b8), _c(U+1F939, "๐Ÿคน", f09fa4b9), _c(U+1F93A, "๐Ÿคบ", f09fa4ba), _c(U+1F93B, "๐Ÿคป", f09fa4bb), _c(U+1F93C, "๐Ÿคผ", f09fa4bc), _c(U+1F93D, "๐Ÿคฝ", f09fa4bd), _c(U+1F93E, "๐Ÿคพ", f09fa4be), _c(U+1F93F, "๐Ÿคฟ", f09fa4bf), _c(U+1F940, "๐Ÿฅ€", f09fa580), _c(U+1F941, "๐Ÿฅ", f09fa581), _c(U+1F942, "๐Ÿฅ‚", f09fa582), _c(U+1F943, "๐Ÿฅƒ", f09fa583), _c(U+1F944, "๐Ÿฅ„", f09fa584), _c(U+1F945, "๐Ÿฅ…", f09fa585), _c(U+1F946, "๐Ÿฅ†", f09fa586), _c(U+1F947, "๐Ÿฅ‡", f09fa587), _c(U+1F948, "๐Ÿฅˆ", f09fa588), _c(U+1F949, "๐Ÿฅ‰", f09fa589), _c(U+1F94A, "๐ŸฅŠ", f09fa58a), _c(U+1F94B, "๐Ÿฅ‹", f09fa58b), _c(U+1F94C, "๐ŸฅŒ", f09fa58c), _c(U+1F94D, "๐Ÿฅ", f09fa58d), _c(U+1F94E, "๐ŸฅŽ", f09fa58e), _c(U+1F94F, "๐Ÿฅ", f09fa58f), _c(U+1F950, "๐Ÿฅ", f09fa590), _c(U+1F951, "๐Ÿฅ‘", f09fa591), _c(U+1F952, "๐Ÿฅ’", f09fa592), _c(U+1F953, "๐Ÿฅ“", f09fa593), _c(U+1F954, "๐Ÿฅ”", f09fa594), _c(U+1F955, "๐Ÿฅ•", f09fa595), _c(U+1F956, "๐Ÿฅ–", f09fa596), _c(U+1F957, "๐Ÿฅ—", f09fa597), _c(U+1F958, "๐Ÿฅ˜", f09fa598), _c(U+1F959, "๐Ÿฅ™", f09fa599), _c(U+1F95A, "๐Ÿฅš", f09fa59a), _c(U+1F95B, "๐Ÿฅ›", f09fa59b), _c(U+1F95C, "๐Ÿฅœ", f09fa59c), _c(U+1F95D, "๐Ÿฅ", f09fa59d), _c(U+1F95E, "๐Ÿฅž", f09fa59e), _c(U+1F95F, "๐ŸฅŸ", f09fa59f), _c(U+1F960, "๐Ÿฅ ", f09fa5a0), _c(U+1F961, "๐Ÿฅก", f09fa5a1), _c(U+1F962, "๐Ÿฅข", f09fa5a2), _c(U+1F963, "๐Ÿฅฃ", f09fa5a3), _c(U+1F964, "๐Ÿฅค", f09fa5a4), _c(U+1F965, "๐Ÿฅฅ", f09fa5a5), _c(U+1F966, "๐Ÿฅฆ", f09fa5a6), _c(U+1F967, "๐Ÿฅง", f09fa5a7), _c(U+1F968, "๐Ÿฅจ", f09fa5a8), _c(U+1F969, "๐Ÿฅฉ", f09fa5a9), _c(U+1F96A, "๐Ÿฅช", f09fa5aa), _c(U+1F96B, "๐Ÿฅซ", f09fa5ab), _c(U+1F96C, "๐Ÿฅฌ", f09fa5ac), _c(U+1F96D, "๐Ÿฅญ", f09fa5ad), _c(U+1F96E, "๐Ÿฅฎ", f09fa5ae), _c(U+1F96F, "๐Ÿฅฏ", f09fa5af), _c(U+1F970, "๐Ÿฅฐ", f09fa5b0), _c(U+1F971, "๐Ÿฅฑ", f09fa5b1), _c(U+1F972, "๐Ÿฅฒ", f09fa5b2), _c(U+1F973, "๐Ÿฅณ", f09fa5b3), _c(U+1F974, "๐Ÿฅด", f09fa5b4), _c(U+1F975, "๐Ÿฅต", f09fa5b5), _c(U+1F976, "๐Ÿฅถ", f09fa5b6), _c(U+1F977, "๐Ÿฅท", f09fa5b7), _c(U+1F978, "๐Ÿฅธ", f09fa5b8), _c(U+1F979, "๐Ÿฅน", f09fa5b9), _c(U+1F97A, "๐Ÿฅบ", f09fa5ba), _c(U+1F97B, "๐Ÿฅป", f09fa5bb), _c(U+1F97C, "๐Ÿฅผ", f09fa5bc), _c(U+1F97D, "๐Ÿฅฝ", f09fa5bd), _c(U+1F97E, "๐Ÿฅพ", f09fa5be), _c(U+1F97F, "๐Ÿฅฟ", f09fa5bf), _c(U+1F980, "๐Ÿฆ€", f09fa680), _c(U+1F981, "๐Ÿฆ", f09fa681), _c(U+1F982, "๐Ÿฆ‚", f09fa682), _c(U+1F983, "๐Ÿฆƒ", f09fa683), _c(U+1F984, "๐Ÿฆ„", f09fa684), _c(U+1F985, "๐Ÿฆ…", f09fa685), _c(U+1F986, "๐Ÿฆ†", f09fa686), _c(U+1F987, "๐Ÿฆ‡", f09fa687), _c(U+1F988, "๐Ÿฆˆ", f09fa688), _c(U+1F989, "๐Ÿฆ‰", f09fa689), _c(U+1F98A, "๐ŸฆŠ", f09fa68a), _c(U+1F98B, "๐Ÿฆ‹", f09fa68b), _c(U+1F98C, "๐ŸฆŒ", f09fa68c), _c(U+1F98D, "๐Ÿฆ", f09fa68d), _c(U+1F98E, "๐ŸฆŽ", f09fa68e), _c(U+1F98F, "๐Ÿฆ", f09fa68f), _c(U+1F990, "๐Ÿฆ", f09fa690), _c(U+1F991, "๐Ÿฆ‘", f09fa691), _c(U+1F992, "๐Ÿฆ’", f09fa692), _c(U+1F993, "๐Ÿฆ“", f09fa693), _c(U+1F994, "๐Ÿฆ”", f09fa694), _c(U+1F995, "๐Ÿฆ•", f09fa695), _c(U+1F996, "๐Ÿฆ–", f09fa696), _c(U+1F997, "๐Ÿฆ—", f09fa697), _c(U+1F998, "๐Ÿฆ˜", f09fa698), _c(U+1F999, "๐Ÿฆ™", f09fa699), _c(U+1F99A, "๐Ÿฆš", f09fa69a), _c(U+1F99B, "๐Ÿฆ›", f09fa69b), _c(U+1F99C, "๐Ÿฆœ", f09fa69c), _c(U+1F99D, "๐Ÿฆ", f09fa69d), _c(U+1F99E, "๐Ÿฆž", f09fa69e), _c(U+1F99F, "๐ŸฆŸ", f09fa69f), _c(U+1F9A0, "๐Ÿฆ ", f09fa6a0), _c(U+1F9A1, "๐Ÿฆก", f09fa6a1), _c(U+1F9A2, "๐Ÿฆข", f09fa6a2), _c(U+1F9A3, "๐Ÿฆฃ", f09fa6a3), _c(U+1F9A4, "๐Ÿฆค", f09fa6a4), _c(U+1F9A5, "๐Ÿฆฅ", f09fa6a5), _c(U+1F9A6, "๐Ÿฆฆ", f09fa6a6), _c(U+1F9A7, "๐Ÿฆง", f09fa6a7), _c(U+1F9A8, "๐Ÿฆจ", f09fa6a8), _c(U+1F9A9, "๐Ÿฆฉ", f09fa6a9), _c(U+1F9AA, "๐Ÿฆช", f09fa6aa), _c(U+1F9AB, "๐Ÿฆซ", f09fa6ab), _c(U+1F9AC, "๐Ÿฆฌ", f09fa6ac), _c(U+1F9AD, "๐Ÿฆญ", f09fa6ad), _c(U+1F9AE, "๐Ÿฆฎ", f09fa6ae), _c(U+1F9AF, "๐Ÿฆฏ", f09fa6af), _c(U+1F9B0, "๐Ÿฆฐ", f09fa6b0), _c(U+1F9B1, "๐Ÿฆฑ", f09fa6b1), _c(U+1F9B2, "๐Ÿฆฒ", f09fa6b2), _c(U+1F9B3, "๐Ÿฆณ", f09fa6b3), _c(U+1F9B4, "๐Ÿฆด", f09fa6b4), _c(U+1F9B5, "๐Ÿฆต", f09fa6b5), _c(U+1F9B6, "๐Ÿฆถ", f09fa6b6), _c(U+1F9B7, "๐Ÿฆท", f09fa6b7), _c(U+1F9B8, "๐Ÿฆธ", f09fa6b8), _c(U+1F9B9, "๐Ÿฆน", f09fa6b9), _c(U+1F9BA, "๐Ÿฆบ", f09fa6ba), _c(U+1F9BB, "๐Ÿฆป", f09fa6bb), _c(U+1F9BC, "๐Ÿฆผ", f09fa6bc), _c(U+1F9BD, "๐Ÿฆฝ", f09fa6bd), _c(U+1F9BE, "๐Ÿฆพ", f09fa6be), _c(U+1F9BF, "๐Ÿฆฟ", f09fa6bf), _c(U+1F9C0, "๐Ÿง€", f09fa780), _c(U+1F9C1, "๐Ÿง", f09fa781), _c(U+1F9C2, "๐Ÿง‚", f09fa782), _c(U+1F9C3, "๐Ÿงƒ", f09fa783), _c(U+1F9C4, "๐Ÿง„", f09fa784), _c(U+1F9C5, "๐Ÿง…", f09fa785), _c(U+1F9C6, "๐Ÿง†", f09fa786), _c(U+1F9C7, "๐Ÿง‡", f09fa787), _c(U+1F9C8, "๐Ÿงˆ", f09fa788), _c(U+1F9C9, "๐Ÿง‰", f09fa789), _c(U+1F9CA, "๐ŸงŠ", f09fa78a), _c(U+1F9CB, "๐Ÿง‹", f09fa78b), _c(U+1F9CC, "๐ŸงŒ", f09fa78c), _c(U+1F9CD, "๐Ÿง", f09fa78d), _c(U+1F9CE, "๐ŸงŽ", f09fa78e), _c(U+1F9CF, "๐Ÿง", f09fa78f), _c(U+1F9D0, "๐Ÿง", f09fa790), _c(U+1F9D1, "๐Ÿง‘", f09fa791), _c(U+1F9D2, "๐Ÿง’", f09fa792), _c(U+1F9D3, "๐Ÿง“", f09fa793), _c(U+1F9D4, "๐Ÿง”", f09fa794), _c(U+1F9D5, "๐Ÿง•", f09fa795), _c(U+1F9D6, "๐Ÿง–", f09fa796), _c(U+1F9D7, "๐Ÿง—", f09fa797), _c(U+1F9D8, "๐Ÿง˜", f09fa798), _c(U+1F9D9, "๐Ÿง™", f09fa799), _c(U+1F9DA, "๐Ÿงš", f09fa79a), _c(U+1F9DB, "๐Ÿง›", f09fa79b), _c(U+1F9DC, "๐Ÿงœ", f09fa79c), _c(U+1F9DD, "๐Ÿง", f09fa79d), _c(U+1F9DE, "๐Ÿงž", f09fa79e), _c(U+1F9DF, "๐ŸงŸ", f09fa79f), _c(U+1F9E0, "๐Ÿง ", f09fa7a0), _c(U+1F9E1, "๐Ÿงก", f09fa7a1), _c(U+1F9E2, "๐Ÿงข", f09fa7a2), _c(U+1F9E3, "๐Ÿงฃ", f09fa7a3), _c(U+1F9E4, "๐Ÿงค", f09fa7a4), _c(U+1F9E5, "๐Ÿงฅ", f09fa7a5), _c(U+1F9E6, "๐Ÿงฆ", f09fa7a6), _c(U+1F9E7, "๐Ÿงง", f09fa7a7), _c(U+1F9E8, "๐Ÿงจ", f09fa7a8), _c(U+1F9E9, "๐Ÿงฉ", f09fa7a9), _c(U+1F9EA, "๐Ÿงช", f09fa7aa), _c(U+1F9EB, "๐Ÿงซ", f09fa7ab), _c(U+1F9EC, "๐Ÿงฌ", f09fa7ac), _c(U+1F9ED, "๐Ÿงญ", f09fa7ad), _c(U+1F9EE, "๐Ÿงฎ", f09fa7ae), _c(U+1F9EF, "๐Ÿงฏ", f09fa7af), _c(U+1F9F0, "๐Ÿงฐ", f09fa7b0), _c(U+1F9F1, "๐Ÿงฑ", f09fa7b1), _c(U+1F9F2, "๐Ÿงฒ", f09fa7b2), _c(U+1F9F3, "๐Ÿงณ", f09fa7b3), _c(U+1F9F4, "๐Ÿงด", f09fa7b4), _c(U+1F9F5, "๐Ÿงต", f09fa7b5), _c(U+1F9F6, "๐Ÿงถ", f09fa7b6), _c(U+1F9F7, "๐Ÿงท", f09fa7b7), _c(U+1F9F8, "๐Ÿงธ", f09fa7b8), _c(U+1F9F9, "๐Ÿงน", f09fa7b9), _c(U+1F9FA, "๐Ÿงบ", f09fa7ba), _c(U+1F9FB, "๐Ÿงป", f09fa7bb), _c(U+1F9FC, "๐Ÿงผ", f09fa7bc), _c(U+1F9FD, "๐Ÿงฝ", f09fa7bd), _c(U+1F9FE, "๐Ÿงพ", f09fa7be), _c(U+1F9FF, "๐Ÿงฟ", f09fa7bf), _c(U+100000, "๔€€€", f4808080), _c(U+100001, "๔€€", f4808081), _c(U+100002, "๔€€‚", f4808082), _c(U+100003, "๔€€ƒ", f4808083), _c(U+100004, "๔€€„", f4808084), _c(U+100005, "๔€€…", f4808085), _c(U+100006, "๔€€†", f4808086), _c(U+100007, "๔€€‡", f4808087), _c(U+100008, "๔€€ˆ", f4808088), _c(U+100009, "๔€€‰", f4808089), _c(U+10000A, "๔€€Š", f480808a), _c(U+10000B, "๔€€‹", f480808b), _c(U+10000C, "๔€€Œ", f480808c), _c(U+10000D, "๔€€", f480808d), _c(U+10000E, "๔€€Ž", f480808e), _c(U+10000F, "๔€€", f480808f), _c(U+100010, "๔€€", f4808090), _c(U+100011, "๔€€‘", f4808091), _c(U+100012, "๔€€’", f4808092), _c(U+100013, "๔€€“", f4808093), _c(U+100014, "๔€€”", f4808094), _c(U+100015, "๔€€•", f4808095), _c(U+100016, "๔€€–", f4808096), _c(U+100017, "๔€€—", f4808097), _c(U+100018, "๔€€˜", f4808098), _c(U+100019, "๔€€™", f4808099), _c(U+10001A, "๔€€š", f480809a), _c(U+10001B, "๔€€›", f480809b), _c(U+10001C, "๔€€œ", f480809c), _c(U+10001D, "๔€€", f480809d), _c(U+10001E, "๔€€ž", f480809e), _c(U+10001F, "๔€€Ÿ", f480809f), _c(U+100020, "๔€€ ", f48080a0), _c(U+100021, "๔€€ก", f48080a1), _c(U+100022, "๔€€ข", f48080a2), _c(U+100023, "๔€€ฃ", f48080a3), _c(U+100024, "๔€€ค", f48080a4), _c(U+100025, "๔€€ฅ", f48080a5), _c(U+100026, "๔€€ฆ", f48080a6), _c(U+100027, "๔€€ง", f48080a7), _c(U+100028, "๔€€จ", f48080a8), _c(U+100029, "๔€€ฉ", f48080a9), _c(U+10002A, "๔€€ช", f48080aa), _c(U+10002B, "๔€€ซ", f48080ab), _c(U+10002C, "๔€€ฌ", f48080ac), _c(U+10002D, "๔€€ญ", f48080ad), _c(U+10002E, "๔€€ฎ", f48080ae), _c(U+10002F, "๔€€ฏ", f48080af), _c(U+100030, "๔€€ฐ", f48080b0), _c(U+100031, "๔€€ฑ", f48080b1), _c(U+100032, "๔€€ฒ", f48080b2), _c(U+100033, "๔€€ณ", f48080b3), _c(U+100034, "๔€€ด", f48080b4), _c(U+100035, "๔€€ต", f48080b5), _c(U+100036, "๔€€ถ", f48080b6), _c(U+100037, "๔€€ท", f48080b7), _c(U+100038, "๔€€ธ", f48080b8), _c(U+100039, "๔€€น", f48080b9), _c(U+10003A, "๔€€บ", f48080ba), _c(U+10003B, "๔€€ป", f48080bb), _c(U+10003C, "๔€€ผ", f48080bc), _c(U+10003D, "๔€€ฝ", f48080bd), _c(U+10003E, "๔€€พ", f48080be), _c(U+10003F, "๔€€ฟ", f48080bf), _c(U+100040, "๔€€", f4808180), _c(U+100041, "๔€", f4808181), _c(U+100042, "๔€‚", f4808182), _c(U+100043, "๔€ƒ", f4808183), _c(U+100044, "๔€„", f4808184), _c(U+100045, "๔€…", f4808185), _c(U+100046, "๔€†", f4808186), _c(U+100047, "๔€‡", f4808187), _c(U+100048, "๔€ˆ", f4808188), _c(U+100049, "๔€‰", f4808189), _c(U+10004A, "๔€Š", f480818a), _c(U+10004B, "๔€‹", f480818b), _c(U+10004C, "๔€Œ", f480818c), _c(U+10004D, "๔€", f480818d), _c(U+10004E, "๔€Ž", f480818e), _c(U+10004F, "๔€", f480818f), _c(U+100050, "๔€", f4808190), _c(U+100051, "๔€‘", f4808191), _c(U+100052, "๔€’", f4808192), _c(U+100053, "๔€“", f4808193), _c(U+100054, "๔€”", f4808194), _c(U+100055, "๔€•", f4808195), _c(U+100056, "๔€–", f4808196), _c(U+100057, "๔€—", f4808197), _c(U+100058, "๔€˜", f4808198), _c(U+100059, "๔€™", f4808199), _c(U+10005A, "๔€š", f480819a), _c(U+10005B, "๔€›", f480819b), _c(U+10005C, "๔€œ", f480819c), _c(U+10005D, "๔€", f480819d), _c(U+10005E, "๔€ž", f480819e), _c(U+10005F, "๔€Ÿ", f480819f), _c(U+100060, "๔€ ", f48081a0), _c(U+100061, "๔€ก", f48081a1), _c(U+100062, "๔€ข", f48081a2), _c(U+100063, "๔€ฃ", f48081a3), _c(U+100064, "๔€ค", f48081a4), _c(U+100065, "๔€ฅ", f48081a5), _c(U+100066, "๔€ฆ", f48081a6), _c(U+100067, "๔€ง", f48081a7), _c(U+100068, "๔€จ", f48081a8), _c(U+100069, "๔€ฉ", f48081a9), _c(U+10006A, "๔€ช", f48081aa), _c(U+10006B, "๔€ซ", f48081ab), _c(U+10006C, "๔€ฌ", f48081ac), _c(U+10006D, "๔€ญ", f48081ad), _c(U+10006E, "๔€ฎ", f48081ae), _c(U+10006F, "๔€ฏ", f48081af), _c(U+100070, "๔€ฐ", f48081b0), _c(U+100071, "๔€ฑ", f48081b1), _c(U+100072, "๔€ฒ", f48081b2), _c(U+100073, "๔€ณ", f48081b3), _c(U+100074, "๔€ด", f48081b4), _c(U+100075, "๔€ต", f48081b5), _c(U+100076, "๔€ถ", f48081b6), _c(U+100077, "๔€ท", f48081b7), _c(U+100078, "๔€ธ", f48081b8), _c(U+100079, "๔€น", f48081b9), _c(U+10007A, "๔€บ", f48081ba), _c(U+10007B, "๔€ป", f48081bb), _c(U+10007C, "๔€ผ", f48081bc), _c(U+10007D, "๔€ฝ", f48081bd), _c(U+10007E, "๔€พ", f48081be), _c(U+10007F, "๔€ฟ", f48081bf), _c(U+100080, "๔€‚€", f4808280), _c(U+100081, "๔€‚", f4808281), _c(U+100082, "๔€‚‚", f4808282), _c(U+100083, "๔€‚ƒ", f4808283), _c(U+100084, "๔€‚„", f4808284), _c(U+100085, "๔€‚…", f4808285), _c(U+100086, "๔€‚†", f4808286), _c(U+100087, "๔€‚‡", f4808287), _c(U+100088, "๔€‚ˆ", f4808288), _c(U+100089, "๔€‚‰", f4808289), _c(U+10008A, "๔€‚Š", f480828a), _c(U+10008B, "๔€‚‹", f480828b), _c(U+10008C, "๔€‚Œ", f480828c), _c(U+10008D, "๔€‚", f480828d), _c(U+10008E, "๔€‚Ž", f480828e), _c(U+10008F, "๔€‚", f480828f), _c(U+100090, "๔€‚", f4808290), _c(U+100091, "๔€‚‘", f4808291), _c(U+100092, "๔€‚’", f4808292), _c(U+100093, "๔€‚“", f4808293), _c(U+100094, "๔€‚”", f4808294), _c(U+100095, "๔€‚•", f4808295), _c(U+100096, "๔€‚–", f4808296), _c(U+100097, "๔€‚—", f4808297), _c(U+100098, "๔€‚˜", f4808298), _c(U+100099, "๔€‚™", f4808299), _c(U+10009A, "๔€‚š", f480829a), _c(U+10009B, "๔€‚›", f480829b), _c(U+10009C, "๔€‚œ", f480829c), _c(U+10009D, "๔€‚", f480829d), _c(U+10009E, "๔€‚ž", f480829e), _c(U+10009F, "๔€‚Ÿ", f480829f), _c(U+1000A0, "๔€‚ ", f48082a0), _c(U+1000A1, "๔€‚ก", f48082a1), _c(U+1000A2, "๔€‚ข", f48082a2), _c(U+1000A3, "๔€‚ฃ", f48082a3), _c(U+1000A4, "๔€‚ค", f48082a4), _c(U+1000A5, "๔€‚ฅ", f48082a5), _c(U+1000A6, "๔€‚ฆ", f48082a6), _c(U+1000A7, "๔€‚ง", f48082a7), _c(U+1000A8, "๔€‚จ", f48082a8), _c(U+1000A9, "๔€‚ฉ", f48082a9), _c(U+1000AA, "๔€‚ช", f48082aa), _c(U+1000AB, "๔€‚ซ", f48082ab), _c(U+1000AC, "๔€‚ฌ", f48082ac), _c(U+1000AD, "๔€‚ญ", f48082ad), _c(U+1000AE, "๔€‚ฎ", f48082ae), _c(U+1000AF, "๔€‚ฏ", f48082af), _c(U+1000B0, "๔€‚ฐ", f48082b0), _c(U+1000B1, "๔€‚ฑ", f48082b1), _c(U+1000B2, "๔€‚ฒ", f48082b2), _c(U+1000B3, "๔€‚ณ", f48082b3), _c(U+1000B4, "๔€‚ด", f48082b4), _c(U+1000B5, "๔€‚ต", f48082b5), _c(U+1000B6, "๔€‚ถ", f48082b6), _c(U+1000B7, "๔€‚ท", f48082b7), _c(U+1000B8, "๔€‚ธ", f48082b8), _c(U+1000B9, "๔€‚น", f48082b9), _c(U+1000BA, "๔€‚บ", f48082ba), _c(U+1000BB, "๔€‚ป", f48082bb), _c(U+1000BC, "๔€‚ผ", f48082bc), _c(U+1000BD, "๔€‚ฝ", f48082bd), _c(U+1000BE, "๔€‚พ", f48082be), _c(U+1000BF, "๔€‚ฟ", f48082bf), _c(U+1000C0, "๔€ƒ€", f4808380), _c(U+1000C1, "๔€ƒ", f4808381), _c(U+1000C2, "๔€ƒ‚", f4808382), _c(U+1000C3, "๔€ƒƒ", f4808383), _c(U+1000C4, "๔€ƒ„", f4808384), _c(U+1000C5, "๔€ƒ…", f4808385), _c(U+1000C6, "๔€ƒ†", f4808386), _c(U+1000C7, "๔€ƒ‡", f4808387), _c(U+1000C8, "๔€ƒˆ", f4808388), _c(U+1000C9, "๔€ƒ‰", f4808389), _c(U+1000CA, "๔€ƒŠ", f480838a), _c(U+1000CB, "๔€ƒ‹", f480838b), _c(U+1000CC, "๔€ƒŒ", f480838c), _c(U+1000CD, "๔€ƒ", f480838d), _c(U+1000CE, "๔€ƒŽ", f480838e), _c(U+1000CF, "๔€ƒ", f480838f), _c(U+1000D0, "๔€ƒ", f4808390), _c(U+1000D1, "๔€ƒ‘", f4808391), _c(U+1000D2, "๔€ƒ’", f4808392), _c(U+1000D3, "๔€ƒ“", f4808393), _c(U+1000D4, "๔€ƒ”", f4808394), _c(U+1000D5, "๔€ƒ•", f4808395), _c(U+1000D6, "๔€ƒ–", f4808396), _c(U+1000D7, "๔€ƒ—", f4808397), _c(U+1000D8, "๔€ƒ˜", f4808398), _c(U+1000D9, "๔€ƒ™", f4808399), _c(U+1000DA, "๔€ƒš", f480839a), _c(U+1000DB, "๔€ƒ›", f480839b), _c(U+1000DC, "๔€ƒœ", f480839c), _c(U+1000DD, "๔€ƒ", f480839d), _c(U+1000DE, "๔€ƒž", f480839e), _c(U+1000DF, "๔€ƒŸ", f480839f), _c(U+1000E0, "๔€ƒ ", f48083a0), _c(U+1000E1, "๔€ƒก", f48083a1), _c(U+1000E2, "๔€ƒข", f48083a2), _c(U+1000E3, "๔€ƒฃ", f48083a3), _c(U+1000E4, "๔€ƒค", f48083a4), _c(U+1000E5, "๔€ƒฅ", f48083a5), _c(U+1000E6, "๔€ƒฆ", f48083a6), _c(U+1000E7, "๔€ƒง", f48083a7), _c(U+1000E8, "๔€ƒจ", f48083a8), _c(U+1000E9, "๔€ƒฉ", f48083a9), _c(U+1000EA, "๔€ƒช", f48083aa), _c(U+1000EB, "๔€ƒซ", f48083ab), _c(U+1000EC, "๔€ƒฌ", f48083ac), _c(U+1000ED, "๔€ƒญ", f48083ad), _c(U+1000EE, "๔€ƒฎ", f48083ae), _c(U+1000EF, "๔€ƒฏ", f48083af), _c(U+1000F0, "๔€ƒฐ", f48083b0), _c(U+1000F1, "๔€ƒฑ", f48083b1), _c(U+1000F2, "๔€ƒฒ", f48083b2), _c(U+1000F3, "๔€ƒณ", f48083b3), _c(U+1000F4, "๔€ƒด", f48083b4), _c(U+1000F5, "๔€ƒต", f48083b5), _c(U+1000F6, "๔€ƒถ", f48083b6), _c(U+1000F7, "๔€ƒท", f48083b7), _c(U+1000F8, "๔€ƒธ", f48083b8), _c(U+1000F9, "๔€ƒน", f48083b9), _c(U+1000FA, "๔€ƒบ", f48083ba), _c(U+1000FB, "๔€ƒป", f48083bb), _c(U+1000FC, "๔€ƒผ", f48083bc), _c(U+1000FD, "๔€ƒฝ", f48083bd), _c(U+1000FE, "๔€ƒพ", f48083be), _c(U+1000FF, "๔€ƒฟ", f48083bf), _c(U+100100, "๔€„€", f4808480), _c(U+100101, "๔€„", f4808481), _c(U+100102, "๔€„‚", f4808482), _c(U+100103, "๔€„ƒ", f4808483), _c(U+100104, "๔€„„", f4808484), _c(U+100105, "๔€„…", f4808485), _c(U+100106, "๔€„†", f4808486), _c(U+100107, "๔€„‡", f4808487), _c(U+100108, "๔€„ˆ", f4808488), _c(U+100109, "๔€„‰", f4808489), _c(U+10010A, "๔€„Š", f480848a), _c(U+10010B, "๔€„‹", f480848b), _c(U+10010C, "๔€„Œ", f480848c), _c(U+10010D, "๔€„", f480848d), _c(U+10010E, "๔€„Ž", f480848e), _c(U+10010F, "๔€„", f480848f), _c(U+100110, "๔€„", f4808490), _c(U+100111, "๔€„‘", f4808491), _c(U+100112, "๔€„’", f4808492), _c(U+100113, "๔€„“", f4808493), _c(U+100114, "๔€„”", f4808494), _c(U+100115, "๔€„•", f4808495), _c(U+100116, "๔€„–", f4808496), _c(U+100117, "๔€„—", f4808497), _c(U+100118, "๔€„˜", f4808498), _c(U+100119, "๔€„™", f4808499), _c(U+10011A, "๔€„š", f480849a), _c(U+10011B, "๔€„›", f480849b), _c(U+10011C, "๔€„œ", f480849c), _c(U+10011D, "๔€„", f480849d), _c(U+10011E, "๔€„ž", f480849e), _c(U+10011F, "๔€„Ÿ", f480849f), _c(U+100120, "๔€„ ", f48084a0), _c(U+100121, "๔€„ก", f48084a1), _c(U+100122, "๔€„ข", f48084a2), _c(U+100123, "๔€„ฃ", f48084a3), _c(U+100124, "๔€„ค", f48084a4), _c(U+100125, "๔€„ฅ", f48084a5), _c(U+100126, "๔€„ฆ", f48084a6), _c(U+100127, "๔€„ง", f48084a7), _c(U+100128, "๔€„จ", f48084a8), _c(U+100129, "๔€„ฉ", f48084a9), _c(U+10012A, "๔€„ช", f48084aa), _c(U+10012B, "๔€„ซ", f48084ab), _c(U+10012C, "๔€„ฌ", f48084ac), _c(U+10012D, "๔€„ญ", f48084ad), _c(U+10012E, "๔€„ฎ", f48084ae), _c(U+10012F, "๔€„ฏ", f48084af), _c(U+100130, "๔€„ฐ", f48084b0), _c(U+100131, "๔€„ฑ", f48084b1), _c(U+100132, "๔€„ฒ", f48084b2), _c(U+100133, "๔€„ณ", f48084b3), _c(U+100134, "๔€„ด", f48084b4), _c(U+100135, "๔€„ต", f48084b5), _c(U+100136, "๔€„ถ", f48084b6), _c(U+100137, "๔€„ท", f48084b7), _c(U+100138, "๔€„ธ", f48084b8), _c(U+100139, "๔€„น", f48084b9), _c(U+10013A, "๔€„บ", f48084ba), _c(U+10013B, "๔€„ป", f48084bb), _c(U+10013C, "๔€„ผ", f48084bc), _c(U+10013D, "๔€„ฝ", f48084bd), _c(U+10013E, "๔€„พ", f48084be), _c(U+10013F, "๔€„ฟ", f48084bf), _c(U+100140, "๔€…€", f4808580), _c(U+100141, "๔€…", f4808581), _c(U+100142, "๔€…‚", f4808582), _c(U+100143, "๔€…ƒ", f4808583), _c(U+100144, "๔€…„", f4808584), _c(U+100145, "๔€……", f4808585), _c(U+100146, "๔€…†", f4808586), _c(U+100147, "๔€…‡", f4808587), _c(U+100148, "๔€…ˆ", f4808588), _c(U+100149, "๔€…‰", f4808589), _c(U+10014A, "๔€…Š", f480858a), _c(U+10014B, "๔€…‹", f480858b), _c(U+10014C, "๔€…Œ", f480858c), _c(U+10014D, "๔€…", f480858d), _c(U+10014E, "๔€…Ž", f480858e), _c(U+10014F, "๔€…", f480858f), _c(U+100150, "๔€…", f4808590), _c(U+100151, "๔€…‘", f4808591), _c(U+100152, "๔€…’", f4808592), _c(U+100153, "๔€…“", f4808593), _c(U+100154, "๔€…”", f4808594), _c(U+100155, "๔€…•", f4808595), _c(U+100156, "๔€…–", f4808596), _c(U+100157, "๔€…—", f4808597), _c(U+100158, "๔€…˜", f4808598), _c(U+100159, "๔€…™", f4808599), _c(U+10015A, "๔€…š", f480859a), _c(U+10015B, "๔€…›", f480859b), _c(U+10015C, "๔€…œ", f480859c), _c(U+10015D, "๔€…", f480859d), _c(U+10015E, "๔€…ž", f480859e), _c(U+10015F, "๔€…Ÿ", f480859f), _c(U+100160, "๔€… ", f48085a0), _c(U+100161, "๔€…ก", f48085a1), _c(U+100162, "๔€…ข", f48085a2), _c(U+100163, "๔€…ฃ", f48085a3), _c(U+100164, "๔€…ค", f48085a4), _c(U+100165, "๔€…ฅ", f48085a5), _c(U+100166, "๔€…ฆ", f48085a6), _c(U+100167, "๔€…ง", f48085a7), _c(U+100168, "๔€…จ", f48085a8), _c(U+100169, "๔€…ฉ", f48085a9), _c(U+10016A, "๔€…ช", f48085aa), _c(U+10016B, "๔€…ซ", f48085ab), _c(U+10016C, "๔€…ฌ", f48085ac), _c(U+10016D, "๔€…ญ", f48085ad), _c(U+10016E, "๔€…ฎ", f48085ae), _c(U+10016F, "๔€…ฏ", f48085af), _c(U+100170, "๔€…ฐ", f48085b0), _c(U+100171, "๔€…ฑ", f48085b1), _c(U+100172, "๔€…ฒ", f48085b2), _c(U+100173, "๔€…ณ", f48085b3), _c(U+100174, "๔€…ด", f48085b4), _c(U+100175, "๔€…ต", f48085b5), _c(U+100176, "๔€…ถ", f48085b6), _c(U+100177, "๔€…ท", f48085b7), _c(U+100178, "๔€…ธ", f48085b8), _c(U+100179, "๔€…น", f48085b9), _c(U+10017A, "๔€…บ", f48085ba), _c(U+10017B, "๔€…ป", f48085bb), _c(U+10017C, "๔€…ผ", f48085bc), _c(U+10017D, "๔€…ฝ", f48085bd), _c(U+10017E, "๔€…พ", f48085be), _c(U+10017F, "๔€…ฟ", f48085bf), _c(U+100180, "๔€†€", f4808680), _c(U+100181, "๔€†", f4808681), _c(U+100182, "๔€†‚", f4808682), _c(U+100183, "๔€†ƒ", f4808683), _c(U+100184, "๔€†„", f4808684), _c(U+100185, "๔€†…", f4808685), _c(U+100186, "๔€††", f4808686), _c(U+100187, "๔€†‡", f4808687), _c(U+100188, "๔€†ˆ", f4808688), _c(U+100189, "๔€†‰", f4808689), _c(U+10018A, "๔€†Š", f480868a), _c(U+10018B, "๔€†‹", f480868b), _c(U+10018C, "๔€†Œ", f480868c), _c(U+10018D, "๔€†", f480868d), _c(U+10018E, "๔€†Ž", f480868e), _c(U+10018F, "๔€†", f480868f), _c(U+100190, "๔€†", f4808690), _c(U+100191, "๔€†‘", f4808691), _c(U+100192, "๔€†’", f4808692), _c(U+100193, "๔€†“", f4808693), _c(U+100194, "๔€†”", f4808694), _c(U+100195, "๔€†•", f4808695), _c(U+100196, "๔€†–", f4808696), _c(U+100197, "๔€†—", f4808697), _c(U+100198, "๔€†˜", f4808698), _c(U+100199, "๔€†™", f4808699), _c(U+10019A, "๔€†š", f480869a), _c(U+10019B, "๔€†›", f480869b), _c(U+10019C, "๔€†œ", f480869c), _c(U+10019D, "๔€†", f480869d), _c(U+10019E, "๔€†ž", f480869e), _c(U+10019F, "๔€†Ÿ", f480869f), _c(U+1001A0, "๔€† ", f48086a0), _c(U+1001A1, "๔€†ก", f48086a1), _c(U+1001A2, "๔€†ข", f48086a2), _c(U+1001A3, "๔€†ฃ", f48086a3), _c(U+1001A4, "๔€†ค", f48086a4), _c(U+1001A5, "๔€†ฅ", f48086a5), _c(U+1001A6, "๔€†ฆ", f48086a6), _c(U+1001A7, "๔€†ง", f48086a7), _c(U+1001A8, "๔€†จ", f48086a8), _c(U+1001A9, "๔€†ฉ", f48086a9), _c(U+1001AA, "๔€†ช", f48086aa), _c(U+1001AB, "๔€†ซ", f48086ab), _c(U+1001AC, "๔€†ฌ", f48086ac), _c(U+1001AD, "๔€†ญ", f48086ad), _c(U+1001AE, "๔€†ฎ", f48086ae), _c(U+1001AF, "๔€†ฏ", f48086af), _c(U+1001B0, "๔€†ฐ", f48086b0), _c(U+1001B1, "๔€†ฑ", f48086b1), _c(U+1001B2, "๔€†ฒ", f48086b2), _c(U+1001B3, "๔€†ณ", f48086b3), _c(U+1001B4, "๔€†ด", f48086b4), _c(U+1001B5, "๔€†ต", f48086b5), _c(U+1001B6, "๔€†ถ", f48086b6), _c(U+1001B7, "๔€†ท", f48086b7), _c(U+1001B8, "๔€†ธ", f48086b8), _c(U+1001B9, "๔€†น", f48086b9), _c(U+1001BA, "๔€†บ", f48086ba), _c(U+1001BB, "๔€†ป", f48086bb), _c(U+1001BC, "๔€†ผ", f48086bc), _c(U+1001BD, "๔€†ฝ", f48086bd), _c(U+1001BE, "๔€†พ", f48086be), _c(U+1001BF, "๔€†ฟ", f48086bf), _c(U+1001C0, "๔€‡€", f4808780), _c(U+1001C1, "๔€‡", f4808781), _c(U+1001C2, "๔€‡‚", f4808782), _c(U+1001C3, "๔€‡ƒ", f4808783), _c(U+1001C4, "๔€‡„", f4808784), _c(U+1001C5, "๔€‡…", f4808785), _c(U+1001C6, "๔€‡†", f4808786), _c(U+1001C7, "๔€‡‡", f4808787), _c(U+1001C8, "๔€‡ˆ", f4808788), _c(U+1001C9, "๔€‡‰", f4808789), _c(U+1001CA, "๔€‡Š", f480878a), _c(U+1001CB, "๔€‡‹", f480878b), _c(U+1001CC, "๔€‡Œ", f480878c), _c(U+1001CD, "๔€‡", f480878d), _c(U+1001CE, "๔€‡Ž", f480878e), _c(U+1001CF, "๔€‡", f480878f), _c(U+1001D0, "๔€‡", f4808790), _c(U+1001D1, "๔€‡‘", f4808791), _c(U+1001D2, "๔€‡’", f4808792), _c(U+1001D3, "๔€‡“", f4808793), _c(U+1001D4, "๔€‡”", f4808794), _c(U+1001D5, "๔€‡•", f4808795), _c(U+1001D6, "๔€‡–", f4808796), _c(U+1001D7, "๔€‡—", f4808797), _c(U+1001D8, "๔€‡˜", f4808798), _c(U+1001D9, "๔€‡™", f4808799), _c(U+1001DA, "๔€‡š", f480879a), _c(U+1001DB, "๔€‡›", f480879b), _c(U+1001DC, "๔€‡œ", f480879c), _c(U+1001DD, "๔€‡", f480879d), _c(U+1001DE, "๔€‡ž", f480879e), _c(U+1001DF, "๔€‡Ÿ", f480879f), _c(U+1001E0, "๔€‡ ", f48087a0), _c(U+1001E1, "๔€‡ก", f48087a1), _c(U+1001E2, "๔€‡ข", f48087a2), _c(U+1001E3, "๔€‡ฃ", f48087a3), _c(U+1001E4, "๔€‡ค", f48087a4), _c(U+1001E5, "๔€‡ฅ", f48087a5), _c(U+1001E6, "๔€‡ฆ", f48087a6), _c(U+1001E7, "๔€‡ง", f48087a7), _c(U+1001E8, "๔€‡จ", f48087a8), _c(U+1001E9, "๔€‡ฉ", f48087a9), _c(U+1001EA, "๔€‡ช", f48087aa), _c(U+1001EB, "๔€‡ซ", f48087ab), _c(U+1001EC, "๔€‡ฌ", f48087ac), _c(U+1001ED, "๔€‡ญ", f48087ad), _c(U+1001EE, "๔€‡ฎ", f48087ae), _c(U+1001EF, "๔€‡ฏ", f48087af), _c(U+1001F0, "๔€‡ฐ", f48087b0), _c(U+1001F1, "๔€‡ฑ", f48087b1), _c(U+1001F2, "๔€‡ฒ", f48087b2), _c(U+1001F3, "๔€‡ณ", f48087b3), _c(U+1001F4, "๔€‡ด", f48087b4), _c(U+1001F5, "๔€‡ต", f48087b5), _c(U+1001F6, "๔€‡ถ", f48087b6), _c(U+1001F7, "๔€‡ท", f48087b7), _c(U+1001F8, "๔€‡ธ", f48087b8), _c(U+1001F9, "๔€‡น", f48087b9), _c(U+1001FA, "๔€‡บ", f48087ba), _c(U+1001FB, "๔€‡ป", f48087bb), _c(U+1001FC, "๔€‡ผ", f48087bc), _c(U+1001FD, "๔€‡ฝ", f48087bd), _c(U+1001FE, "๔€‡พ", f48087be), _c(U+1001FF, "๔€‡ฟ", f48087bf), _c(U+100200, "๔€ˆ€", f4808880), _c(U+100201, "๔€ˆ", f4808881), _c(U+100202, "๔€ˆ‚", f4808882), _c(U+100203, "๔€ˆƒ", f4808883), _c(U+100204, "๔€ˆ„", f4808884), _c(U+100205, "๔€ˆ…", f4808885), _c(U+100206, "๔€ˆ†", f4808886), _c(U+100207, "๔€ˆ‡", f4808887), _c(U+100208, "๔€ˆˆ", f4808888), _c(U+100209, "๔€ˆ‰", f4808889), _c(U+10020A, "๔€ˆŠ", f480888a), _c(U+10020B, "๔€ˆ‹", f480888b), _c(U+10020C, "๔€ˆŒ", f480888c), _c(U+10020D, "๔€ˆ", f480888d), _c(U+10020E, "๔€ˆŽ", f480888e), _c(U+10020F, "๔€ˆ", f480888f), _c(U+100210, "๔€ˆ", f4808890), _c(U+100211, "๔€ˆ‘", f4808891), _c(U+100212, "๔€ˆ’", f4808892), _c(U+100213, "๔€ˆ“", f4808893), _c(U+100214, "๔€ˆ”", f4808894), _c(U+100215, "๔€ˆ•", f4808895), _c(U+100216, "๔€ˆ–", f4808896), _c(U+100217, "๔€ˆ—", f4808897), _c(U+100218, "๔€ˆ˜", f4808898), _c(U+100219, "๔€ˆ™", f4808899), _c(U+10021A, "๔€ˆš", f480889a), _c(U+10021B, "๔€ˆ›", f480889b), _c(U+10021C, "๔€ˆœ", f480889c), _c(U+10021D, "๔€ˆ", f480889d), _c(U+10021E, "๔€ˆž", f480889e), _c(U+10021F, "๔€ˆŸ", f480889f), _c(U+100220, "๔€ˆ ", f48088a0), _c(U+100221, "๔€ˆก", f48088a1), _c(U+100222, "๔€ˆข", f48088a2), _c(U+100223, "๔€ˆฃ", f48088a3), _c(U+100224, "๔€ˆค", f48088a4), _c(U+100225, "๔€ˆฅ", f48088a5), _c(U+100226, "๔€ˆฆ", f48088a6), _c(U+100227, "๔€ˆง", f48088a7), _c(U+100228, "๔€ˆจ", f48088a8), _c(U+100229, "๔€ˆฉ", f48088a9), _c(U+10022A, "๔€ˆช", f48088aa), _c(U+10022B, "๔€ˆซ", f48088ab), _c(U+10022C, "๔€ˆฌ", f48088ac), _c(U+10022D, "๔€ˆญ", f48088ad), _c(U+10022E, "๔€ˆฎ", f48088ae), _c(U+10022F, "๔€ˆฏ", f48088af), _c(U+100230, "๔€ˆฐ", f48088b0), _c(U+100231, "๔€ˆฑ", f48088b1), _c(U+100232, "๔€ˆฒ", f48088b2), _c(U+100233, "๔€ˆณ", f48088b3), _c(U+100234, "๔€ˆด", f48088b4), _c(U+100235, "๔€ˆต", f48088b5), _c(U+100236, "๔€ˆถ", f48088b6), _c(U+100237, "๔€ˆท", f48088b7), _c(U+100238, "๔€ˆธ", f48088b8), _c(U+100239, "๔€ˆน", f48088b9), _c(U+10023A, "๔€ˆบ", f48088ba), _c(U+10023B, "๔€ˆป", f48088bb), _c(U+10023C, "๔€ˆผ", f48088bc), _c(U+10023D, "๔€ˆฝ", f48088bd), _c(U+10023E, "๔€ˆพ", f48088be), _c(U+10023F, "๔€ˆฟ", f48088bf), _c(U+100240, "๔€‰€", f4808980), _c(U+100241, "๔€‰", f4808981), _c(U+100242, "๔€‰‚", f4808982), _c(U+100243, "๔€‰ƒ", f4808983), _c(U+100244, "๔€‰„", f4808984), _c(U+100245, "๔€‰…", f4808985), _c(U+100246, "๔€‰†", f4808986), _c(U+100247, "๔€‰‡", f4808987), _c(U+100248, "๔€‰ˆ", f4808988), _c(U+100249, "๔€‰‰", f4808989), _c(U+10024A, "๔€‰Š", f480898a), _c(U+10024B, "๔€‰‹", f480898b), _c(U+10024C, "๔€‰Œ", f480898c), _c(U+10024D, "๔€‰", f480898d), _c(U+10024E, "๔€‰Ž", f480898e), _c(U+10024F, "๔€‰", f480898f), _c(U+100250, "๔€‰", f4808990), _c(U+100251, "๔€‰‘", f4808991), _c(U+100252, "๔€‰’", f4808992), _c(U+100253, "๔€‰“", f4808993), _c(U+100254, "๔€‰”", f4808994), _c(U+100255, "๔€‰•", f4808995), _c(U+100256, "๔€‰–", f4808996), _c(U+100257, "๔€‰—", f4808997), _c(U+100258, "๔€‰˜", f4808998), _c(U+100259, "๔€‰™", f4808999), _c(U+10025A, "๔€‰š", f480899a), _c(U+10025B, "๔€‰›", f480899b), _c(U+10025C, "๔€‰œ", f480899c), _c(U+10025D, "๔€‰", f480899d), _c(U+10025E, "๔€‰ž", f480899e), _c(U+10025F, "๔€‰Ÿ", f480899f), _c(U+100260, "๔€‰ ", f48089a0), _c(U+100261, "๔€‰ก", f48089a1), _c(U+100262, "๔€‰ข", f48089a2), _c(U+100263, "๔€‰ฃ", f48089a3), _c(U+100264, "๔€‰ค", f48089a4), _c(U+100265, "๔€‰ฅ", f48089a5), _c(U+100266, "๔€‰ฆ", f48089a6), _c(U+100267, "๔€‰ง", f48089a7), _c(U+100268, "๔€‰จ", f48089a8), _c(U+100269, "๔€‰ฉ", f48089a9), _c(U+10026A, "๔€‰ช", f48089aa), _c(U+10026B, "๔€‰ซ", f48089ab), _c(U+10026C, "๔€‰ฌ", f48089ac), _c(U+10026D, "๔€‰ญ", f48089ad), _c(U+10026E, "๔€‰ฎ", f48089ae), _c(U+10026F, "๔€‰ฏ", f48089af), _c(U+100270, "๔€‰ฐ", f48089b0), _c(U+100271, "๔€‰ฑ", f48089b1), _c(U+100272, "๔€‰ฒ", f48089b2), _c(U+100273, "๔€‰ณ", f48089b3), _c(U+100274, "๔€‰ด", f48089b4), _c(U+100275, "๔€‰ต", f48089b5), _c(U+100276, "๔€‰ถ", f48089b6), _c(U+100277, "๔€‰ท", f48089b7), _c(U+100278, "๔€‰ธ", f48089b8), _c(U+100279, "๔€‰น", f48089b9), _c(U+10027A, "๔€‰บ", f48089ba), _c(U+10027B, "๔€‰ป", f48089bb), _c(U+10027C, "๔€‰ผ", f48089bc), _c(U+10027D, "๔€‰ฝ", f48089bd), _c(U+10027E, "๔€‰พ", f48089be), _c(U+10027F, "๔€‰ฟ", f48089bf), _c(U+100280, "๔€Š€", f4808a80), _c(U+100281, "๔€Š", f4808a81), _c(U+100282, "๔€Š‚", f4808a82), _c(U+100283, "๔€Šƒ", f4808a83), _c(U+100284, "๔€Š„", f4808a84), _c(U+100285, "๔€Š…", f4808a85), _c(U+100286, "๔€Š†", f4808a86), _c(U+100287, "๔€Š‡", f4808a87), _c(U+100288, "๔€Šˆ", f4808a88), _c(U+100289, "๔€Š‰", f4808a89), _c(U+10028A, "๔€ŠŠ", f4808a8a), _c(U+10028B, "๔€Š‹", f4808a8b), _c(U+10028C, "๔€ŠŒ", f4808a8c), _c(U+10028D, "๔€Š", f4808a8d), _c(U+10028E, "๔€ŠŽ", f4808a8e), _c(U+10028F, "๔€Š", f4808a8f), _c(U+100290, "๔€Š", f4808a90), _c(U+100291, "๔€Š‘", f4808a91), _c(U+100292, "๔€Š’", f4808a92), _c(U+100293, "๔€Š“", f4808a93), _c(U+100294, "๔€Š”", f4808a94), _c(U+100295, "๔€Š•", f4808a95), _c(U+100296, "๔€Š–", f4808a96), _c(U+100297, "๔€Š—", f4808a97), _c(U+100298, "๔€Š˜", f4808a98), _c(U+100299, "๔€Š™", f4808a99), _c(U+10029A, "๔€Šš", f4808a9a), _c(U+10029B, "๔€Š›", f4808a9b), _c(U+10029C, "๔€Šœ", f4808a9c), _c(U+10029D, "๔€Š", f4808a9d), _c(U+10029E, "๔€Šž", f4808a9e), _c(U+10029F, "๔€ŠŸ", f4808a9f), _c(U+1002A0, "๔€Š ", f4808aa0), _c(U+1002A1, "๔€Šก", f4808aa1), _c(U+1002A2, "๔€Šข", f4808aa2), _c(U+1002A3, "๔€Šฃ", f4808aa3), _c(U+1002A4, "๔€Šค", f4808aa4), _c(U+1002A5, "๔€Šฅ", f4808aa5), _c(U+1002A6, "๔€Šฆ", f4808aa6), _c(U+1002A7, "๔€Šง", f4808aa7), _c(U+1002A8, "๔€Šจ", f4808aa8), _c(U+1002A9, "๔€Šฉ", f4808aa9), _c(U+1002AA, "๔€Šช", f4808aaa), _c(U+1002AB, "๔€Šซ", f4808aab), _c(U+1002AC, "๔€Šฌ", f4808aac), _c(U+1002AD, "๔€Šญ", f4808aad), _c(U+1002AE, "๔€Šฎ", f4808aae), _c(U+1002AF, "๔€Šฏ", f4808aaf), _c(U+1002B0, "๔€Šฐ", f4808ab0), _c(U+1002B1, "๔€Šฑ", f4808ab1), _c(U+1002B2, "๔€Šฒ", f4808ab2), _c(U+1002B3, "๔€Šณ", f4808ab3), _c(U+1002B4, "๔€Šด", f4808ab4), _c(U+1002B5, "๔€Šต", f4808ab5), _c(U+1002B6, "๔€Šถ", f4808ab6), _c(U+1002B7, "๔€Šท", f4808ab7), _c(U+1002B8, "๔€Šธ", f4808ab8), _c(U+1002B9, "๔€Šน", f4808ab9), _c(U+1002BA, "๔€Šบ", f4808aba), _c(U+1002BB, "๔€Šป", f4808abb), _c(U+1002BC, "๔€Šผ", f4808abc), _c(U+1002BD, "๔€Šฝ", f4808abd), _c(U+1002BE, "๔€Šพ", f4808abe), _c(U+1002BF, "๔€Šฟ", f4808abf), _c(U+1002C0, "๔€‹€", f4808b80), _c(U+1002C1, "๔€‹", f4808b81), _c(U+1002C2, "๔€‹‚", f4808b82), _c(U+1002C3, "๔€‹ƒ", f4808b83), _c(U+1002C4, "๔€‹„", f4808b84), _c(U+1002C5, "๔€‹…", f4808b85), _c(U+1002C6, "๔€‹†", f4808b86), _c(U+1002C7, "๔€‹‡", f4808b87), _c(U+1002C8, "๔€‹ˆ", f4808b88), _c(U+1002C9, "๔€‹‰", f4808b89), _c(U+1002CA, "๔€‹Š", f4808b8a), _c(U+1002CB, "๔€‹‹", f4808b8b), _c(U+1002CC, "๔€‹Œ", f4808b8c), _c(U+1002CD, "๔€‹", f4808b8d), _c(U+1002CE, "๔€‹Ž", f4808b8e), _c(U+1002CF, "๔€‹", f4808b8f), _c(U+1002D0, "๔€‹", f4808b90), _c(U+1002D1, "๔€‹‘", f4808b91), _c(U+1002D2, "๔€‹’", f4808b92), _c(U+1002D3, "๔€‹“", f4808b93), _c(U+1002D4, "๔€‹”", f4808b94), _c(U+1002D5, "๔€‹•", f4808b95), _c(U+1002D6, "๔€‹–", f4808b96), _c(U+1002D7, "๔€‹—", f4808b97), _c(U+1002D8, "๔€‹˜", f4808b98), _c(U+1002D9, "๔€‹™", f4808b99), _c(U+1002DA, "๔€‹š", f4808b9a), _c(U+1002DB, "๔€‹›", f4808b9b), _c(U+1002DC, "๔€‹œ", f4808b9c), _c(U+1002DD, "๔€‹", f4808b9d), _c(U+1002DE, "๔€‹ž", f4808b9e), _c(U+1002DF, "๔€‹Ÿ", f4808b9f), _c(U+1002E0, "๔€‹ ", f4808ba0), _c(U+1002E1, "๔€‹ก", f4808ba1), _c(U+1002E2, "๔€‹ข", f4808ba2), _c(U+1002E3, "๔€‹ฃ", f4808ba3), _c(U+1002E4, "๔€‹ค", f4808ba4), _c(U+1002E5, "๔€‹ฅ", f4808ba5), _c(U+1002E6, "๔€‹ฆ", f4808ba6), _c(U+1002E7, "๔€‹ง", f4808ba7), _c(U+1002E8, "๔€‹จ", f4808ba8), _c(U+1002E9, "๔€‹ฉ", f4808ba9), _c(U+1002EA, "๔€‹ช", f4808baa), _c(U+1002EB, "๔€‹ซ", f4808bab), _c(U+1002EC, "๔€‹ฌ", f4808bac), _c(U+1002ED, "๔€‹ญ", f4808bad), _c(U+1002EE, "๔€‹ฎ", f4808bae), _c(U+1002EF, "๔€‹ฏ", f4808baf), _c(U+1002F0, "๔€‹ฐ", f4808bb0), _c(U+1002F1, "๔€‹ฑ", f4808bb1), _c(U+1002F2, "๔€‹ฒ", f4808bb2), _c(U+1002F3, "๔€‹ณ", f4808bb3), _c(U+1002F4, "๔€‹ด", f4808bb4), _c(U+1002F5, "๔€‹ต", f4808bb5), _c(U+1002F6, "๔€‹ถ", f4808bb6), _c(U+1002F7, "๔€‹ท", f4808bb7), _c(U+1002F8, "๔€‹ธ", f4808bb8), _c(U+1002F9, "๔€‹น", f4808bb9), _c(U+1002FA, "๔€‹บ", f4808bba), _c(U+1002FB, "๔€‹ป", f4808bbb), _c(U+1002FC, "๔€‹ผ", f4808bbc), _c(U+1002FD, "๔€‹ฝ", f4808bbd), _c(U+1002FE, "๔€‹พ", f4808bbe), _c(U+1002FF, "๔€‹ฟ", f4808bbf), _c(U+100300, "๔€Œ€", f4808c80), _c(U+100301, "๔€Œ", f4808c81), _c(U+100302, "๔€Œ‚", f4808c82), _c(U+100303, "๔€Œƒ", f4808c83), _c(U+100304, "๔€Œ„", f4808c84), _c(U+100305, "๔€Œ…", f4808c85), _c(U+100306, "๔€Œ†", f4808c86), _c(U+100307, "๔€Œ‡", f4808c87), _c(U+100308, "๔€Œˆ", f4808c88), _c(U+100309, "๔€Œ‰", f4808c89), _c(U+10030A, "๔€ŒŠ", f4808c8a), _c(U+10030B, "๔€Œ‹", f4808c8b), _c(U+10030C, "๔€ŒŒ", f4808c8c), _c(U+10030D, "๔€Œ", f4808c8d), _c(U+10030E, "๔€ŒŽ", f4808c8e), _c(U+10030F, "๔€Œ", f4808c8f), _c(U+100310, "๔€Œ", f4808c90), _c(U+100311, "๔€Œ‘", f4808c91), _c(U+100312, "๔€Œ’", f4808c92), _c(U+100313, "๔€Œ“", f4808c93), _c(U+100314, "๔€Œ”", f4808c94), _c(U+100315, "๔€Œ•", f4808c95), _c(U+100316, "๔€Œ–", f4808c96), _c(U+100317, "๔€Œ—", f4808c97), _c(U+100318, "๔€Œ˜", f4808c98), _c(U+100319, "๔€Œ™", f4808c99), _c(U+10031A, "๔€Œš", f4808c9a), _c(U+10031B, "๔€Œ›", f4808c9b), _c(U+10031C, "๔€Œœ", f4808c9c), _c(U+10031D, "๔€Œ", f4808c9d), _c(U+10031E, "๔€Œž", f4808c9e), _c(U+10031F, "๔€ŒŸ", f4808c9f), _c(U+100320, "๔€Œ ", f4808ca0), _c(U+100321, "๔€Œก", f4808ca1), _c(U+100322, "๔€Œข", f4808ca2), _c(U+100323, "๔€Œฃ", f4808ca3), _c(U+100324, "๔€Œค", f4808ca4), _c(U+100325, "๔€Œฅ", f4808ca5), _c(U+100326, "๔€Œฆ", f4808ca6), _c(U+100327, "๔€Œง", f4808ca7), _c(U+100328, "๔€Œจ", f4808ca8), _c(U+100329, "๔€Œฉ", f4808ca9), _c(U+10032A, "๔€Œช", f4808caa), _c(U+10032B, "๔€Œซ", f4808cab), _c(U+10032C, "๔€Œฌ", f4808cac), _c(U+10032D, "๔€Œญ", f4808cad), _c(U+10032E, "๔€Œฎ", f4808cae), _c(U+10032F, "๔€Œฏ", f4808caf), _c(U+100330, "๔€Œฐ", f4808cb0), _c(U+100331, "๔€Œฑ", f4808cb1), _c(U+100332, "๔€Œฒ", f4808cb2), _c(U+100333, "๔€Œณ", f4808cb3), _c(U+100334, "๔€Œด", f4808cb4), _c(U+100335, "๔€Œต", f4808cb5), _c(U+100336, "๔€Œถ", f4808cb6), _c(U+100337, "๔€Œท", f4808cb7), _c(U+100338, "๔€Œธ", f4808cb8), _c(U+100339, "๔€Œน", f4808cb9), _c(U+10033A, "๔€Œบ", f4808cba), _c(U+10033B, "๔€Œป", f4808cbb), _c(U+10033C, "๔€Œผ", f4808cbc), _c(U+10033D, "๔€Œฝ", f4808cbd), _c(U+10033E, "๔€Œพ", f4808cbe), _c(U+10033F, "๔€Œฟ", f4808cbf), _c(U+100340, "๔€€", f4808d80), _c(U+100341, "๔€", f4808d81), _c(U+100342, "๔€‚", f4808d82), _c(U+100343, "๔€ƒ", f4808d83), _c(U+100344, "๔€„", f4808d84), _c(U+100345, "๔€…", f4808d85), _c(U+100346, "๔€†", f4808d86), _c(U+100347, "๔€‡", f4808d87), _c(U+100348, "๔€ˆ", f4808d88), _c(U+100349, "๔€‰", f4808d89), _c(U+10034A, "๔€Š", f4808d8a), _c(U+10034B, "๔€‹", f4808d8b), _c(U+10034C, "๔€Œ", f4808d8c), _c(U+10034D, "๔€", f4808d8d), _c(U+10034E, "๔€Ž", f4808d8e), _c(U+10034F, "๔€", f4808d8f), _c(U+100350, "๔€", f4808d90), _c(U+100351, "๔€‘", f4808d91), _c(U+100352, "๔€’", f4808d92), _c(U+100353, "๔€“", f4808d93), _c(U+100354, "๔€”", f4808d94), _c(U+100355, "๔€•", f4808d95), _c(U+100356, "๔€–", f4808d96), _c(U+100357, "๔€—", f4808d97), _c(U+100358, "๔€˜", f4808d98), _c(U+100359, "๔€™", f4808d99), _c(U+10035A, "๔€š", f4808d9a), _c(U+10035B, "๔€›", f4808d9b), _c(U+10035C, "๔€œ", f4808d9c), _c(U+10035D, "๔€", f4808d9d), _c(U+10035E, "๔€ž", f4808d9e), _c(U+10035F, "๔€Ÿ", f4808d9f), _c(U+100360, "๔€ ", f4808da0), _c(U+100361, "๔€ก", f4808da1), _c(U+100362, "๔€ข", f4808da2), _c(U+100363, "๔€ฃ", f4808da3), _c(U+100364, "๔€ค", f4808da4), _c(U+100365, "๔€ฅ", f4808da5), _c(U+100366, "๔€ฆ", f4808da6), _c(U+100367, "๔€ง", f4808da7), _c(U+100368, "๔€จ", f4808da8), _c(U+100369, "๔€ฉ", f4808da9), _c(U+10036A, "๔€ช", f4808daa), _c(U+10036B, "๔€ซ", f4808dab), _c(U+10036C, "๔€ฌ", f4808dac), _c(U+10036D, "๔€ญ", f4808dad), _c(U+10036E, "๔€ฎ", f4808dae), _c(U+10036F, "๔€ฏ", f4808daf), _c(U+100370, "๔€ฐ", f4808db0), _c(U+100371, "๔€ฑ", f4808db1), _c(U+100372, "๔€ฒ", f4808db2), _c(U+100373, "๔€ณ", f4808db3), _c(U+100374, "๔€ด", f4808db4), _c(U+100375, "๔€ต", f4808db5), _c(U+100376, "๔€ถ", f4808db6), _c(U+100377, "๔€ท", f4808db7), _c(U+100378, "๔€ธ", f4808db8), _c(U+100379, "๔€น", f4808db9), _c(U+10037A, "๔€บ", f4808dba), _c(U+10037B, "๔€ป", f4808dbb), _c(U+10037C, "๔€ผ", f4808dbc), _c(U+10037D, "๔€ฝ", f4808dbd), _c(U+10037E, "๔€พ", f4808dbe), _c(U+10037F, "๔€ฟ", f4808dbf), _c(U+100380, "๔€Ž€", f4808e80), _c(U+100381, "๔€Ž", f4808e81), _c(U+100382, "๔€Ž‚", f4808e82), _c(U+100383, "๔€Žƒ", f4808e83), _c(U+100384, "๔€Ž„", f4808e84), _c(U+100385, "๔€Ž…", f4808e85), _c(U+100386, "๔€Ž†", f4808e86), _c(U+100387, "๔€Ž‡", f4808e87), _c(U+100388, "๔€Žˆ", f4808e88), _c(U+100389, "๔€Ž‰", f4808e89), _c(U+10038A, "๔€ŽŠ", f4808e8a), _c(U+10038B, "๔€Ž‹", f4808e8b), _c(U+10038C, "๔€ŽŒ", f4808e8c), _c(U+10038D, "๔€Ž", f4808e8d), _c(U+10038E, "๔€ŽŽ", f4808e8e), _c(U+10038F, "๔€Ž", f4808e8f), _c(U+100390, "๔€Ž", f4808e90), _c(U+100391, "๔€Ž‘", f4808e91), _c(U+100392, "๔€Ž’", f4808e92), _c(U+100393, "๔€Ž“", f4808e93), _c(U+100394, "๔€Ž”", f4808e94), _c(U+100395, "๔€Ž•", f4808e95), _c(U+100396, "๔€Ž–", f4808e96), _c(U+100397, "๔€Ž—", f4808e97), _c(U+100398, "๔€Ž˜", f4808e98), _c(U+100399, "๔€Ž™", f4808e99), _c(U+10039A, "๔€Žš", f4808e9a), _c(U+10039B, "๔€Ž›", f4808e9b), _c(U+10039C, "๔€Žœ", f4808e9c), _c(U+10039D, "๔€Ž", f4808e9d), _c(U+10039E, "๔€Žž", f4808e9e), _c(U+10039F, "๔€ŽŸ", f4808e9f), _c(U+1003A0, "๔€Ž ", f4808ea0), _c(U+1003A1, "๔€Žก", f4808ea1), _c(U+1003A2, "๔€Žข", f4808ea2), _c(U+1003A3, "๔€Žฃ", f4808ea3), _c(U+1003A4, "๔€Žค", f4808ea4), _c(U+1003A5, "๔€Žฅ", f4808ea5), _c(U+1003A6, "๔€Žฆ", f4808ea6), _c(U+1003A7, "๔€Žง", f4808ea7), _c(U+1003A8, "๔€Žจ", f4808ea8), _c(U+1003A9, "๔€Žฉ", f4808ea9), _c(U+1003AA, "๔€Žช", f4808eaa), _c(U+1003AB, "๔€Žซ", f4808eab), _c(U+1003AC, "๔€Žฌ", f4808eac), _c(U+1003AD, "๔€Žญ", f4808ead), _c(U+1003AE, "๔€Žฎ", f4808eae), _c(U+1003AF, "๔€Žฏ", f4808eaf), _c(U+1003B0, "๔€Žฐ", f4808eb0), _c(U+1003B1, "๔€Žฑ", f4808eb1), _c(U+1003B2, "๔€Žฒ", f4808eb2), _c(U+1003B3, "๔€Žณ", f4808eb3), _c(U+1003B4, "๔€Žด", f4808eb4), _c(U+1003B5, "๔€Žต", f4808eb5), _c(U+1003B6, "๔€Žถ", f4808eb6), _c(U+1003B7, "๔€Žท", f4808eb7), _c(U+1003B8, "๔€Žธ", f4808eb8), _c(U+1003B9, "๔€Žน", f4808eb9), _c(U+1003BA, "๔€Žบ", f4808eba), _c(U+1003BB, "๔€Žป", f4808ebb), _c(U+1003BC, "๔€Žผ", f4808ebc), _c(U+1003BD, "๔€Žฝ", f4808ebd), _c(U+1003BE, "๔€Žพ", f4808ebe), _c(U+1003BF, "๔€Žฟ", f4808ebf), _c(U+1003C0, "๔€€", f4808f80), _c(U+1003C1, "๔€", f4808f81), _c(U+1003C2, "๔€‚", f4808f82), _c(U+1003C3, "๔€ƒ", f4808f83), _c(U+1003C4, "๔€„", f4808f84), _c(U+1003C5, "๔€…", f4808f85), _c(U+1003C6, "๔€†", f4808f86), _c(U+1003C7, "๔€‡", f4808f87), _c(U+1003C8, "๔€ˆ", f4808f88), _c(U+1003C9, "๔€‰", f4808f89), _c(U+1003CA, "๔€Š", f4808f8a), _c(U+1003CB, "๔€‹", f4808f8b), _c(U+1003CC, "๔€Œ", f4808f8c), _c(U+1003CD, "๔€", f4808f8d), _c(U+1003CE, "๔€Ž", f4808f8e), _c(U+1003CF, "๔€", f4808f8f), _c(U+1003D0, "๔€", f4808f90), _c(U+1003D1, "๔€‘", f4808f91), _c(U+1003D2, "๔€’", f4808f92), _c(U+1003D3, "๔€“", f4808f93), _c(U+1003D4, "๔€”", f4808f94), _c(U+1003D5, "๔€•", f4808f95), _c(U+1003D6, "๔€–", f4808f96), _c(U+1003D7, "๔€—", f4808f97), _c(U+1003D8, "๔€˜", f4808f98), _c(U+1003D9, "๔€™", f4808f99), _c(U+1003DA, "๔€š", f4808f9a), _c(U+1003DB, "๔€›", f4808f9b), _c(U+1003DC, "๔€œ", f4808f9c), _c(U+1003DD, "๔€", f4808f9d), _c(U+1003DE, "๔€ž", f4808f9e), _c(U+1003DF, "๔€Ÿ", f4808f9f), _c(U+1003E0, "๔€ ", f4808fa0), _c(U+1003E1, "๔€ก", f4808fa1), _c(U+1003E2, "๔€ข", f4808fa2), _c(U+1003E3, "๔€ฃ", f4808fa3), _c(U+1003E4, "๔€ค", f4808fa4), _c(U+1003E5, "๔€ฅ", f4808fa5), _c(U+1003E6, "๔€ฆ", f4808fa6), _c(U+1003E7, "๔€ง", f4808fa7), _c(U+1003E8, "๔€จ", f4808fa8), _c(U+1003E9, "๔€ฉ", f4808fa9), _c(U+1003EA, "๔€ช", f4808faa), _c(U+1003EB, "๔€ซ", f4808fab), _c(U+1003EC, "๔€ฌ", f4808fac), _c(U+1003ED, "๔€ญ", f4808fad), _c(U+1003EE, "๔€ฎ", f4808fae), _c(U+1003EF, "๔€ฏ", f4808faf), _c(U+1003F0, "๔€ฐ", f4808fb0), _c(U+1003F1, "๔€ฑ", f4808fb1), _c(U+1003F2, "๔€ฒ", f4808fb2), _c(U+1003F3, "๔€ณ", f4808fb3), _c(U+1003F4, "๔€ด", f4808fb4), _c(U+1003F5, "๔€ต", f4808fb5), _c(U+1003F6, "๔€ถ", f4808fb6), _c(U+1003F7, "๔€ท", f4808fb7), _c(U+1003F8, "๔€ธ", f4808fb8), _c(U+1003F9, "๔€น", f4808fb9), _c(U+1003FA, "๔€บ", f4808fba), _c(U+1003FB, "๔€ป", f4808fbb), _c(U+1003FC, "๔€ผ", f4808fbc), _c(U+1003FD, "๔€ฝ", f4808fbd), _c(U+1003FE, "๔€พ", f4808fbe), _c(U+1003FF, "๔€ฟ", f4808fbf), #undef _c c4core-0.2.6/tools/000077500000000000000000000000001477602032300140425ustar00rootroot00000000000000c4core-0.2.6/tools/amalgamate.py000066400000000000000000000126261477602032300165140ustar00rootroot00000000000000import re from os.path import abspath, dirname import sys import subprocess projdir = abspath(dirname(dirname(__file__))) sys.path.insert(0, f"{projdir}/cmake") import amalgamate_utils as am def amalgamate_fastfloat(): fastfloatdir = f"{projdir}/src/c4/ext/fast_float" subprocess.run([ sys.executable, f"{fastfloatdir}/script/amalgamate.py", "--license", "MIT", "--output", f"{fastfloatdir}/../fast_float_all.h" ], cwd=fastfloatdir).check_returncode() def amalgamate_c4core(filename: str, with_stl: bool=True, with_fastfloat: bool=True): if with_fastfloat: amalgamate_fastfloat() repo = "https://github.com/biojppm/c4core" defmacro = "C4CORE_SINGLE_HDR_DEFINE_NOW" exports_def_code = f"""// shared library: export when defining #if defined(C4CORE_SHARED) && defined({defmacro}) && !defined(C4CORE_EXPORTS) #define C4CORE_EXPORTS #endif """ required_gcc4_8_include = """// (amalgamate) these includes are needed to work around // conditional includes in the gcc4.8 shim #include #include #include """ required_charconv_include = """// (amalgamate) this include is needed to work around // conditional includes in charconv.hpp #if (defined(_MSVC_LANG) && (_MSVC_LANG >= 201703L)) || (__cplusplus >= 201703L) #include #endif """ srcblocks = [ am.cmttext(f""" c4core - C++ utilities {repo} DO NOT EDIT. This file is generated automatically. This is an amalgamated single-header version of the library. INSTRUCTIONS: - Include at will in any header of your project - In one (and only one) of your project source files, #define {defmacro} and then include this header. This will enable the function and class definitions in the header file. - To compile into a shared library, just define the preprocessor symbol C4CORE_SHARED . This will take care of symbol export/import. """), am.cmtfile("LICENSE.txt"), am.injcode(exports_def_code), "src/c4/export.hpp", "src/c4/version.hpp", "src/c4/preprocessor.hpp", "src/c4/platform.hpp", "src/c4/cpu.hpp", am.injcode(required_gcc4_8_include), "src/c4/gcc-4.8.hpp", "src/c4/compiler.hpp", "src/c4/language.hpp", "src/c4/types.hpp", "src/c4/config.hpp", am.hdrfile("src/c4/ext/debugbreak/debugbreak.h", "c4/ext/debugbreak/debugbreak.h", "DEBUG_BREAK_H"), "src/c4/error.hpp", "src/c4/memory_util.hpp", "src/c4/memory_resource.hpp", "src/c4/ctor_dtor.hpp", "src/c4/allocator.hpp", "src/c4/char_traits.hpp", "src/c4/hash.hpp", "src/c4/szconv.hpp", "src/c4/blob.hpp", "src/c4/substr_fwd.hpp", "src/c4/substr.hpp", am.onlyif(with_fastfloat, am.injfile("src/c4/ext/fast_float_all.h", "c4/ext/fast_float_all.h")), am.onlyif(with_fastfloat, "src/c4/ext/fast_float.hpp"), "src/c4/std/vector_fwd.hpp", "src/c4/std/string_fwd.hpp", "src/c4/std/std_fwd.hpp", am.injcode(required_charconv_include), "src/c4/charconv.hpp", "src/c4/utf.hpp", "src/c4/format.hpp", "src/c4/dump.hpp", "src/c4/enum.hpp", "src/c4/bitmask.hpp", "src/c4/span.hpp", "src/c4/type_name.hpp", "src/c4/base64.hpp", am.onlyif(with_stl, am.ignfile("src/c4/std/std.hpp")), # this is an umbrella include am.onlyif(with_stl, "src/c4/std/string.hpp"), am.onlyif(with_stl, "src/c4/std/string_view.hpp"), am.onlyif(with_stl, "src/c4/std/vector.hpp"), am.onlyif(with_stl, "src/c4/std/tuple.hpp"), "src/c4/ext/rng/rng.hpp", "src/c4/ext/sg14/inplace_function.h", am.ignfile("src/c4/common.hpp"), am.ignfile("src/c4/c4_push.hpp"), am.ignfile("src/c4/c4_pop.hpp"), am.ignfile("src/c4/restrict.hpp"), am.ignfile("src/c4/unrestrict.hpp"), "src/c4/version.cpp", "src/c4/language.cpp", "src/c4/format.cpp", "src/c4/memory_util.cpp", "src/c4/char_traits.cpp", "src/c4/memory_resource.cpp", "src/c4/utf.cpp", "src/c4/base64.cpp", am.injcode("#define C4_WINDOWS_POP_HPP_"), "src/c4/windows_push.hpp", "src/c4/windows.hpp", "src/c4/windows_pop.hpp", # do NOT include this before windows.hpp "src/c4/error.cpp", ] result = am.catfiles(srcblocks, projdir, # comment out lines with these patterns: include_regexes=[ re.compile(r'^\s*#\s*include "(c4/.*)".*$'), re.compile(r'^\s*#\s*include <(c4/.*)>.*$'), ], definition_macro=defmacro, repo=repo, result_incguard="_C4CORE_SINGLE_HEADER_AMALGAMATED_HPP_") result_with_only_first_includes = am.include_only_first(result) am.file_put_contents(filename, result_with_only_first_includes) def mkparser(): return am.mkparser(fastfloat=(True, "enable fastfloat library"), stl=(True, "enable stl interop")) if __name__ == "__main__": args = mkparser().parse_args() amalgamate_c4core(filename=args.output, with_fastfloat=args.fastfloat, with_stl=args.stl)