summaryrefslogtreecommitdiff
path: root/libc
diff options
context:
space:
mode:
authorMichael Kruse <llvm-project@meinersbur.de>2025-01-03 10:22:51 +0100
committerMichael Kruse <llvm-project@meinersbur.de>2025-01-03 10:22:51 +0100
commit38500d63e14ce340236840f60d356cdefb56a52c (patch)
tree17edbec446ce9b50d2f215a483b83afb293a635d /libc
parent1a3d5daaef7a6a63448a497da3eff7fc9e23df26 (diff)
parent27f30029741ecf023baece7b3dde1ff9011ffefc (diff)
Merge branch 'main' into users/meinersbur/flang_runtime_split-headersusers/meinersbur/flang_runtime_split-headers
Diffstat (limited to 'libc')
-rw-r--r--libc/CMakeLists.txt10
-rw-r--r--libc/benchmarks/CMakeLists.txt8
-rw-r--r--libc/benchmarks/automemcpy/CMakeLists.txt12
-rw-r--r--libc/benchmarks/automemcpy/README.md111
-rw-r--r--libc/benchmarks/automemcpy/include/automemcpy/CodeGen.h26
-rw-r--r--libc/benchmarks/automemcpy/include/automemcpy/FunctionDescriptor.h159
-rw-r--r--libc/benchmarks/automemcpy/include/automemcpy/RandomFunctionGenerator.h62
-rw-r--r--libc/benchmarks/automemcpy/include/automemcpy/ResultAnalyzer.h109
-rw-r--r--libc/benchmarks/automemcpy/lib/CMakeLists.txt37
-rw-r--r--libc/benchmarks/automemcpy/lib/CodeGen.cpp644
-rw-r--r--libc/benchmarks/automemcpy/lib/CodeGenMain.cpp29
-rw-r--r--libc/benchmarks/automemcpy/lib/RandomFunctionGenerator.cpp280
-rw-r--r--libc/benchmarks/automemcpy/lib/ResultAnalyzer.cpp204
-rw-r--r--libc/benchmarks/automemcpy/lib/ResultAnalyzerMain.cpp175
-rw-r--r--libc/benchmarks/automemcpy/unittests/CMakeLists.txt9
-rw-r--r--libc/benchmarks/automemcpy/unittests/CodeGenTest.cpp226
-rw-r--r--libc/benchmarks/automemcpy/unittests/ResultAnalyzerTest.cpp191
-rw-r--r--libc/cmake/modules/CheckCompilerFeatures.cmake6
-rw-r--r--libc/cmake/modules/LLVMLibCCompileOptionRules.cmake18
-rw-r--r--libc/cmake/modules/LLVMLibCHeaderRules.cmake5
-rw-r--r--libc/cmake/modules/LLVMLibCObjectRules.cmake38
-rw-r--r--libc/cmake/modules/LLVMLibCTestRules.cmake40
-rw-r--r--libc/cmake/modules/compiler_features/check_cfloat128.cpp5
-rw-r--r--libc/cmake/modules/compiler_features/check_cfloat16.cpp5
-rw-r--r--libc/config/baremetal/aarch64/entrypoints.txt478
-rw-r--r--libc/config/baremetal/aarch64/headers.txt20
-rw-r--r--libc/config/baremetal/arm/entrypoints.txt17
-rw-r--r--libc/config/baremetal/config.json10
-rw-r--r--libc/config/baremetal/riscv/entrypoints.txt17
-rw-r--r--libc/config/darwin/arm/entrypoints.txt12
-rw-r--r--libc/config/darwin/x86_64/entrypoints.txt8
-rw-r--r--libc/config/gpu/entrypoints.txt20
-rw-r--r--libc/config/gpu/headers.txt3
-rw-r--r--libc/config/linux/aarch64/entrypoints.txt55
-rw-r--r--libc/config/linux/aarch64/headers.txt1
-rw-r--r--libc/config/linux/arm/entrypoints.txt22
-rw-r--r--libc/config/linux/arm/headers.txt1
-rw-r--r--libc/config/linux/riscv/entrypoints.txt43
-rw-r--r--libc/config/linux/riscv/headers.txt1
-rw-r--r--libc/config/linux/x86_64/entrypoints.txt56
-rw-r--r--libc/config/linux/x86_64/headers.txt1
-rw-r--r--libc/config/windows/entrypoints.txt16
-rw-r--r--libc/docs/arch_support.rst19
-rw-r--r--libc/docs/conf.py4
-rw-r--r--libc/docs/ctype.rst74
-rw-r--r--libc/docs/dev/header_generation.rst27
-rw-r--r--libc/docs/dev/index.rst1
-rw-r--r--libc/docs/dev/source_tree_layout.rst13
-rw-r--r--libc/docs/fenv.rst175
-rw-r--r--libc/docs/full_cross_build.rst14
-rw-r--r--libc/docs/full_host_build.rst72
-rw-r--r--libc/docs/gpu/rpc.rst112
-rw-r--r--libc/docs/gpu/using.rst35
-rw-r--r--libc/docs/header_gen_scheme.svg1
-rw-r--r--libc/docs/headers/arpa/inet.rst50
-rw-r--r--libc/docs/headers/assert.rst27
-rw-r--r--libc/docs/headers/complex.rst (renamed from libc/docs/complex.rst)6
-rw-r--r--libc/docs/headers/ctype.rst130
-rw-r--r--libc/docs/headers/errno.rst35
-rw-r--r--libc/docs/headers/fenv.rst175
-rw-r--r--libc/docs/headers/float.rst227
-rw-r--r--libc/docs/headers/index.rst30
-rw-r--r--libc/docs/headers/inttypes.rst42
-rw-r--r--libc/docs/headers/locale.rst83
-rw-r--r--libc/docs/headers/math/index.rst (renamed from libc/docs/math/index.rst)10
-rw-r--r--libc/docs/headers/math/log.rst (renamed from libc/docs/math/log.rst)0
-rw-r--r--libc/docs/headers/math/stdfix.rst (renamed from libc/docs/math/stdfix.rst)2
-rw-r--r--libc/docs/headers/search.rst (renamed from libc/docs/libc_search.rst)8
-rw-r--r--libc/docs/headers/setjmp.rst (renamed from libc/docs/setjmp.rst)6
-rw-r--r--libc/docs/headers/signal.rst207
-rw-r--r--libc/docs/headers/stdbit.rst (renamed from libc/docs/stdbit.rst)6
-rw-r--r--libc/docs/headers/stdio.rst359
-rw-r--r--libc/docs/headers/stdlib.rst255
-rw-r--r--libc/docs/headers/string.rst163
-rw-r--r--libc/docs/headers/strings.rst66
-rw-r--r--libc/docs/headers/sys/mman.rst179
-rw-r--r--libc/docs/headers/threads.rst147
-rw-r--r--libc/docs/headers/time.rst (renamed from libc/docs/date_and_time.rst)8
-rw-r--r--libc/docs/headers/uchar.rst59
-rw-r--r--libc/docs/headers/wchar.rst287
-rw-r--r--libc/docs/headers/wctype.rst86
-rw-r--r--libc/docs/index.rst56
-rw-r--r--libc/docs/platform_support.rst22
-rw-r--r--libc/docs/signal.rst207
-rw-r--r--libc/docs/stdio.rst93
-rw-r--r--libc/docs/strings.rst166
-rw-r--r--libc/docs/talks.rst43
-rw-r--r--libc/docs/threads.rst139
-rw-r--r--libc/fuzzing/__support/CMakeLists.txt27
-rw-r--r--libc/fuzzing/__support/fake_heap.s15
-rw-r--r--libc/fuzzing/string/CMakeLists.txt2
-rw-r--r--libc/fuzzing/string/bcmp_fuzz.cpp2
-rw-r--r--libc/hdr/CMakeLists.txt11
-rw-r--r--libc/hdr/fcntl_overlay.h10
-rw-r--r--libc/hdr/func/free.h3
-rw-r--r--libc/hdr/func/malloc.h4
-rw-r--r--libc/hdr/func/realloc.h4
-rw-r--r--libc/hdr/time_macros.h6
-rw-r--r--libc/hdr/types/CMakeLists.txt24
-rw-r--r--libc/hdr/types/clockid_t.h3
-rw-r--r--libc/hdr/types/ssize_t.h4
-rw-r--r--libc/hdr/types/struct_f_owner_ex.h2
-rw-r--r--libc/hdr/types/struct_flock.h2
-rw-r--r--libc/hdr/types/struct_flock64.h2
-rw-r--r--libc/hdr/types/uid_t.h22
-rw-r--r--libc/hdr/unistd_macros.h2
-rw-r--r--libc/hdr/unistd_overlay.h69
-rw-r--r--libc/hdrgen/yaml/gpu/rpc.yaml23
-rw-r--r--libc/include/CMakeLists.txt126
-rw-r--r--libc/include/__llvm-libc-common.h14
-rw-r--r--libc/include/arpa/inet.yaml (renamed from libc/hdrgen/yaml/arpa/inet.yaml)0
-rw-r--r--libc/include/assert.yaml (renamed from libc/hdrgen/yaml/assert.yaml)0
-rw-r--r--libc/include/complex.yaml137
-rw-r--r--libc/include/ctype.yaml (renamed from libc/hdrgen/yaml/ctype.yaml)0
-rw-r--r--libc/include/dirent.yaml (renamed from libc/hdrgen/yaml/dirent.yaml)0
-rw-r--r--libc/include/dlfcn.yaml (renamed from libc/hdrgen/yaml/dlfcn.yaml)0
-rw-r--r--libc/include/elf.yaml (renamed from libc/hdrgen/yaml/elf.yaml)0
-rw-r--r--libc/include/errno.yaml (renamed from libc/hdrgen/yaml/errno.yaml)0
-rw-r--r--libc/include/fcntl.yaml (renamed from libc/hdrgen/yaml/fcntl.yaml)0
-rw-r--r--libc/include/features.yaml (renamed from libc/hdrgen/yaml/features.yaml)0
-rw-r--r--libc/include/fenv.yaml (renamed from libc/hdrgen/yaml/fenv.yaml)0
-rw-r--r--libc/include/float.yaml (renamed from libc/hdrgen/yaml/float.yaml)0
-rw-r--r--libc/include/inttypes.yaml (renamed from libc/hdrgen/yaml/inttypes.yaml)0
-rw-r--r--libc/include/limits.yaml (renamed from libc/hdrgen/yaml/limits.yaml)0
-rw-r--r--libc/include/link.yaml (renamed from libc/hdrgen/yaml/link.yaml)0
-rw-r--r--libc/include/llvm-libc-macros/CMakeLists.txt6
-rw-r--r--libc/include/llvm-libc-macros/pthread-macros.h37
-rw-r--r--libc/include/llvm-libc-macros/windows/CMakeLists.txt6
-rw-r--r--libc/include/llvm-libc-macros/windows/time-macros-ext.h17
-rw-r--r--libc/include/llvm-libc-types/cfloat128.h1
-rw-r--r--libc/include/locale.yaml (renamed from libc/hdrgen/yaml/locale.yaml)0
-rw-r--r--libc/include/malloc.yaml (renamed from libc/hdrgen/yaml/malloc.yaml)0
-rw-r--r--libc/include/math.yaml (renamed from libc/hdrgen/yaml/math.yaml)7
-rw-r--r--libc/include/pthread.h.def34
-rw-r--r--libc/include/pthread.yaml (renamed from libc/hdrgen/yaml/pthread.yaml)0
-rw-r--r--libc/include/sched.yaml (renamed from libc/hdrgen/yaml/sched.yaml)0
-rw-r--r--libc/include/search.yaml (renamed from libc/hdrgen/yaml/search.yaml)0
-rw-r--r--libc/include/setjmp.yaml (renamed from libc/hdrgen/yaml/setjmp.yaml)0
-rw-r--r--libc/include/signal.yaml (renamed from libc/hdrgen/yaml/signal.yaml)0
-rw-r--r--libc/include/spawn.yaml (renamed from libc/hdrgen/yaml/spawn.yaml)0
-rw-r--r--libc/include/stdbit.yaml (renamed from libc/hdrgen/yaml/stdbit.yaml)0
-rw-r--r--libc/include/stdckdint.yaml (renamed from libc/hdrgen/yaml/stdckdint.yaml)0
-rw-r--r--libc/include/stdfix.yaml (renamed from libc/hdrgen/yaml/stdfix.yaml)0
-rw-r--r--libc/include/stdint.yaml (renamed from libc/hdrgen/yaml/stdint.yaml)0
-rw-r--r--libc/include/stdio.yaml (renamed from libc/hdrgen/yaml/stdio.yaml)0
-rw-r--r--libc/include/stdlib.yaml (renamed from libc/hdrgen/yaml/stdlib.yaml)0
-rw-r--r--libc/include/string.yaml (renamed from libc/hdrgen/yaml/string.yaml)0
-rw-r--r--libc/include/strings.yaml (renamed from libc/hdrgen/yaml/strings.yaml)0
-rw-r--r--libc/include/sys/auxv.yaml (renamed from libc/hdrgen/yaml/sys/auxv.yaml)0
-rw-r--r--libc/include/sys/epoll.yaml (renamed from libc/hdrgen/yaml/sys/epoll.yaml)0
-rw-r--r--libc/include/sys/ioctl.yaml (renamed from libc/hdrgen/yaml/sys/ioctl.yaml)0
-rw-r--r--libc/include/sys/mman.yaml (renamed from libc/hdrgen/yaml/sys/mman.yaml)7
-rw-r--r--libc/include/sys/prctl.yaml (renamed from libc/hdrgen/yaml/sys/prctl.yaml)0
-rw-r--r--libc/include/sys/random.yaml (renamed from libc/hdrgen/yaml/sys/random.yaml)0
-rw-r--r--libc/include/sys/resource.yaml (renamed from libc/hdrgen/yaml/sys/resource.yaml)0
-rw-r--r--libc/include/sys/select.yaml (renamed from libc/hdrgen/yaml/sys/select.yaml)0
-rw-r--r--libc/include/sys/sendfile.yaml (renamed from libc/hdrgen/yaml/sys/sendfile.yaml)0
-rw-r--r--libc/include/sys/socket.yaml (renamed from libc/hdrgen/yaml/sys/socket.yaml)0
-rw-r--r--libc/include/sys/stat.yaml (renamed from libc/hdrgen/yaml/sys/stat.yaml)0
-rw-r--r--libc/include/sys/statvfs.yaml (renamed from libc/hdrgen/yaml/sys/statvfs.yaml)0
-rw-r--r--libc/include/sys/syscall.h.def7
-rw-r--r--libc/include/sys/syscall.yaml (renamed from libc/hdrgen/yaml/sys/syscall.yaml)0
-rw-r--r--libc/include/sys/time.yaml (renamed from libc/hdrgen/yaml/sys/time.yaml)0
-rw-r--r--libc/include/sys/types.yaml (renamed from libc/hdrgen/yaml/sys/types.yaml)0
-rw-r--r--libc/include/sys/utsname.yaml (renamed from libc/hdrgen/yaml/sys/utsname.yaml)0
-rw-r--r--libc/include/sys/wait.yaml (renamed from libc/hdrgen/yaml/sys/wait.yaml)0
-rw-r--r--libc/include/termios.yaml (renamed from libc/hdrgen/yaml/termios.yaml)0
-rw-r--r--libc/include/threads.yaml (renamed from libc/hdrgen/yaml/threads.yaml)0
-rw-r--r--libc/include/time.yaml (renamed from libc/hdrgen/yaml/time.yaml)0
-rw-r--r--libc/include/uchar.yaml (renamed from libc/hdrgen/yaml/uchar.yaml)0
-rw-r--r--libc/include/unistd.yaml (renamed from libc/hdrgen/yaml/unistd.yaml)0
-rw-r--r--libc/include/wchar.yaml (renamed from libc/hdrgen/yaml/wchar.yaml)0
-rw-r--r--libc/shared/rpc.h164
-rw-r--r--libc/shared/rpc_util.h105
-rw-r--r--libc/src/CMakeLists.txt7
-rw-r--r--libc/src/__support/CMakeLists.txt13
-rw-r--r--libc/src/__support/CPP/atomic.h184
-rw-r--r--libc/src/__support/CPP/type_traits.h5
-rw-r--r--libc/src/__support/CPP/type_traits/has_unique_object_representations.h30
-rw-r--r--libc/src/__support/CPP/type_traits/is_copy_assignable.h32
-rw-r--r--libc/src/__support/CPP/type_traits/is_copy_constructible.h31
-rw-r--r--libc/src/__support/CPP/type_traits/is_move_assignable.h33
-rw-r--r--libc/src/__support/CPP/type_traits/is_move_constructible.h31
-rw-r--r--libc/src/__support/CPP/type_traits/is_trivially_copyable.h4
-rw-r--r--libc/src/__support/FPUtil/aarch64/FEnvImpl.h52
-rw-r--r--libc/src/__support/RPC/CMakeLists.txt1
-rw-r--r--libc/src/__support/complex_type.h74
-rw-r--r--libc/src/__support/freelist_heap.cpp19
-rw-r--r--libc/src/__support/macros/properties/complex_types.h5
-rw-r--r--libc/src/__support/macros/properties/os.h12
-rw-r--r--libc/src/__support/macros/properties/types.h5
-rw-r--r--libc/src/__support/time/CMakeLists.txt17
-rw-r--r--libc/src/__support/time/clock_gettime.h (renamed from libc/src/__support/time/linux/clock_gettime.h)10
-rw-r--r--libc/src/__support/time/gpu/CMakeLists.txt22
-rw-r--r--libc/src/__support/time/gpu/clock_gettime.cpp33
-rw-r--r--libc/src/__support/time/gpu/time_utils.cpp (renamed from libc/src/time/gpu/time_utils.cpp)0
-rw-r--r--libc/src/__support/time/gpu/time_utils.h (renamed from libc/src/time/gpu/time_utils.h)2
-rw-r--r--libc/src/__support/time/linux/CMakeLists.txt2
-rw-r--r--libc/src/__support/time/linux/clock_conversion.h2
-rw-r--r--libc/src/__support/time/linux/clock_gettime.cpp2
-rw-r--r--libc/src/__support/time/windows/CMakeLists.txt26
-rw-r--r--libc/src/__support/time/windows/clock_gettime.cpp134
-rw-r--r--libc/src/__support/time/windows/performance_counter.h35
-rw-r--r--libc/src/arpa/CMakeLists.txt1
-rw-r--r--libc/src/arpa/inet/CMakeLists.txt (renamed from libc/src/network/CMakeLists.txt)0
-rw-r--r--libc/src/arpa/inet/htonl.cpp (renamed from libc/src/network/htonl.cpp)2
-rw-r--r--libc/src/arpa/inet/htonl.h (renamed from libc/src/network/htonl.h)6
-rw-r--r--libc/src/arpa/inet/htons.cpp (renamed from libc/src/network/htons.cpp)2
-rw-r--r--libc/src/arpa/inet/htons.h (renamed from libc/src/network/htons.h)6
-rw-r--r--libc/src/arpa/inet/ntohl.cpp (renamed from libc/src/network/ntohl.cpp)2
-rw-r--r--libc/src/arpa/inet/ntohl.h (renamed from libc/src/network/ntohl.h)6
-rw-r--r--libc/src/arpa/inet/ntohs.cpp (renamed from libc/src/network/ntohs.cpp)2
-rw-r--r--libc/src/arpa/inet/ntohs.h (renamed from libc/src/network/ntohs.h)6
-rw-r--r--libc/src/compiler/generic/__stack_chk_fail.cpp3
-rw-r--r--libc/src/complex/CMakeLists.txt12
-rw-r--r--libc/src/complex/cimagf128.h9
-rw-r--r--libc/src/complex/cimagf16.h9
-rw-r--r--libc/src/complex/conj.h20
-rw-r--r--libc/src/complex/conjf.h20
-rw-r--r--libc/src/complex/conjf128.h21
-rw-r--r--libc/src/complex/conjf16.h21
-rw-r--r--libc/src/complex/conjl.h20
-rw-r--r--libc/src/complex/cproj.h20
-rw-r--r--libc/src/complex/cprojf.h20
-rw-r--r--libc/src/complex/cprojf128.h21
-rw-r--r--libc/src/complex/cprojf16.h21
-rw-r--r--libc/src/complex/cprojl.h20
-rw-r--r--libc/src/complex/crealf128.h9
-rw-r--r--libc/src/complex/crealf16.h9
-rw-r--r--libc/src/complex/generic/CMakeLists.txt128
-rw-r--r--libc/src/complex/generic/cimagf128.cpp4
-rw-r--r--libc/src/complex/generic/cimagf16.cpp4
-rw-r--r--libc/src/complex/generic/conj.cpp19
-rw-r--r--libc/src/complex/generic/conjf.cpp19
-rw-r--r--libc/src/complex/generic/conjf128.cpp19
-rw-r--r--libc/src/complex/generic/conjf16.cpp19
-rw-r--r--libc/src/complex/generic/conjl.cpp19
-rw-r--r--libc/src/complex/generic/cproj.cpp19
-rw-r--r--libc/src/complex/generic/cprojf.cpp19
-rw-r--r--libc/src/complex/generic/cprojf128.cpp19
-rw-r--r--libc/src/complex/generic/cprojf16.cpp19
-rw-r--r--libc/src/complex/generic/cprojl.cpp19
-rw-r--r--libc/src/complex/generic/crealf128.cpp4
-rw-r--r--libc/src/complex/generic/crealf16.cpp4
-rw-r--r--libc/src/math/CMakeLists.txt1
-rw-r--r--libc/src/math/cosf16.h21
-rw-r--r--libc/src/math/docs/add_math_function.md2
-rw-r--r--libc/src/math/generic/CMakeLists.txt19
-rw-r--r--libc/src/math/generic/cosf16.cpp84
-rw-r--r--libc/src/math/generic/cospif16.cpp2
-rw-r--r--libc/src/math/generic/sinf16.cpp15
-rw-r--r--libc/src/stdlib/CMakeLists.txt38
-rw-r--r--libc/src/stdlib/baremetal/CMakeLists.txt50
-rw-r--r--libc/src/stdlib/baremetal/aligned_alloc.cpp21
-rw-r--r--libc/src/stdlib/baremetal/calloc.cpp21
-rw-r--r--libc/src/stdlib/baremetal/free.cpp19
-rw-r--r--libc/src/stdlib/baremetal/malloc.cpp21
-rw-r--r--libc/src/stdlib/baremetal/realloc.cpp21
-rw-r--r--libc/src/stdlib/freelist_malloc.cpp42
-rw-r--r--libc/src/string/CMakeLists.txt146
-rw-r--r--libc/src/strings/CMakeLists.txt97
-rw-r--r--libc/src/strings/bcmp.cpp (renamed from libc/src/string/bcmp.cpp)2
-rw-r--r--libc/src/strings/bcmp.h (renamed from libc/src/string/bcmp.h)6
-rw-r--r--libc/src/strings/bcopy.cpp (renamed from libc/src/string/bcopy.cpp)2
-rw-r--r--libc/src/strings/bcopy.h (renamed from libc/src/string/bcopy.h)6
-rw-r--r--libc/src/strings/bzero.cpp (renamed from libc/src/string/bzero.cpp)2
-rw-r--r--libc/src/strings/bzero.h (renamed from libc/src/string/bzero.h)6
-rw-r--r--libc/src/strings/index.cpp (renamed from libc/src/string/index.cpp)2
-rw-r--r--libc/src/strings/index.h (renamed from libc/src/string/index.h)6
-rw-r--r--libc/src/strings/rindex.cpp (renamed from libc/src/string/rindex.cpp)2
-rw-r--r--libc/src/strings/rindex.h (renamed from libc/src/string/rindex.h)6
-rw-r--r--libc/src/strings/strcasecmp.cpp (renamed from libc/src/string/strcasecmp.cpp)2
-rw-r--r--libc/src/strings/strcasecmp.h (renamed from libc/src/string/strcasecmp.h)6
-rw-r--r--libc/src/strings/strncasecmp.cpp (renamed from libc/src/string/strncasecmp.cpp)2
-rw-r--r--libc/src/strings/strncasecmp.h (renamed from libc/src/string/strncasecmp.h)6
-rw-r--r--libc/src/sys/mman/CMakeLists.txt6
-rw-r--r--libc/src/sys/mman/linux/CMakeLists.txt12
-rw-r--r--libc/src/sys/mman/linux/process_mrelease.cpp41
-rw-r--r--libc/src/sys/mman/process_mrelease.h21
-rw-r--r--libc/src/time/CMakeLists.txt17
-rw-r--r--libc/src/time/clock_getres.h21
-rw-r--r--libc/src/time/gpu/CMakeLists.txt36
-rw-r--r--libc/src/time/gpu/clock.cpp2
-rw-r--r--libc/src/time/gpu/clock_gettime.cpp19
-rw-r--r--libc/src/time/gpu/nanosleep.cpp4
-rw-r--r--libc/src/time/gpu/timespec_get.cpp1
-rw-r--r--libc/src/time/linux/CMakeLists.txt21
-rw-r--r--libc/src/time/linux/clock.cpp2
-rw-r--r--libc/src/time/linux/clock_gettime.cpp2
-rw-r--r--libc/src/time/linux/gettimeofday.cpp2
-rw-r--r--libc/src/time/linux/timespec_get.cpp2
-rw-r--r--libc/src/time/time.cpp (renamed from libc/src/time/linux/time.cpp)8
-rw-r--r--libc/src/time/windows/CMakeLists.txt13
-rw-r--r--libc/src/time/windows/clock_getres.cpp110
-rw-r--r--libc/src/unistd/dup.h2
-rw-r--r--libc/src/unistd/dup2.h2
-rw-r--r--libc/src/unistd/dup3.h2
-rw-r--r--libc/src/unistd/fork.h3
-rw-r--r--libc/src/unistd/ftruncate.h3
-rw-r--r--libc/src/unistd/getcwd.h3
-rw-r--r--libc/src/unistd/geteuid.h3
-rw-r--r--libc/src/unistd/getopt.h2
-rw-r--r--libc/src/unistd/getpid.h3
-rw-r--r--libc/src/unistd/getppid.h3
-rw-r--r--libc/src/unistd/getuid.h3
-rw-r--r--libc/src/unistd/isatty.h2
-rw-r--r--libc/src/unistd/link.h2
-rw-r--r--libc/src/unistd/linux/CMakeLists.txt39
-rw-r--r--libc/src/unistd/linux/ftruncate.cpp2
-rw-r--r--libc/src/unistd/linux/lseek.cpp2
-rw-r--r--libc/src/unistd/linux/sysconf.cpp2
-rw-r--r--libc/src/unistd/linux/truncate.cpp2
-rw-r--r--libc/src/unistd/lseek.h3
-rw-r--r--libc/src/unistd/pread.h5
-rw-r--r--libc/src/unistd/pwrite.h5
-rw-r--r--libc/src/unistd/read.h4
-rw-r--r--libc/src/unistd/readlink.h4
-rw-r--r--libc/src/unistd/readlinkat.h4
-rw-r--r--libc/src/unistd/swab.h2
-rw-r--r--libc/src/unistd/symlink.h2
-rw-r--r--libc/src/unistd/symlinkat.h2
-rw-r--r--libc/src/unistd/syscall.h2
-rw-r--r--libc/src/unistd/sysconf.h2
-rw-r--r--libc/src/unistd/truncate.h3
-rw-r--r--libc/src/unistd/write.h4
-rw-r--r--libc/test/UnitTest/FPMatcher.h8
-rw-r--r--libc/test/include/stdbit_stub.h56
-rw-r--r--libc/test/src/CMakeLists.txt7
-rw-r--r--libc/test/src/__support/CMakeLists.txt6
-rw-r--r--libc/test/src/__support/CPP/atomic_test.cpp18
-rw-r--r--libc/test/src/__support/CPP/type_traits_test.cpp22
-rw-r--r--libc/test/src/__support/freelist_malloc_test.cpp54
-rw-r--r--libc/test/src/__support/threads/linux/raw_mutex_test.cpp2
-rw-r--r--libc/test/src/arpa/CMakeLists.txt1
-rw-r--r--libc/test/src/arpa/inet/CMakeLists.txt53
-rw-r--r--libc/test/src/arpa/inet/htonl_test.cpp (renamed from libc/test/src/network/htonl_test.cpp)4
-rw-r--r--libc/test/src/arpa/inet/htons_test.cpp (renamed from libc/test/src/network/htons_test.cpp)4
-rw-r--r--libc/test/src/arpa/inet/ntohl_test.cpp (renamed from libc/test/src/network/ntohl_test.cpp)4
-rw-r--r--libc/test/src/arpa/inet/ntohs_test.cpp (renamed from libc/test/src/network/ntohs_test.cpp)4
-rw-r--r--libc/test/src/complex/CImagTest.h11
-rw-r--r--libc/test/src/complex/CMakeLists.txt120
-rw-r--r--libc/test/src/complex/CRealTest.h10
-rw-r--r--libc/test/src/complex/ConjTest.h131
-rw-r--r--libc/test/src/complex/CprojTest.h131
-rw-r--r--libc/test/src/complex/cimagf128_test.cpp4
-rw-r--r--libc/test/src/complex/cimagf16_test.cpp4
-rw-r--r--libc/test/src/complex/conj_test.cpp13
-rw-r--r--libc/test/src/complex/conjf128_test.cpp13
-rw-r--r--libc/test/src/complex/conjf16_test.cpp13
-rw-r--r--libc/test/src/complex/conjf_test.cpp13
-rw-r--r--libc/test/src/complex/conjl_test.cpp13
-rw-r--r--libc/test/src/complex/cproj_test.cpp (renamed from libc/include/gpu/rpc.h.def)13
-rw-r--r--libc/test/src/complex/cprojf128_test.cpp13
-rw-r--r--libc/test/src/complex/cprojf16_test.cpp13
-rw-r--r--libc/test/src/complex/cprojf_test.cpp13
-rw-r--r--libc/test/src/complex/cprojl_test.cpp13
-rw-r--r--libc/test/src/complex/crealf128_test.cpp4
-rw-r--r--libc/test/src/complex/crealf16_test.cpp4
-rw-r--r--libc/test/src/ctype/isalnum_test.cpp24
-rw-r--r--libc/test/src/ctype/isalpha_test.cpp24
-rw-r--r--libc/test/src/ctype/isdigit_test.cpp24
-rw-r--r--libc/test/src/ctype/islower_test.cpp24
-rw-r--r--libc/test/src/ctype/isupper_test.cpp24
-rw-r--r--libc/test/src/ctype/isxdigit_test.cpp26
-rw-r--r--libc/test/src/ctype/tolower_test.cpp24
-rw-r--r--libc/test/src/ctype/toupper_test.cpp24
-rw-r--r--libc/test/src/math/CMakeLists.txt24
-rw-r--r--libc/test/src/math/cosf16_test.cpp40
-rw-r--r--libc/test/src/math/smoke/CMakeLists.txt11
-rw-r--r--libc/test/src/math/smoke/CanonicalizeTest.h1
-rw-r--r--libc/test/src/math/smoke/FModTest.h1
-rw-r--r--libc/test/src/math/smoke/cosf16_test.cpp33
-rw-r--r--libc/test/src/math/sqrtf128_test.cpp43
-rw-r--r--libc/test/src/network/CMakeLists.txt53
-rw-r--r--libc/test/src/stdlib/CMakeLists.txt4
-rw-r--r--libc/test/src/stdlib/StrtolTest.h24
-rw-r--r--libc/test/src/string/CMakeLists.txt94
-rw-r--r--libc/test/src/strings/CMakeLists.txt58
-rw-r--r--libc/test/src/strings/bcmp_test.cpp (renamed from libc/test/src/string/bcmp_test.cpp)4
-rw-r--r--libc/test/src/strings/bcopy_test.cpp (renamed from libc/test/src/string/bcopy_test.cpp)6
-rw-r--r--libc/test/src/strings/bzero_test.cpp (renamed from libc/test/src/string/bzero_test.cpp)4
-rw-r--r--libc/test/src/strings/index_test.cpp (renamed from libc/test/src/string/index_test.cpp)4
-rw-r--r--libc/test/src/strings/rindex_test.cpp (renamed from libc/test/src/string/rindex_test.cpp)4
-rw-r--r--libc/test/src/strings/strcasecmp_test.cpp (renamed from libc/test/src/string/strcasecmp_test.cpp)2
-rw-r--r--libc/test/src/strings/strncasecmp_test.cpp (renamed from libc/test/src/string/strncasecmp_test.cpp)2
-rw-r--r--libc/test/src/sys/mman/linux/CMakeLists.txt21
-rw-r--r--libc/test/src/sys/mman/linux/process_mrelease_test.cpp72
-rw-r--r--libc/test/src/sys/mman/linux/remap_file_pages_test.cpp6
-rw-r--r--libc/test/src/time/CMakeLists.txt14
-rw-r--r--libc/test/src/time/clock_getres_test.cpp55
-rw-r--r--libc/test/src/time/time_test.cpp2
-rw-r--r--libc/utils/CMakeLists.txt2
-rw-r--r--libc/utils/MPFRWrapper/MPFRUtils.cpp102
-rw-r--r--libc/utils/docgen/arpa/inet.yaml18
-rw-r--r--libc/utils/docgen/assert.yaml7
-rw-r--r--libc/utils/docgen/ctype.json47
-rw-r--r--libc/utils/docgen/ctype.yaml72
-rwxr-xr-xlibc/utils/docgen/docgen.py70
-rw-r--r--libc/utils/docgen/errno.yaml14
-rw-r--r--libc/utils/docgen/fenv.json114
-rw-r--r--libc/utils/docgen/fenv.yaml97
-rw-r--r--libc/utils/docgen/float.yaml143
-rw-r--r--libc/utils/docgen/header.py11
-rw-r--r--libc/utils/docgen/inttypes.yaml20
-rw-r--r--libc/utils/docgen/locale.yaml37
-rw-r--r--libc/utils/docgen/setjmp.json15
-rw-r--r--libc/utils/docgen/setjmp.yaml15
-rw-r--r--libc/utils/docgen/signal.json152
-rw-r--r--libc/utils/docgen/signal.yaml102
-rw-r--r--libc/utils/docgen/stdbit.json270
-rw-r--r--libc/utils/docgen/stdbit.yaml179
-rw-r--r--libc/utils/docgen/stdio.yaml226
-rw-r--r--libc/utils/docgen/stdlib.yaml158
-rw-r--r--libc/utils/docgen/string.yaml94
-rw-r--r--libc/utils/docgen/sys/mman.yaml77
-rw-r--r--libc/utils/docgen/threads.json87
-rw-r--r--libc/utils/docgen/threads.yaml88
-rw-r--r--libc/utils/docgen/uchar.yaml21
-rw-r--r--libc/utils/docgen/wchar.yaml131
-rw-r--r--libc/utils/docgen/wctype.yaml36
-rw-r--r--libc/utils/gpu/loader/Loader.h4
-rw-r--r--libc/utils/gpu/server/CMakeLists.txt5
-rw-r--r--libc/utils/gpu/server/rpc_server.cpp6
-rw-r--r--libc/utils/hdrgen/CMakeLists.txt (renamed from libc/hdrgen/CMakeLists.txt)4
-rw-r--r--libc/utils/hdrgen/README.rst5
-rw-r--r--libc/utils/hdrgen/enumeration.py (renamed from libc/hdrgen/class_implementation/classes/enumeration.py)0
-rw-r--r--libc/utils/hdrgen/function.py (renamed from libc/hdrgen/class_implementation/classes/function.py)0
-rw-r--r--libc/utils/hdrgen/gpu_headers.py (renamed from libc/hdrgen/gpu_headers.py)26
-rw-r--r--libc/utils/hdrgen/header.py (renamed from libc/hdrgen/header.py)0
-rw-r--r--libc/utils/hdrgen/macro.py (renamed from libc/hdrgen/class_implementation/classes/macro.py)0
-rw-r--r--libc/utils/hdrgen/object.py (renamed from libc/hdrgen/class_implementation/classes/object.py)0
-rw-r--r--libc/utils/hdrgen/tests/expected_output/test_header.h (renamed from libc/hdrgen/tests/expected_output/test_header.h)0
-rw-r--r--libc/utils/hdrgen/tests/input/test_small.h.def (renamed from libc/hdrgen/tests/input/test_small.h.def)0
-rw-r--r--libc/utils/hdrgen/tests/input/test_small.yaml (renamed from libc/hdrgen/tests/input/test_small.yaml)0
-rw-r--r--libc/utils/hdrgen/tests/test_integration.py (renamed from libc/hdrgen/tests/test_integration.py)12
-rw-r--r--libc/utils/hdrgen/type.py (renamed from libc/hdrgen/class_implementation/classes/type.py)0
-rw-r--r--libc/utils/hdrgen/yaml_functions_sorted.py (renamed from libc/hdrgen/yaml_functions_sorted.py)0
-rw-r--r--libc/utils/hdrgen/yaml_to_classes.py (renamed from libc/hdrgen/yaml_to_classes.py)13
438 files changed, 9007 insertions, 5645 deletions
diff --git a/libc/CMakeLists.txt b/libc/CMakeLists.txt
index 5196735bef4e..6f1c180a3f19 100644
--- a/libc/CMakeLists.txt
+++ b/libc/CMakeLists.txt
@@ -1,12 +1,19 @@
cmake_minimum_required(VERSION 3.20.0)
set(LLVM_SUBPROJECT_TITLE "libc")
+if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
+ message(FATAL_ERROR "Builds rooted in the libc directory are not supported. "
+ "Builds should be rooted in the runtimes directory instead. "
+ "Please see the documentation at https://libc.llvm.org/usage_modes.html for more info.")
+endif()
+
# Include LLVM's cmake policies.
if(NOT DEFINED LLVM_COMMON_CMAKE_UTILS)
set(LLVM_COMMON_CMAKE_UTILS ${CMAKE_CURRENT_SOURCE_DIR}/../cmake)
endif()
include(${LLVM_COMMON_CMAKE_UTILS}/Modules/CMakePolicy.cmake
NO_POLICY_SCOPE)
+include(CheckCXXCompilerFlag)
if (LIBC_CMAKE_VERBOSE_LOGGING)
get_directory_property(LIBC_OLD_PREPROCESSOR_DEFS COMPILE_DEFINITIONS)
@@ -57,8 +64,6 @@ if(LIBC_BUILD_GPU_LOADER OR ((NOT LLVM_RUNTIMES_BUILD) AND LLVM_LIBC_GPU_BUILD))
return()
endif()
-add_subdirectory(hdrgen)
-
option(LIBC_CMAKE_VERBOSE_LOGGING
"Log details warnings and notifications during CMake configuration." OFF)
@@ -322,7 +327,6 @@ endif()
option(LIBC_INCLUDE_DOCS "Build the libc documentation." ${LLVM_INCLUDE_DOCS})
-include(CMakeParseArguments)
include(LLVMLibCCheckCpuFeatures)
include(CheckCompilerFeatures)
include(LLVMLibCRules)
diff --git a/libc/benchmarks/CMakeLists.txt b/libc/benchmarks/CMakeLists.txt
index 52e3f942d16e..60f522d7d8c6 100644
--- a/libc/benchmarks/CMakeLists.txt
+++ b/libc/benchmarks/CMakeLists.txt
@@ -204,13 +204,11 @@ target_link_libraries(libc.benchmarks.memory_functions.opt_host
PRIVATE
libc-memory-benchmark
libc.src.string.memcmp_opt_host.__internal__
- libc.src.string.bcmp_opt_host.__internal__
libc.src.string.memcpy_opt_host.__internal__
- libc.src.string.memset_opt_host.__internal__
- libc.src.string.bzero_opt_host.__internal__
libc.src.string.memmove_opt_host.__internal__
+ libc.src.string.memset_opt_host.__internal__
+ libc.src.strings.bcmp_opt_host.__internal__
+ libc.src.strings.bzero_opt_host.__internal__
benchmark_main
)
llvm_update_compile_flags(libc.benchmarks.memory_functions.opt_host)
-
-add_subdirectory(automemcpy)
diff --git a/libc/benchmarks/automemcpy/CMakeLists.txt b/libc/benchmarks/automemcpy/CMakeLists.txt
deleted file mode 100644
index ef9b4218c8d6..000000000000
--- a/libc/benchmarks/automemcpy/CMakeLists.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-if(NOT LIBC_BUILD_AUTOMEMCPY)
- return ()
-endif()
-
-if(NOT LLVM_WITH_Z3)
- MESSAGE(FATAL_ERROR "Building llvm-libc automemcpy requires Z3")
-endif()
-
-set(LIBC_AUTOMEMCPY_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/include)
-
-add_subdirectory(lib)
-add_subdirectory(unittests)
diff --git a/libc/benchmarks/automemcpy/README.md b/libc/benchmarks/automemcpy/README.md
deleted file mode 100644
index 8583368993ef..000000000000
--- a/libc/benchmarks/automemcpy/README.md
+++ /dev/null
@@ -1,111 +0,0 @@
-This folder contains an implementation of [automemcpy: A framework for automatic generation of fundamental memory operations](https://research.google/pubs/pub50338/).
-
-It uses the [Z3 theorem prover](https://github.com/Z3Prover/z3) to enumerate a subset of valid memory function implementations. These implementations are then materialized as C++ code and can be [benchmarked](../) against various [size distributions](../distributions). This process helps the design of efficient implementations for a particular environnement (size distribution, processor or custom compilation options).
-
-This is not enabled by default, as it is mostly useful when working on tuning the library implementation. To build it, use `LIBC_BUILD_AUTOMEMCPY=ON` (see below).
-
-## Prerequisites
-
-You may need to install `Z3` from source if it's not available on your system.
-Here we show instructions to install it into `<Z3_INSTALL_DIR>`.
-You may need to `sudo` to `make install`.
-
-```shell
-mkdir -p ~/git
-cd ~/git
-git clone https://github.com/Z3Prover/z3.git
-python scripts/mk_make.py --prefix=<Z3_INSTALL_DIR>
-cd build
-make -j
-make install
-```
-
-## Configuration
-
-```shell
-mkdir -p <BUILD_DIR>
-cd <LLVM_PROJECT_DIR>/llvm
-cmake -DCMAKE_C_COMPILER=/usr/bin/clang \
- -DCMAKE_CXX_COMPILER=/usr/bin/clang++ \
- -DLLVM_ENABLE_PROJECTS="libc" \
- -DLLVM_ENABLE_Z3_SOLVER=ON \
- -DLLVM_Z3_INSTALL_DIR=<Z3_INSTALL_DIR> \
- -DLIBC_BUILD_AUTOMEMCPY=ON \
- -DCMAKE_BUILD_TYPE=Release \
- -B<BUILD_DIR>
-```
-
-## Targets and compilation
-
-There are three main CMake targets
- 1. `automemcpy_implementations`
- - runs `Z3` and materializes valid memory functions as C++ code, a message will display its ondisk location.
- - the source code is then compiled using the native host optimizations (i.e. `-march=native` or `-mcpu=native` depending on the architecture).
- 2. `automemcpy`
- - the binary that benchmarks the autogenerated implementations.
- 3. `automemcpy_result_analyzer`
- - the binary that analyses the benchmark results.
-
-You may only compile the binaries as they both pull the autogenerated code as a dependency.
-
-```shell
-make -C <BUILD_DIR> -j automemcpy automemcpy_result_analyzer
-```
-
-## Running the benchmarks
-
-Make sure to save the results of the benchmark as a json file.
-
-```shell
-<BUILD_DIR>/bin/automemcpy --benchmark_out_format=json --benchmark_out=<RESULTS_DIR>/results.json
-```
-
-### Additional useful options
-
-
- - `--benchmark_min_time=.2`
-
- By default, each function is benchmarked for at least one second, here we lower it to 200ms.
-
- - `--benchmark_filter="BM_Memset|BM_Bzero"`
-
- By default, all functions are benchmarked, here we restrict them to `memset` and `bzero`.
-
-Other options might be useful, use `--help` for more information.
-
-## Analyzing the benchmarks
-
-Analysis is performed by running `automemcpy_result_analyzer` on one or more json result files.
-
-```shell
-<BUILD_DIR>/bin/automemcpy_result_analyzer <RESULTS_DIR>/results.json
-```
-
-What it does:
- 1. Gathers all throughput values for each function / distribution pair and picks the median one.\
- This allows picking a representative value over many runs of the benchmark. Please make sure all the runs happen under similar circumstances.
-
- 2. For each distribution, look at the span of throughputs for functions of the same type (e.g. For distribution `A`, memcpy throughput spans from 2GiB/s to 5GiB/s).
-
- 3. For each distribution, give a normalized score to each function (e.g. For distribution `A`, function `M` scores 0.65).\
- This score is then turned into a grade `EXCELLENT`, `VERY_GOOD`, `GOOD`, `PASSABLE`, `INADEQUATE`, `MEDIOCRE`, `BAD` - so that each distribution categorizes how function perform according to them.
-
- 4. A [Majority Judgement](https://en.wikipedia.org/wiki/Majority_judgment) process is then used to categorize each function. This enables finer analysis of how distributions agree on which function is better. In the following example, `Function_1` and `Function_2` are rated `EXCELLENT` but looking at the grade's distribution might help decide which is best.
-
-| | EXCELLENT | VERY_GOOD | GOOD | PASSABLE | INADEQUATE | MEDIOCRE | BAD |
-|------------|:---------:|:---------:|:----:|:--------:|:----------:|:--------:|:---:|
-| Function_1 | 7 | 1 | 2 | | | | |
-| Function_2 | 6 | 4 | | | | | |
-
-The tool outputs the histogram of grades for each function. In case of tie, other dimensions might help decide (e.g. code size, performance on other microarchitectures).
-
-```
-EXCELLENT |█▁▂ | Function_0
-EXCELLENT |█▅ | Function_1
-VERY_GOOD |▂█▁ ▁ | Function_2
-GOOD | ▁█▄ | Function_3
-PASSABLE | ▂▆▄█ | Function_4
-INADEQUATE | ▃▃█▁ | Function_5
-MEDIOCRE | █▆▁| Function_6
-BAD | ▁▁█| Function_7
-```
diff --git a/libc/benchmarks/automemcpy/include/automemcpy/CodeGen.h b/libc/benchmarks/automemcpy/include/automemcpy/CodeGen.h
deleted file mode 100644
index 389e8249f939..000000000000
--- a/libc/benchmarks/automemcpy/include/automemcpy/CodeGen.h
+++ /dev/null
@@ -1,26 +0,0 @@
-//===-- C++ code generation from NamedFunctionDescriptors -------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LIBC_BENCHMARKS_AUTOMEMCPY_CODEGEN_H
-#define LIBC_BENCHMARKS_AUTOMEMCPY_CODEGEN_H
-
-#include "automemcpy/FunctionDescriptor.h"
-#include <llvm/ADT/ArrayRef.h>
-#include <llvm/Support/raw_ostream.h>
-#include <vector>
-
-namespace llvm {
-namespace automemcpy {
-
-// This function serializes the array of FunctionDescriptors as a C++ file.
-void Serialize(raw_ostream &Stream, ArrayRef<FunctionDescriptor> FD);
-
-} // namespace automemcpy
-} // namespace llvm
-
-#endif // LIBC_BENCHMARKS_AUTOMEMCPY_CODEGEN_H
diff --git a/libc/benchmarks/automemcpy/include/automemcpy/FunctionDescriptor.h b/libc/benchmarks/automemcpy/include/automemcpy/FunctionDescriptor.h
deleted file mode 100644
index 65477d9d72a0..000000000000
--- a/libc/benchmarks/automemcpy/include/automemcpy/FunctionDescriptor.h
+++ /dev/null
@@ -1,159 +0,0 @@
-//===-- Pod structs to describe a memory function----------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_LIBC_BENCHMARKS_AUTOMEMCPY_COMMON_H
-#define LLVM_LIBC_BENCHMARKS_AUTOMEMCPY_COMMON_H
-
-#include <climits>
-#include <cstddef>
-#include <llvm/ADT/ArrayRef.h>
-#include <llvm/ADT/Hashing.h>
-#include <llvm/ADT/StringRef.h>
-#include <optional>
-#include <tuple>
-
-namespace llvm {
-namespace automemcpy {
-
-// Boilerplate code to be able to sort and hash types.
-#define COMPARABLE_AND_HASHABLE(T, ...) \
- inline auto asTuple() const { return std::tie(__VA_ARGS__); } \
- bool operator==(const T &O) const { return asTuple() == O.asTuple(); } \
- bool operator<(const T &O) const { return asTuple() < O.asTuple(); } \
- struct Hasher { \
- std::size_t operator()(const T &K) const { \
- return llvm::hash_value(K.asTuple()); \
- } \
- };
-
-// Represents the maximum value for the size parameter of a memory function.
-// This is an `int` so we can use it as an expression in Z3.
-// It also allows for a more readable and compact representation when storing
-// the SizeSpan in the autogenerated C++ file.
-static constexpr int kMaxSize = INT_MAX;
-
-// This mimics the `Arg` type in libc/src/string/memory_utils/elements.h without
-// having to depend on it.
-enum class AlignArg { _1, _2, ARRAY_SIZE };
-
-// Describes a range of sizes.
-// We use the begin/end representation instead of first/last to allow for empty
-// range (i.e. Begin == End)
-struct SizeSpan {
- size_t Begin = 0;
- size_t End = 0;
-
- COMPARABLE_AND_HASHABLE(SizeSpan, Begin, End)
-};
-
-// Describes a contiguous region.
-// In such a region all sizes are handled individually.
-// e.g. with Span = {0, 2};
-// if(size == 0) return Handle<0>();
-// if(size == 1) return Handle<1>();
-struct Contiguous {
- SizeSpan Span;
-
- COMPARABLE_AND_HASHABLE(Contiguous, Span)
-};
-
-// This struct represents a range of sizes over which to use an overlapping
-// strategy. An overlapping strategy of size N handles all sizes from N to 2xN.
-// The span may represent several contiguous overlaps.
-// e.g. with Span = {16, 128};
-// if(size >= 16 and size < 32) return Handle<Overlap<16>>();
-// if(size >= 32 and size < 64) return Handle<Overlap<32>>();
-// if(size >= 64 and size < 128) return Handle<Overlap<64>>();
-struct Overlap {
- SizeSpan Span;
-
- COMPARABLE_AND_HASHABLE(Overlap, Span)
-};
-
-// Describes a region using a loop handling BlockSize bytes at a time. The
-// remaining bytes of the loop are handled with an overlapping operation.
-struct Loop {
- SizeSpan Span;
- size_t BlockSize = 0;
-
- COMPARABLE_AND_HASHABLE(Loop, Span, BlockSize)
-};
-
-// Same as `Loop` but starts by aligning a buffer on `Alignment` bytes.
-// A first operation handling 'Alignment` bytes is performed followed by a
-// sequence of Loop.BlockSize bytes operation. The Loop starts processing from
-// the next aligned byte in the chosen buffer. The remaining bytes of the loop
-// are handled with an overlapping operation.
-struct AlignedLoop {
- Loop Loop;
- size_t Alignment = 0; // Size of the alignment.
- AlignArg AlignTo = AlignArg::_1; // Which buffer to align.
-
- COMPARABLE_AND_HASHABLE(AlignedLoop, Loop, Alignment, AlignTo)
-};
-
-// Some processors offer special instruction to handle the memory function
-// completely, we refer to such instructions as accelerators.
-struct Accelerator {
- SizeSpan Span;
-
- COMPARABLE_AND_HASHABLE(Accelerator, Span)
-};
-
-// The memory functions are assembled out of primitives that can be implemented
-// with regular scalar operations (SCALAR), with the help of vector or bitcount
-// instructions (NATIVE) or by deferring it to the compiler (BUILTIN).
-enum class ElementTypeClass {
- SCALAR,
- NATIVE,
- BUILTIN,
-};
-
-// A simple enum to categorize which function is being implemented.
-enum class FunctionType {
- MEMCPY,
- MEMCMP,
- BCMP,
- MEMSET,
- BZERO,
-};
-
-// This struct describes the skeleton of the implementation, it does not go into
-// every detail but is enough to uniquely identify the implementation.
-struct FunctionDescriptor {
- FunctionType Type;
- std::optional<Contiguous> Contiguous;
- std::optional<Overlap> Overlap;
- std::optional<Loop> Loop;
- std::optional<AlignedLoop> AlignedLoop;
- std::optional<Accelerator> Accelerator;
- ElementTypeClass ElementClass;
-
- COMPARABLE_AND_HASHABLE(FunctionDescriptor, Type, Contiguous, Overlap, Loop,
- AlignedLoop, Accelerator, ElementClass)
-
- inline size_t id() const { return llvm::hash_value(asTuple()); }
-};
-
-// Same as above but with the function name.
-struct NamedFunctionDescriptor {
- StringRef Name;
- FunctionDescriptor Desc;
-};
-
-template <typename T> llvm::hash_code hash_value(const ArrayRef<T> &V) {
- return llvm::hash_combine_range(V.begin(), V.end());
-}
-template <typename T> llvm::hash_code hash_value(const T &O) {
- return llvm::hash_value(O.asTuple());
-}
-
-} // namespace automemcpy
-} // namespace llvm
-
-#endif /* LLVM_LIBC_BENCHMARKS_AUTOMEMCPY_COMMON_H */
diff --git a/libc/benchmarks/automemcpy/include/automemcpy/RandomFunctionGenerator.h b/libc/benchmarks/automemcpy/include/automemcpy/RandomFunctionGenerator.h
deleted file mode 100644
index 28756e8f86c0..000000000000
--- a/libc/benchmarks/automemcpy/include/automemcpy/RandomFunctionGenerator.h
+++ /dev/null
@@ -1,62 +0,0 @@
-//===-- Generate random but valid function descriptors ---------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_LIBC_BENCHMARKS_AUTOMEMCPY_RANDOM_FUNCTION_GENERATOR_H
-#define LLVM_LIBC_BENCHMARKS_AUTOMEMCPY_RANDOM_FUNCTION_GENERATOR_H
-
-#include "automemcpy/FunctionDescriptor.h"
-#include <cstddef>
-#include <cstdint>
-#include <llvm/ADT/ArrayRef.h>
-#include <llvm/ADT/StringRef.h>
-#include <optional>
-#include <vector>
-#include <z3++.h>
-
-namespace llvm {
-namespace automemcpy {
-
-// Holds the state for the constraint solver.
-// It implements a single method that returns the next valid description.
-struct RandomFunctionGenerator {
- RandomFunctionGenerator();
-
- // Get the next valid FunctionDescriptor or std::nullopt.
- std::optional<FunctionDescriptor> next();
-
-private:
- // Returns an expression where `Variable` is forced to be one of the `Values`.
- z3::expr inSetConstraint(z3::expr &Variable, ArrayRef<int> Values) const;
- // Add constaints to `Begin` and `End` so that they are:
- // - between 0 and kMaxSize (inclusive)
- // - ordered (begin<=End)
- // - amongst a set of predefined values.
- void addBoundsAndAnchors(z3::expr &Begin, z3::expr &End);
- // Add constraints to make sure that the loop block size is amongst a set of
- // predefined values. Also makes sure that the loop that the loop is iterated
- // at least `LoopMinIter` times.
- void addLoopConstraints(const z3::expr &LoopBegin, const z3::expr &LoopEnd,
- z3::expr &LoopBlockSize, int LoopMinIter);
-
- z3::context Context;
- z3::solver Solver;
-
- z3::expr Type;
- z3::expr ContiguousBegin, ContiguousEnd;
- z3::expr OverlapBegin, OverlapEnd;
- z3::expr LoopBegin, LoopEnd, LoopBlockSize;
- z3::expr AlignedLoopBegin, AlignedLoopEnd, AlignedLoopBlockSize,
- AlignedAlignment, AlignedArg;
- z3::expr AcceleratorBegin, AcceleratorEnd;
- z3::expr ElementClass;
-};
-
-} // namespace automemcpy
-} // namespace llvm
-
-#endif /* LLVM_LIBC_BENCHMARKS_AUTOMEMCPY_RANDOM_FUNCTION_GENERATOR_H */
diff --git a/libc/benchmarks/automemcpy/include/automemcpy/ResultAnalyzer.h b/libc/benchmarks/automemcpy/include/automemcpy/ResultAnalyzer.h
deleted file mode 100644
index d4bf27258276..000000000000
--- a/libc/benchmarks/automemcpy/include/automemcpy/ResultAnalyzer.h
+++ /dev/null
@@ -1,109 +0,0 @@
-//===-- Analyze benchmark JSON files ----------------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LIBC_BENCHMARKS_AUTOMEMCPY_RESULTANALYZER_H
-#define LIBC_BENCHMARKS_AUTOMEMCPY_RESULTANALYZER_H
-
-#include "automemcpy/FunctionDescriptor.h"
-#include "llvm/ADT/ArrayRef.h"
-#include "llvm/ADT/StringMap.h"
-#include <array>
-#include <vector>
-
-namespace llvm {
-namespace automemcpy {
-
-// A Grade as in the Majority Judgment voting system.
-struct Grade {
- enum GradeEnum {
- EXCELLENT,
- VERY_GOOD,
- GOOD,
- PASSABLE,
- INADEQUATE,
- MEDIOCRE,
- BAD,
- ARRAY_SIZE,
- };
-
- // Returns a human readable string of the enum.
- static StringRef getString(const GradeEnum &GE);
-
- // Turns 'Score' into a GradeEnum.
- static GradeEnum judge(double Score);
-};
-
-// A 'GradeEnum' indexed array with counts for each grade.
-using GradeHistogram = std::array<size_t, Grade::ARRAY_SIZE>;
-
-// Identifies a Function by its name and type. Used as a key in a map.
-struct FunctionId {
- StringRef Name;
- FunctionType Type;
- COMPARABLE_AND_HASHABLE(FunctionId, Type, Name)
-};
-
-struct PerDistributionData {
- std::vector<double> BytesPerSecondSamples;
- double BytesPerSecondMedian; // Median of samples for this distribution.
- double BytesPerSecondMean; // Mean of samples for this distribution.
- double BytesPerSecondVariance; // Variance of samples for this distribution.
- double Score; // Normalized score for this distribution.
- Grade::GradeEnum Grade; // Grade for this distribution.
-};
-
-struct FunctionData {
- FunctionId Id;
- StringMap<PerDistributionData> PerDistributionData;
- double ScoresGeoMean; // Geomean of scores for each distribution.
- GradeHistogram GradeHisto = {}; // GradeEnum indexed array
- Grade::GradeEnum FinalGrade = Grade::BAD; // Overall grade for this function
-};
-
-// Identifies a Distribution by its name. Used as a key in a map.
-struct DistributionId {
- StringRef Name;
- COMPARABLE_AND_HASHABLE(DistributionId, Name)
-};
-
-// Identifies a Sample by its distribution and function. Used as a key in a map.
-struct SampleId {
- FunctionId Function;
- DistributionId Distribution;
- COMPARABLE_AND_HASHABLE(SampleId, Function.Type, Function.Name,
- Distribution.Name)
-};
-
-// The type of Samples as reported by the Google Benchmark's JSON result file.
-// We are only interested in the "iteration" samples, the "aggregate" ones
-// represent derived metrics such as 'mean' or 'median'.
-enum class SampleType { UNKNOWN, ITERATION, AGGREGATE };
-
-// A SampleId with an associated measured throughput.
-struct Sample {
- SampleId Id;
- SampleType Type = SampleType::UNKNOWN;
- double BytesPerSecond = 0;
-};
-
-// This function collects Samples that belong to the same distribution and
-// function and retains the median one. It then stores each of them into a
-// 'FunctionData' and returns them as a vector.
-std::vector<FunctionData> getThroughputs(ArrayRef<Sample> Samples);
-
-// Normalize the function's throughput per distribution.
-void fillScores(MutableArrayRef<FunctionData> Functions);
-
-// Convert scores into Grades, stores an histogram of Grade for each functions
-// and cast a median grade for the function.
-void castVotes(MutableArrayRef<FunctionData> Functions);
-
-} // namespace automemcpy
-} // namespace llvm
-
-#endif // LIBC_BENCHMARKS_AUTOMEMCPY_RESULTANALYZER_H
diff --git a/libc/benchmarks/automemcpy/lib/CMakeLists.txt b/libc/benchmarks/automemcpy/lib/CMakeLists.txt
deleted file mode 100644
index e66b9045b607..000000000000
--- a/libc/benchmarks/automemcpy/lib/CMakeLists.txt
+++ /dev/null
@@ -1,37 +0,0 @@
-add_library(automemcpy_codegen CodeGen.cpp)
-target_link_libraries(automemcpy_codegen PUBLIC LLVMSupport)
-target_include_directories(automemcpy_codegen PUBLIC ${LIBC_AUTOMEMCPY_INCLUDE_DIR})
-llvm_update_compile_flags(automemcpy_codegen)
-
-add_executable(automemcpy_codegen_main CodeGenMain.cpp RandomFunctionGenerator.cpp)
-target_link_libraries(automemcpy_codegen_main PUBLIC automemcpy_codegen ${Z3_LIBRARIES})
-llvm_update_compile_flags(automemcpy_codegen_main)
-
-set(Implementations "${CMAKE_CURRENT_BINARY_DIR}/Implementations.cpp")
-add_custom_command(
- OUTPUT ${Implementations}
- COMMAND "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/automemcpy_codegen_main" > "${Implementations}"
- COMMAND echo "automemcpy implementations generated in ${Implementations}"
- WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
- DEPENDS automemcpy_codegen_main
-)
-
-add_library(automemcpy_implementations "${Implementations}")
-target_link_libraries(automemcpy_implementations PUBLIC LLVMSupport libc-memory-benchmark)
-target_include_directories(automemcpy_implementations PRIVATE
- ${LIBC_SOURCE_DIR} ${LIBC_AUTOMEMCPY_INCLUDE_DIR})
-target_compile_options(automemcpy_implementations PRIVATE ${LIBC_COMPILE_OPTIONS_NATIVE} "SHELL:-mllvm -combiner-global-alias-analysis" -fno-builtin)
-llvm_update_compile_flags(automemcpy_implementations)
-
-add_executable(automemcpy EXCLUDE_FROM_ALL ${LIBC_SOURCE_DIR}/benchmarks/LibcMemoryGoogleBenchmarkMain.cpp)
-target_link_libraries(automemcpy PRIVATE libc-memory-benchmark benchmark_main automemcpy_implementations)
-llvm_update_compile_flags(automemcpy)
-
-add_library(automemcpy_result_analyzer_lib EXCLUDE_FROM_ALL ResultAnalyzer.cpp)
-target_link_libraries(automemcpy_result_analyzer_lib PUBLIC LLVMSupport)
-target_include_directories(automemcpy_result_analyzer_lib PUBLIC ${LIBC_AUTOMEMCPY_INCLUDE_DIR})
-llvm_update_compile_flags(automemcpy_result_analyzer_lib)
-
-add_executable(automemcpy_result_analyzer EXCLUDE_FROM_ALL ResultAnalyzerMain.cpp)
-target_link_libraries(automemcpy_result_analyzer PRIVATE automemcpy_result_analyzer_lib automemcpy_implementations)
-llvm_update_compile_flags(automemcpy_result_analyzer)
diff --git a/libc/benchmarks/automemcpy/lib/CodeGen.cpp b/libc/benchmarks/automemcpy/lib/CodeGen.cpp
deleted file mode 100644
index d1336eaf31f3..000000000000
--- a/libc/benchmarks/automemcpy/lib/CodeGen.cpp
+++ /dev/null
@@ -1,644 +0,0 @@
-//===-- C++ code generation from NamedFunctionDescriptors -----------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-// This code is responsible for generating the "Implementation.cpp" file.
-// The file is composed like this:
-//
-// 1. Includes
-// 2. Using statements to help readability.
-// 3. Source code for all the mem function implementations.
-// 4. The function to retrieve all the function descriptors with their name.
-// llvm::ArrayRef<NamedFunctionDescriptor> getFunctionDescriptors();
-// 5. The functions for the benchmarking infrastructure:
-// llvm::ArrayRef<MemcpyConfiguration> getMemcpyConfigurations();
-// llvm::ArrayRef<MemcmpOrBcmpConfiguration> getMemcmpConfigurations();
-// llvm::ArrayRef<MemcmpOrBcmpConfiguration> getBcmpConfigurations();
-// llvm::ArrayRef<MemsetConfiguration> getMemsetConfigurations();
-// llvm::ArrayRef<BzeroConfiguration> getBzeroConfigurations();
-//
-//
-// Sections 3, 4 and 5 are handled by the following namespaces:
-// - codegen::functions
-// - codegen::descriptors
-// - codegen::configurations
-//
-// The programming style is functionnal. In each of these namespace, the
-// original `NamedFunctionDescriptor` object is turned into a different type. We
-// make use of overloaded stream operators to format the resulting type into
-// either a function, a descriptor or a configuration. The entry point of each
-// namespace is the Serialize function.
-//
-// Note the code here is better understood by starting from the `Serialize`
-// function at the end of the file.
-
-#include "automemcpy/CodeGen.h"
-#include "src/__support/macros/config.h"
-#include <cassert>
-#include <llvm/ADT/STLExtras.h>
-#include <llvm/ADT/StringSet.h>
-#include <llvm/Support/FormatVariadic.h>
-#include <llvm/Support/raw_ostream.h>
-#include <optional>
-#include <set>
-
-namespace llvm {
-namespace automemcpy {
-namespace codegen {
-
-// The indentation string.
-static constexpr StringRef kIndent = " ";
-
-// The codegen namespace handles the serialization of a NamedFunctionDescriptor
-// into source code for the function, the descriptor and the configuration.
-
-namespace functions {
-
-// This namespace turns a NamedFunctionDescriptor into an actual implementation.
-// -----------------------------------------------------------------------------
-// e.g.
-// static void memcpy_0xB20D4702493C397E(char *__restrict dst,
-// const char *__restrict src,
-// size_t size) {
-// using namespace LIBC_NAMESPACE::x86;
-// if(size == 0) return;
-// if(size == 1) return copy<_1>(dst, src);
-// if(size < 4) return copy<HeadTail<_2>>(dst, src, size);
-// if(size < 8) return copy<HeadTail<_4>>(dst, src, size);
-// if(size < 16) return copy<HeadTail<_8>>(dst, src, size);
-// if(size < 32) return copy<HeadTail<_16>>(dst, src, size);
-// return copy<Accelerator>(dst, src, size);
-// }
-
-// The `Serialize` method turns a `NamedFunctionDescriptor` into a
-// `FunctionImplementation` which holds all the information needed to produce
-// the C++ source code.
-
-// An Element with its size (e.g. `_16` in the example above).
-struct ElementType {
- size_t Size;
-};
-// The case `if(size == 0)` is encoded as a the Zero type.
-struct Zero {
- StringRef DefaultReturnValue;
-};
-// An individual size `if(size == X)` is encoded as an Individual type.
-struct Individual {
- size_t IfEq;
- ElementType Element;
-};
-// An overlap strategy is encoded as an Overlap type.
-struct Overlap {
- size_t IfLt;
- ElementType Element;
-};
-// A loop strategy is encoded as a Loop type.
-struct Loop {
- size_t IfLt;
- ElementType Element;
-};
-// An aligned loop strategy is encoded as an AlignedLoop type.
-struct AlignedLoop {
- size_t IfLt;
- ElementType Element;
- ElementType Alignment;
- StringRef AlignTo;
-};
-// The accelerator strategy.
-struct Accelerator {
- size_t IfLt;
-};
-// The Context stores data about the function type.
-struct Context {
- StringRef FunctionReturnType; // e.g. void* or int
- StringRef FunctionArgs;
- StringRef ElementOp; // copy, three_way_compare, splat_set, ...
- StringRef FixedSizeArgs;
- StringRef RuntimeSizeArgs;
- StringRef DefaultReturnValue;
-};
-// A detailed representation of the function implementation mapped from the
-// NamedFunctionDescriptor.
-struct FunctionImplementation {
- Context Ctx;
- StringRef Name;
- std::vector<Individual> Individuals;
- std::vector<Overlap> Overlaps;
- std::optional<Loop> Loop;
- std::optional<AlignedLoop> AlignedLoop;
- std::optional<Accelerator> Accelerator;
- ElementTypeClass ElementClass;
-};
-
-// Returns the Context for each FunctionType.
-static Context getCtx(FunctionType FT) {
- switch (FT) {
- case FunctionType::MEMCPY:
- return {"void",
- "(char *__restrict dst, const char *__restrict src, size_t size)",
- "copy",
- "(dst, src)",
- "(dst, src, size)",
- ""};
- case FunctionType::MEMCMP:
- return {"int",
- "(const char * lhs, const char * rhs, size_t size)",
- "three_way_compare",
- "(lhs, rhs)",
- "(lhs, rhs, size)",
- "0"};
- case FunctionType::MEMSET:
- return {"void",
- "(char * dst, int value, size_t size)",
- "splat_set",
- "(dst, value)",
- "(dst, value, size)",
- ""};
- case FunctionType::BZERO:
- return {"void", "(char * dst, size_t size)",
- "splat_set", "(dst, 0)",
- "(dst, 0, size)", ""};
- default:
- report_fatal_error("Not yet implemented");
- }
-}
-
-static StringRef getAligntoString(const AlignArg &AlignTo) {
- switch (AlignTo) {
- case AlignArg::_1:
- return "Arg::P1";
- case AlignArg::_2:
- return "Arg::P2";
- case AlignArg::ARRAY_SIZE:
- report_fatal_error("logic error");
- }
-}
-
-static raw_ostream &operator<<(raw_ostream &Stream, const ElementType &E) {
- return Stream << '_' << E.Size;
-}
-static raw_ostream &operator<<(raw_ostream &Stream, const Individual &O) {
- return Stream << O.Element;
-}
-static raw_ostream &operator<<(raw_ostream &Stream, const Overlap &O) {
- return Stream << "HeadTail<" << O.Element << '>';
-}
-static raw_ostream &operator<<(raw_ostream &Stream, const Loop &O) {
- return Stream << "Loop<" << O.Element << '>';
-}
-static raw_ostream &operator<<(raw_ostream &Stream, const AlignedLoop &O) {
- return Stream << "Align<" << O.Alignment << ',' << O.AlignTo << ">::Then<"
- << Loop{O.IfLt, O.Element} << ">";
-}
-static raw_ostream &operator<<(raw_ostream &Stream, const Accelerator &O) {
- return Stream << "Accelerator";
-}
-
-template <typename T> struct IfEq {
- StringRef Op;
- StringRef Args;
- const T &Element;
-};
-
-template <typename T> struct IfLt {
- StringRef Op;
- StringRef Args;
- const T &Element;
-};
-
-static raw_ostream &operator<<(raw_ostream &Stream, const Zero &O) {
- Stream << kIndent << "if(size == 0) return";
- if (!O.DefaultReturnValue.empty())
- Stream << ' ' << O.DefaultReturnValue;
- return Stream << ";\n";
-}
-
-template <typename T>
-static raw_ostream &operator<<(raw_ostream &Stream, const IfEq<T> &O) {
- return Stream << kIndent << "if(size == " << O.Element.IfEq << ") return "
- << O.Op << '<' << O.Element << '>' << O.Args << ";\n";
-}
-
-template <typename T>
-static raw_ostream &operator<<(raw_ostream &Stream, const IfLt<T> &O) {
- Stream << kIndent;
- if (O.Element.IfLt != kMaxSize)
- Stream << "if(size < " << O.Element.IfLt << ") ";
- return Stream << "return " << O.Op << '<' << O.Element << '>' << O.Args
- << ";\n";
-}
-
-static raw_ostream &operator<<(raw_ostream &Stream,
- const ElementTypeClass &Class) {
- switch (Class) {
- case ElementTypeClass::SCALAR:
- return Stream << "scalar";
- case ElementTypeClass::BUILTIN:
- return Stream << "builtin";
- case ElementTypeClass::NATIVE:
- // FIXME: the framework should provide a `native` namespace that redirect to
- // x86, arm or other architectures.
- return Stream << "x86";
- }
-}
-
-static raw_ostream &operator<<(raw_ostream &Stream,
- const FunctionImplementation &FI) {
- const auto &Ctx = FI.Ctx;
- Stream << "static " << Ctx.FunctionReturnType << ' ' << FI.Name
- << Ctx.FunctionArgs << " {\n";
- Stream << kIndent << "using namespace LIBC_NAMESPACE::" << FI.ElementClass
- << ";\n";
- for (const auto &I : FI.Individuals)
- if (I.Element.Size == 0)
- Stream << Zero{Ctx.DefaultReturnValue};
- else
- Stream << IfEq<Individual>{Ctx.ElementOp, Ctx.FixedSizeArgs, I};
- for (const auto &O : FI.Overlaps)
- Stream << IfLt<Overlap>{Ctx.ElementOp, Ctx.RuntimeSizeArgs, O};
- if (const auto &C = FI.Loop)
- Stream << IfLt<Loop>{Ctx.ElementOp, Ctx.RuntimeSizeArgs, *C};
- if (const auto &C = FI.AlignedLoop)
- Stream << IfLt<AlignedLoop>{Ctx.ElementOp, Ctx.RuntimeSizeArgs, *C};
- if (const auto &C = FI.Accelerator)
- Stream << IfLt<Accelerator>{Ctx.ElementOp, Ctx.RuntimeSizeArgs, *C};
- return Stream << "}\n";
-}
-
-// Turns a `NamedFunctionDescriptor` into a `FunctionImplementation` unfolding
-// the contiguous and overlap region into several statements. The zero case is
-// also mapped to its own type.
-static FunctionImplementation
-getImplementation(const NamedFunctionDescriptor &NamedFD) {
- const FunctionDescriptor &FD = NamedFD.Desc;
- FunctionImplementation Impl;
- Impl.Ctx = getCtx(FD.Type);
- Impl.Name = NamedFD.Name;
- Impl.ElementClass = FD.ElementClass;
- if (auto C = FD.Contiguous)
- for (size_t I = C->Span.Begin; I < C->Span.End; ++I)
- Impl.Individuals.push_back(Individual{I, ElementType{I}});
- if (auto C = FD.Overlap)
- for (size_t I = C->Span.Begin; I < C->Span.End; I *= 2)
- Impl.Overlaps.push_back(Overlap{2 * I, ElementType{I}});
- if (const auto &L = FD.Loop)
- Impl.Loop = Loop{L->Span.End, ElementType{L->BlockSize}};
- if (const auto &AL = FD.AlignedLoop)
- Impl.AlignedLoop =
- AlignedLoop{AL->Loop.Span.End, ElementType{AL->Loop.BlockSize},
- ElementType{AL->Alignment}, getAligntoString(AL->AlignTo)};
- if (const auto &A = FD.Accelerator)
- Impl.Accelerator = Accelerator{A->Span.End};
- return Impl;
-}
-
-static void Serialize(raw_ostream &Stream,
- ArrayRef<NamedFunctionDescriptor> Descriptors) {
-
- for (const auto &FD : Descriptors)
- Stream << getImplementation(FD);
-}
-
-} // namespace functions
-
-namespace descriptors {
-
-// This namespace generates the getFunctionDescriptors function:
-// -------------------------------------------------------------
-// e.g.
-// ArrayRef<NamedFunctionDescriptor> getFunctionDescriptors() {
-// static constexpr NamedFunctionDescriptor kDescriptors[] = {
-// {"memcpy_0xE00E29EE73994E2B",{FunctionType::MEMCPY,std::nullopt,std::nullopt,std::nullopt,std::nullopt,Accelerator{{0,kMaxSize}},ElementTypeClass::NATIVE}},
-// {"memcpy_0x8661D80472487AB5",{FunctionType::MEMCPY,Contiguous{{0,1}},std::nullopt,std::nullopt,std::nullopt,Accelerator{{1,kMaxSize}},ElementTypeClass::NATIVE}},
-// ...
-// };
-// return ArrayRef(kDescriptors);
-// }
-
-static raw_ostream &operator<<(raw_ostream &Stream, const SizeSpan &SS) {
- Stream << "{" << SS.Begin << ',';
- if (SS.End == kMaxSize)
- Stream << "kMaxSize";
- else
- Stream << SS.End;
- return Stream << '}';
-}
-static raw_ostream &operator<<(raw_ostream &Stream, const Contiguous &O) {
- return Stream << "Contiguous{" << O.Span << '}';
-}
-static raw_ostream &operator<<(raw_ostream &Stream, const Overlap &O) {
- return Stream << "Overlap{" << O.Span << '}';
-}
-static raw_ostream &operator<<(raw_ostream &Stream, const Loop &O) {
- return Stream << "Loop{" << O.Span << ',' << O.BlockSize << '}';
-}
-static raw_ostream &operator<<(raw_ostream &Stream, const AlignArg &O) {
- switch (O) {
- case AlignArg::_1:
- return Stream << "AlignArg::_1";
- case AlignArg::_2:
- return Stream << "AlignArg::_2";
- case AlignArg::ARRAY_SIZE:
- report_fatal_error("logic error");
- }
-}
-static raw_ostream &operator<<(raw_ostream &Stream, const AlignedLoop &O) {
- return Stream << "AlignedLoop{" << O.Loop << ',' << O.Alignment << ','
- << O.AlignTo << '}';
-}
-static raw_ostream &operator<<(raw_ostream &Stream, const Accelerator &O) {
- return Stream << "Accelerator{" << O.Span << '}';
-}
-static raw_ostream &operator<<(raw_ostream &Stream, const ElementTypeClass &O) {
- switch (O) {
- case ElementTypeClass::SCALAR:
- return Stream << "ElementTypeClass::SCALAR";
- case ElementTypeClass::BUILTIN:
- return Stream << "ElementTypeClass::BUILTIN";
- case ElementTypeClass::NATIVE:
- return Stream << "ElementTypeClass::NATIVE";
- }
-}
-static raw_ostream &operator<<(raw_ostream &Stream, const FunctionType &T) {
- switch (T) {
- case FunctionType::MEMCPY:
- return Stream << "FunctionType::MEMCPY";
- case FunctionType::MEMCMP:
- return Stream << "FunctionType::MEMCMP";
- case FunctionType::BCMP:
- return Stream << "FunctionType::BCMP";
- case FunctionType::MEMSET:
- return Stream << "FunctionType::MEMSET";
- case FunctionType::BZERO:
- return Stream << "FunctionType::BZERO";
- }
-}
-template <typename T>
-static raw_ostream &operator<<(raw_ostream &Stream,
- const std::optional<T> &MaybeT) {
- if (MaybeT)
- return Stream << *MaybeT;
- return Stream << "std::nullopt";
-}
-static raw_ostream &operator<<(raw_ostream &Stream,
- const FunctionDescriptor &FD) {
- return Stream << '{' << FD.Type << ',' << FD.Contiguous << ',' << FD.Overlap
- << ',' << FD.Loop << ',' << FD.AlignedLoop << ','
- << FD.Accelerator << ',' << FD.ElementClass << '}';
-}
-static raw_ostream &operator<<(raw_ostream &Stream,
- const NamedFunctionDescriptor &NFD) {
- return Stream << '{' << '"' << NFD.Name << '"' << ',' << NFD.Desc << '}';
-}
-template <typename T>
-static raw_ostream &operator<<(raw_ostream &Stream,
- const std::vector<T> &VectorT) {
- Stream << '{';
- bool First = true;
- for (const auto &Obj : VectorT) {
- if (!First)
- Stream << ',';
- Stream << Obj;
- First = false;
- }
- return Stream << '}';
-}
-
-static void Serialize(raw_ostream &Stream,
- ArrayRef<NamedFunctionDescriptor> Descriptors) {
- Stream << R"(ArrayRef<NamedFunctionDescriptor> getFunctionDescriptors() {
- static constexpr NamedFunctionDescriptor kDescriptors[] = {
-)";
- for (size_t I = 0, E = Descriptors.size(); I < E; ++I) {
- Stream << kIndent << kIndent << Descriptors[I] << ",\n";
- }
- Stream << R"( };
- return ArrayRef(kDescriptors);
-}
-)";
-}
-
-} // namespace descriptors
-
-namespace configurations {
-
-// This namespace generates the getXXXConfigurations functions:
-// ------------------------------------------------------------
-// e.g.
-// llvm::ArrayRef<MemcpyConfiguration> getMemcpyConfigurations() {
-// using namespace LIBC_NAMESPACE;
-// static constexpr MemcpyConfiguration kConfigurations[] = {
-// {Wrap<memcpy_0xE00E29EE73994E2B>, "memcpy_0xE00E29EE73994E2B"},
-// {Wrap<memcpy_0x8661D80472487AB5>, "memcpy_0x8661D80472487AB5"},
-// ...
-// };
-// return llvm::ArrayRef(kConfigurations);
-// }
-
-// The `Wrap` template function is provided in the `Main` function below.
-// It is used to adapt the gnerated code to the prototype of the C function.
-// For instance, the generated code for a `memcpy` takes `char*` pointers and
-// returns nothing but the original C `memcpy` function take and returns `void*`
-// pointers.
-
-struct FunctionName {
- FunctionType ForType;
-};
-
-struct ReturnType {
- FunctionType ForType;
-};
-
-struct Configuration {
- FunctionName Name;
- ReturnType Type;
- std::vector<const NamedFunctionDescriptor *> Descriptors;
-};
-
-static raw_ostream &operator<<(raw_ostream &Stream, const FunctionName &FN) {
- switch (FN.ForType) {
- case FunctionType::MEMCPY:
- return Stream << "getMemcpyConfigurations";
- case FunctionType::MEMCMP:
- return Stream << "getMemcmpConfigurations";
- case FunctionType::BCMP:
- return Stream << "getBcmpConfigurations";
- case FunctionType::MEMSET:
- return Stream << "getMemsetConfigurations";
- case FunctionType::BZERO:
- return Stream << "getBzeroConfigurations";
- }
-}
-
-static raw_ostream &operator<<(raw_ostream &Stream, const ReturnType &RT) {
- switch (RT.ForType) {
- case FunctionType::MEMCPY:
- return Stream << "MemcpyConfiguration";
- case FunctionType::MEMCMP:
- case FunctionType::BCMP:
- return Stream << "MemcmpOrBcmpConfiguration";
- case FunctionType::MEMSET:
- return Stream << "MemsetConfiguration";
- case FunctionType::BZERO:
- return Stream << "BzeroConfiguration";
- }
-}
-
-static raw_ostream &operator<<(raw_ostream &Stream,
- const NamedFunctionDescriptor *FD) {
- return Stream << formatv("{Wrap<{0}>, \"{0}\"}", FD->Name);
-}
-
-static raw_ostream &
-operator<<(raw_ostream &Stream,
- const std::vector<const NamedFunctionDescriptor *> &Descriptors) {
- for (size_t I = 0, E = Descriptors.size(); I < E; ++I)
- Stream << kIndent << kIndent << Descriptors[I] << ",\n";
- return Stream;
-}
-
-static raw_ostream &operator<<(raw_ostream &Stream, const Configuration &C) {
- Stream << "llvm::ArrayRef<" << C.Type << "> " << C.Name << "() {\n";
- if (C.Descriptors.empty())
- Stream << kIndent << "return {};\n";
- else {
- Stream << kIndent << "using namespace LIBC_NAMESPACE;\n";
- Stream << kIndent << "static constexpr " << C.Type
- << " kConfigurations[] = {\n";
- Stream << C.Descriptors;
- Stream << kIndent << "};\n";
- Stream << kIndent << "return llvm::ArrayRef(kConfigurations);\n";
- }
- Stream << "}\n";
- return Stream;
-}
-
-static void Serialize(raw_ostream &Stream, FunctionType FT,
- ArrayRef<NamedFunctionDescriptor> Descriptors) {
- Configuration Conf;
- Conf.Name = {FT};
- Conf.Type = {FT};
- for (const auto &FD : Descriptors)
- if (FD.Desc.Type == FT)
- Conf.Descriptors.push_back(&FD);
- Stream << Conf;
-}
-
-} // namespace configurations
-static void Serialize(raw_ostream &Stream,
- ArrayRef<NamedFunctionDescriptor> Descriptors) {
- Stream << "// This file is auto-generated by libc/benchmarks/automemcpy.\n";
- Stream << "// Functions : " << Descriptors.size() << "\n";
- Stream << "\n";
- Stream << "#include \"LibcFunctionPrototypes.h\"\n";
- Stream << "#include \"automemcpy/FunctionDescriptor.h\"\n";
- Stream << "#include \"src/string/memory_utils/elements.h\"\n";
- Stream << "\n";
- Stream << "using llvm::libc_benchmarks::BzeroConfiguration;\n";
- Stream << "using llvm::libc_benchmarks::MemcmpOrBcmpConfiguration;\n";
- Stream << "using llvm::libc_benchmarks::MemcpyConfiguration;\n";
- Stream << "using llvm::libc_benchmarks::MemmoveConfiguration;\n";
- Stream << "using llvm::libc_benchmarks::MemsetConfiguration;\n";
- Stream << "\n";
- Stream << "namespace LIBC_NAMESPACE_DECL {\n";
- Stream << "\n";
- codegen::functions::Serialize(Stream, Descriptors);
- Stream << "\n";
- Stream << "} // namespace LIBC_NAMESPACE_DECL\n";
- Stream << "\n";
- Stream << "namespace llvm {\n";
- Stream << "namespace automemcpy {\n";
- Stream << "\n";
- codegen::descriptors::Serialize(Stream, Descriptors);
- Stream << "\n";
- Stream << "} // namespace automemcpy\n";
- Stream << "} // namespace llvm\n";
- Stream << "\n";
- Stream << R"(
-using MemcpyStub = void (*)(char *__restrict, const char *__restrict, size_t);
-template <MemcpyStub Foo>
-void *Wrap(void *__restrict dst, const void *__restrict src, size_t size) {
- Foo(reinterpret_cast<char *__restrict>(dst),
- reinterpret_cast<const char *__restrict>(src), size);
- return dst;
-}
-)";
- codegen::configurations::Serialize(Stream, FunctionType::MEMCPY, Descriptors);
- Stream << R"(
-using MemcmpStub = int (*)(const char *, const char *, size_t);
-template <MemcmpStub Foo>
-int Wrap(const void *lhs, const void *rhs, size_t size) {
- return Foo(reinterpret_cast<const char *>(lhs),
- reinterpret_cast<const char *>(rhs), size);
-}
-)";
- codegen::configurations::Serialize(Stream, FunctionType::MEMCMP, Descriptors);
- codegen::configurations::Serialize(Stream, FunctionType::BCMP, Descriptors);
- Stream << R"(
-using MemsetStub = void (*)(char *, int, size_t);
-template <MemsetStub Foo> void *Wrap(void *dst, int value, size_t size) {
- Foo(reinterpret_cast<char *>(dst), value, size);
- return dst;
-}
-)";
- codegen::configurations::Serialize(Stream, FunctionType::MEMSET, Descriptors);
- Stream << R"(
-using BzeroStub = void (*)(char *, size_t);
-template <BzeroStub Foo> void Wrap(void *dst, size_t size) {
- Foo(reinterpret_cast<char *>(dst), size);
-}
-)";
- codegen::configurations::Serialize(Stream, FunctionType::BZERO, Descriptors);
- Stream << R"(
-llvm::ArrayRef<MemmoveConfiguration> getMemmoveConfigurations() {
- return {};
-}
-)";
- Stream << "// Functions : " << Descriptors.size() << "\n";
-}
-
-} // namespace codegen
-
-// Stores `VolatileStr` into a cache and returns a StringRef of the cached
-// version.
-StringRef getInternalizedString(std::string VolatileStr) {
- static llvm::StringSet StringCache;
- return StringCache.insert(std::move(VolatileStr)).first->getKey();
-}
-
-static StringRef getString(FunctionType FT) {
- switch (FT) {
- case FunctionType::MEMCPY:
- return "memcpy";
- case FunctionType::MEMCMP:
- return "memcmp";
- case FunctionType::BCMP:
- return "bcmp";
- case FunctionType::MEMSET:
- return "memset";
- case FunctionType::BZERO:
- return "bzero";
- }
-}
-
-void Serialize(raw_ostream &Stream, ArrayRef<FunctionDescriptor> Descriptors) {
- std::vector<NamedFunctionDescriptor> FunctionDescriptors;
- FunctionDescriptors.reserve(Descriptors.size());
- for (auto &FD : Descriptors) {
- FunctionDescriptors.emplace_back();
- FunctionDescriptors.back().Name = getInternalizedString(
- formatv("{0}_{1:X16}", getString(FD.Type), FD.id()));
- FunctionDescriptors.back().Desc = std::move(FD);
- }
- // Sort functions so they are easier to spot in the generated C++ file.
- std::sort(FunctionDescriptors.begin(), FunctionDescriptors.end(),
- [](const NamedFunctionDescriptor &A,
- const NamedFunctionDescriptor &B) { return A.Desc < B.Desc; });
- codegen::Serialize(Stream, FunctionDescriptors);
-}
-
-} // namespace automemcpy
-} // namespace llvm
diff --git a/libc/benchmarks/automemcpy/lib/CodeGenMain.cpp b/libc/benchmarks/automemcpy/lib/CodeGenMain.cpp
deleted file mode 100644
index 3f4e6fc0423a..000000000000
--- a/libc/benchmarks/automemcpy/lib/CodeGenMain.cpp
+++ /dev/null
@@ -1,29 +0,0 @@
-#include "automemcpy/CodeGen.h"
-#include "automemcpy/RandomFunctionGenerator.h"
-#include <optional>
-#include <unordered_set>
-
-namespace llvm {
-namespace automemcpy {
-
-std::vector<FunctionDescriptor> generateFunctionDescriptors() {
- std::unordered_set<FunctionDescriptor, FunctionDescriptor::Hasher> Seen;
- std::vector<FunctionDescriptor> FunctionDescriptors;
- RandomFunctionGenerator P;
- while (std::optional<FunctionDescriptor> MaybeFD = P.next()) {
- FunctionDescriptor FD = *MaybeFD;
- if (Seen.count(FD)) // FIXME: Z3 sometimes returns twice the same object.
- continue;
- Seen.insert(FD);
- FunctionDescriptors.push_back(std::move(FD));
- }
- return FunctionDescriptors;
-}
-
-} // namespace automemcpy
-} // namespace llvm
-
-int main(int, char **) {
- llvm::automemcpy::Serialize(llvm::outs(),
- llvm::automemcpy::generateFunctionDescriptors());
-}
diff --git a/libc/benchmarks/automemcpy/lib/RandomFunctionGenerator.cpp b/libc/benchmarks/automemcpy/lib/RandomFunctionGenerator.cpp
deleted file mode 100644
index f438e2a405bd..000000000000
--- a/libc/benchmarks/automemcpy/lib/RandomFunctionGenerator.cpp
+++ /dev/null
@@ -1,280 +0,0 @@
-//===-- Generate random but valid function descriptors -------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "automemcpy/RandomFunctionGenerator.h"
-
-#include <llvm/ADT/StringRef.h>
-#include <llvm/Support/raw_ostream.h>
-
-#include <optional>
-#include <set>
-
-namespace llvm {
-namespace automemcpy {
-
-// Exploration parameters
-// ----------------------
-// Here we define a set of values that will contraint the exploration and
-// limit combinatorial explosion.
-
-// We limit the number of cases for individual sizes to sizes up to 4.
-// More individual sizes don't bring much over the overlapping strategy.
-static constexpr int kMaxIndividualSize = 4;
-
-// We limit Overlapping Strategy to sizes up to 256.
-// An overlap of 256B means accessing 128B at once which is usually not
-// feasible by current CPUs. We rely on the compiler to generate multiple
-// loads/stores if needed but higher sizes are unlikely to benefit from hardware
-// acceleration.
-static constexpr int kMaxOverlapSize = 256;
-
-// For the loop strategies, we make sure that they iterate at least a certain
-// number of times to amortize the cost of looping.
-static constexpr int kLoopMinIter = 3;
-static constexpr int kAlignedLoopMinIter = 2;
-
-// We restrict the size of the block of data to handle in a loop.
-// Generally speaking block size <= 16 perform poorly.
-static constexpr int kLoopBlockSize[] = {16, 32, 64};
-
-// We restrict alignment to the following values.
-static constexpr int kLoopAlignments[] = {16, 32, 64};
-
-// We make sure that the region bounds are one of the following values.
-static constexpr int kAnchors[] = {0, 1, 2, 4, 8, 16, 32, 48,
- 64, 96, 128, 256, 512, 1024, kMaxSize};
-
-// We also allow disabling loops, aligned loops and accelerators.
-static constexpr bool kDisableLoop = false;
-static constexpr bool kDisableAlignedLoop = false;
-static constexpr bool kDisableAccelerator = false;
-
-// For memcpy, we can also explore whether aligning on source or destination has
-// an effect.
-static constexpr bool kExploreAlignmentArg = true;
-
-// The function we generate code for.
-// BCMP is specifically disabled for now.
-static constexpr int kFunctionTypes[] = {
- (int)FunctionType::MEMCPY,
- (int)FunctionType::MEMCMP,
- // (int)FunctionType::BCMP,
- (int)FunctionType::MEMSET,
- (int)FunctionType::BZERO,
-};
-
-// The actual implementation of each function can be handled via primitive types
-// (SCALAR), vector types where available (NATIVE) or by the compiler (BUILTIN).
-// We want to move toward delegating the code generation entirely to the
-// compiler but for now we have to make use of -per microarchitecture- custom
-// implementations. Scalar being more portable but also less performant, we
-// remove it as well.
-static constexpr int kElementClasses[] = {
- // (int)ElementTypeClass::SCALAR,
- (int)ElementTypeClass::NATIVE,
- // (int)ElementTypeClass::BUILTIN
-};
-
-RandomFunctionGenerator::RandomFunctionGenerator()
- : Solver(Context), Type(Context.int_const("Type")),
- ContiguousBegin(Context.int_const("ContiguousBegin")),
- ContiguousEnd(Context.int_const("ContiguousEnd")),
- OverlapBegin(Context.int_const("OverlapBegin")),
- OverlapEnd(Context.int_const("OverlapEnd")),
- LoopBegin(Context.int_const("LoopBegin")),
- LoopEnd(Context.int_const("LoopEnd")),
- LoopBlockSize(Context.int_const("LoopBlockSize")),
- AlignedLoopBegin(Context.int_const("AlignedLoopBegin")),
- AlignedLoopEnd(Context.int_const("AlignedLoopEnd")),
- AlignedLoopBlockSize(Context.int_const("AlignedLoopBlockSize")),
- AlignedAlignment(Context.int_const("AlignedAlignment")),
- AlignedArg(Context.int_const("AlignedArg")),
- AcceleratorBegin(Context.int_const("AcceleratorBegin")),
- AcceleratorEnd(Context.int_const("AcceleratorEnd")),
- ElementClass(Context.int_const("ElementClass")) {
- // All possible functions.
- Solver.add(inSetConstraint(Type, kFunctionTypes));
-
- // Add constraints for region bounds.
- addBoundsAndAnchors(ContiguousBegin, ContiguousEnd);
- addBoundsAndAnchors(OverlapBegin, OverlapEnd);
- addBoundsAndAnchors(LoopBegin, LoopEnd);
- addBoundsAndAnchors(AlignedLoopBegin, AlignedLoopEnd);
- addBoundsAndAnchors(AcceleratorBegin, AcceleratorEnd);
- // We always consider strategies in this order, and we
- // always end with the `Accelerator` strategy, as it's typically more
- // efficient for large sizes.
- // Contiguous <= Overlap <= Loop <= AlignedLoop <= Accelerator
- Solver.add(ContiguousEnd == OverlapBegin);
- Solver.add(OverlapEnd == LoopBegin);
- Solver.add(LoopEnd == AlignedLoopBegin);
- Solver.add(AlignedLoopEnd == AcceleratorBegin);
- // Fix endpoints: The minimum size that we want to copy is 0, and we always
- // start with the `Contiguous` strategy. The max size is `kMaxSize`.
- Solver.add(ContiguousBegin == 0);
- Solver.add(AcceleratorEnd == kMaxSize);
- // Contiguous
- Solver.add(ContiguousEnd <= kMaxIndividualSize + 1);
- // Overlap
- Solver.add(OverlapEnd <= kMaxOverlapSize + 1);
- // Overlap only ever makes sense when accessing multiple bytes at a time.
- // i.e. Overlap<1> is useless.
- Solver.add(OverlapBegin == OverlapEnd || OverlapBegin >= 2);
- // Loop
- addLoopConstraints(LoopBegin, LoopEnd, LoopBlockSize, kLoopMinIter);
- // Aligned Loop
- addLoopConstraints(AlignedLoopBegin, AlignedLoopEnd, AlignedLoopBlockSize,
- kAlignedLoopMinIter);
- Solver.add(inSetConstraint(AlignedAlignment, kLoopAlignments));
- Solver.add(AlignedLoopBegin == AlignedLoopEnd || AlignedLoopBegin >= 64);
- Solver.add(AlignedLoopBlockSize >= AlignedAlignment);
- Solver.add(AlignedLoopBlockSize >= LoopBlockSize);
- z3::expr IsMemcpy = Type == (int)FunctionType::MEMCPY;
- z3::expr ExploreAlignment = IsMemcpy && kExploreAlignmentArg;
- Solver.add(
- (ExploreAlignment &&
- inSetConstraint(AlignedArg, {(int)AlignArg::_1, (int)AlignArg::_2})) ||
- (!ExploreAlignment && AlignedArg == (int)AlignArg::_1));
- // Accelerator
- Solver.add(IsMemcpy ||
- (AcceleratorBegin ==
- AcceleratorEnd)); // Only Memcpy has accelerator for now.
- // Element classes
- Solver.add(inSetConstraint(ElementClass, kElementClasses));
-
- if (kDisableLoop)
- Solver.add(LoopBegin == LoopEnd);
- if (kDisableAlignedLoop)
- Solver.add(AlignedLoopBegin == AlignedLoopEnd);
- if (kDisableAccelerator)
- Solver.add(AcceleratorBegin == AcceleratorEnd);
-}
-
-// Creates SizeSpan from Begin/End values.
-// Returns std::nullopt if Begin==End.
-static std::optional<SizeSpan> AsSizeSpan(size_t Begin, size_t End) {
- if (Begin == End)
- return std::nullopt;
- SizeSpan SS;
- SS.Begin = Begin;
- SS.End = End;
- return SS;
-}
-
-// Generic method to create a `Region` struct with a Span or std::nullopt if
-// span is empty.
-template <typename Region>
-static std::optional<Region> As(size_t Begin, size_t End) {
- if (auto Span = AsSizeSpan(Begin, End)) {
- Region Output;
- Output.Span = *Span;
- return Output;
- }
- return std::nullopt;
-}
-
-// Returns a Loop struct or std::nullopt if span is empty.
-static std::optional<Loop> AsLoop(size_t Begin, size_t End, size_t BlockSize) {
- if (auto Span = AsSizeSpan(Begin, End)) {
- Loop Output;
- Output.Span = *Span;
- Output.BlockSize = BlockSize;
- return Output;
- }
- return std::nullopt;
-}
-
-// Returns an AlignedLoop struct or std::nullopt if span is empty.
-static std::optional<AlignedLoop> AsAlignedLoop(size_t Begin, size_t End,
- size_t BlockSize,
- size_t Alignment,
- AlignArg AlignTo) {
- if (auto Loop = AsLoop(Begin, End, BlockSize)) {
- AlignedLoop Output;
- Output.Loop = *Loop;
- Output.Alignment = Alignment;
- Output.AlignTo = AlignTo;
- return Output;
- }
- return std::nullopt;
-}
-
-std::optional<FunctionDescriptor> RandomFunctionGenerator::next() {
- if (Solver.check() != z3::sat)
- return {};
-
- z3::model m = Solver.get_model();
-
- // Helper method to get the current numerical value of a z3::expr.
- const auto E = [&m](z3::expr &V) -> int {
- return m.eval(V).get_numeral_int();
- };
-
- // Fill is the function descriptor to return.
- FunctionDescriptor R;
- R.Type = FunctionType(E(Type));
- R.Contiguous = As<Contiguous>(E(ContiguousBegin), E(ContiguousEnd));
- R.Overlap = As<Overlap>(E(OverlapBegin), E(OverlapEnd));
- R.Loop = AsLoop(E(LoopBegin), E(LoopEnd), E(LoopBlockSize));
- R.AlignedLoop = AsAlignedLoop(E(AlignedLoopBegin), E(AlignedLoopEnd),
- E(AlignedLoopBlockSize), E(AlignedAlignment),
- AlignArg(E(AlignedArg)));
- R.Accelerator = As<Accelerator>(E(AcceleratorBegin), E(AcceleratorEnd));
- R.ElementClass = ElementTypeClass(E(ElementClass));
-
- // Express current state as a set of constraints.
- z3::expr CurrentLayout =
- (Type == E(Type)) && (ContiguousBegin == E(ContiguousBegin)) &&
- (ContiguousEnd == E(ContiguousEnd)) &&
- (OverlapBegin == E(OverlapBegin)) && (OverlapEnd == E(OverlapEnd)) &&
- (LoopBegin == E(LoopBegin)) && (LoopEnd == E(LoopEnd)) &&
- (LoopBlockSize == E(LoopBlockSize)) &&
- (AlignedLoopBegin == E(AlignedLoopBegin)) &&
- (AlignedLoopEnd == E(AlignedLoopEnd)) &&
- (AlignedLoopBlockSize == E(AlignedLoopBlockSize)) &&
- (AlignedAlignment == E(AlignedAlignment)) &&
- (AlignedArg == E(AlignedArg)) &&
- (AcceleratorBegin == E(AcceleratorBegin)) &&
- (AcceleratorEnd == E(AcceleratorEnd)) &&
- (ElementClass == E(ElementClass));
-
- // Ask solver to never show this configuration ever again.
- Solver.add(!CurrentLayout);
- return R;
-}
-
-// Make sure `Variable` is one of the provided values.
-z3::expr RandomFunctionGenerator::inSetConstraint(z3::expr &Variable,
- ArrayRef<int> Values) const {
- z3::expr_vector Args(Variable.ctx());
- for (int Value : Values)
- Args.push_back(Variable == Value);
- return z3::mk_or(Args);
-}
-
-void RandomFunctionGenerator::addBoundsAndAnchors(z3::expr &Begin,
- z3::expr &End) {
- // Begin and End are picked amongst a set of predefined values.
- Solver.add(inSetConstraint(Begin, kAnchors));
- Solver.add(inSetConstraint(End, kAnchors));
- Solver.add(Begin >= 0);
- Solver.add(Begin <= End);
- Solver.add(End <= kMaxSize);
-}
-
-void RandomFunctionGenerator::addLoopConstraints(const z3::expr &LoopBegin,
- const z3::expr &LoopEnd,
- z3::expr &LoopBlockSize,
- int LoopMinIter) {
- Solver.add(inSetConstraint(LoopBlockSize, kLoopBlockSize));
- Solver.add(LoopBegin == LoopEnd ||
- (LoopBegin > (LoopMinIter * LoopBlockSize)));
-}
-
-} // namespace automemcpy
-} // namespace llvm
diff --git a/libc/benchmarks/automemcpy/lib/ResultAnalyzer.cpp b/libc/benchmarks/automemcpy/lib/ResultAnalyzer.cpp
deleted file mode 100644
index b134f6c83a0d..000000000000
--- a/libc/benchmarks/automemcpy/lib/ResultAnalyzer.cpp
+++ /dev/null
@@ -1,204 +0,0 @@
-//===-- Analyze benchmark JSON files --------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-// This code analyzes the json file produced by the `automemcpy` binary.
-//
-// As a remainder, `automemcpy` will benchmark each autogenerated memory
-// functions against one of the predefined distributions available in the
-// `libc/benchmarks/distributions` folder.
-//
-// It works as follows:
-// - Reads one or more json files.
-// - If there are several runs for the same function and distribution, picks the
-// median throughput (aka `BytesPerSecond`).
-// - Aggregates the throughput per distributions and scores them from worst (0)
-// to best (1).
-// - Each distribution categorizes each function into one of the following
-// categories: EXCELLENT, VERY_GOOD, GOOD, PASSABLE, INADEQUATE, MEDIOCRE,
-// BAD.
-// - A process similar to the Majority Judgment voting system is used to `elect`
-// the best function. The histogram of grades is returned so we can
-// distinguish between functions with the same final grade. In the following
-// example both functions grade EXCELLENT but we may prefer the second one.
-//
-// | | EXCELLENT | VERY_GOOD | GOOD | PASSABLE | ...
-// |------------|-----------|-----------|------|----------| ...
-// | Function_1 | 7 | 1 | 2 | | ...
-// | Function_2 | 6 | 4 | | | ...
-
-#include "automemcpy/ResultAnalyzer.h"
-#include "llvm/ADT/StringRef.h"
-#include <numeric>
-#include <unordered_map>
-
-namespace llvm {
-
-namespace automemcpy {
-
-StringRef Grade::getString(const GradeEnum &GE) {
- switch (GE) {
- case EXCELLENT:
- return "EXCELLENT";
- case VERY_GOOD:
- return "VERY_GOOD";
- case GOOD:
- return "GOOD";
- case PASSABLE:
- return "PASSABLE";
- case INADEQUATE:
- return "INADEQUATE";
- case MEDIOCRE:
- return "MEDIOCRE";
- case BAD:
- return "BAD";
- case ARRAY_SIZE:
- report_fatal_error("logic error");
- }
-}
-
-Grade::GradeEnum Grade::judge(double Score) {
- if (Score >= 6. / 7)
- return EXCELLENT;
- if (Score >= 5. / 7)
- return VERY_GOOD;
- if (Score >= 4. / 7)
- return GOOD;
- if (Score >= 3. / 7)
- return PASSABLE;
- if (Score >= 2. / 7)
- return INADEQUATE;
- if (Score >= 1. / 7)
- return MEDIOCRE;
- return BAD;
-}
-
-static double computeUnbiasedSampleVariance(const std::vector<double> &Samples,
- const double SampleMean) {
- assert(!Samples.empty());
- if (Samples.size() == 1)
- return 0;
- double DiffSquaresSum = 0;
- for (const double S : Samples) {
- const double Diff = S - SampleMean;
- DiffSquaresSum += Diff * Diff;
- }
- return DiffSquaresSum / (Samples.size() - 1);
-}
-
-static void processPerDistributionData(PerDistributionData &Data) {
- auto &Samples = Data.BytesPerSecondSamples;
- assert(!Samples.empty());
- // Sample Mean
- const double Sum = std::accumulate(Samples.begin(), Samples.end(), 0.0);
- Data.BytesPerSecondMean = Sum / Samples.size();
- // Unbiased Sample Variance
- Data.BytesPerSecondVariance =
- computeUnbiasedSampleVariance(Samples, Data.BytesPerSecondMean);
- // Median
- const size_t HalfSize = Samples.size() / 2;
- std::nth_element(Samples.begin(), Samples.begin() + HalfSize, Samples.end());
- Data.BytesPerSecondMedian = Samples[HalfSize];
-}
-
-std::vector<FunctionData> getThroughputs(ArrayRef<Sample> Samples) {
- std::unordered_map<FunctionId, FunctionData, FunctionId::Hasher> Functions;
- for (const auto &S : Samples) {
- if (S.Type != SampleType::ITERATION)
- break;
- auto &Function = Functions[S.Id.Function];
- auto &Data = Function.PerDistributionData[S.Id.Distribution.Name];
- Data.BytesPerSecondSamples.push_back(S.BytesPerSecond);
- }
-
- std::vector<FunctionData> Output;
- for (auto &[FunctionId, Function] : Functions) {
- Function.Id = FunctionId;
- for (auto &Pair : Function.PerDistributionData)
- processPerDistributionData(Pair.second);
- Output.push_back(std::move(Function));
- }
- return Output;
-}
-
-void fillScores(MutableArrayRef<FunctionData> Functions) {
- // A key to bucket throughput per function type and distribution.
- struct Key {
- FunctionType Type;
- StringRef Distribution;
-
- COMPARABLE_AND_HASHABLE(Key, Type, Distribution)
- };
-
- // Tracks minimum and maximum values.
- struct MinMax {
- double Min = std::numeric_limits<double>::max();
- double Max = std::numeric_limits<double>::min();
- void update(double Value) {
- if (Value < Min)
- Min = Value;
- if (Value > Max)
- Max = Value;
- }
- double normalize(double Value) const { return (Value - Min) / (Max - Min); }
- };
-
- std::unordered_map<Key, MinMax, Key::Hasher> ThroughputMinMax;
- for (const auto &Function : Functions) {
- const FunctionType Type = Function.Id.Type;
- for (const auto &Pair : Function.PerDistributionData) {
- const auto &Distribution = Pair.getKey();
- const double Throughput = Pair.getValue().BytesPerSecondMedian;
- const Key K{Type, Distribution};
- ThroughputMinMax[K].update(Throughput);
- }
- }
-
- for (auto &Function : Functions) {
- const FunctionType Type = Function.Id.Type;
- for (const auto &Pair : Function.PerDistributionData) {
- const auto &Distribution = Pair.getKey();
- const double Throughput = Pair.getValue().BytesPerSecondMedian;
- const Key K{Type, Distribution};
- Function.PerDistributionData[Distribution].Score =
- ThroughputMinMax[K].normalize(Throughput);
- }
- }
-}
-
-void castVotes(MutableArrayRef<FunctionData> Functions) {
- for (FunctionData &Function : Functions) {
- Function.ScoresGeoMean = 1.0;
- for (const auto &Pair : Function.PerDistributionData) {
- const StringRef Distribution = Pair.getKey();
- const double Score = Pair.getValue().Score;
- Function.ScoresGeoMean *= Score;
- const auto G = Grade::judge(Score);
- ++(Function.GradeHisto[G]);
- Function.PerDistributionData[Distribution].Grade = G;
- }
- }
-
- for (FunctionData &Function : Functions) {
- const auto &GradeHisto = Function.GradeHisto;
- const size_t Votes =
- std::accumulate(GradeHisto.begin(), GradeHisto.end(), 0U);
- const size_t MedianVote = Votes / 2;
- size_t CountedVotes = 0;
- Grade::GradeEnum MedianGrade = Grade::BAD;
- for (size_t I = 0; I < GradeHisto.size(); ++I) {
- CountedVotes += GradeHisto[I];
- if (CountedVotes > MedianVote) {
- MedianGrade = Grade::GradeEnum(I);
- break;
- }
- }
- Function.FinalGrade = MedianGrade;
- }
-}
-
-} // namespace automemcpy
-} // namespace llvm
diff --git a/libc/benchmarks/automemcpy/lib/ResultAnalyzerMain.cpp b/libc/benchmarks/automemcpy/lib/ResultAnalyzerMain.cpp
deleted file mode 100644
index 00eef73a3f38..000000000000
--- a/libc/benchmarks/automemcpy/lib/ResultAnalyzerMain.cpp
+++ /dev/null
@@ -1,175 +0,0 @@
-//===-- Application to analyze benchmark JSON files -----------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "automemcpy/ResultAnalyzer.h"
-#include "llvm/ADT/StringMap.h"
-#include "llvm/ADT/StringSet.h"
-#include "llvm/Support/CommandLine.h"
-#include "llvm/Support/Error.h"
-#include "llvm/Support/JSON.h"
-#include "llvm/Support/MemoryBuffer.h"
-
-namespace llvm {
-
-// User can specify one or more json filenames to process on the command line.
-static cl::list<std::string> InputFilenames(cl::Positional, cl::OneOrMore,
- cl::desc("<input json files>"));
-
-// User can filter the distributions to be taken into account.
-static cl::list<std::string>
- KeepOnlyDistributions("keep-only-distributions",
- cl::desc("<comma separated list of distribution "
- "names, keeps all if unspecified>"));
-
-namespace automemcpy {
-
-// This is defined in the autogenerated 'Implementations.cpp' file.
-extern ArrayRef<NamedFunctionDescriptor> getFunctionDescriptors();
-
-// Iterates over all functions and fills a map of function name to function
-// descriptor pointers.
-static StringMap<const FunctionDescriptor *> createFunctionDescriptorMap() {
- StringMap<const FunctionDescriptor *> Descriptors;
- for (const NamedFunctionDescriptor &FD : getFunctionDescriptors())
- Descriptors.insert_or_assign(FD.Name, &FD.Desc);
- return Descriptors;
-}
-
-// Retrieves the function descriptor for a particular function name.
-static const FunctionDescriptor &getFunctionDescriptor(StringRef FunctionName) {
- static StringMap<const FunctionDescriptor *> Descriptors =
- createFunctionDescriptorMap();
- const auto *FD = Descriptors.lookup(FunctionName);
- if (!FD)
- report_fatal_error(
- Twine("No FunctionDescriptor for ").concat(FunctionName));
- return *FD;
-}
-
-// Functions and distributions names are stored quite a few times so it's more
-// efficient to internalize these strings and refer to them through 'StringRef'.
-static StringRef getInternalizedString(StringRef VolatileStr) {
- static llvm::StringSet StringCache;
- return StringCache.insert(VolatileStr).first->getKey();
-}
-
-// Helper function for the LLVM JSON API.
-bool fromJSON(const json::Value &V, Sample &Out, json::Path P) {
- std::string Label;
- std::string RunType;
- json::ObjectMapper O(V, P);
- if (O && O.map("bytes_per_second", Out.BytesPerSecond) &&
- O.map("run_type", RunType) && O.map("label", Label)) {
- const auto LabelPair = StringRef(Label).split(',');
- Out.Id.Function.Name = getInternalizedString(LabelPair.first);
- Out.Id.Function.Type = getFunctionDescriptor(LabelPair.first).Type;
- Out.Id.Distribution.Name = getInternalizedString(LabelPair.second);
- Out.Type = StringSwitch<SampleType>(RunType)
- .Case("aggregate", SampleType::AGGREGATE)
- .Case("iteration", SampleType::ITERATION);
- return true;
- }
- return false;
-}
-
-// An object to represent the content of the JSON file.
-// This is easier to parse/serialize JSON when the structures of the json file
-// maps the structure of the object.
-struct JsonFile {
- std::vector<Sample> Samples;
-};
-
-// Helper function for the LLVM JSON API.
-bool fromJSON(const json::Value &V, JsonFile &JF, json::Path P) {
- json::ObjectMapper O(V, P);
- return O && O.map("benchmarks", JF.Samples);
-}
-
-// Global object to ease error reporting, it consumes errors and crash the
-// application with a meaningful message.
-static ExitOnError ExitOnErr;
-
-// Main JSON parsing method. Reads the content of the file pointed to by
-// 'Filename' and returns a JsonFile object.
-JsonFile parseJsonResultFile(StringRef Filename) {
- auto Buf = ExitOnErr(errorOrToExpected(
- MemoryBuffer::getFile(Filename, /*bool IsText=*/true,
- /*RequiresNullTerminator=*/false)));
- auto JsonValue = ExitOnErr(json::parse(Buf->getBuffer()));
- json::Path::Root Root;
- JsonFile JF;
- if (!fromJSON(JsonValue, JF, Root))
- ExitOnErr(Root.getError());
- return JF;
-}
-
-// Serializes the 'GradeHisto' to the provided 'Stream'.
-static void Serialize(raw_ostream &Stream, const GradeHistogram &GH) {
- static constexpr std::array<StringRef, 9> kCharacters = {
- " ", "▁", "▂", "▃", "▄", "▅", "▆", "▇", "█"};
-
- const size_t Max = *std::max_element(GH.begin(), GH.end());
- for (size_t I = 0; I < GH.size(); ++I) {
- size_t Index = (float(GH[I]) / Max) * (kCharacters.size() - 1);
- Stream << kCharacters.at(Index);
- }
-}
-
-int Main(int argc, char **argv) {
- ExitOnErr.setBanner("Automemcpy Json Results Analyzer stopped with error: ");
- cl::ParseCommandLineOptions(argc, argv, "Automemcpy Json Results Analyzer\n");
-
- // Reads all samples stored in the input JSON files.
- std::vector<Sample> Samples;
- for (const auto &Filename : InputFilenames) {
- auto Result = parseJsonResultFile(Filename);
- llvm::append_range(Samples, Result.Samples);
- }
-
- if (!KeepOnlyDistributions.empty()) {
- llvm::StringSet ValidDistributions;
- ValidDistributions.insert(KeepOnlyDistributions.begin(),
- KeepOnlyDistributions.end());
- llvm::erase_if(Samples, [&ValidDistributions](const Sample &S) {
- return !ValidDistributions.contains(S.Id.Distribution.Name);
- });
- }
-
- // Extracts median of throughputs.
- std::vector<FunctionData> Functions = getThroughputs(Samples);
- fillScores(Functions);
- castVotes(Functions);
-
- // Present data by function type, Grade and Geomean of scores.
- std::sort(Functions.begin(), Functions.end(),
- [](const FunctionData &A, const FunctionData &B) {
- const auto Less = [](const FunctionData &FD) {
- return std::make_tuple(FD.Id.Type, FD.FinalGrade,
- -FD.ScoresGeoMean);
- };
- return Less(A) < Less(B);
- });
-
- // Print result.
- for (const FunctionData &Function : Functions) {
- outs() << formatv("{0,-10}", Grade::getString(Function.FinalGrade));
- outs() << " |";
- Serialize(outs(), Function.GradeHisto);
- outs() << "| ";
- outs().resetColor();
- outs() << formatv("{0,+25}", Function.Id.Name);
- outs() << "\n";
- }
-
- return EXIT_SUCCESS;
-}
-
-} // namespace automemcpy
-} // namespace llvm
-
-int main(int argc, char **argv) { return llvm::automemcpy::Main(argc, argv); }
diff --git a/libc/benchmarks/automemcpy/unittests/CMakeLists.txt b/libc/benchmarks/automemcpy/unittests/CMakeLists.txt
deleted file mode 100644
index 35caaac1519b..000000000000
--- a/libc/benchmarks/automemcpy/unittests/CMakeLists.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-add_libc_benchmark_unittest(libc-automemcpy-codegen-test
- SRCS CodeGenTest.cpp
- DEPENDS automemcpy_codegen
-)
-
-add_libc_benchmark_unittest(libc-automemcpy-result-analyzer-test
- SRCS ResultAnalyzerTest.cpp
- DEPENDS automemcpy_result_analyzer_lib
-)
diff --git a/libc/benchmarks/automemcpy/unittests/CodeGenTest.cpp b/libc/benchmarks/automemcpy/unittests/CodeGenTest.cpp
deleted file mode 100644
index a7fc8570a73b..000000000000
--- a/libc/benchmarks/automemcpy/unittests/CodeGenTest.cpp
+++ /dev/null
@@ -1,226 +0,0 @@
-//===-- Automemcpy CodeGen Test -------------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "automemcpy/CodeGen.h"
-#include "automemcpy/RandomFunctionGenerator.h"
-#include "src/__support/macros/config.h"
-#include "gmock/gmock.h"
-#include "gtest/gtest.h"
-#include <optional>
-
-using testing::AllOf;
-using testing::AnyOf;
-using testing::ElementsAre;
-using testing::Ge;
-using testing::Gt;
-using testing::Le;
-using testing::Lt;
-
-namespace llvm {
-namespace automemcpy {
-namespace {
-
-TEST(Automemcpy, Codegen) {
- static constexpr FunctionDescriptor kDescriptors[] = {
- {FunctionType::MEMCPY, std::nullopt, std::nullopt, std::nullopt, std::nullopt,
- Accelerator{{0, kMaxSize}}, ElementTypeClass::NATIVE},
- {FunctionType::MEMCPY, Contiguous{{0, 4}}, Overlap{{4, 256}},
- Loop{{256, kMaxSize}, 64}, std::nullopt, std::nullopt,
- ElementTypeClass::NATIVE},
- {FunctionType::MEMCMP, Contiguous{{0, 2}}, Overlap{{2, 64}}, std::nullopt,
- AlignedLoop{Loop{{64, kMaxSize}, 16}, 16, AlignArg::_1}, std::nullopt,
- ElementTypeClass::NATIVE},
- {FunctionType::MEMSET, Contiguous{{0, 2}}, Overlap{{2, 256}}, std::nullopt,
- AlignedLoop{Loop{{256, kMaxSize}, 32}, 16, AlignArg::_1}, std::nullopt,
- ElementTypeClass::NATIVE},
- {FunctionType::MEMSET, Contiguous{{0, 2}}, Overlap{{2, 256}}, std::nullopt,
- AlignedLoop{Loop{{256, kMaxSize}, 32}, 32, AlignArg::_1}, std::nullopt,
- ElementTypeClass::NATIVE},
- {FunctionType::BZERO, Contiguous{{0, 4}}, Overlap{{4, 128}}, std::nullopt,
- AlignedLoop{Loop{{128, kMaxSize}, 32}, 32, AlignArg::_1}, std::nullopt,
- ElementTypeClass::NATIVE},
- };
-
- std::string Output;
- raw_string_ostream OutputStream(Output);
- Serialize(OutputStream, kDescriptors);
-
- EXPECT_STREQ(Output.c_str(),
- R"(// This file is auto-generated by libc/benchmarks/automemcpy.
-// Functions : 6
-
-#include "LibcFunctionPrototypes.h"
-#include "automemcpy/FunctionDescriptor.h"
-#include "src/string/memory_utils/elements.h"
-
-using llvm::libc_benchmarks::BzeroConfiguration;
-using llvm::libc_benchmarks::MemcmpOrBcmpConfiguration;
-using llvm::libc_benchmarks::MemcpyConfiguration;
-using llvm::libc_benchmarks::MemmoveConfiguration;
-using llvm::libc_benchmarks::MemsetConfiguration;
-
-namespace LIBC_NAMESPACE_DECL {
-
-static void memcpy_0xE00E29EE73994E2B(char *__restrict dst, const char *__restrict src, size_t size) {
- using namespace LIBC_NAMESPACE::x86;
- return copy<Accelerator>(dst, src, size);
-}
-static void memcpy_0x7381B60C7BE75EF9(char *__restrict dst, const char *__restrict src, size_t size) {
- using namespace LIBC_NAMESPACE::x86;
- if(size == 0) return;
- if(size == 1) return copy<_1>(dst, src);
- if(size == 2) return copy<_2>(dst, src);
- if(size == 3) return copy<_3>(dst, src);
- if(size < 8) return copy<HeadTail<_4>>(dst, src, size);
- if(size < 16) return copy<HeadTail<_8>>(dst, src, size);
- if(size < 32) return copy<HeadTail<_16>>(dst, src, size);
- if(size < 64) return copy<HeadTail<_32>>(dst, src, size);
- if(size < 128) return copy<HeadTail<_64>>(dst, src, size);
- if(size < 256) return copy<HeadTail<_128>>(dst, src, size);
- return copy<Loop<_64>>(dst, src, size);
-}
-static int memcmp_0x348D7BA6DB0EE033(const char * lhs, const char * rhs, size_t size) {
- using namespace LIBC_NAMESPACE::x86;
- if(size == 0) return 0;
- if(size == 1) return three_way_compare<_1>(lhs, rhs);
- if(size < 4) return three_way_compare<HeadTail<_2>>(lhs, rhs, size);
- if(size < 8) return three_way_compare<HeadTail<_4>>(lhs, rhs, size);
- if(size < 16) return three_way_compare<HeadTail<_8>>(lhs, rhs, size);
- if(size < 32) return three_way_compare<HeadTail<_16>>(lhs, rhs, size);
- if(size < 64) return three_way_compare<HeadTail<_32>>(lhs, rhs, size);
- return three_way_compare<Align<_16,Arg::Lhs>::Then<Loop<_16>>>(lhs, rhs, size);
-}
-static void memset_0x71E761699B999863(char * dst, int value, size_t size) {
- using namespace LIBC_NAMESPACE::x86;
- if(size == 0) return;
- if(size == 1) return splat_set<_1>(dst, value);
- if(size < 4) return splat_set<HeadTail<_2>>(dst, value, size);
- if(size < 8) return splat_set<HeadTail<_4>>(dst, value, size);
- if(size < 16) return splat_set<HeadTail<_8>>(dst, value, size);
- if(size < 32) return splat_set<HeadTail<_16>>(dst, value, size);
- if(size < 64) return splat_set<HeadTail<_32>>(dst, value, size);
- if(size < 128) return splat_set<HeadTail<_64>>(dst, value, size);
- if(size < 256) return splat_set<HeadTail<_128>>(dst, value, size);
- return splat_set<Align<_16,Arg::Dst>::Then<Loop<_32>>>(dst, value, size);
-}
-static void memset_0x3DF0F44E2ED6A50F(char * dst, int value, size_t size) {
- using namespace LIBC_NAMESPACE::x86;
- if(size == 0) return;
- if(size == 1) return splat_set<_1>(dst, value);
- if(size < 4) return splat_set<HeadTail<_2>>(dst, value, size);
- if(size < 8) return splat_set<HeadTail<_4>>(dst, value, size);
- if(size < 16) return splat_set<HeadTail<_8>>(dst, value, size);
- if(size < 32) return splat_set<HeadTail<_16>>(dst, value, size);
- if(size < 64) return splat_set<HeadTail<_32>>(dst, value, size);
- if(size < 128) return splat_set<HeadTail<_64>>(dst, value, size);
- if(size < 256) return splat_set<HeadTail<_128>>(dst, value, size);
- return splat_set<Align<_32,Arg::Dst>::Then<Loop<_32>>>(dst, value, size);
-}
-static void bzero_0x475977492C218AD4(char * dst, size_t size) {
- using namespace LIBC_NAMESPACE::x86;
- if(size == 0) return;
- if(size == 1) return splat_set<_1>(dst, 0);
- if(size == 2) return splat_set<_2>(dst, 0);
- if(size == 3) return splat_set<_3>(dst, 0);
- if(size < 8) return splat_set<HeadTail<_4>>(dst, 0, size);
- if(size < 16) return splat_set<HeadTail<_8>>(dst, 0, size);
- if(size < 32) return splat_set<HeadTail<_16>>(dst, 0, size);
- if(size < 64) return splat_set<HeadTail<_32>>(dst, 0, size);
- if(size < 128) return splat_set<HeadTail<_64>>(dst, 0, size);
- return splat_set<Align<_32,Arg::Dst>::Then<Loop<_32>>>(dst, 0, size);
-}
-
-} // namespace LIBC_NAMESPACE_DECL
-
-namespace llvm {
-namespace automemcpy {
-
-ArrayRef<NamedFunctionDescriptor> getFunctionDescriptors() {
- static constexpr NamedFunctionDescriptor kDescriptors[] = {
- {"memcpy_0xE00E29EE73994E2B",{FunctionType::MEMCPY,std::nullopt,std::nullopt,std::nullopt,std::nullopt,Accelerator{{0,kMaxSize}},ElementTypeClass::NATIVE}},
- {"memcpy_0x7381B60C7BE75EF9",{FunctionType::MEMCPY,Contiguous{{0,4}},Overlap{{4,256}},Loop{{256,kMaxSize},64},std::nullopt,std::nullopt,ElementTypeClass::NATIVE}},
- {"memcmp_0x348D7BA6DB0EE033",{FunctionType::MEMCMP,Contiguous{{0,2}},Overlap{{2,64}},std::nullopt,AlignedLoop{Loop{{64,kMaxSize},16},16,AlignArg::_1},std::nullopt,ElementTypeClass::NATIVE}},
- {"memset_0x71E761699B999863",{FunctionType::MEMSET,Contiguous{{0,2}},Overlap{{2,256}},std::nullopt,AlignedLoop{Loop{{256,kMaxSize},32},16,AlignArg::_1},std::nullopt,ElementTypeClass::NATIVE}},
- {"memset_0x3DF0F44E2ED6A50F",{FunctionType::MEMSET,Contiguous{{0,2}},Overlap{{2,256}},std::nullopt,AlignedLoop{Loop{{256,kMaxSize},32},32,AlignArg::_1},std::nullopt,ElementTypeClass::NATIVE}},
- {"bzero_0x475977492C218AD4",{FunctionType::BZERO,Contiguous{{0,4}},Overlap{{4,128}},std::nullopt,AlignedLoop{Loop{{128,kMaxSize},32},32,AlignArg::_1},std::nullopt,ElementTypeClass::NATIVE}},
- };
- return ArrayRef(kDescriptors);
-}
-
-} // namespace automemcpy
-} // namespace llvm
-
-
-using MemcpyStub = void (*)(char *__restrict, const char *__restrict, size_t);
-template <MemcpyStub Foo>
-void *Wrap(void *__restrict dst, const void *__restrict src, size_t size) {
- Foo(reinterpret_cast<char *__restrict>(dst),
- reinterpret_cast<const char *__restrict>(src), size);
- return dst;
-}
-llvm::ArrayRef<MemcpyConfiguration> getMemcpyConfigurations() {
- using namespace LIBC_NAMESPACE;
- static constexpr MemcpyConfiguration kConfigurations[] = {
- {Wrap<memcpy_0xE00E29EE73994E2B>, "memcpy_0xE00E29EE73994E2B"},
- {Wrap<memcpy_0x7381B60C7BE75EF9>, "memcpy_0x7381B60C7BE75EF9"},
- };
- return llvm::ArrayRef(kConfigurations);
-}
-
-using MemcmpStub = int (*)(const char *, const char *, size_t);
-template <MemcmpStub Foo>
-int Wrap(const void *lhs, const void *rhs, size_t size) {
- return Foo(reinterpret_cast<const char *>(lhs),
- reinterpret_cast<const char *>(rhs), size);
-}
-llvm::ArrayRef<MemcmpOrBcmpConfiguration> getMemcmpConfigurations() {
- using namespace LIBC_NAMESPACE;
- static constexpr MemcmpOrBcmpConfiguration kConfigurations[] = {
- {Wrap<memcmp_0x348D7BA6DB0EE033>, "memcmp_0x348D7BA6DB0EE033"},
- };
- return llvm::ArrayRef(kConfigurations);
-}
-llvm::ArrayRef<MemcmpOrBcmpConfiguration> getBcmpConfigurations() {
- return {};
-}
-
-using MemsetStub = void (*)(char *, int, size_t);
-template <MemsetStub Foo> void *Wrap(void *dst, int value, size_t size) {
- Foo(reinterpret_cast<char *>(dst), value, size);
- return dst;
-}
-llvm::ArrayRef<MemsetConfiguration> getMemsetConfigurations() {
- using namespace LIBC_NAMESPACE;
- static constexpr MemsetConfiguration kConfigurations[] = {
- {Wrap<memset_0x71E761699B999863>, "memset_0x71E761699B999863"},
- {Wrap<memset_0x3DF0F44E2ED6A50F>, "memset_0x3DF0F44E2ED6A50F"},
- };
- return llvm::ArrayRef(kConfigurations);
-}
-
-using BzeroStub = void (*)(char *, size_t);
-template <BzeroStub Foo> void Wrap(void *dst, size_t size) {
- Foo(reinterpret_cast<char *>(dst), size);
-}
-llvm::ArrayRef<BzeroConfiguration> getBzeroConfigurations() {
- using namespace LIBC_NAMESPACE;
- static constexpr BzeroConfiguration kConfigurations[] = {
- {Wrap<bzero_0x475977492C218AD4>, "bzero_0x475977492C218AD4"},
- };
- return llvm::ArrayRef(kConfigurations);
-}
-
-llvm::ArrayRef<MemmoveConfiguration> getMemmoveConfigurations() {
- return {};
-}
-// Functions : 6
-)");
-}
-} // namespace
-} // namespace automemcpy
-} // namespace llvm
diff --git a/libc/benchmarks/automemcpy/unittests/ResultAnalyzerTest.cpp b/libc/benchmarks/automemcpy/unittests/ResultAnalyzerTest.cpp
deleted file mode 100644
index 7b67f70eb89c..000000000000
--- a/libc/benchmarks/automemcpy/unittests/ResultAnalyzerTest.cpp
+++ /dev/null
@@ -1,191 +0,0 @@
-//===-- Automemcpy Json Results Analyzer Test ----------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "automemcpy/ResultAnalyzer.h"
-#include "gmock/gmock.h"
-#include "gtest/gtest.h"
-
-using testing::DoubleNear;
-using testing::ElementsAre;
-using testing::Pair;
-using testing::SizeIs;
-
-namespace llvm {
-namespace automemcpy {
-namespace {
-
-TEST(AutomemcpyJsonResultsAnalyzer, getThroughputsOneSample) {
- static constexpr FunctionId Foo1 = {"memcpy1", FunctionType::MEMCPY};
- static constexpr DistributionId DistA = {{"A"}};
- static constexpr SampleId Id = {Foo1, DistA};
- static constexpr Sample kSamples[] = {
- Sample{Id, SampleType::ITERATION, 4},
- Sample{Id, SampleType::AGGREGATE, -1}, // Aggegates gets discarded
- };
-
- const std::vector<FunctionData> Data = getThroughputs(kSamples);
- EXPECT_THAT(Data, SizeIs(1));
- EXPECT_THAT(Data[0].Id, Foo1);
- EXPECT_THAT(Data[0].PerDistributionData, SizeIs(1));
- // A single value is provided.
- const auto &DistributionData = Data[0].PerDistributionData.lookup(DistA.Name);
- EXPECT_THAT(DistributionData.BytesPerSecondMedian, 4);
- EXPECT_THAT(DistributionData.BytesPerSecondMean, 4);
- EXPECT_THAT(DistributionData.BytesPerSecondVariance, 0);
-}
-
-TEST(AutomemcpyJsonResultsAnalyzer, getThroughputsManySamplesSameBucket) {
- static constexpr FunctionId Foo1 = {"memcpy1", FunctionType::MEMCPY};
- static constexpr DistributionId DistA = {{"A"}};
- static constexpr SampleId Id = {Foo1, DistA};
- static constexpr Sample kSamples[] = {Sample{Id, SampleType::ITERATION, 4},
- Sample{Id, SampleType::ITERATION, 5},
- Sample{Id, SampleType::ITERATION, 5}};
-
- const std::vector<FunctionData> Data = getThroughputs(kSamples);
- EXPECT_THAT(Data, SizeIs(1));
- EXPECT_THAT(Data[0].Id, Foo1);
- EXPECT_THAT(Data[0].PerDistributionData, SizeIs(1));
- // When multiple values are provided we pick the median one (here median of 4,
- // 5, 5).
- const auto &DistributionData = Data[0].PerDistributionData.lookup(DistA.Name);
- EXPECT_THAT(DistributionData.BytesPerSecondMedian, 5);
- EXPECT_THAT(DistributionData.BytesPerSecondMean, DoubleNear(4.6, 0.1));
- EXPECT_THAT(DistributionData.BytesPerSecondVariance, DoubleNear(0.33, 0.01));
-}
-
-TEST(AutomemcpyJsonResultsAnalyzer, getThroughputsServeralFunctionAndDist) {
- static constexpr FunctionId Foo1 = {"memcpy1", FunctionType::MEMCPY};
- static constexpr DistributionId DistA = {{"A"}};
- static constexpr FunctionId Foo2 = {"memcpy2", FunctionType::MEMCPY};
- static constexpr DistributionId DistB = {{"B"}};
- static constexpr Sample kSamples[] = {
- Sample{{Foo1, DistA}, SampleType::ITERATION, 1},
- Sample{{Foo1, DistB}, SampleType::ITERATION, 2},
- Sample{{Foo2, DistA}, SampleType::ITERATION, 3},
- Sample{{Foo2, DistB}, SampleType::ITERATION, 4}};
- // Data is aggregated per function.
- const std::vector<FunctionData> Data = getThroughputs(kSamples);
- EXPECT_THAT(Data, SizeIs(2)); // 2 functions Foo1 and Foo2.
- // Each function has data for both distributions DistA and DistB.
- EXPECT_THAT(Data[0].PerDistributionData, SizeIs(2));
- EXPECT_THAT(Data[1].PerDistributionData, SizeIs(2));
-}
-
-TEST(AutomemcpyJsonResultsAnalyzer, getScore) {
- static constexpr FunctionId Foo1 = {"memcpy1", FunctionType::MEMCPY};
- static constexpr FunctionId Foo2 = {"memcpy2", FunctionType::MEMCPY};
- static constexpr FunctionId Foo3 = {"memcpy3", FunctionType::MEMCPY};
- static constexpr DistributionId Dist = {{"A"}};
- static constexpr Sample kSamples[] = {
- Sample{{Foo1, Dist}, SampleType::ITERATION, 1},
- Sample{{Foo2, Dist}, SampleType::ITERATION, 2},
- Sample{{Foo3, Dist}, SampleType::ITERATION, 3}};
-
- // Data is aggregated per function.
- std::vector<FunctionData> Data = getThroughputs(kSamples);
-
- // Sort Data by function name so we can test them.
- std::sort(
- Data.begin(), Data.end(),
- [](const FunctionData &A, const FunctionData &B) { return A.Id < B.Id; });
-
- EXPECT_THAT(Data[0].Id, Foo1);
- EXPECT_THAT(Data[0].PerDistributionData.lookup("A").BytesPerSecondMedian, 1);
- EXPECT_THAT(Data[1].Id, Foo2);
- EXPECT_THAT(Data[1].PerDistributionData.lookup("A").BytesPerSecondMedian, 2);
- EXPECT_THAT(Data[2].Id, Foo3);
- EXPECT_THAT(Data[2].PerDistributionData.lookup("A").BytesPerSecondMedian, 3);
-
- // Normalizes throughput per distribution.
- fillScores(Data);
- EXPECT_THAT(Data[0].PerDistributionData.lookup("A").Score, 0);
- EXPECT_THAT(Data[1].PerDistributionData.lookup("A").Score, 0.5);
- EXPECT_THAT(Data[2].PerDistributionData.lookup("A").Score, 1);
-}
-
-TEST(AutomemcpyJsonResultsAnalyzer, castVotes) {
- static constexpr double kAbsErr = 0.01;
-
- static constexpr FunctionId Foo1 = {"memcpy1", FunctionType::MEMCPY};
- static constexpr FunctionId Foo2 = {"memcpy2", FunctionType::MEMCPY};
- static constexpr FunctionId Foo3 = {"memcpy3", FunctionType::MEMCPY};
- static constexpr DistributionId DistA = {{"A"}};
- static constexpr DistributionId DistB = {{"B"}};
- static constexpr Sample kSamples[] = {
- Sample{{Foo1, DistA}, SampleType::ITERATION, 0},
- Sample{{Foo1, DistB}, SampleType::ITERATION, 30},
- Sample{{Foo2, DistA}, SampleType::ITERATION, 1},
- Sample{{Foo2, DistB}, SampleType::ITERATION, 100},
- Sample{{Foo3, DistA}, SampleType::ITERATION, 7},
- Sample{{Foo3, DistB}, SampleType::ITERATION, 100},
- };
-
- // DistA Thoughput ranges from 0 to 7.
- // DistB Thoughput ranges from 30 to 100.
-
- // Data is aggregated per function.
- std::vector<FunctionData> Data = getThroughputs(kSamples);
-
- // Sort Data by function name so we can test them.
- std::sort(
- Data.begin(), Data.end(),
- [](const FunctionData &A, const FunctionData &B) { return A.Id < B.Id; });
-
- // Normalizes throughput per distribution.
- fillScores(Data);
-
- // Cast votes
- castVotes(Data);
-
- EXPECT_THAT(Data[0].Id, Foo1);
- EXPECT_THAT(Data[1].Id, Foo2);
- EXPECT_THAT(Data[2].Id, Foo3);
-
- const auto GetDistData = [&Data](size_t Index, StringRef Name) {
- return Data[Index].PerDistributionData.lookup(Name);
- };
-
- // Distribution A
- // Throughput is 0, 1 and 7, so normalized scores are 0, 1/7 and 1.
- EXPECT_THAT(GetDistData(0, "A").Score, DoubleNear(0, kAbsErr));
- EXPECT_THAT(GetDistData(1, "A").Score, DoubleNear(1. / 7, kAbsErr));
- EXPECT_THAT(GetDistData(2, "A").Score, DoubleNear(1, kAbsErr));
- // which are turned into grades BAD, MEDIOCRE and EXCELLENT.
- EXPECT_THAT(GetDistData(0, "A").Grade, Grade::BAD);
- EXPECT_THAT(GetDistData(1, "A").Grade, Grade::MEDIOCRE);
- EXPECT_THAT(GetDistData(2, "A").Grade, Grade::EXCELLENT);
-
- // Distribution B
- // Throughput is 30, 100 and 100, so normalized scores are 0, 1 and 1.
- EXPECT_THAT(GetDistData(0, "B").Score, DoubleNear(0, kAbsErr));
- EXPECT_THAT(GetDistData(1, "B").Score, DoubleNear(1, kAbsErr));
- EXPECT_THAT(GetDistData(2, "B").Score, DoubleNear(1, kAbsErr));
- // which are turned into grades BAD, EXCELLENT and EXCELLENT.
- EXPECT_THAT(GetDistData(0, "B").Grade, Grade::BAD);
- EXPECT_THAT(GetDistData(1, "B").Grade, Grade::EXCELLENT);
- EXPECT_THAT(GetDistData(2, "B").Grade, Grade::EXCELLENT);
-
- // Now looking from the functions point of view.
- EXPECT_THAT(Data[0].ScoresGeoMean, DoubleNear(0, kAbsErr));
- EXPECT_THAT(Data[1].ScoresGeoMean, DoubleNear(1. * (1. / 7), kAbsErr));
- EXPECT_THAT(Data[2].ScoresGeoMean, DoubleNear(1, kAbsErr));
-
- // Note the array is indexed by GradeEnum values (EXCELLENT=0 / BAD = 6)
- EXPECT_THAT(Data[0].GradeHisto, ElementsAre(0, 0, 0, 0, 0, 0, 2));
- EXPECT_THAT(Data[1].GradeHisto, ElementsAre(1, 0, 0, 0, 0, 1, 0));
- EXPECT_THAT(Data[2].GradeHisto, ElementsAre(2, 0, 0, 0, 0, 0, 0));
-
- EXPECT_THAT(Data[0].FinalGrade, Grade::BAD);
- EXPECT_THAT(Data[1].FinalGrade, Grade::MEDIOCRE);
- EXPECT_THAT(Data[2].FinalGrade, Grade::EXCELLENT);
-}
-
-} // namespace
-} // namespace automemcpy
-} // namespace llvm
diff --git a/libc/cmake/modules/CheckCompilerFeatures.cmake b/libc/cmake/modules/CheckCompilerFeatures.cmake
index 862c7ecbd7fd..a5ea66a5935b 100644
--- a/libc/cmake/modules/CheckCompilerFeatures.cmake
+++ b/libc/cmake/modules/CheckCompilerFeatures.cmake
@@ -13,6 +13,8 @@ set(
"float16_conversion"
"float128"
"fixed_point"
+ "cfloat16"
+ "cfloat128"
)
# Making sure ALL_COMPILER_FEATURES is sorted.
@@ -110,6 +112,10 @@ foreach(feature IN LISTS ALL_COMPILER_FEATURES)
set(LIBC_TYPES_HAS_FLOAT128 TRUE)
elseif(${feature} STREQUAL "fixed_point")
set(LIBC_COMPILER_HAS_FIXED_POINT TRUE)
+ elseif(${feature} STREQUAL "cfloat16")
+ set(LIBC_TYPES_HAS_CFLOAT16 TRUE)
+ elseif(${feature} STREQUAL "cfloat128")
+ set(LIBC_TYPES_HAS_CFLOAT128 TRUE)
elseif(${feature} STREQUAL "builtin_ceil_floor_rint_trunc")
set(LIBC_COMPILER_HAS_BUILTIN_CEIL_FLOOR_RINT_TRUNC TRUE)
elseif(${feature} STREQUAL "builtin_fmax_fmin")
diff --git a/libc/cmake/modules/LLVMLibCCompileOptionRules.cmake b/libc/cmake/modules/LLVMLibCCompileOptionRules.cmake
index 65851f1c8657..8dcee1ec4224 100644
--- a/libc/cmake/modules/LLVMLibCCompileOptionRules.cmake
+++ b/libc/cmake/modules/LLVMLibCCompileOptionRules.cmake
@@ -1,3 +1,15 @@
+if(NOT DEFINED LLVM_LIBC_COMPILER_IS_GCC_COMPATIBLE)
+ if(CMAKE_COMPILER_IS_GNUCXX)
+ set(LLVM_LIBC_COMPILER_IS_GCC_COMPATIBLE ON)
+ elseif( MSVC )
+ set(LLVM_LIBC_COMPILER_IS_GCC_COMPATIBLE OFF)
+ elseif( "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" )
+ set(LLVM_LIBC_COMPILER_IS_GCC_COMPATIBLE ON)
+ elseif( "${CMAKE_CXX_COMPILER_ID}" MATCHES "Intel" )
+ set(LLVM_LIBC_COMPILER_IS_GCC_COMPATIBLE ON)
+ endif()
+endif()
+
function(_get_compile_options_from_flags output_var)
set(compile_options "")
@@ -8,7 +20,7 @@ function(_get_compile_options_from_flags output_var)
check_flag(ADD_EXPLICIT_SIMD_OPT_FLAG ${EXPLICIT_SIMD_OPT_FLAG} ${ARGN})
check_flag(ADD_MISC_MATH_BASIC_OPS_OPT_FLAG ${MISC_MATH_BASIC_OPS_OPT_FLAG} ${ARGN})
- if(LLVM_COMPILER_IS_GCC_COMPATIBLE)
+ if(LLVM_LIBC_COMPILER_IS_GCC_COMPATIBLE)
if(ADD_FMA_FLAG)
if(LIBC_TARGET_ARCHITECTURE_IS_X86_64)
list(APPEND compile_options "-mavx2")
@@ -96,7 +108,7 @@ function(_get_common_compile_options output_var flags)
set(compile_options ${LIBC_COMPILE_OPTIONS_DEFAULT} ${compile_flags} ${config_flags})
- if(LLVM_COMPILER_IS_GCC_COMPATIBLE)
+ if(LLVM_LIBC_COMPILER_IS_GCC_COMPATIBLE)
list(APPEND compile_options "-fpie")
if(LLVM_LIBC_FULL_BUILD)
@@ -210,7 +222,7 @@ function(_get_common_test_compile_options output_var c_test flags)
${LIBC_TEST_COMPILE_OPTIONS_DEFAULT}
${compile_flags})
- if(LLVM_COMPILER_IS_GCC_COMPATIBLE)
+ if(LLVM_LIBC_COMPILER_IS_GCC_COMPATIBLE)
list(APPEND compile_options "-fpie")
if(LLVM_LIBC_FULL_BUILD)
diff --git a/libc/cmake/modules/LLVMLibCHeaderRules.cmake b/libc/cmake/modules/LLVMLibCHeaderRules.cmake
index 31a88f0ef93b..0de5e14359cf 100644
--- a/libc/cmake/modules/LLVMLibCHeaderRules.cmake
+++ b/libc/cmake/modules/LLVMLibCHeaderRules.cmake
@@ -110,9 +110,10 @@ function(add_gen_header target_name)
set(entry_points "${TARGET_ENTRYPOINT_NAME_LIST}")
list(TRANSFORM entry_points PREPEND "--e=")
+ set(LIBC_HDRGEN "${LIBC_SOURCE_DIR}/utils/hdrgen/yaml_to_classes.py")
add_custom_command(
OUTPUT ${out_file}
- COMMAND ${Python3_EXECUTABLE} ${LIBC_SOURCE_DIR}/hdrgen/yaml_to_classes.py
+ COMMAND ${Python3_EXECUTABLE} ${LIBC_HDRGEN}
${yaml_file}
--h_def_file ${def_file}
${entry_points}
@@ -126,7 +127,7 @@ function(add_gen_header target_name)
set(decl_out_file ${LIBC_INCLUDE_DIR}/llvm-libc-decls/${relative_path})
add_custom_command(
OUTPUT ${decl_out_file}
- COMMAND ${Python3_EXECUTABLE} ${LIBC_SOURCE_DIR}/hdrgen/yaml_to_classes.py
+ COMMAND ${Python3_EXECUTABLE} ${LIBC_HDRGEN}
${yaml_file}
--export-decls
${entry_points}
diff --git a/libc/cmake/modules/LLVMLibCObjectRules.cmake b/libc/cmake/modules/LLVMLibCObjectRules.cmake
index 68b5ed1ed51c..142778d9ea1c 100644
--- a/libc/cmake/modules/LLVMLibCObjectRules.cmake
+++ b/libc/cmake/modules/LLVMLibCObjectRules.cmake
@@ -452,3 +452,41 @@ function(add_redirector_object target_name)
BEFORE PRIVATE -fPIC ${LIBC_COMPILE_OPTIONS_DEFAULT}
)
endfunction(add_redirector_object)
+
+# Helper to define a function with multiple implementations
+# - Computes flags to satisfy required/rejected features and arch,
+# - Declares an entry point,
+# - Attach the REQUIRE_CPU_FEATURES property to the target,
+# - Add the fully qualified target to `${name}_implementations` global property for tests.
+function(add_implementation name impl_name)
+ cmake_parse_arguments(
+ "ADD_IMPL"
+ "" # Optional arguments
+ "" # Single value arguments
+ "REQUIRE;SRCS;HDRS;DEPENDS;COMPILE_OPTIONS;MLLVM_COMPILE_OPTIONS" # Multi value arguments
+ ${ARGN})
+
+ if("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
+ # Note that '-mllvm' needs to be prefixed with 'SHELL:' to prevent CMake flag deduplication.
+ foreach(opt IN LISTS ADD_IMPL_MLLVM_COMPILE_OPTIONS)
+ list(APPEND ADD_IMPL_COMPILE_OPTIONS "SHELL:-mllvm ${opt}")
+ endforeach()
+ endif()
+
+ if("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU")
+ # Prevent warning when passing x86 SIMD types as template arguments.
+ # e.g. "warning: ignoring attributes on template argument ‘__m128i’ [-Wignored-attributes]"
+ list(APPEND ADD_IMPL_COMPILE_OPTIONS "-Wno-ignored-attributes")
+ endif()
+
+ add_entrypoint_object(${impl_name}
+ NAME ${name}
+ SRCS ${ADD_IMPL_SRCS}
+ HDRS ${ADD_IMPL_HDRS}
+ DEPENDS ${ADD_IMPL_DEPENDS}
+ COMPILE_OPTIONS ${libc_opt_high_flag} ${ADD_IMPL_COMPILE_OPTIONS}
+ )
+ get_fq_target_name(${impl_name} fq_target_name)
+ set_target_properties(${fq_target_name} PROPERTIES REQUIRE_CPU_FEATURES "${ADD_IMPL_REQUIRE}")
+ set_property(GLOBAL APPEND PROPERTY "${name}_implementations" "${fq_target_name}")
+endfunction()
diff --git a/libc/cmake/modules/LLVMLibCTestRules.cmake b/libc/cmake/modules/LLVMLibCTestRules.cmake
index 36f871920c3c..84f3125d557e 100644
--- a/libc/cmake/modules/LLVMLibCTestRules.cmake
+++ b/libc/cmake/modules/LLVMLibCTestRules.cmake
@@ -416,12 +416,12 @@ function(add_integration_test test_name)
libc.test.IntegrationTest.test
# We always add the memory functions objects. This is because the
# compiler's codegen can emit calls to the C memory functions.
- libc.src.string.bcmp
- libc.src.string.bzero
libc.src.string.memcmp
libc.src.string.memcpy
libc.src.string.memmove
libc.src.string.memset
+ libc.src.strings.bcmp
+ libc.src.strings.bzero
)
if(libc.src.compiler.__stack_chk_fail IN_LIST TARGET_LLVMLIBC_ENTRYPOINTS)
@@ -583,13 +583,13 @@ function(add_libc_hermetic test_name)
libc.startup.${LIBC_TARGET_OS}.crt1
# We always add the memory functions objects. This is because the
# compiler's codegen can emit calls to the C memory functions.
- libc.src.string.bcmp
- libc.src.string.bzero
+ libc.src.__support.StringUtil.error_to_string
libc.src.string.memcmp
libc.src.string.memcpy
libc.src.string.memmove
libc.src.string.memset
- libc.src.__support.StringUtil.error_to_string
+ libc.src.strings.bcmp
+ libc.src.strings.bzero
)
if(libc.src.compiler.__stack_chk_fail IN_LIST TARGET_LLVMLIBC_ENTRYPOINTS)
@@ -766,3 +766,33 @@ function(add_libc_test test_name)
endif()
endif()
endfunction(add_libc_test)
+
+# Tests all implementations that can run on the target CPU.
+function(add_libc_multi_impl_test name suite)
+ get_property(fq_implementations GLOBAL PROPERTY ${name}_implementations)
+ foreach(fq_config_name IN LISTS fq_implementations)
+ get_target_property(required_cpu_features ${fq_config_name} REQUIRE_CPU_FEATURES)
+ cpu_supports(can_run "${required_cpu_features}")
+ if(can_run)
+ string(FIND ${fq_config_name} "." last_dot_loc REVERSE)
+ math(EXPR name_loc "${last_dot_loc} + 1")
+ string(SUBSTRING ${fq_config_name} ${name_loc} -1 target_name)
+ add_libc_test(
+ ${target_name}_test
+ SUITE
+ ${suite}
+ COMPILE_OPTIONS
+ ${LIBC_COMPILE_OPTIONS_NATIVE}
+ LINK_LIBRARIES
+ LibcMemoryHelpers
+ ${ARGN}
+ DEPENDS
+ ${fq_config_name}
+ libc.src.__support.macros.sanitizer
+ )
+ get_fq_target_name(${fq_config_name}_test fq_target_name)
+ else()
+ message(STATUS "Skipping test for '${fq_config_name}' insufficient host cpu features '${required_cpu_features}'")
+ endif()
+ endforeach()
+endfunction()
diff --git a/libc/cmake/modules/compiler_features/check_cfloat128.cpp b/libc/cmake/modules/compiler_features/check_cfloat128.cpp
new file mode 100644
index 000000000000..a798ccb98968
--- /dev/null
+++ b/libc/cmake/modules/compiler_features/check_cfloat128.cpp
@@ -0,0 +1,5 @@
+#include "src/__support/macros/properties/complex_types.h"
+
+#ifndef LIBC_TYPES_HAS_CFLOAT128
+#error unsupported
+#endif
diff --git a/libc/cmake/modules/compiler_features/check_cfloat16.cpp b/libc/cmake/modules/compiler_features/check_cfloat16.cpp
new file mode 100644
index 000000000000..31416ff7c6ae
--- /dev/null
+++ b/libc/cmake/modules/compiler_features/check_cfloat16.cpp
@@ -0,0 +1,5 @@
+#include "src/__support/macros/properties/complex_types.h"
+
+#ifndef LIBC_TYPES_HAS_CFLOAT16
+#error unsupported
+#endif
diff --git a/libc/config/baremetal/aarch64/entrypoints.txt b/libc/config/baremetal/aarch64/entrypoints.txt
new file mode 100644
index 000000000000..694cd7b1993c
--- /dev/null
+++ b/libc/config/baremetal/aarch64/entrypoints.txt
@@ -0,0 +1,478 @@
+set(TARGET_LIBC_ENTRYPOINTS
+ # assert.h entrypoints
+ libc.src.assert.__assert_fail
+
+ # ctype.h entrypoints
+ libc.src.ctype.isalnum
+ libc.src.ctype.isalpha
+ libc.src.ctype.isascii
+ libc.src.ctype.isblank
+ libc.src.ctype.iscntrl
+ libc.src.ctype.isdigit
+ libc.src.ctype.isgraph
+ libc.src.ctype.islower
+ libc.src.ctype.isprint
+ libc.src.ctype.ispunct
+ libc.src.ctype.isspace
+ libc.src.ctype.isupper
+ libc.src.ctype.isxdigit
+ libc.src.ctype.toascii
+ libc.src.ctype.tolower
+ libc.src.ctype.toupper
+
+ # compiler entrypoints (no corresponding header)
+ libc.src.compiler.__stack_chk_fail
+
+ # errno.h entrypoints
+ libc.src.errno.errno
+
+ # setjmp.h entrypoints
+ libc.src.setjmp.longjmp
+ libc.src.setjmp.setjmp
+
+ # string.h entrypoints
+ libc.src.string.memccpy
+ libc.src.string.memchr
+ libc.src.string.memcmp
+ libc.src.string.memcpy
+ libc.src.string.memmem
+ libc.src.string.memmove
+ libc.src.string.mempcpy
+ libc.src.string.memrchr
+ libc.src.string.memset
+ libc.src.string.memset_explicit
+ libc.src.string.stpcpy
+ libc.src.string.stpncpy
+ libc.src.string.strcasestr
+ libc.src.string.strcat
+ libc.src.string.strchr
+ libc.src.string.strchrnul
+ libc.src.string.strcmp
+ libc.src.string.strcoll
+ libc.src.string.strcpy
+ libc.src.string.strcspn
+ libc.src.string.strerror
+ libc.src.string.strerror_r
+ libc.src.string.strlcat
+ libc.src.string.strlcpy
+ libc.src.string.strlen
+ libc.src.string.strncat
+ libc.src.string.strncmp
+ libc.src.string.strncpy
+ libc.src.string.strnlen
+ libc.src.string.strpbrk
+ libc.src.string.strrchr
+ libc.src.string.strsep
+ libc.src.string.strspn
+ libc.src.string.strstr
+ libc.src.string.strtok
+ libc.src.string.strtok_r
+ libc.src.string.strxfrm
+
+ # strings.h entrypoints
+ libc.src.strings.bcmp
+ libc.src.strings.bcopy
+ libc.src.strings.bzero
+ libc.src.strings.index
+ libc.src.strings.rindex
+ libc.src.strings.strcasecmp
+ libc.src.strings.strncasecmp
+
+ # inttypes.h entrypoints
+ libc.src.inttypes.imaxabs
+ libc.src.inttypes.imaxdiv
+ libc.src.inttypes.strtoimax
+ libc.src.inttypes.strtoumax
+
+ # stdio.h entrypoints
+ libc.src.stdio.getchar
+ libc.src.stdio.printf
+ libc.src.stdio.putchar
+ libc.src.stdio.puts
+ libc.src.stdio.remove
+ libc.src.stdio.snprintf
+ libc.src.stdio.sprintf
+ libc.src.stdio.asprintf
+ libc.src.stdio.vprintf
+ libc.src.stdio.vsnprintf
+ libc.src.stdio.vsprintf
+ libc.src.stdio.vasprintf
+
+ # stdbit.h entrypoints
+ libc.src.stdbit.stdc_bit_ceil_uc
+ libc.src.stdbit.stdc_bit_ceil_ui
+ libc.src.stdbit.stdc_bit_ceil_ul
+ libc.src.stdbit.stdc_bit_ceil_ull
+ libc.src.stdbit.stdc_bit_ceil_us
+ libc.src.stdbit.stdc_bit_floor_uc
+ libc.src.stdbit.stdc_bit_floor_ui
+ libc.src.stdbit.stdc_bit_floor_ul
+ libc.src.stdbit.stdc_bit_floor_ull
+ libc.src.stdbit.stdc_bit_floor_us
+ libc.src.stdbit.stdc_bit_width_uc
+ libc.src.stdbit.stdc_bit_width_ui
+ libc.src.stdbit.stdc_bit_width_ul
+ libc.src.stdbit.stdc_bit_width_ull
+ libc.src.stdbit.stdc_bit_width_us
+ libc.src.stdbit.stdc_count_ones_uc
+ libc.src.stdbit.stdc_count_ones_ui
+ libc.src.stdbit.stdc_count_ones_ul
+ libc.src.stdbit.stdc_count_ones_ull
+ libc.src.stdbit.stdc_count_ones_us
+ libc.src.stdbit.stdc_count_zeros_uc
+ libc.src.stdbit.stdc_count_zeros_ui
+ libc.src.stdbit.stdc_count_zeros_ul
+ libc.src.stdbit.stdc_count_zeros_ull
+ libc.src.stdbit.stdc_count_zeros_us
+ libc.src.stdbit.stdc_first_leading_one_uc
+ libc.src.stdbit.stdc_first_leading_one_ui
+ libc.src.stdbit.stdc_first_leading_one_ul
+ libc.src.stdbit.stdc_first_leading_one_ull
+ libc.src.stdbit.stdc_first_leading_one_us
+ libc.src.stdbit.stdc_first_leading_zero_uc
+ libc.src.stdbit.stdc_first_leading_zero_ui
+ libc.src.stdbit.stdc_first_leading_zero_ul
+ libc.src.stdbit.stdc_first_leading_zero_ull
+ libc.src.stdbit.stdc_first_leading_zero_us
+ libc.src.stdbit.stdc_first_trailing_one_uc
+ libc.src.stdbit.stdc_first_trailing_one_ui
+ libc.src.stdbit.stdc_first_trailing_one_ul
+ libc.src.stdbit.stdc_first_trailing_one_ull
+ libc.src.stdbit.stdc_first_trailing_one_us
+ libc.src.stdbit.stdc_first_trailing_zero_uc
+ libc.src.stdbit.stdc_first_trailing_zero_ui
+ libc.src.stdbit.stdc_first_trailing_zero_ul
+ libc.src.stdbit.stdc_first_trailing_zero_ull
+ libc.src.stdbit.stdc_first_trailing_zero_us
+ libc.src.stdbit.stdc_has_single_bit_uc
+ libc.src.stdbit.stdc_has_single_bit_ui
+ libc.src.stdbit.stdc_has_single_bit_ul
+ libc.src.stdbit.stdc_has_single_bit_ull
+ libc.src.stdbit.stdc_has_single_bit_us
+ libc.src.stdbit.stdc_leading_ones_uc
+ libc.src.stdbit.stdc_leading_ones_ui
+ libc.src.stdbit.stdc_leading_ones_ul
+ libc.src.stdbit.stdc_leading_ones_ull
+ libc.src.stdbit.stdc_leading_ones_us
+ libc.src.stdbit.stdc_leading_zeros_uc
+ libc.src.stdbit.stdc_leading_zeros_ui
+ libc.src.stdbit.stdc_leading_zeros_ul
+ libc.src.stdbit.stdc_leading_zeros_ull
+ libc.src.stdbit.stdc_leading_zeros_us
+ libc.src.stdbit.stdc_trailing_ones_uc
+ libc.src.stdbit.stdc_trailing_ones_ui
+ libc.src.stdbit.stdc_trailing_ones_ul
+ libc.src.stdbit.stdc_trailing_ones_ull
+ libc.src.stdbit.stdc_trailing_ones_us
+ libc.src.stdbit.stdc_trailing_zeros_uc
+ libc.src.stdbit.stdc_trailing_zeros_ui
+ libc.src.stdbit.stdc_trailing_zeros_ul
+ libc.src.stdbit.stdc_trailing_zeros_ull
+ libc.src.stdbit.stdc_trailing_zeros_us
+
+ # stdlib.h entrypoints
+ libc.src.stdlib._Exit
+ libc.src.stdlib.abort
+ libc.src.stdlib.abs
+ libc.src.stdlib.aligned_alloc
+ libc.src.stdlib.atof
+ libc.src.stdlib.atoi
+ libc.src.stdlib.atol
+ libc.src.stdlib.atoll
+ libc.src.stdlib.bsearch
+ libc.src.stdlib.calloc
+ libc.src.stdlib.div
+ libc.src.stdlib.exit
+ libc.src.stdlib.free
+ libc.src.stdlib.labs
+ libc.src.stdlib.ldiv
+ libc.src.stdlib.llabs
+ libc.src.stdlib.lldiv
+ libc.src.stdlib.malloc
+ libc.src.stdlib.qsort
+ libc.src.stdlib.rand
+ libc.src.stdlib.realloc
+ libc.src.stdlib.srand
+ libc.src.stdlib.strtod
+ libc.src.stdlib.strtof
+ libc.src.stdlib.strtol
+ libc.src.stdlib.strtold
+ libc.src.stdlib.strtoll
+ libc.src.stdlib.strtoul
+ libc.src.stdlib.strtoull
+
+ # time.h entrypoints
+ libc.src.time.asctime
+ libc.src.time.asctime_r
+ libc.src.time.ctime
+ libc.src.time.ctime_r
+ libc.src.time.difftime
+ libc.src.time.gmtime
+ libc.src.time.gmtime_r
+ libc.src.time.mktime
+ libc.src.time.timespec_get
+
+ # internal entrypoints
+ libc.startup.baremetal.init
+ libc.startup.baremetal.fini
+)
+
+set(TARGET_LIBM_ENTRYPOINTS
+ # fenv.h entrypoints
+ libc.src.fenv.feclearexcept
+ libc.src.fenv.fedisableexcept
+ libc.src.fenv.feenableexcept
+ libc.src.fenv.fegetenv
+ libc.src.fenv.fegetexcept
+ libc.src.fenv.fegetexceptflag
+ libc.src.fenv.fegetround
+ libc.src.fenv.feholdexcept
+ libc.src.fenv.feraiseexcept
+ libc.src.fenv.fesetenv
+ libc.src.fenv.fesetexcept
+ libc.src.fenv.fesetexceptflag
+ libc.src.fenv.fesetround
+ libc.src.fenv.fetestexcept
+ libc.src.fenv.fetestexceptflag
+ libc.src.fenv.feupdateenv
+
+ # math.h entrypoints
+ libc.src.math.acosf
+ libc.src.math.acoshf
+ libc.src.math.asinf
+ libc.src.math.asinhf
+ libc.src.math.atan2
+ libc.src.math.atan2f
+ libc.src.math.atanf
+ libc.src.math.atanhf
+ libc.src.math.canonicalize
+ libc.src.math.canonicalizef
+ libc.src.math.canonicalizel
+ libc.src.math.cbrt
+ libc.src.math.cbrtf
+ libc.src.math.ceil
+ libc.src.math.ceilf
+ libc.src.math.ceill
+ libc.src.math.copysign
+ libc.src.math.copysignf
+ libc.src.math.copysignl
+ libc.src.math.cos
+ libc.src.math.cosf
+ libc.src.math.coshf
+ libc.src.math.erff
+ libc.src.math.exp
+ libc.src.math.exp10
+ libc.src.math.exp10f
+ libc.src.math.exp2
+ libc.src.math.exp2f
+ libc.src.math.exp2m1f
+ libc.src.math.expf
+ libc.src.math.expm1
+ libc.src.math.expm1f
+ libc.src.math.fabs
+ libc.src.math.fabsf
+ libc.src.math.fabsl
+ libc.src.math.fdim
+ libc.src.math.fdimf
+ libc.src.math.fdiml
+ libc.src.math.floor
+ libc.src.math.floorf
+ libc.src.math.floorl
+ libc.src.math.fma
+ libc.src.math.fmaf
+ libc.src.math.fmax
+ libc.src.math.fmaxf
+ libc.src.math.fmaximum
+ libc.src.math.fmaximum_mag
+ libc.src.math.fmaximum_mag_num
+ libc.src.math.fmaximum_mag_numf
+ libc.src.math.fmaximum_mag_numl
+ libc.src.math.fmaximum_magf
+ libc.src.math.fmaximum_magl
+ libc.src.math.fmaximum_num
+ libc.src.math.fmaximum_numf
+ libc.src.math.fmaximum_numl
+ libc.src.math.fmaximumf
+ libc.src.math.fmaximuml
+ libc.src.math.fmaxl
+ libc.src.math.fmin
+ libc.src.math.fminf
+ libc.src.math.fminimum
+ libc.src.math.fminimum_mag
+ libc.src.math.fminimum_mag_num
+ libc.src.math.fminimum_mag_numf
+ libc.src.math.fminimum_mag_numl
+ libc.src.math.fminimum_magf
+ libc.src.math.fminimum_magl
+ libc.src.math.fminimum_num
+ libc.src.math.fminimum_numf
+ libc.src.math.fminimum_numl
+ libc.src.math.fminimumf
+ libc.src.math.fminimuml
+ libc.src.math.fminl
+ libc.src.math.fmod
+ libc.src.math.fmodf
+ libc.src.math.fmodl
+ libc.src.math.fmul
+ libc.src.math.frexp
+ libc.src.math.frexpf
+ libc.src.math.frexpl
+ libc.src.math.fromfp
+ libc.src.math.fromfpf
+ libc.src.math.fromfpl
+ libc.src.math.fromfpx
+ libc.src.math.fromfpxf
+ libc.src.math.fromfpxl
+ libc.src.math.hypot
+ libc.src.math.hypotf
+ libc.src.math.ilogb
+ libc.src.math.ilogbf
+ libc.src.math.ilogbl
+ libc.src.math.isnan
+ libc.src.math.isnanf
+ libc.src.math.isnanl
+ libc.src.math.ldexp
+ libc.src.math.ldexpf
+ libc.src.math.ldexpl
+ libc.src.math.llogb
+ libc.src.math.llogbf
+ libc.src.math.llogbl
+ libc.src.math.llrint
+ libc.src.math.llrintf
+ libc.src.math.llrintl
+ libc.src.math.llround
+ libc.src.math.llroundf
+ libc.src.math.llroundl
+ libc.src.math.log
+ libc.src.math.log10
+ libc.src.math.log10f
+ libc.src.math.log1p
+ libc.src.math.log1pf
+ libc.src.math.log2
+ libc.src.math.log2f
+ libc.src.math.logb
+ libc.src.math.logbf
+ libc.src.math.logbl
+ libc.src.math.logf
+ libc.src.math.lrint
+ libc.src.math.lrintf
+ libc.src.math.lrintl
+ libc.src.math.lround
+ libc.src.math.lroundf
+ libc.src.math.lroundl
+ libc.src.math.modf
+ libc.src.math.modff
+ libc.src.math.modfl
+ libc.src.math.nan
+ libc.src.math.nanf
+ libc.src.math.nanl
+ libc.src.math.nearbyint
+ libc.src.math.nearbyintf
+ libc.src.math.nearbyintl
+ libc.src.math.nextafter
+ libc.src.math.nextafterf
+ libc.src.math.nextafterl
+ libc.src.math.nextdown
+ libc.src.math.nextdownf
+ libc.src.math.nextdownl
+ libc.src.math.nexttoward
+ libc.src.math.nexttowardf
+ libc.src.math.nexttowardl
+ libc.src.math.nextup
+ libc.src.math.nextupf
+ libc.src.math.nextupl
+ libc.src.math.pow
+ libc.src.math.powf
+ libc.src.math.remainder
+ libc.src.math.remainderf
+ libc.src.math.remainderl
+ libc.src.math.remquo
+ libc.src.math.remquof
+ libc.src.math.remquol
+ libc.src.math.rint
+ libc.src.math.rintf
+ libc.src.math.rintl
+ libc.src.math.round
+ libc.src.math.roundeven
+ libc.src.math.roundevenf
+ libc.src.math.roundevenl
+ libc.src.math.roundf
+ libc.src.math.roundl
+ libc.src.math.scalbln
+ libc.src.math.scalblnf
+ libc.src.math.scalblnl
+ libc.src.math.scalbn
+ libc.src.math.scalbnf
+ libc.src.math.scalbnl
+ libc.src.math.sin
+ libc.src.math.sincos
+ libc.src.math.sincosf
+ libc.src.math.sinf
+ libc.src.math.sinhf
+ libc.src.math.sqrt
+ libc.src.math.sqrtf
+ libc.src.math.sqrtl
+ libc.src.math.tan
+ libc.src.math.tanf
+ libc.src.math.tanhf
+ libc.src.math.trunc
+ libc.src.math.truncf
+ libc.src.math.truncl
+ libc.src.math.ufromfp
+ libc.src.math.ufromfpf
+ libc.src.math.ufromfpl
+ libc.src.math.ufromfpx
+ libc.src.math.ufromfpxf
+ libc.src.math.ufromfpxl
+)
+
+if(LIBC_COMPILER_HAS_FIXED_POINT)
+ list(APPEND TARGET_LIBM_ENTRYPOINTS
+ # stdfix.h _Fract and _Accum entrypoints
+ libc.src.stdfix.abshk
+ libc.src.stdfix.abshr
+ libc.src.stdfix.absk
+ libc.src.stdfix.abslk
+ libc.src.stdfix.abslr
+ libc.src.stdfix.absr
+ libc.src.stdfix.exphk
+ libc.src.stdfix.expk
+ libc.src.stdfix.roundhk
+ libc.src.stdfix.roundhr
+ libc.src.stdfix.roundk
+ libc.src.stdfix.roundlk
+ libc.src.stdfix.roundlr
+ libc.src.stdfix.roundr
+ libc.src.stdfix.rounduhk
+ libc.src.stdfix.rounduhr
+ libc.src.stdfix.rounduk
+ libc.src.stdfix.roundulk
+ libc.src.stdfix.roundulr
+ libc.src.stdfix.roundur
+ libc.src.stdfix.sqrtuhk
+ libc.src.stdfix.sqrtuhr
+ libc.src.stdfix.sqrtuk
+ libc.src.stdfix.sqrtur
+ # libc.src.stdfix.sqrtulk
+ libc.src.stdfix.sqrtulr
+ libc.src.stdfix.uhksqrtus
+ libc.src.stdfix.uksqrtui
+ libc.src.stdfix.hrbits
+ libc.src.stdfix.uhrbits
+ libc.src.stdfix.rbits
+ libc.src.stdfix.urbits
+ libc.src.stdfix.lrbits
+ libc.src.stdfix.ulrbits
+ libc.src.stdfix.hkbits
+ libc.src.stdfix.uhkbits
+ libc.src.stdfix.kbits
+ libc.src.stdfix.ukbits
+ libc.src.stdfix.lkbits
+ libc.src.stdfix.ulkbits
+ )
+endif()
+
+set(TARGET_LLVMLIBC_ENTRYPOINTS
+ ${TARGET_LIBC_ENTRYPOINTS}
+ ${TARGET_LIBM_ENTRYPOINTS}
+)
diff --git a/libc/config/baremetal/aarch64/headers.txt b/libc/config/baremetal/aarch64/headers.txt
new file mode 100644
index 000000000000..6cc8a80455d3
--- /dev/null
+++ b/libc/config/baremetal/aarch64/headers.txt
@@ -0,0 +1,20 @@
+set(TARGET_PUBLIC_HEADERS
+ libc.include.assert
+ libc.include.ctype
+ libc.include.errno
+ libc.include.features
+ libc.include.fenv
+ libc.include.float
+ libc.include.inttypes
+ libc.include.math
+ libc.include.setjmp
+ libc.include.stdfix
+ libc.include.stdint
+ libc.include.stdio
+ libc.include.stdlib
+ libc.include.string
+ libc.include.strings
+ libc.include.sys_queue
+ libc.include.time
+ libc.include.uchar
+)
diff --git a/libc/config/baremetal/arm/entrypoints.txt b/libc/config/baremetal/arm/entrypoints.txt
index 9027717acb4d..694cd7b1993c 100644
--- a/libc/config/baremetal/arm/entrypoints.txt
+++ b/libc/config/baremetal/arm/entrypoints.txt
@@ -31,10 +31,6 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.setjmp.setjmp
# string.h entrypoints
- libc.src.string.bcmp
- libc.src.string.bcopy
- libc.src.string.bzero
- libc.src.string.index
libc.src.string.memccpy
libc.src.string.memchr
libc.src.string.memcmp
@@ -45,10 +41,8 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.string.memrchr
libc.src.string.memset
libc.src.string.memset_explicit
- libc.src.string.rindex
libc.src.string.stpcpy
libc.src.string.stpncpy
- libc.src.string.strcasecmp
libc.src.string.strcasestr
libc.src.string.strcat
libc.src.string.strchr
@@ -62,7 +56,6 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.string.strlcat
libc.src.string.strlcpy
libc.src.string.strlen
- libc.src.string.strncasecmp
libc.src.string.strncat
libc.src.string.strncmp
libc.src.string.strncpy
@@ -76,6 +69,15 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.string.strtok_r
libc.src.string.strxfrm
+ # strings.h entrypoints
+ libc.src.strings.bcmp
+ libc.src.strings.bcopy
+ libc.src.strings.bzero
+ libc.src.strings.index
+ libc.src.strings.rindex
+ libc.src.strings.strcasecmp
+ libc.src.strings.strncasecmp
+
# inttypes.h entrypoints
libc.src.inttypes.imaxabs
libc.src.inttypes.imaxdiv
@@ -182,7 +184,6 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.stdlib.div
libc.src.stdlib.exit
libc.src.stdlib.free
- libc.src.stdlib.freelist_malloc
libc.src.stdlib.labs
libc.src.stdlib.ldiv
libc.src.stdlib.llabs
diff --git a/libc/config/baremetal/config.json b/libc/config/baremetal/config.json
index dc4b0517d938..85e80879d498 100644
--- a/libc/config/baremetal/config.json
+++ b/libc/config/baremetal/config.json
@@ -25,5 +25,15 @@
"LIBC_CONF_QSORT_IMPL": {
"value": "LIBC_QSORT_HEAP_SORT"
}
+ },
+ "math": {
+ "LIBC_CONF_MATH_OPTIMIZATIONS": {
+ "value": "(LIBC_MATH_SKIP_ACCURATE_PASS | LIBC_MATH_SMALL_TABLES)"
+ }
+ },
+ "codegen": {
+ "LIBC_CONF_KEEP_FRAME_POINTER": {
+ "value": false
+ }
}
}
diff --git a/libc/config/baremetal/riscv/entrypoints.txt b/libc/config/baremetal/riscv/entrypoints.txt
index afae2b3e082b..6dc5df830eb0 100644
--- a/libc/config/baremetal/riscv/entrypoints.txt
+++ b/libc/config/baremetal/riscv/entrypoints.txt
@@ -27,10 +27,6 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.errno.errno
# string.h entrypoints
- libc.src.string.bcmp
- libc.src.string.bcopy
- libc.src.string.bzero
- libc.src.string.index
libc.src.string.memccpy
libc.src.string.memchr
libc.src.string.memcmp
@@ -41,10 +37,8 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.string.memrchr
libc.src.string.memset
libc.src.string.memset_explicit
- libc.src.string.rindex
libc.src.string.stpcpy
libc.src.string.stpncpy
- libc.src.string.strcasecmp
libc.src.string.strcasestr
libc.src.string.strcat
libc.src.string.strchr
@@ -58,7 +52,6 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.string.strlcat
libc.src.string.strlcpy
libc.src.string.strlen
- libc.src.string.strncasecmp
libc.src.string.strncat
libc.src.string.strncmp
libc.src.string.strncpy
@@ -72,6 +65,15 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.string.strtok_r
libc.src.string.strxfrm
+ # strings.h entrypoints
+ libc.src.strings.bcmp
+ libc.src.strings.bcopy
+ libc.src.strings.bzero
+ libc.src.strings.index
+ libc.src.strings.rindex
+ libc.src.strings.strcasecmp
+ libc.src.strings.strncasecmp
+
# inttypes.h entrypoints
libc.src.inttypes.imaxabs
libc.src.inttypes.imaxdiv
@@ -178,7 +180,6 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.stdlib.div
libc.src.stdlib.exit
libc.src.stdlib.free
- libc.src.stdlib.freelist_malloc
libc.src.stdlib.labs
libc.src.stdlib.ldiv
libc.src.stdlib.llabs
diff --git a/libc/config/darwin/arm/entrypoints.txt b/libc/config/darwin/arm/entrypoints.txt
index 2d5dbeff4857..7972d285f963 100644
--- a/libc/config/darwin/arm/entrypoints.txt
+++ b/libc/config/darwin/arm/entrypoints.txt
@@ -21,9 +21,6 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.errno.errno
# string.h entrypoints
- libc.src.string.bcmp
- libc.src.string.bcopy
- libc.src.string.bzero
libc.src.string.memccpy
libc.src.string.memchr
libc.src.string.memcmp
@@ -35,7 +32,6 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.string.memset
libc.src.string.stpcpy
libc.src.string.stpncpy
- libc.src.string.strcasecmp
libc.src.string.strcasestr
libc.src.string.strcat
libc.src.string.strchr
@@ -46,7 +42,6 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.string.strlcat
libc.src.string.strlcpy
libc.src.string.strlen
- libc.src.string.strncasecmp
libc.src.string.strncat
libc.src.string.strncmp
libc.src.string.strncpy
@@ -62,6 +57,13 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.string.strdup
libc.src.string.strndup
+ # strings.h entrypoints
+ libc.src.strings.bcmp
+ libc.src.strings.bcopy
+ libc.src.strings.bzero
+ libc.src.strings.strcasecmp
+ libc.src.strings.strncasecmp
+
# inttypes.h entrypoints
libc.src.inttypes.imaxabs
libc.src.inttypes.imaxdiv
diff --git a/libc/config/darwin/x86_64/entrypoints.txt b/libc/config/darwin/x86_64/entrypoints.txt
index 64eeed18f381..19230cde4719 100644
--- a/libc/config/darwin/x86_64/entrypoints.txt
+++ b/libc/config/darwin/x86_64/entrypoints.txt
@@ -18,11 +18,9 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.ctype.toupper
# search.h entrypoints
- libc.src.search.lfind
+ libc.src.search.lfind
# string.h entrypoints
- libc.src.string.bcmp
- libc.src.string.bzero
libc.src.string.memccpy
libc.src.string.memchr
libc.src.string.memcmp
@@ -58,6 +56,10 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.string.strdup
libc.src.string.strndup
+ # strings.h entrypoints
+ libc.src.strings.bcmp
+ libc.src.strings.bzero
+
# inttypes.h entrypoints
libc.src.inttypes.imaxabs
libc.src.inttypes.imaxdiv
diff --git a/libc/config/gpu/entrypoints.txt b/libc/config/gpu/entrypoints.txt
index 38e9f2e685ca..b008e0e6684f 100644
--- a/libc/config/gpu/entrypoints.txt
+++ b/libc/config/gpu/entrypoints.txt
@@ -35,10 +35,6 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.ctype.toupper_l
# string.h entrypoints
- libc.src.string.bcmp
- libc.src.string.bcopy
- libc.src.string.bzero
- libc.src.string.index
libc.src.string.memccpy
libc.src.string.memchr
libc.src.string.memcmp
@@ -48,10 +44,8 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.string.mempcpy
libc.src.string.memrchr
libc.src.string.memset
- libc.src.string.rindex
libc.src.string.stpcpy
libc.src.string.stpncpy
- libc.src.string.strcasecmp
libc.src.string.strcasestr
libc.src.string.strcat
libc.src.string.strchr
@@ -66,7 +60,6 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.string.strlcat
libc.src.string.strlcpy
libc.src.string.strlen
- libc.src.string.strncasecmp
libc.src.string.strncat
libc.src.string.strncmp
libc.src.string.strncpy
@@ -82,6 +75,15 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.string.strxfrm
libc.src.string.strxfrm_l
+ # strings.h entrypoints
+ libc.src.strings.bcmp
+ libc.src.strings.bcopy
+ libc.src.strings.bzero
+ libc.src.strings.index
+ libc.src.strings.rindex
+ libc.src.strings.strcasecmp
+ libc.src.strings.strncasecmp
+
# stdbit.h entrypoints
libc.src.stdbit.stdc_bit_ceil_uc
libc.src.stdbit.stdc_bit_ceil_ui
@@ -255,6 +257,7 @@ set(TARGET_LIBC_ENTRYPOINTS
# time.h entrypoints
libc.src.time.clock
libc.src.time.clock_gettime
+ libc.src.time.timespec_get
libc.src.time.nanosleep
# wchar.h entrypoints
@@ -268,9 +271,6 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.locale.newlocale
libc.src.locale.setlocale
libc.src.locale.uselocale
-
- # gpu/rpc.h entrypoints
- libc.src.gpu.rpc_host_call
)
set(TARGET_LIBM_ENTRYPOINTS
diff --git a/libc/config/gpu/headers.txt b/libc/config/gpu/headers.txt
index adbd014fba6c..fa8ad7c11ba8 100644
--- a/libc/config/gpu/headers.txt
+++ b/libc/config/gpu/headers.txt
@@ -18,7 +18,4 @@ set(TARGET_PUBLIC_HEADERS
libc.include.uchar
libc.include.features
libc.include.locale
-
- # Header for RPC extensions
- libc.include.gpu_rpc
)
diff --git a/libc/config/linux/aarch64/entrypoints.txt b/libc/config/linux/aarch64/entrypoints.txt
index aa0b8ba0490e..00f0c6a8bfb8 100644
--- a/libc/config/linux/aarch64/entrypoints.txt
+++ b/libc/config/linux/aarch64/entrypoints.txt
@@ -45,10 +45,6 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.sched.sched_yield
# string.h entrypoints
- libc.src.string.bcmp
- libc.src.string.bcopy
- libc.src.string.bzero
- libc.src.string.index
libc.src.string.memccpy
libc.src.string.memchr
libc.src.string.memcmp
@@ -59,10 +55,8 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.string.memrchr
libc.src.string.memset
libc.src.string.memset_explicit
- libc.src.string.rindex
libc.src.string.stpcpy
libc.src.string.stpncpy
- libc.src.string.strcasecmp
libc.src.string.strcasestr
libc.src.string.strcat
libc.src.string.strchr
@@ -77,7 +71,6 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.string.strlcat
libc.src.string.strlcpy
libc.src.string.strlen
- libc.src.string.strncasecmp
libc.src.string.strncat
libc.src.string.strncmp
libc.src.string.strncpy
@@ -93,6 +86,15 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.string.strtok_r
libc.src.string.strxfrm
+ # strings.h entrypoints
+ libc.src.strings.bcmp
+ libc.src.strings.bcopy
+ libc.src.strings.bzero
+ libc.src.strings.index
+ libc.src.strings.rindex
+ libc.src.strings.strcasecmp
+ libc.src.strings.strncasecmp
+
# inttypes.h entrypoints
libc.src.inttypes.imaxabs
libc.src.inttypes.imaxdiv
@@ -252,7 +254,6 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.sys.mman.munlockall
libc.src.sys.mman.munmap
libc.src.sys.mman.remap_file_pages
- libc.src.sys.mman.process_mrelease
libc.src.sys.mman.posix_madvise
libc.src.sys.mman.shm_open
libc.src.sys.mman.shm_unlink
@@ -366,6 +367,12 @@ set(TARGET_LIBM_ENTRYPOINTS
libc.src.complex.cimag
libc.src.complex.cimagf
libc.src.complex.cimagl
+ libc.src.complex.conj
+ libc.src.complex.conjf
+ libc.src.complex.conjl
+ libc.src.complex.cproj
+ libc.src.complex.cprojf
+ libc.src.complex.cprojl
# fenv.h entrypoints
libc.src.fenv.feclearexcept
@@ -612,12 +619,18 @@ set(TARGET_LIBM_ENTRYPOINTS
libc.src.math.ufromfpxl
)
-if(LIBC_TYPES_HAS_FLOAT16)
+if(LIBC_TYPES_HAS_CFLOAT16)
list(APPEND TARGET_LIBM_ENTRYPOINTS
# complex.h C23 _Complex _Float16 entrypoints
- # libc.src.complex.crealf16
- # libc.src.complex.cimagf16
-
+ libc.src.complex.crealf16
+ libc.src.complex.cimagf16
+ libc.src.complex.conjf16
+ libc.src.complex.cprojf16
+ )
+endif()
+
+if(LIBC_TYPES_HAS_FLOAT16)
+ list(APPEND TARGET_LIBM_ENTRYPOINTS
# math.h C23 _Float16 entrypoints
libc.src.math.canonicalizef16
libc.src.math.ceilf16
@@ -717,12 +730,18 @@ if(LIBC_TYPES_HAS_FLOAT16)
# endif()
endif()
-if(LIBC_TYPES_HAS_FLOAT128)
+if(LIBC_TYPES_HAS_CFLOAT128)
list(APPEND TARGET_LIBM_ENTRYPOINTS
# complex.h C23 _Complex _Float128 entrypoints
libc.src.complex.crealf128
libc.src.complex.cimagf128
+ libc.src.complex.conjf128
+ libc.src.complex.cprojf128
+ )
+endif()
+if(LIBC_TYPES_HAS_FLOAT128)
+ list(APPEND TARGET_LIBM_ENTRYPOINTS
# math.h C23 _Float128 entrypoints
libc.src.math.canonicalizef128
libc.src.math.ceilf128
@@ -805,11 +824,11 @@ if(LLVM_LIBC_FULL_BUILD)
libc.src.dirent.opendir
libc.src.dirent.readdir
- # network.h entrypoints
- libc.src.network.htonl
- libc.src.network.htons
- libc.src.network.ntohl
- libc.src.network.ntohs
+ # arpa/inet.h entrypoints
+ libc.src.arpa.inet.htonl
+ libc.src.arpa.inet.htons
+ libc.src.arpa.inet.ntohl
+ libc.src.arpa.inet.ntohs
# pthread.h entrypoints
libc.src.pthread.pthread_atfork
diff --git a/libc/config/linux/aarch64/headers.txt b/libc/config/linux/aarch64/headers.txt
index f98af5744685..05f15a0e4e5c 100644
--- a/libc/config/linux/aarch64/headers.txt
+++ b/libc/config/linux/aarch64/headers.txt
@@ -1,5 +1,6 @@
set(TARGET_PUBLIC_HEADERS
libc.include.assert
+ libc.include.complex
libc.include.ctype
libc.include.dlfcn
libc.include.elf
diff --git a/libc/config/linux/arm/entrypoints.txt b/libc/config/linux/arm/entrypoints.txt
index 31d81de06fb6..83f4dfaaa2d0 100644
--- a/libc/config/linux/arm/entrypoints.txt
+++ b/libc/config/linux/arm/entrypoints.txt
@@ -21,10 +21,6 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.errno.errno
# string.h entrypoints
- libc.src.string.bcmp
- libc.src.string.bcopy
- libc.src.string.bzero
- libc.src.string.index
libc.src.string.memccpy
libc.src.string.memchr
libc.src.string.memcmp
@@ -34,10 +30,8 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.string.mempcpy
libc.src.string.memrchr
libc.src.string.memset
- libc.src.string.rindex
libc.src.string.stpcpy
libc.src.string.stpncpy
- libc.src.string.strcasecmp
libc.src.string.strcasestr
libc.src.string.strcat
libc.src.string.strchr
@@ -48,7 +42,6 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.string.strlcat
libc.src.string.strlcpy
libc.src.string.strlen
- libc.src.string.strncasecmp
libc.src.string.strncat
libc.src.string.strncmp
libc.src.string.strncpy
@@ -61,6 +54,15 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.string.strtok
libc.src.string.strtok_r
+ # strings.h entrypoints
+ libc.src.strings.bcmp
+ libc.src.strings.bcopy
+ libc.src.strings.bzero
+ libc.src.strings.index
+ libc.src.strings.rindex
+ libc.src.strings.strcasecmp
+ libc.src.strings.strncasecmp
+
# inttypes.h entrypoints
libc.src.inttypes.imaxabs
libc.src.inttypes.imaxdiv
@@ -207,6 +209,12 @@ set(TARGET_LIBM_ENTRYPOINTS
libc.src.complex.cimag
libc.src.complex.cimagf
libc.src.complex.cimagl
+ libc.src.complex.conj
+ libc.src.complex.conjf
+ libc.src.complex.conjl
+ libc.src.complex.cproj
+ libc.src.complex.cprojf
+ libc.src.complex.cprojl
# fenv.h entrypoints
libc.src.fenv.feclearexcept
diff --git a/libc/config/linux/arm/headers.txt b/libc/config/linux/arm/headers.txt
index 6576db1f8526..9aabac5dea33 100644
--- a/libc/config/linux/arm/headers.txt
+++ b/libc/config/linux/arm/headers.txt
@@ -1,4 +1,5 @@
set(TARGET_PUBLIC_HEADERS
+ libc.include.complex
libc.include.ctype
libc.include.errno
libc.include.fenv
diff --git a/libc/config/linux/riscv/entrypoints.txt b/libc/config/linux/riscv/entrypoints.txt
index fedc5002d8c2..49a8d61b9380 100644
--- a/libc/config/linux/riscv/entrypoints.txt
+++ b/libc/config/linux/riscv/entrypoints.txt
@@ -45,10 +45,6 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.sched.sched_yield
# string.h entrypoints
- libc.src.string.bcmp
- libc.src.string.bcopy
- libc.src.string.bzero
- libc.src.string.index
libc.src.string.memccpy
libc.src.string.memchr
libc.src.string.memcmp
@@ -59,10 +55,8 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.string.memrchr
libc.src.string.memset
libc.src.string.memset_explicit
- libc.src.string.rindex
libc.src.string.stpcpy
libc.src.string.stpncpy
- libc.src.string.strcasecmp
libc.src.string.strcasestr
libc.src.string.strcat
libc.src.string.strchr
@@ -77,7 +71,6 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.string.strlcat
libc.src.string.strlcpy
libc.src.string.strlen
- libc.src.string.strncasecmp
libc.src.string.strncat
libc.src.string.strncmp
libc.src.string.strncpy
@@ -93,6 +86,14 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.string.strtok_r
libc.src.string.strxfrm
+ # strings.h entrypoints
+ libc.src.strings.index
+ libc.src.strings.rindex
+ libc.src.strings.bcmp
+ libc.src.strings.bcopy
+ libc.src.strings.bzero
+ libc.src.strings.strcasecmp
+
# inttypes.h entrypoints
libc.src.inttypes.imaxabs
libc.src.inttypes.imaxdiv
@@ -251,8 +252,6 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.sys.mman.munmap
libc.src.sys.mman.remap_file_pages
libc.src.sys.mman.posix_madvise
- # TODO: disabled due to buildbot failure. further investigation needed.
- # libc.src.sys.mman.process_mrelease
libc.src.sys.mman.shm_open
libc.src.sys.mman.shm_unlink
@@ -365,6 +364,12 @@ set(TARGET_LIBM_ENTRYPOINTS
libc.src.complex.cimag
libc.src.complex.cimagf
libc.src.complex.cimagl
+ libc.src.complex.conj
+ libc.src.complex.conjf
+ libc.src.complex.conjl
+ libc.src.complex.cproj
+ libc.src.complex.cprojf
+ libc.src.complex.cprojl
# fenv.h entrypoints
libc.src.fenv.feclearexcept
@@ -615,12 +620,18 @@ set(TARGET_LIBM_ENTRYPOINTS
libc.src.math.ufromfpxl
)
-if(LIBC_TYPES_HAS_FLOAT128)
+if(LIBC_TYPES_HAS_CFLOAT128)
list(APPEND TARGET_LIBM_ENTRYPOINTS
# complex.h C23 _Complex _Float128 entrypoints
libc.src.complex.crealf128
libc.src.complex.cimagf128
-
+ libc.src.complex.conjf128
+ libc.src.complex.cprojf128
+ )
+endif()
+
+if(LIBC_TYPES_HAS_FLOAT128)
+ list(APPEND TARGET_LIBM_ENTRYPOINTS
# math.h C23 _Float128 entrypoints
libc.src.math.canonicalizef128
libc.src.math.ceilf128
@@ -749,11 +760,11 @@ if(LLVM_LIBC_FULL_BUILD)
libc.src.dirent.opendir
libc.src.dirent.readdir
- # network.h entrypoints
- libc.src.network.htonl
- libc.src.network.htons
- libc.src.network.ntohl
- libc.src.network.ntohs
+ # arpa/inet.h entrypoints
+ libc.src.arpa.inet.htonl
+ libc.src.arpa.inet.htons
+ libc.src.arpa.inet.ntohl
+ libc.src.arpa.inet.ntohs
# pthread.h entrypoints
libc.src.pthread.pthread_atfork
diff --git a/libc/config/linux/riscv/headers.txt b/libc/config/linux/riscv/headers.txt
index 41c343f71998..b38659e0b8da 100644
--- a/libc/config/linux/riscv/headers.txt
+++ b/libc/config/linux/riscv/headers.txt
@@ -1,5 +1,6 @@
set(TARGET_PUBLIC_HEADERS
libc.include.assert
+ libc.include.complex
libc.include.ctype
libc.include.dirent
libc.include.dlfcn
diff --git a/libc/config/linux/x86_64/entrypoints.txt b/libc/config/linux/x86_64/entrypoints.txt
index 5e9cc71279ab..7e549607716c 100644
--- a/libc/config/linux/x86_64/entrypoints.txt
+++ b/libc/config/linux/x86_64/entrypoints.txt
@@ -45,10 +45,6 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.sched.sched_yield
# string.h entrypoints
- libc.src.string.bcmp
- libc.src.string.bcopy
- libc.src.string.bzero
- libc.src.string.index
libc.src.string.memccpy
libc.src.string.memchr
libc.src.string.memcmp
@@ -59,10 +55,8 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.string.memrchr
libc.src.string.memset
libc.src.string.memset_explicit
- libc.src.string.rindex
libc.src.string.stpcpy
libc.src.string.stpncpy
- libc.src.string.strcasecmp
libc.src.string.strcasestr
libc.src.string.strcat
libc.src.string.strchr
@@ -77,7 +71,6 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.string.strlcat
libc.src.string.strlcpy
libc.src.string.strlen
- libc.src.string.strncasecmp
libc.src.string.strncat
libc.src.string.strncmp
libc.src.string.strncpy
@@ -93,6 +86,15 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.string.strtok_r
libc.src.string.strxfrm
+ # strings.h entrypoints
+ libc.src.strings.bcmp
+ libc.src.strings.bcopy
+ libc.src.strings.bzero
+ libc.src.strings.index
+ libc.src.strings.rindex
+ libc.src.strings.strcasecmp
+ libc.src.strings.strncasecmp
+
# inttypes.h entrypoints
libc.src.inttypes.imaxabs
libc.src.inttypes.imaxdiv
@@ -252,7 +254,6 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.sys.mman.munmap
libc.src.sys.mman.remap_file_pages
libc.src.sys.mman.posix_madvise
- libc.src.sys.mman.process_mrelease
libc.src.sys.mman.shm_open
libc.src.sys.mman.shm_unlink
@@ -366,6 +367,12 @@ set(TARGET_LIBM_ENTRYPOINTS
libc.src.complex.cimag
libc.src.complex.cimagf
libc.src.complex.cimagl
+ libc.src.complex.conj
+ libc.src.complex.conjf
+ libc.src.complex.conjl
+ libc.src.complex.cproj
+ libc.src.complex.cprojf
+ libc.src.complex.cprojl
# fenv.h entrypoints
libc.src.fenv.feclearexcept
@@ -617,16 +624,23 @@ set(TARGET_LIBM_ENTRYPOINTS
libc.src.math.ufromfpxl
)
-if(LIBC_TYPES_HAS_FLOAT16)
+if(LIBC_TYPES_HAS_CFLOAT16)
list(APPEND TARGET_LIBM_ENTRYPOINTS
# complex.h C23 _Complex _Float16 entrypoints
libc.src.complex.crealf16
libc.src.complex.cimagf16
+ libc.src.complex.conjf16
+ libc.src.complex.cprojf16
+ )
+endif()
+if(LIBC_TYPES_HAS_FLOAT16)
+ list(APPEND TARGET_LIBM_ENTRYPOINTS
# math.h C23 _Float16 entrypoints
libc.src.math.canonicalizef16
libc.src.math.ceilf16
libc.src.math.copysignf16
+ libc.src.math.cosf16
libc.src.math.coshf16
libc.src.math.cospif16
libc.src.math.exp10f16
@@ -726,12 +740,18 @@ if(LIBC_TYPES_HAS_FLOAT16)
endif()
endif()
-if(LIBC_TYPES_HAS_FLOAT128)
+if(LIBC_TYPES_HAS_CFLOAT128)
list(APPEND TARGET_LIBM_ENTRYPOINTS
# complex.h C23 _Complex _Float128 entrypoints
- # libc.src.complex.crealf128
- # libc.src.complex.cimagf128
-
+ libc.src.complex.crealf128
+ libc.src.complex.cimagf128
+ libc.src.complex.conjf128
+ libc.src.complex.cprojf128
+ )
+endif()
+
+if(LIBC_TYPES_HAS_FLOAT128)
+ list(APPEND TARGET_LIBM_ENTRYPOINTS
# math.h C23 _Float128 entrypoints
libc.src.math.canonicalizef128
libc.src.math.ceilf128
@@ -889,11 +909,11 @@ if(LLVM_LIBC_FULL_BUILD)
libc.src.dirent.opendir
libc.src.dirent.readdir
- # network.h entrypoints
- libc.src.network.htonl
- libc.src.network.htons
- libc.src.network.ntohl
- libc.src.network.ntohs
+ # arpa/inet.h entrypoints
+ libc.src.arpa.inet.htonl
+ libc.src.arpa.inet.htons
+ libc.src.arpa.inet.ntohl
+ libc.src.arpa.inet.ntohs
# pthread.h entrypoints
libc.src.pthread.pthread_atfork
diff --git a/libc/config/linux/x86_64/headers.txt b/libc/config/linux/x86_64/headers.txt
index e0c04b381492..8750100302ea 100644
--- a/libc/config/linux/x86_64/headers.txt
+++ b/libc/config/linux/x86_64/headers.txt
@@ -1,5 +1,6 @@
set(TARGET_PUBLIC_HEADERS
libc.include.assert
+ libc.include.complex
libc.include.ctype
libc.include.dirent
libc.include.dlfcn
diff --git a/libc/config/windows/entrypoints.txt b/libc/config/windows/entrypoints.txt
index 8f0b50bcc83e..4ecc3ada9c76 100644
--- a/libc/config/windows/entrypoints.txt
+++ b/libc/config/windows/entrypoints.txt
@@ -18,9 +18,6 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.ctype.toupper
# string.h entrypoints
- libc.src.string.bcmp
- libc.src.string.bcopy
- libc.src.string.bzero
libc.src.string.memccpy
libc.src.string.memchr
libc.src.string.memcmp
@@ -32,7 +29,6 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.string.memset
libc.src.string.stpcpy
libc.src.string.stpncpy
- libc.src.string.strcasecmp
libc.src.string.strcasestr
libc.src.string.strcat
libc.src.string.strchr
@@ -43,7 +39,6 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.string.strlcat
libc.src.string.strlcpy
libc.src.string.strlen
- libc.src.string.strncasecmp
libc.src.string.strncat
libc.src.string.strncmp
libc.src.string.strncpy
@@ -59,6 +54,13 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.string.strdup
libc.src.string.strndup
+ # strings.h entrypoints
+ libc.src.strings.bcmp
+ libc.src.strings.bcopy
+ libc.src.strings.bzero
+ libc.src.strings.strcasecmp
+ libc.src.strings.strncasecmp
+
# inttypes.h entrypoints
libc.src.inttypes.imaxabs
libc.src.inttypes.imaxdiv
@@ -95,6 +97,10 @@ set(TARGET_LIBC_ENTRYPOINTS
# errno.h entrypoints
libc.src.errno.errno
+
+ # time.h entrypoints
+ libc.src.time.time
+ libc.src.time.clock_getres
)
set(TARGET_LIBM_ENTRYPOINTS
diff --git a/libc/docs/arch_support.rst b/libc/docs/arch_support.rst
new file mode 100644
index 000000000000..6ab0486c7ea2
--- /dev/null
+++ b/libc/docs/arch_support.rst
@@ -0,0 +1,19 @@
+Architecture Support
+====================
+
+The currently continuously tested architectures are:
+
+* aarch64
+* amdgpu
+* arm
+* nvptx
+* riscv32
+* riscv64
+* x86_64
+
+i386 support is [in the works](https://github.com/llvm/llvm-project/issues/93709).
+
+See "`Bringup on a New OS or Architecture <porting.html>`__" for more
+information. Please do first file a bug in
+`our issue tracker <https://github.com/llvm/llvm-project/labels/libc>`__ before
+starting a port that you plan to upstream.
diff --git a/libc/docs/conf.py b/libc/docs/conf.py
index 502a479b3eb2..eff827c867fd 100644
--- a/libc/docs/conf.py
+++ b/libc/docs/conf.py
@@ -25,7 +25,7 @@ from datetime import date
# Add any Sphinx extension module names here, as strings. They can be extensions
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
-extensions = ["sphinx.ext.intersphinx", "sphinx.ext.todo"]
+extensions = ["sphinx.ext.intersphinx", "sphinx.ext.todo", "sphinx_reredirects"]
# Add any paths that contain templates here, relative to this directory.
templates_path = ["_templates"]
@@ -261,3 +261,5 @@ intersphinx_mapping = {}
# Enable this if you want TODOs to show up in the generated documentation.
todo_include_todos = True
+
+redirects = {"math/index": "../headers/math/index.html"}
diff --git a/libc/docs/ctype.rst b/libc/docs/ctype.rst
deleted file mode 100644
index 828785c9b670..000000000000
--- a/libc/docs/ctype.rst
+++ /dev/null
@@ -1,74 +0,0 @@
-.. include:: check.rst
-
-=======
-ctype.h
-=======
-
-Functions
-=========
-
-.. list-table::
- :widths: auto
- :align: center
- :header-rows: 1
-
- * - Function
- - Implemented
- - C23 Standard Section
- - POSIX.1-2017 Standard Section
- * - isalnum
- - |check|
- - 7.4.1.1
- -
- * - isalpha
- - |check|
- - 7.4.1.2
- -
- * - isblank
- - |check|
- - 7.4.1.3
- -
- * - iscntrl
- - |check|
- - 7.4.1.4
- -
- * - isdigit
- - |check|
- - 7.4.1.5
- -
- * - isgraph
- - |check|
- - 7.4.1.6
- -
- * - islower
- - |check|
- - 7.4.1.7
- -
- * - isprint
- - |check|
- - 7.4.1.8
- -
- * - ispunct
- - |check|
- - 7.4.1.9
- -
- * - isspace
- - |check|
- - 7.4.1.10
- -
- * - isupper
- - |check|
- - 7.4.1.11
- -
- * - isxdigit
- - |check|
- - 7.4.1.12
- -
- * - tolower
- - |check|
- - 7.4.2.1
- -
- * - toupper
- - |check|
- - 7.4.2.2
- -
diff --git a/libc/docs/dev/header_generation.rst b/libc/docs/dev/header_generation.rst
index 2c586cc87b69..a946106fc709 100644
--- a/libc/docs/dev/header_generation.rst
+++ b/libc/docs/dev/header_generation.rst
@@ -44,15 +44,15 @@ To add through the command line:
.. code-block:: none
- python3 libc/hdrgen/yaml_to_classes.py
- libc/hdrgen/yaml/[yaml_file.yaml] --add_function "<return_type>" <function_name> "<function_arg1, function_arg2>" <standard> <guard> <attribute>
+ python3 libc/utils/hdrgen/yaml_to_classes.py
+ libc/include/[yaml_file.yaml] --add_function "<return_type>" <function_name> "<function_arg1, function_arg2>" <standard> <guard> <attribute>
Example:
.. code-block:: none
- python3 libc/hdrgen/yaml_to_classes.py
- libc/hdrgen/yaml/ctype.yaml --add_function "char" example_function
+ python3 libc/utils/hdrgen/yaml_to_classes.py
+ libc/include/ctype.yaml --add_function "char" example_function
"int, void, const void" stdc example_float example_attribute
Keep in mind only the return_type and arguments have quotes around them. If
@@ -62,7 +62,8 @@ To add through the command line:
generated header file with the new addition in the hdrgen directory to
examine.
-If you want to sort the functions alphabetically you can check out libc/hdrgen/yaml_functions_sorted.py.
+If you want to sort the functions alphabetically you can check out
+libc/utils/hdrgen/yaml_functions_sorted.py.
Testing
@@ -75,10 +76,10 @@ ensures the process of YAML to classes to generate headers works properly. If
there are any new additions on formatting headers, make sure the test is
updated with the specific addition.
-Integration Test can be found in: ``libc/hdrgen/tests/test_integration.py``
+Integration Test can be found in: ``libc/utils/hdrgen/tests/test_integration.py``
File to modify if adding something to formatting:
-``libc/hdrgen/tests/expected_output/test_header.h``
+``libc/utils/hdrgen/tests/expected_output/test_header.h``
Common Errors
@@ -89,7 +90,7 @@ Common Errors
.. code-block:: none
- "/llvm-project/libc/hdrgen/yaml_to_classes.py", line 67, in yaml_to_classes function_data["return_type"]
+ "/llvm-project/libc/utils/hdrgen/yaml_to_classes.py", line 67, in yaml_to_classes function_data["return_type"]
If you receive this error or any error pertaining to
``function_data[function_specific_component]`` while building the headers
@@ -117,7 +118,7 @@ Common Errors
missing. Ensure the correct style and required files are present:
| ``[header_name]``
- | ``[../libc/hdrgen/yaml/[yaml_file.yaml]``
+ | ``[../libc/include/[yaml_file.yaml]``
| ``[header_name.h.def]``
| ``[header_name.h]``
| ``DEPENDS``
@@ -147,13 +148,13 @@ Common Errors
.. code-block:: none
- File "/llvm-project/libc/hdrgen/header.py", line 60, in __str__ for
+ File "/llvm-project/libc/utils/hdrgen/header.py", line 60, in __str__ for
function in self.functions: AttributeError: 'HeaderFile' object has no
attribute 'functions'
When running ``ninja libc`` in the build directory to generate headers you
may receive the error above. Essentially this means that in
- ``libc/hdrgen/header.py`` there is a missing attribute named functions.
+ ``libc/utils/hdrgen/header.py`` there is a missing attribute named functions.
Make sure all function components are defined within this file and there are
no missing functions to add these components.
@@ -184,12 +185,12 @@ Common Errors
Sometimes the integration test will fail but that
still means the process is working unless the comparison between the output
and expected_output is not showing. If that is the case make sure in
- ``libc/hdrgen/tests/test_integration.py`` there are no missing arguments
+ ``libc/utils/hdrgen/tests/test_integration.py`` there are no missing arguments
that run through the script.
If the integration tests are failing due to mismatching of lines or small
errors in spacing that is nothing to worry about. If this is happening while
you are making a new change to the formatting of the headers, then
ensure the expected output file
- ``libc/hdrgen/tests/expected_output/test_header.h`` has the changes you
+ ``libc/utils/hdrgen/tests/expected_output/test_header.h`` has the changes you
are applying.
diff --git a/libc/docs/dev/index.rst b/libc/docs/dev/index.rst
index c16121feb3a4..9ed50bb6683a 100644
--- a/libc/docs/dev/index.rst
+++ b/libc/docs/dev/index.rst
@@ -7,6 +7,7 @@ Developer Guides
Navigate to the links below for information on the respective topics:
.. toctree::
+ :maxdepth: 1
code_style
source_tree_layout
diff --git a/libc/docs/dev/source_tree_layout.rst b/libc/docs/dev/source_tree_layout.rst
index 0010f138317b..62c0434a0b2a 100644
--- a/libc/docs/dev/source_tree_layout.rst
+++ b/libc/docs/dev/source_tree_layout.rst
@@ -15,7 +15,6 @@ directories::
- examples
- fuzzing
- hdr
- - hdrgen
- include
- lib
- src
@@ -29,8 +28,7 @@ The ``benchmarks`` directory
----------------------------
The ``benchmarks`` directory contains LLVM-libc's benchmarking utilities. These
-are mostly used for the memory functions. This also includes the automemcpy
-subdirectory for automatic generation of optimized memory functions.
+are mostly used for the memory functions.
The ``config`` directory
------------------------
@@ -89,15 +87,6 @@ The ``lib`` directory
This directory contains a ``CMakeLists.txt`` file listing the targets for the
public libraries ``libc.a``, ``libm.a`` etc.
-The ``hdrgen`` directory
----------------------------
-
-This directory contains the sources and specifications for the types, macros
-and entrypoint functions. These definitions are organized in the ``yaml``
-subdirectory and match the organization of the ``*.h.def`` files. This folder
-also contains the python sources for headergen, which is what generates the
-headers.
-
The ``src`` directory
---------------------
diff --git a/libc/docs/fenv.rst b/libc/docs/fenv.rst
deleted file mode 100644
index 2492e22d2fd7..000000000000
--- a/libc/docs/fenv.rst
+++ /dev/null
@@ -1,175 +0,0 @@
-.. include:: check.rst
-
-======
-fenv.h
-======
-
-Macros
-======
-
-.. list-table::
- :widths: auto
- :align: center
- :header-rows: 1
-
- * - Macro
- - Implemented
- - C23 Standard Section
- - POSIX.1-2017 Standard Section
- * - FE_ALL_EXCEPT
- - |check|
- - 7.6.12
- -
- * - FE_DEC_DOWNWARD
- -
- - 7.6.14
- -
- * - FE_DEC_TONEAREST
- -
- - 7.6.14
- -
- * - FE_DEC_TONEARESTFROMZERO
- -
- - 7.6.14
- -
- * - FE_DEC_TOWARDZERO
- -
- - 7.6.14
- -
- * - FE_DEC_UPWARD
- -
- - 7.6.14
- -
- * - FE_DFL_ENV
- - |check|
- - 7.6.17
- -
- * - FE_DFL_MODE
- -
- - 7.6.11
- -
- * - FE_DIVBYZERO
- - |check|
- - 7.6.9
- -
- * - FE_DOWNARD
- -
- - 7.6.13
- -
- * - FE_INEXACT
- - |check|
- - 7.6.9
- -
- * - FE_INVALID
- - |check|
- - 7.6.9
- -
- * - FE_OVERFLOW
- - |check|
- - 7.6.9
- -
- * - FE_TONEAREST
- - |check|
- - 7.6.13
- -
- * - FE_TONEARESTFROMZERO
- -
- - 7.6.13
- -
- * - FE_TOWARDZERO
- - |check|
- - 7.6.13
- -
- * - FE_UNDERFLOW
- - |check|
- - 7.6.9
- -
- * - FE_UPWARD
- - |check|
- - 7.6.13
- -
- * - __STDC_VERSION_FENV_H__
- -
- - 7.6.5
- -
-
-Functions
-=========
-
-.. list-table::
- :widths: auto
- :align: center
- :header-rows: 1
-
- * - Function
- - Implemented
- - C23 Standard Section
- - POSIX.1-2017 Standard Section
- * - fe_dec_getround
- -
- - 7.6.5.3
- -
- * - fe_dec_setround
- -
- - 7.6.5.6
- -
- * - feclearexcept
- - |check|
- - 7.6.4.1
- -
- * - fegetenv
- - |check|
- - 7.6.6.1
- -
- * - fegetexceptflag
- - |check|
- - 7.6.4.2
- -
- * - fegetmode
- -
- - 7.6.5.1
- -
- * - fegetround
- - |check|
- - 7.6.5.2
- -
- * - feholdexcept
- - |check|
- - 7.6.6.2
- -
- * - feraiseexcept
- - |check|
- - 7.6.4.3
- -
- * - fesetenv
- - |check|
- - 7.6.6.3
- -
- * - fesetexcept
- - |check|
- - 7.6.4.4
- -
- * - fesetexceptflag
- - |check|
- - 7.6.4.5
- -
- * - fesetmode
- -
- - 7.6.5.4
- -
- * - fesetround
- - |check|
- - 7.6.5.5
- -
- * - fetestexcept
- - |check|
- - 7.6.4.7
- -
- * - fetestexceptflag
- - |check|
- - 7.6.4.6
- -
- * - feupdateenv
- - |check|
- - 7.6.6.4
- -
diff --git a/libc/docs/full_cross_build.rst b/libc/docs/full_cross_build.rst
index 5f57169d228e..cd1ec89e5d5e 100644
--- a/libc/docs/full_cross_build.rst
+++ b/libc/docs/full_cross_build.rst
@@ -8,7 +8,7 @@ Full Cross Build
:depth: 1
:local:
-.. note::
+.. note::
Fullbuild requires running headergen, which is a python program that depends on
pyyaml. The minimum versions are listed on the :ref:`header_generation`
page, as well as additional information.
@@ -95,8 +95,8 @@ configure step.
Bootstrap cross build
=====================
-In this recipe, the clang compiler and the ``libc-hdrgen`` binary, both are
-built automatically before building the libc for the target.
+In this recipe, the clang compiler is built automatically before building
+the libc for the target.
CMake configure step
--------------------
@@ -151,8 +151,8 @@ built using any of the three recipes described above.
Building for the GPU
====================
-To build for a GPU architecture, it should only be necessary to specify the
-target triple as one of the supported GPU targets. Currently, this is either
-``nvptx64-nvidia-cuda`` for NVIDIA GPUs or ``amdgcn-amd-amdhsa`` for AMD GPUs.
-More detailed information is provided in the :ref:`GPU
+To build for a GPU architecture, it should only be necessary to specify the
+target triple as one of the supported GPU targets. Currently, this is either
+``nvptx64-nvidia-cuda`` for NVIDIA GPUs or ``amdgcn-amd-amdhsa`` for AMD GPUs.
+More detailed information is provided in the :ref:`GPU
documentation<libc_gpu_building>`.
diff --git a/libc/docs/full_host_build.rst b/libc/docs/full_host_build.rst
index f687c2fdab21..e25079141f47 100644
--- a/libc/docs/full_host_build.rst
+++ b/libc/docs/full_host_build.rst
@@ -8,7 +8,7 @@ Full Host Build
:depth: 1
:local:
-.. note::
+.. note::
Fullbuild requires running headergen, which is a python program that depends on
pyyaml. The minimum versions are listed on the :ref:`header_generation`
page, as well as additional information.
@@ -99,11 +99,16 @@ a C++ standard library (like libc++). Hence, we do not include
`libc++ <https://libcxx.llvm.org/>`_, libcxx-abi and libunwind in the
LLVM only toolchain and use them to build and link C++ applications.
-Below is the list of commands for a simple recipe to build and install the
-libc components along with other components of an LLVM only toolchain. In this
-we've set the Ninja generator, enabled a full compiler suite, set the build
-type to "Debug", and enabled the Scudo allocator. The build also tells clang
-to use the freshly built lld and compiler-rt.
+Below is the cmake command for a bootstrapping build of LLVM. This will build
+clang and lld with the current system's toolchain, then build compiler-rt and
+LLVM-libc with that freshly built clang. This ensures that LLVM-libc can take
+advantage of the latest clang features and optimizations.
+
+This build also uses Ninja as cmake's generator, and sets lld and compiler-rt as
+the default for the fresh clang. Those settings are recommended, but the build
+should still work without them. The compiler-rt options are required for
+building `Scudo <https://llvm.org/docs/ScudoHardenedAllocator.html>`_ as the
+allocator for LLVM-libc.
.. note::
if your build fails with an error saying the compiler can't find
@@ -113,7 +118,6 @@ to use the freshly built lld and compiler-rt.
this command:
``sudo ln -s /usr/include/<TARGET TRIPLE>/asm /usr/include/asm``
-.. TODO: Move from projects to runtimes for libc, compiler-rt
.. code-block:: sh
$> cd llvm-project # The llvm-project checkout
@@ -122,8 +126,9 @@ to use the freshly built lld and compiler-rt.
$> SYSROOT=/path/to/sysroot # Remember to set this!
$> cmake ../llvm \
-G Ninja \
- -DLLVM_ENABLE_PROJECTS="clang;lld;libc;compiler-rt" \
- -DCMAKE_BUILD_TYPE=Debug \
+ -DLLVM_ENABLE_PROJECTS="clang;lld" \
+ -DLLVM_ENABLE_RUNTIMES="libc;compiler-rt" \
+ -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_C_COMPILER=clang \
-DCMAKE_CXX_COMPILER=clang++ \
-DLLVM_LIBC_FULL_BUILD=ON \
@@ -133,25 +138,8 @@ to use the freshly built lld and compiler-rt.
-DCOMPILER_RT_SCUDO_STANDALONE_BUILD_SHARED=OFF \
-DCLANG_DEFAULT_LINKER=lld \
-DCLANG_DEFAULT_RTLIB=compiler-rt \
- -DDEFAULT_SYSROOT=$SYSROOT \
-DCMAKE_INSTALL_PREFIX=$SYSROOT
-We will go over some of the special options passed to the ``cmake`` command
-above.
-
-* **Enabled Projects** - Since we want to build and install clang, lld
- and compiler-rt along with the libc, we specify
- ``clang;libc;lld;compiler-rt`` as the list of enabled projects.
-* **The full build option** - Since we want to do build the full libc, we pass
- ``-DLLVM_LIBC_FULL_BUILD=ON``.
-* **Scudo related options** - LLVM's libc uses
- `Scudo <https://llvm.org/docs/ScudoHardenedAllocator.html>`_ as its allocator.
- So, when building the full libc, we should specify that we want to include
- Scudo in the libc. Since the libc currently only supports static linking, we
- also specify that we do not want to build the Scudo shared library.
-* **Default sysroot and install prefix** - This is the path to the tool chain
- install directory. This is the directory where you intend to set up the sysroot.
-
Build and install
=================
@@ -164,14 +152,19 @@ Build and install
you may need to delete them from ``/usr/local/include``.
After configuring the build with the above ``cmake`` command, one can build and
-install the libc, clang (and its support libraries and builtins), lld and
-compiler-rt, with the following command:
+install the toolchain with
.. code-block:: sh
$> ninja install-clang install-builtins install-compiler-rt \
install-core-resource-headers install-libc install-lld
+or
+
+.. code-block:: sh
+
+ $> ninja install
+
Once the above command completes successfully, the ``$SYSROOT`` directory you
have specified with the CMake configure step above will contain a full LLVM-only
toolchain with which you can build practical/real-world C applications. See
@@ -190,9 +183,9 @@ These instructions should work on a Debian-based x86_64 system:
$> apt download linux-libc-dev
$> dpkg -x linux-libc-dev*deb .
- $> mv usr/include/* /path/to/sysroot/include
- $> rm -rf usr linux-libc-dev*deb
- $> ln -s x86_64-linux-gnu/asm ~/Programming/sysroot/include/asm
+ $> cp -r usr/* /path/to/sysroot/
+ $> rm -r usr linux-libc-dev*deb
+ $> ln -s /path/to/sysroot/include/x86_64-linux-gnu/asm /path/to/sysroot/include/asm
Using your newly built libc
===========================
@@ -208,3 +201,20 @@ invocation:
Because the libc does not yet support dynamic linking, the -static parameter
must be added to all clang invocations.
+
+You can make sure you're using the newly built toolchain by trying out features
+that aren't yet supported by the system toolchain, such as fixed point. The
+following is an example program that demonstrates the difference:
+
+.. code-block:: C
+
+ // $ $SYSROOT/bin/clang example.c -static -ffixed-point --sysroot=$SYSROOT
+
+ #include <stdio.h>
+ int main() {
+ printf("Hello, World!\n%.9f\n%.9lK\n",
+ 4294967295.000000001,
+ 4294967295.000000001ulK);
+ return 0;
+ }
+
diff --git a/libc/docs/gpu/rpc.rst b/libc/docs/gpu/rpc.rst
index e1244154341e..0d169c7db9a5 100644
--- a/libc/docs/gpu/rpc.rst
+++ b/libc/docs/gpu/rpc.rst
@@ -92,20 +92,6 @@ asynchronous operations that do not need to wait until the server has completed
them. If an operation requires more data than the fixed size buffer, we simply
send multiple packets back and forth in a streaming fashion.
-Server Library
---------------
-
-The RPC server's basic functionality is provided by the LLVM C library. A static
-library called ``libllvmlibc_rpc_server.a`` includes handling for the basic
-operations, such as printing or exiting. This has a small API that handles
-setting up the unified buffer and an interface to check the opcodes.
-
-Some operations are too divergent to provide generic implementations for, such
-as allocating device accessible memory. For these cases, we provide a callback
-registration scheme to add a custom handler for any given opcode through the
-port API. More information can be found in the installed header
-``<install>/include/llvmlibc_rpc_server.h``.
-
Client Example
--------------
@@ -183,7 +169,7 @@ CUDA Server Example
The following code shows an example of using the exported RPC interface along
with the C library to manually configure a working server using the CUDA
-language. Other runtimes can use the presence of the ``__llvm_libc_rpc_client``
+language. Other runtimes can use the presence of the ``__llvm_rpc_client``
in the GPU executable as an indicator for whether or not the server can be
checked. These details should ideally be handled by the GPU language runtime,
but the following example shows how it can be used by a standard user.
@@ -196,53 +182,16 @@ but the following example shows how it can be used by a standard user.
#include <cstdlib>
#include <cuda_runtime.h>
- #include <llvmlibc_rpc_server.h>
+ #include <shared/rpc.h>
+ #include <shared/rpc_opcodes.h>
[[noreturn]] void handle_error(cudaError_t err) {
fprintf(stderr, "CUDA error: %s\n", cudaGetErrorString(err));
exit(EXIT_FAILURE);
}
- [[noreturn]] void handle_error(rpc_status_t err) {
- fprintf(stderr, "RPC error: %d\n", err);
- exit(EXIT_FAILURE);
- }
-
- // The handle to the RPC client provided by the C library.
- extern "C" __device__ void *__llvm_libc_rpc_client;
-
- __global__ void get_client_ptr(void **ptr) { *ptr = __llvm_libc_rpc_client; }
-
- // Obtain the RPC client's handle from the device. The CUDA language cannot look
- // up the symbol directly like the driver API, so we launch a kernel to read it.
- void *get_rpc_client() {
- void *rpc_client = nullptr;
- void **rpc_client_d = nullptr;
-
- if (cudaError_t err = cudaMalloc(&rpc_client_d, sizeof(void *)))
- handle_error(err);
- get_client_ptr<<<1, 1>>>(rpc_client_d);
- if (cudaError_t err = cudaDeviceSynchronize())
- handle_error(err);
- if (cudaError_t err = cudaMemcpy(&rpc_client, rpc_client_d, sizeof(void *),
- cudaMemcpyDeviceToHost))
- handle_error(err);
- return rpc_client;
- }
-
- // Routines to allocate mapped memory that both the host and the device can
- // access asychonrously to communicate with each other.
- void *alloc_host(size_t size, void *) {
- void *sharable_ptr;
- if (cudaError_t err = cudaMallocHost(&sharable_ptr, sizeof(void *)))
- handle_error(err);
- return sharable_ptr;
- };
-
- void free_host(void *ptr, void *) {
- if (cudaError_t err = cudaFreeHost(ptr))
- handle_error(err);
- }
+ // Routes the library symbol into the CUDA runtime interface.
+ [[gnu::weak]] __device__ rpc::Client client asm("__llvm_rpc_client");
// The device-side overload of the standard C function to call.
extern "C" __device__ int puts(const char *);
@@ -251,18 +200,23 @@ but the following example shows how it can be used by a standard user.
__global__ void hello() { puts("Hello world!"); }
int main() {
- // Initialize the RPC server to run on the given device.
- rpc_device_t device;
- if (rpc_status_t err =
- rpc_server_init(&device, RPC_MAXIMUM_PORT_COUNT,
- /*warp_size=*/32, alloc_host, /*data=*/nullptr))
+ void *rpc_client = nullptr;
+ if (cudaError_t err = cudaGetSymbolAddress(&rpc_client, client))
+ handle_error(err);
+
+ // Initialize the RPC client and server interface.
+ uint32_t warp_size = 32;
+ void *rpc_buffer = nullptr;
+ if (cudaError_t err = cudaMallocHost(
+ &rpc_buffer,
+ rpc::Server::allocation_size(warp_size, rpc::MAX_PORT_COUNT)))
handle_error(err);
+ rpc::Server server(rpc::MAX_PORT_COUNT, rpc_buffer);
+ rpc::Client client(rpc::MAX_PORT_COUNT, rpc_buffer);
- // Initialize the RPC client by copying the buffer to the device's handle.
- void *rpc_client = get_rpc_client();
- if (cudaError_t err =
- cudaMemcpy(rpc_client, rpc_get_client_buffer(device),
- rpc_get_client_size(), cudaMemcpyHostToDevice))
+ // Initialize the client on the device so it can communicate with the server.
+ if (cudaError_t err = cudaMemcpy(rpc_client, &client, sizeof(rpc::Client),
+ cudaMemcpyHostToDevice))
handle_error(err);
cudaStream_t stream;
@@ -274,28 +228,25 @@ but the following example shows how it can be used by a standard user.
// While the kernel is executing, check the RPC server for work to do.
// Requires non-blocking CUDA kernels but avoids a separate thread.
- while (cudaStreamQuery(stream) == cudaErrorNotReady)
- if (rpc_status_t err = rpc_handle_server(device))
- handle_error(err);
-
- // Shut down the server running on the given device.
- if (rpc_status_t err =
- rpc_server_shutdown(device, free_host, /*data=*/nullptr))
- handle_error(err);
-
- return EXIT_SUCCESS;
+ do {
+ auto port = server.try_open(warp_size, /*index=*/0);
+ // From libllvmlibc_rpc_server.a in the installation.
+ if (port)
+ handle_libc_opcodes(*port, warp_size);
+ } while (cudaStreamQuery(stream) == cudaErrorNotReady);
}
The above code must be compiled in CUDA's relocatable device code mode and with
the advanced offloading driver to link in the library. Currently this can be
done with the following invocation. Using LTO avoids the overhead normally
-associated with relocatable device code linking.
+associated with relocatable device code linking. The C library for GPUs is
+linked in by forwarding the static library to the device-side link job.
.. code-block:: sh
- $> clang++ -x cuda rpc.cpp --offload-arch=native -fgpu-rdc -lcudart -lcgpu-nvptx \
+ $> clang++ -x cuda rpc.cpp --offload-arch=native -fgpu-rdc -lcudart \
-I<install-path>include -L<install-path>/lib -lllvmlibc_rpc_server \
- -O3 -foffload-lto -o hello
+ -Xoffload-linker -lc -O3 -foffload-lto -o hello
$> ./hello
Hello world!
@@ -304,4 +255,5 @@ Extensions
The opcode is a 32-bit integer that must be unique to the requested operation.
All opcodes used by ``libc`` internally have the character ``c`` in the most
-significant byte.
+significant byte. Any other opcode is available for use outside of the ``libc``
+implementation.
diff --git a/libc/docs/gpu/using.rst b/libc/docs/gpu/using.rst
index e56b6f634bb3..1c1f9c9bfb0c 100644
--- a/libc/docs/gpu/using.rst
+++ b/libc/docs/gpu/using.rst
@@ -99,39 +99,6 @@ threads and two blocks.
Including the wrapper headers, linking the C library, and running the :ref:`RPC
server<libc_gpu_rpc>` are all handled automatically by the compiler and runtime.
-Binary format
-^^^^^^^^^^^^^
-
-The ``libcgpu.a`` static archive is a fat-binary containing LLVM-IR for each
-supported target device. The supported architectures can be seen using LLVM's
-``llvm-objdump`` with the ``--offloading`` flag:
-
-.. code-block:: sh
-
- $> llvm-objdump --offloading libcgpu-amdgpu.a
- libcgpu-amdgpu.a(strcmp.cpp.o): file format elf64-x86-64
-
- OFFLOADING IMAGE [0]:
- kind llvm ir
- arch generic
- triple amdgcn-amd-amdhsa
- producer none
- ...
-
-Because the device code is stored inside a fat binary, it can be difficult to
-inspect the resulting code. This can be done using the following utilities:
-
-.. code-block:: sh
-
- $> llvm-ar x libcgpu.a strcmp.cpp.o
- $> clang-offload-packager strcmp.cpp.o --image=arch=generic,file=strcmp.bc
- $> opt -S out.bc
- ...
-
-Please note that this fat binary format is provided for compatibility with
-existing offloading toolchains. The implementation in ``libc`` does not depend
-on any existing offloading languages and is completely freestanding.
-
Direct compilation
------------------
@@ -246,7 +213,7 @@ compilation. Using link time optimization will help hide this.
.. code-block:: sh
- $> clang hello.c --target=nvptx64-nvidia-cuda -mcpu=native -flto -lc <install>/lib/nvptx64-nvidia-cuda/crt1.o
+ $> clang hello.c --target=nvptx64-nvidia-cuda -march=native -flto -lc <install>/lib/nvptx64-nvidia-cuda/crt1.o
$> nvptx-loader --threads 2 --blocks 2 a.out
Hello from NVPTX!
Hello from NVPTX!
diff --git a/libc/docs/header_gen_scheme.svg b/libc/docs/header_gen_scheme.svg
deleted file mode 100644
index 2b2318b1a045..000000000000
--- a/libc/docs/header_gen_scheme.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg version="1.1" viewBox="0.0 0.0 962.0 926.0" fill="none" stroke="none" stroke-linecap="square" stroke-miterlimit="10" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg"><clipPath id="p.0"><path d="m0 0l962.0 0l0 926.0l-962.0 0l0 -926.0z" clip-rule="nonzero"/></clipPath><g clip-path="url(#p.0)"><path fill="#000000" fill-opacity="0.0" d="m0 0l962.0 0l0 926.0l-962.0 0z" fill-rule="evenodd"/><path fill="#cfe2f3" d="m16.17323 19.209974l140.53543 0l0 161.76378l-140.53543 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m16.17323 19.209974l140.53543 0l0 161.76378l-140.53543 0z" fill-rule="evenodd"/><path fill="#000000" d="m31.92323 40.626236l-4.28125 9.21875q-0.15625 0.34375 -0.28125 0.453125q-0.171875 0.125 -0.421875 0.125q-0.265625 0 -0.46875 -0.203125q-0.203125 -0.1875 -0.203125 -0.4375q0 -0.171875 0.15625 -0.5l4.296875 -9.21875q0.15625 -0.34375 0.28125 -0.453125q0.171875 -0.125 0.40625 -0.125q0.28125 0 0.46875 0.1875q0.203125 0.1875 0.203125 0.4375q0 0.171875 -0.15625 0.515625zm7.998184 0l-4.28125 9.21875q-0.15625 0.34375 -0.28125 0.453125q-0.171875 0.125 -0.421875 0.125q-0.265625 0 -0.46875 -0.203125q-0.203125 -0.1875 -0.203125 -0.4375q0 -0.171875 0.15625 -0.5l4.296875 -9.21875q0.15625 -0.34375 0.28125 -0.453125q0.171875 -0.125 0.40625 -0.125q0.28125 0 0.46875 0.1875q0.203125 0.1875 0.203125 0.4375q0 0.171875 -0.15625 0.515625zm11.183868 2.359375l0 0.375q0.328125 -0.3125 0.59375 -0.4375q0.265625 -0.125 0.609375 -0.125q0.28125 0 0.5625 0.140625q0.296875 0.140625 0.578125 0.4375q0.34375 -0.296875 0.6875 -0.421875q0.359375 -0.140625 0.734375 -0.140625q0.734375 0 1.203125 0.390625q0.609375 0.515625 0.609375 1.359375l0 3.0q0.421875 0 0.625 0.1875q0.203125 0.1875 0.203125 0.484375q0 0.28125 -0.203125 0.46875q-0.203125 0.1875 -0.6875 0.1875l-1.265625 0l0 -4.203125q0 -0.3125 -0.109375 -0.421875q-0.109375 -0.125 -0.34375 -0.125q-0.21875 0 -0.40625 0.109375q-0.25 0.171875 -0.59375 0.625l0 2.6875q0.421875 0 0.625 0.1875q0.203125 0.1875 0.203125 0.484375q0 0.28125 -0.203125 0.46875q-0.203125 0.1875 -0.6875 0.1875l-1.265625 0l0 -4.203125q0 -0.3125 -0.125 -0.421875q-0.109375 -0.125 -0.328125 -0.125q-0.234375 0 -0.46875 0.15625q-0.21875 0.140625 -0.546875 0.578125l0 2.6875q0.421875 0 0.625 0.1875q0.203125 0.1875 0.203125 0.484375q0 0.28125 -0.203125 0.46875q-0.203125 0.1875 -0.6875 0.1875l-1.203125 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.296875 0.203125 -0.46875q0.203125 -0.1875 0.625 -0.1875l0 -3.25q-0.421875 0 -0.625 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.28125 0.203125 -0.46875q0.203125 -0.1875 0.6875 -0.1875l1.265625 0zm11.263809 5.90625l0 -0.3125q-0.5 0.265625 -1.109375 0.390625q-0.609375 0.140625 -1.09375 0.140625q-1.078125 0 -1.75 -0.5625q-0.671875 -0.578125 -0.671875 -1.265625q0 -0.84375 0.859375 -1.5625q0.859375 -0.71875 2.359375 -0.71875q0.609375 0 1.40625 0.140625l0 -0.328125q0 -0.296875 -0.265625 -0.484375q-0.25 -0.1875 -0.96875 -0.1875q-0.59375 0 -1.546875 0.234375q-0.34375 0.078125 -0.546875 0.078125q-0.265625 0 -0.453125 -0.1875q-0.171875 -0.1875 -0.171875 -0.484375q0 -0.171875 0.0625 -0.296875q0.0625 -0.125 0.171875 -0.203125q0.125 -0.078125 0.5 -0.171875q0.484375 -0.140625 1.0 -0.21875q0.515625 -0.078125 0.9375 -0.078125q1.234375 0 1.921875 0.53125q0.6875 0.53125 0.6875 1.46875l0 2.75l0.234375 0q0.4843712 0 0.6874962 0.1875q0.203125 0.171875 0.203125 0.484375q0 0.28125 -0.203125 0.46875q-0.203125 0.1875 -0.6874962 0.1875l-1.5625 0zm0 -2.390625q-0.796875 -0.15625 -1.484375 -0.15625q-0.8125 0 -1.390625 0.40625q-0.375 0.25 -0.375 0.5q0 0.203125 0.1875 0.3125q0.3125 0.21875 0.890625 0.21875q0.46875 0 1.078125 -0.1875q0.609375 -0.1875 1.09375 -0.515625l0 -0.578125zm6.4669304 -2.1875l0 2.671875q0 0.4375 0.171875 0.578125q0.28125 0.203125 0.984375 0.203125q1.015625 0 1.875 -0.4375q0.34375 -0.15625 0.53125 -0.15625q0.25 0 0.4375 0.203125q0.203125 0.1875 0.203125 0.46875q0 0.25 -0.203125 0.4375q-0.328125 0.3125 -1.265625 0.578125q-0.9375 0.25 -1.578125 0.25q-1.25 0 -1.875 -0.53125q-0.609375 -0.546875 -0.609375 -1.328125l0 -2.9375l-0.484375 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.28125 0.203125 -0.46875q0.203125 -0.1875 0.6875 -0.1875l0.484375 0l0 -1.203125q0 -0.484375 0.171875 -0.6875q0.1875 -0.203125 0.484375 -0.203125q0.296875 0 0.484375 0.203125q0.1875 0.203125 0.1875 0.6875l0 1.203125l2.46875 0q0.484375 0 0.6875 0.1875q0.203125 0.1875 0.203125 0.484375q0 0.28125 -0.203125 0.46875q-0.203125 0.1875 -0.6875 0.1875l-2.46875 0zm6.951309 -3.859375l0 2.84375q0.421875 -0.25 0.84375 -0.359375q0.421875 -0.125 0.859375 -0.125q0.6875 0 1.21875 0.234375q0.546875 0.234375 0.90625 0.734375q0.359375 0.5 0.359375 1.265625l0 2.515625q0.5 0 0.65625 0.09375q0.3125 0.203125 0.3125 0.578125q0 0.28125 -0.203125 0.46875q-0.203125 0.1875 -0.6875 0.1875l-1.515625 0q-0.46875 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.359375 0.3125 -0.5625q0.171875 -0.109375 0.671875 -0.09375l0 -2.421875q0 -0.515625 -0.234375 -0.71875q-0.3125 -0.28125 -0.90625 -0.28125q-0.4375 0 -0.78125 0.171875q-0.34375 0.171875 -0.921875 0.75l0 2.5q0.515625 0 0.65625 0.09375q0.328125 0.203125 0.328125 0.578125q0 0.28125 -0.203125 0.46875q-0.203125 0.1875 -0.6875 0.1875l-1.515625 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.359375 0.3125 -0.5625q0.15625 -0.109375 0.65625 -0.09375l0 -5.78125l-0.21875 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.28125 0.203125 -0.46875q0.203125 -0.1875 0.6875 -0.1875l1.5625 0zm10.388809 7.765625q0 0.375 -0.265625 0.640625q-0.265625 0.25 -0.734375 0.25q-0.46875 0 -0.734375 -0.25q-0.265625 -0.265625 -0.265625 -0.640625q0 -0.375 0.265625 -0.625q0.265625 -0.265625 0.734375 -0.265625q0.46875 0 0.734375 0.265625q0.265625 0.25 0.265625 0.625zm5.607559 -7.765625l0 2.84375q0.421875 -0.25 0.84375 -0.359375q0.421875 -0.125 0.859375 -0.125q0.6875 0 1.21875 0.234375q0.546875 0.234375 0.90625 0.734375q0.359375 0.5 0.359375 1.265625l0 2.515625q0.5 0 0.65625 0.09375q0.3125 0.203125 0.3125 0.578125q0 0.28125 -0.203125 0.46875q-0.203125 0.1875 -0.6875 0.1875l-1.515625 0q-0.46875 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.359375 0.3125 -0.5625q0.171875 -0.109375 0.671875 -0.09375l0 -2.421875q0 -0.515625 -0.234375 -0.71875q-0.3125 -0.28125 -0.90625 -0.28125q-0.4375 0 -0.78125 0.171875q-0.34375 0.171875 -0.921875 0.75l0 2.5q0.515625 0 0.65625 0.09375q0.328125 0.203125 0.328125 0.578125q0 0.28125 -0.203125 0.46875q-0.203125 0.1875 -0.6875 0.1875l-1.515625 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.359375 0.3125 -0.5625q0.15625 -0.109375 0.65625 -0.09375l0 -5.78125l-0.21875 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.28125 0.203125 -0.46875q0.203125 -0.1875 0.6875 -0.1875l1.5625 0zm10.388809 7.765625q0 0.375 -0.265625 0.640625q-0.265625 0.25 -0.734375 0.25q-0.46875 0 -0.734375 -0.25q-0.265625 -0.265625 -0.265625 -0.640625q0 -0.375 0.265625 -0.625q0.265625 -0.265625 0.734375 -0.265625q0.46875 0 0.734375 0.265625q0.265625 0.25 0.265625 0.625zm10.045059 -7.765625l0 7.109375l0.21875 0q0.484375 0 0.6875 0.1875q0.21875 0.171875 0.21875 0.484375q0 0.28125 -0.21875 0.46875q-0.203125 0.1875 -0.6875 0.1875l-1.546875 0l0 -0.328125q-0.46875 0.265625 -0.96875 0.40625q-0.484375 0.140625 -1.03125 0.140625q-1.5 0 -2.421875 -0.859375q-0.90625 -0.875 -0.90625 -2.171875q0 -1.359375 0.953125 -2.3125q0.96875 -0.953125 2.359375 -0.953125q0.515625 0 1.015625 0.15625q0.5 0.15625 1.0 0.46875l0 -1.65625l-0.234375 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.46875q0 -0.296875 0.203125 -0.484375q0.203125 -0.1875 0.6875 -0.1875l1.5625 0zm-1.328125 5.65625q0 -0.828125 -0.59375 -1.390625q-0.578125 -0.578125 -1.40625 -0.578125q-0.84375 0 -1.421875 0.578125q-0.578125 0.5625 -0.578125 1.375q0 0.734375 0.515625 1.203125q0.53125 0.46875 1.484375 0.46875q0.9375 0 1.46875 -0.46875q0.53125 -0.46875 0.53125 -1.1875zm9.607559 0.5l-5.46875 0q0.203125 0.53125 0.734375 0.84375q0.53125 0.3125 1.4375 0.3125q0.75 0 1.96875 -0.3125q0.515625 -0.125 0.703125 -0.125q0.265625 0 0.453125 0.1875q0.1875 0.1875 0.1875 0.46875q0 0.265625 -0.203125 0.4375q-0.265625 0.25 -1.28125 0.46875q-1.0 0.21875 -1.921875 0.21875q-1.609375 0 -2.578125 -0.90625q-0.953125 -0.90625 -0.953125 -2.234375q0 -1.40625 1.03125 -2.28125q1.046875 -0.875 2.40625 -0.875q0.8125 0 1.484375 0.28125q0.6875 0.28125 1.015625 0.609375q0.46875 0.484375 0.78125 1.203125q0.203125 0.484375 0.203125 1.140625l0 0.5625zm-1.46875 -1.328125q-0.3125 -0.578125 -0.8125 -0.859375q-0.484375 -0.28125 -1.171875 -0.28125q-0.671875 0 -1.171875 0.28125q-0.5 0.28125 -0.8125 0.859375l3.96875 0zm6.107559 -0.96875l0 3.25l1.90625 0q0.484375 0 0.6875 0.1875q0.203125 0.171875 0.203125 0.484375q0 0.28125 -0.203125 0.46875q-0.203125 0.1875 -0.6875 0.1875l-4.03125 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.296875 0.203125 -0.46875q0.203125 -0.1875 0.6875 -0.1875l0.796875 0l0 -3.25l-0.640625 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.28125 0.203125 -0.46875q0.203125 -0.1875 0.6875 -0.1875l0.640625 0l0 -0.515625q0 -0.859375 0.65625 -1.4375q0.65625 -0.578125 1.890625 -0.578125q0.5625 0 1.28125 0.109375q0.7187576 0.09375 0.9218826 0.28125q0.21875 0.171875 0.21875 0.453125q0 0.3125 -0.1875 0.515625q-0.1875 0.1875 -0.453125 0.1875q-0.125 0 -0.35938263 -0.046875q-0.828125 -0.171875 -1.46875 -0.171875q-0.671875 0 -0.921875 0.203125q-0.25 0.203125 -0.25 0.484375l0 0.515625l2.0625 0q0.484375 0 0.6875 0.1875q0.20313263 0.1875 0.20313263 0.484375q0 0.28125 -0.20313263 0.46875q-0.203125 0.1875 -0.6875 0.1875l-2.0625 0z" fill-rule="nonzero"/><path fill="#000000" d="m27.11073 80.42311q0 0.28125 -0.1875 0.46875q-0.1875 0.1875 -0.453125 0.1875q-0.28125 0 -0.46875 -0.1875q-0.1875 -0.1875 -0.1875 -0.46875q0 -0.265625 0.1875 -0.453125q0.1875 -0.1875 0.46875 -0.1875q0.265625 0 0.453125 0.1875q0.1875 0.1875 0.1875 0.453125zm2.609375 0q0 0.28125 -0.1875 0.46875q-0.1875 0.1875 -0.46875 0.1875q-0.265625 0 -0.453125 -0.1875q-0.1875 -0.1875 -0.1875 -0.46875q0 -0.265625 0.1875 -0.453125q0.1875 -0.1875 0.453125 -0.1875q0.28125 0 0.46875 0.1875q0.1875 0.1875 0.1875 0.453125zm2.609375 0q0 0.28125 -0.1875 0.46875q-0.1875 0.1875 -0.46875 0.1875q-0.265625 0 -0.453125 -0.1875q-0.1875 -0.1875 -0.1875 -0.46875q0 -0.265625 0.1875 -0.453125q0.1875 -0.1875 0.453125 -0.1875q0.28125 0 0.46875 0.1875q0.1875 0.1875 0.1875 0.453125z" fill-rule="nonzero"/><path fill="#000000" d="m29.876354 106.438736q0 0.6875 -0.484375 1.171875q-0.46875 0.484375 -1.140625 0.484375q-0.671875 0 -1.15625 -0.484375q-0.46875 -0.484375 -0.46875 -1.171875q0 -0.6875 0.46875 -1.15625q0.484375 -0.484375 1.15625 -0.484375q0.6875 0 1.15625 0.484375q0.46875 0.46875 0.46875 1.15625zm-0.375 0q0 -0.515625 -0.375 -0.890625q-0.359375 -0.375 -0.875 -0.375q-0.5 0 -0.875 0.375q-0.359375 0.375 -0.359375 0.890625q0 0.53125 0.359375 0.90625q0.375 0.359375 0.875 0.359375q0.515625 0 0.875 -0.359375q0.375 -0.375 0.375 -0.90625zm2.109375 1.84375l-4.9375 1.609375q-0.09375 0.03125 -0.140625 0.03125q-0.0625 0 -0.125 -0.046875q-0.046875 -0.0625 -0.046875 -0.140625q0 -0.0625 0.046875 -0.125q0.03125 -0.046875 0.140625 -0.078125l4.9375 -1.609375q0.09375 -0.03125 0.140625 -0.03125q0.0625 0 0.109375 0.0625q0.0625 0.0625 0.0625 0.125q0 0.078125 -0.046875 0.140625q-0.03125 0.03125 -0.140625 0.0625zm-0.078125 3.125q0 0.671875 -0.484375 1.15625q-0.484375 0.484375 -1.15625 0.484375q-0.65625 0 -1.140625 -0.484375q-0.484375 -0.484375 -0.484375 -1.15625q0 -0.6875 0.46875 -1.171875q0.484375 -0.484375 1.15625 -0.484375q0.671875 0 1.15625 0.484375q0.484375 0.484375 0.484375 1.171875zm-0.390625 0q0 -0.546875 -0.375 -0.90625q-0.359375 -0.359375 -0.875 -0.359375q-0.515625 0 -0.875 0.375q-0.359375 0.359375 -0.359375 0.890625q0 0.515625 0.359375 0.890625q0.359375 0.359375 0.875 0.359375q0.515625 0 0.875 -0.359375q0.375 -0.375 0.375 -0.890625zm6.5356445 -4.96875q0 0.6875 -0.484375 1.171875q-0.46875 0.484375 -1.140625 0.484375q-0.671875 0 -1.15625 -0.484375q-0.46875 -0.484375 -0.46875 -1.171875q0 -0.6875 0.46875 -1.15625q0.484375 -0.484375 1.15625 -0.484375q0.6875 0 1.15625 0.484375q0.46875 0.46875 0.46875 1.15625zm-0.375 0q0 -0.515625 -0.375 -0.890625q-0.359375 -0.375 -0.875 -0.375q-0.5 0 -0.875 0.375q-0.359375 0.375 -0.359375 0.890625q0 0.53125 0.359375 0.90625q0.375 0.359375 0.875 0.359375q0.515625 0 0.875 -0.359375q0.375 -0.375 0.375 -0.90625zm2.109375 1.84375l-4.9375 1.609375q-0.09375 0.03125 -0.140625 0.03125q-0.0625 0 -0.125 -0.046875q-0.046875 -0.0625 -0.046875 -0.140625q0 -0.0625 0.046875 -0.125q0.03125 -0.046875 0.140625 -0.078125l4.9375 -1.609375q0.09375 -0.03125 0.140625 -0.03125q0.0625 0 0.109375 0.0625q0.0625 0.0625 0.0625 0.125q0 0.078125 -0.046875 0.140625q-0.03125 0.03125 -0.140625 0.0625zm-0.078125 3.125q0 0.671875 -0.484375 1.15625q-0.484375 0.484375 -1.15625 0.484375q-0.65625 0 -1.140625 -0.484375q-0.484375 -0.484375 -0.484375 -1.15625q0 -0.6875 0.46875 -1.171875q0.484375 -0.484375 1.15625 -0.484375q0.671875 0 1.15625 0.484375q0.484375 0.484375 0.484375 1.171875zm-0.390625 0q0 -0.546875 -0.375 -0.90625q-0.359375 -0.359375 -0.875 -0.359375q-0.515625 0 -0.875 0.375q-0.359375 0.359375 -0.359375 0.890625q0 0.515625 0.359375 0.890625q0.359375 0.359375 0.875 0.359375q0.515625 0 0.875 -0.359375q0.375 -0.375 0.375 -0.890625zm3.7231445 -4.015625l0 0.96875q0.484375 -0.578125 1.015625 -0.859375q0.546875 -0.296875 1.296875 -0.296875q0.78125 0 1.453125 0.375q0.671875 0.359375 1.03125 1.015625q0.359375 0.65625 0.359375 1.390625q0 1.140625 -0.828125 1.953125q-0.8125 0.8125 -2.015625 0.8125q-1.421875 0 -2.3125 -1.15625l0 3.21875l1.296875 0q0.1875 0 0.265625 0.0625q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.546875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.09375 -0.0625 0.28125 -0.0625l0.71875 0l0 -6.875l-0.71875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.25 0zm4.625 2.59375q0 -0.921875 -0.671875 -1.578125q-0.671875 -0.65625 -1.640625 -0.65625q-0.96875 0 -1.640625 0.65625q-0.671875 0.65625 -0.671875 1.578125q0 0.90625 0.671875 1.578125q0.671875 0.65625 1.640625 0.65625q0.96875 0 1.640625 -0.65625q0.671875 -0.65625 0.671875 -1.578125zm7.0043945 2.90625l0 -0.78125q-1.078125 0.984375 -2.359375 0.984375q-0.78125 0 -1.1875 -0.421875q-0.515625 -0.5625 -0.515625 -1.296875l0 -3.4375l-0.71875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.25 0l0 3.984375q0 0.515625 0.328125 0.859375q0.328125 0.328125 0.828125 0.328125q1.296875 0 2.375 -1.1875l0 -3.4375l-0.984375 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l1.53125 0l0 4.96875l0.4375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-0.984375 0zm3.9731445 -7.96875l0 3.53125q0.96875 -1.25 2.328125 -1.25q1.171875 0 2.0 0.84375q0.828125 0.84375 0.828125 2.078125q0 1.25 -0.84375 2.109375q-0.828125 0.859375 -1.984375 0.859375q-1.390625 0 -2.328125 -1.25l0 1.046875l-1.25 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.71875 0l0 -6.890625l-0.71875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.25 0zm4.625 5.234375q0 -1.015625 -0.6875 -1.703125q-0.6875 -0.703125 -1.625 -0.703125q-0.921875 0 -1.625 0.703125q-0.6875 0.6875 -0.6875 1.703125q0 1.0 0.6875 1.703125q0.703125 0.703125 1.625 0.703125q0.9375 0 1.625 -0.703125q0.6875 -0.703125 0.6875 -1.703125zm5.4575157 -5.234375l0 7.4375l2.09375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-4.71875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l2.09375 0l0 -6.890625l-1.546875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l2.078125 0zm7.8012695 -0.265625l0 1.375l-0.796875 0l0 -1.375l0.796875 0zm0.015625 2.734375l0 4.96875l2.09375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-4.71875 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l2.09375 0l0 -4.421875l-1.5625 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.078125 -0.078125 0.28125 -0.078125l2.09375 0zm9.73877 0.546875l0 -0.1875q0 -0.1875 0.078125 -0.265625q0.078125 -0.09375 0.1875 -0.09375q0.125 0 0.203125 0.09375q0.078125 0.078125 0.078125 0.265625l0 1.21875q-0.015625 0.1875 -0.09375 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.0625 -0.078125 -0.078125 -0.25q-0.03125 -0.4375 -0.59375 -0.84375q-0.546875 -0.40625 -1.5 -0.40625q-1.1875 0 -1.796875 0.75q-0.609375 0.734375 -0.609375 1.6875q0 1.03125 0.671875 1.703125q0.6875 0.671875 1.765625 0.671875q0.609375 0 1.25 -0.21875q0.65625 -0.234375 1.171875 -0.734375q0.140625 -0.140625 0.234375 -0.140625q0.109375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.265625 -0.640625 0.6875q-1.03125 0.671875 -2.296875 0.671875q-1.28125 0 -2.125 -0.8125q-0.828125 -0.828125 -0.828125 -2.09375q0 -1.28125 0.84375 -2.125q0.859375 -0.859375 2.140625 -0.859375q1.234375 0 2.0625 0.734375zm9.129395 8.515625l-7.09375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.0625 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.09375 -0.0625 0.28125 -0.0625l7.09375 0q0.1875 0 0.265625 0.0625q0.078125 0.078125 0.078125 0.203125q0 0.125 -0.078125 0.1875q-0.078125 0.078125 -0.265625 0.078125zm5.7856445 -3.5625l0 -0.765625q-1.171875 0.96875 -2.484375 0.96875q-0.953125 0 -1.5 -0.484375q-0.53125 -0.484375 -0.53125 -1.1875q0 -0.765625 0.703125 -1.34375q0.71875 -0.578125 2.078125 -0.578125q0.359375 0 0.796875 0.046875q0.4375 0.046875 0.9375 0.140625l0 -0.859375q0 -0.4375 -0.40625 -0.75q-0.40625 -0.328125 -1.21875 -0.328125q-0.625 0 -1.75 0.359375q-0.203125 0.0625 -0.265625 0.0625q-0.09375 0 -0.171875 -0.078125q-0.0625 -0.078125 -0.0625 -0.1875q0 -0.109375 0.0625 -0.171875q0.078125 -0.09375 0.71875 -0.265625q0.984375 -0.265625 1.484375 -0.265625q1.015625 0 1.578125 0.5q0.5625 0.5 0.5625 1.125l0 3.53125l0.71875 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.25 0zm0 -2.65625q-0.375 -0.109375 -0.796875 -0.15625q-0.421875 -0.046875 -0.875 -0.046875q-1.171875 0 -1.828125 0.5q-0.484375 0.375 -0.484375 0.890625q0 0.484375 0.375 0.8125q0.375 0.328125 1.09375 0.328125q0.703125 0 1.296875 -0.265625q0.59375 -0.28125 1.21875 -0.890625l0 -1.171875zm4.2543945 -2.84375l0 0.96875q0.484375 -0.578125 1.015625 -0.859375q0.546875 -0.296875 1.296875 -0.296875q0.78125 0 1.453125 0.375q0.671875 0.359375 1.03125 1.015625q0.359375 0.65625 0.359375 1.390625q0 1.140625 -0.828125 1.953125q-0.8125 0.8125 -2.015625 0.8125q-1.421875 0 -2.3125 -1.15625l0 3.21875l1.296875 0q0.1875 0 0.265625 0.0625q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.546875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.09375 -0.0625 0.28125 -0.0625l0.71875 0l0 -6.875l-0.71875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.25 0zm4.625 2.59375q0 -0.921875 -0.671875 -1.578125q-0.671875 -0.65625 -1.640625 -0.65625q-0.96875 0 -1.640625 0.65625q-0.671875 0.65625 -0.671875 1.578125q0 0.90625 0.671875 1.578125q0.671875 0.65625 1.640625 0.65625q0.96875 0 1.640625 -0.65625q0.671875 -0.65625 0.671875 -1.578125zm5.4575195 -5.328125l0 1.375l-0.796875 0l0 -1.375l0.796875 0zm0.015625 2.734375l0 4.96875l2.09375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-4.71875 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l2.09375 0l0 -4.421875l-1.5625 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.078125 -0.078125 0.28125 -0.078125l2.09375 0zm7.4575195 2.34375q0 -0.734375 0.1875 -1.546875q0.1875 -0.828125 0.71875 -1.890625q0.546875 -1.078125 0.796875 -1.296875q0.078125 -0.078125 0.171875 -0.078125q0.109375 0 0.1875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.0625 -0.046875 0.140625q-0.6875 1.28125 -1.0 2.328125q-0.296875 1.03125 -0.296875 2.078125q0 1.046875 0.296875 2.09375q0.3125 1.03125 1.0 2.3125q0.046875 0.078125 0.046875 0.140625q0 0.09375 -0.078125 0.171875q-0.078125 0.09375 -0.1875 0.09375q-0.09375 0 -0.171875 -0.078125q-0.234375 -0.21875 -0.765625 -1.265625q-0.53125 -1.046875 -0.734375 -1.84375q-0.203125 -0.8125 -0.203125 -1.625zm8.020027 0q0 0.734375 -0.203125 1.546875q-0.1875 0.8125 -0.734375 1.890625q-0.53125 1.078125 -0.78125 1.296875q-0.078125 0.078125 -0.15625 0.078125q-0.125 0 -0.203125 -0.09375q-0.078125 -0.078125 -0.078125 -0.171875q0 -0.0625 0.046875 -0.140625q0.703125 -1.28125 1.0 -2.3125q0.296875 -1.046875 0.296875 -2.09375q0 -1.046875 -0.296875 -2.078125q-0.296875 -1.046875 -1.0 -2.328125q-0.046875 -0.078125 -0.046875 -0.140625q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.203125 -0.078125q0.078125 0 0.15625 0.078125q0.234375 0.203125 0.765625 1.25q0.546875 1.046875 0.75 1.859375q0.203125 0.8125 0.203125 1.625z" fill-rule="nonzero"/><path fill="#000000" d="m27.11073 144.42311q0 0.28125 -0.1875 0.46875q-0.1875 0.1875 -0.453125 0.1875q-0.28125 0 -0.46875 -0.1875q-0.1875 -0.1875 -0.1875 -0.46875q0 -0.265625 0.1875 -0.453125q0.1875 -0.1875 0.46875 -0.1875q0.265625 0 0.453125 0.1875q0.1875 0.1875 0.1875 0.453125zm2.609375 0q0 0.28125 -0.1875 0.46875q-0.1875 0.1875 -0.46875 0.1875q-0.265625 0 -0.453125 -0.1875q-0.1875 -0.1875 -0.1875 -0.46875q0 -0.265625 0.1875 -0.453125q0.1875 -0.1875 0.453125 -0.1875q0.28125 0 0.46875 0.1875q0.1875 0.1875 0.1875 0.453125zm2.609375 0q0 0.28125 -0.1875 0.46875q-0.1875 0.1875 -0.46875 0.1875q-0.265625 0 -0.453125 -0.1875q-0.1875 -0.1875 -0.1875 -0.46875q0 -0.265625 0.1875 -0.453125q0.1875 -0.1875 0.453125 -0.1875q0.28125 0 0.46875 0.1875q0.1875 0.1875 0.1875 0.453125z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m222.58792 9.887139l290.4252 0l0 403.68503l-290.4252 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m222.58792 9.887139l290.4252 0l0 403.68503l-290.4252 0z" fill-rule="evenodd"/><path fill="#000000" d="m238.33792 56.26403l-4.28125 9.21875q-0.15625 0.34375 -0.28125 0.453125q-0.171875 0.125 -0.421875 0.125q-0.265625 0 -0.46875 -0.203125q-0.203125 -0.1875 -0.203125 -0.4375q0 -0.171875 0.15625 -0.5l4.296875 -9.21875q0.15625 -0.34375 0.28125 -0.453125q0.171875 -0.125 0.40625 -0.125q0.28125 0 0.46875 0.1875q0.203125 0.1875 0.203125 0.4375q0 0.171875 -0.15625 0.515625zm7.998184 0l-4.28125 9.21875q-0.15625 0.34375 -0.28125 0.453125q-0.171875 0.125 -0.421875 0.125q-0.265625 0 -0.46875 -0.203125q-0.203125 -0.1875 -0.203125 -0.4375q0 -0.171875 0.15625 -0.5l4.296875 -9.21875q0.15625 -0.34375 0.28125 -0.453125q0.171875 -0.125 0.40625 -0.125q0.28125 0 0.46875 0.1875q0.203125 0.1875 0.203125 0.4375q0 0.171875 -0.15625 0.515625zm7.326309 2.59375q0.234375 -0.21875 0.5 -0.21875q0.28125 0 0.46875 0.203125q0.1875 0.203125 0.1875 0.671875l0 0.859375q0 0.484375 -0.1875 0.6875q-0.1875 0.203125 -0.484375 0.203125q-0.28125 0 -0.46875 -0.15625q-0.125 -0.125 -0.203125 -0.484375q-0.078125 -0.359375 -0.390625 -0.53125q-0.515625 -0.3125 -1.34375 -0.3125q-0.9375 0 -1.515625 0.5625q-0.5625 0.546875 -0.5625 1.390625q0 0.78125 0.546875 1.234375q0.546875 0.453125 1.8125 0.453125q0.828125 0 1.359375 -0.171875q0.3125 -0.109375 0.59375 -0.359375q0.28125 -0.25 0.5 -0.25q0.28125 0 0.46875 0.203125q0.203125 0.203125 0.203125 0.484375q0 0.4375 -0.59375 0.828125q-0.90625 0.59375 -2.640625 0.59375q-1.546875 0 -2.421875 -0.640625q-1.171875 -0.859375 -1.171875 -2.375q0 -1.421875 0.953125 -2.34375q0.953125 -0.9375 2.484375 -0.9375q0.546875 0 1.015625 0.109375q0.484375 0.09375 0.890625 0.296875zm9.388824 2.828125q0 0.765625 -0.4375 1.484375q-0.421875 0.71875 -1.265625 1.15625q-0.84375 0.421875 -1.75 0.421875q-0.921875 0 -1.75 -0.421875q-0.828125 -0.421875 -1.265625 -1.140625q-0.4375 -0.71875 -0.4375 -1.515625q0 -0.796875 0.4375 -1.5625q0.4375 -0.78125 1.265625 -1.21875q0.84375 -0.4375 1.75 -0.4375q0.90625 0 1.75 0.453125q0.84375 0.4375 1.265625 1.203125q0.4375 0.765625 0.4375 1.578125zm-1.34375 0q0 -0.640625 -0.453125 -1.171875q-0.640625 -0.734375 -1.65625 -0.734375q-0.90625 0 -1.515625 0.578125q-0.609375 0.578125 -0.609375 1.34375q0 0.625 0.609375 1.171875q0.625 0.53125 1.515625 0.53125q0.890625 0 1.5 -0.53125q0.609375 -0.546875 0.609375 -1.1875zm4.529419 -3.0625l0 0.453125q0.359375 -0.3125 0.796875 -0.46875q0.4375 -0.15625 0.953125 -0.15625q1.1875 0 1.875 0.734375q0.546875 0.578125 0.546875 1.53125l0 2.484375q0.421875 0 0.625 0.1875q0.203125 0.171875 0.203125 0.484375q0 0.28125 -0.203125 0.46875q-0.203125 0.1875 -0.6875 0.1875l-1.203125 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.296875 0.1875 -0.46875q0.203125 -0.1875 0.640625 -0.1875l0 -2.53125q0 -0.421875 -0.234375 -0.625q-0.3125 -0.265625 -0.921875 -0.265625q-0.46875 0 -0.8125 0.1875q-0.34375 0.171875 -0.875 0.75l0 2.484375q0.5 0 0.65625 0.09375q0.3125 0.1875 0.3125 0.578125q0 0.28125 -0.203125 0.46875q-0.203125 0.1875 -0.6875 0.1875l-1.515625 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.359375 0.3125 -0.5625q0.15625 -0.09375 0.671875 -0.09375l0 -3.25q-0.421875 0 -0.625 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.28125 0.203125 -0.46875q0.203125 -0.1875 0.6875 -0.1875l1.28125 0zm9.326324 1.328125l0 3.25l1.90625 0q0.484375 0 0.6875 0.1875q0.203125 0.171875 0.203125 0.484375q0 0.28125 -0.203125 0.46875q-0.203125 0.1875 -0.6875 0.1875l-4.03125 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.296875 0.203125 -0.46875q0.203125 -0.1875 0.6875 -0.1875l0.796875 0l0 -3.25l-0.640625 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.28125 0.203125 -0.46875q0.203125 -0.1875 0.6875 -0.1875l0.640625 0l0 -0.515625q0 -0.859375 0.65625 -1.4375q0.65625 -0.578125 1.890625 -0.578125q0.5625 0 1.28125 0.109375q0.71875 0.09375 0.921875 0.28125q0.21875 0.171875 0.21875 0.453125q0 0.3125 -0.1875 0.515625q-0.1875 0.1875 -0.453125 0.1875q-0.125 0 -0.359375 -0.046875q-0.828125 -0.171875 -1.46875 -0.171875q-0.671875 0 -0.921875 0.203125q-0.25 0.203125 -0.25 0.484375l0 0.515625l2.0625 0q0.484375 0 0.6875 0.1875q0.203125 0.1875 0.203125 0.484375q0 0.28125 -0.203125 0.46875q-0.203125 0.1875 -0.6875 0.1875l-2.0625 0zm10.763794 -3.6875l-4.28125 9.21875q-0.15625 0.34375 -0.28125 0.453125q-0.171875 0.125 -0.421875 0.125q-0.265625 0 -0.46875 -0.203125q-0.203125 -0.1875 -0.203125 -0.4375q0 -0.171875 0.15625 -0.5l4.296875 -9.21875q0.15625 -0.34375 0.28125 -0.453125q0.171875 -0.125 0.40625 -0.125q0.28125 0 0.46875 0.1875q0.203125 0.1875 0.203125 0.4375q0 0.171875 -0.15625 0.515625zm5.9200745 -0.171875l0 7.109375l1.59375 0q0.484375 0 0.6875 0.1875q0.203125 0.171875 0.203125 0.484375q0 0.28125 -0.203125 0.46875q-0.203125 0.1875 -0.6875 0.1875l-4.53125 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.296875 0.203125 -0.46875q0.203125 -0.1875 0.6875 -0.1875l1.59375 0l0 -5.78125l-1.0625 0q-0.484375 0 -0.703125 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.28125 0.203125 -0.46875q0.21875 -0.1875 0.703125 -0.1875l2.40625 0zm7.810669 0l0 1.40625l-1.59375 0l0 -1.40625l1.59375 0zm0.171875 2.53125l0 4.578125l1.609375 0q0.46875 0 0.671875 0.1875q0.21875 0.171875 0.21875 0.484375q0 0.28125 -0.21875 0.46875q-0.203125 0.1875 -0.671875 0.1875l-4.546875 0q-0.46875 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.296875 0.203125 -0.46875q0.21875 -0.1875 0.6875 -0.1875l1.609375 0l0 -3.25l-1.078125 0q-0.46875 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.28125 0.203125 -0.46875q0.203125 -0.1875 0.6875 -0.1875l2.40625 0zm5.9981995 0l0 0.453125q0.359375 -0.3125 0.796875 -0.46875q0.4375 -0.15625 0.953125 -0.15625q1.1875 0 1.875 0.734375q0.546875 0.578125 0.546875 1.53125l0 2.484375q0.421875 0 0.625 0.1875q0.203125 0.171875 0.203125 0.484375q0 0.28125 -0.203125 0.46875q-0.203125 0.1875 -0.6875 0.1875l-1.203125 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.296875 0.1875 -0.46875q0.203125 -0.1875 0.640625 -0.1875l0 -2.53125q0 -0.421875 -0.234375 -0.625q-0.3125 -0.265625 -0.921875 -0.265625q-0.46875 0 -0.8125 0.1875q-0.34375 0.171875 -0.875 0.75l0 2.484375q0.5 0 0.65625 0.09375q0.3125 0.1875 0.3125 0.578125q0 0.28125 -0.203125 0.46875q-0.203125 0.1875 -0.6875 0.1875l-1.515625 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.359375 0.3125 -0.5625q0.15625 -0.09375 0.671875 -0.09375l0 -3.25q-0.421875 0 -0.625 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.28125 0.203125 -0.46875q0.203125 -0.1875 0.6875 -0.1875l1.28125 0zm12.170044 0l0 4.578125q0.421875 0 0.625 0.1875q0.203125 0.1875 0.203125 0.484375q0 0.28125 -0.203125 0.46875q-0.203125 0.1875 -0.6875 0.1875l-1.265625 0l0 -0.3125q-0.578125 0.265625 -1.09375 0.390625q-0.515625 0.140625 -0.984375 0.140625q-0.65625 0 -1.140625 -0.28125q-0.484375 -0.28125 -0.765625 -0.765625q-0.203125 -0.34375 -0.203125 -0.875l0 -2.875l-0.21875 0q-0.484375 0 -0.703125 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.28125 0.203125 -0.46875q0.21875 -0.1875 0.703125 -0.1875l1.5625 0l0 3.96875q0 0.421875 0.203125 0.625q0.203125 0.1875 0.625 0.1875q0.40625 0 0.859375 -0.15625q0.46875 -0.15625 1.15625 -0.578125l0 -2.71875l-0.484375 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.28125 0.203125 -0.46875q0.203125 -0.1875 0.6875 -0.1875l1.8125 0zm6.1700745 2.828125l2.015625 1.75q0.375 0.015625 0.546875 0.203125q0.1875 0.1875 0.1875 0.46875q0 0.28125 -0.203125 0.46875q-0.203125 0.1875 -0.6875 0.1875l-1.515625 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.234375 0.140625 -0.40625q0.15625 -0.1875 0.40625 -0.25l-1.0 -0.859375l-1.015625 0.859375q0.3125 0.078125 0.4375 0.234375q0.140625 0.15625 0.140625 0.421875q0 0.296875 -0.203125 0.484375q-0.203125 0.1875 -0.6875 0.1875l-1.5 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.265625 0.171875 -0.453125q0.1875 -0.1875 0.5625 -0.203125l1.96875 -1.75l-1.75 -1.5q-0.34375 -0.015625 -0.53125 -0.203125q-0.171875 -0.1875 -0.171875 -0.46875q0 -0.28125 0.203125 -0.46875q0.203125 -0.1875 0.6875 -0.1875l1.25 0q0.484375 0 0.6875 0.1875q0.203125 0.1875 0.203125 0.46875q0 0.375 -0.359375 0.625l0.8125 0.671875l0.78125 -0.6875q-0.359375 -0.25 -0.359375 -0.578125q0 -0.3125 0.203125 -0.5q0.21875 -0.1875 0.703125 -0.1875l1.234375 0q0.46875 0 0.671875 0.1875q0.21875 0.1875 0.21875 0.484375q0 0.265625 -0.1875 0.453125q-0.171875 0.1875 -0.53125 0.203125l-1.75 1.5zm9.748169 -5.1875l-4.28125 9.21875q-0.15625 0.34375 -0.28125 0.453125q-0.171875 0.125 -0.421875 0.125q-0.265625 0 -0.46875 -0.203125q-0.203125 -0.1875 -0.203125 -0.4375q0 -0.171875 0.15625 -0.5l4.296875 -9.21875q0.15625 -0.34375 0.28125 -0.453125q0.171875 -0.125 0.40625 -0.125q0.28125 0 0.46875 0.1875q0.203125 0.1875 0.203125 0.4375q0 0.171875 -0.15625 0.515625zm3.8731995 -0.171875l0 2.84375q0.421875 -0.25 0.84375 -0.359375q0.421875 -0.125 0.859375 -0.125q0.6875 0 1.21875 0.234375q0.546875 0.234375 0.90625 0.734375q0.359375 0.5 0.359375 1.265625l0 2.515625q0.5 0 0.65625 0.09375q0.3125 0.203125 0.3125 0.578125q0 0.28125 -0.203125 0.46875q-0.203125 0.1875 -0.6875 0.1875l-1.515625 0q-0.46875 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.359375 0.3125 -0.5625q0.171875 -0.109375 0.671875 -0.09375l0 -2.421875q0 -0.515625 -0.234375 -0.71875q-0.3125 -0.28125 -0.90625 -0.28125q-0.4375 0 -0.78125 0.171875q-0.34375 0.171875 -0.921875 0.75l0 2.5q0.515625 0 0.65625 0.09375q0.328125 0.203125 0.328125 0.578125q0 0.28125 -0.203125 0.46875q-0.203125 0.1875 -0.6875 0.1875l-1.515625 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.359375 0.3125 -0.5625q0.15625 -0.109375 0.65625 -0.09375l0 -5.78125l-0.21875 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.28125 0.203125 -0.46875q0.203125 -0.1875 0.6875 -0.1875l1.5625 0zm12.716919 6.15625l-5.46875 0q0.203125 0.53125 0.734375 0.84375q0.53125 0.3125 1.4375 0.3125q0.75 0 1.96875 -0.3125q0.515625 -0.125 0.703125 -0.125q0.265625 0 0.453125 0.1875q0.1875 0.1875 0.1875 0.46875q0 0.265625 -0.203125 0.4375q-0.265625 0.25 -1.28125 0.46875q-1.0 0.21875 -1.921875 0.21875q-1.609375 0 -2.578125 -0.90625q-0.953125 -0.90625 -0.953125 -2.234375q0 -1.40625 1.03125 -2.28125q1.046875 -0.875 2.40625 -0.875q0.8125 0 1.484375 0.28125q0.6875 0.28125 1.015625 0.609375q0.46875 0.484375 0.78125 1.203125q0.203125 0.484375 0.203125 1.140625l0 0.5625zm-1.46875 -1.328125q-0.3125 -0.578125 -0.8125 -0.859375q-0.484375 -0.28125 -1.171875 -0.28125q-0.671875 0 -1.171875 0.28125q-0.5 0.28125 -0.8125 0.859375l3.96875 0zm7.3263245 3.609375l0 -0.3125q-0.5 0.265625 -1.109375 0.390625q-0.609375 0.140625 -1.09375 0.140625q-1.078125 0 -1.75 -0.5625q-0.671875 -0.578125 -0.671875 -1.265625q0 -0.84375 0.859375 -1.5625q0.859375 -0.71875 2.359375 -0.71875q0.609375 0 1.40625 0.140625l0 -0.328125q0 -0.296875 -0.265625 -0.484375q-0.25 -0.1875 -0.96875 -0.1875q-0.59375 0 -1.546875 0.234375q-0.34375 0.078125 -0.546875 0.078125q-0.265625 0 -0.453125 -0.1875q-0.171875 -0.1875 -0.171875 -0.484375q0 -0.171875 0.0625 -0.296875q0.0625 -0.125 0.171875 -0.203125q0.125 -0.078125 0.5 -0.171875q0.484375 -0.140625 1.0 -0.21875q0.515625 -0.078125 0.9375 -0.078125q1.234375 0 1.921875 0.53125q0.6875 0.53125 0.6875 1.46875l0 2.75l0.234375 0q0.484375 0 0.6875 0.1875q0.203125 0.171875 0.203125 0.484375q0 0.28125 -0.203125 0.46875q-0.203125 0.1875 -0.6875 0.1875l-1.5625 0zm0 -2.390625q-0.796875 -0.15625 -1.484375 -0.15625q-0.8125 0 -1.390625 0.40625q-0.375 0.25 -0.375 0.5q0 0.203125 0.1875 0.3125q0.3125 0.21875 0.890625 0.21875q0.46875 0 1.078125 -0.1875q0.609375 -0.1875 1.09375 -0.515625l0 -0.578125zm9.857544 -6.046875l0 7.109375l0.21875 0q0.484375 0 0.6875 0.1875q0.21875 0.171875 0.21875 0.484375q0 0.28125 -0.21875 0.46875q-0.203125 0.1875 -0.6875 0.1875l-1.546875 0l0 -0.328125q-0.46875 0.265625 -0.96875 0.40625q-0.484375 0.140625 -1.03125 0.140625q-1.5 0 -2.421875 -0.859375q-0.90625 -0.875 -0.90625 -2.171875q0 -1.359375 0.953125 -2.3125q0.96875 -0.953125 2.359375 -0.953125q0.515625 0 1.015625 0.15625q0.5 0.15625 1.0 0.46875l0 -1.65625l-0.234375 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.46875q0 -0.296875 0.203125 -0.484375q0.203125 -0.1875 0.6875 -0.1875l1.5625 0zm-1.328125 5.65625q0 -0.828125 -0.59375 -1.390625q-0.578125 -0.578125 -1.40625 -0.578125q-0.84375 0 -1.421875 0.578125q-0.578125 0.5625 -0.578125 1.375q0 0.734375 0.515625 1.203125q0.53125 0.46875 1.484375 0.46875q0.9375 0 1.46875 -0.46875q0.53125 -0.46875 0.53125 -1.1875zm9.607574 0.5l-5.46875 0q0.203125 0.53125 0.734375 0.84375q0.53125 0.3125 1.4375 0.3125q0.75 0 1.96875 -0.3125q0.515625 -0.125 0.703125 -0.125q0.265625 0 0.453125 0.1875q0.1875 0.1875 0.1875 0.46875q0 0.265625 -0.203125 0.4375q-0.265625 0.25 -1.28125 0.46875q-1.0 0.21875 -1.921875 0.21875q-1.609375 0 -2.578125 -0.90625q-0.953125 -0.90625 -0.953125 -2.234375q0 -1.40625 1.03125 -2.28125q1.046875 -0.875 2.40625 -0.875q0.8125 0 1.484375 0.28125q0.6875 0.28125 1.015625 0.609375q0.46875 0.484375 0.78125 1.203125q0.203125 0.484375 0.203125 1.140625l0 0.5625zm-1.46875 -1.328125q-0.3125 -0.578125 -0.8125 -0.859375q-0.484375 -0.28125 -1.171875 -0.28125q-0.671875 0 -1.171875 0.28125q-0.5 0.28125 -0.8125 0.859375l3.96875 0zm5.841919 -2.296875l0 0.828125q0.84375 -0.609375 1.328125 -0.796875q0.484375 -0.203125 0.90625 -0.203125q0.65625 0 1.265625 0.46875q0.421875 0.328125 0.421875 0.671875q0 0.28125 -0.203125 0.484375q-0.203125 0.203125 -0.484375 0.203125q-0.25 0 -0.53125 -0.25q-0.265625 -0.25 -0.46875 -0.25q-0.28125 0 -0.84375 0.359375q-0.546875 0.34375 -1.390625 1.046875l0 2.015625l1.90625 0q0.484375 0 0.6875 0.1875q0.203125 0.171875 0.203125 0.484375q0 0.28125 -0.203125 0.46875q-0.203125 0.1875 -0.6875 0.1875l-4.03125 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.296875 0.203125 -0.46875q0.203125 -0.1875 0.6875 -0.1875l0.796875 0l0 -3.25l-0.484375 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.28125 0.203125 -0.46875q0.203125 -0.1875 0.6875 -0.1875l1.8125 0zm11.966949 9.90625l-7.328125 0q-0.46875 0 -0.671875 -0.1875q-0.21875 -0.171875 -0.21875 -0.46875q0 -0.296875 0.21875 -0.484375q0.203125 -0.1875 0.671875 -0.1875l7.328125 0q0.484375 0 0.6875 0.1875q0.203125 0.1875 0.203125 0.484375q0 0.28125 -0.203125 0.46875q-0.203125 0.1875 -0.6875 0.1875zm6.388794 -9.671875q0.234375 -0.21875 0.5 -0.21875q0.28125 0 0.46875 0.203125q0.1875 0.203125 0.1875 0.671875l0 0.859375q0 0.484375 -0.1875 0.6875q-0.1875 0.203125 -0.484375 0.203125q-0.28125 0 -0.46875 -0.15625q-0.125 -0.125 -0.203125 -0.484375q-0.078125 -0.359375 -0.390625 -0.53125q-0.515625 -0.3125 -1.34375 -0.3125q-0.9375 0 -1.515625 0.5625q-0.5625 0.546875 -0.5625 1.390625q0 0.78125 0.546875 1.234375q0.546875 0.453125 1.8125 0.453125q0.828125 0 1.359375 -0.171875q0.3125 -0.109375 0.59375 -0.359375q0.28125 -0.25 0.5 -0.25q0.28125 0 0.46875 0.203125q0.203125 0.203125 0.203125 0.484375q0 0.4375 -0.59375 0.828125q-0.90625 0.59375 -2.640625 0.59375q-1.546875 0 -2.421875 -0.640625q-1.171875 -0.859375 -1.171875 -2.375q0 -1.421875 0.953125 -2.34375q0.953125 -0.9375 2.484375 -0.9375q0.546875 0 1.015625 0.109375q0.484375 0.09375 0.890625 0.296875zm9.388824 2.828125q0 0.765625 -0.4375 1.484375q-0.421875 0.71875 -1.265625 1.15625q-0.84375 0.421875 -1.75 0.421875q-0.921875 0 -1.75 -0.421875q-0.828125 -0.421875 -1.265625 -1.140625q-0.4375 -0.71875 -0.4375 -1.515625q0 -0.796875 0.4375 -1.5625q0.4375 -0.78125 1.265625 -1.21875q0.84375 -0.4375 1.75 -0.4375q0.90625 0 1.75 0.453125q0.84375 0.4375 1.265625 1.203125q0.4375 0.765625 0.4375 1.578125zm-1.34375 0q0 -0.640625 -0.453125 -1.171875q-0.640625 -0.734375 -1.65625 -0.734375q-0.90625 0 -1.515625 0.578125q-0.609375 0.578125 -0.609375 1.34375q0 0.625 0.609375 1.171875q0.625 0.53125 1.515625 0.53125q0.890625 0 1.5 -0.53125q0.609375 -0.546875 0.609375 -1.1875zm4.529419 -3.0625l0 0.453125q0.359375 -0.3125 0.796875 -0.46875q0.4375 -0.15625 0.953125 -0.15625q1.1875 0 1.875 0.734375q0.546875 0.578125 0.546875 1.53125l0 2.484375q0.421875 0 0.625 0.1875q0.203125 0.171875 0.203125 0.484375q0 0.28125 -0.203125 0.46875q-0.203125 0.1875 -0.6875 0.1875l-1.203125 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.296875 0.1875 -0.46875q0.203125 -0.1875 0.640625 -0.1875l0 -2.53125q0 -0.421875 -0.234375 -0.625q-0.3125 -0.265625 -0.921875 -0.265625q-0.46875 0 -0.8125 0.1875q-0.34375 0.171875 -0.875 0.75l0 2.484375q0.5 0 0.65625 0.09375q0.3125 0.1875 0.3125 0.578125q0 0.28125 -0.203125 0.46875q-0.203125 0.1875 -0.6875 0.1875l-1.515625 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.359375 0.3125 -0.5625q0.15625 -0.09375 0.671875 -0.09375l0 -3.25q-0.421875 0 -0.625 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.28125 0.203125 -0.46875q0.203125 -0.1875 0.6875 -0.1875l1.28125 0zm9.326324 1.328125l0 3.25l1.90625 0q0.484375 0 0.6875 0.1875q0.203125 0.171875 0.203125 0.484375q0 0.28125 -0.203125 0.46875q-0.203125 0.1875 -0.6875 0.1875l-4.03125 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.296875 0.203125 -0.46875q0.203125 -0.1875 0.6875 -0.1875l0.796875 0l0 -3.25l-0.640625 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.28125 0.203125 -0.46875q0.203125 -0.1875 0.6875 -0.1875l0.640625 0l0 -0.515625q0 -0.859375 0.65625 -1.4375q0.65625 -0.578125 1.890625 -0.578125q0.5625 0 1.28125 0.109375q0.71875 0.09375 0.921875 0.28125q0.21875 0.171875 0.21875 0.453125q0 0.3125 -0.1875 0.515625q-0.1875 0.1875 -0.453125 0.1875q-0.125 0 -0.359375 -0.046875q-0.828125 -0.171875 -1.46875 -0.171875q-0.671875 0 -0.921875 0.203125q-0.25 0.203125 -0.25 0.484375l0 0.515625l2.0625 0q0.484375 0 0.6875 0.1875q0.203125 0.1875 0.203125 0.484375q0 0.28125 -0.203125 0.46875q-0.203125 0.1875 -0.6875 0.1875l-2.0625 0zm9.029419 3.90625q0 0.375 -0.265625 0.640625q-0.265625 0.25 -0.734375 0.25q-0.46875 0 -0.734375 -0.25q-0.265625 -0.265625 -0.265625 -0.640625q0 -0.375 0.265625 -0.625q0.265625 -0.265625 0.734375 -0.265625q0.46875 0 0.734375 0.265625q0.265625 0.25 0.265625 0.625zm6.6544495 -3.90625l0 2.671875q0 0.4375 0.171875 0.578125q0.28125 0.203125 0.984375 0.203125q1.015625 0 1.875 -0.4375q0.34375 -0.15625 0.53125 -0.15625q0.25 0 0.4375 0.203125q0.203125 0.1875 0.203125 0.46875q0 0.25 -0.203125 0.4375q-0.328125 0.3125 -1.265625 0.578125q-0.9375 0.25 -1.578125 0.25q-1.25 0 -1.875 -0.53125q-0.609375 -0.546875 -0.609375 -1.328125l0 -2.9375l-0.484375 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.28125 0.203125 -0.46875q0.203125 -0.1875 0.6875 -0.1875l0.484375 0l0 -1.203125q0 -0.484375 0.171875 -0.6875q0.1875 -0.203125 0.484375 -0.203125q0.296875 0 0.484375 0.203125q0.1875 0.203125 0.1875 0.6875l0 1.203125l2.46875 0q0.484375 0 0.6875 0.1875q0.203125 0.1875 0.203125 0.484375q0 0.28125 -0.203125 0.46875q-0.203125 0.1875 -0.6875 0.1875l-2.46875 0zm11.388794 -3.859375l0 7.109375l0.21875 0q0.484375 0 0.6875 0.1875q0.21875 0.171875 0.21875 0.484375q0 0.28125 -0.21875 0.46875q-0.203125 0.1875 -0.6875 0.1875l-1.546875 0l0 -0.328125q-0.46875 0.265625 -0.96875 0.40625q-0.484375 0.140625 -1.03125 0.140625q-1.5 0 -2.421875 -0.859375q-0.90625 -0.875 -0.90625 -2.171875q0 -1.359375 0.953125 -2.3125q0.96875 -0.953125 2.359375 -0.953125q0.515625 0 1.015625 0.15625q0.5 0.15625 1.0 0.46875l0 -1.65625l-0.234375 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.46875q0 -0.296875 0.203125 -0.484375q0.203125 -0.1875 0.6875 -0.1875l1.5625 0zm-1.328125 5.65625q0 -0.828125 -0.59375 -1.390625q-0.578125 -0.578125 -1.40625 -0.578125q-0.84375 0 -1.421875 0.578125q-0.578125 0.5625 -0.578125 1.375q0 0.734375 0.515625 1.203125q0.53125 0.46875 1.484375 0.46875q0.9375 0 1.46875 -0.46875q0.53125 -0.46875 0.53125 -1.1875z" fill-rule="nonzero"/><path fill="#000000" d="m235.7598 88.29528l0 1.375l-0.796875 0l0 -1.375l0.796875 0zm0.015625 2.734375l0 4.96875l2.09375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-4.71875 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l2.09375 0l0 -4.421875l-1.5625 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.078125 -0.078125 0.28125 -0.078125l2.09375 0zm5.7856445 0l0 0.8125q0.5625 -0.5625 1.015625 -0.78125q0.453125 -0.21875 1.015625 -0.21875q0.609375 0 1.109375 0.265625q0.359375 0.1875 0.640625 0.625q0.296875 0.4375 0.296875 0.90625l0 3.359375l0.453125 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.4375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.453125 0l0 -3.265625q0 -0.578125 -0.421875 -0.953125q-0.40625 -0.390625 -1.09375 -0.390625q-0.53125 0 -0.921875 0.21875q-0.390625 0.203125 -1.109375 1.046875l0 3.34375l0.609375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.734375 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l0.59375 0l0 -4.421875l-0.453125 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l0.984375 0zm11.754395 0.546875l0 -0.1875q0 -0.1875 0.078125 -0.265625q0.078125 -0.09375 0.1875 -0.09375q0.125 0 0.203125 0.09375q0.078125 0.078125 0.078125 0.265625l0 1.21875q-0.015625 0.1875 -0.09375 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.0625 -0.078125 -0.078125 -0.25q-0.03125 -0.4375 -0.59375 -0.84375q-0.546875 -0.40625 -1.5 -0.40625q-1.1875 0 -1.796875 0.75q-0.609375 0.734375 -0.609375 1.6875q0 1.03125 0.671875 1.703125q0.6875 0.671875 1.765625 0.671875q0.609375 0 1.25 -0.21875q0.65625 -0.234375 1.171875 -0.734375q0.140625 -0.140625 0.234375 -0.140625q0.109375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.265625 -0.640625 0.6875q-1.03125 0.671875 -2.296875 0.671875q-1.28125 0 -2.125 -0.8125q-0.828125 -0.828125 -0.828125 -2.09375q0 -1.28125 0.84375 -2.125q0.859375 -0.859375 2.140625 -0.859375q1.234375 0 2.0625 0.734375zm5.8481445 -3.015625l0 7.4375l2.09375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-4.71875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l2.09375 0l0 -6.890625l-1.546875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l2.078125 0zm9.348145 7.96875l0 -0.78125q-1.078125 0.984375 -2.359375 0.984375q-0.78125 0 -1.1875 -0.421875q-0.515625 -0.5625 -0.515625 -1.296875l0 -3.4375l-0.71875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.25 0l0 3.984375q0 0.515625 0.328125 0.859375q0.328125 0.328125 0.828125 0.328125q1.296875 0 2.375 -1.1875l0 -3.4375l-0.984375 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l1.53125 0l0 4.96875l0.4375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-0.984375 0zm8.598145 -7.96875l0 7.4375l0.703125 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-1.25 0l0 -1.0625q-0.921875 1.265625 -2.34375 1.265625q-0.734375 0 -1.40625 -0.375q-0.65625 -0.390625 -1.046875 -1.09375q-0.375 -0.71875 -0.375 -1.46875q0 -0.765625 0.375 -1.46875q0.390625 -0.703125 1.046875 -1.09375q0.671875 -0.390625 1.40625 -0.390625q1.390625 0 2.34375 1.265625l0 -3.0l-0.703125 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.25 0zm-0.546875 5.234375q0 -1.015625 -0.6875 -1.703125q-0.671875 -0.703125 -1.625 -0.703125q-0.953125 0 -1.640625 0.703125q-0.6875 0.6875 -0.6875 1.703125q0 1.0 0.6875 1.703125q0.6875 0.703125 1.640625 0.703125q0.953125 0 1.625 -0.703125q0.6875 -0.703125 0.6875 -1.703125zm8.61377 0.109375l-5.421875 0q0.125 1.03125 0.859375 1.671875q0.734375 0.625 1.796875 0.625q0.59375 0 1.25 -0.1875q0.65625 -0.203125 1.0625 -0.53125q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.109375 -0.09375 0.21875q-0.3125 0.3125 -1.09375 0.59375q-0.765625 0.265625 -1.59375 0.265625q-1.375 0 -2.296875 -0.890625q-0.90625 -0.90625 -0.90625 -2.171875q0 -1.171875 0.859375 -2.0q0.859375 -0.828125 2.125 -0.828125q1.3125 0 2.15625 0.859375q0.84375 0.84375 0.828125 2.203125zm-0.53125 -0.53125q-0.15625 -0.890625 -0.84375 -1.4375q-0.671875 -0.546875 -1.609375 -0.546875q-0.921875 0 -1.59375 0.546875q-0.671875 0.53125 -0.84375 1.4375l4.890625 0zm10.493164 -4.8125l1.375 0l1.09375 2.734375q0.046875 0.15625 0.046875 0.21875q0 0.140625 -0.09375 0.234375q-0.09375 0.09375 -0.234375 0.09375q-0.171875 0 -0.328125 -0.25l-1.859375 -3.03125zm2.734375 0l1.390625 0l1.078125 2.734375q0.0625 0.15625 0.0625 0.21875q0 0.140625 -0.09375 0.234375q-0.09375 0.09375 -0.234375 0.09375q-0.1875 0 -0.34375 -0.25l-1.859375 -3.03125zm9.58252 2.828125q0 -0.1875 0.078125 -0.265625q0.078125 -0.09375 0.1875 -0.09375q0.125 0 0.203125 0.09375q0.078125 0.078125 0.078125 0.265625l0 0.921875q0 0.1875 -0.078125 0.28125q-0.078125 0.078125 -0.203125 0.078125q-0.09375 0 -0.171875 -0.0625q-0.078125 -0.078125 -0.09375 -0.25q-0.03125 -0.375 -0.390625 -0.625q-0.515625 -0.34375 -1.375 -0.34375q-0.890625 0 -1.390625 0.359375q-0.375 0.265625 -0.375 0.609375q0 0.375 0.453125 0.625q0.296875 0.1875 1.140625 0.28125q1.125 0.109375 1.546875 0.265625q0.625 0.21875 0.921875 0.625q0.296875 0.390625 0.296875 0.84375q0 0.6875 -0.65625 1.21875q-0.640625 0.515625 -1.90625 0.515625q-1.265625 0 -2.078125 -0.640625q0 0.21875 -0.03125 0.28125q-0.015625 0.0625 -0.09375 0.109375q-0.0625 0.046875 -0.140625 0.046875q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.09375 -0.078125 -0.28125l0 -1.09375q0 -0.1875 0.0625 -0.265625q0.078125 -0.09375 0.203125 -0.09375q0.109375 0 0.1875 0.078125q0.09375 0.078125 0.09375 0.21875q0 0.296875 0.140625 0.484375q0.21875 0.3125 0.703125 0.515625q0.484375 0.1875 1.1875 0.1875q1.046875 0 1.546875 -0.375q0.515625 -0.390625 0.515625 -0.828125q0 -0.5 -0.515625 -0.796875q-0.515625 -0.296875 -1.515625 -0.390625q-0.984375 -0.109375 -1.421875 -0.265625q-0.4375 -0.171875 -0.671875 -0.5q-0.234375 -0.328125 -0.234375 -0.71875q0 -0.671875 0.671875 -1.078125q0.671875 -0.40625 1.59375 -0.40625q1.109375 0 1.796875 0.546875zm4.0356445 -0.359375l0 0.96875q0.484375 -0.578125 1.015625 -0.859375q0.546875 -0.296875 1.296875 -0.296875q0.78125 0 1.453125 0.375q0.671875 0.359375 1.03125 1.015625q0.359375 0.65625 0.359375 1.390625q0 1.140625 -0.828125 1.953125q-0.8125 0.8125 -2.015625 0.8125q-1.421875 0 -2.3125 -1.15625l0 3.21875l1.296875 0q0.1875 0 0.265625 0.0625q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.546875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.09375 -0.0625 0.28125 -0.0625l0.71875 0l0 -6.875l-0.71875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.25 0zm4.625 2.59375q0 -0.921875 -0.671875 -1.578125q-0.671875 -0.65625 -1.640625 -0.65625q-0.96875 0 -1.640625 0.65625q-0.671875 0.65625 -0.671875 1.578125q0 0.90625 0.671875 1.578125q0.671875 0.65625 1.640625 0.65625q0.96875 0 1.640625 -0.65625q0.671875 -0.65625 0.671875 -1.578125zm8.066895 0.28125l-5.421875 0q0.125 1.03125 0.859375 1.671875q0.734375 0.625 1.796875 0.625q0.59375 0 1.25 -0.1875q0.65625 -0.203125 1.0625 -0.53125q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.109375 -0.09375 0.21875q-0.3125 0.3125 -1.09375 0.59375q-0.765625 0.265625 -1.59375 0.265625q-1.375 0 -2.296875 -0.890625q-0.90625 -0.90625 -0.90625 -2.171875q0 -1.171875 0.859375 -2.0q0.859375 -0.828125 2.125 -0.828125q1.3125 0 2.15625 0.859375q0.84375 0.84375 0.828125 2.203125zm-0.53125 -0.53125q-0.15625 -0.890625 -0.84375 -1.4375q-0.671875 -0.546875 -1.609375 -0.546875q-0.921875 0 -1.59375 0.546875q-0.671875 0.53125 -0.84375 1.4375l4.890625 0zm7.6762695 -1.796875l0 -0.1875q0 -0.1875 0.078125 -0.265625q0.078125 -0.09375 0.1875 -0.09375q0.125 0 0.203125 0.09375q0.078125 0.078125 0.078125 0.265625l0 1.21875q-0.015625 0.1875 -0.09375 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.0625 -0.078125 -0.078125 -0.25q-0.03125 -0.4375 -0.59375 -0.84375q-0.546875 -0.40625 -1.5 -0.40625q-1.1875 0 -1.796875 0.75q-0.609375 0.734375 -0.609375 1.6875q0 1.03125 0.671875 1.703125q0.6875 0.671875 1.765625 0.671875q0.609375 0 1.25 -0.21875q0.65625 -0.234375 1.171875 -0.734375q0.140625 -0.140625 0.234375 -0.140625q0.109375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.265625 -0.640625 0.6875q-1.03125 0.671875 -2.296875 0.671875q-1.28125 0 -2.125 -0.8125q-0.828125 -0.828125 -0.828125 -2.09375q0 -1.28125 0.84375 -2.125q0.859375 -0.859375 2.140625 -0.859375q1.234375 0 2.0625 0.734375zm7.9731445 -3.40625l-4.296875 9.203125q-0.109375 0.234375 -0.265625 0.234375q-0.109375 0 -0.203125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.0625 0.078125 -0.203125l4.28125 -9.1875q0.0625 -0.15625 0.125 -0.1875q0.0625 -0.046875 0.15625 -0.046875q0.109375 0 0.1875 0.078125q0.078125 0.078125 0.078125 0.171875q0 0.0625 -0.0625 0.203125zm7.1606445 3.21875q0 -0.1875 0.078125 -0.265625q0.078125 -0.09375 0.1875 -0.09375q0.125 0 0.203125 0.09375q0.078125 0.078125 0.078125 0.265625l0 0.921875q0 0.1875 -0.078125 0.28125q-0.078125 0.078125 -0.203125 0.078125q-0.09375 0 -0.171875 -0.0625q-0.078125 -0.078125 -0.09375 -0.25q-0.03125 -0.375 -0.390625 -0.625q-0.515625 -0.34375 -1.375 -0.34375q-0.890625 0 -1.390625 0.359375q-0.375 0.265625 -0.375 0.609375q0 0.375 0.453125 0.625q0.296875 0.1875 1.140625 0.28125q1.125 0.109375 1.546875 0.265625q0.625 0.21875 0.921875 0.625q0.296875 0.390625 0.296875 0.84375q0 0.6875 -0.65625 1.21875q-0.640625 0.515625 -1.90625 0.515625q-1.265625 0 -2.078125 -0.640625q0 0.21875 -0.03125 0.28125q-0.015625 0.0625 -0.09375 0.109375q-0.0625 0.046875 -0.140625 0.046875q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.09375 -0.078125 -0.28125l0 -1.09375q0 -0.1875 0.0625 -0.265625q0.078125 -0.09375 0.203125 -0.09375q0.109375 0 0.1875 0.078125q0.09375 0.078125 0.09375 0.21875q0 0.296875 0.140625 0.484375q0.21875 0.3125 0.703125 0.515625q0.484375 0.1875 1.1875 0.1875q1.046875 0 1.546875 -0.375q0.515625 -0.390625 0.515625 -0.828125q0 -0.5 -0.515625 -0.796875q-0.515625 -0.296875 -1.515625 -0.390625q-0.984375 -0.109375 -1.421875 -0.265625q-0.4375 -0.171875 -0.671875 -0.5q-0.234375 -0.328125 -0.234375 -0.71875q0 -0.671875 0.671875 -1.078125q0.671875 -0.40625 1.59375 -0.40625q1.109375 0 1.796875 0.546875zm4.9575195 -0.359375l2.890625 0q0.1875 0 0.265625 0.078125q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.890625 0l0 3.546875q0 0.453125 0.359375 0.765625q0.375 0.3125 1.09375 0.3125q0.546875 0 1.171875 -0.15625q0.625 -0.15625 0.96875 -0.359375q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.09375 -0.078125 0.1875q-0.203125 0.203125 -1.0 0.453125q-0.78125 0.234375 -1.5 0.234375q-0.921875 0 -1.484375 -0.4375q-0.546875 -0.4375 -0.546875 -1.171875l0 -3.546875l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.984375 0l0 -1.578125q0 -0.1875 0.078125 -0.265625q0.078125 -0.078125 0.1875 -0.078125q0.125 0 0.203125 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.578125zm11.504395 -2.46875l0 7.4375l0.703125 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-1.25 0l0 -1.0625q-0.921875 1.265625 -2.34375 1.265625q-0.734375 0 -1.40625 -0.375q-0.65625 -0.390625 -1.046875 -1.09375q-0.375 -0.71875 -0.375 -1.46875q0 -0.765625 0.375 -1.46875q0.390625 -0.703125 1.046875 -1.09375q0.671875 -0.390625 1.40625 -0.390625q1.390625 0 2.34375 1.265625l0 -3.0l-0.703125 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.25 0zm-0.546875 5.234375q0 -1.015625 -0.6875 -1.703125q-0.671875 -0.703125 -1.625 -0.703125q-0.953125 0 -1.640625 0.703125q-0.6875 0.6875 -0.6875 1.703125q0 1.0 0.6875 1.703125q0.6875 0.703125 1.640625 0.703125q0.953125 0 1.625 -0.703125q0.6875 -0.703125 0.6875 -1.703125zm7.9575195 -2.21875l0 -0.1875q0 -0.1875 0.078125 -0.265625q0.078125 -0.09375 0.1875 -0.09375q0.125 0 0.203125 0.09375q0.078125 0.078125 0.078125 0.265625l0 1.21875q-0.015625 0.1875 -0.09375 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.0625 -0.078125 -0.078125 -0.25q-0.03125 -0.4375 -0.59375 -0.84375q-0.546875 -0.40625 -1.5 -0.40625q-1.1875 0 -1.796875 0.75q-0.609375 0.734375 -0.609375 1.6875q0 1.03125 0.671875 1.703125q0.6875 0.671875 1.765625 0.671875q0.609375 0 1.25 -0.21875q0.65625 -0.234375 1.171875 -0.734375q0.140625 -0.140625 0.234375 -0.140625q0.109375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.265625 -0.640625 0.6875q-1.03125 0.671875 -2.296875 0.671875q-1.28125 0 -2.125 -0.8125q-0.828125 -0.828125 -0.828125 -2.09375q0 -1.28125 0.84375 -2.125q0.859375 -0.859375 2.140625 -0.859375q1.234375 0 2.0625 0.734375zm5.4731445 3.421875l0.21875 0q0.359375 0 0.609375 0.25q0.25 0.25 0.25 0.609375q0 0.359375 -0.25 0.609375q-0.25 0.25 -0.609375 0.25l-0.21875 0q-0.359375 0 -0.625 -0.25q-0.25 -0.25 -0.25 -0.609375q0 -0.359375 0.25 -0.609375q0.265625 -0.25 0.625 -0.25zm6.8168945 -3.96875l2.890625 0q0.1875 0 0.265625 0.078125q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.890625 0l0 3.546875q0 0.453125 0.359375 0.765625q0.375 0.3125 1.09375 0.3125q0.546875 0 1.171875 -0.15625q0.625 -0.15625 0.96875 -0.359375q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.09375 -0.078125 0.1875q-0.203125 0.203125 -1.0 0.453125q-0.78125 0.234375 -1.5 0.234375q-0.921875 0 -1.484375 -0.4375q-0.546875 -0.4375 -0.546875 -1.171875l0 -3.546875l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.984375 0l0 -1.578125q0 -0.1875 0.078125 -0.265625q0.078125 -0.078125 0.1875 -0.078125q0.125 0 0.203125 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.578125zm11.504395 -2.46875l0 7.4375l0.703125 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-1.25 0l0 -1.0625q-0.921875 1.265625 -2.34375 1.265625q-0.734375 0 -1.40625 -0.375q-0.65625 -0.390625 -1.046875 -1.09375q-0.375 -0.71875 -0.375 -1.46875q0 -0.765625 0.375 -1.46875q0.390625 -0.703125 1.046875 -1.09375q0.671875 -0.390625 1.40625 -0.390625q1.390625 0 2.34375 1.265625l0 -3.0l-0.703125 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.25 0zm-0.546875 5.234375q0 -1.015625 -0.6875 -1.703125q-0.671875 -0.703125 -1.625 -0.703125q-0.953125 0 -1.640625 0.703125q-0.6875 0.6875 -0.6875 1.703125q0 1.0 0.6875 1.703125q0.6875 0.703125 1.640625 0.703125q0.953125 0 1.625 -0.703125q0.6875 -0.703125 0.6875 -1.703125zm4.3793945 -5.234375l1.375 0l-1.859375 3.03125q-0.15625 0.25 -0.34375 0.25q-0.140625 0 -0.234375 -0.09375q-0.09375 -0.09375 -0.09375 -0.21875q0 -0.078125 0.0625 -0.234375l1.09375 -2.734375zm2.734375 0l1.375 0l-1.84375 3.03125q-0.171875 0.25 -0.34375 0.25q-0.140625 0 -0.25 -0.09375q-0.09375 -0.09375 -0.09375 -0.21875q0 -0.078125 0.078125 -0.234375l1.078125 -2.734375z" fill-rule="nonzero"/><path fill="#000000" d="m235.7598 105.63903l0 6.359375l1.828125 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-4.1875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.828125 0l0 -6.359375l-1.828125 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l4.1875 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.828125 0zm5.8012695 1.390625l0 0.8125q0.5625 -0.5625 1.015625 -0.78125q0.453125 -0.21875 1.015625 -0.21875q0.609375 0 1.109375 0.265625q0.359375 0.1875 0.640625 0.625q0.296875 0.4375 0.296875 0.90625l0 3.359375l0.453125 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.4375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.453125 0l0 -3.265625q0 -0.578125 -0.421875 -0.953125q-0.40625 -0.390625 -1.09375 -0.390625q-0.53125 0 -0.921875 0.21875q-0.390625 0.203125 -1.109375 1.046875l0 3.34375l0.609375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.734375 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l0.59375 0l0 -4.421875l-0.453125 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l0.984375 0zm11.754395 0.546875l0 -0.1875q0 -0.1875 0.078125 -0.265625q0.078125 -0.09375 0.1875 -0.09375q0.125 0 0.203125 0.09375q0.078125 0.078125 0.078125 0.265625l0 1.21875q-0.015625 0.1875 -0.09375 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.0625 -0.078125 -0.078125 -0.25q-0.03125 -0.4375 -0.59375 -0.84375q-0.546875 -0.40625 -1.5 -0.40625q-1.1875 0 -1.796875 0.75q-0.609375 0.734375 -0.609375 1.6875q0 1.03125 0.671875 1.703125q0.6875 0.671875 1.765625 0.671875q0.609375 0 1.25 -0.21875q0.65625 -0.234375 1.171875 -0.734375q0.140625 -0.140625 0.234375 -0.140625q0.109375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.265625 -0.640625 0.6875q-1.03125 0.671875 -2.296875 0.671875q-1.28125 0 -2.125 -0.8125q-0.828125 -0.828125 -0.828125 -2.09375q0 -1.28125 0.84375 -2.125q0.859375 -0.859375 2.140625 -0.859375q1.234375 0 2.0625 0.734375zm5.8481445 -3.015625l0 7.4375l2.09375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-4.71875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l2.09375 0l0 -6.890625l-1.546875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l2.078125 0zm9.348145 7.96875l0 -0.78125q-1.078125 0.984375 -2.359375 0.984375q-0.78125 0 -1.1875 -0.421875q-0.515625 -0.5625 -0.515625 -1.296875l0 -3.4375l-0.71875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.25 0l0 3.984375q0 0.515625 0.328125 0.859375q0.328125 0.328125 0.828125 0.328125q1.296875 0 2.375 -1.1875l0 -3.4375l-0.984375 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l1.53125 0l0 4.96875l0.4375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-0.984375 0zm8.598145 -7.96875l0 7.4375l0.703125 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-1.25 0l0 -1.0625q-0.921875 1.265625 -2.34375 1.265625q-0.734375 0 -1.40625 -0.375q-0.65625 -0.390625 -1.046875 -1.09375q-0.375 -0.71875 -0.375 -1.46875q0 -0.765625 0.375 -1.46875q0.390625 -0.703125 1.046875 -1.09375q0.671875 -0.390625 1.40625 -0.390625q1.390625 0 2.34375 1.265625l0 -3.0l-0.703125 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.25 0zm-0.546875 5.234375q0 -1.015625 -0.6875 -1.703125q-0.671875 -0.703125 -1.625 -0.703125q-0.953125 0 -1.640625 0.703125q-0.6875 0.6875 -0.6875 1.703125q0 1.0 0.6875 1.703125q0.6875 0.703125 1.640625 0.703125q0.953125 0 1.625 -0.703125q0.6875 -0.703125 0.6875 -1.703125zm8.61377 0.109375l-5.421875 0q0.125 1.03125 0.859375 1.671875q0.734375 0.625 1.796875 0.625q0.59375 0 1.25 -0.1875q0.65625 -0.203125 1.0625 -0.53125q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.109375 -0.09375 0.21875q-0.3125 0.3125 -1.09375 0.59375q-0.765625 0.265625 -1.59375 0.265625q-1.375 0 -2.296875 -0.890625q-0.90625 -0.90625 -0.90625 -2.171875q0 -1.171875 0.859375 -2.0q0.859375 -0.828125 2.125 -0.828125q1.3125 0 2.15625 0.859375q0.84375 0.84375 0.828125 2.203125zm-0.53125 -0.53125q-0.15625 -0.890625 -0.84375 -1.4375q-0.671875 -0.546875 -1.609375 -0.546875q-0.921875 0 -1.59375 0.546875q-0.671875 0.53125 -0.84375 1.4375l4.890625 0zm10.493164 -4.8125l1.375 0l1.09375 2.734375q0.046875 0.15625 0.046875 0.21875q0 0.140625 -0.09375 0.234375q-0.09375 0.09375 -0.234375 0.09375q-0.171875 0 -0.328125 -0.25l-1.859375 -3.03125zm2.734375 0l1.390625 0l1.078125 2.734375q0.0625 0.15625 0.0625 0.21875q0 0.140625 -0.09375 0.234375q-0.09375 0.09375 -0.234375 0.09375q-0.1875 0 -0.34375 -0.25l-1.859375 -3.03125zm9.58252 2.828125q0 -0.1875 0.078125 -0.265625q0.078125 -0.09375 0.1875 -0.09375q0.125 0 0.203125 0.09375q0.078125 0.078125 0.078125 0.265625l0 0.921875q0 0.1875 -0.078125 0.28125q-0.078125 0.078125 -0.203125 0.078125q-0.09375 0 -0.171875 -0.0625q-0.078125 -0.078125 -0.09375 -0.25q-0.03125 -0.375 -0.390625 -0.625q-0.515625 -0.34375 -1.375 -0.34375q-0.890625 0 -1.390625 0.359375q-0.375 0.265625 -0.375 0.609375q0 0.375 0.453125 0.625q0.296875 0.1875 1.140625 0.28125q1.125 0.109375 1.546875 0.265625q0.625 0.21875 0.921875 0.625q0.296875 0.390625 0.296875 0.84375q0 0.6875 -0.65625 1.21875q-0.640625 0.515625 -1.90625 0.515625q-1.265625 0 -2.078125 -0.640625q0 0.21875 -0.03125 0.28125q-0.015625 0.0625 -0.09375 0.109375q-0.0625 0.046875 -0.140625 0.046875q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.09375 -0.078125 -0.28125l0 -1.09375q0 -0.1875 0.0625 -0.265625q0.078125 -0.09375 0.203125 -0.09375q0.109375 0 0.1875 0.078125q0.09375 0.078125 0.09375 0.21875q0 0.296875 0.140625 0.484375q0.21875 0.3125 0.703125 0.515625q0.484375 0.1875 1.1875 0.1875q1.046875 0 1.546875 -0.375q0.515625 -0.390625 0.515625 -0.828125q0 -0.5 -0.515625 -0.796875q-0.515625 -0.296875 -1.515625 -0.390625q-0.984375 -0.109375 -1.421875 -0.265625q-0.4375 -0.171875 -0.671875 -0.5q-0.234375 -0.328125 -0.234375 -0.71875q0 -0.671875 0.671875 -1.078125q0.671875 -0.40625 1.59375 -0.40625q1.109375 0 1.796875 0.546875zm4.0356445 -0.359375l0 0.96875q0.484375 -0.578125 1.015625 -0.859375q0.546875 -0.296875 1.296875 -0.296875q0.78125 0 1.453125 0.375q0.671875 0.359375 1.03125 1.015625q0.359375 0.65625 0.359375 1.390625q0 1.140625 -0.828125 1.953125q-0.8125 0.8125 -2.015625 0.8125q-1.421875 0 -2.3125 -1.15625l0 3.21875l1.296875 0q0.1875 0 0.265625 0.0625q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.546875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.09375 -0.0625 0.28125 -0.0625l0.71875 0l0 -6.875l-0.71875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.25 0zm4.625 2.59375q0 -0.921875 -0.671875 -1.578125q-0.671875 -0.65625 -1.640625 -0.65625q-0.96875 0 -1.640625 0.65625q-0.671875 0.65625 -0.671875 1.578125q0 0.90625 0.671875 1.578125q0.671875 0.65625 1.640625 0.65625q0.96875 0 1.640625 -0.65625q0.671875 -0.65625 0.671875 -1.578125zm8.066895 0.28125l-5.421875 0q0.125 1.03125 0.859375 1.671875q0.734375 0.625 1.796875 0.625q0.59375 0 1.25 -0.1875q0.65625 -0.203125 1.0625 -0.53125q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.109375 -0.09375 0.21875q-0.3125 0.3125 -1.09375 0.59375q-0.765625 0.265625 -1.59375 0.265625q-1.375 0 -2.296875 -0.890625q-0.90625 -0.90625 -0.90625 -2.171875q0 -1.171875 0.859375 -2.0q0.859375 -0.828125 2.125 -0.828125q1.3125 0 2.15625 0.859375q0.84375 0.84375 0.828125 2.203125zm-0.53125 -0.53125q-0.15625 -0.890625 -0.84375 -1.4375q-0.671875 -0.546875 -1.609375 -0.546875q-0.921875 0 -1.59375 0.546875q-0.671875 0.53125 -0.84375 1.4375l4.890625 0zm7.6762695 -1.796875l0 -0.1875q0 -0.1875 0.078125 -0.265625q0.078125 -0.09375 0.1875 -0.09375q0.125 0 0.203125 0.09375q0.078125 0.078125 0.078125 0.265625l0 1.21875q-0.015625 0.1875 -0.09375 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.0625 -0.078125 -0.078125 -0.25q-0.03125 -0.4375 -0.59375 -0.84375q-0.546875 -0.40625 -1.5 -0.40625q-1.1875 0 -1.796875 0.75q-0.609375 0.734375 -0.609375 1.6875q0 1.03125 0.671875 1.703125q0.6875 0.671875 1.765625 0.671875q0.609375 0 1.25 -0.21875q0.65625 -0.234375 1.171875 -0.734375q0.140625 -0.140625 0.234375 -0.140625q0.109375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.265625 -0.640625 0.6875q-1.03125 0.671875 -2.296875 0.671875q-1.28125 0 -2.125 -0.8125q-0.828125 -0.828125 -0.828125 -2.09375q0 -1.28125 0.84375 -2.125q0.859375 -0.859375 2.140625 -0.859375q1.234375 0 2.0625 0.734375zm7.9731445 -3.40625l-4.296875 9.203125q-0.109375 0.234375 -0.265625 0.234375q-0.109375 0 -0.203125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.0625 0.078125 -0.203125l4.28125 -9.1875q0.0625 -0.15625 0.125 -0.1875q0.0625 -0.046875 0.15625 -0.046875q0.109375 0 0.1875 0.078125q0.078125 0.078125 0.078125 0.171875q0 0.0625 -0.0625 0.203125zm3.3950195 2.859375l0 0.96875q0.484375 -0.578125 1.015625 -0.859375q0.546875 -0.296875 1.296875 -0.296875q0.78125 0 1.453125 0.375q0.671875 0.359375 1.03125 1.015625q0.359375 0.65625 0.359375 1.390625q0 1.140625 -0.828125 1.953125q-0.8125 0.8125 -2.015625 0.8125q-1.421875 0 -2.3125 -1.15625l0 3.21875l1.296875 0q0.1875 0 0.265625 0.0625q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.546875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.09375 -0.0625 0.28125 -0.0625l0.71875 0l0 -6.875l-0.71875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.25 0zm4.625 2.59375q0 -0.921875 -0.671875 -1.578125q-0.671875 -0.65625 -1.640625 -0.65625q-0.96875 0 -1.640625 0.65625q-0.671875 0.65625 -0.671875 1.578125q0 0.90625 0.671875 1.578125q0.671875 0.65625 1.640625 0.65625q0.96875 0 1.640625 -0.65625q0.671875 -0.65625 0.671875 -1.578125zm8.160645 0.171875q0 1.21875 -0.875 2.078125q-0.859375 0.859375 -2.09375 0.859375q-1.25 0 -2.125 -0.859375q-0.859375 -0.875 -0.859375 -2.078125q0 -1.21875 0.859375 -2.078125q0.875 -0.875 2.125 -0.875q1.234375 0 2.09375 0.859375q0.875 0.859375 0.875 2.09375zm-0.53125 0q0 -1.0 -0.71875 -1.703125q-0.71875 -0.703125 -1.734375 -0.703125q-1.015625 0 -1.734375 0.703125q-0.703125 0.703125 -0.703125 1.703125q0 0.984375 0.703125 1.703125q0.71875 0.703125 1.734375 0.703125q1.015625 0 1.734375 -0.703125q0.71875 -0.703125 0.71875 -1.703125zm7.1137695 -2.40625q0 -0.1875 0.078125 -0.265625q0.078125 -0.09375 0.1875 -0.09375q0.125 0 0.203125 0.09375q0.078125 0.078125 0.078125 0.265625l0 0.921875q0 0.1875 -0.078125 0.28125q-0.078125 0.078125 -0.203125 0.078125q-0.09375 0 -0.171875 -0.0625q-0.078125 -0.078125 -0.09375 -0.25q-0.03125 -0.375 -0.390625 -0.625q-0.515625 -0.34375 -1.375 -0.34375q-0.890625 0 -1.390625 0.359375q-0.375 0.265625 -0.375 0.609375q0 0.375 0.453125 0.625q0.296875 0.1875 1.140625 0.28125q1.125 0.109375 1.546875 0.265625q0.625 0.21875 0.921875 0.625q0.296875 0.390625 0.296875 0.84375q0 0.6875 -0.65625 1.21875q-0.640625 0.515625 -1.90625 0.515625q-1.265625 0 -2.078125 -0.640625q0 0.21875 -0.03125 0.28125q-0.015625 0.0625 -0.09375 0.109375q-0.0625 0.046875 -0.140625 0.046875q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.09375 -0.078125 -0.28125l0 -1.09375q0 -0.1875 0.0625 -0.265625q0.078125 -0.09375 0.203125 -0.09375q0.109375 0 0.1875 0.078125q0.09375 0.078125 0.09375 0.21875q0 0.296875 0.140625 0.484375q0.21875 0.3125 0.703125 0.515625q0.484375 0.1875 1.1875 0.1875q1.046875 0 1.546875 -0.375q0.515625 -0.390625 0.515625 -0.828125q0 -0.5 -0.515625 -0.796875q-0.515625 -0.296875 -1.515625 -0.390625q-0.984375 -0.109375 -1.421875 -0.265625q-0.4375 -0.171875 -0.671875 -0.5q-0.234375 -0.328125 -0.234375 -0.71875q0 -0.671875 0.671875 -1.078125q0.671875 -0.40625 1.59375 -0.40625q1.109375 0 1.796875 0.546875zm6.3168945 -3.09375l0 1.375l-0.796875 0l0 -1.375l0.796875 0zm0.015625 2.734375l0 4.96875l2.09375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-4.71875 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l2.09375 0l0 -4.421875l-1.5625 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.078125 -0.078125 0.28125 -0.078125l2.09375 0zm7.8793945 2.625l2.4375 2.34375q0.25 0 0.3125 0.03125q0.0625 0.015625 0.109375 0.09375q0.046875 0.0625 0.046875 0.140625q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-1.71875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.890625 0l-2.078125 -1.984375l-2.0625 1.984375l0.890625 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.734375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.078125 0.046875 -0.140625q0.046875 -0.078125 0.109375 -0.09375q0.0625 -0.03125 0.296875 -0.03125l2.453125 -2.34375l-2.171875 -2.078125q-0.234375 0 -0.296875 -0.03125q-0.0625 -0.03125 -0.109375 -0.09375q-0.046875 -0.0625 -0.046875 -0.15625q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.46875 0q0.1875 0 0.265625 0.078125q0.078125 0.078125 0.078125 0.203125q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.265625 0.078125l-0.640625 0l1.796875 1.734375l1.8125 -1.734375l-0.640625 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.453125 0q0.1875 0 0.265625 0.078125q0.09375 0.078125 0.09375 0.203125q0 0.078125 -0.046875 0.140625q-0.046875 0.0625 -0.109375 0.09375q-0.0625 0.03125 -0.296875 0.03125l-2.171875 2.078125zm7.3325195 1.34375l0.21875 0q0.359375 0 0.609375 0.25q0.25 0.25 0.25 0.609375q0 0.359375 -0.25 0.609375q-0.25 0.25 -0.609375 0.25l-0.21875 0q-0.359375 0 -0.625 -0.25q-0.25 -0.25 -0.25 -0.609375q0 -0.359375 0.25 -0.609375q0.265625 -0.25 0.625 -0.25zm6.8168945 -3.96875l2.890625 0q0.1875 0 0.265625 0.078125q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.890625 0l0 3.546875q0 0.453125 0.359375 0.765625q0.375 0.3125 1.09375 0.3125q0.546875 0 1.171875 -0.15625q0.625 -0.15625 0.96875 -0.359375q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.09375 -0.078125 0.1875q-0.203125 0.203125 -1.0 0.453125q-0.78125 0.234375 -1.5 0.234375q-0.921875 0 -1.484375 -0.4375q-0.546875 -0.4375 -0.546875 -1.171875l0 -3.546875l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.984375 0l0 -1.578125q0 -0.1875 0.078125 -0.265625q0.078125 -0.078125 0.1875 -0.078125q0.125 0 0.203125 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.578125zm11.504395 -2.46875l0 7.4375l0.703125 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-1.25 0l0 -1.0625q-0.921875 1.265625 -2.34375 1.265625q-0.734375 0 -1.40625 -0.375q-0.65625 -0.390625 -1.046875 -1.09375q-0.375 -0.71875 -0.375 -1.46875q0 -0.765625 0.375 -1.46875q0.390625 -0.703125 1.046875 -1.09375q0.671875 -0.390625 1.40625 -0.390625q1.390625 0 2.34375 1.265625l0 -3.0l-0.703125 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.25 0zm-0.546875 5.234375q0 -1.015625 -0.6875 -1.703125q-0.671875 -0.703125 -1.625 -0.703125q-0.953125 0 -1.640625 0.703125q-0.6875 0.6875 -0.6875 1.703125q0 1.0 0.6875 1.703125q0.6875 0.703125 1.640625 0.703125q0.953125 0 1.625 -0.703125q0.6875 -0.703125 0.6875 -1.703125zm4.3793945 -5.234375l1.375 0l-1.859375 3.03125q-0.15625 0.25 -0.34375 0.25q-0.140625 0 -0.234375 -0.09375q-0.09375 -0.09375 -0.09375 -0.21875q0 -0.078125 0.0625 -0.234375l1.09375 -2.734375zm2.734375 0l1.375 0l-1.84375 3.03125q-0.171875 0.25 -0.34375 0.25q-0.140625 0 -0.25 -0.09375q-0.09375 -0.09375 -0.09375 -0.21875q0 -0.078125 0.078125 -0.234375l1.078125 -2.734375z" fill-rule="nonzero"/><path fill="#000000" d="m238.10355 136.56091l0 7.4375l0.703125 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-1.25 0l0 -1.0625q-0.921875 1.265625 -2.34375 1.265625q-0.734375 0 -1.40625 -0.375q-0.65625 -0.390625 -1.046875 -1.09375q-0.375 -0.71875 -0.375 -1.46875q0 -0.765625 0.375 -1.46875q0.390625 -0.703125 1.046875 -1.09375q0.671875 -0.390625 1.40625 -0.390625q1.390625 0 2.34375 1.265625l0 -3.0l-0.703125 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.25 0zm-0.546875 5.234375q0 -1.015625 -0.6875 -1.703125q-0.671875 -0.703125 -1.625 -0.703125q-0.953125 0 -1.640625 0.703125q-0.6875 0.6875 -0.6875 1.703125q0 1.0 0.6875 1.703125q0.6875 0.703125 1.640625 0.703125q0.953125 0 1.625 -0.703125q0.6875 -0.703125 0.6875 -1.703125zm8.61377 0.109375l-5.421875 0q0.125 1.03125 0.859375 1.671875q0.734375 0.625 1.796875 0.625q0.59375 0 1.25 -0.1875q0.65625 -0.203125 1.0625 -0.53125q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.109375 -0.09375 0.21875q-0.3125 0.3125 -1.09375 0.59375q-0.765625 0.265625 -1.59375 0.265625q-1.375 0 -2.296875 -0.890625q-0.90625 -0.90625 -0.90625 -2.171875q0 -1.171875 0.859375 -2.0q0.859375 -0.828125 2.125 -0.828125q1.3125 0 2.15625 0.859375q0.84375 0.84375 0.828125 2.203125zm-0.53125 -0.53125q-0.15625 -0.890625 -0.84375 -1.4375q-0.671875 -0.546875 -1.609375 -0.546875q-0.921875 0 -1.59375 0.546875q-0.671875 0.53125 -0.84375 1.4375l4.890625 0zm5.0981445 -1.796875l0 4.421875l2.34375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-4.171875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.296875 0l0 -4.421875l-1.15625 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.15625 0l0 -0.796875q0 -0.671875 0.53125 -1.171875q0.546875 -0.5 1.453125 -0.5q0.75 0 1.609375 0.140625q0.328125 0.046875 0.390625 0.125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.0625 -0.203125 0.0625q-0.0625 0 -0.171875 -0.015625q-0.96875 -0.140625 -1.625 -0.140625q-0.703125 0 -1.078125 0.34375q-0.375 0.34375 -0.375 0.78125l0 0.796875l2.5 0q0.1875 0 0.265625 0.078125q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.5 0zm16.305664 2.71875l-0.609375 0l-2.046875 -4.65625l-0.109375 0l0 6.359375l0.984375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-1.953125 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l0.4375 0l0 -6.359375l-0.328125 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.3125 0l2.015625 4.59375l1.984375 -4.59375l1.3125 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-0.34375 0l0 6.359375l0.453125 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.96875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.984375 0l0 -6.359375l-0.109375 0l-2.015625 4.65625zm8.98877 2.234375l0 -0.765625q-1.171875 0.96875 -2.484375 0.96875q-0.953125 0 -1.5 -0.484375q-0.53125 -0.484375 -0.53125 -1.1875q0 -0.765625 0.703125 -1.34375q0.71875 -0.578125 2.078125 -0.578125q0.359375 0 0.796875 0.046875q0.4375 0.046875 0.9375 0.140625l0 -0.859375q0 -0.4375 -0.40625 -0.75q-0.40625 -0.328125 -1.21875 -0.328125q-0.625 0 -1.75 0.359375q-0.203125 0.0625 -0.265625 0.0625q-0.09375 0 -0.171875 -0.078125q-0.0625 -0.078125 -0.0625 -0.1875q0 -0.109375 0.0625 -0.171875q0.078125 -0.09375 0.71875 -0.265625q0.984375 -0.265625 1.484375 -0.265625q1.015625 0 1.578125 0.5q0.5625 0.5 0.5625 1.125l0 3.53125l0.71875 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.25 0zm0 -2.65625q-0.375 -0.109375 -0.796875 -0.15625q-0.421875 -0.046875 -0.875 -0.046875q-1.171875 0 -1.828125 0.5q-0.484375 0.375 -0.484375 0.890625q0 0.484375 0.375 0.8125q0.375 0.328125 1.09375 0.328125q0.703125 0 1.296875 -0.265625q0.59375 -0.28125 1.21875 -0.890625l0 -1.171875zm5.1762695 -2.84375l2.890625 0q0.1875 0 0.265625 0.078125q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.890625 0l0 3.546875q0 0.453125 0.359375 0.765625q0.375 0.3125 1.09375 0.3125q0.546875 0 1.171875 -0.15625q0.625 -0.15625 0.96875 -0.359375q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.09375 -0.078125 0.1875q-0.203125 0.203125 -1.0 0.453125q-0.78125 0.234375 -1.5 0.234375q-0.921875 0 -1.484375 -0.4375q-0.546875 -0.4375 -0.546875 -1.171875l0 -3.546875l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.984375 0l0 -1.578125q0 -0.1875 0.078125 -0.265625q0.078125 -0.078125 0.1875 -0.078125q0.125 0 0.203125 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.578125zm7.1293945 -2.46875l0 3.28125q0.515625 -0.546875 0.984375 -0.765625q0.46875 -0.234375 1.046875 -0.234375q0.609375 0 1.046875 0.21875q0.4375 0.21875 0.71875 0.671875q0.296875 0.453125 0.296875 0.953125l0 3.3125l0.609375 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.734375 0q-0.203125 0 -0.296875 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.296875 -0.078125l0.59375 0l0 -3.265625q0 -0.578125 -0.421875 -0.96875q-0.40625 -0.390625 -1.15625 -0.390625q-0.578125 0 -1.0 0.28125q-0.296875 0.203125 -0.984375 0.96875l0 3.375l0.609375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.734375 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l0.59375 0l0 -6.890625l-0.71875 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l1.25 0zm17.25879 2.46875l0.21875 0q0.359375 0 0.609375 0.265625q0.25 0.25 0.25 0.59375q0 0.375 -0.25 0.625q-0.25 0.25 -0.609375 0.25l-0.21875 0q-0.359375 0 -0.625 -0.25q-0.25 -0.265625 -0.25 -0.609375q0 -0.375 0.25 -0.625q0.265625 -0.25 0.625 -0.25zm0 3.96875l0.21875 0q0.359375 0 0.609375 0.25q0.25 0.25 0.25 0.609375q0 0.359375 -0.25 0.609375q-0.25 0.25 -0.609375 0.25l-0.21875 0q-0.359375 0 -0.625 -0.25q-0.25 -0.25 -0.25 -0.609375q0 -0.359375 0.25 -0.609375q0.265625 -0.25 0.625 -0.25zm14.555664 -1.515625l0 2.515625l1.828125 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.265625 0.078125l-3.09375 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l0.71875 0l0 -6.359375l-0.71875 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l3.109375 0q1.09375 0 1.78125 0.65625q0.703125 0.640625 0.703125 1.5q0 0.515625 -0.234375 0.9375q-0.21875 0.40625 -0.53125 0.640625q-0.484375 0.359375 -0.984375 0.515625q-0.375 0.125 -0.921875 0.125l-1.65625 0zm0 -0.53125l1.6875 0q0.59375 0 1.109375 -0.265625q0.515625 -0.265625 0.75 -0.640625q0.25 -0.390625 0.25 -0.78125q0 -0.625 -0.546875 -1.125q-0.53125 -0.5 -1.359375 -0.5l-1.890625 0l0 3.3125zm10.77002 3.578125l0 -0.78125q-1.078125 0.984375 -2.359375 0.984375q-0.78125 0 -1.1875 -0.421875q-0.515625 -0.5625 -0.515625 -1.296875l0 -3.4375l-0.71875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.25 0l0 3.984375q0 0.515625 0.328125 0.859375q0.328125 0.328125 0.828125 0.328125q1.296875 0 2.375 -1.1875l0 -3.4375l-0.984375 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l1.53125 0l0 4.96875l0.4375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-0.984375 0zm3.9731445 -7.96875l0 3.53125q0.96875 -1.25 2.328125 -1.25q1.171875 0 2.0 0.84375q0.828125 0.84375 0.828125 2.078125q0 1.25 -0.84375 2.109375q-0.828125 0.859375 -1.984375 0.859375q-1.390625 0 -2.328125 -1.25l0 1.046875l-1.25 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.71875 0l0 -6.890625l-0.71875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.25 0zm4.625 5.234375q0 -1.015625 -0.6875 -1.703125q-0.6875 -0.703125 -1.625 -0.703125q-0.921875 0 -1.625 0.703125q-0.6875 0.6875 -0.6875 1.703125q0 1.0 0.6875 1.703125q0.703125 0.703125 1.625 0.703125q0.9375 0 1.625 -0.703125q0.6875 -0.703125 0.6875 -1.703125zm5.4575195 -5.234375l0 7.4375l2.09375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-4.71875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l2.09375 0l0 -6.890625l-1.546875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l2.078125 0zm7.8012695 -0.265625l0 1.375l-0.796875 0l0 -1.375l0.796875 0zm0.015625 2.734375l0 4.96875l2.09375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-4.71875 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l2.09375 0l0 -4.421875l-1.5625 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.078125 -0.078125 0.28125 -0.078125l2.09375 0zm9.73877 0.546875l0 -0.1875q0 -0.1875 0.078125 -0.265625q0.078125 -0.09375 0.1875 -0.09375q0.125 0 0.203125 0.09375q0.078125 0.078125 0.078125 0.265625l0 1.21875q-0.015625 0.1875 -0.09375 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.0625 -0.078125 -0.078125 -0.25q-0.03125 -0.4375 -0.59375 -0.84375q-0.546875 -0.40625 -1.5 -0.40625q-1.1875 0 -1.796875 0.75q-0.609375 0.734375 -0.609375 1.6875q0 1.03125 0.671875 1.703125q0.6875 0.671875 1.765625 0.671875q0.609375 0 1.25 -0.21875q0.65625 -0.234375 1.171875 -0.734375q0.140625 -0.140625 0.234375 -0.140625q0.109375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.265625 -0.640625 0.6875q-1.03125 0.671875 -2.296875 0.671875q-1.28125 0 -2.125 -0.8125q-0.828125 -0.828125 -0.828125 -2.09375q0 -1.28125 0.84375 -2.125q0.859375 -0.859375 2.140625 -0.859375q1.234375 0 2.0625 0.734375zm7.3325195 2.46875l-3.5 0l-0.71875 1.953125l1.015625 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.984375 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l0.40625 0l2.359375 -6.359375l-1.578125 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l2.6875 0l2.59375 6.890625l0.421875 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.984375 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.015625 0l-0.734375 -1.953125zm-0.203125 -0.53125l-1.46875 -3.875l-0.203125 0l-1.421875 3.875l3.09375 0zm5.0981445 -0.03125l0 2.515625l1.828125 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.265625 0.078125l-3.09375 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l0.71875 0l0 -6.359375l-0.71875 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l3.109375 0q1.09375 0 1.78125 0.65625q0.703125 0.640625 0.703125 1.5q0 0.515625 -0.234375 0.9375q-0.21875 0.40625 -0.53125 0.640625q-0.484375 0.359375 -0.984375 0.515625q-0.375 0.125 -0.921875 0.125l-1.65625 0zm0 -0.53125l1.6875 0q0.59375 0 1.109375 -0.265625q0.515625 -0.265625 0.75 -0.640625q0.25 -0.390625 0.25 -0.78125q0 -0.625 -0.546875 -1.125q-0.53125 -0.5 -1.359375 -0.5l-1.890625 0l0 3.3125zm9.223145 -3.3125l0 6.359375l1.828125 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-4.1875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.828125 0l0 -6.359375l-1.828125 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l4.1875 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.828125 0zm4.2543945 3.1875l5.765625 -3.203125q0.140625 -0.078125 0.203125 -0.078125q0.109375 0 0.1875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.15625 -0.21875 0.28125l-4.9375 2.734375l4.9375 2.75q0.21875 0.109375 0.21875 0.28125q0 0.09375 -0.078125 0.1875q-0.078125 0.078125 -0.1875 0.078125q-0.078125 0 -0.21875 -0.078125l-5.75 -3.21875zm9.723145 -4.265625l1.375 0l-1.859375 3.03125q-0.15625 0.25 -0.34375 0.25q-0.140625 0 -0.234375 -0.09375q-0.09375 -0.09375 -0.09375 -0.21875q0 -0.078125 0.0625 -0.234375l1.09375 -2.734375zm2.734375 0l1.375 0l-1.84375 3.03125q-0.171875 0.25 -0.34375 0.25q-0.140625 0 -0.25 -0.09375q-0.09375 -0.09375 -0.09375 -0.21875q0 -0.078125 0.078125 -0.234375l1.078125 -2.734375zm3.9887695 2.46875l0 0.546875q0.6875 -0.734375 1.375 -0.734375q0.40625 0 0.71875 0.21875q0.3125 0.21875 0.515625 0.65625q0.359375 -0.4375 0.71875 -0.65625q0.375 -0.21875 0.734375 -0.21875q0.578125 0 0.921875 0.375q0.453125 0.484375 0.453125 1.046875l0 3.734375l0.453125 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-0.984375 0l0 -4.203125q0 -0.40625 -0.25 -0.671875q-0.25 -0.265625 -0.578125 -0.265625q-0.28125 0 -0.609375 0.21875q-0.328125 0.21875 -0.734375 0.859375l0 3.53125l0.4375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-0.984375 0l0 -4.171875q0 -0.421875 -0.25 -0.6875q-0.25 -0.28125 -0.5625 -0.28125q-0.28125 0 -0.5625 0.171875q-0.390625 0.265625 -0.8125 0.90625l0 3.53125l0.453125 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.4375 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l0.453125 0l0 -4.421875l-0.453125 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l0.984375 0zm11.77002 5.5l0 -0.765625q-1.171875 0.96875 -2.484375 0.96875q-0.953125 0 -1.5 -0.484375q-0.53125 -0.484375 -0.53125 -1.1875q0 -0.765625 0.703125 -1.34375q0.71875 -0.578125 2.078125 -0.578125q0.359375 0 0.796875 0.046875q0.4375 0.046875 0.9375 0.140625l0 -0.859375q0 -0.4375 -0.40625 -0.75q-0.40625 -0.328125 -1.21875 -0.328125q-0.625 0 -1.75 0.359375q-0.203125 0.0625 -0.265625 0.0625q-0.09375 0 -0.171875 -0.078125q-0.0625 -0.078125 -0.0625 -0.1875q0 -0.109375 0.0625 -0.171875q0.078125 -0.09375 0.71875 -0.265625q0.984375 -0.265625 1.484375 -0.265625q1.015625 0 1.578125 0.5q0.5625 0.5 0.5625 1.125l0 3.53125l0.71875 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.25 0zm0 -2.65625q-0.375 -0.109375 -0.796875 -0.15625q-0.421875 -0.046875 -0.875 -0.046875q-1.171875 0 -1.828125 0.5q-0.484375 0.375 -0.484375 0.890625q0 0.484375 0.375 0.8125q0.375 0.328125 1.09375 0.328125q0.703125 0 1.296875 -0.265625q0.59375 -0.28125 1.21875 -0.890625l0 -1.171875zm5.1762695 -2.84375l2.890625 0q0.1875 0 0.265625 0.078125q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.890625 0l0 3.546875q0 0.453125 0.359375 0.765625q0.375 0.3125 1.09375 0.3125q0.546875 0 1.171875 -0.15625q0.625 -0.15625 0.96875 -0.359375q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.09375 -0.078125 0.1875q-0.203125 0.203125 -1.0 0.453125q-0.78125 0.234375 -1.5 0.234375q-0.921875 0 -1.484375 -0.4375q-0.546875 -0.4375 -0.546875 -1.171875l0 -3.546875l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.984375 0l0 -1.578125q0 -0.1875 0.078125 -0.265625q0.078125 -0.078125 0.1875 -0.078125q0.125 0 0.203125 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.578125zm7.1293945 -2.46875l0 3.28125q0.515625 -0.546875 0.984375 -0.765625q0.46875 -0.234375 1.046875 -0.234375q0.609375 0 1.046875 0.21875q0.4375 0.21875 0.71875 0.671875q0.296875 0.453125 0.296875 0.953125l0 3.3125l0.609375 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.734375 0q-0.203125 0 -0.296875 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.296875 -0.078125l0.59375 0l0 -3.265625q0 -0.578125 -0.421875 -0.96875q-0.40625 -0.390625 -1.15625 -0.390625q-0.578125 0 -1.0 0.28125q-0.296875 0.203125 -0.984375 0.96875l0 3.375l0.609375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.734375 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l0.59375 0l0 -6.890625l-0.71875 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l1.25 0zm8.20752 0l1.375 0l-1.859375 3.03125q-0.15625 0.25 -0.34375 0.25q-0.140625 0 -0.234375 -0.09375q-0.09375 -0.09375 -0.09375 -0.21875q0 -0.078125 0.0625 -0.234375l1.09375 -2.734375zm2.734375 0l1.375 0l-1.84375 3.03125q-0.171875 0.25 -0.34375 0.25q-0.140625 0 -0.25 -0.09375q-0.09375 -0.09375 -0.09375 -0.21875q0 -0.078125 0.078125 -0.234375l1.078125 -2.734375zm9.691895 4.265625l-5.75 3.21875q-0.140625 0.078125 -0.21875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.09375 -0.078125 -0.1875q0 -0.171875 0.21875 -0.28125l4.9375 -2.75l-4.9375 -2.734375q-0.203125 -0.125 -0.203125 -0.28125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.1875 -0.078125q0.0625 0 0.203125 0.078125l5.75 3.203125zm12.024414 0.546875q0.3125 0.234375 0.4375 0.453125q0.140625 0.28125 0.140625 0.671875l0 2.28125q0 0.359375 0.203125 0.59375q0.21875 0.234375 0.53125 0.265625q0.1875 0.015625 0.25 0.078125q0.09375 0.078125 0.09375 0.1875q0 0.125 -0.09375 0.1875q-0.078125 0.078125 -0.234375 0.078125q-0.5 0 -0.84375 -0.3125q-0.453125 -0.4375 -0.453125 -1.0625l0 -2.296875q0 -0.34375 -0.203125 -0.578125q-0.203125 -0.234375 -0.53125 -0.265625q-0.1875 -0.015625 -0.25 -0.078125q-0.0625 -0.078125 -0.0625 -0.203125q0 -0.125 0.0625 -0.1875q0.0625 -0.078125 0.25 -0.09375q0.328125 -0.03125 0.53125 -0.265625q0.203125 -0.234375 0.203125 -0.59375l0 -2.28125q0 -0.59375 0.375 -0.984375q0.390625 -0.40625 0.921875 -0.40625q0.15625 0 0.234375 0.078125q0.09375 0.078125 0.09375 0.1875q0 0.125 -0.09375 0.1875q-0.046875 0.0625 -0.25 0.09375q-0.328125 0.03125 -0.53125 0.265625q-0.203125 0.234375 -0.203125 0.578125l0 2.28125q0 0.40625 -0.125 0.65625q-0.125 0.234375 -0.453125 0.484375z" fill-rule="nonzero"/><path fill="#000000" d="m251.36234 152.56091l0 7.4375l2.09375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-4.71875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l2.09375 0l0 -6.890625l-1.546875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l2.078125 0zm10.410645 5.34375l-5.421875 0q0.125 1.03125 0.859375 1.671875q0.734375 0.625 1.796875 0.625q0.59375 0 1.25 -0.1875q0.65625 -0.203125 1.0625 -0.53125q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.109375 -0.09375 0.21875q-0.3125 0.3125 -1.09375 0.59375q-0.765625 0.265625 -1.59375 0.265625q-1.375 0 -2.296875 -0.890625q-0.90625 -0.90625 -0.90625 -2.171875q0 -1.171875 0.859375 -2.0q0.859375 -0.828125 2.125 -0.828125q1.3125 0 2.15625 0.859375q0.84375 0.84375 0.828125 2.203125zm-0.53125 -0.53125q-0.15625 -0.890625 -0.84375 -1.4375q-0.671875 -0.546875 -1.609375 -0.546875q-0.921875 0 -1.59375 0.546875q-0.671875 0.53125 -0.84375 1.4375l4.890625 0zm4.3637695 -2.34375l2.890625 0q0.1875 0 0.265625 0.078125q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.890625 0l0 3.546875q0 0.453125 0.359375 0.765625q0.375 0.3125 1.09375 0.3125q0.546875 0 1.171875 -0.15625q0.625 -0.15625 0.96875 -0.359375q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.09375 -0.078125 0.1875q-0.203125 0.203125 -1.0 0.453125q-0.78125 0.234375 -1.5 0.234375q-0.921875 0 -1.484375 -0.4375q-0.546875 -0.4375 -0.546875 -1.171875l0 -3.546875l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.984375 0l0 -1.578125q0 -0.1875 0.078125 -0.265625q0.078125 -0.078125 0.1875 -0.078125q0.125 0 0.203125 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.578125zm15.399414 1.90625l0 3.0625l1.828125 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-3.078125 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l0.71875 0l0 -6.359375l-0.71875 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.09375 -0.203125q0.0625 -0.0625 0.25 -0.0625l5.875 0l0 1.828125q0 0.1875 -0.078125 0.28125q-0.078125 0.078125 -0.1875 0.078125q-0.125 0 -0.203125 -0.078125q-0.0625 -0.09375 -0.0625 -0.28125l0 -1.296875l-4.09375 0l0 2.765625l1.921875 0l0 -0.59375q0 -0.1875 0.0625 -0.265625q0.078125 -0.09375 0.203125 -0.09375q0.109375 0 0.1875 0.09375q0.078125 0.078125 0.078125 0.265625l0 1.734375q0 0.1875 -0.078125 0.28125q-0.078125 0.078125 -0.1875 0.078125q-0.125 0 -0.203125 -0.078125q-0.0625 -0.09375 -0.0625 -0.28125l0 -0.609375l-1.921875 0zm10.910645 3.59375l0 -0.78125q-1.078125 0.984375 -2.359375 0.984375q-0.78125 0 -1.1875 -0.421875q-0.515625 -0.5625 -0.515625 -1.296875l0 -3.4375l-0.71875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.25 0l0 3.984375q0 0.515625 0.328125 0.859375q0.328125 0.328125 0.828125 0.328125q1.296875 0 2.375 -1.1875l0 -3.4375l-0.984375 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l1.53125 0l0 4.96875l0.4375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-0.984375 0zm4.2543945 -5.5l0 0.8125q0.5625 -0.5625 1.015625 -0.78125q0.453125 -0.21875 1.015625 -0.21875q0.609375 0 1.109375 0.265625q0.359375 0.1875 0.640625 0.625q0.296875 0.4375 0.296875 0.90625l0 3.359375l0.453125 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.4375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.453125 0l0 -3.265625q0 -0.578125 -0.421875 -0.953125q-0.40625 -0.390625 -1.09375 -0.390625q-0.53125 0 -0.921875 0.21875q-0.390625 0.203125 -1.109375 1.046875l0 3.34375l0.609375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.734375 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l0.59375 0l0 -4.421875l-0.453125 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l0.984375 0zm11.754395 0.546875l0 -0.1875q0 -0.1875 0.078125 -0.265625q0.078125 -0.09375 0.1875 -0.09375q0.125 0 0.203125 0.09375q0.078125 0.078125 0.078125 0.265625l0 1.21875q-0.015625 0.1875 -0.09375 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.0625 -0.078125 -0.078125 -0.25q-0.03125 -0.4375 -0.59375 -0.84375q-0.546875 -0.40625 -1.5 -0.40625q-1.1875 0 -1.796875 0.75q-0.609375 0.734375 -0.609375 1.6875q0 1.03125 0.671875 1.703125q0.6875 0.671875 1.765625 0.671875q0.609375 0 1.25 -0.21875q0.65625 -0.234375 1.171875 -0.734375q0.140625 -0.140625 0.234375 -0.140625q0.109375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.265625 -0.640625 0.6875q-1.03125 0.671875 -2.296875 0.671875q-1.28125 0 -2.125 -0.8125q-0.828125 -0.828125 -0.828125 -2.09375q0 -1.28125 0.84375 -2.125q0.859375 -0.859375 2.140625 -0.859375q1.234375 0 2.0625 0.734375zm4.4887695 -0.546875l2.890625 0q0.1875 0 0.265625 0.078125q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.890625 0l0 3.546875q0 0.453125 0.359375 0.765625q0.375 0.3125 1.09375 0.3125q0.546875 0 1.171875 -0.15625q0.625 -0.15625 0.96875 -0.359375q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.09375 -0.078125 0.1875q-0.203125 0.203125 -1.0 0.453125q-0.78125 0.234375 -1.5 0.234375q-0.921875 0 -1.484375 -0.4375q-0.546875 -0.4375 -0.546875 -1.171875l0 -3.546875l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.984375 0l0 -1.578125q0 -0.1875 0.078125 -0.265625q0.078125 -0.078125 0.1875 -0.078125q0.125 0 0.203125 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.578125zm9.160645 -2.734375l0 1.375l-0.796875 0l0 -1.375l0.796875 0zm0.015625 2.734375l0 4.96875l2.09375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-4.71875 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l2.09375 0l0 -4.421875l-1.5625 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.078125 -0.078125 0.28125 -0.078125l2.09375 0zm10.48877 2.765625q0 1.21875 -0.875 2.078125q-0.859375 0.859375 -2.09375 0.859375q-1.25 0 -2.125 -0.859375q-0.859375 -0.875 -0.859375 -2.078125q0 -1.21875 0.859375 -2.078125q0.875 -0.875 2.125 -0.875q1.234375 0 2.09375 0.859375q0.875 0.859375 0.875 2.09375zm-0.53125 0q0 -1.0 -0.71875 -1.703125q-0.71875 -0.703125 -1.734375 -0.703125q-1.015625 0 -1.734375 0.703125q-0.703125 0.703125 -0.703125 1.703125q0 0.984375 0.703125 1.703125q0.71875 0.703125 1.734375 0.703125q1.015625 0 1.734375 -0.703125q0.71875 -0.703125 0.71875 -1.703125zm3.6293945 -2.765625l0 0.8125q0.5625 -0.5625 1.015625 -0.78125q0.453125 -0.21875 1.015625 -0.21875q0.609375 0 1.109375 0.265625q0.359375 0.1875 0.640625 0.625q0.296875 0.4375 0.296875 0.90625l0 3.359375l0.453125 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.4375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.453125 0l0 -3.265625q0 -0.578125 -0.421875 -0.953125q-0.40625 -0.390625 -1.09375 -0.390625q-0.53125 0 -0.921875 0.21875q-0.390625 0.203125 -1.109375 1.046875l0 3.34375l0.609375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.734375 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l0.59375 0l0 -4.421875l-0.453125 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l0.984375 0zm11.285645 0.359375q0 -0.1875 0.078125 -0.265625q0.078125 -0.09375 0.1875 -0.09375q0.125 0 0.203125 0.09375q0.078125 0.078125 0.078125 0.265625l0 0.921875q0 0.1875 -0.078125 0.28125q-0.078125 0.078125 -0.203125 0.078125q-0.09375 0 -0.171875 -0.0625q-0.078125 -0.078125 -0.09375 -0.25q-0.03125 -0.375 -0.390625 -0.625q-0.515625 -0.34375 -1.375 -0.34375q-0.890625 0 -1.390625 0.359375q-0.375 0.265625 -0.375 0.609375q0 0.375 0.453125 0.625q0.296875 0.1875 1.140625 0.28125q1.125 0.109375 1.546875 0.265625q0.625 0.21875 0.921875 0.625q0.296875 0.390625 0.296875 0.84375q0 0.6875 -0.65625 1.21875q-0.640625 0.515625 -1.90625 0.515625q-1.265625 0 -2.078125 -0.640625q0 0.21875 -0.03125 0.28125q-0.015625 0.0625 -0.09375 0.109375q-0.0625 0.046875 -0.140625 0.046875q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.09375 -0.078125 -0.28125l0 -1.09375q0 -0.1875 0.0625 -0.265625q0.078125 -0.09375 0.203125 -0.09375q0.109375 0 0.1875 0.078125q0.09375 0.078125 0.09375 0.21875q0 0.296875 0.140625 0.484375q0.21875 0.3125 0.703125 0.515625q0.484375 0.1875 1.1875 0.1875q1.046875 0 1.546875 -0.375q0.515625 -0.390625 0.515625 -0.828125q0 -0.5 -0.515625 -0.796875q-0.515625 -0.296875 -1.515625 -0.390625q-0.984375 -0.109375 -1.421875 -0.265625q-0.4375 -0.171875 -0.671875 -0.5q-0.234375 -0.328125 -0.234375 -0.71875q0 -0.671875 0.671875 -1.078125q0.671875 -0.40625 1.59375 -0.40625q1.109375 0 1.796875 0.546875zm16.75879 0.734375l-5.8125 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l5.8125 0q0.1875 0 0.265625 0.078125q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125zm0 1.90625l-5.8125 0q-0.1875 0 -0.28125 -0.0625q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l5.8125 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.125 -0.09375 0.203125q-0.078125 0.0625 -0.265625 0.0625zm12.961914 -4.921875l0 8.53125l1.296875 0q0.1875 0 0.265625 0.0625q0.09375 0.078125 0.09375 0.203125q0 0.125 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.828125 0l0 -9.609375l1.828125 0q0.1875 0 0.265625 0.078125q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.296875 0z" fill-rule="nonzero"/><path fill="#000000" d="m263.93362 168.56091l1.375 0l1.09375 2.734375q0.046875 0.15625 0.046875 0.21875q0 0.140625 -0.09375 0.234375q-0.09375 0.09375 -0.234375 0.09375q-0.171875 0 -0.328125 -0.25l-1.859375 -3.03125zm2.734375 0l1.390625 0l1.078125 2.734375q0.0625 0.15625 0.0625 0.21875q0 0.140625 -0.09375 0.234375q-0.09375 0.09375 -0.234375 0.09375q-0.1875 0 -0.34375 -0.25l-1.859375 -3.03125zm9.36377 7.96875l0 -0.765625q-1.171875 0.96875 -2.484375 0.96875q-0.953125 0 -1.5 -0.484375q-0.53125 -0.484375 -0.53125 -1.1875q0 -0.765625 0.703125 -1.34375q0.71875 -0.578125 2.078125 -0.578125q0.359375 0 0.796875 0.046875q0.4375 0.046875 0.9375 0.140625l0 -0.859375q0 -0.4375 -0.40625 -0.75q-0.40625 -0.328125 -1.21875 -0.328125q-0.625 0 -1.75 0.359375q-0.203125 0.0625 -0.265625 0.0625q-0.09375 0 -0.171875 -0.078125q-0.0625 -0.078125 -0.0625 -0.1875q0 -0.109375 0.0625 -0.171875q0.078125 -0.09375 0.71875 -0.265625q0.984375 -0.265625 1.484375 -0.265625q1.015625 0 1.578125 0.5q0.5625 0.5 0.5625 1.125l0 3.53125l0.71875 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.25 0zm0 -2.65625q-0.375 -0.109375 -0.796875 -0.15625q-0.421875 -0.046875 -0.875 -0.046875q-1.171875 0 -1.828125 0.5q-0.484375 0.375 -0.484375 0.890625q0 0.484375 0.375 0.8125q0.375 0.328125 1.09375 0.328125q0.703125 0 1.296875 -0.265625q0.59375 -0.28125 1.21875 -0.890625l0 -1.171875zm8.48877 -2.296875l0 -0.1875q0 -0.1875 0.078125 -0.265625q0.078125 -0.09375 0.1875 -0.09375q0.125 0 0.203125 0.09375q0.078125 0.078125 0.078125 0.265625l0 1.21875q-0.015625 0.1875 -0.09375 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.0625 -0.078125 -0.078125 -0.25q-0.03125 -0.4375 -0.59375 -0.84375q-0.546875 -0.40625 -1.5 -0.40625q-1.1875 0 -1.796875 0.75q-0.609375 0.734375 -0.609375 1.6875q0 1.03125 0.671875 1.703125q0.6875 0.671875 1.765625 0.671875q0.609375 0 1.25 -0.21875q0.65625 -0.234375 1.171875 -0.734375q0.140625 -0.140625 0.234375 -0.140625q0.109375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.265625 -0.640625 0.6875q-1.03125 0.671875 -2.296875 0.671875q-1.28125 0 -2.125 -0.8125q-0.828125 -0.828125 -0.828125 -2.09375q0 -1.28125 0.84375 -2.125q0.859375 -0.859375 2.140625 -0.859375q1.234375 0 2.0625 0.734375zm8.55127 2.21875q0 1.21875 -0.875 2.078125q-0.859375 0.859375 -2.09375 0.859375q-1.25 0 -2.125 -0.859375q-0.859375 -0.875 -0.859375 -2.078125q0 -1.21875 0.859375 -2.078125q0.875 -0.875 2.125 -0.875q1.234375 0 2.09375 0.859375q0.875 0.859375 0.875 2.09375zm-0.53125 0q0 -1.0 -0.71875 -1.703125q-0.71875 -0.703125 -1.734375 -0.703125q-1.015625 0 -1.734375 0.703125q-0.703125 0.703125 -0.703125 1.703125q0 0.984375 0.703125 1.703125q0.71875 0.703125 1.734375 0.703125q1.015625 0 1.734375 -0.703125q0.71875 -0.703125 0.71875 -1.703125zm7.1137695 -2.40625q0 -0.1875 0.078125 -0.265625q0.078125 -0.09375 0.1875 -0.09375q0.125 0 0.203125 0.09375q0.078125 0.078125 0.078125 0.265625l0 0.921875q0 0.1875 -0.078125 0.28125q-0.078125 0.078125 -0.203125 0.078125q-0.09375 0 -0.171875 -0.0625q-0.078125 -0.078125 -0.09375 -0.25q-0.03125 -0.375 -0.390625 -0.625q-0.515625 -0.34375 -1.375 -0.34375q-0.890625 0 -1.390625 0.359375q-0.375 0.265625 -0.375 0.609375q0 0.375 0.453125 0.625q0.296875 0.1875 1.140625 0.28125q1.125 0.109375 1.546875 0.265625q0.625 0.21875 0.921875 0.625q0.296875 0.390625 0.296875 0.84375q0 0.6875 -0.65625 1.21875q-0.640625 0.515625 -1.90625 0.515625q-1.265625 0 -2.078125 -0.640625q0 0.21875 -0.03125 0.28125q-0.015625 0.0625 -0.09375 0.109375q-0.0625 0.046875 -0.140625 0.046875q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.09375 -0.078125 -0.28125l0 -1.09375q0 -0.1875 0.0625 -0.265625q0.078125 -0.09375 0.203125 -0.09375q0.109375 0 0.1875 0.078125q0.09375 0.078125 0.09375 0.21875q0 0.296875 0.140625 0.484375q0.21875 0.3125 0.703125 0.515625q0.484375 0.1875 1.1875 0.1875q1.046875 0 1.546875 -0.375q0.515625 -0.390625 0.515625 -0.828125q0 -0.5 -0.515625 -0.796875q-0.515625 -0.296875 -1.515625 -0.390625q-0.984375 -0.109375 -1.421875 -0.265625q-0.4375 -0.171875 -0.671875 -0.5q-0.234375 -0.328125 -0.234375 -0.71875q0 -0.671875 0.671875 -1.078125q0.671875 -0.40625 1.59375 -0.40625q1.109375 0 1.796875 0.546875zm4.6918945 -2.828125l1.375 0l-1.859375 3.03125q-0.15625 0.25 -0.34375 0.25q-0.140625 0 -0.234375 -0.09375q-0.09375 -0.09375 -0.09375 -0.21875q0 -0.078125 0.0625 -0.234375l1.09375 -2.734375zm2.734375 0l1.375 0l-1.84375 3.03125q-0.171875 0.25 -0.34375 0.25q-0.140625 0 -0.25 -0.09375q-0.09375 -0.09375 -0.09375 -0.21875q0 -0.078125 0.078125 -0.234375l1.078125 -2.734375zm5.3637695 6.046875l1.734375 0l-1.890625 3.515625q-0.171875 0.3125 -0.40625 0.3125q-0.15625 0 -0.28125 -0.109375q-0.109375 -0.109375 -0.109375 -0.265625q0 -0.078125 0.03125 -0.140625l0.921875 -3.3125z" fill-rule="nonzero"/><path fill="#000000" d="m266.58987 190.99841l0.21875 0q0.359375 0 0.609375 0.25q0.25 0.25 0.25 0.609375q0 0.359375 -0.25 0.609375q-0.25 0.25 -0.609375 0.25l-0.21875 0q-0.359375 0 -0.625 -0.25q-0.25 -0.25 -0.25 -0.609375q0 -0.359375 0.25 -0.609375q0.265625 -0.25 0.625 -0.25zm7.8012695 0l0.21875 0q0.359375 0 0.609375 0.25q0.25 0.25 0.25 0.609375q0 0.359375 -0.25 0.609375q-0.25 0.25 -0.609375 0.25l-0.21875 0q-0.359375 0 -0.625 -0.25q-0.25 -0.25 -0.25 -0.609375q0 -0.359375 0.25 -0.609375q0.265625 -0.25 0.625 -0.25zm7.8012695 0l0.21875 0q0.359375 0 0.609375 0.25q0.25 0.25 0.25 0.609375q0 0.359375 -0.25 0.609375q-0.25 0.25 -0.609375 0.25l-0.21875 0q-0.359375 0 -0.625 -0.25q-0.25 -0.25 -0.25 -0.609375q0 -0.359375 0.25 -0.609375q0.265625 -0.25 0.625 -0.25z" fill-rule="nonzero"/><path fill="#000000" d="m250.84671 209.63904l0 -8.53125l-1.296875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.09375 -0.078125 0.28125 -0.078125l1.828125 0l0 9.609375l-1.828125 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.0625 -0.078125 -0.1875q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.296875 0zm7.9262695 -6.609375l0.234375 0q0.359375 0 0.609375 0.265625q0.25 0.25 0.25 0.59375q0 0.375 -0.25 0.625q-0.25 0.25 -0.609375 0.25l-0.234375 0q-0.359375 0 -0.609375 -0.25q-0.25 -0.265625 -0.25 -0.609375q0 -0.375 0.25 -0.625q0.265625 -0.25 0.609375 -0.25zm-0.921875 3.578125l1.671875 0l-1.796875 2.953125q-0.125 0.21875 -0.21875 0.265625q-0.078125 0.0625 -0.171875 0.0625q-0.15625 0 -0.265625 -0.09375q-0.09375 -0.09375 -0.09375 -0.234375q0 -0.078125 0.03125 -0.1875l0.84375 -2.765625z" fill-rule="nonzero"/><path fill="#000000" d="m235.80667 221.37341q-0.328125 -0.25 -0.4375 -0.46875q-0.140625 -0.265625 -0.140625 -0.671875l0 -2.28125q0 -0.359375 -0.21875 -0.59375q-0.203125 -0.234375 -0.515625 -0.25q-0.203125 -0.03125 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.234375 -0.078125q0.515625 0 0.84375 0.328125q0.453125 0.421875 0.453125 1.0625l0 2.28125q0 0.359375 0.203125 0.59375q0.21875 0.234375 0.546875 0.265625q0.171875 0.015625 0.234375 0.09375q0.078125 0.0625 0.078125 0.1875q0 0.125 -0.078125 0.203125q-0.0625 0.0625 -0.234375 0.078125q-0.328125 0.03125 -0.546875 0.265625q-0.203125 0.234375 -0.203125 0.578125l0 2.296875q0 0.59375 -0.390625 0.984375q-0.375 0.40625 -0.90625 0.40625q-0.15625 0 -0.234375 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.0625 -0.0625 0.265625 -0.078125q0.3125 -0.03125 0.515625 -0.265625q0.21875 -0.234375 0.21875 -0.59375l0 -2.28125q0 -0.390625 0.125 -0.640625q0.125 -0.25 0.453125 -0.484375z" fill-rule="nonzero"/><path fill="#000000" d="m238.10355 248.56091l0 7.4375l0.703125 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-1.25 0l0 -1.0625q-0.921875 1.265625 -2.34375 1.265625q-0.734375 0 -1.40625 -0.375q-0.65625 -0.390625 -1.046875 -1.09375q-0.375 -0.71875 -0.375 -1.46875q0 -0.765625 0.375 -1.46875q0.390625 -0.703125 1.046875 -1.09375q0.671875 -0.390625 1.40625 -0.390625q1.390625 0 2.34375 1.265625l0 -3.0l-0.703125 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.25 0zm-0.546875 5.234375q0 -1.015625 -0.6875 -1.703125q-0.671875 -0.703125 -1.625 -0.703125q-0.953125 0 -1.640625 0.703125q-0.6875 0.6875 -0.6875 1.703125q0 1.0 0.6875 1.703125q0.6875 0.703125 1.640625 0.703125q0.953125 0 1.625 -0.703125q0.6875 -0.703125 0.6875 -1.703125zm8.61377 0.109375l-5.421875 0q0.125 1.03125 0.859375 1.671875q0.734375 0.625 1.796875 0.625q0.59375 0 1.25 -0.1875q0.65625 -0.203125 1.0625 -0.53125q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.109375 -0.09375 0.21875q-0.3125 0.3125 -1.09375 0.59375q-0.765625 0.265625 -1.59375 0.265625q-1.375 0 -2.296875 -0.890625q-0.90625 -0.90625 -0.90625 -2.171875q0 -1.171875 0.859375 -2.0q0.859375 -0.828125 2.125 -0.828125q1.3125 0 2.15625 0.859375q0.84375 0.84375 0.828125 2.203125zm-0.53125 -0.53125q-0.15625 -0.890625 -0.84375 -1.4375q-0.671875 -0.546875 -1.609375 -0.546875q-0.921875 0 -1.59375 0.546875q-0.671875 0.53125 -0.84375 1.4375l4.890625 0zm5.0981445 -1.796875l0 4.421875l2.34375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-4.171875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.296875 0l0 -4.421875l-1.15625 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.15625 0l0 -0.796875q0 -0.671875 0.53125 -1.171875q0.546875 -0.5 1.453125 -0.5q0.75 0 1.609375 0.140625q0.328125 0.046875 0.390625 0.125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.0625 -0.203125 0.0625q-0.0625 0 -0.171875 -0.015625q-0.96875 -0.140625 -1.625 -0.140625q-0.703125 0 -1.078125 0.34375q-0.375 0.34375 -0.375 0.78125l0 0.796875l2.5 0q0.1875 0 0.265625 0.078125q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.5 0zm17.868164 -1.9375l0 -0.1875q0 -0.1875 0.0625 -0.265625q0.078125 -0.078125 0.203125 -0.078125q0.125 0 0.1875 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.359375q0 0.203125 -0.078125 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.125 0 -0.203125 -0.078125q-0.0625 -0.078125 -0.0625 -0.25q-0.03125 -0.53125 -0.5625 -0.953125q-0.515625 -0.421875 -1.34375 -0.421875q-0.890625 0 -1.40625 0.453125q-0.515625 0.453125 -0.515625 1.0625q0 0.328125 0.140625 0.59375q0.140625 0.25 0.375 0.421875q0.25 0.15625 0.546875 0.25q0.3125 0.09375 0.96875 0.203125q1.078125 0.1875 1.5 0.359375q0.546875 0.25 0.828125 0.6875q0.28125 0.4375 0.28125 1.03125q0 0.921875 -0.734375 1.5625q-0.71875 0.640625 -1.96875 0.640625q-1.375 0 -2.21875 -0.859375l0 0.296875q0 0.1875 -0.078125 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.09375 -0.078125 -0.28125l0 -1.46875q0 -0.203125 0.078125 -0.28125q0.078125 -0.078125 0.1875 -0.078125q0.125 0 0.1875 0.078125q0.078125 0.078125 0.078125 0.25q0.03125 0.578125 0.625 1.0625q0.59375 0.46875 1.59375 0.46875q1.015625 0 1.59375 -0.5q0.578125 -0.5 0.578125 -1.1875q0 -0.421875 -0.21875 -0.734375q-0.21875 -0.328125 -0.65625 -0.53125q-0.3125 -0.125 -1.28125 -0.296875q-1.328125 -0.21875 -1.90625 -0.671875q-0.578125 -0.453125 -0.578125 -1.296875q0 -0.84375 0.65625 -1.4375q0.671875 -0.609375 1.78125 -0.609375q1.109375 0 1.921875 0.703125zm4.8012695 1.390625l2.890625 0q0.1875 0 0.265625 0.078125q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.890625 0l0 3.546875q0 0.453125 0.359375 0.765625q0.375 0.3125 1.09375 0.3125q0.546875 0 1.171875 -0.15625q0.625 -0.15625 0.96875 -0.359375q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.09375 -0.078125 0.1875q-0.203125 0.203125 -1.0 0.453125q-0.78125 0.234375 -1.5 0.234375q-0.921875 0 -1.484375 -0.4375q-0.546875 -0.4375 -0.546875 -1.171875l0 -3.546875l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.984375 0l0 -1.578125q0 -0.1875 0.078125 -0.265625q0.078125 -0.078125 0.1875 -0.078125q0.125 0 0.203125 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.578125zm8.254395 0l0 1.34375q1.03125 -0.9375 1.546875 -1.203125q0.53125 -0.265625 0.96875 -0.265625q0.46875 0 0.875 0.328125q0.421875 0.3125 0.421875 0.46875q0 0.125 -0.09375 0.203125q-0.078125 0.078125 -0.1875 0.078125q-0.0625 0 -0.109375 -0.015625q-0.046875 -0.03125 -0.171875 -0.140625q-0.21875 -0.234375 -0.390625 -0.3125q-0.15625 -0.078125 -0.3125 -0.078125q-0.359375 0 -0.859375 0.28125q-0.484375 0.28125 -1.6875 1.359375l0 2.921875l2.359375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-4.1875 0q-0.1875 0 -0.28125 -0.0625q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.171875q0.09375 -0.078125 0.28125 -0.078125l1.296875 0l0 -4.4375l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.515625 0zm8.70752 -2.734375l0 1.375l-0.796875 0l0 -1.375l0.796875 0zm0.015625 2.734375l0 4.96875l2.09375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-4.71875 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l2.09375 0l0 -4.421875l-1.5625 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.078125 -0.078125 0.28125 -0.078125l2.09375 0zm5.7856445 0l0 0.8125q0.5625 -0.5625 1.015625 -0.78125q0.453125 -0.21875 1.015625 -0.21875q0.609375 0 1.109375 0.265625q0.359375 0.1875 0.640625 0.625q0.296875 0.4375 0.296875 0.90625l0 3.359375l0.453125 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.4375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.453125 0l0 -3.265625q0 -0.578125 -0.421875 -0.953125q-0.40625 -0.390625 -1.09375 -0.390625q-0.53125 0 -0.921875 0.21875q-0.390625 0.203125 -1.109375 1.046875l0 3.34375l0.609375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.734375 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l0.59375 0l0 -4.421875l-0.453125 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l0.984375 0zm11.316895 0.984375l0 -0.984375l1.25 0q0.203125 0 0.28125 0.078125q0.078125 0.078125 0.078125 0.203125q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-0.703125 0l0 5.328125q0 0.53125 -0.234375 0.953125q-0.15625 0.265625 -0.515625 0.5625q-0.34375 0.3125 -0.640625 0.4375q-0.296875 0.125 -0.78125 0.125l-1.515625 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.078125 -0.078125 0.265625 -0.078125l1.53125 0.015625q0.46875 0 0.84375 -0.25q0.390625 -0.234375 0.625 -0.703125q0.140625 -0.265625 0.140625 -0.671875l0 -1.609375q-0.84375 1.171875 -2.203125 1.171875q-1.09375 0 -1.890625 -0.8125q-0.796875 -0.8125 -0.796875 -1.953125q0 -1.15625 0.796875 -1.96875q0.796875 -0.8125 1.890625 -0.8125q1.359375 0 2.203125 1.171875zm0 1.609375q0 -0.953125 -0.640625 -1.59375q-0.640625 -0.640625 -1.53125 -0.640625q-0.90625 0 -1.546875 0.65625q-0.640625 0.640625 -0.640625 1.578125q0 0.9375 0.640625 1.59375q0.640625 0.640625 1.546875 0.640625q0.890625 0 1.53125 -0.640625q0.640625 -0.65625 0.640625 -1.59375zm13.711914 -2.59375l0.21875 0q0.359375 0 0.609375 0.265625q0.25 0.25 0.25 0.59375q0 0.375 -0.25 0.625q-0.25 0.25 -0.609375 0.25l-0.21875 0q-0.359375 0 -0.625 -0.25q-0.25 -0.265625 -0.25 -0.609375q0 -0.375 0.25 -0.625q0.265625 -0.25 0.625 -0.25zm0 3.96875l0.21875 0q0.359375 0 0.609375 0.25q0.25 0.25 0.25 0.609375q0 0.359375 -0.25 0.609375q-0.25 0.25 -0.609375 0.25l-0.21875 0q-0.359375 0 -0.625 -0.25q-0.25 -0.25 -0.25 -0.609375q0 -0.359375 0.25 -0.609375q0.265625 -0.25 0.625 -0.25zm14.555664 -1.515625l0 2.515625l1.828125 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.265625 0.078125l-3.09375 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l0.71875 0l0 -6.359375l-0.71875 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l3.109375 0q1.09375 0 1.78125 0.65625q0.703125 0.640625 0.703125 1.5q0 0.515625 -0.234375 0.9375q-0.21875 0.40625 -0.53125 0.640625q-0.484375 0.359375 -0.984375 0.515625q-0.375 0.125 -0.921875 0.125l-1.65625 0zm0 -0.53125l1.6875 0q0.59375 0 1.109375 -0.265625q0.515625 -0.265625 0.75 -0.640625q0.25 -0.390625 0.25 -0.78125q0 -0.625 -0.546875 -1.125q-0.53125 -0.5 -1.359375 -0.5l-1.890625 0l0 3.3125zm10.77002 3.578125l0 -0.78125q-1.078125 0.984375 -2.359375 0.984375q-0.78125 0 -1.1875 -0.421875q-0.515625 -0.5625 -0.515625 -1.296875l0 -3.4375l-0.71875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.25 0l0 3.984375q0 0.515625 0.328125 0.859375q0.328125 0.328125 0.828125 0.328125q1.296875 0 2.375 -1.1875l0 -3.4375l-0.984375 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l1.53125 0l0 4.96875l0.4375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-0.984375 0zm3.9731445 -7.96875l0 3.53125q0.96875 -1.25 2.328125 -1.25q1.171875 0 2.0 0.84375q0.828125 0.84375 0.828125 2.078125q0 1.25 -0.84375 2.109375q-0.828125 0.859375 -1.984375 0.859375q-1.390625 0 -2.328125 -1.25l0 1.046875l-1.25 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.71875 0l0 -6.890625l-0.71875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.25 0zm4.625 5.234375q0 -1.015625 -0.6875 -1.703125q-0.6875 -0.703125 -1.625 -0.703125q-0.921875 0 -1.625 0.703125q-0.6875 0.6875 -0.6875 1.703125q0 1.0 0.6875 1.703125q0.703125 0.703125 1.625 0.703125q0.9375 0 1.625 -0.703125q0.6875 -0.703125 0.6875 -1.703125zm5.4575195 -5.234375l0 7.4375l2.09375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-4.71875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l2.09375 0l0 -6.890625l-1.546875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l2.078125 0zm7.8012695 -0.265625l0 1.375l-0.796875 0l0 -1.375l0.796875 0zm0.015625 2.734375l0 4.96875l2.09375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-4.71875 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l2.09375 0l0 -4.421875l-1.5625 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.078125 -0.078125 0.28125 -0.078125l2.09375 0zm9.73877 0.546875l0 -0.1875q0 -0.1875 0.078125 -0.265625q0.078125 -0.09375 0.1875 -0.09375q0.125 0 0.203125 0.09375q0.078125 0.078125 0.078125 0.265625l0 1.21875q-0.015625 0.1875 -0.09375 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.0625 -0.078125 -0.078125 -0.25q-0.03125 -0.4375 -0.59375 -0.84375q-0.546875 -0.40625 -1.5 -0.40625q-1.1875 0 -1.796875 0.75q-0.609375 0.734375 -0.609375 1.6875q0 1.03125 0.671875 1.703125q0.6875 0.671875 1.765625 0.671875q0.609375 0 1.25 -0.21875q0.65625 -0.234375 1.171875 -0.734375q0.140625 -0.140625 0.234375 -0.140625q0.109375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.265625 -0.640625 0.6875q-1.03125 0.671875 -2.296875 0.671875q-1.28125 0 -2.125 -0.8125q-0.828125 -0.828125 -0.828125 -2.09375q0 -1.28125 0.84375 -2.125q0.859375 -0.859375 2.140625 -0.859375q1.234375 0 2.0625 0.734375zm7.3325195 2.46875l-3.5 0l-0.71875 1.953125l1.015625 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.984375 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l0.40625 0l2.359375 -6.359375l-1.578125 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l2.6875 0l2.59375 6.890625l0.421875 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.984375 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.015625 0l-0.734375 -1.953125zm-0.203125 -0.53125l-1.46875 -3.875l-0.203125 0l-1.421875 3.875l3.09375 0zm5.0981445 -0.03125l0 2.515625l1.828125 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.265625 0.078125l-3.09375 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l0.71875 0l0 -6.359375l-0.71875 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l3.109375 0q1.09375 0 1.78125 0.65625q0.703125 0.640625 0.703125 1.5q0 0.515625 -0.234375 0.9375q-0.21875 0.40625 -0.53125 0.640625q-0.484375 0.359375 -0.984375 0.515625q-0.375 0.125 -0.921875 0.125l-1.65625 0zm0 -0.53125l1.6875 0q0.59375 0 1.109375 -0.265625q0.515625 -0.265625 0.75 -0.640625q0.25 -0.390625 0.25 -0.78125q0 -0.625 -0.546875 -1.125q-0.53125 -0.5 -1.359375 -0.5l-1.890625 0l0 3.3125zm9.223145 -3.3125l0 6.359375l1.828125 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-4.1875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.828125 0l0 -6.359375l-1.828125 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l4.1875 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.828125 0zm4.2543945 3.1875l5.765625 -3.203125q0.140625 -0.078125 0.203125 -0.078125q0.109375 0 0.1875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.15625 -0.21875 0.28125l-4.9375 2.734375l4.9375 2.75q0.21875 0.109375 0.21875 0.28125q0 0.09375 -0.078125 0.1875q-0.078125 0.078125 -0.1875 0.078125q-0.078125 0 -0.21875 -0.078125l-5.75 -3.21875zm9.723145 -4.265625l1.375 0l-1.859375 3.03125q-0.15625 0.25 -0.34375 0.25q-0.140625 0 -0.234375 -0.09375q-0.09375 -0.09375 -0.09375 -0.21875q0 -0.078125 0.0625 -0.234375l1.09375 -2.734375zm2.734375 0l1.375 0l-1.84375 3.03125q-0.171875 0.25 -0.34375 0.25q-0.140625 0 -0.25 -0.09375q-0.09375 -0.09375 -0.09375 -0.21875q0 -0.078125 0.078125 -0.234375l1.078125 -2.734375zm8.17627 2.828125q0 -0.1875 0.078125 -0.265625q0.078125 -0.09375 0.1875 -0.09375q0.125 0 0.203125 0.09375q0.078125 0.078125 0.078125 0.265625l0 0.921875q0 0.1875 -0.078125 0.28125q-0.078125 0.078125 -0.203125 0.078125q-0.09375 0 -0.171875 -0.0625q-0.078125 -0.078125 -0.09375 -0.25q-0.03125 -0.375 -0.390625 -0.625q-0.515625 -0.34375 -1.375 -0.34375q-0.890625 0 -1.390625 0.359375q-0.375 0.265625 -0.375 0.609375q0 0.375 0.453125 0.625q0.296875 0.1875 1.140625 0.28125q1.125 0.109375 1.546875 0.265625q0.625 0.21875 0.921875 0.625q0.296875 0.390625 0.296875 0.84375q0 0.6875 -0.65625 1.21875q-0.640625 0.515625 -1.90625 0.515625q-1.265625 0 -2.078125 -0.640625q0 0.21875 -0.03125 0.28125q-0.015625 0.0625 -0.09375 0.109375q-0.0625 0.046875 -0.140625 0.046875q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.09375 -0.078125 -0.28125l0 -1.09375q0 -0.1875 0.0625 -0.265625q0.078125 -0.09375 0.203125 -0.09375q0.109375 0 0.1875 0.078125q0.09375 0.078125 0.09375 0.21875q0 0.296875 0.140625 0.484375q0.21875 0.3125 0.703125 0.515625q0.484375 0.1875 1.1875 0.1875q1.046875 0 1.546875 -0.375q0.515625 -0.390625 0.515625 -0.828125q0 -0.5 -0.515625 -0.796875q-0.515625 -0.296875 -1.515625 -0.390625q-0.984375 -0.109375 -1.421875 -0.265625q-0.4375 -0.171875 -0.671875 -0.5q-0.234375 -0.328125 -0.234375 -0.71875q0 -0.671875 0.671875 -1.078125q0.671875 -0.40625 1.59375 -0.40625q1.109375 0 1.796875 0.546875zm4.9575195 -0.359375l2.890625 0q0.1875 0 0.265625 0.078125q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.890625 0l0 3.546875q0 0.453125 0.359375 0.765625q0.375 0.3125 1.09375 0.3125q0.546875 0 1.171875 -0.15625q0.625 -0.15625 0.96875 -0.359375q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.09375 -0.078125 0.1875q-0.203125 0.203125 -1.0 0.453125q-0.78125 0.234375 -1.5 0.234375q-0.921875 0 -1.484375 -0.4375q-0.546875 -0.4375 -0.546875 -1.171875l0 -3.546875l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.984375 0l0 -1.578125q0 -0.1875 0.078125 -0.265625q0.078125 -0.078125 0.1875 -0.078125q0.125 0 0.203125 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.578125zm8.254395 0l0 1.34375q1.03125 -0.9375 1.546875 -1.203125q0.53125 -0.265625 0.96875 -0.265625q0.46875 0 0.875 0.328125q0.421875 0.3125 0.421875 0.46875q0 0.125 -0.09375 0.203125q-0.078125 0.078125 -0.1875 0.078125q-0.0625 0 -0.109375 -0.015625q-0.046875 -0.03125 -0.171875 -0.140625q-0.21875 -0.234375 -0.390625 -0.3125q-0.15625 -0.078125 -0.3125 -0.078125q-0.359375 0 -0.859375 0.28125q-0.484375 0.28125 -1.6875 1.359375l0 2.921875l2.359375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-4.1875 0q-0.1875 0 -0.28125 -0.0625q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.171875q0.09375 -0.078125 0.28125 -0.078125l1.296875 0l0 -4.4375l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.515625 0zm8.70752 -2.734375l0 1.375l-0.796875 0l0 -1.375l0.796875 0zm0.015625 2.734375l0 4.96875l2.09375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-4.71875 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l2.09375 0l0 -4.421875l-1.5625 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.078125 -0.078125 0.28125 -0.078125l2.09375 0zm5.7856445 0l0 0.8125q0.5625 -0.5625 1.015625 -0.78125q0.453125 -0.21875 1.015625 -0.21875q0.609375 0 1.109375 0.265625q0.359375 0.1875 0.640625 0.625q0.296875 0.4375 0.296875 0.90625l0 3.359375l0.453125 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.4375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.453125 0l0 -3.265625q0 -0.578125 -0.421875 -0.953125q-0.40625 -0.390625 -1.09375 -0.390625q-0.53125 0 -0.921875 0.21875q-0.390625 0.203125 -1.109375 1.046875l0 3.34375l0.609375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.734375 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l0.59375 0l0 -4.421875l-0.453125 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l0.984375 0zm11.316895 0.984375l0 -0.984375l1.25 0q0.203125 0 0.28125 0.078125q0.078125 0.078125 0.078125 0.203125q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-0.703125 0l0 5.328125q0 0.53125 -0.234375 0.953125q-0.15625 0.265625 -0.515625 0.5625q-0.34375 0.3125 -0.640625 0.4375q-0.296875 0.125 -0.78125 0.125l-1.515625 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.078125 -0.078125 0.265625 -0.078125l1.53125 0.015625q0.46875 0 0.84375 -0.25q0.390625 -0.234375 0.625 -0.703125q0.140625 -0.265625 0.140625 -0.671875l0 -1.609375q-0.84375 1.171875 -2.203125 1.171875q-1.09375 0 -1.890625 -0.8125q-0.796875 -0.8125 -0.796875 -1.953125q0 -1.15625 0.796875 -1.96875q0.796875 -0.8125 1.890625 -0.8125q1.359375 0 2.203125 1.171875zm0 1.609375q0 -0.953125 -0.640625 -1.59375q-0.640625 -0.640625 -1.53125 -0.640625q-0.90625 0 -1.546875 0.65625q-0.640625 0.640625 -0.640625 1.578125q0 0.9375 0.640625 1.59375q0.640625 0.640625 1.546875 0.640625q0.890625 0 1.53125 -0.640625q0.640625 -0.65625 0.640625 -1.59375zm4.6606445 -5.0625l1.375 0l-1.859375 3.03125q-0.15625 0.25 -0.34375 0.25q-0.140625 0 -0.234375 -0.09375q-0.09375 -0.09375 -0.09375 -0.21875q0 -0.078125 0.0625 -0.234375l1.09375 -2.734375zm2.734375 0l1.375 0l-1.84375 3.03125q-0.171875 0.25 -0.34375 0.25q-0.140625 0 -0.25 -0.09375q-0.09375 -0.09375 -0.09375 -0.21875q0 -0.078125 0.078125 -0.234375l1.078125 -2.734375zm9.691895 4.265625l-5.75 3.21875q-0.140625 0.078125 -0.21875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.09375 -0.078125 -0.1875q0 -0.171875 0.21875 -0.28125l4.9375 -2.75l-4.9375 -2.734375q-0.203125 -0.125 -0.203125 -0.28125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.1875 -0.078125q0.0625 0 0.203125 0.078125l5.75 3.203125zm12.024414 0.546875q0.3125 0.234375 0.4375 0.453125q0.140625 0.28125 0.140625 0.671875l0 2.28125q0 0.359375 0.203125 0.59375q0.21875 0.234375 0.53125 0.265625q0.1875 0.015625 0.25 0.078125q0.09375 0.078125 0.09375 0.1875q0 0.125 -0.09375 0.1875q-0.078125 0.078125 -0.234375 0.078125q-0.5 0 -0.84375 -0.3125q-0.453125 -0.4375 -0.453125 -1.0625l0 -2.296875q0 -0.34375 -0.203125 -0.578125q-0.203125 -0.234375 -0.53125 -0.265625q-0.1875 -0.015625 -0.25 -0.078125q-0.0625 -0.078125 -0.0625 -0.203125q0 -0.125 0.0625 -0.1875q0.0625 -0.078125 0.25 -0.09375q0.328125 -0.03125 0.53125 -0.265625q0.203125 -0.234375 0.203125 -0.59375l0 -2.28125q0 -0.59375 0.375 -0.984375q0.390625 -0.40625 0.921875 -0.40625q0.15625 0 0.234375 0.078125q0.09375 0.078125 0.09375 0.1875q0 0.125 -0.09375 0.1875q-0.046875 0.0625 -0.25 0.09375q-0.328125 0.03125 -0.53125 0.265625q-0.203125 0.234375 -0.203125 0.578125l0 2.28125q0 0.40625 -0.125 0.65625q-0.125 0.234375 -0.453125 0.484375z" fill-rule="nonzero"/><path fill="#000000" d="m251.36234 264.5609l0 7.4375l2.09375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-4.71875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l2.09375 0l0 -6.890625l-1.546875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l2.078125 0zm10.410645 5.34375l-5.421875 0q0.125 1.03125 0.859375 1.671875q0.734375 0.625 1.796875 0.625q0.59375 0 1.25 -0.1875q0.65625 -0.203125 1.0625 -0.53125q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.109375 -0.09375 0.21875q-0.3125 0.3125 -1.09375 0.59375q-0.765625 0.265625 -1.59375 0.265625q-1.375 0 -2.296875 -0.890625q-0.90625 -0.90625 -0.90625 -2.171875q0 -1.171875 0.859375 -2.0q0.859375 -0.828125 2.125 -0.828125q1.3125 0 2.15625 0.859375q0.84375 0.84375 0.828125 2.203125zm-0.53125 -0.53125q-0.15625 -0.890625 -0.84375 -1.4375q-0.671875 -0.546875 -1.609375 -0.546875q-0.921875 0 -1.59375 0.546875q-0.671875 0.53125 -0.84375 1.4375l4.890625 0zm4.3637695 -2.34375l2.890625 0q0.1875 0 0.265625 0.078125q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.890625 0l0 3.546875q0 0.453125 0.359375 0.765625q0.375 0.3125 1.09375 0.3125q0.546875 0 1.171875 -0.15625q0.625 -0.15625 0.96875 -0.359375q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.09375 -0.078125 0.1875q-0.203125 0.203125 -1.0 0.453125q-0.78125 0.234375 -1.5 0.234375q-0.921875 0 -1.484375 -0.4375q-0.546875 -0.4375 -0.546875 -1.171875l0 -3.546875l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.984375 0l0 -1.578125q0 -0.1875 0.078125 -0.265625q0.078125 -0.078125 0.1875 -0.078125q0.125 0 0.203125 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.578125zm15.399414 1.90625l0 3.0625l1.828125 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-3.078125 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l0.71875 0l0 -6.359375l-0.71875 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.09375 -0.203125q0.0625 -0.0625 0.25 -0.0625l5.875 0l0 1.828125q0 0.1875 -0.078125 0.28125q-0.078125 0.078125 -0.1875 0.078125q-0.125 0 -0.203125 -0.078125q-0.0625 -0.09375 -0.0625 -0.28125l0 -1.296875l-4.09375 0l0 2.765625l1.921875 0l0 -0.59375q0 -0.1875 0.0625 -0.265625q0.078125 -0.09375 0.203125 -0.09375q0.109375 0 0.1875 0.09375q0.078125 0.078125 0.078125 0.265625l0 1.734375q0 0.1875 -0.078125 0.28125q-0.078125 0.078125 -0.1875 0.078125q-0.125 0 -0.203125 -0.078125q-0.0625 -0.09375 -0.0625 -0.28125l0 -0.609375l-1.921875 0zm10.910645 3.59375l0 -0.78125q-1.078125 0.984375 -2.359375 0.984375q-0.78125 0 -1.1875 -0.421875q-0.515625 -0.5625 -0.515625 -1.296875l0 -3.4375l-0.71875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.25 0l0 3.984375q0 0.515625 0.328125 0.859375q0.328125 0.328125 0.828125 0.328125q1.296875 0 2.375 -1.1875l0 -3.4375l-0.984375 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l1.53125 0l0 4.96875l0.4375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-0.984375 0zm4.2543945 -5.5l0 0.8125q0.5625 -0.5625 1.015625 -0.78125q0.453125 -0.21875 1.015625 -0.21875q0.609375 0 1.109375 0.265625q0.359375 0.1875 0.640625 0.625q0.296875 0.4375 0.296875 0.90625l0 3.359375l0.453125 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.4375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.453125 0l0 -3.265625q0 -0.578125 -0.421875 -0.953125q-0.40625 -0.390625 -1.09375 -0.390625q-0.53125 0 -0.921875 0.21875q-0.390625 0.203125 -1.109375 1.046875l0 3.34375l0.609375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.734375 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l0.59375 0l0 -4.421875l-0.453125 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l0.984375 0zm11.754395 0.546875l0 -0.1875q0 -0.1875 0.078125 -0.265625q0.078125 -0.09375 0.1875 -0.09375q0.125 0 0.203125 0.09375q0.078125 0.078125 0.078125 0.265625l0 1.21875q-0.015625 0.1875 -0.09375 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.0625 -0.078125 -0.078125 -0.25q-0.03125 -0.4375 -0.59375 -0.84375q-0.546875 -0.40625 -1.5 -0.40625q-1.1875 0 -1.796875 0.75q-0.609375 0.734375 -0.609375 1.6875q0 1.03125 0.671875 1.703125q0.6875 0.671875 1.765625 0.671875q0.609375 0 1.25 -0.21875q0.65625 -0.234375 1.171875 -0.734375q0.140625 -0.140625 0.234375 -0.140625q0.109375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.265625 -0.640625 0.6875q-1.03125 0.671875 -2.296875 0.671875q-1.28125 0 -2.125 -0.8125q-0.828125 -0.828125 -0.828125 -2.09375q0 -1.28125 0.84375 -2.125q0.859375 -0.859375 2.140625 -0.859375q1.234375 0 2.0625 0.734375zm4.4887695 -0.546875l2.890625 0q0.1875 0 0.265625 0.078125q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.890625 0l0 3.546875q0 0.453125 0.359375 0.765625q0.375 0.3125 1.09375 0.3125q0.546875 0 1.171875 -0.15625q0.625 -0.15625 0.96875 -0.359375q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.09375 -0.078125 0.1875q-0.203125 0.203125 -1.0 0.453125q-0.78125 0.234375 -1.5 0.234375q-0.921875 0 -1.484375 -0.4375q-0.546875 -0.4375 -0.546875 -1.171875l0 -3.546875l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.984375 0l0 -1.578125q0 -0.1875 0.078125 -0.265625q0.078125 -0.078125 0.1875 -0.078125q0.125 0 0.203125 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.578125zm9.160645 -2.734375l0 1.375l-0.796875 0l0 -1.375l0.796875 0zm0.015625 2.734375l0 4.96875l2.09375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-4.71875 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l2.09375 0l0 -4.421875l-1.5625 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.078125 -0.078125 0.28125 -0.078125l2.09375 0zm10.48877 2.765625q0 1.21875 -0.875 2.078125q-0.859375 0.859375 -2.09375 0.859375q-1.25 0 -2.125 -0.859375q-0.859375 -0.875 -0.859375 -2.078125q0 -1.21875 0.859375 -2.078125q0.875 -0.875 2.125 -0.875q1.234375 0 2.09375 0.859375q0.875 0.859375 0.875 2.09375zm-0.53125 0q0 -1.0 -0.71875 -1.703125q-0.71875 -0.703125 -1.734375 -0.703125q-1.015625 0 -1.734375 0.703125q-0.703125 0.703125 -0.703125 1.703125q0 0.984375 0.703125 1.703125q0.71875 0.703125 1.734375 0.703125q1.015625 0 1.734375 -0.703125q0.71875 -0.703125 0.71875 -1.703125zm3.6293945 -2.765625l0 0.8125q0.5625 -0.5625 1.015625 -0.78125q0.453125 -0.21875 1.015625 -0.21875q0.609375 0 1.109375 0.265625q0.359375 0.1875 0.640625 0.625q0.296875 0.4375 0.296875 0.90625l0 3.359375l0.453125 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.4375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.453125 0l0 -3.265625q0 -0.578125 -0.421875 -0.953125q-0.40625 -0.390625 -1.09375 -0.390625q-0.53125 0 -0.921875 0.21875q-0.390625 0.203125 -1.109375 1.046875l0 3.34375l0.609375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.734375 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l0.59375 0l0 -4.421875l-0.453125 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l0.984375 0zm11.285645 0.359375q0 -0.1875 0.078125 -0.265625q0.078125 -0.09375 0.1875 -0.09375q0.125 0 0.203125 0.09375q0.078125 0.078125 0.078125 0.265625l0 0.921875q0 0.1875 -0.078125 0.28125q-0.078125 0.078125 -0.203125 0.078125q-0.09375 0 -0.171875 -0.0625q-0.078125 -0.078125 -0.09375 -0.25q-0.03125 -0.375 -0.390625 -0.625q-0.515625 -0.34375 -1.375 -0.34375q-0.890625 0 -1.390625 0.359375q-0.375 0.265625 -0.375 0.609375q0 0.375 0.453125 0.625q0.296875 0.1875 1.140625 0.28125q1.125 0.109375 1.546875 0.265625q0.625 0.21875 0.921875 0.625q0.296875 0.390625 0.296875 0.84375q0 0.6875 -0.65625 1.21875q-0.640625 0.515625 -1.90625 0.515625q-1.265625 0 -2.078125 -0.640625q0 0.21875 -0.03125 0.28125q-0.015625 0.0625 -0.09375 0.109375q-0.0625 0.046875 -0.140625 0.046875q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.09375 -0.078125 -0.28125l0 -1.09375q0 -0.1875 0.0625 -0.265625q0.078125 -0.09375 0.203125 -0.09375q0.109375 0 0.1875 0.078125q0.09375 0.078125 0.09375 0.21875q0 0.296875 0.140625 0.484375q0.21875 0.3125 0.703125 0.515625q0.484375 0.1875 1.1875 0.1875q1.046875 0 1.546875 -0.375q0.515625 -0.390625 0.515625 -0.828125q0 -0.5 -0.515625 -0.796875q-0.515625 -0.296875 -1.515625 -0.390625q-0.984375 -0.109375 -1.421875 -0.265625q-0.4375 -0.171875 -0.671875 -0.5q-0.234375 -0.328125 -0.234375 -0.71875q0 -0.671875 0.671875 -1.078125q0.671875 -0.40625 1.59375 -0.40625q1.109375 0 1.796875 0.546875zm16.75879 0.734375l-5.8125 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l5.8125 0q0.1875 0 0.265625 0.078125q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125zm0 1.90625l-5.8125 0q-0.1875 0 -0.28125 -0.0625q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l5.8125 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.125 -0.09375 0.203125q-0.078125 0.0625 -0.265625 0.0625zm12.961914 -4.921875l0 8.53125l1.296875 0q0.1875 0 0.265625 0.0625q0.09375 0.078125 0.09375 0.203125q0 0.125 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.828125 0l0 -9.609375l1.828125 0q0.1875 0 0.265625 0.078125q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.296875 0z" fill-rule="nonzero"/><path fill="#000000" d="m263.93362 280.5609l1.375 0l1.09375 2.734375q0.046875 0.15625 0.046875 0.21875q0 0.140625 -0.09375 0.234375q-0.09375 0.09375 -0.234375 0.09375q-0.171875 0 -0.328125 -0.25l-1.859375 -3.03125zm2.734375 0l1.390625 0l1.078125 2.734375q0.0625 0.15625 0.0625 0.21875q0 0.140625 -0.09375 0.234375q-0.09375 0.09375 -0.234375 0.09375q-0.1875 0 -0.34375 -0.25l-1.859375 -3.03125zm5.3950195 2.46875l0 0.546875q0.6875 -0.734375 1.375 -0.734375q0.40625 0 0.71875 0.21875q0.3125 0.21875 0.515625 0.65625q0.359375 -0.4375 0.71875 -0.65625q0.375 -0.21875 0.734375 -0.21875q0.578125 0 0.921875 0.375q0.453125 0.484375 0.453125 1.046875l0 3.734375l0.453125 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-0.984375 0l0 -4.203125q0 -0.40625 -0.25 -0.671875q-0.25 -0.265625 -0.578125 -0.265625q-0.28125 0 -0.609375 0.21875q-0.328125 0.21875 -0.734375 0.859375l0 3.53125l0.4375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-0.984375 0l0 -4.171875q0 -0.421875 -0.25 -0.6875q-0.25 -0.28125 -0.5625 -0.28125q-0.28125 0 -0.5625 0.171875q-0.390625 0.265625 -0.8125 0.90625l0 3.53125l0.453125 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.4375 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l0.453125 0l0 -4.421875l-0.453125 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l0.984375 0zm13.11377 2.875l-5.421875 0q0.125 1.03125 0.859375 1.671875q0.734375 0.625 1.796875 0.625q0.59375 0 1.25 -0.1875q0.65625 -0.203125 1.0625 -0.53125q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.109375 -0.09375 0.21875q-0.3125 0.3125 -1.09375 0.59375q-0.765625 0.265625 -1.59375 0.265625q-1.375 0 -2.296875 -0.890625q-0.90625 -0.90625 -0.90625 -2.171875q0 -1.171875 0.859375 -2.0q0.859375 -0.828125 2.125 -0.828125q1.3125 0 2.15625 0.859375q0.84375 0.84375 0.828125 2.203125zm-0.53125 -0.53125q-0.15625 -0.890625 -0.84375 -1.4375q-0.671875 -0.546875 -1.609375 -0.546875q-0.921875 0 -1.59375 0.546875q-0.671875 0.53125 -0.84375 1.4375l4.890625 0zm3.0200195 -2.34375l0 0.546875q0.6875 -0.734375 1.375 -0.734375q0.40625 0 0.71875 0.21875q0.3125 0.21875 0.515625 0.65625q0.359375 -0.4375 0.71875 -0.65625q0.375 -0.21875 0.734375 -0.21875q0.578125 0 0.921875 0.375q0.453125 0.484375 0.453125 1.046875l0 3.734375l0.453125 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-0.984375 0l0 -4.203125q0 -0.40625 -0.25 -0.671875q-0.25 -0.265625 -0.578125 -0.265625q-0.28125 0 -0.609375 0.21875q-0.328125 0.21875 -0.734375 0.859375l0 3.53125l0.4375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-0.984375 0l0 -4.171875q0 -0.421875 -0.25 -0.6875q-0.25 -0.28125 -0.5625 -0.28125q-0.28125 0 -0.5625 0.171875q-0.390625 0.265625 -0.8125 0.90625l0 3.53125l0.453125 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.4375 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l0.453125 0l0 -4.421875l-0.453125 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l0.984375 0zm12.45752 0.546875l0 -0.1875q0 -0.1875 0.078125 -0.265625q0.078125 -0.09375 0.1875 -0.09375q0.125 0 0.203125 0.09375q0.078125 0.078125 0.078125 0.265625l0 1.21875q-0.015625 0.1875 -0.09375 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.0625 -0.078125 -0.078125 -0.25q-0.03125 -0.4375 -0.59375 -0.84375q-0.546875 -0.40625 -1.5 -0.40625q-1.1875 0 -1.796875 0.75q-0.609375 0.734375 -0.609375 1.6875q0 1.03125 0.671875 1.703125q0.6875 0.671875 1.765625 0.671875q0.609375 0 1.25 -0.21875q0.65625 -0.234375 1.171875 -0.734375q0.140625 -0.140625 0.234375 -0.140625q0.109375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.265625 -0.640625 0.6875q-1.03125 0.671875 -2.296875 0.671875q-1.28125 0 -2.125 -0.8125q-0.828125 -0.828125 -0.828125 -2.09375q0 -1.28125 0.84375 -2.125q0.859375 -0.859375 2.140625 -0.859375q1.234375 0 2.0625 0.734375zm3.5668945 -0.546875l0 0.96875q0.484375 -0.578125 1.015625 -0.859375q0.546875 -0.296875 1.296875 -0.296875q0.78125 0 1.453125 0.375q0.671875 0.359375 1.03125 1.015625q0.359375 0.65625 0.359375 1.390625q0 1.140625 -0.828125 1.953125q-0.8125 0.8125 -2.015625 0.8125q-1.421875 0 -2.3125 -1.15625l0 3.21875l1.296875 0q0.1875 0 0.265625 0.0625q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.546875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.09375 -0.0625 0.28125 -0.0625l0.71875 0l0 -6.875l-0.71875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.25 0zm4.625 2.59375q0 -0.921875 -0.671875 -1.578125q-0.671875 -0.65625 -1.640625 -0.65625q-0.96875 0 -1.640625 0.65625q-0.671875 0.65625 -0.671875 1.578125q0 0.90625 0.671875 1.578125q0.671875 0.65625 1.640625 0.65625q0.96875 0 1.640625 -0.65625q0.671875 -0.65625 0.671875 -1.578125zm5.2231445 2.90625l-2.484375 -4.953125l-0.15625 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.09375 0.03125 -0.15625q0.046875 -0.0625 0.109375 -0.09375q0.0625 -0.03125 0.203125 -0.03125l1.46875 0q0.1875 0 0.265625 0.078125q0.078125 0.078125 0.078125 0.203125q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.265625 0.078125l-0.71875 0l2.171875 4.375l2.140625 -4.375l-0.703125 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.453125 0q0.1875 0 0.265625 0.078125q0.09375 0.078125 0.09375 0.203125q0 0.078125 -0.0625 0.15625q-0.046875 0.0625 -0.109375 0.09375q-0.0625 0.015625 -0.359375 0.015625l-3.375 6.875l0.84375 0q0.1875 0 0.265625 0.0625q0.078125 0.078125 0.078125 0.203125q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.265625 0.078125l-3.078125 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.09375 -0.0625 0.28125 -0.0625l1.671875 0l0.9375 -1.921875zm6.4106445 -7.96875l1.375 0l-1.859375 3.03125q-0.15625 0.25 -0.34375 0.25q-0.140625 0 -0.234375 -0.09375q-0.09375 -0.09375 -0.09375 -0.21875q0 -0.078125 0.0625 -0.234375l1.09375 -2.734375zm2.734375 0l1.375 0l-1.84375 3.03125q-0.171875 0.25 -0.34375 0.25q-0.140625 0 -0.25 -0.09375q-0.09375 -0.09375 -0.09375 -0.21875q0 -0.078125 0.078125 -0.234375l1.078125 -2.734375zm5.3637695 6.046875l1.734375 0l-1.890625 3.515625q-0.171875 0.3125 -0.40625 0.3125q-0.15625 0 -0.28125 -0.109375q-0.109375 -0.109375 -0.109375 -0.265625q0 -0.078125 0.03125 -0.140625l0.921875 -3.3125z" fill-rule="nonzero"/><path fill="#000000" d="m266.58987 302.9984l0.21875 0q0.359375 0 0.609375 0.25q0.25 0.25 0.25 0.609375q0 0.359375 -0.25 0.609375q-0.25 0.25 -0.609375 0.25l-0.21875 0q-0.359375 0 -0.625 -0.25q-0.25 -0.25 -0.25 -0.609375q0 -0.359375 0.25 -0.609375q0.265625 -0.25 0.625 -0.25zm7.8012695 0l0.21875 0q0.359375 0 0.609375 0.25q0.25 0.25 0.25 0.609375q0 0.359375 -0.25 0.609375q-0.25 0.25 -0.609375 0.25l-0.21875 0q-0.359375 0 -0.625 -0.25q-0.25 -0.25 -0.25 -0.609375q0 -0.359375 0.25 -0.609375q0.265625 -0.25 0.625 -0.25zm7.8012695 0l0.21875 0q0.359375 0 0.609375 0.25q0.25 0.25 0.25 0.609375q0 0.359375 -0.25 0.609375q-0.25 0.25 -0.609375 0.25l-0.21875 0q-0.359375 0 -0.625 -0.25q-0.25 -0.25 -0.25 -0.609375q0 -0.359375 0.25 -0.609375q0.265625 -0.25 0.625 -0.25z" fill-rule="nonzero"/><path fill="#000000" d="m250.84671 321.63904l0 -8.53125l-1.296875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.09375 -0.078125 0.28125 -0.078125l1.828125 0l0 9.609375l-1.828125 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.0625 -0.078125 -0.1875q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.296875 0zm7.9262695 -6.609375l0.234375 0q0.359375 0 0.609375 0.265625q0.25 0.25 0.25 0.59375q0 0.375 -0.25 0.625q-0.25 0.25 -0.609375 0.25l-0.234375 0q-0.359375 0 -0.609375 -0.25q-0.25 -0.265625 -0.25 -0.609375q0 -0.375 0.25 -0.625q0.265625 -0.25 0.609375 -0.25zm-0.921875 3.578125l1.671875 0l-1.796875 2.953125q-0.125 0.21875 -0.21875 0.265625q-0.078125 0.0625 -0.171875 0.0625q-0.15625 0 -0.265625 -0.09375q-0.09375 -0.09375 -0.09375 -0.234375q0 -0.078125 0.03125 -0.1875l0.84375 -2.765625z" fill-rule="nonzero"/><path fill="#000000" d="m235.80667 333.3734q-0.328125 -0.25 -0.4375 -0.46875q-0.140625 -0.265625 -0.140625 -0.671875l0 -2.28125q0 -0.359375 -0.21875 -0.59375q-0.203125 -0.234375 -0.515625 -0.25q-0.203125 -0.03125 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.234375 -0.078125q0.515625 0 0.84375 0.328125q0.453125 0.421875 0.453125 1.0625l0 2.28125q0 0.359375 0.203125 0.59375q0.21875 0.234375 0.546875 0.265625q0.171875 0.015625 0.234375 0.09375q0.078125 0.0625 0.078125 0.1875q0 0.125 -0.078125 0.203125q-0.0625 0.0625 -0.234375 0.078125q-0.328125 0.03125 -0.546875 0.265625q-0.203125 0.234375 -0.203125 0.578125l0 2.296875q0 0.59375 -0.390625 0.984375q-0.375 0.40625 -0.90625 0.40625q-0.15625 0 -0.234375 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.0625 -0.0625 0.265625 -0.078125q0.3125 -0.03125 0.515625 -0.265625q0.21875 -0.234375 0.21875 -0.59375l0 -2.28125q0 -0.390625 0.125 -0.640625q0.125 -0.25 0.453125 -0.484375z" fill-rule="nonzero"/><path fill="#000000" d="m235.3848 366.9984l0.21875 0q0.359375 0 0.609375 0.25q0.25 0.25 0.25 0.609375q0 0.359375 -0.25 0.609375q-0.25 0.25 -0.609375 0.25l-0.21875 0q-0.359375 0 -0.625 -0.25q-0.25 -0.25 -0.25 -0.609375q0 -0.359375 0.25 -0.609375q0.265625 -0.25 0.625 -0.25zm7.8012695 0l0.21875 0q0.359375 0 0.609375 0.25q0.25 0.25 0.25 0.609375q0 0.359375 -0.25 0.609375q-0.25 0.25 -0.609375 0.25l-0.21875 0q-0.359375 0 -0.625 -0.25q-0.25 -0.25 -0.25 -0.609375q0 -0.359375 0.25 -0.609375q0.265625 -0.25 0.625 -0.25zm7.8012695 0l0.21875 0q0.359375 0 0.609375 0.25q0.25 0.25 0.25 0.609375q0 0.359375 -0.25 0.609375q-0.25 0.25 -0.609375 0.25l-0.21875 0q-0.359375 0 -0.625 -0.25q-0.25 -0.25 -0.25 -0.609375q0 -0.359375 0.25 -0.609375q0.265625 -0.25 0.625 -0.25z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m584.1916 15.228347l359.81104 0l0 463.3386l-359.81104 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m584.1916 15.228347l359.81104 0l0 463.3386l-359.81104 0z" fill-rule="evenodd"/><path fill="#000000" d="m599.9416 19.432013l-4.28125 9.21875q-0.15625 0.34375 -0.28125 0.453125q-0.171875 0.125 -0.421875 0.125q-0.265625 0 -0.46875 -0.203125q-0.203125 -0.1875 -0.203125 -0.4375q0 -0.171875 0.15625 -0.5l4.296875 -9.21875q0.15625 -0.34375 0.28125 -0.453125q0.171875 -0.125 0.40625 -0.125q0.28125 0 0.46875 0.1875q0.203125 0.1875 0.203125 0.4375q0 0.171875 -0.15625 0.515625zm7.998169 0l-4.28125 9.21875q-0.15625 0.34375 -0.28125 0.453125q-0.171875 0.125 -0.421875 0.125q-0.265625 0 -0.46875 -0.203125q-0.203125 -0.1875 -0.203125 -0.4375q0 -0.171875 0.15625 -0.5l4.296875 -9.21875q0.15625 -0.34375 0.28125 -0.453125q0.171875 -0.125 0.40625 -0.125q0.28125 0 0.46875 0.1875q0.203125 0.1875 0.203125 0.4375q0 0.171875 -0.15625 0.515625zm14.683899 3.921875q-0.328125 -0.203125 -0.6875 -0.296875q-0.34375 -0.109375 -0.734375 -0.109375q-0.78125 0 -1.234375 0.25q-0.203125 0.109375 -0.203125 0.25q0 0.140625 0.265625 0.28125q0.21875 0.109375 0.9375 0.203125q1.328125 0.1875 1.84375 0.375q0.6875 0.234375 1.046875 0.71875q0.375 0.46875 0.375 1.0q0 0.703125 -0.625 1.1875q-0.90625 0.703125 -2.34375 0.703125q-0.578125 0 -1.078125 -0.109375q-0.484375 -0.09375 -0.890625 -0.296875q-0.109375 0.09375 -0.21875 0.140625q-0.109375 0.046875 -0.21875 0.046875q-0.3125 0 -0.5 -0.203125q-0.1875 -0.21875 -0.1875 -0.6875l0 -0.453125q0 -0.484375 0.1875 -0.6875q0.1875 -0.203125 0.484375 -0.203125q0.234375 0 0.390625 0.140625q0.171875 0.125 0.265625 0.453125q0.296875 0.25 0.71875 0.390625q0.4375 0.125 1.0 0.125q0.921875 0 1.421875 -0.28125q0.25 -0.140625 0.25 -0.296875q0 -0.265625 -0.34375 -0.4375q-0.34375 -0.15625 -1.421875 -0.28125q-1.609375 -0.171875 -2.15625 -0.65625q-0.53125 -0.46875 -0.53125 -1.171875q0 -0.703125 0.59375 -1.1875q0.828125 -0.640625 2.15625 -0.640625q0.453125 0 0.875 0.09375q0.4375 0.078125 0.828125 0.25q0.125 -0.078125 0.234375 -0.125q0.109375 -0.046875 0.1875 -0.046875q0.28125 0 0.453125 0.203125q0.1875 0.203125 0.1875 0.6875l0 0.328125q0 0.4375 -0.09375 0.59375q-0.21875 0.296875 -0.578125 0.296875q-0.234375 0 -0.421875 -0.140625q-0.171875 -0.15625 -0.234375 -0.40625zm4.904419 3.609375l0 2.1875l0.796875 0q0.484375 0 0.6875 0.1875q0.203125 0.1875 0.203125 0.484375q0 0.296875 -0.203125 0.46875q-0.203125 0.1875 -0.6875 0.1875l-2.359375 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.171875 -0.203125 -0.46875q0 -0.296875 0.203125 -0.484375q0.21875 -0.1875 0.6875 -0.1875l0.234375 0l0 -6.03125l-0.234375 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.28125 0.203125 -0.46875q0.203125 -0.1875 0.6875 -0.1875l1.5625 0l0 0.453125q0.46875 -0.3125 0.96875 -0.46875q0.5 -0.15625 1.03125 -0.15625q1.359375 0 2.328125 0.921875q0.96875 0.921875 0.96875 2.125q0 1.3125 -1.140625 2.171875q-0.953125 0.71875 -2.140625 0.71875q-0.515625 0 -1.015625 -0.140625q-0.5 -0.15625 -1.0 -0.453125zm3.953125 -2.296875q0 -0.28125 -0.21875 -0.703125q-0.21875 -0.4375 -0.6875 -0.71875q-0.453125 -0.296875 -1.0625 -0.296875q-1.0 0 -1.59375 0.75q-0.390625 0.515625 -0.390625 0.984375q0 0.53125 0.5625 1.046875q0.578125 0.5 1.421875 0.5q0.84375 0 1.40625 -0.5q0.5625 -0.5 0.5625 -1.0625zm9.045044 0.75l-5.46875 0q0.203125 0.53125 0.734375 0.84375q0.53125 0.3125 1.4375 0.3125q0.75 0 1.96875 -0.3125q0.515625 -0.125 0.703125 -0.125q0.265625 0 0.453125 0.1875q0.1875 0.1875 0.1875 0.46875q0 0.265625 -0.203125 0.4375q-0.265625 0.25 -1.28125 0.46875q-1.0 0.21875 -1.921875 0.21875q-1.609375 0 -2.578125 -0.90625q-0.953125 -0.90625 -0.953125 -2.234375q0 -1.40625 1.03125 -2.28125q1.046875 -0.875 2.40625 -0.875q0.8125 0 1.484375 0.28125q0.6875 0.28125 1.015625 0.609375q0.46875 0.484375 0.78125 1.203125q0.203125 0.484375 0.203125 1.140625l0 0.5625zm-1.46875 -1.328125q-0.3125 -0.578125 -0.8125 -0.859375q-0.484375 -0.28125 -1.171875 -0.28125q-0.671875 0 -1.171875 0.28125q-0.5 0.28125 -0.8125 0.859375l3.96875 0zm8.201355 -2.0625q0.234375 -0.21875 0.5 -0.21875q0.28125 0 0.46875 0.203125q0.1875 0.203125 0.1875 0.671875l0 0.859375q0 0.484375 -0.1875 0.6875q-0.1875 0.203125 -0.484375 0.203125q-0.28125 0 -0.46875 -0.15625q-0.125 -0.125 -0.203125 -0.484375q-0.078125 -0.359375 -0.390625 -0.53125q-0.515625 -0.3125 -1.34375 -0.3125q-0.9375 0 -1.515625 0.5625q-0.5625 0.546875 -0.5625 1.390625q0 0.78125 0.546875 1.234375q0.546875 0.453125 1.8125 0.453125q0.828125 0 1.359375 -0.171875q0.3125 -0.109375 0.59375 -0.359375q0.28125 -0.25 0.5 -0.25q0.28125 0 0.46875 0.203125q0.203125 0.203125 0.203125 0.484375q0 0.4375 -0.59375 0.828125q-0.90625 0.59375 -2.640625 0.59375q-1.546875 0 -2.421875 -0.640625q-1.171875 -0.859375 -1.171875 -2.375q0 -1.421875 0.953125 -2.34375q0.953125 -0.9375 2.484375 -0.9375q0.546875 0 1.015625 0.109375q0.484375 0.09375 0.890625 0.296875zm8.670044 -2.59375l-4.28125 9.21875q-0.15625 0.34375 -0.28125 0.453125q-0.171875 0.125 -0.421875 0.125q-0.265625 0 -0.46875 -0.203125q-0.203125 -0.1875 -0.203125 -0.4375q0 -0.171875 0.15625 -0.5l4.296875 -9.21875q0.15625 -0.34375 0.28125 -0.453125q0.171875 -0.125 0.40625 -0.125q0.28125 0 0.46875 0.1875q0.203125 0.1875 0.203125 0.4375q0 0.171875 -0.15625 0.515625zm6.685669 3.921875q-0.328125 -0.203125 -0.6875 -0.296875q-0.34375 -0.109375 -0.734375 -0.109375q-0.78125 0 -1.234375 0.25q-0.203125 0.109375 -0.203125 0.25q0 0.140625 0.265625 0.28125q0.21875 0.109375 0.9375 0.203125q1.328125 0.1875 1.84375 0.375q0.6875 0.234375 1.046875 0.71875q0.375 0.46875 0.375 1.0q0 0.703125 -0.625 1.1875q-0.90625 0.703125 -2.34375 0.703125q-0.578125 0 -1.078125 -0.109375q-0.484375 -0.09375 -0.890625 -0.296875q-0.109375 0.09375 -0.21875 0.140625q-0.109375 0.046875 -0.21875 0.046875q-0.3125 0 -0.5 -0.203125q-0.1875 -0.21875 -0.1875 -0.6875l0 -0.453125q0 -0.484375 0.1875 -0.6875q0.1875 -0.203125 0.484375 -0.203125q0.234375 0 0.390625 0.140625q0.171875 0.125 0.265625 0.453125q0.296875 0.25 0.71875 0.390625q0.4375 0.125 1.0 0.125q0.921875 0 1.421875 -0.28125q0.25 -0.140625 0.25 -0.296875q0 -0.265625 -0.34375 -0.4375q-0.34375 -0.15625 -1.421875 -0.28125q-1.609375 -0.171875 -2.15625 -0.65625q-0.53125 -0.46875 -0.53125 -1.171875q0 -0.703125 0.59375 -1.1875q0.828125 -0.640625 2.15625 -0.640625q0.453125 0 0.875 0.09375q0.4375 0.078125 0.828125 0.25q0.125 -0.078125 0.234375 -0.125q0.109375 -0.046875 0.1875 -0.046875q0.28125 0 0.453125 0.203125q0.1875 0.203125 0.1875 0.6875l0 0.328125q0 0.4375 -0.09375 0.59375q-0.21875 0.296875 -0.578125 0.296875q-0.234375 0 -0.421875 -0.140625q-0.171875 -0.15625 -0.234375 -0.40625zm6.232544 -0.234375l0 2.671875q0 0.4375 0.171875 0.578125q0.28125 0.203125 0.984375 0.203125q1.015625 0 1.875 -0.4375q0.34375 -0.15625 0.53125 -0.15625q0.25 0 0.4375 0.203125q0.203125 0.1875 0.203125 0.46875q0 0.25 -0.203125 0.4375q-0.328125 0.3125 -1.265625 0.578125q-0.9375 0.25 -1.578125 0.25q-1.25 0 -1.875 -0.53125q-0.609375 -0.546875 -0.609375 -1.328125l0 -2.9375l-0.484375 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.28125 0.203125 -0.46875q0.203125 -0.1875 0.6875 -0.1875l0.484375 0l0 -1.203125q0 -0.484375 0.171875 -0.6875q0.1875 -0.203125 0.484375 -0.203125q0.296875 0 0.484375 0.203125q0.1875 0.203125 0.1875 0.6875l0 1.203125l2.46875 0q0.484375 0 0.6875 0.1875q0.203125 0.1875 0.203125 0.484375q0 0.28125 -0.203125 0.46875q-0.203125 0.1875 -0.6875 0.1875l-2.46875 0zm11.388855 -3.859375l0 7.109375l0.21875 0q0.484375 0 0.6875 0.1875q0.21875 0.171875 0.21875 0.484375q0 0.28125 -0.21875 0.46875q-0.203125 0.1875 -0.6875 0.1875l-1.546875 0l0 -0.328125q-0.46875 0.265625 -0.96875 0.40625q-0.484375 0.140625 -1.03125 0.140625q-1.5 0 -2.421875 -0.859375q-0.90625 -0.875 -0.90625 -2.171875q0 -1.359375 0.953125 -2.3125q0.96875 -0.953125 2.359375 -0.953125q0.515625 0 1.015625 0.15625q0.5 0.15625 1.0 0.46875l0 -1.65625l-0.234375 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.46875q0 -0.296875 0.203125 -0.484375q0.203125 -0.1875 0.6875 -0.1875l1.5625 0zm-1.328125 5.65625q0 -0.828125 -0.59375 -1.390625q-0.578125 -0.578125 -1.40625 -0.578125q-0.84375 0 -1.421875 0.578125q-0.578125 0.5625 -0.578125 1.375q0 0.734375 0.515625 1.203125q0.53125 0.46875 1.484375 0.46875q0.9375 0 1.46875 -0.46875q0.53125 -0.46875 0.53125 -1.1875zm8.341919 -2.890625q0.234375 -0.21875 0.5 -0.21875q0.28125 0 0.46875 0.203125q0.1875 0.203125 0.1875 0.671875l0 0.859375q0 0.484375 -0.1875 0.6875q-0.1875 0.203125 -0.484375 0.203125q-0.28125 0 -0.46875 -0.15625q-0.125 -0.125 -0.203125 -0.484375q-0.078125 -0.359375 -0.390625 -0.53125q-0.515625 -0.3125 -1.34375 -0.3125q-0.9375 0 -1.515625 0.5625q-0.5625 0.546875 -0.5625 1.390625q0 0.78125 0.546875 1.234375q0.546875 0.453125 1.8125 0.453125q0.828125 0 1.359375 -0.171875q0.3125 -0.109375 0.59375 -0.359375q0.28125 -0.25 0.5 -0.25q0.28125 0 0.46875 0.203125q0.203125 0.203125 0.203125 0.484375q0 0.4375 -0.59375 0.828125q-0.90625 0.59375 -2.640625 0.59375q-1.546875 0 -2.421875 -0.640625q-1.171875 -0.859375 -1.171875 -2.375q0 -1.421875 0.953125 -2.34375q0.953125 -0.9375 2.484375 -0.9375q0.546875 0 1.015625 0.109375q0.484375 0.09375 0.890625 0.296875zm6.935669 5.0q0 0.375 -0.265625 0.640625q-0.265625 0.25 -0.734375 0.25q-0.46875 0 -0.734375 -0.25q-0.265625 -0.265625 -0.265625 -0.640625q0 -0.375 0.265625 -0.625q0.265625 -0.265625 0.734375 -0.265625q0.46875 0 0.734375 0.265625q0.265625 0.25 0.265625 0.625zm6.654419 -3.90625l0 2.671875q0 0.4375 0.171875 0.578125q0.28125 0.203125 0.984375 0.203125q1.015625 0 1.875 -0.4375q0.34375 -0.15625 0.53125 -0.15625q0.25 0 0.4375 0.203125q0.203125 0.1875 0.203125 0.46875q0 0.25 -0.203125 0.4375q-0.328125 0.3125 -1.265625 0.578125q-0.9375 0.25 -1.578125 0.25q-1.25 0 -1.875 -0.53125q-0.609375 -0.546875 -0.609375 -1.328125l0 -2.9375l-0.484375 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.28125 0.203125 -0.46875q0.203125 -0.1875 0.6875 -0.1875l0.484375 0l0 -1.203125q0 -0.484375 0.171875 -0.6875q0.1875 -0.203125 0.484375 -0.203125q0.296875 0 0.484375 0.203125q0.1875 0.203125 0.1875 0.6875l0 1.203125l2.46875 0q0.484375 0 0.6875 0.1875q0.203125 0.1875 0.203125 0.484375q0 0.28125 -0.203125 0.46875q-0.203125 0.1875 -0.6875 0.1875l-2.46875 0zm11.388855 -3.859375l0 7.109375l0.21875 0q0.484375 0 0.6875 0.1875q0.21875 0.171875 0.21875 0.484375q0 0.28125 -0.21875 0.46875q-0.203125 0.1875 -0.6875 0.1875l-1.546875 0l0 -0.328125q-0.46875 0.265625 -0.96875 0.40625q-0.484375 0.140625 -1.03125 0.140625q-1.5 0 -2.421875 -0.859375q-0.90625 -0.875 -0.90625 -2.171875q0 -1.359375 0.953125 -2.3125q0.96875 -0.953125 2.359375 -0.953125q0.515625 0 1.015625 0.15625q0.5 0.15625 1.0 0.46875l0 -1.65625l-0.234375 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.46875q0 -0.296875 0.203125 -0.484375q0.203125 -0.1875 0.6875 -0.1875l1.5625 0zm-1.328125 5.65625q0 -0.828125 -0.59375 -1.390625q-0.578125 -0.578125 -1.40625 -0.578125q-0.84375 0 -1.421875 0.578125q-0.578125 0.5625 -0.578125 1.375q0 0.734375 0.515625 1.203125q0.53125 0.46875 1.484375 0.46875q0.9375 0 1.46875 -0.46875q0.53125 -0.46875 0.53125 -1.1875z" fill-rule="nonzero"/><path fill="#000000" d="m598.8947 56.10389l-3.53125 0l0 3.0625l0.71875 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.859375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.609375 0l0 -6.359375l-0.328125 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.578125 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-0.71875 0l0 2.765625l3.53125 0l0 -2.765625l-0.703125 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.578125 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-0.328125 0l0 6.359375l0.59375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-1.84375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l0.703125 0l0 -3.0625zm8.879395 0.96875l-5.421875 0q0.125 1.03125 0.859375 1.671875q0.734375 0.625 1.796875 0.625q0.59375 0 1.25 -0.1875q0.65625 -0.203125 1.0625 -0.53125q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.109375 -0.09375 0.21875q-0.3125 0.3125 -1.09375 0.59375q-0.765625 0.265625 -1.59375 0.265625q-1.375 0 -2.296875 -0.890625q-0.90625 -0.90625 -0.90625 -2.171875q0 -1.171875 0.859375 -2.0q0.859375 -0.828125 2.125 -0.828125q1.3125 0 2.15625 0.859375q0.84375 0.84375 0.828125 2.203125zm-0.53125 -0.53125q-0.15625 -0.890625 -0.84375 -1.4375q-0.671875 -0.546875 -1.609375 -0.546875q-0.921875 0 -1.59375 0.546875q-0.671875 0.53125 -0.84375 1.4375l4.890625 0zm6.9887695 3.15625l0 -0.765625q-1.171875 0.96875 -2.484375 0.96875q-0.953125 0 -1.5 -0.484375q-0.53125 -0.484375 -0.53125 -1.1875q0 -0.765625 0.703125 -1.34375q0.71875 -0.578125 2.078125 -0.578125q0.359375 0 0.796875 0.046875q0.4375 0.046875 0.9375 0.140625l0 -0.859375q0 -0.4375 -0.40625 -0.75q-0.40625 -0.328125 -1.21875 -0.328125q-0.625 0 -1.75 0.359375q-0.203125 0.0625 -0.265625 0.0625q-0.09375 0 -0.171875 -0.078125q-0.0625 -0.078125 -0.0625 -0.1875q0 -0.109375 0.0625 -0.171875q0.078125 -0.09375 0.71875 -0.265625q0.984375 -0.265625 1.484375 -0.265625q1.015625 0 1.578125 0.5q0.5625 0.5 0.5625 1.125l0 3.53125l0.71875 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.25 0zm0 -2.65625q-0.375 -0.109375 -0.796875 -0.15625q-0.421875 -0.046875 -0.875 -0.046875q-1.171875 0 -1.828125 0.5q-0.484375 0.375 -0.484375 0.890625q0 0.484375 0.375 0.8125q0.375 0.328125 1.09375 0.328125q0.703125 0 1.296875 -0.265625q0.59375 -0.28125 1.21875 -0.890625l0 -1.171875zm8.879395 -5.3125l0 7.4375l0.703125 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-1.25 0l0 -1.0625q-0.921875 1.265625 -2.34375 1.265625q-0.734375 0 -1.40625 -0.375q-0.65625 -0.390625 -1.046875 -1.09375q-0.375 -0.71875 -0.375 -1.46875q0 -0.765625 0.375 -1.46875q0.390625 -0.703125 1.046875 -1.09375q0.671875 -0.390625 1.40625 -0.390625q1.390625 0 2.34375 1.265625l0 -3.0l-0.703125 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.25 0zm-0.546875 5.234375q0 -1.015625 -0.6875 -1.703125q-0.671875 -0.703125 -1.625 -0.703125q-0.953125 0 -1.640625 0.703125q-0.6875 0.6875 -0.6875 1.703125q0 1.0 0.6875 1.703125q0.6875 0.703125 1.640625 0.703125q0.953125 0 1.625 -0.703125q0.6875 -0.703125 0.6875 -1.703125zm8.61377 0.109375l-5.421875 0q0.125 1.03125 0.859375 1.671875q0.734375 0.625 1.796875 0.625q0.59375 0 1.25 -0.1875q0.65625 -0.203125 1.0625 -0.53125q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.109375 -0.09375 0.21875q-0.3125 0.3125 -1.09375 0.59375q-0.765625 0.265625 -1.59375 0.265625q-1.375 0 -2.296875 -0.890625q-0.90625 -0.90625 -0.90625 -2.171875q0 -1.171875 0.859375 -2.0q0.859375 -0.828125 2.125 -0.828125q1.3125 0 2.15625 0.859375q0.84375 0.84375 0.828125 2.203125zm-0.53125 -0.53125q-0.15625 -0.890625 -0.84375 -1.4375q-0.671875 -0.546875 -1.609375 -0.546875q-0.921875 0 -1.59375 0.546875q-0.671875 0.53125 -0.84375 1.4375l4.890625 0zm4.8168945 -2.34375l0 1.34375q1.03125 -0.9375 1.546875 -1.203125q0.53125 -0.265625 0.96875 -0.265625q0.46875 0 0.875 0.328125q0.421875 0.3125 0.421875 0.46875q0 0.125 -0.09375 0.203125q-0.078125 0.078125 -0.1875 0.078125q-0.0625 0 -0.109375 -0.015625q-0.046875 -0.03125 -0.171875 -0.140625q-0.21875 -0.234375 -0.390625 -0.3125q-0.15625 -0.078125 -0.3125 -0.078125q-0.359375 0 -0.859375 0.28125q-0.484375 0.28125 -1.6875 1.359375l0 2.921875l2.359375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-4.1875 0q-0.1875 0 -0.28125 -0.0625q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.171875q0.09375 -0.078125 0.28125 -0.078125l1.296875 0l0 -4.4375l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.515625 0zm10.348145 -1.390625l0 -0.1875q0 -0.1875 0.0625 -0.265625q0.078125 -0.078125 0.203125 -0.078125q0.125 0 0.1875 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.359375q0 0.203125 -0.078125 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.125 0 -0.203125 -0.078125q-0.0625 -0.078125 -0.0625 -0.25q-0.03125 -0.53125 -0.5625 -0.953125q-0.515625 -0.421875 -1.34375 -0.421875q-0.890625 0 -1.40625 0.453125q-0.515625 0.453125 -0.515625 1.0625q0 0.328125 0.140625 0.59375q0.140625 0.25 0.375 0.421875q0.25 0.15625 0.546875 0.25q0.3125 0.09375 0.96875 0.203125q1.078125 0.1875 1.5 0.359375q0.546875 0.25 0.828125 0.6875q0.28125 0.4375 0.28125 1.03125q0 0.921875 -0.734375 1.5625q-0.71875 0.640625 -1.96875 0.640625q-1.375 0 -2.21875 -0.859375l0 0.296875q0 0.1875 -0.078125 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.09375 -0.078125 -0.28125l0 -1.46875q0 -0.203125 0.078125 -0.28125q0.078125 -0.078125 0.1875 -0.078125q0.125 0 0.1875 0.078125q0.078125 0.078125 0.078125 0.25q0.03125 0.578125 0.625 1.0625q0.59375 0.46875 1.59375 0.46875q1.015625 0 1.59375 -0.5q0.578125 -0.5 0.578125 -1.1875q0 -0.421875 -0.21875 -0.734375q-0.21875 -0.328125 -0.65625 -0.53125q-0.3125 -0.125 -1.28125 -0.296875q-1.328125 -0.21875 -1.90625 -0.671875q-0.578125 -0.453125 -0.578125 -1.296875q0 -0.84375 0.65625 -1.4375q0.671875 -0.609375 1.78125 -0.609375q1.109375 0 1.921875 0.703125zm3.8793945 1.390625l0 0.96875q0.484375 -0.578125 1.015625 -0.859375q0.546875 -0.296875 1.296875 -0.296875q0.78125 0 1.453125 0.375q0.671875 0.359375 1.03125 1.015625q0.359375 0.65625 0.359375 1.390625q0 1.140625 -0.828125 1.953125q-0.8125 0.8125 -2.015625 0.8125q-1.421875 0 -2.3125 -1.15625l0 3.21875l1.296875 0q0.1875 0 0.265625 0.0625q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.546875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.09375 -0.0625 0.28125 -0.0625l0.71875 0l0 -6.875l-0.71875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.25 0zm4.625 2.59375q0 -0.921875 -0.671875 -1.578125q-0.671875 -0.65625 -1.640625 -0.65625q-0.96875 0 -1.640625 0.65625q-0.671875 0.65625 -0.671875 1.578125q0 0.90625 0.671875 1.578125q0.671875 0.65625 1.640625 0.65625q0.96875 0 1.640625 -0.65625q0.671875 -0.65625 0.671875 -1.578125zm8.066895 0.28125l-5.421875 0q0.125 1.03125 0.859375 1.671875q0.734375 0.625 1.796875 0.625q0.59375 0 1.25 -0.1875q0.65625 -0.203125 1.0625 -0.53125q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.109375 -0.09375 0.21875q-0.3125 0.3125 -1.09375 0.59375q-0.765625 0.265625 -1.59375 0.265625q-1.375 0 -2.296875 -0.890625q-0.90625 -0.90625 -0.90625 -2.171875q0 -1.171875 0.859375 -2.0q0.859375 -0.828125 2.125 -0.828125q1.3125 0 2.15625 0.859375q0.84375 0.84375 0.828125 2.203125zm-0.53125 -0.53125q-0.15625 -0.890625 -0.84375 -1.4375q-0.671875 -0.546875 -1.609375 -0.546875q-0.921875 0 -1.59375 0.546875q-0.671875 0.53125 -0.84375 1.4375l4.890625 0zm7.6762695 -1.796875l0 -0.1875q0 -0.1875 0.078125 -0.265625q0.078125 -0.09375 0.1875 -0.09375q0.125 0 0.203125 0.09375q0.078125 0.078125 0.078125 0.265625l0 1.21875q-0.015625 0.1875 -0.09375 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.0625 -0.078125 -0.078125 -0.25q-0.03125 -0.4375 -0.59375 -0.84375q-0.546875 -0.40625 -1.5 -0.40625q-1.1875 0 -1.796875 0.75q-0.609375 0.734375 -0.609375 1.6875q0 1.03125 0.671875 1.703125q0.6875 0.671875 1.765625 0.671875q0.609375 0 1.25 -0.21875q0.65625 -0.234375 1.171875 -0.734375q0.140625 -0.140625 0.234375 -0.140625q0.109375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.265625 -0.640625 0.6875q-1.03125 0.671875 -2.296875 0.671875q-1.28125 0 -2.125 -0.8125q-0.828125 -0.828125 -0.828125 -2.09375q0 -1.28125 0.84375 -2.125q0.859375 -0.859375 2.140625 -0.859375q1.234375 0 2.0625 0.734375zm15.290039 -1.9375l0 -0.1875q0 -0.1875 0.0625 -0.265625q0.078125 -0.078125 0.203125 -0.078125q0.125 0 0.1875 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.359375q0 0.203125 -0.078125 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.125 0 -0.203125 -0.078125q-0.0625 -0.078125 -0.0625 -0.25q-0.03125 -0.53125 -0.5625 -0.953125q-0.515625 -0.421875 -1.34375 -0.421875q-0.890625 0 -1.40625 0.453125q-0.515625 0.453125 -0.515625 1.0625q0 0.328125 0.140625 0.59375q0.140625 0.25 0.375 0.421875q0.25 0.15625 0.546875 0.25q0.3125 0.09375 0.96875 0.203125q1.078125 0.1875 1.5 0.359375q0.546875 0.25 0.828125 0.6875q0.28125 0.4375 0.28125 1.03125q0 0.921875 -0.734375 1.5625q-0.71875 0.640625 -1.96875 0.640625q-1.375 0 -2.21875 -0.859375l0 0.296875q0 0.1875 -0.078125 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.09375 -0.078125 -0.28125l0 -1.46875q0 -0.203125 0.078125 -0.28125q0.078125 -0.078125 0.1875 -0.078125q0.125 0 0.1875 0.078125q0.078125 0.078125 0.078125 0.25q0.03125 0.578125 0.625 1.0625q0.59375 0.46875 1.59375 0.46875q1.015625 0 1.59375 -0.5q0.578125 -0.5 0.578125 -1.1875q0 -0.421875 -0.21875 -0.734375q-0.21875 -0.328125 -0.65625 -0.53125q-0.3125 -0.125 -1.28125 -0.296875q-1.328125 -0.21875 -1.90625 -0.671875q-0.578125 -0.453125 -0.578125 -1.296875q0 -0.84375 0.65625 -1.4375q0.671875 -0.609375 1.78125 -0.609375q1.109375 0 1.921875 0.703125zm4.8012695 1.390625l2.890625 0q0.1875 0 0.265625 0.078125q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.890625 0l0 3.546875q0 0.453125 0.359375 0.765625q0.375 0.3125 1.09375 0.3125q0.546875 0 1.171875 -0.15625q0.625 -0.15625 0.96875 -0.359375q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.09375 -0.078125 0.1875q-0.203125 0.203125 -1.0 0.453125q-0.78125 0.234375 -1.5 0.234375q-0.921875 0 -1.484375 -0.4375q-0.546875 -0.4375 -0.546875 -1.171875l0 -3.546875l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.984375 0l0 -1.578125q0 -0.1875 0.078125 -0.265625q0.078125 -0.078125 0.1875 -0.078125q0.125 0 0.203125 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.578125zm8.254395 0l0 1.34375q1.03125 -0.9375 1.546875 -1.203125q0.53125 -0.265625 0.96875 -0.265625q0.46875 0 0.875 0.328125q0.421875 0.3125 0.421875 0.46875q0 0.125 -0.09375 0.203125q-0.078125 0.078125 -0.1875 0.078125q-0.0625 0 -0.109375 -0.015625q-0.046875 -0.03125 -0.171875 -0.140625q-0.21875 -0.234375 -0.390625 -0.3125q-0.15625 -0.078125 -0.3125 -0.078125q-0.359375 0 -0.859375 0.28125q-0.484375 0.28125 -1.6875 1.359375l0 2.921875l2.359375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-4.1875 0q-0.1875 0 -0.28125 -0.0625q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.171875q0.09375 -0.078125 0.28125 -0.078125l1.296875 0l0 -4.4375l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.515625 0zm8.70752 -2.734375l0 1.375l-0.796875 0l0 -1.375l0.796875 0zm0.015625 2.734375l0 4.96875l2.09375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-4.71875 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l2.09375 0l0 -4.421875l-1.5625 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.078125 -0.078125 0.28125 -0.078125l2.09375 0zm5.7856445 0l0 0.8125q0.5625 -0.5625 1.015625 -0.78125q0.453125 -0.21875 1.015625 -0.21875q0.609375 0 1.109375 0.265625q0.359375 0.1875 0.640625 0.625q0.296875 0.4375 0.296875 0.90625l0 3.359375l0.453125 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.4375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.453125 0l0 -3.265625q0 -0.578125 -0.421875 -0.953125q-0.40625 -0.390625 -1.09375 -0.390625q-0.53125 0 -0.921875 0.21875q-0.390625 0.203125 -1.109375 1.046875l0 3.34375l0.609375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.734375 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l0.59375 0l0 -4.421875l-0.453125 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l0.984375 0zm11.316895 0.984375l0 -0.984375l1.25 0q0.203125 0 0.28125 0.078125q0.078125 0.078125 0.078125 0.203125q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-0.703125 0l0 5.328125q0 0.53125 -0.234375 0.953125q-0.15625 0.265625 -0.515625 0.5625q-0.34375 0.3125 -0.640625 0.4375q-0.296875 0.125 -0.78125 0.125l-1.515625 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.078125 -0.078125 0.265625 -0.078125l1.53125 0.015625q0.46875 0 0.84375 -0.25q0.390625 -0.234375 0.625 -0.703125q0.140625 -0.265625 0.140625 -0.671875l0 -1.609375q-0.84375 1.171875 -2.203125 1.171875q-1.09375 0 -1.890625 -0.8125q-0.796875 -0.8125 -0.796875 -1.953125q0 -1.15625 0.796875 -1.96875q0.796875 -0.8125 1.890625 -0.8125q1.359375 0 2.203125 1.171875zm0 1.609375q0 -0.953125 -0.640625 -1.59375q-0.640625 -0.640625 -1.53125 -0.640625q-0.90625 0 -1.546875 0.65625q-0.640625 0.640625 -0.640625 1.578125q0 0.9375 0.640625 1.59375q0.640625 0.640625 1.546875 0.640625q0.890625 0 1.53125 -0.640625q0.640625 -0.65625 0.640625 -1.59375zm16.72754 -1.5l-5.8125 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l5.8125 0q0.1875 0 0.265625 0.078125q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125zm0 1.90625l-5.8125 0q-0.1875 0 -0.28125 -0.0625q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l5.8125 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.125 -0.09375 0.203125q-0.078125 0.0625 -0.265625 0.0625zm14.493164 -1.09375l-3.53125 0l0 3.0625l0.71875 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.859375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.609375 0l0 -6.359375l-0.328125 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.578125 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-0.71875 0l0 2.765625l3.53125 0l0 -2.765625l-0.703125 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.578125 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-0.328125 0l0 6.359375l0.59375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-1.84375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l0.703125 0l0 -3.0625zm8.879395 0.96875l-5.421875 0q0.125 1.03125 0.859375 1.671875q0.734375 0.625 1.796875 0.625q0.59375 0 1.25 -0.1875q0.65625 -0.203125 1.0625 -0.53125q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.109375 -0.09375 0.21875q-0.3125 0.3125 -1.09375 0.59375q-0.765625 0.265625 -1.59375 0.265625q-1.375 0 -2.296875 -0.890625q-0.90625 -0.90625 -0.90625 -2.171875q0 -1.171875 0.859375 -2.0q0.859375 -0.828125 2.125 -0.828125q1.3125 0 2.15625 0.859375q0.84375 0.84375 0.828125 2.203125zm-0.53125 -0.53125q-0.15625 -0.890625 -0.84375 -1.4375q-0.671875 -0.546875 -1.609375 -0.546875q-0.921875 0 -1.59375 0.546875q-0.671875 0.53125 -0.84375 1.4375l4.890625 0zm6.9887695 3.15625l0 -0.765625q-1.171875 0.96875 -2.484375 0.96875q-0.953125 0 -1.5 -0.484375q-0.53125 -0.484375 -0.53125 -1.1875q0 -0.765625 0.703125 -1.34375q0.71875 -0.578125 2.078125 -0.578125q0.359375 0 0.796875 0.046875q0.4375 0.046875 0.9375 0.140625l0 -0.859375q0 -0.4375 -0.40625 -0.75q-0.40625 -0.328125 -1.21875 -0.328125q-0.625 0 -1.75 0.359375q-0.203125 0.0625 -0.265625 0.0625q-0.09375 0 -0.171875 -0.078125q-0.0625 -0.078125 -0.0625 -0.1875q0 -0.109375 0.0625 -0.171875q0.078125 -0.09375 0.71875 -0.265625q0.984375 -0.265625 1.484375 -0.265625q1.015625 0 1.578125 0.5q0.5625 0.5 0.5625 1.125l0 3.53125l0.71875 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.25 0zm0 -2.65625q-0.375 -0.109375 -0.796875 -0.15625q-0.421875 -0.046875 -0.875 -0.046875q-1.171875 0 -1.828125 0.5q-0.484375 0.375 -0.484375 0.890625q0 0.484375 0.375 0.8125q0.375 0.328125 1.09375 0.328125q0.703125 0 1.296875 -0.265625q0.59375 -0.28125 1.21875 -0.890625l0 -1.171875zm8.879395 -5.3125l0 7.4375l0.703125 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-1.25 0l0 -1.0625q-0.921875 1.265625 -2.34375 1.265625q-0.734375 0 -1.40625 -0.375q-0.65625 -0.390625 -1.046875 -1.09375q-0.375 -0.71875 -0.375 -1.46875q0 -0.765625 0.375 -1.46875q0.390625 -0.703125 1.046875 -1.09375q0.671875 -0.390625 1.40625 -0.390625q1.390625 0 2.34375 1.265625l0 -3.0l-0.703125 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.25 0zm-0.546875 5.234375q0 -1.015625 -0.6875 -1.703125q-0.671875 -0.703125 -1.625 -0.703125q-0.953125 0 -1.640625 0.703125q-0.6875 0.6875 -0.6875 1.703125q0 1.0 0.6875 1.703125q0.6875 0.703125 1.640625 0.703125q0.953125 0 1.625 -0.703125q0.6875 -0.703125 0.6875 -1.703125zm8.61377 0.109375l-5.421875 0q0.125 1.03125 0.859375 1.671875q0.734375 0.625 1.796875 0.625q0.59375 0 1.25 -0.1875q0.65625 -0.203125 1.0625 -0.53125q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.109375 -0.09375 0.21875q-0.3125 0.3125 -1.09375 0.59375q-0.765625 0.265625 -1.59375 0.265625q-1.375 0 -2.296875 -0.890625q-0.90625 -0.90625 -0.90625 -2.171875q0 -1.171875 0.859375 -2.0q0.859375 -0.828125 2.125 -0.828125q1.3125 0 2.15625 0.859375q0.84375 0.84375 0.828125 2.203125zm-0.53125 -0.53125q-0.15625 -0.890625 -0.84375 -1.4375q-0.671875 -0.546875 -1.609375 -0.546875q-0.921875 0 -1.59375 0.546875q-0.671875 0.53125 -0.84375 1.4375l4.890625 0zm4.8168945 -2.34375l0 1.34375q1.03125 -0.9375 1.546875 -1.203125q0.53125 -0.265625 0.96875 -0.265625q0.46875 0 0.875 0.328125q0.421875 0.3125 0.421875 0.46875q0 0.125 -0.09375 0.203125q-0.078125 0.078125 -0.1875 0.078125q-0.0625 0 -0.109375 -0.015625q-0.046875 -0.03125 -0.171875 -0.140625q-0.21875 -0.234375 -0.390625 -0.3125q-0.15625 -0.078125 -0.3125 -0.078125q-0.359375 0 -0.859375 0.28125q-0.484375 0.28125 -1.6875 1.359375l0 2.921875l2.359375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-4.1875 0q-0.1875 0 -0.28125 -0.0625q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.171875q0.09375 -0.078125 0.28125 -0.078125l1.296875 0l0 -4.4375l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.515625 0zm10.348145 -1.390625l0 -0.1875q0 -0.1875 0.0625 -0.265625q0.078125 -0.078125 0.203125 -0.078125q0.125 0 0.1875 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.359375q0 0.203125 -0.078125 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.125 0 -0.203125 -0.078125q-0.0625 -0.078125 -0.0625 -0.25q-0.03125 -0.53125 -0.5625 -0.953125q-0.515625 -0.421875 -1.34375 -0.421875q-0.890625 0 -1.40625 0.453125q-0.515625 0.453125 -0.515625 1.0625q0 0.328125 0.140625 0.59375q0.140625 0.25 0.375 0.421875q0.25 0.15625 0.546875 0.25q0.3125 0.09375 0.96875 0.203125q1.078125 0.1875 1.5 0.359375q0.546875 0.25 0.828125 0.6875q0.28125 0.4375 0.28125 1.03125q0 0.921875 -0.734375 1.5625q-0.71875 0.640625 -1.96875 0.640625q-1.375 0 -2.21875 -0.859375l0 0.296875q0 0.1875 -0.078125 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.09375 -0.078125 -0.28125l0 -1.46875q0 -0.203125 0.078125 -0.28125q0.078125 -0.078125 0.1875 -0.078125q0.125 0 0.1875 0.078125q0.078125 0.078125 0.078125 0.25q0.03125 0.578125 0.625 1.0625q0.59375 0.46875 1.59375 0.46875q1.015625 0 1.59375 -0.5q0.578125 -0.5 0.578125 -1.1875q0 -0.421875 -0.21875 -0.734375q-0.21875 -0.328125 -0.65625 -0.53125q-0.3125 -0.125 -1.28125 -0.296875q-1.328125 -0.21875 -1.90625 -0.671875q-0.578125 -0.453125 -0.578125 -1.296875q0 -0.84375 0.65625 -1.4375q0.671875 -0.609375 1.78125 -0.609375q1.109375 0 1.921875 0.703125zm3.8793945 1.390625l0 0.96875q0.484375 -0.578125 1.015625 -0.859375q0.546875 -0.296875 1.296875 -0.296875q0.78125 0 1.453125 0.375q0.671875 0.359375 1.03125 1.015625q0.359375 0.65625 0.359375 1.390625q0 1.140625 -0.828125 1.953125q-0.8125 0.8125 -2.015625 0.8125q-1.421875 0 -2.3125 -1.15625l0 3.21875l1.296875 0q0.1875 0 0.265625 0.0625q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.546875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.09375 -0.0625 0.28125 -0.0625l0.71875 0l0 -6.875l-0.71875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.25 0zm4.625 2.59375q0 -0.921875 -0.671875 -1.578125q-0.671875 -0.65625 -1.640625 -0.65625q-0.96875 0 -1.640625 0.65625q-0.671875 0.65625 -0.671875 1.578125q0 0.90625 0.671875 1.578125q0.671875 0.65625 1.640625 0.65625q0.96875 0 1.640625 -0.65625q0.671875 -0.65625 0.671875 -1.578125zm8.066895 0.28125l-5.421875 0q0.125 1.03125 0.859375 1.671875q0.734375 0.625 1.796875 0.625q0.59375 0 1.25 -0.1875q0.65625 -0.203125 1.0625 -0.53125q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.109375 -0.09375 0.21875q-0.3125 0.3125 -1.09375 0.59375q-0.765625 0.265625 -1.59375 0.265625q-1.375 0 -2.296875 -0.890625q-0.90625 -0.90625 -0.90625 -2.171875q0 -1.171875 0.859375 -2.0q0.859375 -0.828125 2.125 -0.828125q1.3125 0 2.15625 0.859375q0.84375 0.84375 0.828125 2.203125zm-0.53125 -0.53125q-0.15625 -0.890625 -0.84375 -1.4375q-0.671875 -0.546875 -1.609375 -0.546875q-0.921875 0 -1.59375 0.546875q-0.671875 0.53125 -0.84375 1.4375l4.890625 0zm7.6762695 -1.796875l0 -0.1875q0 -0.1875 0.078125 -0.265625q0.078125 -0.09375 0.1875 -0.09375q0.125 0 0.203125 0.09375q0.078125 0.078125 0.078125 0.265625l0 1.21875q-0.015625 0.1875 -0.09375 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.0625 -0.078125 -0.078125 -0.25q-0.03125 -0.4375 -0.59375 -0.84375q-0.546875 -0.40625 -1.5 -0.40625q-1.1875 0 -1.796875 0.75q-0.609375 0.734375 -0.609375 1.6875q0 1.03125 0.671875 1.703125q0.6875 0.671875 1.765625 0.671875q0.609375 0 1.25 -0.21875q0.65625 -0.234375 1.171875 -0.734375q0.140625 -0.140625 0.234375 -0.140625q0.109375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.265625 -0.640625 0.6875q-1.03125 0.671875 -2.296875 0.671875q-1.28125 0 -2.125 -0.8125q-0.828125 -0.828125 -0.828125 -2.09375q0 -1.28125 0.84375 -2.125q0.859375 -0.859375 2.140625 -0.859375q1.234375 0 2.0625 0.734375zm2.3012695 1.25l5.765625 -3.203125q0.140625 -0.078125 0.203125 -0.078125q0.109375 0 0.1875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.15625 -0.21875 0.28125l-4.9375 2.734375l4.9375 2.75q0.21875 0.109375 0.21875 0.28125q0 0.09375 -0.078125 0.1875q-0.078125 0.078125 -0.1875 0.078125q-0.078125 0 -0.21875 -0.078125l-5.75 -3.21875z" fill-rule="nonzero"/><path fill="#000000" d="m610.4816 67.869514l1.6875 0l-0.4375 3.078125q-0.046875 0.25 -0.15625 0.34375q-0.09375 0.09375 -0.25 0.09375q-0.15625 0 -0.265625 -0.09375q-0.09375 -0.09375 -0.125 -0.34375l-0.453125 -3.078125zm2.71875 0l1.6875 0l-0.4375 3.078125q-0.03125 0.25 -0.140625 0.34375q-0.09375 0.09375 -0.25 0.09375q-0.171875 0 -0.28125 -0.09375q-0.09375 -0.09375 -0.125 -0.34375l-0.453125 -3.078125zm9.05127 2.6875q0 -0.1875 0.078125 -0.265625q0.078125 -0.09375 0.1875 -0.09375q0.125 0 0.203125 0.09375q0.078125 0.078125 0.078125 0.265625l0 0.921875q0 0.1875 -0.078125 0.28125q-0.078125 0.078125 -0.203125 0.078125q-0.09375 0 -0.171875 -0.0625q-0.078125 -0.078125 -0.09375 -0.25q-0.03125 -0.375 -0.390625 -0.625q-0.515625 -0.34375 -1.375 -0.34375q-0.890625 0 -1.390625 0.359375q-0.375 0.265625 -0.375 0.609375q0 0.375 0.453125 0.625q0.296875 0.1875 1.140625 0.28125q1.125 0.109375 1.546875 0.265625q0.625 0.21875 0.921875 0.625q0.296875 0.390625 0.296875 0.84375q0 0.6875 -0.65625 1.21875q-0.640625 0.515625 -1.90625 0.515625q-1.265625 0 -2.078125 -0.640625q0 0.21875 -0.03125 0.28125q-0.015625 0.0625 -0.09375 0.109375q-0.0625 0.046875 -0.140625 0.046875q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.09375 -0.078125 -0.28125l0 -1.09375q0 -0.1875 0.0625 -0.265625q0.078125 -0.09375 0.203125 -0.09375q0.109375 0 0.1875 0.078125q0.09375 0.078125 0.09375 0.21875q0 0.296875 0.140625 0.484375q0.21875 0.3125 0.703125 0.515625q0.484375 0.1875 1.1875 0.1875q1.046875 0 1.546875 -0.375q0.515625 -0.390625 0.515625 -0.828125q0 -0.5 -0.515625 -0.796875q-0.515625 -0.296875 -1.515625 -0.390625q-0.984375 -0.109375 -1.421875 -0.265625q-0.4375 -0.171875 -0.671875 -0.5q-0.234375 -0.328125 -0.234375 -0.71875q0 -0.671875 0.671875 -1.078125q0.671875 -0.40625 1.59375 -0.40625q1.109375 0 1.796875 0.546875zm4.9575195 -0.359375l2.890625 0q0.1875 0 0.265625 0.078125q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.890625 0l0 3.546875q0 0.453125 0.359375 0.765625q0.375 0.3125 1.09375 0.3125q0.546875 0 1.171875 -0.15625q0.625 -0.15625 0.96875 -0.359375q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.09375 -0.078125 0.1875q-0.203125 0.203125 -1.0 0.453125q-0.78125 0.234375 -1.5 0.234375q-0.921875 0 -1.484375 -0.4375q-0.546875 -0.4375 -0.546875 -1.171875l0 -3.546875l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.984375 0l0 -1.578125q0 -0.1875 0.078125 -0.265625q0.078125 -0.078125 0.1875 -0.078125q0.125 0 0.203125 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.578125zm8.254395 0l0 1.34375q1.03125 -0.9375 1.546875 -1.203125q0.53125 -0.265625 0.96875 -0.265625q0.46875 0 0.875 0.328125q0.421875 0.3125 0.421875 0.46875q0 0.125 -0.09375 0.203125q-0.078125 0.078125 -0.1875 0.078125q-0.0625 0 -0.109375 -0.015625q-0.046875 -0.03125 -0.171875 -0.140625q-0.21875 -0.234375 -0.390625 -0.3125q-0.15625 -0.078125 -0.3125 -0.078125q-0.359375 0 -0.859375 0.28125q-0.484375 0.28125 -1.6875 1.359375l0 2.921875l2.359375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-4.1875 0q-0.1875 0 -0.28125 -0.0625q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.171875q0.09375 -0.078125 0.28125 -0.078125l1.296875 0l0 -4.4375l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.515625 0zm8.70752 -2.734375l0 1.375l-0.796875 0l0 -1.375l0.796875 0zm0.015625 2.734375l0 4.96875l2.09375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-4.71875 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l2.09375 0l0 -4.421875l-1.5625 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.078125 -0.078125 0.28125 -0.078125l2.09375 0zm5.7856445 0l0 0.8125q0.5625 -0.5625 1.015625 -0.78125q0.453125 -0.21875 1.015625 -0.21875q0.609375 0 1.109375 0.265625q0.359375 0.1875 0.640625 0.625q0.296875 0.4375 0.296875 0.90625l0 3.359375l0.453125 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.4375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.453125 0l0 -3.265625q0 -0.578125 -0.421875 -0.953125q-0.40625 -0.390625 -1.09375 -0.390625q-0.53125 0 -0.921875 0.21875q-0.390625 0.203125 -1.109375 1.046875l0 3.34375l0.609375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.734375 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l0.59375 0l0 -4.421875l-0.453125 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l0.984375 0zm11.316895 0.984375l0 -0.984375l1.25 0q0.203125 0 0.28125 0.078125q0.078125 0.078125 0.078125 0.203125q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-0.703125 0l0 5.328125q0 0.53125 -0.234375 0.953125q-0.15625 0.265625 -0.515625 0.5625q-0.34375 0.3125 -0.640625 0.4375q-0.296875 0.125 -0.78125 0.125l-1.515625 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.078125 -0.078125 0.265625 -0.078125l1.53125 0.015625q0.46875 0 0.84375 -0.25q0.390625 -0.234375 0.625 -0.703125q0.140625 -0.265625 0.140625 -0.671875l0 -1.609375q-0.84375 1.171875 -2.203125 1.171875q-1.09375 0 -1.890625 -0.8125q-0.796875 -0.8125 -0.796875 -1.953125q0 -1.15625 0.796875 -1.96875q0.796875 -0.8125 1.890625 -0.8125q1.359375 0 2.203125 1.171875zm0 1.609375q0 -0.953125 -0.640625 -1.59375q-0.640625 -0.640625 -1.53125 -0.640625q-0.90625 0 -1.546875 0.65625q-0.640625 0.640625 -0.640625 1.578125q0 0.9375 0.640625 1.59375q0.640625 0.640625 1.546875 0.640625q0.890625 0 1.53125 -0.640625q0.640625 -0.65625 0.640625 -1.59375zm5.9106445 1.375l0.21875 0q0.359375 0 0.609375 0.25q0.25 0.25 0.25 0.609375q0 0.359375 -0.25 0.609375q-0.25 0.25 -0.609375 0.25l-0.21875 0q-0.359375 0 -0.625 -0.25q-0.25 -0.25 -0.25 -0.609375q0 -0.359375 0.25 -0.609375q0.265625 -0.25 0.625 -0.25zm6.1450195 -6.4375l0 3.28125q0.515625 -0.546875 0.984375 -0.765625q0.46875 -0.234375 1.046875 -0.234375q0.609375 0 1.046875 0.21875q0.4375 0.21875 0.71875 0.671875q0.296875 0.453125 0.296875 0.953125l0 3.3125l0.609375 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.734375 0q-0.203125 0 -0.296875 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.296875 -0.078125l0.59375 0l0 -3.265625q0 -0.578125 -0.421875 -0.96875q-0.40625 -0.390625 -1.15625 -0.390625q-0.578125 0 -1.0 0.28125q-0.296875 0.203125 -0.984375 0.96875l0 3.375l0.609375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.734375 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l0.59375 0l0 -6.890625l-0.71875 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l1.25 0zm7.3481445 0.140625l1.6875 0l-0.4375 3.078125q-0.046875 0.25 -0.15625 0.34375q-0.09375 0.09375 -0.25 0.09375q-0.15625 0 -0.265625 -0.09375q-0.09375 -0.09375 -0.125 -0.34375l-0.453125 -3.078125zm2.71875 0l1.6875 0l-0.4375 3.078125q-0.03125 0.25 -0.140625 0.34375q-0.09375 0.09375 -0.25 0.09375q-0.171875 0 -0.28125 -0.09375q-0.09375 -0.09375 -0.125 -0.34375l-0.453125 -3.078125zm6.2387695 5.90625l1.734375 0l-1.890625 3.515625q-0.171875 0.3125 -0.40625 0.3125q-0.15625 0 -0.28125 -0.109375q-0.109375 -0.109375 -0.109375 -0.265625q0 -0.078125 0.03125 -0.140625l0.921875 -3.3125z" fill-rule="nonzero"/><path fill="#000000" d="m612.966 84.275764l0 8.53125l1.296875 0q0.1875 0 0.265625 0.0625q0.09375 0.078125 0.09375 0.203125q0 0.125 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.828125 0l0 -9.609375l1.828125 0q0.1875 0 0.265625 0.078125q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.296875 0z" fill-rule="nonzero"/><path fill="#000000" d="m628.64667 105.46327l-0.609375 0l-2.046875 -4.65625l-0.109375 0l0 6.359375l0.984375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-1.953125 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l0.4375 0l0 -6.359375l-0.328125 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.3125 0l2.015625 4.59375l1.984375 -4.59375l1.3125 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-0.34375 0l0 6.359375l0.453125 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.96875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.984375 0l0 -6.359375l-0.109375 0l-2.015625 4.65625zm8.98877 2.234375l0 -0.765625q-1.171875 0.96875 -2.484375 0.96875q-0.953125 0 -1.5 -0.484375q-0.53125 -0.484375 -0.53125 -1.1875q0 -0.765625 0.703125 -1.34375q0.71875 -0.578125 2.078125 -0.578125q0.359375 0 0.796875 0.046875q0.4375 0.046875 0.9375 0.140625l0 -0.859375q0 -0.4375 -0.40625 -0.75q-0.40625 -0.328125 -1.21875 -0.328125q-0.625 0 -1.75 0.359375q-0.203125 0.0625 -0.265625 0.0625q-0.09375 0 -0.171875 -0.078125q-0.0625 -0.078125 -0.0625 -0.1875q0 -0.109375 0.0625 -0.171875q0.078125 -0.09375 0.71875 -0.265625q0.984375 -0.265625 1.484375 -0.265625q1.015625 0 1.578125 0.5q0.5625 0.5 0.5625 1.125l0 3.53125l0.71875 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.25 0zm0 -2.65625q-0.375 -0.109375 -0.796875 -0.15625q-0.421875 -0.046875 -0.875 -0.046875q-1.171875 0 -1.828125 0.5q-0.484375 0.375 -0.484375 0.890625q0 0.484375 0.375 0.8125q0.375 0.328125 1.09375 0.328125q0.703125 0 1.296875 -0.265625q0.59375 -0.28125 1.21875 -0.890625l0 -1.171875zm8.48877 -2.296875l0 -0.1875q0 -0.1875 0.078125 -0.265625q0.078125 -0.09375 0.1875 -0.09375q0.125 0 0.203125 0.09375q0.078125 0.078125 0.078125 0.265625l0 1.21875q-0.015625 0.1875 -0.09375 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.0625 -0.078125 -0.078125 -0.25q-0.03125 -0.4375 -0.59375 -0.84375q-0.546875 -0.40625 -1.5 -0.40625q-1.1875 0 -1.796875 0.75q-0.609375 0.734375 -0.609375 1.6875q0 1.03125 0.671875 1.703125q0.6875 0.671875 1.765625 0.671875q0.609375 0 1.25 -0.21875q0.65625 -0.234375 1.171875 -0.734375q0.140625 -0.140625 0.234375 -0.140625q0.109375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.265625 -0.640625 0.6875q-1.03125 0.671875 -2.296875 0.671875q-1.28125 0 -2.125 -0.8125q-0.828125 -0.828125 -0.828125 -2.09375q0 -1.28125 0.84375 -2.125q0.859375 -0.859375 2.140625 -0.859375q1.234375 0 2.0625 0.734375zm4.9418945 -0.546875l0 1.34375q1.03125 -0.9375 1.546875 -1.203125q0.53125 -0.265625 0.96875 -0.265625q0.46875 0 0.875 0.328125q0.421875 0.3125 0.421875 0.46875q0 0.125 -0.09375 0.203125q-0.078125 0.078125 -0.1875 0.078125q-0.0625 0 -0.109375 -0.015625q-0.046875 -0.03125 -0.171875 -0.140625q-0.21875 -0.234375 -0.390625 -0.3125q-0.15625 -0.078125 -0.3125 -0.078125q-0.359375 0 -0.859375 0.28125q-0.484375 0.28125 -1.6875 1.359375l0 2.921875l2.359375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-4.1875 0q-0.1875 0 -0.28125 -0.0625q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.171875q0.09375 -0.078125 0.28125 -0.078125l1.296875 0l0 -4.4375l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.515625 0zm11.410645 2.765625q0 1.21875 -0.875 2.078125q-0.859375 0.859375 -2.09375 0.859375q-1.25 0 -2.125 -0.859375q-0.859375 -0.875 -0.859375 -2.078125q0 -1.21875 0.859375 -2.078125q0.875 -0.875 2.125 -0.875q1.234375 0 2.09375 0.859375q0.875 0.859375 0.875 2.09375zm-0.53125 0q0 -1.0 -0.71875 -1.703125q-0.71875 -0.703125 -1.734375 -0.703125q-1.015625 0 -1.734375 0.703125q-0.703125 0.703125 -0.703125 1.703125q0 0.984375 0.703125 1.703125q0.71875 0.703125 1.734375 0.703125q1.015625 0 1.734375 -0.703125q0.71875 -0.703125 0.71875 -1.703125zm2.0825195 -0.96875l5.765625 -3.203125q0.140625 -0.078125 0.203125 -0.078125q0.109375 0 0.1875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.15625 -0.21875 0.28125l-4.9375 2.734375l4.9375 2.75q0.21875 0.109375 0.21875 0.28125q0 0.09375 -0.078125 0.1875q-0.078125 0.078125 -0.1875 0.078125q-0.078125 0 -0.21875 -0.078125l-5.75 -3.21875zm8.86377 -4.125l1.6875 0l-0.4375 3.078125q-0.046875 0.25 -0.15625 0.34375q-0.09375 0.09375 -0.25 0.09375q-0.15625 0 -0.265625 -0.09375q-0.09375 -0.09375 -0.125 -0.34375l-0.453125 -3.078125zm2.71875 0l1.6875 0l-0.4375 3.078125q-0.03125 0.25 -0.140625 0.34375q-0.09375 0.09375 -0.25 0.09375q-0.171875 0 -0.28125 -0.09375q-0.09375 -0.09375 -0.125 -0.34375l-0.453125 -3.078125zm9.910645 7.828125l-0.6875 0l-3.9375 -6.640625l0 6.109375l0.984375 0q0.203125 0 0.28125 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.28125 0.078125l-1.953125 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l0.4375 0l0 -6.359375l-0.71875 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l1.40625 0l3.9375 6.65625l0 -6.125l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.96875 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.265625 0.078125l-0.453125 0l0 6.890625zm7.7700195 -6.890625l0 4.453125q0 1.125 -0.75 1.890625q-0.75 0.75 -1.8125 0.75q-0.703125 0 -1.265625 -0.296875q-0.546875 -0.3125 -0.9375 -0.9375q-0.390625 -0.640625 -0.390625 -1.40625l0 -4.453125l-0.453125 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.078125 -0.0625 0.265625 -0.0625l1.96875 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-0.984375 0l0 4.453125q0 0.875 0.609375 1.5q0.609375 0.609375 1.421875 0.609375q0.53125 0 0.96875 -0.234375q0.4375 -0.25 0.765625 -0.75q0.328125 -0.5 0.328125 -1.125l0 -4.453125l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.96875 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.265625 0.078125l-0.453125 0zm4.3012695 0l0 6.359375l3.53125 0l0 -2.125q0 -0.1875 0.078125 -0.265625q0.078125 -0.09375 0.203125 -0.09375q0.109375 0 0.1875 0.09375q0.078125 0.078125 0.078125 0.265625l0 2.65625l-5.890625 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.265625 0l0 -6.359375l-1.265625 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l3.078125 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.265625 0zm7.8012695 0l0 6.359375l3.53125 0l0 -2.125q0 -0.1875 0.078125 -0.265625q0.078125 -0.09375 0.203125 -0.09375q0.109375 0 0.1875 0.09375q0.078125 0.078125 0.078125 0.265625l0 2.65625l-5.890625 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.265625 0l0 -6.359375l-1.265625 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l3.078125 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.265625 0zm6.5043945 -0.9375l1.6875 0l-0.4375 3.078125q-0.046875 0.25 -0.15625 0.34375q-0.09375 0.09375 -0.25 0.09375q-0.15625 0 -0.265625 -0.09375q-0.09375 -0.09375 -0.125 -0.34375l-0.453125 -3.078125zm2.71875 0l1.6875 0l-0.4375 3.078125q-0.03125 0.25 -0.140625 0.34375q-0.09375 0.09375 -0.25 0.09375q-0.171875 0 -0.28125 -0.09375q-0.09375 -0.09375 -0.125 -0.34375l-0.453125 -3.078125zm10.566895 4.125l-5.75 3.21875q-0.140625 0.078125 -0.21875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.09375 -0.078125 -0.1875q0 -0.171875 0.21875 -0.28125l4.9375 -2.75l-4.9375 -2.734375q-0.203125 -0.125 -0.203125 -0.28125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.1875 -0.078125q0.0625 0 0.203125 0.078125l5.75 3.203125zm3.4731445 1.78125l1.734375 0l-1.890625 3.515625q-0.171875 0.3125 -0.40625 0.3125q-0.15625 0 -0.28125 -0.109375q-0.109375 -0.109375 -0.109375 -0.265625q0 -0.078125 0.03125 -0.140625l0.921875 -3.3125z" fill-rule="nonzero"/><path fill="#000000" d="m612.4504 124.80702l0 -8.53125l-1.296875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.09375 -0.078125 0.28125 -0.078125l1.828125 0l0 9.609375l-1.828125 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.0625 -0.078125 -0.1875q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.296875 0zm6.9887695 -3.03125l1.734375 0l-1.890625 3.515625q-0.171875 0.3125 -0.40625 0.3125q-0.15625 0 -0.28125 -0.109375q-0.109375 -0.109375 -0.109375 -0.265625q0 -0.078125 0.03125 -0.140625l0.921875 -3.3125z" fill-rule="nonzero"/><path fill="#000000" d="m612.966 132.27577l0 8.53125l1.296875 0q0.1875 0 0.265625 0.0625q0.09375 0.078125 0.09375 0.203125q0 0.125 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.828125 0l0 -9.609375l1.828125 0q0.1875 0 0.265625 0.078125q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.296875 0z" fill-rule="nonzero"/><path fill="#000000" d="m630.20917 148.80702l0 -0.1875q0 -0.1875 0.0625 -0.265625q0.078125 -0.078125 0.203125 -0.078125q0.125 0 0.1875 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.359375q0 0.203125 -0.078125 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.125 0 -0.203125 -0.078125q-0.0625 -0.078125 -0.0625 -0.25q-0.03125 -0.53125 -0.5625 -0.953125q-0.515625 -0.421875 -1.34375 -0.421875q-0.890625 0 -1.40625 0.453125q-0.515625 0.453125 -0.515625 1.0625q0 0.328125 0.140625 0.59375q0.140625 0.25 0.375 0.421875q0.25 0.15625 0.546875 0.25q0.3125 0.09375 0.96875 0.203125q1.078125 0.1875 1.5 0.359375q0.546875 0.25 0.828125 0.6875q0.28125 0.4375 0.28125 1.03125q0 0.921875 -0.734375 1.5625q-0.71875 0.640625 -1.96875 0.640625q-1.375 0 -2.21875 -0.859375l0 0.296875q0 0.1875 -0.078125 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.09375 -0.078125 -0.28125l0 -1.46875q0 -0.203125 0.078125 -0.28125q0.078125 -0.078125 0.1875 -0.078125q0.125 0 0.1875 0.078125q0.078125 0.078125 0.078125 0.25q0.03125 0.578125 0.625 1.0625q0.59375 0.46875 1.59375 0.46875q1.015625 0 1.59375 -0.5q0.578125 -0.5 0.578125 -1.1875q0 -0.421875 -0.21875 -0.734375q-0.21875 -0.328125 -0.65625 -0.53125q-0.3125 -0.125 -1.28125 -0.296875q-1.328125 -0.21875 -1.90625 -0.671875q-0.578125 -0.453125 -0.578125 -1.296875q0 -0.84375 0.65625 -1.4375q0.671875 -0.609375 1.78125 -0.609375q1.109375 0 1.921875 0.703125zm6.1606445 -1.34375l0 1.375l-0.796875 0l0 -1.375l0.796875 0zm0.015625 2.734375l0 4.96875l2.09375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-4.71875 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l2.09375 0l0 -4.421875l-1.5625 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.078125 -0.078125 0.28125 -0.078125l2.09375 0zm9.848145 0l0 0.484375l-4.0 4.484375l3.609375 0l0 -0.734375q0 -0.1875 0.078125 -0.265625q0.078125 -0.09375 0.1875 -0.09375q0.125 0 0.203125 0.09375q0.078125 0.078125 0.078125 0.265625l-0.015625 1.265625l-4.875 0l0 -0.46875l3.984375 -4.484375l-3.3125 0l0 0.71875q0 0.1875 -0.078125 0.28125q-0.078125 0.078125 -0.203125 0.078125q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.09375 -0.078125 -0.28125l0 -1.265625l4.609375 0zm8.348145 2.875l-5.421875 0q0.125 1.03125 0.859375 1.671875q0.734375 0.625 1.796875 0.625q0.59375 0 1.25 -0.1875q0.65625 -0.203125 1.0625 -0.53125q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.109375 -0.09375 0.21875q-0.3125 0.3125 -1.09375 0.59375q-0.765625 0.265625 -1.59375 0.265625q-1.375 0 -2.296875 -0.890625q-0.90625 -0.90625 -0.90625 -2.171875q0 -1.171875 0.859375 -2.0q0.859375 -0.828125 2.125 -0.828125q1.3125 0 2.15625 0.859375q0.84375 0.84375 0.828125 2.203125zm-0.53125 -0.53125q-0.15625 -0.890625 -0.84375 -1.4375q-0.671875 -0.546875 -1.609375 -0.546875q-0.921875 0 -1.59375 0.546875q-0.671875 0.53125 -0.84375 1.4375l4.890625 0zm5.7231445 -3.734375l0 6.359375l1.375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-3.3125 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l1.390625 0l0 -6.359375l-2.1875 0l0 1.84375q0 0.203125 -0.078125 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.078125 -0.078125 -0.28125l0 -2.375l5.96875 0l0 2.375q0 0.203125 -0.078125 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.078125 -0.078125 -0.28125l0 -1.84375l-2.171875 0zm7.8012695 0l0 6.359375l1.375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-3.3125 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l1.390625 0l0 -6.359375l-2.1875 0l0 1.84375q0 0.203125 -0.078125 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.078125 -0.078125 -0.28125l0 -2.375l5.96875 0l0 2.375q0 0.203125 -0.078125 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.078125 -0.078125 -0.28125l0 -1.84375l-2.171875 0zm7.5668945 6.890625l-2.484375 -4.953125l-0.15625 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.09375 0.03125 -0.15625q0.046875 -0.0625 0.109375 -0.09375q0.0625 -0.03125 0.203125 -0.03125l1.46875 0q0.1875 0 0.265625 0.078125q0.078125 0.078125 0.078125 0.203125q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.265625 0.078125l-0.71875 0l2.171875 4.375l2.140625 -4.375l-0.703125 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.453125 0q0.1875 0 0.265625 0.078125q0.09375 0.078125 0.09375 0.203125q0 0.078125 -0.0625 0.15625q-0.046875 0.0625 -0.109375 0.09375q-0.0625 0.015625 -0.359375 0.015625l-3.375 6.875l0.84375 0q0.1875 0 0.265625 0.0625q0.078125 0.078125 0.078125 0.203125q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.265625 0.078125l-3.078125 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.09375 -0.0625 0.28125 -0.0625l1.671875 0l0.9375 -1.921875zm5.7543945 -5.5l0 0.96875q0.484375 -0.578125 1.015625 -0.859375q0.546875 -0.296875 1.296875 -0.296875q0.78125 0 1.453125 0.375q0.671875 0.359375 1.03125 1.015625q0.359375 0.65625 0.359375 1.390625q0 1.140625 -0.828125 1.953125q-0.8125 0.8125 -2.015625 0.8125q-1.421875 0 -2.3125 -1.15625l0 3.21875l1.296875 0q0.1875 0 0.265625 0.0625q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.546875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.09375 -0.0625 0.28125 -0.0625l0.71875 0l0 -6.875l-0.71875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.25 0zm4.625 2.59375q0 -0.921875 -0.671875 -1.578125q-0.671875 -0.65625 -1.640625 -0.65625q-0.96875 0 -1.640625 0.65625q-0.671875 0.65625 -0.671875 1.578125q0 0.90625 0.671875 1.578125q0.671875 0.65625 1.640625 0.65625q0.96875 0 1.640625 -0.65625q0.671875 -0.65625 0.671875 -1.578125zm8.066895 0.28125l-5.421875 0q0.125 1.03125 0.859375 1.671875q0.734375 0.625 1.796875 0.625q0.59375 0 1.25 -0.1875q0.65625 -0.203125 1.0625 -0.53125q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.109375 -0.09375 0.21875q-0.3125 0.3125 -1.09375 0.59375q-0.765625 0.265625 -1.59375 0.265625q-1.375 0 -2.296875 -0.890625q-0.90625 -0.90625 -0.90625 -2.171875q0 -1.171875 0.859375 -2.0q0.859375 -0.828125 2.125 -0.828125q1.3125 0 2.15625 0.859375q0.84375 0.84375 0.828125 2.203125zm-0.53125 -0.53125q-0.15625 -0.890625 -0.84375 -1.4375q-0.671875 -0.546875 -1.609375 -0.546875q-0.921875 0 -1.59375 0.546875q-0.671875 0.53125 -0.84375 1.4375l4.890625 0zm4.3950195 1.234375l1.734375 0l-1.890625 3.515625q-0.171875 0.3125 -0.40625 0.3125q-0.15625 0 -0.28125 -0.109375q-0.109375 -0.109375 -0.109375 -0.265625q0 -0.078125 0.03125 -0.140625l0.921875 -3.3125z" fill-rule="nonzero"/><path fill="#000000" d="m612.4504 172.80702l0 -8.53125l-1.296875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.09375 -0.078125 0.28125 -0.078125l1.828125 0l0 9.609375l-1.828125 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.0625 -0.078125 -0.1875q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.296875 0zm6.9887695 -3.03125l1.734375 0l-1.890625 3.515625q-0.171875 0.3125 -0.40625 0.3125q-0.15625 0 -0.28125 -0.109375q-0.109375 -0.109375 -0.109375 -0.265625q0 -0.078125 0.03125 -0.140625l0.921875 -3.3125z" fill-rule="nonzero"/><path fill="#000000" d="m612.966 180.27577l0 8.53125l1.296875 0q0.1875 0 0.265625 0.0625q0.09375 0.078125 0.09375 0.203125q0 0.125 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.828125 0l0 -9.609375l1.828125 0q0.1875 0 0.265625 0.078125q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.296875 0z" fill-rule="nonzero"/><path fill="#000000" d="m627.00604 200.1039l0 3.0625l1.828125 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-3.078125 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l0.71875 0l0 -6.359375l-0.71875 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.09375 -0.203125q0.0625 -0.0625 0.25 -0.0625l5.875 0l0 1.828125q0 0.1875 -0.078125 0.28125q-0.078125 0.078125 -0.1875 0.078125q-0.125 0 -0.203125 -0.078125q-0.0625 -0.09375 -0.0625 -0.28125l0 -1.296875l-4.09375 0l0 2.765625l1.921875 0l0 -0.59375q0 -0.1875 0.0625 -0.265625q0.078125 -0.09375 0.203125 -0.09375q0.109375 0 0.1875 0.09375q0.078125 0.078125 0.078125 0.265625l0 1.734375q0 0.1875 -0.078125 0.28125q-0.078125 0.078125 -0.1875 0.078125q-0.125 0 -0.203125 -0.078125q-0.0625 -0.09375 -0.0625 -0.28125l0 -0.609375l-1.921875 0zm10.910645 3.59375l0 -0.78125q-1.078125 0.984375 -2.359375 0.984375q-0.78125 0 -1.1875 -0.421875q-0.515625 -0.5625 -0.515625 -1.296875l0 -3.4375l-0.71875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.25 0l0 3.984375q0 0.515625 0.328125 0.859375q0.328125 0.328125 0.828125 0.328125q1.296875 0 2.375 -1.1875l0 -3.4375l-0.984375 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l1.53125 0l0 4.96875l0.4375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-0.984375 0zm4.2543945 -5.5l0 0.8125q0.5625 -0.5625 1.015625 -0.78125q0.453125 -0.21875 1.015625 -0.21875q0.609375 0 1.109375 0.265625q0.359375 0.1875 0.640625 0.625q0.296875 0.4375 0.296875 0.90625l0 3.359375l0.453125 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.4375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.453125 0l0 -3.265625q0 -0.578125 -0.421875 -0.953125q-0.40625 -0.390625 -1.09375 -0.390625q-0.53125 0 -0.921875 0.21875q-0.390625 0.203125 -1.109375 1.046875l0 3.34375l0.609375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.734375 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l0.59375 0l0 -4.421875l-0.453125 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l0.984375 0zm11.754395 0.546875l0 -0.1875q0 -0.1875 0.078125 -0.265625q0.078125 -0.09375 0.1875 -0.09375q0.125 0 0.203125 0.09375q0.078125 0.078125 0.078125 0.265625l0 1.21875q-0.015625 0.1875 -0.09375 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.0625 -0.078125 -0.078125 -0.25q-0.03125 -0.4375 -0.59375 -0.84375q-0.546875 -0.40625 -1.5 -0.40625q-1.1875 0 -1.796875 0.75q-0.609375 0.734375 -0.609375 1.6875q0 1.03125 0.671875 1.703125q0.6875 0.671875 1.765625 0.671875q0.609375 0 1.25 -0.21875q0.65625 -0.234375 1.171875 -0.734375q0.140625 -0.140625 0.234375 -0.140625q0.109375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.265625 -0.640625 0.6875q-1.03125 0.671875 -2.296875 0.671875q-1.28125 0 -2.125 -0.8125q-0.828125 -0.828125 -0.828125 -2.09375q0 -1.28125 0.84375 -2.125q0.859375 -0.859375 2.140625 -0.859375q1.234375 0 2.0625 0.734375zm4.4887695 -0.546875l2.890625 0q0.1875 0 0.265625 0.078125q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.890625 0l0 3.546875q0 0.453125 0.359375 0.765625q0.375 0.3125 1.09375 0.3125q0.546875 0 1.171875 -0.15625q0.625 -0.15625 0.96875 -0.359375q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.09375 -0.078125 0.1875q-0.203125 0.203125 -1.0 0.453125q-0.78125 0.234375 -1.5 0.234375q-0.921875 0 -1.484375 -0.4375q-0.546875 -0.4375 -0.546875 -1.171875l0 -3.546875l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.984375 0l0 -1.578125q0 -0.1875 0.078125 -0.265625q0.078125 -0.078125 0.1875 -0.078125q0.125 0 0.203125 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.578125zm9.160645 -2.734375l0 1.375l-0.796875 0l0 -1.375l0.796875 0zm0.015625 2.734375l0 4.96875l2.09375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-4.71875 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l2.09375 0l0 -4.421875l-1.5625 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.078125 -0.078125 0.28125 -0.078125l2.09375 0zm10.48877 2.765625q0 1.21875 -0.875 2.078125q-0.859375 0.859375 -2.09375 0.859375q-1.25 0 -2.125 -0.859375q-0.859375 -0.875 -0.859375 -2.078125q0 -1.21875 0.859375 -2.078125q0.875 -0.875 2.125 -0.875q1.234375 0 2.09375 0.859375q0.875 0.859375 0.875 2.09375zm-0.53125 0q0 -1.0 -0.71875 -1.703125q-0.71875 -0.703125 -1.734375 -0.703125q-1.015625 0 -1.734375 0.703125q-0.703125 0.703125 -0.703125 1.703125q0 0.984375 0.703125 1.703125q0.71875 0.703125 1.734375 0.703125q1.015625 0 1.734375 -0.703125q0.71875 -0.703125 0.71875 -1.703125zm3.6293945 -2.765625l0 0.8125q0.5625 -0.5625 1.015625 -0.78125q0.453125 -0.21875 1.015625 -0.21875q0.609375 0 1.109375 0.265625q0.359375 0.1875 0.640625 0.625q0.296875 0.4375 0.296875 0.90625l0 3.359375l0.453125 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.4375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.453125 0l0 -3.265625q0 -0.578125 -0.421875 -0.953125q-0.40625 -0.390625 -1.09375 -0.390625q-0.53125 0 -0.921875 0.21875q-0.390625 0.203125 -1.109375 1.046875l0 3.34375l0.609375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.734375 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l0.59375 0l0 -4.421875l-0.453125 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l0.984375 0zm11.441895 -1.390625l0 -0.1875q0 -0.1875 0.0625 -0.265625q0.078125 -0.078125 0.203125 -0.078125q0.125 0 0.1875 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.359375q0 0.203125 -0.078125 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.125 0 -0.203125 -0.078125q-0.0625 -0.078125 -0.0625 -0.25q-0.03125 -0.53125 -0.5625 -0.953125q-0.515625 -0.421875 -1.34375 -0.421875q-0.890625 0 -1.40625 0.453125q-0.515625 0.453125 -0.515625 1.0625q0 0.328125 0.140625 0.59375q0.140625 0.25 0.375 0.421875q0.25 0.15625 0.546875 0.25q0.3125 0.09375 0.96875 0.203125q1.078125 0.1875 1.5 0.359375q0.546875 0.25 0.828125 0.6875q0.28125 0.4375 0.28125 1.03125q0 0.921875 -0.734375 1.5625q-0.71875 0.640625 -1.96875 0.640625q-1.375 0 -2.21875 -0.859375l0 0.296875q0 0.1875 -0.078125 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.09375 -0.078125 -0.28125l0 -1.46875q0 -0.203125 0.078125 -0.28125q0.078125 -0.078125 0.1875 -0.078125q0.125 0 0.1875 0.078125q0.078125 0.078125 0.078125 0.25q0.03125 0.578125 0.625 1.0625q0.59375 0.46875 1.59375 0.46875q1.015625 0 1.59375 -0.5q0.578125 -0.5 0.578125 -1.1875q0 -0.421875 -0.21875 -0.734375q-0.21875 -0.328125 -0.65625 -0.53125q-0.3125 -0.125 -1.28125 -0.296875q-1.328125 -0.21875 -1.90625 -0.671875q-0.578125 -0.453125 -0.578125 -1.296875q0 -0.84375 0.65625 -1.4375q0.671875 -0.609375 1.78125 -0.609375q1.109375 0 1.921875 0.703125zm3.8793945 1.390625l0 0.96875q0.484375 -0.578125 1.015625 -0.859375q0.546875 -0.296875 1.296875 -0.296875q0.78125 0 1.453125 0.375q0.671875 0.359375 1.03125 1.015625q0.359375 0.65625 0.359375 1.390625q0 1.140625 -0.828125 1.953125q-0.8125 0.8125 -2.015625 0.8125q-1.421875 0 -2.3125 -1.15625l0 3.21875l1.296875 0q0.1875 0 0.265625 0.0625q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.546875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.09375 -0.0625 0.28125 -0.0625l0.71875 0l0 -6.875l-0.71875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.25 0zm4.625 2.59375q0 -0.921875 -0.671875 -1.578125q-0.671875 -0.65625 -1.640625 -0.65625q-0.96875 0 -1.640625 0.65625q-0.671875 0.65625 -0.671875 1.578125q0 0.90625 0.671875 1.578125q0.671875 0.65625 1.640625 0.65625q0.96875 0 1.640625 -0.65625q0.671875 -0.65625 0.671875 -1.578125zm8.066895 0.28125l-5.421875 0q0.125 1.03125 0.859375 1.671875q0.734375 0.625 1.796875 0.625q0.59375 0 1.25 -0.1875q0.65625 -0.203125 1.0625 -0.53125q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.109375 -0.09375 0.21875q-0.3125 0.3125 -1.09375 0.59375q-0.765625 0.265625 -1.59375 0.265625q-1.375 0 -2.296875 -0.890625q-0.90625 -0.90625 -0.90625 -2.171875q0 -1.171875 0.859375 -2.0q0.859375 -0.828125 2.125 -0.828125q1.3125 0 2.15625 0.859375q0.84375 0.84375 0.828125 2.203125zm-0.53125 -0.53125q-0.15625 -0.890625 -0.84375 -1.4375q-0.671875 -0.546875 -1.609375 -0.546875q-0.921875 0 -1.59375 0.546875q-0.671875 0.53125 -0.84375 1.4375l4.890625 0zm7.6762695 -1.796875l0 -0.1875q0 -0.1875 0.078125 -0.265625q0.078125 -0.09375 0.1875 -0.09375q0.125 0 0.203125 0.09375q0.078125 0.078125 0.078125 0.265625l0 1.21875q-0.015625 0.1875 -0.09375 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.0625 -0.078125 -0.078125 -0.25q-0.03125 -0.4375 -0.59375 -0.84375q-0.546875 -0.40625 -1.5 -0.40625q-1.1875 0 -1.796875 0.75q-0.609375 0.734375 -0.609375 1.6875q0 1.03125 0.671875 1.703125q0.6875 0.671875 1.765625 0.671875q0.609375 0 1.25 -0.21875q0.65625 -0.234375 1.171875 -0.734375q0.140625 -0.140625 0.234375 -0.140625q0.109375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.265625 -0.640625 0.6875q-1.03125 0.671875 -2.296875 0.671875q-1.28125 0 -2.125 -0.8125q-0.828125 -0.828125 -0.828125 -2.09375q0 -1.28125 0.84375 -2.125q0.859375 -0.859375 2.140625 -0.859375q1.234375 0 2.0625 0.734375zm2.3012695 1.25l5.765625 -3.203125q0.140625 -0.078125 0.203125 -0.078125q0.109375 0 0.1875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.15625 -0.21875 0.28125l-4.9375 2.734375l4.9375 2.75q0.21875 0.109375 0.21875 0.28125q0 0.09375 -0.078125 0.1875q-0.078125 0.078125 -0.1875 0.078125q-0.078125 0 -0.21875 -0.078125l-5.75 -3.21875z" fill-rule="nonzero"/><path fill="#000000" d="m641.6867 211.86952l1.6875 0l-0.4375 3.078125q-0.046875 0.25 -0.15625 0.34375q-0.09375 0.09375 -0.25 0.09375q-0.15625 0 -0.265625 -0.09375q-0.09375 -0.09375 -0.125 -0.34375l-0.453125 -3.078125zm2.71875 0l1.6875 0l-0.4375 3.078125q-0.03125 0.25 -0.140625 0.34375q-0.09375 0.09375 -0.25 0.09375q-0.171875 0 -0.28125 -0.09375q-0.09375 -0.09375 -0.125 -0.34375l-0.453125 -3.078125zm9.05127 2.6875q0 -0.1875 0.078125 -0.265625q0.078125 -0.09375 0.1875 -0.09375q0.125 0 0.203125 0.09375q0.078125 0.078125 0.078125 0.265625l0 0.921875q0 0.1875 -0.078125 0.28125q-0.078125 0.078125 -0.203125 0.078125q-0.09375 0 -0.171875 -0.0625q-0.078125 -0.078125 -0.09375 -0.25q-0.03125 -0.375 -0.390625 -0.625q-0.515625 -0.34375 -1.375 -0.34375q-0.890625 0 -1.390625 0.359375q-0.375 0.265625 -0.375 0.609375q0 0.375 0.453125 0.625q0.296875 0.1875 1.140625 0.28125q1.125 0.109375 1.546875 0.265625q0.625 0.21875 0.921875 0.625q0.296875 0.390625 0.296875 0.84375q0 0.6875 -0.65625 1.21875q-0.640625 0.515625 -1.90625 0.515625q-1.265625 0 -2.078125 -0.640625q0 0.21875 -0.03125 0.28125q-0.015625 0.0625 -0.09375 0.109375q-0.0625 0.046875 -0.140625 0.046875q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.09375 -0.078125 -0.28125l0 -1.09375q0 -0.1875 0.0625 -0.265625q0.078125 -0.09375 0.203125 -0.09375q0.109375 0 0.1875 0.078125q0.09375 0.078125 0.09375 0.21875q0 0.296875 0.140625 0.484375q0.21875 0.3125 0.703125 0.515625q0.484375 0.1875 1.1875 0.1875q1.046875 0 1.546875 -0.375q0.515625 -0.390625 0.515625 -0.828125q0 -0.5 -0.515625 -0.796875q-0.515625 -0.296875 -1.515625 -0.390625q-0.984375 -0.109375 -1.421875 -0.265625q-0.4375 -0.171875 -0.671875 -0.5q-0.234375 -0.328125 -0.234375 -0.71875q0 -0.671875 0.671875 -1.078125q0.671875 -0.40625 1.59375 -0.40625q1.109375 0 1.796875 0.546875zm4.9575195 -0.359375l2.890625 0q0.1875 0 0.265625 0.078125q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.890625 0l0 3.546875q0 0.453125 0.359375 0.765625q0.375 0.3125 1.09375 0.3125q0.546875 0 1.171875 -0.15625q0.625 -0.15625 0.96875 -0.359375q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.09375 -0.078125 0.1875q-0.203125 0.203125 -1.0 0.453125q-0.78125 0.234375 -1.5 0.234375q-0.921875 0 -1.484375 -0.4375q-0.546875 -0.4375 -0.546875 -1.171875l0 -3.546875l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.984375 0l0 -1.578125q0 -0.1875 0.078125 -0.265625q0.078125 -0.078125 0.1875 -0.078125q0.125 0 0.203125 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.578125zm8.254395 0l0 1.34375q1.03125 -0.9375 1.546875 -1.203125q0.53125 -0.265625 0.96875 -0.265625q0.46875 0 0.875 0.328125q0.421875 0.3125 0.421875 0.46875q0 0.125 -0.09375 0.203125q-0.078125 0.078125 -0.1875 0.078125q-0.0625 0 -0.109375 -0.015625q-0.046875 -0.03125 -0.171875 -0.140625q-0.21875 -0.234375 -0.390625 -0.3125q-0.15625 -0.078125 -0.3125 -0.078125q-0.359375 0 -0.859375 0.28125q-0.484375 0.28125 -1.6875 1.359375l0 2.921875l2.359375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-4.1875 0q-0.1875 0 -0.28125 -0.0625q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.171875q0.09375 -0.078125 0.28125 -0.078125l1.296875 0l0 -4.4375l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.515625 0zm10.660645 0.546875l0 -0.1875q0 -0.1875 0.078125 -0.265625q0.078125 -0.09375 0.1875 -0.09375q0.125 0 0.203125 0.09375q0.078125 0.078125 0.078125 0.265625l0 1.21875q-0.015625 0.1875 -0.09375 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.0625 -0.078125 -0.078125 -0.25q-0.03125 -0.4375 -0.59375 -0.84375q-0.546875 -0.40625 -1.5 -0.40625q-1.1875 0 -1.796875 0.75q-0.609375 0.734375 -0.609375 1.6875q0 1.03125 0.671875 1.703125q0.6875 0.671875 1.765625 0.671875q0.609375 0 1.25 -0.21875q0.65625 -0.234375 1.171875 -0.734375q0.140625 -0.140625 0.234375 -0.140625q0.109375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.265625 -0.640625 0.6875q-1.03125 0.671875 -2.296875 0.671875q-1.28125 0 -2.125 -0.8125q-0.828125 -0.828125 -0.828125 -2.09375q0 -1.28125 0.84375 -2.125q0.859375 -0.859375 2.140625 -0.859375q1.234375 0 2.0625 0.734375zm3.5668945 -0.546875l0 0.96875q0.484375 -0.578125 1.015625 -0.859375q0.546875 -0.296875 1.296875 -0.296875q0.78125 0 1.453125 0.375q0.671875 0.359375 1.03125 1.015625q0.359375 0.65625 0.359375 1.390625q0 1.140625 -0.828125 1.953125q-0.8125 0.8125 -2.015625 0.8125q-1.421875 0 -2.3125 -1.15625l0 3.21875l1.296875 0q0.1875 0 0.265625 0.0625q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.546875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.09375 -0.0625 0.28125 -0.0625l0.71875 0l0 -6.875l-0.71875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.25 0zm4.625 2.59375q0 -0.921875 -0.671875 -1.578125q-0.671875 -0.65625 -1.640625 -0.65625q-0.96875 0 -1.640625 0.65625q-0.671875 0.65625 -0.671875 1.578125q0 0.90625 0.671875 1.578125q0.671875 0.65625 1.640625 0.65625q0.96875 0 1.640625 -0.65625q0.671875 -0.65625 0.671875 -1.578125zm5.2231445 2.90625l-2.484375 -4.953125l-0.15625 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.09375 0.03125 -0.15625q0.046875 -0.0625 0.109375 -0.09375q0.0625 -0.03125 0.203125 -0.03125l1.46875 0q0.1875 0 0.265625 0.078125q0.078125 0.078125 0.078125 0.203125q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.265625 0.078125l-0.71875 0l2.171875 4.375l2.140625 -4.375l-0.703125 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.453125 0q0.1875 0 0.265625 0.078125q0.09375 0.078125 0.09375 0.203125q0 0.078125 -0.0625 0.15625q-0.046875 0.0625 -0.109375 0.09375q-0.0625 0.015625 -0.359375 0.015625l-3.375 6.875l0.84375 0q0.1875 0 0.265625 0.0625q0.078125 0.078125 0.078125 0.203125q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.265625 0.078125l-3.078125 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.09375 -0.0625 0.28125 -0.0625l1.671875 0l0.9375 -1.921875zm5.5512695 -7.828125l1.6875 0l-0.4375 3.078125q-0.046875 0.25 -0.15625 0.34375q-0.09375 0.09375 -0.25 0.09375q-0.15625 0 -0.265625 -0.09375q-0.09375 -0.09375 -0.125 -0.34375l-0.453125 -3.078125zm2.71875 0l1.6875 0l-0.4375 3.078125q-0.03125 0.25 -0.140625 0.34375q-0.09375 0.09375 -0.25 0.09375q-0.171875 0 -0.28125 -0.09375q-0.09375 -0.09375 -0.125 -0.34375l-0.453125 -3.078125zm6.2387695 5.90625l1.734375 0l-1.890625 3.515625q-0.171875 0.3125 -0.40625 0.3125q-0.15625 0 -0.28125 -0.109375q-0.109375 -0.109375 -0.109375 -0.265625q0 -0.078125 0.03125 -0.140625l0.921875 -3.3125z" fill-rule="nonzero"/><path fill="#000000" d="m642.1711 232.38515l0 2.78125l0.984375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.234375 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l0.703125 0l0 -6.359375l-0.703125 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l3.21875 0q1.0 0 1.671875 0.640625q0.6875 0.625 0.6875 1.40625q0 0.578125 -0.421875 1.078125q-0.421875 0.5 -1.40625 0.84375q0.5625 0.390625 0.96875 0.890625q0.40625 0.5 1.296875 2.03125l0.40625 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-0.703125 0q-0.984375 -1.765625 -1.53125 -2.375q-0.546875 -0.609375 -1.25 -0.9375l-1.6875 0zm0 -0.53125l1.453125 0q0.6875 0 1.25 -0.25q0.578125 -0.265625 0.828125 -0.609375q0.265625 -0.34375 0.265625 -0.6875q0 -0.53125 -0.546875 -1.015625q-0.53125 -0.484375 -1.296875 -0.484375l-1.953125 0l0 3.046875zm12.410645 1.21875l-5.421875 0q0.125 1.03125 0.859375 1.671875q0.734375 0.625 1.796875 0.625q0.59375 0 1.25 -0.1875q0.65625 -0.203125 1.0625 -0.53125q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.109375 -0.09375 0.21875q-0.3125 0.3125 -1.09375 0.59375q-0.765625 0.265625 -1.59375 0.265625q-1.375 0 -2.296875 -0.890625q-0.90625 -0.90625 -0.90625 -2.171875q0 -1.171875 0.859375 -2.0q0.859375 -0.828125 2.125 -0.828125q1.3125 0 2.15625 0.859375q0.84375 0.84375 0.828125 2.203125zm-0.53125 -0.53125q-0.15625 -0.890625 -0.84375 -1.4375q-0.671875 -0.546875 -1.609375 -0.546875q-0.921875 0 -1.59375 0.546875q-0.671875 0.53125 -0.84375 1.4375l4.890625 0zm4.3637695 -2.34375l2.890625 0q0.1875 0 0.265625 0.078125q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.890625 0l0 3.546875q0 0.453125 0.359375 0.765625q0.375 0.3125 1.09375 0.3125q0.546875 0 1.171875 -0.15625q0.625 -0.15625 0.96875 -0.359375q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.09375 -0.078125 0.1875q-0.203125 0.203125 -1.0 0.453125q-0.78125 0.234375 -1.5 0.234375q-0.921875 0 -1.484375 -0.4375q-0.546875 -0.4375 -0.546875 -1.171875l0 -3.546875l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.984375 0l0 -1.578125q0 -0.1875 0.078125 -0.265625q0.078125 -0.078125 0.1875 -0.078125q0.125 0 0.203125 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.578125zm9.285645 5.5l-0.734375 0l-2.6875 -6.890625l-0.421875 0q-0.140625 0 -0.203125 -0.03125q-0.0625 -0.03125 -0.109375 -0.09375q-0.03125 -0.0625 -0.03125 -0.140625q0 -0.078125 0.03125 -0.140625q0.046875 -0.078125 0.109375 -0.09375q0.0625 -0.03125 0.203125 -0.03125l1.984375 0q0.15625 0 0.21875 0.03125q0.0625 0.015625 0.09375 0.09375q0.046875 0.0625 0.046875 0.140625q0 0.078125 -0.046875 0.140625q-0.046875 0.0625 -0.109375 0.09375q-0.046875 0.03125 -0.203125 0.03125l-1.015625 0l2.46875 6.359375l0.046875 0l2.4375 -6.359375l-1.015625 0q-0.140625 0 -0.21875 -0.03125q-0.0625 -0.03125 -0.109375 -0.09375q-0.03125 -0.0625 -0.03125 -0.140625q0 -0.078125 0.046875 -0.140625q0.046875 -0.078125 0.109375 -0.09375q0.0625 -0.03125 0.203125 -0.03125l1.984375 0q0.15625 0 0.21875 0.03125q0.0625 0.015625 0.09375 0.09375q0.046875 0.0625 0.046875 0.140625q0 0.078125 -0.046875 0.140625q-0.03125 0.0625 -0.09375 0.09375q-0.0625 0.03125 -0.21875 0.03125l-0.40625 0l-2.640625 6.890625zm8.941895 0l0 -0.765625q-1.171875 0.96875 -2.484375 0.96875q-0.953125 0 -1.5 -0.484375q-0.53125 -0.484375 -0.53125 -1.1875q0 -0.765625 0.703125 -1.34375q0.71875 -0.578125 2.078125 -0.578125q0.359375 0 0.796875 0.046875q0.4375 0.046875 0.9375 0.140625l0 -0.859375q0 -0.4375 -0.40625 -0.75q-0.40625 -0.328125 -1.21875 -0.328125q-0.625 0 -1.75 0.359375q-0.203125 0.0625 -0.265625 0.0625q-0.09375 0 -0.171875 -0.078125q-0.0625 -0.078125 -0.0625 -0.1875q0 -0.109375 0.0625 -0.171875q0.078125 -0.09375 0.71875 -0.265625q0.984375 -0.265625 1.484375 -0.265625q1.015625 0 1.578125 0.5q0.5625 0.5 0.5625 1.125l0 3.53125l0.71875 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.25 0zm0 -2.65625q-0.375 -0.109375 -0.796875 -0.15625q-0.421875 -0.046875 -0.875 -0.046875q-1.171875 0 -1.828125 0.5q-0.484375 0.375 -0.484375 0.890625q0 0.484375 0.375 0.8125q0.375 0.328125 1.09375 0.328125q0.703125 0 1.296875 -0.265625q0.59375 -0.28125 1.21875 -0.890625l0 -1.171875zm6.5356445 -5.3125l0 7.4375l2.09375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-4.71875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l2.09375 0l0 -6.890625l-1.546875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l2.078125 0zm9.441895 1.078125l0 -0.1875q0 -0.1875 0.0625 -0.265625q0.078125 -0.078125 0.203125 -0.078125q0.125 0 0.1875 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.359375q0 0.203125 -0.078125 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.125 0 -0.203125 -0.078125q-0.0625 -0.078125 -0.0625 -0.25q-0.03125 -0.53125 -0.5625 -0.953125q-0.515625 -0.421875 -1.34375 -0.421875q-0.890625 0 -1.40625 0.453125q-0.515625 0.453125 -0.515625 1.0625q0 0.328125 0.140625 0.59375q0.140625 0.25 0.375 0.421875q0.25 0.15625 0.546875 0.25q0.3125 0.09375 0.96875 0.203125q1.078125 0.1875 1.5 0.359375q0.546875 0.25 0.828125 0.6875q0.28125 0.4375 0.28125 1.03125q0 0.921875 -0.734375 1.5625q-0.71875 0.640625 -1.96875 0.640625q-1.375 0 -2.21875 -0.859375l0 0.296875q0 0.1875 -0.078125 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.09375 -0.078125 -0.28125l0 -1.46875q0 -0.203125 0.078125 -0.28125q0.078125 -0.078125 0.1875 -0.078125q0.125 0 0.1875 0.078125q0.078125 0.078125 0.078125 0.25q0.03125 0.578125 0.625 1.0625q0.59375 0.46875 1.59375 0.46875q1.015625 0 1.59375 -0.5q0.578125 -0.5 0.578125 -1.1875q0 -0.421875 -0.21875 -0.734375q-0.21875 -0.328125 -0.65625 -0.53125q-0.3125 -0.125 -1.28125 -0.296875q-1.328125 -0.21875 -1.90625 -0.671875q-0.578125 -0.453125 -0.578125 -1.296875q0 -0.84375 0.65625 -1.4375q0.671875 -0.609375 1.78125 -0.609375q1.109375 0 1.921875 0.703125zm3.8793945 1.390625l0 0.96875q0.484375 -0.578125 1.015625 -0.859375q0.546875 -0.296875 1.296875 -0.296875q0.78125 0 1.453125 0.375q0.671875 0.359375 1.03125 1.015625q0.359375 0.65625 0.359375 1.390625q0 1.140625 -0.828125 1.953125q-0.8125 0.8125 -2.015625 0.8125q-1.421875 0 -2.3125 -1.15625l0 3.21875l1.296875 0q0.1875 0 0.265625 0.0625q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.546875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.09375 -0.0625 0.28125 -0.0625l0.71875 0l0 -6.875l-0.71875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.25 0zm4.625 2.59375q0 -0.921875 -0.671875 -1.578125q-0.671875 -0.65625 -1.640625 -0.65625q-0.96875 0 -1.640625 0.65625q-0.671875 0.65625 -0.671875 1.578125q0 0.90625 0.671875 1.578125q0.671875 0.65625 1.640625 0.65625q0.96875 0 1.640625 -0.65625q0.671875 -0.65625 0.671875 -1.578125zm8.066895 0.28125l-5.421875 0q0.125 1.03125 0.859375 1.671875q0.734375 0.625 1.796875 0.625q0.59375 0 1.25 -0.1875q0.65625 -0.203125 1.0625 -0.53125q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.109375 -0.09375 0.21875q-0.3125 0.3125 -1.09375 0.59375q-0.765625 0.265625 -1.59375 0.265625q-1.375 0 -2.296875 -0.890625q-0.90625 -0.90625 -0.90625 -2.171875q0 -1.171875 0.859375 -2.0q0.859375 -0.828125 2.125 -0.828125q1.3125 0 2.15625 0.859375q0.84375 0.84375 0.828125 2.203125zm-0.53125 -0.53125q-0.15625 -0.890625 -0.84375 -1.4375q-0.671875 -0.546875 -1.609375 -0.546875q-0.921875 0 -1.59375 0.546875q-0.671875 0.53125 -0.84375 1.4375l4.890625 0zm7.6762695 -1.796875l0 -0.1875q0 -0.1875 0.078125 -0.265625q0.078125 -0.09375 0.1875 -0.09375q0.125 0 0.203125 0.09375q0.078125 0.078125 0.078125 0.265625l0 1.21875q-0.015625 0.1875 -0.09375 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.0625 -0.078125 -0.078125 -0.25q-0.03125 -0.4375 -0.59375 -0.84375q-0.546875 -0.40625 -1.5 -0.40625q-1.1875 0 -1.796875 0.75q-0.609375 0.734375 -0.609375 1.6875q0 1.03125 0.671875 1.703125q0.6875 0.671875 1.765625 0.671875q0.609375 0 1.25 -0.21875q0.65625 -0.234375 1.171875 -0.734375q0.140625 -0.140625 0.234375 -0.140625q0.109375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.265625 -0.640625 0.6875q-1.03125 0.671875 -2.296875 0.671875q-1.28125 0 -2.125 -0.8125q-0.828125 -0.828125 -0.828125 -2.09375q0 -1.28125 0.84375 -2.125q0.859375 -0.859375 2.140625 -0.859375q1.234375 0 2.0625 0.734375zm2.3012695 1.25l5.765625 -3.203125q0.140625 -0.078125 0.203125 -0.078125q0.109375 0 0.1875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.15625 -0.21875 0.28125l-4.9375 2.734375l4.9375 2.75q0.21875 0.109375 0.21875 0.28125q0 0.09375 -0.078125 0.1875q-0.078125 0.078125 -0.1875 0.078125q-0.078125 0 -0.21875 -0.078125l-5.75 -3.21875zm13.42627 -3.0l0 -0.375q0 -0.1875 0.0625 -0.265625q0.078125 -0.078125 0.203125 -0.078125q0.125 0 0.1875 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.484375q0 0.203125 -0.078125 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.0625 -0.078125 -0.078125 -0.234375q-0.03125 -0.546875 -0.578125 -0.953125q-0.734375 -0.5625 -1.671875 -0.5625q-0.625 0 -1.171875 0.265625q-0.40625 0.203125 -0.640625 0.484375q-0.421875 0.5 -0.671875 1.09375q-0.171875 0.453125 -0.171875 1.015625l0 0.921875q0 1.203125 0.859375 2.078125q0.859375 0.875 2.0 0.875q0.6875 0 1.234375 -0.296875q0.546875 -0.296875 1.046875 -0.90625q0.109375 -0.125 0.25 -0.125q0.109375 0 0.171875 0.078125q0.078125 0.0625 0.078125 0.171875q0 0.140625 -0.28125 0.4375q-0.515625 0.59375 -1.171875 0.890625q-0.640625 0.28125 -1.3125 0.28125q-0.578125 0 -1.171875 -0.21875q-0.453125 -0.171875 -0.75 -0.390625q-0.296875 -0.234375 -0.734375 -0.78125q-0.4375 -0.546875 -0.59375 -1.0q-0.15625 -0.453125 -0.15625 -1.015625l0 -1.078125q0 -0.796875 0.421875 -1.609375q0.421875 -0.828125 1.140625 -1.265625q0.734375 -0.4375 1.59375 -0.4375q1.328125 0 2.28125 0.890625zm3.6918945 -1.265625l0 3.28125q0.515625 -0.546875 0.984375 -0.765625q0.46875 -0.234375 1.046875 -0.234375q0.609375 0 1.046875 0.21875q0.4375 0.21875 0.71875 0.671875q0.296875 0.453125 0.296875 0.953125l0 3.3125l0.609375 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.734375 0q-0.203125 0 -0.296875 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.296875 -0.078125l0.59375 0l0 -3.265625q0 -0.578125 -0.421875 -0.96875q-0.40625 -0.390625 -1.15625 -0.390625q-0.578125 0 -1.0 0.28125q-0.296875 0.203125 -0.984375 0.96875l0 3.375l0.609375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.734375 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l0.59375 0l0 -6.890625l-0.71875 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l1.25 0zm11.098145 7.96875l0 -0.765625q-1.171875 0.96875 -2.484375 0.96875q-0.953125 0 -1.5 -0.484375q-0.53125 -0.484375 -0.53125 -1.1875q0 -0.765625 0.703125 -1.34375q0.71875 -0.578125 2.078125 -0.578125q0.359375 0 0.796875 0.046875q0.4375 0.046875 0.9375 0.140625l0 -0.859375q0 -0.4375 -0.40625 -0.75q-0.40625 -0.328125 -1.21875 -0.328125q-0.625 0 -1.75 0.359375q-0.203125 0.0625 -0.265625 0.0625q-0.09375 0 -0.171875 -0.078125q-0.0625 -0.078125 -0.0625 -0.1875q0 -0.109375 0.0625 -0.171875q0.078125 -0.09375 0.71875 -0.265625q0.984375 -0.265625 1.484375 -0.265625q1.015625 0 1.578125 0.5q0.5625 0.5 0.5625 1.125l0 3.53125l0.71875 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.25 0zm0 -2.65625q-0.375 -0.109375 -0.796875 -0.15625q-0.421875 -0.046875 -0.875 -0.046875q-1.171875 0 -1.828125 0.5q-0.484375 0.375 -0.484375 0.890625q0 0.484375 0.375 0.8125q0.375 0.328125 1.09375 0.328125q0.703125 0 1.296875 -0.265625q0.59375 -0.28125 1.21875 -0.890625l0 -1.171875zm5.6293945 -2.84375l0 1.34375q1.03125 -0.9375 1.546875 -1.203125q0.53125 -0.265625 0.96875 -0.265625q0.46875 0 0.875 0.328125q0.421875 0.3125 0.421875 0.46875q0 0.125 -0.09375 0.203125q-0.078125 0.078125 -0.1875 0.078125q-0.0625 0 -0.109375 -0.015625q-0.046875 -0.03125 -0.171875 -0.140625q-0.21875 -0.234375 -0.390625 -0.3125q-0.15625 -0.078125 -0.3125 -0.078125q-0.359375 0 -0.859375 0.28125q-0.484375 0.28125 -1.6875 1.359375l0 2.921875l2.359375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-4.1875 0q-0.1875 0 -0.28125 -0.0625q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.171875q0.09375 -0.078125 0.28125 -0.078125l1.296875 0l0 -4.4375l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.515625 0zm7.2856445 2.453125l0 2.515625l1.828125 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.265625 0.078125l-3.09375 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l0.71875 0l0 -6.359375l-0.71875 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l3.109375 0q1.09375 0 1.78125 0.65625q0.703125 0.640625 0.703125 1.5q0 0.515625 -0.234375 0.9375q-0.21875 0.40625 -0.53125 0.640625q-0.484375 0.359375 -0.984375 0.515625q-0.375 0.125 -0.921875 0.125l-1.65625 0zm0 -0.53125l1.6875 0q0.59375 0 1.109375 -0.265625q0.515625 -0.265625 0.75 -0.640625q0.25 -0.390625 0.25 -0.78125q0 -0.625 -0.546875 -1.125q-0.53125 -0.5 -1.359375 -0.5l-1.890625 0l0 3.3125zm7.8637695 -1.921875l2.890625 0q0.1875 0 0.265625 0.078125q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.890625 0l0 3.546875q0 0.453125 0.359375 0.765625q0.375 0.3125 1.09375 0.3125q0.546875 0 1.171875 -0.15625q0.625 -0.15625 0.96875 -0.359375q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.09375 -0.078125 0.1875q-0.203125 0.203125 -1.0 0.453125q-0.78125 0.234375 -1.5 0.234375q-0.921875 0 -1.484375 -0.4375q-0.546875 -0.4375 -0.546875 -1.171875l0 -3.546875l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.984375 0l0 -1.578125q0 -0.1875 0.078125 -0.265625q0.078125 -0.078125 0.1875 -0.078125q0.125 0 0.203125 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.578125zm8.254395 0l0 1.34375q1.03125 -0.9375 1.546875 -1.203125q0.53125 -0.265625 0.96875 -0.265625q0.46875 0 0.875 0.328125q0.421875 0.3125 0.421875 0.46875q0 0.125 -0.09375 0.203125q-0.078125 0.078125 -0.1875 0.078125q-0.0625 0 -0.109375 -0.015625q-0.046875 -0.03125 -0.171875 -0.140625q-0.21875 -0.234375 -0.390625 -0.3125q-0.15625 -0.078125 -0.3125 -0.078125q-0.359375 0 -0.859375 0.28125q-0.484375 0.28125 -1.6875 1.359375l0 2.921875l2.359375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-4.1875 0q-0.1875 0 -0.28125 -0.0625q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.171875q0.09375 -0.078125 0.28125 -0.078125l1.296875 0l0 -4.4375l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.515625 0zm11.70752 1.796875l-5.75 3.21875q-0.140625 0.078125 -0.21875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.09375 -0.078125 -0.1875q0 -0.171875 0.21875 -0.28125l4.9375 -2.75l-4.9375 -2.734375q-0.203125 -0.125 -0.203125 -0.28125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.1875 -0.078125q0.0625 0 0.203125 0.078125l5.75 3.203125zm3.4731445 1.78125l1.734375 0l-1.890625 3.515625q-0.171875 0.3125 -0.40625 0.3125q-0.15625 0 -0.28125 -0.109375q-0.109375 -0.109375 -0.109375 -0.265625q0 -0.078125 0.03125 -0.140625l0.921875 -3.3125z" fill-rule="nonzero"/><path fill="#000000" d="m636.3698 244.27577l0 8.53125l1.296875 0q0.1875 0 0.265625 0.0625q0.09375 0.078125 0.09375 0.203125q0 0.125 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.828125 0l0 -9.609375l1.828125 0q0.1875 0 0.265625 0.078125q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.296875 0zm9.285645 4.9375l-3.5 0l-0.71875 1.953125l1.015625 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.984375 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l0.40625 0l2.359375 -6.359375l-1.578125 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l2.6875 0l2.59375 6.890625l0.421875 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.984375 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.015625 0l-0.734375 -1.953125zm-0.203125 -0.53125l-1.46875 -3.875l-0.203125 0l-1.421875 3.875l3.09375 0zm5.6137695 -2.484375l0 1.34375q1.03125 -0.9375 1.546875 -1.203125q0.53125 -0.265625 0.96875 -0.265625q0.46875 0 0.875 0.328125q0.421875 0.3125 0.421875 0.46875q0 0.125 -0.09375 0.203125q-0.078125 0.078125 -0.1875 0.078125q-0.0625 0 -0.109375 -0.015625q-0.046875 -0.03125 -0.171875 -0.140625q-0.21875 -0.234375 -0.390625 -0.3125q-0.15625 -0.078125 -0.3125 -0.078125q-0.359375 0 -0.859375 0.28125q-0.484375 0.28125 -1.6875 1.359375l0 2.921875l2.359375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-4.1875 0q-0.1875 0 -0.28125 -0.0625q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.171875q0.09375 -0.078125 0.28125 -0.078125l1.296875 0l0 -4.4375l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.515625 0zm10.223145 0.984375l0 -0.984375l1.25 0q0.203125 0 0.28125 0.078125q0.078125 0.078125 0.078125 0.203125q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-0.703125 0l0 5.328125q0 0.53125 -0.234375 0.953125q-0.15625 0.265625 -0.515625 0.5625q-0.34375 0.3125 -0.640625 0.4375q-0.296875 0.125 -0.78125 0.125l-1.515625 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.078125 -0.078125 0.265625 -0.078125l1.53125 0.015625q0.46875 0 0.84375 -0.25q0.390625 -0.234375 0.625 -0.703125q0.140625 -0.265625 0.140625 -0.671875l0 -1.609375q-0.84375 1.171875 -2.203125 1.171875q-1.09375 0 -1.890625 -0.8125q-0.796875 -0.8125 -0.796875 -1.953125q0 -1.15625 0.796875 -1.96875q0.796875 -0.8125 1.890625 -0.8125q1.359375 0 2.203125 1.171875zm0 1.609375q0 -0.953125 -0.640625 -1.59375q-0.640625 -0.640625 -1.53125 -0.640625q-0.90625 0 -1.546875 0.65625q-0.640625 0.640625 -0.640625 1.578125q0 0.9375 0.640625 1.59375q0.640625 0.640625 1.546875 0.640625q0.890625 0 1.53125 -0.640625q0.640625 -0.65625 0.640625 -1.59375zm7.9262695 -3.984375l0 -0.1875q0 -0.1875 0.0625 -0.265625q0.078125 -0.078125 0.203125 -0.078125q0.125 0 0.1875 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.359375q0 0.203125 -0.078125 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.125 0 -0.203125 -0.078125q-0.0625 -0.078125 -0.0625 -0.25q-0.03125 -0.53125 -0.5625 -0.953125q-0.515625 -0.421875 -1.34375 -0.421875q-0.890625 0 -1.40625 0.453125q-0.515625 0.453125 -0.515625 1.0625q0 0.328125 0.140625 0.59375q0.140625 0.25 0.375 0.421875q0.25 0.15625 0.546875 0.25q0.3125 0.09375 0.96875 0.203125q1.078125 0.1875 1.5 0.359375q0.546875 0.25 0.828125 0.6875q0.28125 0.4375 0.28125 1.03125q0 0.921875 -0.734375 1.5625q-0.71875 0.640625 -1.96875 0.640625q-1.375 0 -2.21875 -0.859375l0 0.296875q0 0.1875 -0.078125 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.09375 -0.078125 -0.28125l0 -1.46875q0 -0.203125 0.078125 -0.28125q0.078125 -0.078125 0.1875 -0.078125q0.125 0 0.1875 0.078125q0.078125 0.078125 0.078125 0.25q0.03125 0.578125 0.625 1.0625q0.59375 0.46875 1.59375 0.46875q1.015625 0 1.59375 -0.5q0.578125 -0.5 0.578125 -1.1875q0 -0.421875 -0.21875 -0.734375q-0.21875 -0.328125 -0.65625 -0.53125q-0.3125 -0.125 -1.28125 -0.296875q-1.328125 -0.21875 -1.90625 -0.671875q-0.578125 -0.453125 -0.578125 -1.296875q0 -0.84375 0.65625 -1.4375q0.671875 -0.609375 1.78125 -0.609375q1.109375 0 1.921875 0.703125zm3.8793945 1.390625l0 0.96875q0.484375 -0.578125 1.015625 -0.859375q0.546875 -0.296875 1.296875 -0.296875q0.78125 0 1.453125 0.375q0.671875 0.359375 1.03125 1.015625q0.359375 0.65625 0.359375 1.390625q0 1.140625 -0.828125 1.953125q-0.8125 0.8125 -2.015625 0.8125q-1.421875 0 -2.3125 -1.15625l0 3.21875l1.296875 0q0.1875 0 0.265625 0.0625q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.546875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.09375 -0.0625 0.28125 -0.0625l0.71875 0l0 -6.875l-0.71875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.25 0zm4.625 2.59375q0 -0.921875 -0.671875 -1.578125q-0.671875 -0.65625 -1.640625 -0.65625q-0.96875 0 -1.640625 0.65625q-0.671875 0.65625 -0.671875 1.578125q0 0.90625 0.671875 1.578125q0.671875 0.65625 1.640625 0.65625q0.96875 0 1.640625 -0.65625q0.671875 -0.65625 0.671875 -1.578125zm8.066895 0.28125l-5.421875 0q0.125 1.03125 0.859375 1.671875q0.734375 0.625 1.796875 0.625q0.59375 0 1.25 -0.1875q0.65625 -0.203125 1.0625 -0.53125q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.109375 -0.09375 0.21875q-0.3125 0.3125 -1.09375 0.59375q-0.765625 0.265625 -1.59375 0.265625q-1.375 0 -2.296875 -0.890625q-0.90625 -0.90625 -0.90625 -2.171875q0 -1.171875 0.859375 -2.0q0.859375 -0.828125 2.125 -0.828125q1.3125 0 2.15625 0.859375q0.84375 0.84375 0.828125 2.203125zm-0.53125 -0.53125q-0.15625 -0.890625 -0.84375 -1.4375q-0.671875 -0.546875 -1.609375 -0.546875q-0.921875 0 -1.59375 0.546875q-0.671875 0.53125 -0.84375 1.4375l4.890625 0zm7.6762695 -1.796875l0 -0.1875q0 -0.1875 0.078125 -0.265625q0.078125 -0.09375 0.1875 -0.09375q0.125 0 0.203125 0.09375q0.078125 0.078125 0.078125 0.265625l0 1.21875q-0.015625 0.1875 -0.09375 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.0625 -0.078125 -0.078125 -0.25q-0.03125 -0.4375 -0.59375 -0.84375q-0.546875 -0.40625 -1.5 -0.40625q-1.1875 0 -1.796875 0.75q-0.609375 0.734375 -0.609375 1.6875q0 1.03125 0.671875 1.703125q0.6875 0.671875 1.765625 0.671875q0.609375 0 1.25 -0.21875q0.65625 -0.234375 1.171875 -0.734375q0.140625 -0.140625 0.234375 -0.140625q0.109375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.265625 -0.640625 0.6875q-1.03125 0.671875 -2.296875 0.671875q-1.28125 0 -2.125 -0.8125q-0.828125 -0.828125 -0.828125 -2.09375q0 -1.28125 0.84375 -2.125q0.859375 -0.859375 2.140625 -0.859375q1.234375 0 2.0625 0.734375zm2.3012695 1.25l5.765625 -3.203125q0.140625 -0.078125 0.203125 -0.078125q0.109375 0 0.1875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.15625 -0.21875 0.28125l-4.9375 2.734375l4.9375 2.75q0.21875 0.109375 0.21875 0.28125q0 0.09375 -0.078125 0.1875q-0.078125 0.078125 -0.1875 0.078125q-0.078125 0 -0.21875 -0.078125l-5.75 -3.21875zm13.42627 -3.0l0 -0.375q0 -0.1875 0.0625 -0.265625q0.078125 -0.078125 0.203125 -0.078125q0.125 0 0.1875 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.484375q0 0.203125 -0.078125 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.0625 -0.078125 -0.078125 -0.234375q-0.03125 -0.546875 -0.578125 -0.953125q-0.734375 -0.5625 -1.671875 -0.5625q-0.625 0 -1.171875 0.265625q-0.40625 0.203125 -0.640625 0.484375q-0.421875 0.5 -0.671875 1.09375q-0.171875 0.453125 -0.171875 1.015625l0 0.921875q0 1.203125 0.859375 2.078125q0.859375 0.875 2.0 0.875q0.6875 0 1.234375 -0.296875q0.546875 -0.296875 1.046875 -0.90625q0.109375 -0.125 0.25 -0.125q0.109375 0 0.171875 0.078125q0.078125 0.0625 0.078125 0.171875q0 0.140625 -0.28125 0.4375q-0.515625 0.59375 -1.171875 0.890625q-0.640625 0.28125 -1.3125 0.28125q-0.578125 0 -1.171875 -0.21875q-0.453125 -0.171875 -0.75 -0.390625q-0.296875 -0.234375 -0.734375 -0.78125q-0.4375 -0.546875 -0.59375 -1.0q-0.15625 -0.453125 -0.15625 -1.015625l0 -1.078125q0 -0.796875 0.421875 -1.609375q0.421875 -0.828125 1.140625 -1.265625q0.734375 -0.4375 1.59375 -0.4375q1.328125 0 2.28125 0.890625zm3.6918945 -1.265625l0 3.28125q0.515625 -0.546875 0.984375 -0.765625q0.46875 -0.234375 1.046875 -0.234375q0.609375 0 1.046875 0.21875q0.4375 0.21875 0.71875 0.671875q0.296875 0.453125 0.296875 0.953125l0 3.3125l0.609375 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.734375 0q-0.203125 0 -0.296875 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.296875 -0.078125l0.59375 0l0 -3.265625q0 -0.578125 -0.421875 -0.96875q-0.40625 -0.390625 -1.15625 -0.390625q-0.578125 0 -1.0 0.28125q-0.296875 0.203125 -0.984375 0.96875l0 3.375l0.609375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.734375 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l0.59375 0l0 -6.890625l-0.71875 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l1.25 0zm11.098145 7.96875l0 -0.765625q-1.171875 0.96875 -2.484375 0.96875q-0.953125 0 -1.5 -0.484375q-0.53125 -0.484375 -0.53125 -1.1875q0 -0.765625 0.703125 -1.34375q0.71875 -0.578125 2.078125 -0.578125q0.359375 0 0.796875 0.046875q0.4375 0.046875 0.9375 0.140625l0 -0.859375q0 -0.4375 -0.40625 -0.75q-0.40625 -0.328125 -1.21875 -0.328125q-0.625 0 -1.75 0.359375q-0.203125 0.0625 -0.265625 0.0625q-0.09375 0 -0.171875 -0.078125q-0.0625 -0.078125 -0.0625 -0.1875q0 -0.109375 0.0625 -0.171875q0.078125 -0.09375 0.71875 -0.265625q0.984375 -0.265625 1.484375 -0.265625q1.015625 0 1.578125 0.5q0.5625 0.5 0.5625 1.125l0 3.53125l0.71875 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.25 0zm0 -2.65625q-0.375 -0.109375 -0.796875 -0.15625q-0.421875 -0.046875 -0.875 -0.046875q-1.171875 0 -1.828125 0.5q-0.484375 0.375 -0.484375 0.890625q0 0.484375 0.375 0.8125q0.375 0.328125 1.09375 0.328125q0.703125 0 1.296875 -0.265625q0.59375 -0.28125 1.21875 -0.890625l0 -1.171875zm5.6293945 -2.84375l0 1.34375q1.03125 -0.9375 1.546875 -1.203125q0.53125 -0.265625 0.96875 -0.265625q0.46875 0 0.875 0.328125q0.421875 0.3125 0.421875 0.46875q0 0.125 -0.09375 0.203125q-0.078125 0.078125 -0.1875 0.078125q-0.0625 0 -0.109375 -0.015625q-0.046875 -0.03125 -0.171875 -0.140625q-0.21875 -0.234375 -0.390625 -0.3125q-0.15625 -0.078125 -0.3125 -0.078125q-0.359375 0 -0.859375 0.28125q-0.484375 0.28125 -1.6875 1.359375l0 2.921875l2.359375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-4.1875 0q-0.1875 0 -0.28125 -0.0625q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.171875q0.09375 -0.078125 0.28125 -0.078125l1.296875 0l0 -4.4375l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.515625 0zm6.7075195 2.1875l0 2.78125l0.984375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.234375 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l0.703125 0l0 -6.359375l-0.703125 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l3.21875 0q1.0 0 1.671875 0.640625q0.6875 0.625 0.6875 1.40625q0 0.578125 -0.421875 1.078125q-0.421875 0.5 -1.40625 0.84375q0.5625 0.390625 0.96875 0.890625q0.40625 0.5 1.296875 2.03125l0.40625 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-0.703125 0q-0.984375 -1.765625 -1.53125 -2.375q-0.546875 -0.609375 -1.25 -0.9375l-1.6875 0zm0 -0.53125l1.453125 0q0.6875 0 1.25 -0.25q0.578125 -0.265625 0.828125 -0.609375q0.265625 -0.34375 0.265625 -0.6875q0 -0.53125 -0.546875 -1.015625q-0.53125 -0.484375 -1.296875 -0.484375l-1.953125 0l0 3.046875zm12.410645 1.21875l-5.421875 0q0.125 1.03125 0.859375 1.671875q0.734375 0.625 1.796875 0.625q0.59375 0 1.25 -0.1875q0.65625 -0.203125 1.0625 -0.53125q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.109375 -0.09375 0.21875q-0.3125 0.3125 -1.09375 0.59375q-0.765625 0.265625 -1.59375 0.265625q-1.375 0 -2.296875 -0.890625q-0.90625 -0.90625 -0.90625 -2.171875q0 -1.171875 0.859375 -2.0q0.859375 -0.828125 2.125 -0.828125q1.3125 0 2.15625 0.859375q0.84375 0.84375 0.828125 2.203125zm-0.53125 -0.53125q-0.15625 -0.890625 -0.84375 -1.4375q-0.671875 -0.546875 -1.609375 -0.546875q-0.921875 0 -1.59375 0.546875q-0.671875 0.53125 -0.84375 1.4375l4.890625 0zm7.2075195 -1.984375q0 -0.1875 0.078125 -0.265625q0.078125 -0.09375 0.1875 -0.09375q0.125 0 0.203125 0.09375q0.078125 0.078125 0.078125 0.265625l0 0.921875q0 0.1875 -0.078125 0.28125q-0.078125 0.078125 -0.203125 0.078125q-0.09375 0 -0.171875 -0.0625q-0.078125 -0.078125 -0.09375 -0.25q-0.03125 -0.375 -0.390625 -0.625q-0.515625 -0.34375 -1.375 -0.34375q-0.890625 0 -1.390625 0.359375q-0.375 0.265625 -0.375 0.609375q0 0.375 0.453125 0.625q0.296875 0.1875 1.140625 0.28125q1.125 0.109375 1.546875 0.265625q0.625 0.21875 0.921875 0.625q0.296875 0.390625 0.296875 0.84375q0 0.6875 -0.65625 1.21875q-0.640625 0.515625 -1.90625 0.515625q-1.265625 0 -2.078125 -0.640625q0 0.21875 -0.03125 0.28125q-0.015625 0.0625 -0.09375 0.109375q-0.0625 0.046875 -0.140625 0.046875q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.09375 -0.078125 -0.28125l0 -1.09375q0 -0.1875 0.0625 -0.265625q0.078125 -0.09375 0.203125 -0.09375q0.109375 0 0.1875 0.078125q0.09375 0.078125 0.09375 0.21875q0 0.296875 0.140625 0.484375q0.21875 0.3125 0.703125 0.515625q0.484375 0.1875 1.1875 0.1875q1.046875 0 1.546875 -0.375q0.515625 -0.390625 0.515625 -0.828125q0 -0.5 -0.515625 -0.796875q-0.515625 -0.296875 -1.515625 -0.390625q-0.984375 -0.109375 -1.421875 -0.265625q-0.4375 -0.171875 -0.671875 -0.5q-0.234375 -0.328125 -0.234375 -0.71875q0 -0.671875 0.671875 -1.078125q0.671875 -0.40625 1.59375 -0.40625q1.109375 0 1.796875 0.546875zm4.9575195 -0.359375l2.890625 0q0.1875 0 0.265625 0.078125q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.890625 0l0 3.546875q0 0.453125 0.359375 0.765625q0.375 0.3125 1.09375 0.3125q0.546875 0 1.171875 -0.15625q0.625 -0.15625 0.96875 -0.359375q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.09375 -0.078125 0.1875q-0.203125 0.203125 -1.0 0.453125q-0.78125 0.234375 -1.5 0.234375q-0.921875 0 -1.484375 -0.4375q-0.546875 -0.4375 -0.546875 -1.171875l0 -3.546875l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.984375 0l0 -1.578125q0 -0.1875 0.078125 -0.265625q0.078125 -0.078125 0.1875 -0.078125q0.125 0 0.203125 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.578125zm8.254395 0l0 1.34375q1.03125 -0.9375 1.546875 -1.203125q0.53125 -0.265625 0.96875 -0.265625q0.46875 0 0.875 0.328125q0.421875 0.3125 0.421875 0.46875q0 0.125 -0.09375 0.203125q-0.078125 0.078125 -0.1875 0.078125q-0.0625 0 -0.109375 -0.015625q-0.046875 -0.03125 -0.171875 -0.140625q-0.21875 -0.234375 -0.390625 -0.3125q-0.15625 -0.078125 -0.3125 -0.078125q-0.359375 0 -0.859375 0.28125q-0.484375 0.28125 -1.6875 1.359375l0 2.921875l2.359375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-4.1875 0q-0.1875 0 -0.28125 -0.0625q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.171875q0.09375 -0.078125 0.28125 -0.078125l1.296875 0l0 -4.4375l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.515625 0zm8.70752 -2.734375l0 1.375l-0.796875 0l0 -1.375l0.796875 0zm0.015625 2.734375l0 4.96875l2.09375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-4.71875 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l2.09375 0l0 -4.421875l-1.5625 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.078125 -0.078125 0.28125 -0.078125l2.09375 0zm9.73877 0.546875l0 -0.1875q0 -0.1875 0.078125 -0.265625q0.078125 -0.09375 0.1875 -0.09375q0.125 0 0.203125 0.09375q0.078125 0.078125 0.078125 0.265625l0 1.21875q-0.015625 0.1875 -0.09375 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.0625 -0.078125 -0.078125 -0.25q-0.03125 -0.4375 -0.59375 -0.84375q-0.546875 -0.40625 -1.5 -0.40625q-1.1875 0 -1.796875 0.75q-0.609375 0.734375 -0.609375 1.6875q0 1.03125 0.671875 1.703125q0.6875 0.671875 1.765625 0.671875q0.609375 0 1.25 -0.21875q0.65625 -0.234375 1.171875 -0.734375q0.140625 -0.140625 0.234375 -0.140625q0.109375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.265625 -0.640625 0.6875q-1.03125 0.671875 -2.296875 0.671875q-1.28125 0 -2.125 -0.8125q-0.828125 -0.828125 -0.828125 -2.09375q0 -1.28125 0.84375 -2.125q0.859375 -0.859375 2.140625 -0.859375q1.234375 0 2.0625 0.734375zm4.4887695 -0.546875l2.890625 0q0.1875 0 0.265625 0.078125q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.890625 0l0 3.546875q0 0.453125 0.359375 0.765625q0.375 0.3125 1.09375 0.3125q0.546875 0 1.171875 -0.15625q0.625 -0.15625 0.96875 -0.359375q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.09375 -0.078125 0.1875q-0.203125 0.203125 -1.0 0.453125q-0.78125 0.234375 -1.5 0.234375q-0.921875 0 -1.484375 -0.4375q-0.546875 -0.4375 -0.546875 -1.171875l0 -3.546875l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.984375 0l0 -1.578125q0 -0.1875 0.078125 -0.265625q0.078125 -0.078125 0.1875 -0.078125q0.125 0 0.203125 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.578125zm11.77002 2.875l-5.421875 0q0.125 1.03125 0.859375 1.671875q0.734375 0.625 1.796875 0.625q0.59375 0 1.25 -0.1875q0.65625 -0.203125 1.0625 -0.53125q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.109375 -0.09375 0.21875q-0.3125 0.3125 -1.09375 0.59375q-0.765625 0.265625 -1.59375 0.265625q-1.375 0 -2.296875 -0.890625q-0.90625 -0.90625 -0.90625 -2.171875q0 -1.171875 0.859375 -2.0q0.859375 -0.828125 2.125 -0.828125q1.3125 0 2.15625 0.859375q0.84375 0.84375 0.828125 2.203125zm-0.53125 -0.53125q-0.15625 -0.890625 -0.84375 -1.4375q-0.671875 -0.546875 -1.609375 -0.546875q-0.921875 0 -1.59375 0.546875q-0.671875 0.53125 -0.84375 1.4375l4.890625 0zm8.066895 -4.8125l0 7.4375l0.703125 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-1.25 0l0 -1.0625q-0.921875 1.265625 -2.34375 1.265625q-0.734375 0 -1.40625 -0.375q-0.65625 -0.390625 -1.046875 -1.09375q-0.375 -0.71875 -0.375 -1.46875q0 -0.765625 0.375 -1.46875q0.390625 -0.703125 1.046875 -1.09375q0.671875 -0.390625 1.40625 -0.390625q1.390625 0 2.34375 1.265625l0 -3.0l-0.703125 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.25 0zm-0.546875 5.234375q0 -1.015625 -0.6875 -1.703125q-0.671875 -0.703125 -1.625 -0.703125q-0.953125 0 -1.640625 0.703125q-0.6875 0.6875 -0.6875 1.703125q0 1.0 0.6875 1.703125q0.6875 0.703125 1.640625 0.703125q0.953125 0 1.625 -0.703125q0.6875 -0.703125 0.6875 -1.703125zm4.5825195 -0.3125l0 2.515625l1.828125 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.265625 0.078125l-3.09375 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l0.71875 0l0 -6.359375l-0.71875 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l3.109375 0q1.09375 0 1.78125 0.65625q0.703125 0.640625 0.703125 1.5q0 0.515625 -0.234375 0.9375q-0.21875 0.40625 -0.53125 0.640625q-0.484375 0.359375 -0.984375 0.515625q-0.375 0.125 -0.921875 0.125l-1.65625 0zm0 -0.53125l1.6875 0q0.59375 0 1.109375 -0.265625q0.515625 -0.265625 0.75 -0.640625q0.25 -0.390625 0.25 -0.78125q0 -0.625 -0.546875 -1.125q-0.53125 -0.5 -1.359375 -0.5l-1.890625 0l0 3.3125zm7.8637695 -1.921875l2.890625 0q0.1875 0 0.265625 0.078125q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.890625 0l0 3.546875q0 0.453125 0.359375 0.765625q0.375 0.3125 1.09375 0.3125q0.546875 0 1.171875 -0.15625q0.625 -0.15625 0.96875 -0.359375q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.09375 -0.078125 0.1875q-0.203125 0.203125 -1.0 0.453125q-0.78125 0.234375 -1.5 0.234375q-0.921875 0 -1.484375 -0.4375q-0.546875 -0.4375 -0.546875 -1.171875l0 -3.546875l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.984375 0l0 -1.578125q0 -0.1875 0.078125 -0.265625q0.078125 -0.078125 0.1875 -0.078125q0.125 0 0.203125 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.578125zm8.254395 0l0 1.34375q1.03125 -0.9375 1.546875 -1.203125q0.53125 -0.265625 0.96875 -0.265625q0.46875 0 0.875 0.328125q0.421875 0.3125 0.421875 0.46875q0 0.125 -0.09375 0.203125q-0.078125 0.078125 -0.1875 0.078125q-0.0625 0 -0.109375 -0.015625q-0.046875 -0.03125 -0.171875 -0.140625q-0.21875 -0.234375 -0.390625 -0.3125q-0.15625 -0.078125 -0.3125 -0.078125q-0.359375 0 -0.859375 0.28125q-0.484375 0.28125 -1.6875 1.359375l0 2.921875l2.359375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-4.1875 0q-0.1875 0 -0.28125 -0.0625q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.171875q0.09375 -0.078125 0.28125 -0.078125l1.296875 0l0 -4.4375l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.515625 0zm11.70752 1.796875l-5.75 3.21875q-0.140625 0.078125 -0.21875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.09375 -0.078125 -0.1875q0 -0.171875 0.21875 -0.28125l4.9375 -2.75l-4.9375 -2.734375q-0.203125 -0.125 -0.203125 -0.28125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.1875 -0.078125q0.0625 0 0.203125 0.078125l5.75 3.203125zm3.4731445 1.78125l1.734375 0l-1.890625 3.515625q-0.171875 0.3125 -0.40625 0.3125q-0.15625 0 -0.28125 -0.109375q-0.109375 -0.109375 -0.109375 -0.265625q0 -0.078125 0.03125 -0.140625l0.921875 -3.3125z" fill-rule="nonzero"/><path fill="#000000" d="m645.65546 265.21326l-3.5 0l-0.71875 1.953125l1.015625 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.984375 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l0.40625 0l2.359375 -6.359375l-1.578125 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l2.6875 0l2.59375 6.890625l0.421875 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.984375 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.015625 0l-0.734375 -1.953125zm-0.203125 -0.53125l-1.46875 -3.875l-0.203125 0l-1.421875 3.875l3.09375 0zm5.6137695 -2.484375l0 1.34375q1.03125 -0.9375 1.546875 -1.203125q0.53125 -0.265625 0.96875 -0.265625q0.46875 0 0.875 0.328125q0.421875 0.3125 0.421875 0.46875q0 0.125 -0.09375 0.203125q-0.078125 0.078125 -0.1875 0.078125q-0.0625 0 -0.109375 -0.015625q-0.046875 -0.03125 -0.171875 -0.140625q-0.21875 -0.234375 -0.390625 -0.3125q-0.15625 -0.078125 -0.3125 -0.078125q-0.359375 0 -0.859375 0.28125q-0.484375 0.28125 -1.6875 1.359375l0 2.921875l2.359375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-4.1875 0q-0.1875 0 -0.28125 -0.0625q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.171875q0.09375 -0.078125 0.28125 -0.078125l1.296875 0l0 -4.4375l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.515625 0zm10.223145 0.984375l0 -0.984375l1.25 0q0.203125 0 0.28125 0.078125q0.078125 0.078125 0.078125 0.203125q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-0.703125 0l0 5.328125q0 0.53125 -0.234375 0.953125q-0.15625 0.265625 -0.515625 0.5625q-0.34375 0.3125 -0.640625 0.4375q-0.296875 0.125 -0.78125 0.125l-1.515625 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.078125 -0.078125 0.265625 -0.078125l1.53125 0.015625q0.46875 0 0.84375 -0.25q0.390625 -0.234375 0.625 -0.703125q0.140625 -0.265625 0.140625 -0.671875l0 -1.609375q-0.84375 1.171875 -2.203125 1.171875q-1.09375 0 -1.890625 -0.8125q-0.796875 -0.8125 -0.796875 -1.953125q0 -1.15625 0.796875 -1.96875q0.796875 -0.8125 1.890625 -0.8125q1.359375 0 2.203125 1.171875zm0 1.609375q0 -0.953125 -0.640625 -1.59375q-0.640625 -0.640625 -1.53125 -0.640625q-0.90625 0 -1.546875 0.65625q-0.640625 0.640625 -0.640625 1.578125q0 0.9375 0.640625 1.59375q0.640625 0.640625 1.546875 0.640625q0.890625 0 1.53125 -0.640625q0.640625 -0.65625 0.640625 -1.59375zm7.9262695 -3.984375l0 -0.1875q0 -0.1875 0.0625 -0.265625q0.078125 -0.078125 0.203125 -0.078125q0.125 0 0.1875 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.359375q0 0.203125 -0.078125 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.125 0 -0.203125 -0.078125q-0.0625 -0.078125 -0.0625 -0.25q-0.03125 -0.53125 -0.5625 -0.953125q-0.515625 -0.421875 -1.34375 -0.421875q-0.890625 0 -1.40625 0.453125q-0.515625 0.453125 -0.515625 1.0625q0 0.328125 0.140625 0.59375q0.140625 0.25 0.375 0.421875q0.25 0.15625 0.546875 0.25q0.3125 0.09375 0.96875 0.203125q1.078125 0.1875 1.5 0.359375q0.546875 0.25 0.828125 0.6875q0.28125 0.4375 0.28125 1.03125q0 0.921875 -0.734375 1.5625q-0.71875 0.640625 -1.96875 0.640625q-1.375 0 -2.21875 -0.859375l0 0.296875q0 0.1875 -0.078125 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.09375 -0.078125 -0.28125l0 -1.46875q0 -0.203125 0.078125 -0.28125q0.078125 -0.078125 0.1875 -0.078125q0.125 0 0.1875 0.078125q0.078125 0.078125 0.078125 0.25q0.03125 0.578125 0.625 1.0625q0.59375 0.46875 1.59375 0.46875q1.015625 0 1.59375 -0.5q0.578125 -0.5 0.578125 -1.1875q0 -0.421875 -0.21875 -0.734375q-0.21875 -0.328125 -0.65625 -0.53125q-0.3125 -0.125 -1.28125 -0.296875q-1.328125 -0.21875 -1.90625 -0.671875q-0.578125 -0.453125 -0.578125 -1.296875q0 -0.84375 0.65625 -1.4375q0.671875 -0.609375 1.78125 -0.609375q1.109375 0 1.921875 0.703125zm3.8793945 1.390625l0 0.96875q0.484375 -0.578125 1.015625 -0.859375q0.546875 -0.296875 1.296875 -0.296875q0.78125 0 1.453125 0.375q0.671875 0.359375 1.03125 1.015625q0.359375 0.65625 0.359375 1.390625q0 1.140625 -0.828125 1.953125q-0.8125 0.8125 -2.015625 0.8125q-1.421875 0 -2.3125 -1.15625l0 3.21875l1.296875 0q0.1875 0 0.265625 0.0625q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.546875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.09375 -0.0625 0.28125 -0.0625l0.71875 0l0 -6.875l-0.71875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.25 0zm4.625 2.59375q0 -0.921875 -0.671875 -1.578125q-0.671875 -0.65625 -1.640625 -0.65625q-0.96875 0 -1.640625 0.65625q-0.671875 0.65625 -0.671875 1.578125q0 0.90625 0.671875 1.578125q0.671875 0.65625 1.640625 0.65625q0.96875 0 1.640625 -0.65625q0.671875 -0.65625 0.671875 -1.578125zm8.066895 0.28125l-5.421875 0q0.125 1.03125 0.859375 1.671875q0.734375 0.625 1.796875 0.625q0.59375 0 1.25 -0.1875q0.65625 -0.203125 1.0625 -0.53125q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.109375 -0.09375 0.21875q-0.3125 0.3125 -1.09375 0.59375q-0.765625 0.265625 -1.59375 0.265625q-1.375 0 -2.296875 -0.890625q-0.90625 -0.90625 -0.90625 -2.171875q0 -1.171875 0.859375 -2.0q0.859375 -0.828125 2.125 -0.828125q1.3125 0 2.15625 0.859375q0.84375 0.84375 0.828125 2.203125zm-0.53125 -0.53125q-0.15625 -0.890625 -0.84375 -1.4375q-0.671875 -0.546875 -1.609375 -0.546875q-0.921875 0 -1.59375 0.546875q-0.671875 0.53125 -0.84375 1.4375l4.890625 0zm7.6762695 -1.796875l0 -0.1875q0 -0.1875 0.078125 -0.265625q0.078125 -0.09375 0.1875 -0.09375q0.125 0 0.203125 0.09375q0.078125 0.078125 0.078125 0.265625l0 1.21875q-0.015625 0.1875 -0.09375 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.0625 -0.078125 -0.078125 -0.25q-0.03125 -0.4375 -0.59375 -0.84375q-0.546875 -0.40625 -1.5 -0.40625q-1.1875 0 -1.796875 0.75q-0.609375 0.734375 -0.609375 1.6875q0 1.03125 0.671875 1.703125q0.6875 0.671875 1.765625 0.671875q0.609375 0 1.25 -0.21875q0.65625 -0.234375 1.171875 -0.734375q0.140625 -0.140625 0.234375 -0.140625q0.109375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.265625 -0.640625 0.6875q-1.03125 0.671875 -2.296875 0.671875q-1.28125 0 -2.125 -0.8125q-0.828125 -0.828125 -0.828125 -2.09375q0 -1.28125 0.84375 -2.125q0.859375 -0.859375 2.140625 -0.859375q1.234375 0 2.0625 0.734375zm2.3012695 1.25l5.765625 -3.203125q0.140625 -0.078125 0.203125 -0.078125q0.109375 0 0.1875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.15625 -0.21875 0.28125l-4.9375 2.734375l4.9375 2.75q0.21875 0.109375 0.21875 0.28125q0 0.09375 -0.078125 0.1875q-0.078125 0.078125 -0.1875 0.078125q-0.078125 0 -0.21875 -0.078125l-5.75 -3.21875zm13.42627 -3.0l0 -0.375q0 -0.1875 0.0625 -0.265625q0.078125 -0.078125 0.203125 -0.078125q0.125 0 0.1875 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.484375q0 0.203125 -0.078125 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.0625 -0.078125 -0.078125 -0.234375q-0.03125 -0.546875 -0.578125 -0.953125q-0.734375 -0.5625 -1.671875 -0.5625q-0.625 0 -1.171875 0.265625q-0.40625 0.203125 -0.640625 0.484375q-0.421875 0.5 -0.671875 1.09375q-0.171875 0.453125 -0.171875 1.015625l0 0.921875q0 1.203125 0.859375 2.078125q0.859375 0.875 2.0 0.875q0.6875 0 1.234375 -0.296875q0.546875 -0.296875 1.046875 -0.90625q0.109375 -0.125 0.25 -0.125q0.109375 0 0.171875 0.078125q0.078125 0.0625 0.078125 0.171875q0 0.140625 -0.28125 0.4375q-0.515625 0.59375 -1.171875 0.890625q-0.640625 0.28125 -1.3125 0.28125q-0.578125 0 -1.171875 -0.21875q-0.453125 -0.171875 -0.75 -0.390625q-0.296875 -0.234375 -0.734375 -0.78125q-0.4375 -0.546875 -0.59375 -1.0q-0.15625 -0.453125 -0.15625 -1.015625l0 -1.078125q0 -0.796875 0.421875 -1.609375q0.421875 -0.828125 1.140625 -1.265625q0.734375 -0.4375 1.59375 -0.4375q1.328125 0 2.28125 0.890625zm8.42627 3.96875q0 1.21875 -0.875 2.078125q-0.859375 0.859375 -2.09375 0.859375q-1.25 0 -2.125 -0.859375q-0.859375 -0.875 -0.859375 -2.078125q0 -1.21875 0.859375 -2.078125q0.875 -0.875 2.125 -0.875q1.234375 0 2.09375 0.859375q0.875 0.859375 0.875 2.09375zm-0.53125 0q0 -1.0 -0.71875 -1.703125q-0.71875 -0.703125 -1.734375 -0.703125q-1.015625 0 -1.734375 0.703125q-0.703125 0.703125 -0.703125 1.703125q0 0.984375 0.703125 1.703125q0.71875 0.703125 1.734375 0.703125q1.015625 0 1.734375 -0.703125q0.71875 -0.703125 0.71875 -1.703125zm3.6293945 -2.765625l0 0.8125q0.5625 -0.5625 1.015625 -0.78125q0.453125 -0.21875 1.015625 -0.21875q0.609375 0 1.109375 0.265625q0.359375 0.1875 0.640625 0.625q0.296875 0.4375 0.296875 0.90625l0 3.359375l0.453125 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.4375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.453125 0l0 -3.265625q0 -0.578125 -0.421875 -0.953125q-0.40625 -0.390625 -1.09375 -0.390625q-0.53125 0 -0.921875 0.21875q-0.390625 0.203125 -1.109375 1.046875l0 3.34375l0.609375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.734375 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l0.59375 0l0 -4.421875l-0.453125 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l0.984375 0zm11.285645 0.359375q0 -0.1875 0.078125 -0.265625q0.078125 -0.09375 0.1875 -0.09375q0.125 0 0.203125 0.09375q0.078125 0.078125 0.078125 0.265625l0 0.921875q0 0.1875 -0.078125 0.28125q-0.078125 0.078125 -0.203125 0.078125q-0.09375 0 -0.171875 -0.0625q-0.078125 -0.078125 -0.09375 -0.25q-0.03125 -0.375 -0.390625 -0.625q-0.515625 -0.34375 -1.375 -0.34375q-0.890625 0 -1.390625 0.359375q-0.375 0.265625 -0.375 0.609375q0 0.375 0.453125 0.625q0.296875 0.1875 1.140625 0.28125q1.125 0.109375 1.546875 0.265625q0.625 0.21875 0.921875 0.625q0.296875 0.390625 0.296875 0.84375q0 0.6875 -0.65625 1.21875q-0.640625 0.515625 -1.90625 0.515625q-1.265625 0 -2.078125 -0.640625q0 0.21875 -0.03125 0.28125q-0.015625 0.0625 -0.09375 0.109375q-0.0625 0.046875 -0.140625 0.046875q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.09375 -0.078125 -0.28125l0 -1.09375q0 -0.1875 0.0625 -0.265625q0.078125 -0.09375 0.203125 -0.09375q0.109375 0 0.1875 0.078125q0.09375 0.078125 0.09375 0.21875q0 0.296875 0.140625 0.484375q0.21875 0.3125 0.703125 0.515625q0.484375 0.1875 1.1875 0.1875q1.046875 0 1.546875 -0.375q0.515625 -0.390625 0.515625 -0.828125q0 -0.5 -0.515625 -0.796875q-0.515625 -0.296875 -1.515625 -0.390625q-0.984375 -0.109375 -1.421875 -0.265625q-0.4375 -0.171875 -0.671875 -0.5q-0.234375 -0.328125 -0.234375 -0.71875q0 -0.671875 0.671875 -1.078125q0.671875 -0.40625 1.59375 -0.40625q1.109375 0 1.796875 0.546875zm4.9575195 -0.359375l2.890625 0q0.1875 0 0.265625 0.078125q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.890625 0l0 3.546875q0 0.453125 0.359375 0.765625q0.375 0.3125 1.09375 0.3125q0.546875 0 1.171875 -0.15625q0.625 -0.15625 0.96875 -0.359375q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.09375 -0.078125 0.1875q-0.203125 0.203125 -1.0 0.453125q-0.78125 0.234375 -1.5 0.234375q-0.921875 0 -1.484375 -0.4375q-0.546875 -0.4375 -0.546875 -1.171875l0 -3.546875l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.984375 0l0 -1.578125q0 -0.1875 0.078125 -0.265625q0.078125 -0.078125 0.1875 -0.078125q0.125 0 0.203125 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.578125zm11.23877 -1.203125l0 -0.375q0 -0.1875 0.0625 -0.265625q0.078125 -0.078125 0.203125 -0.078125q0.125 0 0.1875 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.484375q0 0.203125 -0.078125 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.0625 -0.078125 -0.078125 -0.234375q-0.03125 -0.546875 -0.578125 -0.953125q-0.734375 -0.5625 -1.671875 -0.5625q-0.625 0 -1.171875 0.265625q-0.40625 0.203125 -0.640625 0.484375q-0.421875 0.5 -0.671875 1.09375q-0.171875 0.453125 -0.171875 1.015625l0 0.921875q0 1.203125 0.859375 2.078125q0.859375 0.875 2.0 0.875q0.6875 0 1.234375 -0.296875q0.546875 -0.296875 1.046875 -0.90625q0.109375 -0.125 0.25 -0.125q0.109375 0 0.171875 0.078125q0.078125 0.0625 0.078125 0.171875q0 0.140625 -0.28125 0.4375q-0.515625 0.59375 -1.171875 0.890625q-0.640625 0.28125 -1.3125 0.28125q-0.578125 0 -1.171875 -0.21875q-0.453125 -0.171875 -0.75 -0.390625q-0.296875 -0.234375 -0.734375 -0.78125q-0.4375 -0.546875 -0.59375 -1.0q-0.15625 -0.453125 -0.15625 -1.015625l0 -1.078125q0 -0.796875 0.421875 -1.609375q0.421875 -0.828125 1.140625 -1.265625q0.734375 -0.4375 1.59375 -0.4375q1.328125 0 2.28125 0.890625zm3.6918945 -1.265625l0 3.28125q0.515625 -0.546875 0.984375 -0.765625q0.46875 -0.234375 1.046875 -0.234375q0.609375 0 1.046875 0.21875q0.4375 0.21875 0.71875 0.671875q0.296875 0.453125 0.296875 0.953125l0 3.3125l0.609375 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.734375 0q-0.203125 0 -0.296875 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.296875 -0.078125l0.59375 0l0 -3.265625q0 -0.578125 -0.421875 -0.96875q-0.40625 -0.390625 -1.15625 -0.390625q-0.578125 0 -1.0 0.28125q-0.296875 0.203125 -0.984375 0.96875l0 3.375l0.609375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.734375 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l0.59375 0l0 -6.890625l-0.71875 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l1.25 0zm11.098145 7.96875l0 -0.765625q-1.171875 0.96875 -2.484375 0.96875q-0.953125 0 -1.5 -0.484375q-0.53125 -0.484375 -0.53125 -1.1875q0 -0.765625 0.703125 -1.34375q0.71875 -0.578125 2.078125 -0.578125q0.359375 0 0.796875 0.046875q0.4375 0.046875 0.9375 0.140625l0 -0.859375q0 -0.4375 -0.40625 -0.75q-0.40625 -0.328125 -1.21875 -0.328125q-0.625 0 -1.75 0.359375q-0.203125 0.0625 -0.265625 0.0625q-0.09375 0 -0.171875 -0.078125q-0.0625 -0.078125 -0.0625 -0.1875q0 -0.109375 0.0625 -0.171875q0.078125 -0.09375 0.71875 -0.265625q0.984375 -0.265625 1.484375 -0.265625q1.015625 0 1.578125 0.5q0.5625 0.5 0.5625 1.125l0 3.53125l0.71875 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.25 0zm0 -2.65625q-0.375 -0.109375 -0.796875 -0.15625q-0.421875 -0.046875 -0.875 -0.046875q-1.171875 0 -1.828125 0.5q-0.484375 0.375 -0.484375 0.890625q0 0.484375 0.375 0.8125q0.375 0.328125 1.09375 0.328125q0.703125 0 1.296875 -0.265625q0.59375 -0.28125 1.21875 -0.890625l0 -1.171875zm5.6293945 -2.84375l0 1.34375q1.03125 -0.9375 1.546875 -1.203125q0.53125 -0.265625 0.96875 -0.265625q0.46875 0 0.875 0.328125q0.421875 0.3125 0.421875 0.46875q0 0.125 -0.09375 0.203125q-0.078125 0.078125 -0.1875 0.078125q-0.0625 0 -0.109375 -0.015625q-0.046875 -0.03125 -0.171875 -0.140625q-0.21875 -0.234375 -0.390625 -0.3125q-0.15625 -0.078125 -0.3125 -0.078125q-0.359375 0 -0.859375 0.28125q-0.484375 0.28125 -1.6875 1.359375l0 2.921875l2.359375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-4.1875 0q-0.1875 0 -0.28125 -0.0625q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.171875q0.09375 -0.078125 0.28125 -0.078125l1.296875 0l0 -4.4375l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.515625 0zm6.7075195 2.1875l0 2.78125l0.984375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.234375 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l0.703125 0l0 -6.359375l-0.703125 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l3.21875 0q1.0 0 1.671875 0.640625q0.6875 0.625 0.6875 1.40625q0 0.578125 -0.421875 1.078125q-0.421875 0.5 -1.40625 0.84375q0.5625 0.390625 0.96875 0.890625q0.40625 0.5 1.296875 2.03125l0.40625 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-0.703125 0q-0.984375 -1.765625 -1.53125 -2.375q-0.546875 -0.609375 -1.25 -0.9375l-1.6875 0zm0 -0.53125l1.453125 0q0.6875 0 1.25 -0.25q0.578125 -0.265625 0.828125 -0.609375q0.265625 -0.34375 0.265625 -0.6875q0 -0.53125 -0.546875 -1.015625q-0.53125 -0.484375 -1.296875 -0.484375l-1.953125 0l0 3.046875zm12.410645 1.21875l-5.421875 0q0.125 1.03125 0.859375 1.671875q0.734375 0.625 1.796875 0.625q0.59375 0 1.25 -0.1875q0.65625 -0.203125 1.0625 -0.53125q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.109375 -0.09375 0.21875q-0.3125 0.3125 -1.09375 0.59375q-0.765625 0.265625 -1.59375 0.265625q-1.375 0 -2.296875 -0.890625q-0.90625 -0.90625 -0.90625 -2.171875q0 -1.171875 0.859375 -2.0q0.859375 -0.828125 2.125 -0.828125q1.3125 0 2.15625 0.859375q0.84375 0.84375 0.828125 2.203125zm-0.53125 -0.53125q-0.15625 -0.890625 -0.84375 -1.4375q-0.671875 -0.546875 -1.609375 -0.546875q-0.921875 0 -1.59375 0.546875q-0.671875 0.53125 -0.84375 1.4375l4.890625 0zm7.2075195 -1.984375q0 -0.1875 0.078125 -0.265625q0.078125 -0.09375 0.1875 -0.09375q0.125 0 0.203125 0.09375q0.078125 0.078125 0.078125 0.265625l0 0.921875q0 0.1875 -0.078125 0.28125q-0.078125 0.078125 -0.203125 0.078125q-0.09375 0 -0.171875 -0.0625q-0.078125 -0.078125 -0.09375 -0.25q-0.03125 -0.375 -0.390625 -0.625q-0.515625 -0.34375 -1.375 -0.34375q-0.890625 0 -1.390625 0.359375q-0.375 0.265625 -0.375 0.609375q0 0.375 0.453125 0.625q0.296875 0.1875 1.140625 0.28125q1.125 0.109375 1.546875 0.265625q0.625 0.21875 0.921875 0.625q0.296875 0.390625 0.296875 0.84375q0 0.6875 -0.65625 1.21875q-0.640625 0.515625 -1.90625 0.515625q-1.265625 0 -2.078125 -0.640625q0 0.21875 -0.03125 0.28125q-0.015625 0.0625 -0.09375 0.109375q-0.0625 0.046875 -0.140625 0.046875q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.09375 -0.078125 -0.28125l0 -1.09375q0 -0.1875 0.0625 -0.265625q0.078125 -0.09375 0.203125 -0.09375q0.109375 0 0.1875 0.078125q0.09375 0.078125 0.09375 0.21875q0 0.296875 0.140625 0.484375q0.21875 0.3125 0.703125 0.515625q0.484375 0.1875 1.1875 0.1875q1.046875 0 1.546875 -0.375q0.515625 -0.390625 0.515625 -0.828125q0 -0.5 -0.515625 -0.796875q-0.515625 -0.296875 -1.515625 -0.390625q-0.984375 -0.109375 -1.421875 -0.265625q-0.4375 -0.171875 -0.671875 -0.5q-0.234375 -0.328125 -0.234375 -0.71875q0 -0.671875 0.671875 -1.078125q0.671875 -0.40625 1.59375 -0.40625q1.109375 0 1.796875 0.546875zm4.9575195 -0.359375l2.890625 0q0.1875 0 0.265625 0.078125q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.890625 0l0 3.546875q0 0.453125 0.359375 0.765625q0.375 0.3125 1.09375 0.3125q0.546875 0 1.171875 -0.15625q0.625 -0.15625 0.96875 -0.359375q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.09375 -0.078125 0.1875q-0.203125 0.203125 -1.0 0.453125q-0.78125 0.234375 -1.5 0.234375q-0.921875 0 -1.484375 -0.4375q-0.546875 -0.4375 -0.546875 -1.171875l0 -3.546875l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.984375 0l0 -1.578125q0 -0.1875 0.078125 -0.265625q0.078125 -0.078125 0.1875 -0.078125q0.125 0 0.203125 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.578125zm8.254395 0l0 1.34375q1.03125 -0.9375 1.546875 -1.203125q0.53125 -0.265625 0.96875 -0.265625q0.46875 0 0.875 0.328125q0.421875 0.3125 0.421875 0.46875q0 0.125 -0.09375 0.203125q-0.078125 0.078125 -0.1875 0.078125q-0.0625 0 -0.109375 -0.015625q-0.046875 -0.03125 -0.171875 -0.140625q-0.21875 -0.234375 -0.390625 -0.3125q-0.15625 -0.078125 -0.3125 -0.078125q-0.359375 0 -0.859375 0.28125q-0.484375 0.28125 -1.6875 1.359375l0 2.921875l2.359375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-4.1875 0q-0.1875 0 -0.28125 -0.0625q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.171875q0.09375 -0.078125 0.28125 -0.078125l1.296875 0l0 -4.4375l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.515625 0zm8.70752 -2.734375l0 1.375l-0.796875 0l0 -1.375l0.796875 0zm0.015625 2.734375l0 4.96875l2.09375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-4.71875 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l2.09375 0l0 -4.421875l-1.5625 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.078125 -0.078125 0.28125 -0.078125l2.09375 0zm9.73877 0.546875l0 -0.1875q0 -0.1875 0.078125 -0.265625q0.078125 -0.09375 0.1875 -0.09375q0.125 0 0.203125 0.09375q0.078125 0.078125 0.078125 0.265625l0 1.21875q-0.015625 0.1875 -0.09375 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.0625 -0.078125 -0.078125 -0.25q-0.03125 -0.4375 -0.59375 -0.84375q-0.546875 -0.40625 -1.5 -0.40625q-1.1875 0 -1.796875 0.75q-0.609375 0.734375 -0.609375 1.6875q0 1.03125 0.671875 1.703125q0.6875 0.671875 1.765625 0.671875q0.609375 0 1.25 -0.21875q0.65625 -0.234375 1.171875 -0.734375q0.140625 -0.140625 0.234375 -0.140625q0.109375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.265625 -0.640625 0.6875q-1.03125 0.671875 -2.296875 0.671875q-1.28125 0 -2.125 -0.8125q-0.828125 -0.828125 -0.828125 -2.09375q0 -1.28125 0.84375 -2.125q0.859375 -0.859375 2.140625 -0.859375q1.234375 0 2.0625 0.734375zm4.4887695 -0.546875l2.890625 0q0.1875 0 0.265625 0.078125q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.890625 0l0 3.546875q0 0.453125 0.359375 0.765625q0.375 0.3125 1.09375 0.3125q0.546875 0 1.171875 -0.15625q0.625 -0.15625 0.96875 -0.359375q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.09375 -0.078125 0.1875q-0.203125 0.203125 -1.0 0.453125q-0.78125 0.234375 -1.5 0.234375q-0.921875 0 -1.484375 -0.4375q-0.546875 -0.4375 -0.546875 -1.171875l0 -3.546875l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.984375 0l0 -1.578125q0 -0.1875 0.078125 -0.265625q0.078125 -0.078125 0.1875 -0.078125q0.125 0 0.203125 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.578125zm11.77002 2.875l-5.421875 0q0.125 1.03125 0.859375 1.671875q0.734375 0.625 1.796875 0.625q0.59375 0 1.25 -0.1875q0.65625 -0.203125 1.0625 -0.53125q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.109375 -0.09375 0.21875q-0.3125 0.3125 -1.09375 0.59375q-0.765625 0.265625 -1.59375 0.265625q-1.375 0 -2.296875 -0.890625q-0.90625 -0.90625 -0.90625 -2.171875q0 -1.171875 0.859375 -2.0q0.859375 -0.828125 2.125 -0.828125q1.3125 0 2.15625 0.859375q0.84375 0.84375 0.828125 2.203125zm-0.53125 -0.53125q-0.15625 -0.890625 -0.84375 -1.4375q-0.671875 -0.546875 -1.609375 -0.546875q-0.921875 0 -1.59375 0.546875q-0.671875 0.53125 -0.84375 1.4375l4.890625 0zm8.066895 -4.8125l0 7.4375l0.703125 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-1.25 0l0 -1.0625q-0.921875 1.265625 -2.34375 1.265625q-0.734375 0 -1.40625 -0.375q-0.65625 -0.390625 -1.046875 -1.09375q-0.375 -0.71875 -0.375 -1.46875q0 -0.765625 0.375 -1.46875q0.390625 -0.703125 1.046875 -1.09375q0.671875 -0.390625 1.40625 -0.390625q1.390625 0 2.34375 1.265625l0 -3.0l-0.703125 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.25 0zm-0.546875 5.234375q0 -1.015625 -0.6875 -1.703125q-0.671875 -0.703125 -1.625 -0.703125q-0.953125 0 -1.640625 0.703125q-0.6875 0.6875 -0.6875 1.703125q0 1.0 0.6875 1.703125q0.6875 0.703125 1.640625 0.703125q0.953125 0 1.625 -0.703125q0.6875 -0.703125 0.6875 -1.703125zm4.5825195 -0.3125l0 2.515625l1.828125 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.265625 0.078125l-3.09375 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l0.71875 0l0 -6.359375l-0.71875 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l3.109375 0q1.09375 0 1.78125 0.65625q0.703125 0.640625 0.703125 1.5q0 0.515625 -0.234375 0.9375q-0.21875 0.40625 -0.53125 0.640625q-0.484375 0.359375 -0.984375 0.515625q-0.375 0.125 -0.921875 0.125l-1.65625 0zm0 -0.53125l1.6875 0q0.59375 0 1.109375 -0.265625q0.515625 -0.265625 0.75 -0.640625q0.25 -0.390625 0.25 -0.78125q0 -0.625 -0.546875 -1.125q-0.53125 -0.5 -1.359375 -0.5l-1.890625 0l0 3.3125zm7.8637695 -1.921875l2.890625 0q0.1875 0 0.265625 0.078125q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.890625 0l0 3.546875q0 0.453125 0.359375 0.765625q0.375 0.3125 1.09375 0.3125q0.546875 0 1.171875 -0.15625q0.625 -0.15625 0.96875 -0.359375q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.09375 -0.078125 0.1875q-0.203125 0.203125 -1.0 0.453125q-0.78125 0.234375 -1.5 0.234375q-0.921875 0 -1.484375 -0.4375q-0.546875 -0.4375 -0.546875 -1.171875l0 -3.546875l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.984375 0l0 -1.578125q0 -0.1875 0.078125 -0.265625q0.078125 -0.078125 0.1875 -0.078125q0.125 0 0.203125 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.578125zm8.254395 0l0 1.34375q1.03125 -0.9375 1.546875 -1.203125q0.53125 -0.265625 0.96875 -0.265625q0.46875 0 0.875 0.328125q0.421875 0.3125 0.421875 0.46875q0 0.125 -0.09375 0.203125q-0.078125 0.078125 -0.1875 0.078125q-0.0625 0 -0.109375 -0.015625q-0.046875 -0.03125 -0.171875 -0.140625q-0.21875 -0.234375 -0.390625 -0.3125q-0.15625 -0.078125 -0.3125 -0.078125q-0.359375 0 -0.859375 0.28125q-0.484375 0.28125 -1.6875 1.359375l0 2.921875l2.359375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-4.1875 0q-0.1875 0 -0.28125 -0.0625q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.171875q0.09375 -0.078125 0.28125 -0.078125l1.296875 0l0 -4.4375l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.515625 0zm11.70752 1.796875l-5.75 3.21875q-0.140625 0.078125 -0.21875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.09375 -0.078125 -0.1875q0 -0.171875 0.21875 -0.28125l4.9375 -2.75l-4.9375 -2.734375q-0.203125 -0.125 -0.203125 -0.28125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.1875 -0.078125q0.0625 0 0.203125 0.078125l5.75 3.203125zm4.2856445 4.8125l0 -8.53125l-1.296875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.09375 -0.078125 0.28125 -0.078125l1.828125 0l0 9.609375l-1.828125 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.0625 -0.078125 -0.1875q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.296875 0z" fill-rule="nonzero"/><path fill="#000000" d="m631.56854 279.9945l-5.75 3.21875q-0.140625 0.078125 -0.21875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.09375 -0.078125 -0.1875q0 -0.171875 0.21875 -0.28125l4.9375 -2.75l-4.9375 -2.734375q-0.203125 -0.125 -0.203125 -0.28125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.1875 -0.078125q0.0625 0 0.203125 0.078125l5.75 3.203125zm3.4731445 1.78125l1.734375 0l-1.890625 3.515625q-0.171875 0.3125 -0.40625 0.3125q-0.15625 0 -0.28125 -0.109375q-0.109375 -0.109375 -0.109375 -0.265625q0 -0.078125 0.03125 -0.140625l0.921875 -3.3125z" fill-rule="nonzero"/><path fill="#000000" d="m627.00604 296.10388l0 3.0625l1.828125 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-3.078125 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l0.71875 0l0 -6.359375l-0.71875 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.09375 -0.203125q0.0625 -0.0625 0.25 -0.0625l5.875 0l0 1.828125q0 0.1875 -0.078125 0.28125q-0.078125 0.078125 -0.1875 0.078125q-0.125 0 -0.203125 -0.078125q-0.0625 -0.09375 -0.0625 -0.28125l0 -1.296875l-4.09375 0l0 2.765625l1.921875 0l0 -0.59375q0 -0.1875 0.0625 -0.265625q0.078125 -0.09375 0.203125 -0.09375q0.109375 0 0.1875 0.09375q0.078125 0.078125 0.078125 0.265625l0 1.734375q0 0.1875 -0.078125 0.28125q-0.078125 0.078125 -0.1875 0.078125q-0.125 0 -0.203125 -0.078125q-0.0625 -0.09375 -0.0625 -0.28125l0 -0.609375l-1.921875 0zm10.910645 3.59375l0 -0.78125q-1.078125 0.984375 -2.359375 0.984375q-0.78125 0 -1.1875 -0.421875q-0.515625 -0.5625 -0.515625 -1.296875l0 -3.4375l-0.71875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.25 0l0 3.984375q0 0.515625 0.328125 0.859375q0.328125 0.328125 0.828125 0.328125q1.296875 0 2.375 -1.1875l0 -3.4375l-0.984375 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l1.53125 0l0 4.96875l0.4375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-0.984375 0zm4.2543945 -5.5l0 0.8125q0.5625 -0.5625 1.015625 -0.78125q0.453125 -0.21875 1.015625 -0.21875q0.609375 0 1.109375 0.265625q0.359375 0.1875 0.640625 0.625q0.296875 0.4375 0.296875 0.90625l0 3.359375l0.453125 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.4375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.453125 0l0 -3.265625q0 -0.578125 -0.421875 -0.953125q-0.40625 -0.390625 -1.09375 -0.390625q-0.53125 0 -0.921875 0.21875q-0.390625 0.203125 -1.109375 1.046875l0 3.34375l0.609375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.734375 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l0.59375 0l0 -4.421875l-0.453125 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l0.984375 0zm11.754395 0.546875l0 -0.1875q0 -0.1875 0.078125 -0.265625q0.078125 -0.09375 0.1875 -0.09375q0.125 0 0.203125 0.09375q0.078125 0.078125 0.078125 0.265625l0 1.21875q-0.015625 0.1875 -0.09375 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.0625 -0.078125 -0.078125 -0.25q-0.03125 -0.4375 -0.59375 -0.84375q-0.546875 -0.40625 -1.5 -0.40625q-1.1875 0 -1.796875 0.75q-0.609375 0.734375 -0.609375 1.6875q0 1.03125 0.671875 1.703125q0.6875 0.671875 1.765625 0.671875q0.609375 0 1.25 -0.21875q0.65625 -0.234375 1.171875 -0.734375q0.140625 -0.140625 0.234375 -0.140625q0.109375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.265625 -0.640625 0.6875q-1.03125 0.671875 -2.296875 0.671875q-1.28125 0 -2.125 -0.8125q-0.828125 -0.828125 -0.828125 -2.09375q0 -1.28125 0.84375 -2.125q0.859375 -0.859375 2.140625 -0.859375q1.234375 0 2.0625 0.734375zm4.4887695 -0.546875l2.890625 0q0.1875 0 0.265625 0.078125q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.890625 0l0 3.546875q0 0.453125 0.359375 0.765625q0.375 0.3125 1.09375 0.3125q0.546875 0 1.171875 -0.15625q0.625 -0.15625 0.96875 -0.359375q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.09375 -0.078125 0.1875q-0.203125 0.203125 -1.0 0.453125q-0.78125 0.234375 -1.5 0.234375q-0.921875 0 -1.484375 -0.4375q-0.546875 -0.4375 -0.546875 -1.171875l0 -3.546875l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.984375 0l0 -1.578125q0 -0.1875 0.078125 -0.265625q0.078125 -0.078125 0.1875 -0.078125q0.125 0 0.203125 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.578125zm9.160645 -2.734375l0 1.375l-0.796875 0l0 -1.375l0.796875 0zm0.015625 2.734375l0 4.96875l2.09375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-4.71875 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l2.09375 0l0 -4.421875l-1.5625 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.078125 -0.078125 0.28125 -0.078125l2.09375 0zm10.48877 2.765625q0 1.21875 -0.875 2.078125q-0.859375 0.859375 -2.09375 0.859375q-1.25 0 -2.125 -0.859375q-0.859375 -0.875 -0.859375 -2.078125q0 -1.21875 0.859375 -2.078125q0.875 -0.875 2.125 -0.875q1.234375 0 2.09375 0.859375q0.875 0.859375 0.875 2.09375zm-0.53125 0q0 -1.0 -0.71875 -1.703125q-0.71875 -0.703125 -1.734375 -0.703125q-1.015625 0 -1.734375 0.703125q-0.703125 0.703125 -0.703125 1.703125q0 0.984375 0.703125 1.703125q0.71875 0.703125 1.734375 0.703125q1.015625 0 1.734375 -0.703125q0.71875 -0.703125 0.71875 -1.703125zm3.6293945 -2.765625l0 0.8125q0.5625 -0.5625 1.015625 -0.78125q0.453125 -0.21875 1.015625 -0.21875q0.609375 0 1.109375 0.265625q0.359375 0.1875 0.640625 0.625q0.296875 0.4375 0.296875 0.90625l0 3.359375l0.453125 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.4375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.453125 0l0 -3.265625q0 -0.578125 -0.421875 -0.953125q-0.40625 -0.390625 -1.09375 -0.390625q-0.53125 0 -0.921875 0.21875q-0.390625 0.203125 -1.109375 1.046875l0 3.34375l0.609375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.734375 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l0.59375 0l0 -4.421875l-0.453125 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l0.984375 0zm11.441895 -1.390625l0 -0.1875q0 -0.1875 0.0625 -0.265625q0.078125 -0.078125 0.203125 -0.078125q0.125 0 0.1875 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.359375q0 0.203125 -0.078125 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.125 0 -0.203125 -0.078125q-0.0625 -0.078125 -0.0625 -0.25q-0.03125 -0.53125 -0.5625 -0.953125q-0.515625 -0.421875 -1.34375 -0.421875q-0.890625 0 -1.40625 0.453125q-0.515625 0.453125 -0.515625 1.0625q0 0.328125 0.140625 0.59375q0.140625 0.25 0.375 0.421875q0.25 0.15625 0.546875 0.25q0.3125 0.09375 0.96875 0.203125q1.078125 0.1875 1.5 0.359375q0.546875 0.25 0.828125 0.6875q0.28125 0.4375 0.28125 1.03125q0 0.921875 -0.734375 1.5625q-0.71875 0.640625 -1.96875 0.640625q-1.375 0 -2.21875 -0.859375l0 0.296875q0 0.1875 -0.078125 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.09375 -0.078125 -0.28125l0 -1.46875q0 -0.203125 0.078125 -0.28125q0.078125 -0.078125 0.1875 -0.078125q0.125 0 0.1875 0.078125q0.078125 0.078125 0.078125 0.25q0.03125 0.578125 0.625 1.0625q0.59375 0.46875 1.59375 0.46875q1.015625 0 1.59375 -0.5q0.578125 -0.5 0.578125 -1.1875q0 -0.421875 -0.21875 -0.734375q-0.21875 -0.328125 -0.65625 -0.53125q-0.3125 -0.125 -1.28125 -0.296875q-1.328125 -0.21875 -1.90625 -0.671875q-0.578125 -0.453125 -0.578125 -1.296875q0 -0.84375 0.65625 -1.4375q0.671875 -0.609375 1.78125 -0.609375q1.109375 0 1.921875 0.703125zm3.8793945 1.390625l0 0.96875q0.484375 -0.578125 1.015625 -0.859375q0.546875 -0.296875 1.296875 -0.296875q0.78125 0 1.453125 0.375q0.671875 0.359375 1.03125 1.015625q0.359375 0.65625 0.359375 1.390625q0 1.140625 -0.828125 1.953125q-0.8125 0.8125 -2.015625 0.8125q-1.421875 0 -2.3125 -1.15625l0 3.21875l1.296875 0q0.1875 0 0.265625 0.0625q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.546875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.09375 -0.0625 0.28125 -0.0625l0.71875 0l0 -6.875l-0.71875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.25 0zm4.625 2.59375q0 -0.921875 -0.671875 -1.578125q-0.671875 -0.65625 -1.640625 -0.65625q-0.96875 0 -1.640625 0.65625q-0.671875 0.65625 -0.671875 1.578125q0 0.90625 0.671875 1.578125q0.671875 0.65625 1.640625 0.65625q0.96875 0 1.640625 -0.65625q0.671875 -0.65625 0.671875 -1.578125zm8.066895 0.28125l-5.421875 0q0.125 1.03125 0.859375 1.671875q0.734375 0.625 1.796875 0.625q0.59375 0 1.25 -0.1875q0.65625 -0.203125 1.0625 -0.53125q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.109375 -0.09375 0.21875q-0.3125 0.3125 -1.09375 0.59375q-0.765625 0.265625 -1.59375 0.265625q-1.375 0 -2.296875 -0.890625q-0.90625 -0.90625 -0.90625 -2.171875q0 -1.171875 0.859375 -2.0q0.859375 -0.828125 2.125 -0.828125q1.3125 0 2.15625 0.859375q0.84375 0.84375 0.828125 2.203125zm-0.53125 -0.53125q-0.15625 -0.890625 -0.84375 -1.4375q-0.671875 -0.546875 -1.609375 -0.546875q-0.921875 0 -1.59375 0.546875q-0.671875 0.53125 -0.84375 1.4375l4.890625 0zm7.6762695 -1.796875l0 -0.1875q0 -0.1875 0.078125 -0.265625q0.078125 -0.09375 0.1875 -0.09375q0.125 0 0.203125 0.09375q0.078125 0.078125 0.078125 0.265625l0 1.21875q-0.015625 0.1875 -0.09375 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.0625 -0.078125 -0.078125 -0.25q-0.03125 -0.4375 -0.59375 -0.84375q-0.546875 -0.40625 -1.5 -0.40625q-1.1875 0 -1.796875 0.75q-0.609375 0.734375 -0.609375 1.6875q0 1.03125 0.671875 1.703125q0.6875 0.671875 1.765625 0.671875q0.609375 0 1.25 -0.21875q0.65625 -0.234375 1.171875 -0.734375q0.140625 -0.140625 0.234375 -0.140625q0.109375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.265625 -0.640625 0.6875q-1.03125 0.671875 -2.296875 0.671875q-1.28125 0 -2.125 -0.8125q-0.828125 -0.828125 -0.828125 -2.09375q0 -1.28125 0.84375 -2.125q0.859375 -0.859375 2.140625 -0.859375q1.234375 0 2.0625 0.734375zm2.3012695 1.25l5.765625 -3.203125q0.140625 -0.078125 0.203125 -0.078125q0.109375 0 0.1875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.15625 -0.21875 0.28125l-4.9375 2.734375l4.9375 2.75q0.21875 0.109375 0.21875 0.28125q0 0.09375 -0.078125 0.1875q-0.078125 0.078125 -0.1875 0.078125q-0.078125 0 -0.21875 -0.078125l-5.75 -3.21875z" fill-rule="nonzero"/><path fill="#000000" d="m641.6867 307.8695l1.6875 0l-0.4375 3.078125q-0.046875 0.25 -0.15625 0.34375q-0.09375 0.09375 -0.25 0.09375q-0.15625 0 -0.265625 -0.09375q-0.09375 -0.09375 -0.125 -0.34375l-0.453125 -3.078125zm2.71875 0l1.6875 0l-0.4375 3.078125q-0.03125 0.25 -0.140625 0.34375q-0.09375 0.09375 -0.25 0.09375q-0.171875 0 -0.28125 -0.09375q-0.09375 -0.09375 -0.125 -0.34375l-0.453125 -3.078125zm4.8637695 2.328125l0 0.546875q0.6875 -0.734375 1.375 -0.734375q0.40625 0 0.71875 0.21875q0.3125 0.21875 0.515625 0.65625q0.359375 -0.4375 0.71875 -0.65625q0.375 -0.21875 0.734375 -0.21875q0.578125 0 0.921875 0.375q0.453125 0.484375 0.453125 1.046875l0 3.734375l0.453125 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-0.984375 0l0 -4.203125q0 -0.40625 -0.25 -0.671875q-0.25 -0.265625 -0.578125 -0.265625q-0.28125 0 -0.609375 0.21875q-0.328125 0.21875 -0.734375 0.859375l0 3.53125l0.4375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-0.984375 0l0 -4.171875q0 -0.421875 -0.25 -0.6875q-0.25 -0.28125 -0.5625 -0.28125q-0.28125 0 -0.5625 0.171875q-0.390625 0.265625 -0.8125 0.90625l0 3.53125l0.453125 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.4375 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l0.453125 0l0 -4.421875l-0.453125 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l0.984375 0zm13.11377 2.875l-5.421875 0q0.125 1.03125 0.859375 1.671875q0.734375 0.625 1.796875 0.625q0.59375 0 1.25 -0.1875q0.65625 -0.203125 1.0625 -0.53125q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.109375 -0.09375 0.21875q-0.3125 0.3125 -1.09375 0.59375q-0.765625 0.265625 -1.59375 0.265625q-1.375 0 -2.296875 -0.890625q-0.90625 -0.90625 -0.90625 -2.171875q0 -1.171875 0.859375 -2.0q0.859375 -0.828125 2.125 -0.828125q1.3125 0 2.15625 0.859375q0.84375 0.84375 0.828125 2.203125zm-0.53125 -0.53125q-0.15625 -0.890625 -0.84375 -1.4375q-0.671875 -0.546875 -1.609375 -0.546875q-0.921875 0 -1.59375 0.546875q-0.671875 0.53125 -0.84375 1.4375l4.890625 0zm3.0200195 -2.34375l0 0.546875q0.6875 -0.734375 1.375 -0.734375q0.40625 0 0.71875 0.21875q0.3125 0.21875 0.515625 0.65625q0.359375 -0.4375 0.71875 -0.65625q0.375 -0.21875 0.734375 -0.21875q0.578125 0 0.921875 0.375q0.453125 0.484375 0.453125 1.046875l0 3.734375l0.453125 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-0.984375 0l0 -4.203125q0 -0.40625 -0.25 -0.671875q-0.25 -0.265625 -0.578125 -0.265625q-0.28125 0 -0.609375 0.21875q-0.328125 0.21875 -0.734375 0.859375l0 3.53125l0.4375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-0.984375 0l0 -4.171875q0 -0.421875 -0.25 -0.6875q-0.25 -0.28125 -0.5625 -0.28125q-0.28125 0 -0.5625 0.171875q-0.390625 0.265625 -0.8125 0.90625l0 3.53125l0.453125 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.4375 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l0.453125 0l0 -4.421875l-0.453125 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l0.984375 0zm12.45752 0.546875l0 -0.1875q0 -0.1875 0.078125 -0.265625q0.078125 -0.09375 0.1875 -0.09375q0.125 0 0.203125 0.09375q0.078125 0.078125 0.078125 0.265625l0 1.21875q-0.015625 0.1875 -0.09375 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.0625 -0.078125 -0.078125 -0.25q-0.03125 -0.4375 -0.59375 -0.84375q-0.546875 -0.40625 -1.5 -0.40625q-1.1875 0 -1.796875 0.75q-0.609375 0.734375 -0.609375 1.6875q0 1.03125 0.671875 1.703125q0.6875 0.671875 1.765625 0.671875q0.609375 0 1.25 -0.21875q0.65625 -0.234375 1.171875 -0.734375q0.140625 -0.140625 0.234375 -0.140625q0.109375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.265625 -0.640625 0.6875q-1.03125 0.671875 -2.296875 0.671875q-1.28125 0 -2.125 -0.8125q-0.828125 -0.828125 -0.828125 -2.09375q0 -1.28125 0.84375 -2.125q0.859375 -0.859375 2.140625 -0.859375q1.234375 0 2.0625 0.734375zm3.5668945 -0.546875l0 0.96875q0.484375 -0.578125 1.015625 -0.859375q0.546875 -0.296875 1.296875 -0.296875q0.78125 0 1.453125 0.375q0.671875 0.359375 1.03125 1.015625q0.359375 0.65625 0.359375 1.390625q0 1.140625 -0.828125 1.953125q-0.8125 0.8125 -2.015625 0.8125q-1.421875 0 -2.3125 -1.15625l0 3.21875l1.296875 0q0.1875 0 0.265625 0.0625q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.546875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.09375 -0.0625 0.28125 -0.0625l0.71875 0l0 -6.875l-0.71875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.25 0zm4.625 2.59375q0 -0.921875 -0.671875 -1.578125q-0.671875 -0.65625 -1.640625 -0.65625q-0.96875 0 -1.640625 0.65625q-0.671875 0.65625 -0.671875 1.578125q0 0.90625 0.671875 1.578125q0.671875 0.65625 1.640625 0.65625q0.96875 0 1.640625 -0.65625q0.671875 -0.65625 0.671875 -1.578125zm5.2231445 2.90625l-2.484375 -4.953125l-0.15625 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.09375 0.03125 -0.15625q0.046875 -0.0625 0.109375 -0.09375q0.0625 -0.03125 0.203125 -0.03125l1.46875 0q0.1875 0 0.265625 0.078125q0.078125 0.078125 0.078125 0.203125q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.265625 0.078125l-0.71875 0l2.171875 4.375l2.140625 -4.375l-0.703125 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.453125 0q0.1875 0 0.265625 0.078125q0.09375 0.078125 0.09375 0.203125q0 0.078125 -0.0625 0.15625q-0.046875 0.0625 -0.109375 0.09375q-0.0625 0.015625 -0.359375 0.015625l-3.375 6.875l0.84375 0q0.1875 0 0.265625 0.0625q0.078125 0.078125 0.078125 0.203125q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.265625 0.078125l-3.078125 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.09375 -0.0625 0.28125 -0.0625l1.671875 0l0.9375 -1.921875zm5.5512695 -7.828125l1.6875 0l-0.4375 3.078125q-0.046875 0.25 -0.15625 0.34375q-0.09375 0.09375 -0.25 0.09375q-0.15625 0 -0.265625 -0.09375q-0.09375 -0.09375 -0.125 -0.34375l-0.453125 -3.078125zm2.71875 0l1.6875 0l-0.4375 3.078125q-0.03125 0.25 -0.140625 0.34375q-0.09375 0.09375 -0.25 0.09375q-0.171875 0 -0.28125 -0.09375q-0.09375 -0.09375 -0.125 -0.34375l-0.453125 -3.078125zm6.2387695 5.90625l1.734375 0l-1.890625 3.515625q-0.171875 0.3125 -0.40625 0.3125q-0.15625 0 -0.28125 -0.109375q-0.109375 -0.109375 -0.109375 -0.265625q0 -0.078125 0.03125 -0.140625l0.921875 -3.3125z" fill-rule="nonzero"/><path fill="#000000" d="m642.1711 328.38513l0 2.78125l0.984375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.234375 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l0.703125 0l0 -6.359375l-0.703125 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l3.21875 0q1.0 0 1.671875 0.640625q0.6875 0.625 0.6875 1.40625q0 0.578125 -0.421875 1.078125q-0.421875 0.5 -1.40625 0.84375q0.5625 0.390625 0.96875 0.890625q0.40625 0.5 1.296875 2.03125l0.40625 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-0.703125 0q-0.984375 -1.765625 -1.53125 -2.375q-0.546875 -0.609375 -1.25 -0.9375l-1.6875 0zm0 -0.53125l1.453125 0q0.6875 0 1.25 -0.25q0.578125 -0.265625 0.828125 -0.609375q0.265625 -0.34375 0.265625 -0.6875q0 -0.53125 -0.546875 -1.015625q-0.53125 -0.484375 -1.296875 -0.484375l-1.953125 0l0 3.046875zm12.410645 1.21875l-5.421875 0q0.125 1.03125 0.859375 1.671875q0.734375 0.625 1.796875 0.625q0.59375 0 1.25 -0.1875q0.65625 -0.203125 1.0625 -0.53125q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.109375 -0.09375 0.21875q-0.3125 0.3125 -1.09375 0.59375q-0.765625 0.265625 -1.59375 0.265625q-1.375 0 -2.296875 -0.890625q-0.90625 -0.90625 -0.90625 -2.171875q0 -1.171875 0.859375 -2.0q0.859375 -0.828125 2.125 -0.828125q1.3125 0 2.15625 0.859375q0.84375 0.84375 0.828125 2.203125zm-0.53125 -0.53125q-0.15625 -0.890625 -0.84375 -1.4375q-0.671875 -0.546875 -1.609375 -0.546875q-0.921875 0 -1.59375 0.546875q-0.671875 0.53125 -0.84375 1.4375l4.890625 0zm4.3637695 -2.34375l2.890625 0q0.1875 0 0.265625 0.078125q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.890625 0l0 3.546875q0 0.453125 0.359375 0.765625q0.375 0.3125 1.09375 0.3125q0.546875 0 1.171875 -0.15625q0.625 -0.15625 0.96875 -0.359375q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.09375 -0.078125 0.1875q-0.203125 0.203125 -1.0 0.453125q-0.78125 0.234375 -1.5 0.234375q-0.921875 0 -1.484375 -0.4375q-0.546875 -0.4375 -0.546875 -1.171875l0 -3.546875l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.984375 0l0 -1.578125q0 -0.1875 0.078125 -0.265625q0.078125 -0.078125 0.1875 -0.078125q0.125 0 0.203125 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.578125zm9.285645 5.5l-0.734375 0l-2.6875 -6.890625l-0.421875 0q-0.140625 0 -0.203125 -0.03125q-0.0625 -0.03125 -0.109375 -0.09375q-0.03125 -0.0625 -0.03125 -0.140625q0 -0.078125 0.03125 -0.140625q0.046875 -0.078125 0.109375 -0.09375q0.0625 -0.03125 0.203125 -0.03125l1.984375 0q0.15625 0 0.21875 0.03125q0.0625 0.015625 0.09375 0.09375q0.046875 0.0625 0.046875 0.140625q0 0.078125 -0.046875 0.140625q-0.046875 0.0625 -0.109375 0.09375q-0.046875 0.03125 -0.203125 0.03125l-1.015625 0l2.46875 6.359375l0.046875 0l2.4375 -6.359375l-1.015625 0q-0.140625 0 -0.21875 -0.03125q-0.0625 -0.03125 -0.109375 -0.09375q-0.03125 -0.0625 -0.03125 -0.140625q0 -0.078125 0.046875 -0.140625q0.046875 -0.078125 0.109375 -0.09375q0.0625 -0.03125 0.203125 -0.03125l1.984375 0q0.15625 0 0.21875 0.03125q0.0625 0.015625 0.09375 0.09375q0.046875 0.0625 0.046875 0.140625q0 0.078125 -0.046875 0.140625q-0.03125 0.0625 -0.09375 0.09375q-0.0625 0.03125 -0.21875 0.03125l-0.40625 0l-2.640625 6.890625zm8.941895 0l0 -0.765625q-1.171875 0.96875 -2.484375 0.96875q-0.953125 0 -1.5 -0.484375q-0.53125 -0.484375 -0.53125 -1.1875q0 -0.765625 0.703125 -1.34375q0.71875 -0.578125 2.078125 -0.578125q0.359375 0 0.796875 0.046875q0.4375 0.046875 0.9375 0.140625l0 -0.859375q0 -0.4375 -0.40625 -0.75q-0.40625 -0.328125 -1.21875 -0.328125q-0.625 0 -1.75 0.359375q-0.203125 0.0625 -0.265625 0.0625q-0.09375 0 -0.171875 -0.078125q-0.0625 -0.078125 -0.0625 -0.1875q0 -0.109375 0.0625 -0.171875q0.078125 -0.09375 0.71875 -0.265625q0.984375 -0.265625 1.484375 -0.265625q1.015625 0 1.578125 0.5q0.5625 0.5 0.5625 1.125l0 3.53125l0.71875 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.25 0zm0 -2.65625q-0.375 -0.109375 -0.796875 -0.15625q-0.421875 -0.046875 -0.875 -0.046875q-1.171875 0 -1.828125 0.5q-0.484375 0.375 -0.484375 0.890625q0 0.484375 0.375 0.8125q0.375 0.328125 1.09375 0.328125q0.703125 0 1.296875 -0.265625q0.59375 -0.28125 1.21875 -0.890625l0 -1.171875zm6.5356445 -5.3125l0 7.4375l2.09375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-4.71875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l2.09375 0l0 -6.890625l-1.546875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l2.078125 0zm9.441895 1.078125l0 -0.1875q0 -0.1875 0.0625 -0.265625q0.078125 -0.078125 0.203125 -0.078125q0.125 0 0.1875 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.359375q0 0.203125 -0.078125 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.125 0 -0.203125 -0.078125q-0.0625 -0.078125 -0.0625 -0.25q-0.03125 -0.53125 -0.5625 -0.953125q-0.515625 -0.421875 -1.34375 -0.421875q-0.890625 0 -1.40625 0.453125q-0.515625 0.453125 -0.515625 1.0625q0 0.328125 0.140625 0.59375q0.140625 0.25 0.375 0.421875q0.25 0.15625 0.546875 0.25q0.3125 0.09375 0.96875 0.203125q1.078125 0.1875 1.5 0.359375q0.546875 0.25 0.828125 0.6875q0.28125 0.4375 0.28125 1.03125q0 0.921875 -0.734375 1.5625q-0.71875 0.640625 -1.96875 0.640625q-1.375 0 -2.21875 -0.859375l0 0.296875q0 0.1875 -0.078125 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.09375 -0.078125 -0.28125l0 -1.46875q0 -0.203125 0.078125 -0.28125q0.078125 -0.078125 0.1875 -0.078125q0.125 0 0.1875 0.078125q0.078125 0.078125 0.078125 0.25q0.03125 0.578125 0.625 1.0625q0.59375 0.46875 1.59375 0.46875q1.015625 0 1.59375 -0.5q0.578125 -0.5 0.578125 -1.1875q0 -0.421875 -0.21875 -0.734375q-0.21875 -0.328125 -0.65625 -0.53125q-0.3125 -0.125 -1.28125 -0.296875q-1.328125 -0.21875 -1.90625 -0.671875q-0.578125 -0.453125 -0.578125 -1.296875q0 -0.84375 0.65625 -1.4375q0.671875 -0.609375 1.78125 -0.609375q1.109375 0 1.921875 0.703125zm3.8793945 1.390625l0 0.96875q0.484375 -0.578125 1.015625 -0.859375q0.546875 -0.296875 1.296875 -0.296875q0.78125 0 1.453125 0.375q0.671875 0.359375 1.03125 1.015625q0.359375 0.65625 0.359375 1.390625q0 1.140625 -0.828125 1.953125q-0.8125 0.8125 -2.015625 0.8125q-1.421875 0 -2.3125 -1.15625l0 3.21875l1.296875 0q0.1875 0 0.265625 0.0625q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.546875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.09375 -0.0625 0.28125 -0.0625l0.71875 0l0 -6.875l-0.71875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.25 0zm4.625 2.59375q0 -0.921875 -0.671875 -1.578125q-0.671875 -0.65625 -1.640625 -0.65625q-0.96875 0 -1.640625 0.65625q-0.671875 0.65625 -0.671875 1.578125q0 0.90625 0.671875 1.578125q0.671875 0.65625 1.640625 0.65625q0.96875 0 1.640625 -0.65625q0.671875 -0.65625 0.671875 -1.578125zm8.066895 0.28125l-5.421875 0q0.125 1.03125 0.859375 1.671875q0.734375 0.625 1.796875 0.625q0.59375 0 1.25 -0.1875q0.65625 -0.203125 1.0625 -0.53125q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.109375 -0.09375 0.21875q-0.3125 0.3125 -1.09375 0.59375q-0.765625 0.265625 -1.59375 0.265625q-1.375 0 -2.296875 -0.890625q-0.90625 -0.90625 -0.90625 -2.171875q0 -1.171875 0.859375 -2.0q0.859375 -0.828125 2.125 -0.828125q1.3125 0 2.15625 0.859375q0.84375 0.84375 0.828125 2.203125zm-0.53125 -0.53125q-0.15625 -0.890625 -0.84375 -1.4375q-0.671875 -0.546875 -1.609375 -0.546875q-0.921875 0 -1.59375 0.546875q-0.671875 0.53125 -0.84375 1.4375l4.890625 0zm7.6762695 -1.796875l0 -0.1875q0 -0.1875 0.078125 -0.265625q0.078125 -0.09375 0.1875 -0.09375q0.125 0 0.203125 0.09375q0.078125 0.078125 0.078125 0.265625l0 1.21875q-0.015625 0.1875 -0.09375 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.0625 -0.078125 -0.078125 -0.25q-0.03125 -0.4375 -0.59375 -0.84375q-0.546875 -0.40625 -1.5 -0.40625q-1.1875 0 -1.796875 0.75q-0.609375 0.734375 -0.609375 1.6875q0 1.03125 0.671875 1.703125q0.6875 0.671875 1.765625 0.671875q0.609375 0 1.25 -0.21875q0.65625 -0.234375 1.171875 -0.734375q0.140625 -0.140625 0.234375 -0.140625q0.109375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.265625 -0.640625 0.6875q-1.03125 0.671875 -2.296875 0.671875q-1.28125 0 -2.125 -0.8125q-0.828125 -0.828125 -0.828125 -2.09375q0 -1.28125 0.84375 -2.125q0.859375 -0.859375 2.140625 -0.859375q1.234375 0 2.0625 0.734375zm2.3012695 1.25l5.765625 -3.203125q0.140625 -0.078125 0.203125 -0.078125q0.109375 0 0.1875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.15625 -0.21875 0.28125l-4.9375 2.734375l4.9375 2.75q0.21875 0.109375 0.21875 0.28125q0 0.09375 -0.078125 0.1875q-0.078125 0.078125 -0.1875 0.078125q-0.078125 0 -0.21875 -0.078125l-5.75 -3.21875zm11.473145 3.703125l-0.734375 0l-2.6875 -6.890625l-0.421875 0q-0.140625 0 -0.203125 -0.03125q-0.0625 -0.03125 -0.109375 -0.09375q-0.03125 -0.0625 -0.03125 -0.140625q0 -0.078125 0.03125 -0.140625q0.046875 -0.078125 0.109375 -0.09375q0.0625 -0.03125 0.203125 -0.03125l1.984375 0q0.15625 0 0.21875 0.03125q0.0625 0.015625 0.09375 0.09375q0.046875 0.0625 0.046875 0.140625q0 0.078125 -0.046875 0.140625q-0.046875 0.0625 -0.109375 0.09375q-0.046875 0.03125 -0.203125 0.03125l-1.015625 0l2.46875 6.359375l0.046875 0l2.4375 -6.359375l-1.015625 0q-0.140625 0 -0.21875 -0.03125q-0.0625 -0.03125 -0.109375 -0.09375q-0.03125 -0.0625 -0.03125 -0.140625q0 -0.078125 0.046875 -0.140625q0.046875 -0.078125 0.109375 -0.09375q0.0625 -0.03125 0.203125 -0.03125l1.984375 0q0.15625 0 0.21875 0.03125q0.0625 0.015625 0.09375 0.09375q0.046875 0.0625 0.046875 0.140625q0 0.078125 -0.046875 0.140625q-0.03125 0.0625 -0.09375 0.09375q-0.0625 0.03125 -0.21875 0.03125l-0.40625 0l-2.640625 6.890625zm10.379395 -2.734375q0 1.21875 -0.875 2.078125q-0.859375 0.859375 -2.09375 0.859375q-1.25 0 -2.125 -0.859375q-0.859375 -0.875 -0.859375 -2.078125q0 -1.21875 0.859375 -2.078125q0.875 -0.875 2.125 -0.875q1.234375 0 2.09375 0.859375q0.875 0.859375 0.875 2.09375zm-0.53125 0q0 -1.0 -0.71875 -1.703125q-0.71875 -0.703125 -1.734375 -0.703125q-1.015625 0 -1.734375 0.703125q-0.703125 0.703125 -0.703125 1.703125q0 0.984375 0.703125 1.703125q0.71875 0.703125 1.734375 0.703125q1.015625 0 1.734375 -0.703125q0.71875 -0.703125 0.71875 -1.703125zm5.6293945 -5.5l0 1.375l-0.796875 0l0 -1.375l0.796875 0zm0.015625 2.734375l0 4.96875l2.09375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-4.71875 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l2.09375 0l0 -4.421875l-1.5625 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.078125 -0.078125 0.28125 -0.078125l2.09375 0zm10.129395 -2.46875l0 7.4375l0.703125 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-1.25 0l0 -1.0625q-0.921875 1.265625 -2.34375 1.265625q-0.734375 0 -1.40625 -0.375q-0.65625 -0.390625 -1.046875 -1.09375q-0.375 -0.71875 -0.375 -1.46875q0 -0.765625 0.375 -1.46875q0.390625 -0.703125 1.046875 -1.09375q0.671875 -0.390625 1.40625 -0.390625q1.390625 0 2.34375 1.265625l0 -3.0l-0.703125 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.25 0zm-0.546875 5.234375q0 -1.015625 -0.6875 -1.703125q-0.671875 -0.703125 -1.625 -0.703125q-0.953125 0 -1.640625 0.703125q-0.6875 0.6875 -0.6875 1.703125q0 1.0 0.6875 1.703125q0.6875 0.703125 1.640625 0.703125q0.953125 0 1.625 -0.703125q0.6875 -0.703125 0.6875 -1.703125zm4.5825195 -0.3125l0 2.515625l1.828125 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.265625 0.078125l-3.09375 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l0.71875 0l0 -6.359375l-0.71875 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l3.109375 0q1.09375 0 1.78125 0.65625q0.703125 0.640625 0.703125 1.5q0 0.515625 -0.234375 0.9375q-0.21875 0.40625 -0.53125 0.640625q-0.484375 0.359375 -0.984375 0.515625q-0.375 0.125 -0.921875 0.125l-1.65625 0zm0 -0.53125l1.6875 0q0.59375 0 1.109375 -0.265625q0.515625 -0.265625 0.75 -0.640625q0.25 -0.390625 0.25 -0.78125q0 -0.625 -0.546875 -1.125q-0.53125 -0.5 -1.359375 -0.5l-1.890625 0l0 3.3125zm7.8637695 -1.921875l2.890625 0q0.1875 0 0.265625 0.078125q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.890625 0l0 3.546875q0 0.453125 0.359375 0.765625q0.375 0.3125 1.09375 0.3125q0.546875 0 1.171875 -0.15625q0.625 -0.15625 0.96875 -0.359375q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.09375 -0.078125 0.1875q-0.203125 0.203125 -1.0 0.453125q-0.78125 0.234375 -1.5 0.234375q-0.921875 0 -1.484375 -0.4375q-0.546875 -0.4375 -0.546875 -1.171875l0 -3.546875l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.984375 0l0 -1.578125q0 -0.1875 0.078125 -0.265625q0.078125 -0.078125 0.1875 -0.078125q0.125 0 0.203125 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.578125zm8.254395 0l0 1.34375q1.03125 -0.9375 1.546875 -1.203125q0.53125 -0.265625 0.96875 -0.265625q0.46875 0 0.875 0.328125q0.421875 0.3125 0.421875 0.46875q0 0.125 -0.09375 0.203125q-0.078125 0.078125 -0.1875 0.078125q-0.0625 0 -0.109375 -0.015625q-0.046875 -0.03125 -0.171875 -0.140625q-0.21875 -0.234375 -0.390625 -0.3125q-0.15625 -0.078125 -0.3125 -0.078125q-0.359375 0 -0.859375 0.28125q-0.484375 0.28125 -1.6875 1.359375l0 2.921875l2.359375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-4.1875 0q-0.1875 0 -0.28125 -0.0625q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.171875q0.09375 -0.078125 0.28125 -0.078125l1.296875 0l0 -4.4375l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.515625 0zm11.70752 1.796875l-5.75 3.21875q-0.140625 0.078125 -0.21875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.09375 -0.078125 -0.1875q0 -0.171875 0.21875 -0.28125l4.9375 -2.75l-4.9375 -2.734375q-0.203125 -0.125 -0.203125 -0.28125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.1875 -0.078125q0.0625 0 0.203125 0.078125l5.75 3.203125zm3.4731445 1.78125l1.734375 0l-1.890625 3.515625q-0.171875 0.3125 -0.40625 0.3125q-0.15625 0 -0.28125 -0.109375q-0.109375 -0.109375 -0.109375 -0.265625q0 -0.078125 0.03125 -0.140625l0.921875 -3.3125z" fill-rule="nonzero"/><path fill="#000000" d="m644.1711 340.27576l0 8.53125l1.296875 0q0.1875 0 0.265625 0.0625q0.09375 0.078125 0.09375 0.203125q0 0.125 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.828125 0l0 -9.609375l1.828125 0q0.1875 0 0.265625 0.078125q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.296875 0zm9.285645 4.9375l-3.5 0l-0.71875 1.953125l1.015625 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.984375 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l0.40625 0l2.359375 -6.359375l-1.578125 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l2.6875 0l2.59375 6.890625l0.421875 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.984375 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.015625 0l-0.734375 -1.953125zm-0.203125 -0.53125l-1.46875 -3.875l-0.203125 0l-1.421875 3.875l3.09375 0zm5.6137695 -2.484375l0 1.34375q1.03125 -0.9375 1.546875 -1.203125q0.53125 -0.265625 0.96875 -0.265625q0.46875 0 0.875 0.328125q0.421875 0.3125 0.421875 0.46875q0 0.125 -0.09375 0.203125q-0.078125 0.078125 -0.1875 0.078125q-0.0625 0 -0.109375 -0.015625q-0.046875 -0.03125 -0.171875 -0.140625q-0.21875 -0.234375 -0.390625 -0.3125q-0.15625 -0.078125 -0.3125 -0.078125q-0.359375 0 -0.859375 0.28125q-0.484375 0.28125 -1.6875 1.359375l0 2.921875l2.359375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-4.1875 0q-0.1875 0 -0.28125 -0.0625q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.171875q0.09375 -0.078125 0.28125 -0.078125l1.296875 0l0 -4.4375l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.515625 0zm10.223145 0.984375l0 -0.984375l1.25 0q0.203125 0 0.28125 0.078125q0.078125 0.078125 0.078125 0.203125q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-0.703125 0l0 5.328125q0 0.53125 -0.234375 0.953125q-0.15625 0.265625 -0.515625 0.5625q-0.34375 0.3125 -0.640625 0.4375q-0.296875 0.125 -0.78125 0.125l-1.515625 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.078125 -0.078125 0.265625 -0.078125l1.53125 0.015625q0.46875 0 0.84375 -0.25q0.390625 -0.234375 0.625 -0.703125q0.140625 -0.265625 0.140625 -0.671875l0 -1.609375q-0.84375 1.171875 -2.203125 1.171875q-1.09375 0 -1.890625 -0.8125q-0.796875 -0.8125 -0.796875 -1.953125q0 -1.15625 0.796875 -1.96875q0.796875 -0.8125 1.890625 -0.8125q1.359375 0 2.203125 1.171875zm0 1.609375q0 -0.953125 -0.640625 -1.59375q-0.640625 -0.640625 -1.53125 -0.640625q-0.90625 0 -1.546875 0.65625q-0.640625 0.640625 -0.640625 1.578125q0 0.9375 0.640625 1.59375q0.640625 0.640625 1.546875 0.640625q0.890625 0 1.53125 -0.640625q0.640625 -0.65625 0.640625 -1.59375zm7.9262695 -3.984375l0 -0.1875q0 -0.1875 0.0625 -0.265625q0.078125 -0.078125 0.203125 -0.078125q0.125 0 0.1875 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.359375q0 0.203125 -0.078125 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.125 0 -0.203125 -0.078125q-0.0625 -0.078125 -0.0625 -0.25q-0.03125 -0.53125 -0.5625 -0.953125q-0.515625 -0.421875 -1.34375 -0.421875q-0.890625 0 -1.40625 0.453125q-0.515625 0.453125 -0.515625 1.0625q0 0.328125 0.140625 0.59375q0.140625 0.25 0.375 0.421875q0.25 0.15625 0.546875 0.25q0.3125 0.09375 0.96875 0.203125q1.078125 0.1875 1.5 0.359375q0.546875 0.25 0.828125 0.6875q0.28125 0.4375 0.28125 1.03125q0 0.921875 -0.734375 1.5625q-0.71875 0.640625 -1.96875 0.640625q-1.375 0 -2.21875 -0.859375l0 0.296875q0 0.1875 -0.078125 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.09375 -0.078125 -0.28125l0 -1.46875q0 -0.203125 0.078125 -0.28125q0.078125 -0.078125 0.1875 -0.078125q0.125 0 0.1875 0.078125q0.078125 0.078125 0.078125 0.25q0.03125 0.578125 0.625 1.0625q0.59375 0.46875 1.59375 0.46875q1.015625 0 1.59375 -0.5q0.578125 -0.5 0.578125 -1.1875q0 -0.421875 -0.21875 -0.734375q-0.21875 -0.328125 -0.65625 -0.53125q-0.3125 -0.125 -1.28125 -0.296875q-1.328125 -0.21875 -1.90625 -0.671875q-0.578125 -0.453125 -0.578125 -1.296875q0 -0.84375 0.65625 -1.4375q0.671875 -0.609375 1.78125 -0.609375q1.109375 0 1.921875 0.703125zm3.8793945 1.390625l0 0.96875q0.484375 -0.578125 1.015625 -0.859375q0.546875 -0.296875 1.296875 -0.296875q0.78125 0 1.453125 0.375q0.671875 0.359375 1.03125 1.015625q0.359375 0.65625 0.359375 1.390625q0 1.140625 -0.828125 1.953125q-0.8125 0.8125 -2.015625 0.8125q-1.421875 0 -2.3125 -1.15625l0 3.21875l1.296875 0q0.1875 0 0.265625 0.0625q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.546875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.09375 -0.0625 0.28125 -0.0625l0.71875 0l0 -6.875l-0.71875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.25 0zm4.625 2.59375q0 -0.921875 -0.671875 -1.578125q-0.671875 -0.65625 -1.640625 -0.65625q-0.96875 0 -1.640625 0.65625q-0.671875 0.65625 -0.671875 1.578125q0 0.90625 0.671875 1.578125q0.671875 0.65625 1.640625 0.65625q0.96875 0 1.640625 -0.65625q0.671875 -0.65625 0.671875 -1.578125zm8.066895 0.28125l-5.421875 0q0.125 1.03125 0.859375 1.671875q0.734375 0.625 1.796875 0.625q0.59375 0 1.25 -0.1875q0.65625 -0.203125 1.0625 -0.53125q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.109375 -0.09375 0.21875q-0.3125 0.3125 -1.09375 0.59375q-0.765625 0.265625 -1.59375 0.265625q-1.375 0 -2.296875 -0.890625q-0.90625 -0.90625 -0.90625 -2.171875q0 -1.171875 0.859375 -2.0q0.859375 -0.828125 2.125 -0.828125q1.3125 0 2.15625 0.859375q0.84375 0.84375 0.828125 2.203125zm-0.53125 -0.53125q-0.15625 -0.890625 -0.84375 -1.4375q-0.671875 -0.546875 -1.609375 -0.546875q-0.921875 0 -1.59375 0.546875q-0.671875 0.53125 -0.84375 1.4375l4.890625 0zm7.6762695 -1.796875l0 -0.1875q0 -0.1875 0.078125 -0.265625q0.078125 -0.09375 0.1875 -0.09375q0.125 0 0.203125 0.09375q0.078125 0.078125 0.078125 0.265625l0 1.21875q-0.015625 0.1875 -0.09375 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.0625 -0.078125 -0.078125 -0.25q-0.03125 -0.4375 -0.59375 -0.84375q-0.546875 -0.40625 -1.5 -0.40625q-1.1875 0 -1.796875 0.75q-0.609375 0.734375 -0.609375 1.6875q0 1.03125 0.671875 1.703125q0.6875 0.671875 1.765625 0.671875q0.609375 0 1.25 -0.21875q0.65625 -0.234375 1.171875 -0.734375q0.140625 -0.140625 0.234375 -0.140625q0.109375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.265625 -0.640625 0.6875q-1.03125 0.671875 -2.296875 0.671875q-1.28125 0 -2.125 -0.8125q-0.828125 -0.828125 -0.828125 -2.09375q0 -1.28125 0.84375 -2.125q0.859375 -0.859375 2.140625 -0.859375q1.234375 0 2.0625 0.734375zm2.3012695 1.25l5.765625 -3.203125q0.140625 -0.078125 0.203125 -0.078125q0.109375 0 0.1875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.15625 -0.21875 0.28125l-4.9375 2.734375l4.9375 2.75q0.21875 0.109375 0.21875 0.28125q0 0.09375 -0.078125 0.1875q-0.078125 0.078125 -0.1875 0.078125q-0.078125 0 -0.21875 -0.078125l-5.75 -3.21875zm11.473145 3.703125l-0.734375 0l-2.6875 -6.890625l-0.421875 0q-0.140625 0 -0.203125 -0.03125q-0.0625 -0.03125 -0.109375 -0.09375q-0.03125 -0.0625 -0.03125 -0.140625q0 -0.078125 0.03125 -0.140625q0.046875 -0.078125 0.109375 -0.09375q0.0625 -0.03125 0.203125 -0.03125l1.984375 0q0.15625 0 0.21875 0.03125q0.0625 0.015625 0.09375 0.09375q0.046875 0.0625 0.046875 0.140625q0 0.078125 -0.046875 0.140625q-0.046875 0.0625 -0.109375 0.09375q-0.046875 0.03125 -0.203125 0.03125l-1.015625 0l2.46875 6.359375l0.046875 0l2.4375 -6.359375l-1.015625 0q-0.140625 0 -0.21875 -0.03125q-0.0625 -0.03125 -0.109375 -0.09375q-0.03125 -0.0625 -0.03125 -0.140625q0 -0.078125 0.046875 -0.140625q0.046875 -0.078125 0.109375 -0.09375q0.0625 -0.03125 0.203125 -0.03125l1.984375 0q0.15625 0 0.21875 0.03125q0.0625 0.015625 0.09375 0.09375q0.046875 0.0625 0.046875 0.140625q0 0.078125 -0.046875 0.140625q-0.03125 0.0625 -0.09375 0.09375q-0.0625 0.03125 -0.21875 0.03125l-0.40625 0l-2.640625 6.890625zm10.379395 -2.734375q0 1.21875 -0.875 2.078125q-0.859375 0.859375 -2.09375 0.859375q-1.25 0 -2.125 -0.859375q-0.859375 -0.875 -0.859375 -2.078125q0 -1.21875 0.859375 -2.078125q0.875 -0.875 2.125 -0.875q1.234375 0 2.09375 0.859375q0.875 0.859375 0.875 2.09375zm-0.53125 0q0 -1.0 -0.71875 -1.703125q-0.71875 -0.703125 -1.734375 -0.703125q-1.015625 0 -1.734375 0.703125q-0.703125 0.703125 -0.703125 1.703125q0 0.984375 0.703125 1.703125q0.71875 0.703125 1.734375 0.703125q1.015625 0 1.734375 -0.703125q0.71875 -0.703125 0.71875 -1.703125zm5.6293945 -5.5l0 1.375l-0.796875 0l0 -1.375l0.796875 0zm0.015625 2.734375l0 4.96875l2.09375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-4.71875 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l2.09375 0l0 -4.421875l-1.5625 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.078125 -0.078125 0.28125 -0.078125l2.09375 0zm10.129395 -2.46875l0 7.4375l0.703125 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-1.25 0l0 -1.0625q-0.921875 1.265625 -2.34375 1.265625q-0.734375 0 -1.40625 -0.375q-0.65625 -0.390625 -1.046875 -1.09375q-0.375 -0.71875 -0.375 -1.46875q0 -0.765625 0.375 -1.46875q0.390625 -0.703125 1.046875 -1.09375q0.671875 -0.390625 1.40625 -0.390625q1.390625 0 2.34375 1.265625l0 -3.0l-0.703125 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.25 0zm-0.546875 5.234375q0 -1.015625 -0.6875 -1.703125q-0.671875 -0.703125 -1.625 -0.703125q-0.953125 0 -1.640625 0.703125q-0.6875 0.6875 -0.6875 1.703125q0 1.0 0.6875 1.703125q0.6875 0.703125 1.640625 0.703125q0.953125 0 1.625 -0.703125q0.6875 -0.703125 0.6875 -1.703125zm4.0043945 -0.578125l0 2.78125l0.984375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.234375 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l0.703125 0l0 -6.359375l-0.703125 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l3.21875 0q1.0 0 1.671875 0.640625q0.6875 0.625 0.6875 1.40625q0 0.578125 -0.421875 1.078125q-0.421875 0.5 -1.40625 0.84375q0.5625 0.390625 0.96875 0.890625q0.40625 0.5 1.296875 2.03125l0.40625 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-0.703125 0q-0.984375 -1.765625 -1.53125 -2.375q-0.546875 -0.609375 -1.25 -0.9375l-1.6875 0zm0 -0.53125l1.453125 0q0.6875 0 1.25 -0.25q0.578125 -0.265625 0.828125 -0.609375q0.265625 -0.34375 0.265625 -0.6875q0 -0.53125 -0.546875 -1.015625q-0.53125 -0.484375 -1.296875 -0.484375l-1.953125 0l0 3.046875zm12.410645 1.21875l-5.421875 0q0.125 1.03125 0.859375 1.671875q0.734375 0.625 1.796875 0.625q0.59375 0 1.25 -0.1875q0.65625 -0.203125 1.0625 -0.53125q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.109375 -0.09375 0.21875q-0.3125 0.3125 -1.09375 0.59375q-0.765625 0.265625 -1.59375 0.265625q-1.375 0 -2.296875 -0.890625q-0.90625 -0.90625 -0.90625 -2.171875q0 -1.171875 0.859375 -2.0q0.859375 -0.828125 2.125 -0.828125q1.3125 0 2.15625 0.859375q0.84375 0.84375 0.828125 2.203125zm-0.53125 -0.53125q-0.15625 -0.890625 -0.84375 -1.4375q-0.671875 -0.546875 -1.609375 -0.546875q-0.921875 0 -1.59375 0.546875q-0.671875 0.53125 -0.84375 1.4375l4.890625 0zm7.2075195 -1.984375q0 -0.1875 0.078125 -0.265625q0.078125 -0.09375 0.1875 -0.09375q0.125 0 0.203125 0.09375q0.078125 0.078125 0.078125 0.265625l0 0.921875q0 0.1875 -0.078125 0.28125q-0.078125 0.078125 -0.203125 0.078125q-0.09375 0 -0.171875 -0.0625q-0.078125 -0.078125 -0.09375 -0.25q-0.03125 -0.375 -0.390625 -0.625q-0.515625 -0.34375 -1.375 -0.34375q-0.890625 0 -1.390625 0.359375q-0.375 0.265625 -0.375 0.609375q0 0.375 0.453125 0.625q0.296875 0.1875 1.140625 0.28125q1.125 0.109375 1.546875 0.265625q0.625 0.21875 0.921875 0.625q0.296875 0.390625 0.296875 0.84375q0 0.6875 -0.65625 1.21875q-0.640625 0.515625 -1.90625 0.515625q-1.265625 0 -2.078125 -0.640625q0 0.21875 -0.03125 0.28125q-0.015625 0.0625 -0.09375 0.109375q-0.0625 0.046875 -0.140625 0.046875q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.09375 -0.078125 -0.28125l0 -1.09375q0 -0.1875 0.0625 -0.265625q0.078125 -0.09375 0.203125 -0.09375q0.109375 0 0.1875 0.078125q0.09375 0.078125 0.09375 0.21875q0 0.296875 0.140625 0.484375q0.21875 0.3125 0.703125 0.515625q0.484375 0.1875 1.1875 0.1875q1.046875 0 1.546875 -0.375q0.515625 -0.390625 0.515625 -0.828125q0 -0.5 -0.515625 -0.796875q-0.515625 -0.296875 -1.515625 -0.390625q-0.984375 -0.109375 -1.421875 -0.265625q-0.4375 -0.171875 -0.671875 -0.5q-0.234375 -0.328125 -0.234375 -0.71875q0 -0.671875 0.671875 -1.078125q0.671875 -0.40625 1.59375 -0.40625q1.109375 0 1.796875 0.546875zm4.9575195 -0.359375l2.890625 0q0.1875 0 0.265625 0.078125q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.890625 0l0 3.546875q0 0.453125 0.359375 0.765625q0.375 0.3125 1.09375 0.3125q0.546875 0 1.171875 -0.15625q0.625 -0.15625 0.96875 -0.359375q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.09375 -0.078125 0.1875q-0.203125 0.203125 -1.0 0.453125q-0.78125 0.234375 -1.5 0.234375q-0.921875 0 -1.484375 -0.4375q-0.546875 -0.4375 -0.546875 -1.171875l0 -3.546875l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.984375 0l0 -1.578125q0 -0.1875 0.078125 -0.265625q0.078125 -0.078125 0.1875 -0.078125q0.125 0 0.203125 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.578125zm8.254395 0l0 1.34375q1.03125 -0.9375 1.546875 -1.203125q0.53125 -0.265625 0.96875 -0.265625q0.46875 0 0.875 0.328125q0.421875 0.3125 0.421875 0.46875q0 0.125 -0.09375 0.203125q-0.078125 0.078125 -0.1875 0.078125q-0.0625 0 -0.109375 -0.015625q-0.046875 -0.03125 -0.171875 -0.140625q-0.21875 -0.234375 -0.390625 -0.3125q-0.15625 -0.078125 -0.3125 -0.078125q-0.359375 0 -0.859375 0.28125q-0.484375 0.28125 -1.6875 1.359375l0 2.921875l2.359375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-4.1875 0q-0.1875 0 -0.28125 -0.0625q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.171875q0.09375 -0.078125 0.28125 -0.078125l1.296875 0l0 -4.4375l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.515625 0zm8.70752 -2.734375l0 1.375l-0.796875 0l0 -1.375l0.796875 0zm0.015625 2.734375l0 4.96875l2.09375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-4.71875 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l2.09375 0l0 -4.421875l-1.5625 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.078125 -0.078125 0.28125 -0.078125l2.09375 0zm9.73877 0.546875l0 -0.1875q0 -0.1875 0.078125 -0.265625q0.078125 -0.09375 0.1875 -0.09375q0.125 0 0.203125 0.09375q0.078125 0.078125 0.078125 0.265625l0 1.21875q-0.015625 0.1875 -0.09375 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.0625 -0.078125 -0.078125 -0.25q-0.03125 -0.4375 -0.59375 -0.84375q-0.546875 -0.40625 -1.5 -0.40625q-1.1875 0 -1.796875 0.75q-0.609375 0.734375 -0.609375 1.6875q0 1.03125 0.671875 1.703125q0.6875 0.671875 1.765625 0.671875q0.609375 0 1.25 -0.21875q0.65625 -0.234375 1.171875 -0.734375q0.140625 -0.140625 0.234375 -0.140625q0.109375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.265625 -0.640625 0.6875q-1.03125 0.671875 -2.296875 0.671875q-1.28125 0 -2.125 -0.8125q-0.828125 -0.828125 -0.828125 -2.09375q0 -1.28125 0.84375 -2.125q0.859375 -0.859375 2.140625 -0.859375q1.234375 0 2.0625 0.734375zm4.4887695 -0.546875l2.890625 0q0.1875 0 0.265625 0.078125q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.890625 0l0 3.546875q0 0.453125 0.359375 0.765625q0.375 0.3125 1.09375 0.3125q0.546875 0 1.171875 -0.15625q0.625 -0.15625 0.96875 -0.359375q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.09375 -0.078125 0.1875q-0.203125 0.203125 -1.0 0.453125q-0.78125 0.234375 -1.5 0.234375q-0.921875 0 -1.484375 -0.4375q-0.546875 -0.4375 -0.546875 -1.171875l0 -3.546875l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.984375 0l0 -1.578125q0 -0.1875 0.078125 -0.265625q0.078125 -0.078125 0.1875 -0.078125q0.125 0 0.203125 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.578125zm11.77002 2.875l-5.421875 0q0.125 1.03125 0.859375 1.671875q0.734375 0.625 1.796875 0.625q0.59375 0 1.25 -0.1875q0.65625 -0.203125 1.0625 -0.53125q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.109375 -0.09375 0.21875q-0.3125 0.3125 -1.09375 0.59375q-0.765625 0.265625 -1.59375 0.265625q-1.375 0 -2.296875 -0.890625q-0.90625 -0.90625 -0.90625 -2.171875q0 -1.171875 0.859375 -2.0q0.859375 -0.828125 2.125 -0.828125q1.3125 0 2.15625 0.859375q0.84375 0.84375 0.828125 2.203125zm-0.53125 -0.53125q-0.15625 -0.890625 -0.84375 -1.4375q-0.671875 -0.546875 -1.609375 -0.546875q-0.921875 0 -1.59375 0.546875q-0.671875 0.53125 -0.84375 1.4375l4.890625 0zm8.066895 -4.8125l0 7.4375l0.703125 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-1.25 0l0 -1.0625q-0.921875 1.265625 -2.34375 1.265625q-0.734375 0 -1.40625 -0.375q-0.65625 -0.390625 -1.046875 -1.09375q-0.375 -0.71875 -0.375 -1.46875q0 -0.765625 0.375 -1.46875q0.390625 -0.703125 1.046875 -1.09375q0.671875 -0.390625 1.40625 -0.390625q1.390625 0 2.34375 1.265625l0 -3.0l-0.703125 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.25 0zm-0.546875 5.234375q0 -1.015625 -0.6875 -1.703125q-0.671875 -0.703125 -1.625 -0.703125q-0.953125 0 -1.640625 0.703125q-0.6875 0.6875 -0.6875 1.703125q0 1.0 0.6875 1.703125q0.6875 0.703125 1.640625 0.703125q0.953125 0 1.625 -0.703125q0.6875 -0.703125 0.6875 -1.703125zm4.5825195 -0.3125l0 2.515625l1.828125 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.265625 0.078125l-3.09375 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l0.71875 0l0 -6.359375l-0.71875 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l3.109375 0q1.09375 0 1.78125 0.65625q0.703125 0.640625 0.703125 1.5q0 0.515625 -0.234375 0.9375q-0.21875 0.40625 -0.53125 0.640625q-0.484375 0.359375 -0.984375 0.515625q-0.375 0.125 -0.921875 0.125l-1.65625 0zm0 -0.53125l1.6875 0q0.59375 0 1.109375 -0.265625q0.515625 -0.265625 0.75 -0.640625q0.25 -0.390625 0.25 -0.78125q0 -0.625 -0.546875 -1.125q-0.53125 -0.5 -1.359375 -0.5l-1.890625 0l0 3.3125zm7.8637695 -1.921875l2.890625 0q0.1875 0 0.265625 0.078125q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.890625 0l0 3.546875q0 0.453125 0.359375 0.765625q0.375 0.3125 1.09375 0.3125q0.546875 0 1.171875 -0.15625q0.625 -0.15625 0.96875 -0.359375q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.09375 -0.078125 0.1875q-0.203125 0.203125 -1.0 0.453125q-0.78125 0.234375 -1.5 0.234375q-0.921875 0 -1.484375 -0.4375q-0.546875 -0.4375 -0.546875 -1.171875l0 -3.546875l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.984375 0l0 -1.578125q0 -0.1875 0.078125 -0.265625q0.078125 -0.078125 0.1875 -0.078125q0.125 0 0.203125 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.578125zm8.254395 0l0 1.34375q1.03125 -0.9375 1.546875 -1.203125q0.53125 -0.265625 0.96875 -0.265625q0.46875 0 0.875 0.328125q0.421875 0.3125 0.421875 0.46875q0 0.125 -0.09375 0.203125q-0.078125 0.078125 -0.1875 0.078125q-0.0625 0 -0.109375 -0.015625q-0.046875 -0.03125 -0.171875 -0.140625q-0.21875 -0.234375 -0.390625 -0.3125q-0.15625 -0.078125 -0.3125 -0.078125q-0.359375 0 -0.859375 0.28125q-0.484375 0.28125 -1.6875 1.359375l0 2.921875l2.359375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-4.1875 0q-0.1875 0 -0.28125 -0.0625q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.171875q0.09375 -0.078125 0.28125 -0.078125l1.296875 0l0 -4.4375l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.515625 0zm11.70752 1.796875l-5.75 3.21875q-0.140625 0.078125 -0.21875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.09375 -0.078125 -0.1875q0 -0.171875 0.21875 -0.28125l4.9375 -2.75l-4.9375 -2.734375q-0.203125 -0.125 -0.203125 -0.28125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.1875 -0.078125q0.0625 0 0.203125 0.078125l5.75 3.203125zm3.4731445 1.78125l1.734375 0l-1.890625 3.515625q-0.171875 0.3125 -0.40625 0.3125q-0.15625 0 -0.28125 -0.109375q-0.109375 -0.109375 -0.109375 -0.265625q0 -0.078125 0.03125 -0.140625l0.921875 -3.3125z" fill-rule="nonzero"/><path fill="#000000" d="m653.4567 361.21326l-3.5 0l-0.71875 1.953125l1.015625 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.984375 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l0.40625 0l2.359375 -6.359375l-1.578125 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l2.6875 0l2.59375 6.890625l0.421875 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.984375 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.015625 0l-0.734375 -1.953125zm-0.203125 -0.53125l-1.46875 -3.875l-0.203125 0l-1.421875 3.875l3.09375 0zm5.6137695 -2.484375l0 1.34375q1.03125 -0.9375 1.546875 -1.203125q0.53125 -0.265625 0.96875 -0.265625q0.46875 0 0.875 0.328125q0.421875 0.3125 0.421875 0.46875q0 0.125 -0.09375 0.203125q-0.078125 0.078125 -0.1875 0.078125q-0.0625 0 -0.109375 -0.015625q-0.046875 -0.03125 -0.171875 -0.140625q-0.21875 -0.234375 -0.390625 -0.3125q-0.15625 -0.078125 -0.3125 -0.078125q-0.359375 0 -0.859375 0.28125q-0.484375 0.28125 -1.6875 1.359375l0 2.921875l2.359375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-4.1875 0q-0.1875 0 -0.28125 -0.0625q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.171875q0.09375 -0.078125 0.28125 -0.078125l1.296875 0l0 -4.4375l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.515625 0zm10.223145 0.984375l0 -0.984375l1.25 0q0.203125 0 0.28125 0.078125q0.078125 0.078125 0.078125 0.203125q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-0.703125 0l0 5.328125q0 0.53125 -0.234375 0.953125q-0.15625 0.265625 -0.515625 0.5625q-0.34375 0.3125 -0.640625 0.4375q-0.296875 0.125 -0.78125 0.125l-1.515625 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.078125 -0.078125 0.265625 -0.078125l1.53125 0.015625q0.46875 0 0.84375 -0.25q0.390625 -0.234375 0.625 -0.703125q0.140625 -0.265625 0.140625 -0.671875l0 -1.609375q-0.84375 1.171875 -2.203125 1.171875q-1.09375 0 -1.890625 -0.8125q-0.796875 -0.8125 -0.796875 -1.953125q0 -1.15625 0.796875 -1.96875q0.796875 -0.8125 1.890625 -0.8125q1.359375 0 2.203125 1.171875zm0 1.609375q0 -0.953125 -0.640625 -1.59375q-0.640625 -0.640625 -1.53125 -0.640625q-0.90625 0 -1.546875 0.65625q-0.640625 0.640625 -0.640625 1.578125q0 0.9375 0.640625 1.59375q0.640625 0.640625 1.546875 0.640625q0.890625 0 1.53125 -0.640625q0.640625 -0.65625 0.640625 -1.59375zm7.9262695 -3.984375l0 -0.1875q0 -0.1875 0.0625 -0.265625q0.078125 -0.078125 0.203125 -0.078125q0.125 0 0.1875 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.359375q0 0.203125 -0.078125 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.125 0 -0.203125 -0.078125q-0.0625 -0.078125 -0.0625 -0.25q-0.03125 -0.53125 -0.5625 -0.953125q-0.515625 -0.421875 -1.34375 -0.421875q-0.890625 0 -1.40625 0.453125q-0.515625 0.453125 -0.515625 1.0625q0 0.328125 0.140625 0.59375q0.140625 0.25 0.375 0.421875q0.25 0.15625 0.546875 0.25q0.3125 0.09375 0.96875 0.203125q1.078125 0.1875 1.5 0.359375q0.546875 0.25 0.828125 0.6875q0.28125 0.4375 0.28125 1.03125q0 0.921875 -0.734375 1.5625q-0.71875 0.640625 -1.96875 0.640625q-1.375 0 -2.21875 -0.859375l0 0.296875q0 0.1875 -0.078125 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.09375 -0.078125 -0.28125l0 -1.46875q0 -0.203125 0.078125 -0.28125q0.078125 -0.078125 0.1875 -0.078125q0.125 0 0.1875 0.078125q0.078125 0.078125 0.078125 0.25q0.03125 0.578125 0.625 1.0625q0.59375 0.46875 1.59375 0.46875q1.015625 0 1.59375 -0.5q0.578125 -0.5 0.578125 -1.1875q0 -0.421875 -0.21875 -0.734375q-0.21875 -0.328125 -0.65625 -0.53125q-0.3125 -0.125 -1.28125 -0.296875q-1.328125 -0.21875 -1.90625 -0.671875q-0.578125 -0.453125 -0.578125 -1.296875q0 -0.84375 0.65625 -1.4375q0.671875 -0.609375 1.78125 -0.609375q1.109375 0 1.921875 0.703125zm3.8793945 1.390625l0 0.96875q0.484375 -0.578125 1.015625 -0.859375q0.546875 -0.296875 1.296875 -0.296875q0.78125 0 1.453125 0.375q0.671875 0.359375 1.03125 1.015625q0.359375 0.65625 0.359375 1.390625q0 1.140625 -0.828125 1.953125q-0.8125 0.8125 -2.015625 0.8125q-1.421875 0 -2.3125 -1.15625l0 3.21875l1.296875 0q0.1875 0 0.265625 0.0625q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.546875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.09375 -0.0625 0.28125 -0.0625l0.71875 0l0 -6.875l-0.71875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.25 0zm4.625 2.59375q0 -0.921875 -0.671875 -1.578125q-0.671875 -0.65625 -1.640625 -0.65625q-0.96875 0 -1.640625 0.65625q-0.671875 0.65625 -0.671875 1.578125q0 0.90625 0.671875 1.578125q0.671875 0.65625 1.640625 0.65625q0.96875 0 1.640625 -0.65625q0.671875 -0.65625 0.671875 -1.578125zm8.066895 0.28125l-5.421875 0q0.125 1.03125 0.859375 1.671875q0.734375 0.625 1.796875 0.625q0.59375 0 1.25 -0.1875q0.65625 -0.203125 1.0625 -0.53125q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.109375 -0.09375 0.21875q-0.3125 0.3125 -1.09375 0.59375q-0.765625 0.265625 -1.59375 0.265625q-1.375 0 -2.296875 -0.890625q-0.90625 -0.90625 -0.90625 -2.171875q0 -1.171875 0.859375 -2.0q0.859375 -0.828125 2.125 -0.828125q1.3125 0 2.15625 0.859375q0.84375 0.84375 0.828125 2.203125zm-0.53125 -0.53125q-0.15625 -0.890625 -0.84375 -1.4375q-0.671875 -0.546875 -1.609375 -0.546875q-0.921875 0 -1.59375 0.546875q-0.671875 0.53125 -0.84375 1.4375l4.890625 0zm7.6762695 -1.796875l0 -0.1875q0 -0.1875 0.078125 -0.265625q0.078125 -0.09375 0.1875 -0.09375q0.125 0 0.203125 0.09375q0.078125 0.078125 0.078125 0.265625l0 1.21875q-0.015625 0.1875 -0.09375 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.0625 -0.078125 -0.078125 -0.25q-0.03125 -0.4375 -0.59375 -0.84375q-0.546875 -0.40625 -1.5 -0.40625q-1.1875 0 -1.796875 0.75q-0.609375 0.734375 -0.609375 1.6875q0 1.03125 0.671875 1.703125q0.6875 0.671875 1.765625 0.671875q0.609375 0 1.25 -0.21875q0.65625 -0.234375 1.171875 -0.734375q0.140625 -0.140625 0.234375 -0.140625q0.109375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.265625 -0.640625 0.6875q-1.03125 0.671875 -2.296875 0.671875q-1.28125 0 -2.125 -0.8125q-0.828125 -0.828125 -0.828125 -2.09375q0 -1.28125 0.84375 -2.125q0.859375 -0.859375 2.140625 -0.859375q1.234375 0 2.0625 0.734375zm2.3012695 1.25l5.765625 -3.203125q0.140625 -0.078125 0.203125 -0.078125q0.109375 0 0.1875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.15625 -0.21875 0.28125l-4.9375 2.734375l4.9375 2.75q0.21875 0.109375 0.21875 0.28125q0 0.09375 -0.078125 0.1875q-0.078125 0.078125 -0.1875 0.078125q-0.078125 0 -0.21875 -0.078125l-5.75 -3.21875zm13.42627 -3.0l0 -0.375q0 -0.1875 0.0625 -0.265625q0.078125 -0.078125 0.203125 -0.078125q0.125 0 0.1875 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.484375q0 0.203125 -0.078125 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.0625 -0.078125 -0.078125 -0.234375q-0.03125 -0.546875 -0.578125 -0.953125q-0.734375 -0.5625 -1.671875 -0.5625q-0.625 0 -1.171875 0.265625q-0.40625 0.203125 -0.640625 0.484375q-0.421875 0.5 -0.671875 1.09375q-0.171875 0.453125 -0.171875 1.015625l0 0.921875q0 1.203125 0.859375 2.078125q0.859375 0.875 2.0 0.875q0.6875 0 1.234375 -0.296875q0.546875 -0.296875 1.046875 -0.90625q0.109375 -0.125 0.25 -0.125q0.109375 0 0.171875 0.078125q0.078125 0.0625 0.078125 0.171875q0 0.140625 -0.28125 0.4375q-0.515625 0.59375 -1.171875 0.890625q-0.640625 0.28125 -1.3125 0.28125q-0.578125 0 -1.171875 -0.21875q-0.453125 -0.171875 -0.75 -0.390625q-0.296875 -0.234375 -0.734375 -0.78125q-0.4375 -0.546875 -0.59375 -1.0q-0.15625 -0.453125 -0.15625 -1.015625l0 -1.078125q0 -0.796875 0.421875 -1.609375q0.421875 -0.828125 1.140625 -1.265625q0.734375 -0.4375 1.59375 -0.4375q1.328125 0 2.28125 0.890625zm8.42627 3.96875q0 1.21875 -0.875 2.078125q-0.859375 0.859375 -2.09375 0.859375q-1.25 0 -2.125 -0.859375q-0.859375 -0.875 -0.859375 -2.078125q0 -1.21875 0.859375 -2.078125q0.875 -0.875 2.125 -0.875q1.234375 0 2.09375 0.859375q0.875 0.859375 0.875 2.09375zm-0.53125 0q0 -1.0 -0.71875 -1.703125q-0.71875 -0.703125 -1.734375 -0.703125q-1.015625 0 -1.734375 0.703125q-0.703125 0.703125 -0.703125 1.703125q0 0.984375 0.703125 1.703125q0.71875 0.703125 1.734375 0.703125q1.015625 0 1.734375 -0.703125q0.71875 -0.703125 0.71875 -1.703125zm3.6293945 -2.765625l0 0.8125q0.5625 -0.5625 1.015625 -0.78125q0.453125 -0.21875 1.015625 -0.21875q0.609375 0 1.109375 0.265625q0.359375 0.1875 0.640625 0.625q0.296875 0.4375 0.296875 0.90625l0 3.359375l0.453125 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.4375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.453125 0l0 -3.265625q0 -0.578125 -0.421875 -0.953125q-0.40625 -0.390625 -1.09375 -0.390625q-0.53125 0 -0.921875 0.21875q-0.390625 0.203125 -1.109375 1.046875l0 3.34375l0.609375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.734375 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l0.59375 0l0 -4.421875l-0.453125 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l0.984375 0zm11.285645 0.359375q0 -0.1875 0.078125 -0.265625q0.078125 -0.09375 0.1875 -0.09375q0.125 0 0.203125 0.09375q0.078125 0.078125 0.078125 0.265625l0 0.921875q0 0.1875 -0.078125 0.28125q-0.078125 0.078125 -0.203125 0.078125q-0.09375 0 -0.171875 -0.0625q-0.078125 -0.078125 -0.09375 -0.25q-0.03125 -0.375 -0.390625 -0.625q-0.515625 -0.34375 -1.375 -0.34375q-0.890625 0 -1.390625 0.359375q-0.375 0.265625 -0.375 0.609375q0 0.375 0.453125 0.625q0.296875 0.1875 1.140625 0.28125q1.125 0.109375 1.546875 0.265625q0.625 0.21875 0.921875 0.625q0.296875 0.390625 0.296875 0.84375q0 0.6875 -0.65625 1.21875q-0.640625 0.515625 -1.90625 0.515625q-1.265625 0 -2.078125 -0.640625q0 0.21875 -0.03125 0.28125q-0.015625 0.0625 -0.09375 0.109375q-0.0625 0.046875 -0.140625 0.046875q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.09375 -0.078125 -0.28125l0 -1.09375q0 -0.1875 0.0625 -0.265625q0.078125 -0.09375 0.203125 -0.09375q0.109375 0 0.1875 0.078125q0.09375 0.078125 0.09375 0.21875q0 0.296875 0.140625 0.484375q0.21875 0.3125 0.703125 0.515625q0.484375 0.1875 1.1875 0.1875q1.046875 0 1.546875 -0.375q0.515625 -0.390625 0.515625 -0.828125q0 -0.5 -0.515625 -0.796875q-0.515625 -0.296875 -1.515625 -0.390625q-0.984375 -0.109375 -1.421875 -0.265625q-0.4375 -0.171875 -0.671875 -0.5q-0.234375 -0.328125 -0.234375 -0.71875q0 -0.671875 0.671875 -1.078125q0.671875 -0.40625 1.59375 -0.40625q1.109375 0 1.796875 0.546875zm4.9575195 -0.359375l2.890625 0q0.1875 0 0.265625 0.078125q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.890625 0l0 3.546875q0 0.453125 0.359375 0.765625q0.375 0.3125 1.09375 0.3125q0.546875 0 1.171875 -0.15625q0.625 -0.15625 0.96875 -0.359375q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.09375 -0.078125 0.1875q-0.203125 0.203125 -1.0 0.453125q-0.78125 0.234375 -1.5 0.234375q-0.921875 0 -1.484375 -0.4375q-0.546875 -0.4375 -0.546875 -1.171875l0 -3.546875l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.984375 0l0 -1.578125q0 -0.1875 0.078125 -0.265625q0.078125 -0.078125 0.1875 -0.078125q0.125 0 0.203125 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.578125zm9.285645 5.5l-0.734375 0l-2.6875 -6.890625l-0.421875 0q-0.140625 0 -0.203125 -0.03125q-0.0625 -0.03125 -0.109375 -0.09375q-0.03125 -0.0625 -0.03125 -0.140625q0 -0.078125 0.03125 -0.140625q0.046875 -0.078125 0.109375 -0.09375q0.0625 -0.03125 0.203125 -0.03125l1.984375 0q0.15625 0 0.21875 0.03125q0.0625 0.015625 0.09375 0.09375q0.046875 0.0625 0.046875 0.140625q0 0.078125 -0.046875 0.140625q-0.046875 0.0625 -0.109375 0.09375q-0.046875 0.03125 -0.203125 0.03125l-1.015625 0l2.46875 6.359375l0.046875 0l2.4375 -6.359375l-1.015625 0q-0.140625 0 -0.21875 -0.03125q-0.0625 -0.03125 -0.109375 -0.09375q-0.03125 -0.0625 -0.03125 -0.140625q0 -0.078125 0.046875 -0.140625q0.046875 -0.078125 0.109375 -0.09375q0.0625 -0.03125 0.203125 -0.03125l1.984375 0q0.15625 0 0.21875 0.03125q0.0625 0.015625 0.09375 0.09375q0.046875 0.0625 0.046875 0.140625q0 0.078125 -0.046875 0.140625q-0.03125 0.0625 -0.09375 0.09375q-0.0625 0.03125 -0.21875 0.03125l-0.40625 0l-2.640625 6.890625zm10.379395 -2.734375q0 1.21875 -0.875 2.078125q-0.859375 0.859375 -2.09375 0.859375q-1.25 0 -2.125 -0.859375q-0.859375 -0.875 -0.859375 -2.078125q0 -1.21875 0.859375 -2.078125q0.875 -0.875 2.125 -0.875q1.234375 0 2.09375 0.859375q0.875 0.859375 0.875 2.09375zm-0.53125 0q0 -1.0 -0.71875 -1.703125q-0.71875 -0.703125 -1.734375 -0.703125q-1.015625 0 -1.734375 0.703125q-0.703125 0.703125 -0.703125 1.703125q0 0.984375 0.703125 1.703125q0.71875 0.703125 1.734375 0.703125q1.015625 0 1.734375 -0.703125q0.71875 -0.703125 0.71875 -1.703125zm5.6293945 -5.5l0 1.375l-0.796875 0l0 -1.375l0.796875 0zm0.015625 2.734375l0 4.96875l2.09375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-4.71875 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l2.09375 0l0 -4.421875l-1.5625 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.078125 -0.078125 0.28125 -0.078125l2.09375 0zm10.129395 -2.46875l0 7.4375l0.703125 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-1.25 0l0 -1.0625q-0.921875 1.265625 -2.34375 1.265625q-0.734375 0 -1.40625 -0.375q-0.65625 -0.390625 -1.046875 -1.09375q-0.375 -0.71875 -0.375 -1.46875q0 -0.765625 0.375 -1.46875q0.390625 -0.703125 1.046875 -1.09375q0.671875 -0.390625 1.40625 -0.390625q1.390625 0 2.34375 1.265625l0 -3.0l-0.703125 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.25 0zm-0.546875 5.234375q0 -1.015625 -0.6875 -1.703125q-0.671875 -0.703125 -1.625 -0.703125q-0.953125 0 -1.640625 0.703125q-0.6875 0.6875 -0.6875 1.703125q0 1.0 0.6875 1.703125q0.6875 0.703125 1.640625 0.703125q0.953125 0 1.625 -0.703125q0.6875 -0.703125 0.6875 -1.703125zm4.0043945 -0.578125l0 2.78125l0.984375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.234375 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l0.703125 0l0 -6.359375l-0.703125 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l3.21875 0q1.0 0 1.671875 0.640625q0.6875 0.625 0.6875 1.40625q0 0.578125 -0.421875 1.078125q-0.421875 0.5 -1.40625 0.84375q0.5625 0.390625 0.96875 0.890625q0.40625 0.5 1.296875 2.03125l0.40625 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-0.703125 0q-0.984375 -1.765625 -1.53125 -2.375q-0.546875 -0.609375 -1.25 -0.9375l-1.6875 0zm0 -0.53125l1.453125 0q0.6875 0 1.25 -0.25q0.578125 -0.265625 0.828125 -0.609375q0.265625 -0.34375 0.265625 -0.6875q0 -0.53125 -0.546875 -1.015625q-0.53125 -0.484375 -1.296875 -0.484375l-1.953125 0l0 3.046875zm12.410645 1.21875l-5.421875 0q0.125 1.03125 0.859375 1.671875q0.734375 0.625 1.796875 0.625q0.59375 0 1.25 -0.1875q0.65625 -0.203125 1.0625 -0.53125q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.109375 -0.09375 0.21875q-0.3125 0.3125 -1.09375 0.59375q-0.765625 0.265625 -1.59375 0.265625q-1.375 0 -2.296875 -0.890625q-0.90625 -0.90625 -0.90625 -2.171875q0 -1.171875 0.859375 -2.0q0.859375 -0.828125 2.125 -0.828125q1.3125 0 2.15625 0.859375q0.84375 0.84375 0.828125 2.203125zm-0.53125 -0.53125q-0.15625 -0.890625 -0.84375 -1.4375q-0.671875 -0.546875 -1.609375 -0.546875q-0.921875 0 -1.59375 0.546875q-0.671875 0.53125 -0.84375 1.4375l4.890625 0zm7.2075195 -1.984375q0 -0.1875 0.078125 -0.265625q0.078125 -0.09375 0.1875 -0.09375q0.125 0 0.203125 0.09375q0.078125 0.078125 0.078125 0.265625l0 0.921875q0 0.1875 -0.078125 0.28125q-0.078125 0.078125 -0.203125 0.078125q-0.09375 0 -0.171875 -0.0625q-0.078125 -0.078125 -0.09375 -0.25q-0.03125 -0.375 -0.390625 -0.625q-0.515625 -0.34375 -1.375 -0.34375q-0.890625 0 -1.390625 0.359375q-0.375 0.265625 -0.375 0.609375q0 0.375 0.453125 0.625q0.296875 0.1875 1.140625 0.28125q1.125 0.109375 1.546875 0.265625q0.625 0.21875 0.921875 0.625q0.296875 0.390625 0.296875 0.84375q0 0.6875 -0.65625 1.21875q-0.640625 0.515625 -1.90625 0.515625q-1.265625 0 -2.078125 -0.640625q0 0.21875 -0.03125 0.28125q-0.015625 0.0625 -0.09375 0.109375q-0.0625 0.046875 -0.140625 0.046875q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.09375 -0.078125 -0.28125l0 -1.09375q0 -0.1875 0.0625 -0.265625q0.078125 -0.09375 0.203125 -0.09375q0.109375 0 0.1875 0.078125q0.09375 0.078125 0.09375 0.21875q0 0.296875 0.140625 0.484375q0.21875 0.3125 0.703125 0.515625q0.484375 0.1875 1.1875 0.1875q1.046875 0 1.546875 -0.375q0.515625 -0.390625 0.515625 -0.828125q0 -0.5 -0.515625 -0.796875q-0.515625 -0.296875 -1.515625 -0.390625q-0.984375 -0.109375 -1.421875 -0.265625q-0.4375 -0.171875 -0.671875 -0.5q-0.234375 -0.328125 -0.234375 -0.71875q0 -0.671875 0.671875 -1.078125q0.671875 -0.40625 1.59375 -0.40625q1.109375 0 1.796875 0.546875zm4.9575195 -0.359375l2.890625 0q0.1875 0 0.265625 0.078125q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.890625 0l0 3.546875q0 0.453125 0.359375 0.765625q0.375 0.3125 1.09375 0.3125q0.546875 0 1.171875 -0.15625q0.625 -0.15625 0.96875 -0.359375q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.09375 -0.078125 0.1875q-0.203125 0.203125 -1.0 0.453125q-0.78125 0.234375 -1.5 0.234375q-0.921875 0 -1.484375 -0.4375q-0.546875 -0.4375 -0.546875 -1.171875l0 -3.546875l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.984375 0l0 -1.578125q0 -0.1875 0.078125 -0.265625q0.078125 -0.078125 0.1875 -0.078125q0.125 0 0.203125 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.578125zm8.254395 0l0 1.34375q1.03125 -0.9375 1.546875 -1.203125q0.53125 -0.265625 0.96875 -0.265625q0.46875 0 0.875 0.328125q0.421875 0.3125 0.421875 0.46875q0 0.125 -0.09375 0.203125q-0.078125 0.078125 -0.1875 0.078125q-0.0625 0 -0.109375 -0.015625q-0.046875 -0.03125 -0.171875 -0.140625q-0.21875 -0.234375 -0.390625 -0.3125q-0.15625 -0.078125 -0.3125 -0.078125q-0.359375 0 -0.859375 0.28125q-0.484375 0.28125 -1.6875 1.359375l0 2.921875l2.359375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-4.1875 0q-0.1875 0 -0.28125 -0.0625q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.171875q0.09375 -0.078125 0.28125 -0.078125l1.296875 0l0 -4.4375l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.515625 0zm8.70752 -2.734375l0 1.375l-0.796875 0l0 -1.375l0.796875 0zm0.015625 2.734375l0 4.96875l2.09375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-4.71875 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l2.09375 0l0 -4.421875l-1.5625 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.078125 -0.078125 0.28125 -0.078125l2.09375 0zm9.73877 0.546875l0 -0.1875q0 -0.1875 0.078125 -0.265625q0.078125 -0.09375 0.1875 -0.09375q0.125 0 0.203125 0.09375q0.078125 0.078125 0.078125 0.265625l0 1.21875q-0.015625 0.1875 -0.09375 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.0625 -0.078125 -0.078125 -0.25q-0.03125 -0.4375 -0.59375 -0.84375q-0.546875 -0.40625 -1.5 -0.40625q-1.1875 0 -1.796875 0.75q-0.609375 0.734375 -0.609375 1.6875q0 1.03125 0.671875 1.703125q0.6875 0.671875 1.765625 0.671875q0.609375 0 1.25 -0.21875q0.65625 -0.234375 1.171875 -0.734375q0.140625 -0.140625 0.234375 -0.140625q0.109375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.265625 -0.640625 0.6875q-1.03125 0.671875 -2.296875 0.671875q-1.28125 0 -2.125 -0.8125q-0.828125 -0.828125 -0.828125 -2.09375q0 -1.28125 0.84375 -2.125q0.859375 -0.859375 2.140625 -0.859375q1.234375 0 2.0625 0.734375zm4.4887695 -0.546875l2.890625 0q0.1875 0 0.265625 0.078125q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.890625 0l0 3.546875q0 0.453125 0.359375 0.765625q0.375 0.3125 1.09375 0.3125q0.546875 0 1.171875 -0.15625q0.625 -0.15625 0.96875 -0.359375q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.09375 -0.078125 0.1875q-0.203125 0.203125 -1.0 0.453125q-0.78125 0.234375 -1.5 0.234375q-0.921875 0 -1.484375 -0.4375q-0.546875 -0.4375 -0.546875 -1.171875l0 -3.546875l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.984375 0l0 -1.578125q0 -0.1875 0.078125 -0.265625q0.078125 -0.078125 0.1875 -0.078125q0.125 0 0.203125 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.578125zm11.77002 2.875l-5.421875 0q0.125 1.03125 0.859375 1.671875q0.734375 0.625 1.796875 0.625q0.59375 0 1.25 -0.1875q0.65625 -0.203125 1.0625 -0.53125q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.109375 -0.09375 0.21875q-0.3125 0.3125 -1.09375 0.59375q-0.765625 0.265625 -1.59375 0.265625q-1.375 0 -2.296875 -0.890625q-0.90625 -0.90625 -0.90625 -2.171875q0 -1.171875 0.859375 -2.0q0.859375 -0.828125 2.125 -0.828125q1.3125 0 2.15625 0.859375q0.84375 0.84375 0.828125 2.203125zm-0.53125 -0.53125q-0.15625 -0.890625 -0.84375 -1.4375q-0.671875 -0.546875 -1.609375 -0.546875q-0.921875 0 -1.59375 0.546875q-0.671875 0.53125 -0.84375 1.4375l4.890625 0zm8.066895 -4.8125l0 7.4375l0.703125 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-1.25 0l0 -1.0625q-0.921875 1.265625 -2.34375 1.265625q-0.734375 0 -1.40625 -0.375q-0.65625 -0.390625 -1.046875 -1.09375q-0.375 -0.71875 -0.375 -1.46875q0 -0.765625 0.375 -1.46875q0.390625 -0.703125 1.046875 -1.09375q0.671875 -0.390625 1.40625 -0.390625q1.390625 0 2.34375 1.265625l0 -3.0l-0.703125 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.25 0zm-0.546875 5.234375q0 -1.015625 -0.6875 -1.703125q-0.671875 -0.703125 -1.625 -0.703125q-0.953125 0 -1.640625 0.703125q-0.6875 0.6875 -0.6875 1.703125q0 1.0 0.6875 1.703125q0.6875 0.703125 1.640625 0.703125q0.953125 0 1.625 -0.703125q0.6875 -0.703125 0.6875 -1.703125zm4.5825195 -0.3125l0 2.515625l1.828125 0q0.1875 0 0.265625 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.265625 0.078125l-3.09375 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l0.71875 0l0 -6.359375l-0.71875 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l3.109375 0q1.09375 0 1.78125 0.65625q0.703125 0.640625 0.703125 1.5q0 0.515625 -0.234375 0.9375q-0.21875 0.40625 -0.53125 0.640625q-0.484375 0.359375 -0.984375 0.515625q-0.375 0.125 -0.921875 0.125l-1.65625 0zm0 -0.53125l1.6875 0q0.59375 0 1.109375 -0.265625q0.515625 -0.265625 0.75 -0.640625q0.25 -0.390625 0.25 -0.78125q0 -0.625 -0.546875 -1.125q-0.53125 -0.5 -1.359375 -0.5l-1.890625 0l0 3.3125zm7.8637695 -1.921875l2.890625 0q0.1875 0 0.265625 0.078125q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.890625 0l0 3.546875q0 0.453125 0.359375 0.765625q0.375 0.3125 1.09375 0.3125q0.546875 0 1.171875 -0.15625q0.625 -0.15625 0.96875 -0.359375q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.09375 -0.078125 0.1875q-0.203125 0.203125 -1.0 0.453125q-0.78125 0.234375 -1.5 0.234375q-0.921875 0 -1.484375 -0.4375q-0.546875 -0.4375 -0.546875 -1.171875l0 -3.546875l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.984375 0l0 -1.578125q0 -0.1875 0.078125 -0.265625q0.078125 -0.078125 0.1875 -0.078125q0.125 0 0.203125 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.578125zm8.254395 0l0 1.34375q1.03125 -0.9375 1.546875 -1.203125q0.53125 -0.265625 0.96875 -0.265625q0.46875 0 0.875 0.328125q0.421875 0.3125 0.421875 0.46875q0 0.125 -0.09375 0.203125q-0.078125 0.078125 -0.1875 0.078125q-0.0625 0 -0.109375 -0.015625q-0.046875 -0.03125 -0.171875 -0.140625q-0.21875 -0.234375 -0.390625 -0.3125q-0.15625 -0.078125 -0.3125 -0.078125q-0.359375 0 -0.859375 0.28125q-0.484375 0.28125 -1.6875 1.359375l0 2.921875l2.359375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-4.1875 0q-0.1875 0 -0.28125 -0.0625q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.171875q0.09375 -0.078125 0.28125 -0.078125l1.296875 0l0 -4.4375l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.515625 0zm11.70752 1.796875l-5.75 3.21875q-0.140625 0.078125 -0.21875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.09375 -0.078125 -0.1875q0 -0.171875 0.21875 -0.28125l4.9375 -2.75l-4.9375 -2.734375q-0.203125 -0.125 -0.203125 -0.28125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.1875 -0.078125q0.0625 0 0.203125 0.078125l5.75 3.203125zm3.4731445 1.78125l1.734375 0l-1.890625 3.515625q-0.171875 0.3125 -0.40625 0.3125q-0.15625 0 -0.28125 -0.109375q-0.109375 -0.109375 -0.109375 -0.265625q0 -0.078125 0.03125 -0.140625l0.921875 -3.3125z" fill-rule="nonzero"/><path fill="#000000" d="m653.4567 377.21326l-3.5 0l-0.71875 1.953125l1.015625 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.984375 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l0.40625 0l2.359375 -6.359375l-1.578125 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l2.6875 0l2.59375 6.890625l0.421875 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.984375 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.015625 0l-0.734375 -1.953125zm-0.203125 -0.53125l-1.46875 -3.875l-0.203125 0l-1.421875 3.875l3.09375 0zm5.6137695 -2.484375l0 1.34375q1.03125 -0.9375 1.546875 -1.203125q0.53125 -0.265625 0.96875 -0.265625q0.46875 0 0.875 0.328125q0.421875 0.3125 0.421875 0.46875q0 0.125 -0.09375 0.203125q-0.078125 0.078125 -0.1875 0.078125q-0.0625 0 -0.109375 -0.015625q-0.046875 -0.03125 -0.171875 -0.140625q-0.21875 -0.234375 -0.390625 -0.3125q-0.15625 -0.078125 -0.3125 -0.078125q-0.359375 0 -0.859375 0.28125q-0.484375 0.28125 -1.6875 1.359375l0 2.921875l2.359375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-4.1875 0q-0.1875 0 -0.28125 -0.0625q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.171875q0.09375 -0.078125 0.28125 -0.078125l1.296875 0l0 -4.4375l-0.984375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.515625 0zm10.223145 0.984375l0 -0.984375l1.25 0q0.203125 0 0.28125 0.078125q0.078125 0.078125 0.078125 0.203125q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-0.703125 0l0 5.328125q0 0.53125 -0.234375 0.953125q-0.15625 0.265625 -0.515625 0.5625q-0.34375 0.3125 -0.640625 0.4375q-0.296875 0.125 -0.78125 0.125l-1.515625 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.078125 -0.078125 0.265625 -0.078125l1.53125 0.015625q0.46875 0 0.84375 -0.25q0.390625 -0.234375 0.625 -0.703125q0.140625 -0.265625 0.140625 -0.671875l0 -1.609375q-0.84375 1.171875 -2.203125 1.171875q-1.09375 0 -1.890625 -0.8125q-0.796875 -0.8125 -0.796875 -1.953125q0 -1.15625 0.796875 -1.96875q0.796875 -0.8125 1.890625 -0.8125q1.359375 0 2.203125 1.171875zm0 1.609375q0 -0.953125 -0.640625 -1.59375q-0.640625 -0.640625 -1.53125 -0.640625q-0.90625 0 -1.546875 0.65625q-0.640625 0.640625 -0.640625 1.578125q0 0.9375 0.640625 1.59375q0.640625 0.640625 1.546875 0.640625q0.890625 0 1.53125 -0.640625q0.640625 -0.65625 0.640625 -1.59375zm7.9262695 -3.984375l0 -0.1875q0 -0.1875 0.0625 -0.265625q0.078125 -0.078125 0.203125 -0.078125q0.125 0 0.1875 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.359375q0 0.203125 -0.078125 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.125 0 -0.203125 -0.078125q-0.0625 -0.078125 -0.0625 -0.25q-0.03125 -0.53125 -0.5625 -0.953125q-0.515625 -0.421875 -1.34375 -0.421875q-0.890625 0 -1.40625 0.453125q-0.515625 0.453125 -0.515625 1.0625q0 0.328125 0.140625 0.59375q0.140625 0.25 0.375 0.421875q0.25 0.15625 0.546875 0.25q0.3125 0.09375 0.96875 0.203125q1.078125 0.1875 1.5 0.359375q0.546875 0.25 0.828125 0.6875q0.28125 0.4375 0.28125 1.03125q0 0.921875 -0.734375 1.5625q-0.71875 0.640625 -1.96875 0.640625q-1.375 0 -2.21875 -0.859375l0 0.296875q0 0.1875 -0.078125 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.09375 -0.078125 -0.28125l0 -1.46875q0 -0.203125 0.078125 -0.28125q0.078125 -0.078125 0.1875 -0.078125q0.125 0 0.1875 0.078125q0.078125 0.078125 0.078125 0.25q0.03125 0.578125 0.625 1.0625q0.59375 0.46875 1.59375 0.46875q1.015625 0 1.59375 -0.5q0.578125 -0.5 0.578125 -1.1875q0 -0.421875 -0.21875 -0.734375q-0.21875 -0.328125 -0.65625 -0.53125q-0.3125 -0.125 -1.28125 -0.296875q-1.328125 -0.21875 -1.90625 -0.671875q-0.578125 -0.453125 -0.578125 -1.296875q0 -0.84375 0.65625 -1.4375q0.671875 -0.609375 1.78125 -0.609375q1.109375 0 1.921875 0.703125zm3.8793945 1.390625l0 0.96875q0.484375 -0.578125 1.015625 -0.859375q0.546875 -0.296875 1.296875 -0.296875q0.78125 0 1.453125 0.375q0.671875 0.359375 1.03125 1.015625q0.359375 0.65625 0.359375 1.390625q0 1.140625 -0.828125 1.953125q-0.8125 0.8125 -2.015625 0.8125q-1.421875 0 -2.3125 -1.15625l0 3.21875l1.296875 0q0.1875 0 0.265625 0.0625q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.546875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.09375 -0.0625 0.28125 -0.0625l0.71875 0l0 -6.875l-0.71875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.25 0zm4.625 2.59375q0 -0.921875 -0.671875 -1.578125q-0.671875 -0.65625 -1.640625 -0.65625q-0.96875 0 -1.640625 0.65625q-0.671875 0.65625 -0.671875 1.578125q0 0.90625 0.671875 1.578125q0.671875 0.65625 1.640625 0.65625q0.96875 0 1.640625 -0.65625q0.671875 -0.65625 0.671875 -1.578125zm8.066895 0.28125l-5.421875 0q0.125 1.03125 0.859375 1.671875q0.734375 0.625 1.796875 0.625q0.59375 0 1.25 -0.1875q0.65625 -0.203125 1.0625 -0.53125q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.109375 -0.09375 0.21875q-0.3125 0.3125 -1.09375 0.59375q-0.765625 0.265625 -1.59375 0.265625q-1.375 0 -2.296875 -0.890625q-0.90625 -0.90625 -0.90625 -2.171875q0 -1.171875 0.859375 -2.0q0.859375 -0.828125 2.125 -0.828125q1.3125 0 2.15625 0.859375q0.84375 0.84375 0.828125 2.203125zm-0.53125 -0.53125q-0.15625 -0.890625 -0.84375 -1.4375q-0.671875 -0.546875 -1.609375 -0.546875q-0.921875 0 -1.59375 0.546875q-0.671875 0.53125 -0.84375 1.4375l4.890625 0zm7.6762695 -1.796875l0 -0.1875q0 -0.1875 0.078125 -0.265625q0.078125 -0.09375 0.1875 -0.09375q0.125 0 0.203125 0.09375q0.078125 0.078125 0.078125 0.265625l0 1.21875q-0.015625 0.1875 -0.09375 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.0625 -0.078125 -0.078125 -0.25q-0.03125 -0.4375 -0.59375 -0.84375q-0.546875 -0.40625 -1.5 -0.40625q-1.1875 0 -1.796875 0.75q-0.609375 0.734375 -0.609375 1.6875q0 1.03125 0.671875 1.703125q0.6875 0.671875 1.765625 0.671875q0.609375 0 1.25 -0.21875q0.65625 -0.234375 1.171875 -0.734375q0.140625 -0.140625 0.234375 -0.140625q0.109375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.265625 -0.640625 0.6875q-1.03125 0.671875 -2.296875 0.671875q-1.28125 0 -2.125 -0.8125q-0.828125 -0.828125 -0.828125 -2.09375q0 -1.28125 0.84375 -2.125q0.859375 -0.859375 2.140625 -0.859375q1.234375 0 2.0625 0.734375zm2.3012695 1.25l5.765625 -3.203125q0.140625 -0.078125 0.203125 -0.078125q0.109375 0 0.1875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.15625 -0.21875 0.28125l-4.9375 2.734375l4.9375 2.75q0.21875 0.109375 0.21875 0.28125q0 0.09375 -0.078125 0.1875q-0.078125 0.078125 -0.1875 0.078125q-0.078125 0 -0.21875 -0.078125l-5.75 -3.21875zm12.98877 -3.1875l0 -0.1875q0 -0.1875 0.0625 -0.265625q0.078125 -0.078125 0.203125 -0.078125q0.125 0 0.1875 0.078125q0.078125 0.078125 0.078125 0.265625l0 1.359375q0 0.203125 -0.078125 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.125 0 -0.203125 -0.078125q-0.0625 -0.078125 -0.0625 -0.25q-0.03125 -0.53125 -0.5625 -0.953125q-0.515625 -0.421875 -1.34375 -0.421875q-0.890625 0 -1.40625 0.453125q-0.515625 0.453125 -0.515625 1.0625q0 0.328125 0.140625 0.59375q0.140625 0.25 0.375 0.421875q0.25 0.15625 0.546875 0.25q0.3125 0.09375 0.96875 0.203125q1.078125 0.1875 1.5 0.359375q0.546875 0.25 0.828125 0.6875q0.28125 0.4375 0.28125 1.03125q0 0.921875 -0.734375 1.5625q-0.71875 0.640625 -1.96875 0.640625q-1.375 0 -2.21875 -0.859375l0 0.296875q0 0.1875 -0.078125 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.09375 -0.078125 -0.28125l0 -1.46875q0 -0.203125 0.078125 -0.28125q0.078125 -0.078125 0.1875 -0.078125q0.125 0 0.1875 0.078125q0.078125 0.078125 0.078125 0.25q0.03125 0.578125 0.625 1.0625q0.59375 0.46875 1.59375 0.46875q1.015625 0 1.59375 -0.5q0.578125 -0.5 0.578125 -1.1875q0 -0.421875 -0.21875 -0.734375q-0.21875 -0.328125 -0.65625 -0.53125q-0.3125 -0.125 -1.28125 -0.296875q-1.328125 -0.21875 -1.90625 -0.671875q-0.578125 -0.453125 -0.578125 -1.296875q0 -0.84375 0.65625 -1.4375q0.671875 -0.609375 1.78125 -0.609375q1.109375 0 1.921875 0.703125zm6.1606445 -1.34375l0 1.375l-0.796875 0l0 -1.375l0.796875 0zm0.015625 2.734375l0 4.96875l2.09375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-4.71875 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l2.09375 0l0 -4.421875l-1.5625 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.078125 -0.078125 0.28125 -0.078125l2.09375 0zm9.848145 0l0 0.484375l-4.0 4.484375l3.609375 0l0 -0.734375q0 -0.1875 0.078125 -0.265625q0.078125 -0.09375 0.1875 -0.09375q0.125 0 0.203125 0.09375q0.078125 0.078125 0.078125 0.265625l-0.015625 1.265625l-4.875 0l0 -0.46875l3.984375 -4.484375l-3.3125 0l0 0.71875q0 0.1875 -0.078125 0.28125q-0.078125 0.078125 -0.203125 0.078125q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.09375 -0.078125 -0.28125l0 -1.265625l4.609375 0zm8.348145 2.875l-5.421875 0q0.125 1.03125 0.859375 1.671875q0.734375 0.625 1.796875 0.625q0.59375 0 1.25 -0.1875q0.65625 -0.203125 1.0625 -0.53125q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.109375 -0.09375 0.21875q-0.3125 0.3125 -1.09375 0.59375q-0.765625 0.265625 -1.59375 0.265625q-1.375 0 -2.296875 -0.890625q-0.90625 -0.90625 -0.90625 -2.171875q0 -1.171875 0.859375 -2.0q0.859375 -0.828125 2.125 -0.828125q1.3125 0 2.15625 0.859375q0.84375 0.84375 0.828125 2.203125zm-0.53125 -0.53125q-0.15625 -0.890625 -0.84375 -1.4375q-0.671875 -0.546875 -1.609375 -0.546875q-0.921875 0 -1.59375 0.546875q-0.671875 0.53125 -0.84375 1.4375l4.890625 0zm5.7231445 -3.734375l0 6.359375l1.375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-3.3125 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l1.390625 0l0 -6.359375l-2.1875 0l0 1.84375q0 0.203125 -0.078125 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.078125 -0.078125 -0.28125l0 -2.375l5.96875 0l0 2.375q0 0.203125 -0.078125 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.078125 -0.078125 -0.28125l0 -1.84375l-2.171875 0zm7.8012695 0l0 6.359375l1.375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-3.3125 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l1.390625 0l0 -6.359375l-2.1875 0l0 1.84375q0 0.203125 -0.078125 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.078125 -0.078125 -0.28125l0 -2.375l5.96875 0l0 2.375q0 0.203125 -0.078125 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.078125 -0.078125 -0.28125l0 -1.84375l-2.171875 0zm7.5668945 6.890625l-2.484375 -4.953125l-0.15625 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.09375 0.03125 -0.15625q0.046875 -0.0625 0.109375 -0.09375q0.0625 -0.03125 0.203125 -0.03125l1.46875 0q0.1875 0 0.265625 0.078125q0.078125 0.078125 0.078125 0.203125q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.265625 0.078125l-0.71875 0l2.171875 4.375l2.140625 -4.375l-0.703125 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l1.453125 0q0.1875 0 0.265625 0.078125q0.09375 0.078125 0.09375 0.203125q0 0.078125 -0.0625 0.15625q-0.046875 0.0625 -0.109375 0.09375q-0.0625 0.015625 -0.359375 0.015625l-3.375 6.875l0.84375 0q0.1875 0 0.265625 0.0625q0.078125 0.078125 0.078125 0.203125q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.265625 0.078125l-3.078125 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.09375 -0.0625 0.28125 -0.0625l1.671875 0l0.9375 -1.921875zm5.7543945 -5.5l0 0.96875q0.484375 -0.578125 1.015625 -0.859375q0.546875 -0.296875 1.296875 -0.296875q0.78125 0 1.453125 0.375q0.671875 0.359375 1.03125 1.015625q0.359375 0.65625 0.359375 1.390625q0 1.140625 -0.828125 1.953125q-0.8125 0.8125 -2.015625 0.8125q-1.421875 0 -2.3125 -1.15625l0 3.21875l1.296875 0q0.1875 0 0.265625 0.0625q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.546875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.09375 -0.0625 0.28125 -0.0625l0.71875 0l0 -6.875l-0.71875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.25 0zm4.625 2.59375q0 -0.921875 -0.671875 -1.578125q-0.671875 -0.65625 -1.640625 -0.65625q-0.96875 0 -1.640625 0.65625q-0.671875 0.65625 -0.671875 1.578125q0 0.90625 0.671875 1.578125q0.671875 0.65625 1.640625 0.65625q0.96875 0 1.640625 -0.65625q0.671875 -0.65625 0.671875 -1.578125zm8.066895 0.28125l-5.421875 0q0.125 1.03125 0.859375 1.671875q0.734375 0.625 1.796875 0.625q0.59375 0 1.25 -0.1875q0.65625 -0.203125 1.0625 -0.53125q0.125 -0.09375 0.21875 -0.09375q0.09375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.109375 -0.09375 0.21875q-0.3125 0.3125 -1.09375 0.59375q-0.765625 0.265625 -1.59375 0.265625q-1.375 0 -2.296875 -0.890625q-0.90625 -0.90625 -0.90625 -2.171875q0 -1.171875 0.859375 -2.0q0.859375 -0.828125 2.125 -0.828125q1.3125 0 2.15625 0.859375q0.84375 0.84375 0.828125 2.203125zm-0.53125 -0.53125q-0.15625 -0.890625 -0.84375 -1.4375q-0.671875 -0.546875 -1.609375 -0.546875q-0.921875 0 -1.59375 0.546875q-0.671875 0.53125 -0.84375 1.4375l4.890625 0zm8.723145 -0.546875l-5.75 3.21875q-0.140625 0.078125 -0.21875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.09375 -0.078125 -0.1875q0 -0.171875 0.21875 -0.28125l4.9375 -2.75l-4.9375 -2.734375q-0.203125 -0.125 -0.203125 -0.28125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.1875 -0.078125q0.0625 0 0.203125 0.078125l5.75 3.203125zm4.2856445 4.8125l0 -8.53125l-1.296875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.09375 -0.078125 0.28125 -0.078125l1.828125 0l0 9.609375l-1.828125 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.0625 -0.078125 -0.1875q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.296875 0z" fill-rule="nonzero"/><path fill="#000000" d="m631.56854 391.9945l-5.75 3.21875q-0.140625 0.078125 -0.21875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.09375 -0.078125 -0.1875q0 -0.171875 0.21875 -0.28125l4.9375 -2.75l-4.9375 -2.734375q-0.203125 -0.125 -0.203125 -0.28125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.1875 -0.078125q0.0625 0 0.203125 0.078125l5.75 3.203125zm3.4731445 1.78125l1.734375 0l-1.890625 3.515625q-0.171875 0.3125 -0.40625 0.3125q-0.15625 0 -0.28125 -0.109375q-0.109375 -0.109375 -0.109375 -0.265625q0 -0.078125 0.03125 -0.140625l0.921875 -3.3125z" fill-rule="nonzero"/><path fill="#000000" d="m612.4504 412.807l0 -8.53125l-1.296875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.09375 -0.078125 0.28125 -0.078125l1.828125 0l0 9.609375l-1.828125 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.0625 -0.078125 -0.1875q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.296875 0z" fill-rule="nonzero"/><path fill="#000000" d="m600.36346 423.9945l-5.75 3.21875q-0.140625 0.078125 -0.21875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.078125 -0.09375 -0.078125 -0.1875q0 -0.171875 0.21875 -0.28125l4.9375 -2.75l-4.9375 -2.734375q-0.203125 -0.125 -0.203125 -0.28125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.1875 -0.078125q0.0625 0 0.203125 0.078125l5.75 3.203125zm4.4106445 -1.796875l0.234375 0q0.359375 0 0.609375 0.265625q0.25 0.25 0.25 0.59375q0 0.375 -0.25 0.625q-0.25 0.25 -0.609375 0.25l-0.234375 0q-0.359375 0 -0.609375 -0.25q-0.25 -0.265625 -0.25 -0.609375q0 -0.375 0.25 -0.625q0.265625 -0.25 0.609375 -0.25zm-0.921875 3.578125l1.671875 0l-1.796875 2.953125q-0.125 0.21875 -0.21875 0.265625q-0.078125 0.0625 -0.171875 0.0625q-0.15625 0 -0.265625 -0.09375q-0.09375 -0.09375 -0.09375 -0.234375q0 -0.078125 0.03125 -0.1875l0.84375 -2.765625z" fill-rule="nonzero"/><path fill="#000000" d="m596.98846 458.16638l0.21875 0q0.359375 0 0.609375 0.25q0.25 0.25 0.25 0.609375q0 0.359375 -0.25 0.609375q-0.25 0.25 -0.609375 0.25l-0.21875 0q-0.359375 0 -0.625 -0.25q-0.25 -0.25 -0.25 -0.609375q0 -0.359375 0.25 -0.609375q0.265625 -0.25 0.625 -0.25zm7.8012695 0l0.21875 0q0.359375 0 0.609375 0.25q0.25 0.25 0.25 0.609375q0 0.359375 -0.25 0.609375q-0.25 0.25 -0.609375 0.25l-0.21875 0q-0.359375 0 -0.625 -0.25q-0.25 -0.25 -0.25 -0.609375q0 -0.359375 0.25 -0.609375q0.265625 -0.25 0.625 -0.25zm7.8012695 0l0.21875 0q0.359375 0 0.609375 0.25q0.25 0.25 0.25 0.609375q0 0.359375 -0.25 0.609375q-0.25 0.25 -0.609375 0.25l-0.21875 0q-0.359375 0 -0.625 -0.25q-0.25 -0.25 -0.25 -0.609375q0 -0.359375 0.25 -0.609375q0.265625 -0.25 0.625 -0.25z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m584.1916 501.57217l359.81104 0l0 106.99216l-359.81104 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m584.1916 501.57217l359.81104 0l0 106.99216l-359.81104 0z" fill-rule="evenodd"/><path fill="#000000" d="m599.9416 535.6026l-4.28125 9.21875q-0.15625 0.34375 -0.28125 0.453125q-0.171875 0.125 -0.421875 0.125q-0.265625 0 -0.46875 -0.203125q-0.203125 -0.1875 -0.203125 -0.4375q0 -0.171875 0.15625 -0.5l4.296875 -9.21875q0.15625 -0.34375 0.28125 -0.453125q0.171875 -0.125 0.40625 -0.125q0.28125 0 0.46875 0.1875q0.203125 0.1875 0.203125 0.4375q0 0.171875 -0.15625 0.515625zm7.998169 0l-4.28125 9.21875q-0.15625 0.34375 -0.28125 0.453125q-0.171875 0.125 -0.421875 0.125q-0.265625 0 -0.46875 -0.203125q-0.203125 -0.1875 -0.203125 -0.4375q0 -0.171875 0.15625 -0.5l4.296875 -9.21875q0.15625 -0.34375 0.28125 -0.453125q0.171875 -0.125 0.40625 -0.125q0.28125 0 0.46875 0.1875q0.203125 0.1875 0.203125 0.4375q0 0.171875 -0.15625 0.515625zm14.683899 3.921875q-0.328125 -0.203125 -0.6875 -0.296875q-0.34375 -0.109375 -0.734375 -0.109375q-0.78125 0 -1.234375 0.25q-0.203125 0.109375 -0.203125 0.25q0 0.140625 0.265625 0.28125q0.21875 0.109375 0.9375 0.203125q1.328125 0.1875 1.84375 0.375q0.6875 0.234375 1.046875 0.71875q0.375 0.46875 0.375 1.0q0 0.703125 -0.625 1.1875q-0.90625 0.703125 -2.34375 0.703125q-0.578125 0 -1.078125 -0.109375q-0.484375 -0.09375 -0.890625 -0.296875q-0.109375 0.09375 -0.21875 0.140625q-0.109375 0.046875 -0.21875 0.046875q-0.3125 0 -0.5 -0.203125q-0.1875 -0.21875 -0.1875 -0.6875l0 -0.453125q0 -0.484375 0.1875 -0.6875q0.1875 -0.203125 0.484375 -0.203125q0.234375 0 0.390625 0.140625q0.171875 0.125 0.265625 0.453125q0.296875 0.25 0.71875 0.390625q0.4375 0.125 1.0 0.125q0.921875 0 1.421875 -0.28125q0.25 -0.140625 0.25 -0.296875q0 -0.265625 -0.34375 -0.4375q-0.34375 -0.15625 -1.421875 -0.28125q-1.609375 -0.171875 -2.15625 -0.65625q-0.53125 -0.46875 -0.53125 -1.171875q0 -0.703125 0.59375 -1.1875q0.828125 -0.640625 2.15625 -0.640625q0.453125 0 0.875 0.09375q0.4375 0.078125 0.828125 0.25q0.125 -0.078125 0.234375 -0.125q0.109375 -0.046875 0.1875 -0.046875q0.28125 0 0.453125 0.203125q0.1875 0.203125 0.1875 0.6875l0 0.328125q0 0.4375 -0.09375 0.59375q-0.21875 0.296875 -0.578125 0.296875q-0.234375 0 -0.421875 -0.140625q-0.171875 -0.15625 -0.234375 -0.40625zm4.904419 3.609375l0 2.1875l0.796875 0q0.484375 0 0.6875 0.1875q0.203125 0.1875 0.203125 0.484375q0 0.296875 -0.203125 0.46875q-0.203125 0.1875 -0.6875 0.1875l-2.359375 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.171875 -0.203125 -0.46875q0 -0.296875 0.203125 -0.484375q0.21875 -0.1875 0.6875 -0.1875l0.234375 0l0 -6.03125l-0.234375 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.28125 0.203125 -0.46875q0.203125 -0.1875 0.6875 -0.1875l1.5625 0l0 0.453125q0.46875 -0.3125 0.96875 -0.46875q0.5 -0.15625 1.03125 -0.15625q1.359375 0 2.328125 0.921875q0.96875 0.921875 0.96875 2.125q0 1.3125 -1.140625 2.171875q-0.953125 0.71875 -2.140625 0.71875q-0.515625 0 -1.015625 -0.140625q-0.5 -0.15625 -1.0 -0.453125zm3.953125 -2.296875q0 -0.28125 -0.21875 -0.703125q-0.21875 -0.4375 -0.6875 -0.71875q-0.453125 -0.296875 -1.0625 -0.296875q-1.0 0 -1.59375 0.75q-0.390625 0.515625 -0.390625 0.984375q0 0.53125 0.5625 1.046875q0.578125 0.5 1.421875 0.5q0.84375 0 1.40625 -0.5q0.5625 -0.5 0.5625 -1.0625zm9.045044 0.75l-5.46875 0q0.203125 0.53125 0.734375 0.84375q0.53125 0.3125 1.4375 0.3125q0.75 0 1.96875 -0.3125q0.515625 -0.125 0.703125 -0.125q0.265625 0 0.453125 0.1875q0.1875 0.1875 0.1875 0.46875q0 0.265625 -0.203125 0.4375q-0.265625 0.25 -1.28125 0.46875q-1.0 0.21875 -1.921875 0.21875q-1.609375 0 -2.578125 -0.90625q-0.953125 -0.90625 -0.953125 -2.234375q0 -1.40625 1.03125 -2.28125q1.046875 -0.875 2.40625 -0.875q0.8125 0 1.484375 0.28125q0.6875 0.28125 1.015625 0.609375q0.46875 0.484375 0.78125 1.203125q0.203125 0.484375 0.203125 1.140625l0 0.5625zm-1.46875 -1.328125q-0.3125 -0.578125 -0.8125 -0.859375q-0.484375 -0.28125 -1.171875 -0.28125q-0.671875 0 -1.171875 0.28125q-0.5 0.28125 -0.8125 0.859375l3.96875 0zm8.201355 -2.0625q0.234375 -0.21875 0.5 -0.21875q0.28125 0 0.46875 0.203125q0.1875 0.203125 0.1875 0.671875l0 0.859375q0 0.484375 -0.1875 0.6875q-0.1875 0.203125 -0.484375 0.203125q-0.28125 0 -0.46875 -0.15625q-0.125 -0.125 -0.203125 -0.484375q-0.078125 -0.359375 -0.390625 -0.53125q-0.515625 -0.3125 -1.34375 -0.3125q-0.9375 0 -1.515625 0.5625q-0.5625 0.546875 -0.5625 1.390625q0 0.78125 0.546875 1.234375q0.546875 0.453125 1.8125 0.453125q0.828125 0 1.359375 -0.171875q0.3125 -0.109375 0.59375 -0.359375q0.28125 -0.25 0.5 -0.25q0.28125 0 0.46875 0.203125q0.203125 0.203125 0.203125 0.484375q0 0.4375 -0.59375 0.828125q-0.90625 0.59375 -2.640625 0.59375q-1.546875 0 -2.421875 -0.640625q-1.171875 -0.859375 -1.171875 -2.375q0 -1.421875 0.953125 -2.34375q0.953125 -0.9375 2.484375 -0.9375q0.546875 0 1.015625 0.109375q0.484375 0.09375 0.890625 0.296875zm8.670044 -2.59375l-4.28125 9.21875q-0.15625 0.34375 -0.28125 0.453125q-0.171875 0.125 -0.421875 0.125q-0.265625 0 -0.46875 -0.203125q-0.203125 -0.1875 -0.203125 -0.4375q0 -0.171875 0.15625 -0.5l4.296875 -9.21875q0.15625 -0.34375 0.28125 -0.453125q0.171875 -0.125 0.40625 -0.125q0.28125 0 0.46875 0.1875q0.203125 0.1875 0.203125 0.4375q0 0.171875 -0.15625 0.515625zm4.482544 5.5625l0 1.375l1.34375 0q0.484375 0 0.6875 0.1875q0.203125 0.171875 0.203125 0.484375q0 0.28125 -0.203125 0.46875q-0.203125 0.1875 -0.6875 0.1875l-2.890625 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.296875 0.203125 -0.46875q0.203125 -0.1875 0.6875 -0.1875l0.203125 0l0 -5.21875l-0.203125 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.296875 0.203125 -0.484375q0.203125 -0.1875 0.6875 -0.1875l3.0625 0q1.359375 0 2.140625 0.75q0.796875 0.734375 0.796875 1.796875q0 0.578125 -0.265625 1.09375q-0.203125 0.390625 -0.671875 0.78125q-0.46875 0.375 -0.96875 0.578125q-0.484375 0.1875 -1.296875 0.1875l-1.25 0zm0 -1.34375l1.234375 0q0.875 0 1.375 -0.390625q0.515625 -0.390625 0.515625 -0.9375q0 -0.46875 -0.421875 -0.8125q-0.40625 -0.359375 -1.171875 -0.359375l-1.53125 0l0 2.5zm12.513794 0.109375q0 1.765625 -1.140625 2.953125q-1.125 1.171875 -2.609375 1.171875q-1.328125 0 -2.40625 -0.96875q-1.328125 -1.21875 -1.328125 -3.15625q0 -1.953125 1.328125 -3.171875q1.078125 -0.984375 2.40625 -0.984375q1.484375 0 2.609375 1.1875q1.140625 1.171875 1.140625 2.96875zm-1.34375 0q0 -1.21875 -0.734375 -2.015625q-0.734375 -0.796875 -1.671875 -0.796875q-0.921875 0 -1.671875 0.796875q-0.734375 0.796875 -0.734375 2.015625q0 1.203125 0.734375 2.0q0.75 0.796875 1.671875 0.796875q0.9375 0 1.671875 -0.796875q0.734375 -0.796875 0.734375 -2.0zm3.638855 3.59375q-0.171875 0.21875 -0.28125 0.28125q-0.109375 0.046875 -0.265625 0.046875q-0.296875 0 -0.484375 -0.203125q-0.1875 -0.203125 -0.1875 -0.671875l0 -0.90625q0 -0.484375 0.1875 -0.6875q0.1875 -0.203125 0.484375 -0.203125q0.234375 0 0.390625 0.125q0.171875 0.125 0.25 0.421875q0.078125 0.28125 0.171875 0.390625q0.1875 0.1875 0.671875 0.40625q0.484375 0.203125 1.0625 0.203125q0.890625 0 1.453125 -0.421875q0.375 -0.25 0.375 -0.625q0 -0.234375 -0.1875 -0.453125q-0.171875 -0.21875 -0.5625 -0.359375q-0.265625 -0.109375 -1.171875 -0.28125q-1.09375 -0.1875 -1.65625 -0.46875q-0.546875 -0.296875 -0.875 -0.8125q-0.328125 -0.53125 -0.328125 -1.125q0 -0.96875 0.796875 -1.6875q0.796875 -0.71875 2.078125 -0.71875q0.515625 0 0.953125 0.125q0.453125 0.109375 0.8125 0.34375q0.25 -0.25 0.515625 -0.25q0.296875 0 0.46875 0.203125q0.1875 0.203125 0.1875 0.671875l0 1.0q0 0.484375 -0.1875 0.6875q-0.171875 0.203125 -0.46875 0.203125q-0.25 0 -0.4375 -0.140625q-0.140625 -0.109375 -0.21875 -0.4375q-0.0625 -0.34375 -0.171875 -0.484375q-0.1875 -0.25 -0.5625 -0.40625q-0.375 -0.171875 -0.875 -0.171875q-0.71875 0 -1.140625 0.34375q-0.421875 0.328125 -0.421875 0.6875q0 0.25 0.171875 0.484375q0.171875 0.21875 0.5 0.359375q0.21875 0.078125 1.25 0.28125q1.03125 0.203125 1.578125 0.453125q0.546875 0.234375 0.90625 0.75q0.375 0.515625 0.375 1.21875q0 1.0 -0.703125 1.59375q-0.921875 0.765625 -2.359375 0.765625q-0.546875 0 -1.078125 -0.140625q-0.515625 -0.125 -1.015625 -0.390625zm10.623169 -6.203125l0 5.21875l1.34375 0q0.484375 0 0.6875 0.1875q0.203125 0.171875 0.203125 0.484375q0 0.28125 -0.203125 0.46875q-0.203125 0.1875 -0.6875 0.1875l-4.03125 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.296875 0.203125 -0.46875q0.203125 -0.1875 0.6875 -0.1875l1.34375 0l0 -5.21875l-1.34375 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.296875 0.203125 -0.484375q0.203125 -0.1875 0.6875 -0.1875l4.03125 0q0.484375 0 0.6875 0.1875q0.203125 0.1875 0.203125 0.484375q0 0.296875 -0.203125 0.484375q-0.203125 0.1875 -0.6875 0.1875l-1.34375 0zm8.201294 2.53125l2.21875 2.6875q0.40625 0 0.59375 0.1875q0.203125 0.1875 0.203125 0.484375q0 0.28125 -0.203125 0.46875q-0.203125 0.1875 -0.6875 0.1875l-1.5 0q-0.46875 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.28125 0.1875 -0.46875q0.1875 -0.1875 0.578125 -0.1875l-1.34375 -1.65625l-1.359375 1.65625q0.375 0 0.5625 0.203125q0.1875 0.1875 0.1875 0.46875q0 0.28125 -0.203125 0.46875q-0.203125 0.1875 -0.6875 0.1875l-1.5 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.28125 0.203125 -0.46875q0.203125 -0.1875 0.59375 -0.1875l2.21875 -2.703125l-2.109375 -2.515625q-0.390625 -0.015625 -0.59375 -0.203125q-0.1875 -0.1875 -0.1875 -0.46875q0 -0.296875 0.203125 -0.484375q0.203125 -0.1875 0.6875 -0.1875l1.234375 0q0.484375 0 0.6875 0.1875q0.203125 0.1875 0.203125 0.484375q0 0.21875 -0.125 0.40625q-0.09375 0.109375 -0.390625 0.265625l1.25 1.484375l1.21875 -1.484375q-0.296875 -0.15625 -0.375 -0.265625q-0.140625 -0.1875 -0.140625 -0.40625q0 -0.296875 0.203125 -0.484375q0.21875 -0.1875 0.6875 -0.1875l1.234375 0q0.484375 0 0.6875 0.1875q0.203125 0.1875 0.203125 0.484375q0 0.28125 -0.203125 0.46875q-0.203125 0.1875 -0.578125 0.203125l-2.078125 2.53125zm8.138794 3.34375q0 0.375 -0.265625 0.640625q-0.265625 0.25 -0.734375 0.25q-0.46875 0 -0.734375 -0.25q-0.265625 -0.265625 -0.265625 -0.640625q0 -0.375 0.265625 -0.625q0.265625 -0.265625 0.734375 -0.265625q0.46875 0 0.734375 0.265625q0.265625 0.25 0.265625 0.625zm6.65448 -3.90625l0 2.671875q0 0.4375 0.171875 0.578125q0.28125 0.203125 0.984375 0.203125q1.015625 0 1.875 -0.4375q0.34375 -0.15625 0.53125 -0.15625q0.25 0 0.4375 0.203125q0.203125 0.1875 0.203125 0.46875q0 0.25 -0.203125 0.4375q-0.328125 0.3125 -1.265625 0.578125q-0.9375 0.25 -1.578125 0.25q-1.25 0 -1.875 -0.53125q-0.609375 -0.546875 -0.609375 -1.328125l0 -2.9375l-0.484375 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.28125 0.203125 -0.46875q0.203125 -0.1875 0.6875 -0.1875l0.484375 0l0 -1.203125q0 -0.484375 0.171875 -0.6875q0.1875 -0.203125 0.484375 -0.203125q0.296875 0 0.484375 0.203125q0.1875 0.203125 0.1875 0.6875l0 1.203125l2.46875 0q0.484375 0 0.6875 0.1875q0.203125 0.1875 0.203125 0.484375q0 0.28125 -0.203125 0.46875q-0.203125 0.1875 -0.6875 0.1875l-2.46875 0zm11.388794 -3.859375l0 7.109375l0.21875 0q0.484375 0 0.6875 0.1875q0.21875 0.171875 0.21875 0.484375q0 0.28125 -0.21875 0.46875q-0.203125 0.1875 -0.6875 0.1875l-1.546875 0l0 -0.328125q-0.46875 0.265625 -0.96875 0.40625q-0.484375 0.140625 -1.03125 0.140625q-1.5 0 -2.421875 -0.859375q-0.90625 -0.875 -0.90625 -2.171875q0 -1.359375 0.953125 -2.3125q0.96875 -0.953125 2.359375 -0.953125q0.515625 0 1.015625 0.15625q0.5 0.15625 1.0 0.46875l0 -1.65625l-0.234375 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.46875q0 -0.296875 0.203125 -0.484375q0.203125 -0.1875 0.6875 -0.1875l1.5625 0zm-1.328125 5.65625q0 -0.828125 -0.59375 -1.390625q-0.578125 -0.578125 -1.40625 -0.578125q-0.84375 0 -1.421875 0.578125q-0.578125 0.5625 -0.578125 1.375q0 0.734375 0.515625 1.203125q0.53125 0.46875 1.484375 0.46875q0.9375 0 1.46875 -0.46875q0.53125 -0.46875 0.53125 -1.1875z" fill-rule="nonzero"/><path fill="#000000" d="m596.98846 574.337l0.21875 0q0.359375 0 0.609375 0.25q0.25 0.25 0.25 0.609375q0 0.359375 -0.25 0.609375q-0.25 0.25 -0.609375 0.25l-0.21875 0q-0.359375 0 -0.625 -0.25q-0.25 -0.25 -0.25 -0.609375q0 -0.359375 0.25 -0.609375q0.265625 -0.25 0.625 -0.25zm7.8012695 0l0.21875 0q0.359375 0 0.609375 0.25q0.25 0.25 0.25 0.609375q0 0.359375 -0.25 0.609375q-0.25 0.25 -0.609375 0.25l-0.21875 0q-0.359375 0 -0.625 -0.25q-0.25 -0.25 -0.25 -0.609375q0 -0.359375 0.25 -0.609375q0.265625 -0.25 0.625 -0.25zm7.8012695 0l0.21875 0q0.359375 0 0.609375 0.25q0.25 0.25 0.25 0.609375q0 0.359375 -0.25 0.609375q-0.25 0.25 -0.609375 0.25l-0.21875 0q-0.359375 0 -0.625 -0.25q-0.25 -0.25 -0.25 -0.609375q0 -0.359375 0.25 -0.609375q0.265625 -0.25 0.625 -0.25z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m410.0862 91.29473c15.769165 3.0465012 68.47415 28.027802 94.61499 18.279c26.140839 -9.748802 49.212494 -62.554802 62.23001 -76.771805c13.017517 -14.216999 13.229187 -7.1084995 15.875 -8.530199" fill-rule="evenodd"/><path stroke="#6aa84f" stroke-width="4.0" stroke-linejoin="round" stroke-linecap="butt" d="m410.0862 91.29473c15.7691345 3.0464935 68.47415 28.027794 94.61499 18.278992c13.070404 -4.8743896 25.373505 -20.5131 36.036224 -36.71032c5.33136 -8.098618 10.2526245 -16.336853 14.654663 -23.439007c2.2009888 -3.5510788 4.272217 -6.8181305 6.199951 -9.641697c0.24090576 -0.35294724 0.4796753 -0.69896317 0.7161255 -1.0377388l0.6710205 -0.949646" fill-rule="evenodd"/><path fill="#6aa84f" stroke="#6aa84f" stroke-width="4.0" stroke-linecap="butt" d="m566.702 43.253487l11.273315 -15.686729l-18.719055 4.7703934z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m414.75577 111.0c20.873352 10.806366 101.86185 4.285286 125.24002 64.838196c23.378113 60.552917 7.7231445 243.88852 15.028809 298.4793c7.305664 54.59076 24.004333 24.22116 28.805176 29.0654" fill-rule="evenodd"/><path stroke="#6aa84f" stroke-width="4.0" stroke-linejoin="round" stroke-linecap="butt" d="m414.75577 111.0c20.873322 10.806366 101.86191 4.2852783 125.24002 64.838196c23.378113 60.552917 7.7231445 243.88852 15.028748 298.4793c0.91326904 6.8238525 1.9732056 12.320221 3.1383667 16.723755c0.58258057 2.2017822 1.1914673 4.1303406 1.8214111 5.815094c0.07873535 0.21057129 0.15783691 0.4173584 0.23724365 0.6203613l0.21588135 0.5397339" fill-rule="evenodd"/><path fill="#6aa84f" stroke="#6aa84f" stroke-width="4.0" stroke-linecap="butt" d="m558.9601 504.45612l19.170105 -2.3807373l-16.215454 -10.498566z" fill-rule="evenodd"/><path fill="#6aa84f" d="m135.75601 114.20727l86.70888 52.629555l3.0393677 -5.0078735l3.936798 16.094849l-16.094269 3.9366455l3.0393677 -5.0078735l-86.70889 -52.629555l8.047134 -1.9683151z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m135.75601 114.20727l86.70888 52.629555l3.0393677 -5.0078735l3.936798 16.094849l-16.094269 3.9366455l3.0393677 -5.0078735l-86.70889 -52.629555l8.047134 -1.9683151z" fill-rule="evenodd"/><path fill="#cfe2f3" d="m16.181103 251.20998l140.53543 0l0 161.76378l-140.53543 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m16.181103 251.20998l140.53543 0l0 161.76378l-140.53543 0z" fill-rule="evenodd"/><path fill="#000000" d="m31.931103 272.62625l-4.28125 9.21875q-0.15625 0.34375 -0.28125 0.453125q-0.171875 0.125 -0.421875 0.125q-0.265625 0 -0.46875 -0.203125q-0.203125 -0.1875 -0.203125 -0.4375q0 -0.171875 0.15625 -0.5l4.296875 -9.21875q0.15625 -0.34375 0.28125 -0.453125q0.171875 -0.125 0.40625 -0.125q0.28125 0 0.46875 0.1875q0.203125 0.1875 0.203125 0.4375q0 0.171875 -0.15625 0.515625zm7.998184 0l-4.28125 9.21875q-0.15625 0.34375 -0.28125 0.453125q-0.171875 0.125 -0.421875 0.125q-0.265625 0 -0.46875 -0.203125q-0.203125 -0.1875 -0.203125 -0.4375q0 -0.171875 0.15625 -0.5l4.296875 -9.21875q0.15625 -0.34375 0.28125 -0.453125q0.171875 -0.125 0.40625 -0.125q0.28125 0 0.46875 0.1875q0.203125 0.1875 0.203125 0.4375q0 0.171875 -0.15625 0.515625zm14.683868 3.921875q-0.328125 -0.203125 -0.6875 -0.296875q-0.34375 -0.109375 -0.734375 -0.109375q-0.78125 0 -1.234375 0.25q-0.203125 0.109375 -0.203125 0.25q0 0.140625 0.265625 0.28125q0.21875 0.109375 0.9375 0.203125q1.328125 0.1875 1.84375 0.375q0.6875 0.234375 1.046875 0.71875q0.375 0.46875 0.375 1.0q0 0.703125 -0.625 1.1875q-0.90625 0.703125 -2.34375 0.703125q-0.578125 0 -1.078125 -0.109375q-0.484375 -0.09375 -0.890625 -0.296875q-0.109375 0.09375 -0.21875 0.140625q-0.109375 0.046875 -0.21875 0.046875q-0.3125 0 -0.5 -0.203125q-0.1875 -0.21875 -0.1875 -0.6875l0 -0.453125q0 -0.484375 0.1875 -0.6875q0.1875 -0.203125 0.484375 -0.203125q0.234375 0 0.390625 0.140625q0.171875 0.125 0.265625 0.453125q0.296875 0.25 0.71875 0.390625q0.4375 0.125 1.0 0.125q0.921875 0 1.421875 -0.28125q0.25 -0.140625 0.25 -0.296875q0 -0.265625 -0.34375 -0.4375q-0.34375 -0.15625 -1.421875 -0.28125q-1.609375 -0.171875 -2.15625 -0.65625q-0.53125 -0.46875 -0.53125 -1.171875q0 -0.703125 0.59375 -1.1875q0.828125 -0.640625 2.15625 -0.640625q0.453125 0 0.875 0.09375q0.4375 0.078125 0.828125 0.25q0.125 -0.078125 0.234375 -0.125q0.109375 -0.046875 0.1875 -0.046875q0.28125 0 0.453125 0.203125q0.1875 0.203125 0.1875 0.6875l0 0.328125q0 0.4375 -0.09375 0.59375q-0.21875 0.296875 -0.578125 0.296875q-0.234375 0 -0.421875 -0.140625q-0.171875 -0.15625 -0.234375 -0.40625zm6.232559 -0.234375l0 2.671875q0 0.4375 0.171875 0.578125q0.28125 0.203125 0.984375 0.203125q1.015625 0 1.875 -0.4375q0.3437462 -0.15625 0.5312462 -0.15625q0.25 0 0.4375 0.203125q0.203125 0.1875 0.203125 0.46875q0 0.25 -0.203125 0.4375q-0.328125 0.3125 -1.2656212 0.578125q-0.9375 0.25 -1.578125 0.25q-1.25 0 -1.875 -0.53125q-0.609375 -0.546875 -0.609375 -1.328125l0 -2.9375l-0.484375 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.28125 0.203125 -0.46875q0.203125 -0.1875 0.6875 -0.1875l0.484375 0l0 -1.203125q0 -0.484375 0.171875 -0.6875q0.1875 -0.203125 0.484375 -0.203125q0.296875 0 0.484375 0.203125q0.1875 0.203125 0.1875 0.6875l0 1.203125l2.46875 0q0.484375 0 0.6874962 0.1875q0.203125 0.1875 0.203125 0.484375q0 0.28125 -0.203125 0.46875q-0.20312119 0.1875 -0.6874962 0.1875l-2.46875 0zm8.045055 -1.328125l0 0.828125q0.84375 -0.609375 1.328125 -0.796875q0.484375 -0.203125 0.90625 -0.203125q0.65625 0 1.265625 0.46875q0.421875 0.328125 0.421875 0.671875q0 0.28125 -0.203125 0.484375q-0.203125 0.203125 -0.484375 0.203125q-0.25 0 -0.53125 -0.25q-0.265625 -0.25 -0.46875 -0.25q-0.28125 0 -0.84375 0.359375q-0.546875 0.34375 -1.390625 1.046875l0 2.015625l1.90625 0q0.484375 0 0.6875 0.1875q0.203125 0.171875 0.203125 0.484375q0 0.28125 -0.203125 0.46875q-0.203125 0.1875 -0.6875 0.1875l-4.03125 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.296875 0.203125 -0.46875q0.203125 -0.1875 0.6875 -0.1875l0.796875 0l0 -3.25l-0.484375 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.28125 0.203125 -0.46875q0.203125 -0.1875 0.6875 -0.1875l1.8125 0zm8.763809 -2.53125l0 1.40625l-1.59375 0l0 -1.40625l1.59375 0zm0.171875 2.53125l0 4.578125l1.609375 0q0.46875 0 0.671875 0.1875q0.21875 0.171875 0.21875 0.484375q0 0.28125 -0.21875 0.46875q-0.203125 0.1875 -0.671875 0.1875l-4.546875 0q-0.46875 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.296875 0.203125 -0.46875q0.21875 -0.1875 0.6875 -0.1875l1.609375 0l0 -3.25l-1.078125 0q-0.46875 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.28125 0.203125 -0.46875q0.203125 -0.1875 0.6875 -0.1875l2.40625 0zm5.998184 0l0 0.453125q0.359375 -0.3125 0.796875 -0.46875q0.4375 -0.15625 0.953125 -0.15625q1.1875 0 1.875 0.734375q0.546875 0.578125 0.546875 1.53125l0 2.484375q0.421875 0 0.625 0.1875q0.203125 0.171875 0.203125 0.484375q0 0.28125 -0.203125 0.46875q-0.203125 0.1875 -0.6875 0.1875l-1.203125 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.296875 0.1875 -0.46875q0.203125 -0.1875 0.640625 -0.1875l0 -2.53125q0 -0.421875 -0.234375 -0.625q-0.3125 -0.265625 -0.921875 -0.265625q-0.46875 0 -0.8125 0.1875q-0.34375 0.171875 -0.875 0.75l0 2.484375q0.5 0 0.65625 0.09375q0.3125 0.1875 0.3125 0.578125q0 0.28125 -0.203125 0.46875q-0.203125 0.1875 -0.6875 0.1875l-1.515625 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.359375 0.3125 -0.5625q0.15625 -0.09375 0.671875 -0.09375l0 -3.25q-0.421875 0 -0.625 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.28125 0.203125 -0.46875q0.203125 -0.1875 0.6875 -0.1875l1.28125 0zm10.810684 0.390625l0 -0.390625l1.5625 0q0.484375 0 0.6875 0.1875q0.203125 0.1875 0.203125 0.484375q0 0.28125 -0.203125 0.46875q-0.203125 0.1875 -0.6875 0.1875l-0.234375 0l0 4.859375q0 0.703125 -0.296875 1.21875q-0.296875 0.53125 -0.90625 0.90625q-0.609375 0.375 -1.375 0.375l-1.515625 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.171875 -0.203125 -0.46875q0 -0.296875 0.203125 -0.484375q0.203125 -0.1875 0.6875 -0.1875l1.46875 0q0.625 0 0.953125 -0.34375q0.34375 -0.328125 0.34375 -0.828125l0 -0.65625q-0.4375 0.296875 -0.90625 0.4375q-0.453125 0.140625 -0.9375 0.140625q-1.359375 0 -2.28125 -0.90625q-0.921875 -0.90625 -0.921875 -2.25q0 -1.328125 0.921875 -2.234375q0.921875 -0.921875 2.28125 -0.921875q0.5 0 0.953125 0.15625q0.46875 0.140625 0.890625 0.4375zm-0.015625 2.5625q0 -0.734375 -0.546875 -1.265625q-0.53125 -0.546875 -1.296875 -0.546875q-0.765625 0 -1.3125 0.546875q-0.53125 0.53125 -0.53125 1.265625q0 0.734375 0.53125 1.28125q0.546875 0.53125 1.3125 0.53125q0.765625 0 1.296875 -0.53125q0.546875 -0.546875 0.546875 -1.28125zm7.560684 2.28125q0 0.375 -0.265625 0.640625q-0.265625 0.25 -0.734375 0.25q-0.46875 0 -0.734375 -0.25q-0.265625 -0.265625 -0.265625 -0.640625q0 -0.375 0.265625 -0.625q0.265625 -0.265625 0.734375 -0.265625q0.46875 0 0.734375 0.265625q0.265625 0.25 0.265625 0.625zm5.607559 -7.765625l0 2.84375q0.421875 -0.25 0.84375 -0.359375q0.421875 -0.125 0.859375 -0.125q0.6875 0 1.21875 0.234375q0.546875 0.234375 0.90625 0.734375q0.359375 0.5 0.359375 1.265625l0 2.515625q0.5 0 0.65625 0.09375q0.3125 0.203125 0.3125 0.578125q0 0.28125 -0.203125 0.46875q-0.203125 0.1875 -0.6875 0.1875l-1.515625 0q-0.46875 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.359375 0.3125 -0.5625q0.171875 -0.109375 0.671875 -0.09375l0 -2.421875q0 -0.515625 -0.234375 -0.71875q-0.3125 -0.28125 -0.90625 -0.28125q-0.4375 0 -0.78125 0.171875q-0.34375 0.171875 -0.921875 0.75l0 2.5q0.515625 0 0.65625 0.09375q0.328125 0.203125 0.328125 0.578125q0 0.28125 -0.203125 0.46875q-0.203125 0.1875 -0.6875 0.1875l-1.515625 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.359375 0.3125 -0.5625q0.15625 -0.109375 0.65625 -0.09375l0 -5.78125l-0.21875 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.28125 0.203125 -0.46875q0.203125 -0.1875 0.6875 -0.1875l1.5625 0zm10.388809 7.765625q0 0.375 -0.265625 0.640625q-0.265625 0.25 -0.734375 0.25q-0.46875 0 -0.734375 -0.25q-0.265625 -0.265625 -0.265625 -0.640625q0 -0.375 0.265625 -0.625q0.265625 -0.265625 0.734375 -0.265625q0.46875 0 0.734375 0.265625q0.265625 0.25 0.265625 0.625zm10.045067 -7.765625l0 7.109375l0.21875 0q0.484375 0 0.6875 0.1875q0.21875 0.171875 0.21875 0.484375q0 0.28125 -0.21875 0.46875q-0.203125 0.1875 -0.6875 0.1875l-1.5468826 0l0 -0.328125q-0.46875 0.265625 -0.96875 0.40625q-0.484375 0.140625 -1.03125 0.140625q-1.5 0 -2.421875 -0.859375q-0.90625 -0.875 -0.90625 -2.171875q0 -1.359375 0.953125 -2.3125q0.96875 -0.953125 2.359375 -0.953125q0.515625 0 1.015625 0.15625q0.5 0.15625 1.0 0.46875l0 -1.65625l-0.234375 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.46875q0 -0.296875 0.203125 -0.484375q0.203125 -0.1875 0.6875 -0.1875l1.5625076 0zm-1.3281326 5.65625q0 -0.828125 -0.59375 -1.390625q-0.578125 -0.578125 -1.40625 -0.578125q-0.84375 0 -1.421875 0.578125q-0.578125 0.5625 -0.578125 1.375q0 0.734375 0.515625 1.203125q0.53125 0.46875 1.484375 0.46875q0.9375 0 1.46875 -0.46875q0.53125 -0.46875 0.53125 -1.1875zm9.607567 0.5l-5.46875 0q0.203125 0.53125 0.734375 0.84375q0.53125 0.3125 1.4375 0.3125q0.75 0 1.96875 -0.3125q0.515625 -0.125 0.703125 -0.125q0.265625 0 0.453125 0.1875q0.1875 0.1875 0.1875 0.46875q0 0.265625 -0.203125 0.4375q-0.265625 0.25 -1.28125 0.46875q-1.0 0.21875 -1.921875 0.21875q-1.609375 0 -2.578125 -0.90625q-0.953125 -0.90625 -0.953125 -2.234375q0 -1.40625 1.03125 -2.28125q1.046875 -0.875 2.40625 -0.875q0.8125 0 1.484375 0.28125q0.6875 0.28125 1.015625 0.609375q0.46875 0.484375 0.78125 1.203125q0.203125 0.484375 0.203125 1.140625l0 0.5625zm-1.46875 -1.328125q-0.3125 -0.578125 -0.8125 -0.859375q-0.484375 -0.28125 -1.171875 -0.28125q-0.671875 0 -1.171875 0.28125q-0.5 0.28125 -0.8125 0.859375l3.96875 0zm6.107559 -0.96875l0 3.25l1.90625 0q0.484375 0 0.6875 0.1875q0.203125 0.171875 0.203125 0.484375q0 0.28125 -0.203125 0.46875q-0.203125 0.1875 -0.6875 0.1875l-4.03125 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.296875 0.203125 -0.46875q0.203125 -0.1875 0.6875 -0.1875l0.796875 0l0 -3.25l-0.640625 0q-0.484375 0 -0.6875 -0.1875q-0.203125 -0.1875 -0.203125 -0.484375q0 -0.28125 0.203125 -0.46875q0.203125 -0.1875 0.6875 -0.1875l0.640625 0l0 -0.515625q0 -0.859375 0.65625 -1.4375q0.65625 -0.578125 1.890625 -0.578125q0.5625 0 1.28125 0.109375q0.71875 0.09375 0.921875 0.28125q0.21875 0.171875 0.21875 0.453125q0 0.3125 -0.1875 0.515625q-0.1875 0.1875 -0.453125 0.1875q-0.125 0 -0.359375 -0.046875q-0.828125 -0.171875 -1.46875 -0.171875q-0.671875 0 -0.921875 0.203125q-0.25 0.203125 -0.25 0.484375l0 0.515625l2.0625 0q0.484375 0 0.6875 0.1875q0.203125 0.1875 0.203125 0.484375q0 0.28125 -0.203125 0.46875q-0.203125 0.1875 -0.6875 0.1875l-2.0625 0z" fill-rule="nonzero"/><path fill="#000000" d="m27.118603 312.42313q0 0.28125 -0.1875 0.46875q-0.1875 0.1875 -0.453125 0.1875q-0.28125 0 -0.46875 -0.1875q-0.1875 -0.1875 -0.1875 -0.46875q0 -0.265625 0.1875 -0.453125q0.1875 -0.1875 0.46875 -0.1875q0.265625 0 0.453125 0.1875q0.1875 0.1875 0.1875 0.453125zm2.609375 0q0 0.28125 -0.1875 0.46875q-0.1875 0.1875 -0.46875 0.1875q-0.265625 0 -0.453125 -0.1875q-0.1875 -0.1875 -0.1875 -0.46875q0 -0.265625 0.1875 -0.453125q0.1875 -0.1875 0.453125 -0.1875q0.28125 0 0.46875 0.1875q0.1875 0.1875 0.1875 0.453125zm2.609375 0q0 0.28125 -0.1875 0.46875q-0.1875 0.1875 -0.46875 0.1875q-0.265625 0 -0.453125 -0.1875q-0.1875 -0.1875 -0.1875 -0.46875q0 -0.265625 0.1875 -0.453125q0.1875 -0.1875 0.453125 -0.1875q0.28125 0 0.46875 0.1875q0.1875 0.1875 0.1875 0.453125z" fill-rule="nonzero"/><path fill="#000000" d="m29.884228 338.43872q0 0.6875 -0.484375 1.171875q-0.46875 0.484375 -1.140625 0.484375q-0.671875 0 -1.15625 -0.484375q-0.46875 -0.484375 -0.46875 -1.171875q0 -0.6875 0.46875 -1.15625q0.484375 -0.484375 1.15625 -0.484375q0.6875 0 1.15625 0.484375q0.46875 0.46875 0.46875 1.15625zm-0.375 0q0 -0.515625 -0.375 -0.890625q-0.359375 -0.375 -0.875 -0.375q-0.5 0 -0.875 0.375q-0.359375 0.375 -0.359375 0.890625q0 0.53125 0.359375 0.90625q0.375 0.359375 0.875 0.359375q0.515625 0 0.875 -0.359375q0.375 -0.375 0.375 -0.90625zm2.109375 1.84375l-4.9375 1.609375q-0.09375 0.03125 -0.140625 0.03125q-0.0625 0 -0.125 -0.046875q-0.046875 -0.0625 -0.046875 -0.140625q0 -0.0625 0.046875 -0.125q0.03125 -0.046875 0.140625 -0.078125l4.9375 -1.609375q0.09375 -0.03125 0.140625 -0.03125q0.0625 0 0.109375 0.0625q0.0625 0.0625 0.0625 0.125q0 0.078125 -0.046875 0.140625q-0.03125 0.03125 -0.140625 0.0625zm-0.078125 3.125q0 0.671875 -0.484375 1.15625q-0.484375 0.484375 -1.15625 0.484375q-0.65625 0 -1.140625 -0.484375q-0.484375 -0.484375 -0.484375 -1.15625q0 -0.6875 0.46875 -1.171875q0.484375 -0.484375 1.15625 -0.484375q0.671875 0 1.15625 0.484375q0.484375 0.484375 0.484375 1.171875zm-0.390625 0q0 -0.546875 -0.375 -0.90625q-0.359375 -0.359375 -0.875 -0.359375q-0.515625 0 -0.875 0.375q-0.359375 0.359375 -0.359375 0.890625q0 0.515625 0.359375 0.890625q0.359375 0.359375 0.875 0.359375q0.515625 0 0.875 -0.359375q0.375 -0.375 0.375 -0.890625zm6.5356445 -4.96875q0 0.6875 -0.484375 1.171875q-0.46875 0.484375 -1.140625 0.484375q-0.671875 0 -1.15625 -0.484375q-0.46875 -0.484375 -0.46875 -1.171875q0 -0.6875 0.46875 -1.15625q0.484375 -0.484375 1.15625 -0.484375q0.6875 0 1.15625 0.484375q0.46875 0.46875 0.46875 1.15625zm-0.375 0q0 -0.515625 -0.375 -0.890625q-0.359375 -0.375 -0.875 -0.375q-0.5 0 -0.875 0.375q-0.359375 0.375 -0.359375 0.890625q0 0.53125 0.359375 0.90625q0.375 0.359375 0.875 0.359375q0.515625 0 0.875 -0.359375q0.375 -0.375 0.375 -0.90625zm2.109375 1.84375l-4.9375 1.609375q-0.09375 0.03125 -0.140625 0.03125q-0.0625 0 -0.125 -0.046875q-0.046875 -0.0625 -0.046875 -0.140625q0 -0.0625 0.046875 -0.125q0.03125 -0.046875 0.140625 -0.078125l4.9375 -1.609375q0.09375 -0.03125 0.140625 -0.03125q0.0625 0 0.109375 0.0625q0.0625 0.0625 0.0625 0.125q0 0.078125 -0.046875 0.140625q-0.03125 0.03125 -0.140625 0.0625zm-0.078125 3.125q0 0.671875 -0.484375 1.15625q-0.484375 0.484375 -1.15625 0.484375q-0.65625 0 -1.140625 -0.484375q-0.484375 -0.484375 -0.484375 -1.15625q0 -0.6875 0.46875 -1.171875q0.484375 -0.484375 1.15625 -0.484375q0.671875 0 1.15625 0.484375q0.484375 0.484375 0.484375 1.171875zm-0.390625 0q0 -0.546875 -0.375 -0.90625q-0.359375 -0.359375 -0.875 -0.359375q-0.515625 0 -0.875 0.375q-0.359375 0.359375 -0.359375 0.890625q0 0.515625 0.359375 0.890625q0.359375 0.359375 0.875 0.359375q0.515625 0 0.875 -0.359375q0.375 -0.375 0.375 -0.890625zm3.7231445 -4.015625l0 0.96875q0.484375 -0.578125 1.015625 -0.859375q0.546875 -0.296875 1.296875 -0.296875q0.78125 0 1.453125 0.375q0.671875 0.359375 1.03125 1.015625q0.359375 0.65625 0.359375 1.390625q0 1.140625 -0.828125 1.953125q-0.8125 0.8125 -2.015625 0.8125q-1.421875 0 -2.3125 -1.15625l0 3.21875l1.296875 0q0.1875 0 0.265625 0.0625q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.546875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.09375 -0.0625 0.28125 -0.0625l0.71875 0l0 -6.875l-0.71875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.25 0zm4.625 2.59375q0 -0.921875 -0.671875 -1.578125q-0.671875 -0.65625 -1.640625 -0.65625q-0.96875 0 -1.640625 0.65625q-0.671875 0.65625 -0.671875 1.578125q0 0.90625 0.671875 1.578125q0.671875 0.65625 1.640625 0.65625q0.96875 0 1.640625 -0.65625q0.671875 -0.65625 0.671875 -1.578125zm7.0043945 2.90625l0 -0.78125q-1.078125 0.984375 -2.359375 0.984375q-0.78125 0 -1.1875 -0.421875q-0.515625 -0.5625 -0.515625 -1.296875l0 -3.4375l-0.71875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.25 0l0 3.984375q0 0.515625 0.328125 0.859375q0.328125 0.328125 0.828125 0.328125q1.296875 0 2.375 -1.1875l0 -3.4375l-0.984375 0q-0.1875 0 -0.265625 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.265625 -0.078125l1.53125 0l0 4.96875l0.4375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-0.984375 0zm3.9731445 -7.96875l0 3.53125q0.96875 -1.25 2.328125 -1.25q1.171875 0 2.0 0.84375q0.828125 0.84375 0.828125 2.078125q0 1.25 -0.84375 2.109375q-0.828125 0.859375 -1.984375 0.859375q-1.390625 0 -2.328125 -1.25l0 1.046875l-1.25 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l0.71875 0l0 -6.890625l-0.71875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.25 0zm4.625 5.234375q0 -1.015625 -0.6875 -1.703125q-0.6875 -0.703125 -1.625 -0.703125q-0.921875 0 -1.625 0.703125q-0.6875 0.6875 -0.6875 1.703125q0 1.0 0.6875 1.703125q0.703125 0.703125 1.625 0.703125q0.9375 0 1.625 -0.703125q0.6875 -0.703125 0.6875 -1.703125zm5.4575157 -5.234375l0 7.4375l2.09375 0q0.203125 0 0.28125 0.078125q0.078125 0.0625 0.078125 0.1875q0 0.109375 -0.078125 0.1875q-0.078125 0.078125 -0.28125 0.078125l-4.71875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l2.09375 0l0 -6.890625l-1.546875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l2.078125 0zm7.8012695 -0.265625l0 1.375l-0.796875 0l0 -1.375l0.796875 0zm0.015625 2.734375l0 4.96875l2.09375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-4.71875 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l2.09375 0l0 -4.421875l-1.5625 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.078125 -0.078125 0.28125 -0.078125l2.09375 0zm9.73877 0.546875l0 -0.1875q0 -0.1875 0.078125 -0.265625q0.078125 -0.09375 0.1875 -0.09375q0.125 0 0.203125 0.09375q0.078125 0.078125 0.078125 0.265625l0 1.21875q-0.015625 0.1875 -0.09375 0.28125q-0.0625 0.078125 -0.1875 0.078125q-0.109375 0 -0.1875 -0.078125q-0.0625 -0.078125 -0.078125 -0.25q-0.03125 -0.4375 -0.59375 -0.84375q-0.546875 -0.40625 -1.5 -0.40625q-1.1875 0 -1.796875 0.75q-0.609375 0.734375 -0.609375 1.6875q0 1.03125 0.671875 1.703125q0.6875 0.671875 1.765625 0.671875q0.609375 0 1.25 -0.21875q0.65625 -0.234375 1.171875 -0.734375q0.140625 -0.140625 0.234375 -0.140625q0.109375 0 0.171875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.265625 -0.640625 0.6875q-1.03125 0.671875 -2.296875 0.671875q-1.28125 0 -2.125 -0.8125q-0.828125 -0.828125 -0.828125 -2.09375q0 -1.28125 0.84375 -2.125q0.859375 -0.859375 2.140625 -0.859375q1.234375 0 2.0625 0.734375zm9.129395 8.515625l-7.09375 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.0625 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.09375 -0.0625 0.28125 -0.0625l7.09375 0q0.1875 0 0.265625 0.0625q0.078125 0.078125 0.078125 0.203125q0 0.125 -0.078125 0.1875q-0.078125 0.078125 -0.265625 0.078125zm5.7856445 -3.5625l0 -0.765625q-1.171875 0.96875 -2.484375 0.96875q-0.953125 0 -1.5 -0.484375q-0.53125 -0.484375 -0.53125 -1.1875q0 -0.765625 0.703125 -1.34375q0.71875 -0.578125 2.078125 -0.578125q0.359375 0 0.796875 0.046875q0.4375 0.046875 0.9375 0.140625l0 -0.859375q0 -0.4375 -0.40625 -0.75q-0.40625 -0.328125 -1.21875 -0.328125q-0.625 0 -1.75 0.359375q-0.203125 0.0625 -0.265625 0.0625q-0.09375 0 -0.171875 -0.078125q-0.0625 -0.078125 -0.0625 -0.1875q0 -0.109375 0.0625 -0.171875q0.078125 -0.09375 0.71875 -0.265625q0.984375 -0.265625 1.484375 -0.265625q1.015625 0 1.578125 0.5q0.5625 0.5 0.5625 1.125l0 3.53125l0.71875 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-1.25 0zm0 -2.65625q-0.375 -0.109375 -0.796875 -0.15625q-0.421875 -0.046875 -0.875 -0.046875q-1.171875 0 -1.828125 0.5q-0.484375 0.375 -0.484375 0.890625q0 0.484375 0.375 0.8125q0.375 0.328125 1.09375 0.328125q0.703125 0 1.296875 -0.265625q0.59375 -0.28125 1.21875 -0.890625l0 -1.171875zm4.2543945 -2.84375l0 0.96875q0.484375 -0.578125 1.015625 -0.859375q0.546875 -0.296875 1.296875 -0.296875q0.78125 0 1.453125 0.375q0.671875 0.359375 1.03125 1.015625q0.359375 0.65625 0.359375 1.390625q0 1.140625 -0.828125 1.953125q-0.8125 0.8125 -2.015625 0.8125q-1.421875 0 -2.3125 -1.15625l0 3.21875l1.296875 0q0.1875 0 0.265625 0.0625q0.09375 0.078125 0.09375 0.203125q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-2.546875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.09375 -0.0625 0.28125 -0.0625l0.71875 0l0 -6.875l-0.71875 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.203125q0 -0.109375 0.078125 -0.1875q0.09375 -0.078125 0.28125 -0.078125l1.25 0zm4.625 2.59375q0 -0.921875 -0.671875 -1.578125q-0.671875 -0.65625 -1.640625 -0.65625q-0.96875 0 -1.640625 0.65625q-0.671875 0.65625 -0.671875 1.578125q0 0.90625 0.671875 1.578125q0.671875 0.65625 1.640625 0.65625q0.96875 0 1.640625 -0.65625q0.671875 -0.65625 0.671875 -1.578125zm5.4575195 -5.328125l0 1.375l-0.796875 0l0 -1.375l0.796875 0zm0.015625 2.734375l0 4.96875l2.09375 0q0.1875 0 0.265625 0.078125q0.09375 0.0625 0.09375 0.1875q0 0.109375 -0.09375 0.1875q-0.078125 0.078125 -0.265625 0.078125l-4.71875 0q-0.203125 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.1875q0.078125 -0.078125 0.28125 -0.078125l2.09375 0l0 -4.421875l-1.5625 0q-0.1875 0 -0.28125 -0.078125q-0.078125 -0.078125 -0.078125 -0.1875q0 -0.125 0.078125 -0.203125q0.078125 -0.078125 0.28125 -0.078125l2.09375 0zm7.4575195 2.34375q0 -0.734375 0.1875 -1.546875q0.1875 -0.828125 0.71875 -1.890625q0.546875 -1.078125 0.796875 -1.296875q0.078125 -0.078125 0.171875 -0.078125q0.109375 0 0.1875 0.078125q0.078125 0.078125 0.078125 0.1875q0 0.0625 -0.046875 0.140625q-0.6875 1.28125 -1.0 2.328125q-0.296875 1.03125 -0.296875 2.078125q0 1.046875 0.296875 2.09375q0.3125 1.03125 1.0 2.3125q0.046875 0.078125 0.046875 0.140625q0 0.09375 -0.078125 0.171875q-0.078125 0.09375 -0.1875 0.09375q-0.09375 0 -0.171875 -0.078125q-0.234375 -0.21875 -0.765625 -1.265625q-0.53125 -1.046875 -0.734375 -1.84375q-0.203125 -0.8125 -0.203125 -1.625zm8.020027 0q0 0.734375 -0.203125 1.546875q-0.1875 0.8125 -0.734375 1.890625q-0.53125 1.078125 -0.78125 1.296875q-0.078125 0.078125 -0.15625 0.078125q-0.125 0 -0.203125 -0.09375q-0.078125 -0.078125 -0.078125 -0.171875q0 -0.0625 0.046875 -0.140625q0.703125 -1.28125 1.0 -2.3125q0.296875 -1.046875 0.296875 -2.09375q0 -1.046875 -0.296875 -2.078125q-0.296875 -1.046875 -1.0 -2.328125q-0.046875 -0.078125 -0.046875 -0.140625q0 -0.109375 0.078125 -0.1875q0.078125 -0.078125 0.203125 -0.078125q0.078125 0 0.15625 0.078125q0.234375 0.203125 0.765625 1.25q0.546875 1.046875 0.75 1.859375q0.203125 0.8125 0.203125 1.625z" fill-rule="nonzero"/><path fill="#000000" d="m27.118603 376.4231q0 0.28125 -0.1875 0.46875q-0.1875 0.1875 -0.453125 0.1875q-0.28125 0 -0.46875 -0.1875q-0.1875 -0.1875 -0.1875 -0.46875q0 -0.265625 0.1875 -0.453125q0.1875 -0.1875 0.46875 -0.1875q0.265625 0 0.453125 0.1875q0.1875 0.1875 0.1875 0.453125zm2.609375 0q0 0.28125 -0.1875 0.46875q-0.1875 0.1875 -0.46875 0.1875q-0.265625 0 -0.453125 -0.1875q-0.1875 -0.1875 -0.1875 -0.46875q0 -0.265625 0.1875 -0.453125q0.1875 -0.1875 0.453125 -0.1875q0.28125 0 0.46875 0.1875q0.1875 0.1875 0.1875 0.453125zm2.609375 0q0 0.28125 -0.1875 0.46875q-0.1875 0.1875 -0.46875 0.1875q-0.265625 0 -0.453125 -0.1875q-0.1875 -0.1875 -0.1875 -0.46875q0 -0.265625 0.1875 -0.453125q0.1875 -0.1875 0.453125 -0.1875q0.28125 0 0.46875 0.1875q0.1875 0.1875 0.1875 0.453125z" fill-rule="nonzero"/><path fill="#6aa84f" d="m133.29906 336.70108l85.46431 -41.795807l-2.2992096 -4.700775l14.000244 4.8036804l-4.803406 13.999481l-2.2992096 -4.7008057l-85.46431 41.795807l2.401703 -6.999756z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m133.29906 336.70108l85.46431 -41.795807l-2.2992096 -4.700775l14.000244 4.8036804l-4.803406 13.999481l-2.2992096 -4.7008057l-85.46431 41.795807l2.401703 -6.999756z" fill-rule="evenodd"/><path fill="#e6b8af" d="m197.99963 550.50757l124.0 0l0 51.496094l-124.0 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m197.99963 550.50757l124.0 0l0 51.496094l-124.0 0z" fill-rule="evenodd"/><path fill="#000000" d="m208.49963 572.1756l0 -13.359375l1.765625 0l0 5.484375l6.9375 0l0 -5.484375l1.765625 0l0 13.359375l-1.765625 0l0 -6.296875l-6.9375 0l0 6.296875l-1.765625 0zm19.832321 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm15.453842 4.578125q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm10.469467 4.859375l0 -1.21875q-0.90625 1.4375 -2.703125 1.4375q-1.15625 0 -2.125 -0.640625q-0.96875 -0.640625 -1.5 -1.78125q-0.53125 -1.140625 -0.53125 -2.625q0 -1.453125 0.484375 -2.625q0.484375 -1.1875 1.4375 -1.8125q0.96875 -0.625 2.171875 -0.625q0.875 0 1.546875 0.375q0.6875 0.359375 1.109375 0.953125l0 -4.796875l1.640625 0l0 13.359375l-1.53125 0zm-5.171875 -4.828125q0 1.859375 0.78125 2.78125q0.78125 0.921875 1.84375 0.921875q1.078125 0 1.828125 -0.875q0.75 -0.890625 0.75 -2.6875q0 -1.984375 -0.765625 -2.90625q-0.765625 -0.9375 -1.890625 -0.9375q-1.078125 0 -1.8125 0.890625q-0.734375 0.890625 -0.734375 2.8125zm15.906967 1.71875l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.125702 5.765625l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0z" fill-rule="nonzero"/><path fill="#000000" d="m214.68713 588.9412l0 -1.578125l5.65625 0l0 4.953125q-1.296875 1.046875 -2.6875 1.578125q-1.375 0.515625 -2.84375 0.515625q-1.96875 0 -3.578125 -0.84375q-1.609375 -0.84375 -2.421875 -2.4375q-0.8125 -1.59375 -0.8125 -3.5625q0 -1.953125 0.8125 -3.640625q0.8125 -1.6875 2.34375 -2.5q1.53125 -0.828125 3.515625 -0.828125q1.453125 0 2.625 0.46875q1.171875 0.46875 1.828125 1.3125q0.671875 0.828125 1.015625 2.171875l-1.59375 0.4375q-0.296875 -1.015625 -0.75 -1.59375q-0.4375 -0.59375 -1.265625 -0.9375q-0.828125 -0.34375 -1.84375 -0.34375q-1.203125 0 -2.09375 0.375q-0.890625 0.359375 -1.4375 0.96875q-0.53125 0.59375 -0.828125 1.3125q-0.515625 1.234375 -0.515625 2.6875q0 1.78125 0.609375 2.984375q0.625 1.203125 1.796875 1.796875q1.171875 0.578125 2.5 0.578125q1.140625 0 2.234375 -0.4375q1.09375 -0.453125 1.65625 -0.953125l0 -2.484375l-3.921875 0zm14.683304 2.125l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.141342 5.765625l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm17.000717 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.125717 5.765625l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm12.540802 -1.1875q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm7.781952 3.390625l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm0.9958191 -3.375q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm9.281952 4.84375l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m75.44882 198.69029l21.984245 0l0 26.078735l-21.984245 0z" fill-rule="evenodd"/><path stroke="#ffffff" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m75.44882 198.69029l21.984245 0l0 26.078735l-21.984245 0z" fill-rule="evenodd"/><path fill="#000000" d="m86.13632 196.64966l0 -1.875l1.875 0l0 1.875l-1.875 0z" fill-rule="nonzero"/><path fill="#000000" d="m86.13632 218.64966l0 -1.875l1.875 0l0 1.875l-1.875 0z" fill-rule="nonzero"/><path fill="#000000" d="m86.13632 240.64966l0 -1.875l1.875 0l0 1.875l-1.875 0z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m255.81665 602.0026l-85.63779 73.00787" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m255.81667 602.0026l-81.07185 69.115295" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m173.67323 669.86096l-2.3818817 4.201111l4.5250397 -1.6871948z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m255.81665 602.0026l90.99213 74.99213" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m255.81667 602.0026l86.36195 71.17615" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m341.1281 674.45337l4.5525208 1.6116333l-2.4515076 -4.1608887z" fill-rule="evenodd"/><path fill="#fff2cc" d="m118.0 675.99945l82.96063 0l0 102.17297l-13.827057 13.827026l-69.133575 0z" fill-rule="evenodd"/><path fill="#cbc1a3" d="m187.13358 791.99945l2.7654114 -11.0616455l11.0616455 -2.7653809z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m187.13358 791.99945l2.7654114 -11.0616455l11.0616455 -2.7653809l-13.827057 13.827026l-69.133575 0l0 -116.0l82.96063 0l0 102.17297" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m187.13358 791.99945l2.7654114 -11.0616455l11.0616455 -2.7653809l-13.827057 13.827026l-69.133575 0l0 -116.0l82.96063 0l0 102.17297" fill-rule="evenodd"/><path fill="#000000" d="m132.39062 704.71655l-3.40625 7.375q-0.140625 0.265625 -0.234375 0.359375q-0.140625 0.109375 -0.328125 0.109375q-0.21875 0 -0.390625 -0.15625q-0.15625 -0.15625 -0.15625 -0.359375q0 -0.140625 0.125 -0.40625l3.4375 -7.375q0.125 -0.265625 0.21875 -0.359375q0.140625 -0.109375 0.328125 -0.109375q0.21875 0 0.375 0.15625q0.15625 0.15625 0.15625 0.359375q0 0.140625 -0.125 0.40625zm6.3947906 0l-3.40625 7.375q-0.140625 0.265625 -0.234375 0.359375q-0.140625 0.109375 -0.328125 0.109375q-0.21875 0 -0.390625 -0.15625q-0.15625 -0.15625 -0.15625 -0.359375q0 -0.140625 0.125 -0.40625l3.4375 -7.375q0.125 -0.265625 0.21875 -0.359375q0.140625 -0.109375 0.328125 -0.109375q0.21875 0 0.375 0.15625q0.15625 0.15625 0.15625 0.359375q0 0.140625 -0.125 0.40625zm8.945831 1.890625l0 0.296875q0.265625 -0.25 0.46875 -0.34375q0.21875 -0.109375 0.5 -0.109375q0.21875 0 0.453125 0.125q0.234375 0.109375 0.453125 0.34375q0.265625 -0.234375 0.546875 -0.34375q0.296875 -0.109375 0.59375 -0.109375q0.59375 0 0.953125 0.3125q0.5 0.421875 0.5 1.09375l0 2.390625q0.328125 0 0.484375 0.15625q0.171875 0.140625 0.171875 0.375q0 0.234375 -0.171875 0.390625q-0.15625 0.140625 -0.546875 0.140625l-1.015625 0l0 -3.359375q0 -0.25 -0.09375 -0.34375q-0.078125 -0.09375 -0.265625 -0.09375q-0.171875 0 -0.328125 0.09375q-0.1875 0.125 -0.46875 0.484375l0 2.15625q0.34375 0 0.5 0.15625q0.15625 0.140625 0.15625 0.375q0 0.234375 -0.15625 0.390625q-0.15625 0.140625 -0.546875 0.140625l-1.015625 0l0 -3.359375q0 -0.25 -0.09375 -0.34375q-0.078125 -0.09375 -0.265625 -0.09375q-0.1875 0 -0.375 0.125q-0.171875 0.109375 -0.4375 0.453125l0 2.15625q0.34375 0 0.5 0.15625q0.171875 0.140625 0.171875 0.375q0 0.234375 -0.171875 0.390625q-0.15625 0.140625 -0.546875 0.140625l-0.96875 0q-0.375 0 -0.53125 -0.140625q-0.171875 -0.15625 -0.171875 -0.390625q0 -0.234375 0.15625 -0.375q0.15625 -0.15625 0.5 -0.15625l0 -2.59375q-0.34375 0 -0.5 -0.140625q-0.15625 -0.15625 -0.15625 -0.390625q0 -0.234375 0.171875 -0.375q0.15625 -0.15625 0.53125 -0.15625l1.015625 0zm9.004166 4.71875l0 -0.25q-0.40625 0.21875 -0.890625 0.3125q-0.484375 0.109375 -0.875 0.109375q-0.859375 0 -1.390625 -0.453125q-0.53125 -0.453125 -0.53125 -1.0q0 -0.671875 0.671875 -1.25q0.6875 -0.578125 1.890625 -0.578125q0.484375 0 1.125 0.109375l0 -0.25q0 -0.25 -0.203125 -0.390625q-0.203125 -0.15625 -0.78125 -0.15625q-0.484375 0 -1.234375 0.1875q-0.28125 0.0625 -0.4375 0.0625q-0.203125 0 -0.359375 -0.140625q-0.140625 -0.15625 -0.140625 -0.40625q0 -0.125 0.046875 -0.21875q0.046875 -0.109375 0.140625 -0.171875q0.09375 -0.0625 0.390625 -0.140625q0.40625 -0.109375 0.8125 -0.171875q0.40625 -0.0625 0.734375 -0.0625q1.0 0 1.546875 0.4375q0.546875 0.421875 0.546875 1.15625l0 2.203125l0.1875 0q0.390625 0 0.546875 0.15625q0.171875 0.140625 0.171875 0.375q0 0.234375 -0.171875 0.390625q-0.15625 0.140625 -0.546875 0.140625l-1.25 0zm0 -1.90625q-0.640625 -0.125 -1.1875 -0.125q-0.640625 0 -1.109375 0.3125q-0.296875 0.203125 -0.296875 0.40625q0 0.15625 0.140625 0.25q0.265625 0.171875 0.71875 0.171875q0.375 0 0.859375 -0.140625q0.5 -0.15625 0.875 -0.421875l0 -0.453125zm5.1760406 -1.75l0 2.140625q0 0.34375 0.140625 0.453125q0.21875 0.171875 0.78125 0.171875q0.8125 0 1.5 -0.359375q0.265625 -0.125 0.421875 -0.125q0.203125 0 0.359375 0.15625q0.15625 0.15625 0.15625 0.375q0 0.203125 -0.171875 0.359375q-0.25 0.25 -1.0 0.453125q-0.75 0.203125 -1.265625 0.203125q-1.0 0 -1.5 -0.421875q-0.484375 -0.4375 -0.484375 -1.0625l0 -2.34375l-0.390625 0q-0.390625 0 -0.5625 -0.140625q-0.15625 -0.15625 -0.15625 -0.390625q0 -0.234375 0.15625 -0.375q0.171875 -0.15625 0.5625 -0.15625l0.390625 0l0 -0.96875q0 -0.390625 0.140625 -0.546875q0.15625 -0.171875 0.390625 -0.171875q0.234375 0 0.375 0.171875q0.15625 0.15625 0.15625 0.546875l0 0.96875l1.96875 0q0.390625 0 0.546875 0.15625q0.171875 0.140625 0.171875 0.375q0 0.234375 -0.171875 0.390625q-0.15625 0.140625 -0.546875 0.140625l-1.96875 0zm5.5510406 -3.09375l0 2.28125q0.34375 -0.203125 0.671875 -0.296875q0.34375 -0.09375 0.6875 -0.09375q0.5625 0 0.984375 0.1875q0.4375 0.1875 0.71875 0.59375q0.28125 0.390625 0.28125 1.015625l0 2.0q0.40625 0 0.53125 0.078125q0.25 0.15625 0.25 0.453125q0 0.234375 -0.15625 0.390625q-0.15625 0.140625 -0.546875 0.140625l-1.21875 0q-0.375 0 -0.546875 -0.140625q-0.15625 -0.15625 -0.15625 -0.390625q0 -0.296875 0.25 -0.453125q0.125 -0.09375 0.53125 -0.078125l0 -1.9375q0 -0.40625 -0.1875 -0.578125q-0.25 -0.21875 -0.734375 -0.21875q-0.34375 0 -0.625 0.140625q-0.265625 0.140625 -0.734375 0.59375l0 2.0q0.421875 0 0.53125 0.078125q0.25 0.15625 0.25 0.453125q0 0.234375 -0.15625 0.390625q-0.15625 0.140625 -0.546875 0.140625l-1.21875 0q-0.375 0 -0.546875 -0.140625q-0.15625 -0.15625 -0.15625 -0.390625q0 -0.296875 0.25 -0.453125q0.125 -0.09375 0.53125 -0.078125l0 -4.625l-0.1875 0q-0.375 0 -0.546875 -0.140625q-0.15625 -0.15625 -0.15625 -0.390625q0 -0.234375 0.15625 -0.375q0.171875 -0.15625 0.546875 -0.15625l1.25 0zm8.316666 6.21875q0 0.296875 -0.21875 0.5q-0.21875 0.203125 -0.59375 0.203125q-0.375 0 -0.59375 -0.203125q-0.203125 -0.203125 -0.203125 -0.5q0 -0.3125 0.203125 -0.515625q0.21875 -0.203125 0.59375 -0.203125q0.375 0 0.59375 0.203125q0.21875 0.203125 0.21875 0.515625zm4.4729156 -6.21875l0 2.28125q0.34375 -0.203125 0.671875 -0.296875q0.34375 -0.09375 0.6875 -0.09375q0.5625 0 0.984375 0.1875q0.4375 0.1875 0.71875 0.59375q0.28125 0.390625 0.28125 1.015625l0 2.0q0.40625 0 0.53125 0.078125q0.25 0.15625 0.25 0.453125q0 0.234375 -0.15625 0.390625q-0.15625 0.140625 -0.546875 0.140625l-1.21875 0q-0.375 0 -0.546875 -0.140625q-0.15625 -0.15625 -0.15625 -0.390625q0 -0.296875 0.25 -0.453125q0.125 -0.09375 0.53125 -0.078125l0 -1.9375q0 -0.40625 -0.1875 -0.578125q-0.25 -0.21875 -0.734375 -0.21875q-0.34375 0 -0.625 0.140625q-0.265625 0.140625 -0.734375 0.59375l0 2.0q0.421875 0 0.53125 0.078125q0.25 0.15625 0.25 0.453125q0 0.234375 -0.15625 0.390625q-0.15625 0.140625 -0.546875 0.140625l-1.21875 0q-0.375 0 -0.546875 -0.140625q-0.15625 -0.15625 -0.15625 -0.390625q0 -0.296875 0.25 -0.453125q0.125 -0.09375 0.53125 -0.078125l0 -4.625l-0.1875 0q-0.375 0 -0.546875 -0.140625q-0.15625 -0.15625 -0.15625 -0.390625q0 -0.234375 0.15625 -0.375q0.171875 -0.15625 0.546875 -0.15625l1.25 0z" fill-rule="nonzero"/><path fill="#000000" d="m131.01562 723.7947q0 0.296875 -0.21875 0.5q-0.21875 0.203125 -0.59375 0.203125q-0.375 0 -0.59375 -0.203125q-0.203125 -0.203125 -0.203125 -0.5q0 -0.3125 0.203125 -0.515625q0.21875 -0.203125 0.59375 -0.203125q0.375 0 0.59375 0.203125q0.21875 0.203125 0.21875 0.515625z" fill-rule="nonzero"/><path fill="#000000" d="m131.01562 736.7947q0 0.296875 -0.21875 0.5q-0.21875 0.203125 -0.59375 0.203125q-0.375 0 -0.59375 -0.203125q-0.203125 -0.203125 -0.203125 -0.5q0 -0.3125 0.203125 -0.515625q0.21875 -0.203125 0.59375 -0.203125q0.375 0 0.59375 0.203125q0.21875 0.203125 0.21875 0.515625z" fill-rule="nonzero"/><path fill="#000000" d="m131.01562 749.7947q0 0.296875 -0.21875 0.5q-0.21875 0.203125 -0.59375 0.203125q-0.375 0 -0.59375 -0.203125q-0.203125 -0.203125 -0.203125 -0.5q0 -0.3125 0.203125 -0.515625q0.21875 -0.203125 0.59375 -0.203125q0.375 0 0.59375 0.203125q0.21875 0.203125 0.21875 0.515625z" fill-rule="nonzero"/><path fill="#fff2cc" d="m312.0141 675.99945l90.99213 0l0 100.83435l-15.16568 15.165649l-75.82645 0z" fill-rule="evenodd"/><path fill="#cbc1a3" d="m387.84055 791.99945l3.033142 -12.132507l12.132538 -3.033142z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m387.84055 791.99945l3.033142 -12.132507l12.132538 -3.033142l-15.16568 15.165649l-75.82645 0l0 -116.0l90.99213 0l0 100.83435" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m387.84055 791.99945l3.033142 -12.132507l12.132538 -3.033142l-15.16568 15.165649l-75.82645 0l0 -116.0l90.99213 0l0 100.83435" fill-rule="evenodd"/><path fill="#000000" d="m326.40472 704.04724l-3.40625 7.375q-0.140625 0.265625 -0.234375 0.359375q-0.140625 0.109375 -0.328125 0.109375q-0.21875 0 -0.390625 -0.15625q-0.15625 -0.15625 -0.15625 -0.359375q0 -0.140625 0.125 -0.40625l3.4375 -7.375q0.125 -0.265625 0.21875 -0.359375q0.140625 -0.109375 0.328125 -0.109375q0.21875 0 0.375 0.15625q0.15625 0.15625 0.15625 0.359375q0 0.140625 -0.125 0.40625zm6.3947754 0l-3.40625 7.375q-0.140625 0.265625 -0.234375 0.359375q-0.140625 0.109375 -0.328125 0.109375q-0.21875 0 -0.390625 -0.15625q-0.15625 -0.15625 -0.15625 -0.359375q0 -0.140625 0.125 -0.40625l3.4375 -7.375q0.125 -0.265625 0.21875 -0.359375q0.140625 -0.109375 0.328125 -0.109375q0.21875 0 0.375 0.15625q0.15625 0.15625 0.15625 0.359375q0 0.140625 -0.125 0.40625zm11.742706 3.140625q-0.25 -0.171875 -0.546875 -0.25q-0.28125 -0.078125 -0.59375 -0.078125q-0.609375 0 -0.984375 0.203125q-0.15625 0.09375 -0.15625 0.1875q0 0.125 0.21875 0.234375q0.171875 0.09375 0.734375 0.171875q1.0625 0.140625 1.484375 0.28125q0.546875 0.1875 0.84375 0.578125q0.296875 0.375 0.296875 0.796875q0 0.578125 -0.5 0.953125q-0.734375 0.5625 -1.890625 0.5625q-0.453125 0 -0.84375 -0.078125q-0.390625 -0.078125 -0.71875 -0.234375q-0.078125 0.0625 -0.171875 0.109375q-0.09375 0.03125 -0.1875 0.03125q-0.25 0 -0.40625 -0.15625q-0.140625 -0.171875 -0.140625 -0.5625l0 -0.359375q0 -0.390625 0.140625 -0.546875q0.15625 -0.171875 0.40625 -0.171875q0.1875 0 0.3125 0.109375q0.140625 0.109375 0.203125 0.375q0.25 0.203125 0.59375 0.3125q0.34375 0.109375 0.78125 0.109375q0.734375 0 1.140625 -0.234375q0.203125 -0.109375 0.203125 -0.234375q0 -0.21875 -0.28125 -0.34375q-0.28125 -0.140625 -1.140625 -0.234375q-1.28125 -0.140625 -1.71875 -0.515625q-0.421875 -0.375 -0.421875 -0.9375q0 -0.578125 0.484375 -0.953125q0.65625 -0.515625 1.703125 -0.515625q0.375 0 0.71875 0.078125q0.34375 0.0625 0.65625 0.203125q0.09375 -0.078125 0.171875 -0.109375q0.09375 -0.03125 0.171875 -0.03125q0.21875 0 0.359375 0.171875q0.140625 0.15625 0.140625 0.53125l0 0.265625q0 0.34375 -0.078125 0.46875q-0.171875 0.25 -0.453125 0.25q-0.1875 0 -0.34375 -0.125q-0.140625 -0.125 -0.1875 -0.3125zm4.988556 -0.1875l0 2.140625q0 0.34375 0.140625 0.453125q0.21875 0.171875 0.78125 0.171875q0.8125 0 1.5 -0.359375q0.265625 -0.125 0.421875 -0.125q0.203125 0 0.359375 0.15625q0.15625 0.15625 0.15625 0.375q0 0.203125 -0.171875 0.359375q-0.25 0.25 -1.0 0.453125q-0.75 0.203125 -1.265625 0.203125q-1.0 0 -1.5 -0.421875q-0.484375 -0.4375 -0.484375 -1.0625l0 -2.34375l-0.390625 0q-0.390625 0 -0.5625 -0.140625q-0.15625 -0.15625 -0.15625 -0.390625q0 -0.234375 0.15625 -0.375q0.171875 -0.15625 0.5625 -0.15625l0.390625 0l0 -0.96875q0 -0.390625 0.140625 -0.546875q0.15625 -0.171875 0.390625 -0.171875q0.234375 0 0.375 0.171875q0.15625 0.15625 0.15625 0.546875l0 0.96875l1.96875 0q0.390625 0 0.546875 0.15625q0.171875 0.140625 0.171875 0.375q0 0.234375 -0.171875 0.390625q-0.15625 0.140625 -0.546875 0.140625l-1.96875 0zm6.4260254 -1.0625l0 0.65625q0.671875 -0.484375 1.0625 -0.640625q0.390625 -0.15625 0.734375 -0.15625q0.515625 0 1.0 0.375q0.34375 0.265625 0.34375 0.53125q0 0.234375 -0.171875 0.390625q-0.15625 0.15625 -0.375 0.15625q-0.203125 0 -0.421875 -0.1875q-0.21875 -0.203125 -0.390625 -0.203125q-0.21875 0 -0.671875 0.28125q-0.4375 0.28125 -1.109375 0.84375l0 1.609375l1.53125 0q0.375 0 0.53125 0.15625q0.171875 0.140625 0.171875 0.375q0 0.234375 -0.171875 0.390625q-0.15625 0.140625 -0.53125 0.140625l-3.21875 0q-0.390625 0 -0.5625 -0.140625q-0.15625 -0.15625 -0.15625 -0.390625q0 -0.234375 0.15625 -0.375q0.171875 -0.15625 0.5625 -0.15625l0.625 0l0 -2.59375l-0.375 0q-0.390625 0 -0.5625 -0.140625q-0.15625 -0.15625 -0.15625 -0.390625q0 -0.234375 0.15625 -0.375q0.171875 -0.15625 0.5625 -0.15625l1.4375 0zm7.004181 -2.03125l0 1.125l-1.265625 0l0 -1.125l1.265625 0zm0.140625 2.03125l0 3.65625l1.28125 0q0.390625 0 0.546875 0.15625q0.171875 0.140625 0.171875 0.375q0 0.234375 -0.171875 0.390625q-0.15625 0.140625 -0.546875 0.140625l-3.625 0q-0.375 0 -0.546875 -0.140625q-0.15625 -0.15625 -0.15625 -0.390625q0 -0.234375 0.15625 -0.375q0.171875 -0.15625 0.546875 -0.15625l1.28125 0l0 -2.59375l-0.859375 0q-0.375 0 -0.546875 -0.140625q-0.15625 -0.15625 -0.15625 -0.390625q0 -0.234375 0.15625 -0.375q0.171875 -0.15625 0.546875 -0.15625l1.921875 0zm4.8010254 0l0 0.359375q0.28125 -0.25 0.625 -0.375q0.359375 -0.125 0.765625 -0.125q0.953125 0 1.5 0.578125q0.4375 0.46875 0.4375 1.234375l0 1.984375q0.34375 0 0.5 0.15625q0.171875 0.140625 0.171875 0.375q0 0.234375 -0.171875 0.390625q-0.15625 0.140625 -0.546875 0.140625l-0.96875 0q-0.375 0 -0.546875 -0.140625q-0.15625 -0.15625 -0.15625 -0.390625q0 -0.234375 0.15625 -0.375q0.15625 -0.15625 0.5 -0.15625l0 -2.015625q0 -0.34375 -0.1875 -0.515625q-0.25 -0.203125 -0.734375 -0.203125q-0.375 0 -0.65625 0.140625q-0.265625 0.140625 -0.6875 0.609375l0 1.984375q0.40625 0 0.53125 0.078125q0.25 0.15625 0.25 0.453125q0 0.234375 -0.171875 0.390625q-0.15625 0.140625 -0.546875 0.140625l-1.203125 0q-0.390625 0 -0.5625 -0.140625q-0.15625 -0.15625 -0.15625 -0.390625q0 -0.296875 0.25 -0.453125q0.125 -0.078125 0.53125 -0.078125l0 -2.59375q-0.328125 0 -0.5 -0.140625q-0.15625 -0.15625 -0.15625 -0.390625q0 -0.234375 0.15625 -0.375q0.171875 -0.15625 0.5625 -0.15625l1.015625 0zm8.644806 0.3125l0 -0.3125l1.25 0q0.375 0 0.53125 0.15625q0.171875 0.140625 0.171875 0.375q0 0.234375 -0.171875 0.390625q-0.15625 0.140625 -0.53125 0.140625l-0.1875 0l0 3.875q0 0.5625 -0.234375 0.984375q-0.234375 0.421875 -0.734375 0.71875q-0.484375 0.3125 -1.09375 0.3125l-1.203125 0q-0.390625 0 -0.5625 -0.15625q-0.15625 -0.140625 -0.15625 -0.375q0 -0.25 0.15625 -0.40625q0.171875 -0.140625 0.5625 -0.140625l1.171875 0q0.484375 0 0.75 -0.265625q0.28125 -0.265625 0.28125 -0.671875l0 -0.515625q-0.359375 0.234375 -0.734375 0.34375q-0.359375 0.109375 -0.75 0.109375q-1.078125 0 -1.8125 -0.71875q-0.734375 -0.734375 -0.734375 -1.796875q0 -1.0625 0.734375 -1.78125q0.734375 -0.734375 1.8125 -0.734375q0.40625 0 0.765625 0.125q0.375 0.109375 0.71875 0.34375zm-0.015625 2.046875q0 -0.59375 -0.4375 -1.015625q-0.421875 -0.4375 -1.03125 -0.4375q-0.609375 0 -1.046875 0.4375q-0.4375 0.421875 -0.4375 1.015625q0 0.59375 0.4375 1.03125q0.4375 0.421875 1.046875 0.421875q0.609375 0 1.03125 -0.421875q0.4375 -0.4375 0.4375 -1.03125zm6.0510254 1.828125q0 0.296875 -0.21875 0.5q-0.21875 0.203125 -0.59375 0.203125q-0.375 0 -0.59375 -0.203125q-0.203125 -0.203125 -0.203125 -0.5q0 -0.3125 0.203125 -0.515625q0.21875 -0.203125 0.59375 -0.203125q0.375 0 0.59375 0.203125q0.21875 0.203125 0.21875 0.515625zm4.472931 -6.21875l0 2.28125q0.34375 -0.203125 0.671875 -0.296875q0.34375 -0.09375 0.6875 -0.09375q0.5625 0 0.984375 0.1875q0.4375 0.1875 0.71875 0.59375q0.28125 0.390625 0.28125 1.015625l0 2.0q0.40625 0 0.53125 0.078125q0.25 0.15625 0.25 0.453125q0 0.234375 -0.15625 0.390625q-0.15625 0.140625 -0.546875 0.140625l-1.21875 0q-0.375 0 -0.546875 -0.140625q-0.15625 -0.15625 -0.15625 -0.390625q0 -0.296875 0.25 -0.453125q0.125 -0.09375 0.53125 -0.078125l0 -1.9375q0 -0.40625 -0.1875 -0.578125q-0.25 -0.21875 -0.734375 -0.21875q-0.34375 0 -0.625 0.140625q-0.265625 0.140625 -0.734375 0.59375l0 2.0q0.421875 0 0.53125 0.078125q0.25 0.15625 0.25 0.453125q0 0.234375 -0.15625 0.390625q-0.15625 0.140625 -0.546875 0.140625l-1.21875 0q-0.375 0 -0.546875 -0.140625q-0.15625 -0.15625 -0.15625 -0.390625q0 -0.296875 0.25 -0.453125q0.125 -0.09375 0.53125 -0.078125l0 -4.625l-0.1875 0q-0.375 0 -0.546875 -0.140625q-0.15625 -0.15625 -0.15625 -0.390625q0 -0.234375 0.15625 -0.375q0.171875 -0.15625 0.546875 -0.15625l1.25 0z" fill-rule="nonzero"/><path fill="#000000" d="m325.02972 723.12537q0 0.296875 -0.21875 0.5q-0.21875 0.203125 -0.59375 0.203125q-0.375 0 -0.59375 -0.203125q-0.203125 -0.203125 -0.203125 -0.5q0 -0.3125 0.203125 -0.515625q0.21875 -0.203125 0.59375 -0.203125q0.375 0 0.59375 0.203125q0.21875 0.203125 0.21875 0.515625z" fill-rule="nonzero"/><path fill="#000000" d="m325.02972 736.12537q0 0.296875 -0.21875 0.5q-0.21875 0.203125 -0.59375 0.203125q-0.375 0 -0.59375 -0.203125q-0.203125 -0.203125 -0.203125 -0.5q0 -0.3125 0.203125 -0.515625q0.21875 -0.203125 0.59375 -0.203125q0.375 0 0.59375 0.203125q0.21875 0.203125 0.21875 0.515625z" fill-rule="nonzero"/><path fill="#000000" d="m325.02972 749.12537q0 0.296875 -0.21875 0.5q-0.21875 0.203125 -0.59375 0.203125q-0.375 0 -0.59375 -0.203125q-0.203125 -0.203125 -0.203125 -0.5q0 -0.3125 0.203125 -0.515625q0.21875 -0.203125 0.59375 -0.203125q0.375 0 0.59375 0.203125q0.21875 0.203125 0.21875 0.515625z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m239.43922 747.1704l0 -21.984253l17.448807 0l0 21.984253z" fill-rule="evenodd"/><path stroke="#ffffff" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m239.43922 747.1704l0 -21.984253l17.448807 0l0 21.984253z" fill-rule="evenodd"/><path fill="#000000" d="m233.08363 736.4829l-1.875 0l0 -1.875l1.875 0l0 1.875z" fill-rule="nonzero"/><path fill="#000000" d="m255.08363 736.4829l-1.875 0l0 -1.875l1.875 0l0 1.875z" fill-rule="nonzero"/><path fill="#000000" d="m277.08365 736.4829l-1.875 0l0 -1.875l1.875 0l0 1.875z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m239.43922 667.1699l0 -21.984253l17.448807 0l0 21.984253z" fill-rule="evenodd"/><path stroke="#ffffff" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m239.43922 667.1699l0 -21.984253l17.448807 0l0 21.984253z" fill-rule="evenodd"/><path fill="#000000" d="m221.88364 655.2637l-3.203125 0l0 -3.203125l3.203125 0l0 3.203125z" fill-rule="nonzero"/><path fill="#000000" d="m259.88364 655.2637l-3.203125 0l0 -3.203125l3.203125 0l0 3.203125z" fill-rule="nonzero"/><path fill="#000000" d="m297.88364 655.2637l-3.203125 0l0 -3.203125l3.203125 0l0 3.203125z" fill-rule="nonzero"/><path fill="#e6b8af" d="m513.0 700.0l132.0 0l0 51.496033l-132.0 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m513.0 700.0l132.0 0l0 51.496033l-132.0 0z" fill-rule="evenodd"/><path fill="#000000" d="m523.4375 721.668l0 -13.359375l4.609375 0q1.546875 0 2.375 0.203125q1.140625 0.25 1.953125 0.953125q1.0625 0.890625 1.578125 2.28125q0.53125 1.390625 0.53125 3.171875q0 1.515625 -0.359375 2.703125q-0.359375 1.171875 -0.921875 1.9375q-0.546875 0.765625 -1.203125 1.21875q-0.65625 0.4375 -1.59375 0.671875q-0.9375 0.21875 -2.140625 0.21875l-4.828125 0zm1.765625 -1.578125l2.859375 0q1.3125 0 2.0625 -0.234375q0.75 -0.25 1.203125 -0.703125q0.625 -0.625 0.96875 -1.6875q0.359375 -1.0625 0.359375 -2.578125q0 -2.09375 -0.6875 -3.21875q-0.6875 -1.125 -1.671875 -1.5q-0.703125 -0.28125 -2.28125 -0.28125l-2.8125 0l0 10.203125zm10.894836 -3.265625q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm15.610046 1.296875l1.609375 0.21875q-0.265625 1.65625 -1.359375 2.609375q-1.078125 0.9375 -2.671875 0.9375q-1.984375 0 -3.1875 -1.296875q-1.203125 -1.296875 -1.203125 -3.71875q0 -1.578125 0.515625 -2.75q0.515625 -1.171875 1.578125 -1.75q1.0625 -0.59375 2.3125 -0.59375q1.578125 0 2.578125 0.796875q1.0 0.796875 1.28125 2.265625l-1.59375 0.234375q-0.234375 -0.96875 -0.8125 -1.453125q-0.578125 -0.5 -1.390625 -0.5q-1.234375 0 -2.015625 0.890625q-0.78125 0.890625 -0.78125 2.8125q0 1.953125 0.75 2.84375q0.75 0.875 1.953125 0.875q0.96875 0 1.609375 -0.59375q0.65625 -0.59375 0.828125 -1.828125z" fill-rule="nonzero"/><path fill="#000000" d="m529.6875 738.43365l0 -1.578125l5.65625 0l0 4.953125q-1.296875 1.046875 -2.6875 1.578125q-1.375 0.515625 -2.84375 0.515625q-1.96875 0 -3.578125 -0.84375q-1.609375 -0.84375 -2.421875 -2.4375q-0.8125 -1.59375 -0.8125 -3.5625q0 -1.953125 0.8125 -3.640625q0.8125 -1.6875 2.34375 -2.5q1.53125 -0.828125 3.515625 -0.828125q1.453125 0 2.625 0.46875q1.171875 0.46875 1.828125 1.3125q0.671875 0.828125 1.015625 2.171875l-1.59375 0.4375q-0.296875 -1.015625 -0.75 -1.59375q-0.4375 -0.59375 -1.265625 -0.9375q-0.828125 -0.34375 -1.84375 -0.34375q-1.203125 0 -2.09375 0.375q-0.890625 0.359375 -1.4375 0.96875q-0.53125 0.59375 -0.828125 1.3125q-0.515625 1.234375 -0.515625 2.6875q0 1.78125 0.609375 2.984375q0.625 1.203125 1.796875 1.796875q1.171875 0.578125 2.5 0.578125q1.140625 0 2.234375 -0.4375q1.09375 -0.453125 1.65625 -0.953125l0 -2.484375l-3.921875 0zm14.683289 2.125l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.141357 5.765625l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm17.000732 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.125671 5.765625l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm12.5408325 -1.1875q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm7.7819824 3.390625l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm0.9957886 -3.375q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm9.281982 4.84375l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0z" fill-rule="nonzero"/><path fill="#e6b8af" d="m697.0 748.0l132.0 0l0 51.496033l-132.0 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m697.0 748.0l132.0 0l0 51.496033l-132.0 0z" fill-rule="evenodd"/><path fill="#000000" d="m709.7656 769.668l-3.53125 -13.359375l1.8125 0l2.03125 8.765625q0.328125 1.375 0.5625 2.71875q0.5 -2.140625 0.59375 -2.46875l2.546875 -9.015625l2.125 0l1.921875 6.765625q0.71875 2.515625 1.03125 4.71875q0.265625 -1.265625 0.671875 -2.890625l2.09375 -8.59375l1.78125 0l-3.671875 13.359375l-1.703125 0l-2.8125 -10.171875q-0.359375 -1.28125 -0.421875 -1.5625q-0.203125 0.90625 -0.390625 1.5625l-2.828125 10.171875l-1.8125 0zm14.724548 0l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm12.5408325 -1.1875q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm4.2037964 8.5625l0 -13.375l1.484375 0l0 1.25q0.53125 -0.734375 1.1875 -1.09375q0.671875 -0.375 1.625 -0.375q1.234375 0 2.171875 0.640625q0.953125 0.625 1.4375 1.796875q0.484375 1.15625 0.484375 2.546875q0 1.484375 -0.53125 2.671875q-0.53125 1.1875 -1.546875 1.828125q-1.015625 0.625 -2.140625 0.625q-0.8125 0 -1.46875 -0.34375q-0.65625 -0.34375 -1.0625 -0.875l0 4.703125l-1.640625 0zm1.484375 -8.484375q0 1.859375 0.75 2.765625q0.765625 0.890625 1.828125 0.890625q1.09375 0 1.875 -0.921875q0.78125 -0.9375 0.78125 -2.875q0 -1.84375 -0.765625 -2.765625q-0.75 -0.921875 -1.8125 -0.921875q-1.046875 0 -1.859375 0.984375q-0.796875 0.96875 -0.796875 2.84375zm8.891357 8.484375l0 -13.375l1.484375 0l0 1.25q0.53125 -0.734375 1.1875 -1.09375q0.671875 -0.375 1.625 -0.375q1.234375 0 2.171875 0.640625q0.953125 0.625 1.4375 1.796875q0.484375 1.15625 0.484375 2.546875q0 1.484375 -0.53125 2.671875q-0.53125 1.1875 -1.546875 1.828125q-1.015625 0.625 -2.140625 0.625q-0.8125 0 -1.46875 -0.34375q-0.65625 -0.34375 -1.0625 -0.875l0 4.703125l-1.640625 0zm1.484375 -8.484375q0 1.859375 0.75 2.765625q0.765625 0.890625 1.828125 0.890625q1.09375 0 1.875 -0.921875q0.78125 -0.9375 0.78125 -2.875q0 -1.84375 -0.765625 -2.765625q-0.75 -0.921875 -1.8125 -0.921875q-1.046875 0 -1.859375 0.984375q-0.796875 0.96875 -0.796875 2.84375zm15.516357 1.671875l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.125671 5.765625l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0z" fill-rule="nonzero"/><path fill="#000000" d="m713.6875 786.43365l0 -1.578125l5.65625 0l0 4.953125q-1.296875 1.046875 -2.6875 1.578125q-1.375 0.515625 -2.84375 0.515625q-1.96875 0 -3.578125 -0.84375q-1.609375 -0.84375 -2.421875 -2.4375q-0.8125 -1.59375 -0.8125 -3.5625q0 -1.953125 0.8125 -3.640625q0.8125 -1.6875 2.34375 -2.5q1.53125 -0.828125 3.515625 -0.828125q1.453125 0 2.625 0.46875q1.171875 0.46875 1.828125 1.3125q0.671875 0.828125 1.015625 2.171875l-1.59375 0.4375q-0.296875 -1.015625 -0.75 -1.59375q-0.4375 -0.59375 -1.265625 -0.9375q-0.828125 -0.34375 -1.84375 -0.34375q-1.203125 0 -2.09375 0.375q-0.890625 0.359375 -1.4375 0.96875q-0.53125 0.59375 -0.828125 1.3125q-0.515625 1.234375 -0.515625 2.6875q0 1.78125 0.609375 2.984375q0.625 1.203125 1.796875 1.796875q1.171875 0.578125 2.5 0.578125q1.140625 0 2.234375 -0.4375q1.09375 -0.453125 1.65625 -0.953125l0 -2.484375l-3.921875 0zm14.683289 2.125l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.141357 5.765625l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm17.000732 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.125671 5.765625l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm12.5408325 -1.1875q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm7.7819824 3.390625l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm0.9957886 -3.375q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm9.281982 4.84375l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m579.0 751.49603l1.0078735 58.48822" fill-rule="evenodd"/><path stroke="#1155cc" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m579.0 751.49603l0.8010864 46.49005" fill-rule="evenodd"/><path fill="#1155cc" stroke="#1155cc" stroke-width="2.0" stroke-linecap="butt" d="m576.49817 798.04297l3.4593506 9.017883l3.1465454 -9.131714z" fill-rule="evenodd"/><path fill="#d9ead3" d="m542.71063 884.9764c2.588562 0 4.6870117 -2.0984497 4.6870117 -4.6870117l-4.6870117 0c1.2942505 0 2.3435059 -1.0491943 2.3435059 -2.3435059c0 -1.2942505 -1.0492554 -2.3435059 -2.3435059 -2.3435059l4.6870117 0l0 -60.93109l0 0c0 -2.588562 2.0984497 -4.6870117 4.6870117 -4.6870117l64.212585 0c2.588562 0 4.6870117 2.0984497 4.6870117 4.6870117c0 2.588562 -2.0984497 4.6870117 -4.6870117 4.6870117l-4.6870117 0l0 60.93109c0 2.588562 -2.0984497 4.6870117 -4.6870117 4.6870117zm14.061035 -70.305115l0 0c0 2.588562 -2.0984497 4.6870117 -4.6870117 4.6870117c-1.2943115 0 -2.3435059 -1.0492554 -2.3435059 -2.3435059c0 -1.2943115 1.0491943 -2.3435059 2.3435059 -2.3435059z" fill-rule="evenodd"/><path fill="#adbba8" d="m556.77167 814.67126l0 0c0 2.588562 -2.0984497 4.6870117 -4.6870117 4.6870117c-1.2943115 0 -2.3435059 -1.0492554 -2.3435059 -2.3435059c0 -1.2943115 1.0491943 -2.3435059 2.3435059 -2.3435059zm-9.374023 65.6181c0 2.588562 -2.0984497 4.6870117 -4.6870117 4.6870117c-2.588562 0 -4.6870117 -2.0984497 -4.6870117 -4.6870117c0 -2.588562 2.0984497 -4.6870117 4.6870117 -4.6870117l0 0c1.2942505 0 2.3435059 1.0492554 2.3435059 2.3435059c0 1.2943115 -1.0492554 2.3435059 -2.3435059 2.3435059z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m547.39764 875.60236l0 -60.93109l0 0c0 -2.588562 2.0984497 -4.6870117 4.6870117 -4.6870117l64.212585 0c2.588562 0 4.6870117 2.0984497 4.6870117 4.6870117c0 2.588562 -2.0984497 4.6870117 -4.6870117 4.6870117l-4.6870117 0l0 60.93109c0 2.588562 -2.0984497 4.6870117 -4.6870117 4.6870117l-64.212585 0c-2.588562 0 -4.6870117 -2.0984497 -4.6870117 -4.6870117c0 -2.588562 2.0984497 -4.6870117 4.6870117 -4.6870117zm4.6870117 -65.6181l0 0c2.588562 0 4.6870117 2.0984497 4.6870117 4.6870117c0 2.588562 -2.0984497 4.6870117 -4.6870117 4.6870117c-1.2943115 0 -2.3435059 -1.0492554 -2.3435059 -2.3435059c0 -1.2943115 1.0491943 -2.3435059 2.3435059 -2.3435059l4.6870117 0m54.838562 4.6870117l-59.525574 0m-9.374023 56.24408l0 0c1.2942505 0 2.3435059 1.0492554 2.3435059 2.3435059c0 1.2943115 -1.0492554 2.3435059 -2.3435059 2.3435059l4.6870117 0m-4.6870117 4.6870117c2.588562 0 4.6870117 -2.0984497 4.6870117 -4.6870117l0 -4.6870117" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m547.39764 875.60236l0 -60.93109l0 0c0 -2.588562 2.0984497 -4.6870117 4.6870117 -4.6870117l64.212585 0c2.588562 0 4.6870117 2.0984497 4.6870117 4.6870117c0 2.588562 -2.0984497 4.6870117 -4.6870117 4.6870117l-4.6870117 0l0 60.93109c0 2.588562 -2.0984497 4.6870117 -4.6870117 4.6870117l-64.212585 0c-2.588562 0 -4.6870117 -2.0984497 -4.6870117 -4.6870117c0 -2.588562 2.0984497 -4.6870117 4.6870117 -4.6870117zm4.6870117 -65.6181l0 0c2.588562 0 4.6870117 2.0984497 4.6870117 4.6870117c0 2.588562 -2.0984497 4.6870117 -4.6870117 4.6870117c-1.2943115 0 -2.3435059 -1.0492554 -2.3435059 -2.3435059c0 -1.2943115 1.0491943 -2.3435059 2.3435059 -2.3435059l4.6870117 0m54.838562 4.6870117l-59.525574 0m-9.374023 56.24408l0 0c1.2942505 0 2.3435059 1.0492554 2.3435059 2.3435059c0 1.2943115 -1.0492554 2.3435059 -2.3435059 2.3435059l4.6870117 0m-4.6870117 4.6870117c2.588562 0 4.6870117 -2.0984497 4.6870117 -4.6870117l0 -4.6870117" fill-rule="evenodd"/><path fill="#000000" d="m557.83514 856.74384l0 -13.359375l4.609375 0q1.546875 0 2.375 0.203125q1.140625 0.25 1.953125 0.953125q1.0625 0.890625 1.578125 2.28125q0.53125 1.390625 0.53125 3.171875q0 1.515625 -0.359375 2.703125q-0.359375 1.171875 -0.921875 1.9375q-0.546875 0.765625 -1.203125 1.21875q-0.65625 0.4375 -1.59375 0.671875q-0.9375 0.21875 -2.140625 0.21875l-4.828125 0zm1.765625 -1.578125l2.859375 0q1.3125 0 2.0625 -0.234375q0.75 -0.25 1.203125 -0.703125q0.625 -0.625 0.96875 -1.6875q0.359375 -1.0625 0.359375 -2.578125q0 -2.09375 -0.6875 -3.21875q-0.6875 -1.125 -1.671875 -1.5q-0.703125 -0.28125 -2.28125 -0.28125l-2.8125 0l0 10.203125zm10.894836 -3.265625q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm15.610046 1.296875l1.609375 0.21875q-0.265625 1.65625 -1.359375 2.609375q-1.078125 0.9375 -2.671875 0.9375q-1.984375 0 -3.1875 -1.296875q-1.203125 -1.296875 -1.203125 -3.71875q0 -1.578125 0.515625 -2.75q0.515625 -1.171875 1.578125 -1.75q1.0625 -0.59375 2.3125 -0.59375q1.578125 0 2.578125 0.796875q1.0 0.796875 1.28125 2.265625l-1.59375 0.234375q-0.234375 -0.96875 -0.8125 -1.453125q-0.578125 -0.5 -1.390625 -0.5q-1.234375 0 -2.015625 0.890625q-0.78125 0.890625 -0.78125 2.8125q0 1.953125 0.75 2.84375q0.75 0.875 1.953125 0.875q0.96875 0 1.609375 -0.59375q0.65625 -0.59375 0.828125 -1.828125zm2.359375 0.65625l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m763.0 633.0l157.98425 0l0 34.173218l-157.98425 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m763.0 633.0l157.98425 0l0 34.173218l-157.98425 0z" fill-rule="evenodd"/><path fill="#000000" d="m779.8594 653.8972l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.141357 5.765625l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm13.953857 -1.46875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm1.5895386 1.46875l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm6.1501465 3.71875l-0.1875 -1.53125q0.546875 0.140625 0.9375 0.140625q0.546875 0 0.875 -0.1875q0.328125 -0.171875 0.546875 -0.5q0.15625 -0.25 0.5 -1.21875q0.046875 -0.140625 0.140625 -0.40625l-3.671875 -9.6875l1.765625 0l2.015625 5.59375q0.390625 1.078125 0.703125 2.25q0.28125 -1.125 0.671875 -2.203125l2.078125 -5.640625l1.640625 0l-3.6875 9.828125q-0.59375 1.609375 -0.921875 2.203125q-0.4375 0.8125 -1.0 1.1875q-0.5625 0.375 -1.34375 0.375q-0.484375 0 -1.0625 -0.203125zm9.40625 -0.015625l0 -13.375l1.484375 0l0 1.25q0.53125 -0.734375 1.1875 -1.09375q0.671875 -0.375 1.625 -0.375q1.234375 0 2.171875 0.640625q0.953125 0.625 1.4375 1.796875q0.484375 1.15625 0.484375 2.546875q0 1.484375 -0.53125 2.671875q-0.53125 1.1875 -1.546875 1.828125q-1.015625 0.625 -2.140625 0.625q-0.8125 0 -1.46875 -0.34375q-0.65625 -0.34375 -1.0625 -0.875l0 4.703125l-1.640625 0zm1.484375 -8.484375q0 1.859375 0.75 2.765625q0.765625 0.890625 1.828125 0.890625q1.09375 0 1.875 -0.921875q0.78125 -0.9375 0.78125 -2.875q0 -1.84375 -0.765625 -2.765625q-0.75 -0.921875 -1.8125 -0.921875q-1.046875 0 -1.859375 0.984375q-0.796875 0.96875 -0.796875 2.84375zm8.281982 -0.0625q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm9.297607 -6.625l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm4.1448364 0l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm13.953796 -1.46875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm10.366638 0l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm7.9176636 0.28125q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm4.1882324 4.859375l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm5.9157715 0.796875l1.59375 0.234375q0.109375 0.75 0.5625 1.078125q0.609375 0.453125 1.671875 0.453125q1.140625 0 1.75 -0.453125q0.625 -0.453125 0.84375 -1.265625q0.125 -0.5 0.109375 -2.109375q-1.0625 1.265625 -2.671875 1.265625q-2.0 0 -3.09375 -1.4375q-1.09375 -1.4375 -1.09375 -3.453125q0 -1.390625 0.5 -2.5625q0.515625 -1.171875 1.453125 -1.796875q0.953125 -0.640625 2.25 -0.640625q1.703125 0 2.8125 1.375l0 -1.15625l1.515625 0l0 8.359375q0 2.265625 -0.46875 3.203125q-0.453125 0.9375 -1.453125 1.484375q-0.984375 0.546875 -2.453125 0.546875q-1.71875 0 -2.796875 -0.78125q-1.0625 -0.765625 -1.03125 -2.34375zm1.359375 -5.8125q0 1.90625 0.75 2.78125q0.765625 0.875 1.90625 0.875q1.125 0 1.890625 -0.859375q0.765625 -0.875 0.765625 -2.734375q0 -1.78125 -0.796875 -2.671875q-0.78125 -0.90625 -1.890625 -0.90625q-1.09375 0 -1.859375 0.890625q-0.765625 0.875 -0.765625 2.625zm15.953857 1.90625l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm12.719482 4.296875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m841.9921 667.1732l-78.99213 80.81891" fill-rule="evenodd"/><path stroke="#cc0000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m841.9921 667.1732l-70.60443 72.23724" fill-rule="evenodd"/><path fill="#cc0000" stroke="#cc0000" stroke-width="2.0" stroke-linecap="butt" d="m769.02527 737.1014l-3.9815674 8.799805l8.706482 -4.1817017z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m763.0 799.49603l0 28.503967" fill-rule="evenodd"/><path stroke="#cc0000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m763.0 799.49603l0 16.503967" fill-rule="evenodd"/><path fill="#cc0000" stroke="#cc0000" stroke-width="2.0" stroke-linecap="butt" d="m759.69653 816.0l3.3034668 9.076172l3.3034668 -9.076172z" fill-rule="evenodd"/><path fill="#fff2cc" d="m721.5197 828.0l82.96057 0l0 65.616516l-13.123596 13.123657l-69.836975 0z" fill-rule="evenodd"/><path fill="#cbc1a3" d="m791.3567 906.7402l2.6247559 -10.498901l10.49884 -2.6247559z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m791.3567 906.7402l2.6247559 -10.498901l10.49884 -2.6247559l-13.123596 13.123657l-69.836975 0l0 -78.74017l82.96057 0l0 65.616516" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m791.3567 906.7402l2.6247559 -10.498901l10.49884 -2.6247559l-13.123596 13.123657l-69.836975 0l0 -78.74017l82.96057 0l0 65.616516" fill-rule="evenodd"/><path fill="#000000" d="m731.5666 857.6083l0 -9.546875l6.90625 0l0 1.125l-5.640625 0l0 2.921875l5.28125 0l0 1.125l-5.28125 0l0 3.25l5.859375 0l0 1.125l-7.125 0zm8.717834 0l0 -6.90625l1.0625 0l0 0.984375q0.75 -1.140625 2.1875 -1.140625q0.625 0 1.15625 0.21875q0.53125 0.21875 0.78125 0.59375q0.265625 0.359375 0.375 0.859375q0.0625 0.328125 0.0625 1.140625l0 4.25l-1.171875 0l0 -4.203125q0 -0.71875 -0.140625 -1.0625q-0.140625 -0.359375 -0.484375 -0.5625q-0.34375 -0.21875 -0.8125 -0.21875q-0.75 0 -1.296875 0.46875q-0.546875 0.46875 -0.546875 1.796875l0 3.78125l-1.171875 0zm9.974976 -1.046875l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875zm1.1248779 1.046875l0 -6.90625l1.0625 0l0 1.046875q0.40625 -0.734375 0.734375 -0.96875q0.34375 -0.234375 0.765625 -0.234375q0.59375 0 1.203125 0.375l-0.40625 1.078125q-0.4375 -0.25 -0.859375 -0.25q-0.390625 0 -0.703125 0.234375q-0.296875 0.234375 -0.421875 0.640625q-0.203125 0.625 -0.203125 1.359375l0 3.625l-1.171875 0zm4.4071045 2.65625l-0.125 -1.09375q0.375 0.109375 0.65625 0.109375q0.390625 0 0.625 -0.140625q0.234375 -0.125 0.390625 -0.359375q0.109375 -0.171875 0.359375 -0.875q0.03125 -0.09375 0.109375 -0.28125l-2.625 -6.921875l1.265625 0l1.4375 4.0q0.28125 0.765625 0.5 1.59375q0.203125 -0.796875 0.46875 -1.578125l1.484375 -4.015625l1.171875 0l-2.625 7.015625q-0.421875 1.140625 -0.65625 1.578125q-0.3125 0.578125 -0.71875 0.84375q-0.40625 0.28125 -0.96875 0.28125q-0.328125 0 -0.75 -0.15625zm6.7109375 0l0 -9.5625l1.078125 0l0 0.890625q0.375 -0.53125 0.84375 -0.78125q0.484375 -0.265625 1.15625 -0.265625q0.875 0 1.546875 0.453125q0.6875 0.453125 1.03125 1.28125q0.34375 0.828125 0.34375 1.828125q0 1.046875 -0.375 1.90625q-0.375 0.84375 -1.109375 1.296875q-0.71875 0.453125 -1.53125 0.453125q-0.578125 0 -1.046875 -0.25q-0.46875 -0.25 -0.765625 -0.625l0 3.375l-1.171875 0zm1.0625 -6.078125q0 1.34375 0.53125 1.984375q0.546875 0.625 1.3125 0.625q0.78125 0 1.34375 -0.65625q0.5625 -0.65625 0.5625 -2.046875q0 -1.3125 -0.546875 -1.96875q-0.546875 -0.671875 -1.296875 -0.671875q-0.75 0 -1.328125 0.703125q-0.578125 0.703125 -0.578125 2.03125zm5.9124756 -0.03125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.6624756 -4.734375l0 -1.359375l1.171875 0l0 1.359375l-1.171875 0zm0 8.1875l0 -6.90625l1.171875 0l0 6.90625l-1.171875 0zm2.9454956 0l0 -6.90625l1.0625 0l0 0.984375q0.75 -1.140625 2.1875 -1.140625q0.625 0 1.15625 0.21875q0.53125 0.21875 0.78125 0.59375q0.265625 0.359375 0.375 0.859375q0.0625 0.328125 0.0625 1.140625l0 4.25l-1.171875 0l0 -4.203125q0 -0.71875 -0.140625 -1.0625q-0.140625 -0.359375 -0.484375 -0.5625q-0.34375 -0.21875 -0.8125 -0.21875q-0.75 0 -1.296875 0.46875q-0.546875 0.46875 -0.546875 1.796875l0 3.78125l-1.171875 0zm9.974976 -1.046875l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875z" fill-rule="nonzero"/><path fill="#000000" d="m733.2072 873.6083l-2.53125 -9.546875l1.296875 0l1.453125 6.265625q0.234375 0.984375 0.40625 1.953125q0.359375 -1.53125 0.421875 -1.765625l1.828125 -6.453125l1.515625 0l1.375 4.828125q0.515625 1.796875 0.734375 3.390625q0.1875 -0.90625 0.484375 -2.078125l1.484375 -6.140625l1.28125 0l-2.625 9.546875l-1.21875 0l-2.0 -7.265625q-0.265625 -0.921875 -0.3125 -1.125q-0.140625 0.65625 -0.28125 1.125l-2.015625 7.265625l-1.296875 0zm10.510681 0l0 -6.90625l1.0625 0l0 1.046875q0.40625 -0.734375 0.734375 -0.96875q0.34375 -0.234375 0.765625 -0.234375q0.59375 0 1.203125 0.375l-0.40625 1.078125q-0.4375 -0.25 -0.859375 -0.25q-0.390625 0 -0.703125 0.234375q-0.296875 0.234375 -0.421875 0.640625q-0.203125 0.625 -0.203125 1.359375l0 3.625l-1.171875 0zm8.9696045 -0.859375q-0.65625 0.5625 -1.265625 0.796875q-0.59375 0.21875 -1.28125 0.21875q-1.140625 0 -1.75 -0.546875q-0.609375 -0.5625 -0.609375 -1.4375q0 -0.5 0.21875 -0.921875q0.234375 -0.421875 0.609375 -0.671875q0.375 -0.25 0.84375 -0.390625q0.34375 -0.078125 1.046875 -0.171875q1.421875 -0.171875 2.09375 -0.40625q0 -0.234375 0 -0.296875q0 -0.71875 -0.328125 -1.015625q-0.453125 -0.390625 -1.34375 -0.390625q-0.8125 0 -1.21875 0.296875q-0.390625 0.28125 -0.578125 1.015625l-1.140625 -0.15625q0.15625 -0.734375 0.515625 -1.1875q0.359375 -0.453125 1.03125 -0.6875q0.671875 -0.25 1.5625 -0.25q0.890625 0 1.4375 0.203125q0.5625 0.203125 0.8125 0.53125q0.265625 0.3125 0.375 0.796875q0.046875 0.296875 0.046875 1.078125l0 1.5625q0 1.625 0.078125 2.0625q0.078125 0.4375 0.296875 0.828125l-1.21875 0q-0.1875 -0.359375 -0.234375 -0.859375zm-0.09375 -2.609375q-0.640625 0.265625 -1.921875 0.4375q-0.71875 0.109375 -1.015625 0.25q-0.296875 0.125 -0.46875 0.375q-0.15625 0.25 -0.15625 0.546875q0 0.46875 0.34375 0.78125q0.359375 0.3125 1.046875 0.3125q0.671875 0 1.203125 -0.296875q0.53125 -0.296875 0.78125 -0.8125q0.1875 -0.390625 0.1875 -1.171875l0 -0.421875zm2.9906006 6.125l0 -9.5625l1.078125 0l0 0.890625q0.375 -0.53125 0.84375 -0.78125q0.484375 -0.265625 1.15625 -0.265625q0.875 0 1.546875 0.453125q0.6875 0.453125 1.03125 1.28125q0.34375 0.828125 0.34375 1.828125q0 1.046875 -0.375 1.90625q-0.375 0.84375 -1.109375 1.296875q-0.71875 0.453125 -1.53125 0.453125q-0.578125 0 -1.046875 -0.25q-0.46875 -0.25 -0.765625 -0.625l0 3.375l-1.171875 0zm1.0625 -6.078125q0 1.34375 0.53125 1.984375q0.546875 0.625 1.3125 0.625q0.78125 0 1.34375 -0.65625q0.5625 -0.65625 0.5625 -2.046875q0 -1.3125 -0.546875 -1.96875q-0.546875 -0.671875 -1.296875 -0.671875q-0.75 0 -1.328125 0.703125q-0.578125 0.703125 -0.578125 2.03125zm6.3499756 6.078125l0 -9.5625l1.078125 0l0 0.890625q0.375 -0.53125 0.84375 -0.78125q0.484375 -0.265625 1.15625 -0.265625q0.875 0 1.546875 0.453125q0.6875 0.453125 1.03125 1.28125q0.34375 0.828125 0.34375 1.828125q0 1.046875 -0.375 1.90625q-0.375 0.84375 -1.109375 1.296875q-0.71875 0.453125 -1.53125 0.453125q-0.578125 0 -1.046875 -0.25q-0.46875 -0.25 -0.765625 -0.625l0 3.375l-1.171875 0zm1.0625 -6.078125q0 1.34375 0.53125 1.984375q0.546875 0.625 1.3125 0.625q0.78125 0 1.34375 -0.65625q0.5625 -0.65625 0.5625 -2.046875q0 -1.3125 -0.546875 -1.96875q-0.546875 -0.671875 -1.296875 -0.671875q-0.75 0 -1.328125 0.703125q-0.578125 0.703125 -0.578125 2.03125zm11.084351 1.203125l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm6.5062256 4.125l0 -6.90625l1.0625 0l0 1.046875q0.40625 -0.734375 0.734375 -0.96875q0.34375 -0.234375 0.765625 -0.234375q0.59375 0 1.203125 0.375l-0.40625 1.078125q-0.4375 -0.25 -0.859375 -0.25q-0.390625 0 -0.703125 0.234375q-0.296875 0.234375 -0.421875 0.640625q-0.203125 0.625 -0.203125 1.359375l0 3.625l-1.171875 0z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m86.0 414.0c3.1928024 15.0 2.8244019 71.0 19.1568 90.0c16.332397 19.0 63.364807 16.0 78.8376 24.0c15.472794 8.0 11.666 20.0 13.999207 24.0" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m86.0 414.0c3.1928024 15.0 2.8244019 71.0 19.156807 90.0c16.332397 19.0 63.3648 16.0 78.83759 24.0c7.7364044 4.0 10.652893 9.0 11.926941 13.5c0.31851196 1.125 0.5343628 2.21875 0.69721985 3.2578125c0.040725708 0.25976562 0.078125 0.5161133 0.11299133 0.76867676l0.07752991 0.59155273" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m195.18985 546.44415l2.5151367 4.1227417l0.7233124 -4.7749023z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m158.0 106.0c2.8660736 1.6666641 12.787064 -51.833332 17.196396 10.0c4.4093323 61.83333 -1.4330292 297.66666 9.259598 361.0c10.692642 63.333313 48.061737 6.6666565 54.89621 19.0c6.8344574 12.3333435 -11.574509 45.833313 -13.889404 55.0" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m158.0 106.0c2.8660736 1.6666641 12.787064 -51.833332 17.196396 10.0c4.4093323 61.83333 -1.4330292 297.66666 9.259598 361.0c10.692642 63.333313 48.061737 6.6666565 54.89621 19.0c3.4172363 6.1666565 0.5235901 17.625 -3.5137024 28.6875c-2.0186462 5.53125 -4.3232117 10.963562 -6.2677765 15.5859375c-0.48616028 1.1556396 -0.9497986 2.260559 -1.3808594 3.303833c-0.21551514 0.5216675 -0.4229126 1.027832 -0.6208801 1.5171509l-0.10069275 0.2506714" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m225.91158 544.793l0.039871216 4.8291626l3.0735931 -3.7249756z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m367.0 414.0c-11.1666565 16.333344 -53.166656 75.33334 -67.0 98.0c-13.8333435 22.666687 -13.3333435 31.666687 -16.0 38.0" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m367.0 414.0c-11.1666565 16.333344 -53.166656 75.33334 -67.0 98.0c-6.9166565 11.333313 -10.25 19.25 -12.1875 25.125c-0.484375 1.46875 -0.88153076 2.8098755 -1.2255859 4.044922c-0.17202759 0.6174927 -0.33081055 1.2084961 -0.48059082 1.7756348l-0.34466553 1.3189087" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m284.18274 543.7795l0.24649048 4.823059l2.911377 -3.8531494z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m585.418 264.4777c-13.140381 37.342743 -33.932007 180.76526 -78.84201 224.0564c-44.910004 43.291107 -155.85434 25.445953 -190.61801 35.6904c-34.76367 10.244446 -14.970001 21.480347 -17.96399 25.776428" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m585.418 264.4777c-13.14032 37.342712 -33.932007 180.76526 -78.84204 224.0564c-44.909973 43.291107 -155.85434 25.445953 -190.61798 35.6904c-17.381836 5.1221924 -21.124329 10.49231 -20.89563 15.118835c0.05718994 1.1566162 0.36254883 2.2667847 0.7650757 3.3150024c0.20126343 0.5241089 0.42678833 1.0327148 0.65774536 1.5238647l0.00491333 0.010253906" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m294.8911 544.60645l2.7364807 3.979248l0.46151733 -4.807251z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m585.0 558.00116c-36.5 -4.5 -172.33334 -25.833374 -219.0 -27.0c-46.666656 -1.166687 -50.833344 16.666626 -61.0 20.0" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m585.0 558.00116c-36.5 -4.5 -172.33334 -25.833374 -219.0 -27.0c-23.333344 -0.583374 -36.041656 3.583313 -44.1875 8.3125c-4.0729065 2.364563 -7.0052185 4.869751 -9.5546875 6.9921875c-0.6373596 0.5305786 -1.250824 1.0372314 -1.8521729 1.5118408l-0.21755981 0.16949463" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m309.35837 546.55896l-3.0942993 3.7078247l4.753723 -0.8513794z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m585.0 267.9996c-4.5 2.8333435 -18.833313 -55.0 -27.0 17.0c-8.166687 72.0 -18.333313 345.83334 -22.0 414.99997" fill-rule="evenodd"/><path stroke="#1155cc" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m585.0 267.9996c-4.5 2.8333435 -18.833313 -55.0 -27.0 17.0c-4.083313 36.0 -8.666687 122.45831 -12.6875 208.5625c-2.010437 43.052094 -3.880188 86.015594 -5.4765625 122.53909c-0.79815674 18.261658 -1.5280151 34.91339 -2.1728516 49.161133c-0.3223877 7.1238403 -0.6236572 13.6466675 -0.90148926 19.4693l-0.15814209 3.283142" fill-rule="evenodd"/><path fill="#1155cc" stroke="#1155cc" stroke-width="2.0" stroke-linecap="butt" d="m533.30414 687.84863l2.8428955 9.230835l3.7556763 -8.89856z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m585.0 559.0c-5.333313 15.333313 -25.833313 68.83331 -32.0 92.0c-6.166687 23.166687 -4.166687 39.166687 -5.0 47.0" fill-rule="evenodd"/><path stroke="#1155cc" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m585.0 559.0c-5.333313 15.333313 -25.833313 68.83331 -32.0 92.0c-3.083313 11.583313 -4.125 21.375 -4.5 29.25c-0.09375 1.96875 -0.14581299 3.817688 -0.17773438 5.544922l-0.0033569336 0.20928955" fill-rule="evenodd"/><path fill="#1155cc" stroke="#1155cc" stroke-width="2.0" stroke-linecap="butt" d="m545.0166 685.91644l3.0610962 9.160767l3.543518 -8.985168z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m707.0 609.0c5.833313 23.166687 29.166687 115.83331 35.0 139.0" fill-rule="evenodd"/><path stroke="#cc0000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m707.0 609.0l32.069885 127.36328" fill-rule="evenodd"/><path fill="#cc0000" stroke="#cc0000" stroke-width="2.0" stroke-linecap="butt" d="m735.8664 737.16986l5.4196777 7.994812l0.9873047 -9.608093z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m584.00006 267.0c-9.333374 10.1666565 -46.5 0.5 -56.0 61.0c-9.5 60.5 -30.833344 241.5 -1.0 302.0c29.833313 60.5 145.66663 41.333313 180.0 61.0c34.333313 19.666687 21.666626 47.5 26.0 57.0" fill-rule="evenodd"/><path stroke="#cc0000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m584.00006 267.0c-9.333374 10.1666565 -46.5 0.5 -56.0 61.0c-9.5 60.5 -30.833344 241.5 -1.0 302.0c29.833313 60.5 145.66663 41.333313 179.99994 61.0c17.166687 9.833313 22.583313 21.708313 24.25 32.3125c0.416687 2.651062 0.598938 5.2227173 0.67193604 7.663086c0.036376953 1.2202148 0.04547119 2.4075928 0.04284668 3.555725l-0.0095825195 1.5142822" fill-rule="evenodd"/><path fill="#cc0000" stroke="#cc0000" stroke-width="2.0" stroke-linecap="butt" d="m728.6643 736.3332l4.0811157 8.754089l2.5007324 -9.329346z" fill-rule="evenodd"/></g></svg> \ No newline at end of file
diff --git a/libc/docs/headers/arpa/inet.rst b/libc/docs/headers/arpa/inet.rst
new file mode 100644
index 000000000000..c82ca5427fbb
--- /dev/null
+++ b/libc/docs/headers/arpa/inet.rst
@@ -0,0 +1,50 @@
+.. include:: ../../check.rst
+
+===========
+arpa/inet.h
+===========
+
+Functions
+=========
+
+.. list-table::
+ :widths: auto
+ :align: center
+ :header-rows: 1
+
+ * - Function
+ - Implemented
+ - C23 Standard Section
+ - POSIX.1-2024 Standard Section
+ * - htonl
+ - |check|
+ -
+ -
+ * - htons
+ - |check|
+ -
+ -
+ * - inet_addr
+ -
+ -
+ -
+ * - inet_ntoa
+ -
+ -
+ -
+ * - inet_ntop
+ -
+ -
+ -
+ * - inet_pton
+ -
+ -
+ -
+ * - ntohl
+ - |check|
+ -
+ -
+ * - ntohs
+ - |check|
+ -
+ -
diff --git a/libc/docs/headers/assert.rst b/libc/docs/headers/assert.rst
new file mode 100644
index 000000000000..682170755ba4
--- /dev/null
+++ b/libc/docs/headers/assert.rst
@@ -0,0 +1,27 @@
+.. include:: ../check.rst
+
+========
+assert.h
+========
+
+Macros
+======
+
+.. list-table::
+ :widths: auto
+ :align: center
+ :header-rows: 1
+
+ * - Macro
+ - Implemented
+ - C23 Standard Section
+ - POSIX Docs
+ * - __STDC_VERSION_ASSERT_H__
+ - |check|
+ - 7.2.1
+ -
+ * - assert
+ -
+ - 7.2.1
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/assert.h.html>`__
+
diff --git a/libc/docs/complex.rst b/libc/docs/headers/complex.rst
index 1e74f16b60e6..272cf00c883b 100644
--- a/libc/docs/complex.rst
+++ b/libc/docs/headers/complex.rst
@@ -1,4 +1,4 @@
-.. include:: check.rst
+.. include:: ../check.rst
=========
complex.h
@@ -57,9 +57,9 @@ Functions
+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+
| cimag | |check| | |check| | |check| | |check| | |check| | 7.3.9.2 | N/A |
+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+
-| conj | | | | | | 7.3.9.4 | N/A |
+| conj | |check| | |check| | |check| | |check| | |check| | 7.3.9.4 | N/A |
+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+
-| cproj | | | | | | 7.3.9.5 | N/A |
+| cproj | |check| | |check| | |check| | |check| | |check| | 7.3.9.5 | N/A |
+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+
| creal | |check| | |check| | |check| | |check| | |check| | 7.3.9.6 | N/A |
+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+
diff --git a/libc/docs/headers/ctype.rst b/libc/docs/headers/ctype.rst
new file mode 100644
index 000000000000..9b5b1574fd27
--- /dev/null
+++ b/libc/docs/headers/ctype.rst
@@ -0,0 +1,130 @@
+.. include:: ../check.rst
+
+=======
+ctype.h
+=======
+
+Functions
+=========
+
+.. list-table::
+ :widths: auto
+ :align: center
+ :header-rows: 1
+
+ * - Function
+ - Implemented
+ - C23 Standard Section
+ - POSIX Docs
+ * - isalnum
+ - |check|
+ - 7.4.1.1
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/isalnum.html>`__
+ * - isalnum_l
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/isalnum_l.html>`__
+ * - isalpha
+ - |check|
+ - 7.4.1.2
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/isalpha.html>`__
+ * - isalpha_l
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/isalpha_l.html>`__
+ * - isblank
+ - |check|
+ - 7.4.1.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/isblank.html>`__
+ * - isblank_l
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/isblank_l.html>`__
+ * - iscntrl
+ - |check|
+ - 7.4.1.4
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/iscntrl.html>`__
+ * - iscntrl_l
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/iscntrl_l.html>`__
+ * - isdigit
+ - |check|
+ - 7.4.1.5
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/isdigit.html>`__
+ * - isdigit_l
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/isdigit_l.html>`__
+ * - isgraph
+ - |check|
+ - 7.4.1.6
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/isgraph.html>`__
+ * - isgraph_l
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/isgraph_l.html>`__
+ * - islower
+ - |check|
+ - 7.4.1.7
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/islower.html>`__
+ * - islower_l
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/islower_l.html>`__
+ * - isprint
+ - |check|
+ - 7.4.1.8
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/isprint.html>`__
+ * - isprint_l
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/isprint_l.html>`__
+ * - ispunct
+ - |check|
+ - 7.4.1.9
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/ispunct.html>`__
+ * - ispunct_l
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/ispunct_l.html>`__
+ * - isspace
+ - |check|
+ - 7.4.1.10
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/isspace.html>`__
+ * - isspace_l
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/isspace_l.html>`__
+ * - isupper
+ - |check|
+ - 7.4.1.11
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/isupper.html>`__
+ * - isupper_l
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/isupper_l.html>`__
+ * - isxdigit
+ - |check|
+ - 7.4.1.12
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/isxdigit.html>`__
+ * - isxdigit_l
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/isxdigit_l.html>`__
+ * - tolower
+ - |check|
+ - 7.4.2.1
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/tolower.html>`__
+ * - tolower_l
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/tolower_l.html>`__
+ * - toupper
+ - |check|
+ - 7.4.2.2
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/toupper.html>`__
+ * - toupper_l
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/toupper_l.html>`__
diff --git a/libc/docs/headers/errno.rst b/libc/docs/headers/errno.rst
new file mode 100644
index 000000000000..b2b2e62728e1
--- /dev/null
+++ b/libc/docs/headers/errno.rst
@@ -0,0 +1,35 @@
+.. include:: ../check.rst
+
+=======
+errno.h
+=======
+
+Macros
+======
+
+.. list-table::
+ :widths: auto
+ :align: center
+ :header-rows: 1
+
+ * - Macro
+ - Implemented
+ - C23 Standard Section
+ - POSIX Docs
+ * - EDOM
+ -
+ - 7.5
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/errno.h.html>`__
+ * - EILSEQ
+ -
+ - 7.5
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/errno.h.html>`__
+ * - ERANGE
+ -
+ - 7.5
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/errno.h.html>`__
+ * - errno
+ -
+ - 7.5
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/errno.h.html>`__
+
diff --git a/libc/docs/headers/fenv.rst b/libc/docs/headers/fenv.rst
new file mode 100644
index 000000000000..d0e3c5dda6d0
--- /dev/null
+++ b/libc/docs/headers/fenv.rst
@@ -0,0 +1,175 @@
+.. include:: ../check.rst
+
+======
+fenv.h
+======
+
+Macros
+======
+
+.. list-table::
+ :widths: auto
+ :align: center
+ :header-rows: 1
+
+ * - Macro
+ - Implemented
+ - C23 Standard Section
+ - POSIX Docs
+ * - FE_ALL_EXCEPT
+ - |check|
+ - 7.6.12
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/fenv.h.html>`__
+ * - FE_DEC_DOWNWARD
+ -
+ - 7.6.14
+ -
+ * - FE_DEC_TONEAREST
+ -
+ - 7.6.14
+ -
+ * - FE_DEC_TONEARESTFROMZERO
+ -
+ - 7.6.14
+ -
+ * - FE_DEC_TOWARDZERO
+ -
+ - 7.6.14
+ -
+ * - FE_DEC_UPWARD
+ -
+ - 7.6.14
+ -
+ * - FE_DFL_ENV
+ - |check|
+ - 7.6.17
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/fenv.h.html>`__
+ * - FE_DFL_MODE
+ -
+ - 7.6.11
+ -
+ * - FE_DIVBYZERO
+ - |check|
+ - 7.6.9
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/fenv.h.html>`__
+ * - FE_DOWNWARD
+ - |check|
+ - 7.6.13
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/fenv.h.html>`__
+ * - FE_INEXACT
+ - |check|
+ - 7.6.9
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/fenv.h.html>`__
+ * - FE_INVALID
+ - |check|
+ - 7.6.9
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/fenv.h.html>`__
+ * - FE_OVERFLOW
+ - |check|
+ - 7.6.9
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/fenv.h.html>`__
+ * - FE_TONEAREST
+ - |check|
+ - 7.6.13
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/fenv.h.html>`__
+ * - FE_TONEARESTFROMZERO
+ -
+ - 7.6.13
+ -
+ * - FE_TOWARDZERO
+ - |check|
+ - 7.6.13
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/fenv.h.html>`__
+ * - FE_UNDERFLOW
+ - |check|
+ - 7.6.9
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/fenv.h.html>`__
+ * - FE_UPWARD
+ - |check|
+ - 7.6.13
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/fenv.h.html>`__
+ * - __STDC_VERSION_FENV_H__
+ -
+ - 7.6.5
+ -
+
+Functions
+=========
+
+.. list-table::
+ :widths: auto
+ :align: center
+ :header-rows: 1
+
+ * - Function
+ - Implemented
+ - C23 Standard Section
+ - POSIX Docs
+ * - fe_dec_getround
+ -
+ - 7.6.5.3
+ -
+ * - fe_dec_setround
+ -
+ - 7.6.5.6
+ -
+ * - feclearexcept
+ - |check|
+ - 7.6.4.1
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/feclearexcept.html>`__
+ * - fegetenv
+ - |check|
+ - 7.6.6.1
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/fegetenv.html>`__
+ * - fegetexceptflag
+ - |check|
+ - 7.6.4.2
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/fegetexceptflag.html>`__
+ * - fegetmode
+ -
+ - 7.6.5.1
+ -
+ * - fegetround
+ - |check|
+ - 7.6.5.2
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/fegetround.html>`__
+ * - feholdexcept
+ - |check|
+ - 7.6.6.2
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/feholdexcept.html>`__
+ * - feraiseexcept
+ - |check|
+ - 7.6.4.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/feraiseexcept.html>`__
+ * - fesetenv
+ - |check|
+ - 7.6.6.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/fesetenv.html>`__
+ * - fesetexcept
+ - |check|
+ - 7.6.4.4
+ -
+ * - fesetexceptflag
+ - |check|
+ - 7.6.4.5
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/fesetexceptflag.html>`__
+ * - fesetmode
+ -
+ - 7.6.5.4
+ -
+ * - fesetround
+ - |check|
+ - 7.6.5.5
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/fesetround.html>`__
+ * - fetestexcept
+ - |check|
+ - 7.6.4.7
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/fetestexcept.html>`__
+ * - fetestexceptflag
+ - |check|
+ - 7.6.4.6
+ -
+ * - feupdateenv
+ - |check|
+ - 7.6.6.4
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/feupdateenv.html>`__
diff --git a/libc/docs/headers/float.rst b/libc/docs/headers/float.rst
new file mode 100644
index 000000000000..8ef0f3a05020
--- /dev/null
+++ b/libc/docs/headers/float.rst
@@ -0,0 +1,227 @@
+.. include:: ../check.rst
+
+=======
+float.h
+=======
+
+Macros
+======
+
+.. list-table::
+ :widths: auto
+ :align: center
+ :header-rows: 1
+
+ * - Macro
+ - Implemented
+ - C23 Standard Section
+ - POSIX Docs
+ * - DBL_DECIMAL_DIG
+ - |check|
+ - 5.3.5.3.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/float.h.html>`__
+ * - DBL_DIG
+ - |check|
+ - 5.3.5.3.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/float.h.html>`__
+ * - DBL_EPSILON
+ - |check|
+ - 5.3.5.3.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/float.h.html>`__
+ * - DBL_HAS_SUBNORM
+ - |check|
+ - 5.3.5.3.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/float.h.html>`__
+ * - DBL_IS_IEC_60559
+ -
+ - 5.3.5.3.3
+ -
+ * - DBL_MANT_DIG
+ - |check|
+ - 5.3.5.3.3
+ -
+ * - DBL_MAX
+ - |check|
+ - 5.3.5.3.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/float.h.html>`__
+ * - DBL_MAX_10_EXP
+ - |check|
+ - 5.3.5.3.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/float.h.html>`__
+ * - DBL_MAX_EXP
+ - |check|
+ - 5.3.5.3.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/float.h.html>`__
+ * - DBL_MIN
+ - |check|
+ - 5.3.5.3.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/float.h.html>`__
+ * - DBL_MIN_10_EXP
+ - |check|
+ - 5.3.5.3.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/float.h.html>`__
+ * - DBL_MIN_EXP
+ - |check|
+ - 5.3.5.3.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/float.h.html>`__
+ * - DBL_NORM_MAX
+ -
+ - 5.3.5.3.3
+ -
+ * - DBL_SNAN
+ -
+ - 5.3.5.3.3
+ -
+ * - DBL_TRUE_MIN
+ - |check|
+ - 5.3.5.3.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/float.h.html>`__
+ * - DECIMAL_DIG
+ - |check|
+ - 5.3.5.3.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/float.h.html>`__
+ * - FLT_DECIMAL_DIG
+ - |check|
+ - 5.3.5.3.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/float.h.html>`__
+ * - FLT_DIG
+ - |check|
+ - 5.3.5.3.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/float.h.html>`__
+ * - FLT_EPSILON
+ - |check|
+ - 5.3.5.3.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/float.h.html>`__
+ * - FLT_EVAL_METHOD
+ - |check|
+ - 5.3.5.3.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/float.h.html>`__
+ * - FLT_HAS_SUBNORM
+ - |check|
+ - 5.3.5.3.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/float.h.html>`__
+ * - FLT_IS_IEC_60559
+ -
+ - 5.3.5.3.3
+ -
+ * - FLT_MANT_DIG
+ - |check|
+ - 5.3.5.3.3
+ -
+ * - FLT_MAX
+ - |check|
+ - 5.3.5.3.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/float.h.html>`__
+ * - FLT_MAX_10_EXP
+ - |check|
+ - 5.3.5.3.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/float.h.html>`__
+ * - FLT_MAX_EXP
+ - |check|
+ - 5.3.5.3.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/float.h.html>`__
+ * - FLT_MIN
+ - |check|
+ - 5.3.5.3.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/float.h.html>`__
+ * - FLT_MIN_10_EXP
+ - |check|
+ - 5.3.5.3.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/float.h.html>`__
+ * - FLT_MIN_EXP
+ - |check|
+ - 5.3.5.3.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/float.h.html>`__
+ * - FLT_NORM_MAX
+ -
+ - 5.3.5.3.3
+ -
+ * - FLT_RADIX
+ - |check|
+ - 5.3.5.3.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/float.h.html>`__
+ * - FLT_ROUNDS
+ - |check|
+ - 5.3.5.3.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/float.h.html>`__
+ * - FLT_SNAN
+ -
+ - 5.3.5.3.3
+ -
+ * - FLT_TRUE_MIN
+ - |check|
+ - 5.3.5.3.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/float.h.html>`__
+ * - INFINITY
+ -
+ - 5.3.5.3.3
+ -
+ * - LDBL_DECIMAL_DIG
+ - |check|
+ - 5.3.5.3.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/float.h.html>`__
+ * - LDBL_DIG
+ - |check|
+ - 5.3.5.3.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/float.h.html>`__
+ * - LDBL_EPSILON
+ - |check|
+ - 5.3.5.3.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/float.h.html>`__
+ * - LDBL_HAS_SUBNORM
+ - |check|
+ - 5.3.5.3.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/float.h.html>`__
+ * - LDBL_IS_IEC_60559
+ -
+ - 5.3.5.3.3
+ -
+ * - LDBL_MANT_DIG
+ - |check|
+ - 5.3.5.3.3
+ -
+ * - LDBL_MAX
+ - |check|
+ - 5.3.5.3.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/float.h.html>`__
+ * - LDBL_MAX_10_EXP
+ - |check|
+ - 5.3.5.3.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/float.h.html>`__
+ * - LDBL_MAX_EXP
+ - |check|
+ - 5.3.5.3.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/float.h.html>`__
+ * - LDBL_MIN
+ - |check|
+ - 5.3.5.3.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/float.h.html>`__
+ * - LDBL_MIN_10_EXP
+ - |check|
+ - 5.3.5.3.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/float.h.html>`__
+ * - LDBL_MIN_EXP
+ - |check|
+ - 5.3.5.3.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/float.h.html>`__
+ * - LDBL_NORM_MAX
+ -
+ - 5.3.5.3.3
+ -
+ * - LDBL_SNAN
+ -
+ - 5.3.5.3.3
+ -
+ * - LDBL_TRUE_MIN
+ - |check|
+ - 5.3.5.3.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/float.h.html>`__
+ * - NAN
+ -
+ - 5.3.5.3.3
+ -
+ * - __STDC_VERSION_FLOAT_H__
+ -
+ - 7.7
+ -
+
diff --git a/libc/docs/headers/index.rst b/libc/docs/headers/index.rst
new file mode 100644
index 000000000000..07ab6dd9b267
--- /dev/null
+++ b/libc/docs/headers/index.rst
@@ -0,0 +1,30 @@
+Implementation Status
+=====================
+
+.. toctree::
+ :maxdepth: 1
+
+ arpa/inet
+ assert
+ complex
+ ctype
+ errno
+ fenv
+ float
+ inttypes
+ locale
+ math/index.rst
+ search
+ setjmp
+ signal
+ stdbit
+ stdio
+ stdlib
+ string
+ strings
+ sys/mman
+ threads
+ time
+ uchar
+ wchar
+ wctype
diff --git a/libc/docs/headers/inttypes.rst b/libc/docs/headers/inttypes.rst
new file mode 100644
index 000000000000..9269b40f242a
--- /dev/null
+++ b/libc/docs/headers/inttypes.rst
@@ -0,0 +1,42 @@
+.. include:: ../check.rst
+
+==========
+inttypes.h
+==========
+
+Functions
+=========
+
+.. list-table::
+ :widths: auto
+ :align: center
+ :header-rows: 1
+
+ * - Function
+ - Implemented
+ - C23 Standard Section
+ - POSIX Docs
+ * - imaxabs
+ - |check|
+ - 7.8.2.1
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/imaxabs.html>`__
+ * - imaxdiv
+ - |check|
+ - 7.8.2.2
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/imaxdiv.html>`__
+ * - strtoimax
+ - |check|
+ - 7.8.2.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/strtoimax.html>`__
+ * - strtoumax
+ - |check|
+ - 7.8.2.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/strtoumax.html>`__
+ * - wcstoimax
+ -
+ - 7.8.2.4
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/wcstoimax.html>`__
+ * - wcstoumax
+ -
+ - 7.8.2.4
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/wcstoumax.html>`__
diff --git a/libc/docs/headers/locale.rst b/libc/docs/headers/locale.rst
new file mode 100644
index 000000000000..c97d1f63b1f0
--- /dev/null
+++ b/libc/docs/headers/locale.rst
@@ -0,0 +1,83 @@
+.. include:: ../check.rst
+
+========
+locale.h
+========
+
+Macros
+======
+
+.. list-table::
+ :widths: auto
+ :align: center
+ :header-rows: 1
+
+ * - Macro
+ - Implemented
+ - C23 Standard Section
+ - POSIX Docs
+ * - LC_ALL
+ - |check|
+ - 7.11
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/locale.h.html>`__
+ * - LC_COLLATE
+ - |check|
+ - 7.11
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/locale.h.html>`__
+ * - LC_CTYPE
+ - |check|
+ - 7.11
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/locale.h.html>`__
+ * - LC_MONETARY
+ - |check|
+ - 7.11
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/locale.h.html>`__
+ * - LC_NUMERIC
+ - |check|
+ - 7.11
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/locale.h.html>`__
+ * - LC_TIME
+ - |check|
+ - 7.11
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/locale.h.html>`__
+
+Functions
+=========
+
+.. list-table::
+ :widths: auto
+ :align: center
+ :header-rows: 1
+
+ * - Function
+ - Implemented
+ - C23 Standard Section
+ - POSIX Docs
+ * - duplocale
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/duplocale.html>`__
+ * - freelocale
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/freelocale.html>`__
+ * - getlocalename_l
+ -
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/getlocalename_l.html>`__
+ * - localeconv
+ - |check|
+ - 7.11.2.1
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/localeconv.html>`__
+ * - newlocale
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/newlocale.html>`__
+ * - setlocale
+ - |check|
+ - 7.11.1.1
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/setlocale.html>`__
+ * - uselocale
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/uselocale.html>`__
diff --git a/libc/docs/math/index.rst b/libc/docs/headers/math/index.rst
index 4934e93ccb16..2808165ad539 100644
--- a/libc/docs/math/index.rst
+++ b/libc/docs/headers/math/index.rst
@@ -1,10 +1,10 @@
.. _math:
-==============
-Math Functions
-==============
+======
+math.h
+======
-.. include:: ../check.rst
+.. include:: ../../check.rst
.. raw:: html
@@ -276,7 +276,7 @@ Higher Math Functions
+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+
| compoundn | | | | | | 7.12.7.2 | F.10.4.2 |
+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+
-| cos | |check| | |check| | | | | 7.12.4.5 | F.10.1.5 |
+| cos | |check| | |check| | | |check| | | 7.12.4.5 | F.10.1.5 |
+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+
| cosh | |check| | | | |check| | | 7.12.5.4 | F.10.2.4 |
+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+
diff --git a/libc/docs/math/log.rst b/libc/docs/headers/math/log.rst
index 82d2e2be6fb5..82d2e2be6fb5 100644
--- a/libc/docs/math/log.rst
+++ b/libc/docs/headers/math/log.rst
diff --git a/libc/docs/math/stdfix.rst b/libc/docs/headers/math/stdfix.rst
index d8dcb0cfa4c5..58052f000995 100644
--- a/libc/docs/math/stdfix.rst
+++ b/libc/docs/headers/math/stdfix.rst
@@ -2,7 +2,7 @@
StdFix Functions
================
-.. include:: ../check.rst
+.. include:: ../../check.rst
Standards and Goals
-------------------
diff --git a/libc/docs/libc_search.rst b/libc/docs/headers/search.rst
index 774622d1e66c..51832e9bdc2e 100644
--- a/libc/docs/libc_search.rst
+++ b/libc/docs/headers/search.rst
@@ -1,8 +1,8 @@
-=============
-Search Tables
-=============
+========
+search.h
+========
-.. include:: check.rst
+.. include:: ../check.rst
---------------
Source Location
diff --git a/libc/docs/setjmp.rst b/libc/docs/headers/setjmp.rst
index dd7e0aca3b9c..b0091134f1a6 100644
--- a/libc/docs/setjmp.rst
+++ b/libc/docs/headers/setjmp.rst
@@ -1,4 +1,4 @@
-.. include:: check.rst
+.. include:: ../check.rst
========
setjmp.h
@@ -15,7 +15,7 @@ Macros
* - Macro
- Implemented
- C23 Standard Section
- - POSIX.1-2017 Standard Section
+ - POSIX.1-2024 Standard Section
* - __STDC_VERSION_SETJMP_H__
-
- 7.13.2
@@ -32,7 +32,7 @@ Functions
* - Function
- Implemented
- C23 Standard Section
- - POSIX.1-2017 Standard Section
+ - POSIX.1-2024 Standard Section
* - longjmp
- |check|
- 7.13.2.1
diff --git a/libc/docs/headers/signal.rst b/libc/docs/headers/signal.rst
new file mode 100644
index 000000000000..4f51f611c9fe
--- /dev/null
+++ b/libc/docs/headers/signal.rst
@@ -0,0 +1,207 @@
+.. include:: ../check.rst
+
+========
+signal.h
+========
+
+Macros
+======
+
+.. list-table::
+ :widths: auto
+ :align: center
+ :header-rows: 1
+
+ * - Macro
+ - Implemented
+ - C23 Standard Section
+ - POSIX Docs
+ * - SIGABRT
+ - |check|
+ - 7.14.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/signal.h.html>`__
+ * - SIGALRM
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/signal.h.html>`__
+ * - SIGBUS
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/signal.h.html>`__
+ * - SIGCHLD
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/signal.h.html>`__
+ * - SIGCONT
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/signal.h.html>`__
+ * - SIGFPE
+ - |check|
+ - 7.14.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/signal.h.html>`__
+ * - SIGHUP
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/signal.h.html>`__
+ * - SIGILL
+ - |check|
+ - 7.14.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/signal.h.html>`__
+ * - SIGINT
+ - |check|
+ - 7.14.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/signal.h.html>`__
+ * - SIGKILL
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/signal.h.html>`__
+ * - SIGPIPE
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/signal.h.html>`__
+ * - SIGPOLL
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/signal.h.html>`__
+ * - SIGPROF
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/signal.h.html>`__
+ * - SIGQUIT
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/signal.h.html>`__
+ * - SIGRTMAX
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/signal.h.html>`__
+ * - SIGRTMIN
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/signal.h.html>`__
+ * - SIGSEGV
+ - |check|
+ - 7.14.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/signal.h.html>`__
+ * - SIGSTOP
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/signal.h.html>`__
+ * - SIGSYS
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/signal.h.html>`__
+ * - SIGTERM
+ - |check|
+ - 7.14.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/signal.h.html>`__
+ * - SIGTRAP
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/signal.h.html>`__
+ * - SIGTSTP
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/signal.h.html>`__
+ * - SIGTTIN
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/signal.h.html>`__
+ * - SIGTTOU
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/signal.h.html>`__
+ * - SIGURG
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/signal.h.html>`__
+ * - SIGUSR1
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/signal.h.html>`__
+ * - SIGUSR2
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/signal.h.html>`__
+ * - SIGVTALRM
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/signal.h.html>`__
+ * - SIGXCPU
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/signal.h.html>`__
+ * - SIGXFSZ
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/signal.h.html>`__
+ * - SIG_DFL
+ - |check|
+ - 7.14.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/signal.h.html>`__
+ * - SIG_ERR
+ - |check|
+ - 7.14.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/signal.h.html>`__
+ * - SIG_HOLD
+ -
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/signal.h.html>`__
+ * - SIG_IGN
+ - |check|
+ - 7.14.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/signal.h.html>`__
+
+Functions
+=========
+
+.. list-table::
+ :widths: auto
+ :align: center
+ :header-rows: 1
+
+ * - Function
+ - Implemented
+ - C23 Standard Section
+ - POSIX Docs
+ * - kill
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/kill.html>`__
+ * - raise
+ - |check|
+ - 7.14.2.1
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/raise.html>`__
+ * - sigaction
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/sigaction.html>`__
+ * - sigaddset
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/sigaddset.html>`__
+ * - sigaltstack
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/sigaltstack.html>`__
+ * - sigdelset
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/sigdelset.html>`__
+ * - sigemptyset
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/sigemptyset.html>`__
+ * - sigfillset
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/sigfillset.html>`__
+ * - signal
+ - |check|
+ - 7.14.1.1
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/signal.html>`__
+ * - sigprocmask
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/sigprocmask.html>`__
diff --git a/libc/docs/stdbit.rst b/libc/docs/headers/stdbit.rst
index e6b82bb77a14..0484d951e19c 100644
--- a/libc/docs/stdbit.rst
+++ b/libc/docs/headers/stdbit.rst
@@ -1,4 +1,4 @@
-.. include:: check.rst
+.. include:: ../check.rst
========
stdbit.h
@@ -15,7 +15,7 @@ Macros
* - Macro
- Implemented
- C23 Standard Section
- - POSIX.1-2017 Standard Section
+ - POSIX.1-2024 Standard Section
* - __STDC_ENDIAN_BIG__
- |check|
- 7.18.2.2
@@ -100,7 +100,7 @@ Functions
* - Function
- Implemented
- C23 Standard Section
- - POSIX.1-2017 Standard Section
+ - POSIX.1-2024 Standard Section
* - stdc_bit_ceil_uc
- |check|
- 7.18.16
diff --git a/libc/docs/headers/stdio.rst b/libc/docs/headers/stdio.rst
new file mode 100644
index 000000000000..1833eb5acf8a
--- /dev/null
+++ b/libc/docs/headers/stdio.rst
@@ -0,0 +1,359 @@
+.. include:: ../check.rst
+
+=======
+stdio.h
+=======
+
+Macros
+======
+
+.. list-table::
+ :widths: auto
+ :align: center
+ :header-rows: 1
+
+ * - Macro
+ - Implemented
+ - C23 Standard Section
+ - POSIX Docs
+ * - BUFSIZ
+ - |check|
+ - 7.23.1
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/stdio.h.html>`__
+ * - EOF
+ - |check|
+ - 7.23.1
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/stdio.h.html>`__
+ * - FILENAME_MAX
+ -
+ - 7.23.1
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/stdio.h.html>`__
+ * - FOPEN_MAX
+ -
+ - 7.23.1
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/stdio.h.html>`__
+ * - L_ctermid
+ -
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/stdio.h.html>`__
+ * - L_tmpnam
+ -
+ - 7.23.1
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/stdio.h.html>`__
+ * - SEEK_CUR
+ - |check|
+ - 7.23.1
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/stdio.h.html>`__
+ * - SEEK_END
+ - |check|
+ - 7.23.1
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/stdio.h.html>`__
+ * - SEEK_SET
+ - |check|
+ - 7.23.1
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/stdio.h.html>`__
+ * - TMP_MAX
+ -
+ - 7.23.1
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/stdio.h.html>`__
+ * - _IOFBF
+ - |check|
+ - 7.23.1
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/stdio.h.html>`__
+ * - _IOLBF
+ - |check|
+ - 7.23.1
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/stdio.h.html>`__
+ * - _IONBF
+ - |check|
+ - 7.23.1
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/stdio.h.html>`__
+ * - _PRINTF_NAN_LEN_MAX
+ -
+ - 7.23.1
+ -
+ * - __STDC_VERSION_STDIO_H__
+ -
+ - 7.23.1
+ -
+ * - stderr
+ - |check|
+ - 7.23.1
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/stdio.h.html>`__
+ * - stdin
+ - |check|
+ - 7.23.1
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/stdio.h.html>`__
+ * - stdout
+ - |check|
+ - 7.23.1
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/stdio.h.html>`__
+
+Functions
+=========
+
+.. list-table::
+ :widths: auto
+ :align: center
+ :header-rows: 1
+
+ * - Function
+ - Implemented
+ - C23 Standard Section
+ - POSIX Docs
+ * - clearerr
+ - |check|
+ - 7.23.10.1
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/clearerr.html>`__
+ * - ctermid
+ -
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/ctermid.html>`__
+ * - dprintf
+ -
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/dprintf.html>`__
+ * - fclose
+ - |check|
+ - 7.23.5.1
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/fclose.html>`__
+ * - fdopen
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/fdopen.html>`__
+ * - feof
+ - |check|
+ - 7.23.10.2
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/feof.html>`__
+ * - ferror
+ - |check|
+ - 7.23.10.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/ferror.html>`__
+ * - fflush
+ - |check|
+ - 7.23.5.2
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/fflush.html>`__
+ * - fgetc
+ - |check|
+ - 7.23.7.1
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/fgetc.html>`__
+ * - fgetpos
+ -
+ - 7.23.9.1
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/fgetpos.html>`__
+ * - fgets
+ - |check|
+ - 7.23.7.2
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/fgets.html>`__
+ * - fileno
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/fileno.html>`__
+ * - flockfile
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/flockfile.html>`__
+ * - fmemopen
+ -
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/fmemopen.html>`__
+ * - fopen
+ - |check|
+ - 7.23.5.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/fopen.html>`__
+ * - fprintf
+ - |check|
+ - 7.23.6.1
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/fprintf.html>`__
+ * - fputc
+ - |check|
+ - 7.23.7.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/fputc.html>`__
+ * - fputs
+ - |check|
+ - 7.23.7.4
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/fputs.html>`__
+ * - fread
+ - |check|
+ - 7.23.8.1
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/fread.html>`__
+ * - freopen
+ -
+ - 7.23.5.4
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/freopen.html>`__
+ * - fscanf
+ - |check|
+ - 7.23.6.2
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/fscanf.html>`__
+ * - fseek
+ - |check|
+ - 7.23.9.2
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/fseek.html>`__
+ * - fseeko
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/fseeko.html>`__
+ * - fsetpos
+ -
+ - 7.23.9.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/fsetpos.html>`__
+ * - ftell
+ - |check|
+ - 7.23.9.4
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/ftell.html>`__
+ * - ftello
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/ftello.html>`__
+ * - ftrylockfile
+ -
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/ftrylockfile.html>`__
+ * - funlockfile
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/funlockfile.html>`__
+ * - fwrite
+ - |check|
+ - 7.23.8.2
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/fwrite.html>`__
+ * - getc
+ - |check|
+ - 7.23.7.5
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/getc.html>`__
+ * - getchar
+ - |check|
+ - 7.23.7.6
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/getchar.html>`__
+ * - getdelim
+ -
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/getdelim.html>`__
+ * - getline
+ -
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/getline.html>`__
+ * - open_memstream
+ -
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/open_memstream.html>`__
+ * - pclose
+ -
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/pclose.html>`__
+ * - perror
+ -
+ - 7.23.10.4
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/perror.html>`__
+ * - popen
+ -
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/popen.html>`__
+ * - printf
+ - |check|
+ - 7.23.6.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/printf.html>`__
+ * - putc
+ - |check|
+ - 7.23.7.7
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/putc.html>`__
+ * - putc_unlocked
+ -
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/putc_unlocked.html>`__
+ * - putchar
+ - |check|
+ - 7.23.7.8
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/putchar.html>`__
+ * - putchar_unlocked
+ -
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/putchar_unlocked.html>`__
+ * - puts
+ - |check|
+ - 7.23.7.9
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/puts.html>`__
+ * - remove
+ - |check|
+ - 7.23.4.1
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/remove.html>`__
+ * - rename
+ - |check|
+ - 7.23.4.2
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/rename.html>`__
+ * - renameat
+ -
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/renameat.html>`__
+ * - rewind
+ -
+ - 7.23.9.5
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/rewind.html>`__
+ * - scanf
+ - |check|
+ - 7.23.6.4
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/scanf.html>`__
+ * - setbuf
+ - |check|
+ - 7.23.5.5
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/setbuf.html>`__
+ * - setvbuf
+ - |check|
+ - 7.23.5.6
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/setvbuf.html>`__
+ * - snprintf
+ - |check|
+ - 7.23.6.5
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/snprintf.html>`__
+ * - sprintf
+ - |check|
+ - 7.23.6.6
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/sprintf.html>`__
+ * - sscanf
+ - |check|
+ - 7.23.6.7
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/sscanf.html>`__
+ * - tmpfile
+ -
+ - 7.23.4.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/tmpfile.html>`__
+ * - tmpnam
+ -
+ - 7.23.4.4
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/tmpnam.html>`__
+ * - ungetc
+ - |check|
+ - 7.23.7.10
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/ungetc.html>`__
+ * - vdprintf
+ -
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/vdprintf.html>`__
+ * - vfprintf
+ - |check|
+ - 7.23.6.8
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/vfprintf.html>`__
+ * - vfscanf
+ - |check|
+ - 7.23.6.9
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/vfscanf.html>`__
+ * - vprintf
+ - |check|
+ - 7.23.6.10
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/vprintf.html>`__
+ * - vscanf
+ - |check|
+ - 7.23.6.11
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/vscanf.html>`__
+ * - vsnprintf
+ - |check|
+ - 7.23.6.12
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/vsnprintf.html>`__
+ * - vsprintf
+ - |check|
+ - 7.23.6.13
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/vsprintf.html>`__
+ * - vsscanf
+ - |check|
+ - 7.23.6.14
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/vsscanf.html>`__
diff --git a/libc/docs/headers/stdlib.rst b/libc/docs/headers/stdlib.rst
new file mode 100644
index 000000000000..4151f2934c94
--- /dev/null
+++ b/libc/docs/headers/stdlib.rst
@@ -0,0 +1,255 @@
+.. include:: ../check.rst
+
+========
+stdlib.h
+========
+
+Macros
+======
+
+.. list-table::
+ :widths: auto
+ :align: center
+ :header-rows: 1
+
+ * - Macro
+ - Implemented
+ - C23 Standard Section
+ - POSIX Docs
+ * - EXIT_FAILURE
+ - |check|
+ - 7.24
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/stdlib.h.html>`__
+ * - EXIT_SUCCESS
+ - |check|
+ - 7.24
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/stdlib.h.html>`__
+ * - MB_CUR_MAX
+ - |check|
+ - 7.24
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/stdlib.h.html>`__
+ * - RAND_MAX
+ - |check|
+ - 7.24
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/stdlib.h.html>`__
+ * - __STDC_VERSION_STDLIB_H__
+ -
+ - 7.24
+ -
+
+Functions
+=========
+
+.. list-table::
+ :widths: auto
+ :align: center
+ :header-rows: 1
+
+ * - Function
+ - Implemented
+ - C23 Standard Section
+ - POSIX Docs
+ * - _Exit
+ - |check|
+ - 7.24.4.5
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/_Exit.html>`__
+ * - abort
+ - |check|
+ - 7.24.4.1
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/abort.html>`__
+ * - abs
+ - |check|
+ - 7.24.6.1
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/abs.html>`__
+ * - aligned_alloc
+ - |check|
+ - 7.24.3.1
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/aligned_alloc.html>`__
+ * - at_quick_exit
+ - |check|
+ - 7.24.4.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/at_quick_exit.html>`__
+ * - atexit
+ - |check|
+ - 7.24.4.2
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/atexit.html>`__
+ * - atof
+ - |check|
+ - 7.24.1.1
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/atof.html>`__
+ * - atoi
+ - |check|
+ - 7.24.1.2
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/atoi.html>`__
+ * - atol
+ - |check|
+ - 7.24.1.2
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/atol.html>`__
+ * - atoll
+ - |check|
+ - 7.24.1.2
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/atoll.html>`__
+ * - bsearch
+ - |check|
+ - 7.24.5.1
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/bsearch.html>`__
+ * - calloc
+ - |check|
+ - 7.24.3.2
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/calloc.html>`__
+ * - div
+ - |check|
+ - 7.24.6.2
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/div.html>`__
+ * - exit
+ - |check|
+ - 7.24.4.4
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/exit.html>`__
+ * - free
+ - |check|
+ - 7.24.3.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/free.html>`__
+ * - free_aligned_sized
+ -
+ - 7.24.3.5
+ -
+ * - free_sized
+ -
+ - 7.24.3.4
+ -
+ * - getenv
+ - |check|
+ - 7.24.4.6
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/getenv.html>`__
+ * - labs
+ - |check|
+ - 7.24.6.1
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/labs.html>`__
+ * - ldiv
+ - |check|
+ - 7.24.6.2
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/ldiv.html>`__
+ * - llabs
+ - |check|
+ - 7.24.6.1
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/llabs.html>`__
+ * - lldiv
+ - |check|
+ - 7.24.6.2
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/lldiv.html>`__
+ * - malloc
+ - |check|
+ - 7.24.3.6
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/malloc.html>`__
+ * - mblen
+ -
+ - 7.24.7.1
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/mblen.html>`__
+ * - mbstowcs
+ -
+ - 7.24.8.1
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/mbstowcs.html>`__
+ * - mbtowc
+ -
+ - 7.24.7.2
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/mbtowc.html>`__
+ * - memalignment
+ -
+ - 7.24.9.1
+ -
+ * - qsort
+ - |check|
+ - 7.24.5.2
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/qsort.html>`__
+ * - quick_exit
+ - |check|
+ - 7.24.4.7
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/quick_exit.html>`__
+ * - rand
+ - |check|
+ - 7.24.2.1
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/rand.html>`__
+ * - realloc
+ - |check|
+ - 7.24.3.7
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/realloc.html>`__
+ * - srand
+ - |check|
+ - 7.24.2.2
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/srand.html>`__
+ * - strfromd
+ - |check|
+ - 7.24.1.3
+ -
+ * - strfromd128
+ -
+ - 7.24.1.4
+ -
+ * - strfromd32
+ -
+ - 7.24.1.4
+ -
+ * - strfromd64
+ -
+ - 7.24.1.4
+ -
+ * - strfromf
+ - |check|
+ - 7.24.1.3
+ -
+ * - strfroml
+ - |check|
+ - 7.24.1.3
+ -
+ * - strtod
+ - |check|
+ - 7.24.1.5
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/strtod.html>`__
+ * - strtod128
+ -
+ - 7.24.1.6
+ -
+ * - strtod32
+ -
+ - 7.24.1.6
+ -
+ * - strtod64
+ -
+ - 7.24.1.6
+ -
+ * - strtof
+ - |check|
+ - 7.24.1.5
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/strtof.html>`__
+ * - strtol
+ - |check|
+ - 7.24.1.7
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/strtol.html>`__
+ * - strtold
+ - |check|
+ - 7.24.1.5
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/strtold.html>`__
+ * - strtoll
+ - |check|
+ - 7.24.1.7
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/strtoll.html>`__
+ * - strtoul
+ - |check|
+ - 7.24.1.7
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/strtoul.html>`__
+ * - strtoull
+ - |check|
+ - 7.24.1.7
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/strtoull.html>`__
+ * - system
+ - |check|
+ - 7.24.4.8
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/system.html>`__
+ * - wcstombs
+ -
+ - 7.24.8.2
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/wcstombs.html>`__
+ * - wctomb
+ -
+ - 7.24.7.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/wctomb.html>`__
diff --git a/libc/docs/headers/string.rst b/libc/docs/headers/string.rst
new file mode 100644
index 000000000000..2665ed8ca17e
--- /dev/null
+++ b/libc/docs/headers/string.rst
@@ -0,0 +1,163 @@
+.. include:: ../check.rst
+
+========
+string.h
+========
+
+Macros
+======
+
+.. list-table::
+ :widths: auto
+ :align: center
+ :header-rows: 1
+
+ * - Macro
+ - Implemented
+ - C23 Standard Section
+ - POSIX Docs
+ * - __STDC_VERSION_STRING_H__
+ -
+ - 7.26.1
+ -
+
+Functions
+=========
+
+.. list-table::
+ :widths: auto
+ :align: center
+ :header-rows: 1
+
+ * - Function
+ - Implemented
+ - C23 Standard Section
+ - POSIX Docs
+ * - memccpy
+ - |check|
+ - 7.26.2.2
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/memccpy.html>`__
+ * - memchr
+ - |check|
+ - 7.26.5.2
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/memchr.html>`__
+ * - memcmp
+ - |check|
+ - 7.26.4.1
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/memcmp.html>`__
+ * - memcpy
+ - |check|
+ - 7.26.2.1
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/memcpy.html>`__
+ * - memmove
+ - |check|
+ - 7.26.2.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/memmove.html>`__
+ * - mempcpy
+ - |check|
+ - TODO: glibc extension
+ -
+ * - memset
+ - |check|
+ - 7.26.6.1
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/memset.html>`__
+ * - memset_explicit
+ - |check|
+ - 7.26.6.2
+ -
+ * - stpcpy
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/stpcpy.html>`__
+ * - stpncpy
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/stpncpy.html>`__
+ * - strcat
+ - |check|
+ - 7.26.3.1
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/strcat.html>`__
+ * - strchr
+ - |check|
+ - 7.26.5.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/strchr.html>`__
+ * - strcmp
+ - |check|
+ - 7.26.4.2
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/strcmp.html>`__
+ * - strcoll
+ - |check|
+ - 7.26.4.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/strcoll.html>`__
+ * - strcoll_l
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/strcoll_l.html>`__
+ * - strcpy
+ - |check|
+ - 7.26.2.4
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/strcpy.html>`__
+ * - strcspn
+ - |check|
+ - 7.26.5.4
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/strcspn.html>`__
+ * - strdup
+ - |check|
+ - 7.26.2.6
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/strdup.html>`__
+ * - strerror
+ - |check|
+ - 7.26.6.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/strerror.html>`__
+ * - strlen
+ - |check|
+ - 7.26.6.4
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/strlen.html>`__
+ * - strncat
+ - |check|
+ - 7.26.3.2
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/strncat.html>`__
+ * - strncmp
+ - |check|
+ - 7.26.4.4
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/strncmp.html>`__
+ * - strncpy
+ - |check|
+ - 7.26.2.5
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/strncpy.html>`__
+ * - strndup
+ - |check|
+ - 7.26.2.7
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/strndup.html>`__
+ * - strpbrk
+ - |check|
+ - 7.26.5.5
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/strpbrk.html>`__
+ * - strrchr
+ - |check|
+ - 7.26.5.6
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/strrchr.html>`__
+ * - strspn
+ - |check|
+ - 7.26.5.7
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/strspn.html>`__
+ * - strstr
+ - |check|
+ - 7.26.5.8
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/strstr.html>`__
+ * - strtok
+ - |check|
+ - 7.26.5.9
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/strtok.html>`__
+ * - strtok_r
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/strtok_r.html>`__
+ * - strxfrm
+ - |check|
+ - 7.26.4.5
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/strxfrm.html>`__
+ * - strxfrm_l
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/strxfrm_l.html>`__
diff --git a/libc/docs/headers/strings.rst b/libc/docs/headers/strings.rst
new file mode 100644
index 000000000000..effd667cd521
--- /dev/null
+++ b/libc/docs/headers/strings.rst
@@ -0,0 +1,66 @@
+.. include:: ../check.rst
+
+=========
+strings.h
+=========
+
+Functions
+=========
+
+.. list-table::
+ :widths: auto
+ :align: center
+ :header-rows: 1
+
+ * - Function
+ - Implemented
+ - C23 Standard Section
+ - POSIX Docs
+ * - bcmp
+ - |check|
+ -
+ - `removed in POSIX.1-2008 <https://pubs.opengroup.org/onlinepubs/007904875/functions/bcmp.html>`__
+ * - bcopy
+ - |check|
+ -
+ - `removed in POSIX.1-2008 <https://pubs.opengroup.org/onlinepubs/007904875/functions/bcopy.html>`__
+ * - bzero
+ - |check|
+ -
+ - `removed in POSIX.1-2008 <https://pubs.opengroup.org/onlinepubs/007904875/functions/bzero.html>`__
+ * - ffs
+ -
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/ffs.html>`__
+ * - ffsl
+ -
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/ffsl.html>`__
+ * - ffsll
+ -
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/ffsll.html>`__
+ * - index
+ - |check|
+ -
+ - `removed in POSIX.1-2008 <https://pubs.opengroup.org/onlinepubs/007904875/functions/index.html>`__
+ * - rindex
+ - |check|
+ -
+ - `removed in POSIX.1-2008 <https://pubs.opengroup.org/onlinepubs/007904875/functions/rindex.html>`__
+ * - strcasecmp
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/strcasecmp.html>`__
+ * - strcasecmp_l
+ -
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/strcasecmp_l.html>`__
+ * - strncasecmp
+ - |check|
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/strncasecmp.html>`__
+ * - strncasecmp_l
+ -
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/strncasecmp_l.html>`__
diff --git a/libc/docs/headers/sys/mman.rst b/libc/docs/headers/sys/mman.rst
new file mode 100644
index 000000000000..e3404205c07a
--- /dev/null
+++ b/libc/docs/headers/sys/mman.rst
@@ -0,0 +1,179 @@
+.. include:: ../../check.rst
+
+==========
+sys/mman.h
+==========
+
+Macros
+======
+
+.. list-table::
+ :widths: auto
+ :align: center
+ :header-rows: 1
+
+ * - Macro
+ - Implemented
+ - C23 Standard Section
+ - POSIX.1-2024 Standard Section
+ * - MAP_ANON
+ -
+ -
+ -
+ * - MAP_ANONYMOUS
+ -
+ -
+ -
+ * - MAP_FAILED
+ - |check|
+ -
+ -
+ * - MAP_FIXED
+ -
+ -
+ -
+ * - MAP_PRIVATE
+ -
+ -
+ -
+ * - MAP_SHARED
+ -
+ -
+ -
+ * - MCL_CURRENT
+ -
+ -
+ -
+ * - MCL_FUTURE
+ -
+ -
+ -
+ * - MS_ASYNC
+ -
+ -
+ -
+ * - MS_INVALIDATE
+ -
+ -
+ -
+ * - MS_SYNC
+ -
+ -
+ -
+ * - POSIX_MADV_DONTNEED
+ - |check|
+ -
+ -
+ * - POSIX_MADV_NORMAL
+ - |check|
+ -
+ -
+ * - POSIX_MADV_RANDOM
+ - |check|
+ -
+ -
+ * - POSIX_MADV_SEQUENTIAL
+ - |check|
+ -
+ -
+ * - POSIX_MADV_WILLNEED
+ - |check|
+ -
+ -
+ * - POSIX_TYPED_MEM_ALLOCATE
+ -
+ -
+ -
+ * - POSIX_TYPED_MEM_ALLOCATE_CONTIG
+ -
+ -
+ -
+ * - POSIX_TYPED_MEM_MAP_ALLOCATABLE
+ -
+ -
+ -
+ * - PROT_EXEC
+ -
+ -
+ -
+ * - PROT_NONE
+ -
+ -
+ -
+ * - PROT_READ
+ -
+ -
+ -
+ * - PROT_WRITE
+ -
+ -
+ -
+
+Functions
+=========
+
+.. list-table::
+ :widths: auto
+ :align: center
+ :header-rows: 1
+
+ * - Function
+ - Implemented
+ - C23 Standard Section
+ - POSIX.1-2024 Standard Section
+ * - mlock
+ - |check|
+ -
+ -
+ * - mlockall
+ - |check|
+ -
+ -
+ * - mmap
+ - |check|
+ -
+ -
+ * - mprotect
+ - |check|
+ -
+ -
+ * - msync
+ - |check|
+ -
+ -
+ * - munlock
+ - |check|
+ -
+ -
+ * - munlockall
+ - |check|
+ -
+ -
+ * - munmap
+ - |check|
+ -
+ -
+ * - posix_madvise
+ - |check|
+ -
+ -
+ * - posix_mem_offset
+ -
+ -
+ -
+ * - posix_typed_mem_get_info
+ -
+ -
+ -
+ * - posix_typed_mem_open
+ -
+ -
+ -
+ * - shm_open
+ - |check|
+ -
+ -
+ * - shm_unlink
+ - |check|
+ -
+ -
diff --git a/libc/docs/headers/threads.rst b/libc/docs/headers/threads.rst
new file mode 100644
index 000000000000..c2837b8c3591
--- /dev/null
+++ b/libc/docs/headers/threads.rst
@@ -0,0 +1,147 @@
+.. include:: ../check.rst
+
+=========
+threads.h
+=========
+
+Macros
+======
+
+.. list-table::
+ :widths: auto
+ :align: center
+ :header-rows: 1
+
+ * - Macro
+ - Implemented
+ - C23 Standard Section
+ - POSIX Docs
+ * - ONCE_FLAG_INIT
+ -
+ - 7.28.1
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/threads.h.html>`__
+ * - TSS_DTOR_ITERATIONS
+ -
+ - 7.28.1
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/threads.h.html>`__
+ * - __STDC_NO_THREADS__
+ -
+ - 7.28.1
+ -
+ * - thread_local
+ -
+ -
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/threads.h.html>`__
+
+Functions
+=========
+
+.. list-table::
+ :widths: auto
+ :align: center
+ :header-rows: 1
+
+ * - Function
+ - Implemented
+ - C23 Standard Section
+ - POSIX Docs
+ * - call_once
+ - |check|
+ - 7.28.2.1
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/call_once.html>`__
+ * - cnd_broadcast
+ - |check|
+ - 7.28.3.1
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/cnd_broadcast.html>`__
+ * - cnd_destroy
+ - |check|
+ - 7.28.3.2
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/cnd_destroy.html>`__
+ * - cnd_init
+ - |check|
+ - 7.28.3.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/cnd_init.html>`__
+ * - cnd_signal
+ - |check|
+ - 7.28.3.4
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/cnd_signal.html>`__
+ * - cnd_timedwait
+ -
+ - 7.28.3.5
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/cnd_timedwait.html>`__
+ * - cnd_wait
+ - |check|
+ - 7.28.3.6
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/cnd_wait.html>`__
+ * - mtx_destroy
+ - |check|
+ - 7.28.4.2
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/mtx_destroy.html>`__
+ * - mtx_init
+ - |check|
+ - 7.28.4.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/mtx_init.html>`__
+ * - mtx_lock
+ - |check|
+ - 7.28.4.4
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/mtx_lock.html>`__
+ * - mtx_timedlock
+ -
+ - 7.28.4.5
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/mtx_timedlock.html>`__
+ * - mtx_trylock
+ -
+ - 7.28.4.6
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/mtx_trylock.html>`__
+ * - mtx_unlock
+ - |check|
+ - 7.28.4.7
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/mtx_unlock.html>`__
+ * - thrd_create
+ - |check|
+ - 7.28.5.1
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/thrd_create.html>`__
+ * - thrd_current
+ - |check|
+ - 7.28.5.2
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/thrd_current.html>`__
+ * - thrd_detach
+ - |check|
+ - 7.28.5.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/thrd_detach.html>`__
+ * - thrd_equal
+ - |check|
+ - 7.28.5.4
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/thrd_equal.html>`__
+ * - thrd_exit
+ - |check|
+ - 7.28.5.5
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/thrd_exit.html>`__
+ * - thrd_join
+ - |check|
+ - 7.28.5.6
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/thrd_join.html>`__
+ * - thrd_sleep
+ -
+ - 7.28.5.7
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/thrd_sleep.html>`__
+ * - thrd_yield
+ -
+ - 7.28.5.8
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/thrd_yield.html>`__
+ * - tss_create
+ - |check|
+ - 7.28.6.1
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/tss_create.html>`__
+ * - tss_delete
+ - |check|
+ - 7.28.6.2
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/tss_delete.html>`__
+ * - tss_get
+ - |check|
+ - 7.28.6.3
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/tss_get.html>`__
+ * - tss_set
+ - |check|
+ - 7.28.6.4
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/tss_set.html>`__
diff --git a/libc/docs/date_and_time.rst b/libc/docs/headers/time.rst
index b745a3b416f8..de82d80a2bec 100644
--- a/libc/docs/date_and_time.rst
+++ b/libc/docs/headers/time.rst
@@ -1,8 +1,8 @@
-=======================
-Date and Time Functions
-=======================
+======
+time.h
+======
-.. include:: check.rst
+.. include:: ../check.rst
---------------
Source location
diff --git a/libc/docs/headers/uchar.rst b/libc/docs/headers/uchar.rst
new file mode 100644
index 000000000000..abb684bf9ae0
--- /dev/null
+++ b/libc/docs/headers/uchar.rst
@@ -0,0 +1,59 @@
+.. include:: ../check.rst
+
+=======
+uchar.h
+=======
+
+Macros
+======
+
+.. list-table::
+ :widths: auto
+ :align: center
+ :header-rows: 1
+
+ * - Macro
+ - Implemented
+ - C23 Standard Section
+ - POSIX Docs
+ * - __STDC_VERSION_UCHAR_H__
+ -
+ - 7.30.1
+ -
+
+Functions
+=========
+
+.. list-table::
+ :widths: auto
+ :align: center
+ :header-rows: 1
+
+ * - Function
+ - Implemented
+ - C23 Standard Section
+ - POSIX Docs
+ * - c16rtomb
+ -
+ - 7.30.2.5
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/c16rtomb.html>`__
+ * - c32rtomb
+ -
+ - 7.30.2.7
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/c32rtomb.html>`__
+ * - c8rtomb
+ -
+ - 7.30.2.3
+ -
+ * - mbrtoc16
+ -
+ - 7.30.2.4
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/mbrtoc16.html>`__
+ * - mbrtoc32
+ -
+ - 7.30.2.6
+ - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/mbrtoc32.html>`__
+ * - mbrtoc8
+ -
+ - 7.30.2.2
+ -
diff --git a/libc/docs/headers/wchar.rst b/libc/docs/headers/wchar.rst
new file mode 100644
index 000000000000..89a1e7b3fe66
--- /dev/null
+++ b/libc/docs/headers/wchar.rst
@@ -0,0 +1,287 @@
+.. include:: ../check.rst
+
+=======
+wchar.h
+=======
+
+Macros
+======
+
+.. list-table::
+ :widths: auto
+ :align: center
+ :header-rows: 1
+
+ * - Macro
+ - Implemented
+ - C23 Standard Section
+ - POSIX Docs
+ * - WEOF
+ - |check|
+ - 7.31.1
+ -
+ * - __STDC_VERSION_WCHAR_H__
+ -
+ - 7.31.1
+ -
+
+Functions
+=========
+
+.. list-table::
+ :widths: auto
+ :align: center
+ :header-rows: 1
+
+ * - Function
+ - Implemented
+ - C23 Standard Section
+ - POSIX Docs
+ * - btowc
+ - |check|
+ - 7.31.6.2.1
+ -
+ * - fgetwc
+ -
+ - 7.31.3.1
+ -
+ * - fgetws
+ -
+ - 7.31.3.2
+ -
+ * - fputwc
+ -
+ - 7.31.3.3
+ -
+ * - fputws
+ -
+ - 7.31.3.4
+ -
+ * - fwide
+ -
+ - 7.31.3.5
+ -
+ * - fwprintf
+ -
+ - 7.31.2.2
+ -
+ * - fwscanf
+ -
+ - 7.31.2.3
+ -
+ * - getwc
+ -
+ - 7.31.3.6
+ -
+ * - getwchar
+ -
+ - 7.31.3.7
+ -
+ * - mbrlen
+ -
+ - 7.31.6.4.2
+ -
+ * - mbrtowc
+ -
+ - 7.31.6.4.3
+ -
+ * - mbsinit
+ -
+ - 7.31.6.3.1
+ -
+ * - mbsrtowcs
+ -
+ - 7.31.6.5.2
+ -
+ * - putwc
+ -
+ - 7.31.3.8
+ -
+ * - putwchar
+ -
+ - 7.31.3.9
+ -
+ * - swprintf
+ -
+ - 7.31.2.4
+ -
+ * - swscanf
+ -
+ - 7.31.2.5
+ -
+ * - ungetwc
+ -
+ - 7.31.3.10
+ -
+ * - vfwprintf
+ -
+ - 7.31.2.6
+ -
+ * - vfwscanf
+ -
+ - 7.31.2.7
+ -
+ * - vswprintf
+ -
+ - 7.31.2.8
+ -
+ * - vswscanf
+ -
+ - 7.31.2.9
+ -
+ * - vwprintf
+ -
+ - 7.31.2.10
+ -
+ * - vwscanf
+ -
+ - 7.31.2.11
+ -
+ * - wcrtomb
+ -
+ - 7.31.6.4.4
+ -
+ * - wcscat
+ -
+ - 7.31.4.4.1
+ -
+ * - wcschr
+ -
+ - 7.31.4.6.2
+ -
+ * - wcscmp
+ -
+ - 7.31.4.5.2
+ -
+ * - wcscoll
+ -
+ - 7.31.4.5.3
+ -
+ * - wcscpy
+ -
+ - 7.31.4.3.1
+ -
+ * - wcscspn
+ -
+ - 7.31.4.6.3
+ -
+ * - wcsftime
+ -
+ - 7.31.5.1
+ -
+ * - wcslen
+ -
+ - 7.31.4.7.1
+ -
+ * - wcsncat
+ -
+ - 7.31.4.4.2
+ -
+ * - wcsncmp
+ -
+ - 7.31.4.5.4
+ -
+ * - wcsncpy
+ -
+ - 7.31.4.3.2
+ -
+ * - wcspbrk
+ -
+ - 7.31.4.6.4
+ -
+ * - wcsrchr
+ -
+ - 7.31.4.6.5
+ -
+ * - wcsrtombs
+ -
+ - 7.31.6.5.3
+ -
+ * - wcsspn
+ -
+ - 7.31.4.6.6
+ -
+ * - wcsstr
+ -
+ - 7.31.4.6.7
+ -
+ * - wcstod
+ -
+ - 7.31.4.2.2
+ -
+ * - wcstod128
+ -
+ - 7.31.4.2.3
+ -
+ * - wcstod32
+ -
+ - 7.31.4.2.3
+ -
+ * - wcstod64
+ -
+ - 7.31.4.2.3
+ -
+ * - wcstof
+ -
+ - 7.31.4.2.2
+ -
+ * - wcstok
+ -
+ - 7.31.4.6.8
+ -
+ * - wcstol
+ -
+ - 7.31.4.2.4
+ -
+ * - wcstold
+ -
+ - 7.31.4.2.2
+ -
+ * - wcstoll
+ -
+ - 7.31.4.2.4
+ -
+ * - wcstoul
+ -
+ - 7.31.4.2.4
+ -
+ * - wcstoull
+ -
+ - 7.31.4.2.4
+ -
+ * - wcsxfrm
+ -
+ - 7.31.4.5.5
+ -
+ * - wctob
+ - |check|
+ - 7.31.6.2.2
+ -
+ * - wmemchr
+ -
+ - 7.31.4.6.9
+ -
+ * - wmemcmp
+ -
+ - 7.31.4.5.6
+ -
+ * - wmemcpy
+ -
+ - 7.31.4.3.3
+ -
+ * - wmemmove
+ -
+ - 7.31.4.3.4
+ -
+ * - wmemset
+ -
+ - 7.31.4.7.2
+ -
+ * - wprintf
+ -
+ - 7.31.2.12
+ -
+ * - wscanf
+ -
+ - 7.31.2.13
+ -
diff --git a/libc/docs/headers/wctype.rst b/libc/docs/headers/wctype.rst
new file mode 100644
index 000000000000..076db04f183e
--- /dev/null
+++ b/libc/docs/headers/wctype.rst
@@ -0,0 +1,86 @@
+.. include:: ../check.rst
+
+========
+wctype.h
+========
+
+Functions
+=========
+
+.. list-table::
+ :widths: auto
+ :align: center
+ :header-rows: 1
+
+ * - Function
+ - Implemented
+ - C23 Standard Section
+ - POSIX Docs
+ * - iswalnum
+ -
+ - 7.32.2.1.1
+ -
+ * - iswalpha
+ -
+ - 7.32.2.1.2
+ -
+ * - iswblank
+ -
+ - 7.32.2.1.4
+ -
+ * - iswctype
+ -
+ - 7.32.2.2.1
+ -
+ * - iswdigit
+ -
+ - 7.32.2.1.5
+ -
+ * - iswgraph
+ -
+ - 7.32.2.1.6
+ -
+ * - iswlower
+ -
+ - 7.32.2.1.7
+ -
+ * - iswprint
+ -
+ - 7.32.2.1.8
+ -
+ * - iswpunct
+ -
+ - 7.32.2.1.9
+ -
+ * - iswspace
+ -
+ - 7.32.2.1.10
+ -
+ * - iswupper
+ -
+ - 7.32.2.1.11
+ -
+ * - iswxdigit
+ -
+ - 7.32.2.1.12
+ -
+ * - towctrans
+ -
+ - 7.32.3.2.1
+ -
+ * - towlower
+ -
+ - 7.32.3.1.1
+ -
+ * - towupper
+ -
+ - 7.32.3.1.2
+ -
+ * - wctrans
+ -
+ - 7.32.3.2.2
+ -
+ * - wctype
+ -
+ - 7.32.2.2.2
+ -
diff --git a/libc/docs/index.rst b/libc/docs/index.rst
index 6f759aa215b6..0cbf75f5e0ef 100644
--- a/libc/docs/index.rst
+++ b/libc/docs/index.rst
@@ -2,18 +2,24 @@
The LLVM C Library
==================
+.. warning::
+ LLVM-libc is not yet ABI stable; currently only static linking is supported.
+ LLVM-libc developers retain the right to modify the ABI of types used
+ throughout the library. Another libc should be preferred if ABI stability is
+ a requirement.
+
.. note::
LLVM-libc is not fully complete right now. Some programs may fail to build due
- to missing functions (especially C++ ones). If you would like to help us
- finish LLVM-libc, check out "Contributing to the libc project" in the sidebar
- or ask on discord.
+ to missing functions. If you would like to help us finish LLVM-libc, check
+ out "`Contributing to the libc project <contributing.html>`__" in the sidebar
+ or ask on `discord <https://discord.com/channels/636084430946959380/636732994891284500>`__.
Introduction
============
LLVM-libc aspires to a unique place in the software ecosystem. The goals are:
-- Fully compliant with current C standards (C17 and upcoming C2x) and POSIX.
+- Fully compliant with current C23 and POSIX.1-2024 standards.
- Easily decomposed and embedded: Supplement or replace system C library
functionality easily. This is useful to get consistent math precision across
systems, or updated memory operations for newer microarchitectures. These
@@ -27,25 +33,8 @@ LLVM-libc aspires to a unique place in the software ecosystem. The goals are:
libc functions.
- A complete testsuite that tests both the public interface and internal
algorithms.
-- `Fuzzing`__
-
-.. __: https://github.com/llvm/llvm-project/tree/main/libc/fuzzing
-
-Platform Support
-================
+- `Fuzzing <https://github.com/llvm/llvm-project/tree/main/libc/fuzzing>`__
-Most development is currently targeting Linux on x86_64, aarch64, arm, and
-RISC-V. Embedded/baremetal targets are supported on arm and RISC-V, and Windows
-and MacOS have limited support (may be broken). The Fuchsia platform is
-slowly replacing functions from its bundled libc with functions from this
-project.
-
-ABI Compatibility
-=================
-
-The libc is written to be ABI independent. Interfaces are generated using
-headergen, so supporting arbitrary ABIs is possible. In it's initial
-stages there is no ABI stability in any form.
.. toctree::
:hidden:
@@ -63,20 +52,17 @@ stages there is no ABI stability in any form.
:maxdepth: 1
:caption: Status
- compiler_support
- date_and_time
- math/index.rst
- strings
- stdio
- stdbit
- fenv
- libc_search
+ headers/index.rst
c23
- ctype
- complex
- signal
- threads
- setjmp
+
+.. toctree::
+ :hidden:
+ :maxdepth: 1
+ :caption: Support
+
+ arch_support
+ platform_support
+ compiler_support
.. toctree::
:hidden:
diff --git a/libc/docs/platform_support.rst b/libc/docs/platform_support.rst
new file mode 100644
index 000000000000..2ce3d7282b30
--- /dev/null
+++ b/libc/docs/platform_support.rst
@@ -0,0 +1,22 @@
+Platform Support
+================
+
+Development is currently mostly focused on Linux. MacOS and Windows has
+partial support, but has bitrot and isn't being tested continuously.
+
+LLVM-libc is currently being integrated into Android and Fuchsia operating
+systems via `overlay mode <overlay_mode.html>`__.
+
+For Linux, we support kernel versions as listed on
+`kernel.org <https://kernel.org/>`_, including ``longterm`` (not past EOL
+date), ``stable``, and ``mainline`` versions. We actively adopt new features
+from ``linux-next``.
+
+For Windows, we plan to support products within their lifecycle. Please refer to
+`Search Product and Services Lifecycle Information <https://learn.microsoft.com/en-us/lifecycle/products/?products=windows>`_ for more information.
+
+LLVM-libc does not guarantee backward compatibility with operating systems that
+have reached their EOL. Compatibility patches for obsolete operating systems
+will not be accepted.
+
+For GPU, reference `our GPU docs <gpu/index.html>`__.
diff --git a/libc/docs/signal.rst b/libc/docs/signal.rst
deleted file mode 100644
index e12f67b0c61c..000000000000
--- a/libc/docs/signal.rst
+++ /dev/null
@@ -1,207 +0,0 @@
-.. include:: check.rst
-
-========
-signal.h
-========
-
-Macros
-======
-
-.. list-table::
- :widths: auto
- :align: center
- :header-rows: 1
-
- * - Macro
- - Implemented
- - C23 Standard Section
- - POSIX.1-2017 Standard Section
- * - SIGABRT
- - |check|
- - 7.14.3
- - https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html
- * - SIGALRM
- - |check|
- -
- - https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html
- * - SIGBUS
- - |check|
- -
- - https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html
- * - SIGCHLD
- - |check|
- -
- - https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html
- * - SIGCONT
- - |check|
- -
- - https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html
- * - SIGFPE
- - |check|
- - 7.14.3
- - https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html
- * - SIGHUP
- - |check|
- -
- - https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html
- * - SIGILL
- - |check|
- - 7.14.3
- - https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html
- * - SIGINT
- - |check|
- - 7.14.3
- - https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html
- * - SIGKILL
- - |check|
- -
- - https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html
- * - SIGPIPE
- - |check|
- -
- - https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html
- * - SIGPOLL
- - |check|
- -
- - https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html
- * - SIGPROF
- - |check|
- -
- - https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html
- * - SIGQUIT
- - |check|
- -
- - https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html
- * - SIGRTMAX
- - |check|
- -
- - https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html
- * - SIGRTMIN
- - |check|
- -
- - https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html
- * - SIGSEGV
- - |check|
- - 7.14.3
- - https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html
- * - SIGSTOP
- - |check|
- -
- - https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html
- * - SIGSYS
- - |check|
- -
- - https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html
- * - SIGTERM
- - |check|
- - 7.14.3
- - https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html
- * - SIGTRAP
- - |check|
- -
- - https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html
- * - SIGTSTP
- - |check|
- -
- - https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html
- * - SIGTTIN
- - |check|
- -
- - https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html
- * - SIGTTOU
- - |check|
- -
- - https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html
- * - SIGURG
- - |check|
- -
- - https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html
- * - SIGUSR1
- - |check|
- -
- - https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html
- * - SIGUSR2
- - |check|
- -
- - https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html
- * - SIGVTALRM
- - |check|
- -
- - https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html
- * - SIGXCPU
- - |check|
- -
- - https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html
- * - SIGXFSZ
- - |check|
- -
- - https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html
- * - SIG_DFL
- - |check|
- - 7.14.3
- - https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html
- * - SIG_ERR
- - |check|
- - 7.14.3
- - https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html
- * - SIG_HOLD
- -
- -
- - https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html
- * - SIG_IGN
- - |check|
- - 7.14.3
- - https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html
-
-Functions
-=========
-
-.. list-table::
- :widths: auto
- :align: center
- :header-rows: 1
-
- * - Function
- - Implemented
- - C23 Standard Section
- - POSIX.1-2017 Standard Section
- * - kill
- - |check|
- -
- - https://pubs.opengroup.org/onlinepubs/9699919799/functions/kill.html
- * - raise
- - |check|
- - 7.14.2.1
- - https://pubs.opengroup.org/onlinepubs/9699919799/functions/raise.html
- * - sigaction
- - |check|
- -
- - https://pubs.opengroup.org/onlinepubs/9699919799/functions/sigaction.html
- * - sigaddset
- - |check|
- -
- - https://pubs.opengroup.org/onlinepubs/9699919799/functions/sigaddset.html
- * - sigaltstack
- - |check|
- -
- - https://pubs.opengroup.org/onlinepubs/9699919799/functions/sigaltstack.html
- * - sigdelset
- - |check|
- -
- - https://pubs.opengroup.org/onlinepubs/9699919799/functions/sigdelset.html
- * - sigemptyset
- - |check|
- -
- - https://pubs.opengroup.org/onlinepubs/9699919799/functions/sigemptyset.html
- * - sigfillset
- - |check|
- -
- - https://pubs.opengroup.org/onlinepubs/9699919799/functions/sigfillset.html
- * - signal
- - |check|
- - 7.14.1.1
- - https://pubs.opengroup.org/onlinepubs/9699919799/functions/signal.html
- * - sigprocmask
- - |check|
- -
- - https://pubs.opengroup.org/onlinepubs/9699919799/functions/sigprocmask.html
diff --git a/libc/docs/stdio.rst b/libc/docs/stdio.rst
deleted file mode 100644
index d17821562c25..000000000000
--- a/libc/docs/stdio.rst
+++ /dev/null
@@ -1,93 +0,0 @@
-===============
-StdIO Functions
-===============
-
-.. include:: check.rst
-
----------------
-Source location
----------------
-
-- The main source for string functions is located at:
- ``libc/src/stdio`` with subdirectories for internal implementations.
-
----------------------
-Implementation Status
----------------------
-
-Formatted Input/Output Functions
-================================
-
-These functions take in format strings and arguments of various types and
-convert either to or from those arguments. These functions are the current focus
-(owner: michaelrj).
-
-============= =========
-Function Name Available
-============= =========
-\*printf Mostly
-\*scanf |check|
-============= =========
-
-``FILE`` Access
-===============
-
-These functions are used to interact with the ``FILE`` object type, which is an
-I/O stream, often used to represent a file on the host's hard drive. Currently
-the ``FILE`` object is only available on linux.
-
-============= =========
-Function Name Available
-============= =========
-fopen |check|
-freopen
-fclose |check|
-fflush |check|
-setbuf |check|
-setvbuf |check|
-ftell |check|
-fgetpos
-fseek |check|
-fsetpos
-rewind
-tmpfile
-clearerr |check|
-feof |check|
-ferror |check|
-flockfile |check|
-funlockfile |check|
-============= =========
-
-Operations on system files
-==========================
-
-These functions operate on files on the host's system, without using the
-``FILE`` object type. They only take the name of the file being operated on.
-
-============= =========
-Function_Name Available
-============= =========
-remove |check|
-rename |check|
-tmpnam
-============= =========
-
-Unformatted ``FILE`` Input/Output Functions
-===========================================
-
-The ``gets`` function was removed in C11 for having no bounds checking and
-therefor being impossible to use safely.
-
-============= =========
-Function Name Available
-============= =========
-(f)getc |check|
-fgets |check|
-getchar |check|
-fread |check|
-(f)putc |check|
-(f)puts |check|
-putchar |check|
-fwrite |check|
-ungetc |check|
-============= =========
diff --git a/libc/docs/strings.rst b/libc/docs/strings.rst
deleted file mode 100644
index 427644c407ae..000000000000
--- a/libc/docs/strings.rst
+++ /dev/null
@@ -1,166 +0,0 @@
-================
-String Functions
-================
-
-.. include:: check.rst
-
----------------
-Source location
----------------
-
-- The main source for string functions is located at:
- ``libc/src/string``.
-
-- The source for string conversion functions is located at:
- ``libc/src/stdlib`` and
- ``libc/src/__support``.
-
-- The tests are located at:
- ``libc/test/src/string``,
- ``libc/test/src/stdlib``, and
- ``libc/test/src/__support``
- respectively.
-
----------------------
-Implementation Status
----------------------
-
-Primary memory functions
-========================
-
-.. TODO(gchatelet): add details about the memory functions.
-
-
-============= =========
-Function Name Available
-============= =========
-bzero |check|
-bcmp |check|
-bcopy |check|
-memcpy |check|
-memset |check|
-memcmp |check|
-memmove |check|
-============= =========
-
-
-Other Raw Memory Functions
-==========================
-
-============= =========
-Function Name Available
-============= =========
-memchr |check|
-memrchr |check|
-memccpy |check|
-mempcpy |check|
-============= =========
-
-String Memory Functions
-=======================
-
-============= =========
-Function Name Available
-============= =========
-stpcpy |check|
-stpncpy |check|
-strcpy |check|
-strncpy |check|
-strcat |check|
-strncat |check|
-strdup |check|
-strndup |check|
-============= =========
-
-String Examination Functions
-============================
-
-============= =========
-Function Name Available
-============= =========
-strlen |check|
-strnlen |check|
-strcmp |check|
-strncmp |check|
-strchr |check|
-strrchr |check|
-strspn |check|
-strcspn |check|
-strpbrk |check|
-strstr |check|
-strtok |check|
-strtok_r |check|
-============= =========
-
-String Conversion Functions
-============================
-
-These functions are not in strings.h, but are still primarily string
-functions, and are therefore tracked along with the rest of the string
-functions.
-
-The String to float functions were implemented using the Eisel-Lemire algorithm
-(read more about the algorithm here: `The Eisel-Lemire ParseNumberF64 Algorithm
-<https://nigeltao.github.io/blog/2020/eisel-lemire.html>`_). This improved
-the performance of string to float and double, and allowed it to complete this
-comprehensive test 15% faster than glibc: `Parse Number FXX Test Data
-<https://github.com/nigeltao/parse-number-fxx-test-data>`_. The test was done
-with LLVM-libc built on 2022-04-14 and Debian GLibc version 2.33-6. The targets
-``libc_str_to_float_comparison_test`` and
-``libc_system_str_to_float_comparison_test`` were built and run on the test data
-10 times each, skipping the first run since it was an outlier.
-
-
-============= =========
-Function Name Available
-============= =========
-atof |check|
-atoi |check|
-atol |check|
-atoll |check|
-strtol |check|
-strtoll |check|
-strtoul |check|
-strtoull |check|
-strtof |check|
-strtod |check|
-strtold |check|
-strtoimax |check|
-strtoumax |check|
-============= =========
-
-String Error Functions
-======================
-
-============= =========
-Function Name Available
-============= =========
-strerror |check|
-strerror_r |check|
-============= =========
-
-Localized String Functions
-==========================
-
-These functions require locale.h, and will be finished when locale support is
-implemented in LLVM-libc.
-
-============= =========
-Function Name Available
-============= =========
-strcoll Partially
-strxfrm Partially
-============= =========
-
----------------------------
-\<name\>_s String Functions
----------------------------
-
-Many String functions have an equivalent _s version, which is intended to be
-more secure and safe than the previous standard. These functions add runtime
-error detection and overflow protection. While they can be seen as an
-improvement, adoption remains relatively low among users. In addition, they are
-being considered for removal, see
-`Field Experience With Annex K — Bounds Checking Interfaces
-<http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1967.htm>`_. For these reasons,
-there is no ongoing work to implement them.
diff --git a/libc/docs/talks.rst b/libc/docs/talks.rst
index 7e560964d6aa..67a5243341b1 100644
--- a/libc/docs/talks.rst
+++ b/libc/docs/talks.rst
@@ -2,16 +2,57 @@
Talks
=====
----
+2024
+----
+* A C/C++ Toolchain for your GPU - Joseph Huber
+
+ * `slides <https://llvm.org/devmtg/2024-10/slides/techtalk/Huber-A-CPlusPlus-Toolchain-for-Your-GPU.pdf>`__
+ * `videos <https://www.youtube.com/watch?v=4TxGWis1mws>`__
+ * `phoronix <https://www.phoronix.com/news/AMD-Standard-C-Code-GPUs>`__
+
+* Modern Embedded Development with LLVM - Petr Hosek
+
+ * `slides <https://llvm.org/devmtg/2024-10/slides/techtalk/Hosek-ModernEmbeddedDevelopment-with-LLVM.pdf>`__
+ * `videos <https://www.youtube.com/watch?v=5hHQi-Uj34I>`__
+
+* Using llvm-libc in LLVM Embedded Toolchain for Arm - Peter Smith
+
+ * `slides <https://llvm.org/devmtg/2024-10/slides/lightning/Smith-Using-llvm-libc.pdf>`__
+ * `videos <https://www.youtube.com/watch?v=ctgkbaYwT_I>`__
+
+* RISC-V Support into LLVM libc - Challenges and Solutions for 32-bit and 64-bit - Mikhail R. Gadelha
+
+ * `slides <https://llvm.org/devmtg/2024-10/slides/quicktalks/Gadelha-RISC-V-SupportIntoLLVM-libc.pdf>`__
+ * `videos <https://www.youtube.com/watch?v=GytmaH64wFo>`__
+
+* Project Hand-in-Hand - The beginning of a beautiful friendship - Michael Jones & Christopher Di Bella
+
+ * `slides <https://llvm.org/devmtg/2024-10/slides/techtalk/Jones-DiBella-hand-in-hand.pdf>`__
+ * `videos <https://www.youtube.com/watch?v=VAEO86YtTHA>`__
+
+* LLVM libc math library - Current status and future directions - Tue Ly
+
+ * `slides <https://llvm.org/devmtg/2024-10/slides/techtalk/Ly-LLVM-libc-math-library-CurrentStatus.pdf>`__
+ * `videos <https://www.youtube.com/watch?v=-8zb8rHbvcQ>`__
+
+* Half-precision in LLVM libc - Nicolas Celik
+
+ * `slides <https://llvm.org/devmtg/2024-10/slides/studenttalks/Celik-Half-precision-in-LLVM-libc.pdf>`__
+ * `videos <https://www.youtube.com/watch?v=H6aOFSVwSSM>`__
+
+----
2023
----
* Math functions in LLVM libc or yet another correctly rounded libm - Tue Ly
* `slides <https://drive.google.com/file/d/1Gchrc3AXKXAWFI1nk8Y1x8UsoQSp8XjF/view>`__
* `video <https://www.youtube.com/watch?v=kBSJqVWNQLY>`__
+
* The LLVM C Library for GPUs - Joseph Huber
* `slides <https://llvm.org/devmtg/2023-10/slides/techtalks/Huber-LibCforGPUs.pdf>`__
* `video <https://www.youtube.com/watch?v=_LLGc48GYHc>`__
+
* The Challenges of Implementing the C Standard Library in C++ - Sivachandra Reddy
* `slides <https://github.com/boostcon/cppnow_presentations_2023/blob/main/cppnow_slides/The_Challenges_of_Implementing_the_C_Standard_Library_in_Cpp.pdf>`__
@@ -24,10 +65,12 @@ Talks
* `slides <https://llvm.org/devmtg/2022-11/slides/Tutorial1-UsingLLVM-libc.pdf>`__
* `video <https://www.youtube.com/watch?v=OpY4lnpnbq4>`__
+
* Using modern CPU instructions to improve LLVM's libc math library - Tue Ly
* `slides <https://llvm.org/devmtg/2022-11/slides/QuickTalk7-UsingModernCPUInstructionsToImproveLLVM-libcMathLib>`__
* `video <https://www.youtube.com/watch?v=9bvdbdn0nMA>`__
+
* Approximating at Scale: How strto float in LLVM’s libc is faster - Michael Jones
* `slides <https://llvm.org/devmtg/2022-11/slides/QuickTalk3-ApproximatingatScale-StringToFloat.pdf>`__
diff --git a/libc/docs/threads.rst b/libc/docs/threads.rst
deleted file mode 100644
index db0edacf7b46..000000000000
--- a/libc/docs/threads.rst
+++ /dev/null
@@ -1,139 +0,0 @@
-.. include:: check.rst
-
-=========
-threads.h
-=========
-
-Macros
-======
-
-.. list-table::
- :widths: auto
- :align: center
- :header-rows: 1
-
- * - Macro
- - Implemented
- - C23 Standard Section
- - POSIX.1-2017 Standard Section
- * - ONCE_FLAG_INIT
- -
- - 7.28.1.3
- -
- * - TSS_DTOR_ITERATIONS
- -
- - 7.28.1.3
- -
-
-Functions
-=========
-
-.. list-table::
- :widths: auto
- :align: center
- :header-rows: 1
-
- * - Function
- - Implemented
- - C23 Standard Section
- - POSIX.1-2017 Standard Section
- * - call_once
- - |check|
- - 7.28.2.1
- -
- * - cnd_broadcast
- - |check|
- - 7.28.3.1
- -
- * - cnd_destroy
- - |check|
- - 7.28.3.2
- -
- * - cnd_init
- - |check|
- - 7.28.3.3
- -
- * - cnd_signal
- - |check|
- - 7.28.3.4
- -
- * - cnd_timedwait
- -
- - 7.28.3.5
- -
- * - cnd_wait
- - |check|
- - 7.28.3.6
- -
- * - mtx_destroy
- - |check|
- - 7.28.4.1
- -
- * - mtx_init
- - |check|
- - 7.28.4.2
- -
- * - mtx_lock
- - |check|
- - 7.28.4.3
- -
- * - mtx_timedlock
- -
- - 7.28.4.4
- -
- * - mtx_trylock
- -
- - 7.28.4.5
- -
- * - mtx_unlock
- - |check|
- - 7.28.4.6
- -
- * - thrd_create
- - |check|
- - 7.28.5.1
- -
- * - thrd_current
- - |check|
- - 7.28.5.2
- -
- * - thrd_detach
- - |check|
- - 7.28.5.3
- -
- * - thrd_equal
- - |check|
- - 7.28.5.4
- -
- * - thrd_exit
- - |check|
- - 7.28.5.5
- -
- * - thrd_join
- - |check|
- - 7.28.5.6
- -
- * - thrd_sleep
- -
- - 7.28.5.7
- -
- * - thrd_yield
- -
- - 7.28.5.8
- -
- * - tss_create
- - |check|
- - 7.28.6.1
- -
- * - tss_delete
- - |check|
- - 7.28.6.2
- -
- * - tss_get
- - |check|
- - 7.28.6.3
- -
- * - tss_set
- - |check|
- - 7.28.6.4
- -
diff --git a/libc/fuzzing/__support/CMakeLists.txt b/libc/fuzzing/__support/CMakeLists.txt
index 9d6589d78fb8..d4b324db716f 100644
--- a/libc/fuzzing/__support/CMakeLists.txt
+++ b/libc/fuzzing/__support/CMakeLists.txt
@@ -24,10 +24,23 @@ add_libc_fuzzer(
-D__LIBC_EXPLICIT_SIMD_OPT
)
-add_libc_fuzzer(
- freelist_heap_fuzz
- SRCS
- freelist_heap_fuzz.cpp
- DEPENDS
- libc.src.__support.freelist_heap
-)
+# TODO: FreeListHeap uses the _end symbol which conflicts with the _end symbol
+# defined by GPU start.cpp files so for now we exclude this fuzzer on GPU.
+if(LLVM_LIBC_FULL_BUILD AND NOT LIBC_TARGET_OS_IS_GPU)
+ add_libc_fuzzer(
+ freelist_heap_fuzz
+ SRCS
+ fake_heap.s
+ freelist_heap_fuzz.cpp
+ DEPENDS
+ libc.src.__support.freelist_heap
+ )
+ # TODO(#119995): Remove this once sccache on Windows no longer requires
+ # the use of -DCMAKE_MSVC_DEBUG_INFORMATION_FORMAT=Embedded.
+ get_fq_target_name(freelist_heap_fuzz freelist_heap_fuzz_target_name)
+ set_target_properties(
+ ${freelist_heap_fuzz_target_name}
+ PROPERTIES
+ MSVC_DEBUG_INFORMATION_FORMAT ""
+ )
+endif()
diff --git a/libc/fuzzing/__support/fake_heap.s b/libc/fuzzing/__support/fake_heap.s
new file mode 100644
index 000000000000..69522f53c8b1
--- /dev/null
+++ b/libc/fuzzing/__support/fake_heap.s
@@ -0,0 +1,15 @@
+//===-- Test fake definition for heap symbols -----------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+.globl _end, __llvm_libc_heap_limit
+
+.bss
+_end:
+.fill 1024
+__llvm_libc_heap_limit:
+
diff --git a/libc/fuzzing/string/CMakeLists.txt b/libc/fuzzing/string/CMakeLists.txt
index 9dd4fceee3b5..efda80b59c95 100644
--- a/libc/fuzzing/string/CMakeLists.txt
+++ b/libc/fuzzing/string/CMakeLists.txt
@@ -38,5 +38,5 @@ add_libc_fuzzer(
SRCS
bcmp_fuzz.cpp
DEPENDS
- libc.src.string.bcmp
+ libc.src.strings.bcmp
)
diff --git a/libc/fuzzing/string/bcmp_fuzz.cpp b/libc/fuzzing/string/bcmp_fuzz.cpp
index 65949dfdf0c5..710d115b0ae8 100644
--- a/libc/fuzzing/string/bcmp_fuzz.cpp
+++ b/libc/fuzzing/string/bcmp_fuzz.cpp
@@ -9,7 +9,7 @@
/// Fuzzing test for llvm-libc bcmp implementation.
///
//===----------------------------------------------------------------------===//
-#include "src/string/bcmp.h"
+#include "src/strings/bcmp.h"
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
diff --git a/libc/hdr/CMakeLists.txt b/libc/hdr/CMakeLists.txt
index 93da271f5e04..7f523c50e869 100644
--- a/libc/hdr/CMakeLists.txt
+++ b/libc/hdr/CMakeLists.txt
@@ -126,19 +126,30 @@ add_proxy_header_library(
libc.include.llvm-libc-macros.sys_stat_macros
)
+add_header_library(unistd_overlay HDRS unistd_overlay.h)
add_proxy_header_library(
unistd_macros
HDRS
unistd_macros.h
+ DEPENDS
+ .unistd_overlay
FULL_BUILD_DEPENDS
libc.include.unistd
libc.include.llvm-libc-macros.unistd_macros
)
+if (WIN32)
+ set(windows_addtional_time_macros libc.include.llvm-libc-macros.windows.time_macros_ext)
+else()
+ set(windows_addtional_time_macros "")
+endif()
+
add_proxy_header_library(
time_macros
HDRS
time_macros.h
+ DEPENDS
+ ${windows_addtional_time_macros}
FULL_BUILD_DEPENDS
libc.include.time
libc.include.llvm-libc-macros.time_macros
diff --git a/libc/hdr/fcntl_overlay.h b/libc/hdr/fcntl_overlay.h
index c1cc98b0ebb2..17ae78b3d0ec 100644
--- a/libc/hdr/fcntl_overlay.h
+++ b/libc/hdr/fcntl_overlay.h
@@ -20,6 +20,11 @@
// `__USE_FORTIFY_LEVEL`, which will be temporarily disabled
// with `_FORTIFY_SOURCE`.
+#ifdef _FORTIFY_SOURCE
+#define LIBC_OLD_FORTIFY_SOURCE _FORTIFY_SOURCE
+#undef _FORTIFY_SOURCE
+#endif
+
#ifdef __USE_FORTIFY_LEVEL
#define LIBC_OLD_USE_FORTIFY_LEVEL __USE_FORTIFY_LEVEL
#undef __USE_FORTIFY_LEVEL
@@ -28,6 +33,11 @@
#include <fcntl.h>
+#ifdef LIBC_OLD_FORTIFY_SOURCE
+#define _FORTIFY_SOURCE LIBC_OLD_FORTIFY_SOURCE
+#undef LIBC_OLD_FORTIFY_SOURCE
+#endif
+
#ifdef LIBC_OLD_USE_FORTIFY_LEVEL
#undef __USE_FORTIFY_LEVEL
#define __USE_FORTIFY_LEVEL LIBC_OLD_USE_FORTIFY_LEVEL
diff --git a/libc/hdr/func/free.h b/libc/hdr/func/free.h
index b1190a777da3..316556b21e3b 100644
--- a/libc/hdr/func/free.h
+++ b/libc/hdr/func/free.h
@@ -10,7 +10,8 @@
#define LLVM_LIBC_HDR_FUNC_FREE_H
#ifdef LIBC_FULL_BUILD
-extern "C" void free(void *);
+
+extern "C" void free(void *) noexcept;
#else // Overlay mode
diff --git a/libc/hdr/func/malloc.h b/libc/hdr/func/malloc.h
index b395f41f2bce..8281021f7996 100644
--- a/libc/hdr/func/malloc.h
+++ b/libc/hdr/func/malloc.h
@@ -10,8 +10,10 @@
#define LLVM_LIBC_HDR_FUNC_MALLOC_H
#ifdef LIBC_FULL_BUILD
+
#include "hdr/types/size_t.h"
-extern "C" void *malloc(size_t);
+
+extern "C" void *malloc(size_t) noexcept;
#else // Overlay mode
diff --git a/libc/hdr/func/realloc.h b/libc/hdr/func/realloc.h
index 0096045e8330..ecb29541fe34 100644
--- a/libc/hdr/func/realloc.h
+++ b/libc/hdr/func/realloc.h
@@ -10,8 +10,10 @@
#define LLVM_LIBC_HDR_FUNC_REALLOC_H
#ifdef LIBC_FULL_BUILD
+
#include "hdr/types/size_t.h"
-extern "C" void *realloc(void *ptr, size_t new_size);
+
+extern "C" void *realloc(void *ptr, size_t new_size) noexcept;
#else // Overlay mode
diff --git a/libc/hdr/time_macros.h b/libc/hdr/time_macros.h
index dc36fe66f7a8..4488a24848c3 100644
--- a/libc/hdr/time_macros.h
+++ b/libc/hdr/time_macros.h
@@ -19,4 +19,10 @@
#endif // LLVM_LIBC_FULL_BUILD
+// TODO: For now, on windows, let's always include the extension header.
+// We will need to decide how to export this header.
+#ifdef _WIN32
+#include "include/llvm-libc-macros/windows/time-macros-ext.h"
+#endif // _WIN32
+
#endif // LLVM_LIBC_HDR_TIME_MACROS_H
diff --git a/libc/hdr/types/CMakeLists.txt b/libc/hdr/types/CMakeLists.txt
index c4d14e6f8931..5156b58ee11a 100644
--- a/libc/hdr/types/CMakeLists.txt
+++ b/libc/hdr/types/CMakeLists.txt
@@ -51,6 +51,8 @@ add_proxy_header_library(
struct_flock
HDRS
struct_flock.h
+ DEPENDS
+ libc.hdr.fcntl_overlay
FULL_BUILD_DEPENDS
libc.include.llvm-libc-types.struct_flock
)
@@ -59,6 +61,8 @@ add_proxy_header_library(
struct_flock64
HDRS
struct_flock64.h
+ DEPENDS
+ libc.hdr.fcntl_overlay
FULL_BUILD_DEPENDS
libc.include.llvm-libc-types.struct_flock64
)
@@ -67,6 +71,8 @@ add_proxy_header_library(
struct_f_owner_ex
HDRS
struct_f_owner_ex.h
+ DEPENDS
+ libc.hdr.fcntl_overlay
FULL_BUILD_DEPENDS
libc.include.llvm-libc-types.struct_f_owner_ex
)
@@ -88,6 +94,14 @@ add_proxy_header_library(
)
add_proxy_header_library(
+ ssize_t
+ HDRS
+ ssize_t.h
+ FULL_BUILD_DEPENDS
+ libc.include.llvm-libc-types.ssize_t
+)
+
+add_proxy_header_library(
mode_t
HDRS
mode_t.h
@@ -131,7 +145,6 @@ add_proxy_header_library(
clockid_t.h
FULL_BUILD_DEPENDS
libc.include.llvm-libc-types.clockid_t
- libc.include.sys_types
)
add_proxy_header_library(
@@ -167,7 +180,6 @@ add_proxy_header_library(
pid_t.h
FULL_BUILD_DEPENDS
libc.include.llvm-libc-types.pid_t
- libc.include.sys_types
)
add_proxy_header_library(
@@ -305,3 +317,11 @@ add_proxy_header_library(
libc.include.llvm-libc-types.wint_t
libc.include.wchar
)
+
+add_proxy_header_library(
+ uid_t
+ HDRS
+ uid_t.h
+ FULL_BUILD_DEPENDS
+ libc.include.llvm-libc-types.uid_t
+)
diff --git a/libc/hdr/types/clockid_t.h b/libc/hdr/types/clockid_t.h
index 333342072a2f..729e580aba43 100644
--- a/libc/hdr/types/clockid_t.h
+++ b/libc/hdr/types/clockid_t.h
@@ -9,7 +9,8 @@
#ifndef LLVM_LIBC_HDR_TYPES_CLOCKID_T_H
#define LLVM_LIBC_HDR_TYPES_CLOCKID_T_H
-#ifdef LIBC_FULL_BUILD
+// TODO: we will need to decide how to export extension to windows.
+#if defined(LIBC_FULL_BUILD) || defined(_WIN32)
#include "include/llvm-libc-types/clockid_t.h"
diff --git a/libc/hdr/types/ssize_t.h b/libc/hdr/types/ssize_t.h
index 4d2000780ee1..7eff98f33c2b 100644
--- a/libc/hdr/types/ssize_t.h
+++ b/libc/hdr/types/ssize_t.h
@@ -14,9 +14,7 @@
#else
-#define __need_ssize_t
-#include <stddef.h>
-#undef __need_ssize_t
+#include <sys/types.h>
#endif // LIBC_FULL_BUILD
diff --git a/libc/hdr/types/struct_f_owner_ex.h b/libc/hdr/types/struct_f_owner_ex.h
index 49985115ae4b..6e37cea6df84 100644
--- a/libc/hdr/types/struct_f_owner_ex.h
+++ b/libc/hdr/types/struct_f_owner_ex.h
@@ -14,7 +14,7 @@
#else
-#include <fcntl.h>
+#include "hdr/fcntl_overlay.h"
#endif // LIBC_FULL_BUILD
diff --git a/libc/hdr/types/struct_flock.h b/libc/hdr/types/struct_flock.h
index a552b91c432b..6a6c928e6fa6 100644
--- a/libc/hdr/types/struct_flock.h
+++ b/libc/hdr/types/struct_flock.h
@@ -14,7 +14,7 @@
#else
-#include <fcntl.h>
+#include "hdr/fcntl_overlay.h"
#endif // LIBC_FULL_BUILD
diff --git a/libc/hdr/types/struct_flock64.h b/libc/hdr/types/struct_flock64.h
index 84fe67816c33..fcfda59479a2 100644
--- a/libc/hdr/types/struct_flock64.h
+++ b/libc/hdr/types/struct_flock64.h
@@ -14,7 +14,7 @@
#else
-#include <fcntl.h>
+#include "hdr/fcntl_overlay.h"
#endif // LIBC_FULL_BUILD
diff --git a/libc/hdr/types/uid_t.h b/libc/hdr/types/uid_t.h
new file mode 100644
index 000000000000..a1eefb03228c
--- /dev/null
+++ b/libc/hdr/types/uid_t.h
@@ -0,0 +1,22 @@
+//===-- Proxy for uid_t ---------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_HDR_TYPES_UID_T_H
+#define LLVM_LIBC_HDR_TYPES_UID_T_H
+
+#ifdef LIBC_FULL_BUILD
+
+#include "include/llvm-libc-types/uid_t.h"
+
+#else // Overlay mode
+
+#include <sys/types.h>
+
+#endif // LLVM_LIBC_FULL_BUILD
+
+#endif // LLVM_LIBC_HDR_TYPES_UID_T_H
diff --git a/libc/hdr/unistd_macros.h b/libc/hdr/unistd_macros.h
index 132e12328013..5c2b24354dd3 100644
--- a/libc/hdr/unistd_macros.h
+++ b/libc/hdr/unistd_macros.h
@@ -15,7 +15,7 @@
#else // Overlay mode
-#include <unistd.h>
+#include "unistd_overlay.h"
#endif // LLVM_LIBC_FULL_BUILD
diff --git a/libc/hdr/unistd_overlay.h b/libc/hdr/unistd_overlay.h
new file mode 100644
index 000000000000..e3001e0cda08
--- /dev/null
+++ b/libc/hdr/unistd_overlay.h
@@ -0,0 +1,69 @@
+//===-- Including unistd.h in overlay mode -------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_HDR_UNISTD_OVERLAY_H
+#define LLVM_LIBC_HDR_UNISTD_OVERLAY_H
+
+#ifdef LIBC_FULL_BUILD
+#error "This header should only be included in overlay mode"
+#endif
+
+// Overlay mode
+
+// glibc <unistd.h> header might provide extern inline definitions for few
+// functions, causing external alias errors. They are guarded by
+// `__USE_EXTERN_INLINES` macro. We temporarily disable `__USE_EXTERN_INLINES`
+// macro by defining `__NO_INLINE__` before including <stdio.h>.
+// And the same with `__USE_FORTIFY_LEVEL`, which will be temporarily disabled
+// with `_FORTIFY_SOURCE`.
+
+#ifdef _FORTIFY_SOURCE
+#define LIBC_OLD_FORTIFY_SOURCE _FORTIFY_SOURCE
+#undef _FORTIFY_SOURCE
+#endif
+
+#ifdef __USE_EXTERN_INLINES
+#define LIBC_OLD_USE_EXTERN_INLINES
+#undef __USE_EXTERN_INLINES
+#endif
+
+#ifdef __USE_FORTIFY_LEVEL
+#define LIBC_OLD_USE_FORTIFY_LEVEL __USE_FORTIFY_LEVEL
+#undef __USE_FORTIFY_LEVEL
+#define __USE_FORTIFY_LEVEL 0
+#endif
+
+#ifndef __NO_INLINE__
+#define __NO_INLINE__ 1
+#define LIBC_SET_NO_INLINE
+#endif
+
+#include <unistd.h>
+
+#ifdef LIBC_OLD_FORTIFY_SOURCE
+#define _FORTIFY_SOURCE LIBC_OLD_FORTIFY_SOURCE
+#undef LIBC_OLD_FORTIFY_SOURCE
+#endif
+
+#ifdef LIBC_SET_NO_INLINE
+#undef __NO_INLINE__
+#undef LIBC_SET_NO_INLINE
+#endif
+
+#ifdef LIBC_OLD_USE_FORTIFY_LEVEL
+#undef __USE_FORTIFY_LEVEL
+#define __USE_FORTIFY_LEVEL LIBC_OLD_USE_FORTIFY_LEVEL
+#undef LIBC_OLD_USE_FORTIFY_LEVEL
+#endif
+
+#ifdef LIBC_OLD_USE_EXTERN_INLINES
+#define __USE_EXTERN_INLINES
+#undef LIBC_OLD_USE_EXTERN_INLINES
+#endif
+
+#endif // LLVM_LIBC_HDR_UNISTD_OVERLAY_H
diff --git a/libc/hdrgen/yaml/gpu/rpc.yaml b/libc/hdrgen/yaml/gpu/rpc.yaml
deleted file mode 100644
index da4f6afb7856..000000000000
--- a/libc/hdrgen/yaml/gpu/rpc.yaml
+++ /dev/null
@@ -1,23 +0,0 @@
-header: gpu-rpc.h
-macros: []
-types: []
-enums: []
-objects: []
-functions:
- - name: rpc_fprintf
- standards:
- - GPUExtensions
- return_type: int
- arguments:
- - type: ::FILE *__restrict
- - type: const char *__restrict
- - type: void *
- - type: size_t
- - name: rpc_host_call
- standards:
- - GPUExtensions
- return_type: unsigned long long
- arguments:
- - type: void *
- - type: void *
- - type: size_t
diff --git a/libc/include/CMakeLists.txt b/libc/include/CMakeLists.txt
index 6fdaa6c03c0c..eb407183c99f 100644
--- a/libc/include/CMakeLists.txt
+++ b/libc/include/CMakeLists.txt
@@ -32,7 +32,7 @@ endmacro()
add_header_macro(
ctype
- ../libc/hdrgen/yaml/ctype.yaml
+ ../libc/include/ctype.yaml
ctype.h.def
ctype.h
DEPENDS
@@ -42,7 +42,7 @@ add_header_macro(
add_header_macro(
dirent
- ../libc/hdrgen/yaml/dirent.yaml
+ ../libc/include/dirent.yaml
dirent.h.def
dirent.h
DEPENDS
@@ -54,7 +54,7 @@ add_header_macro(
add_header_macro(
fcntl
- ../libc/hdrgen/yaml/fcntl.yaml
+ ../libc/include/fcntl.yaml
fcntl.h.def
fcntl.h
DEPENDS
@@ -70,7 +70,7 @@ add_header_macro(
add_header_macro(
dlfcn
- ../libc/hdrgen/yaml/dlfcn.yaml
+ ../libc/include/dlfcn.yaml
dlfcn.h.def
dlfcn.h
DEPENDS
@@ -80,7 +80,7 @@ add_header_macro(
add_header_macro(
features
- ../libc/hdrgen/yaml/features.yaml
+ ../libc/include/features.yaml
features.h.def
features.h
DEPENDS
@@ -90,7 +90,7 @@ add_header_macro(
add_header_macro(
fenv
- ../libc/hdrgen/yaml/fenv.yaml
+ ../libc/include/fenv.yaml
fenv.h.def
fenv.h
DEPENDS
@@ -102,7 +102,7 @@ add_header_macro(
add_header_macro(
inttypes
- ../libc/hdrgen/yaml/inttypes.yaml
+ ../libc/include/inttypes.yaml
inttypes.h.def
inttypes.h
DEPENDS
@@ -113,7 +113,7 @@ add_header_macro(
add_header_macro(
float
- ../libc/hdrgen/yaml/float.yaml
+ ../libc/include/float.yaml
float.h.def
float.h
DEPENDS
@@ -122,7 +122,7 @@ add_header_macro(
add_header_macro(
stdint
- ../libc/hdrgen/yaml/stdint.yaml
+ ../libc/include/stdint.yaml
stdint.h.def
stdint.h
DEPENDS
@@ -131,7 +131,7 @@ add_header_macro(
add_header_macro(
limits
- ../libc/hdrgen/yaml/limits.yaml
+ ../libc/include/limits.yaml
limits.h.def
limits.h
DEPENDS
@@ -140,7 +140,7 @@ add_header_macro(
add_header_macro(
malloc
- ../libc/hdrgen/yaml/malloc.yaml
+ ../libc/include/malloc.yaml
malloc.h.def
malloc.h
DEPENDS
@@ -150,7 +150,7 @@ add_header_macro(
add_header_macro(
math
- ../libc/hdrgen/yaml/math.yaml
+ ../libc/include/math.yaml
math.h.def
math.h
DEPENDS
@@ -165,7 +165,7 @@ add_header_macro(
add_header_macro(
stdfix
- ../libc/hdrgen/yaml/stdfix.yaml
+ ../libc/include/stdfix.yaml
stdfix.h.def
stdfix.h
DEPENDS
@@ -178,7 +178,7 @@ file(MAKE_DIRECTORY ${LIBC_INCLUDE_DIR}/arpa)
add_header_macro(
arpa_inet
- ../libc/hdrgen/yaml/arpa/inet.yaml
+ ../libc/include/arpa/inet.yaml
arpa/inet.h.def
arpa/inet.h
DEPENDS
@@ -187,7 +187,7 @@ add_header_macro(
add_header_macro(
assert
- ../libc/hdrgen/yaml/assert.yaml
+ ../libc/include/assert.yaml
assert.h.def
assert.h
DEPENDS
@@ -197,7 +197,7 @@ add_header_macro(
add_header_macro(
complex
- ../libc/hdrgen/yaml/complex.yaml
+ ../libc/include/complex.yaml
complex.h.def
complex.h
DEPENDS
@@ -207,7 +207,7 @@ add_header_macro(
add_header_macro(
setjmp
- ../libc/hdrgen/yaml/setjmp.yaml
+ ../libc/include/setjmp.yaml
setjmp.h.def
setjmp.h
DEPENDS
@@ -217,7 +217,7 @@ add_header_macro(
add_header_macro(
string
- ../libc/hdrgen/yaml/string.yaml
+ ../libc/include/string.yaml
string.h.def
string.h
DEPENDS
@@ -228,7 +228,7 @@ add_header_macro(
add_header_macro(
strings
- ../libc/hdrgen/yaml/strings.yaml
+ ../libc/include/strings.yaml
strings.h.def
strings.h
DEPENDS
@@ -238,7 +238,7 @@ add_header_macro(
add_header_macro(
search
- ../libc/hdrgen/yaml/search.yaml
+ ../libc/include/search.yaml
search.h.def
search.h
DEPENDS
@@ -252,7 +252,7 @@ add_header_macro(
add_header_macro(
time
- ../libc/hdrgen/yaml/time.yaml
+ ../libc/include/time.yaml
time.h.def
time.h
DEPENDS
@@ -268,7 +268,7 @@ add_header_macro(
add_header_macro(
threads
- ../libc/hdrgen/yaml/threads.yaml
+ ../libc/include/threads.yaml
threads.h.def
threads.h
DEPENDS
@@ -285,7 +285,7 @@ add_header_macro(
add_header_macro(
errno
- ../libc/hdrgen/yaml/errno.yaml
+ ../libc/include/errno.yaml
errno.h.def
errno.h
DEPENDS
@@ -295,7 +295,7 @@ add_header_macro(
add_header_macro(
signal
- ../libc/hdrgen/yaml/signal.yaml
+ ../libc/include/signal.yaml
signal.h.def
signal.h
DEPENDS
@@ -311,7 +311,7 @@ add_header_macro(
add_header_macro(
stdbit
- ../libc/hdrgen/yaml/stdbit.yaml
+ ../libc/include/stdbit.yaml
stdbit.h.def
stdbit.h
DEPENDS
@@ -321,7 +321,7 @@ add_header_macro(
add_header_macro(
stdckdint
- ../libc/hdrgen/yaml/stdckdint.yaml
+ ../libc/include/stdckdint.yaml
stdckdint.h.def
stdckdint.h
DEPENDS
@@ -331,7 +331,7 @@ add_header_macro(
add_header_macro(
stdio
- ../libc/hdrgen/yaml/stdio.yaml
+ ../libc/include/stdio.yaml
stdio.h.def
stdio.h
DEPENDS
@@ -347,7 +347,7 @@ add_header_macro(
add_header_macro(
stdlib
- ../libc/hdrgen/yaml/stdlib.yaml
+ ../libc/include/stdlib.yaml
stdlib.h.def
stdlib.h
DEPENDS
@@ -366,7 +366,7 @@ add_header_macro(
add_header_macro(
unistd
- ../libc/hdrgen/yaml/unistd.yaml
+ ../libc/include/unistd.yaml
unistd.h.def
unistd.h
DEPENDS
@@ -385,11 +385,11 @@ add_header_macro(
add_header_macro(
pthread
- ../libc/hdrgen/yaml/pthread.yaml
+ ../libc/include/pthread.yaml
pthread.h.def
pthread.h
DEPENDS
- .llvm_libc_common_h
+ .llvm-libc-macros.pthread_macros
.llvm-libc-types.__atfork_callback_t
.llvm-libc-types.__pthread_once_func_t
.llvm-libc-types.__pthread_start_t
@@ -404,11 +404,12 @@ add_header_macro(
.llvm-libc-types.pthread_rwlockattr_t
.llvm-libc-types.pthread_spinlock_t
.llvm-libc-types.pthread_t
+ .llvm_libc_common_h
)
add_header_macro(
sched
- ../libc/hdrgen/yaml/sched.yaml
+ ../libc/include/sched.yaml
sched.h.def
sched.h
DEPENDS
@@ -425,7 +426,7 @@ add_header_macro(
add_header_macro(
spawn
- ../libc/hdrgen/yaml/spawn.yaml
+ ../libc/include/spawn.yaml
spawn.h.def
spawn.h
DEPENDS
@@ -438,7 +439,7 @@ add_header_macro(
add_header_macro(
link
- ../libc/hdrgen/yaml/link.yaml
+ ../libc/include/link.yaml
link.h.def
link.h
DEPENDS
@@ -448,7 +449,7 @@ add_header_macro(
add_header_macro(
elf
- ../libc/hdrgen/yaml/elf.yaml
+ ../libc/include/elf.yaml
elf.h.def
elf.h
DEPENDS
@@ -462,7 +463,7 @@ file(MAKE_DIRECTORY ${LIBC_INCLUDE_DIR}/sys)
add_header_macro(
sys_auxv
- ../libc/hdrgen/yaml/sys/auxv.yaml
+ ../libc/include/sys/auxv.yaml
sys/auxv.h.def
sys/auxv.h
DEPENDS
@@ -472,7 +473,7 @@ add_header_macro(
add_header_macro(
sys_epoll
- ../libc/hdrgen/yaml/sys/epoll.yaml
+ ../libc/include/sys/epoll.yaml
sys/epoll.h.def
sys/epoll.h
DEPENDS
@@ -485,7 +486,7 @@ add_header_macro(
add_header_macro(
sys_ioctl
- ../libc/hdrgen/yaml/sys/ioctl.yaml
+ ../libc/include/sys/ioctl.yaml
sys/ioctl.h.def
sys/ioctl.h
DEPENDS
@@ -495,7 +496,7 @@ add_header_macro(
add_header_macro(
sys_mman
- ../libc/hdrgen/yaml/sys/mman.yaml
+ ../libc/include/sys/mman.yaml
sys/mman.h.def
sys/mman.h
DEPENDS
@@ -508,7 +509,7 @@ add_header_macro(
add_header_macro(
sys_prctl
- ../libc/hdrgen/yaml/sys/prctl.yaml
+ ../libc/include/sys/prctl.yaml
sys/prctl.h.def
sys/prctl.h
DEPENDS
@@ -525,7 +526,7 @@ add_header(
add_header_macro(
sys_random
- ../libc/hdrgen/yaml/sys/random.yaml
+ ../libc/include/sys/random.yaml
sys/random.h.def
sys/random.h
DEPENDS
@@ -537,7 +538,7 @@ add_header_macro(
add_header_macro(
sys_resource
- ../libc/hdrgen/yaml/sys/resource.yaml
+ ../libc/include/sys/resource.yaml
sys/resource.h.def
sys/resource.h
DEPENDS
@@ -549,7 +550,7 @@ add_header_macro(
add_header_macro(
sys_stat
- ../libc/hdrgen/yaml/sys/stat.yaml
+ ../libc/include/sys/stat.yaml
sys/stat.h.def
sys/stat.h
DEPENDS
@@ -571,7 +572,7 @@ add_header_macro(
add_header_macro(
sys_select
- ../libc/hdrgen/yaml/sys/select.yaml
+ ../libc/include/sys/select.yaml
sys/select.h.def
sys/select.h
DEPENDS
@@ -587,7 +588,7 @@ add_header_macro(
add_header_macro(
sys_sendfile
- ../libc/hdrgen/yaml/sys/sendfile.yaml
+ ../libc/include/sys/sendfile.yaml
sys/sendfile.h.def
sys/sendfile.h
DEPENDS
@@ -599,7 +600,7 @@ add_header_macro(
add_header_macro(
sys_socket
- ../libc/hdrgen/yaml/sys/socket.yaml
+ ../libc/include/sys/socket.yaml
sys/socket.h.def
sys/socket.h
DEPENDS
@@ -615,7 +616,7 @@ add_header_macro(
add_header_macro(
sys_statvfs
- ../libc/hdrgen/yaml/sys/statvfs.yaml
+ ../libc/include/sys/statvfs.yaml
sys/statvfs.h.def
sys/statvfs.h
DEPENDS
@@ -625,7 +626,7 @@ add_header_macro(
add_header_macro(
sys_syscall
- ../libc/hdrgen/yaml/sys/syscall.yaml
+ ../libc/include/sys/syscall.yaml
sys/syscall.h.def
sys/syscall.h
DEPENDS
@@ -633,7 +634,7 @@ add_header_macro(
add_header_macro(
sys_time
- ../libc/hdrgen/yaml/sys/time.yaml
+ ../libc/include/sys/time.yaml
sys/time.h.def
sys/time.h
DEPENDS
@@ -644,7 +645,7 @@ add_header_macro(
add_header_macro(
sys_types
- ../libc/hdrgen/yaml/sys/types.yaml
+ ../libc/include/sys/types.yaml
sys/types.h.def
sys/types.h
DEPENDS
@@ -674,7 +675,7 @@ add_header_macro(
add_header_macro(
sys_utsname
- ../libc/hdrgen/yaml/sys/utsname.yaml
+ ../libc/include/sys/utsname.yaml
sys/utsname.h.def
sys/utsname.h
DEPENDS
@@ -684,7 +685,7 @@ add_header_macro(
add_header_macro(
sys_wait
- ../libc/hdrgen/yaml/sys/wait.yaml
+ ../libc/include/sys/wait.yaml
sys/wait.h.def
sys/wait.h
DEPENDS
@@ -697,7 +698,7 @@ add_header_macro(
add_header_macro(
termios
- ../libc/hdrgen/yaml/termios.yaml
+ ../libc/include/termios.yaml
termios.h.def
termios.h
DEPENDS
@@ -712,7 +713,7 @@ add_header_macro(
add_header_macro(
uchar
- ../libc/hdrgen/yaml/uchar.yaml
+ ../libc/include/uchar.yaml
uchar.h.def
uchar.h
DEPENDS
@@ -725,7 +726,7 @@ add_header_macro(
add_header_macro(
wchar
- ../libc/hdrgen/yaml/wchar.yaml
+ ../libc/include/wchar.yaml
wchar.h.def
wchar.h
DEPENDS
@@ -739,7 +740,7 @@ add_header_macro(
add_header_macro(
locale
- ../libc/hdrgen/yaml/locale.yaml
+ ../libc/include/locale.yaml
locale.h.def
locale.h
DEPENDS
@@ -749,19 +750,6 @@ add_header_macro(
.llvm-libc-types.struct_lconv
)
-if(LIBC_TARGET_OS_IS_GPU)
- file(MAKE_DIRECTORY ${LIBC_INCLUDE_DIR}/gpu)
-
- add_header_macro(
- gpu_rpc
- ../libc/hdrgen/yaml/gpu/rpc.yaml
- gpu/rpc.h.def
- gpu/rpc.h
- DEPENDS
- .llvm_libc_common_h
- )
-endif()
-
if(NOT LLVM_LIBC_FULL_BUILD)
# We don't install headers in non-fullbuild mode.
return()
diff --git a/libc/include/__llvm-libc-common.h b/libc/include/__llvm-libc-common.h
index e0e29bbbd5f8..d9d70aff771c 100644
--- a/libc/include/__llvm-libc-common.h
+++ b/libc/include/__llvm-libc-common.h
@@ -52,8 +52,22 @@
#undef __restrict
#define __restrict restrict // C99 and above support the restrict keyword.
+#undef _Noreturn
+#if __STDC_VERSION__ >= 201112L
+// In C11 and later, _Noreturn is a keyword.
+#elif defined(__GNUC__)
+// GNU-compatible compilers have an equivalent attribute.
+#define _Noreturn __attribute__((__noreturn__))
+#else
+#define _Noreturn
+#endif
+
#undef __NOEXCEPT
+#ifdef __GNUC__
+#define __NOEXCEPT __attribute__((__nothrow__))
+#else
#define __NOEXCEPT
+#endif
#endif // __cplusplus
diff --git a/libc/hdrgen/yaml/arpa/inet.yaml b/libc/include/arpa/inet.yaml
index cb366e0f5d69..cb366e0f5d69 100644
--- a/libc/hdrgen/yaml/arpa/inet.yaml
+++ b/libc/include/arpa/inet.yaml
diff --git a/libc/hdrgen/yaml/assert.yaml b/libc/include/assert.yaml
index f740554488ed..f740554488ed 100644
--- a/libc/hdrgen/yaml/assert.yaml
+++ b/libc/include/assert.yaml
diff --git a/libc/include/complex.yaml b/libc/include/complex.yaml
new file mode 100644
index 000000000000..cd81de7dd9e2
--- /dev/null
+++ b/libc/include/complex.yaml
@@ -0,0 +1,137 @@
+header: complex.h
+macros: []
+types:
+ - type_name: cfloat16
+ - type_name: cfloat128
+ - type_name: float128
+enums: []
+objects: []
+functions:
+ - name: cimag
+ standards:
+ - stdc
+ return_type: double
+ arguments:
+ - type: _Complex double
+ - name: cimagf
+ standards:
+ - stdc
+ return_type: float
+ arguments:
+ - type: _Complex float
+ - name: cimagl
+ standards:
+ - stdc
+ return_type: long double
+ arguments:
+ - type: _Complex long double
+ - name: cimagf16
+ standards:
+ - stdc
+ return_type: _Float16
+ arguments:
+ - type: cfloat16
+ guard: LIBC_TYPES_HAS_CFLOAT16
+ - name: cimagf128
+ standards:
+ - stdc
+ return_type: float128
+ arguments:
+ - type: cfloat128
+ guard: LIBC_TYPES_HAS_CFLOAT128
+ - name: creal
+ standards:
+ - stdc
+ return_type: double
+ arguments:
+ - type: _Complex double
+ - name: crealf
+ standards:
+ - stdc
+ return_type: float
+ arguments:
+ - type: _Complex float
+ - name: creall
+ standards:
+ - stdc
+ return_type: long double
+ arguments:
+ - type: _Complex long double
+ - name: crealf16
+ standards:
+ - stdc
+ return_type: _Float16
+ arguments:
+ - type: cfloat16
+ guard: LIBC_TYPES_HAS_CFLOAT16
+ - name: crealf128
+ standards:
+ - stdc
+ return_type: float128
+ arguments:
+ - type: cfloat128
+ guard: LIBC_TYPES_HAS_CFLOAT128
+ - name: conj
+ standards:
+ - stdc
+ return_type: _Complex double
+ arguments:
+ - type: _Complex double
+ - name: conjf
+ standards:
+ - stdc
+ return_type: _Complex float
+ arguments:
+ - type: _Complex float
+ - name: conjl
+ standards:
+ - stdc
+ return_type: _Complex long double
+ arguments:
+ - type: _Complex long double
+ - name: conjf16
+ standards:
+ - stdc
+ return_type: cfloat16
+ arguments:
+ - type: cfloat16
+ guard: LIBC_TYPES_HAS_CFLOAT16
+ - name: conjf128
+ standards:
+ - stdc
+ return_type: cfloat128
+ arguments:
+ - type: cfloat128
+ guard: LIBC_TYPES_HAS_CFLOAT128
+ - name: cproj
+ standards:
+ - stdc
+ return_type: _Complex double
+ arguments:
+ - type: _Complex double
+ - name: cprojf
+ standards:
+ - stdc
+ return_type: _Complex float
+ arguments:
+ - type: _Complex float
+ - name: cprojl
+ standards:
+ - stdc
+ return_type: _Complex long double
+ arguments:
+ - type: _Complex long double
+ - name: cprojf16
+ standards:
+ - stdc
+ return_type: cfloat16
+ arguments:
+ - type: cfloat16
+ guard: LIBC_TYPES_HAS_CFLOAT16
+ - name: cprojf128
+ standards:
+ - stdc
+ return_type: cfloat128
+ arguments:
+ - type: cfloat128
+ guard: LIBC_TYPES_HAS_CFLOAT128
diff --git a/libc/hdrgen/yaml/ctype.yaml b/libc/include/ctype.yaml
index b4823c3e5323..b4823c3e5323 100644
--- a/libc/hdrgen/yaml/ctype.yaml
+++ b/libc/include/ctype.yaml
diff --git a/libc/hdrgen/yaml/dirent.yaml b/libc/include/dirent.yaml
index cdccf6a0c7f2..cdccf6a0c7f2 100644
--- a/libc/hdrgen/yaml/dirent.yaml
+++ b/libc/include/dirent.yaml
diff --git a/libc/hdrgen/yaml/dlfcn.yaml b/libc/include/dlfcn.yaml
index 725ee705714a..725ee705714a 100644
--- a/libc/hdrgen/yaml/dlfcn.yaml
+++ b/libc/include/dlfcn.yaml
diff --git a/libc/hdrgen/yaml/elf.yaml b/libc/include/elf.yaml
index 2e9db329e229..2e9db329e229 100644
--- a/libc/hdrgen/yaml/elf.yaml
+++ b/libc/include/elf.yaml
diff --git a/libc/hdrgen/yaml/errno.yaml b/libc/include/errno.yaml
index a894063a1ee2..a894063a1ee2 100644
--- a/libc/hdrgen/yaml/errno.yaml
+++ b/libc/include/errno.yaml
diff --git a/libc/hdrgen/yaml/fcntl.yaml b/libc/include/fcntl.yaml
index 71c0df3b0fad..71c0df3b0fad 100644
--- a/libc/hdrgen/yaml/fcntl.yaml
+++ b/libc/include/fcntl.yaml
diff --git a/libc/hdrgen/yaml/features.yaml b/libc/include/features.yaml
index a18af22edb74..a18af22edb74 100644
--- a/libc/hdrgen/yaml/features.yaml
+++ b/libc/include/features.yaml
diff --git a/libc/hdrgen/yaml/fenv.yaml b/libc/include/fenv.yaml
index 1010efc6402c..1010efc6402c 100644
--- a/libc/hdrgen/yaml/fenv.yaml
+++ b/libc/include/fenv.yaml
diff --git a/libc/hdrgen/yaml/float.yaml b/libc/include/float.yaml
index 63639a6e8ed1..63639a6e8ed1 100644
--- a/libc/hdrgen/yaml/float.yaml
+++ b/libc/include/float.yaml
diff --git a/libc/hdrgen/yaml/inttypes.yaml b/libc/include/inttypes.yaml
index ad636cc5121a..ad636cc5121a 100644
--- a/libc/hdrgen/yaml/inttypes.yaml
+++ b/libc/include/inttypes.yaml
diff --git a/libc/hdrgen/yaml/limits.yaml b/libc/include/limits.yaml
index bf33ed24e7a8..bf33ed24e7a8 100644
--- a/libc/hdrgen/yaml/limits.yaml
+++ b/libc/include/limits.yaml
diff --git a/libc/hdrgen/yaml/link.yaml b/libc/include/link.yaml
index d1963a86813a..d1963a86813a 100644
--- a/libc/hdrgen/yaml/link.yaml
+++ b/libc/include/link.yaml
diff --git a/libc/include/llvm-libc-macros/CMakeLists.txt b/libc/include/llvm-libc-macros/CMakeLists.txt
index 75194923a452..9d5d9f654428 100644
--- a/libc/include/llvm-libc-macros/CMakeLists.txt
+++ b/libc/include/llvm-libc-macros/CMakeLists.txt
@@ -315,3 +315,9 @@ add_macro_header(
HDR
locale-macros.h
)
+
+add_macro_header(
+ pthread_macros
+ HDR
+ pthread-macros.h
+)
diff --git a/libc/include/llvm-libc-macros/pthread-macros.h b/libc/include/llvm-libc-macros/pthread-macros.h
new file mode 100644
index 000000000000..8a144dbd2e61
--- /dev/null
+++ b/libc/include/llvm-libc-macros/pthread-macros.h
@@ -0,0 +1,37 @@
+//===-- Definition of pthread macros --------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_MACROS_PTHREAD_MACRO_H
+#define LLVM_LIBC_MACROS_PTHREAD_MACRO_H
+
+#define PTHREAD_CREATE_JOINABLE 0
+#define PTHREAD_CREATE_DETACHED 1
+
+#define PTHREAD_MUTEX_NORMAL 0
+#define PTHREAD_MUTEX_ERRORCHECK 1
+#define PTHREAD_MUTEX_RECURSIVE 2
+#define PTHREAD_MUTEX_DEFAULT PTHREAD_MUTEX_NORMAL
+
+#define PTHREAD_MUTEX_STALLED 0
+#define PTHREAD_MUTEX_ROBUST 1
+
+#define PTHREAD_ONCE_INIT {0}
+
+#define PTHREAD_PROCESS_PRIVATE 0
+#define PTHREAD_PROCESS_SHARED 1
+
+#define PTHREAD_MUTEX_INITIALIZER {0}
+#define PTHREAD_RWLOCK_INITIALIZER {0}
+
+// glibc extensions
+#define PTHREAD_STACK_MIN (1 << 14) // 16KB
+#define PTHREAD_RWLOCK_PREFER_READER_NP 0
+#define PTHREAD_RWLOCK_PREFER_WRITER_NP 1
+#define PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP 2
+
+#endif // LLVM_LIBC_MACROS_PTHREAD_MACRO_H
diff --git a/libc/include/llvm-libc-macros/windows/CMakeLists.txt b/libc/include/llvm-libc-macros/windows/CMakeLists.txt
new file mode 100644
index 000000000000..48afc795178a
--- /dev/null
+++ b/libc/include/llvm-libc-macros/windows/CMakeLists.txt
@@ -0,0 +1,6 @@
+add_header(
+ time_macros_ext
+ HDR
+ time-macros-ext.h
+)
+
diff --git a/libc/include/llvm-libc-macros/windows/time-macros-ext.h b/libc/include/llvm-libc-macros/windows/time-macros-ext.h
new file mode 100644
index 000000000000..71d914b45187
--- /dev/null
+++ b/libc/include/llvm-libc-macros/windows/time-macros-ext.h
@@ -0,0 +1,17 @@
+//===-- Windows Time Macros Extension -------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_MACROS_WINDOWS_TIME_MACROS_EXT_H
+#define LLVM_LIBC_MACROS_WINDOWS_TIME_MACROS_EXT_H
+
+#define CLOCK_MONOTONIC 0
+#define CLOCK_REALTIME 1
+#define CLOCK_PROCESS_CPUTIME_ID 2
+#define CLOCK_THREAD_CPUTIME_ID 3
+
+#endif // LLVM_LIBC_MACROS_WINDOWS_TIME_MACROS_EXT_H
diff --git a/libc/include/llvm-libc-types/cfloat128.h b/libc/include/llvm-libc-types/cfloat128.h
index a371671cf623..f76a0c1c2f5a 100644
--- a/libc/include/llvm-libc-types/cfloat128.h
+++ b/libc/include/llvm-libc-types/cfloat128.h
@@ -35,6 +35,7 @@ typedef _Complex _Float128 cfloat128;
typedef _Complex __float128 cfloat128;
#elif (LDBL_MANT_DIG == 113)
#define LIBC_TYPES_HAS_CFLOAT128
+#define LIBC_TYPES_CFLOAT128_IS_COMPLEX_LONG_DOUBLE
typedef _Complex long double cfloat128;
#endif
diff --git a/libc/hdrgen/yaml/locale.yaml b/libc/include/locale.yaml
index 7da7966ea730..7da7966ea730 100644
--- a/libc/hdrgen/yaml/locale.yaml
+++ b/libc/include/locale.yaml
diff --git a/libc/hdrgen/yaml/malloc.yaml b/libc/include/malloc.yaml
index 8db4f3aebb9b..8db4f3aebb9b 100644
--- a/libc/hdrgen/yaml/malloc.yaml
+++ b/libc/include/malloc.yaml
diff --git a/libc/hdrgen/yaml/math.yaml b/libc/include/math.yaml
index 00efc3478966..3b8caec66bbf 100644
--- a/libc/hdrgen/yaml/math.yaml
+++ b/libc/include/math.yaml
@@ -200,6 +200,13 @@ functions:
return_type: float
arguments:
- type: float
+ - name: cosf16
+ standards:
+ - stdc
+ return_type: _Float16
+ arguments:
+ - type: _Float16
+ guard: LIBC_TYPES_HAS_FLOAT16
- name: coshf
standards:
- stdc
diff --git a/libc/include/pthread.h.def b/libc/include/pthread.h.def
index 4dbeed6b5f32..aa1e9983e4bb 100644
--- a/libc/include/pthread.h.def
+++ b/libc/include/pthread.h.def
@@ -10,39 +10,7 @@
#define LLVM_LIBC_PTHREAD_H
#include "__llvm-libc-common.h"
-
-// TODO: move to a pthreads-macros.h file:
-// https://github.com/llvm/llvm-project/issues/88997
-
-#define PTHREAD_STACK_MIN (1 << 14) // 16KB
-
-#define PTHREAD_MUTEX_INITIALIZER {0}
-#define PTHREAD_RWLOCK_INITIALIZER {}
-#define PTHREAD_ONCE_INIT {0}
-
-enum {
- PTHREAD_CREATE_JOINABLE = 0x0,
- PTHREAD_CREATE_DETACHED = 0x1,
-
- PTHREAD_MUTEX_NORMAL = 0x0,
- PTHREAD_MUTEX_ERRORCHECK = 0x1,
- PTHREAD_MUTEX_RECURSIVE = 0x2,
- PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_NORMAL,
-
- PTHREAD_PROCESS_PRIVATE = 0x0,
- PTHREAD_PROCESS_SHARED = 0x1,
-
- PTHREAD_MUTEX_STALLED = 0x0,
- PTHREAD_MUTEX_ROBUST = 0x1,
-};
-
-#define PTHREAD_PROCESS_PRIVATE 0
-#define PTHREAD_PROCESS_SHARED 1
-
-#define PTHREAD_RWLOCK_PREFER_READER_NP 0
-#define PTHREAD_RWLOCK_PREFER_WRITER_NP 1
-#define PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP 2
-
+#include "llvm-libc-macros/pthread-macros.h"
%%public_api()
diff --git a/libc/hdrgen/yaml/pthread.yaml b/libc/include/pthread.yaml
index b9068c3f1765..b9068c3f1765 100644
--- a/libc/hdrgen/yaml/pthread.yaml
+++ b/libc/include/pthread.yaml
diff --git a/libc/hdrgen/yaml/sched.yaml b/libc/include/sched.yaml
index 2d4876b722ab..2d4876b722ab 100644
--- a/libc/hdrgen/yaml/sched.yaml
+++ b/libc/include/sched.yaml
diff --git a/libc/hdrgen/yaml/search.yaml b/libc/include/search.yaml
index a0c73bc679d8..a0c73bc679d8 100644
--- a/libc/hdrgen/yaml/search.yaml
+++ b/libc/include/search.yaml
diff --git a/libc/hdrgen/yaml/setjmp.yaml b/libc/include/setjmp.yaml
index 68e3ff046e4b..68e3ff046e4b 100644
--- a/libc/hdrgen/yaml/setjmp.yaml
+++ b/libc/include/setjmp.yaml
diff --git a/libc/hdrgen/yaml/signal.yaml b/libc/include/signal.yaml
index c66abb1a8744..c66abb1a8744 100644
--- a/libc/hdrgen/yaml/signal.yaml
+++ b/libc/include/signal.yaml
diff --git a/libc/hdrgen/yaml/spawn.yaml b/libc/include/spawn.yaml
index be3f4e99d27f..be3f4e99d27f 100644
--- a/libc/hdrgen/yaml/spawn.yaml
+++ b/libc/include/spawn.yaml
diff --git a/libc/hdrgen/yaml/stdbit.yaml b/libc/include/stdbit.yaml
index 25d2d326c30e..25d2d326c30e 100644
--- a/libc/hdrgen/yaml/stdbit.yaml
+++ b/libc/include/stdbit.yaml
diff --git a/libc/hdrgen/yaml/stdckdint.yaml b/libc/include/stdckdint.yaml
index ea8fc47625b0..ea8fc47625b0 100644
--- a/libc/hdrgen/yaml/stdckdint.yaml
+++ b/libc/include/stdckdint.yaml
diff --git a/libc/hdrgen/yaml/stdfix.yaml b/libc/include/stdfix.yaml
index 9787eaba45e4..9787eaba45e4 100644
--- a/libc/hdrgen/yaml/stdfix.yaml
+++ b/libc/include/stdfix.yaml
diff --git a/libc/hdrgen/yaml/stdint.yaml b/libc/include/stdint.yaml
index 8887f596bc8a..8887f596bc8a 100644
--- a/libc/hdrgen/yaml/stdint.yaml
+++ b/libc/include/stdint.yaml
diff --git a/libc/hdrgen/yaml/stdio.yaml b/libc/include/stdio.yaml
index fd116bbc0089..fd116bbc0089 100644
--- a/libc/hdrgen/yaml/stdio.yaml
+++ b/libc/include/stdio.yaml
diff --git a/libc/hdrgen/yaml/stdlib.yaml b/libc/include/stdlib.yaml
index c6c95e421cee..c6c95e421cee 100644
--- a/libc/hdrgen/yaml/stdlib.yaml
+++ b/libc/include/stdlib.yaml
diff --git a/libc/hdrgen/yaml/string.yaml b/libc/include/string.yaml
index af1750e91243..af1750e91243 100644
--- a/libc/hdrgen/yaml/string.yaml
+++ b/libc/include/string.yaml
diff --git a/libc/hdrgen/yaml/strings.yaml b/libc/include/strings.yaml
index ca91b626740c..ca91b626740c 100644
--- a/libc/hdrgen/yaml/strings.yaml
+++ b/libc/include/strings.yaml
diff --git a/libc/hdrgen/yaml/sys/auxv.yaml b/libc/include/sys/auxv.yaml
index 9d546b358824..9d546b358824 100644
--- a/libc/hdrgen/yaml/sys/auxv.yaml
+++ b/libc/include/sys/auxv.yaml
diff --git a/libc/hdrgen/yaml/sys/epoll.yaml b/libc/include/sys/epoll.yaml
index ee188c17fedc..ee188c17fedc 100644
--- a/libc/hdrgen/yaml/sys/epoll.yaml
+++ b/libc/include/sys/epoll.yaml
diff --git a/libc/hdrgen/yaml/sys/ioctl.yaml b/libc/include/sys/ioctl.yaml
index ffe73a84d51b..ffe73a84d51b 100644
--- a/libc/hdrgen/yaml/sys/ioctl.yaml
+++ b/libc/include/sys/ioctl.yaml
diff --git a/libc/hdrgen/yaml/sys/mman.yaml b/libc/include/sys/mman.yaml
index dd53eb60d1ec..962ca3591917 100644
--- a/libc/hdrgen/yaml/sys/mman.yaml
+++ b/libc/include/sys/mman.yaml
@@ -132,10 +132,3 @@ functions:
return_type: int
arguments:
- type: const char *
- - name: process_mrelease
- standards:
- - Linux
- return_type: int
- arguments:
- - type: int
- - type: unsigned int
diff --git a/libc/hdrgen/yaml/sys/prctl.yaml b/libc/include/sys/prctl.yaml
index 82374be87d5d..82374be87d5d 100644
--- a/libc/hdrgen/yaml/sys/prctl.yaml
+++ b/libc/include/sys/prctl.yaml
diff --git a/libc/hdrgen/yaml/sys/random.yaml b/libc/include/sys/random.yaml
index 228bb50d5db9..228bb50d5db9 100644
--- a/libc/hdrgen/yaml/sys/random.yaml
+++ b/libc/include/sys/random.yaml
diff --git a/libc/hdrgen/yaml/sys/resource.yaml b/libc/include/sys/resource.yaml
index 85ea1ad12f19..85ea1ad12f19 100644
--- a/libc/hdrgen/yaml/sys/resource.yaml
+++ b/libc/include/sys/resource.yaml
diff --git a/libc/hdrgen/yaml/sys/select.yaml b/libc/include/sys/select.yaml
index c6806122aa81..c6806122aa81 100644
--- a/libc/hdrgen/yaml/sys/select.yaml
+++ b/libc/include/sys/select.yaml
diff --git a/libc/hdrgen/yaml/sys/sendfile.yaml b/libc/include/sys/sendfile.yaml
index 7e45e40e171d..7e45e40e171d 100644
--- a/libc/hdrgen/yaml/sys/sendfile.yaml
+++ b/libc/include/sys/sendfile.yaml
diff --git a/libc/hdrgen/yaml/sys/socket.yaml b/libc/include/sys/socket.yaml
index 47d835fa5f4a..47d835fa5f4a 100644
--- a/libc/hdrgen/yaml/sys/socket.yaml
+++ b/libc/include/sys/socket.yaml
diff --git a/libc/hdrgen/yaml/sys/stat.yaml b/libc/include/sys/stat.yaml
index ed500f832f90..ed500f832f90 100644
--- a/libc/hdrgen/yaml/sys/stat.yaml
+++ b/libc/include/sys/stat.yaml
diff --git a/libc/hdrgen/yaml/sys/statvfs.yaml b/libc/include/sys/statvfs.yaml
index 22e0ef22c413..22e0ef22c413 100644
--- a/libc/hdrgen/yaml/sys/statvfs.yaml
+++ b/libc/include/sys/statvfs.yaml
diff --git a/libc/include/sys/syscall.h.def b/libc/include/sys/syscall.h.def
index 11758ea8336d..03c19eb0885e 100644
--- a/libc/include/sys/syscall.h.def
+++ b/libc/include/sys/syscall.h.def
@@ -2349,12 +2349,5 @@
#define SYS_writev __NR_writev
#endif
-#ifdef __NR_process_mrelease
-#define SYS_process_mrelease __NR_process_mrelease
-#endif
-
-#ifdef __NR_pidfd_open
-#define SYS_pidfd_open __NR_pidfd_open
-#endif
#endif // LLVM_LIBC_SYS_SYSCALL_H
diff --git a/libc/hdrgen/yaml/sys/syscall.yaml b/libc/include/sys/syscall.yaml
index c0a64338b6f7..c0a64338b6f7 100644
--- a/libc/hdrgen/yaml/sys/syscall.yaml
+++ b/libc/include/sys/syscall.yaml
diff --git a/libc/hdrgen/yaml/sys/time.yaml b/libc/include/sys/time.yaml
index eb3dd548389b..eb3dd548389b 100644
--- a/libc/hdrgen/yaml/sys/time.yaml
+++ b/libc/include/sys/time.yaml
diff --git a/libc/hdrgen/yaml/sys/types.yaml b/libc/include/sys/types.yaml
index 15eaf107f691..15eaf107f691 100644
--- a/libc/hdrgen/yaml/sys/types.yaml
+++ b/libc/include/sys/types.yaml
diff --git a/libc/hdrgen/yaml/sys/utsname.yaml b/libc/include/sys/utsname.yaml
index eecd55b18082..eecd55b18082 100644
--- a/libc/hdrgen/yaml/sys/utsname.yaml
+++ b/libc/include/sys/utsname.yaml
diff --git a/libc/hdrgen/yaml/sys/wait.yaml b/libc/include/sys/wait.yaml
index 4f0c69baee2c..4f0c69baee2c 100644
--- a/libc/hdrgen/yaml/sys/wait.yaml
+++ b/libc/include/sys/wait.yaml
diff --git a/libc/hdrgen/yaml/termios.yaml b/libc/include/termios.yaml
index e9c4cd375d0b..e9c4cd375d0b 100644
--- a/libc/hdrgen/yaml/termios.yaml
+++ b/libc/include/termios.yaml
diff --git a/libc/hdrgen/yaml/threads.yaml b/libc/include/threads.yaml
index aadcaf5f66e0..aadcaf5f66e0 100644
--- a/libc/hdrgen/yaml/threads.yaml
+++ b/libc/include/threads.yaml
diff --git a/libc/hdrgen/yaml/time.yaml b/libc/include/time.yaml
index 3f745e5ee338..3f745e5ee338 100644
--- a/libc/hdrgen/yaml/time.yaml
+++ b/libc/include/time.yaml
diff --git a/libc/hdrgen/yaml/uchar.yaml b/libc/include/uchar.yaml
index 18ca840612e0..18ca840612e0 100644
--- a/libc/hdrgen/yaml/uchar.yaml
+++ b/libc/include/uchar.yaml
diff --git a/libc/hdrgen/yaml/unistd.yaml b/libc/include/unistd.yaml
index c6441c04ce3a..c6441c04ce3a 100644
--- a/libc/hdrgen/yaml/unistd.yaml
+++ b/libc/include/unistd.yaml
diff --git a/libc/hdrgen/yaml/wchar.yaml b/libc/include/wchar.yaml
index bc824b21d8be..bc824b21d8be 100644
--- a/libc/hdrgen/yaml/wchar.yaml
+++ b/libc/include/wchar.yaml
diff --git a/libc/shared/rpc.h b/libc/shared/rpc.h
index 3f586744377d..dd46d5dcb3dc 100644
--- a/libc/shared/rpc.h
+++ b/libc/shared/rpc.h
@@ -20,12 +20,6 @@
#include "rpc_util.h"
-#include <stdint.h>
-
-#ifndef RPC_INLINE
-#define RPC_INLINE inline
-#endif
-
namespace rpc {
/// Use scoped atomic variants if they are available for the target.
@@ -44,9 +38,9 @@ namespace rpc {
/// Generic codes that can be used whem implementing the server.
enum Status {
- SUCCESS = 0x0,
- ERROR = 0x1000,
- UNHANDLED_OPCODE = 0x1001,
+ RPC_SUCCESS = 0x0,
+ RPC_ERROR = 0x1000,
+ RPC_UNHANDLED_OPCODE = 0x1001,
};
/// A fixed size channel used to communicate between the RPC client and server.
@@ -78,12 +72,12 @@ constexpr static uint64_t MAX_PORT_COUNT = 4096;
/// - The server will always start with a 'recv' operation.
/// - Every 'send' or 'recv' call is mirrored by the other process.
template <bool Invert> struct Process {
- RPC_INLINE Process() = default;
- RPC_INLINE Process(const Process &) = delete;
- RPC_INLINE Process &operator=(const Process &) = delete;
- RPC_INLINE Process(Process &&) = default;
- RPC_INLINE Process &operator=(Process &&) = default;
- RPC_INLINE ~Process() = default;
+ RPC_ATTRS Process() = default;
+ RPC_ATTRS Process(const Process &) = delete;
+ RPC_ATTRS Process &operator=(const Process &) = delete;
+ RPC_ATTRS Process(Process &&) = default;
+ RPC_ATTRS Process &operator=(Process &&) = default;
+ RPC_ATTRS ~Process() = default;
const uint32_t port_count = 0;
const uint32_t *const inbox = nullptr;
@@ -94,7 +88,7 @@ template <bool Invert> struct Process {
static constexpr uint64_t NUM_BITS_IN_WORD = sizeof(uint32_t) * 8;
uint32_t lock[MAX_PORT_COUNT / NUM_BITS_IN_WORD] = {0};
- RPC_INLINE Process(uint32_t port_count, void *buffer)
+ RPC_ATTRS Process(uint32_t port_count, void *buffer)
: port_count(port_count), inbox(reinterpret_cast<uint32_t *>(
advance(buffer, inbox_offset(port_count)))),
outbox(reinterpret_cast<uint32_t *>(
@@ -113,20 +107,20 @@ template <bool Invert> struct Process {
/// Header header[port_count];
/// Buffer packet[port_count][lane_size];
/// };
- RPC_INLINE static constexpr uint64_t allocation_size(uint32_t port_count,
- uint32_t lane_size) {
+ RPC_ATTRS static constexpr uint64_t allocation_size(uint32_t port_count,
+ uint32_t lane_size) {
return buffer_offset(port_count) + buffer_bytes(port_count, lane_size);
}
/// Retrieve the inbox state from memory shared between processes.
- RPC_INLINE uint32_t load_inbox(uint64_t lane_mask, uint32_t index) const {
+ RPC_ATTRS uint32_t load_inbox(uint64_t lane_mask, uint32_t index) const {
return rpc::broadcast_value(
lane_mask, __scoped_atomic_load_n(&inbox[index], __ATOMIC_RELAXED,
__MEMORY_SCOPE_SYSTEM));
}
/// Retrieve the outbox state from memory shared between processes.
- RPC_INLINE uint32_t load_outbox(uint64_t lane_mask, uint32_t index) const {
+ RPC_ATTRS uint32_t load_outbox(uint64_t lane_mask, uint32_t index) const {
return rpc::broadcast_value(
lane_mask, __scoped_atomic_load_n(&outbox[index], __ATOMIC_RELAXED,
__MEMORY_SCOPE_SYSTEM));
@@ -136,7 +130,7 @@ template <bool Invert> struct Process {
/// Equivalent to loading outbox followed by store of the inverted value
/// The outbox is write only by this warp and tracking the value locally is
/// cheaper than calling load_outbox to get the value to store.
- RPC_INLINE uint32_t invert_outbox(uint32_t index, uint32_t current_outbox) {
+ RPC_ATTRS uint32_t invert_outbox(uint32_t index, uint32_t current_outbox) {
uint32_t inverted_outbox = !current_outbox;
__scoped_atomic_thread_fence(__ATOMIC_RELEASE, __MEMORY_SCOPE_SYSTEM);
__scoped_atomic_store_n(&outbox[index], inverted_outbox, __ATOMIC_RELAXED,
@@ -146,8 +140,8 @@ template <bool Invert> struct Process {
// Given the current outbox and inbox values, wait until the inbox changes
// to indicate that this thread owns the buffer element.
- RPC_INLINE void wait_for_ownership(uint64_t lane_mask, uint32_t index,
- uint32_t outbox, uint32_t in) {
+ RPC_ATTRS void wait_for_ownership(uint64_t lane_mask, uint32_t index,
+ uint32_t outbox, uint32_t in) {
while (buffer_unavailable(in, outbox)) {
sleep_briefly();
in = load_inbox(lane_mask, index);
@@ -158,14 +152,14 @@ template <bool Invert> struct Process {
/// The packet is a linearly allocated array of buffers used to communicate
/// with the other process. This function returns the appropriate slot in this
/// array such that the process can operate on an entire warp or wavefront.
- RPC_INLINE Buffer *get_packet(uint32_t index, uint32_t lane_size) {
+ RPC_ATTRS Buffer *get_packet(uint32_t index, uint32_t lane_size) {
return &packet[index * lane_size];
}
/// Determines if this process needs to wait for ownership of the buffer. We
/// invert the condition on one of the processes to indicate that if one
/// process owns the buffer then the other does not.
- RPC_INLINE static bool buffer_unavailable(uint32_t in, uint32_t out) {
+ RPC_ATTRS static bool buffer_unavailable(uint32_t in, uint32_t out) {
bool cond = in != out;
return Invert ? !cond : cond;
}
@@ -174,7 +168,7 @@ template <bool Invert> struct Process {
/// lane_mask is a bitmap of the threads in the warp that would hold the
/// single lock on success, e.g. the result of rpc::get_lane_mask()
/// The lock is held when the n-th bit of the lock bitfield is set.
- RPC_INLINE bool try_lock(uint64_t lane_mask, uint32_t index) {
+ RPC_ATTRS bool try_lock(uint64_t lane_mask, uint32_t index) {
// On amdgpu, test and set to the nth lock bit and a sync_lane would suffice
// On volta, need to handle differences between the threads running and
// the threads that were detected in the previous call to get_lane_mask()
@@ -214,7 +208,7 @@ template <bool Invert> struct Process {
/// Unlock the lock at index. We need a lane sync to keep this function
/// convergent, otherwise the compiler will sink the store and deadlock.
- RPC_INLINE void unlock(uint64_t lane_mask, uint32_t index) {
+ RPC_ATTRS void unlock(uint64_t lane_mask, uint32_t index) {
// Do not move any writes past the unlock.
__scoped_atomic_thread_fence(__ATOMIC_RELEASE, __MEMORY_SCOPE_DEVICE);
@@ -227,40 +221,40 @@ template <bool Invert> struct Process {
}
/// Number of bytes to allocate for an inbox or outbox.
- RPC_INLINE static constexpr uint64_t mailbox_bytes(uint32_t port_count) {
+ RPC_ATTRS static constexpr uint64_t mailbox_bytes(uint32_t port_count) {
return port_count * sizeof(uint32_t);
}
/// Number of bytes to allocate for the buffer containing the packets.
- RPC_INLINE static constexpr uint64_t buffer_bytes(uint32_t port_count,
- uint32_t lane_size) {
+ RPC_ATTRS static constexpr uint64_t buffer_bytes(uint32_t port_count,
+ uint32_t lane_size) {
return port_count * lane_size * sizeof(Buffer);
}
/// Offset of the inbox in memory. This is the same as the outbox if inverted.
- RPC_INLINE static constexpr uint64_t inbox_offset(uint32_t port_count) {
+ RPC_ATTRS static constexpr uint64_t inbox_offset(uint32_t port_count) {
return Invert ? mailbox_bytes(port_count) : 0;
}
/// Offset of the outbox in memory. This is the same as the inbox if inverted.
- RPC_INLINE static constexpr uint64_t outbox_offset(uint32_t port_count) {
+ RPC_ATTRS static constexpr uint64_t outbox_offset(uint32_t port_count) {
return Invert ? 0 : mailbox_bytes(port_count);
}
/// Offset of the buffer containing the packets after the inbox and outbox.
- RPC_INLINE static constexpr uint64_t header_offset(uint32_t port_count) {
+ RPC_ATTRS static constexpr uint64_t header_offset(uint32_t port_count) {
return align_up(2 * mailbox_bytes(port_count), alignof(Header));
}
/// Offset of the buffer containing the packets after the inbox and outbox.
- RPC_INLINE static constexpr uint64_t buffer_offset(uint32_t port_count) {
+ RPC_ATTRS static constexpr uint64_t buffer_offset(uint32_t port_count) {
return align_up(header_offset(port_count) + port_count * sizeof(Header),
alignof(Buffer));
}
/// Conditionally set the n-th bit in the atomic bitfield.
- RPC_INLINE static constexpr uint32_t set_nth(uint32_t *bits, uint32_t index,
- bool cond) {
+ RPC_ATTRS static constexpr uint32_t set_nth(uint32_t *bits, uint32_t index,
+ bool cond) {
uint32_t slot = index / NUM_BITS_IN_WORD;
uint32_t bit = index % NUM_BITS_IN_WORD;
return __scoped_atomic_fetch_or(&bits[slot],
@@ -270,8 +264,8 @@ template <bool Invert> struct Process {
}
/// Conditionally clear the n-th bit in the atomic bitfield.
- RPC_INLINE static constexpr uint32_t clear_nth(uint32_t *bits, uint32_t index,
- bool cond) {
+ RPC_ATTRS static constexpr uint32_t clear_nth(uint32_t *bits, uint32_t index,
+ bool cond) {
uint32_t slot = index / NUM_BITS_IN_WORD;
uint32_t bit = index % NUM_BITS_IN_WORD;
return __scoped_atomic_fetch_and(&bits[slot],
@@ -283,8 +277,8 @@ template <bool Invert> struct Process {
/// Invokes a function accross every active buffer across the total lane size.
template <typename F>
-RPC_INLINE static void invoke_rpc(F &&fn, uint32_t lane_size,
- uint64_t lane_mask, Buffer *slot) {
+RPC_ATTRS static void invoke_rpc(F &&fn, uint32_t lane_size, uint64_t lane_mask,
+ Buffer *slot) {
if constexpr (is_process_gpu()) {
fn(&slot[rpc::get_lane_id()], rpc::get_lane_id());
} else {
@@ -298,40 +292,37 @@ RPC_INLINE static void invoke_rpc(F &&fn, uint32_t lane_size,
/// processes. A port is conceptually an index into the memory provided by the
/// underlying process that is guarded by a lock bit.
template <bool T> struct Port {
- RPC_INLINE Port(Process<T> &process, uint64_t lane_mask, uint32_t lane_size,
- uint32_t index, uint32_t out)
+ RPC_ATTRS Port(Process<T> &process, uint64_t lane_mask, uint32_t lane_size,
+ uint32_t index, uint32_t out)
: process(process), lane_mask(lane_mask), lane_size(lane_size),
index(index), out(out), receive(false), owns_buffer(true) {}
- RPC_INLINE ~Port() = default;
+ RPC_ATTRS ~Port() = default;
private:
- RPC_INLINE Port(const Port &) = delete;
- RPC_INLINE Port &operator=(const Port &) = delete;
- RPC_INLINE Port(Port &&) = default;
- RPC_INLINE Port &operator=(Port &&) = default;
+ RPC_ATTRS Port(const Port &) = delete;
+ RPC_ATTRS Port &operator=(const Port &) = delete;
+ RPC_ATTRS Port(Port &&) = default;
+ RPC_ATTRS Port &operator=(Port &&) = default;
friend struct Client;
friend struct Server;
friend class rpc::optional<Port<T>>;
public:
- template <typename U> RPC_INLINE void recv(U use);
- template <typename F> RPC_INLINE void send(F fill);
- template <typename F, typename U>
- RPC_INLINE void send_and_recv(F fill, U use);
- template <typename W> RPC_INLINE void recv_and_send(W work);
- RPC_INLINE void send_n(const void *const *src, uint64_t *size);
- RPC_INLINE void send_n(const void *src, uint64_t size);
+ template <typename U> RPC_ATTRS void recv(U use);
+ template <typename F> RPC_ATTRS void send(F fill);
+ template <typename F, typename U> RPC_ATTRS void send_and_recv(F fill, U use);
+ template <typename W> RPC_ATTRS void recv_and_send(W work);
+ RPC_ATTRS void send_n(const void *const *src, uint64_t *size);
+ RPC_ATTRS void send_n(const void *src, uint64_t size);
template <typename A>
- RPC_INLINE void recv_n(void **dst, uint64_t *size, A &&alloc);
+ RPC_ATTRS void recv_n(void **dst, uint64_t *size, A &&alloc);
- RPC_INLINE uint32_t get_opcode() const {
- return process.header[index].opcode;
- }
+ RPC_ATTRS uint32_t get_opcode() const { return process.header[index].opcode; }
- RPC_INLINE uint32_t get_index() const { return index; }
+ RPC_ATTRS uint32_t get_index() const { return index; }
- RPC_INLINE void close() {
+ RPC_ATTRS void close() {
// Wait for all lanes to finish using the port.
rpc::sync_lane(lane_mask);
@@ -354,16 +345,16 @@ private:
/// The RPC client used to make requests to the server.
struct Client {
- RPC_INLINE Client() = default;
- RPC_INLINE Client(const Client &) = delete;
- RPC_INLINE Client &operator=(const Client &) = delete;
- RPC_INLINE ~Client() = default;
+ RPC_ATTRS Client() = default;
+ RPC_ATTRS Client(const Client &) = delete;
+ RPC_ATTRS Client &operator=(const Client &) = delete;
+ RPC_ATTRS ~Client() = default;
- RPC_INLINE Client(uint32_t port_count, void *buffer)
+ RPC_ATTRS Client(uint32_t port_count, void *buffer)
: process(port_count, buffer) {}
using Port = rpc::Port<false>;
- template <uint32_t opcode> RPC_INLINE Port open();
+ template <uint32_t opcode> RPC_ATTRS Port open();
private:
Process<false> process;
@@ -371,21 +362,21 @@ private:
/// The RPC server used to respond to the client.
struct Server {
- RPC_INLINE Server() = default;
- RPC_INLINE Server(const Server &) = delete;
- RPC_INLINE Server &operator=(const Server &) = delete;
- RPC_INLINE ~Server() = default;
+ RPC_ATTRS Server() = default;
+ RPC_ATTRS Server(const Server &) = delete;
+ RPC_ATTRS Server &operator=(const Server &) = delete;
+ RPC_ATTRS ~Server() = default;
- RPC_INLINE Server(uint32_t port_count, void *buffer)
+ RPC_ATTRS Server(uint32_t port_count, void *buffer)
: process(port_count, buffer) {}
using Port = rpc::Port<true>;
- RPC_INLINE rpc::optional<Port> try_open(uint32_t lane_size,
- uint32_t start = 0);
- RPC_INLINE Port open(uint32_t lane_size);
+ RPC_ATTRS rpc::optional<Port> try_open(uint32_t lane_size,
+ uint32_t start = 0);
+ RPC_ATTRS Port open(uint32_t lane_size);
- RPC_INLINE static uint64_t allocation_size(uint32_t lane_size,
- uint32_t port_count) {
+ RPC_ATTRS static uint64_t allocation_size(uint32_t lane_size,
+ uint32_t port_count) {
return Process<true>::allocation_size(port_count, lane_size);
}
@@ -394,7 +385,7 @@ private:
};
/// Applies \p fill to the shared buffer and initiates a send operation.
-template <bool T> template <typename F> RPC_INLINE void Port<T>::send(F fill) {
+template <bool T> template <typename F> RPC_ATTRS void Port<T>::send(F fill) {
uint32_t in = owns_buffer ? out ^ T : process.load_inbox(lane_mask, index);
// We need to wait until we own the buffer before sending.
@@ -409,7 +400,7 @@ template <bool T> template <typename F> RPC_INLINE void Port<T>::send(F fill) {
}
/// Applies \p use to the shared buffer and acknowledges the send.
-template <bool T> template <typename U> RPC_INLINE void Port<T>::recv(U use) {
+template <bool T> template <typename U> RPC_ATTRS void Port<T>::recv(U use) {
// We only exchange ownership of the buffer during a receive if we are waiting
// for a previous receive to finish.
if (receive) {
@@ -432,7 +423,7 @@ template <bool T> template <typename U> RPC_INLINE void Port<T>::recv(U use) {
/// Combines a send and receive into a single function.
template <bool T>
template <typename F, typename U>
-RPC_INLINE void Port<T>::send_and_recv(F fill, U use) {
+RPC_ATTRS void Port<T>::send_and_recv(F fill, U use) {
send(fill);
recv(use);
}
@@ -442,7 +433,7 @@ RPC_INLINE void Port<T>::send_and_recv(F fill, U use) {
/// the copy back.
template <bool T>
template <typename W>
-RPC_INLINE void Port<T>::recv_and_send(W work) {
+RPC_ATTRS void Port<T>::recv_and_send(W work) {
recv(work);
send([](Buffer *, uint32_t) { /* no-op */ });
}
@@ -450,7 +441,7 @@ RPC_INLINE void Port<T>::recv_and_send(W work) {
/// Helper routine to simplify the interface when sending from the GPU using
/// thread private pointers to the underlying value.
template <bool T>
-RPC_INLINE void Port<T>::send_n(const void *src, uint64_t size) {
+RPC_ATTRS void Port<T>::send_n(const void *src, uint64_t size) {
const void **src_ptr = &src;
uint64_t *size_ptr = &size;
send_n(src_ptr, size_ptr);
@@ -459,7 +450,7 @@ RPC_INLINE void Port<T>::send_n(const void *src, uint64_t size) {
/// Sends an arbitrarily sized data buffer \p src across the shared channel in
/// multiples of the packet length.
template <bool T>
-RPC_INLINE void Port<T>::send_n(const void *const *src, uint64_t *size) {
+RPC_ATTRS void Port<T>::send_n(const void *const *src, uint64_t *size) {
uint64_t num_sends = 0;
send([&](Buffer *buffer, uint32_t id) {
reinterpret_cast<uint64_t *>(buffer->data)[0] = lane_value(size, id);
@@ -490,7 +481,7 @@ RPC_INLINE void Port<T>::send_n(const void *const *src, uint64_t *size) {
/// size of the data so that we can initialize the size of the \p dst buffer.
template <bool T>
template <typename A>
-RPC_INLINE void Port<T>::recv_n(void **dst, uint64_t *size, A &&alloc) {
+RPC_ATTRS void Port<T>::recv_n(void **dst, uint64_t *size, A &&alloc) {
uint64_t num_recvs = 0;
recv([&](Buffer *buffer, uint32_t id) {
lane_value(size, id) = reinterpret_cast<uint64_t *>(buffer->data)[0];
@@ -524,7 +515,7 @@ RPC_INLINE void Port<T>::recv_n(void **dst, uint64_t *size, A &&alloc) {
/// port. Each port instance uses an associated \p opcode to tell the server
/// what to do. The Client interface provides the appropriate lane size to the
/// port using the platform's returned value.
-template <uint32_t opcode> RPC_INLINE Client::Port Client::open() {
+template <uint32_t opcode> RPC_ATTRS Client::Port Client::open() {
// Repeatedly perform a naive linear scan for a port that can be opened to
// send data.
for (uint32_t index = 0;; ++index) {
@@ -558,7 +549,7 @@ template <uint32_t opcode> RPC_INLINE Client::Port Client::open() {
/// Attempts to open a port to use as the server. The server can only open a
/// port if it has a pending receive operation
-RPC_INLINE rpc::optional<typename Server::Port>
+RPC_ATTRS rpc::optional<typename Server::Port>
Server::try_open(uint32_t lane_size, uint32_t start) {
// Perform a naive linear scan for a port that has a pending request.
for (uint32_t index = start; index < process.port_count; ++index) {
@@ -588,7 +579,7 @@ Server::try_open(uint32_t lane_size, uint32_t start) {
return rpc::nullopt;
}
-RPC_INLINE Server::Port Server::open(uint32_t lane_size) {
+RPC_ATTRS Server::Port Server::open(uint32_t lane_size) {
for (;;) {
if (rpc::optional<Server::Port> p = try_open(lane_size))
return rpc::move(p.value());
@@ -596,6 +587,7 @@ RPC_INLINE Server::Port Server::open(uint32_t lane_size) {
}
}
+#undef RPC_ATTRS
#if !__has_builtin(__scoped_atomic_load_n)
#undef __scoped_atomic_load_n
#undef __scoped_atomic_store_n
diff --git a/libc/shared/rpc_util.h b/libc/shared/rpc_util.h
index bb0177c01b85..9406de59f63b 100644
--- a/libc/shared/rpc_util.h
+++ b/libc/shared/rpc_util.h
@@ -12,7 +12,9 @@
#include <stddef.h>
#include <stdint.h>
-#if defined(__NVPTX__) || defined(__AMDGPU__)
+#if (defined(__NVPTX__) || defined(__AMDGPU__)) && \
+ !((defined(__CUDA__) && !defined(__CUDA_ARCH__)) || \
+ (defined(__HIP__) && !defined(__HIP_DEVICE_COMPILE__)))
#include <gpuintrin.h>
#define RPC_TARGET_IS_GPU
#endif
@@ -22,8 +24,12 @@
#define __has_builtin(x) 0
#endif
-#ifndef RPC_INLINE
-#define RPC_INLINE inline
+#ifndef RPC_ATTRS
+#if defined(__CUDA__) || defined(__HIP__)
+#define RPC_ATTRS __attribute__((host, device)) inline
+#else
+#define RPC_ATTRS inline
+#endif
#endif
namespace rpc {
@@ -45,26 +51,26 @@ template <class T> struct is_const<const T> : type_constant<bool, true> {};
/// Freestanding implementation of std::move.
template <class T>
-RPC_INLINE constexpr typename remove_reference<T>::type &&move(T &&t) {
+RPC_ATTRS constexpr typename remove_reference<T>::type &&move(T &&t) {
return static_cast<typename remove_reference<T>::type &&>(t);
}
/// Freestanding implementation of std::forward.
template <typename T>
-RPC_INLINE constexpr T &&forward(typename remove_reference<T>::type &value) {
+RPC_ATTRS constexpr T &&forward(typename remove_reference<T>::type &value) {
return static_cast<T &&>(value);
}
template <typename T>
-RPC_INLINE constexpr T &&forward(typename remove_reference<T>::type &&value) {
+RPC_ATTRS constexpr T &&forward(typename remove_reference<T>::type &&value) {
return static_cast<T &&>(value);
}
struct in_place_t {
- RPC_INLINE explicit in_place_t() = default;
+ RPC_ATTRS explicit in_place_t() = default;
};
struct nullopt_t {
- RPC_INLINE constexpr explicit nullopt_t() = default;
+ RPC_ATTRS constexpr explicit nullopt_t() = default;
};
constexpr inline in_place_t in_place{};
@@ -80,15 +86,15 @@ template <typename T> class optional {
bool in_use = false;
- RPC_INLINE ~OptionalStorage() { reset(); }
+ RPC_ATTRS ~OptionalStorage() { reset(); }
- RPC_INLINE constexpr OptionalStorage() : empty() {}
+ RPC_ATTRS constexpr OptionalStorage() : empty() {}
template <typename... Args>
- RPC_INLINE constexpr explicit OptionalStorage(in_place_t, Args &&...args)
+ RPC_ATTRS constexpr explicit OptionalStorage(in_place_t, Args &&...args)
: stored_value(forward<Args>(args)...) {}
- RPC_INLINE constexpr void reset() {
+ RPC_ATTRS constexpr void reset() {
if (in_use)
stored_value.~U();
in_use = false;
@@ -98,58 +104,58 @@ template <typename T> class optional {
OptionalStorage<T> storage;
public:
- RPC_INLINE constexpr optional() = default;
- RPC_INLINE constexpr optional(nullopt_t) {}
+ RPC_ATTRS constexpr optional() = default;
+ RPC_ATTRS constexpr optional(nullopt_t) {}
- RPC_INLINE constexpr optional(const T &t) : storage(in_place, t) {
+ RPC_ATTRS constexpr optional(const T &t) : storage(in_place, t) {
storage.in_use = true;
}
- RPC_INLINE constexpr optional(const optional &) = default;
+ RPC_ATTRS constexpr optional(const optional &) = default;
- RPC_INLINE constexpr optional(T &&t) : storage(in_place, move(t)) {
+ RPC_ATTRS constexpr optional(T &&t) : storage(in_place, move(t)) {
storage.in_use = true;
}
- RPC_INLINE constexpr optional(optional &&O) = default;
+ RPC_ATTRS constexpr optional(optional &&O) = default;
- RPC_INLINE constexpr optional &operator=(T &&t) {
+ RPC_ATTRS constexpr optional &operator=(T &&t) {
storage = move(t);
return *this;
}
- RPC_INLINE constexpr optional &operator=(optional &&) = default;
+ RPC_ATTRS constexpr optional &operator=(optional &&) = default;
- RPC_INLINE constexpr optional &operator=(const T &t) {
+ RPC_ATTRS constexpr optional &operator=(const T &t) {
storage = t;
return *this;
}
- RPC_INLINE constexpr optional &operator=(const optional &) = default;
+ RPC_ATTRS constexpr optional &operator=(const optional &) = default;
- RPC_INLINE constexpr void reset() { storage.reset(); }
+ RPC_ATTRS constexpr void reset() { storage.reset(); }
- RPC_INLINE constexpr const T &value() const & { return storage.stored_value; }
+ RPC_ATTRS constexpr const T &value() const & { return storage.stored_value; }
- RPC_INLINE constexpr T &value() & { return storage.stored_value; }
+ RPC_ATTRS constexpr T &value() & { return storage.stored_value; }
- RPC_INLINE constexpr explicit operator bool() const { return storage.in_use; }
- RPC_INLINE constexpr bool has_value() const { return storage.in_use; }
- RPC_INLINE constexpr const T *operator->() const {
+ RPC_ATTRS constexpr explicit operator bool() const { return storage.in_use; }
+ RPC_ATTRS constexpr bool has_value() const { return storage.in_use; }
+ RPC_ATTRS constexpr const T *operator->() const {
return &storage.stored_value;
}
- RPC_INLINE constexpr T *operator->() { return &storage.stored_value; }
- RPC_INLINE constexpr const T &operator*() const & {
+ RPC_ATTRS constexpr T *operator->() { return &storage.stored_value; }
+ RPC_ATTRS constexpr const T &operator*() const & {
return storage.stored_value;
}
- RPC_INLINE constexpr T &operator*() & { return storage.stored_value; }
+ RPC_ATTRS constexpr T &operator*() & { return storage.stored_value; }
- RPC_INLINE constexpr T &&value() && { return move(storage.stored_value); }
- RPC_INLINE constexpr T &&operator*() && { return move(storage.stored_value); }
+ RPC_ATTRS constexpr T &&value() && { return move(storage.stored_value); }
+ RPC_ATTRS constexpr T &&operator*() && { return move(storage.stored_value); }
};
/// Suspend the thread briefly to assist the thread scheduler during busy loops.
-RPC_INLINE void sleep_briefly() {
-#if defined(__NVPTX__)
+RPC_ATTRS void sleep_briefly() {
+#if defined(__NVPTX__) && defined(RPC_TARGET_IS_GPU)
if (__nvvm_reflect("__CUDA_ARCH") >= 700)
asm("nanosleep.u32 64;" ::: "memory");
-#elif defined(__AMDGPU__)
+#elif defined(__AMDGPU__) && defined(RPC_TARGET_IS_GPU)
__builtin_amdgcn_s_sleep(2);
#elif __has_builtin(__builtin_ia32_pause)
__builtin_ia32_pause();
@@ -161,7 +167,7 @@ RPC_INLINE void sleep_briefly() {
}
/// Conditional to indicate if this process is running on the GPU.
-RPC_INLINE constexpr bool is_process_gpu() {
+RPC_ATTRS constexpr bool is_process_gpu() {
#ifdef RPC_TARGET_IS_GPU
return true;
#else
@@ -170,14 +176,15 @@ RPC_INLINE constexpr bool is_process_gpu() {
}
/// Wait for all lanes in the group to complete.
-RPC_INLINE void sync_lane(uint64_t lane_mask) {
+RPC_ATTRS void sync_lane([[maybe_unused]] uint64_t lane_mask) {
#ifdef RPC_TARGET_IS_GPU
return __gpu_sync_lane(lane_mask);
#endif
}
/// Copies the value from the first active thread to the rest.
-RPC_INLINE uint32_t broadcast_value(uint64_t lane_mask, uint32_t x) {
+RPC_ATTRS uint32_t broadcast_value([[maybe_unused]] uint64_t lane_mask,
+ uint32_t x) {
#ifdef RPC_TARGET_IS_GPU
return __gpu_read_first_lane_u32(lane_mask, x);
#else
@@ -186,7 +193,7 @@ RPC_INLINE uint32_t broadcast_value(uint64_t lane_mask, uint32_t x) {
}
/// Returns the number lanes that participate in the RPC interface.
-RPC_INLINE uint32_t get_num_lanes() {
+RPC_ATTRS uint32_t get_num_lanes() {
#ifdef RPC_TARGET_IS_GPU
return __gpu_num_lanes();
#else
@@ -195,7 +202,7 @@ RPC_INLINE uint32_t get_num_lanes() {
}
/// Returns the id of the thread inside of an AMD wavefront executing together.
-RPC_INLINE uint64_t get_lane_mask() {
+RPC_ATTRS uint64_t get_lane_mask() {
#ifdef RPC_TARGET_IS_GPU
return __gpu_lane_mask();
#else
@@ -204,7 +211,7 @@ RPC_INLINE uint64_t get_lane_mask() {
}
/// Returns the id of the thread inside of an AMD wavefront executing together.
-RPC_INLINE uint32_t get_lane_id() {
+RPC_ATTRS uint32_t get_lane_id() {
#ifdef RPC_TARGET_IS_GPU
return __gpu_lane_id();
#else
@@ -213,7 +220,7 @@ RPC_INLINE uint32_t get_lane_id() {
}
/// Conditional that is only true for a single thread in a lane.
-RPC_INLINE bool is_first_lane(uint64_t lane_mask) {
+RPC_ATTRS bool is_first_lane([[maybe_unused]] uint64_t lane_mask) {
#ifdef RPC_TARGET_IS_GPU
return __gpu_is_first_in_lane(lane_mask);
#else
@@ -222,7 +229,7 @@ RPC_INLINE bool is_first_lane(uint64_t lane_mask) {
}
/// Returns a bitmask of threads in the current lane for which \p x is true.
-RPC_INLINE uint64_t ballot(uint64_t lane_mask, bool x) {
+RPC_ATTRS uint64_t ballot([[maybe_unused]] uint64_t lane_mask, bool x) {
#ifdef RPC_TARGET_IS_GPU
return __gpu_ballot(lane_mask, x);
#else
@@ -232,7 +239,7 @@ RPC_INLINE uint64_t ballot(uint64_t lane_mask, bool x) {
/// Return \p val aligned "upwards" according to \p align.
template <typename V, typename A>
-RPC_INLINE constexpr V align_up(V val, A align) {
+RPC_ATTRS constexpr V align_up(V val, A align) {
return ((val + V(align) - 1) / V(align)) * V(align);
}
@@ -240,14 +247,14 @@ RPC_INLINE constexpr V align_up(V val, A align) {
/// model. On the GPU stack variables are always private to a lane so we can
/// simply use the variable passed in. On the CPU we need to allocate enough
/// space for the whole lane and index into it.
-template <typename V> RPC_INLINE V &lane_value(V *val, uint32_t id) {
+template <typename V> RPC_ATTRS V &lane_value(V *val, uint32_t id) {
if constexpr (is_process_gpu())
return *val;
return val[id];
}
/// Advance the \p p by \p bytes.
-template <typename T, typename U> RPC_INLINE T *advance(T *ptr, U bytes) {
+template <typename T, typename U> RPC_ATTRS T *advance(T *ptr, U bytes) {
if constexpr (is_const<T>::value)
return reinterpret_cast<T *>(reinterpret_cast<const uint8_t *>(ptr) +
bytes);
@@ -256,11 +263,11 @@ template <typename T, typename U> RPC_INLINE T *advance(T *ptr, U bytes) {
}
/// Wrapper around the optimal memory copy implementation for the target.
-RPC_INLINE void rpc_memcpy(void *dst, const void *src, size_t count) {
+RPC_ATTRS void rpc_memcpy(void *dst, const void *src, size_t count) {
__builtin_memcpy(dst, src, count);
}
-template <class T> RPC_INLINE constexpr const T &max(const T &a, const T &b) {
+template <class T> RPC_ATTRS constexpr const T &max(const T &a, const T &b) {
return (a < b) ? b : a;
}
diff --git a/libc/src/CMakeLists.txt b/libc/src/CMakeLists.txt
index 02c193e63536..9fc331ad18a3 100644
--- a/libc/src/CMakeLists.txt
+++ b/libc/src/CMakeLists.txt
@@ -12,7 +12,9 @@ add_subdirectory(stdfix)
add_subdirectory(stdio)
add_subdirectory(stdlib)
add_subdirectory(string)
+add_subdirectory(strings)
add_subdirectory(wchar)
+add_subdirectory(time)
if(${LIBC_TARGET_OS} STREQUAL "linux")
add_subdirectory(dirent)
@@ -32,13 +34,12 @@ if(NOT LLVM_LIBC_FULL_BUILD)
return()
endif()
+add_subdirectory(arpa)
add_subdirectory(assert)
add_subdirectory(compiler)
-add_subdirectory(network)
+add_subdirectory(locale)
add_subdirectory(search)
add_subdirectory(setjmp)
add_subdirectory(signal)
add_subdirectory(spawn)
add_subdirectory(threads)
-add_subdirectory(time)
-add_subdirectory(locale)
diff --git a/libc/src/__support/CMakeLists.txt b/libc/src/__support/CMakeLists.txt
index 8f85740f70a0..4e90aad9a45b 100644
--- a/libc/src/__support/CMakeLists.txt
+++ b/libc/src/__support/CMakeLists.txt
@@ -48,13 +48,19 @@ add_header_library(
.freetrie
)
-add_header_library(
+add_object_library(
freelist_heap
+ SRCS
+ freelist_heap.cpp
HDRS
freelist_heap.h
+ COMPILE_OPTIONS
+ -DLIBC_FREELIST_MALLOC_SIZE=${LIBC_CONF_FREELIST_MALLOC_BUFFER_SIZE}
DEPENDS
.block
+ .freelist
.freestore
+ .freetrie
libc.src.__support.CPP.cstddef
libc.src.__support.CPP.array
libc.src.__support.CPP.optional
@@ -235,6 +241,11 @@ add_header_library(
complex_type
HDRS
complex_type.h
+ DEPENDS
+ libc.src.__support.CPP.bit
+ libc.src.__support.FPUtil.fp_bits
+ libc.src.__support.macros.properties.types
+ libc.src.__support.macros.properties.complex_types
)
add_header_library(
diff --git a/libc/src/__support/CPP/atomic.h b/libc/src/__support/CPP/atomic.h
index 72e7f2adde6a..287dcac98fbb 100644
--- a/libc/src/__support/CPP/atomic.h
+++ b/libc/src/__support/CPP/atomic.h
@@ -9,6 +9,7 @@
#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_ATOMIC_H
#define LLVM_LIBC_SRC___SUPPORT_CPP_ATOMIC_H
+#include "src/__support/CPP/type_traits/has_unique_object_representations.h"
#include "src/__support/macros/attributes.h"
#include "src/__support/macros/config.h"
#include "src/__support/macros/properties/architectures.h"
@@ -40,15 +41,37 @@ enum class MemoryScope : int {
};
template <typename T> struct Atomic {
- // For now, we will restrict to only arithmetic types.
- static_assert(is_arithmetic_v<T>, "Only arithmetic types can be atomic.");
+ static_assert(is_trivially_copyable_v<T> && is_copy_constructible_v<T> &&
+ is_move_constructible_v<T> && is_copy_assignable_v<T> &&
+ is_move_assignable_v<T>,
+ "atomic<T> requires T to be trivially copyable, copy "
+ "constructible, move constructible, copy assignable, "
+ "and move assignable.");
+
+ static_assert(cpp::has_unique_object_representations_v<T>,
+ "atomic<T> in libc only support types whose values has unique "
+ "object representations.");
private:
- // The value stored should be appropriately aligned so that
- // hardware instructions used to perform atomic operations work
- // correctly.
- static constexpr int ALIGNMENT = sizeof(T) > alignof(T) ? sizeof(T)
- : alignof(T);
+ // type conversion helper to avoid long c++ style casts
+ LIBC_INLINE static int order(MemoryOrder mem_ord) {
+ return static_cast<int>(mem_ord);
+ }
+
+ LIBC_INLINE static int scope(MemoryScope mem_scope) {
+ return static_cast<int>(mem_scope);
+ }
+
+ LIBC_INLINE static T *addressof(T &ref) { return __builtin_addressof(ref); }
+
+ // Require types that are 1, 2, 4, 8, or 16 bytes in length to be aligned to
+ // at least their size to be potentially used lock-free.
+ LIBC_INLINE_VAR static constexpr size_t MIN_ALIGNMENT =
+ (sizeof(T) & (sizeof(T) - 1)) || (sizeof(T) > 16) ? 0 : sizeof(T);
+
+ LIBC_INLINE_VAR static constexpr size_t ALIGNMENT = alignof(T) > MIN_ALIGNMENT
+ ? alignof(T)
+ : MIN_ALIGNMENT;
public:
using value_type = T;
@@ -59,139 +82,160 @@ public:
// operations should be performed using the atomic methods however.
alignas(ALIGNMENT) value_type val;
- constexpr Atomic() = default;
+ LIBC_INLINE constexpr Atomic() = default;
// Intializes the value without using atomic operations.
- constexpr Atomic(value_type v) : val(v) {}
+ LIBC_INLINE constexpr Atomic(value_type v) : val(v) {}
- Atomic(const Atomic &) = delete;
- Atomic &operator=(const Atomic &) = delete;
+ LIBC_INLINE Atomic(const Atomic &) = delete;
+ LIBC_INLINE Atomic &operator=(const Atomic &) = delete;
// Atomic load.
- operator T() { return __atomic_load_n(&val, int(MemoryOrder::SEQ_CST)); }
+ LIBC_INLINE operator T() { return load(); }
- T load(MemoryOrder mem_ord = MemoryOrder::SEQ_CST,
- [[maybe_unused]] MemoryScope mem_scope = MemoryScope::DEVICE) {
-#if __has_builtin(__scoped_atomic_load_n)
- return __scoped_atomic_load_n(&val, int(mem_ord), (int)(mem_scope));
+ LIBC_INLINE T
+ load(MemoryOrder mem_ord = MemoryOrder::SEQ_CST,
+ [[maybe_unused]] MemoryScope mem_scope = MemoryScope::DEVICE) {
+ T res;
+#if __has_builtin(__scoped_atomic_load)
+ __scoped_atomic_load(addressof(val), addressof(res), order(mem_ord),
+ scope(mem_scope));
#else
- return __atomic_load_n(&val, int(mem_ord));
+ __atomic_load(addressof(val), addressof(res), order(mem_ord));
#endif
+ return res;
}
// Atomic store.
- T operator=(T rhs) {
- __atomic_store_n(&val, rhs, int(MemoryOrder::SEQ_CST));
+ LIBC_INLINE T operator=(T rhs) {
+ store(rhs);
return rhs;
}
- void store(T rhs, MemoryOrder mem_ord = MemoryOrder::SEQ_CST,
- [[maybe_unused]] MemoryScope mem_scope = MemoryScope::DEVICE) {
-#if __has_builtin(__scoped_atomic_store_n)
- __scoped_atomic_store_n(&val, rhs, int(mem_ord), (int)(mem_scope));
+ LIBC_INLINE void
+ store(T rhs, MemoryOrder mem_ord = MemoryOrder::SEQ_CST,
+ [[maybe_unused]] MemoryScope mem_scope = MemoryScope::DEVICE) {
+#if __has_builtin(__scoped_atomic_store)
+ __scoped_atomic_store(addressof(val), addressof(rhs), order(mem_ord),
+ scope(mem_scope));
#else
- __atomic_store_n(&val, rhs, int(mem_ord));
+ __atomic_store(addressof(val), addressof(rhs), order(mem_ord));
#endif
}
// Atomic compare exchange
- bool compare_exchange_strong(
+ LIBC_INLINE bool compare_exchange_strong(
T &expected, T desired, MemoryOrder mem_ord = MemoryOrder::SEQ_CST,
[[maybe_unused]] MemoryScope mem_scope = MemoryScope::DEVICE) {
- return __atomic_compare_exchange_n(&val, &expected, desired, false,
- int(mem_ord), int(mem_ord));
+ return __atomic_compare_exchange(addressof(val), addressof(expected),
+ addressof(desired), false, order(mem_ord),
+ order(mem_ord));
}
// Atomic compare exchange (separate success and failure memory orders)
- bool compare_exchange_strong(
+ LIBC_INLINE bool compare_exchange_strong(
T &expected, T desired, MemoryOrder success_order,
MemoryOrder failure_order,
[[maybe_unused]] MemoryScope mem_scope = MemoryScope::DEVICE) {
- return __atomic_compare_exchange_n(&val, &expected, desired, false,
- static_cast<int>(success_order),
- static_cast<int>(failure_order));
+ return __atomic_compare_exchange(
+ addressof(val), addressof(expected), addressof(desired), false,
+ order(success_order), order(failure_order));
}
// Atomic compare exchange (weak version)
- bool compare_exchange_weak(
+ LIBC_INLINE bool compare_exchange_weak(
T &expected, T desired, MemoryOrder mem_ord = MemoryOrder::SEQ_CST,
[[maybe_unused]] MemoryScope mem_scope = MemoryScope::DEVICE) {
- return __atomic_compare_exchange_n(&val, &expected, desired, true,
- static_cast<int>(mem_ord),
- static_cast<int>(mem_ord));
+ return __atomic_compare_exchange(addressof(val), addressof(expected),
+ addressof(desired), true, order(mem_ord),
+ order(mem_ord));
}
// Atomic compare exchange (weak version with separate success and failure
// memory orders)
- bool compare_exchange_weak(
+ LIBC_INLINE bool compare_exchange_weak(
T &expected, T desired, MemoryOrder success_order,
MemoryOrder failure_order,
[[maybe_unused]] MemoryScope mem_scope = MemoryScope::DEVICE) {
- return __atomic_compare_exchange_n(&val, &expected, desired, true,
- static_cast<int>(success_order),
- static_cast<int>(failure_order));
+ return __atomic_compare_exchange(
+ addressof(val), addressof(expected), addressof(desired), true,
+ order(success_order), order(failure_order));
}
- T exchange(T desired, MemoryOrder mem_ord = MemoryOrder::SEQ_CST,
- [[maybe_unused]] MemoryScope mem_scope = MemoryScope::DEVICE) {
-#if __has_builtin(__scoped_atomic_exchange_n)
- return __scoped_atomic_exchange_n(&val, desired, int(mem_ord),
- (int)(mem_scope));
+ LIBC_INLINE T
+ exchange(T desired, MemoryOrder mem_ord = MemoryOrder::SEQ_CST,
+ [[maybe_unused]] MemoryScope mem_scope = MemoryScope::DEVICE) {
+ T ret;
+#if __has_builtin(__scoped_atomic_exchange)
+ __scoped_atomic_exchange(addressof(val), addressof(desired), addressof(ret),
+ order(mem_ord), scope(mem_scope));
#else
- return __atomic_exchange_n(&val, desired, int(mem_ord));
+ __atomic_exchange(addressof(val), addressof(desired), addressof(ret),
+ order(mem_ord));
#endif
+ return ret;
}
- T fetch_add(T increment, MemoryOrder mem_ord = MemoryOrder::SEQ_CST,
- [[maybe_unused]] MemoryScope mem_scope = MemoryScope::DEVICE) {
+ LIBC_INLINE T
+ fetch_add(T increment, MemoryOrder mem_ord = MemoryOrder::SEQ_CST,
+ [[maybe_unused]] MemoryScope mem_scope = MemoryScope::DEVICE) {
+ static_assert(cpp::is_integral_v<T>, "T must be an integral type.");
#if __has_builtin(__scoped_atomic_fetch_add)
- return __scoped_atomic_fetch_add(&val, increment, int(mem_ord),
- (int)(mem_scope));
+ return __scoped_atomic_fetch_add(addressof(val), increment, order(mem_ord),
+ scope(mem_scope));
#else
- return __atomic_fetch_add(&val, increment, int(mem_ord));
+ return __atomic_fetch_add(addressof(val), increment, order(mem_ord));
#endif
}
- T fetch_or(T mask, MemoryOrder mem_ord = MemoryOrder::SEQ_CST,
- [[maybe_unused]] MemoryScope mem_scope = MemoryScope::DEVICE) {
+ LIBC_INLINE T
+ fetch_or(T mask, MemoryOrder mem_ord = MemoryOrder::SEQ_CST,
+ [[maybe_unused]] MemoryScope mem_scope = MemoryScope::DEVICE) {
+ static_assert(cpp::is_integral_v<T>, "T must be an integral type.");
#if __has_builtin(__scoped_atomic_fetch_or)
- return __scoped_atomic_fetch_or(&val, mask, int(mem_ord), (int)(mem_scope));
+ return __scoped_atomic_fetch_or(addressof(val), mask, order(mem_ord),
+ scope(mem_scope));
#else
- return __atomic_fetch_or(&val, mask, int(mem_ord));
+ return __atomic_fetch_or(addressof(val), mask, order(mem_ord));
#endif
}
- T fetch_and(T mask, MemoryOrder mem_ord = MemoryOrder::SEQ_CST,
- [[maybe_unused]] MemoryScope mem_scope = MemoryScope::DEVICE) {
+ LIBC_INLINE T
+ fetch_and(T mask, MemoryOrder mem_ord = MemoryOrder::SEQ_CST,
+ [[maybe_unused]] MemoryScope mem_scope = MemoryScope::DEVICE) {
+ static_assert(cpp::is_integral_v<T>, "T must be an integral type.");
#if __has_builtin(__scoped_atomic_fetch_and)
- return __scoped_atomic_fetch_and(&val, mask, int(mem_ord),
- (int)(mem_scope));
+ return __scoped_atomic_fetch_and(addressof(val), mask, order(mem_ord),
+ scope(mem_scope));
#else
- return __atomic_fetch_and(&val, mask, int(mem_ord));
+ return __atomic_fetch_and(addressof(val), mask, order(mem_ord));
#endif
}
- T fetch_sub(T decrement, MemoryOrder mem_ord = MemoryOrder::SEQ_CST,
- [[maybe_unused]] MemoryScope mem_scope = MemoryScope::DEVICE) {
+ LIBC_INLINE T
+ fetch_sub(T decrement, MemoryOrder mem_ord = MemoryOrder::SEQ_CST,
+ [[maybe_unused]] MemoryScope mem_scope = MemoryScope::DEVICE) {
+ static_assert(cpp::is_integral_v<T>, "T must be an integral type.");
#if __has_builtin(__scoped_atomic_fetch_sub)
- return __scoped_atomic_fetch_sub(&val, decrement, int(mem_ord),
- (int)(mem_scope));
+ return __scoped_atomic_fetch_sub(addressof(val), decrement, order(mem_ord),
+ scope(mem_scope));
#else
- return __atomic_fetch_sub(&val, decrement, int(mem_ord));
+ return __atomic_fetch_sub(addressof(val), decrement, order(mem_ord));
#endif
}
// Set the value without using an atomic operation. This is useful
// in initializing atomic values without a constructor.
- void set(T rhs) { val = rhs; }
+ LIBC_INLINE void set(T rhs) { val = rhs; }
};
// Issue a thread fence with the given memory ordering.
-LIBC_INLINE void atomic_thread_fence([[maybe_unused]] MemoryOrder mem_ord) {
-// The NVPTX backend currently does not support atomic thread fences so we use a
-// full system fence instead.
-#ifdef LIBC_TARGET_ARCH_IS_NVPTX
- __nvvm_membar_sys();
+LIBC_INLINE void atomic_thread_fence(
+ MemoryOrder mem_ord,
+ [[maybe_unused]] MemoryScope mem_scope = MemoryScope::DEVICE) {
+#if __has_builtin(__scoped_atomic_thread_fence)
+ __scoped_atomic_thread_fence(static_cast<int>(mem_ord),
+ static_cast<int>(mem_scope));
#else
__atomic_thread_fence(static_cast<int>(mem_ord));
#endif
diff --git a/libc/src/__support/CPP/type_traits.h b/libc/src/__support/CPP/type_traits.h
index d50b6612656d..910cebbb8d05 100644
--- a/libc/src/__support/CPP/type_traits.h
+++ b/libc/src/__support/CPP/type_traits.h
@@ -18,6 +18,7 @@
#include "src/__support/CPP/type_traits/decay.h"
#include "src/__support/CPP/type_traits/enable_if.h"
#include "src/__support/CPP/type_traits/false_type.h"
+#include "src/__support/CPP/type_traits/has_unique_object_representations.h"
#include "src/__support/CPP/type_traits/integral_constant.h"
#include "src/__support/CPP/type_traits/invoke.h"
#include "src/__support/CPP/type_traits/invoke_result.h"
@@ -28,6 +29,8 @@
#include "src/__support/CPP/type_traits/is_const.h"
#include "src/__support/CPP/type_traits/is_constant_evaluated.h"
#include "src/__support/CPP/type_traits/is_convertible.h"
+#include "src/__support/CPP/type_traits/is_copy_assignable.h"
+#include "src/__support/CPP/type_traits/is_copy_constructible.h"
#include "src/__support/CPP/type_traits/is_destructible.h"
#include "src/__support/CPP/type_traits/is_enum.h"
#include "src/__support/CPP/type_traits/is_fixed_point.h"
@@ -36,6 +39,8 @@
#include "src/__support/CPP/type_traits/is_integral.h"
#include "src/__support/CPP/type_traits/is_lvalue_reference.h"
#include "src/__support/CPP/type_traits/is_member_pointer.h"
+#include "src/__support/CPP/type_traits/is_move_assignable.h"
+#include "src/__support/CPP/type_traits/is_move_constructible.h"
#include "src/__support/CPP/type_traits/is_null_pointer.h"
#include "src/__support/CPP/type_traits/is_object.h"
#include "src/__support/CPP/type_traits/is_pointer.h"
diff --git a/libc/src/__support/CPP/type_traits/has_unique_object_representations.h b/libc/src/__support/CPP/type_traits/has_unique_object_representations.h
new file mode 100644
index 000000000000..639fb69d2720
--- /dev/null
+++ b/libc/src/__support/CPP/type_traits/has_unique_object_representations.h
@@ -0,0 +1,30 @@
+//===-- has_unique_object_representations type_traits ------------*- C++-*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_HAS_UNIQUE_OBJECT_REPRESENTATIONS_H
+#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_HAS_UNIQUE_OBJECT_REPRESENTATIONS_H
+
+#include "src/__support/CPP/type_traits/integral_constant.h"
+#include "src/__support/CPP/type_traits/remove_all_extents.h"
+#include "src/__support/macros/config.h"
+
+namespace LIBC_NAMESPACE_DECL {
+namespace cpp {
+
+template <class T>
+struct has_unique_object_representations
+ : public integral_constant<bool, __has_unique_object_representations(
+ remove_all_extents_t<T>)> {};
+
+template <class T>
+LIBC_INLINE_VAR constexpr bool has_unique_object_representations_v =
+ has_unique_object_representations<T>::value;
+
+} // namespace cpp
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_HAS_UNIQUE_OBJECT_REPRESENTATIONS_H
diff --git a/libc/src/__support/CPP/type_traits/is_copy_assignable.h b/libc/src/__support/CPP/type_traits/is_copy_assignable.h
new file mode 100644
index 000000000000..9beb93d14668
--- /dev/null
+++ b/libc/src/__support/CPP/type_traits/is_copy_assignable.h
@@ -0,0 +1,32 @@
+//===-- is_copy_assignable type_traits --------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_COPY_ASSIGNABLE_H
+#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_COPY_ASSIGNABLE_H
+
+#include "src/__support/CPP/type_traits/add_lvalue_reference.h"
+#include "src/__support/CPP/type_traits/integral_constant.h"
+#include "src/__support/macros/config.h"
+
+namespace LIBC_NAMESPACE_DECL {
+namespace cpp {
+
+// is copy assignable
+template <class T>
+struct is_copy_assignable
+ : public integral_constant<
+ bool, __is_assignable(cpp::add_lvalue_reference_t<T>,
+ cpp::add_lvalue_reference_t<const T>)> {};
+
+template <class T>
+LIBC_INLINE_VAR constexpr bool is_copy_assignable_v =
+ is_copy_assignable<T>::value;
+
+} // namespace cpp
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_COPY_ASSIGNABLE_H
diff --git a/libc/src/__support/CPP/type_traits/is_copy_constructible.h b/libc/src/__support/CPP/type_traits/is_copy_constructible.h
new file mode 100644
index 000000000000..d8eb9ad3507e
--- /dev/null
+++ b/libc/src/__support/CPP/type_traits/is_copy_constructible.h
@@ -0,0 +1,31 @@
+//===-- is_copy_constructible type_traits -----------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_COPY_CONSTRUCTIBLE_H
+#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_COPY_CONSTRUCTIBLE_H
+
+#include "src/__support/CPP/type_traits/add_lvalue_reference.h"
+#include "src/__support/CPP/type_traits/integral_constant.h"
+#include "src/__support/macros/config.h"
+
+namespace LIBC_NAMESPACE_DECL {
+namespace cpp {
+
+// is copy constructible
+template <class T>
+struct is_copy_constructible
+ : public integral_constant<
+ bool, __is_constructible(T, cpp::add_lvalue_reference_t<const T>)> {};
+
+template <class T>
+LIBC_INLINE_VAR constexpr bool is_copy_constructible_v =
+ is_copy_constructible<T>::value;
+
+} // namespace cpp
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_COPY_CONSTRUCTIBLE_H
diff --git a/libc/src/__support/CPP/type_traits/is_move_assignable.h b/libc/src/__support/CPP/type_traits/is_move_assignable.h
new file mode 100644
index 000000000000..a788bd9074e3
--- /dev/null
+++ b/libc/src/__support/CPP/type_traits/is_move_assignable.h
@@ -0,0 +1,33 @@
+//===-- is_move_assignable type_traits --------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_MOVE_ASSIGNABLE_H
+#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_MOVE_ASSIGNABLE_H
+
+#include "src/__support/CPP/type_traits/add_lvalue_reference.h"
+#include "src/__support/CPP/type_traits/add_rvalue_reference.h"
+#include "src/__support/CPP/type_traits/integral_constant.h"
+#include "src/__support/macros/config.h"
+
+namespace LIBC_NAMESPACE_DECL {
+namespace cpp {
+
+// is move assignable
+template <class T>
+struct is_move_assignable
+ : public integral_constant<bool, __is_assignable(
+ cpp::add_lvalue_reference_t<T>,
+ cpp::add_rvalue_reference_t<T>)> {};
+
+template <class T>
+LIBC_INLINE_VAR constexpr bool is_move_assignable_v =
+ is_move_assignable<T>::value;
+
+} // namespace cpp
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_MOVE_ASSIGNABLE_H
diff --git a/libc/src/__support/CPP/type_traits/is_move_constructible.h b/libc/src/__support/CPP/type_traits/is_move_constructible.h
new file mode 100644
index 000000000000..c89896054625
--- /dev/null
+++ b/libc/src/__support/CPP/type_traits/is_move_constructible.h
@@ -0,0 +1,31 @@
+//===-- is_move_constructible type_traits ------------------------*- C++-*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_MOVE_CONSTRUCTIBLE_H
+#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_MOVE_CONSTRUCTIBLE_H
+
+#include "src/__support/CPP/type_traits/add_rvalue_reference.h"
+#include "src/__support/CPP/type_traits/integral_constant.h"
+#include "src/__support/macros/config.h"
+
+namespace LIBC_NAMESPACE_DECL {
+namespace cpp {
+
+// is move constructible
+template <class T>
+struct is_move_constructible
+ : public integral_constant<bool, __is_constructible(
+ T, cpp::add_rvalue_reference_t<T>)> {};
+
+template <class T>
+LIBC_INLINE_VAR constexpr bool is_move_constructible_v =
+ is_move_constructible<T>::value;
+
+} // namespace cpp
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_MOVE_CONSTRUCTIBLE_H
diff --git a/libc/src/__support/CPP/type_traits/is_trivially_copyable.h b/libc/src/__support/CPP/type_traits/is_trivially_copyable.h
index 68e56c854783..a3e786fe1d14 100644
--- a/libc/src/__support/CPP/type_traits/is_trivially_copyable.h
+++ b/libc/src/__support/CPP/type_traits/is_trivially_copyable.h
@@ -19,6 +19,10 @@ template <class T>
struct is_trivially_copyable
: public integral_constant<bool, __is_trivially_copyable(T)> {};
+template <class T>
+LIBC_INLINE_VAR constexpr bool is_trivially_copyable_v =
+ is_trivially_copyable<T>::value;
+
} // namespace cpp
} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/__support/FPUtil/aarch64/FEnvImpl.h b/libc/src/__support/FPUtil/aarch64/FEnvImpl.h
index 3cea9772154f..18b0631324f8 100644
--- a/libc/src/__support/FPUtil/aarch64/FEnvImpl.h
+++ b/libc/src/__support/FPUtil/aarch64/FEnvImpl.h
@@ -26,7 +26,6 @@
namespace LIBC_NAMESPACE_DECL {
namespace fputil {
-
struct FEnv {
struct FPState {
uint32_t ControlWord;
@@ -42,11 +41,11 @@ struct FEnv {
static constexpr uint32_t DOWNWARD = 0x2;
static constexpr uint32_t TOWARDZERO = 0x3;
- static constexpr uint32_t INVALID = 0x1;
- static constexpr uint32_t DIVBYZERO = 0x2;
- static constexpr uint32_t OVERFLOW = 0x4;
- static constexpr uint32_t UNDERFLOW = 0x8;
- static constexpr uint32_t INEXACT = 0x10;
+ static constexpr uint32_t INVALID_F = 0x1;
+ static constexpr uint32_t DIVBYZERO_F = 0x2;
+ static constexpr uint32_t OVERFLOW_F = 0x4;
+ static constexpr uint32_t UNDERFLOW_F = 0x8;
+ static constexpr uint32_t INEXACT_F = 0x10;
// Zero-th bit is the first bit.
static constexpr uint32_t RoundingControlBitPosition = 22;
@@ -54,19 +53,19 @@ struct FEnv {
static constexpr uint32_t ExceptionControlFlagsBitPosition = 8;
LIBC_INLINE static uint32_t getStatusValueForExcept(int excepts) {
- return ((excepts & FE_INVALID) ? INVALID : 0) |
- ((excepts & FE_DIVBYZERO) ? DIVBYZERO : 0) |
- ((excepts & FE_OVERFLOW) ? OVERFLOW : 0) |
- ((excepts & FE_UNDERFLOW) ? UNDERFLOW : 0) |
- ((excepts & FE_INEXACT) ? INEXACT : 0);
+ return ((excepts & FE_INVALID) ? INVALID_F : 0) |
+ ((excepts & FE_DIVBYZERO) ? DIVBYZERO_F : 0) |
+ ((excepts & FE_OVERFLOW) ? OVERFLOW_F : 0) |
+ ((excepts & FE_UNDERFLOW) ? UNDERFLOW_F : 0) |
+ ((excepts & FE_INEXACT) ? INEXACT_F : 0);
}
LIBC_INLINE static int exceptionStatusToMacro(uint32_t status) {
- return ((status & INVALID) ? FE_INVALID : 0) |
- ((status & DIVBYZERO) ? FE_DIVBYZERO : 0) |
- ((status & OVERFLOW) ? FE_OVERFLOW : 0) |
- ((status & UNDERFLOW) ? FE_UNDERFLOW : 0) |
- ((status & INEXACT) ? FE_INEXACT : 0);
+ return ((status & INVALID_F) ? FE_INVALID : 0) |
+ ((status & DIVBYZERO_F) ? FE_DIVBYZERO : 0) |
+ ((status & OVERFLOW_F) ? FE_OVERFLOW : 0) |
+ ((status & UNDERFLOW_F) ? FE_UNDERFLOW : 0) |
+ ((status & INEXACT_F) ? FE_INEXACT : 0);
}
static uint32_t getControlWord() {
@@ -171,36 +170,36 @@ LIBC_INLINE int raise_except(int excepts) {
uint32_t toRaise = FEnv::getStatusValueForExcept(excepts);
int result = 0;
- if (toRaise & FEnv::INVALID) {
+ if (toRaise & FEnv::INVALID_F) {
divfunc(zero, zero);
uint32_t statusWord = FEnv::getStatusWord();
if (!((statusWord >> FEnv::ExceptionStatusFlagsBitPosition) &
- FEnv::INVALID))
+ FEnv::INVALID_F))
result = -1;
}
- if (toRaise & FEnv::DIVBYZERO) {
+ if (toRaise & FEnv::DIVBYZERO_F) {
divfunc(one, zero);
uint32_t statusWord = FEnv::getStatusWord();
if (!((statusWord >> FEnv::ExceptionStatusFlagsBitPosition) &
- FEnv::DIVBYZERO))
+ FEnv::DIVBYZERO_F))
result = -1;
}
- if (toRaise & FEnv::OVERFLOW) {
+ if (toRaise & FEnv::OVERFLOW_F) {
divfunc(largeValue, smallValue);
uint32_t statusWord = FEnv::getStatusWord();
if (!((statusWord >> FEnv::ExceptionStatusFlagsBitPosition) &
- FEnv::OVERFLOW))
+ FEnv::OVERFLOW_F))
result = -1;
}
- if (toRaise & FEnv::UNDERFLOW) {
+ if (toRaise & FEnv::UNDERFLOW_F) {
divfunc(smallValue, largeValue);
uint32_t statusWord = FEnv::getStatusWord();
if (!((statusWord >> FEnv::ExceptionStatusFlagsBitPosition) &
- FEnv::UNDERFLOW))
+ FEnv::UNDERFLOW_F))
result = -1;
}
- if (toRaise & FEnv::INEXACT) {
+ if (toRaise & FEnv::INEXACT_F) {
float two = 2.0f;
float three = 3.0f;
// 2.0 / 3.0 cannot be represented exactly in any radix 2 floating point
@@ -208,7 +207,7 @@ LIBC_INLINE int raise_except(int excepts) {
divfunc(two, three);
uint32_t statusWord = FEnv::getStatusWord();
if (!((statusWord >> FEnv::ExceptionStatusFlagsBitPosition) &
- FEnv::INEXACT))
+ FEnv::INEXACT_F))
result = -1;
}
return result;
@@ -278,7 +277,6 @@ LIBC_INLINE int set_env(const fenv_t *envp) {
FEnv::writeStatusWord(state->StatusWord);
return 0;
}
-
} // namespace fputil
} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/__support/RPC/CMakeLists.txt b/libc/src/__support/RPC/CMakeLists.txt
index 0a7141fb60bf..cac9c4e05e36 100644
--- a/libc/src/__support/RPC/CMakeLists.txt
+++ b/libc/src/__support/RPC/CMakeLists.txt
@@ -9,6 +9,5 @@ add_object_library(
HDRS
rpc_client.h
DEPENDS
- libc.include.gpu_rpc
libc.src.__support.GPU.utils
)
diff --git a/libc/src/__support/complex_type.h b/libc/src/__support/complex_type.h
index d6b5eec8fd6b..f72ce8a4efd1 100644
--- a/libc/src/__support/complex_type.h
+++ b/libc/src/__support/complex_type.h
@@ -9,12 +9,86 @@
#ifndef LLVM_LIBC_SRC___SUPPORT_COMPLEX_TYPE_H
#define LLVM_LIBC_SRC___SUPPORT_COMPLEX_TYPE_H
+#include "src/__support/CPP/bit.h"
+#include "src/__support/FPUtil/FPBits.h"
#include "src/__support/macros/config.h"
+#include "src/__support/macros/properties/complex_types.h"
+#include "src/__support/macros/properties/types.h"
namespace LIBC_NAMESPACE_DECL {
template <typename T> struct Complex {
T real;
T imag;
};
+
+template <typename T> struct make_complex;
+
+template <> struct make_complex<float> {
+ using type = _Complex float;
+};
+template <> struct make_complex<double> {
+ using type = _Complex double;
+};
+template <> struct make_complex<long double> {
+ using type = _Complex long double;
+};
+
+#if defined(LIBC_TYPES_HAS_CFLOAT16)
+template <> struct make_complex<float16> {
+ using type = cfloat16;
+};
+#endif
+#ifdef LIBC_TYPES_CFLOAT128_IS_NOT_COMPLEX_LONG_DOUBLE
+template <> struct make_complex<float128> {
+ using type = cfloat128;
+};
+#endif
+
+template <typename T> using make_complex_t = typename make_complex<T>::type;
+
+template <typename T> struct make_real;
+
+template <> struct make_real<_Complex float> {
+ using type = float;
+};
+template <> struct make_real<_Complex double> {
+ using type = double;
+};
+template <> struct make_real<_Complex long double> {
+ using type = long double;
+};
+
+#if defined(LIBC_TYPES_HAS_CFLOAT16)
+template <> struct make_real<cfloat16> {
+ using type = float16;
+};
+#endif
+#ifdef LIBC_TYPES_CFLOAT128_IS_NOT_COMPLEX_LONG_DOUBLE
+template <> struct make_real<cfloat128> {
+ using type = float128;
+};
+#endif
+
+template <typename T> using make_real_t = typename make_real<T>::type;
+
+template <typename T> LIBC_INLINE constexpr T conjugate(T c) {
+ Complex<make_real_t<T>> c_c = cpp::bit_cast<Complex<make_real_t<T>>>(c);
+ c_c.imag = -c_c.imag;
+ return cpp::bit_cast<T>(c_c);
+}
+
+template <typename T> LIBC_INLINE constexpr T project(T c) {
+ using real_t = make_real_t<T>;
+ Complex<real_t> c_c = cpp::bit_cast<Complex<real_t>>(c);
+ if (fputil::FPBits<real_t>(c_c.real).is_inf() ||
+ fputil::FPBits<real_t>(c_c.imag).is_inf()) {
+ return cpp::bit_cast<T>(
+ Complex<real_t>{(fputil::FPBits<real_t>::inf(Sign::POS).get_val()),
+ static_cast<real_t>(c_c.imag > 0 ? 0.0 : -0.0)});
+ } else {
+ return c;
+ }
+}
+
} // namespace LIBC_NAMESPACE_DECL
#endif // LLVM_LIBC_SRC___SUPPORT_COMPLEX_TYPE_H
diff --git a/libc/src/__support/freelist_heap.cpp b/libc/src/__support/freelist_heap.cpp
new file mode 100644
index 000000000000..4deb0e0f09e2
--- /dev/null
+++ b/libc/src/__support/freelist_heap.cpp
@@ -0,0 +1,19 @@
+//===-- Implementation for freelist_heap ----------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "src/__support/freelist_heap.h"
+#include "src/__support/macros/config.h"
+
+#include <stddef.h>
+
+namespace LIBC_NAMESPACE_DECL {
+
+static LIBC_CONSTINIT FreeListHeap freelist_heap_symbols;
+FreeListHeap *freelist_heap = &freelist_heap_symbols;
+
+} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/__support/macros/properties/complex_types.h b/libc/src/__support/macros/properties/complex_types.h
index 3f4a7646649c..ede4d6b7c7d9 100644
--- a/libc/src/__support/macros/properties/complex_types.h
+++ b/libc/src/__support/macros/properties/complex_types.h
@@ -22,4 +22,9 @@
// LIBC_TYPES_HAS_CFLOAT128 and 'cfloat128' type are provided by
// "include/llvm-libc-types/cfloat128.h"
+#if defined(LIBC_TYPES_HAS_CFLOAT128) && \
+ !defined(LIBC_TYPES_CFLOAT128_IS_COMPLEX_LONG_DOUBLE)
+#define LIBC_TYPES_CFLOAT128_IS_NOT_COMPLEX_LONG_DOUBLE
+#endif
+
#endif // LLVM_LIBC_SRC___SUPPORT_MACROS_PROPERTIES_CTYPES_H
diff --git a/libc/src/__support/macros/properties/os.h b/libc/src/__support/macros/properties/os.h
index 1c8fd5721ce6..807ce1812735 100644
--- a/libc/src/__support/macros/properties/os.h
+++ b/libc/src/__support/macros/properties/os.h
@@ -25,18 +25,6 @@
#define LIBC_TARGET_OS_IS_WINDOWS
#endif
-#if (defined(__apple__) || defined(__APPLE__) || defined(__MACH__))
-// From https://stackoverflow.com/a/49560690
-#include "TargetConditionals.h"
-#if defined(TARGET_OS_OSX)
-#define LIBC_TARGET_OS_IS_MACOS
-#endif
-#if defined(TARGET_OS_IPHONE)
-// This is set for any non-Mac Apple products (IOS, TV, WATCH)
-#define LIBC_TARGET_OS_IS_IPHONE
-#endif
-#endif
-
#if defined(__Fuchsia__)
#define LIBC_TARGET_OS_IS_FUCHSIA
#endif
diff --git a/libc/src/__support/macros/properties/types.h b/libc/src/__support/macros/properties/types.h
index 30c742c007ca..6293b9d4d292 100644
--- a/libc/src/__support/macros/properties/types.h
+++ b/libc/src/__support/macros/properties/types.h
@@ -31,6 +31,11 @@
#define LIBC_TYPES_LONG_DOUBLE_IS_DOUBLE_DOUBLE
#endif
+#if defined(LIBC_TYPES_HAS_FLOAT128) && \
+ !defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT128)
+#define LIBC_TYPES_FLOAT128_IS_NOT_LONG_DOUBLE
+#endif
+
// int64 / uint64 support
#if defined(UINT64_MAX)
#define LIBC_TYPES_HAS_INT64
diff --git a/libc/src/__support/time/CMakeLists.txt b/libc/src/__support/time/CMakeLists.txt
index 89ddffb09938..8247e792e841 100644
--- a/libc/src/__support/time/CMakeLists.txt
+++ b/libc/src/__support/time/CMakeLists.txt
@@ -1,7 +1,3 @@
-if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${LIBC_TARGET_OS})
- add_subdirectory(${LIBC_TARGET_OS})
-endif()
-
add_header_library(
units
HDRS
@@ -10,3 +6,16 @@ add_header_library(
libc.src.__support.common
libc.hdr.types.time_t
)
+
+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${LIBC_TARGET_OS})
+ add_subdirectory(${LIBC_TARGET_OS})
+else()
+ return()
+endif()
+
+add_object_library(
+ clock_gettime
+ ALIAS
+ DEPENDS
+ libc.src.__support.time.${LIBC_TARGET_OS}.clock_gettime
+)
diff --git a/libc/src/__support/time/linux/clock_gettime.h b/libc/src/__support/time/clock_gettime.h
index f7f996ce7c19..584bf546cd60 100644
--- a/libc/src/__support/time/linux/clock_gettime.h
+++ b/libc/src/__support/time/clock_gettime.h
@@ -6,21 +6,17 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_LIBC_SRC___SUPPORT_TIME_LINUX_CLOCK_GETTIME_H
-#define LLVM_LIBC_SRC___SUPPORT_TIME_LINUX_CLOCK_GETTIME_H
+#ifndef LLVM_LIBC_SRC___SUPPORT_TIME_CLOCK_GETTIME_H
+#define LLVM_LIBC_SRC___SUPPORT_TIME_CLOCK_GETTIME_H
#include "hdr/types/clockid_t.h"
#include "hdr/types/struct_timespec.h"
#include "src/__support/error_or.h"
-#if defined(SYS_clock_gettime64)
-#include <linux/time_types.h>
-#endif
-
namespace LIBC_NAMESPACE_DECL {
namespace internal {
ErrorOr<int> clock_gettime(clockid_t clockid, timespec *ts);
} // namespace internal
} // namespace LIBC_NAMESPACE_DECL
-#endif // LLVM_LIBC_SRC___SUPPORT_TIME_LINUX_CLOCK_GETTIME_H
+#endif // LLVM_LIBC_SRC___SUPPORT_TIME_CLOCK_GETTIME_H
diff --git a/libc/src/__support/time/gpu/CMakeLists.txt b/libc/src/__support/time/gpu/CMakeLists.txt
new file mode 100644
index 000000000000..fc465e0cea25
--- /dev/null
+++ b/libc/src/__support/time/gpu/CMakeLists.txt
@@ -0,0 +1,22 @@
+add_object_library(
+ time_utils
+ SRCS
+ time_utils.cpp
+ HDRS
+ time_utils.h
+ DEPENDS
+ libc.hdr.types.clock_t
+ libc.hdr.time_macros
+)
+
+add_object_library(
+ clock_gettime
+ SRCS
+ clock_gettime.cpp
+ HDRS
+ ../clock_gettime.h
+ DEPENDS
+ libc.hdr.types.clockid_t
+ libc.hdr.types.struct_timespec
+ .time_utils
+)
diff --git a/libc/src/__support/time/gpu/clock_gettime.cpp b/libc/src/__support/time/gpu/clock_gettime.cpp
new file mode 100644
index 000000000000..cede72a1f35d
--- /dev/null
+++ b/libc/src/__support/time/gpu/clock_gettime.cpp
@@ -0,0 +1,33 @@
+//===---------- GPU implementation of the clock_gettime function ----------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "src/time/clock_gettime.h"
+
+#include "src/__support/common.h"
+#include "src/__support/macros/config.h"
+#include "src/__support/time/clock_gettime.h"
+#include "src/__support/time/gpu/time_utils.h"
+
+namespace LIBC_NAMESPACE_DECL {
+namespace internal {
+constexpr uint64_t TICKS_PER_SEC = 1000000000UL;
+
+ErrorOr<int> clock_gettime(clockid_t clockid, timespec *ts) {
+ if (clockid != CLOCK_MONOTONIC || !ts)
+ return cpp::unexpected(-1);
+
+ uint64_t ns_per_tick = TICKS_PER_SEC / GPU_CLOCKS_PER_SEC;
+ uint64_t ticks = gpu::fixed_frequency_clock();
+
+ ts->tv_nsec = (ticks * ns_per_tick) % TICKS_PER_SEC;
+ ts->tv_sec = (ticks * ns_per_tick) / TICKS_PER_SEC;
+
+ return 0;
+}
+} // namespace internal
+} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/time/gpu/time_utils.cpp b/libc/src/__support/time/gpu/time_utils.cpp
index 38e09f600f36..38e09f600f36 100644
--- a/libc/src/time/gpu/time_utils.cpp
+++ b/libc/src/__support/time/gpu/time_utils.cpp
diff --git a/libc/src/time/gpu/time_utils.h b/libc/src/__support/time/gpu/time_utils.h
index c631a38d91ba..315506c897dc 100644
--- a/libc/src/time/gpu/time_utils.h
+++ b/libc/src/__support/time/gpu/time_utils.h
@@ -38,6 +38,8 @@ extern gpu::Constant<uint64_t> __llvm_libc_clock_freq;
#error "Unsupported target"
#endif
+constexpr uint64_t TICKS_PER_SEC = 1000000000UL;
+
} // namespace LIBC_NAMESPACE_DECL
#endif // LLVM_LIBC_SRC_TIME_GPU_TIME_UTILS_H
diff --git a/libc/src/__support/time/linux/CMakeLists.txt b/libc/src/__support/time/linux/CMakeLists.txt
index 94ed09e65215..6fec7eeba99a 100644
--- a/libc/src/__support/time/linux/CMakeLists.txt
+++ b/libc/src/__support/time/linux/CMakeLists.txt
@@ -1,7 +1,7 @@
add_object_library(
clock_gettime
HDRS
- clock_gettime.h
+ ../clock_gettime.h
SRCS
clock_gettime.cpp
DEPENDS
diff --git a/libc/src/__support/time/linux/clock_conversion.h b/libc/src/__support/time/linux/clock_conversion.h
index 7a52873263a1..ac5357d308d7 100644
--- a/libc/src/__support/time/linux/clock_conversion.h
+++ b/libc/src/__support/time/linux/clock_conversion.h
@@ -10,7 +10,7 @@
#define LLVM_LIBC_SRC___SUPPORT_TIME_LINUX_CLOCK_CONVERSION_H
#include "src/__support/macros/config.h"
-#include "src/__support/time/linux/clock_gettime.h"
+#include "src/__support/time/clock_gettime.h"
#include "src/__support/time/units.h"
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/__support/time/linux/clock_gettime.cpp b/libc/src/__support/time/linux/clock_gettime.cpp
index 3a0eca417724..944fc0a2b80f 100644
--- a/libc/src/__support/time/linux/clock_gettime.cpp
+++ b/libc/src/__support/time/linux/clock_gettime.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-#include "src/__support/time/linux/clock_gettime.h"
+#include "src/__support/time/clock_gettime.h"
#include "hdr/types/clockid_t.h"
#include "hdr/types/struct_timespec.h"
#include "src/__support/OSUtil/linux/vdso.h"
diff --git a/libc/src/__support/time/windows/CMakeLists.txt b/libc/src/__support/time/windows/CMakeLists.txt
new file mode 100644
index 000000000000..dd0ac2f2f79a
--- /dev/null
+++ b/libc/src/__support/time/windows/CMakeLists.txt
@@ -0,0 +1,26 @@
+add_header_library(
+ performance_counter
+ HDRS
+ performance_counter.h
+ DEPENDS
+ libc.src.__support.CPP.atomic
+ libc.src.__support.common
+)
+
+add_object_library(
+ clock_gettime
+ HDRS
+ ../clock_gettime.h
+ SRCS
+ clock_gettime.cpp
+ DEPENDS
+ .performance_counter
+ libc.hdr.types.struct_timespec
+ libc.hdr.types.clockid_t
+ libc.hdr.errno_macros
+ libc.src.__support.common
+ libc.src.__support.error_or
+ libc.src.__support.OSUtil.osutil
+ libc.src.__support.CPP.atomic
+ libc.src.__support.CPP.limits
+)
diff --git a/libc/src/__support/time/windows/clock_gettime.cpp b/libc/src/__support/time/windows/clock_gettime.cpp
new file mode 100644
index 000000000000..813eae0df970
--- /dev/null
+++ b/libc/src/__support/time/windows/clock_gettime.cpp
@@ -0,0 +1,134 @@
+//===--- clock_gettime windows implementation -------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "hdr/time_macros.h"
+
+#include "src/__support/CPP/atomic.h"
+#include "src/__support/CPP/bit.h"
+#include "src/__support/CPP/limits.h"
+#include "src/__support/macros/optimization.h"
+#include "src/__support/time/clock_gettime.h"
+#include "src/__support/time/units.h"
+#include "src/__support/time/windows/performance_counter.h"
+
+#define WIN32_LEAN_AND_MEAN
+#define NOMINMAX
+#include <Windows.h>
+
+namespace LIBC_NAMESPACE_DECL {
+namespace internal {
+ErrorOr<int> clock_gettime(clockid_t clockid, timespec *ts) {
+ using namespace time_units;
+ constexpr unsigned long long HNS_PER_SEC = 1_s_ns / 100ULL;
+ constexpr long long SEC_LIMIT =
+ cpp::numeric_limits<decltype(ts->tv_sec)>::max();
+ ErrorOr<int> ret = 0;
+ switch (clockid) {
+ default:
+ ret = cpp::unexpected(EINVAL);
+ break;
+
+ case CLOCK_MONOTONIC: {
+ // see
+ // https://learn.microsoft.com/en-us/windows/win32/sysinfo/acquiring-high-resolution-time-stamps
+ // Is the performance counter monotonic (non-decreasing)?
+ // Yes. performance_counter does not go backward.
+ [[clang::uninitialized]] LARGE_INTEGER buffer;
+ // On systems that run Windows XP or later, the function will always
+ // succeed and will thus never return zero.
+ ::QueryPerformanceCounter(&buffer);
+ long long freq = performance_counter::get_ticks_per_second();
+ long long ticks = buffer.QuadPart;
+ long long tv_sec = ticks / freq;
+ long long tv_nsec = (ticks % freq) * 1_s_ns / freq;
+ if (LIBC_UNLIKELY(tv_sec > SEC_LIMIT)) {
+ ret = cpp::unexpected(EOVERFLOW);
+ break;
+ }
+ ts->tv_sec = static_cast<decltype(ts->tv_sec)>(tv_sec);
+ ts->tv_nsec = static_cast<decltype(ts->tv_nsec)>(tv_nsec);
+ break;
+ }
+ case CLOCK_REALTIME: {
+ // https://learn.microsoft.com/en-us/windows/win32/api/sysinfoapi/nf-sysinfoapi-getsystemtimepreciseasfiletime
+ // GetSystemTimePreciseAsFileTime
+ // This function is best suited for high-resolution time-of-day
+ // measurements, or time stamps that are synchronized to UTC
+ [[clang::uninitialized]] FILETIME file_time;
+ [[clang::uninitialized]] ULARGE_INTEGER time;
+ ::GetSystemTimePreciseAsFileTime(&file_time);
+ time.LowPart = file_time.dwLowDateTime;
+ time.HighPart = file_time.dwHighDateTime;
+
+ // adjust to POSIX epoch (from Jan 1, 1601 to Jan 1, 1970)
+ constexpr unsigned long long POSIX_TIME_SHIFT =
+ (11644473600ULL * HNS_PER_SEC);
+ if (LIBC_UNLIKELY(POSIX_TIME_SHIFT > time.QuadPart)) {
+ ret = cpp::unexpected(EOVERFLOW);
+ break;
+ }
+ time.QuadPart -= (11644473600ULL * HNS_PER_SEC);
+ unsigned long long tv_sec = time.QuadPart / HNS_PER_SEC;
+ unsigned long long tv_nsec = (time.QuadPart % HNS_PER_SEC) * 100ULL;
+ if (LIBC_UNLIKELY(tv_sec > SEC_LIMIT)) {
+ ret = cpp::unexpected(EOVERFLOW);
+ break;
+ }
+ ts->tv_sec = static_cast<decltype(ts->tv_sec)>(tv_sec);
+ ts->tv_nsec = static_cast<decltype(ts->tv_nsec)>(tv_nsec);
+ break;
+ }
+ case CLOCK_PROCESS_CPUTIME_ID:
+ case CLOCK_THREAD_CPUTIME_ID: {
+ [[clang::uninitialized]] FILETIME creation_time;
+ [[clang::uninitialized]] FILETIME exit_time;
+ [[clang::uninitialized]] FILETIME kernel_time;
+ [[clang::uninitialized]] FILETIME user_time;
+ bool success;
+ if (clockid == CLOCK_PROCESS_CPUTIME_ID) {
+ // https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-getprocesstimes
+ success = ::GetProcessTimes(::GetCurrentProcess(), &creation_time,
+ &exit_time, &kernel_time, &user_time);
+ } else {
+ // https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-getthreadtimes
+ success = ::GetThreadTimes(::GetCurrentThread(), &creation_time,
+ &exit_time, &kernel_time, &user_time);
+ }
+ if (!success) {
+ ret = cpp::unexpected(EINVAL);
+ break;
+ }
+ // https://learn.microsoft.com/en-us/windows/win32/api/minwinbase/ns-minwinbase-filetime
+ // It is not recommended that you add and subtract values from the FILETIME
+ // structure to obtain relative times. Instead, you should copy the low- and
+ // high-order parts of the file time to a ULARGE_INTEGER structure, perform
+ // 64-bit arithmetic on the QuadPart member, and copy the LowPart and
+ // HighPart members into the FILETIME structure.
+ auto kernel_time_hns = cpp::bit_cast<ULARGE_INTEGER>(kernel_time);
+ auto user_time_hns = cpp::bit_cast<ULARGE_INTEGER>(user_time);
+ unsigned long long total_time_hns =
+ kernel_time_hns.QuadPart + user_time_hns.QuadPart;
+
+ unsigned long long tv_sec = total_time_hns / HNS_PER_SEC;
+ unsigned long long tv_nsec = (total_time_hns % HNS_PER_SEC) * 100ULL;
+
+ if (LIBC_UNLIKELY(tv_sec > SEC_LIMIT)) {
+ ret = cpp::unexpected(EOVERFLOW);
+ break;
+ }
+
+ ts->tv_sec = static_cast<decltype(ts->tv_sec)>(tv_sec);
+ ts->tv_nsec = static_cast<decltype(ts->tv_nsec)>(tv_nsec);
+
+ break;
+ }
+ }
+ return ret;
+}
+} // namespace internal
+} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/__support/time/windows/performance_counter.h b/libc/src/__support/time/windows/performance_counter.h
new file mode 100644
index 000000000000..3df81b3efff4
--- /dev/null
+++ b/libc/src/__support/time/windows/performance_counter.h
@@ -0,0 +1,35 @@
+//===--- Cached Performance Counter Frequency ----------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "src/__support/CPP/atomic.h"
+#include "src/__support/common.h"
+
+#define WIN32_LEAN_AND_MEAN
+#define NOMINMAX
+#include <Windows.h>
+
+namespace LIBC_NAMESPACE_DECL {
+namespace performance_counter {
+LIBC_INLINE long long get_ticks_per_second() {
+ static cpp::Atomic<long long> frequency = 0;
+ // Relaxed ordering is enough. It is okay to record the frequency multiple
+ // times. The store operation itself is atomic and the value must propagate
+ // as required by cache coherence.
+ auto freq = frequency.load(cpp::MemoryOrder::RELAXED);
+ if (!freq) {
+ [[clang::uninitialized]] LARGE_INTEGER buffer;
+ // On systems that run Windows XP or later, the function will always
+ // succeed and will thus never return zero.
+ ::QueryPerformanceFrequency(&buffer);
+ frequency.store(buffer.QuadPart, cpp::MemoryOrder::RELAXED);
+ return buffer.QuadPart;
+ }
+ return freq;
+}
+} // namespace performance_counter
+} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/arpa/CMakeLists.txt b/libc/src/arpa/CMakeLists.txt
new file mode 100644
index 000000000000..5c89828860ff
--- /dev/null
+++ b/libc/src/arpa/CMakeLists.txt
@@ -0,0 +1 @@
+add_subdirectory(inet)
diff --git a/libc/src/network/CMakeLists.txt b/libc/src/arpa/inet/CMakeLists.txt
index cdd53e915034..cdd53e915034 100644
--- a/libc/src/network/CMakeLists.txt
+++ b/libc/src/arpa/inet/CMakeLists.txt
diff --git a/libc/src/network/htonl.cpp b/libc/src/arpa/inet/htonl.cpp
index 681786adea68..fb0404a26a24 100644
--- a/libc/src/network/htonl.cpp
+++ b/libc/src/arpa/inet/htonl.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-#include "src/network/htonl.h"
+#include "src/arpa/inet/htonl.h"
#include "src/__support/common.h"
#include "src/__support/endian_internal.h"
#include "src/__support/macros/config.h"
diff --git a/libc/src/network/htonl.h b/libc/src/arpa/inet/htonl.h
index 14217310a227..e444972c771e 100644
--- a/libc/src/network/htonl.h
+++ b/libc/src/arpa/inet/htonl.h
@@ -6,8 +6,8 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_LIBC_SRC_NETWORK_HTONL_H
-#define LLVM_LIBC_SRC_NETWORK_HTONL_H
+#ifndef LLVM_LIBC_SRC_ARPA_INET_HTONL_H
+#define LLVM_LIBC_SRC_ARPA_INET_HTONL_H
#include "src/__support/macros/config.h"
#include <stdint.h>
@@ -18,4 +18,4 @@ uint32_t htonl(uint32_t hostlong);
} // namespace LIBC_NAMESPACE_DECL
-#endif // LLVM_LIBC_SRC_NETWORK_HTONL_H
+#endif // LLVM_LIBC_SRC_ARPA_INET_HTONL_H
diff --git a/libc/src/network/htons.cpp b/libc/src/arpa/inet/htons.cpp
index 675f53cf4a0a..1fcbbdf67deb 100644
--- a/libc/src/network/htons.cpp
+++ b/libc/src/arpa/inet/htons.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-#include "src/network/htons.h"
+#include "src/arpa/inet/htons.h"
#include "src/__support/common.h"
#include "src/__support/endian_internal.h"
#include "src/__support/macros/config.h"
diff --git a/libc/src/network/htons.h b/libc/src/arpa/inet/htons.h
index 8f5c68a0a60a..35c2acdcfae4 100644
--- a/libc/src/network/htons.h
+++ b/libc/src/arpa/inet/htons.h
@@ -6,8 +6,8 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_LIBC_SRC_NETWORK_HTONS_H
-#define LLVM_LIBC_SRC_NETWORK_HTONS_H
+#ifndef LLVM_LIBC_SRC_ARPA_INET_HTONS_H
+#define LLVM_LIBC_SRC_ARPA_INET_HTONS_H
#include "src/__support/macros/config.h"
#include <stdint.h>
@@ -18,4 +18,4 @@ uint16_t htons(uint16_t hostshort);
} // namespace LIBC_NAMESPACE_DECL
-#endif // LLVM_LIBC_SRC_NETWORK_HTONS_H
+#endif // LLVM_LIBC_SRC_ARPA_INET_HTONS_H
diff --git a/libc/src/network/ntohl.cpp b/libc/src/arpa/inet/ntohl.cpp
index 6a309e97fca7..d472107a1988 100644
--- a/libc/src/network/ntohl.cpp
+++ b/libc/src/arpa/inet/ntohl.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-#include "src/network/ntohl.h"
+#include "src/arpa/inet/ntohl.h"
#include "src/__support/common.h"
#include "src/__support/endian_internal.h"
#include "src/__support/macros/config.h"
diff --git a/libc/src/network/ntohl.h b/libc/src/arpa/inet/ntohl.h
index c32595194806..40079650d6fd 100644
--- a/libc/src/network/ntohl.h
+++ b/libc/src/arpa/inet/ntohl.h
@@ -6,8 +6,8 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_LIBC_SRC_NETWORK_NTOHL_H
-#define LLVM_LIBC_SRC_NETWORK_NTOHL_H
+#ifndef LLVM_LIBC_SRC_ARPA_INET_NTOHL_H
+#define LLVM_LIBC_SRC_ARPA_INET_NTOHL_H
#include "src/__support/macros/config.h"
#include <stdint.h>
@@ -18,4 +18,4 @@ uint32_t ntohl(uint32_t netlong);
} // namespace LIBC_NAMESPACE_DECL
-#endif // LLVM_LIBC_SRC_NETWORK_NTOHL_H
+#endif // LLVM_LIBC_SRC_ARPA_INET_NTOHL_H
diff --git a/libc/src/network/ntohs.cpp b/libc/src/arpa/inet/ntohs.cpp
index b51ecb93241c..9082ed928778 100644
--- a/libc/src/network/ntohs.cpp
+++ b/libc/src/arpa/inet/ntohs.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-#include "src/network/ntohs.h"
+#include "src/arpa/inet/ntohs.h"
#include "src/__support/common.h"
#include "src/__support/endian_internal.h"
#include "src/__support/macros/config.h"
diff --git a/libc/src/network/ntohs.h b/libc/src/arpa/inet/ntohs.h
index f55591415f76..5fe3ebcb6252 100644
--- a/libc/src/network/ntohs.h
+++ b/libc/src/arpa/inet/ntohs.h
@@ -6,8 +6,8 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_LIBC_SRC_NETWORK_NTOHS_H
-#define LLVM_LIBC_SRC_NETWORK_NTOHS_H
+#ifndef LLVM_LIBC_SRC_ARPA_INET_NTOHS_H
+#define LLVM_LIBC_SRC_ARPA_INET_NTOHS_H
#include "src/__support/macros/config.h"
#include <stdint.h>
@@ -18,4 +18,4 @@ uint16_t ntohs(uint16_t netshort);
} // namespace LIBC_NAMESPACE_DECL
-#endif // LLVM_LIBC_SRC_NETWORK_NTOHS_H
+#endif // LLVM_LIBC_SRC_ARPA_INET_NTOHS_H
diff --git a/libc/src/compiler/generic/__stack_chk_fail.cpp b/libc/src/compiler/generic/__stack_chk_fail.cpp
index c76ec1407ad3..00e976ad8bc2 100644
--- a/libc/src/compiler/generic/__stack_chk_fail.cpp
+++ b/libc/src/compiler/generic/__stack_chk_fail.cpp
@@ -9,9 +9,12 @@
#include "src/compiler/__stack_chk_fail.h"
#include "src/__support/OSUtil/io.h"
#include "src/stdlib/abort.h"
+#include <stdint.h> // For uintptr_t
extern "C" {
+uintptr_t __stack_chk_guard = static_cast<uintptr_t>(0xa9fff01234);
+
void __stack_chk_fail(void) {
LIBC_NAMESPACE::write_to_stderr("stack smashing detected\n");
LIBC_NAMESPACE::abort();
diff --git a/libc/src/complex/CMakeLists.txt b/libc/src/complex/CMakeLists.txt
index 289cce5455af..bc66a5445d72 100644
--- a/libc/src/complex/CMakeLists.txt
+++ b/libc/src/complex/CMakeLists.txt
@@ -24,3 +24,15 @@ add_complex_entrypoint_object(cimagf)
add_complex_entrypoint_object(cimagl)
add_complex_entrypoint_object(cimagf16)
add_complex_entrypoint_object(cimagf128)
+
+add_complex_entrypoint_object(conj)
+add_complex_entrypoint_object(conjf)
+add_complex_entrypoint_object(conjl)
+add_complex_entrypoint_object(conjf16)
+add_complex_entrypoint_object(conjf128)
+
+add_complex_entrypoint_object(cproj)
+add_complex_entrypoint_object(cprojf)
+add_complex_entrypoint_object(cprojl)
+add_complex_entrypoint_object(cprojf16)
+add_complex_entrypoint_object(cprojf128)
diff --git a/libc/src/complex/cimagf128.h b/libc/src/complex/cimagf128.h
index ab8f9ac7da58..aaf52cfc54ef 100644
--- a/libc/src/complex/cimagf128.h
+++ b/libc/src/complex/cimagf128.h
@@ -6,15 +6,12 @@
//
//===----------------------------------------------------------------------===//
-#include "src/__support/macros/properties/complex_types.h"
-#include "src/__support/macros/properties/types.h"
-
-#if defined(LIBC_TYPES_HAS_CFLOAT128)
-
#ifndef LLVM_LIBC_SRC_COMPLEX_CIMAGF128_H
#define LLVM_LIBC_SRC_COMPLEX_CIMAGF128_H
#include "src/__support/macros/config.h"
+#include "src/__support/macros/properties/complex_types.h"
+#include "src/__support/macros/properties/types.h"
namespace LIBC_NAMESPACE_DECL {
@@ -23,5 +20,3 @@ float128 cimagf128(cfloat128 x);
} // namespace LIBC_NAMESPACE_DECL
#endif // LLVM_LIBC_SRC_COMPLEX_CIMAGF128_H
-
-#endif // LIBC_TYPES_HAS_CFLOAT128
diff --git a/libc/src/complex/cimagf16.h b/libc/src/complex/cimagf16.h
index 5c5de2eb1bcf..81ed4d2ce567 100644
--- a/libc/src/complex/cimagf16.h
+++ b/libc/src/complex/cimagf16.h
@@ -6,15 +6,12 @@
//
//===----------------------------------------------------------------------===//
-#include "src/__support/macros/properties/complex_types.h"
-#include "src/__support/macros/properties/types.h"
-
-#if defined(LIBC_TYPES_HAS_CFLOAT16)
-
#ifndef LLVM_LIBC_SRC_COMPLEX_CIMAGF16_H
#define LLVM_LIBC_SRC_COMPLEX_CIMAGF16_H
#include "src/__support/macros/config.h"
+#include "src/__support/macros/properties/complex_types.h"
+#include "src/__support/macros/properties/types.h"
namespace LIBC_NAMESPACE_DECL {
@@ -23,5 +20,3 @@ float16 cimagf16(cfloat16 x);
} // namespace LIBC_NAMESPACE_DECL
#endif // LLVM_LIBC_SRC_COMPLEX_CIMAGF16_H
-
-#endif // LIBC_TYPES_HAS_CFLOAT16
diff --git a/libc/src/complex/conj.h b/libc/src/complex/conj.h
new file mode 100644
index 000000000000..2ff82d275862
--- /dev/null
+++ b/libc/src/complex/conj.h
@@ -0,0 +1,20 @@
+//===-- Implementation header for conj --------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_SRC_COMPLEX_CONJ_H
+#define LLVM_LIBC_SRC_COMPLEX_CONJ_H
+
+#include "src/__support/macros/config.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+_Complex double conj(_Complex double x);
+
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC_COMPLEX_CONJ_H
diff --git a/libc/src/complex/conjf.h b/libc/src/complex/conjf.h
new file mode 100644
index 000000000000..6b3bd612e5bf
--- /dev/null
+++ b/libc/src/complex/conjf.h
@@ -0,0 +1,20 @@
+//===-- Implementation header for conjf -------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_SRC_COMPLEX_CONJF_H
+#define LLVM_LIBC_SRC_COMPLEX_CONJF_H
+
+#include "src/__support/macros/config.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+_Complex float conjf(_Complex float x);
+
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC_COMPLEX_CONJF_H
diff --git a/libc/src/complex/conjf128.h b/libc/src/complex/conjf128.h
new file mode 100644
index 000000000000..cae01d3f0069
--- /dev/null
+++ b/libc/src/complex/conjf128.h
@@ -0,0 +1,21 @@
+//===-- Implementation header for conjf128 ----------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_SRC_COMPLEX_CONJF128_H
+#define LLVM_LIBC_SRC_COMPLEX_CONJF128_H
+
+#include "src/__support/macros/config.h"
+#include "src/__support/macros/properties/complex_types.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+cfloat128 conjf128(cfloat128 x);
+
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC_COMPLEX_CONJF128_H
diff --git a/libc/src/complex/conjf16.h b/libc/src/complex/conjf16.h
new file mode 100644
index 000000000000..dde1221473e4
--- /dev/null
+++ b/libc/src/complex/conjf16.h
@@ -0,0 +1,21 @@
+//===-- Implementation header for conjf16 -----------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_SRC_COMPLEX_CONJF16_H
+#define LLVM_LIBC_SRC_COMPLEX_CONJF16_H
+
+#include "src/__support/macros/config.h"
+#include "src/__support/macros/properties/complex_types.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+cfloat16 conjf16(cfloat16 x);
+
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC_COMPLEX_CONJF16_H
diff --git a/libc/src/complex/conjl.h b/libc/src/complex/conjl.h
new file mode 100644
index 000000000000..aec640f9433a
--- /dev/null
+++ b/libc/src/complex/conjl.h
@@ -0,0 +1,20 @@
+//===-- Implementation header for conjl -------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_SRC_COMPLEX_CONJL_H
+#define LLVM_LIBC_SRC_COMPLEX_CONJL_H
+
+#include "src/__support/macros/config.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+_Complex long double conjl(_Complex long double x);
+
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC_COMPLEX_CONJL_H
diff --git a/libc/src/complex/cproj.h b/libc/src/complex/cproj.h
new file mode 100644
index 000000000000..62d41bceec3e
--- /dev/null
+++ b/libc/src/complex/cproj.h
@@ -0,0 +1,20 @@
+//===-- Implementation header for cproj -------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_SRC_COMPLEX_CPROJ_H
+#define LLVM_LIBC_SRC_COMPLEX_CPROJ_H
+
+#include "src/__support/macros/config.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+_Complex double cproj(_Complex double x);
+
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC_COMPLEX_CPROJ_H
diff --git a/libc/src/complex/cprojf.h b/libc/src/complex/cprojf.h
new file mode 100644
index 000000000000..76124f911777
--- /dev/null
+++ b/libc/src/complex/cprojf.h
@@ -0,0 +1,20 @@
+//===-- Implementation header for cprojf ------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_SRC_COMPLEX_CPROJF_H
+#define LLVM_LIBC_SRC_COMPLEX_CPROJF_H
+
+#include "src/__support/macros/config.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+_Complex float cprojf(_Complex float x);
+
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC_COMPLEX_CPROJF_H
diff --git a/libc/src/complex/cprojf128.h b/libc/src/complex/cprojf128.h
new file mode 100644
index 000000000000..71c1bbec2218
--- /dev/null
+++ b/libc/src/complex/cprojf128.h
@@ -0,0 +1,21 @@
+//===-- Implementation header for cprojf128 ---------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_SRC_COMPLEX_CPROJF128_H
+#define LLVM_LIBC_SRC_COMPLEX_CPROJF128_H
+
+#include "src/__support/macros/config.h"
+#include "src/__support/macros/properties/complex_types.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+cfloat128 cprojf128(cfloat128 x);
+
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC_COMPLEX_CPROJF128_H
diff --git a/libc/src/complex/cprojf16.h b/libc/src/complex/cprojf16.h
new file mode 100644
index 000000000000..f12a46df9e17
--- /dev/null
+++ b/libc/src/complex/cprojf16.h
@@ -0,0 +1,21 @@
+//===-- Implementation header for cprojf16 ----------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_SRC_COMPLEX_CPROJF16_H
+#define LLVM_LIBC_SRC_COMPLEX_CPROJF16_H
+
+#include "src/__support/macros/config.h"
+#include "src/__support/macros/properties/complex_types.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+cfloat16 cprojf16(cfloat16 x);
+
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC_COMPLEX_CPROJF16_H
diff --git a/libc/src/complex/cprojl.h b/libc/src/complex/cprojl.h
new file mode 100644
index 000000000000..ecc8dce8f853
--- /dev/null
+++ b/libc/src/complex/cprojl.h
@@ -0,0 +1,20 @@
+//===-- Implementation header for cprojl ------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_SRC_COMPLEX_CPROJL_H
+#define LLVM_LIBC_SRC_COMPLEX_CPROJL_H
+
+#include "src/__support/macros/config.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+_Complex long double cprojl(_Complex long double x);
+
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC_COMPLEX_CPROJL_H
diff --git a/libc/src/complex/crealf128.h b/libc/src/complex/crealf128.h
index 4922ae78cb23..b90c3e7c8548 100644
--- a/libc/src/complex/crealf128.h
+++ b/libc/src/complex/crealf128.h
@@ -6,15 +6,12 @@
//
//===----------------------------------------------------------------------===//
-#include "src/__support/macros/properties/complex_types.h"
-#include "src/__support/macros/properties/types.h"
-
-#if defined(LIBC_TYPES_HAS_CFLOAT128)
-
#ifndef LLVM_LIBC_SRC_COMPLEX_CREALF128_H
#define LLVM_LIBC_SRC_COMPLEX_CREALF128_H
#include "src/__support/macros/config.h"
+#include "src/__support/macros/properties/complex_types.h"
+#include "src/__support/macros/properties/types.h"
namespace LIBC_NAMESPACE_DECL {
@@ -23,5 +20,3 @@ float128 crealf128(cfloat128 x);
} // namespace LIBC_NAMESPACE_DECL
#endif // LLVM_LIBC_SRC_COMPLEX_CREALF128_H
-
-#endif // LIBC_TYPES_HAS_CFLOAT128
diff --git a/libc/src/complex/crealf16.h b/libc/src/complex/crealf16.h
index e6098a218d09..09d66649fa27 100644
--- a/libc/src/complex/crealf16.h
+++ b/libc/src/complex/crealf16.h
@@ -6,15 +6,12 @@
//
//===----------------------------------------------------------------------===//
-#include "src/__support/macros/properties/complex_types.h"
-#include "src/__support/macros/properties/types.h"
-
-#if defined(LIBC_TYPES_HAS_CFLOAT16)
-
#ifndef LLVM_LIBC_SRC_COMPLEX_CREALF16_H
#define LLVM_LIBC_SRC_COMPLEX_CREALF16_H
#include "src/__support/macros/config.h"
+#include "src/__support/macros/properties/complex_types.h"
+#include "src/__support/macros/properties/types.h"
namespace LIBC_NAMESPACE_DECL {
@@ -23,5 +20,3 @@ float16 crealf16(cfloat16 x);
} // namespace LIBC_NAMESPACE_DECL
#endif // LLVM_LIBC_SRC_COMPLEX_CREALF16_H
-
-#endif // LIBC_TYPES_HAS_CFLOAT16
diff --git a/libc/src/complex/generic/CMakeLists.txt b/libc/src/complex/generic/CMakeLists.txt
index a3da781c6023..3dae6f8a6149 100644
--- a/libc/src/complex/generic/CMakeLists.txt
+++ b/libc/src/complex/generic/CMakeLists.txt
@@ -1,4 +1,132 @@
add_entrypoint_object(
+ cproj
+ SRCS
+ cproj.cpp
+ HDRS
+ ../cproj.h
+ COMPILE_OPTIONS
+ ${libc_opt_high_flag}
+ DEPENDS
+ libc.src.__support.complex_type
+)
+
+add_entrypoint_object(
+ cprojf
+ SRCS
+ cprojf.cpp
+ HDRS
+ ../cprojf.h
+ COMPILE_OPTIONS
+ ${libc_opt_high_flag}
+ DEPENDS
+ libc.src.__support.complex_type
+)
+
+add_entrypoint_object(
+ cprojl
+ SRCS
+ cprojl.cpp
+ HDRS
+ ../cprojl.h
+ COMPILE_OPTIONS
+ ${libc_opt_high_flag}
+ DEPENDS
+ libc.src.__support.complex_type
+)
+
+add_entrypoint_object(
+ cprojf16
+ SRCS
+ cprojf16.cpp
+ HDRS
+ ../cprojf16.h
+ COMPILE_OPTIONS
+ ${libc_opt_high_flag}
+ DEPENDS
+ libc.src.__support.complex_type
+ libc.src.__support.macros.properties.types
+ libc.src.__support.macros.properties.complex_types
+)
+
+add_entrypoint_object(
+ cprojf128
+ SRCS
+ cprojf128.cpp
+ HDRS
+ ../cprojf128.h
+ COMPILE_OPTIONS
+ ${libc_opt_high_flag}
+ DEPENDS
+ libc.src.__support.complex_type
+ libc.src.__support.macros.properties.types
+ libc.src.__support.macros.properties.complex_types
+)
+
+add_entrypoint_object(
+ conj
+ SRCS
+ conj.cpp
+ HDRS
+ ../conj.h
+ COMPILE_OPTIONS
+ ${libc_opt_high_flag}
+ DEPENDS
+ libc.src.__support.complex_type
+)
+
+add_entrypoint_object(
+ conjf
+ SRCS
+ conjf.cpp
+ HDRS
+ ../conjf.h
+ COMPILE_OPTIONS
+ ${libc_opt_high_flag}
+ DEPENDS
+ libc.src.__support.complex_type
+)
+
+add_entrypoint_object(
+ conjl
+ SRCS
+ conjl.cpp
+ HDRS
+ ../conjl.h
+ COMPILE_OPTIONS
+ ${libc_opt_high_flag}
+ DEPENDS
+ libc.src.__support.complex_type
+)
+
+add_entrypoint_object(
+ conjf16
+ SRCS
+ conjf16.cpp
+ HDRS
+ ../conjf16.h
+ COMPILE_OPTIONS
+ ${libc_opt_high_flag}
+ DEPENDS
+ libc.src.__support.complex_type
+ libc.src.__support.macros.properties.types
+ libc.src.__support.macros.properties.complex_types
+)
+
+add_entrypoint_object(
+ conjf128
+ SRCS
+ conjf128.cpp
+ HDRS
+ ../conjf128.h
+ COMPILE_OPTIONS
+ ${libc_opt_high_flag}
+ DEPENDS
+ libc.src.__support.complex_type
+ libc.src.__support.macros.properties.types
+ libc.src.__support.macros.properties.complex_types
+)
+
+add_entrypoint_object(
creal
SRCS
creal.cpp
diff --git a/libc/src/complex/generic/cimagf128.cpp b/libc/src/complex/generic/cimagf128.cpp
index c21bd7f4602c..78dbb8eddd3e 100644
--- a/libc/src/complex/generic/cimagf128.cpp
+++ b/libc/src/complex/generic/cimagf128.cpp
@@ -7,8 +7,6 @@
//===----------------------------------------------------------------------===//
#include "src/complex/cimagf128.h"
-#if defined(LIBC_TYPES_HAS_CFLOAT128)
-
#include "src/__support/CPP/bit.h"
#include "src/__support/common.h"
#include "src/__support/complex_type.h"
@@ -21,5 +19,3 @@ LLVM_LIBC_FUNCTION(float128, cimagf128, (cfloat128 x)) {
}
} // namespace LIBC_NAMESPACE_DECL
-
-#endif // LIBC_TYPES_HAS_CFLOAT128
diff --git a/libc/src/complex/generic/cimagf16.cpp b/libc/src/complex/generic/cimagf16.cpp
index 361687984067..25d9b3ddf3b6 100644
--- a/libc/src/complex/generic/cimagf16.cpp
+++ b/libc/src/complex/generic/cimagf16.cpp
@@ -7,8 +7,6 @@
//===----------------------------------------------------------------------===//
#include "src/complex/cimagf16.h"
-#if defined(LIBC_TYPES_HAS_CFLOAT16)
-
#include "src/__support/CPP/bit.h"
#include "src/__support/common.h"
#include "src/__support/complex_type.h"
@@ -21,5 +19,3 @@ LLVM_LIBC_FUNCTION(float16, cimagf16, (cfloat16 x)) {
}
} // namespace LIBC_NAMESPACE_DECL
-
-#endif // LIBC_TYPES_HAS_CFLOAT16
diff --git a/libc/src/complex/generic/conj.cpp b/libc/src/complex/generic/conj.cpp
new file mode 100644
index 000000000000..cbcd480d6efa
--- /dev/null
+++ b/libc/src/complex/generic/conj.cpp
@@ -0,0 +1,19 @@
+//===-- Implementation of conj function -----------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "src/complex/conj.h"
+#include "src/__support/common.h"
+#include "src/__support/complex_type.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+LLVM_LIBC_FUNCTION(_Complex double, conj, (_Complex double x)) {
+ return conjugate<_Complex double>(x);
+}
+
+} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/complex/generic/conjf.cpp b/libc/src/complex/generic/conjf.cpp
new file mode 100644
index 000000000000..a1af3d78ebc6
--- /dev/null
+++ b/libc/src/complex/generic/conjf.cpp
@@ -0,0 +1,19 @@
+//===-- Implementation of conjf function ----------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "src/complex/conjf.h"
+#include "src/__support/common.h"
+#include "src/__support/complex_type.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+LLVM_LIBC_FUNCTION(_Complex float, conjf, (_Complex float x)) {
+ return conjugate<_Complex float>(x);
+}
+
+} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/complex/generic/conjf128.cpp b/libc/src/complex/generic/conjf128.cpp
new file mode 100644
index 000000000000..a63809a66e25
--- /dev/null
+++ b/libc/src/complex/generic/conjf128.cpp
@@ -0,0 +1,19 @@
+//===-- Implementation of conjf128 function -------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "src/complex/conjf128.h"
+#include "src/__support/common.h"
+#include "src/__support/complex_type.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+LLVM_LIBC_FUNCTION(cfloat128, conjf128, (cfloat128 x)) {
+ return conjugate<cfloat128>(x);
+}
+
+} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/complex/generic/conjf16.cpp b/libc/src/complex/generic/conjf16.cpp
new file mode 100644
index 000000000000..cd1ab67ed1cd
--- /dev/null
+++ b/libc/src/complex/generic/conjf16.cpp
@@ -0,0 +1,19 @@
+//===-- Implementation of conjf16 function --------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "src/complex/conjf16.h"
+#include "src/__support/common.h"
+#include "src/__support/complex_type.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+LLVM_LIBC_FUNCTION(cfloat16, conjf16, (cfloat16 x)) {
+ return conjugate<cfloat16>(x);
+}
+
+} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/complex/generic/conjl.cpp b/libc/src/complex/generic/conjl.cpp
new file mode 100644
index 000000000000..8298ede6fa38
--- /dev/null
+++ b/libc/src/complex/generic/conjl.cpp
@@ -0,0 +1,19 @@
+//===-- Implementation of conjl function ----------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "src/complex/conjl.h"
+#include "src/__support/common.h"
+#include "src/__support/complex_type.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+LLVM_LIBC_FUNCTION(_Complex long double, conjl, (_Complex long double x)) {
+ return conjugate<_Complex long double>(x);
+}
+
+} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/complex/generic/cproj.cpp b/libc/src/complex/generic/cproj.cpp
new file mode 100644
index 000000000000..d5e8c3ff3d9e
--- /dev/null
+++ b/libc/src/complex/generic/cproj.cpp
@@ -0,0 +1,19 @@
+//===-- Implementation of cproj function ----------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "src/complex/cproj.h"
+#include "src/__support/common.h"
+#include "src/__support/complex_type.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+LLVM_LIBC_FUNCTION(_Complex double, cproj, (_Complex double x)) {
+ return project<_Complex double>(x);
+}
+
+} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/complex/generic/cprojf.cpp b/libc/src/complex/generic/cprojf.cpp
new file mode 100644
index 000000000000..d0235f6bfef7
--- /dev/null
+++ b/libc/src/complex/generic/cprojf.cpp
@@ -0,0 +1,19 @@
+//===-- Implementation of cprojf function ---------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "src/complex/cprojf.h"
+#include "src/__support/common.h"
+#include "src/__support/complex_type.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+LLVM_LIBC_FUNCTION(_Complex float, cprojf, (_Complex float x)) {
+ return project<_Complex float>(x);
+}
+
+} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/complex/generic/cprojf128.cpp b/libc/src/complex/generic/cprojf128.cpp
new file mode 100644
index 000000000000..eb2cd08dfc11
--- /dev/null
+++ b/libc/src/complex/generic/cprojf128.cpp
@@ -0,0 +1,19 @@
+//===-- Implementation of cprojf128 function ------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "src/complex/cprojf128.h"
+#include "src/__support/common.h"
+#include "src/__support/complex_type.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+LLVM_LIBC_FUNCTION(cfloat128, cprojf128, (cfloat128 x)) {
+ return project<cfloat128>(x);
+}
+
+} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/complex/generic/cprojf16.cpp b/libc/src/complex/generic/cprojf16.cpp
new file mode 100644
index 000000000000..8d2d64a439e0
--- /dev/null
+++ b/libc/src/complex/generic/cprojf16.cpp
@@ -0,0 +1,19 @@
+//===-- Implementation of cprojf16 function -------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "src/complex/cprojf16.h"
+#include "src/__support/common.h"
+#include "src/__support/complex_type.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+LLVM_LIBC_FUNCTION(cfloat16, cprojf16, (cfloat16 x)) {
+ return project<cfloat16>(x);
+}
+
+} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/complex/generic/cprojl.cpp b/libc/src/complex/generic/cprojl.cpp
new file mode 100644
index 000000000000..34deeb63b16d
--- /dev/null
+++ b/libc/src/complex/generic/cprojl.cpp
@@ -0,0 +1,19 @@
+//===-- Implementation of cprojl function ---------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "src/complex/cprojl.h"
+#include "src/__support/common.h"
+#include "src/__support/complex_type.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+LLVM_LIBC_FUNCTION(_Complex long double, cprojl, (_Complex long double x)) {
+ return project<_Complex long double>(x);
+}
+
+} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/complex/generic/crealf128.cpp b/libc/src/complex/generic/crealf128.cpp
index e72a77821601..e7554989e14a 100644
--- a/libc/src/complex/generic/crealf128.cpp
+++ b/libc/src/complex/generic/crealf128.cpp
@@ -7,8 +7,6 @@
//===----------------------------------------------------------------------===//
#include "src/complex/crealf128.h"
-#if defined(LIBC_TYPES_HAS_CFLOAT128)
-
#include "src/__support/CPP/bit.h"
#include "src/__support/common.h"
#include "src/__support/complex_type.h"
@@ -21,5 +19,3 @@ LLVM_LIBC_FUNCTION(float128, crealf128, (cfloat128 x)) {
}
} // namespace LIBC_NAMESPACE_DECL
-
-#endif // LIBC_TYPES_HAS_CFLOAT128
diff --git a/libc/src/complex/generic/crealf16.cpp b/libc/src/complex/generic/crealf16.cpp
index 35142071f053..c9e8626bfda9 100644
--- a/libc/src/complex/generic/crealf16.cpp
+++ b/libc/src/complex/generic/crealf16.cpp
@@ -7,8 +7,6 @@
//===----------------------------------------------------------------------===//
#include "src/complex/crealf16.h"
-#if defined(LIBC_TYPES_HAS_CFLOAT16)
-
#include "src/__support/CPP/bit.h"
#include "src/__support/common.h"
#include "src/__support/complex_type.h"
@@ -21,5 +19,3 @@ LLVM_LIBC_FUNCTION(float16, crealf16, (cfloat16 x)) {
}
} // namespace LIBC_NAMESPACE_DECL
-
-#endif // LIBC_TYPES_HAS_CFLOAT16
diff --git a/libc/src/math/CMakeLists.txt b/libc/src/math/CMakeLists.txt
index 390a59d07a28..e4e2c49642f2 100644
--- a/libc/src/math/CMakeLists.txt
+++ b/libc/src/math/CMakeLists.txt
@@ -89,6 +89,7 @@ add_math_entrypoint_object(copysignf128)
add_math_entrypoint_object(cos)
add_math_entrypoint_object(cosf)
+add_math_entrypoint_object(cosf16)
add_math_entrypoint_object(cosh)
add_math_entrypoint_object(coshf)
diff --git a/libc/src/math/cosf16.h b/libc/src/math/cosf16.h
new file mode 100644
index 000000000000..cc179a6e16c6
--- /dev/null
+++ b/libc/src/math/cosf16.h
@@ -0,0 +1,21 @@
+//===-- Implementation header for cosf16 ------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_SRC_MATH_COSF16_H
+#define LLVM_LIBC_SRC_MATH_COSF16_H
+
+#include "src/__support/macros/config.h"
+#include "src/__support/macros/properties/types.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+float16 cosf16(float16 x);
+
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC_MATH_COSF16_H
diff --git a/libc/src/math/docs/add_math_function.md b/libc/src/math/docs/add_math_function.md
index f02d502399e2..daaf1a3ec563 100644
--- a/libc/src/math/docs/add_math_function.md
+++ b/libc/src/math/docs/add_math_function.md
@@ -18,7 +18,7 @@ together with its specifications:
```
- Add function specs to the file:
```
- libc/hdrgen/yaml/math.yaml
+ libc/include/math.yaml
```
## Implementation
diff --git a/libc/src/math/generic/CMakeLists.txt b/libc/src/math/generic/CMakeLists.txt
index aeb758d4a092..b3d461291519 100644
--- a/libc/src/math/generic/CMakeLists.txt
+++ b/libc/src/math/generic/CMakeLists.txt
@@ -419,6 +419,25 @@ add_entrypoint_object(
)
add_entrypoint_object(
+ cosf16
+ SRCS
+ cosf16.cpp
+ HDRS
+ ../cosf16.h
+ DEPENDS
+ .sincosf16_utils
+ libc.hdr.errno_macros
+ libc.hdr.fenv_macros
+ libc.src.__support.FPUtil.cast
+ libc.src.__support.FPUtil.fenv_impl
+ libc.src.__support.FPUtil.fp_bits
+ libc.src.__support.FPUtil.except_value_utils
+ libc.src.__support.FPUtil.multiply_add
+ libc.src.__support.macros.optimization
+ libc.src.__support.macros.properties.types
+)
+
+add_entrypoint_object(
cospif
SRCS
cospif.cpp
diff --git a/libc/src/math/generic/cosf16.cpp b/libc/src/math/generic/cosf16.cpp
new file mode 100644
index 000000000000..534e07854474
--- /dev/null
+++ b/libc/src/math/generic/cosf16.cpp
@@ -0,0 +1,84 @@
+//===-- Half-precision cos(x) function ------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "src/math/cosf16.h"
+#include "hdr/errno_macros.h"
+#include "hdr/fenv_macros.h"
+#include "sincosf16_utils.h"
+#include "src/__support/FPUtil/FEnvImpl.h"
+#include "src/__support/FPUtil/FPBits.h"
+#include "src/__support/FPUtil/cast.h"
+#include "src/__support/FPUtil/except_value_utils.h"
+#include "src/__support/FPUtil/multiply_add.h"
+#include "src/__support/macros/optimization.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+constexpr size_t N_EXCEPTS = 4;
+
+constexpr fputil::ExceptValues<float16, N_EXCEPTS> COSF16_EXCEPTS{{
+ // (input, RZ output, RU offset, RD offset, RN offset)
+ {0x2b7c, 0x3bfc, 1, 0, 1},
+ {0x4ac1, 0x38b5, 1, 0, 0},
+ {0x5c49, 0xb8c6, 0, 1, 0},
+ {0x7acc, 0xa474, 0, 1, 0},
+}};
+
+LLVM_LIBC_FUNCTION(float16, cosf16, (float16 x)) {
+ using FPBits = fputil::FPBits<float16>;
+ FPBits xbits(x);
+
+ uint16_t x_u = xbits.uintval();
+ uint16_t x_abs = x_u & 0x7fff;
+ float xf = x;
+
+ // Range reduction:
+ // For |x| > pi/32, we perform range reduction as follows:
+ // Find k and y such that:
+ // x = (k + y) * pi/32
+ // k is an integer, |y| < 0.5
+ //
+ // This is done by performing:
+ // k = round(x * 32/pi)
+ // y = x * 32/pi - k
+ //
+ // Once k and y are computed, we then deduce the answer by the cosine of sum
+ // formula:
+ // cos(x) = cos((k + y) * pi/32)
+ // = cos(k * pi/32) * cos(y * pi/32) -
+ // sin(k * pi/32) * sin(y * pi/32)
+
+ // Handle exceptional values
+ if (auto r = COSF16_EXCEPTS.lookup(x_abs); LIBC_UNLIKELY(r.has_value()))
+ return r.value();
+
+ // cos(+/-0) = 1
+ if (LIBC_UNLIKELY(x_abs == 0U))
+ return fputil::cast<float16>(1.0f);
+
+ // cos(+/-inf) = NaN, and cos(NaN) = NaN
+ if (xbits.is_inf_or_nan()) {
+ if (xbits.is_inf()) {
+ fputil::set_errno_if_required(EDOM);
+ fputil::raise_except_if_required(FE_INVALID);
+ }
+
+ return x + FPBits::quiet_nan().get_val();
+ }
+
+ float sin_k, cos_k, sin_y, cosm1_y;
+ sincosf16_eval(xf, sin_k, cos_k, sin_y, cosm1_y);
+ // Since, cosm1_y = cos_y - 1, therefore:
+ // cos(x) = cos_k * cos_y - sin_k * sin_y
+ // = cos_k * (cos_y - 1 + 1) - sin_k * sin_y
+ // = cos_k * cosm1_y - sin_k * sin_y + cos_k
+ return fputil::cast<float16>(fputil::multiply_add(
+ cos_k, cosm1_y, fputil::multiply_add(-sin_k, sin_y, cos_k)));
+}
+
+} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/math/generic/cospif16.cpp b/libc/src/math/generic/cospif16.cpp
index 384b39ff8e2c..ee74bdb4a369 100644
--- a/libc/src/math/generic/cospif16.cpp
+++ b/libc/src/math/generic/cospif16.cpp
@@ -73,7 +73,7 @@ LLVM_LIBC_FUNCTION(float16, cospif16, (float16 x)) {
return fputil::cast<float16>(0.0f);
// Since, cosm1_y = cos_y - 1, therefore:
- // cos(x * pi) = cos_k(cosm1_y) + cos_k - sin_k * sin_y
+ // cos(x * pi) = cos_k(cosm1_y) + cos_k - sin_k * sin_y
return fputil::cast<float16>(fputil::multiply_add(
cos_k, cosm1_y, fputil::multiply_add(-sin_k, sin_y, cos_k)));
}
diff --git a/libc/src/math/generic/sinf16.cpp b/libc/src/math/generic/sinf16.cpp
index 86546348ba73..7c15951cccec 100644
--- a/libc/src/math/generic/sinf16.cpp
+++ b/libc/src/math/generic/sinf16.cpp
@@ -54,13 +54,10 @@ LLVM_LIBC_FUNCTION(float16, sinf16, (float16 x)) {
// sin(y * pi/32) * cos(k * pi/32)
// Handle exceptional values
- if (LIBC_UNLIKELY(x_abs == 0x585c || x_abs == 0x5cb0 || x_abs == 0x51f5 ||
- x_abs == 0x2b45)) {
- bool x_sign = x_u >> 15;
- if (auto r = SINF16_EXCEPTS.lookup_odd(x_abs, x_sign);
- LIBC_UNLIKELY(r.has_value()))
- return r.value();
- }
+ bool x_sign = x_u >> 15;
+ if (auto r = SINF16_EXCEPTS.lookup_odd(x_abs, x_sign);
+ LIBC_UNLIKELY(r.has_value()))
+ return r.value();
int rounding = fputil::quick_get_round();
@@ -99,8 +96,8 @@ LLVM_LIBC_FUNCTION(float16, sinf16, (float16 x)) {
if (LIBC_UNLIKELY(sin_y == 0 && sin_k == 0))
return FPBits::zero(xbits.sign()).get_val();
- // Since, cosm1_y = cos_y - 1, therfore:
- // sin(x) = cos_k * sin_y + sin_k + (cosm1_y * sin_k)
+ // Since, cosm1_y = cos_y - 1, therefore:
+ // sin(x) = cos_k * sin_y + sin_k + (cosm1_y * sin_k)
return fputil::cast<float16>(fputil::multiply_add(
sin_y, cos_k, fputil::multiply_add(cosm1_y, sin_k, sin_k)));
}
diff --git a/libc/src/stdlib/CMakeLists.txt b/libc/src/stdlib/CMakeLists.txt
index 14d06534a604..40ba9ead9a7a 100644
--- a/libc/src/stdlib/CMakeLists.txt
+++ b/libc/src/stdlib/CMakeLists.txt
@@ -323,7 +323,7 @@ add_entrypoint_object(
.rand_util
)
-if(NOT LIBC_TARGET_OS_IS_GPU)
+if(NOT LIBC_TARGET_OS_IS_BAREMETAL AND NOT LIBC_TARGET_OS_IS_GPU)
if(LLVM_LIBC_INCLUDE_SCUDO)
set(SCUDO_DEPS "")
@@ -349,7 +349,7 @@ if(NOT LIBC_TARGET_OS_IS_GPU)
list(APPEND SCUDO_DEPS RTScudoStandalone.${LIBC_TARGET_ARCHITECTURE_FOR_SCUDO}
RTScudoStandaloneCWrappers.${LIBC_TARGET_ARCHITECTURE_FOR_SCUDO})
-
+
if (COMPILER_RT_BUILD_GWP_ASAN)
list(APPEND SCUDO_DEPS
RTGwpAsan.${LIBC_TARGET_ARCHITECTURE_FOR_SCUDO}
@@ -389,32 +389,8 @@ if(NOT LIBC_TARGET_OS_IS_GPU)
${SCUDO_DEPS}
)
else()
- # Only use freelist malloc for baremetal targets.
- add_entrypoint_object(
- freelist_malloc
- SRCS
- freelist_malloc.cpp
- HDRS
- malloc.h
- DEPENDS
- libc.src.__support.freelist_heap
- )
- get_target_property(freelist_malloc_is_skipped libc.src.stdlib.freelist_malloc "SKIPPED")
- if(LIBC_TARGET_OS_IS_BAREMETAL AND NOT freelist_malloc_is_skipped)
- add_entrypoint_object(
- malloc
- ALIAS
- DEPENDS
- .freelist_malloc
- )
- else()
- add_entrypoint_external(
- malloc
- )
- endif()
-
add_entrypoint_external(
- free
+ malloc
)
add_entrypoint_external(
calloc
@@ -425,6 +401,12 @@ if(NOT LIBC_TARGET_OS_IS_GPU)
add_entrypoint_external(
aligned_alloc
)
+ add_entrypoint_external(
+ free
+ )
+ add_entrypoint_external(
+ mallopt
+ )
endif()
endif()
@@ -513,7 +495,7 @@ if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${LIBC_TARGET_OS})
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/${LIBC_TARGET_OS})
endif()
-if(LIBC_TARGET_OS_IS_GPU)
+if(LIBC_TARGET_OS_IS_BAREMETAL OR LIBC_TARGET_OS_IS_GPU)
add_entrypoint_object(
malloc
ALIAS
diff --git a/libc/src/stdlib/baremetal/CMakeLists.txt b/libc/src/stdlib/baremetal/CMakeLists.txt
index 551a83a36b20..67ab1979e4d1 100644
--- a/libc/src/stdlib/baremetal/CMakeLists.txt
+++ b/libc/src/stdlib/baremetal/CMakeLists.txt
@@ -5,3 +5,53 @@ add_entrypoint_object(
HDRS
../abort.h
)
+
+add_entrypoint_object(
+ malloc
+ SRCS
+ malloc.cpp
+ HDRS
+ ../malloc.h
+ DEPENDS
+ libc.src.__support.freelist_heap
+)
+
+add_entrypoint_object(
+ free
+ SRCS
+ free.cpp
+ HDRS
+ ../free.h
+ DEPENDS
+ libc.src.__support.freelist_heap
+)
+
+add_entrypoint_object(
+ calloc
+ SRCS
+ calloc.cpp
+ HDRS
+ ../calloc.h
+ DEPENDS
+ libc.src.__support.freelist_heap
+)
+
+add_entrypoint_object(
+ realloc
+ SRCS
+ realloc.cpp
+ HDRS
+ ../realloc.h
+ DEPENDS
+ libc.src.__support.freelist_heap
+)
+
+add_entrypoint_object(
+ aligned_alloc
+ SRCS
+ aligned_alloc.cpp
+ HDRS
+ ../aligned_alloc.h
+ DEPENDS
+ libc.src.__support.freelist_heap
+)
diff --git a/libc/src/stdlib/baremetal/aligned_alloc.cpp b/libc/src/stdlib/baremetal/aligned_alloc.cpp
new file mode 100644
index 000000000000..e9548719c3a6
--- /dev/null
+++ b/libc/src/stdlib/baremetal/aligned_alloc.cpp
@@ -0,0 +1,21 @@
+//===-- Implementation for freelist_malloc --------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "src/stdlib/aligned_alloc.h"
+#include "src/__support/freelist_heap.h"
+#include "src/__support/macros/config.h"
+
+#include <stddef.h>
+
+namespace LIBC_NAMESPACE_DECL {
+
+LLVM_LIBC_FUNCTION(void *, aligned_alloc, (size_t alignment, size_t size)) {
+ return freelist_heap->aligned_allocate(alignment, size);
+}
+
+} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/stdlib/baremetal/calloc.cpp b/libc/src/stdlib/baremetal/calloc.cpp
new file mode 100644
index 000000000000..2b3b83cebc8a
--- /dev/null
+++ b/libc/src/stdlib/baremetal/calloc.cpp
@@ -0,0 +1,21 @@
+//===-- Implementation for freelist_malloc --------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "src/stdlib/calloc.h"
+#include "src/__support/freelist_heap.h"
+#include "src/__support/macros/config.h"
+
+#include <stddef.h>
+
+namespace LIBC_NAMESPACE_DECL {
+
+LLVM_LIBC_FUNCTION(void *, calloc, (size_t num, size_t size)) {
+ return freelist_heap->calloc(num, size);
+}
+
+} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/stdlib/baremetal/free.cpp b/libc/src/stdlib/baremetal/free.cpp
new file mode 100644
index 000000000000..1e25fe5f2dcf
--- /dev/null
+++ b/libc/src/stdlib/baremetal/free.cpp
@@ -0,0 +1,19 @@
+//===-- Implementation for freelist_malloc --------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "src/stdlib/free.h"
+#include "src/__support/freelist_heap.h"
+#include "src/__support/macros/config.h"
+
+#include <stddef.h>
+
+namespace LIBC_NAMESPACE_DECL {
+
+LLVM_LIBC_FUNCTION(void, free, (void *ptr)) { return freelist_heap->free(ptr); }
+
+} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/stdlib/baremetal/malloc.cpp b/libc/src/stdlib/baremetal/malloc.cpp
new file mode 100644
index 000000000000..a299282667fc
--- /dev/null
+++ b/libc/src/stdlib/baremetal/malloc.cpp
@@ -0,0 +1,21 @@
+//===-- Implementation for freelist_malloc --------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "src/stdlib/malloc.h"
+#include "src/__support/freelist_heap.h"
+#include "src/__support/macros/config.h"
+
+#include <stddef.h>
+
+namespace LIBC_NAMESPACE_DECL {
+
+LLVM_LIBC_FUNCTION(void *, malloc, (size_t size)) {
+ return freelist_heap->allocate(size);
+}
+
+} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/stdlib/baremetal/realloc.cpp b/libc/src/stdlib/baremetal/realloc.cpp
new file mode 100644
index 000000000000..fb25c68ec429
--- /dev/null
+++ b/libc/src/stdlib/baremetal/realloc.cpp
@@ -0,0 +1,21 @@
+//===-- Implementation for freelist_malloc --------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "src/stdlib/realloc.h"
+#include "src/__support/freelist_heap.h"
+#include "src/__support/macros/config.h"
+
+#include <stddef.h>
+
+namespace LIBC_NAMESPACE_DECL {
+
+LLVM_LIBC_FUNCTION(void *, realloc, (void *ptr, size_t size)) {
+ return freelist_heap->realloc(ptr, size);
+}
+
+} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/stdlib/freelist_malloc.cpp b/libc/src/stdlib/freelist_malloc.cpp
deleted file mode 100644
index fe56fad76937..000000000000
--- a/libc/src/stdlib/freelist_malloc.cpp
+++ /dev/null
@@ -1,42 +0,0 @@
-//===-- Implementation for freelist_malloc --------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "src/__support/freelist_heap.h"
-#include "src/__support/macros/config.h"
-#include "src/stdlib/aligned_alloc.h"
-#include "src/stdlib/calloc.h"
-#include "src/stdlib/free.h"
-#include "src/stdlib/malloc.h"
-#include "src/stdlib/realloc.h"
-
-#include <stddef.h>
-
-namespace LIBC_NAMESPACE_DECL {
-
-static LIBC_CONSTINIT FreeListHeap freelist_heap_symbols;
-FreeListHeap *freelist_heap = &freelist_heap_symbols;
-
-LLVM_LIBC_FUNCTION(void *, malloc, (size_t size)) {
- return freelist_heap->allocate(size);
-}
-
-LLVM_LIBC_FUNCTION(void, free, (void *ptr)) { return freelist_heap->free(ptr); }
-
-LLVM_LIBC_FUNCTION(void *, calloc, (size_t num, size_t size)) {
- return freelist_heap->calloc(num, size);
-}
-
-LLVM_LIBC_FUNCTION(void *, realloc, (void *ptr, size_t size)) {
- return freelist_heap->realloc(ptr, size);
-}
-
-LLVM_LIBC_FUNCTION(void *, aligned_alloc, (size_t alignment, size_t size)) {
- return freelist_heap->aligned_allocate(alignment, size);
-}
-
-} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/string/CMakeLists.txt b/libc/src/string/CMakeLists.txt
index 8fe1226dd6a7..e3faa543e630 100644
--- a/libc/src/string/CMakeLists.txt
+++ b/libc/src/string/CMakeLists.txt
@@ -35,24 +35,6 @@ add_header_library(
)
add_entrypoint_object(
- bcopy
- SRCS
- bcopy.cpp
- HDRS
- bcopy.h
-)
-
-add_entrypoint_object(
- index
- SRCS
- index.cpp
- HDRS
- index.h
- DEPENDS
- .string_utils
-)
-
-add_entrypoint_object(
memccpy
SRCS
memccpy.cpp
@@ -99,16 +81,6 @@ add_entrypoint_object(
)
add_entrypoint_object(
- rindex
- SRCS
- rindex.cpp
- HDRS
- rindex.h
- DEPENDS
- .string_utils
-)
-
-add_entrypoint_object(
stpcpy
SRCS
stpcpy.cpp
@@ -172,17 +144,6 @@ add_entrypoint_object(
)
add_entrypoint_object(
- strcasecmp
- SRCS
- strcasecmp.cpp
- HDRS
- strcasecmp.h
- DEPENDS
- .memory_utils.inline_strcmp
- libc.src.__support.ctype_utils
-)
-
-add_entrypoint_object(
strcasestr
SRCS
strcasestr.cpp
@@ -320,17 +281,6 @@ add_entrypoint_object(
)
add_entrypoint_object(
- strncasecmp
- SRCS
- strncasecmp.cpp
- HDRS
- strncasecmp.h
- DEPENDS
- .memory_utils.inline_strcmp
- libc.src.__support.ctype_utils
-)
-
-add_entrypoint_object(
strncpy
SRCS
strncpy.cpp
@@ -475,102 +425,6 @@ add_entrypoint_object(
.memory_utils.inline_memset
)
-# Helper to define a function with multiple implementations
-# - Computes flags to satisfy required/rejected features and arch,
-# - Declares an entry point,
-# - Attach the REQUIRE_CPU_FEATURES property to the target,
-# - Add the fully qualified target to `${name}_implementations` global property for tests.
-function(add_implementation name impl_name)
- cmake_parse_arguments(
- "ADD_IMPL"
- "" # Optional arguments
- "" # Single value arguments
- "REQUIRE;SRCS;HDRS;DEPENDS;COMPILE_OPTIONS;MLLVM_COMPILE_OPTIONS" # Multi value arguments
- ${ARGN})
-
- if("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
- # Note that '-mllvm' needs to be prefixed with 'SHELL:' to prevent CMake flag deduplication.
- foreach(opt IN LISTS ADD_IMPL_MLLVM_COMPILE_OPTIONS)
- list(APPEND ADD_IMPL_COMPILE_OPTIONS "SHELL:-mllvm ${opt}")
- endforeach()
- endif()
-
- if("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU")
- # Prevent warning when passing x86 SIMD types as template arguments.
- # e.g. "warning: ignoring attributes on template argument ‘__m128i’ [-Wignored-attributes]"
- list(APPEND ADD_IMPL_COMPILE_OPTIONS "-Wno-ignored-attributes")
- endif()
-
- add_entrypoint_object(${impl_name}
- NAME ${name}
- SRCS ${ADD_IMPL_SRCS}
- HDRS ${ADD_IMPL_HDRS}
- DEPENDS ${ADD_IMPL_DEPENDS}
- COMPILE_OPTIONS ${libc_opt_high_flag} ${ADD_IMPL_COMPILE_OPTIONS}
- )
- get_fq_target_name(${impl_name} fq_target_name)
- set_target_properties(${fq_target_name} PROPERTIES REQUIRE_CPU_FEATURES "${ADD_IMPL_REQUIRE}")
- set_property(GLOBAL APPEND PROPERTY "${name}_implementations" "${fq_target_name}")
-endfunction()
-
-# ------------------------------------------------------------------------------
-# bcmp
-# ------------------------------------------------------------------------------
-
-function(add_bcmp bcmp_name)
- add_implementation(bcmp ${bcmp_name}
- SRCS ${LIBC_SOURCE_DIR}/src/string/bcmp.cpp
- HDRS ${LIBC_SOURCE_DIR}/src/string/bcmp.h
- DEPENDS
- .memory_utils.memory_utils
- libc.include.string
- ${ARGN}
- )
-endfunction()
-
-if(${LIBC_TARGET_ARCHITECTURE_IS_X86})
- add_bcmp(bcmp_x86_64_opt_sse2 COMPILE_OPTIONS -march=k8 REQUIRE SSE2)
- add_bcmp(bcmp_x86_64_opt_sse4 COMPILE_OPTIONS -march=nehalem REQUIRE SSE4_2)
- add_bcmp(bcmp_x86_64_opt_avx2 COMPILE_OPTIONS -march=haswell REQUIRE AVX2)
- add_bcmp(bcmp_x86_64_opt_avx512 COMPILE_OPTIONS -march=skylake-avx512 REQUIRE AVX512BW)
- add_bcmp(bcmp_opt_host COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
- add_bcmp(bcmp)
-elseif(LIBC_TARGET_OS_IS_GPU)
- add_bcmp(bcmp)
-else()
- add_bcmp(bcmp_opt_host COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
- add_bcmp(bcmp)
-endif()
-
-# ------------------------------------------------------------------------------
-# bzero
-# ------------------------------------------------------------------------------
-
-function(add_bzero bzero_name)
- add_implementation(bzero ${bzero_name}
- SRCS ${LIBC_SOURCE_DIR}/src/string/bzero.cpp
- HDRS ${LIBC_SOURCE_DIR}/src/string/bzero.h
- DEPENDS
- .memory_utils.inline_memset
- libc.include.string
- ${ARGN}
- )
-endfunction()
-
-if(${LIBC_TARGET_ARCHITECTURE_IS_X86})
- add_bzero(bzero_x86_64_opt_sse2 COMPILE_OPTIONS -march=k8 REQUIRE SSE2)
- add_bzero(bzero_x86_64_opt_sse4 COMPILE_OPTIONS -march=nehalem REQUIRE SSE4_2)
- add_bzero(bzero_x86_64_opt_avx2 COMPILE_OPTIONS -march=haswell REQUIRE AVX2)
- add_bzero(bzero_x86_64_opt_avx512 COMPILE_OPTIONS -march=skylake-avx512 REQUIRE AVX512F)
- add_bzero(bzero_opt_host COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
- add_bzero(bzero)
-elseif(LIBC_TARGET_OS_IS_GPU)
- add_bzero(bzero)
-else()
- add_bzero(bzero_opt_host COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
- add_bzero(bzero)
-endif()
-
# ------------------------------------------------------------------------------
# memcmp
# ------------------------------------------------------------------------------
diff --git a/libc/src/strings/CMakeLists.txt b/libc/src/strings/CMakeLists.txt
new file mode 100644
index 000000000000..5e84c7be1f7d
--- /dev/null
+++ b/libc/src/strings/CMakeLists.txt
@@ -0,0 +1,97 @@
+function(add_bcmp bcmp_name)
+ add_implementation(bcmp ${bcmp_name}
+ SRCS ${LIBC_SOURCE_DIR}/src/strings/bcmp.cpp
+ HDRS ${LIBC_SOURCE_DIR}/src/strings/bcmp.h
+ DEPENDS
+ libc.src.string.memory_utils.memory_utils
+ ${ARGN}
+ )
+endfunction()
+
+if(${LIBC_TARGET_ARCHITECTURE_IS_X86})
+ add_bcmp(bcmp_x86_64_opt_sse2 COMPILE_OPTIONS -march=k8 REQUIRE SSE2)
+ add_bcmp(bcmp_x86_64_opt_sse4 COMPILE_OPTIONS -march=nehalem REQUIRE SSE4_2)
+ add_bcmp(bcmp_x86_64_opt_avx2 COMPILE_OPTIONS -march=haswell REQUIRE AVX2)
+ add_bcmp(bcmp_x86_64_opt_avx512 COMPILE_OPTIONS -march=skylake-avx512 REQUIRE AVX512BW)
+ add_bcmp(bcmp_opt_host COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
+ add_bcmp(bcmp)
+elseif(LIBC_TARGET_OS_IS_GPU)
+ add_bcmp(bcmp)
+else()
+ add_bcmp(bcmp_opt_host COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
+ add_bcmp(bcmp)
+endif()
+
+function(add_bzero bzero_name)
+ add_implementation(bzero ${bzero_name}
+ SRCS ${LIBC_SOURCE_DIR}/src/strings/bzero.cpp
+ HDRS ${LIBC_SOURCE_DIR}/src/strings/bzero.h
+ DEPENDS
+ libc.src.string.memory_utils.inline_memset
+ ${ARGN}
+ )
+endfunction()
+
+if(${LIBC_TARGET_ARCHITECTURE_IS_X86})
+ add_bzero(bzero_x86_64_opt_sse2 COMPILE_OPTIONS -march=k8 REQUIRE SSE2)
+ add_bzero(bzero_x86_64_opt_sse4 COMPILE_OPTIONS -march=nehalem REQUIRE SSE4_2)
+ add_bzero(bzero_x86_64_opt_avx2 COMPILE_OPTIONS -march=haswell REQUIRE AVX2)
+ add_bzero(bzero_x86_64_opt_avx512 COMPILE_OPTIONS -march=skylake-avx512 REQUIRE AVX512F)
+ add_bzero(bzero_opt_host COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
+ add_bzero(bzero)
+elseif(LIBC_TARGET_OS_IS_GPU)
+ add_bzero(bzero)
+else()
+ add_bzero(bzero_opt_host COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
+ add_bzero(bzero)
+endif()
+
+add_entrypoint_object(
+ bcopy
+ SRCS
+ bcopy.cpp
+ HDRS
+ bcopy.h
+)
+
+add_entrypoint_object(
+ index
+ SRCS
+ index.cpp
+ HDRS
+ index.h
+ DEPENDS
+ libc.src.string.string_utils
+)
+
+add_entrypoint_object(
+ rindex
+ SRCS
+ rindex.cpp
+ HDRS
+ rindex.h
+ DEPENDS
+ libc.src.string.string_utils
+)
+
+add_entrypoint_object(
+ strcasecmp
+ SRCS
+ strcasecmp.cpp
+ HDRS
+ strcasecmp.h
+ DEPENDS
+ libc.src.__support.ctype_utils
+ libc.src.string.memory_utils.inline_strcmp
+)
+
+add_entrypoint_object(
+ strncasecmp
+ SRCS
+ strncasecmp.cpp
+ HDRS
+ strncasecmp.h
+ DEPENDS
+ libc.src.__support.ctype_utils
+ libc.src.string.memory_utils.inline_strcmp
+)
diff --git a/libc/src/string/bcmp.cpp b/libc/src/strings/bcmp.cpp
index 6e9c9ae3b7a3..083f13d3f95d 100644
--- a/libc/src/string/bcmp.cpp
+++ b/libc/src/strings/bcmp.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-#include "src/string/bcmp.h"
+#include "src/strings/bcmp.h"
#include "src/__support/common.h"
#include "src/__support/macros/config.h"
#include "src/string/memory_utils/inline_bcmp.h"
diff --git a/libc/src/string/bcmp.h b/libc/src/strings/bcmp.h
index a82b529164d9..46b4d7163b52 100644
--- a/libc/src/string/bcmp.h
+++ b/libc/src/strings/bcmp.h
@@ -6,8 +6,8 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_LIBC_SRC_STRING_BCMP_H
-#define LLVM_LIBC_SRC_STRING_BCMP_H
+#ifndef LLVM_LIBC_SRC_STRINGS_BCMP_H
+#define LLVM_LIBC_SRC_STRINGS_BCMP_H
#include "src/__support/macros/config.h"
#include <stddef.h> // size_t
@@ -18,4 +18,4 @@ int bcmp(const void *lhs, const void *rhs, size_t count);
} // namespace LIBC_NAMESPACE_DECL
-#endif // LLVM_LIBC_SRC_STRING_BCMP_H
+#endif // LLVM_LIBC_SRC_STRINGS_BCMP_H
diff --git a/libc/src/string/bcopy.cpp b/libc/src/strings/bcopy.cpp
index 89aad71e354c..eb0358c18747 100644
--- a/libc/src/string/bcopy.cpp
+++ b/libc/src/strings/bcopy.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-#include "src/string/bcopy.h"
+#include "src/strings/bcopy.h"
#include "src/__support/common.h"
#include "src/__support/macros/config.h"
#include "src/string/memory_utils/inline_memmove.h"
diff --git a/libc/src/string/bcopy.h b/libc/src/strings/bcopy.h
index 4cf0263a7d63..d8ee77e83c6d 100644
--- a/libc/src/string/bcopy.h
+++ b/libc/src/strings/bcopy.h
@@ -6,8 +6,8 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_LIBC_SRC_STRING_BCOPY_H
-#define LLVM_LIBC_SRC_STRING_BCOPY_H
+#ifndef LLVM_LIBC_SRC_STRINGS_BCOPY_H
+#define LLVM_LIBC_SRC_STRINGS_BCOPY_H
#include "src/__support/macros/config.h"
#include <stddef.h> // size_t
@@ -18,4 +18,4 @@ void bcopy(const void *src, void *dest, size_t count);
} // namespace LIBC_NAMESPACE_DECL
-#endif // LLVM_LIBC_SRC_STRING_BCOPY_H
+#endif // LLVM_LIBC_SRC_STRINGS_BCOPY_H
diff --git a/libc/src/string/bzero.cpp b/libc/src/strings/bzero.cpp
index 7bcbee3547b9..9c2e9700442a 100644
--- a/libc/src/string/bzero.cpp
+++ b/libc/src/strings/bzero.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-#include "src/string/bzero.h"
+#include "src/strings/bzero.h"
#include "src/__support/common.h"
#include "src/__support/macros/config.h"
#include "src/string/memory_utils/inline_bzero.h"
diff --git a/libc/src/string/bzero.h b/libc/src/strings/bzero.h
index d9722197e8e8..3e270fe41f6c 100644
--- a/libc/src/string/bzero.h
+++ b/libc/src/strings/bzero.h
@@ -6,8 +6,8 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_LIBC_SRC_STRING_BZERO_H
-#define LLVM_LIBC_SRC_STRING_BZERO_H
+#ifndef LLVM_LIBC_SRC_STRINGS_BZERO_H
+#define LLVM_LIBC_SRC_STRINGS_BZERO_H
#include "src/__support/macros/config.h"
#include <stddef.h> // size_t
@@ -18,4 +18,4 @@ void bzero(void *ptr, size_t count);
} // namespace LIBC_NAMESPACE_DECL
-#endif // LLVM_LIBC_SRC_STRING_BZERO_H
+#endif // LLVM_LIBC_SRC_STRINGS_BZERO_H
diff --git a/libc/src/string/index.cpp b/libc/src/strings/index.cpp
index 46cf54825f6c..33b2be9f33e0 100644
--- a/libc/src/string/index.cpp
+++ b/libc/src/strings/index.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-#include "src/string/index.h"
+#include "src/strings/index.h"
#include "src/__support/common.h"
#include "src/__support/macros/config.h"
diff --git a/libc/src/string/index.h b/libc/src/strings/index.h
index 9843bcdf9a57..d382cdd249aa 100644
--- a/libc/src/string/index.h
+++ b/libc/src/strings/index.h
@@ -6,8 +6,8 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_LIBC_SRC_STRING_INDEX_H
-#define LLVM_LIBC_SRC_STRING_INDEX_H
+#ifndef LLVM_LIBC_SRC_STRINGS_INDEX_H
+#define LLVM_LIBC_SRC_STRINGS_INDEX_H
#include "src/__support/macros/config.h"
@@ -17,4 +17,4 @@ char *index(const char *src, int c);
} // namespace LIBC_NAMESPACE_DECL
-#endif // LLVM_LIBC_SRC_STRING_INDEX_H
+#endif // LLVM_LIBC_SRC_STRINGS_INDEX_H
diff --git a/libc/src/string/rindex.cpp b/libc/src/strings/rindex.cpp
index 25879ddb07f6..1242e0faf85f 100644
--- a/libc/src/string/rindex.cpp
+++ b/libc/src/strings/rindex.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-#include "src/string/rindex.h"
+#include "src/strings/rindex.h"
#include "src/__support/common.h"
#include "src/__support/macros/config.h"
diff --git a/libc/src/string/rindex.h b/libc/src/strings/rindex.h
index cfc35daa1f4d..f8aa7b9be28f 100644
--- a/libc/src/string/rindex.h
+++ b/libc/src/strings/rindex.h
@@ -6,8 +6,8 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_LIBC_SRC_STRING_RINDEX_H
-#define LLVM_LIBC_SRC_STRING_RINDEX_H
+#ifndef LLVM_LIBC_SRC_STRINGS_RINDEX_H
+#define LLVM_LIBC_SRC_STRINGS_RINDEX_H
#include "src/__support/macros/config.h"
@@ -17,4 +17,4 @@ char *rindex(const char *src, int c);
} // namespace LIBC_NAMESPACE_DECL
-#endif // LLVM_LIBC_SRC_STRING_RINDEX_H
+#endif // LLVM_LIBC_SRC_STRINGS_RINDEX_H
diff --git a/libc/src/string/strcasecmp.cpp b/libc/src/strings/strcasecmp.cpp
index 1274c047fc28..4bbe2909df1e 100644
--- a/libc/src/string/strcasecmp.cpp
+++ b/libc/src/strings/strcasecmp.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-#include "src/string/strcasecmp.h"
+#include "src/strings/strcasecmp.h"
#include "src/__support/common.h"
#include "src/__support/ctype_utils.h"
diff --git a/libc/src/string/strcasecmp.h b/libc/src/strings/strcasecmp.h
index 2916b8d41707..b02fb3161587 100644
--- a/libc/src/string/strcasecmp.h
+++ b/libc/src/strings/strcasecmp.h
@@ -6,8 +6,8 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_LIBC_SRC_STRING_STRCASECMP_H
-#define LLVM_LIBC_SRC_STRING_STRCASECMP_H
+#ifndef LLVM_LIBC_SRC_STRINGS_STRCASECMP_H
+#define LLVM_LIBC_SRC_STRINGS_STRCASECMP_H
#include "src/__support/macros/config.h"
@@ -17,4 +17,4 @@ int strcasecmp(const char *left, const char *right);
} // namespace LIBC_NAMESPACE_DECL
-#endif // LLVM_LIBC_SRC_STRING_STRCASECMP_H
+#endif // LLVM_LIBC_SRC_STRINGS_STRCASECMP_H
diff --git a/libc/src/string/strncasecmp.cpp b/libc/src/strings/strncasecmp.cpp
index 45f82c98069b..9c2f0ab13126 100644
--- a/libc/src/string/strncasecmp.cpp
+++ b/libc/src/strings/strncasecmp.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-#include "src/string/strncasecmp.h"
+#include "src/strings/strncasecmp.h"
#include "src/__support/common.h"
#include "src/__support/ctype_utils.h"
diff --git a/libc/src/string/strncasecmp.h b/libc/src/strings/strncasecmp.h
index 15f74994ca56..59df51705891 100644
--- a/libc/src/string/strncasecmp.h
+++ b/libc/src/strings/strncasecmp.h
@@ -6,8 +6,8 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_LIBC_SRC_STRING_STRNCASECMP_H
-#define LLVM_LIBC_SRC_STRING_STRNCASECMP_H
+#ifndef LLVM_LIBC_SRC_STRINGS_STRNCASECMP_H
+#define LLVM_LIBC_SRC_STRINGS_STRNCASECMP_H
#include "src/__support/macros/config.h"
#include <stddef.h>
@@ -18,4 +18,4 @@ int strncasecmp(const char *left, const char *right, size_t n);
} // namespace LIBC_NAMESPACE_DECL
-#endif // LLVM_LIBC_SRC_STRING_STRNCASECMP_H
+#endif // LLVM_LIBC_SRC_STRINGS_STRNCASECMP_H
diff --git a/libc/src/sys/mman/CMakeLists.txt b/libc/src/sys/mman/CMakeLists.txt
index 281efc0ffcdf..4d4c2ad37605 100644
--- a/libc/src/sys/mman/CMakeLists.txt
+++ b/libc/src/sys/mman/CMakeLists.txt
@@ -113,9 +113,3 @@ add_entrypoint_object(
DEPENDS
.${LIBC_TARGET_OS}.mremap
)
-
-add_entrypoint_object(
- process_mrelease
- ALIAS
- DEPENDS
- .${LIBC_TARGET_OS}.process_mrelease)
diff --git a/libc/src/sys/mman/linux/CMakeLists.txt b/libc/src/sys/mman/linux/CMakeLists.txt
index aa2ca4b16018..89a0ad1527a0 100644
--- a/libc/src/sys/mman/linux/CMakeLists.txt
+++ b/libc/src/sys/mman/linux/CMakeLists.txt
@@ -36,6 +36,7 @@ add_entrypoint_object(
libc.src.__support.OSUtil.osutil
libc.src.errno.errno
)
+
add_entrypoint_object(
munmap
SRCS
@@ -213,14 +214,3 @@ add_entrypoint_object(
libc.src.unistd.unlink
.shm_common
)
-
-add_entrypoint_object(
- process_mrelease
- SRCS
- process_mrelease.cpp
- HDRS
- ../process_mrelease.h
- DEPENDS
- libc.include.sys_syscall
- libc.src.__support.OSUtil.osutil
- libc.src.errno.errno)
diff --git a/libc/src/sys/mman/linux/process_mrelease.cpp b/libc/src/sys/mman/linux/process_mrelease.cpp
deleted file mode 100644
index 7660f1e23ece..000000000000
--- a/libc/src/sys/mman/linux/process_mrelease.cpp
+++ /dev/null
@@ -1,41 +0,0 @@
-//===---------- Linux implementation of the mrelease function -----------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "src/sys/mman/process_mrelease.h"
-
-#include "src/__support/OSUtil/syscall.h" // For internal syscall function.
-#include "src/__support/common.h"
-
-#include "src/__support/macros/config.h"
-#include "src/errno/libc_errno.h"
-#include <linux/param.h> // For EXEC_PAGESIZE.
-#include <sys/syscall.h> // For syscall numbers.
-
-namespace LIBC_NAMESPACE_DECL {
-
-LLVM_LIBC_FUNCTION(int, process_mrelease, (int pidfd, unsigned int flags)) {
-#ifdef SYS_process_mrelease
- long ret =
- LIBC_NAMESPACE::syscall_impl<int>(SYS_process_mrelease, pidfd, flags);
-
- if (ret < 0) {
- libc_errno = static_cast<int>(-ret);
- return -1;
- }
-
- return 0;
-#else
- // The system call is not available.
- (void)pidfd;
- (void)flags;
- libc_errno = ENOSYS;
- return -1;
-#endif
-}
-
-} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/sys/mman/process_mrelease.h b/libc/src/sys/mman/process_mrelease.h
deleted file mode 100644
index 6c800f2d0eab..000000000000
--- a/libc/src/sys/mman/process_mrelease.h
+++ /dev/null
@@ -1,21 +0,0 @@
-//===-- Implementation header for process_mrelease function -*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===------------------------------------------------------------------===//
-
-#ifndef LLVM_LIBC_SRC_SYS_MMAN_PROCESS_MRELEASE_H
-#define LLVM_LIBC_SRC_SYS_MMAN_PROCESS_MRELEASE_H
-
-#include "src/__support/macros/config.h"
-#include <sys/mman.h> // For size_t and off_t
-
-namespace LIBC_NAMESPACE_DECL {
-
-int process_mrelease(int pidfd, unsigned int flags);
-
-} // namespace LIBC_NAMESPACE_DECL
-
-#endif // LLVM_LIBC_SRC_SYS_MMAN_PROCESS_MRELEASE_H
diff --git a/libc/src/time/CMakeLists.txt b/libc/src/time/CMakeLists.txt
index f18e74a15e6f..ae835dcc7427 100644
--- a/libc/src/time/CMakeLists.txt
+++ b/libc/src/time/CMakeLists.txt
@@ -106,9 +106,15 @@ add_entrypoint_object(
add_entrypoint_object(
time
- ALIAS
+ SRCS
+ time.cpp
+ HDRS
+ time_func.h
DEPENDS
- .${LIBC_TARGET_OS}.time
+ libc.hdr.time_macros
+ libc.hdr.types.time_t
+ libc.src.__support.time.clock_gettime
+ libc.src.errno.errno
)
add_entrypoint_object(
@@ -145,3 +151,10 @@ add_entrypoint_object(
DEPENDS
.${LIBC_TARGET_OS}.gettimeofday
)
+
+add_entrypoint_object(
+ clock_getres
+ ALIAS
+ DEPENDS
+ .${LIBC_TARGET_OS}.clock_getres
+)
diff --git a/libc/src/time/clock_getres.h b/libc/src/time/clock_getres.h
new file mode 100644
index 000000000000..c1c581c53599
--- /dev/null
+++ b/libc/src/time/clock_getres.h
@@ -0,0 +1,21 @@
+//===-- Implementation header of clock_getres -------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+#ifndef LLVM_LIBC_SRC_TIME_CLOCK_GETRES_H
+#define LLVM_LIBC_SRC_TIME_CLOCK_GETRES_H
+
+#include "hdr/types/clockid_t.h"
+#include "hdr/types/struct_timespec.h"
+#include "src/__support/macros/config.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+int clock_getres(clockid_t clockid, timespec *tp);
+
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC_TIME_CLOCK_GETRES_H
diff --git a/libc/src/time/gpu/CMakeLists.txt b/libc/src/time/gpu/CMakeLists.txt
index 8da5d3a22f5a..31a60595d68f 100644
--- a/libc/src/time/gpu/CMakeLists.txt
+++ b/libc/src/time/gpu/CMakeLists.txt
@@ -1,14 +1,3 @@
-add_object_library(
- time_utils
- SRCS
- time_utils.cpp
- HDRS
- time_utils.h
- DEPENDS
- libc.hdr.types.clock_t
- libc.hdr.time_macros
-)
-
add_entrypoint_object(
clock
SRCS
@@ -18,7 +7,8 @@ add_entrypoint_object(
DEPENDS
libc.include.time
libc.src.__support.GPU.utils
- .time_utils
+ libc.src.__support.time.clock_gettime
+ libc.src.__support.time.gpu.time_utils
)
add_entrypoint_object(
@@ -30,29 +20,31 @@ add_entrypoint_object(
DEPENDS
libc.include.time
libc.src.__support.GPU.utils
- .time_utils
+ libc.src.__support.time.gpu.time_utils
)
add_entrypoint_object(
- clock_gettime
+ timespec_get
SRCS
- clock_gettime.cpp
+ timespec_get.cpp
HDRS
- ../clock_gettime.h
+ ../timespec_get.h
DEPENDS
- libc.hdr.types.clockid_t
+ libc.hdr.time_macros
libc.hdr.types.struct_timespec
- .time_utils
+ libc.src.__support.time.gpu.time_utils
)
add_entrypoint_object(
- timespec_get
+ clock_gettime
SRCS
- timespec_get.cpp
+ clock_gettime.cpp
HDRS
- ../timespec_get.h
+ ../clock_gettime.h
DEPENDS
libc.hdr.time_macros
+ libc.hdr.types.clockid_t
libc.hdr.types.struct_timespec
- .time_utils
+ libc.src.__support.time.gpu.time_utils
+ libc.src.__support.time.clock_gettime
)
diff --git a/libc/src/time/gpu/clock.cpp b/libc/src/time/gpu/clock.cpp
index 4cdb1d505aed..add5b2725ef8 100644
--- a/libc/src/time/gpu/clock.cpp
+++ b/libc/src/time/gpu/clock.cpp
@@ -8,7 +8,7 @@
#include "src/time/clock.h"
#include "src/__support/macros/config.h"
-#include "src/time/gpu/time_utils.h"
+#include "src/__support/time/gpu/time_utils.h"
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/time/gpu/clock_gettime.cpp b/libc/src/time/gpu/clock_gettime.cpp
index de7899a2a17c..81547ef7f1ca 100644
--- a/libc/src/time/gpu/clock_gettime.cpp
+++ b/libc/src/time/gpu/clock_gettime.cpp
@@ -10,23 +10,16 @@
#include "src/__support/common.h"
#include "src/__support/macros/config.h"
-#include "time_utils.h"
+#include "src/__support/time/clock_gettime.h"
+#include "src/__support/time/gpu/time_utils.h"
namespace LIBC_NAMESPACE_DECL {
-constexpr uint64_t TICKS_PER_SEC = 1000000000UL;
-
LLVM_LIBC_FUNCTION(int, clock_gettime, (clockid_t clockid, timespec *ts)) {
- if (clockid != CLOCK_MONOTONIC || !ts)
- return -1;
-
- uint64_t ns_per_tick = TICKS_PER_SEC / GPU_CLOCKS_PER_SEC;
- uint64_t ticks = gpu::fixed_frequency_clock();
-
- ts->tv_nsec = (ticks * ns_per_tick) % TICKS_PER_SEC;
- ts->tv_sec = (ticks * ns_per_tick) / TICKS_PER_SEC;
-
- return 0;
+ ErrorOr<int> result = internal::clock_gettime(clockid, ts);
+ if (result)
+ return result.value();
+ return result.error();
}
} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/time/gpu/nanosleep.cpp b/libc/src/time/gpu/nanosleep.cpp
index 3f4a609dd40e..a92f660f225c 100644
--- a/libc/src/time/gpu/nanosleep.cpp
+++ b/libc/src/time/gpu/nanosleep.cpp
@@ -9,12 +9,10 @@
#include "src/time/nanosleep.h"
#include "src/__support/macros/config.h"
-#include "time_utils.h"
+#include "src/__support/time/gpu/time_utils.h"
namespace LIBC_NAMESPACE_DECL {
-constexpr uint64_t TICKS_PER_SEC = 1000000000UL;
-
LLVM_LIBC_FUNCTION(int, nanosleep,
(const struct timespec *req, struct timespec *rem)) {
if (!GPU_CLOCKS_PER_SEC || !req)
diff --git a/libc/src/time/gpu/timespec_get.cpp b/libc/src/time/gpu/timespec_get.cpp
index f4ef328a8312..0dd128444aa8 100644
--- a/libc/src/time/gpu/timespec_get.cpp
+++ b/libc/src/time/gpu/timespec_get.cpp
@@ -10,6 +10,7 @@
#include "hdr/time_macros.h"
#include "src/__support/common.h"
#include "src/__support/macros/config.h"
+#include "src/__support/time/gpu/time_utils.h"
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/time/linux/CMakeLists.txt b/libc/src/time/linux/CMakeLists.txt
index 31fd7d1e64c8..314623f9f425 100644
--- a/libc/src/time/linux/CMakeLists.txt
+++ b/libc/src/time/linux/CMakeLists.txt
@@ -1,17 +1,4 @@
add_entrypoint_object(
- time
- SRCS
- time.cpp
- HDRS
- ../time_func.h
- DEPENDS
- libc.hdr.time_macros
- libc.hdr.types.time_t
- libc.src.__support.time.linux.clock_gettime
- libc.src.errno.errno
-)
-
-add_entrypoint_object(
timespec_get
SRCS
timespec_get.cpp
@@ -20,7 +7,7 @@ add_entrypoint_object(
DEPENDS
libc.hdr.time_macros
libc.hdr.types.struct_timespec
- libc.src.__support.time.linux.clock_gettime
+ libc.src.__support.time.clock_gettime
libc.src.errno.errno
)
@@ -34,7 +21,7 @@ add_entrypoint_object(
libc.hdr.time_macros
libc.hdr.types.clock_t
libc.src.__support.time.units
- libc.src.__support.time.linux.clock_gettime
+ libc.src.__support.time.clock_gettime
libc.src.__support.CPP.limits
libc.src.errno.errno
)
@@ -62,7 +49,7 @@ add_entrypoint_object(
DEPENDS
libc.hdr.types.clockid_t
libc.hdr.types.struct_timespec
- libc.src.__support.time.linux.clock_gettime
+ libc.src.__support.time.clock_gettime
libc.src.errno.errno
)
@@ -75,7 +62,7 @@ add_entrypoint_object(
DEPENDS
libc.hdr.time_macros
libc.hdr.types.suseconds_t
- libc.src.__support.time.linux.clock_gettime
+ libc.src.__support.time.clock_gettime
libc.src.__support.time.units
libc.src.errno.errno
)
diff --git a/libc/src/time/linux/clock.cpp b/libc/src/time/linux/clock.cpp
index f43e1bcad6a3..ee4fa82b4f89 100644
--- a/libc/src/time/linux/clock.cpp
+++ b/libc/src/time/linux/clock.cpp
@@ -11,7 +11,7 @@
#include "src/__support/CPP/limits.h"
#include "src/__support/common.h"
#include "src/__support/macros/config.h"
-#include "src/__support/time/linux/clock_gettime.h"
+#include "src/__support/time/clock_gettime.h"
#include "src/__support/time/units.h"
#include "src/errno/libc_errno.h"
diff --git a/libc/src/time/linux/clock_gettime.cpp b/libc/src/time/linux/clock_gettime.cpp
index a2b20a6dbc98..743c644d65d0 100644
--- a/libc/src/time/linux/clock_gettime.cpp
+++ b/libc/src/time/linux/clock_gettime.cpp
@@ -9,7 +9,7 @@
#include "src/time/clock_gettime.h"
#include "src/__support/common.h"
#include "src/__support/macros/config.h"
-#include "src/__support/time/linux/clock_gettime.h"
+#include "src/__support/time/clock_gettime.h"
#include "src/errno/libc_errno.h"
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/time/linux/gettimeofday.cpp b/libc/src/time/linux/gettimeofday.cpp
index 19d9988ae73a..e8ddf482fc98 100644
--- a/libc/src/time/linux/gettimeofday.cpp
+++ b/libc/src/time/linux/gettimeofday.cpp
@@ -11,7 +11,7 @@
#include "hdr/types/suseconds_t.h"
#include "src/__support/common.h"
#include "src/__support/macros/config.h"
-#include "src/__support/time/linux/clock_gettime.h"
+#include "src/__support/time/clock_gettime.h"
#include "src/__support/time/units.h"
#include "src/errno/libc_errno.h"
diff --git a/libc/src/time/linux/timespec_get.cpp b/libc/src/time/linux/timespec_get.cpp
index ba9f8eb2e442..cf5174523aa4 100644
--- a/libc/src/time/linux/timespec_get.cpp
+++ b/libc/src/time/linux/timespec_get.cpp
@@ -10,7 +10,7 @@
#include "hdr/time_macros.h"
#include "src/__support/common.h"
#include "src/__support/macros/config.h"
-#include "src/__support/time/linux/clock_gettime.h"
+#include "src/__support/time/clock_gettime.h"
#include "src/errno/libc_errno.h"
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/time/linux/time.cpp b/libc/src/time/time.cpp
index 20fb86e8e29d..4a0b614a68ef 100644
--- a/libc/src/time/linux/time.cpp
+++ b/libc/src/time/time.cpp
@@ -9,14 +9,14 @@
#include "hdr/time_macros.h"
#include "src/__support/common.h"
#include "src/__support/macros/config.h"
-#include "src/__support/time/linux/clock_gettime.h"
+#include "src/__support/time/clock_gettime.h"
#include "src/errno/libc_errno.h"
#include "src/time/time_func.h"
namespace LIBC_NAMESPACE_DECL {
-
-LLVM_LIBC_FUNCTION(time_t, time, (time_t * tp)) {
- // TODO: Use the Linux VDSO to fetch the time and avoid the syscall.
+// avoid inconsitent clang-format behavior
+using time_ptr_t = time_t *;
+LLVM_LIBC_FUNCTION(time_t, time, (time_ptr_t tp)) {
struct timespec ts;
auto result = internal::clock_gettime(CLOCK_REALTIME, &ts);
if (!result.has_value()) {
diff --git a/libc/src/time/windows/CMakeLists.txt b/libc/src/time/windows/CMakeLists.txt
new file mode 100644
index 000000000000..6f242cd168f5
--- /dev/null
+++ b/libc/src/time/windows/CMakeLists.txt
@@ -0,0 +1,13 @@
+add_entrypoint_object(
+ clock_getres
+ SRCS
+ clock_getres.cpp
+ DEPENDS
+ libc.src.__support.time.windows.performance_counter
+ libc.src.__support.time.units
+ libc.src.__support.common
+ libc.src.__support.macros.optimization
+ libc.hdr.time_macros
+ libc.hdr.types.time_t
+ libc.hdr.types.struct_timespec
+)
diff --git a/libc/src/time/windows/clock_getres.cpp b/libc/src/time/windows/clock_getres.cpp
new file mode 100644
index 000000000000..b8c0c82aa641
--- /dev/null
+++ b/libc/src/time/windows/clock_getres.cpp
@@ -0,0 +1,110 @@
+//===-- Windows implementation of clock_getres ------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "hdr/errno_macros.h"
+#include "hdr/time_macros.h"
+#include "hdr/types/clockid_t.h"
+#include "hdr/types/struct_timespec.h"
+
+#include "src/__support/CPP/limits.h"
+#include "src/__support/common.h"
+#include "src/__support/macros/optimization.h"
+#include "src/__support/time/units.h"
+#include "src/__support/time/windows/performance_counter.h"
+#include "src/errno/libc_errno.h"
+#include "src/time/clock_getres.h"
+
+#define WIN32_LEAN_AND_MEAN
+#define NOMINMAX
+#include <Windows.h>
+
+// add in dependencies for GetSystemTimeAdjustmentPrecise
+#pragma comment(lib, "mincore.lib")
+
+namespace LIBC_NAMESPACE_DECL {
+LLVM_LIBC_FUNCTION(int, clock_getres, (clockid_t id, struct timespec *res)) {
+ using namespace time_units;
+ // POSIX allows nullptr to be passed as res, in which case the function should
+ // do nothing.
+ if (res == nullptr)
+ return 0;
+ constexpr unsigned long long HNS_PER_SEC = 1_s_ns / 100ULL;
+ constexpr unsigned long long SEC_LIMIT =
+ cpp::numeric_limits<decltype(res->tv_sec)>::max();
+ // For CLOCK_MONOTONIC, we are using performance counter
+ // https://learn.microsoft.com/en-us/windows/win32/sysinfo/acquiring-high-resolution-time-stamps
+ // Hence, the resolution is given by the performance counter frequency.
+ // For CLOCK_REALTIME, the precision is given by
+ // GetSystemTimeAdjustmentPrecise
+ // (https://learn.microsoft.com/en-us/windows/win32/api/sysinfoapi/nf-sysinfoapi-getsystemtimeadjustmentprecise)
+ // For CLOCK_PROCESS_CPUTIME_ID, CLOCK_THREAD_CPUTIME_ID, the precision is
+ // given by GetSystemTimeAdjustment
+ // (https://learn.microsoft.com/en-us/windows/win32/api/sysinfoapi/nf-sysinfoapi-getsystemtimeadjustment)
+ switch (id) {
+ default:
+ libc_errno = EINVAL;
+ return -1;
+
+ case CLOCK_MONOTONIC: {
+ long long freq = performance_counter::get_ticks_per_second();
+ __builtin_assume(freq != 0);
+ // division of 1 second by frequency, rounded up.
+ long long tv_sec = static_cast<long long>(freq == 1);
+ long long tv_nsec =
+ LIBC_LIKELY(freq != 1) ? 1ll + ((1_s_ns - 1ll) / freq) : 0ll;
+ // not possible to overflow tv_sec, tv_nsec
+ res->tv_sec = static_cast<decltype(res->tv_sec)>(tv_sec);
+ res->tv_nsec = static_cast<decltype(res->tv_nsec)>(tv_nsec);
+ break;
+ }
+
+ case CLOCK_REALTIME: {
+ [[clang::uninitialized]] DWORD64 time_adjustment;
+ [[clang::uninitialized]] DWORD64 time_increment;
+ [[clang::uninitialized]] BOOL time_adjustment_disabled;
+ if (!::GetSystemTimeAdjustmentPrecise(&time_adjustment, &time_increment,
+ &time_adjustment_disabled)) {
+ libc_errno = EINVAL;
+ return -1;
+ }
+ DWORD64 tv_sec = time_increment / HNS_PER_SEC;
+ DWORD64 tv_nsec = (time_increment % HNS_PER_SEC) * 100ULL;
+ if (LIBC_UNLIKELY(tv_sec > SEC_LIMIT)) {
+ libc_errno = EOVERFLOW;
+ return -1;
+ }
+ res->tv_sec = static_cast<decltype(res->tv_sec)>(tv_sec);
+ res->tv_nsec = static_cast<decltype(res->tv_nsec)>(tv_nsec);
+ break;
+ }
+ case CLOCK_PROCESS_CPUTIME_ID:
+ case CLOCK_THREAD_CPUTIME_ID: {
+ [[clang::uninitialized]] DWORD time_adjustment;
+ [[clang::uninitialized]] DWORD time_increment;
+ [[clang::uninitialized]] BOOL time_adjustment_disabled;
+ if (!::GetSystemTimeAdjustment(&time_adjustment, &time_increment,
+ &time_adjustment_disabled)) {
+ libc_errno = EINVAL;
+ return -1;
+ }
+ DWORD hns_per_sec = static_cast<DWORD>(HNS_PER_SEC);
+ DWORD sec_limit = static_cast<DWORD>(SEC_LIMIT);
+ DWORD tv_sec = time_increment / hns_per_sec;
+ DWORD tv_nsec = (time_increment % hns_per_sec) * 100UL;
+ if (LIBC_UNLIKELY(tv_sec > sec_limit)) {
+ libc_errno = EOVERFLOW;
+ return -1;
+ }
+ res->tv_sec = static_cast<decltype(res->tv_sec)>(tv_sec);
+ res->tv_nsec = static_cast<decltype(res->tv_nsec)>(tv_nsec);
+ break;
+ }
+ }
+ return 0;
+}
+} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/unistd/dup.h b/libc/src/unistd/dup.h
index 63f093c0ee43..57601455acc6 100644
--- a/libc/src/unistd/dup.h
+++ b/libc/src/unistd/dup.h
@@ -9,8 +9,8 @@
#ifndef LLVM_LIBC_SRC_UNISTD_DUP_H
#define LLVM_LIBC_SRC_UNISTD_DUP_H
+#include "hdr/unistd_macros.h"
#include "src/__support/macros/config.h"
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/dup2.h b/libc/src/unistd/dup2.h
index 060c112daf08..e2cf62389bca 100644
--- a/libc/src/unistd/dup2.h
+++ b/libc/src/unistd/dup2.h
@@ -9,8 +9,8 @@
#ifndef LLVM_LIBC_SRC_UNISTD_DUP2_H
#define LLVM_LIBC_SRC_UNISTD_DUP2_H
+#include "hdr/unistd_macros.h"
#include "src/__support/macros/config.h"
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/dup3.h b/libc/src/unistd/dup3.h
index f3868867123b..06d9b23dbd20 100644
--- a/libc/src/unistd/dup3.h
+++ b/libc/src/unistd/dup3.h
@@ -9,8 +9,8 @@
#ifndef LLVM_LIBC_SRC_UNISTD_DUP3_H
#define LLVM_LIBC_SRC_UNISTD_DUP3_H
+#include "hdr/unistd_macros.h"
#include "src/__support/macros/config.h"
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/fork.h b/libc/src/unistd/fork.h
index b6fd5763b3a5..a9f8a9795d3a 100644
--- a/libc/src/unistd/fork.h
+++ b/libc/src/unistd/fork.h
@@ -9,8 +9,9 @@
#ifndef LLVM_LIBC_SRC_UNISTD_FORK_H
#define LLVM_LIBC_SRC_UNISTD_FORK_H
+#include "hdr/types/pid_t.h"
+#include "hdr/unistd_macros.h"
#include "src/__support/macros/config.h"
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/ftruncate.h b/libc/src/unistd/ftruncate.h
index cd8d363727c4..95901c8b7003 100644
--- a/libc/src/unistd/ftruncate.h
+++ b/libc/src/unistd/ftruncate.h
@@ -9,8 +9,9 @@
#ifndef LLVM_LIBC_SRC_UNISTD_FTRUNCATE_H
#define LLVM_LIBC_SRC_UNISTD_FTRUNCATE_H
+#include "hdr/types/off_t.h"
+#include "hdr/unistd_macros.h"
#include "src/__support/macros/config.h"
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/getcwd.h b/libc/src/unistd/getcwd.h
index 8b63a91c26b5..3943c0217ec1 100644
--- a/libc/src/unistd/getcwd.h
+++ b/libc/src/unistd/getcwd.h
@@ -9,8 +9,9 @@
#ifndef LLVM_LIBC_SRC_UNISTD_GETCWD_H
#define LLVM_LIBC_SRC_UNISTD_GETCWD_H
+#include "hdr/types/size_t.h"
+#include "hdr/unistd_macros.h"
#include "src/__support/macros/config.h"
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/geteuid.h b/libc/src/unistd/geteuid.h
index 9469797bd3d4..6827266ee81d 100644
--- a/libc/src/unistd/geteuid.h
+++ b/libc/src/unistd/geteuid.h
@@ -9,8 +9,9 @@
#ifndef LLVM_LIBC_SRC_UNISTD_GETEUID_H
#define LLVM_LIBC_SRC_UNISTD_GETEUID_H
+#include "hdr/types/uid_t.h"
+#include "hdr/unistd_macros.h"
#include "src/__support/macros/config.h"
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/getopt.h b/libc/src/unistd/getopt.h
index 1be3331dcd98..0be639d87119 100644
--- a/libc/src/unistd/getopt.h
+++ b/libc/src/unistd/getopt.h
@@ -10,8 +10,8 @@
#define LLVM_LIBC_SRC_UNISTD_GETOPT_H
#include "hdr/types/FILE.h"
+#include "hdr/unistd_macros.h"
#include "src/__support/macros/config.h"
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/getpid.h b/libc/src/unistd/getpid.h
index c3c55b0c06b1..9e2f156266b9 100644
--- a/libc/src/unistd/getpid.h
+++ b/libc/src/unistd/getpid.h
@@ -9,8 +9,9 @@
#ifndef LLVM_LIBC_SRC_UNISTD_GETPID_H
#define LLVM_LIBC_SRC_UNISTD_GETPID_H
+#include "hdr/types/pid_t.h"
+#include "hdr/unistd_macros.h"
#include "src/__support/macros/config.h"
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/getppid.h b/libc/src/unistd/getppid.h
index d820791bc06f..8243fa93eddd 100644
--- a/libc/src/unistd/getppid.h
+++ b/libc/src/unistd/getppid.h
@@ -9,8 +9,9 @@
#ifndef LLVM_LIBC_SRC_UNISTD_GETPPID_H
#define LLVM_LIBC_SRC_UNISTD_GETPPID_H
+#include "hdr/types/pid_t.h"
+#include "hdr/unistd_macros.h"
#include "src/__support/macros/config.h"
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/getuid.h b/libc/src/unistd/getuid.h
index dd82c7119d40..f8b3731a9c06 100644
--- a/libc/src/unistd/getuid.h
+++ b/libc/src/unistd/getuid.h
@@ -9,8 +9,9 @@
#ifndef LLVM_LIBC_SRC_UNISTD_GETUID_H
#define LLVM_LIBC_SRC_UNISTD_GETUID_H
+#include "hdr/types/uid_t.h"
+#include "hdr/unistd_macros.h"
#include "src/__support/macros/config.h"
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/isatty.h b/libc/src/unistd/isatty.h
index 6dd1b7b81717..5c8be6541c99 100644
--- a/libc/src/unistd/isatty.h
+++ b/libc/src/unistd/isatty.h
@@ -9,8 +9,8 @@
#ifndef LLVM_LIBC_SRC_UNISTD_ISATTY_H
#define LLVM_LIBC_SRC_UNISTD_ISATTY_H
+#include "hdr/unistd_macros.h"
#include "src/__support/macros/config.h"
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/link.h b/libc/src/unistd/link.h
index 9b27aa1accf4..c1c26c5e0d49 100644
--- a/libc/src/unistd/link.h
+++ b/libc/src/unistd/link.h
@@ -9,8 +9,8 @@
#ifndef LLVM_LIBC_SRC_UNISTD_LINK_H
#define LLVM_LIBC_SRC_UNISTD_LINK_H
+#include "hdr/unistd_macros.h"
#include "src/__support/macros/config.h"
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/linux/CMakeLists.txt b/libc/src/unistd/linux/CMakeLists.txt
index 8a4487314141..ed360c73354a 100644
--- a/libc/src/unistd/linux/CMakeLists.txt
+++ b/libc/src/unistd/linux/CMakeLists.txt
@@ -45,6 +45,7 @@ add_entrypoint_object(
HDRS
../dup.h
DEPENDS
+ libc.hdr.fcntl_macros
libc.include.unistd
libc.include.sys_syscall
libc.src.__support.OSUtil.osutil
@@ -72,6 +73,7 @@ add_entrypoint_object(
HDRS
../dup3.h
DEPENDS
+ libc.hdr.fcntl_macros
libc.include.unistd
libc.include.sys_syscall
libc.src.__support.OSUtil.osutil
@@ -98,6 +100,8 @@ add_entrypoint_object(
HDRS
../fork.h
DEPENDS
+ libc.hdr.types.pid_t
+ libc.hdr.fcntl_macros
libc.include.unistd
libc.include.sys_syscall
libc.src.__support.threads.fork_callbacks
@@ -166,6 +170,8 @@ add_entrypoint_object(
HDRS
../ftruncate.h
DEPENDS
+ libc.hdr.types.off_t
+ libc.hdr.fcntl_macros
libc.include.unistd
libc.include.sys_syscall
libc.src.__support.OSUtil.osutil
@@ -179,6 +185,8 @@ add_entrypoint_object(
HDRS
../getcwd.h
DEPENDS
+ libc.hdr.types.size_t
+ libc.hdr.fcntl_macros
libc.include.unistd
libc.include.sys_syscall
libc.src.__support.OSUtil.osutil
@@ -192,6 +200,8 @@ add_entrypoint_object(
HDRS
../geteuid.h
DEPENDS
+ libc.hdr.types.uid_t
+ libc.hdr.fcntl_macros
libc.include.unistd
libc.include.sys_syscall
libc.src.__support.OSUtil.osutil
@@ -204,6 +214,8 @@ add_entrypoint_object(
HDRS
../getpid.h
DEPENDS
+ libc.hdr.types.pid_t
+ libc.hdr.fcntl_macros
libc.include.unistd
libc.include.sys_syscall
libc.src.__support.OSUtil.osutil
@@ -216,6 +228,8 @@ add_entrypoint_object(
HDRS
../getppid.h
DEPENDS
+ libc.hdr.types.pid_t
+ libc.hdr.fcntl_macros
libc.include.unistd
libc.include.sys_syscall
libc.src.__support.OSUtil.osutil
@@ -228,6 +242,8 @@ add_entrypoint_object(
HDRS
../getuid.h
DEPENDS
+ libc.hdr.types.uid_t
+ libc.hdr.fcntl_macros
libc.include.unistd
libc.include.sys_syscall
libc.src.__support.OSUtil.osutil
@@ -240,6 +256,7 @@ add_entrypoint_object(
HDRS
../isatty.h
DEPENDS
+ libc.hdr.fcntl_macros
libc.include.unistd
libc.include.sys_ioctl
libc.include.sys_syscall
@@ -282,6 +299,8 @@ add_entrypoint_object(
HDRS
../lseek.h
DEPENDS
+ libc.hdr.types.off_t
+ libc.hdr.fcntl_macros
libc.include.unistd
libc.include.sys_syscall
libc.src.__support.OSUtil.osutil
@@ -349,6 +368,10 @@ add_entrypoint_object(
HDRS
../pread.h
DEPENDS
+ libc.hdr.types.off_t
+ libc.hdr.types.size_t
+ libc.hdr.types.ssize_t
+ libc.hdr.fcntl_macros
libc.include.unistd
libc.include.sys_syscall
libc.src.__support.OSUtil.osutil
@@ -363,6 +386,10 @@ add_entrypoint_object(
HDRS
../pwrite.h
DEPENDS
+ libc.hdr.types.off_t
+ libc.hdr.types.size_t
+ libc.hdr.types.ssize_t
+ libc.hdr.fcntl_macros
libc.include.unistd
libc.include.sys_syscall
libc.src.__support.OSUtil.osutil
@@ -376,6 +403,9 @@ add_entrypoint_object(
HDRS
../read.h
DEPENDS
+ libc.hdr.types.size_t
+ libc.hdr.types.ssize_t
+ libc.hdr.fcntl_macros
libc.include.unistd
libc.include.sys_syscall
libc.src.__support.OSUtil.osutil
@@ -404,6 +434,8 @@ add_entrypoint_object(
HDRS
../readlink.h
DEPENDS
+ libc.hdr.types.size_t
+ libc.hdr.types.ssize_t
libc.hdr.fcntl_macros
libc.include.unistd
libc.include.sys_syscall
@@ -418,6 +450,8 @@ add_entrypoint_object(
HDRS
../readlinkat.h
DEPENDS
+ libc.hdr.types.size_t
+ libc.hdr.types.ssize_t
libc.hdr.fcntl_macros
libc.include.unistd
libc.include.sys_syscall
@@ -485,6 +519,8 @@ add_entrypoint_object(
HDRS
../truncate.h
DEPENDS
+ libc.hdr.types.off_t
+ libc.hdr.fcntl_macros
libc.include.unistd
libc.include.sys_syscall
libc.src.__support.OSUtil.osutil
@@ -526,6 +562,9 @@ add_entrypoint_object(
HDRS
../write.h
DEPENDS
+ libc.hdr.types.size_t
+ libc.hdr.types.ssize_t
+ libc.hdr.fcntl_macros
libc.include.unistd
libc.include.sys_syscall
libc.src.__support.OSUtil.osutil
diff --git a/libc/src/unistd/linux/ftruncate.cpp b/libc/src/unistd/linux/ftruncate.cpp
index 39cb3b5778fa..ccbb0634664a 100644
--- a/libc/src/unistd/linux/ftruncate.cpp
+++ b/libc/src/unistd/linux/ftruncate.cpp
@@ -11,11 +11,11 @@
#include "src/__support/OSUtil/syscall.h" // For internal syscall function.
#include "src/__support/common.h"
+#include "hdr/unistd_macros.h"
#include "src/__support/macros/config.h"
#include "src/errno/libc_errno.h"
#include <stdint.h> // For uint64_t.
#include <sys/syscall.h> // For syscall numbers.
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/linux/lseek.cpp b/libc/src/unistd/linux/lseek.cpp
index 9486cecf3b12..0e957498da74 100644
--- a/libc/src/unistd/linux/lseek.cpp
+++ b/libc/src/unistd/linux/lseek.cpp
@@ -14,8 +14,8 @@
#include "src/__support/OSUtil/syscall.h" // For internal syscall function.
#include "src/__support/common.h"
+#include "hdr/types/off_t.h"
#include <sys/syscall.h> // For syscall numbers.
-#include <unistd.h> // For off_t.
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/linux/sysconf.cpp b/libc/src/unistd/linux/sysconf.cpp
index 1540eb499ec1..f785ff321c7d 100644
--- a/libc/src/unistd/linux/sysconf.cpp
+++ b/libc/src/unistd/linux/sysconf.cpp
@@ -10,11 +10,11 @@
#include "src/__support/common.h"
+#include "hdr/unistd_macros.h"
#include "src/__support/macros/config.h"
#include "src/errno/libc_errno.h"
#include "src/sys/auxv/getauxval.h"
#include <sys/auxv.h>
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/linux/truncate.cpp b/libc/src/unistd/linux/truncate.cpp
index 283cf4098cf4..8236edb480d1 100644
--- a/libc/src/unistd/linux/truncate.cpp
+++ b/libc/src/unistd/linux/truncate.cpp
@@ -13,9 +13,9 @@
#include "src/__support/macros/config.h"
#include "src/errno/libc_errno.h"
+#include "hdr/unistd_macros.h"
#include <stdint.h> // For uint64_t.
#include <sys/syscall.h> // For syscall numbers.
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/lseek.h b/libc/src/unistd/lseek.h
index a8704ec7058d..e8442738dfbd 100644
--- a/libc/src/unistd/lseek.h
+++ b/libc/src/unistd/lseek.h
@@ -9,8 +9,9 @@
#ifndef LLVM_LIBC_SRC_UNISTD_LSEEK_H
#define LLVM_LIBC_SRC_UNISTD_LSEEK_H
+#include "hdr/types/off_t.h"
+#include "hdr/unistd_macros.h"
#include "src/__support/macros/config.h"
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/pread.h b/libc/src/unistd/pread.h
index 4723675e82a2..f8b66c548868 100644
--- a/libc/src/unistd/pread.h
+++ b/libc/src/unistd/pread.h
@@ -9,8 +9,11 @@
#ifndef LLVM_LIBC_SRC_UNISTD_PREAD_H
#define LLVM_LIBC_SRC_UNISTD_PREAD_H
+#include "hdr/types/off_t.h"
+#include "hdr/types/size_t.h"
+#include "hdr/types/ssize_t.h"
+#include "hdr/unistd_macros.h"
#include "src/__support/macros/config.h"
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/pwrite.h b/libc/src/unistd/pwrite.h
index baffbe48b643..08ebb8934721 100644
--- a/libc/src/unistd/pwrite.h
+++ b/libc/src/unistd/pwrite.h
@@ -9,8 +9,11 @@
#ifndef LLVM_LIBC_SRC_UNISTD_PWRITE_H
#define LLVM_LIBC_SRC_UNISTD_PWRITE_H
+#include "hdr/types/off_t.h"
+#include "hdr/types/size_t.h"
+#include "hdr/types/ssize_t.h"
+#include "hdr/unistd_macros.h"
#include "src/__support/macros/config.h"
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/read.h b/libc/src/unistd/read.h
index 01231cb82e35..5d3527372558 100644
--- a/libc/src/unistd/read.h
+++ b/libc/src/unistd/read.h
@@ -9,8 +9,10 @@
#ifndef LLVM_LIBC_SRC_UNISTD_READ_H
#define LLVM_LIBC_SRC_UNISTD_READ_H
+#include "hdr/types/size_t.h"
+#include "hdr/types/ssize_t.h"
+#include "hdr/unistd_macros.h"
#include "src/__support/macros/config.h"
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/readlink.h b/libc/src/unistd/readlink.h
index a73e9740c746..b63643e2a701 100644
--- a/libc/src/unistd/readlink.h
+++ b/libc/src/unistd/readlink.h
@@ -9,8 +9,10 @@
#ifndef LLVM_LIBC_SRC_UNISTD_READLINK_H
#define LLVM_LIBC_SRC_UNISTD_READLINK_H
+#include "hdr/types/size_t.h"
+#include "hdr/types/ssize_t.h"
+#include "hdr/unistd_macros.h"
#include "src/__support/macros/config.h"
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/readlinkat.h b/libc/src/unistd/readlinkat.h
index 6bdd48b537fc..0f5657e45a25 100644
--- a/libc/src/unistd/readlinkat.h
+++ b/libc/src/unistd/readlinkat.h
@@ -9,8 +9,10 @@
#ifndef LLVM_LIBC_SRC_UNISTD_READLINKAT_H
#define LLVM_LIBC_SRC_UNISTD_READLINKAT_H
+#include "hdr/types/size_t.h"
+#include "hdr/types/ssize_t.h"
+#include "hdr/unistd_macros.h"
#include "src/__support/macros/config.h"
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/swab.h b/libc/src/unistd/swab.h
index caa9c7100109..f6fa3414c43f 100644
--- a/libc/src/unistd/swab.h
+++ b/libc/src/unistd/swab.h
@@ -9,8 +9,8 @@
#ifndef LLVM_LIBC_SRC_UNISTD_SWAB_H
#define LLVM_LIBC_SRC_UNISTD_SWAB_H
+#include "hdr/types/ssize_t.h"
#include "src/__support/macros/config.h"
-#include <unistd.h> // For ssize_t
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/symlink.h b/libc/src/unistd/symlink.h
index 47f04f8845b4..c743a32a8930 100644
--- a/libc/src/unistd/symlink.h
+++ b/libc/src/unistd/symlink.h
@@ -9,8 +9,8 @@
#ifndef LLVM_LIBC_SRC_UNISTD_SYMLINK_H
#define LLVM_LIBC_SRC_UNISTD_SYMLINK_H
+#include "hdr/unistd_macros.h"
#include "src/__support/macros/config.h"
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/symlinkat.h b/libc/src/unistd/symlinkat.h
index 9f8ad517af5a..6697ce4d537e 100644
--- a/libc/src/unistd/symlinkat.h
+++ b/libc/src/unistd/symlinkat.h
@@ -9,8 +9,8 @@
#ifndef LLVM_LIBC_SRC_UNISTD_SYMLINKAT_H
#define LLVM_LIBC_SRC_UNISTD_SYMLINKAT_H
+#include "hdr/unistd_macros.h"
#include "src/__support/macros/config.h"
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/syscall.h b/libc/src/unistd/syscall.h
index db70745719cf..7f82bd8a452f 100644
--- a/libc/src/unistd/syscall.h
+++ b/libc/src/unistd/syscall.h
@@ -9,9 +9,9 @@
#ifndef LLVM_LIBC_SRC_UNISTD_SYSCALL_H
#define LLVM_LIBC_SRC_UNISTD_SYSCALL_H
+#include "hdr/unistd_macros.h"
#include "src/__support/macros/config.h"
#include <stdarg.h>
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/sysconf.h b/libc/src/unistd/sysconf.h
index 1b3f39e41350..470c4d846568 100644
--- a/libc/src/unistd/sysconf.h
+++ b/libc/src/unistd/sysconf.h
@@ -9,8 +9,8 @@
#ifndef LLVM_LIBC_SRC_UNISTD_SYSCONF_H
#define LLVM_LIBC_SRC_UNISTD_SYSCONF_H
+#include "hdr/unistd_macros.h"
#include "src/__support/macros/config.h"
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/truncate.h b/libc/src/unistd/truncate.h
index 9ba5cf831752..1e1066351953 100644
--- a/libc/src/unistd/truncate.h
+++ b/libc/src/unistd/truncate.h
@@ -9,8 +9,9 @@
#ifndef LLVM_LIBC_SRC_UNISTD_TRUNCATE_H
#define LLVM_LIBC_SRC_UNISTD_TRUNCATE_H
+#include "hdr/types/off_t.h"
+#include "hdr/unistd_macros.h"
#include "src/__support/macros/config.h"
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/src/unistd/write.h b/libc/src/unistd/write.h
index e40ce19e2176..c5ba6bf719aa 100644
--- a/libc/src/unistd/write.h
+++ b/libc/src/unistd/write.h
@@ -9,8 +9,10 @@
#ifndef LLVM_LIBC_SRC_UNISTD_WRITE_H
#define LLVM_LIBC_SRC_UNISTD_WRITE_H
+#include "hdr/types/size_t.h"
+#include "hdr/types/ssize_t.h"
+#include "hdr/unistd_macros.h"
#include "src/__support/macros/config.h"
-#include <unistd.h>
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/test/UnitTest/FPMatcher.h b/libc/test/UnitTest/FPMatcher.h
index 9f2bae327920..b8e240bf328c 100644
--- a/libc/test/UnitTest/FPMatcher.h
+++ b/libc/test/UnitTest/FPMatcher.h
@@ -131,11 +131,11 @@ public:
else if constexpr (cpp::is_complex_type_same<T, _Complex long double>())
return matchComplex<long double>();
#ifdef LIBC_TYPES_HAS_CFLOAT16
- else if constexpr (cpp::is_complex_type_same<T, cfloat16>)
+ else if constexpr (cpp::is_complex_type_same<T, cfloat16>())
return matchComplex<float16>();
#endif
#ifdef LIBC_TYPES_HAS_CFLOAT128
- else if constexpr (cpp::is_complex_type_same<T, cfloat128>)
+ else if constexpr (cpp::is_complex_type_same<T, cfloat128>())
return matchComplex<float128>();
#endif
}
@@ -148,11 +148,11 @@ public:
else if constexpr (cpp::is_complex_type_same<T, _Complex long double>())
return explainErrorComplex<long double>();
#ifdef LIBC_TYPES_HAS_CFLOAT16
- else if constexpr (cpp::is_complex_type_same<T, cfloat16>)
+ else if constexpr (cpp::is_complex_type_same<T, cfloat16>())
return explainErrorComplex<float16>();
#endif
#ifdef LIBC_TYPES_HAS_CFLOAT128
- else if constexpr (cpp::is_complex_type_same<T, cfloat128>)
+ else if constexpr (cpp::is_complex_type_same<T, cfloat128>())
return explainErrorComplex<float128>();
#endif
}
diff --git a/libc/test/include/stdbit_stub.h b/libc/test/include/stdbit_stub.h
index 65b1ca3b2c29..8a8e30e889d6 100644
--- a/libc/test/include/stdbit_stub.h
+++ b/libc/test/include/stdbit_stub.h
@@ -17,21 +17,11 @@
#include <stdbool.h> // bool in C
#define STDBIT_STUB_FUNCTION(FUNC_NAME, LEADING_VAL) \
- unsigned FUNC_NAME##_uc(unsigned char x) __NOEXCEPT { \
- return LEADING_VAL##AU; \
- } \
- unsigned FUNC_NAME##_us(unsigned short x) __NOEXCEPT { \
- return LEADING_VAL##BU; \
- } \
- unsigned FUNC_NAME##_ui(unsigned int x) __NOEXCEPT { \
- return LEADING_VAL##CU; \
- } \
- unsigned FUNC_NAME##_ul(unsigned long x) __NOEXCEPT { \
- return LEADING_VAL##DU; \
- } \
- unsigned FUNC_NAME##_ull(unsigned long long x) __NOEXCEPT { \
- return LEADING_VAL##EU; \
- }
+ unsigned FUNC_NAME##_uc(unsigned char x) { return LEADING_VAL##AU; } \
+ unsigned FUNC_NAME##_us(unsigned short x) { return LEADING_VAL##BU; } \
+ unsigned FUNC_NAME##_ui(unsigned int x) { return LEADING_VAL##CU; } \
+ unsigned FUNC_NAME##_ul(unsigned long x) { return LEADING_VAL##DU; } \
+ unsigned FUNC_NAME##_ull(unsigned long long x) { return LEADING_VAL##EU; }
__BEGIN_C_DECLS
@@ -46,28 +36,24 @@ STDBIT_STUB_FUNCTION(stdc_first_trailing_one, 0x1)
STDBIT_STUB_FUNCTION(stdc_count_zeros, 0x2)
STDBIT_STUB_FUNCTION(stdc_count_ones, 0x3)
-bool stdc_has_single_bit_uc(unsigned char x) __NOEXCEPT { return false; }
-bool stdc_has_single_bit_us(unsigned short x) __NOEXCEPT { return false; }
-bool stdc_has_single_bit_ui(unsigned x) __NOEXCEPT { return false; }
-bool stdc_has_single_bit_ul(unsigned long x) __NOEXCEPT { return false; }
-bool stdc_has_single_bit_ull(unsigned long long x) __NOEXCEPT { return false; }
+bool stdc_has_single_bit_uc(unsigned char x) { return false; }
+bool stdc_has_single_bit_us(unsigned short x) { return false; }
+bool stdc_has_single_bit_ui(unsigned x) { return false; }
+bool stdc_has_single_bit_ul(unsigned long x) { return false; }
+bool stdc_has_single_bit_ull(unsigned long long x) { return false; }
STDBIT_STUB_FUNCTION(stdc_bit_width, 0x4)
-unsigned char stdc_bit_floor_uc(unsigned char x) __NOEXCEPT { return 0x5AU; }
-unsigned short stdc_bit_floor_us(unsigned short x) __NOEXCEPT { return 0x5BU; }
-unsigned stdc_bit_floor_ui(unsigned x) __NOEXCEPT { return 0x5CU; }
-unsigned long stdc_bit_floor_ul(unsigned long x) __NOEXCEPT { return 0x5DUL; }
-unsigned long long stdc_bit_floor_ull(unsigned long long x) __NOEXCEPT {
- return 0x5EULL;
-}
-
-unsigned char stdc_bit_ceil_uc(unsigned char x) __NOEXCEPT { return 0x6AU; }
-unsigned short stdc_bit_ceil_us(unsigned short x) __NOEXCEPT { return 0x6BU; }
-unsigned stdc_bit_ceil_ui(unsigned x) __NOEXCEPT { return 0x6CU; }
-unsigned long stdc_bit_ceil_ul(unsigned long x) __NOEXCEPT { return 0x6DUL; }
-unsigned long long stdc_bit_ceil_ull(unsigned long long x) __NOEXCEPT {
- return 0x6EULL;
-}
+unsigned char stdc_bit_floor_uc(unsigned char x) { return 0x5AU; }
+unsigned short stdc_bit_floor_us(unsigned short x) { return 0x5BU; }
+unsigned stdc_bit_floor_ui(unsigned x) { return 0x5CU; }
+unsigned long stdc_bit_floor_ul(unsigned long x) { return 0x5DUL; }
+unsigned long long stdc_bit_floor_ull(unsigned long long x) { return 0x5EULL; }
+
+unsigned char stdc_bit_ceil_uc(unsigned char x) { return 0x6AU; }
+unsigned short stdc_bit_ceil_us(unsigned short x) { return 0x6BU; }
+unsigned stdc_bit_ceil_ui(unsigned x) { return 0x6CU; }
+unsigned long stdc_bit_ceil_ul(unsigned long x) { return 0x6DUL; }
+unsigned long long stdc_bit_ceil_ull(unsigned long long x) { return 0x6EULL; }
__END_C_DECLS
diff --git a/libc/test/src/CMakeLists.txt b/libc/test/src/CMakeLists.txt
index 8ac8f91e98d4..31008508d649 100644
--- a/libc/test/src/CMakeLists.txt
+++ b/libc/test/src/CMakeLists.txt
@@ -58,7 +58,9 @@ add_subdirectory(stdfix)
add_subdirectory(stdio)
add_subdirectory(stdlib)
add_subdirectory(string)
+add_subdirectory(strings)
add_subdirectory(wchar)
+add_subdirectory(time)
# Depends on utilities in stdlib
add_subdirectory(inttypes)
@@ -75,15 +77,14 @@ if(NOT LLVM_LIBC_FULL_BUILD)
return()
endif()
+add_subdirectory(arpa)
add_subdirectory(assert)
add_subdirectory(compiler)
add_subdirectory(dirent)
-add_subdirectory(network)
+add_subdirectory(locale)
add_subdirectory(setjmp)
add_subdirectory(signal)
add_subdirectory(spawn)
-add_subdirectory(time)
-add_subdirectory(locale)
if(${LIBC_TARGET_OS} STREQUAL "linux")
add_subdirectory(pthread)
diff --git a/libc/test/src/__support/CMakeLists.txt b/libc/test/src/__support/CMakeLists.txt
index bcc86effd9a5..aeb8edf305d0 100644
--- a/libc/test/src/__support/CMakeLists.txt
+++ b/libc/test/src/__support/CMakeLists.txt
@@ -55,7 +55,9 @@ if(NOT LIBC_TARGET_OS_IS_GPU)
)
endif()
-if(LLVM_LIBC_FULL_BUILD)
+# TODO: FreeListHeap uses the _end symbol which conflicts with the _end symbol
+# defined by GPU start.cpp files so for now we exclude this test on GPU.
+if(LLVM_LIBC_FULL_BUILD AND NOT LIBC_TARGET_OS_IS_GPU)
add_libc_test(
freelist_heap_test
SUITE
@@ -63,11 +65,9 @@ if(LLVM_LIBC_FULL_BUILD)
SRCS
fake_heap.s
freelist_heap_test.cpp
- freelist_malloc_test.cpp
DEPENDS
libc.src.__support.CPP.span
libc.src.__support.freelist_heap
- libc.src.stdlib.freelist_malloc
libc.src.string.memcmp
libc.src.string.memcpy
)
diff --git a/libc/test/src/__support/CPP/atomic_test.cpp b/libc/test/src/__support/CPP/atomic_test.cpp
index 5b105c8eb3d5..5c3f60e9a68c 100644
--- a/libc/test/src/__support/CPP/atomic_test.cpp
+++ b/libc/test/src/__support/CPP/atomic_test.cpp
@@ -32,3 +32,21 @@ TEST(LlvmLibcAtomicTest, CompareExchangeStrong) {
ASSERT_FALSE(aint.compare_exchange_strong(desired, 100));
ASSERT_EQ(aint.load(LIBC_NAMESPACE::cpp::MemoryOrder::RELAXED), 100);
}
+
+struct alignas(void *) TrivialData {
+ char a;
+ char b;
+ char padding[sizeof(void *) - 2];
+};
+
+TEST(LlvmLibcAtomicTest, TrivialCompositeData) {
+ LIBC_NAMESPACE::cpp::Atomic<TrivialData> data({'a', 'b', {}});
+ ASSERT_EQ(data.load(LIBC_NAMESPACE::cpp::MemoryOrder::RELAXED).a, 'a');
+ ASSERT_EQ(data.load(LIBC_NAMESPACE::cpp::MemoryOrder::RELAXED).b, 'b');
+
+ auto old = data.exchange({'c', 'd', {}});
+ ASSERT_EQ(data.load(LIBC_NAMESPACE::cpp::MemoryOrder::RELAXED).a, 'c');
+ ASSERT_EQ(data.load(LIBC_NAMESPACE::cpp::MemoryOrder::RELAXED).b, 'd');
+ ASSERT_EQ(old.a, 'a');
+ ASSERT_EQ(old.b, 'b');
+}
diff --git a/libc/test/src/__support/CPP/type_traits_test.cpp b/libc/test/src/__support/CPP/type_traits_test.cpp
index fa5298a12d3f..4b3e48c6a6c0 100644
--- a/libc/test/src/__support/CPP/type_traits_test.cpp
+++ b/libc/test/src/__support/CPP/type_traits_test.cpp
@@ -439,6 +439,28 @@ TEST(LlvmLibcTypeTraitsTest, is_object) {
TEST(LlvmLibcTypeTraitsTest, true_type) { EXPECT_TRUE((true_type::value)); }
+struct CompilerLeadingPadded {
+ char b;
+ int a;
+};
+
+struct CompilerTrailingPadded {
+ int a;
+ char b;
+};
+
+struct alignas(long long) ManuallyPadded {
+ int b;
+ char padding[sizeof(long long) - sizeof(int)];
+};
+
+TEST(LlvmLibcTypeTraitsTest, has_unique_object_representations) {
+ EXPECT_TRUE(has_unique_object_representations<int>::value);
+ EXPECT_FALSE(has_unique_object_representations_v<CompilerLeadingPadded>);
+ EXPECT_FALSE(has_unique_object_representations_v<CompilerTrailingPadded>);
+ EXPECT_TRUE(has_unique_object_representations_v<ManuallyPadded>);
+}
+
// TODO type_identity
// TODO void_t
diff --git a/libc/test/src/__support/freelist_malloc_test.cpp b/libc/test/src/__support/freelist_malloc_test.cpp
deleted file mode 100644
index 793e2498304f..000000000000
--- a/libc/test/src/__support/freelist_malloc_test.cpp
+++ /dev/null
@@ -1,54 +0,0 @@
-//===-- Unittests for freelist_malloc -------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "src/__support/freelist_heap.h"
-#include "src/stdlib/aligned_alloc.h"
-#include "src/stdlib/calloc.h"
-#include "src/stdlib/free.h"
-#include "src/stdlib/malloc.h"
-#include "test/UnitTest/Test.h"
-
-using LIBC_NAMESPACE::Block;
-using LIBC_NAMESPACE::freelist_heap;
-using LIBC_NAMESPACE::FreeListHeap;
-using LIBC_NAMESPACE::FreeListHeapBuffer;
-
-TEST(LlvmLibcFreeListMalloc, Malloc) {
- constexpr size_t kAllocSize = 256;
- constexpr size_t kCallocNum = 4;
- constexpr size_t kCallocSize = 64;
-
- void *ptr1 = LIBC_NAMESPACE::malloc(kAllocSize);
- auto *block = Block::from_usable_space(ptr1);
- EXPECT_GE(block->inner_size(), kAllocSize);
-
- LIBC_NAMESPACE::free(ptr1);
- ASSERT_NE(block->next(), static_cast<Block *>(nullptr));
- ASSERT_EQ(block->next()->next(), static_cast<Block *>(nullptr));
- size_t heap_size = block->inner_size();
-
- void *ptr2 = LIBC_NAMESPACE::calloc(kCallocNum, kCallocSize);
- ASSERT_EQ(ptr2, ptr1);
- EXPECT_GE(block->inner_size(), kCallocNum * kCallocSize);
-
- for (size_t i = 0; i < kCallocNum * kCallocSize; ++i)
- EXPECT_EQ(reinterpret_cast<uint8_t *>(ptr2)[i], uint8_t(0));
-
- LIBC_NAMESPACE::free(ptr2);
- EXPECT_EQ(block->inner_size(), heap_size);
-
- constexpr size_t ALIGN = kAllocSize;
- void *ptr3 = LIBC_NAMESPACE::aligned_alloc(ALIGN, kAllocSize);
- EXPECT_NE(ptr3, static_cast<void *>(nullptr));
- EXPECT_EQ(reinterpret_cast<uintptr_t>(ptr3) % ALIGN, size_t(0));
- auto *aligned_block = reinterpret_cast<Block *>(ptr3);
- EXPECT_GE(aligned_block->inner_size(), kAllocSize);
-
- LIBC_NAMESPACE::free(ptr3);
- EXPECT_EQ(block->inner_size(), heap_size);
-}
diff --git a/libc/test/src/__support/threads/linux/raw_mutex_test.cpp b/libc/test/src/__support/threads/linux/raw_mutex_test.cpp
index 918f5d35c94f..dadc706421d0 100644
--- a/libc/test/src/__support/threads/linux/raw_mutex_test.cpp
+++ b/libc/test/src/__support/threads/linux/raw_mutex_test.cpp
@@ -12,7 +12,7 @@
#include "src/__support/OSUtil/syscall.h"
#include "src/__support/threads/linux/raw_mutex.h"
#include "src/__support/threads/sleep.h"
-#include "src/__support/time/linux/clock_gettime.h"
+#include "src/__support/time/clock_gettime.h"
#include "src/stdlib/exit.h"
#include "src/sys/mman/mmap.h"
#include "src/sys/mman/munmap.h"
diff --git a/libc/test/src/arpa/CMakeLists.txt b/libc/test/src/arpa/CMakeLists.txt
new file mode 100644
index 000000000000..5c89828860ff
--- /dev/null
+++ b/libc/test/src/arpa/CMakeLists.txt
@@ -0,0 +1 @@
+add_subdirectory(inet)
diff --git a/libc/test/src/arpa/inet/CMakeLists.txt b/libc/test/src/arpa/inet/CMakeLists.txt
new file mode 100644
index 000000000000..6e78e3a50e61
--- /dev/null
+++ b/libc/test/src/arpa/inet/CMakeLists.txt
@@ -0,0 +1,53 @@
+add_custom_target(libc_arpa_inet_unittests)
+
+add_libc_unittest(
+ htonl
+ SUITE
+ libc_arpa_inet_unittests
+ SRCS
+ htonl_test.cpp
+ CXX_STANDARD
+ 20
+ DEPENDS
+ libc.src.arpa.inet.htonl
+ libc.src.arpa.inet.ntohl
+)
+
+add_libc_unittest(
+ htons
+ SUITE
+ libc_arpa_inet_unittests
+ SRCS
+ htons_test.cpp
+ CXX_STANDARD
+ 20
+ DEPENDS
+ libc.src.arpa.inet.htons
+ libc.src.arpa.inet.ntohs
+)
+
+add_libc_unittest(
+ ntohl
+ SUITE
+ libc_arpa_inet_unittests
+ SRCS
+ ntohl_test.cpp
+ CXX_STANDARD
+ 20
+ DEPENDS
+ libc.src.arpa.inet.htonl
+ libc.src.arpa.inet.ntohl
+)
+
+add_libc_unittest(
+ ntohs
+ SUITE
+ libc_arpa_inet_unittests
+ SRCS
+ ntohs_test.cpp
+ CXX_STANDARD
+ 20
+ DEPENDS
+ libc.src.arpa.inet.htons
+ libc.src.arpa.inet.ntohs
+)
diff --git a/libc/test/src/network/htonl_test.cpp b/libc/test/src/arpa/inet/htonl_test.cpp
index f2e2541312c3..4cc1e4cb4e88 100644
--- a/libc/test/src/network/htonl_test.cpp
+++ b/libc/test/src/arpa/inet/htonl_test.cpp
@@ -7,8 +7,8 @@
//===----------------------------------------------------------------------===//
#include "src/__support/endian_internal.h"
-#include "src/network/htonl.h"
-#include "src/network/ntohl.h"
+#include "src/arpa/inet/htonl.h"
+#include "src/arpa/inet/ntohl.h"
#include "test/UnitTest/Test.h"
TEST(LlvmLibcHtonl, SmokeTest) {
diff --git a/libc/test/src/network/htons_test.cpp b/libc/test/src/arpa/inet/htons_test.cpp
index 9668162523ce..6a95ec5587e9 100644
--- a/libc/test/src/network/htons_test.cpp
+++ b/libc/test/src/arpa/inet/htons_test.cpp
@@ -7,8 +7,8 @@
//===----------------------------------------------------------------------===//
#include "src/__support/endian_internal.h"
-#include "src/network/htons.h"
-#include "src/network/ntohs.h"
+#include "src/arpa/inet/htons.h"
+#include "src/arpa/inet/ntohs.h"
#include "test/UnitTest/Test.h"
TEST(LlvmLibcHtons, SmokeTest) {
diff --git a/libc/test/src/network/ntohl_test.cpp b/libc/test/src/arpa/inet/ntohl_test.cpp
index b72456b7200e..42562486d5c0 100644
--- a/libc/test/src/network/ntohl_test.cpp
+++ b/libc/test/src/arpa/inet/ntohl_test.cpp
@@ -7,8 +7,8 @@
//===----------------------------------------------------------------------===//
#include "src/__support/endian_internal.h"
-#include "src/network/htonl.h"
-#include "src/network/ntohl.h"
+#include "src/arpa/inet/htonl.h"
+#include "src/arpa/inet/ntohl.h"
#include "test/UnitTest/Test.h"
TEST(LlvmLibcNtohl, SmokeTest) {
diff --git a/libc/test/src/network/ntohs_test.cpp b/libc/test/src/arpa/inet/ntohs_test.cpp
index 1104356076b9..38b2c8d8fe40 100644
--- a/libc/test/src/network/ntohs_test.cpp
+++ b/libc/test/src/arpa/inet/ntohs_test.cpp
@@ -7,8 +7,8 @@
//===----------------------------------------------------------------------===//
#include "src/__support/endian_internal.h"
-#include "src/network/htons.h"
-#include "src/network/ntohs.h"
+#include "src/arpa/inet/htons.h"
+#include "src/arpa/inet/ntohs.h"
#include "test/UnitTest/Test.h"
TEST(LlvmLibcNtohs, SmokeTest) {
diff --git a/libc/test/src/complex/CImagTest.h b/libc/test/src/complex/CImagTest.h
index 6d2f93500266..408460d97dfc 100644
--- a/libc/test/src/complex/CImagTest.h
+++ b/libc/test/src/complex/CImagTest.h
@@ -38,9 +38,14 @@ public:
neg_min_denormal);
EXPECT_FP_EQ(func(CFPT(1241.112 + max_denormal * 1.0i)), max_denormal);
EXPECT_FP_EQ(func(CFPT(121.121 + zero * 1.0i)), zero);
- EXPECT_FP_EQ(func(CFPT(neg_zero + zero * 1.0i)), zero);
- EXPECT_FP_EQ(func(CFPT(neg_zero + neg_zero * 1.0i)), neg_zero);
- EXPECT_FP_EQ(func(CFPT(zero + neg_zero * 1.0i)), neg_zero);
+ EXPECT_FP_EQ(func(CFPT(0.0 + 0.0i)), 0.0);
+ EXPECT_FP_EQ(func(CFPT(-0.0 + 0.0i)), 0.0);
+ EXPECT_FP_EQ(func(CFPT(0.0 - 0.0i)), -0.0);
+ EXPECT_FP_EQ(func(CFPT(-0.0 - 0.0i)), -0.0);
+ EXPECT_FP_EQ(func(CFPT(0.0)), 0.0);
+ EXPECT_FP_EQ(func(CFPT(-0.0)), 0.0);
+ EXPECT_FP_EQ(func(CFPT(0.0i)), 0.0);
+ EXPECT_FP_EQ(func(CFPT(-0.0i)), -0.0);
}
void testRoundedNumbers(CImagFunc func) {
diff --git a/libc/test/src/complex/CMakeLists.txt b/libc/test/src/complex/CMakeLists.txt
index 8f49e6d79e17..d6b62e4686a2 100644
--- a/libc/test/src/complex/CMakeLists.txt
+++ b/libc/test/src/complex/CMakeLists.txt
@@ -1,6 +1,126 @@
add_custom_target(libc-complex-unittests)
add_libc_test(
+ conj_test
+ SUITE
+ libc-complex-unittests
+ SRCS
+ conj_test.cpp
+ DEPENDS
+ libc.src.complex.conj
+ LINK_LIBRARIES
+ LibcFPTestHelpers
+)
+
+add_libc_test(
+ conjf_test
+ SUITE
+ libc-complex-unittests
+ SRCS
+ conjf_test.cpp
+ DEPENDS
+ libc.src.complex.conjf
+ LINK_LIBRARIES
+ LibcFPTestHelpers
+)
+
+add_libc_test(
+ conjl_test
+ SUITE
+ libc-complex-unittests
+ SRCS
+ conjl_test.cpp
+ DEPENDS
+ libc.src.complex.conjl
+ LINK_LIBRARIES
+ LibcFPTestHelpers
+)
+
+add_libc_test(
+ conjf16_test
+ SUITE
+ libc-complex-unittests
+ SRCS
+ conjf16_test.cpp
+ DEPENDS
+ libc.src.complex.conjf16
+ LINK_LIBRARIES
+ LibcFPTestHelpers
+)
+
+add_libc_test(
+ conjf128_test
+ SUITE
+ libc-complex-unittests
+ SRCS
+ conjf128_test.cpp
+ DEPENDS
+ libc.src.complex.conjf128
+ LINK_LIBRARIES
+ LibcFPTestHelpers
+)
+
+add_libc_test(
+ cproj_test
+ SUITE
+ libc-complex-unittests
+ SRCS
+ cproj_test.cpp
+ DEPENDS
+ libc.src.complex.cproj
+ LINK_LIBRARIES
+ LibcFPTestHelpers
+)
+
+add_libc_test(
+ cprojf_test
+ SUITE
+ libc-complex-unittests
+ SRCS
+ cprojf_test.cpp
+ DEPENDS
+ libc.src.complex.cprojf
+ LINK_LIBRARIES
+ LibcFPTestHelpers
+)
+
+add_libc_test(
+ cprojl_test
+ SUITE
+ libc-complex-unittests
+ SRCS
+ cprojl_test.cpp
+ DEPENDS
+ libc.src.complex.cprojl
+ LINK_LIBRARIES
+ LibcFPTestHelpers
+)
+
+add_libc_test(
+ cprojf16_test
+ SUITE
+ libc-complex-unittests
+ SRCS
+ cprojf16_test.cpp
+ DEPENDS
+ libc.src.complex.cprojf16
+ LINK_LIBRARIES
+ LibcFPTestHelpers
+)
+
+add_libc_test(
+ cprojf128_test
+ SUITE
+ libc-complex-unittests
+ SRCS
+ cprojf128_test.cpp
+ DEPENDS
+ libc.src.complex.cprojf128
+ LINK_LIBRARIES
+ LibcFPTestHelpers
+)
+
+add_libc_test(
creal_test
SUITE
libc-complex-unittests
diff --git a/libc/test/src/complex/CRealTest.h b/libc/test/src/complex/CRealTest.h
index a25555b506e2..80eafc9975f4 100644
--- a/libc/test/src/complex/CRealTest.h
+++ b/libc/test/src/complex/CRealTest.h
@@ -37,8 +37,14 @@ public:
EXPECT_FP_EQ(func(CFPT(neg_min_denormal + 781.134i)), neg_min_denormal);
EXPECT_FP_EQ(func(CFPT(max_denormal + 1241.112i)), max_denormal);
EXPECT_FP_EQ(func(CFPT(zero + 121.121i)), zero);
- EXPECT_FP_EQ(func(CFPT(neg_zero + neg_zero * 1.0i)), neg_zero);
- EXPECT_FP_EQ(func(CFPT(neg_zero + zero * 1.0i)), zero);
+ EXPECT_FP_EQ(func(CFPT(0.0 + 0.0i)), 0.0);
+ EXPECT_FP_EQ(func(CFPT(-0.0 + 0.0i)), 0.0);
+ EXPECT_FP_EQ(func(CFPT(0.0 - 0.0i)), 0.0);
+ EXPECT_FP_EQ(func(CFPT(-0.0 - 0.0i)), -0.0);
+ EXPECT_FP_EQ(func(CFPT(0.0)), 0.0);
+ EXPECT_FP_EQ(func(CFPT(-0.0)), -0.0);
+ EXPECT_FP_EQ(func(CFPT(0.0i)), 0.0);
+ EXPECT_FP_EQ(func(CFPT(-0.0i)), -0.0);
}
void testRoundedNumbers(CRealFunc func) {
diff --git a/libc/test/src/complex/ConjTest.h b/libc/test/src/complex/ConjTest.h
new file mode 100644
index 000000000000..da4fb4fd137c
--- /dev/null
+++ b/libc/test/src/complex/ConjTest.h
@@ -0,0 +1,131 @@
+//===-- Utility class to test different flavors of conj ---------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_TEST_SRC_COMPLEX_CONJTEST_H
+#define LLVM_LIBC_TEST_SRC_COMPLEX_CONJTEST_H
+
+#include "test/UnitTest/FEnvSafeTest.h"
+#include "test/UnitTest/FPMatcher.h"
+#include "test/UnitTest/Test.h"
+
+#include "hdr/math_macros.h"
+
+template <typename CFPT, typename FPT>
+class ConjTest : public LIBC_NAMESPACE::testing::FEnvSafeTest {
+
+ DECLARE_SPECIAL_CONSTANTS(FPT)
+
+public:
+ typedef CFPT (*ConjFunc)(CFPT);
+
+ void testSpecialNumbers(ConjFunc func) {
+ EXPECT_CFP_EQ(func(CFPT(aNaN + 67.123i)), CFPT(aNaN - 67.123i));
+ EXPECT_CFP_EQ(func(CFPT(neg_aNaN + 78.319i)), CFPT(neg_aNaN - 78.319i));
+ EXPECT_CFP_EQ(func(CFPT(sNaN + 7813.131i)), CFPT(sNaN - 7813.131i));
+ EXPECT_CFP_EQ(func(CFPT(neg_sNaN + 7824.152i)), CFPT(neg_sNaN - 7824.152i));
+ EXPECT_CFP_EQ(func(CFPT(inf + 9024.2442i)), CFPT(inf - 9024.2442i));
+ EXPECT_CFP_EQ(func(CFPT(neg_inf + 8923.124i)), CFPT(neg_inf - 8923.124i));
+ EXPECT_CFP_EQ(func(CFPT(min_normal + 782.124i)),
+ CFPT(min_normal - 782.124i));
+ EXPECT_CFP_EQ(func(CFPT(max_normal + 2141.2352i)),
+ CFPT(max_normal - 2141.2352i));
+ EXPECT_CFP_EQ(func(CFPT(neg_max_normal + 341.134i)),
+ CFPT(neg_max_normal - 341.134i));
+ EXPECT_CFP_EQ(func(CFPT(min_denormal + 781.142i)),
+ CFPT(min_denormal - 781.142i));
+ EXPECT_CFP_EQ(func(CFPT(neg_min_denormal + 781.134i)),
+ CFPT(neg_min_denormal - 781.134i));
+ EXPECT_CFP_EQ(func(CFPT(max_denormal + 1241.112i)),
+ CFPT(max_denormal - 1241.112i));
+ EXPECT_CFP_EQ(func(CFPT(zero + 121.121i)), CFPT(zero - 121.121i));
+ EXPECT_CFP_EQ(func(CFPT(67.123 + aNaN * 1.0i)), CFPT(67.123 - aNaN * 1.0i));
+ EXPECT_CFP_EQ(func(CFPT(78.319 + neg_aNaN * 1.0i)),
+ CFPT(78.319 - neg_aNaN * 1.0i));
+ EXPECT_CFP_EQ(func(CFPT(7813.131 + sNaN * 1.0i)),
+ CFPT(7813.131 - sNaN * 1.0i));
+ EXPECT_CFP_EQ(func(CFPT(7824.152 + neg_sNaN * 1.0i)),
+ CFPT(7824.152 - neg_sNaN * 1.0i));
+ EXPECT_CFP_EQ(func(CFPT(9024.2442 + inf * 1.0i)),
+ CFPT(9024.2442 - inf * 1.0i));
+ EXPECT_CFP_EQ(func(CFPT(8923.124 + neg_inf * 1.0i)),
+ CFPT(8923.124 - neg_inf * 1.0i));
+ EXPECT_CFP_EQ(func(CFPT(782.124 + min_normal * 1.0i)),
+ CFPT(782.124 - min_normal * 1.0i));
+ EXPECT_CFP_EQ(func(CFPT(2141.2352 + max_normal * 1.0i)),
+ CFPT(2141.2352 - max_normal * 1.0i));
+ EXPECT_CFP_EQ(func(CFPT(341.134 + neg_max_normal * 1.0i)),
+ CFPT(341.134 - neg_max_normal * 1.0i));
+ EXPECT_CFP_EQ(func(CFPT(781.142 + min_denormal * 1.0i)),
+ CFPT(781.142 - min_denormal * 1.0i));
+ EXPECT_CFP_EQ(func(CFPT(781.134 + neg_min_denormal * 1.0i)),
+ CFPT(781.134 - neg_min_denormal * 1.0i));
+ EXPECT_CFP_EQ(func(CFPT(1241.112 + max_denormal * 1.0i)),
+ CFPT(1241.112 - max_denormal * 1.0i));
+ EXPECT_CFP_EQ(func(CFPT(121.121 + zero * 1.0i)),
+ CFPT(121.121 - zero * 1.0i));
+ EXPECT_CFP_EQ(func(CFPT(0.0 - 0.0i)), CFPT(0.0 + 0.0i));
+ EXPECT_CFP_EQ(func(CFPT(0.0 + 0.0i)), CFPT(0.0 - 0.0i));
+ // This test passes because the conjugate of -0.0 - 0.0i is CMPLX(-0.0, 0.0)
+ // which cannot be represented as -0.0 + 0.0i because -0.0 + 0.0i is
+ // actually CMPLX(-0.0, 0.0) + CMPLX(0.0, 0.0) = 0.0 + 0.0i so to represent
+ // CMPLX(-0.0, 0.0), we use -0.0
+ EXPECT_CFP_EQ(func(CFPT(-0.0 - 0.0i)), CFPT(-0.0));
+ // This test passes because -0.0 + 0.0i is actually
+ // CMPLX(-0.0, 0.0) + CMPLX(0.0, 0.0) = CMPLX(-0.0 + 0.0, 0.0) = 0.0 + 0.0i
+ EXPECT_CFP_EQ(func(CFPT(-0.0 + 0.0i)), CFPT(0.0 - 0.0i));
+ EXPECT_CFP_EQ(func(CFPT(0.0)), CFPT(0.0 - 0.0i));
+ EXPECT_CFP_EQ(func(CFPT(-0.0)), CFPT(-0.0 - 0.0i));
+ EXPECT_CFP_EQ(func(CFPT(0.0i)), CFPT(0.0 - 0.0i));
+ EXPECT_CFP_EQ(func(CFPT(-0.0i)), CFPT(-0.0));
+ }
+
+ void testRoundedNumbers(ConjFunc func) {
+ EXPECT_CFP_EQ(func((CFPT)(4523.1413 + 12413.1414i)),
+ CFPT(4523.1413 - 12413.1414i));
+ EXPECT_CFP_EQ(func((CFPT)(-4523.1413 + 12413.1414i)),
+ CFPT(-4523.1413 - 12413.1414i));
+ EXPECT_CFP_EQ(func((CFPT)(4523.1413 - 12413.1414i)),
+ CFPT(4523.1413 + 12413.1414i));
+ EXPECT_CFP_EQ(func((CFPT)(-4523.1413 - 12413.1414i)),
+ CFPT(-4523.1413 + 12413.1414i));
+
+ EXPECT_CFP_EQ(func((CFPT)(3210.5678 + 9876.5432i)),
+ CFPT(3210.5678 - 9876.5432i));
+ EXPECT_CFP_EQ(func((CFPT)(-3210.5678 + 9876.5432i)),
+ CFPT(-3210.5678 - 9876.5432i));
+ EXPECT_CFP_EQ(func((CFPT)(3210.5678 - 9876.5432i)),
+ CFPT(3210.5678 + 9876.5432i));
+ EXPECT_CFP_EQ(func((CFPT)(-3210.5678 - 9876.5432i)),
+ CFPT(-3210.5678 + 9876.5432i));
+
+ EXPECT_CFP_EQ(func((CFPT)(1234.4321 + 4321.1234i)),
+ CFPT(1234.4321 - 4321.1234i));
+ EXPECT_CFP_EQ(func((CFPT)(-1234.4321 + 4321.1234i)),
+ CFPT(-1234.4321 - 4321.1234i));
+ EXPECT_CFP_EQ(func((CFPT)(1234.4321 - 4321.1234i)),
+ CFPT(1234.4321 + 4321.1234i));
+ EXPECT_CFP_EQ(func((CFPT)(-1234.4321 - 4321.1234i)),
+ CFPT(-1234.4321 + 4321.1234i));
+
+ EXPECT_CFP_EQ(func((CFPT)(6789.1234 + 8765.6789i)),
+ CFPT(6789.1234 - 8765.6789i));
+ EXPECT_CFP_EQ(func((CFPT)(-6789.1234 + 8765.6789i)),
+ CFPT(-6789.1234 - 8765.6789i));
+ EXPECT_CFP_EQ(func((CFPT)(6789.1234 - 8765.6789i)),
+ CFPT(6789.1234 + 8765.6789i));
+ EXPECT_CFP_EQ(func((CFPT)(-6789.1234 - 8765.6789i)),
+ CFPT(-6789.1234 + 8765.6789i));
+ }
+};
+
+#define LIST_CONJ_TESTS(U, T, func) \
+ using LlvmLibcConjTest = ConjTest<U, T>; \
+ TEST_F(LlvmLibcConjTest, SpecialNumbers) { testSpecialNumbers(&func); } \
+ TEST_F(LlvmLibcConjTest, RoundedNumbers) { testRoundedNumbers(&func); }
+
+#endif // LLVM_LIBC_TEST_SRC_COMPLEX_CONJTEST_H
diff --git a/libc/test/src/complex/CprojTest.h b/libc/test/src/complex/CprojTest.h
new file mode 100644
index 000000000000..4e2f6cc58a5a
--- /dev/null
+++ b/libc/test/src/complex/CprojTest.h
@@ -0,0 +1,131 @@
+//===-- Utility class to test different flavors of cproj --------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_TEST_SRC_COMPLEX_CPROJTEST_H
+#define LLVM_LIBC_TEST_SRC_COMPLEX_CPROJTEST_H
+
+#include "test/UnitTest/FEnvSafeTest.h"
+#include "test/UnitTest/FPMatcher.h"
+#include "test/UnitTest/Test.h"
+
+#include "hdr/math_macros.h"
+
+template <typename CFPT, typename FPT>
+class CprojTest : public LIBC_NAMESPACE::testing::FEnvSafeTest {
+
+ DECLARE_SPECIAL_CONSTANTS(FPT)
+
+public:
+ typedef CFPT (*CprojFunc)(CFPT);
+
+ void testSpecialNumbers(CprojFunc func) {
+ EXPECT_CFP_EQ(func(CFPT(inf + 9024.2442i)), CFPT(inf + 0.0i));
+ EXPECT_CFP_EQ(func(CFPT(inf - 9024.2442i)), CFPT(inf - 0.0i));
+ EXPECT_CFP_EQ(func(CFPT(neg_inf + 8923.124i)), CFPT(inf + 0.0i));
+ EXPECT_CFP_EQ(func(CFPT(neg_inf - 8923.124i)), CFPT(inf - 0.0i));
+ EXPECT_CFP_EQ(func(CFPT(9024.2442 + inf * 1.0i)), CFPT(inf + 0.0i));
+ EXPECT_CFP_EQ(func(CFPT(9024.2442 + neg_inf * 1.0i)), CFPT(inf - 0.0i));
+ EXPECT_CFP_EQ(func(CFPT(inf + neg_inf * 1.0i)), CFPT(inf - 0.0i));
+ EXPECT_CFP_EQ(func(CFPT(inf + inf * 1.0i)), CFPT(inf + 0.0i));
+ EXPECT_CFP_EQ(func(CFPT(neg_inf + neg_inf * 1.0i)), CFPT(inf - 0.0i));
+ EXPECT_CFP_EQ(func(CFPT(neg_inf + inf * 1.0i)), CFPT(inf + 0.0i));
+ EXPECT_CFP_EQ(func(CFPT(neg_inf + inf * 1.0i)), CFPT(inf + 0.0i));
+ EXPECT_CFP_EQ(func(CFPT(aNaN + inf * 1.0i)), CFPT(inf + 0.0i));
+ EXPECT_CFP_EQ(func(CFPT(aNaN + neg_inf * 1.0i)), CFPT(inf - 0.0i));
+ EXPECT_CFP_EQ(func(CFPT(90.24 + inf * 1.0i)), CFPT(inf + 0.0i));
+ EXPECT_CFP_EQ(func(CFPT(89.12 + neg_inf * 1.0i)), CFPT(inf - 0.0i));
+
+ EXPECT_CFP_EQ(func(CFPT(aNaN + 67.123i)), CFPT(aNaN + 67.123i));
+ EXPECT_CFP_EQ(func(CFPT(neg_aNaN + 78.319i)), CFPT(neg_aNaN + 78.319i));
+ EXPECT_CFP_EQ(func(CFPT(sNaN + 7813.131i)), CFPT(sNaN + 7813.131i));
+ EXPECT_CFP_EQ(func(CFPT(neg_sNaN + 7824.152i)), CFPT(neg_sNaN + 7824.152i));
+ EXPECT_CFP_EQ(func(CFPT(min_normal + 782.124i)),
+ CFPT(min_normal + 782.124i));
+ EXPECT_CFP_EQ(func(CFPT(max_normal + 2141.2352i)),
+ CFPT(max_normal + 2141.2352i));
+ EXPECT_CFP_EQ(func(CFPT(neg_max_normal + 341.134i)),
+ CFPT(neg_max_normal + 341.134i));
+ EXPECT_CFP_EQ(func(CFPT(min_denormal + 781.142i)),
+ CFPT(min_denormal + 781.142i));
+ EXPECT_CFP_EQ(func(CFPT(neg_min_denormal + 781.134i)),
+ CFPT(neg_min_denormal + 781.134i));
+ EXPECT_CFP_EQ(func(CFPT(max_denormal + 1241.112i)),
+ CFPT(max_denormal + 1241.112i));
+ EXPECT_CFP_EQ(func(CFPT(zero + 121.121i)), CFPT(zero + 121.121i));
+ EXPECT_CFP_EQ(func(CFPT(67.123 + aNaN * 1.0i)), CFPT(67.123 + aNaN * 1.0i));
+ EXPECT_CFP_EQ(func(CFPT(78.319 + neg_aNaN * 1.0i)),
+ CFPT(78.319 + neg_aNaN * 1.0i));
+ EXPECT_CFP_EQ(func(CFPT(7813.131 + sNaN * 1.0i)),
+ CFPT(7813.131 + sNaN * 1.0i));
+ EXPECT_CFP_EQ(func(CFPT(7824.152 + neg_sNaN * 1.0i)),
+ CFPT(7824.152 + neg_sNaN * 1.0i));
+ EXPECT_CFP_EQ(func(CFPT(782.124 + min_normal * 1.0i)),
+ CFPT(782.124 + min_normal * 1.0i));
+ EXPECT_CFP_EQ(func(CFPT(2141.2352 + max_normal * 1.0i)),
+ CFPT(2141.2352 + max_normal * 1.0i));
+ EXPECT_CFP_EQ(func(CFPT(341.134 + neg_max_normal * 1.0i)),
+ CFPT(341.134 + neg_max_normal * 1.0i));
+ EXPECT_CFP_EQ(func(CFPT(781.142 + min_denormal * 1.0i)),
+ CFPT(781.142 + min_denormal * 1.0i));
+ EXPECT_CFP_EQ(func(CFPT(781.134 + neg_min_denormal * 1.0i)),
+ CFPT(781.134 + neg_min_denormal * 1.0i));
+ EXPECT_CFP_EQ(func(CFPT(1241.112 + max_denormal * 1.0i)),
+ CFPT(1241.112 + max_denormal * 1.0i));
+ EXPECT_CFP_EQ(func(CFPT(121.121 + zero * 1.0i)),
+ CFPT(121.121 + zero * 1.0i));
+ EXPECT_CFP_EQ(func(CFPT(0.0 - 0.0i)), CFPT(0.0 - 0.0i));
+ EXPECT_CFP_EQ(func(CFPT(0.0 + 0.0i)), CFPT(0.0 + 0.0i));
+ EXPECT_CFP_EQ(func(CFPT(-0.0 - 0.0i)), CFPT(-0.0 - 0.0i));
+ EXPECT_CFP_EQ(func(CFPT(-0.0 + 0.0i)), CFPT(-0.0 + 0.0i));
+ }
+
+ void testRoundedNumbers(CprojFunc func) {
+ EXPECT_CFP_EQ(func((CFPT)(4523.1413 + 12413.1414i)),
+ CFPT(4523.1413 + 12413.1414i));
+ EXPECT_CFP_EQ(func((CFPT)(-4523.1413 + 12413.1414i)),
+ CFPT(-4523.1413 + 12413.1414i));
+ EXPECT_CFP_EQ(func((CFPT)(4523.1413 - 12413.1414i)),
+ CFPT(4523.1413 - 12413.1414i));
+ EXPECT_CFP_EQ(func((CFPT)(-4523.1413 - 12413.1414i)),
+ CFPT(-4523.1413 - 12413.1414i));
+
+ EXPECT_CFP_EQ(func((CFPT)(3210.5678 + 9876.5432i)),
+ CFPT(3210.5678 + 9876.5432i));
+ EXPECT_CFP_EQ(func((CFPT)(-3210.5678 + 9876.5432i)),
+ CFPT(-3210.5678 + 9876.5432i));
+ EXPECT_CFP_EQ(func((CFPT)(3210.5678 - 9876.5432i)),
+ CFPT(3210.5678 - 9876.5432i));
+ EXPECT_CFP_EQ(func((CFPT)(-3210.5678 - 9876.5432i)),
+ CFPT(-3210.5678 - 9876.5432i));
+
+ EXPECT_CFP_EQ(func((CFPT)(1234.4321 + 4321.1234i)),
+ CFPT(1234.4321 + 4321.1234i));
+ EXPECT_CFP_EQ(func((CFPT)(-1234.4321 + 4321.1234i)),
+ CFPT(-1234.4321 + 4321.1234i));
+ EXPECT_CFP_EQ(func((CFPT)(1234.4321 - 4321.1234i)),
+ CFPT(1234.4321 - 4321.1234i));
+ EXPECT_CFP_EQ(func((CFPT)(-1234.4321 - 4321.1234i)),
+ CFPT(-1234.4321 - 4321.1234i));
+
+ EXPECT_CFP_EQ(func((CFPT)(6789.1234 + 8765.6789i)),
+ CFPT(6789.1234 + 8765.6789i));
+ EXPECT_CFP_EQ(func((CFPT)(-6789.1234 + 8765.6789i)),
+ CFPT(-6789.1234 + 8765.6789i));
+ EXPECT_CFP_EQ(func((CFPT)(6789.1234 - 8765.6789i)),
+ CFPT(6789.1234 - 8765.6789i));
+ EXPECT_CFP_EQ(func((CFPT)(-6789.1234 - 8765.6789i)),
+ CFPT(-6789.1234 - 8765.6789i));
+ }
+};
+
+#define LIST_CPROJ_TESTS(U, T, func) \
+ using LlvmLibcCprojTest = CprojTest<U, T>; \
+ TEST_F(LlvmLibcCprojTest, SpecialNumbers) { testSpecialNumbers(&func); } \
+ TEST_F(LlvmLibcCprojTest, RoundedNumbers) { testRoundedNumbers(&func); }
+
+#endif // LLVM_LIBC_TEST_SRC_COMPLEX_CPROJTEST_H
diff --git a/libc/test/src/complex/cimagf128_test.cpp b/libc/test/src/complex/cimagf128_test.cpp
index 50ddc0ab0616..70ad0de3d38f 100644
--- a/libc/test/src/complex/cimagf128_test.cpp
+++ b/libc/test/src/complex/cimagf128_test.cpp
@@ -10,8 +10,4 @@
#include "src/complex/cimagf128.h"
-#if defined(LIBC_TYPES_HAS_CFLOAT128)
-
LIST_CIMAG_TESTS(cfloat128, float128, LIBC_NAMESPACE::cimagf128)
-
-#endif // LIBC_TYPES_HAS_CFLOAT128
diff --git a/libc/test/src/complex/cimagf16_test.cpp b/libc/test/src/complex/cimagf16_test.cpp
index 65a69787ddbd..3842381351ab 100644
--- a/libc/test/src/complex/cimagf16_test.cpp
+++ b/libc/test/src/complex/cimagf16_test.cpp
@@ -10,8 +10,4 @@
#include "src/complex/cimagf16.h"
-#if defined(LIBC_TYPES_HAS_CFLOAT16)
-
LIST_CIMAG_TESTS(cfloat16, float16, LIBC_NAMESPACE::cimagf16)
-
-#endif // LIBC_TYPES_HAS_CFLOAT16
diff --git a/libc/test/src/complex/conj_test.cpp b/libc/test/src/complex/conj_test.cpp
new file mode 100644
index 000000000000..97445fa06508
--- /dev/null
+++ b/libc/test/src/complex/conj_test.cpp
@@ -0,0 +1,13 @@
+//===-- Unittests for conj ------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "ConjTest.h"
+
+#include "src/complex/conj.h"
+
+LIST_CONJ_TESTS(_Complex double, double, LIBC_NAMESPACE::conj)
diff --git a/libc/test/src/complex/conjf128_test.cpp b/libc/test/src/complex/conjf128_test.cpp
new file mode 100644
index 000000000000..4c2a72c6d39d
--- /dev/null
+++ b/libc/test/src/complex/conjf128_test.cpp
@@ -0,0 +1,13 @@
+//===-- Unittests for conjf128 --------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "ConjTest.h"
+
+#include "src/complex/conjf128.h"
+
+LIST_CONJ_TESTS(cfloat128, float128, LIBC_NAMESPACE::conjf128)
diff --git a/libc/test/src/complex/conjf16_test.cpp b/libc/test/src/complex/conjf16_test.cpp
new file mode 100644
index 000000000000..374f9ec3e624
--- /dev/null
+++ b/libc/test/src/complex/conjf16_test.cpp
@@ -0,0 +1,13 @@
+//===-- Unittests for conjf16 ---------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "ConjTest.h"
+
+#include "src/complex/conjf16.h"
+
+LIST_CONJ_TESTS(cfloat16, float16, LIBC_NAMESPACE::conjf16)
diff --git a/libc/test/src/complex/conjf_test.cpp b/libc/test/src/complex/conjf_test.cpp
new file mode 100644
index 000000000000..34b00b37996c
--- /dev/null
+++ b/libc/test/src/complex/conjf_test.cpp
@@ -0,0 +1,13 @@
+//===-- Unittests for conjf -----------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "ConjTest.h"
+
+#include "src/complex/conjf.h"
+
+LIST_CONJ_TESTS(_Complex float, float, LIBC_NAMESPACE::conjf)
diff --git a/libc/test/src/complex/conjl_test.cpp b/libc/test/src/complex/conjl_test.cpp
new file mode 100644
index 000000000000..ec299f963154
--- /dev/null
+++ b/libc/test/src/complex/conjl_test.cpp
@@ -0,0 +1,13 @@
+//===-- Unittests for conjl -----------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "ConjTest.h"
+
+#include "src/complex/conjl.h"
+
+LIST_CONJ_TESTS(_Complex long double, long double, LIBC_NAMESPACE::conjl)
diff --git a/libc/include/gpu/rpc.h.def b/libc/test/src/complex/cproj_test.cpp
index 060650345e1f..83e5760f9ca8 100644
--- a/libc/include/gpu/rpc.h.def
+++ b/libc/test/src/complex/cproj_test.cpp
@@ -1,4 +1,4 @@
-//===-- GPU header rpc.h --------------------------------------------------===//
+//===-- Unittests for cproj -----------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
@@ -6,13 +6,8 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_LIBC_GPU_RPC_H
-#define LLVM_LIBC_GPU_RPC_H
+#include "CprojTest.h"
-#include "__llvm-libc-common.h"
+#include "src/complex/cproj.h"
-#include "../llvm-libc-types/rpc_opcodes_t.h"
-
-%%public_api()
-
-#endif // LLVM_LIBC_GPU_RPC_H
+LIST_CPROJ_TESTS(_Complex double, double, LIBC_NAMESPACE::cproj)
diff --git a/libc/test/src/complex/cprojf128_test.cpp b/libc/test/src/complex/cprojf128_test.cpp
new file mode 100644
index 000000000000..7b41eb5cf5f9
--- /dev/null
+++ b/libc/test/src/complex/cprojf128_test.cpp
@@ -0,0 +1,13 @@
+//===-- Unittests for cprojf128 -------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "CprojTest.h"
+
+#include "src/complex/cprojf128.h"
+
+LIST_CPROJ_TESTS(cfloat128, float128, LIBC_NAMESPACE::cprojf128)
diff --git a/libc/test/src/complex/cprojf16_test.cpp b/libc/test/src/complex/cprojf16_test.cpp
new file mode 100644
index 000000000000..db9b7b9316bc
--- /dev/null
+++ b/libc/test/src/complex/cprojf16_test.cpp
@@ -0,0 +1,13 @@
+//===-- Unittests for cprojf16 --------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "CprojTest.h"
+
+#include "src/complex/cprojf16.h"
+
+LIST_CPROJ_TESTS(cfloat16, float16, LIBC_NAMESPACE::cprojf16)
diff --git a/libc/test/src/complex/cprojf_test.cpp b/libc/test/src/complex/cprojf_test.cpp
new file mode 100644
index 000000000000..7123ed4e28d4
--- /dev/null
+++ b/libc/test/src/complex/cprojf_test.cpp
@@ -0,0 +1,13 @@
+//===-- Unittests for cprojf ----------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "CprojTest.h"
+
+#include "src/complex/cprojf.h"
+
+LIST_CPROJ_TESTS(_Complex float, float, LIBC_NAMESPACE::cprojf)
diff --git a/libc/test/src/complex/cprojl_test.cpp b/libc/test/src/complex/cprojl_test.cpp
new file mode 100644
index 000000000000..0858bf460188
--- /dev/null
+++ b/libc/test/src/complex/cprojl_test.cpp
@@ -0,0 +1,13 @@
+//===-- Unittests for cprojl ----------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "CprojTest.h"
+
+#include "src/complex/cprojl.h"
+
+LIST_CPROJ_TESTS(_Complex long double, long double, LIBC_NAMESPACE::cprojl)
diff --git a/libc/test/src/complex/crealf128_test.cpp b/libc/test/src/complex/crealf128_test.cpp
index 7626eeebca27..0d1c26df7737 100644
--- a/libc/test/src/complex/crealf128_test.cpp
+++ b/libc/test/src/complex/crealf128_test.cpp
@@ -10,8 +10,4 @@
#include "src/complex/crealf128.h"
-#if defined(LIBC_TYPES_HAS_CFLOAT128)
-
LIST_CREAL_TESTS(cfloat128, float128, LIBC_NAMESPACE::crealf128)
-
-#endif // LIBC_TYPES_HAS_CFLOAT128
diff --git a/libc/test/src/complex/crealf16_test.cpp b/libc/test/src/complex/crealf16_test.cpp
index 97346aad615f..b8560d74d35b 100644
--- a/libc/test/src/complex/crealf16_test.cpp
+++ b/libc/test/src/complex/crealf16_test.cpp
@@ -10,8 +10,4 @@
#include "src/complex/crealf16.h"
-#if defined(LIBC_TYPES_HAS_CFLOAT16)
-
LIST_CREAL_TESTS(cfloat16, float16, LIBC_NAMESPACE::crealf16)
-
-#endif // LIBC_TYPES_HAS_CFLOAT16
diff --git a/libc/test/src/ctype/isalnum_test.cpp b/libc/test/src/ctype/isalnum_test.cpp
index 18ddd2b14b8c..cfc54e95e922 100644
--- a/libc/test/src/ctype/isalnum_test.cpp
+++ b/libc/test/src/ctype/isalnum_test.cpp
@@ -11,16 +11,7 @@
#include "test/UnitTest/Test.h"
-TEST(LlvmLibcIsAlNum, SimpleTest) {
- EXPECT_NE(LIBC_NAMESPACE::isalnum('a'), 0);
- EXPECT_NE(LIBC_NAMESPACE::isalnum('B'), 0);
- EXPECT_NE(LIBC_NAMESPACE::isalnum('3'), 0);
-
- EXPECT_EQ(LIBC_NAMESPACE::isalnum(' '), 0);
- EXPECT_EQ(LIBC_NAMESPACE::isalnum('?'), 0);
- EXPECT_EQ(LIBC_NAMESPACE::isalnum('\0'), 0);
- EXPECT_EQ(LIBC_NAMESPACE::isalnum(-1), 0);
-}
+namespace {
// TODO: Merge the ctype tests using this framework.
constexpr char ALNUM_ARRAY[] = {
@@ -38,6 +29,19 @@ bool in_span(int ch, LIBC_NAMESPACE::cpp::span<const char> arr) {
return false;
}
+} // namespace
+
+TEST(LlvmLibcIsAlNum, SimpleTest) {
+ EXPECT_NE(LIBC_NAMESPACE::isalnum('a'), 0);
+ EXPECT_NE(LIBC_NAMESPACE::isalnum('B'), 0);
+ EXPECT_NE(LIBC_NAMESPACE::isalnum('3'), 0);
+
+ EXPECT_EQ(LIBC_NAMESPACE::isalnum(' '), 0);
+ EXPECT_EQ(LIBC_NAMESPACE::isalnum('?'), 0);
+ EXPECT_EQ(LIBC_NAMESPACE::isalnum('\0'), 0);
+ EXPECT_EQ(LIBC_NAMESPACE::isalnum(-1), 0);
+}
+
TEST(LlvmLibcIsAlNum, DefaultLocale) {
// Loops through all characters, verifying that numbers and letters
// return non-zero integer and everything else returns a zero.
diff --git a/libc/test/src/ctype/isalpha_test.cpp b/libc/test/src/ctype/isalpha_test.cpp
index e54b580dbe26..1e439cf973e3 100644
--- a/libc/test/src/ctype/isalpha_test.cpp
+++ b/libc/test/src/ctype/isalpha_test.cpp
@@ -11,16 +11,7 @@
#include "test/UnitTest/Test.h"
-TEST(LlvmLibcIsAlpha, SimpleTest) {
- EXPECT_NE(LIBC_NAMESPACE::isalpha('a'), 0);
- EXPECT_NE(LIBC_NAMESPACE::isalpha('B'), 0);
-
- EXPECT_EQ(LIBC_NAMESPACE::isalpha('3'), 0);
- EXPECT_EQ(LIBC_NAMESPACE::isalpha(' '), 0);
- EXPECT_EQ(LIBC_NAMESPACE::isalpha('?'), 0);
- EXPECT_EQ(LIBC_NAMESPACE::isalpha('\0'), 0);
- EXPECT_EQ(LIBC_NAMESPACE::isalpha(-1), 0);
-}
+namespace {
// TODO: Merge the ctype tests using this framework.
constexpr char ALPHA_ARRAY[] = {
@@ -37,6 +28,19 @@ bool in_span(int ch, LIBC_NAMESPACE::cpp::span<const char> arr) {
return false;
}
+} // namespace
+
+TEST(LlvmLibcIsAlpha, SimpleTest) {
+ EXPECT_NE(LIBC_NAMESPACE::isalpha('a'), 0);
+ EXPECT_NE(LIBC_NAMESPACE::isalpha('B'), 0);
+
+ EXPECT_EQ(LIBC_NAMESPACE::isalpha('3'), 0);
+ EXPECT_EQ(LIBC_NAMESPACE::isalpha(' '), 0);
+ EXPECT_EQ(LIBC_NAMESPACE::isalpha('?'), 0);
+ EXPECT_EQ(LIBC_NAMESPACE::isalpha('\0'), 0);
+ EXPECT_EQ(LIBC_NAMESPACE::isalpha(-1), 0);
+}
+
TEST(LlvmLibcIsAlpha, DefaultLocale) {
// Loops through all characters, verifying that letters return a
// non-zero integer and everything else returns zero.
diff --git a/libc/test/src/ctype/isdigit_test.cpp b/libc/test/src/ctype/isdigit_test.cpp
index adea55e59c74..0ee132d7f851 100644
--- a/libc/test/src/ctype/isdigit_test.cpp
+++ b/libc/test/src/ctype/isdigit_test.cpp
@@ -11,16 +11,7 @@
#include "test/UnitTest/Test.h"
-TEST(LlvmLibcIsDigit, SimpleTest) {
- EXPECT_NE(LIBC_NAMESPACE::isdigit('3'), 0);
-
- EXPECT_EQ(LIBC_NAMESPACE::isdigit('a'), 0);
- EXPECT_EQ(LIBC_NAMESPACE::isdigit('B'), 0);
- EXPECT_EQ(LIBC_NAMESPACE::isdigit(' '), 0);
- EXPECT_EQ(LIBC_NAMESPACE::isdigit('?'), 0);
- EXPECT_EQ(LIBC_NAMESPACE::isdigit('\0'), 0);
- EXPECT_EQ(LIBC_NAMESPACE::isdigit(-1), 0);
-}
+namespace {
// TODO: Merge the ctype tests using this framework.
constexpr char DIGIT_ARRAY[] = {
@@ -34,6 +25,19 @@ bool in_span(int ch, LIBC_NAMESPACE::cpp::span<const char> arr) {
return false;
}
+} // namespace
+
+TEST(LlvmLibcIsDigit, SimpleTest) {
+ EXPECT_NE(LIBC_NAMESPACE::isdigit('3'), 0);
+
+ EXPECT_EQ(LIBC_NAMESPACE::isdigit('a'), 0);
+ EXPECT_EQ(LIBC_NAMESPACE::isdigit('B'), 0);
+ EXPECT_EQ(LIBC_NAMESPACE::isdigit(' '), 0);
+ EXPECT_EQ(LIBC_NAMESPACE::isdigit('?'), 0);
+ EXPECT_EQ(LIBC_NAMESPACE::isdigit('\0'), 0);
+ EXPECT_EQ(LIBC_NAMESPACE::isdigit(-1), 0);
+}
+
TEST(LlvmLibcIsDigit, DefaultLocale) {
// Loops through all characters, verifying that numbers and letters
// return non-zero integer and everything else returns a zero.
diff --git a/libc/test/src/ctype/islower_test.cpp b/libc/test/src/ctype/islower_test.cpp
index f9414bd8cbd0..f877171abb9a 100644
--- a/libc/test/src/ctype/islower_test.cpp
+++ b/libc/test/src/ctype/islower_test.cpp
@@ -11,16 +11,7 @@
#include "test/UnitTest/Test.h"
-TEST(LlvmLibcIsLower, SimpleTest) {
- EXPECT_NE(LIBC_NAMESPACE::islower('a'), 0);
-
- EXPECT_EQ(LIBC_NAMESPACE::islower('B'), 0);
- EXPECT_EQ(LIBC_NAMESPACE::islower('3'), 0);
- EXPECT_EQ(LIBC_NAMESPACE::islower(' '), 0);
- EXPECT_EQ(LIBC_NAMESPACE::islower('?'), 0);
- EXPECT_EQ(LIBC_NAMESPACE::islower('\0'), 0);
- EXPECT_EQ(LIBC_NAMESPACE::islower(-1), 0);
-}
+namespace {
// TODO: Merge the ctype tests using this framework.
constexpr char LOWER_ARRAY[] = {
@@ -35,6 +26,19 @@ bool in_span(int ch, LIBC_NAMESPACE::cpp::span<const char> arr) {
return false;
}
+} // namespace
+
+TEST(LlvmLibcIsLower, SimpleTest) {
+ EXPECT_NE(LIBC_NAMESPACE::islower('a'), 0);
+
+ EXPECT_EQ(LIBC_NAMESPACE::islower('B'), 0);
+ EXPECT_EQ(LIBC_NAMESPACE::islower('3'), 0);
+ EXPECT_EQ(LIBC_NAMESPACE::islower(' '), 0);
+ EXPECT_EQ(LIBC_NAMESPACE::islower('?'), 0);
+ EXPECT_EQ(LIBC_NAMESPACE::islower('\0'), 0);
+ EXPECT_EQ(LIBC_NAMESPACE::islower(-1), 0);
+}
+
TEST(LlvmLibcIsLower, DefaultLocale) {
// Loops through all characters, verifying that numbers and letters
// return non-zero integer and everything else returns a zero.
diff --git a/libc/test/src/ctype/isupper_test.cpp b/libc/test/src/ctype/isupper_test.cpp
index 94def1a9dccc..151ed23f0ac9 100644
--- a/libc/test/src/ctype/isupper_test.cpp
+++ b/libc/test/src/ctype/isupper_test.cpp
@@ -11,16 +11,7 @@
#include "test/UnitTest/Test.h"
-TEST(LlvmLibcIsUpper, SimpleTest) {
- EXPECT_NE(LIBC_NAMESPACE::isupper('B'), 0);
-
- EXPECT_EQ(LIBC_NAMESPACE::isupper('a'), 0);
- EXPECT_EQ(LIBC_NAMESPACE::isupper('3'), 0);
- EXPECT_EQ(LIBC_NAMESPACE::isupper(' '), 0);
- EXPECT_EQ(LIBC_NAMESPACE::isupper('?'), 0);
- EXPECT_EQ(LIBC_NAMESPACE::isupper('\0'), 0);
- EXPECT_EQ(LIBC_NAMESPACE::isupper(-1), 0);
-}
+namespace {
// TODO: Merge the ctype tests using this framework.
constexpr char UPPER_ARRAY[] = {
@@ -35,6 +26,19 @@ bool in_span(int ch, LIBC_NAMESPACE::cpp::span<const char> arr) {
return false;
}
+} // namespace
+
+TEST(LlvmLibcIsUpper, SimpleTest) {
+ EXPECT_NE(LIBC_NAMESPACE::isupper('B'), 0);
+
+ EXPECT_EQ(LIBC_NAMESPACE::isupper('a'), 0);
+ EXPECT_EQ(LIBC_NAMESPACE::isupper('3'), 0);
+ EXPECT_EQ(LIBC_NAMESPACE::isupper(' '), 0);
+ EXPECT_EQ(LIBC_NAMESPACE::isupper('?'), 0);
+ EXPECT_EQ(LIBC_NAMESPACE::isupper('\0'), 0);
+ EXPECT_EQ(LIBC_NAMESPACE::isupper(-1), 0);
+}
+
TEST(LlvmLibcIsUpper, DefaultLocale) {
// Loops through all characters, verifying that numbers and letters
// return non-zero integer and everything else returns a zero.
diff --git a/libc/test/src/ctype/isxdigit_test.cpp b/libc/test/src/ctype/isxdigit_test.cpp
index d7253d549907..ec58f0da4922 100644
--- a/libc/test/src/ctype/isxdigit_test.cpp
+++ b/libc/test/src/ctype/isxdigit_test.cpp
@@ -11,17 +11,7 @@
#include "test/UnitTest/Test.h"
-TEST(LlvmLibcIsXdigit, SimpleTest) {
- EXPECT_NE(LIBC_NAMESPACE::isxdigit('a'), 0);
- EXPECT_NE(LIBC_NAMESPACE::isxdigit('B'), 0);
- EXPECT_NE(LIBC_NAMESPACE::isxdigit('3'), 0);
-
- EXPECT_EQ(LIBC_NAMESPACE::isxdigit('z'), 0);
- EXPECT_EQ(LIBC_NAMESPACE::isxdigit(' '), 0);
- EXPECT_EQ(LIBC_NAMESPACE::isxdigit('?'), 0);
- EXPECT_EQ(LIBC_NAMESPACE::isxdigit('\0'), 0);
- EXPECT_EQ(LIBC_NAMESPACE::isxdigit(-1), 0);
-}
+namespace {
// TODO: Merge the ctype tests using this framework.
constexpr char XDIGIT_ARRAY[] = {
@@ -36,6 +26,20 @@ bool in_span(int ch, LIBC_NAMESPACE::cpp::span<const char> arr) {
return false;
}
+} // namespace
+
+TEST(LlvmLibcIsXdigit, SimpleTest) {
+ EXPECT_NE(LIBC_NAMESPACE::isxdigit('a'), 0);
+ EXPECT_NE(LIBC_NAMESPACE::isxdigit('B'), 0);
+ EXPECT_NE(LIBC_NAMESPACE::isxdigit('3'), 0);
+
+ EXPECT_EQ(LIBC_NAMESPACE::isxdigit('z'), 0);
+ EXPECT_EQ(LIBC_NAMESPACE::isxdigit(' '), 0);
+ EXPECT_EQ(LIBC_NAMESPACE::isxdigit('?'), 0);
+ EXPECT_EQ(LIBC_NAMESPACE::isxdigit('\0'), 0);
+ EXPECT_EQ(LIBC_NAMESPACE::isxdigit(-1), 0);
+}
+
TEST(LlvmLibcIsXdigit, DefaultLocale) {
// Loops through all characters, verifying that numbers and letters
// return non-zero integer and everything else returns a zero.
diff --git a/libc/test/src/ctype/tolower_test.cpp b/libc/test/src/ctype/tolower_test.cpp
index 59432c43297b..fbcc5b8ee0d9 100644
--- a/libc/test/src/ctype/tolower_test.cpp
+++ b/libc/test/src/ctype/tolower_test.cpp
@@ -11,16 +11,7 @@
#include "test/UnitTest/Test.h"
-TEST(LlvmLibcToLower, SimpleTest) {
- EXPECT_EQ(LIBC_NAMESPACE::tolower('a'), int('a'));
- EXPECT_EQ(LIBC_NAMESPACE::tolower('B'), int('b'));
- EXPECT_EQ(LIBC_NAMESPACE::tolower('3'), int('3'));
-
- EXPECT_EQ(LIBC_NAMESPACE::tolower(' '), int(' '));
- EXPECT_EQ(LIBC_NAMESPACE::tolower('?'), int('?'));
- EXPECT_EQ(LIBC_NAMESPACE::tolower('\0'), int('\0'));
- EXPECT_EQ(LIBC_NAMESPACE::tolower(-1), int(-1));
-}
+namespace {
// TODO: Merge the ctype tests using this framework.
// Invariant: UPPER_ARR and LOWER_ARR are both the complete alphabet in the same
@@ -45,6 +36,19 @@ int span_index(int ch, LIBC_NAMESPACE::cpp::span<const char> arr) {
return -1;
}
+} // namespace
+
+TEST(LlvmLibcToLower, SimpleTest) {
+ EXPECT_EQ(LIBC_NAMESPACE::tolower('a'), int('a'));
+ EXPECT_EQ(LIBC_NAMESPACE::tolower('B'), int('b'));
+ EXPECT_EQ(LIBC_NAMESPACE::tolower('3'), int('3'));
+
+ EXPECT_EQ(LIBC_NAMESPACE::tolower(' '), int(' '));
+ EXPECT_EQ(LIBC_NAMESPACE::tolower('?'), int('?'));
+ EXPECT_EQ(LIBC_NAMESPACE::tolower('\0'), int('\0'));
+ EXPECT_EQ(LIBC_NAMESPACE::tolower(-1), int(-1));
+}
+
TEST(LlvmLibcToLower, DefaultLocale) {
for (int ch = -255; ch < 255; ++ch) {
int char_index = span_index(ch, UPPER_ARR);
diff --git a/libc/test/src/ctype/toupper_test.cpp b/libc/test/src/ctype/toupper_test.cpp
index 045b00bbb4b9..409b3cd96ed1 100644
--- a/libc/test/src/ctype/toupper_test.cpp
+++ b/libc/test/src/ctype/toupper_test.cpp
@@ -11,16 +11,7 @@
#include "test/UnitTest/Test.h"
-TEST(LlvmLibcToUpper, SimpleTest) {
- EXPECT_EQ(LIBC_NAMESPACE::toupper('a'), int('A'));
- EXPECT_EQ(LIBC_NAMESPACE::toupper('B'), int('B'));
- EXPECT_EQ(LIBC_NAMESPACE::toupper('3'), int('3'));
-
- EXPECT_EQ(LIBC_NAMESPACE::toupper(' '), int(' '));
- EXPECT_EQ(LIBC_NAMESPACE::toupper('?'), int('?'));
- EXPECT_EQ(LIBC_NAMESPACE::toupper('\0'), int('\0'));
- EXPECT_EQ(LIBC_NAMESPACE::toupper(-1), int(-1));
-}
+namespace {
// TODO: Merge the ctype tests using this framework.
// Invariant: UPPER_ARR and LOWER_ARR are both the complete alphabet in the same
@@ -45,6 +36,19 @@ int span_index(int ch, LIBC_NAMESPACE::cpp::span<const char> arr) {
return -1;
}
+} // namespace
+
+TEST(LlvmLibcToUpper, SimpleTest) {
+ EXPECT_EQ(LIBC_NAMESPACE::toupper('a'), int('A'));
+ EXPECT_EQ(LIBC_NAMESPACE::toupper('B'), int('B'));
+ EXPECT_EQ(LIBC_NAMESPACE::toupper('3'), int('3'));
+
+ EXPECT_EQ(LIBC_NAMESPACE::toupper(' '), int(' '));
+ EXPECT_EQ(LIBC_NAMESPACE::toupper('?'), int('?'));
+ EXPECT_EQ(LIBC_NAMESPACE::toupper('\0'), int('\0'));
+ EXPECT_EQ(LIBC_NAMESPACE::toupper(-1), int(-1));
+}
+
TEST(LlvmLibcToUpper, DefaultLocale) {
for (int ch = -255; ch < 255; ++ch) {
int char_index = span_index(ch, LOWER_ARR);
diff --git a/libc/test/src/math/CMakeLists.txt b/libc/test/src/math/CMakeLists.txt
index ea75720df4f4..16e7d4957ba1 100644
--- a/libc/test/src/math/CMakeLists.txt
+++ b/libc/test/src/math/CMakeLists.txt
@@ -29,6 +29,17 @@ add_fp_unittest(
)
add_fp_unittest(
+ cosf16_test
+ NEED_MPFR
+ SUITE
+ libc-math-unittests
+ SRCS
+ cosf16_test.cpp
+ DEPENDS
+ libc.src.math.cosf16
+)
+
+add_fp_unittest(
cospif_test
NEED_MPFR
SUITE
@@ -1550,6 +1561,19 @@ add_fp_unittest(
)
add_fp_unittest(
+ sqrtf128_test
+ NEED_MPFR
+ SUITE
+ libc-math-unittests
+ SRCS
+ sqrtf128_test.cpp
+ HDRS
+ SqrtTest.h
+ DEPENDS
+ libc.src.math.sqrtf128
+)
+
+add_fp_unittest(
generic_sqrtf_test
NEED_MPFR
SUITE
diff --git a/libc/test/src/math/cosf16_test.cpp b/libc/test/src/math/cosf16_test.cpp
new file mode 100644
index 000000000000..9e4687f0325c
--- /dev/null
+++ b/libc/test/src/math/cosf16_test.cpp
@@ -0,0 +1,40 @@
+//===-- Exhaustive test for cosf16 ----------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "src/math/cosf16.h"
+#include "test/UnitTest/FPMatcher.h"
+#include "test/UnitTest/Test.h"
+#include "utils/MPFRWrapper/MPFRUtils.h"
+
+using LlvmLibcCosf16Test = LIBC_NAMESPACE::testing::FPTest<float16>;
+
+namespace mpfr = LIBC_NAMESPACE::testing::mpfr;
+
+// Range: [0, Inf]
+static constexpr uint16_t POS_START = 0x0000U;
+static constexpr uint16_t POS_STOP = 0x7c00u;
+
+// Range: [-Inf, 0]
+static constexpr uint16_t NEG_START = 0x8000U;
+static constexpr uint16_t NEG_STOP = 0xfc00U;
+
+TEST_F(LlvmLibcCosf16Test, PositiveRange) {
+ for (uint16_t v = POS_START; v <= POS_STOP; ++v) {
+ float16 x = FPBits(v).get_val();
+ EXPECT_MPFR_MATCH_ALL_ROUNDING(mpfr::Operation::Cos, x,
+ LIBC_NAMESPACE::cosf16(x), 0.5);
+ }
+}
+
+TEST_F(LlvmLibcCosf16Test, NegativeRange) {
+ for (uint16_t v = NEG_START; v <= NEG_STOP; ++v) {
+ float16 x = FPBits(v).get_val();
+ EXPECT_MPFR_MATCH_ALL_ROUNDING(mpfr::Operation::Cos, x,
+ LIBC_NAMESPACE::cosf16(x), 0.5);
+ }
+}
diff --git a/libc/test/src/math/smoke/CMakeLists.txt b/libc/test/src/math/smoke/CMakeLists.txt
index 2c1c4dba7384..31f85a3ecfd2 100644
--- a/libc/test/src/math/smoke/CMakeLists.txt
+++ b/libc/test/src/math/smoke/CMakeLists.txt
@@ -13,6 +13,17 @@ add_fp_unittest(
)
add_fp_unittest(
+ cosf16_test
+ SUITE
+ libc-math-smoke-tests
+ SRCS
+ cosf16_test.cpp
+ DEPENDS
+ libc.src.errno.errno
+ libc.src.math.cosf16
+)
+
+add_fp_unittest(
cospif_test
SUITE
libc-math-smoke-tests
diff --git a/libc/test/src/math/smoke/CanonicalizeTest.h b/libc/test/src/math/smoke/CanonicalizeTest.h
index ef75f568b827..e500bc38f985 100644
--- a/libc/test/src/math/smoke/CanonicalizeTest.h
+++ b/libc/test/src/math/smoke/CanonicalizeTest.h
@@ -19,6 +19,7 @@
#include "hdr/math_macros.h"
#define TEST_SPECIAL(x, y, expected, expected_exception) \
+ LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT); \
EXPECT_EQ(expected, f(&x, &y)); \
EXPECT_FP_EXCEPTION(expected_exception); \
LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT)
diff --git a/libc/test/src/math/smoke/FModTest.h b/libc/test/src/math/smoke/FModTest.h
index ad9688fc01e7..8fbcc2a27654 100644
--- a/libc/test/src/math/smoke/FModTest.h
+++ b/libc/test/src/math/smoke/FModTest.h
@@ -18,6 +18,7 @@
#include "hdr/fenv_macros.h"
#define TEST_SPECIAL(x, y, expected, dom_err, expected_exception) \
+ LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT); \
EXPECT_FP_EQ(expected, f(x, y)); \
EXPECT_MATH_ERRNO((dom_err) ? EDOM : 0); \
EXPECT_FP_EXCEPTION(expected_exception); \
diff --git a/libc/test/src/math/smoke/cosf16_test.cpp b/libc/test/src/math/smoke/cosf16_test.cpp
new file mode 100644
index 000000000000..9a51d1015da3
--- /dev/null
+++ b/libc/test/src/math/smoke/cosf16_test.cpp
@@ -0,0 +1,33 @@
+//===-- Unittests for cosf16 ----------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "src/errno/libc_errno.h"
+#include "src/math/cosf16.h"
+#include "test/UnitTest/FPMatcher.h"
+#include "test/UnitTest/Test.h"
+
+using LlvmLibcCosf16Test = LIBC_NAMESPACE::testing::FPTest<float16>;
+
+TEST_F(LlvmLibcCosf16Test, SpecialNumbers) {
+ LIBC_NAMESPACE::libc_errno = 0;
+
+ EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::cosf16(aNaN));
+ EXPECT_MATH_ERRNO(0);
+
+ EXPECT_FP_EQ(1.0f, LIBC_NAMESPACE::cosf16(zero));
+ EXPECT_MATH_ERRNO(0);
+
+ EXPECT_FP_EQ(1.0f, LIBC_NAMESPACE::cosf16(neg_zero));
+ EXPECT_MATH_ERRNO(0);
+
+ EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::cosf16(inf));
+ EXPECT_MATH_ERRNO(EDOM);
+
+ EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::cosf16(neg_inf));
+ EXPECT_MATH_ERRNO(EDOM);
+}
diff --git a/libc/test/src/math/sqrtf128_test.cpp b/libc/test/src/math/sqrtf128_test.cpp
new file mode 100644
index 000000000000..25229f834d33
--- /dev/null
+++ b/libc/test/src/math/sqrtf128_test.cpp
@@ -0,0 +1,43 @@
+//===-- Unittests for sqrtf128 --------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "SqrtTest.h"
+
+#include "src/math/sqrtf128.h"
+
+#include "src/__support/integer_literals.h"
+
+LIST_SQRT_TESTS(float128, LIBC_NAMESPACE::sqrtf128)
+
+TEST_F(LlvmLibcSqrtTest, SpecialInputs) {
+ constexpr float128 INPUTS[] = {
+ 0x0.000000dee2f5b6a26c8f07f05442p-16382q,
+ 0x0.000000c86d174c5ad8ae54a548e7p-16382q,
+ 0x0.000020ab15cfe0b8e488e128f535p-16382q,
+ 0x0.0000219e97732a9970f2511989bap-16382q,
+ 0x0.000026e477546ae99ef57066f9fdp-16382q,
+ 0x0.00002d0f88d27a496b3e533f5067p-16382q,
+ 0x1.0000000000000000000000000001p+0q,
+ 0x1.0000000000000000000000000003p+0q,
+ 0x1.0000000000000000000000000005p+0q,
+ 0x1.2af17a4ae6f93d11310c49c11b59p+0q,
+ 0x1.c4f5074269525063a26051a0ad27p+0q,
+ 0x1.035cb5f298a801dc4be9b1f8cd97p+1q,
+ 0x1.274be02380427e709beab4dedeb4p+1q,
+ 0x1.64e797cfdbaa3f7e2f33279dbc6p+1q,
+ 0x1.d78d8352b48608b510bfd5c75315p+1q,
+ 0x1.fffffffffffffffffffffffffffbp+1q,
+ 0x1.fffffffffffffffffffffffffffdp+1q,
+ 0x1.ffffffffffffffffffffffffffffp+1q,
+ };
+
+ for (auto input : INPUTS) {
+ ASSERT_MPFR_MATCH_ALL_ROUNDING(mpfr::Operation::Sqrt, input,
+ LIBC_NAMESPACE::sqrtf128(input), 0.5);
+ }
+}
diff --git a/libc/test/src/network/CMakeLists.txt b/libc/test/src/network/CMakeLists.txt
deleted file mode 100644
index 222205dfe247..000000000000
--- a/libc/test/src/network/CMakeLists.txt
+++ /dev/null
@@ -1,53 +0,0 @@
-add_custom_target(libc_network_unittests)
-
-add_libc_unittest(
- htonl
- SUITE
- libc_network_unittests
- SRCS
- htonl_test.cpp
- CXX_STANDARD
- 20
- DEPENDS
- libc.src.network.htonl
- libc.src.network.ntohl
-)
-
-add_libc_unittest(
- htons
- SUITE
- libc_network_unittests
- SRCS
- htons_test.cpp
- CXX_STANDARD
- 20
- DEPENDS
- libc.src.network.htons
- libc.src.network.ntohs
-)
-
-add_libc_unittest(
- ntohl
- SUITE
- libc_network_unittests
- SRCS
- ntohl_test.cpp
- CXX_STANDARD
- 20
- DEPENDS
- libc.src.network.htonl
- libc.src.network.ntohl
-)
-
-add_libc_unittest(
- ntohs
- SUITE
- libc_network_unittests
- SRCS
- ntohs_test.cpp
- CXX_STANDARD
- 20
- DEPENDS
- libc.src.network.htons
- libc.src.network.ntohs
-)
diff --git a/libc/test/src/stdlib/CMakeLists.txt b/libc/test/src/stdlib/CMakeLists.txt
index ff6034e43e9f..4ca2043ab4c9 100644
--- a/libc/test/src/stdlib/CMakeLists.txt
+++ b/libc/test/src/stdlib/CMakeLists.txt
@@ -431,8 +431,8 @@ if(LLVM_LIBC_FULL_BUILD)
libc.src.stdlib.quick_exit
)
- # Only the GPU has an in-tree 'malloc' implementation.
- if(LIBC_TARGET_OS_IS_GPU)
+ # Only baremetal and GPU has an in-tree 'malloc' implementation.
+ if(LIBC_TARGET_OS_IS_BAREMETAL OR LIBC_TARGET_OS_IS_GPU)
add_libc_test(
malloc_test
HERMETIC_TEST_ONLY
diff --git a/libc/test/src/stdlib/StrtolTest.h b/libc/test/src/stdlib/StrtolTest.h
index 6cfaddcbedeb..ed302f14d03e 100644
--- a/libc/test/src/stdlib/StrtolTest.h
+++ b/libc/test/src/stdlib/StrtolTest.h
@@ -200,8 +200,8 @@ struct StrtoTest : public LIBC_NAMESPACE::testing::Test {
char small_string[4] = {'\0', '\0', '\0', '\0'};
for (int base = 2; base <= 36; ++base) {
for (int first_digit = 0; first_digit <= 36; ++first_digit) {
- small_string[0] =
- LIBC_NAMESPACE::internal::int_to_b36_char(first_digit);
+ small_string[0] = static_cast<char>(
+ LIBC_NAMESPACE::internal::int_to_b36_char(first_digit));
if (first_digit < base) {
LIBC_NAMESPACE::libc_errno = 0;
ASSERT_EQ(func(small_string, nullptr, base),
@@ -217,11 +217,11 @@ struct StrtoTest : public LIBC_NAMESPACE::testing::Test {
for (int base = 2; base <= 36; ++base) {
for (int first_digit = 0; first_digit <= 36; ++first_digit) {
- small_string[0] =
- LIBC_NAMESPACE::internal::int_to_b36_char(first_digit);
+ small_string[0] = static_cast<char>(
+ LIBC_NAMESPACE::internal::int_to_b36_char(first_digit));
for (int second_digit = 0; second_digit <= 36; ++second_digit) {
- small_string[1] =
- LIBC_NAMESPACE::internal::int_to_b36_char(second_digit);
+ small_string[1] = static_cast<char>(
+ LIBC_NAMESPACE::internal::int_to_b36_char(second_digit));
if (first_digit < base && second_digit < base) {
LIBC_NAMESPACE::libc_errno = 0;
ASSERT_EQ(
@@ -244,14 +244,14 @@ struct StrtoTest : public LIBC_NAMESPACE::testing::Test {
for (int base = 2; base <= 36; ++base) {
for (int first_digit = 0; first_digit <= 36; ++first_digit) {
- small_string[0] =
- LIBC_NAMESPACE::internal::int_to_b36_char(first_digit);
+ small_string[0] = static_cast<char>(
+ LIBC_NAMESPACE::internal::int_to_b36_char(first_digit));
for (int second_digit = 0; second_digit <= 36; ++second_digit) {
- small_string[1] =
- LIBC_NAMESPACE::internal::int_to_b36_char(second_digit);
+ small_string[1] = static_cast<char>(
+ LIBC_NAMESPACE::internal::int_to_b36_char(second_digit));
for (int third_digit = 0; third_digit <= limit; ++third_digit) {
- small_string[2] =
- LIBC_NAMESPACE::internal::int_to_b36_char(third_digit);
+ small_string[2] = static_cast<char>(
+ LIBC_NAMESPACE::internal::int_to_b36_char(third_digit));
if (first_digit < base && second_digit < base &&
third_digit < base) {
diff --git a/libc/test/src/string/CMakeLists.txt b/libc/test/src/string/CMakeLists.txt
index b6b59a689cc8..a675373938e9 100644
--- a/libc/test/src/string/CMakeLists.txt
+++ b/libc/test/src/string/CMakeLists.txt
@@ -2,18 +2,6 @@ add_custom_target(libc-string-tests)
add_subdirectory(memory_utils)
-add_libc_test(
- bcopy_test
- SUITE
- libc-string-tests
- SRCS
- bcopy_test.cpp
- DEPENDS
- libc.src.string.bcopy
- LINK_LIBRARIES
- LibcMemoryHelpers
-)
-
add_header_library(
strchr_test_support
HDRS
@@ -21,17 +9,6 @@ add_header_library(
)
add_libc_test(
- index_test
- SUITE
- libc-string-tests
- SRCS
- index_test.cpp
- DEPENDS
- libc.src.string.index
- .strchr_test_support
-)
-
-add_libc_test(
memccpy_test
SUITE
libc-string-tests
@@ -82,17 +59,6 @@ add_libc_test(
)
add_libc_test(
- rindex_test
- SUITE
- libc-string-tests
- SRCS
- rindex_test.cpp
- DEPENDS
- libc.src.string.rindex
- .strchr_test_support
-)
-
-add_libc_test(
stpcpy_test
SUITE
libc-string-tests
@@ -154,16 +120,6 @@ add_libc_test(
)
add_libc_test(
- strcasecmp_test
- SUITE
- libc-string-tests
- SRCS
- strcasecmp_test.cpp
- DEPENDS
- libc.src.string.strcasecmp
-)
-
-add_libc_test(
strcasestr_test
SUITE
libc-string-tests
@@ -288,16 +244,6 @@ add_libc_test(
)
add_libc_test(
- strncasecmp_test
- SUITE
- libc-string-tests
- SRCS
- strncasecmp_test.cpp
- DEPENDS
- libc.src.string.strncasecmp
-)
-
-add_libc_test(
strncpy_test
SUITE
libc-string-tests
@@ -428,39 +374,7 @@ add_libc_test(
libc.src.string.memset_explicit
)
-# Tests all implementations that can run on the target CPU.
-function(add_libc_multi_impl_test name)
- get_property(fq_implementations GLOBAL PROPERTY ${name}_implementations)
- foreach(fq_config_name IN LISTS fq_implementations)
- get_target_property(required_cpu_features ${fq_config_name} REQUIRE_CPU_FEATURES)
- cpu_supports(can_run "${required_cpu_features}")
- if(can_run)
- string(FIND ${fq_config_name} "." last_dot_loc REVERSE)
- math(EXPR name_loc "${last_dot_loc} + 1")
- string(SUBSTRING ${fq_config_name} ${name_loc} -1 target_name)
- add_libc_test(
- ${target_name}_test
- SUITE
- libc-string-tests
- COMPILE_OPTIONS
- ${LIBC_COMPILE_OPTIONS_NATIVE}
- LINK_LIBRARIES
- LibcMemoryHelpers
- ${ARGN}
- DEPENDS
- ${fq_config_name}
- libc.src.__support.macros.sanitizer
- )
- get_fq_target_name(${fq_config_name}_test fq_target_name)
- else()
- message(STATUS "Skipping test for '${fq_config_name}' insufficient host cpu features '${required_cpu_features}'")
- endif()
- endforeach()
-endfunction()
-
-add_libc_multi_impl_test(bcmp SRCS bcmp_test.cpp)
-add_libc_multi_impl_test(bzero SRCS bzero_test.cpp)
-add_libc_multi_impl_test(memcmp SRCS memcmp_test.cpp)
-add_libc_multi_impl_test(memcpy SRCS memcpy_test.cpp)
-add_libc_multi_impl_test(memmove SRCS memmove_test.cpp)
-add_libc_multi_impl_test(memset SRCS memset_test.cpp)
+add_libc_multi_impl_test(memcmp libc-string-tests SRCS memcmp_test.cpp)
+add_libc_multi_impl_test(memcpy libc-string-tests SRCS memcpy_test.cpp)
+add_libc_multi_impl_test(memmove libc-string-tests SRCS memmove_test.cpp)
+add_libc_multi_impl_test(memset libc-string-tests SRCS memset_test.cpp)
diff --git a/libc/test/src/strings/CMakeLists.txt b/libc/test/src/strings/CMakeLists.txt
new file mode 100644
index 000000000000..10f96b8531f6
--- /dev/null
+++ b/libc/test/src/strings/CMakeLists.txt
@@ -0,0 +1,58 @@
+add_custom_target(libc-strings-tests)
+
+add_libc_test(
+ bcopy_test
+ SUITE
+ libc-strings-tests
+ SRCS
+ bcopy_test.cpp
+ DEPENDS
+ libc.src.strings.bcopy
+ LINK_LIBRARIES
+ LibcMemoryHelpers
+)
+
+add_libc_test(
+ index_test
+ SUITE
+ libc-strings-tests
+ SRCS
+ index_test.cpp
+ DEPENDS
+ libc.src.strings.index
+ libc.test.src.string.strchr_test_support
+)
+
+add_libc_test(
+ rindex_test
+ SUITE
+ libc-strings-tests
+ SRCS
+ rindex_test.cpp
+ DEPENDS
+ libc.src.strings.rindex
+ libc.test.src.string.strchr_test_support
+)
+
+add_libc_test(
+ strcasecmp_test
+ SUITE
+ libc-strings-tests
+ SRCS
+ strcasecmp_test.cpp
+ DEPENDS
+ libc.src.strings.strcasecmp
+)
+
+add_libc_test(
+ strncasecmp_test
+ SUITE
+ libc-strings-tests
+ SRCS
+ strncasecmp_test.cpp
+ DEPENDS
+ libc.src.strings.strncasecmp
+)
+
+add_libc_multi_impl_test(bcmp libc-strings-tests SRCS bcmp_test.cpp)
+add_libc_multi_impl_test(bzero libc-strings-tests SRCS bzero_test.cpp)
diff --git a/libc/test/src/string/bcmp_test.cpp b/libc/test/src/strings/bcmp_test.cpp
index c639040685e1..794f9a1b8bd9 100644
--- a/libc/test/src/string/bcmp_test.cpp
+++ b/libc/test/src/strings/bcmp_test.cpp
@@ -6,11 +6,11 @@
//
//===----------------------------------------------------------------------===//
-#include "memory_utils/memory_check_utils.h"
#include "src/__support/macros/config.h"
-#include "src/string/bcmp.h"
+#include "src/strings/bcmp.h"
#include "test/UnitTest/Test.h"
#include "test/UnitTest/TestLogger.h"
+#include "test/src/string/memory_utils/memory_check_utils.h"
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/test/src/string/bcopy_test.cpp b/libc/test/src/strings/bcopy_test.cpp
index 04772bb5d8ad..f6bb859b4ae9 100644
--- a/libc/test/src/string/bcopy_test.cpp
+++ b/libc/test/src/strings/bcopy_test.cpp
@@ -6,13 +6,13 @@
//
//===----------------------------------------------------------------------===//
-#include "src/__support/macros/config.h"
-#include "src/string/bcopy.h"
+#include "src/strings/bcopy.h"
-#include "memory_utils/memory_check_utils.h"
#include "src/__support/CPP/span.h"
+#include "src/__support/macros/config.h"
#include "test/UnitTest/MemoryMatcher.h"
#include "test/UnitTest/Test.h"
+#include "test/src/string/memory_utils/memory_check_utils.h"
using LIBC_NAMESPACE::cpp::array;
using LIBC_NAMESPACE::cpp::span;
diff --git a/libc/test/src/string/bzero_test.cpp b/libc/test/src/strings/bzero_test.cpp
index a24043613bed..4d4112f4be8e 100644
--- a/libc/test/src/string/bzero_test.cpp
+++ b/libc/test/src/strings/bzero_test.cpp
@@ -6,10 +6,10 @@
//
//===----------------------------------------------------------------------===//
-#include "memory_utils/memory_check_utils.h"
#include "src/__support/macros/config.h"
-#include "src/string/bzero.h"
+#include "src/strings/bzero.h"
#include "test/UnitTest/Test.h"
+#include "test/src/string/memory_utils/memory_check_utils.h"
namespace LIBC_NAMESPACE_DECL {
diff --git a/libc/test/src/string/index_test.cpp b/libc/test/src/strings/index_test.cpp
index 88953205009d..fc4cd2b31c55 100644
--- a/libc/test/src/string/index_test.cpp
+++ b/libc/test/src/strings/index_test.cpp
@@ -6,9 +6,9 @@
//
//===----------------------------------------------------------------------===//
-#include "StrchrTest.h"
+#include "test/src/string/StrchrTest.h"
-#include "src/string/index.h"
+#include "src/strings/index.h"
#include "test/UnitTest/Test.h"
STRCHR_TEST(Index, LIBC_NAMESPACE::index)
diff --git a/libc/test/src/string/rindex_test.cpp b/libc/test/src/strings/rindex_test.cpp
index 10513919cffa..d3b756fe5f6e 100644
--- a/libc/test/src/string/rindex_test.cpp
+++ b/libc/test/src/strings/rindex_test.cpp
@@ -6,9 +6,9 @@
//
//===----------------------------------------------------------------------===//
-#include "StrchrTest.h"
+#include "test/src/string/StrchrTest.h"
-#include "src/string/rindex.h"
+#include "src/strings/rindex.h"
#include "test/UnitTest/Test.h"
STRRCHR_TEST(Rindex, LIBC_NAMESPACE::rindex)
diff --git a/libc/test/src/string/strcasecmp_test.cpp b/libc/test/src/strings/strcasecmp_test.cpp
index df7888168c69..cd29c213a732 100644
--- a/libc/test/src/string/strcasecmp_test.cpp
+++ b/libc/test/src/strings/strcasecmp_test.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-#include "src/string/strcasecmp.h"
+#include "src/strings/strcasecmp.h"
#include "test/UnitTest/Test.h"
TEST(LlvmLibcStrCaseCmpTest, EmptyStringsShouldReturnZero) {
diff --git a/libc/test/src/string/strncasecmp_test.cpp b/libc/test/src/strings/strncasecmp_test.cpp
index b4173c455de9..870574ed9507 100644
--- a/libc/test/src/string/strncasecmp_test.cpp
+++ b/libc/test/src/strings/strncasecmp_test.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-#include "src/string/strncasecmp.h"
+#include "src/strings/strncasecmp.h"
#include "test/UnitTest/Test.h"
TEST(LlvmLibcStrNCaseCmpTest,
diff --git a/libc/test/src/sys/mman/linux/CMakeLists.txt b/libc/test/src/sys/mman/linux/CMakeLists.txt
index 6362b46a6fe0..44ed11aadfe8 100644
--- a/libc/test/src/sys/mman/linux/CMakeLists.txt
+++ b/libc/test/src/sys/mman/linux/CMakeLists.txt
@@ -181,24 +181,3 @@ add_libc_unittest(
libc.hdr.fcntl_macros
libc.test.UnitTest.ErrnoSetterMatcher
)
-
-add_libc_unittest(
- process_mrelease_test
- SUITE
- libc_sys_mman_unittests
- SRCS
- process_mrelease_test.cpp
- DEPENDS
- libc.include.sys_mman
- libc.include.sys_syscall
- libc.src.errno.errno
- libc.src.sys.mman.process_mrelease
- libc.src.unistd.close
- libc.src.signal.kill
- libc.include.signal
- libc.src.stdlib.exit
- libc.src.signal.raise
- libc.src.__support.OSUtil.osutil
- libc.src.__support.threads.sleep
- libc.test.UnitTest.ErrnoSetterMatcher
-)
diff --git a/libc/test/src/sys/mman/linux/process_mrelease_test.cpp b/libc/test/src/sys/mman/linux/process_mrelease_test.cpp
deleted file mode 100644
index 865056c05f8d..000000000000
--- a/libc/test/src/sys/mman/linux/process_mrelease_test.cpp
+++ /dev/null
@@ -1,72 +0,0 @@
-//===-- Unittests for process_mrelease ------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "src/__support/OSUtil/syscall.h" // For internal syscall function.
-#include "src/errno/libc_errno.h"
-#include "src/signal/kill.h"
-#include "src/signal/raise.h"
-#include "src/stdlib/exit.h"
-#include "src/sys/mman/process_mrelease.h"
-#include "src/unistd/close.h"
-#include "src/unistd/fork.h"
-#include "test/UnitTest/ErrnoSetterMatcher.h"
-#include "test/UnitTest/LibcTest.h"
-
-#include <sys/syscall.h>
-#if defined(SYS_process_mrelease) && defined(SYS_pidfd_open)
-using namespace LIBC_NAMESPACE::testing::ErrnoSetterMatcher;
-
-int pidfd_open(pid_t pid, unsigned int flags) {
- return LIBC_NAMESPACE::syscall_impl(SYS_pidfd_open, pid, flags);
-}
-
-TEST(LlvmLibcProcessMReleaseTest, NoError) {
- pid_t child_pid = fork();
- EXPECT_GE(child_pid, 0);
-
- if (child_pid == 0) {
- // pause the child process
- LIBC_NAMESPACE::raise(SIGSTOP);
- } else {
- // Parent process: wait a bit and then kill the child.
- // Give child process some time to start.
- int pidfd = pidfd_open(child_pid, 0);
- EXPECT_GE(pidfd, 0);
-
- // Send SIGKILL to child process
- LIBC_NAMESPACE::kill(child_pid, SIGKILL);
-
- EXPECT_THAT(LIBC_NAMESPACE::process_mrelease(pidfd, 0), Succeeds());
-
- LIBC_NAMESPACE::close(pidfd);
- }
-}
-
-TEST(LlvmLibcProcessMReleaseTest, ErrorNotKilled) {
- pid_t child_pid = fork();
- EXPECT_GE(child_pid, 0);
-
- if (child_pid == 0) {
- // pause the child process
- LIBC_NAMESPACE::raise(SIGSTOP);
- } else {
- int pidfd = pidfd_open(child_pid, 0);
- EXPECT_GE(pidfd, 0);
-
- EXPECT_THAT(LIBC_NAMESPACE::process_mrelease(pidfd, 0), Fails(EINVAL));
-
- LIBC_NAMESPACE::kill(child_pid, SIGKILL);
-
- LIBC_NAMESPACE::close(pidfd);
- }
-}
-
-TEST(LlvmLibcProcessMReleaseTest, ErrorNonExistingPidfd) {
- EXPECT_THAT(LIBC_NAMESPACE::process_mrelease(-1, 0), Fails(EBADF));
-}
-#endif
diff --git a/libc/test/src/sys/mman/linux/remap_file_pages_test.cpp b/libc/test/src/sys/mman/linux/remap_file_pages_test.cpp
index 267f7598ff70..ebc5c89a1ff5 100644
--- a/libc/test/src/sys/mman/linux/remap_file_pages_test.cpp
+++ b/libc/test/src/sys/mman/linux/remap_file_pages_test.cpp
@@ -23,7 +23,7 @@ using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Fails;
using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Succeeds;
TEST(LlvmLibcRemapFilePagesTest, NoError) {
- size_t page_size = sysconf(_SC_PAGE_SIZE);
+ size_t page_size = LIBC_NAMESPACE::sysconf(_SC_PAGE_SIZE);
ASSERT_GT(page_size, size_t(0));
// Create a file-backed mapping
@@ -53,7 +53,7 @@ TEST(LlvmLibcRemapFilePagesTest, NoError) {
}
TEST(LlvmLibcRemapFilePagesTest, ErrorInvalidFlags) {
- size_t page_size = sysconf(_SC_PAGE_SIZE);
+ size_t page_size = LIBC_NAMESPACE::sysconf(_SC_PAGE_SIZE);
ASSERT_GT(page_size, size_t(0));
// Create a file-backed mapping
@@ -81,7 +81,7 @@ TEST(LlvmLibcRemapFilePagesTest, ErrorInvalidFlags) {
}
TEST(LlvmLibcRemapFilePagesTest, ErrorInvalidAddress) {
- size_t page_size = sysconf(_SC_PAGESIZE);
+ size_t page_size = LIBC_NAMESPACE::sysconf(_SC_PAGESIZE);
ASSERT_GT(page_size, size_t(0));
// Use an address that we haven't mapped
diff --git a/libc/test/src/time/CMakeLists.txt b/libc/test/src/time/CMakeLists.txt
index 7151526b72b2..da3903f3e0e4 100644
--- a/libc/test/src/time/CMakeLists.txt
+++ b/libc/test/src/time/CMakeLists.txt
@@ -71,11 +71,21 @@ add_libc_test(
SUITE
libc_time_unittests
SRCS
- clock_gettime_test.cpp
+ clock_gettime_test.cpp
DEPENDS
libc.src.time.clock_gettime
)
+add_libc_test(
+ clock_getres_test
+ SUITE
+ libc_time_unittests
+ SRCS
+ clock_getres_test.cpp
+ DEPENDS
+ libc.src.time.clock_getres
+)
+
add_libc_unittest(
difftime_test
SUITE
@@ -157,8 +167,8 @@ add_libc_unittest(
SRCS
time_test.cpp
DEPENDS
- libc.include.time
libc.src.time.time
+ libc.src.__support.time.clock_gettime
libc.src.errno.errno
)
diff --git a/libc/test/src/time/clock_getres_test.cpp b/libc/test/src/time/clock_getres_test.cpp
new file mode 100644
index 000000000000..d8b3f01b37a3
--- /dev/null
+++ b/libc/test/src/time/clock_getres_test.cpp
@@ -0,0 +1,55 @@
+//===-- Unittests for clock_getres- ---------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "hdr/time_macros.h"
+#include "src/time/clock_getres.h"
+#include "test/UnitTest/ErrnoSetterMatcher.h"
+#include "test/UnitTest/Test.h"
+
+using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Fails;
+using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Succeeds;
+
+TEST(LlvmLibcClockGetRes, Invalid) {
+ timespec tp;
+ EXPECT_THAT(LIBC_NAMESPACE::clock_getres(-1, &tp), Fails(EINVAL));
+}
+
+TEST(LlvmLibcClockGetRes, NullSpec) {
+ EXPECT_THAT(LIBC_NAMESPACE::clock_getres(CLOCK_REALTIME, nullptr),
+ Succeeds());
+}
+
+TEST(LlvmLibcClockGetRes, Realtime) {
+ timespec tp;
+ EXPECT_THAT(LIBC_NAMESPACE::clock_getres(CLOCK_REALTIME, &tp), Succeeds());
+ EXPECT_GE(tp.tv_sec, static_cast<decltype(tp.tv_sec)>(0));
+ EXPECT_GE(tp.tv_nsec, static_cast<decltype(tp.tv_nsec)>(0));
+}
+
+TEST(LlvmLibcClockGetRes, Monotonic) {
+ timespec tp;
+ ASSERT_THAT(LIBC_NAMESPACE::clock_getres(CLOCK_MONOTONIC, &tp), Succeeds());
+ EXPECT_GE(tp.tv_sec, static_cast<decltype(tp.tv_sec)>(0));
+ EXPECT_GE(tp.tv_nsec, static_cast<decltype(tp.tv_nsec)>(0));
+}
+
+TEST(LlvmLibcClockGetRes, ProcessCpuTime) {
+ timespec tp;
+ ASSERT_THAT(LIBC_NAMESPACE::clock_getres(CLOCK_PROCESS_CPUTIME_ID, &tp),
+ Succeeds());
+ EXPECT_GE(tp.tv_sec, static_cast<decltype(tp.tv_sec)>(0));
+ EXPECT_GE(tp.tv_nsec, static_cast<decltype(tp.tv_nsec)>(0));
+}
+
+TEST(LlvmLibcClockGetRes, ThreadCpuTime) {
+ timespec tp;
+ ASSERT_THAT(LIBC_NAMESPACE::clock_getres(CLOCK_THREAD_CPUTIME_ID, &tp),
+ Succeeds());
+ EXPECT_GE(tp.tv_sec, static_cast<decltype(tp.tv_sec)>(0));
+ EXPECT_GE(tp.tv_nsec, static_cast<decltype(tp.tv_nsec)>(0));
+}
diff --git a/libc/test/src/time/time_test.cpp b/libc/test/src/time/time_test.cpp
index d3d4dc9a2851..7cdb4e834633 100644
--- a/libc/test/src/time/time_test.cpp
+++ b/libc/test/src/time/time_test.cpp
@@ -9,8 +9,6 @@
#include "src/time/time_func.h"
#include "test/UnitTest/Test.h"
-#include <time.h>
-
TEST(LlvmLibcTimeTest, SmokeTest) {
time_t t1;
time_t t2 = LIBC_NAMESPACE::time(&t1);
diff --git a/libc/utils/CMakeLists.txt b/libc/utils/CMakeLists.txt
index 11f25503cc13..a33c13a045a8 100644
--- a/libc/utils/CMakeLists.txt
+++ b/libc/utils/CMakeLists.txt
@@ -1,3 +1,5 @@
+add_subdirectory(hdrgen)
+
if(LLVM_INCLUDE_TESTS)
add_subdirectory(MPFRWrapper)
endif()
diff --git a/libc/utils/MPFRWrapper/MPFRUtils.cpp b/libc/utils/MPFRWrapper/MPFRUtils.cpp
index 00592c5cb15f..0dac497bb779 100644
--- a/libc/utils/MPFRWrapper/MPFRUtils.cpp
+++ b/libc/utils/MPFRWrapper/MPFRUtils.cpp
@@ -22,6 +22,13 @@
#include "mpfr_inc.h"
+#ifdef LIBC_TYPES_FLOAT128_IS_NOT_LONG_DOUBLE
+extern "C" {
+int mpfr_set_float128(mpfr_ptr, float128, mpfr_rnd_t);
+float128 mpfr_get_float128(mpfr_srcptr, mpfr_rnd_t);
+}
+#endif
+
template <typename T> using FPBits = LIBC_NAMESPACE::fputil::FPBits<T>;
namespace LIBC_NAMESPACE_DECL {
@@ -47,8 +54,18 @@ template <> struct ExtraPrecision<double> {
};
template <> struct ExtraPrecision<long double> {
+#ifdef LIBC_TYPES_LONG_DOUBLE_IS_FLOAT128
+ static constexpr unsigned int VALUE = 512;
+#else
static constexpr unsigned int VALUE = 256;
+#endif
+};
+
+#if defined(LIBC_TYPES_FLOAT128_IS_NOT_LONG_DOUBLE)
+template <> struct ExtraPrecision<float128> {
+ static constexpr unsigned int VALUE = 512;
};
+#endif // LIBC_TYPES_FLOAT128_IS_NOT_LONG_DOUBLE
// If the ulp tolerance is less than or equal to 0.5, we would check that the
// result is rounded correctly with respect to the rounding mode by using the
@@ -134,6 +151,19 @@ public:
mpfr_set_ld(value, x, mpfr_rounding);
}
+#ifdef LIBC_TYPES_FLOAT128_IS_NOT_LONG_DOUBLE
+ template <typename XType,
+ cpp::enable_if_t<cpp::is_same_v<float128, XType>, int> = 0>
+ explicit MPFRNumber(XType x,
+ unsigned int precision = ExtraPrecision<XType>::VALUE,
+ RoundingMode rounding = RoundingMode::Nearest)
+ : mpfr_precision(precision),
+ mpfr_rounding(get_mpfr_rounding_mode(rounding)) {
+ mpfr_init2(value, mpfr_precision);
+ mpfr_set_float128(value, x, mpfr_rounding);
+ }
+#endif // LIBC_TYPES_FLOAT128_IS_NOT_LONG_DOUBLE
+
template <typename XType,
cpp::enable_if_t<cpp::is_integral_v<XType>, int> = 0>
explicit MPFRNumber(XType x,
@@ -647,7 +677,7 @@ public:
// These functions are useful for debugging.
template <typename T> T as() const;
- void dump(const char *msg) const { mpfr_printf("%s%.128Rf\n", msg, value); }
+ void dump(const char *msg) const { mpfr_printf("%s%.128g\n", msg, value); }
// Return the ULP (units-in-the-last-place) difference between the
// stored MPFR and a floating point number.
@@ -770,6 +800,13 @@ template <> float16 MPFRNumber::as<float16>() const {
}
#endif
+#ifdef LIBC_TYPES_FLOAT128_IS_NOT_LONG_DOUBLE
+template <> float128 MPFRNumber::as<float128>() const {
+ return mpfr_get_float128(value, mpfr_rounding);
+}
+
+#endif // LIBC_TYPES_FLOAT128_IS_NOT_LONG_DOUBLE
+
namespace internal {
template <typename InputType>
@@ -997,7 +1034,27 @@ template void explain_unary_operation_single_output_error(Operation op, double,
template void explain_unary_operation_single_output_error(Operation op,
long double, float16,
double, RoundingMode);
-#endif
+#ifdef LIBC_TYPES_FLOAT128_IS_NOT_LONG_DOUBLE
+template void explain_unary_operation_single_output_error(Operation op,
+ float128, float16,
+ double, RoundingMode);
+#endif // LIBC_TYPES_FLOAT128_IS_NOT_LONG_DOUBLE
+#endif // LIBC_TYPES_HAS_FLOAT16
+
+#ifdef LIBC_TYPES_FLOAT128_IS_NOT_LONG_DOUBLE
+template void explain_unary_operation_single_output_error(Operation op,
+ float128, float128,
+ double, RoundingMode);
+template void explain_unary_operation_single_output_error(Operation op,
+ float128, float,
+ double, RoundingMode);
+template void explain_unary_operation_single_output_error(Operation op,
+ float128, double,
+ double, RoundingMode);
+template void explain_unary_operation_single_output_error(Operation op,
+ float128, long double,
+ double, RoundingMode);
+#endif // LIBC_TYPES_FLOAT128_IS_NOT_LONG_DOUBLE
template <typename T>
void explain_unary_operation_two_outputs_error(
@@ -1228,7 +1285,25 @@ template bool compare_unary_operation_single_output(Operation, double, float16,
template bool compare_unary_operation_single_output(Operation, long double,
float16, double,
RoundingMode);
-#endif
+#ifdef LIBC_TYPES_FLOAT128_IS_NOT_LONG_DOUBLE
+template bool compare_unary_operation_single_output(Operation, float128,
+ float16, double,
+ RoundingMode);
+#endif // LIBC_TYPES_FLOAT128_IS_NOT_LONG_DOUBLE
+#endif // LIBC_TYPES_HAS_FLOAT16
+
+#ifdef LIBC_TYPES_FLOAT128_IS_NOT_LONG_DOUBLE
+template bool compare_unary_operation_single_output(Operation, float128,
+ float128, double,
+ RoundingMode);
+template bool compare_unary_operation_single_output(Operation, float128, float,
+ double, RoundingMode);
+template bool compare_unary_operation_single_output(Operation, float128, double,
+ double, RoundingMode);
+template bool compare_unary_operation_single_output(Operation, float128,
+ long double, double,
+ RoundingMode);
+#endif // LIBC_TYPES_FLOAT128_IS_NOT_LONG_DOUBLE
template <typename T>
bool compare_unary_operation_two_outputs(Operation op, T input,
@@ -1398,9 +1473,14 @@ template <typename T> bool round_to_long(T x, long &result) {
template bool round_to_long<float>(float, long &);
template bool round_to_long<double>(double, long &);
template bool round_to_long<long double>(long double, long &);
+
#ifdef LIBC_TYPES_HAS_FLOAT16
template bool round_to_long<float16>(float16, long &);
-#endif
+#endif // LIBC_TYPES_HAS_FLOAT16
+
+#ifdef LIBC_TYPES_FLOAT128_IS_NOT_LONG_DOUBLE
+template bool round_to_long<float128>(float128, long &);
+#endif // LIBC_TYPES_FLOAT128_IS_NOT_LONG_DOUBLE
template <typename T> bool round_to_long(T x, RoundingMode mode, long &result) {
MPFRNumber mpfr(x);
@@ -1410,9 +1490,14 @@ template <typename T> bool round_to_long(T x, RoundingMode mode, long &result) {
template bool round_to_long<float>(float, RoundingMode, long &);
template bool round_to_long<double>(double, RoundingMode, long &);
template bool round_to_long<long double>(long double, RoundingMode, long &);
+
#ifdef LIBC_TYPES_HAS_FLOAT16
template bool round_to_long<float16>(float16, RoundingMode, long &);
-#endif
+#endif // LIBC_TYPES_HAS_FLOAT16
+
+#ifdef LIBC_TYPES_FLOAT128_IS_NOT_LONG_DOUBLE
+template bool round_to_long<float128>(float128, RoundingMode, long &);
+#endif // LIBC_TYPES_FLOAT128_IS_NOT_LONG_DOUBLE
template <typename T> T round(T x, RoundingMode mode) {
MPFRNumber mpfr(x);
@@ -1423,9 +1508,14 @@ template <typename T> T round(T x, RoundingMode mode) {
template float round<float>(float, RoundingMode);
template double round<double>(double, RoundingMode);
template long double round<long double>(long double, RoundingMode);
+
#ifdef LIBC_TYPES_HAS_FLOAT16
template float16 round<float16>(float16, RoundingMode);
-#endif
+#endif // LIBC_TYPES_HAS_FLOAT16
+
+#ifdef LIBC_TYPES_FLOAT128_IS_NOT_LONG_DOUBLE
+template float128 round<float128>(float128, RoundingMode);
+#endif // LIBC_TYPES_FLOAT128_IS_NOT_LONG_DOUBLE
} // namespace mpfr
} // namespace testing
diff --git a/libc/utils/docgen/arpa/inet.yaml b/libc/utils/docgen/arpa/inet.yaml
new file mode 100644
index 000000000000..7f388cbbd020
--- /dev/null
+++ b/libc/utils/docgen/arpa/inet.yaml
@@ -0,0 +1,18 @@
+functions:
+ htonl:
+ posix-definition: ''
+ htons:
+ posix-definition: ''
+ inet_addr:
+ posix-definition: ''
+ inet_ntoa:
+ posix-definition: ''
+ inet_ntop:
+ posix-definition: ''
+ inet_pton:
+ posix-definition: ''
+ ntohl:
+ posix-definition: ''
+ ntohs:
+ posix-definition: ''
+
diff --git a/libc/utils/docgen/assert.yaml b/libc/utils/docgen/assert.yaml
new file mode 100644
index 000000000000..0afd4e2d3c06
--- /dev/null
+++ b/libc/utils/docgen/assert.yaml
@@ -0,0 +1,7 @@
+macros:
+ __STDC_VERSION_ASSERT_H__:
+ c-definition: 7.2.1
+ assert:
+ c-definition: 7.2.1
+ in-latest-posix: ''
+
diff --git a/libc/utils/docgen/ctype.json b/libc/utils/docgen/ctype.json
deleted file mode 100644
index af97e4bbbc0a..000000000000
--- a/libc/utils/docgen/ctype.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
- "functions": {
- "isalnum": {
- "c-definition": "7.4.1.1"
- },
- "isalpha": {
- "c-definition": "7.4.1.2"
- },
- "isblank": {
- "c-definition": "7.4.1.3"
- },
- "iscntrl": {
- "c-definition": "7.4.1.4"
- },
- "isdigit": {
- "c-definition": "7.4.1.5"
- },
- "isgraph": {
- "c-definition": "7.4.1.6"
- },
- "islower": {
- "c-definition": "7.4.1.7"
- },
- "isprint": {
- "c-definition": "7.4.1.8"
- },
- "ispunct": {
- "c-definition": "7.4.1.9"
- },
- "isspace": {
- "c-definition": "7.4.1.10"
- },
- "isupper": {
- "c-definition": "7.4.1.11"
- },
- "isxdigit": {
- "c-definition": "7.4.1.12"
- },
- "tolower" : {
- "c-definition": "7.4.2.1"
- },
- "toupper": {
- "c-definition": "7.4.2.2"
- }
- }
-}
-
diff --git a/libc/utils/docgen/ctype.yaml b/libc/utils/docgen/ctype.yaml
new file mode 100644
index 000000000000..027d8f38c71f
--- /dev/null
+++ b/libc/utils/docgen/ctype.yaml
@@ -0,0 +1,72 @@
+functions:
+ isalnum:
+ c-definition: 7.4.1.1
+ in-latest-posix: ''
+ isalnum_l:
+ in-latest-posix: ''
+ isalpha:
+ c-definition: 7.4.1.2
+ in-latest-posix: ''
+ isalpha_l:
+ in-latest-posix: ''
+ isblank:
+ c-definition: 7.4.1.3
+ in-latest-posix: ''
+ isblank_l:
+ in-latest-posix: ''
+ iscntrl:
+ c-definition: 7.4.1.4
+ in-latest-posix: ''
+ iscntrl_l:
+ in-latest-posix: ''
+ isdigit:
+ c-definition: 7.4.1.5
+ in-latest-posix: ''
+ isdigit_l:
+ in-latest-posix: ''
+ isgraph:
+ c-definition: 7.4.1.6
+ in-latest-posix: ''
+ isgraph_l:
+ in-latest-posix: ''
+ islower:
+ c-definition: 7.4.1.7
+ in-latest-posix: ''
+ islower_l:
+ in-latest-posix: ''
+ isprint:
+ c-definition: 7.4.1.8
+ in-latest-posix: ''
+ isprint_l:
+ in-latest-posix: ''
+ ispunct:
+ c-definition: 7.4.1.9
+ in-latest-posix: ''
+ ispunct_l:
+ in-latest-posix: ''
+ isspace:
+ c-definition: 7.4.1.10
+ in-latest-posix: ''
+ isspace_l:
+ in-latest-posix: ''
+ isupper:
+ c-definition: 7.4.1.11
+ in-latest-posix: ''
+ isupper_l:
+ in-latest-posix: ''
+ isxdigit:
+ c-definition: 7.4.1.12
+ in-latest-posix: ''
+ isxdigit_l:
+ in-latest-posix: ''
+ tolower:
+ c-definition: 7.4.2.1
+ in-latest-posix: ''
+ tolower_l:
+ in-latest-posix: ''
+ toupper:
+ c-definition: 7.4.2.2
+ in-latest-posix: ''
+ toupper_l:
+ in-latest-posix: ''
+
diff --git a/libc/utils/docgen/docgen.py b/libc/utils/docgen/docgen.py
index af5d00a5cbf8..09db284ef928 100755
--- a/libc/utils/docgen/docgen.py
+++ b/libc/utils/docgen/docgen.py
@@ -10,8 +10,9 @@
from argparse import ArgumentParser, Namespace
from pathlib import Path
from typing import Dict
+import os
import sys
-import json
+import yaml
from header import Header
@@ -22,14 +23,14 @@ class DocgenAPIFormatError(Exception):
def check_api(header: Header, api: Dict):
"""
- Checks that docgen json files are properly formatted. If there are any
+ Checks that docgen yaml files are properly formatted. If there are any
fatal formatting errors, raises exceptions with error messages useful for
fixing formatting. Warnings are printed to stderr on non-fatal formatting
errors. The code that runs after ``check_api(api)`` is called expects that
- ``check_api`` executed without raising formatting exceptions so the json
+ ``check_api`` executed without raising formatting exceptions so the yaml
matches the formatting specified here.
- The json file may contain:
+ The yaml file may contain:
* an optional macros object
* an optional functions object
@@ -48,11 +49,15 @@ def check_api(header: Header, api: Dict):
this should be a C standard section number. For the ``"posix-definition"`` property,
this should be a link to the definition.
- :param api: docgen json file contents parsed into a dict
+ :param api: docgen yaml file contents parsed into a dict
"""
errors = []
- cdef = "c-definition"
- pdef = "posix-definition"
+ # We require entries to have at least one of these.
+ possible_keys = [
+ "c-definition",
+ "in-latest-posix",
+ "removed-in-posix-2008",
+ ]
# Validate macros
if "macros" in api:
@@ -65,8 +70,8 @@ def check_api(header: Header, api: Dict):
macros = api["macros"]
for name, obj in macros.items():
- if not (cdef in obj or pdef in obj):
- err = f'error: Macro {name} does not contain at least one required property: "{cdef}" or "{pdef}"'
+ if not any(k in obj for k in possible_keys):
+ err = f"error: Macro {name} does not contain at least one required property: {possible_keys}"
errors.append(err)
# Validate functions
@@ -79,8 +84,8 @@ def check_api(header: Header, api: Dict):
fns = api["functions"]
for name, obj in fns.items():
- if not (cdef in obj or pdef in obj):
- err = f'error: function {name} does not contain at least one required property: "{cdef}" or "{pdef}"'
+ if not any(k in obj for k in possible_keys):
+ err = f"error: function {name} does not contain at least one required property: {possible_keys}"
errors.append(err)
if errors:
@@ -88,8 +93,8 @@ def check_api(header: Header, api: Dict):
def load_api(header: Header) -> Dict:
- api = header.docgen_json.read_text(encoding="utf-8")
- return json.loads(api)
+ api = header.docgen_yaml.read_text(encoding="utf-8")
+ return yaml.safe_load(api)
def print_tbl_dir(name):
@@ -103,7 +108,7 @@ def print_tbl_dir(name):
* - {name}
- Implemented
- C23 Standard Section
- - POSIX.1-2017 Standard Section"""
+ - POSIX Docs"""
)
@@ -127,8 +132,14 @@ def print_functions_rst(header: Header, functions: Dict):
else:
print(" -")
- if "posix-definition" in functions[name]:
- print(f' - {functions[name]["posix-definition"]}')
+ if "in-latest-posix" in functions[name]:
+ print(
+ f" - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/functions/{name}.html>`__"
+ )
+ elif "removed-in-posix-2008" in functions[name]:
+ print(
+ f" - `removed in POSIX.1-2008 <https://pubs.opengroup.org/onlinepubs/007904875/functions/{name}.html>`__"
+ )
else:
print(" -")
@@ -153,15 +164,20 @@ def print_macros_rst(header: Header, macros: Dict):
else:
print(" -")
- if "posix-definition" in macros[name]:
- print(f' - {macros[name]["posix-definition"]}')
+ if "in-latest-posix" in macros[name]:
+ print(
+ f" - `POSIX.1-2024 <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/{header.name}.html>`__"
+ )
else:
print(" -")
print()
def print_impl_status_rst(header: Header, api: Dict):
- print(".. include:: check.rst\n")
+ if os.sep in header.name:
+ print(".. include:: ../../check.rst\n")
+ else:
+ print(".. include:: ../check.rst\n")
print("=" * len(header.name))
print(header.name)
@@ -176,10 +192,22 @@ def print_impl_status_rst(header: Header, api: Dict):
print_functions_rst(header, api["functions"])
+# This code implicitly relies on docgen.py being in the same dir as the yaml
+# files and is likely to need to be fixed when re-integrating docgen into
+# hdrgen.
+def get_choices() -> list:
+ choices = []
+ for path in Path(__file__).parent.rglob("*.yaml"):
+ fname = path.with_suffix(".h").name
+ if path.parent != Path(__file__).parent:
+ fname = path.parent.name + os.sep + fname
+ choices.append(fname)
+ return choices
+
+
def parse_args() -> Namespace:
parser = ArgumentParser()
- choices = [p.with_suffix(".h").name for p in Path(__file__).parent.glob("*.json")]
- parser.add_argument("header_name", choices=choices)
+ parser.add_argument("header_name", choices=get_choices())
return parser.parse_args()
diff --git a/libc/utils/docgen/errno.yaml b/libc/utils/docgen/errno.yaml
new file mode 100644
index 000000000000..da41552bc3a1
--- /dev/null
+++ b/libc/utils/docgen/errno.yaml
@@ -0,0 +1,14 @@
+macros:
+ EDOM:
+ c-definition: '7.5'
+ in-latest-posix: ''
+ EILSEQ:
+ c-definition: '7.5'
+ in-latest-posix: ''
+ ERANGE:
+ c-definition: '7.5'
+ in-latest-posix: ''
+ errno:
+ c-definition: '7.5'
+ in-latest-posix: ''
+
diff --git a/libc/utils/docgen/fenv.json b/libc/utils/docgen/fenv.json
deleted file mode 100644
index 788b196c053b..000000000000
--- a/libc/utils/docgen/fenv.json
+++ /dev/null
@@ -1,114 +0,0 @@
-{
- "macros": {
- "__STDC_VERSION_FENV_H__": {
- "c-definition": "7.6.5"
- },
- "FE_DIVBYZERO": {
- "c-definition": "7.6.9"
- },
- "FE_INEXACT": {
- "c-definition": "7.6.9"
- },
- "FE_INVALID": {
- "c-definition": "7.6.9"
- },
- "FE_OVERFLOW": {
- "c-definition": "7.6.9"
- },
- "FE_UNDERFLOW": {
- "c-definition": "7.6.9"
- },
- "FE_ALL_EXCEPT": {
- "c-definition": "7.6.12"
- },
- "FE_DFL_MODE": {
- "c-definition": "7.6.11"
- },
- "FE_DOWNARD": {
- "c-definition": "7.6.13"
- },
- "FE_TONEAREST": {
- "c-definition": "7.6.13"
- },
- "FE_TONEARESTFROMZERO": {
- "c-definition": "7.6.13"
- },
- "FE_TOWARDZERO": {
- "c-definition": "7.6.13"
- },
- "FE_UPWARD": {
- "c-definition": "7.6.13"
- },
- "FE_DEC_DOWNWARD": {
- "c-definition": "7.6.14"
- },
- "FE_DEC_TONEAREST": {
- "c-definition": "7.6.14"
- },
- "FE_DEC_TONEARESTFROMZERO": {
- "c-definition": "7.6.14"
- },
- "FE_DEC_TOWARDZERO": {
- "c-definition": "7.6.14"
- },
- "FE_DEC_UPWARD": {
- "c-definition": "7.6.14"
- },
- "FE_DFL_ENV": {
- "c-definition": "7.6.17"
- }
- },
- "functions": {
- "feclearexcept": {
- "c-definition": "7.6.4.1"
- },
- "fegetexceptflag": {
- "c-definition": "7.6.4.2"
- },
- "feraiseexcept": {
- "c-definition": "7.6.4.3"
- },
- "fesetexcept": {
- "c-definition": "7.6.4.4"
- },
- "fesetexceptflag": {
- "c-definition": "7.6.4.5"
- },
- "fetestexceptflag": {
- "c-definition": "7.6.4.6"
- },
- "fetestexcept": {
- "c-definition": "7.6.4.7"
- },
- "fegetmode": {
- "c-definition": "7.6.5.1"
- },
- "fegetround": {
- "c-definition": "7.6.5.2"
- },
- "fe_dec_getround": {
- "c-definition": "7.6.5.3"
- },
- "fesetmode": {
- "c-definition": "7.6.5.4"
- },
- "fesetround": {
- "c-definition": "7.6.5.5"
- },
- "fe_dec_setround": {
- "c-definition": "7.6.5.6"
- },
- "fegetenv": {
- "c-definition": "7.6.6.1"
- },
- "feholdexcept": {
- "c-definition": "7.6.6.2"
- },
- "fesetenv": {
- "c-definition": "7.6.6.3"
- },
- "feupdateenv": {
- "c-definition": "7.6.6.4"
- }
- }
-}
diff --git a/libc/utils/docgen/fenv.yaml b/libc/utils/docgen/fenv.yaml
new file mode 100644
index 000000000000..1d73697f36be
--- /dev/null
+++ b/libc/utils/docgen/fenv.yaml
@@ -0,0 +1,97 @@
+functions:
+ fe_dec_getround:
+ c-definition: 7.6.5.3
+ fe_dec_setround:
+ c-definition: 7.6.5.6
+ feclearexcept:
+ c-definition: 7.6.4.1
+ in-latest-posix: ''
+ fegetenv:
+ c-definition: 7.6.6.1
+ in-latest-posix: ''
+ fegetexceptflag:
+ c-definition: 7.6.4.2
+ in-latest-posix: ''
+ fegetmode:
+ c-definition: 7.6.5.1
+ fegetround:
+ c-definition: 7.6.5.2
+ in-latest-posix: ''
+ feholdexcept:
+ c-definition: 7.6.6.2
+ in-latest-posix: ''
+ feraiseexcept:
+ c-definition: 7.6.4.3
+ in-latest-posix: ''
+ fesetenv:
+ c-definition: 7.6.6.3
+ in-latest-posix: ''
+ fesetexcept:
+ c-definition: 7.6.4.4
+ fesetexceptflag:
+ c-definition: 7.6.4.5
+ in-latest-posix: ''
+ fesetmode:
+ c-definition: 7.6.5.4
+ fesetround:
+ c-definition: 7.6.5.5
+ in-latest-posix: ''
+ fetestexcept:
+ c-definition: 7.6.4.7
+ in-latest-posix: ''
+ fetestexceptflag:
+ c-definition: 7.6.4.6
+ feupdateenv:
+ c-definition: 7.6.6.4
+ in-latest-posix: ''
+macros:
+ FE_ALL_EXCEPT:
+ c-definition: 7.6.12
+ in-latest-posix: ''
+ FE_DEC_DOWNWARD:
+ c-definition: 7.6.14
+ FE_DEC_TONEAREST:
+ c-definition: 7.6.14
+ FE_DEC_TONEARESTFROMZERO:
+ c-definition: 7.6.14
+ FE_DEC_TOWARDZERO:
+ c-definition: 7.6.14
+ FE_DEC_UPWARD:
+ c-definition: 7.6.14
+ FE_DFL_ENV:
+ c-definition: 7.6.17
+ in-latest-posix: ''
+ FE_DFL_MODE:
+ c-definition: 7.6.11
+ FE_DIVBYZERO:
+ c-definition: 7.6.9
+ in-latest-posix: ''
+ FE_DOWNWARD:
+ c-definition: 7.6.13
+ in-latest-posix: ''
+ FE_INEXACT:
+ c-definition: 7.6.9
+ in-latest-posix: ''
+ FE_INVALID:
+ c-definition: 7.6.9
+ in-latest-posix: ''
+ FE_OVERFLOW:
+ c-definition: 7.6.9
+ in-latest-posix: ''
+ FE_TONEAREST:
+ c-definition: 7.6.13
+ in-latest-posix: ''
+ FE_TONEARESTFROMZERO:
+ c-definition: 7.6.13
+ FE_TOWARDZERO:
+ c-definition: 7.6.13
+ in-latest-posix: ''
+ FE_UNDERFLOW:
+ c-definition: 7.6.9
+ in-latest-posix: ''
+ FE_UPWARD:
+ c-definition: 7.6.13
+ in-latest-posix: ''
+ __STDC_VERSION_FENV_H__:
+ c-definition: 7.6.5
+
diff --git a/libc/utils/docgen/float.yaml b/libc/utils/docgen/float.yaml
new file mode 100644
index 000000000000..a8840b91be55
--- /dev/null
+++ b/libc/utils/docgen/float.yaml
@@ -0,0 +1,143 @@
+macros:
+ DBL_DECIMAL_DIG:
+ c-definition: 5.3.5.3.3
+ in-latest-posix: ''
+ DBL_DIG:
+ c-definition: 5.3.5.3.3
+ in-latest-posix: ''
+ DBL_EPSILON:
+ c-definition: 5.3.5.3.3
+ in-latest-posix: ''
+ DBL_HAS_SUBNORM:
+ c-definition: 5.3.5.3.3
+ in-latest-posix: ''
+ DBL_IS_IEC_60559:
+ c-definition: 5.3.5.3.3
+ DBL_MANT_DIG:
+ c-definition: 5.3.5.3.3
+ DBL_MAX:
+ c-definition: 5.3.5.3.3
+ in-latest-posix: ''
+ DBL_MAX_10_EXP:
+ c-definition: 5.3.5.3.3
+ in-latest-posix: ''
+ DBL_MAX_EXP:
+ c-definition: 5.3.5.3.3
+ in-latest-posix: ''
+ DBL_MIN:
+ c-definition: 5.3.5.3.3
+ in-latest-posix: ''
+ DBL_MIN_10_EXP:
+ c-definition: 5.3.5.3.3
+ in-latest-posix: ''
+ DBL_MIN_EXP:
+ c-definition: 5.3.5.3.3
+ in-latest-posix: ''
+ DBL_NORM_MAX:
+ c-definition: 5.3.5.3.3
+ DBL_SNAN:
+ c-definition: 5.3.5.3.3
+ DBL_TRUE_MIN:
+ c-definition: 5.3.5.3.3
+ in-latest-posix: ''
+ DECIMAL_DIG:
+ c-definition: 5.3.5.3.3
+ in-latest-posix: ''
+ FLT_DECIMAL_DIG:
+ c-definition: 5.3.5.3.3
+ in-latest-posix: ''
+ FLT_DIG:
+ c-definition: 5.3.5.3.3
+ in-latest-posix: ''
+ FLT_EPSILON:
+ c-definition: 5.3.5.3.3
+ in-latest-posix: ''
+ FLT_EVAL_METHOD:
+ c-definition: 5.3.5.3.3
+ in-latest-posix: ''
+ FLT_HAS_SUBNORM:
+ c-definition: 5.3.5.3.3
+ in-latest-posix: ''
+ FLT_IS_IEC_60559:
+ c-definition: 5.3.5.3.3
+ FLT_MANT_DIG:
+ c-definition: 5.3.5.3.3
+ FLT_MAX:
+ c-definition: 5.3.5.3.3
+ in-latest-posix: ''
+ FLT_MAX_10_EXP:
+ c-definition: 5.3.5.3.3
+ in-latest-posix: ''
+ FLT_MAX_EXP:
+ c-definition: 5.3.5.3.3
+ in-latest-posix: ''
+ FLT_MIN:
+ c-definition: 5.3.5.3.3
+ in-latest-posix: ''
+ FLT_MIN_10_EXP:
+ c-definition: 5.3.5.3.3
+ in-latest-posix: ''
+ FLT_MIN_EXP:
+ c-definition: 5.3.5.3.3
+ in-latest-posix: ''
+ FLT_NORM_MAX:
+ c-definition: 5.3.5.3.3
+ FLT_RADIX:
+ c-definition: 5.3.5.3.3
+ in-latest-posix: ''
+ FLT_ROUNDS:
+ c-definition: 5.3.5.3.3
+ in-latest-posix: ''
+ FLT_SNAN:
+ c-definition: 5.3.5.3.3
+ FLT_TRUE_MIN:
+ c-definition: 5.3.5.3.3
+ in-latest-posix: ''
+ INFINITY:
+ c-definition: 5.3.5.3.3
+ LDBL_DECIMAL_DIG:
+ c-definition: 5.3.5.3.3
+ in-latest-posix: ''
+ LDBL_DIG:
+ c-definition: 5.3.5.3.3
+ in-latest-posix: ''
+ LDBL_EPSILON:
+ c-definition: 5.3.5.3.3
+ in-latest-posix: ''
+ LDBL_HAS_SUBNORM:
+ c-definition: 5.3.5.3.3
+ in-latest-posix: ''
+ LDBL_IS_IEC_60559:
+ c-definition: 5.3.5.3.3
+ LDBL_MANT_DIG:
+ c-definition: 5.3.5.3.3
+ LDBL_MAX:
+ c-definition: 5.3.5.3.3
+ in-latest-posix: ''
+ LDBL_MAX_10_EXP:
+ c-definition: 5.3.5.3.3
+ in-latest-posix: ''
+ LDBL_MAX_EXP:
+ c-definition: 5.3.5.3.3
+ in-latest-posix: ''
+ LDBL_MIN:
+ c-definition: 5.3.5.3.3
+ in-latest-posix: ''
+ LDBL_MIN_10_EXP:
+ c-definition: 5.3.5.3.3
+ in-latest-posix: ''
+ LDBL_MIN_EXP:
+ c-definition: 5.3.5.3.3
+ in-latest-posix: ''
+ LDBL_NORM_MAX:
+ c-definition: 5.3.5.3.3
+ LDBL_SNAN:
+ c-definition: 5.3.5.3.3
+ LDBL_TRUE_MIN:
+ c-definition: 5.3.5.3.3
+ in-latest-posix: ''
+ NAN:
+ c-definition: 5.3.5.3.3
+ __STDC_VERSION_FLOAT_H__:
+ c-definition: '7.7'
+
diff --git a/libc/utils/docgen/header.py b/libc/utils/docgen/header.py
index dde210078db2..5bf524a64b69 100644
--- a/libc/utils/docgen/header.py
+++ b/libc/utils/docgen/header.py
@@ -14,7 +14,7 @@ class Header:
Maintains implementation information about a standard header file:
* where does its implementation dir live
* where is its macros file
- * where is its docgen json file
+ * where is its docgen yaml file
By convention, the macro-only part of a header file is in a header-specific
file somewhere in the directory tree with root at
@@ -42,7 +42,7 @@ class Header:
self.stem = header_name.rstrip(".h")
self.docgen_root = Path(__file__).parent
self.libc_root = self.docgen_root.parent.parent
- self.docgen_json = self.docgen_root / Path(header_name).with_suffix(".json")
+ self.docgen_yaml = self.docgen_root / Path(header_name).with_suffix(".yaml")
self.fns_dir = Path(self.libc_root, "src", self.stem)
self.macros_dir = Path(self.libc_root, "include", "llvm-libc-macros")
@@ -83,5 +83,10 @@ class Header:
macro file might be located in a subdirectory:
libc/include/llvm-libc-macros/fcntl-macros.h
libc/include/llvm-libc-macros/linux/fcntl-macros.h
+
+ When a header would be nested in a dir (such as arpa/, sys/, etc) we
+ instead use a hyphen in the name.
+ libc/include/llvm-libc-macros/sys-mman-macros.h
"""
- return self.macros_dir.glob(f"**/{self.stem}-macros.h")
+ stem = self.stem.replace("/", "-")
+ return self.macros_dir.glob(f"**/{stem}-macros.h")
diff --git a/libc/utils/docgen/inttypes.yaml b/libc/utils/docgen/inttypes.yaml
new file mode 100644
index 000000000000..cbf50592ef07
--- /dev/null
+++ b/libc/utils/docgen/inttypes.yaml
@@ -0,0 +1,20 @@
+functions:
+ imaxabs:
+ c-definition: 7.8.2.1
+ in-latest-posix: ''
+ imaxdiv:
+ c-definition: 7.8.2.2
+ in-latest-posix: ''
+ strtoimax:
+ c-definition: 7.8.2.3
+ in-latest-posix: ''
+ strtoumax:
+ c-definition: 7.8.2.3
+ in-latest-posix: ''
+ wcstoimax:
+ c-definition: 7.8.2.4
+ in-latest-posix: ''
+ wcstoumax:
+ c-definition: 7.8.2.4
+ in-latest-posix: ''
+
diff --git a/libc/utils/docgen/locale.yaml b/libc/utils/docgen/locale.yaml
new file mode 100644
index 000000000000..eea91a885ff4
--- /dev/null
+++ b/libc/utils/docgen/locale.yaml
@@ -0,0 +1,37 @@
+functions:
+ duplocale:
+ in-latest-posix: ''
+ freelocale:
+ in-latest-posix: ''
+ getlocalename_l:
+ in-latest-posix: ''
+ localeconv:
+ c-definition: 7.11.2.1
+ in-latest-posix: ''
+ newlocale:
+ in-latest-posix: ''
+ setlocale:
+ c-definition: 7.11.1.1
+ in-latest-posix: ''
+ uselocale:
+ in-latest-posix: ''
+macros:
+ LC_ALL:
+ c-definition: '7.11'
+ in-latest-posix: ''
+ LC_COLLATE:
+ c-definition: '7.11'
+ in-latest-posix: ''
+ LC_CTYPE:
+ c-definition: '7.11'
+ in-latest-posix: ''
+ LC_MONETARY:
+ c-definition: '7.11'
+ in-latest-posix: ''
+ LC_NUMERIC:
+ c-definition: '7.11'
+ in-latest-posix: ''
+ LC_TIME:
+ c-definition: '7.11'
+ in-latest-posix: ''
+
diff --git a/libc/utils/docgen/setjmp.json b/libc/utils/docgen/setjmp.json
deleted file mode 100644
index 0b9a4e65da4f..000000000000
--- a/libc/utils/docgen/setjmp.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- "macros": {
- "__STDC_VERSION_SETJMP_H__": {
- "c-definition": "7.13.2"
- }
- },
- "functions": {
- "setjmp": {
- "c-definition": "7.13.1.1"
- },
- "longjmp": {
- "c-definition": "7.13.2.1"
- }
- }
-}
diff --git a/libc/utils/docgen/setjmp.yaml b/libc/utils/docgen/setjmp.yaml
new file mode 100644
index 000000000000..123739d1a6ce
--- /dev/null
+++ b/libc/utils/docgen/setjmp.yaml
@@ -0,0 +1,15 @@
+functions:
+ longjmp:
+ c-definition: 7.13.2.1
+ in-latest-posix: ''
+ setjmp:
+ c-definition: 7.13.1.1
+ in-latest-posix: ''
+ siglongjmp:
+ in-latest-posix: ''
+ sigsetjmp:
+ in-latest-posix: ''
+macros:
+ __STDC_VERSION_SETJMP_H__:
+ c-definition: 7.13.2
+
diff --git a/libc/utils/docgen/signal.json b/libc/utils/docgen/signal.json
deleted file mode 100644
index 337b0c19717b..000000000000
--- a/libc/utils/docgen/signal.json
+++ /dev/null
@@ -1,152 +0,0 @@
-{
- "macros": {
- "SIG_DFL": {
- "c-definition": "7.14.3",
- "posix-definition": "https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html"
- },
- "SIG_ERR": {
- "c-definition": "7.14.3",
- "posix-definition": "https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html"
- },
- "SIG_HOLD": {
- "posix-definition": "https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html"
- },
- "SIG_IGN": {
- "c-definition": "7.14.3",
- "posix-definition": "https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html"
- },
- "SIGRTMIN": {
- "posix-definition": "https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html"
- },
- "SIGRTMAX": {
- "posix-definition": "https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html"
- },
- "SIGABRT": {
- "c-definition": "7.14.3",
- "posix-definition": "https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html"
- },
- "SIGALRM": {
- "posix-definition": "https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html"
- },
- "SIGBUS": {
- "posix-definition": "https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html"
- },
- "SIGCHLD": {
- "posix-definition": "https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html"
- },
- "SIGCONT": {
- "posix-definition": "https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html"
- },
- "SIGFPE": {
- "c-definition": "7.14.3",
- "posix-definition": "https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html"
- },
- "SIGHUP": {
- "posix-definition": "https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html"
- },
- "SIGILL": {
- "c-definition": "7.14.3",
- "posix-definition": "https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html"
- },
- "SIGINT": {
- "c-definition": "7.14.3",
- "posix-definition": "https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html"
- },
- "SIGKILL": {
- "posix-definition": "https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html"
- },
- "SIGPIPE": {
- "posix-definition": "https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html"
- },
- "SIGPIPE": {
- "posix-definition": "https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html"
- },
- "SIGQUIT": {
- "posix-definition": "https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html"
- },
- "SIGSEGV": {
- "c-definition": "7.14.3",
- "posix-definition": "https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html"
- },
- "SIGSTOP": {
- "posix-definition": "https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html"
- },
- "SIGTERM": {
- "c-definition": "7.14.3",
- "posix-definition": "https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html"
- },
- "SIGTSTP": {
- "posix-definition": "https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html"
- },
- "SIGTTIN": {
- "posix-definition": "https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html"
- },
- "SIGTTOU": {
- "posix-definition": "https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html"
- },
- "SIGUSR1": {
- "posix-definition": "https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html"
- },
- "SIGUSR2": {
- "posix-definition": "https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html"
- },
- "SIGPOLL": {
- "posix-definition": "https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html"
- },
- "SIGPROF": {
- "posix-definition": "https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html"
- },
- "SIGSYS": {
- "posix-definition": "https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html"
- },
- "SIGTRAP": {
- "posix-definition": "https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html"
- },
- "SIGURG": {
- "posix-definition": "https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html"
- },
- "SIGVTALRM": {
- "posix-definition": "https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html"
- },
- "SIGXCPU": {
- "posix-definition": "https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html"
- },
- "SIGXFSZ": {
- "posix-definition": "https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html"
- }
- },
- "functions": {
- "signal": {
- "c-definition": "7.14.1.1",
- "posix-definition": "https://pubs.opengroup.org/onlinepubs/9699919799/functions/signal.html"
- },
- "raise": {
- "c-definition": "7.14.2.1",
- "posix-definition": "https://pubs.opengroup.org/onlinepubs/9699919799/functions/raise.html"
- },
- "kill": {
- "posix-definition": "https://pubs.opengroup.org/onlinepubs/9699919799/functions/kill.html"
- },
- "sigaction": {
- "posix-definition": "https://pubs.opengroup.org/onlinepubs/9699919799/functions/sigaction.html"
- },
- "sigaddset": {
- "posix-definition": "https://pubs.opengroup.org/onlinepubs/9699919799/functions/sigaddset.html"
- },
- "sigaltstack": {
- "posix-definition": "https://pubs.opengroup.org/onlinepubs/9699919799/functions/sigaltstack.html"
- },
- "sigdelset": {
- "posix-definition": "https://pubs.opengroup.org/onlinepubs/9699919799/functions/sigdelset.html"
- },
- "sigemptyset": {
- "posix-definition": "https://pubs.opengroup.org/onlinepubs/9699919799/functions/sigemptyset.html"
- },
- "sigfillset": {
- "posix-definition": "https://pubs.opengroup.org/onlinepubs/9699919799/functions/sigfillset.html"
- },
- "sigprocmask": {
- "posix-definition": "https://pubs.opengroup.org/onlinepubs/9699919799/functions/sigprocmask.html"
- }
- }
-}
diff --git a/libc/utils/docgen/signal.yaml b/libc/utils/docgen/signal.yaml
new file mode 100644
index 000000000000..da31a86b00eb
--- /dev/null
+++ b/libc/utils/docgen/signal.yaml
@@ -0,0 +1,102 @@
+functions:
+ kill:
+ in-latest-posix: ''
+ raise:
+ c-definition: 7.14.2.1
+ in-latest-posix: ''
+ sigaction:
+ in-latest-posix: ''
+ sigaddset:
+ in-latest-posix: ''
+ sigaltstack:
+ in-latest-posix: ''
+ sigdelset:
+ in-latest-posix: ''
+ sigemptyset:
+ in-latest-posix: ''
+ sigfillset:
+ in-latest-posix: ''
+ signal:
+ c-definition: 7.14.1.1
+ in-latest-posix: ''
+ sigprocmask:
+ in-latest-posix: ''
+macros:
+ SIGABRT:
+ c-definition: 7.14.3
+ in-latest-posix: ''
+ SIGALRM:
+ in-latest-posix: ''
+ SIGBUS:
+ in-latest-posix: ''
+ SIGCHLD:
+ in-latest-posix: ''
+ SIGCONT:
+ in-latest-posix: ''
+ SIGFPE:
+ c-definition: 7.14.3
+ in-latest-posix: ''
+ SIGHUP:
+ in-latest-posix: ''
+ SIGILL:
+ c-definition: 7.14.3
+ in-latest-posix: ''
+ SIGINT:
+ c-definition: 7.14.3
+ in-latest-posix: ''
+ SIGKILL:
+ in-latest-posix: ''
+ SIGPIPE:
+ in-latest-posix: ''
+ SIGPOLL:
+ in-latest-posix: ''
+ SIGPROF:
+ in-latest-posix: ''
+ SIGQUIT:
+ in-latest-posix: ''
+ SIGRTMAX:
+ in-latest-posix: ''
+ SIGRTMIN:
+ in-latest-posix: ''
+ SIGSEGV:
+ c-definition: 7.14.3
+ in-latest-posix: ''
+ SIGSTOP:
+ in-latest-posix: ''
+ SIGSYS:
+ in-latest-posix: ''
+ SIGTERM:
+ c-definition: 7.14.3
+ in-latest-posix: ''
+ SIGTRAP:
+ in-latest-posix: ''
+ SIGTSTP:
+ in-latest-posix: ''
+ SIGTTIN:
+ in-latest-posix: ''
+ SIGTTOU:
+ in-latest-posix: ''
+ SIGURG:
+ in-latest-posix: ''
+ SIGUSR1:
+ in-latest-posix: ''
+ SIGUSR2:
+ in-latest-posix: ''
+ SIGVTALRM:
+ in-latest-posix: ''
+ SIGXCPU:
+ in-latest-posix: ''
+ SIGXFSZ:
+ in-latest-posix: ''
+ SIG_DFL:
+ c-definition: 7.14.3
+ in-latest-posix: ''
+ SIG_ERR:
+ c-definition: 7.14.3
+ in-latest-posix: ''
+ SIG_HOLD:
+ in-latest-posix: ''
+ SIG_IGN:
+ c-definition: 7.14.3
+ in-latest-posix: ''
+
diff --git a/libc/utils/docgen/stdbit.json b/libc/utils/docgen/stdbit.json
deleted file mode 100644
index 25060c1ff9fd..000000000000
--- a/libc/utils/docgen/stdbit.json
+++ /dev/null
@@ -1,270 +0,0 @@
-{
- "macros": {
- "__STDC_VERSION_STDBIT_H__": {
- "c-definition": "7.18.1.2"
- },
- "__STDC_ENDIAN_LITTLE__": {
- "c-definition": "7.18.2.2"
- },
- "__STDC_ENDIAN_BIG__": {
- "c-definition": "7.18.2.2"
- },
- "__STDC_ENDIAN_NATIVE__": {
- "c-definition": "7.18.2.2"
- },
- "stdc_leading_zeros": {
- "c-definition": "7.18.3.1"
- },
- "stdc_leading_ones": {
- "c-definition": "7.18.4.1"
- },
- "stdc_trailing_zeros": {
- "c-definition": "7.18.5.1"
- },
- "stdc_trailing_ones": {
- "c-definition": "7.18.6.1"
- },
- "stdc_first_leading_zero": {
- "c-definition": "7.18.7.1"
- },
- "stdc_first_leading_one": {
- "c-definition": "7.18.8.1"
- },
- "stdc_first_trailing_zero": {
- "c-definition": "7.18.9.1"
- },
- "stdc_first_trailing_one": {
- "c-definition": "7.18.10.1"
- },
- "stdc_count_zeros": {
- "c-definition": "7.18.11.1"
- },
- "stdc_count_ones": {
- "c-definition": "7.18.12.1"
- },
- "stdc_has_single_bit": {
- "c-definition": "7.18.13.1"
- },
- "stdc_bit_width": {
- "c-definition": "7.18.14.1"
- },
- "stdc_bit_floor": {
- "c-definition": "7.18.15.1"
- },
- "stdc_bit_ceil": {
- "c-definition": "7.18.16.1"
- }
- },
- "functions": {
- "stdc_leading_zeros_uc": {
- "c-definition": "7.18.3"
- },
- "stdc_leading_zeros_us": {
- "c-definition": "7.18.3"
- },
- "stdc_leading_zeros_ui": {
- "c-definition": "7.18.3"
- },
- "stdc_leading_zeros_ul": {
- "c-definition": "7.18.3"
- },
- "stdc_leading_zeros_ull": {
- "c-definition": "7.18.3"
- },
- "stdc_leading_ones_uc": {
- "c-definition": "7.18.4"
- },
- "stdc_leading_ones_us": {
- "c-definition": "7.18.4"
- },
- "stdc_leading_ones_ui": {
- "c-definition": "7.18.4"
- },
- "stdc_leading_ones_ul": {
- "c-definition": "7.18.4"
- },
- "stdc_leading_ones_ull": {
- "c-definition": "7.18.4"
- },
- "stdc_trailing_zeros_uc": {
- "c-definition": "7.18.5"
- },
- "stdc_trailing_zeros_us": {
- "c-definition": "7.18.5"
- },
- "stdc_trailing_zeros_ui": {
- "c-definition": "7.18.5"
- },
- "stdc_trailing_zeros_ul": {
- "c-definition": "7.18.5"
- },
- "stdc_trailing_zeros_ull": {
- "c-definition": "7.18.5"
- },
- "stdc_trailing_ones_uc": {
- "c-definition": "7.18.6"
- },
- "stdc_trailing_ones_us": {
- "c-definition": "7.18.6"
- },
- "stdc_trailing_ones_ui": {
- "c-definition": "7.18.6"
- },
- "stdc_trailing_ones_ul": {
- "c-definition": "7.18.6"
- },
- "stdc_trailing_ones_ull": {
- "c-definition": "7.18.6"
- },
- "stdc_first_leading_zero_uc": {
- "c-definition": "7.18.7"
- },
- "stdc_first_leading_zero_us": {
- "c-definition": "7.18.7"
- },
- "stdc_first_leading_zero_ui": {
- "c-definition": "7.18.7"
- },
- "stdc_first_leading_zero_ul": {
- "c-definition": "7.18.7"
- },
- "stdc_first_leading_zero_ull": {
- "c-definition": "7.18.7"
- },
- "stdc_first_leading_one_uc": {
- "c-definition": "7.18.8"
- },
- "stdc_first_leading_one_us": {
- "c-definition": "7.18.8"
- },
- "stdc_first_leading_one_ui": {
- "c-definition": "7.18.8"
- },
- "stdc_first_leading_one_ul": {
- "c-definition": "7.18.8"
- },
- "stdc_first_leading_one_ull": {
- "c-definition": "7.18.8"
- },
- "stdc_first_trailing_zero_uc": {
- "c-definition": "7.18.9"
- },
- "stdc_first_trailing_zero_us": {
- "c-definition": "7.18.9"
- },
- "stdc_first_trailing_zero_ui": {
- "c-definition": "7.18.9"
- },
- "stdc_first_trailing_zero_ul": {
- "c-definition": "7.18.9"
- },
- "stdc_first_trailing_zero_ull": {
- "c-definition": "7.18.9"
- },
- "stdc_first_trailing_one_uc": {
- "c-definition": "7.18.10"
- },
- "stdc_first_trailing_one_us": {
- "c-definition": "7.18.10"
- },
- "stdc_first_trailing_one_ui": {
- "c-definition": "7.18.10"
- },
- "stdc_first_trailing_one_ul": {
- "c-definition": "7.18.10"
- },
- "stdc_first_trailing_one_ull": {
- "c-definition": "7.18.10"
- },
- "stdc_count_zeros_uc": {
- "c-definition": "7.18.11"
- },
- "stdc_count_zeros_us": {
- "c-definition": "7.18.11"
- },
- "stdc_count_zeros_ui": {
- "c-definition": "7.18.11"
- },
- "stdc_count_zeros_ul": {
- "c-definition": "7.18.11"
- },
- "stdc_count_zeros_ull": {
- "c-definition": "7.18.11"
- },
- "stdc_count_ones_uc": {
- "c-definition": "7.18.12"
- },
- "stdc_count_ones_us": {
- "c-definition": "7.18.12"
- },
- "stdc_count_ones_ui": {
- "c-definition": "7.18.12"
- },
- "stdc_count_ones_ul": {
- "c-definition": "7.18.12"
- },
- "stdc_count_ones_ull": {
- "c-definition": "7.18.12"
- },
- "stdc_has_single_bit_uc": {
- "c-definition": "7.18.13"
- },
- "stdc_has_single_bit_us": {
- "c-definition": "7.18.13"
- },
- "stdc_has_single_bit_ui": {
- "c-definition": "7.18.13"
- },
- "stdc_has_single_bit_ul": {
- "c-definition": "7.18.13"
- },
- "stdc_has_single_bit_ull": {
- "c-definition": "7.18.13"
- },
- "stdc_bit_width_uc": {
- "c-definition": "7.18.14"
- },
- "stdc_bit_width_us": {
- "c-definition": "7.18.14"
- },
- "stdc_bit_width_ui": {
- "c-definition": "7.18.14"
- },
- "stdc_bit_width_ul": {
- "c-definition": "7.18.14"
- },
- "stdc_bit_width_ull": {
- "c-definition": "7.18.14"
- },
- "stdc_bit_floor_uc": {
- "c-definition": "7.18.15"
- },
- "stdc_bit_floor_us": {
- "c-definition": "7.18.15"
- },
- "stdc_bit_floor_ui": {
- "c-definition": "7.18.15"
- },
- "stdc_bit_floor_ul": {
- "c-definition": "7.18.15"
- },
- "stdc_bit_floor_ull": {
- "c-definition": "7.18.15"
- },
- "stdc_bit_ceil_uc": {
- "c-definition": "7.18.16"
- },
- "stdc_bit_ceil_us": {
- "c-definition": "7.18.16"
- },
- "stdc_bit_ceil_ui": {
- "c-definition": "7.18.16"
- },
- "stdc_bit_ceil_ul": {
- "c-definition": "7.18.16"
- },
- "stdc_bit_ceil_ull": {
- "c-definition": "7.18.16"
- }
- }
-}
diff --git a/libc/utils/docgen/stdbit.yaml b/libc/utils/docgen/stdbit.yaml
new file mode 100644
index 000000000000..976221601e9c
--- /dev/null
+++ b/libc/utils/docgen/stdbit.yaml
@@ -0,0 +1,179 @@
+functions:
+ stdc_bit_ceil_uc:
+ c-definition: 7.18.16
+ stdc_bit_ceil_ui:
+ c-definition: 7.18.16
+ stdc_bit_ceil_ul:
+ c-definition: 7.18.16
+ stdc_bit_ceil_ull:
+ c-definition: 7.18.16
+ stdc_bit_ceil_us:
+ c-definition: 7.18.16
+ stdc_bit_floor_uc:
+ c-definition: 7.18.15
+ stdc_bit_floor_ui:
+ c-definition: 7.18.15
+ stdc_bit_floor_ul:
+ c-definition: 7.18.15
+ stdc_bit_floor_ull:
+ c-definition: 7.18.15
+ stdc_bit_floor_us:
+ c-definition: 7.18.15
+ stdc_bit_width_uc:
+ c-definition: 7.18.14
+ stdc_bit_width_ui:
+ c-definition: 7.18.14
+ stdc_bit_width_ul:
+ c-definition: 7.18.14
+ stdc_bit_width_ull:
+ c-definition: 7.18.14
+ stdc_bit_width_us:
+ c-definition: 7.18.14
+ stdc_count_ones_uc:
+ c-definition: 7.18.12
+ stdc_count_ones_ui:
+ c-definition: 7.18.12
+ stdc_count_ones_ul:
+ c-definition: 7.18.12
+ stdc_count_ones_ull:
+ c-definition: 7.18.12
+ stdc_count_ones_us:
+ c-definition: 7.18.12
+ stdc_count_zeros_uc:
+ c-definition: 7.18.11
+ stdc_count_zeros_ui:
+ c-definition: 7.18.11
+ stdc_count_zeros_ul:
+ c-definition: 7.18.11
+ stdc_count_zeros_ull:
+ c-definition: 7.18.11
+ stdc_count_zeros_us:
+ c-definition: 7.18.11
+ stdc_first_leading_one_uc:
+ c-definition: 7.18.8
+ stdc_first_leading_one_ui:
+ c-definition: 7.18.8
+ stdc_first_leading_one_ul:
+ c-definition: 7.18.8
+ stdc_first_leading_one_ull:
+ c-definition: 7.18.8
+ stdc_first_leading_one_us:
+ c-definition: 7.18.8
+ stdc_first_leading_zero_uc:
+ c-definition: 7.18.7
+ stdc_first_leading_zero_ui:
+ c-definition: 7.18.7
+ stdc_first_leading_zero_ul:
+ c-definition: 7.18.7
+ stdc_first_leading_zero_ull:
+ c-definition: 7.18.7
+ stdc_first_leading_zero_us:
+ c-definition: 7.18.7
+ stdc_first_trailing_one_uc:
+ c-definition: 7.18.10
+ stdc_first_trailing_one_ui:
+ c-definition: 7.18.10
+ stdc_first_trailing_one_ul:
+ c-definition: 7.18.10
+ stdc_first_trailing_one_ull:
+ c-definition: 7.18.10
+ stdc_first_trailing_one_us:
+ c-definition: 7.18.10
+ stdc_first_trailing_zero_uc:
+ c-definition: 7.18.9
+ stdc_first_trailing_zero_ui:
+ c-definition: 7.18.9
+ stdc_first_trailing_zero_ul:
+ c-definition: 7.18.9
+ stdc_first_trailing_zero_ull:
+ c-definition: 7.18.9
+ stdc_first_trailing_zero_us:
+ c-definition: 7.18.9
+ stdc_has_single_bit_uc:
+ c-definition: 7.18.13
+ stdc_has_single_bit_ui:
+ c-definition: 7.18.13
+ stdc_has_single_bit_ul:
+ c-definition: 7.18.13
+ stdc_has_single_bit_ull:
+ c-definition: 7.18.13
+ stdc_has_single_bit_us:
+ c-definition: 7.18.13
+ stdc_leading_ones_uc:
+ c-definition: 7.18.4
+ stdc_leading_ones_ui:
+ c-definition: 7.18.4
+ stdc_leading_ones_ul:
+ c-definition: 7.18.4
+ stdc_leading_ones_ull:
+ c-definition: 7.18.4
+ stdc_leading_ones_us:
+ c-definition: 7.18.4
+ stdc_leading_zeros_uc:
+ c-definition: 7.18.3
+ stdc_leading_zeros_ui:
+ c-definition: 7.18.3
+ stdc_leading_zeros_ul:
+ c-definition: 7.18.3
+ stdc_leading_zeros_ull:
+ c-definition: 7.18.3
+ stdc_leading_zeros_us:
+ c-definition: 7.18.3
+ stdc_trailing_ones_uc:
+ c-definition: 7.18.6
+ stdc_trailing_ones_ui:
+ c-definition: 7.18.6
+ stdc_trailing_ones_ul:
+ c-definition: 7.18.6
+ stdc_trailing_ones_ull:
+ c-definition: 7.18.6
+ stdc_trailing_ones_us:
+ c-definition: 7.18.6
+ stdc_trailing_zeros_uc:
+ c-definition: 7.18.5
+ stdc_trailing_zeros_ui:
+ c-definition: 7.18.5
+ stdc_trailing_zeros_ul:
+ c-definition: 7.18.5
+ stdc_trailing_zeros_ull:
+ c-definition: 7.18.5
+ stdc_trailing_zeros_us:
+ c-definition: 7.18.5
+macros:
+ __STDC_ENDIAN_BIG__:
+ c-definition: 7.18.2.2
+ __STDC_ENDIAN_LITTLE__:
+ c-definition: 7.18.2.2
+ __STDC_ENDIAN_NATIVE__:
+ c-definition: 7.18.2.2
+ __STDC_VERSION_STDBIT_H__:
+ c-definition: 7.18.1.2
+ stdc_bit_ceil:
+ c-definition: 7.18.16.1
+ stdc_bit_floor:
+ c-definition: 7.18.15.1
+ stdc_bit_width:
+ c-definition: 7.18.14.1
+ stdc_count_ones:
+ c-definition: 7.18.12.1
+ stdc_count_zeros:
+ c-definition: 7.18.11.1
+ stdc_first_leading_one:
+ c-definition: 7.18.8.1
+ stdc_first_leading_zero:
+ c-definition: 7.18.7.1
+ stdc_first_trailing_one:
+ c-definition: 7.18.10.1
+ stdc_first_trailing_zero:
+ c-definition: 7.18.9.1
+ stdc_has_single_bit:
+ c-definition: 7.18.13.1
+ stdc_leading_ones:
+ c-definition: 7.18.4.1
+ stdc_leading_zeros:
+ c-definition: 7.18.3.1
+ stdc_trailing_ones:
+ c-definition: 7.18.6.1
+ stdc_trailing_zeros:
+ c-definition: 7.18.5.1
+
diff --git a/libc/utils/docgen/stdio.yaml b/libc/utils/docgen/stdio.yaml
new file mode 100644
index 000000000000..9dabee44a51c
--- /dev/null
+++ b/libc/utils/docgen/stdio.yaml
@@ -0,0 +1,226 @@
+macros:
+ __STDC_VERSION_STDIO_H__:
+ c-definition: '7.23.1'
+ _IOFBF:
+ c-definition: '7.23.1'
+ in-latest-posix: ''
+ _IOLBF:
+ c-definition: '7.23.1'
+ in-latest-posix: ''
+ _IONBF:
+ c-definition: '7.23.1'
+ in-latest-posix: ''
+ BUFSIZ:
+ c-definition: '7.23.1'
+ in-latest-posix: ''
+ EOF:
+ c-definition: '7.23.1'
+ in-latest-posix: ''
+ FOPEN_MAX:
+ c-definition: '7.23.1'
+ in-latest-posix: ''
+ FILENAME_MAX:
+ c-definition: '7.23.1'
+ in-latest-posix: ''
+ _PRINTF_NAN_LEN_MAX:
+ c-definition: '7.23.1'
+ L_tmpnam:
+ c-definition: '7.23.1'
+ in-latest-posix: ''
+ L_ctermid:
+ in-latest-posix: ''
+ SEEK_CUR:
+ c-definition: '7.23.1'
+ in-latest-posix: ''
+ SEEK_END:
+ c-definition: '7.23.1'
+ in-latest-posix: ''
+ SEEK_SET:
+ c-definition: '7.23.1'
+ in-latest-posix: ''
+ TMP_MAX:
+ c-definition: '7.23.1'
+ in-latest-posix: ''
+ stderr:
+ c-definition: '7.23.1'
+ in-latest-posix: ''
+ stdin:
+ c-definition: '7.23.1'
+ in-latest-posix: ''
+ stdout:
+ c-definition: '7.23.1'
+ in-latest-posix: ''
+functions:
+ remove:
+ c-definition: '7.23.4.1'
+ in-latest-posix: ''
+ rename:
+ c-definition: '7.23.4.2'
+ in-latest-posix: ''
+ tmpfile:
+ c-definition: '7.23.4.3'
+ in-latest-posix: ''
+ tmpnam:
+ c-definition: '7.23.4.4'
+ in-latest-posix: ''
+ fclose:
+ c-definition: '7.23.5.1'
+ in-latest-posix: ''
+ fflush:
+ c-definition: '7.23.5.2'
+ in-latest-posix: ''
+ fopen:
+ c-definition: '7.23.5.3'
+ in-latest-posix: ''
+ freopen:
+ c-definition: '7.23.5.4'
+ in-latest-posix: ''
+ setbuf:
+ c-definition: '7.23.5.5'
+ in-latest-posix: ''
+ setvbuf:
+ c-definition: '7.23.5.6'
+ in-latest-posix: ''
+ fprintf:
+ c-definition: '7.23.6.1'
+ in-latest-posix: ''
+ fscanf:
+ c-definition: '7.23.6.2'
+ in-latest-posix: ''
+ printf:
+ c-definition: '7.23.6.3'
+ in-latest-posix: ''
+ scanf:
+ c-definition: '7.23.6.4'
+ in-latest-posix: ''
+ snprintf:
+ c-definition: '7.23.6.5'
+ in-latest-posix: ''
+ sprintf:
+ c-definition: '7.23.6.6'
+ in-latest-posix: ''
+ sscanf:
+ c-definition: '7.23.6.7'
+ in-latest-posix: ''
+ vfprintf:
+ c-definition: '7.23.6.8'
+ in-latest-posix: ''
+ vfscanf:
+ c-definition: '7.23.6.9'
+ in-latest-posix: ''
+ vprintf:
+ c-definition: '7.23.6.10'
+ in-latest-posix: ''
+ vscanf:
+ c-definition: '7.23.6.11'
+ in-latest-posix: ''
+ vsnprintf:
+ c-definition: '7.23.6.12'
+ in-latest-posix: ''
+ vsprintf:
+ c-definition: '7.23.6.13'
+ in-latest-posix: ''
+ vsscanf:
+ c-definition: '7.23.6.14'
+ in-latest-posix: ''
+ fgetc:
+ c-definition: '7.23.7.1'
+ in-latest-posix: ''
+ fgets:
+ c-definition: '7.23.7.2'
+ in-latest-posix: ''
+ fputc:
+ c-definition: '7.23.7.3'
+ in-latest-posix: ''
+ fputs:
+ c-definition: '7.23.7.4'
+ in-latest-posix: ''
+ getc:
+ c-definition: '7.23.7.5'
+ in-latest-posix: ''
+ getchar:
+ c-definition: '7.23.7.6'
+ in-latest-posix: ''
+ putc:
+ c-definition: '7.23.7.7'
+ in-latest-posix: ''
+ putchar:
+ c-definition: '7.23.7.8'
+ in-latest-posix: ''
+ puts:
+ c-definition: '7.23.7.9'
+ in-latest-posix: ''
+ ungetc:
+ c-definition: '7.23.7.10'
+ in-latest-posix: ''
+ fread:
+ c-definition: '7.23.8.1'
+ in-latest-posix: ''
+ fwrite:
+ c-definition: '7.23.8.2'
+ in-latest-posix: ''
+ fgetpos:
+ c-definition: '7.23.9.1'
+ in-latest-posix: ''
+ fseek:
+ c-definition: '7.23.9.2'
+ in-latest-posix: ''
+ fsetpos:
+ c-definition: '7.23.9.3'
+ in-latest-posix: ''
+ ftell:
+ c-definition: '7.23.9.4'
+ in-latest-posix: ''
+ rewind:
+ c-definition: '7.23.9.5'
+ in-latest-posix: ''
+ clearerr:
+ c-definition: '7.23.10.1'
+ in-latest-posix: ''
+ feof:
+ c-definition: '7.23.10.2'
+ in-latest-posix: ''
+ ferror:
+ c-definition: '7.23.10.3'
+ in-latest-posix: ''
+ perror:
+ c-definition: '7.23.10.4'
+ in-latest-posix: ''
+ ctermid:
+ in-latest-posix: ''
+ dprintf:
+ in-latest-posix: ''
+ fdopen:
+ in-latest-posix: ''
+ fileno:
+ in-latest-posix: ''
+ flockfile:
+ in-latest-posix: ''
+ fmemopen:
+ in-latest-posix: ''
+ fseeko:
+ in-latest-posix: ''
+ ftello:
+ in-latest-posix: ''
+ ftrylockfile:
+ in-latest-posix: ''
+ funlockfile:
+ in-latest-posix: ''
+ getdelim:
+ in-latest-posix: ''
+ getline:
+ in-latest-posix: ''
+ open_memstream:
+ in-latest-posix: ''
+ pclose:
+ in-latest-posix: ''
+ popen:
+ in-latest-posix: ''
+ putc_unlocked:
+ in-latest-posix: ''
+ putchar_unlocked:
+ in-latest-posix: ''
+ renameat:
+ in-latest-posix: ''
+ vdprintf:
+ in-latest-posix: ''
diff --git a/libc/utils/docgen/stdlib.yaml b/libc/utils/docgen/stdlib.yaml
new file mode 100644
index 000000000000..526ddefbe1ce
--- /dev/null
+++ b/libc/utils/docgen/stdlib.yaml
@@ -0,0 +1,158 @@
+functions:
+ _Exit:
+ c-definition: 7.24.4.5
+ in-latest-posix: ''
+ abort:
+ c-definition: 7.24.4.1
+ in-latest-posix: ''
+ abs:
+ c-definition: 7.24.6.1
+ in-latest-posix: ''
+ aligned_alloc:
+ c-definition: 7.24.3.1
+ in-latest-posix: ''
+ at_quick_exit:
+ c-definition: 7.24.4.3
+ in-latest-posix: ''
+ atexit:
+ c-definition: 7.24.4.2
+ in-latest-posix: ''
+ atof:
+ c-definition: 7.24.1.1
+ in-latest-posix: ''
+ atoi:
+ c-definition: 7.24.1.2
+ in-latest-posix: ''
+ atol:
+ c-definition: 7.24.1.2
+ in-latest-posix: ''
+ atoll:
+ c-definition: 7.24.1.2
+ in-latest-posix: ''
+ bsearch:
+ c-definition: 7.24.5.1
+ in-latest-posix: ''
+ calloc:
+ c-definition: 7.24.3.2
+ in-latest-posix: ''
+ div:
+ c-definition: 7.24.6.2
+ in-latest-posix: ''
+ exit:
+ c-definition: 7.24.4.4
+ in-latest-posix: ''
+ free:
+ c-definition: 7.24.3.3
+ in-latest-posix: ''
+ free_aligned_sized:
+ c-definition: 7.24.3.5
+ free_sized:
+ c-definition: 7.24.3.4
+ getenv:
+ c-definition: 7.24.4.6
+ in-latest-posix: ''
+ labs:
+ c-definition: 7.24.6.1
+ in-latest-posix: ''
+ ldiv:
+ c-definition: 7.24.6.2
+ in-latest-posix: ''
+ llabs:
+ c-definition: 7.24.6.1
+ in-latest-posix: ''
+ lldiv:
+ c-definition: 7.24.6.2
+ in-latest-posix: ''
+ malloc:
+ c-definition: 7.24.3.6
+ in-latest-posix: ''
+ mblen:
+ c-definition: 7.24.7.1
+ in-latest-posix: ''
+ mbstowcs:
+ c-definition: 7.24.8.1
+ in-latest-posix: ''
+ mbtowc:
+ c-definition: 7.24.7.2
+ in-latest-posix: ''
+ memalignment:
+ c-definition: 7.24.9.1
+ qsort:
+ c-definition: 7.24.5.2
+ in-latest-posix: ''
+ quick_exit:
+ c-definition: 7.24.4.7
+ in-latest-posix: ''
+ rand:
+ c-definition: 7.24.2.1
+ in-latest-posix: ''
+ realloc:
+ c-definition: 7.24.3.7
+ in-latest-posix: ''
+ srand:
+ c-definition: 7.24.2.2
+ in-latest-posix: ''
+ strfromd:
+ c-definition: 7.24.1.3
+ strfromd128:
+ c-definition: 7.24.1.4
+ strfromd32:
+ c-definition: 7.24.1.4
+ strfromd64:
+ c-definition: 7.24.1.4
+ strfromf:
+ c-definition: 7.24.1.3
+ strfroml:
+ c-definition: 7.24.1.3
+ strtod:
+ c-definition: 7.24.1.5
+ in-latest-posix: ''
+ strtod128:
+ c-definition: 7.24.1.6
+ strtod32:
+ c-definition: 7.24.1.6
+ strtod64:
+ c-definition: 7.24.1.6
+ strtof:
+ c-definition: 7.24.1.5
+ in-latest-posix: ''
+ strtol:
+ c-definition: 7.24.1.7
+ in-latest-posix: ''
+ strtold:
+ c-definition: 7.24.1.5
+ in-latest-posix: ''
+ strtoll:
+ c-definition: 7.24.1.7
+ in-latest-posix: ''
+ strtoul:
+ c-definition: 7.24.1.7
+ in-latest-posix: ''
+ strtoull:
+ c-definition: 7.24.1.7
+ in-latest-posix: ''
+ system:
+ c-definition: 7.24.4.8
+ in-latest-posix: ''
+ wcstombs:
+ c-definition: 7.24.8.2
+ in-latest-posix: ''
+ wctomb:
+ c-definition: 7.24.7.3
+ in-latest-posix: ''
+macros:
+ EXIT_FAILURE:
+ c-definition: '7.24'
+ in-latest-posix: ''
+ EXIT_SUCCESS:
+ c-definition: '7.24'
+ in-latest-posix: ''
+ MB_CUR_MAX:
+ c-definition: '7.24'
+ in-latest-posix: ''
+ RAND_MAX:
+ c-definition: '7.24'
+ in-latest-posix: ''
+ __STDC_VERSION_STDLIB_H__:
+ c-definition: '7.24'
+
diff --git a/libc/utils/docgen/string.yaml b/libc/utils/docgen/string.yaml
new file mode 100644
index 000000000000..d703a8e3593e
--- /dev/null
+++ b/libc/utils/docgen/string.yaml
@@ -0,0 +1,94 @@
+functions:
+ memccpy:
+ c-definition: 7.26.2.2
+ in-latest-posix: ''
+ memchr:
+ c-definition: 7.26.5.2
+ in-latest-posix: ''
+ memcmp:
+ c-definition: 7.26.4.1
+ in-latest-posix: ''
+ memcpy:
+ c-definition: 7.26.2.1
+ in-latest-posix: ''
+ memmove:
+ c-definition: 7.26.2.3
+ in-latest-posix: ''
+ mempcpy:
+ c-definition: 'TODO: glibc extension'
+ memset:
+ c-definition: 7.26.6.1
+ in-latest-posix: ''
+ memset_explicit:
+ c-definition: 7.26.6.2
+ stpcpy:
+ in-latest-posix: ''
+ stpncpy:
+ in-latest-posix: ''
+ strcat:
+ c-definition: 7.26.3.1
+ in-latest-posix: ''
+ strchr:
+ c-definition: 7.26.5.3
+ in-latest-posix: ''
+ strcmp:
+ c-definition: 7.26.4.2
+ in-latest-posix: ''
+ strcoll:
+ c-definition: 7.26.4.3
+ in-latest-posix: ''
+ strcoll_l:
+ in-latest-posix: ''
+ strcpy:
+ c-definition: 7.26.2.4
+ in-latest-posix: ''
+ strcspn:
+ c-definition: 7.26.5.4
+ in-latest-posix: ''
+ strdup:
+ c-definition: 7.26.2.6
+ in-latest-posix: ''
+ strerror:
+ c-definition: 7.26.6.3
+ in-latest-posix: ''
+ strlen:
+ c-definition: 7.26.6.4
+ in-latest-posix: ''
+ strncat:
+ c-definition: 7.26.3.2
+ in-latest-posix: ''
+ strncmp:
+ c-definition: 7.26.4.4
+ in-latest-posix: ''
+ strncpy:
+ c-definition: 7.26.2.5
+ in-latest-posix: ''
+ strndup:
+ c-definition: 7.26.2.7
+ in-latest-posix: ''
+ strpbrk:
+ c-definition: 7.26.5.5
+ in-latest-posix: ''
+ strrchr:
+ c-definition: 7.26.5.6
+ in-latest-posix: ''
+ strspn:
+ c-definition: 7.26.5.7
+ in-latest-posix: ''
+ strstr:
+ c-definition: 7.26.5.8
+ in-latest-posix: ''
+ strtok:
+ c-definition: 7.26.5.9
+ in-latest-posix: ''
+ strtok_r:
+ in-latest-posix: ''
+ strxfrm:
+ c-definition: 7.26.4.5
+ in-latest-posix: ''
+ strxfrm_l:
+ in-latest-posix: ''
+macros:
+ __STDC_VERSION_STRING_H__:
+ c-definition: 7.26.1
+
diff --git a/libc/utils/docgen/sys/mman.yaml b/libc/utils/docgen/sys/mman.yaml
new file mode 100644
index 000000000000..dba26cabc662
--- /dev/null
+++ b/libc/utils/docgen/sys/mman.yaml
@@ -0,0 +1,77 @@
+functions:
+ mlock:
+ posix-definition: ''
+ mlockall:
+ posix-definition: ''
+ mmap:
+ posix-definition: ''
+ mprotect:
+ posix-definition: ''
+ msync:
+ posix-definition: ''
+ munlock:
+ posix-definition: ''
+ munlockall:
+ posix-definition: ''
+ munmap:
+ posix-definition: ''
+ posix_madvise:
+ posix-definition: ''
+ posix_mem_offset:
+ posix-definition: ''
+ posix_typed_mem_get_info:
+ posix-definition: ''
+ posix_typed_mem_open:
+ posix-definition: ''
+ shm_open:
+ posix-definition: ''
+ shm_unlink:
+ posix-definition: ''
+macros:
+ MAP_ANON:
+ posix-definition: ''
+ MAP_ANONYMOUS:
+ posix-definition: ''
+ MAP_FAILED:
+ posix-definition: ''
+ MAP_FIXED:
+ posix-definition: ''
+ MAP_PRIVATE:
+ posix-definition: ''
+ MAP_SHARED:
+ posix-definition: ''
+ MCL_CURRENT:
+ posix-definition: ''
+ MCL_FUTURE:
+ posix-definition: ''
+ MS_ASYNC:
+ posix-definition: ''
+ MS_INVALIDATE:
+ posix-definition: ''
+ MS_SYNC:
+ posix-definition: ''
+ POSIX_MADV_DONTNEED:
+ posix-definition: ''
+ POSIX_MADV_NORMAL:
+ posix-definition: ''
+ POSIX_MADV_RANDOM:
+ posix-definition: ''
+ POSIX_MADV_SEQUENTIAL:
+ posix-definition: ''
+ POSIX_MADV_WILLNEED:
+ posix-definition: ''
+ POSIX_TYPED_MEM_ALLOCATE:
+ posix-definition: ''
+ POSIX_TYPED_MEM_ALLOCATE_CONTIG:
+ posix-definition: ''
+ POSIX_TYPED_MEM_MAP_ALLOCATABLE:
+ posix-definition: ''
+ PROT_EXEC:
+ posix-definition: ''
+ PROT_NONE:
+ posix-definition: ''
+ PROT_READ:
+ posix-definition: ''
+ PROT_WRITE:
+ posix-definition: ''
+
diff --git a/libc/utils/docgen/threads.json b/libc/utils/docgen/threads.json
deleted file mode 100644
index 8591cbde55a4..000000000000
--- a/libc/utils/docgen/threads.json
+++ /dev/null
@@ -1,87 +0,0 @@
-{
- "macros": {
- "ONCE_FLAG_INIT": {
- "c-definition": "7.28.1.3"
- },
- "TSS_DTOR_ITERATIONS": {
- "c-definition": "7.28.1.3"
- }
- },
- "functions": {
- "call_once": {
- "c-definition": "7.28.2.1"
- },
- "cnd_broadcast": {
- "c-definition": "7.28.3.1"
- },
- "cnd_destroy": {
- "c-definition": "7.28.3.2"
- },
- "cnd_init": {
- "c-definition": "7.28.3.3"
- },
- "cnd_signal": {
- "c-definition": "7.28.3.4"
- },
- "cnd_timedwait": {
- "c-definition": "7.28.3.5"
- },
- "cnd_wait": {
- "c-definition": "7.28.3.6"
- },
- "mtx_destroy": {
- "c-definition": "7.28.4.1"
- },
- "mtx_init": {
- "c-definition": "7.28.4.2"
- },
- "mtx_lock": {
- "c-definition": "7.28.4.3"
- },
- "mtx_timedlock": {
- "c-definition": "7.28.4.4"
- },
- "mtx_trylock": {
- "c-definition": "7.28.4.5"
- },
- "mtx_unlock": {
- "c-definition": "7.28.4.6"
- },
- "thrd_create": {
- "c-definition": "7.28.5.1"
- },
- "thrd_current": {
- "c-definition": "7.28.5.2"
- },
- "thrd_detach": {
- "c-definition": "7.28.5.3"
- },
- "thrd_equal": {
- "c-definition": "7.28.5.4"
- },
- "thrd_exit": {
- "c-definition": "7.28.5.5"
- },
- "thrd_join": {
- "c-definition": "7.28.5.6"
- },
- "thrd_sleep": {
- "c-definition": "7.28.5.7"
- },
- "thrd_yield": {
- "c-definition": "7.28.5.8"
- },
- "tss_create": {
- "c-definition": "7.28.6.1"
- },
- "tss_delete": {
- "c-definition": "7.28.6.2"
- },
- "tss_get": {
- "c-definition": "7.28.6.3"
- },
- "tss_set": {
- "c-definition": "7.28.6.4"
- }
- }
-}
diff --git a/libc/utils/docgen/threads.yaml b/libc/utils/docgen/threads.yaml
new file mode 100644
index 000000000000..83db0992dc45
--- /dev/null
+++ b/libc/utils/docgen/threads.yaml
@@ -0,0 +1,88 @@
+functions:
+ call_once:
+ c-definition: 7.28.2.1
+ in-latest-posix: ''
+ cnd_broadcast:
+ c-definition: 7.28.3.1
+ in-latest-posix: ''
+ cnd_destroy:
+ c-definition: 7.28.3.2
+ in-latest-posix: ''
+ cnd_init:
+ c-definition: 7.28.3.3
+ in-latest-posix: ''
+ cnd_signal:
+ c-definition: 7.28.3.4
+ in-latest-posix: ''
+ cnd_timedwait:
+ c-definition: 7.28.3.5
+ in-latest-posix: ''
+ cnd_wait:
+ c-definition: 7.28.3.6
+ in-latest-posix: ''
+ mtx_destroy:
+ c-definition: 7.28.4.2
+ in-latest-posix: ''
+ mtx_init:
+ c-definition: 7.28.4.3
+ in-latest-posix: ''
+ mtx_lock:
+ c-definition: 7.28.4.4
+ in-latest-posix: ''
+ mtx_timedlock:
+ c-definition: 7.28.4.5
+ in-latest-posix: ''
+ mtx_trylock:
+ c-definition: 7.28.4.6
+ in-latest-posix: ''
+ mtx_unlock:
+ c-definition: 7.28.4.7
+ in-latest-posix: ''
+ thrd_create:
+ c-definition: 7.28.5.1
+ in-latest-posix: ''
+ thrd_current:
+ c-definition: 7.28.5.2
+ in-latest-posix: ''
+ thrd_detach:
+ c-definition: 7.28.5.3
+ in-latest-posix: ''
+ thrd_equal:
+ c-definition: 7.28.5.4
+ in-latest-posix: ''
+ thrd_exit:
+ c-definition: 7.28.5.5
+ in-latest-posix: ''
+ thrd_join:
+ c-definition: 7.28.5.6
+ in-latest-posix: ''
+ thrd_sleep:
+ c-definition: 7.28.5.7
+ in-latest-posix: ''
+ thrd_yield:
+ c-definition: 7.28.5.8
+ in-latest-posix: ''
+ tss_create:
+ c-definition: 7.28.6.1
+ in-latest-posix: ''
+ tss_delete:
+ c-definition: 7.28.6.2
+ in-latest-posix: ''
+ tss_get:
+ c-definition: 7.28.6.3
+ in-latest-posix: ''
+ tss_set:
+ c-definition: 7.28.6.4
+ in-latest-posix: ''
+macros:
+ ONCE_FLAG_INIT:
+ c-definition: 7.28.1
+ in-latest-posix: ''
+ TSS_DTOR_ITERATIONS:
+ c-definition: 7.28.1
+ in-latest-posix: ''
+ __STDC_NO_THREADS__:
+ c-definition: 7.28.1
+ thread_local:
+ in-latest-posix: ''
+
diff --git a/libc/utils/docgen/uchar.yaml b/libc/utils/docgen/uchar.yaml
new file mode 100644
index 000000000000..580af0f54833
--- /dev/null
+++ b/libc/utils/docgen/uchar.yaml
@@ -0,0 +1,21 @@
+functions:
+ c16rtomb:
+ c-definition: 7.30.2.5
+ in-latest-posix: ''
+ c32rtomb:
+ c-definition: 7.30.2.7
+ in-latest-posix: ''
+ c8rtomb:
+ c-definition: 7.30.2.3
+ mbrtoc16:
+ c-definition: 7.30.2.4
+ in-latest-posix: ''
+ mbrtoc32:
+ c-definition: 7.30.2.6
+ in-latest-posix: ''
+ mbrtoc8:
+ c-definition: 7.30.2.2
+macros:
+ __STDC_VERSION_UCHAR_H__:
+ c-definition: 7.30.1
+
diff --git a/libc/utils/docgen/wchar.yaml b/libc/utils/docgen/wchar.yaml
new file mode 100644
index 000000000000..dcc8963efdd3
--- /dev/null
+++ b/libc/utils/docgen/wchar.yaml
@@ -0,0 +1,131 @@
+functions:
+ btowc:
+ c-definition: 7.31.6.2.1
+ fgetwc:
+ c-definition: 7.31.3.1
+ fgetws:
+ c-definition: 7.31.3.2
+ fputwc:
+ c-definition: 7.31.3.3
+ fputws:
+ c-definition: 7.31.3.4
+ fwide:
+ c-definition: 7.31.3.5
+ fwprintf:
+ c-definition: 7.31.2.2
+ fwscanf:
+ c-definition: 7.31.2.3
+ getwc:
+ c-definition: 7.31.3.6
+ getwchar:
+ c-definition: 7.31.3.7
+ mbrlen:
+ c-definition: 7.31.6.4.2
+ mbrtowc:
+ c-definition: 7.31.6.4.3
+ mbsinit:
+ c-definition: 7.31.6.3.1
+ mbsrtowcs:
+ c-definition: 7.31.6.5.2
+ putwc:
+ c-definition: 7.31.3.8
+ putwchar:
+ c-definition: 7.31.3.9
+ swprintf:
+ c-definition: 7.31.2.4
+ swscanf:
+ c-definition: 7.31.2.5
+ ungetwc:
+ c-definition: 7.31.3.10
+ vfwprintf:
+ c-definition: 7.31.2.6
+ vfwscanf:
+ c-definition: 7.31.2.7
+ vswprintf:
+ c-definition: 7.31.2.8
+ vswscanf:
+ c-definition: 7.31.2.9
+ vwprintf:
+ c-definition: 7.31.2.10
+ vwscanf:
+ c-definition: 7.31.2.11
+ wcrtomb:
+ c-definition: 7.31.6.4.4
+ wcscat:
+ c-definition: 7.31.4.4.1
+ wcschr:
+ c-definition: 7.31.4.6.2
+ wcscmp:
+ c-definition: 7.31.4.5.2
+ wcscoll:
+ c-definition: 7.31.4.5.3
+ wcscpy:
+ c-definition: 7.31.4.3.1
+ wcscspn:
+ c-definition: 7.31.4.6.3
+ wcsftime:
+ c-definition: 7.31.5.1
+ wcslen:
+ c-definition: 7.31.4.7.1
+ wcsncat:
+ c-definition: 7.31.4.4.2
+ wcsncmp:
+ c-definition: 7.31.4.5.4
+ wcsncpy:
+ c-definition: 7.31.4.3.2
+ wcspbrk:
+ c-definition: 7.31.4.6.4
+ wcsrchr:
+ c-definition: 7.31.4.6.5
+ wcsrtombs:
+ c-definition: 7.31.6.5.3
+ wcsspn:
+ c-definition: 7.31.4.6.6
+ wcsstr:
+ c-definition: 7.31.4.6.7
+ wcstod:
+ c-definition: 7.31.4.2.2
+ wcstod128:
+ c-definition: 7.31.4.2.3
+ wcstod32:
+ c-definition: 7.31.4.2.3
+ wcstod64:
+ c-definition: 7.31.4.2.3
+ wcstof:
+ c-definition: 7.31.4.2.2
+ wcstok:
+ c-definition: 7.31.4.6.8
+ wcstol:
+ c-definition: 7.31.4.2.4
+ wcstold:
+ c-definition: 7.31.4.2.2
+ wcstoll:
+ c-definition: 7.31.4.2.4
+ wcstoul:
+ c-definition: 7.31.4.2.4
+ wcstoull:
+ c-definition: 7.31.4.2.4
+ wcsxfrm:
+ c-definition: 7.31.4.5.5
+ wctob:
+ c-definition: 7.31.6.2.2
+ wmemchr:
+ c-definition: 7.31.4.6.9
+ wmemcmp:
+ c-definition: 7.31.4.5.6
+ wmemcpy:
+ c-definition: 7.31.4.3.3
+ wmemmove:
+ c-definition: 7.31.4.3.4
+ wmemset:
+ c-definition: 7.31.4.7.2
+ wprintf:
+ c-definition: 7.31.2.12
+ wscanf:
+ c-definition: 7.31.2.13
+macros:
+ WEOF:
+ c-definition: 7.31.1
+ __STDC_VERSION_WCHAR_H__:
+ c-definition: 7.31.1
+
diff --git a/libc/utils/docgen/wctype.yaml b/libc/utils/docgen/wctype.yaml
new file mode 100644
index 000000000000..8675cbe500da
--- /dev/null
+++ b/libc/utils/docgen/wctype.yaml
@@ -0,0 +1,36 @@
+functions:
+ iswalnum:
+ c-definition: 7.32.2.1.1
+ iswalpha:
+ c-definition: 7.32.2.1.2
+ iswblank:
+ c-definition: 7.32.2.1.4
+ iswctype:
+ c-definition: 7.32.2.2.1
+ iswdigit:
+ c-definition: 7.32.2.1.5
+ iswgraph:
+ c-definition: 7.32.2.1.6
+ iswlower:
+ c-definition: 7.32.2.1.7
+ iswprint:
+ c-definition: 7.32.2.1.8
+ iswpunct:
+ c-definition: 7.32.2.1.9
+ iswspace:
+ c-definition: 7.32.2.1.10
+ iswupper:
+ c-definition: 7.32.2.1.11
+ iswxdigit:
+ c-definition: 7.32.2.1.12
+ towctrans:
+ c-definition: 7.32.3.2.1
+ towlower:
+ c-definition: 7.32.3.1.1
+ towupper:
+ c-definition: 7.32.3.1.2
+ wctrans:
+ c-definition: 7.32.3.2.2
+ wctype:
+ c-definition: 7.32.2.2.2
+
diff --git a/libc/utils/gpu/loader/Loader.h b/libc/utils/gpu/loader/Loader.h
index 0d683832855e..8e86f6396932 100644
--- a/libc/utils/gpu/loader/Loader.h
+++ b/libc/utils/gpu/loader/Loader.h
@@ -113,7 +113,7 @@ inline uint32_t handle_server(rpc::Server &server, uint32_t index,
return 0;
index = port->get_index() + 1;
- int status = rpc::SUCCESS;
+ int status = rpc::RPC_SUCCESS;
switch (port->get_opcode()) {
case RPC_TEST_INCREMENT: {
port->recv_and_send([](rpc::Buffer *buffer, uint32_t) {
@@ -186,7 +186,7 @@ inline uint32_t handle_server(rpc::Server &server, uint32_t index,
}
// Handle all of the `libc` specific opcodes.
- if (status != rpc::SUCCESS)
+ if (status != rpc::RPC_SUCCESS)
handle_error("Error handling RPC server");
port->close();
diff --git a/libc/utils/gpu/server/CMakeLists.txt b/libc/utils/gpu/server/CMakeLists.txt
index b1cada44cd32..a109d603318b 100644
--- a/libc/utils/gpu/server/CMakeLists.txt
+++ b/libc/utils/gpu/server/CMakeLists.txt
@@ -23,6 +23,11 @@ target_compile_definitions(llvmlibc_rpc_server PUBLIC
LIBC_NAMESPACE=${LIBC_NAMESPACE})
# Install the server and associated header.
+install(FILES ${LIBC_SOURCE_DIR}/shared/rpc.h
+ ${LIBC_SOURCE_DIR}/shared/rpc_util.h
+ ${LIBC_SOURCE_DIR}/shared/rpc_opcodes.h
+ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/shared
+ COMPONENT libc-headers)
install(TARGETS llvmlibc_rpc_server
ARCHIVE DESTINATION "lib${LLVM_LIBDIR_SUFFIX}"
COMPONENT libc)
diff --git a/libc/utils/gpu/server/rpc_server.cpp b/libc/utils/gpu/server/rpc_server.cpp
index f724c5c82c42..1faee531fa20 100644
--- a/libc/utils/gpu/server/rpc_server.cpp
+++ b/libc/utils/gpu/server/rpc_server.cpp
@@ -437,10 +437,10 @@ rpc::Status handle_port_impl(rpc::Server::Port &port) {
break;
}
default:
- return rpc::UNHANDLED_OPCODE;
+ return rpc::RPC_UNHANDLED_OPCODE;
}
- return rpc::SUCCESS;
+ return rpc::RPC_SUCCESS;
}
namespace rpc {
@@ -455,7 +455,7 @@ rpc::Status handle_libc_opcodes(rpc::Server::Port &port, uint32_t num_lanes) {
case 64:
return handle_port_impl<64>(port);
default:
- return rpc::ERROR;
+ return rpc::RPC_ERROR;
}
}
} // namespace rpc
diff --git a/libc/hdrgen/CMakeLists.txt b/libc/utils/hdrgen/CMakeLists.txt
index 8ebde4e3e458..c6827da21505 100644
--- a/libc/hdrgen/CMakeLists.txt
+++ b/libc/utils/hdrgen/CMakeLists.txt
@@ -1,12 +1,12 @@
if(LLVM_LIBC_FULL_BUILD)
enable_testing()
- set(NEWHDGEN_TESTS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/tests)
+ set(HDRGEN_TESTS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/tests)
set(TEST_OUTPUT_DIR ${CMAKE_BINARY_DIR}/hdrgen/output)
add_test(
NAME hdrgen_integration_test
- COMMAND python3 ${NEWHDGEN_TESTS_DIR}/test_integration.py --output_dir ${TEST_OUTPUT_DIR}
+ COMMAND python3 ${HDRGEN_TESTS_DIR}/test_integration.py --output_dir ${TEST_OUTPUT_DIR}
)
add_custom_target(check-hdrgen
diff --git a/libc/utils/hdrgen/README.rst b/libc/utils/hdrgen/README.rst
new file mode 100644
index 000000000000..d16e6c5ccaec
--- /dev/null
+++ b/libc/utils/hdrgen/README.rst
@@ -0,0 +1,5 @@
+This directory contains the sources and specifications for the types,
+macros and entrypoint functions. These definitions are organized in the
+``yaml`` subdirectory and match the organization of the ``*.h.def``
+files. This directory also contains the Python sources for hdrgen, which is
+what generates the headers.
diff --git a/libc/hdrgen/class_implementation/classes/enumeration.py b/libc/utils/hdrgen/enumeration.py
index b9848c04ee63..b9848c04ee63 100644
--- a/libc/hdrgen/class_implementation/classes/enumeration.py
+++ b/libc/utils/hdrgen/enumeration.py
diff --git a/libc/hdrgen/class_implementation/classes/function.py b/libc/utils/hdrgen/function.py
index d97df7f8a50e..d97df7f8a50e 100644
--- a/libc/hdrgen/class_implementation/classes/function.py
+++ b/libc/utils/hdrgen/function.py
diff --git a/libc/hdrgen/gpu_headers.py b/libc/utils/hdrgen/gpu_headers.py
index b26b3a88557b..8c4ff6e08b11 100644
--- a/libc/hdrgen/gpu_headers.py
+++ b/libc/utils/hdrgen/gpu_headers.py
@@ -6,31 +6,9 @@
#
# ==-------------------------------------------------------------------------==#
+from header import HeaderFile
-class GpuHeaderFile:
- def __init__(self, name):
- self.name = name
- self.macros = []
- self.types = []
- self.enumerations = []
- self.objects = []
- self.functions = []
-
- def add_macro(self, macro):
- self.macros.append(macro)
-
- def add_type(self, type_):
- self.types.append(type_)
-
- def add_enumeration(self, enumeration):
- self.enumerations.append(enumeration)
-
- def add_object(self, object):
- self.objects.append(object)
-
- def add_function(self, function):
- self.functions.append(function)
-
+class GpuHeaderFile(HeaderFile):
def __str__(self):
content = []
diff --git a/libc/hdrgen/header.py b/libc/utils/hdrgen/header.py
index df8ce613bd0f..df8ce613bd0f 100644
--- a/libc/hdrgen/header.py
+++ b/libc/utils/hdrgen/header.py
diff --git a/libc/hdrgen/class_implementation/classes/macro.py b/libc/utils/hdrgen/macro.py
index 9a712f2a1c74..9a712f2a1c74 100644
--- a/libc/hdrgen/class_implementation/classes/macro.py
+++ b/libc/utils/hdrgen/macro.py
diff --git a/libc/hdrgen/class_implementation/classes/object.py b/libc/utils/hdrgen/object.py
index f5214452f034..f5214452f034 100644
--- a/libc/hdrgen/class_implementation/classes/object.py
+++ b/libc/utils/hdrgen/object.py
diff --git a/libc/hdrgen/tests/expected_output/test_header.h b/libc/utils/hdrgen/tests/expected_output/test_header.h
index a777976134b0..a777976134b0 100644
--- a/libc/hdrgen/tests/expected_output/test_header.h
+++ b/libc/utils/hdrgen/tests/expected_output/test_header.h
diff --git a/libc/hdrgen/tests/input/test_small.h.def b/libc/utils/hdrgen/tests/input/test_small.h.def
index 075be957b813..075be957b813 100644
--- a/libc/hdrgen/tests/input/test_small.h.def
+++ b/libc/utils/hdrgen/tests/input/test_small.h.def
diff --git a/libc/hdrgen/tests/input/test_small.yaml b/libc/utils/hdrgen/tests/input/test_small.yaml
index 772552faf81d..772552faf81d 100644
--- a/libc/hdrgen/tests/input/test_small.yaml
+++ b/libc/utils/hdrgen/tests/input/test_small.yaml
diff --git a/libc/hdrgen/tests/test_integration.py b/libc/utils/hdrgen/tests/test_integration.py
index 8ea6d8a70807..ce80026e7bcc 100644
--- a/libc/hdrgen/tests/test_integration.py
+++ b/libc/utils/hdrgen/tests/test_integration.py
@@ -9,19 +9,19 @@ import sys
class TestHeaderGenIntegration(unittest.TestCase):
def setUp(self):
self.output_dir = Path(
- args.output_dir if args.output_dir else "libc/hdrgen/tests/output"
+ args.output_dir if args.output_dir else "libc/utils/hdrgen/tests/output"
)
self.maxDiff = None
- self.source_dir = Path(__file__).resolve().parent.parent.parent.parent
+ self.source_dir = Path(__file__).resolve().parent.parent.parent.parent.parent
def run_script(self, yaml_file, h_def_file, output_dir, entry_points):
yaml_file = self.source_dir / yaml_file
h_def_file = self.source_dir / h_def_file
command = [
"python3",
- str(self.source_dir / "libc/hdrgen/yaml_to_classes.py"),
+ str(self.source_dir / "libc/utils/hdrgen/yaml_to_classes.py"),
str(yaml_file),
"--h_def_file",
str(h_def_file),
@@ -51,10 +51,10 @@ class TestHeaderGenIntegration(unittest.TestCase):
self.assertEqual(gen_content, exp_content)
def test_generate_header(self):
- yaml_file = "libc/hdrgen/tests/input/test_small.yaml"
- h_def_file = "libc/hdrgen/tests/input/test_small.h.def"
+ yaml_file = "libc/utils/hdrgen/tests/input/test_small.yaml"
+ h_def_file = "libc/utils/hdrgen/tests/input/test_small.h.def"
expected_output_file = (
- self.source_dir / "libc/hdrgen/tests/expected_output/test_header.h"
+ self.source_dir / "libc/utils/hdrgen/tests/expected_output/test_header.h"
)
output_file = self.output_dir / "test_small.h"
entry_points = {"func_b", "func_a", "func_c", "func_d", "func_e"}
diff --git a/libc/hdrgen/class_implementation/classes/type.py b/libc/utils/hdrgen/type.py
index 4ebf8034a454..4ebf8034a454 100644
--- a/libc/hdrgen/class_implementation/classes/type.py
+++ b/libc/utils/hdrgen/type.py
diff --git a/libc/hdrgen/yaml_functions_sorted.py b/libc/utils/hdrgen/yaml_functions_sorted.py
index b960ecaf973f..b960ecaf973f 100644
--- a/libc/hdrgen/yaml_functions_sorted.py
+++ b/libc/utils/hdrgen/yaml_functions_sorted.py
diff --git a/libc/hdrgen/yaml_to_classes.py b/libc/utils/hdrgen/yaml_to_classes.py
index 0e8ca2d8a82b..ec2441b78aee 100644
--- a/libc/hdrgen/yaml_to_classes.py
+++ b/libc/utils/hdrgen/yaml_to_classes.py
@@ -11,13 +11,14 @@
import yaml
import argparse
from pathlib import Path
-from header import HeaderFile
+
+from enumeration import Enumeration
+from function import Function
from gpu_headers import GpuHeaderFile as GpuHeader
-from class_implementation.classes.macro import Macro
-from class_implementation.classes.type import Type
-from class_implementation.classes.function import Function
-from class_implementation.classes.enumeration import Enumeration
-from class_implementation.classes.object import Object
+from header import HeaderFile
+from macro import Macro
+from object import Object
+from type import Type
def yaml_to_classes(yaml_data, header_class, entry_points=None):