From eaa26a34bd3c4099d452f5b86b087241333dcb5d Mon Sep 17 00:00:00 2001 From: Jaekyu Park Date: Fri, 27 May 2016 17:11:56 +0900 Subject: [PATCH] Tizen 2.4 SDK Rev6 Release --- .gitignore | 38 +- ChangeLog | 43 + ChangeLog.eglibc | 34 + Makeconfig | 16 +- Makerules | 42 + NEWS | 4 +- Versions.def | 4 + assert/assert.h | 3 + bits/in.h | 16 +- bits/ioctl-types.h | 2 +- bits/libc-lock.h | 3 + bits/sched.h | 87 +- bits/sigaction.h | 4 +- bits/stdio-lock.h | 17 +- catgets/catgets.c | 2 +- catgets/open_catalog.c | 2 +- config.make.in | 5 + configure | 5 + configure.in | 5 + csu/libc-start.c | 18 + dlfcn/Makefile | 3 +- eglibc-common.manifest | 22 - eglibc.manifest | 12 +- elf/Makefile | 33 +- elf/cache.c | 5 + elf/dl-altinit.c | 43 + elf/dl-cache.c | 6 + elf/dl-close.c | 7 + elf/dl-deps.c | 93 +- elf/dl-fini.c | 10 +- elf/dl-fptr.c | 18 +- elf/dl-load.c | 391 +- elf/dl-lookup.c | 49 +- elf/dl-open.c | 186 +- elf/dl-runtime.c | 9 +- elf/dl-support.c | 7 + elf/dl-sym.c | 4 +- elf/dl-sysdep.c | 21 +- elf/dl-tls.c | 3 - elf/elf.h | 3 +- elf/ldconfig.c | 61 +- elf/ldd.bash.in | 20 +- elf/rtld.c | 42 +- elf/stackguard-macros.h | 65 + elf/tst-audit4.c | 22 +- elf/tst-audit6.c | 30 +- elf/tst-ptrguard1-static.c | 1 + elf/tst-ptrguard1.c | 202 + elf/tst-stackguard1.c | 8 +- elf/tst-tls19.c | 27 + elf/tst-tls19mod1.c | 15 + elf/tst-tls19mod2.c | 13 + elf/tst-tls19mod3.c | 16 + hurd/Makefile | 7 +- hurd/Versions | 12 + hurd/catch-signal.c | 13 +- hurd/ctty-input.c | 18 +- hurd/ctty-output.c | 18 +- hurd/hurd.h | 18 +- hurd/hurd/fd.h | 28 +- hurd/hurd/port.h | 31 + hurd/hurd/signal.h | 61 +- hurd/hurd/threadvar.h | 5 + hurd/hurd/userlink.h | 14 + hurd/hurdchdir.c | 5 +- hurd/hurdexec.c | 61 +- hurd/hurdfault.c | 2 + hurd/hurdinit.c | 2 +- hurd/hurdmsg.c | 27 +- hurd/hurdselect.c | 35 +- hurd/hurdsig.c | 519 +- hurd/hurdsock.c | 8 +- hurd/intern-fd.c | 4 +- hurd/lookup-retry.c | 9 +- hurd/port2fd.c | 4 +- hurd/sysvshm.c | 96 + hurd/sysvshm.h | 47 + hurd/thread-cancel.c | 1 - iconv/gconv_trans.c | 177 +- iconvdata/Makefile | 1 + iconvdata/ibm1364.c | 3 +- iconvdata/ibm930.c | 5 +- iconvdata/ibm932.c | 5 +- iconvdata/ibm933.c | 2 +- iconvdata/ibm935.c | 2 +- iconvdata/ibm937.c | 2 +- iconvdata/ibm939.c | 2 +- iconvdata/ibm943.c | 5 +- iconvdata/run-iconv-test.sh | 18 + include/alloca.h | 19 +- include/atomic.h | 26 +- include/errno.h | 2 +- include/libc-symbols.h | 6 +- include/string.h | 1 + include/stubs-prologue.h | 2 +- include/unistd.h | 7 +- intl/locale.alias | 10 +- io/fcntl.h | 14 - libio/fileops.c | 32 +- libio/stdio.h | 4 +- libio/wstrops.c | 8 +- libpthread/.cvsignore | 1 + libpthread/ChangeLog | 6 + libpthread/Makeconfig | 12 + libpthread/Makefile | 336 + libpthread/Makefile.am | 168 + libpthread/TODO | 177 + libpthread/Versions | 135 + libpthread/configure | 2 + libpthread/configure.in | 4 + libpthread/forward.c | 127 + libpthread/headers.m4 | 45 + libpthread/include/pthread.h | 7 + libpthread/include/pthread/pthread.h | 755 + libpthread/include/pthread/pthreadtypes.h | 125 + libpthread/include/semaphore.h | 69 + libpthread/libc_pthread_init.c | 34 + libpthread/libpthread.a | 20 + libpthread/libpthread_pic.a | 20 + libpthread/lockfile.c | 65 + libpthread/not-in-libc.h | 11 + libpthread/pthread/Versions | 15 + libpthread/pthread/cthreads-compat.c | 107 + libpthread/pthread/pt-alloc.c | 215 + libpthread/pthread/pt-cancel.c | 40 + libpthread/pthread/pt-cleanup.c | 28 + libpthread/pthread/pt-create.c | 217 + libpthread/pthread/pt-dealloc.c | 64 + libpthread/pthread/pt-detach.c | 92 + libpthread/pthread/pt-exit.c | 124 + libpthread/pthread/pt-getattr.c | 49 + libpthread/pthread/pt-initialize.c | 78 + libpthread/pthread/pt-internal.h | 321 + libpthread/pthread/pt-join.c | 88 + libpthread/pthread/pt-self.c | 34 + libpthread/pthread/pt-setcancelstate.c | 45 + libpthread/pthread/pt-setcanceltype.c | 45 + libpthread/pthread/pt-sigmask.c | 33 + libpthread/pthread/pt-spin-inlines.c | 34 + libpthread/pthread/pt-testcancel.c | 31 + libpthread/pthread/pt-yield.c | 26 + libpthread/pthread/pthread-functions.h | 116 + libpthread/shlib-versions | 1 + libpthread/sysdeps/generic/bits/barrier-attr.h | 32 + libpthread/sysdeps/generic/bits/barrier.h | 39 + libpthread/sysdeps/generic/bits/cancelation.h | 51 + libpthread/sysdeps/generic/bits/condition-attr.h | 34 + libpthread/sysdeps/generic/bits/condition.h | 39 + libpthread/sysdeps/generic/bits/mutex-attr.h | 41 + libpthread/sysdeps/generic/bits/mutex.h | 75 + libpthread/sysdeps/generic/bits/once.h | 34 + libpthread/sysdeps/generic/bits/pthread-np.h | 27 + libpthread/sysdeps/generic/bits/pthread.h | 38 + libpthread/sysdeps/generic/bits/pthreadtypes.h | 29 + libpthread/sysdeps/generic/bits/rwlock-attr.h | 32 + libpthread/sysdeps/generic/bits/rwlock.h | 46 + libpthread/sysdeps/generic/bits/semaphore.h | 43 + libpthread/sysdeps/generic/bits/thread-attr.h | 44 + libpthread/sysdeps/generic/bits/thread-specific.h | 25 + libpthread/sysdeps/generic/killpg.c | 27 + libpthread/sysdeps/generic/pt-atfork.c | 31 + libpthread/sysdeps/generic/pt-attr-destroy.c | 28 + .../sysdeps/generic/pt-attr-getdetachstate.c | 31 + libpthread/sysdeps/generic/pt-attr-getguardsize.c | 29 + .../sysdeps/generic/pt-attr-getinheritsched.c | 31 + libpthread/sysdeps/generic/pt-attr-getschedparam.c | 34 + .../sysdeps/generic/pt-attr-getschedpolicy.c | 31 + libpthread/sysdeps/generic/pt-attr-getscope.c | 31 + libpthread/sysdeps/generic/pt-attr-getstack.c | 31 + libpthread/sysdeps/generic/pt-attr-getstackaddr.c | 29 + libpthread/sysdeps/generic/pt-attr-getstacksize.c | 29 + libpthread/sysdeps/generic/pt-attr-init.c | 29 + .../sysdeps/generic/pt-attr-setdetachstate.c | 40 + libpthread/sysdeps/generic/pt-attr-setguardsize.c | 29 + .../sysdeps/generic/pt-attr-setinheritsched.c | 40 + libpthread/sysdeps/generic/pt-attr-setschedparam.c | 40 + .../sysdeps/generic/pt-attr-setschedpolicy.c | 44 + libpthread/sysdeps/generic/pt-attr-setscope.c | 43 + libpthread/sysdeps/generic/pt-attr-setstack.c | 51 + libpthread/sysdeps/generic/pt-attr-setstackaddr.c | 29 + libpthread/sysdeps/generic/pt-attr-setstacksize.c | 41 + libpthread/sysdeps/generic/pt-attr.c | 42 + libpthread/sysdeps/generic/pt-barrier-destroy.c | 27 + libpthread/sysdeps/generic/pt-barrier-init.c | 53 + libpthread/sysdeps/generic/pt-barrier-wait.c | 61 + libpthread/sysdeps/generic/pt-barrier.c | 26 + .../sysdeps/generic/pt-barrierattr-destroy.c | 27 + .../sysdeps/generic/pt-barrierattr-getpshared.c | 29 + libpthread/sysdeps/generic/pt-barrierattr-init.c | 28 + .../sysdeps/generic/pt-barrierattr-setpshared.c | 39 + libpthread/sysdeps/generic/pt-cond-brdcast.c | 44 + libpthread/sysdeps/generic/pt-cond-destroy.c | 29 + libpthread/sysdeps/generic/pt-cond-init.c | 47 + libpthread/sysdeps/generic/pt-cond-signal.c | 56 + libpthread/sysdeps/generic/pt-cond-timedwait.c | 111 + libpthread/sysdeps/generic/pt-cond-wait.c | 39 + libpthread/sysdeps/generic/pt-cond.c | 29 + libpthread/sysdeps/generic/pt-condattr-destroy.c | 29 + libpthread/sysdeps/generic/pt-condattr-getclock.c | 31 + .../sysdeps/generic/pt-condattr-getpshared.c | 29 + libpthread/sysdeps/generic/pt-condattr-init.c | 30 + libpthread/sysdeps/generic/pt-condattr-setclock.c | 33 + .../sysdeps/generic/pt-condattr-setpshared.c | 39 + libpthread/sysdeps/generic/pt-destroy-specific.c | 28 + libpthread/sysdeps/generic/pt-equal.c | 31 + libpthread/sysdeps/generic/pt-getconcurrency.c | 27 + libpthread/sysdeps/generic/pt-getcpuclockid.c | 35 + libpthread/sysdeps/generic/pt-getschedparam.c | 31 + libpthread/sysdeps/generic/pt-getspecific.c | 27 + libpthread/sysdeps/generic/pt-init-specific.c | 27 + libpthread/sysdeps/generic/pt-key-create.c | 29 + libpthread/sysdeps/generic/pt-key-delete.c | 29 + libpthread/sysdeps/generic/pt-key.h | 22 + libpthread/sysdeps/generic/pt-kill.c | 32 + libpthread/sysdeps/generic/pt-mutex-destroy.c | 39 + .../sysdeps/generic/pt-mutex-getprioceiling.c | 30 + libpthread/sysdeps/generic/pt-mutex-init.c | 50 + libpthread/sysdeps/generic/pt-mutex-lock.c | 37 + .../sysdeps/generic/pt-mutex-setprioceiling.c | 30 + libpthread/sysdeps/generic/pt-mutex-timedlock.c | 187 + libpthread/sysdeps/generic/pt-mutex-transfer-np.c | 66 + libpthread/sysdeps/generic/pt-mutex-trylock.c | 112 + libpthread/sysdeps/generic/pt-mutex-unlock.c | 108 + libpthread/sysdeps/generic/pt-mutexattr-destroy.c | 27 + .../sysdeps/generic/pt-mutexattr-getprioceiling.c | 30 + .../sysdeps/generic/pt-mutexattr-getprotocol.c | 29 + .../sysdeps/generic/pt-mutexattr-getpshared.c | 29 + libpthread/sysdeps/generic/pt-mutexattr-gettype.c | 28 + libpthread/sysdeps/generic/pt-mutexattr-init.c | 28 + .../sysdeps/generic/pt-mutexattr-setprioceiling.c | 30 + .../sysdeps/generic/pt-mutexattr-setprotocol.c | 42 + .../sysdeps/generic/pt-mutexattr-setpshared.c | 39 + libpthread/sysdeps/generic/pt-mutexattr-settype.c | 37 + libpthread/sysdeps/generic/pt-mutexattr.c | 45 + libpthread/sysdeps/generic/pt-once.c | 43 + libpthread/sysdeps/generic/pt-rwlock-attr.c | 26 + libpthread/sysdeps/generic/pt-rwlock-destroy.c | 29 + libpthread/sysdeps/generic/pt-rwlock-init.c | 45 + libpthread/sysdeps/generic/pt-rwlock-rdlock.c | 32 + libpthread/sysdeps/generic/pt-rwlock-timedrdlock.c | 113 + libpthread/sysdeps/generic/pt-rwlock-timedwrlock.c | 95 + libpthread/sysdeps/generic/pt-rwlock-tryrdlock.c | 56 + libpthread/sysdeps/generic/pt-rwlock-trywrlock.c | 46 + libpthread/sysdeps/generic/pt-rwlock-unlock.c | 90 + libpthread/sysdeps/generic/pt-rwlock-wrlock.c | 34 + libpthread/sysdeps/generic/pt-rwlockattr-destroy.c | 27 + .../sysdeps/generic/pt-rwlockattr-getpshared.c | 29 + libpthread/sysdeps/generic/pt-rwlockattr-init.c | 28 + .../sysdeps/generic/pt-rwlockattr-setpshared.c | 39 + libpthread/sysdeps/generic/pt-setconcurrency.c | 34 + libpthread/sysdeps/generic/pt-setschedparam.c | 31 + libpthread/sysdeps/generic/pt-setschedprio.c | 29 + libpthread/sysdeps/generic/pt-setspecific.c | 27 + libpthread/sysdeps/generic/pt-startup.c | 25 + libpthread/sysdeps/generic/raise.c | 41 + libpthread/sysdeps/generic/sem-close.c | 32 + libpthread/sysdeps/generic/sem-destroy.c | 38 + libpthread/sysdeps/generic/sem-getvalue.c | 33 + libpthread/sysdeps/generic/sem-init.c | 46 + libpthread/sysdeps/generic/sem-open.c | 32 + libpthread/sysdeps/generic/sem-post.c | 62 + libpthread/sysdeps/generic/sem-timedwait.c | 91 + libpthread/sysdeps/generic/sem-trywait.c | 42 + libpthread/sysdeps/generic/sem-unlink.c | 32 + libpthread/sysdeps/generic/sem-wait.c | 32 + libpthread/sysdeps/generic/sigaddset.c | 35 + libpthread/sysdeps/generic/sigdelset.c | 35 + libpthread/sysdeps/generic/sigemptyset.c | 29 + libpthread/sysdeps/generic/sigfillset.c | 29 + libpthread/sysdeps/generic/siginterrupt.c | 36 + libpthread/sysdeps/generic/sigismember.c | 36 + libpthread/sysdeps/generic/signal.c | 44 + libpthread/sysdeps/generic/sigwait.c | 34 + libpthread/sysdeps/hurd/pt-destroy-specific.c | 79 + libpthread/sysdeps/hurd/pt-getspecific.c | 39 + libpthread/sysdeps/hurd/pt-init-specific.c | 30 + libpthread/sysdeps/hurd/pt-key-create.c | 109 + libpthread/sysdeps/hurd/pt-key-delete.c | 64 + libpthread/sysdeps/hurd/pt-key.h | 76 + libpthread/sysdeps/hurd/pt-kill.c | 52 + libpthread/sysdeps/hurd/pt-setspecific.c | 47 + libpthread/sysdeps/i386/Implies | 1 + libpthread/sysdeps/ia32/bits/memory.h | 40 + libpthread/sysdeps/ia32/bits/pt-atomic.h | 66 + libpthread/sysdeps/ia32/bits/spin-lock-inline.h | 98 + libpthread/sysdeps/ia32/bits/spin-lock.h | 39 + .../fork.S => libpthread/sysdeps/ia32/machine-sp.h | 22 +- libpthread/sysdeps/ia32/pt-machdep.h | 29 + libpthread/sysdeps/l4/bits/pthread-np.h | 35 + libpthread/sysdeps/l4/hurd/bits/pthread-np.h | 31 + libpthread/sysdeps/l4/hurd/ia32/pt-machdep.c | 20 + libpthread/sysdeps/l4/hurd/ia32/pt-setup.c | 117 + .../l4/hurd/ia32/signal-dispatch-lowlevel.c | 213 + libpthread/sysdeps/l4/hurd/powerpc/pt-machdep.c | 20 + libpthread/sysdeps/l4/hurd/powerpc/pt-setup.c | 93 + libpthread/sysdeps/l4/hurd/pt-block.c | 30 + libpthread/sysdeps/l4/hurd/pt-kill.c | 3 + libpthread/sysdeps/l4/hurd/pt-setactivity-np.c | 39 + libpthread/sysdeps/l4/hurd/pt-sigstate-destroy.c | 28 + libpthread/sysdeps/l4/hurd/pt-sigstate-init.c | 44 + libpthread/sysdeps/l4/hurd/pt-sigstate.c | 81 + libpthread/sysdeps/l4/hurd/pt-startup.c | 30 + libpthread/sysdeps/l4/hurd/pt-sysdep.c | 61 + libpthread/sysdeps/l4/hurd/pt-sysdep.h | 61 + libpthread/sysdeps/l4/hurd/pt-thread-alloc.c | 95 + libpthread/sysdeps/l4/hurd/pt-thread-halt.c | 104 + libpthread/sysdeps/l4/hurd/pt-thread-start.c | 70 + libpthread/sysdeps/l4/hurd/pt-wakeup.c | 46 + libpthread/sysdeps/l4/hurd/sig-sysdep.h | 69 + libpthread/sysdeps/l4/hurd/sigprocmask.c | 41 + libpthread/sysdeps/l4/pt-block.c | 47 + libpthread/sysdeps/l4/pt-docancel.c | 42 + libpthread/sysdeps/l4/pt-pool-np.c | 54 + libpthread/sysdeps/l4/pt-spin.c | 63 + libpthread/sysdeps/l4/pt-stack-alloc.c | 43 + libpthread/sysdeps/l4/pt-thread-alloc.c | 43 + libpthread/sysdeps/l4/pt-thread-dealloc.c | 32 + libpthread/sysdeps/l4/pt-thread-halt.c | 45 + libpthread/sysdeps/l4/pt-thread-start.c | 40 + libpthread/sysdeps/l4/pt-timedblock.c | 36 + libpthread/sysdeps/l4/pt-wakeup.c | 54 + libpthread/sysdeps/mach/bits/spin-lock-inline.h | 90 + .../sysdeps/mach/bits/spin-lock.h | 29 +- libpthread/sysdeps/mach/hurd/Implies | 1 + libpthread/sysdeps/mach/hurd/bits/pthread-np.h | 32 + libpthread/sysdeps/mach/hurd/i386/Implies | 1 + libpthread/sysdeps/mach/hurd/ia32/pt-machdep.c | 83 + libpthread/sysdeps/mach/hurd/ia32/pt-setup.c | 108 + .../sysdeps/mach/hurd/pt-attr-setstackaddr.c | 35 + .../sysdeps/mach/hurd/pt-attr-setstacksize.c | 35 + libpthread/sysdeps/mach/hurd/pt-docancel.c | 64 + libpthread/sysdeps/mach/hurd/pt-hurd-cond-wait.c | 93 + libpthread/sysdeps/mach/hurd/pt-init-specific.c | 29 + libpthread/sysdeps/mach/hurd/pt-sigstate-destroy.c | 28 + libpthread/sysdeps/mach/hurd/pt-sigstate-init.c | 51 + libpthread/sysdeps/mach/hurd/pt-sigstate.c | 77 + libpthread/sysdeps/mach/hurd/pt-sysdep.c | 86 + libpthread/sysdeps/mach/hurd/pt-sysdep.h | 72 + libpthread/sysdeps/mach/pt-block.c | 39 + libpthread/sysdeps/mach/pt-spin.c | 36 + libpthread/sysdeps/mach/pt-stack-alloc.c | 74 + libpthread/sysdeps/mach/pt-thread-alloc.c | 106 + libpthread/sysdeps/mach/pt-thread-dealloc.c | 43 + libpthread/sysdeps/mach/pt-thread-halt.c | 54 + libpthread/sysdeps/mach/pt-thread-start.c | 49 + libpthread/sysdeps/mach/pt-timedblock.c | 69 + libpthread/sysdeps/mach/pt-wakeup.c | 38 + libpthread/sysdeps/posix/pt-spin.c | 54 + libpthread/sysdeps/powerpc/bits/machine-lock.h | 78 + libpthread/sysdeps/powerpc/bits/memory.h | 36 + libpthread/sysdeps/powerpc/bits/spin-lock.h | 108 + .../sysdeps/powerpc/machine-sp.h | 24 +- libpthread/sysdeps/powerpc/pt-machdep.h | 29 + libpthread/tests/.cvsignore | 1 + libpthread/tests/Makefile | 29 + libpthread/tests/test-1.c | 50 + libpthread/tests/test-10.c | 46 + libpthread/tests/test-11.c | 143 + libpthread/tests/test-12.c | 29 + libpthread/tests/test-13.c | 66 + libpthread/tests/test-14.c | 44 + libpthread/tests/test-15.c | 87 + libpthread/tests/test-16.c | 71 + libpthread/tests/test-17.c | 57 + libpthread/tests/test-2.c | 39 + libpthread/tests/test-3.c | 55 + libpthread/tests/test-4.c | 86 + libpthread/tests/test-5.c | 75 + libpthread/tests/test-6.c | 96 + libpthread/tests/test-7.c | 70 + libpthread/tests/test-8.c | 60 + libpthread/tests/test-9.c | 88 + .../tests/test-__pthread_destroy_specific-skip.c | 83 + linuxthreads/Makeconfig | 5 + linuxthreads/Makefile | 6 +- linuxthreads/Versions | 3 + linuxthreads/condvar.c | 4 +- linuxthreads/descr.h | 18 +- linuxthreads/internals.h | 1 + linuxthreads/man/pthread_atfork.man | 36 +- linuxthreads/man/pthread_attr_init.man | 132 +- linuxthreads/man/pthread_cancel.man | 98 +- linuxthreads/man/pthread_cleanup_push.man | 66 +- linuxthreads/man/pthread_cond_init.man | 114 +- linuxthreads/man/pthread_condattr_init.man | 14 +- linuxthreads/man/pthread_create.man | 36 +- linuxthreads/man/pthread_detach.man | 34 +- linuxthreads/man/pthread_equal.man | 6 +- linuxthreads/man/pthread_exit.man | 18 +- linuxthreads/man/pthread_join.man | 62 +- linuxthreads/man/pthread_key_create.man | 62 +- linuxthreads/man/pthread_kill_other_threads_np.man | 22 +- linuxthreads/man/pthread_mutex_init.man | 94 +- linuxthreads/man/pthread_mutexattr_init.man | 62 +- linuxthreads/man/pthread_mutexattr_setkind_np.man | 20 +- linuxthreads/man/pthread_once.man | 18 +- linuxthreads/man/pthread_self.man | 12 +- linuxthreads/man/pthread_setschedparam.man | 62 +- linuxthreads/man/pthread_sigmask.man | 84 +- linuxthreads/man/sem_init.man | 88 +- linuxthreads/oldsemaphore.c | 2 +- linuxthreads/pt-machine.c | 4 +- linuxthreads/pthread.c | 59 +- .../pthread_condattr_getclock.c | 14 +- linuxthreads/pthread_condattr_setclock.c | 63 + linuxthreads/semaphore.h | 87 - linuxthreads/signals.c | 2 + linuxthreads/spinlock.c | 22 +- linuxthreads/spinlock.h | 26 +- linuxthreads/sysdeps/i386/tls.h | 24 + linuxthreads/sysdeps/pthread/Makefile | 6 + linuxthreads/sysdeps/pthread/bits/initspin.h | 3 +- linuxthreads/sysdeps/pthread/bits/libc-lock.h | 20 +- linuxthreads/sysdeps/pthread/bits/pthreadtypes.h | 19 +- linuxthreads/sysdeps/pthread/pthread.h | 20 +- linuxthreads/sysdeps/pthread/semaphore.h | 88 +- linuxthreads/sysdeps/pthread/unwind-resume.c | 64 + .../sysdeps/unix/sysv/linux/fatal-prepare.h | 39 + .../sysdeps/unix/sysv/linux/rtld-lowlevel.h | 153 + linuxthreads/sysdeps/x86_64/tls.h | 42 + locale/C-translit.h | 992 +- locale/C-translit.h.in | 2 + locale/findlocale.c | 74 +- locale/loadarchive.c | 4 + locale/nl_langinfo_l.c | 15 + locale/programs/3level.h | 36 + locale/programs/ld-collate.c | 558 +- locale/programs/ld-identification.c | 9 +- locale/programs/locale.c | 4 + locale/programs/locarchive.c | 24 +- locale/setlocale.c | 16 +- locale/weight.h | 9 +- locale/weightwc.h | 7 +- localedata/Makefile | 13 +- localedata/SUPPORTED | 38 +- localedata/charmaps/UTF-8 | 4385 + localedata/locales/C | 395038 ++++++++++++++++++ localedata/locales/aa_DJ | 2 + localedata/locales/aa_ER | 2 + localedata/locales/aa_ER@saaho | 2 + localedata/locales/aa_ET | 2 + localedata/locales/af_ZA | 2 + localedata/locales/am_ET | 2 + localedata/locales/ar_AE | 2 + localedata/locales/ar_BH | 2 + localedata/locales/ar_DZ | 2 + localedata/locales/ar_EG | 2 + localedata/locales/ar_IN | 4 +- localedata/locales/ar_IQ | 2 + localedata/locales/ar_JO | 2 + localedata/locales/ar_KW | 2 + localedata/locales/ar_LB | 2 + localedata/locales/ar_LY | 2 + localedata/locales/ar_MA | 2 + localedata/locales/ar_OM | 2 + localedata/locales/ar_QA | 2 + localedata/locales/ar_SA | 221 +- localedata/locales/ar_SD | 2 + localedata/locales/ar_SY | 2 + localedata/locales/ar_TN | 2 + localedata/locales/ar_YE | 2 + localedata/locales/as_IN | 2 +- localedata/locales/az_AZ | 2 + localedata/locales/be_BY | 3 + localedata/locales/be_BY@latin | 3 + localedata/locales/bem_ZM | 195 + localedata/locales/bn_IN | 4 +- localedata/locales/br_FR | 2 + localedata/locales/bs_BA | 2 + localedata/locales/byn_ER | 2 + localedata/locales/ca_ES | 2 + localedata/locales/ca_ES@valencia | 96 + localedata/locales/csb_PL | 15 +- localedata/locales/cy_GB | 9 +- localedata/locales/da_DK | 27 +- localedata/locales/de_AT | 2 +- localedata/locales/de_BE | 2 + localedata/locales/de_LI | 94 + localedata/locales/de_LU | 2 + localedata/locales/dz_BT | 2339 +- localedata/locales/el_GR | 2 + localedata/locales/en_AU | 4 +- localedata/locales/en_CA | 2 + localedata/locales/en_DK | 35 +- localedata/locales/en_GB | 4 +- localedata/locales/en_HK | 2 + localedata/locales/en_IE | 2 + localedata/locales/en_IN | 4 +- localedata/locales/en_NZ | 2 + localedata/locales/en_PH | 2 + localedata/locales/en_SG | 2 + localedata/locales/en_ZA | 2 + localedata/locales/en_ZM | 92 + localedata/locales/eo | 216 + localedata/locales/es_AR | 2 + localedata/locales/es_BO | 9 +- localedata/locales/es_CL | 9 +- localedata/locales/es_CO | 7 +- localedata/locales/es_CR | 3 +- localedata/locales/es_DO | 9 +- localedata/locales/es_EC | 9 +- localedata/locales/es_ES | 16 +- localedata/locales/es_GT | 9 +- localedata/locales/es_HN | 9 +- localedata/locales/es_MX | 11 +- localedata/locales/es_NI | 9 +- localedata/locales/es_PA | 9 +- localedata/locales/es_PE | 9 +- localedata/locales/es_PR | 9 +- localedata/locales/es_PY | 9 +- localedata/locales/es_SV | 9 +- localedata/locales/es_US | 2 + localedata/locales/es_UY | 9 +- localedata/locales/es_VE | 9 +- localedata/locales/et_EE | 2107 +- localedata/locales/eu_ES | 1 + localedata/locales/eu_FR | 83 + localedata/locales/eu_FR@euro | 83 + localedata/locales/ff_SN | 196 + localedata/locales/fi_FI | 45 +- localedata/locales/fo_FO | 12 +- localedata/locales/fr_BE | 20 +- localedata/locales/fr_CA | 17 +- localedata/locales/fr_CH | 25 +- localedata/locales/fr_FR | 21 +- localedata/locales/fr_LU | 25 +- localedata/locales/ga_IE | 2 + localedata/locales/gd_GB | 2 + localedata/locales/gez_ER | 2 + localedata/locales/gez_ET | 2 + localedata/locales/gl_ES | 2 + localedata/locales/gu_IN | 4 +- localedata/locales/gv_GB | 2 + localedata/locales/he_IL | 2 + localedata/locales/hi_IN | 4 +- localedata/locales/hr_HR | 2162 +- localedata/locales/hsb_DE | 2190 +- localedata/locales/hy_AM | 2 + localedata/locales/ia | 139 + localedata/locales/id_ID | 2 + localedata/locales/is_IS | 2 + localedata/locales/iso14651_t1_common | 17 +- localedata/locales/it_CH | 6 +- localedata/locales/it_IT | 2 + localedata/locales/ja_JP | 2 + localedata/locales/kk_KZ | 2 + localedata/locales/km_KH | 2 + localedata/locales/kn_IN | 4 +- localedata/locales/ko_KR | 2 + localedata/locales/kok_IN | 2 +- localedata/locales/ks_IN | 2 +- localedata/locales/ku_TR | 106 +- localedata/locales/kw_GB | 2 + localedata/locales/lo_LA | 2 + localedata/locales/lt_LT | 2066 +- localedata/locales/lv_LV | 2 + localedata/locales/ml_IN | 4 +- localedata/locales/mn_MN | 2 + localedata/locales/mr_IN | 4 +- localedata/locales/ms_MY | 2 + localedata/locales/nb_NO | 15 + localedata/locales/ne_NP | 2 + localedata/locales/nl_BE | 2 + localedata/locales/nr_ZA | 2 + localedata/locales/nso_ZA | 2 + localedata/locales/oc_FR | 2 + localedata/locales/om_ET | 2 + localedata/locales/or_IN | 2 +- localedata/locales/os_RU | 171 + localedata/locales/pa_IN | 4 +- localedata/locales/pl_PL | 2143 +- localedata/locales/pt_BR | 1 + localedata/locales/pt_PT | 2 + localedata/locales/ru_UA | 1 + localedata/locales/rw_RW | 2 + localedata/locales/sa_IN | 4 +- localedata/locales/sd_IN | 2 +- localedata/locales/sd_IN@devanagari | 2 +- localedata/locales/se_NO | 8 +- localedata/locales/sid_ET | 2 + localedata/locales/sl_SI | 2078 +- localedata/locales/so_DJ | 2 + localedata/locales/so_ET | 2 + localedata/locales/so_KE | 2 + localedata/locales/so_SO | 2 + localedata/locales/sq_AL | 2 + localedata/locales/ss_ZA | 2 + localedata/locales/st_ZA | 2 + localedata/locales/sv_FI | 4 +- localedata/locales/sv_SE | 19 +- localedata/locales/sw_KE | 170 + localedata/locales/sw_TZ | 121 + localedata/locales/ta_IN | 4 +- localedata/locales/te_IN | 4 +- localedata/locales/th_TH | 2 + localedata/locales/ti_ER | 2 + localedata/locales/ti_ET | 2 + localedata/locales/tig_ER | 2 + localedata/locales/tl_PH | 14 +- localedata/locales/tn_ZA | 2 + localedata/locales/tr_TR | 2102 +- localedata/locales/translit_neutral | 2 + localedata/locales/ts_ZA | 2 + localedata/locales/tt_RU | 2 + localedata/locales/uz_UZ | 2 + localedata/locales/uz_UZ@cyrillic | 2 + localedata/locales/ve_ZA | 2 + localedata/locales/vi_VN | 2 + localedata/locales/wa_BE | 3 +- localedata/locales/wal_ET | 3 +- localedata/locales/xh_ZA | 2 + localedata/locales/yi_US | 2 + localedata/locales/zh_CN | 2 + localedata/locales/zh_HK | 2 + localedata/locales/zh_SG | 2 + localedata/locales/zh_TW | 7 +- localedata/locales/zu_ZA | 2 + localedata/sort-test.sh | 6 + localedata/tst-langinfo-static.c | 1 + localedata/tst-langinfo.sh | 3 +- localedata/xfrm-test.c | 52 +- mach/Makefile | 2 +- mach/lock-intern.h | 20 + mach/mach.h | 3 + mach/mach/mig_support.h | 3 + mach/setup-thread.c | 30 +- mach/spin-lock.c | 1 + malloc/hooks.c | 19 +- malloc/malloc.c | 29 + manual/Makefile | 254 + math/Makefile | 22 +- misc/Makefile | 2 +- misc/bug18240.c | 75 + misc/chflags.c | 4 +- misc/fchflags.c | 4 +- misc/hsearch_r.c | 30 +- misc/madvise.c | 4 +- misc/mktemp.c | 2 +- misc/mntent_r.c | 4 +- misc/sys/cdefs.h | 6 + nis/nss | 2 +- nis/nss_nis/nis-alias.c | 41 +- nis/nss_nis/nis-netgrp.c | 5 +- nptl/Makefile | 35 +- nptl/allocatestack.c | 41 +- nptl/descr.h | 1 + nptl/nptl-init.c | 1 + nptl/pthreadP.h | 4 +- nptl/pthread_attr_getstack.c | 4 + nptl/pthread_attr_setstack.c | 8 + nptl/pthread_barrier_wait.c | 2 +- nptl/pthread_create.c | 19 +- nptl/pthread_getattr_np.c | 12 + nptl/pthread_mutex_trylock.c | 3 +- nptl/sysdeps/pthread/Makefile | 2 + nptl/sysdeps/pthread/aio_misc.h | 4 +- nptl/sysdeps/pthread/bits/libc-lock.h | 3 + nptl/sysdeps/pthread/gai_misc.h | 4 +- nptl/sysdeps/pthread/list.h | 31 +- nptl/sysdeps/pthread/pthread.h | 4 +- .../unix/sysv/linux/i386/i486/pthread_cond_wait.S | 592 - nptl/sysdeps/unix/sysv/linux/libc-lowlevellock.c | 2 +- nptl/sysdeps/unix/sysv/linux/sem_timedwait.c | 2 +- nptl/sysdeps/unix/sysv/linux/sem_wait.c | 4 +- nptl/sysdeps/unix/sysv/linux/x86_64/cancellation.S | 4 +- .../sysv/linux/x86_64/pthread_cond_timedwait.S | 4 +- .../unix/sysv/linux/x86_64/pthread_cond_wait.S | 2 +- .../sysv/linux/x86_64/pthread_rwlock_timedrdlock.S | 2 +- .../sysv/linux/x86_64/pthread_rwlock_timedwrlock.S | 4 +- nptl/tst-eintr1.c | 10 + nptl/tst-stackguard1.c | 8 +- nptl_db/ChangeLog | 4 + nptl_db/thread_dbP.h | 3 +- nscd.manifest | 5 - nscd/Depend | 1 + nscd/aicache.c | 2 +- nscd/connections.c | 9 +- nscd/nscd.h | 8 +- nscd/nscd_getserv_r.c | 67 +- nss/Makefile | 2 +- nss/digits_dots.c | 73 +- nss/getXXbyYY_r.c | 3 + nss/nss_files/files-XXX.c | 2 +- nss/nss_files/files-hosts.c | 2 +- nss/nss_files/files-parse.c | 15 +- nss/nsswitch.c | 107 +- nss/test-digits-dots.c | 38 + packaging/eglibc-2.13-debian.patch.gz | Bin 206145 -> 0 bytes packaging/eglibc.change | 8 - packaging/eglibc.spec | 17 +- packaging/eglibc_2.13-10.diff.gz | Bin 861024 -> 0 bytes packaging/gcc-4.5_4.5.3-3.diff.gz | Bin 1085038 -> 0 bytes packaging/glibc-arm-atomics-disable-qemu.patch | 12 - packaging/slp-limit-hack.patch | 22 - packaging/use_fullpath.patch | 43 - ports/ChangeLog.arm | 30 + ports/ChangeLog.eglibc | 10 + ports/ChangeLog.mips | 18 + ports/sysdeps/alpha/Makefile | 11 +- ports/sysdeps/alpha/Versions | 2 + ports/sysdeps/alpha/fpu/feupdateenv.c | 1 + ports/sysdeps/alpha/fpu/ftestexcept.c | 1 + ports/sysdeps/alpha/libgcc-compat.c | 35 + ports/sysdeps/alpha/stackinfo.h | 6 + ports/sysdeps/alpha/strncmp.S | 247 - ports/sysdeps/arm/Makefile | 7 + ports/sysdeps/arm/Versions | 16 + ports/sysdeps/arm/dl-tls.h | 3 + ports/sysdeps/arm/eabi/__longjmp.S | 8 +- ports/sysdeps/arm/eabi/bits/fenv.h | 8 +- ports/sysdeps/arm/eabi/bits/predefs.h | 8 +- .../sysdeps/arm/eabi/bits/wchar.h | 12 +- ports/sysdeps/arm/eabi/fclrexcpt.c | 8 +- ports/sysdeps/arm/eabi/fedisblxcpt.c | 8 +- ports/sysdeps/arm/eabi/feenablxcpt.c | 8 +- ports/sysdeps/arm/eabi/fegetenv.c | 8 +- ports/sysdeps/arm/eabi/fegetexcept.c | 8 +- ports/sysdeps/arm/eabi/fegetround.c | 8 +- ports/sysdeps/arm/eabi/feholdexcpt.c | 8 +- ports/sysdeps/arm/eabi/fesetenv.c | 8 +- ports/sysdeps/arm/eabi/fesetround.c | 8 +- ports/sysdeps/arm/eabi/fpu_control.h | 8 +- ports/sysdeps/arm/eabi/fraiseexcpt.c | 8 +- ports/sysdeps/arm/eabi/fsetexcptflg.c | 8 +- ports/sysdeps/arm/eabi/ftestexcept.c | 8 +- ports/sysdeps/arm/eabi/setjmp.S | 8 +- ports/sysdeps/arm/elf/start.S | 1 + ports/sysdeps/arm/libgcc-compat.c | 111 + ports/sysdeps/arm/preconfigure | 2 +- ports/sysdeps/arm/shlib-versions | 5 +- ports/sysdeps/arm/sysdep.h | 16 + ports/sysdeps/hppa/Makefile | 1 + ports/sysdeps/hppa/configure | 94 +- ports/sysdeps/hppa/dl-fptr.h | 3 + ports/sysdeps/hppa/dl-machine.h | 3 +- ports/sysdeps/hppa/dl-tls.h | 3 + ports/sysdeps/hppa/elf/configure | 98 +- ports/sysdeps/hppa/fpu/fegetenv.c | 1 + ports/sysdeps/hppa/fpu/feupdateenv.c | 1 + ports/sysdeps/hppa/fpu/ftestexcept.c | 1 + ports/sysdeps/hppa/linuxthreads/tls.h | 23 + ports/sysdeps/hppa/stackinfo.h | 6 + ports/sysdeps/m68k/Deps | 1 + ports/sysdeps/m68k/Makefile | 12 + ports/sysdeps/m68k/Versions | 8 + ports/sysdeps/m68k/bits/byteswap.h | 52 +- ports/sysdeps/m68k/dl-machine.h | 2 + ports/sysdeps/m68k/libgcc-compat.c | 83 + ports/sysdeps/mips/Makefile | 4 + ports/sysdeps/mips/backtrace.c | 1 + ports/sysdeps/mips/bits/atomic.h | 12 +- ports/sysdeps/mips/dl-machine.h | 15 +- ports/sysdeps/mips/dl-procinfo.c | 64 + ports/sysdeps/mips/dl-procinfo.h | 68 + ports/sysdeps/mips/dl-tls.h | 3 + ports/sysdeps/mips/dl-trampoline.c | 30 +- ports/sysdeps/mips/mips32/Makefile | 8 + ports/sysdeps/mips/mips32/Versions | 8 + ports/sysdeps/mips/mips32/libgcc-compat.c | 66 + ports/sysdeps/powerpc/powerpc32/e500/fpu/s_fma.c | 1 + ports/sysdeps/powerpc/powerpc32/e500/fpu/s_fmaf.c | 1 + ports/sysdeps/unix/alpha/sysdep.h | 7 +- .../unix/sysv/linux/alpha/____longjmp_chk.S | 2 +- ports/sysdeps/unix/sysv/linux/alpha/bits/fcntl.h | 34 + .../sysdeps/unix/sysv/linux/alpha/bits/resource.h | 8 +- ports/sysdeps/unix/sysv/linux/alpha/bits/statfs.h | 6 +- ports/sysdeps/unix/sysv/linux/alpha/dl-support.c | 2 - ports/sysdeps/unix/sysv/linux/alpha/fxstatat.c | 29 +- ports/sysdeps/unix/sysv/linux/alpha/ioperm.c | 8 +- .../unix/sysv/linux/alpha/kernel-features.h | 12 +- .../unix/sysv/linux/alpha/nptl/lowlevellock.h | 1 - ports/sysdeps/unix/sysv/linux/alpha/sys/epoll.h | 9 +- ports/sysdeps/unix/sysv/linux/alpha/syscall.S | 7 +- ports/sysdeps/unix/sysv/linux/alpha/sysconf.c | 2 +- ports/sysdeps/unix/sysv/linux/am33/bits/fcntl.h | 17 + ports/sysdeps/unix/sysv/linux/arm/Makefile | 4 + .../sysdeps/unix/sysv/linux/arm/____longjmp_chk.S | 8 +- ports/sysdeps/unix/sysv/linux/arm/bits/fcntl.h | 15 + ports/sysdeps/unix/sysv/linux/arm/clone.S | 7 +- ports/sysdeps/unix/sysv/linux/arm/dl-cache.h | 34 + .../unix/sysv/linux/arm/eabi/____longjmp_chk.S | 21 +- .../sysdeps/unix/sysv/linux/arm/eabi/getcontext.S | 113 + .../unix/sysv/linux/arm/eabi/libc-do-syscall.S | 3 + .../sysdeps/unix/sysv/linux/arm/eabi/makecontext.c | 73 + .../sysdeps/unix/sysv/linux/arm/eabi/setcontext.S | 101 + .../sysdeps/unix/sysv/linux/arm/eabi/swapcontext.S | 63 + ports/sysdeps/unix/sysv/linux/arm/ioperm.c | 10 +- .../sysdeps/unix/sysv/linux/arm/kernel-features.h | 10 + .../sysdeps/unix/sysv/linux/arm/nptl/bits/atomic.h | 1 - .../unix/sysv/linux/arm/nptl/lowlevellock.h | 1 - ports/sysdeps/unix/sysv/linux/arm/readelflib.c | 179 + ports/sysdeps/unix/sysv/linux/arm/sigaction.c | 18 +- ports/sysdeps/unix/sysv/linux/arm/sys/ucontext.h | 86 +- ports/sysdeps/unix/sysv/linux/arm/ucontext_i.sym | 30 + ports/sysdeps/unix/sysv/linux/cris/bits/fcntl.h | 15 + .../sysdeps/unix/sysv/linux/hppa/____longjmp_chk.S | 7 + ports/sysdeps/unix/sysv/linux/hppa/bits/fcntl.h | 29 +- .../sysdeps/unix/sysv/linux/hppa/kernel-features.h | 6 + .../sysv/linux/hppa/linuxthreads/lowlevellock.h | 298 + .../sysv/linux/hppa/linuxthreads/sysdep-cancel.h | 7 + .../unix/sysv/linux/hppa/nptl/lowlevellock.c | 1 + .../unix/sysv/linux/hppa/nptl/lowlevellock.h | 20 +- .../unix/sysv/linux/hppa/nptl/sysdep-cancel.h | 82 +- ports/sysdeps/unix/sysv/linux/hppa/sys/epoll.h | 144 + ports/sysdeps/unix/sysv/linux/hppa/sys/eventfd.h | 54 + ports/sysdeps/unix/sysv/linux/hppa/sys/inotify.h | 105 + ports/sysdeps/unix/sysv/linux/hppa/sys/procfs.h | 2 - ports/sysdeps/unix/sysv/linux/hppa/sys/signalfd.h | 66 + ports/sysdeps/unix/sysv/linux/hppa/sys/timerfd.h | 60 + ports/sysdeps/unix/sysv/linux/hppa/syscalls.list | 1 + ports/sysdeps/unix/sysv/linux/hppa/sysdep.h | 67 +- ports/sysdeps/unix/sysv/linux/m68k/bits/fcntl.h | 15 + ports/sysdeps/unix/sysv/linux/m68k/chown.c | 5 + .../sysdeps/unix/sysv/linux/m68k/kernel-features.h | 3 + ports/sysdeps/unix/sysv/linux/m68k/lchown.c | 5 + ports/sysdeps/unix/sysv/linux/mips/bits/fcntl.h | 15 + ports/sysdeps/unix/sysv/linux/mips/bits/resource.h | 8 +- ports/sysdeps/unix/sysv/linux/mips/getrlimit64.c | 64 + .../sysdeps/unix/sysv/linux/mips/kernel-features.h | 10 + .../unix/sysv/linux/mips/mips64/n64/fstatfs64.c | 1 + .../sysdeps/unix/sysv/linux/mips/mips64/n64/ftw.c | 1 + .../unix/sysv/linux/mips/mips64/n64/ftw64.c | 1 + .../unix/sysv/linux/mips/mips64/n64/statfs64.c | 1 + .../unix/sysv/linux/mips/mips64/n64/syscalls.list | 5 + .../unix/sysv/linux/mips/nptl/lowlevellock.h | 1 - ports/sysdeps/unix/sysv/linux/mips/setrlimit64.c | 55 + ports/sysdeps/unix/sysv/linux/mips/sys/user.h | 4 +- posix/Makefile | 3 +- posix/bug-regex34.c | 46 + posix/fnmatch.c | 11 + posix/fnmatch_loop.c | 9 +- posix/gai.conf | 3 - posix/glob.c | 361 +- posix/glob.h | 2 +- posix/posix_madvise.c | 4 +- posix/regcomp.c | 7 +- posix/regex_internal.c | 24 +- posix/regex_internal.h | 3 +- posix/regexec.c | 24 +- posix/spawn_faction_addopen.c | 14 +- posix/spawn_faction_destroy.c | 22 +- posix/spawn_int.h | 2 +- posix/tst-spawn.c | 10 +- posix/tst-sysconf.c | 6 + posix/wordexp-test.c | 44 + posix/wordexp.c | 16 +- resolv/Depend | 1 + resolv/nss_dns/dns-host.c | 3 +- resolv/nss_dns/dns-network.c | 4 +- resolv/res_debug.c | 5 +- resolv/res_init.c | 5 + resolv/res_libc.c | 6 +- resolv/res_query.c | 44 +- resolv/res_send.c | 29 +- resolv/resolv.h | 4 +- rt/Depend | 1 + rt/bits/mqueue2.h | 12 +- scripts/config.guess | 123 +- scripts/config.sub | 159 +- socket/accept4.c | 2 - socket/have_sock_cloexec.c | 5 + stdio-common/Makefile | 4 +- stdio-common/bug23-2.c | 70 + stdio-common/bug23-3.c | 50 + stdio-common/bug23-4.c | 31 + stdio-common/psiginfo.c | 7 +- stdio-common/tst-sscanf.c | 33 + stdio-common/vfprintf.c | 104 +- stdio-common/vfscanf.c | 124 +- stdlib/fmtmsg.c | 2 + stdlib/strtod_l.c | 146 +- string/Makefile | 2 + string/bits/string2.h | 6 +- string/memmem.c | 1 + string/strcoll_l.c | 929 +- string/strxfrm_l.c | 503 +- string/tst-strcoll-overflow.c | 61 + sunrpc/bindrsvprt.c | 107 +- sunrpc/clnt_udp.c | 2 +- sunrpc/svc_tcp.c | 6 + sunrpc/svc_udp.c | 13 +- sunrpc/svc_unix.c | 6 + sysdeps/generic/dl-fptr.h | 3 + sysdeps/generic/dl-irel.h | 9 +- sysdeps/generic/ldconfig.h | 1 + sysdeps/generic/ldsodefs.h | 14 +- sysdeps/generic/machine-lock.h | 12 + sysdeps/generic/machine-sp.h | 4 + sysdeps/generic/paths.h | 2 +- sysdeps/generic/thread_state.h | 1 + sysdeps/gnu/Makefile | 2 +- sysdeps/i386/Makefile | 5 + sysdeps/i386/Versions | 3 + sysdeps/i386/dl-irel.h | 9 +- sysdeps/i386/dl-procinfo.h | 2 +- sysdeps/i386/dl-tls.h | 3 + sysdeps/i386/hp-timing.h | 34 + sysdeps/i386/i686/multiarch/memcpy-ssse3-rep.S | 2 +- sysdeps/i386/i686/multiarch/memcpy-ssse3.S | 2 +- sysdeps/i386/libgcc-compat.c | 75 + sysdeps/i386/sysdep.h | 7 + sysdeps/ia64/Makefile | 4 +- sysdeps/ia64/Versions | 4 + sysdeps/ia64/dl-machine.h | 3 +- sysdeps/ia64/dl-tls.h | 3 + sysdeps/ia64/fpu/e_fmod.S | 8 +- sysdeps/ia64/fpu/e_fmodf.S | 8 +- sysdeps/ia64/fpu/e_fmodl.S | 12 +- sysdeps/ia64/fpu/libm_error.c | 75 +- sysdeps/ia64/fpu/libm_error_codes.h | 6 +- sysdeps/ia64/fpu/s_cos.S | 82 +- sysdeps/ia64/fpu/s_cosf.S | 85 +- sysdeps/ia64/fpu/s_cosl.S | 80 +- sysdeps/ia64/fpu/s_tan.S | 15 +- sysdeps/ia64/fpu/s_tanf.S | 6 +- sysdeps/ia64/fpu/s_tanl.S | 21 +- sysdeps/ia64/ia64libgcc.S | 350 - sysdeps/ia64/libgcc-compat.c | 112 + sysdeps/ieee754/ldbl-128/s_nexttowardf.c | 11 +- sysdeps/m68k/framestate.c | 2 + sysdeps/m68k/unwind-pe.c | 6 + sysdeps/mach/configure | 2 +- sysdeps/mach/configure.in | 2 +- sysdeps/mach/hurd/Makefile | 6 +- sysdeps/mach/hurd/bits/errno.h | 8 +- sysdeps/mach/hurd/bits/fcntl.h | 26 +- sysdeps/mach/hurd/bits/ioctls.h | 32 +- sysdeps/mach/hurd/bits/libc-lock.h | 7 + sysdeps/mach/hurd/bits/posix_opt.h | 66 +- sysdeps/mach/hurd/bits/sigaction.h | 81 + sysdeps/mach/hurd/bits/stat.h | 92 +- sysdeps/mach/hurd/brk.c | 20 +- sysdeps/mach/hurd/check_native.c | 9 + sysdeps/mach/hurd/chflags.c | 2 +- sysdeps/mach/hurd/chroot.c | 5 +- sysdeps/mach/hurd/configure | 2 + sysdeps/mach/hurd/configure.in | 2 + sysdeps/mach/hurd/dirfd.c | 5 +- sysdeps/mach/hurd/dl-sysdep.c | 39 +- sysdeps/mach/hurd/dl-sysdep.h | 5 +- sysdeps/mach/hurd/dup2.c | 114 +- sysdeps/mach/hurd/dup3.c | 140 + sysdeps/mach/hurd/execve.c | 6 +- sysdeps/mach/hurd/fchflags.c | 2 +- sysdeps/mach/hurd/fexecve.c | 7 +- sysdeps/mach/hurd/fork.c | 44 +- sysdeps/mach/hurd/ftok.c | 43 + sysdeps/mach/hurd/gai_misc.h | 44 + sysdeps/mach/hurd/getgroups.c | 5 +- sysdeps/mach/hurd/getlogin_r.c | 12 +- sysdeps/mach/hurd/hp-timing.h | 41 + sysdeps/mach/hurd/i386/Makefile | 4 + sysdeps/mach/hurd/i386/____longjmp_chk.S | 107 + sysdeps/mach/hurd/i386/bits/sigcontext.h | 4 + sysdeps/mach/hurd/i386/exc2signal.c | 123 +- sysdeps/mach/hurd/i386/init-first.c | 85 +- sysdeps/mach/hurd/i386/signal-defines.sym | 10 + sysdeps/mach/hurd/i386/sigreturn.c | 13 +- sysdeps/mach/hurd/i386/tls.h | 53 +- sysdeps/mach/hurd/i386/tlsdesc.sym | 19 + sysdeps/mach/hurd/i386/trampoline.c | 123 +- sysdeps/mach/hurd/ifreq.h | 45 + sysdeps/mach/hurd/ioctl.c | 21 +- sysdeps/mach/hurd/kernel-features.h | 10 +- sysdeps/mach/hurd/kill.c | 2 +- sysdeps/mach/hurd/ldsodefs.h | 52 + sysdeps/mach/hurd/mkdir.c | 8 +- sysdeps/mach/hurd/mkdirat.c | 9 +- sysdeps/mach/hurd/mlock.c | 4 +- sysdeps/mach/hurd/mmap.c | 44 +- sysdeps/mach/hurd/opendir.c | 5 +- sysdeps/mach/hurd/powerpc/init-first.c | 3 - sysdeps/mach/hurd/profil.c | 2 + sysdeps/mach/hurd/ptsname.c | 32 +- sysdeps/mach/hurd/readlinkat.c | 64 + sysdeps/mach/hurd/recvfrom.c | 6 +- sysdeps/mach/hurd/recvmsg.c | 105 +- sysdeps/mach/hurd/sendmsg.c | 73 +- sysdeps/mach/hurd/sendto.c | 10 +- sysdeps/mach/hurd/setitimer.c | 13 +- sysdeps/mach/hurd/setresgid.c | 76 +- sysdeps/mach/hurd/setresuid.c | 75 +- sysdeps/mach/hurd/shmat.c | 78 + sysdeps/mach/hurd/shmctl.c | 132 + sysdeps/mach/hurd/shmdt.c | 51 + sysdeps/mach/hurd/shmget.c | 242 + sysdeps/mach/hurd/sigaction.c | 18 +- sysdeps/mach/hurd/sigpending.c | 9 +- sysdeps/mach/hurd/sigprocmask.c | 11 +- sysdeps/mach/hurd/sigsuspend.c | 19 +- sysdeps/mach/hurd/sigwait.c | 23 +- sysdeps/mach/hurd/socket.c | 2 +- sysdeps/mach/hurd/spawni.c | 84 +- sysdeps/mach/hurd/symlink.c | 25 +- sysdeps/mach/hurd/symlinkat.c | 26 +- sysdeps/mach/hurd/sys/param.h | 4 + sysdeps/mach/hurd/tls.h | 6 +- sysdeps/mach/hurd/ttyname_r.c | 2 +- sysdeps/mach/hurd/xstatconv.c | 11 +- sysdeps/mach/i386/machine-lock.h | 12 + sysdeps/mach/i386/sysdep.h | 14 + sysdeps/mach/i386/thread_state.h | 16 +- sysdeps/mach/nanosleep.c | 33 +- sysdeps/mach/powerpc/machine-lock.h | 12 + sysdeps/mach/powerpc/machine-sp.h | 4 + sysdeps/mach/powerpc/thread_state.h | 1 + sysdeps/mach/thread_state.h | 3 + sysdeps/posix/getaddrinfo.c | 534 +- sysdeps/powerpc/dl-tls.h | 7 + sysdeps/powerpc/powerpc32/dl-irel.h | 9 +- sysdeps/powerpc/powerpc32/dl-trampoline.S | 4 + sysdeps/powerpc/powerpc64/dl-irel.h | 16 +- sysdeps/powerpc/powerpc64/power7/Makefile | 5 + sysdeps/s390/dl-tls.h | 3 + sysdeps/s390/fpu/libm-test-ulps | 8 +- sysdeps/s390/s390-32/Makefile | 8 + sysdeps/s390/s390-32/Versions | 8 + sysdeps/s390/s390-32/libgcc-compat.c | 83 + sysdeps/s390/s390-64/utf16-utf32-z9.c | 5 +- sysdeps/s390/s390-64/utf8-utf16-z9.c | 5 +- sysdeps/s390/s390-64/utf8-utf32-z9.c | 5 +- sysdeps/sh/dl-tls.h | 3 + sysdeps/sparc/dl-tls.h | 3 + sysdeps/sparc/sparc32/Makefile | 8 + sysdeps/sparc/sparc32/Versions | 4 + sysdeps/sparc/sparc32/dl-irel.h | 12 +- sysdeps/sparc/sparc32/dl-machine.h | 8 +- sysdeps/sparc/sparc32/dl-plt.h | 5 + sysdeps/sparc/sparc32/hp-timing.h | 34 + sysdeps/sparc/sparc32/libgcc-compat.c | 121 + sysdeps/sparc/sparc64/dl-irel.h | 12 +- sysdeps/sparc/sparc64/dl-machine.h | 8 +- sysdeps/sparc/sparc64/dl-plt.h | 5 + sysdeps/sparc/sparc64/multiarch/memcpy.S | 22 +- sysdeps/sparc/sparc64/multiarch/memset.S | 40 +- sysdeps/unix/dirstream.h | 11 +- sysdeps/unix/opendir.c | 3 + sysdeps/unix/readdir_r.c | 42 +- sysdeps/unix/rewinddir.c | 1 + sysdeps/unix/sysv/linux/accept4.c | 13 +- sysdeps/unix/sysv/linux/bits/resource.h | 8 +- sysdeps/unix/sysv/linux/check_native.c | 6 - sysdeps/unix/sysv/linux/check_pf.c | 8 +- sysdeps/unix/sysv/linux/clock_settime.c | 1 + sysdeps/unix/sysv/linux/dl-osinfo.h | 50 +- sysdeps/unix/sysv/linux/getpagesize.c | 2 +- sysdeps/unix/sysv/linux/i386/accept4.S | 4 +- sysdeps/unix/sysv/linux/i386/bits/fcntl.h | 15 + sysdeps/unix/sysv/linux/i386/clone.S | 4 - sysdeps/unix/sysv/linux/i386/dl-cache.h | 1 + sysdeps/unix/sysv/linux/i386/readdir64_r.c | 1 - sysdeps/unix/sysv/linux/i386/sysconf.c | 53 +- sysdeps/unix/sysv/linux/ia64/bits/fcntl.h | 15 + sysdeps/unix/sysv/linux/ia64/sys/user.h | 3 +- sysdeps/unix/sysv/linux/ia64/sysconf.c | 2 +- sysdeps/unix/sysv/linux/ifaddrs.c | 6 - sysdeps/unix/sysv/linux/internal_accept4.S | 12 +- sysdeps/unix/sysv/linux/internal_recvmmsg.S | 12 +- sysdeps/unix/sysv/linux/kernel-features.h | 68 +- sysdeps/unix/sysv/linux/ldsodefs.h | 6 +- sysdeps/unix/sysv/linux/netinet/if_fddi.h | 1 + sysdeps/unix/sysv/linux/paths.h | 2 +- sysdeps/unix/sysv/linux/posix_fadvise.c | 13 + sysdeps/unix/sysv/linux/powerpc/bits/fcntl.h | 15 + sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h | 4 +- sysdeps/unix/sysv/linux/recvmmsg.c | 13 +- sysdeps/unix/sysv/linux/s390/bits/fcntl.h | 15 + sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h | 6 +- sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h | 6 +- sysdeps/unix/sysv/linux/sh/bits/fcntl.h | 15 + sysdeps/unix/sysv/linux/sparc/bits/fcntl.h | 16 + sysdeps/unix/sysv/linux/sparc/bits/resource.h | 12 +- sysdeps/unix/sysv/linux/sys/param.h | 5 +- sysdeps/unix/sysv/linux/tcsetattr.c | 55 +- sysdeps/unix/sysv/linux/wordsize-64/creat64.c | 4 + sysdeps/unix/sysv/linux/wordsize-64/readdir_r.c | 1 - sysdeps/unix/sysv/linux/x86_64/bits/fcntl.h | 15 + sysdeps/unix/sysv/linux/x86_64/clone.S | 4 - sysdeps/unix/sysv/linux/x86_64/dl-cache.h | 21 +- sysdeps/unix/sysv/linux/x86_64/getcontext.S | 1 + sysdeps/unix/sysv/linux/x86_64/sys/user.h | 4 +- sysdeps/wordsize-64/Makefile | 6 + sysdeps/wordsize-64/tst-writev.c | 108 + sysdeps/x86_64/cacheinfo.c | 61 +- sysdeps/x86_64/dl-irel.h | 9 +- sysdeps/x86_64/dl-tls.h | 3 + sysdeps/x86_64/dl-trampoline.S | 44 +- sysdeps/x86_64/dl-trampoline.h | 25 +- sysdeps/x86_64/fpu/e_powl.S | 2 +- sysdeps/x86_64/memset.S | 66 +- sysdeps/x86_64/multiarch/init-arch.c | 12 + sysdeps/x86_64/multiarch/init-arch.h | 2 + sysdeps/x86_64/multiarch/memcpy-ssse3-back.S | 2 +- sysdeps/x86_64/multiarch/memcpy-ssse3.S | 2 +- time/strftime_l.c | 20 +- time/tst-mktime2.c | 1 + time/tst-strftime.c | 52 +- time/tzfile.c | 54 +- 1098 files changed, 433674 insertions(+), 21967 deletions(-) delete mode 100644 eglibc-common.manifest create mode 100644 elf/dl-altinit.c create mode 100644 elf/tst-ptrguard1-static.c create mode 100644 elf/tst-ptrguard1.c create mode 100644 elf/tst-tls19.c create mode 100644 elf/tst-tls19mod1.c create mode 100644 elf/tst-tls19mod2.c create mode 100644 elf/tst-tls19mod3.c create mode 100644 hurd/sysvshm.c create mode 100644 hurd/sysvshm.h create mode 100644 libpthread/.cvsignore create mode 100644 libpthread/ChangeLog create mode 100644 libpthread/Makeconfig create mode 100644 libpthread/Makefile create mode 100644 libpthread/Makefile.am create mode 100644 libpthread/TODO create mode 100644 libpthread/Versions create mode 100644 libpthread/configure create mode 100644 libpthread/configure.in create mode 100644 libpthread/forward.c create mode 100644 libpthread/headers.m4 create mode 100644 libpthread/include/pthread.h create mode 100644 libpthread/include/pthread/pthread.h create mode 100644 libpthread/include/pthread/pthreadtypes.h create mode 100644 libpthread/include/semaphore.h create mode 100644 libpthread/libc_pthread_init.c create mode 100644 libpthread/libpthread.a create mode 100644 libpthread/libpthread_pic.a create mode 100644 libpthread/lockfile.c create mode 100644 libpthread/not-in-libc.h create mode 100644 libpthread/pthread/Versions create mode 100644 libpthread/pthread/cthreads-compat.c create mode 100644 libpthread/pthread/pt-alloc.c create mode 100644 libpthread/pthread/pt-cancel.c create mode 100644 libpthread/pthread/pt-cleanup.c create mode 100644 libpthread/pthread/pt-create.c create mode 100644 libpthread/pthread/pt-dealloc.c create mode 100644 libpthread/pthread/pt-detach.c create mode 100644 libpthread/pthread/pt-exit.c create mode 100644 libpthread/pthread/pt-getattr.c create mode 100644 libpthread/pthread/pt-initialize.c create mode 100644 libpthread/pthread/pt-internal.h create mode 100644 libpthread/pthread/pt-join.c create mode 100644 libpthread/pthread/pt-self.c create mode 100644 libpthread/pthread/pt-setcancelstate.c create mode 100644 libpthread/pthread/pt-setcanceltype.c create mode 100644 libpthread/pthread/pt-sigmask.c create mode 100644 libpthread/pthread/pt-spin-inlines.c create mode 100644 libpthread/pthread/pt-testcancel.c create mode 100644 libpthread/pthread/pt-yield.c create mode 100644 libpthread/pthread/pthread-functions.h create mode 100644 libpthread/shlib-versions create mode 100644 libpthread/sysdeps/generic/bits/barrier-attr.h create mode 100644 libpthread/sysdeps/generic/bits/barrier.h create mode 100644 libpthread/sysdeps/generic/bits/cancelation.h create mode 100644 libpthread/sysdeps/generic/bits/condition-attr.h create mode 100644 libpthread/sysdeps/generic/bits/condition.h create mode 100644 libpthread/sysdeps/generic/bits/mutex-attr.h create mode 100644 libpthread/sysdeps/generic/bits/mutex.h create mode 100644 libpthread/sysdeps/generic/bits/once.h create mode 100644 libpthread/sysdeps/generic/bits/pthread-np.h create mode 100644 libpthread/sysdeps/generic/bits/pthread.h create mode 100644 libpthread/sysdeps/generic/bits/pthreadtypes.h create mode 100644 libpthread/sysdeps/generic/bits/rwlock-attr.h create mode 100644 libpthread/sysdeps/generic/bits/rwlock.h create mode 100644 libpthread/sysdeps/generic/bits/semaphore.h create mode 100644 libpthread/sysdeps/generic/bits/thread-attr.h create mode 100644 libpthread/sysdeps/generic/bits/thread-specific.h create mode 100644 libpthread/sysdeps/generic/killpg.c create mode 100644 libpthread/sysdeps/generic/pt-atfork.c create mode 100644 libpthread/sysdeps/generic/pt-attr-destroy.c create mode 100644 libpthread/sysdeps/generic/pt-attr-getdetachstate.c create mode 100644 libpthread/sysdeps/generic/pt-attr-getguardsize.c create mode 100644 libpthread/sysdeps/generic/pt-attr-getinheritsched.c create mode 100644 libpthread/sysdeps/generic/pt-attr-getschedparam.c create mode 100644 libpthread/sysdeps/generic/pt-attr-getschedpolicy.c create mode 100644 libpthread/sysdeps/generic/pt-attr-getscope.c create mode 100644 libpthread/sysdeps/generic/pt-attr-getstack.c create mode 100644 libpthread/sysdeps/generic/pt-attr-getstackaddr.c create mode 100644 libpthread/sysdeps/generic/pt-attr-getstacksize.c create mode 100644 libpthread/sysdeps/generic/pt-attr-init.c create mode 100644 libpthread/sysdeps/generic/pt-attr-setdetachstate.c create mode 100644 libpthread/sysdeps/generic/pt-attr-setguardsize.c create mode 100644 libpthread/sysdeps/generic/pt-attr-setinheritsched.c create mode 100644 libpthread/sysdeps/generic/pt-attr-setschedparam.c create mode 100644 libpthread/sysdeps/generic/pt-attr-setschedpolicy.c create mode 100644 libpthread/sysdeps/generic/pt-attr-setscope.c create mode 100644 libpthread/sysdeps/generic/pt-attr-setstack.c create mode 100644 libpthread/sysdeps/generic/pt-attr-setstackaddr.c create mode 100644 libpthread/sysdeps/generic/pt-attr-setstacksize.c create mode 100644 libpthread/sysdeps/generic/pt-attr.c create mode 100644 libpthread/sysdeps/generic/pt-barrier-destroy.c create mode 100644 libpthread/sysdeps/generic/pt-barrier-init.c create mode 100644 libpthread/sysdeps/generic/pt-barrier-wait.c create mode 100644 libpthread/sysdeps/generic/pt-barrier.c create mode 100644 libpthread/sysdeps/generic/pt-barrierattr-destroy.c create mode 100644 libpthread/sysdeps/generic/pt-barrierattr-getpshared.c create mode 100644 libpthread/sysdeps/generic/pt-barrierattr-init.c create mode 100644 libpthread/sysdeps/generic/pt-barrierattr-setpshared.c create mode 100644 libpthread/sysdeps/generic/pt-cond-brdcast.c create mode 100644 libpthread/sysdeps/generic/pt-cond-destroy.c create mode 100644 libpthread/sysdeps/generic/pt-cond-init.c create mode 100644 libpthread/sysdeps/generic/pt-cond-signal.c create mode 100644 libpthread/sysdeps/generic/pt-cond-timedwait.c create mode 100644 libpthread/sysdeps/generic/pt-cond-wait.c create mode 100644 libpthread/sysdeps/generic/pt-cond.c create mode 100644 libpthread/sysdeps/generic/pt-condattr-destroy.c create mode 100644 libpthread/sysdeps/generic/pt-condattr-getclock.c create mode 100644 libpthread/sysdeps/generic/pt-condattr-getpshared.c create mode 100644 libpthread/sysdeps/generic/pt-condattr-init.c create mode 100644 libpthread/sysdeps/generic/pt-condattr-setclock.c create mode 100644 libpthread/sysdeps/generic/pt-condattr-setpshared.c create mode 100644 libpthread/sysdeps/generic/pt-destroy-specific.c create mode 100644 libpthread/sysdeps/generic/pt-equal.c create mode 100644 libpthread/sysdeps/generic/pt-getconcurrency.c create mode 100644 libpthread/sysdeps/generic/pt-getcpuclockid.c create mode 100644 libpthread/sysdeps/generic/pt-getschedparam.c create mode 100644 libpthread/sysdeps/generic/pt-getspecific.c create mode 100644 libpthread/sysdeps/generic/pt-init-specific.c create mode 100644 libpthread/sysdeps/generic/pt-key-create.c create mode 100644 libpthread/sysdeps/generic/pt-key-delete.c create mode 100644 libpthread/sysdeps/generic/pt-key.h create mode 100644 libpthread/sysdeps/generic/pt-kill.c create mode 100644 libpthread/sysdeps/generic/pt-mutex-destroy.c create mode 100644 libpthread/sysdeps/generic/pt-mutex-getprioceiling.c create mode 100644 libpthread/sysdeps/generic/pt-mutex-init.c create mode 100644 libpthread/sysdeps/generic/pt-mutex-lock.c create mode 100644 libpthread/sysdeps/generic/pt-mutex-setprioceiling.c create mode 100644 libpthread/sysdeps/generic/pt-mutex-timedlock.c create mode 100644 libpthread/sysdeps/generic/pt-mutex-transfer-np.c create mode 100644 libpthread/sysdeps/generic/pt-mutex-trylock.c create mode 100644 libpthread/sysdeps/generic/pt-mutex-unlock.c create mode 100644 libpthread/sysdeps/generic/pt-mutexattr-destroy.c create mode 100644 libpthread/sysdeps/generic/pt-mutexattr-getprioceiling.c create mode 100644 libpthread/sysdeps/generic/pt-mutexattr-getprotocol.c create mode 100644 libpthread/sysdeps/generic/pt-mutexattr-getpshared.c create mode 100644 libpthread/sysdeps/generic/pt-mutexattr-gettype.c create mode 100644 libpthread/sysdeps/generic/pt-mutexattr-init.c create mode 100644 libpthread/sysdeps/generic/pt-mutexattr-setprioceiling.c create mode 100644 libpthread/sysdeps/generic/pt-mutexattr-setprotocol.c create mode 100644 libpthread/sysdeps/generic/pt-mutexattr-setpshared.c create mode 100644 libpthread/sysdeps/generic/pt-mutexattr-settype.c create mode 100644 libpthread/sysdeps/generic/pt-mutexattr.c create mode 100644 libpthread/sysdeps/generic/pt-once.c create mode 100644 libpthread/sysdeps/generic/pt-rwlock-attr.c create mode 100644 libpthread/sysdeps/generic/pt-rwlock-destroy.c create mode 100644 libpthread/sysdeps/generic/pt-rwlock-init.c create mode 100644 libpthread/sysdeps/generic/pt-rwlock-rdlock.c create mode 100644 libpthread/sysdeps/generic/pt-rwlock-timedrdlock.c create mode 100644 libpthread/sysdeps/generic/pt-rwlock-timedwrlock.c create mode 100644 libpthread/sysdeps/generic/pt-rwlock-tryrdlock.c create mode 100644 libpthread/sysdeps/generic/pt-rwlock-trywrlock.c create mode 100644 libpthread/sysdeps/generic/pt-rwlock-unlock.c create mode 100644 libpthread/sysdeps/generic/pt-rwlock-wrlock.c create mode 100644 libpthread/sysdeps/generic/pt-rwlockattr-destroy.c create mode 100644 libpthread/sysdeps/generic/pt-rwlockattr-getpshared.c create mode 100644 libpthread/sysdeps/generic/pt-rwlockattr-init.c create mode 100644 libpthread/sysdeps/generic/pt-rwlockattr-setpshared.c create mode 100644 libpthread/sysdeps/generic/pt-setconcurrency.c create mode 100644 libpthread/sysdeps/generic/pt-setschedparam.c create mode 100644 libpthread/sysdeps/generic/pt-setschedprio.c create mode 100644 libpthread/sysdeps/generic/pt-setspecific.c create mode 100644 libpthread/sysdeps/generic/pt-startup.c create mode 100644 libpthread/sysdeps/generic/raise.c create mode 100644 libpthread/sysdeps/generic/sem-close.c create mode 100644 libpthread/sysdeps/generic/sem-destroy.c create mode 100644 libpthread/sysdeps/generic/sem-getvalue.c create mode 100644 libpthread/sysdeps/generic/sem-init.c create mode 100644 libpthread/sysdeps/generic/sem-open.c create mode 100644 libpthread/sysdeps/generic/sem-post.c create mode 100644 libpthread/sysdeps/generic/sem-timedwait.c create mode 100644 libpthread/sysdeps/generic/sem-trywait.c create mode 100644 libpthread/sysdeps/generic/sem-unlink.c create mode 100644 libpthread/sysdeps/generic/sem-wait.c create mode 100644 libpthread/sysdeps/generic/sigaddset.c create mode 100644 libpthread/sysdeps/generic/sigdelset.c create mode 100644 libpthread/sysdeps/generic/sigemptyset.c create mode 100644 libpthread/sysdeps/generic/sigfillset.c create mode 100644 libpthread/sysdeps/generic/siginterrupt.c create mode 100644 libpthread/sysdeps/generic/sigismember.c create mode 100644 libpthread/sysdeps/generic/signal.c create mode 100644 libpthread/sysdeps/generic/sigwait.c create mode 100644 libpthread/sysdeps/hurd/pt-destroy-specific.c create mode 100644 libpthread/sysdeps/hurd/pt-getspecific.c create mode 100644 libpthread/sysdeps/hurd/pt-init-specific.c create mode 100644 libpthread/sysdeps/hurd/pt-key-create.c create mode 100644 libpthread/sysdeps/hurd/pt-key-delete.c create mode 100644 libpthread/sysdeps/hurd/pt-key.h create mode 100644 libpthread/sysdeps/hurd/pt-kill.c create mode 100644 libpthread/sysdeps/hurd/pt-setspecific.c create mode 100644 libpthread/sysdeps/i386/Implies create mode 100644 libpthread/sysdeps/ia32/bits/memory.h create mode 100644 libpthread/sysdeps/ia32/bits/pt-atomic.h create mode 100644 libpthread/sysdeps/ia32/bits/spin-lock-inline.h create mode 100644 libpthread/sysdeps/ia32/bits/spin-lock.h rename sysdeps/unix/sysv/linux/sparc/fork.S => libpthread/sysdeps/ia32/machine-sp.h (67%) create mode 100644 libpthread/sysdeps/ia32/pt-machdep.h create mode 100644 libpthread/sysdeps/l4/bits/pthread-np.h create mode 100644 libpthread/sysdeps/l4/hurd/bits/pthread-np.h create mode 100644 libpthread/sysdeps/l4/hurd/ia32/pt-machdep.c create mode 100644 libpthread/sysdeps/l4/hurd/ia32/pt-setup.c create mode 100644 libpthread/sysdeps/l4/hurd/ia32/signal-dispatch-lowlevel.c create mode 100644 libpthread/sysdeps/l4/hurd/powerpc/pt-machdep.c create mode 100644 libpthread/sysdeps/l4/hurd/powerpc/pt-setup.c create mode 100644 libpthread/sysdeps/l4/hurd/pt-block.c create mode 100644 libpthread/sysdeps/l4/hurd/pt-kill.c create mode 100644 libpthread/sysdeps/l4/hurd/pt-setactivity-np.c create mode 100644 libpthread/sysdeps/l4/hurd/pt-sigstate-destroy.c create mode 100644 libpthread/sysdeps/l4/hurd/pt-sigstate-init.c create mode 100644 libpthread/sysdeps/l4/hurd/pt-sigstate.c create mode 100644 libpthread/sysdeps/l4/hurd/pt-startup.c create mode 100644 libpthread/sysdeps/l4/hurd/pt-sysdep.c create mode 100644 libpthread/sysdeps/l4/hurd/pt-sysdep.h create mode 100644 libpthread/sysdeps/l4/hurd/pt-thread-alloc.c create mode 100644 libpthread/sysdeps/l4/hurd/pt-thread-halt.c create mode 100644 libpthread/sysdeps/l4/hurd/pt-thread-start.c create mode 100644 libpthread/sysdeps/l4/hurd/pt-wakeup.c create mode 100644 libpthread/sysdeps/l4/hurd/sig-sysdep.h create mode 100644 libpthread/sysdeps/l4/hurd/sigprocmask.c create mode 100644 libpthread/sysdeps/l4/pt-block.c create mode 100644 libpthread/sysdeps/l4/pt-docancel.c create mode 100644 libpthread/sysdeps/l4/pt-pool-np.c create mode 100644 libpthread/sysdeps/l4/pt-spin.c create mode 100644 libpthread/sysdeps/l4/pt-stack-alloc.c create mode 100644 libpthread/sysdeps/l4/pt-thread-alloc.c create mode 100644 libpthread/sysdeps/l4/pt-thread-dealloc.c create mode 100644 libpthread/sysdeps/l4/pt-thread-halt.c create mode 100644 libpthread/sysdeps/l4/pt-thread-start.c create mode 100644 libpthread/sysdeps/l4/pt-timedblock.c create mode 100644 libpthread/sysdeps/l4/pt-wakeup.c create mode 100644 libpthread/sysdeps/mach/bits/spin-lock-inline.h rename sysdeps/mach/hurd/bits/libc-tsd.h => libpthread/sysdeps/mach/bits/spin-lock.h (57%) create mode 100644 libpthread/sysdeps/mach/hurd/Implies create mode 100644 libpthread/sysdeps/mach/hurd/bits/pthread-np.h create mode 100644 libpthread/sysdeps/mach/hurd/i386/Implies create mode 100644 libpthread/sysdeps/mach/hurd/ia32/pt-machdep.c create mode 100644 libpthread/sysdeps/mach/hurd/ia32/pt-setup.c create mode 100644 libpthread/sysdeps/mach/hurd/pt-attr-setstackaddr.c create mode 100644 libpthread/sysdeps/mach/hurd/pt-attr-setstacksize.c create mode 100644 libpthread/sysdeps/mach/hurd/pt-docancel.c create mode 100644 libpthread/sysdeps/mach/hurd/pt-hurd-cond-wait.c create mode 100644 libpthread/sysdeps/mach/hurd/pt-init-specific.c create mode 100644 libpthread/sysdeps/mach/hurd/pt-sigstate-destroy.c create mode 100644 libpthread/sysdeps/mach/hurd/pt-sigstate-init.c create mode 100644 libpthread/sysdeps/mach/hurd/pt-sigstate.c create mode 100644 libpthread/sysdeps/mach/hurd/pt-sysdep.c create mode 100644 libpthread/sysdeps/mach/hurd/pt-sysdep.h create mode 100644 libpthread/sysdeps/mach/pt-block.c create mode 100644 libpthread/sysdeps/mach/pt-spin.c create mode 100644 libpthread/sysdeps/mach/pt-stack-alloc.c create mode 100644 libpthread/sysdeps/mach/pt-thread-alloc.c create mode 100644 libpthread/sysdeps/mach/pt-thread-dealloc.c create mode 100644 libpthread/sysdeps/mach/pt-thread-halt.c create mode 100644 libpthread/sysdeps/mach/pt-thread-start.c create mode 100644 libpthread/sysdeps/mach/pt-timedblock.c create mode 100644 libpthread/sysdeps/mach/pt-wakeup.c create mode 100644 libpthread/sysdeps/posix/pt-spin.c create mode 100644 libpthread/sysdeps/powerpc/bits/machine-lock.h create mode 100644 libpthread/sysdeps/powerpc/bits/memory.h create mode 100644 libpthread/sysdeps/powerpc/bits/spin-lock.h rename sysdeps/mach/hurd/dl-cache.c => libpthread/sysdeps/powerpc/machine-sp.h (66%) create mode 100644 libpthread/sysdeps/powerpc/pt-machdep.h create mode 100644 libpthread/tests/.cvsignore create mode 100644 libpthread/tests/Makefile create mode 100644 libpthread/tests/test-1.c create mode 100644 libpthread/tests/test-10.c create mode 100644 libpthread/tests/test-11.c create mode 100644 libpthread/tests/test-12.c create mode 100644 libpthread/tests/test-13.c create mode 100644 libpthread/tests/test-14.c create mode 100644 libpthread/tests/test-15.c create mode 100644 libpthread/tests/test-16.c create mode 100644 libpthread/tests/test-17.c create mode 100644 libpthread/tests/test-2.c create mode 100644 libpthread/tests/test-3.c create mode 100644 libpthread/tests/test-4.c create mode 100644 libpthread/tests/test-5.c create mode 100644 libpthread/tests/test-6.c create mode 100644 libpthread/tests/test-7.c create mode 100644 libpthread/tests/test-8.c create mode 100644 libpthread/tests/test-9.c create mode 100644 libpthread/tests/test-__pthread_destroy_specific-skip.c rename nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_cond_wait.S => linuxthreads/pthread_condattr_getclock.c (77%) create mode 100644 linuxthreads/pthread_condattr_setclock.c delete mode 100644 linuxthreads/semaphore.h create mode 100644 linuxthreads/sysdeps/pthread/unwind-resume.c create mode 100644 linuxthreads/sysdeps/unix/sysv/linux/fatal-prepare.h create mode 100644 linuxthreads/sysdeps/unix/sysv/linux/rtld-lowlevel.h create mode 100644 localedata/locales/C create mode 100644 localedata/locales/bem_ZM create mode 100644 localedata/locales/ca_ES@valencia create mode 100644 localedata/locales/de_LI create mode 100644 localedata/locales/en_ZM create mode 100644 localedata/locales/eo create mode 100644 localedata/locales/eu_FR create mode 100644 localedata/locales/eu_FR@euro create mode 100644 localedata/locales/ff_SN create mode 100644 localedata/locales/ia create mode 100644 localedata/locales/os_RU create mode 100644 localedata/locales/sw_KE create mode 100644 localedata/locales/sw_TZ create mode 100644 localedata/tst-langinfo-static.c create mode 100644 manual/Makefile create mode 100644 misc/bug18240.c delete mode 100644 nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S delete mode 100644 nscd.manifest create mode 100644 nss/test-digits-dots.c delete mode 100755 packaging/eglibc-2.13-debian.patch.gz delete mode 100644 packaging/eglibc.change delete mode 100755 packaging/eglibc_2.13-10.diff.gz delete mode 100755 packaging/gcc-4.5_4.5.3-3.diff.gz delete mode 100755 packaging/glibc-arm-atomics-disable-qemu.patch delete mode 100755 packaging/slp-limit-hack.patch delete mode 100644 packaging/use_fullpath.patch create mode 100644 ports/sysdeps/alpha/libgcc-compat.c delete mode 100644 ports/sysdeps/alpha/strncmp.S create mode 100644 ports/sysdeps/arm/Makefile create mode 100644 ports/sysdeps/arm/Versions rename nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_cond_wait.S => ports/sysdeps/arm/eabi/bits/wchar.h (77%) create mode 100644 ports/sysdeps/arm/libgcc-compat.c create mode 100644 ports/sysdeps/m68k/Deps create mode 100644 ports/sysdeps/m68k/libgcc-compat.c create mode 100644 ports/sysdeps/mips/backtrace.c create mode 100644 ports/sysdeps/mips/dl-procinfo.c create mode 100644 ports/sysdeps/mips/dl-procinfo.h create mode 100644 ports/sysdeps/mips/mips32/Versions create mode 100644 ports/sysdeps/mips/mips32/libgcc-compat.c create mode 100644 ports/sysdeps/powerpc/powerpc32/e500/fpu/s_fma.c create mode 100644 ports/sysdeps/powerpc/powerpc32/e500/fpu/s_fmaf.c delete mode 100644 ports/sysdeps/unix/sysv/linux/alpha/dl-support.c create mode 100644 ports/sysdeps/unix/sysv/linux/arm/dl-cache.h create mode 100644 ports/sysdeps/unix/sysv/linux/arm/eabi/getcontext.S create mode 100644 ports/sysdeps/unix/sysv/linux/arm/eabi/makecontext.c create mode 100644 ports/sysdeps/unix/sysv/linux/arm/eabi/setcontext.S create mode 100644 ports/sysdeps/unix/sysv/linux/arm/eabi/swapcontext.S create mode 100644 ports/sysdeps/unix/sysv/linux/arm/readelflib.c create mode 100644 ports/sysdeps/unix/sysv/linux/arm/ucontext_i.sym create mode 100644 ports/sysdeps/unix/sysv/linux/hppa/____longjmp_chk.S create mode 100644 ports/sysdeps/unix/sysv/linux/hppa/linuxthreads/lowlevellock.h create mode 100644 ports/sysdeps/unix/sysv/linux/hppa/sys/epoll.h create mode 100644 ports/sysdeps/unix/sysv/linux/hppa/sys/eventfd.h create mode 100644 ports/sysdeps/unix/sysv/linux/hppa/sys/inotify.h create mode 100644 ports/sysdeps/unix/sysv/linux/hppa/sys/signalfd.h create mode 100644 ports/sysdeps/unix/sysv/linux/hppa/sys/timerfd.h create mode 100644 ports/sysdeps/unix/sysv/linux/mips/getrlimit64.c create mode 100644 ports/sysdeps/unix/sysv/linux/mips/mips64/n64/fstatfs64.c create mode 100644 ports/sysdeps/unix/sysv/linux/mips/mips64/n64/ftw.c create mode 100644 ports/sysdeps/unix/sysv/linux/mips/mips64/n64/ftw64.c create mode 100644 ports/sysdeps/unix/sysv/linux/mips/mips64/n64/statfs64.c create mode 100644 ports/sysdeps/unix/sysv/linux/mips/setrlimit64.c create mode 100644 posix/bug-regex34.c create mode 100644 stdio-common/bug23-2.c create mode 100644 stdio-common/bug23-3.c create mode 100644 stdio-common/bug23-4.c create mode 100644 string/tst-strcoll-overflow.c create mode 100644 sysdeps/i386/hp-timing.h create mode 100644 sysdeps/i386/libgcc-compat.c delete mode 100644 sysdeps/ia64/ia64libgcc.S create mode 100644 sysdeps/ia64/libgcc-compat.c create mode 100644 sysdeps/m68k/framestate.c create mode 100644 sysdeps/m68k/unwind-pe.c create mode 100644 sysdeps/mach/hurd/bits/sigaction.h create mode 100644 sysdeps/mach/hurd/check_native.c create mode 100644 sysdeps/mach/hurd/dup3.c create mode 100644 sysdeps/mach/hurd/ftok.c create mode 100644 sysdeps/mach/hurd/gai_misc.h create mode 100644 sysdeps/mach/hurd/hp-timing.h create mode 100644 sysdeps/mach/hurd/i386/____longjmp_chk.S create mode 100644 sysdeps/mach/hurd/i386/signal-defines.sym create mode 100644 sysdeps/mach/hurd/i386/tlsdesc.sym create mode 100644 sysdeps/mach/hurd/ifreq.h create mode 100644 sysdeps/mach/hurd/ldsodefs.h create mode 100644 sysdeps/mach/hurd/readlinkat.c create mode 100644 sysdeps/mach/hurd/shmat.c create mode 100644 sysdeps/mach/hurd/shmctl.c create mode 100644 sysdeps/mach/hurd/shmdt.c create mode 100644 sysdeps/mach/hurd/shmget.c create mode 100644 sysdeps/powerpc/powerpc64/power7/Makefile create mode 100644 sysdeps/s390/s390-32/libgcc-compat.c create mode 100644 sysdeps/sparc/sparc32/hp-timing.h create mode 100644 sysdeps/sparc/sparc32/libgcc-compat.c create mode 100644 sysdeps/unix/sysv/linux/i386/dl-cache.h create mode 100644 sysdeps/wordsize-64/Makefile create mode 100644 sysdeps/wordsize-64/tst-writev.c diff --git a/.gitignore b/.gitignore index fbdcf54..ce7bd11 100644 --- a/.gitignore +++ b/.gitignore @@ -1,39 +1,3 @@ *~ -*.gz -*.Z -*.tar -*.tgz -*.bz2 -*.rej -*.orig -=* -TAGS -TODO -AUTHORS -copyr-* -copying.* -glibc-* -configparms - -ieeetest -regex - -gpl2lgpl.sed -distinfo - -test-include -analysis -docs -releases - -libc.prj -.libc.prcs_aux -libc.proj -.snprj - -TODO.html - -autom4te*.cache - -rtkaio +.pc/ diff --git a/ChangeLog b/ChangeLog index 6a57302..c2f5a18 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,46 @@ +2011-05-30 Ulrich Drepper + + [BZ #12454] + * elf/dl-deps.c (_dl_map_object_deps): Run initializer sorting only + when there are multiple maps. + * elf/dl-fini.c (_dl_sort_fini): Check for list of one. + (_dl_fini): Remove test here. + + * elf/rtld.c (dl_main): Don't allow the loader to load itself. + +2011-02-06 Mike Frysinger + + [BZ #12653] + * sysdeps/i386/i686/multiarch/memcpy-ssse3-rep.S: Only protect + MEMCPY_CHK with USE_AS_BCOPY ifdef check. + * sysdeps/i386/i686/multiarch/memcpy-ssse3.S: Likewise. + * sysdeps/x86_64/multiarch/memcpy-ssse3.S: Likewise. + * sysdeps/x86_64/multiarch/memcpy-ssse3-back.S: Likewise. + +2010-09-28 Andreas Schwab + Ulrich Drepper + + [BZ #12489] + * elf/rtld.c (dl_main): Move setting of GLRO(dl_init_all_dirs) + before performing relro protection. At old place add assertion + to make sure nothing changed. + +2011-02-16 Ryan S. Arnold + + * sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h: + (INTERNAL_VSYSCALL_NCS INTERNAL_SYSCALL_NCS): Remove erroneous (int) + cast from r3. + * sysdeps/wordsize-64/Makefile: New file. Add tst-writev to + 'tests' variable. + * sysdeps/wordsize-64/tst-writev.c: New file. + +2011-02-15 Ryan S. Arnold + + * sysdeps/powerpc/powerpc64/power7/Makefile: New file which adds + -mno-vsx to the CFLAGS-rtld.c variable to avoid using VSX registers and + insns in _dl_start to prevent a TOC reference before relocs are + resolved. + 2011-02-02 Ulrich Drepper * elf/dl-runtime.c (_dl_call_pltexit): Pass correct address of the diff --git a/ChangeLog.eglibc b/ChangeLog.eglibc index 8b274c6..091e36f 100644 --- a/ChangeLog.eglibc +++ b/ChangeLog.eglibc @@ -1,3 +1,37 @@ +2011-10-11 Maxim Kuvyrkov + + Backport from trunk: + + 2011-10-07 Michael Hope + * manual/Makefile (stamp-pkgvers): Escape PKGVERSION. Fix the + escaping of REPORT_BUGS_TO. + +2011-09-06 Dr. David Alan Gilbert + + * elf/Makefile: Push tst-initorder through cross-test-wrapper. + +2011-07-22 Denis Zaitceff + + * elf/dl-support.c, elf/rtld.c: Include . + +2011-07-06 Sebastan Andrzej Siewior + + * sysdeps/powerpc/powerpc32/dl-trampoline.S: Put __NO_FPRS__ + around floating point opcodes. + +2011-06-23 Maxim Kuvyrkov + + Backport from trunk: + 2011-06-23 Paul Pluzhnikov + * resolv/res_libc.c (__res_initstamp): Declare unconditionally. + (__res_maybe_init): Avoid double-checked locking. + +2011-06-10 Maxim Kuvyrkov + + Backport from trunk: + 2011-02-28 Denis Zaitceff + * elf/dl-lookup.c (GLRO_dl_debug_mask): Apply the forgotten one. + 2010-12-19 Gordon Schumacher * locale/xlocale.x (DEFINE_CATEGORY): Fix merge issue. diff --git a/Makeconfig b/Makeconfig index c9fe199..4d15517 100644 --- a/Makeconfig +++ b/Makeconfig @@ -191,12 +191,22 @@ libdir = $(exec_prefix)/lib endif inst_libdir = $(install_root)$(libdir) +# Compat places to look for libraries +ifndef extra_libdir +extra_libdir = /lib:$(exec_prefix)/lib +endif + # Where to install the shared library and dynamic linker. ifndef slibdir slibdir = $(exec_prefix)/lib endif inst_slibdir = $(install_root)$(slibdir) +# Directory of the dynamic linker in the ELF binaries +ifndef rtlddir +rtlddir := $(slibdir) +endif + # Prefix to put on files installed in $(libdir). For libraries `libNAME.a', # the prefix is spliced between `lib' and the name, so the linker switch # `-l$(libprefix)NAME' finds the library; for other files the prefix is @@ -481,7 +491,7 @@ ifndef +link-bounded endif ifndef config-LDFLAGS ifeq (yesyes,$(build-shared)$(elf)) -config-LDFLAGS = -Wl,-dynamic-linker=$(slibdir)/$(rtld-installed-name) +config-LDFLAGS = -Wl,-dynamic-linker=$(rtlddir)/$(rtld-installed-name) endif endif ifndef link-libc @@ -523,6 +533,10 @@ else default-rpath = $(libdir) endif +ifdef extra_libdir +default-rpath += :$(extra_libdir) +endif + ifndef link-extra-libs link-extra-libs = $(LDLIBS-$(@F)) link-extra-libs-static = $(link-extra-libs) diff --git a/Makerules b/Makerules index f99abf4..348da3e 100644 --- a/Makerules +++ b/Makerules @@ -531,6 +531,45 @@ $(common-objpfx)shlib.lds: $(common-objpfx)config.make $(..)Makerules PROVIDE(__start___libc_thread_subfreeres = .);\ __libc_thread_subfreeres : { *(__libc_thread_subfreeres) }\ PROVIDE(__stop___libc_thread_subfreeres = .);\ + PROVIDE(__start__hurd_fd_subinit = .);\ + _hurd_fd_subinit : { *(_hurd_fd_subinit) }\ + PROVIDE(__stop__hurd_fd_subinit = .);\ + PROVIDE(__start__hurd_XXX = .);\ + _hurd_XXX : { *(_hurd_XXX) }\ + PROVIDE(__stop__hurd_XXX = .);\ + PROVIDE(__start__hurd_subinit = .);\ + _hurd_subinit : { *(_hurd_subinit) }\ + PROVIDE(__stop__hurd_subinit = .);\ + PROVIDE(__start__hurd_proc_subinit = .);\ + _hurd_proc_subinit : { *(_hurd_proc_subinit) }\ + PROVIDE(__stop__hurd_proc_subinit = .);\ + PROVIDE(__start__hurd_reauth_hook = .);\ + _hurd_reauth_hook : { *(_hurd_reauth_hook) }\ + PROVIDE(__stop__hurd_reauth_hook = .);\ + PROVIDE(__start__hurd_pgrp_changed_hook = .);\ + _hurd_pgrp_changed_hook : { *(_hurd_pgrp_changed_hook) }\ + PROVIDE(__stop__hurd_pgrp_changed_hook = .);\ + PROVIDE(__start__hurd_preinit_hook = .);\ + _hurd_preinit_hook : { *(_hurd_preinit_hook) }\ + PROVIDE(__stop__hurd_preinit_hook = .);\ + PROVIDE(__start__hurd_fork_prepare_hook = .);\ + _hurd_fork_prepare_hook : { *(_hurd_fork_prepare_hook) }\ + PROVIDE(__stop__hurd_fork_prepare_hook = .);\ + PROVIDE(__start__hurd_fork_setup_hook = .);\ + _hurd_fork_setup_hook : { *(_hurd_fork_setup_hook) }\ + PROVIDE(__stop__hurd_fork_setup_hook = .);\ + PROVIDE(__start__hurd_fork_child_hook = .);\ + _hurd_fork_child_hook : { *(_hurd_fork_child_hook) }\ + PROVIDE(__stop__hurd_fork_child_hook = .);\ + PROVIDE(__start__hurd_fork_parent_hook = .);\ + _hurd_fork_parent_hook : { *(_hurd_fork_parent_hook) }\ + PROVIDE(__stop__hurd_fork_parent_hook = .);\ + PROVIDE(__start__hurd_fork_locks = .);\ + _hurd_fork_locks : { *(_hurd_fork_locks) }\ + PROVIDE(__stop__hurd_fork_locks = .);\ + PROVIDE(__start___pthread_init = .);\ + __pthread_init : { *(__pthread_init) }\ + PROVIDE(__stop___pthread_init = .);\ /DISCARD/ : { *(.gnu.glibc-stub.*) }@' mv -f $@T $@ common-generated += shlib.lds @@ -1044,6 +1083,9 @@ $(inst_libdir)/libc.so: $(common-objpfx)format.lds \ '$(libdir)/$(patsubst %,$(libtype.oS),$(libprefix)$(libc-name))'\ ' AS_NEEDED (' $(slibdir)/$(rtld-installed-name) ') )' \ ) > $@.new +ifeq ($(patsubst gnu%,,$(config-os)),) + echo 'INPUT ( AS_NEEDED ( -lmachuser -lhurduser ) )' >> $@.new +endif mv -f $@.new $@ endif diff --git a/NEWS b/NEWS index da301ec..91facbe 100644 --- a/NEWS +++ b/NEWS @@ -1,4 +1,4 @@ -GNU C Library NEWS -- history of user-visible changes. 2011-1-19 +GNU C Library NEWS -- history of user-visible changes. 2011-5-30 Copyright (C) 1992-2009, 2010, 2011 Free Software Foundation, Inc. See the end for copying conditions. @@ -13,7 +13,7 @@ Version 2.13 11655, 11701, 11840, 11856, 11883, 11903, 11904, 11968, 11979, 12005, 12037, 12067, 12077, 12078, 12092, 12093, 12107, 12108, 12113, 12140, 12159, 12167, 12191, 12194, 12201, 12204, 12205, 12207, 12348, 12378, - 12394, 12397 + 12394, 12397, 12489, 12653, 12454 * New Linux interfaces: prlimit, prlimit64, fanotify_init, fanotify_mark diff --git a/Versions.def b/Versions.def index 0ccda50..e7ec625 100644 --- a/Versions.def +++ b/Versions.def @@ -37,6 +37,9 @@ libc { GCC_3.0 %endif GLIBC_PRIVATE + GLIBC_2.13_DEBIAN_19 + GLIBC_2.13_DEBIAN_31 + GLIBC_2.13_DEBIAN_33 } libcrypt { GLIBC_2.0 @@ -93,6 +96,7 @@ libpthread { GLIBC_2.6 GLIBC_2.11 GLIBC_2.12 + GLIBC_2.13_DEBIAN_38 GLIBC_PRIVATE } libresolv { diff --git a/assert/assert.h b/assert/assert.h index 841f435..8989713 100644 --- a/assert/assert.h +++ b/assert/assert.h @@ -63,6 +63,8 @@ #else /* Not NDEBUG. */ +#ifndef _ASSERT_H_DECLS +#define _ASSERT_H_DECLS __BEGIN_DECLS /* This prints an "Assertion failed" message and aborts. */ @@ -84,6 +86,7 @@ extern void __assert (const char *__assertion, const char *__file, int __line) __END_DECLS +#endif /* Not _ASSERT_H_DECLS */ # define assert(expr) \ ((expr) \ diff --git a/bits/in.h b/bits/in.h index 4687a29..24b21ad 100644 --- a/bits/in.h +++ b/bits/in.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1997, 2000, 2004, 2007 Free Software Foundation, Inc. +/* Copyright (C) 1997-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -22,6 +22,9 @@ # error "Never use directly; include instead." #endif +/* To select the IP level. */ +#define SOL_IP 0 + /* Options for use with `getsockopt' and `setsockopt' at the IP level. The first word in the comment at the right is the data type used; "bool" means a boolean value stored in an `int'. */ @@ -48,9 +51,13 @@ struct ip_opts char ip_opts[40]; /* Actually variable in size. */ }; +/* Socket-level values for IPv6. */ +#define SOL_IPV6 41 +#define SOL_ICMPV6 58 + /* IPV6 socket options. */ #define IPV6_ADDRFORM 1 -#define IPV6_RXINFO 2 +#define IPV6_PKTINFO 2 #define IPV6_HOPOPTS 3 #define IPV6_DSTOPTS 4 #define IPV6_RTHDR 5 @@ -58,8 +65,9 @@ struct ip_opts #define IPV6_CHECKSUM 7 #define IPV6_HOPLIMIT 8 -#define IPV6_TXINFO IPV6_RXINFO -#define SCM_SRCINFO IPV6_TXINFO +#define IPV6_RXINFO IPV6_PKTINFO +#define IPV6_TXINFO IPV6_PKTINFO +#define SCM_SRCINFO IPV6_PKTINFO #define SCM_SRCRT IPV6_RXSRCRT #define IPV6_UNICAST_HOPS 16 diff --git a/bits/ioctl-types.h b/bits/ioctl-types.h index 58b78a6..ccfa4de 100644 --- a/bits/ioctl-types.h +++ b/bits/ioctl-types.h @@ -64,7 +64,7 @@ struct sgttyb }; #define _IOT_sgttyb /* Hurd ioctl type field. */ \ - _IOT (_IOTS (char), 6, _IOTS (short int), 1, 0, 0) + _IOT (_IOTS (char), 4, _IOTS (short int), 1, 0, 0) #if defined TIOCGWINSZ || defined TIOCSWINSZ /* Type of ARG for TIOCGWINSZ and TIOCSWINSZ requests. */ diff --git a/bits/libc-lock.h b/bits/libc-lock.h index 3f9c211..a307f8c 100644 --- a/bits/libc-lock.h +++ b/bits/libc-lock.h @@ -98,6 +98,9 @@ } \ } while (0) +/* Get once control variable. */ +#define __libc_once_get(ONCE_CONTROL) \ + ((ONCE_CONTROL) == 1) /* Start a critical region with a cleanup function */ #define __libc_cleanup_region_start(DOIT, FCT, ARG) \ diff --git a/bits/sched.h b/bits/sched.h index a068e50..9a22ae3 100644 --- a/bits/sched.h +++ b/bits/sched.h @@ -1,6 +1,7 @@ /* Definitions of constants and data structure for POSIX 1003.1b-1993 scheduling interface. - Copyright (C) 1996, 1997, 2001, 2003, 2007 Free Software Foundation, Inc. + Copyright (C) 1996-1999,2001-2003,2005,2006,2007,2008,2009 + Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -56,7 +57,7 @@ struct __sched_param # define __CPU_SETSIZE 1024 # define __NCPUBITS (8 * sizeof (__cpu_mask)) -/* Type for array elements in 'cpu_set'. */ +/* Type for array elements in 'cpu_set_t'. */ typedef unsigned long int __cpu_mask; /* Basic access functions. */ @@ -70,27 +71,83 @@ typedef struct } cpu_set_t; /* Access functions for CPU masks. */ -# define __CPU_ZERO(cpusetp) \ +# if __GNUC_PREREQ (2, 91) +# define __CPU_ZERO_S(setsize, cpusetp) \ + do __builtin_memset (cpusetp, '\0', setsize); while (0) +# else +# define __CPU_ZERO_S(setsize, cpusetp) \ do { \ - unsigned int __i; \ - cpu_set *__arr = (cpusetp); \ - for (__i = 0; __i < sizeof (cpu_set) / sizeof (__cpu_mask); ++__i) \ - __arr->__bits[__i] = 0; \ + size_t __i; \ + size_t __imax = (setsize) / sizeof (__cpu_mask); \ + __cpu_mask *__bits = (cpusetp)->__bits; \ + for (__i = 0; __i < __imax; ++__i) \ + __bits[__i] = 0; \ } while (0) -# define __CPU_SET(cpu, cpusetp) \ - ((cpusetp)->__bits[__CPUELT (cpu)] |= __CPUMASK (cpu)) -# define __CPU_CLR(cpu, cpusetp) \ - ((cpusetp)->__bits[__CPUELT (cpu)] &= ~__CPUMASK (cpu)) -# define __CPU_ISSET(cpu, cpusetp) \ - (((cpusetp)->__bits[__CPUELT (cpu)] & __CPUMASK (cpu)) != 0) +# endif +# define __CPU_SET_S(cpu, setsize, cpusetp) \ + (__extension__ \ + ({ size_t __cpu = (cpu); \ + __cpu < 8 * (setsize) \ + ? (((__cpu_mask *) ((cpusetp)->__bits))[__CPUELT (__cpu)] \ + |= __CPUMASK (__cpu)) \ + : 0; })) +# define __CPU_CLR_S(cpu, setsize, cpusetp) \ + (__extension__ \ + ({ size_t __cpu = (cpu); \ + __cpu < 8 * (setsize) \ + ? (((__cpu_mask *) ((cpusetp)->__bits))[__CPUELT (__cpu)] \ + &= ~__CPUMASK (__cpu)) \ + : 0; })) +# define __CPU_ISSET_S(cpu, setsize, cpusetp) \ + (__extension__ \ + ({ size_t __cpu = (cpu); \ + __cpu < 8 * (setsize) \ + ? ((((__const __cpu_mask *) ((cpusetp)->__bits))[__CPUELT (__cpu)] \ + & __CPUMASK (__cpu))) != 0 \ + : 0; })) + +# define __CPU_COUNT_S(setsize, cpusetp) \ + __sched_cpucount (setsize, cpusetp) + +# if __GNUC_PREREQ (2, 91) +# define __CPU_EQUAL_S(setsize, cpusetp1, cpusetp2) \ + (__builtin_memcmp (cpusetp1, cpusetp2, setsize) == 0) +# else +# define __CPU_EQUAL_S(setsize, cpusetp1, cpusetp2) \ + (__extension__ \ + ({ __const __cpu_mask *__arr1 = (cpusetp1)->__bits; \ + __const __cpu_mask *__arr2 = (cpusetp2)->__bits; \ + size_t __imax = (setsize) / sizeof (__cpu_mask); \ + size_t __i; \ + for (__i = 0; __i < __imax; ++__i) \ + if (__bits[__i] != __bits[__i]) \ + break; \ + __i == __imax; })) +# endif + +# define __CPU_OP_S(setsize, destset, srcset1, srcset2, op) \ + (__extension__ \ + ({ cpu_set_t *__dest = (destset); \ + __const __cpu_mask *__arr1 = (srcset1)->__bits; \ + __const __cpu_mask *__arr2 = (srcset2)->__bits; \ + size_t __imax = (setsize) / sizeof (__cpu_mask); \ + size_t __i; \ + for (__i = 0; __i < __imax; ++__i) \ + ((__cpu_mask *) __dest->__bits)[__i] = __arr1[__i] op __arr2[__i]; \ + __dest; })) + +# define __CPU_ALLOC_SIZE(count) \ + ((((count) + __NCPUBITS - 1) / __NCPUBITS) * sizeof (__cpu_mask)) +# define __CPU_ALLOC(count) __sched_cpualloc (count) +# define __CPU_FREE(cpuset) __sched_cpufree (cpuset) __BEGIN_DECLS extern int __sched_cpucount (size_t __setsize, const cpu_set_t *__setp) __THROW; +extern cpu_set_t *__sched_cpualloc (size_t __count) __THROW __wur; +extern void __sched_cpufree (cpu_set_t *__set) __THROW; __END_DECLS -# define __CPU_COUNT(cpusetp) \ - __sched_cpucount (sizeof (cpu_set_t), cpusetp) #endif diff --git a/bits/sigaction.h b/bits/sigaction.h index adcc276..113515d 100644 --- a/bits/sigaction.h +++ b/bits/sigaction.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1991,92,96,97,98,2001 Free Software Foundation, Inc. +/* Copyright (C) 1991-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -55,6 +55,8 @@ struct sigaction /* Bits in `sa_flags'. */ #if defined __USE_UNIX98 || defined __USE_MISC # define SA_ONSTACK 0x0001 /* Take signal on signal stack. */ +#endif +#if defined __USE_UNIX98 || defined __USE_MISC || defined __USE_XOPEN2K8 # define SA_RESTART 0x0002 /* Restart syscall on signal return. */ # define SA_NODEFER 0x0010 /* Don't automatically block the signal when its handler is being executed. */ diff --git a/bits/stdio-lock.h b/bits/stdio-lock.h index d7c1db0..3407171 100644 --- a/bits/stdio-lock.h +++ b/bits/stdio-lock.h @@ -47,12 +47,21 @@ __libc_lock_define_recursive (typedef, _IO_lock_t) #if defined _LIBC && !defined NOT_IN_libc # define _IO_acquire_lock(_fp) \ - _IO_cleanup_region_start ((void (*) (void *)) _IO_funlockfile, (_fp)); \ - _IO_flockfile (_fp) + { \ + _IO_FILE *_IO_acquire_lock_file = _fp; \ + __libc_cleanup_region_start (1, (void (*) (void *)) _IO_acquire_lock_fct, &_IO_acquire_lock_file); \ + _IO_flockfile (_IO_acquire_lock_file) + +# define _IO_acquire_lock_clear_flags2(_fp) \ + { \ + _IO_FILE *_IO_acquire_lock_file = _fp; \ + __libc_cleanup_region_start (1, (void (*) (void *)) _IO_acquire_lock_clear_flags2_fct, &_IO_acquire_lock_file); \ + _IO_flockfile (_IO_acquire_lock_file) # define _IO_release_lock(_fp) \ - _IO_funlockfile (_fp); \ - _IO_cleanup_region_end (0) + __libc_cleanup_region_end (1); \ + } + #endif #endif /* bits/stdio-lock.h */ diff --git a/catgets/catgets.c b/catgets/catgets.c index 630d93d..640d507 100644 --- a/catgets/catgets.c +++ b/catgets/catgets.c @@ -57,7 +57,7 @@ catopen (const char *cat_name, int flag) size_t len = strlen (nlspath) + 1 + sizeof NLSPATH; tmp = malloc (len); - if (__builtin_expect (tmp == NULL, 0)) + if (__glibc_unlikely (tmp == NULL)) return (nl_catd) -1; __stpcpy (__stpcpy (__stpcpy (tmp, nlspath), ":"), NLSPATH); diff --git a/catgets/open_catalog.c b/catgets/open_catalog.c index dbfcb84..07f4052 100644 --- a/catgets/open_catalog.c +++ b/catgets/open_catalog.c @@ -61,7 +61,7 @@ __open_catalog (const char *cat_name, const char *nlspath, const char *env_var, char *old_buf = buf; \ bufmax += (bufmax < 256 + (n)) ? 256 + (n) : bufmax; \ buf = realloc (buf, bufmax); \ - if (__builtin_expect (buf == NULL, 0)) \ + if (__glibc_unlikely (buf == NULL)) \ { \ free (old_buf); \ return -1; \ diff --git a/config.make.in b/config.make.in index 9080bcc..5532436 100644 --- a/config.make.in +++ b/config.make.in @@ -44,6 +44,11 @@ c++-sysincludes = @CXX_SYSINCLUDES@ all-warnings = @all_warnings@ elf = @elf@ +have-protected = yes +have-z-nodelete = yes +have-z-nodlopen = yes +have-z-initfirst = yes +have-z-relro = yes have-z-combreloc = @libc_cv_z_combreloc@ have-z-execstack = @libc_cv_z_execstack@ have-initfini = @libc_cv_have_initfini@ diff --git a/configure b/configure index 23b2bac..64ae82c 100755 --- a/configure +++ b/configure @@ -4046,6 +4046,11 @@ if test "$machine" = rs6000; then machine="powerpc" fi +# Force v9 +if test "$machine" = sparc; then + machine="sparcv9" +fi + # Braindead PowerPC box with absolutely no FPU. case "$machine-$host_os" in powerpc*-*soft) diff --git a/configure.in b/configure.in index d58a6e3..7062d24 100644 --- a/configure.in +++ b/configure.in @@ -373,6 +373,11 @@ if test "$machine" = rs6000; then machine="powerpc" fi +# Force v9 +if test "$machine" = sparc; then + machine="sparcv9" +fi + # Braindead PowerPC box with absolutely no FPU. case "$machine-$host_os" in powerpc*-*soft) diff --git a/csu/libc-start.c b/csu/libc-start.c index 9c06865..d50ccf3 100644 --- a/csu/libc-start.c +++ b/csu/libc-start.c @@ -39,6 +39,12 @@ extern void __pthread_initialize_minimal (void); in thread local area. */ uintptr_t __stack_chk_guard attribute_relro; # endif +# ifndef THREAD_SET_POINTER_GUARD +/* Only exported for architectures that don't store the pointer guard + value in thread local area. */ +uintptr_t __pointer_chk_guard_local + attribute_relro attribute_hidden __attribute__ ((nocommon)); +# endif #endif #ifdef HAVE_PTR_NTHREADS @@ -140,10 +146,12 @@ LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL), /* Performe IREL{,A} relocations. */ __libc_csu_irel (); +#ifndef __GNU__ /* Initialize the thread library at least a bit since the libgcc functions are using thread functions if these are available and we need to setup errno. */ __pthread_initialize_minimal (); +#endif /* Set up the stack checker's canary. */ uintptr_t stack_chk_guard = _dl_setup_stack_chk_guard (_dl_random); @@ -152,6 +160,16 @@ LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL), # else __stack_chk_guard = stack_chk_guard; # endif + + /* Set up the pointer guard value. */ + uintptr_t pointer_chk_guard = _dl_setup_pointer_guard (_dl_random, + stack_chk_guard); +# ifdef THREAD_SET_POINTER_GUARD + THREAD_SET_POINTER_GUARD (pointer_chk_guard); +# else + __pointer_chk_guard_local = pointer_chk_guard; +# endif + #endif /* Register the destructor of the dynamic linker if there is any. */ diff --git a/dlfcn/Makefile b/dlfcn/Makefile index da0d9d5..6e2a975 100644 --- a/dlfcn/Makefile +++ b/dlfcn/Makefile @@ -130,7 +130,8 @@ $(objpfx)bug-atexit1.out: $(objpfx)bug-atexit1-lib.so $(objpfx)bug-atexit2: $(libdl) $(objpfx)bug-atexit2.out: $(objpfx)bug-atexit2-lib.so -LDLIBS-bug-atexit3-lib.so = -lstdc++ -lgcc_eh $(common-objpfx)libc_nonshared.a +LDLIBS-bug-atexit3-lib.so = -lstdc++ -lgcc_eh $(common-objpfx)libc_nonshared.a \ + $(elfobjdir)/ld.so $(objpfx)bug-atexit3: $(libdl) $(objpfx)bug-atexit3.out: $(objpfx)bug-atexit3-lib.so diff --git a/eglibc-common.manifest b/eglibc-common.manifest deleted file mode 100644 index 34308f6..0000000 --- a/eglibc-common.manifest +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/eglibc.manifest b/eglibc.manifest index 00c0b55..abf214c 100644 --- a/eglibc.manifest +++ b/eglibc.manifest @@ -3,16 +3,6 @@ - - - - - - - - - - - + diff --git a/elf/Makefile b/elf/Makefile index 237bd12..4c8ff1f 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -23,7 +23,7 @@ subdir := elf headers = elf.h bits/elfclass.h link.h bits/link.h routines = $(dl-routines) dl-support dl-iteratephdr \ dl-addr enbl-secure dl-profstub \ - dl-origin dl-libc dl-sym dl-tsd dl-sysdep + dl-origin dl-libc dl-sym dl-tsd dl-sysdep dl-altinit # The core dynamic linking functions are in libc for the static and # profiled libraries. @@ -42,6 +42,10 @@ shared-only-routines += dl-caller rtld-routines := rtld $(dl-routines) dl-sysdep dl-environ dl-minimal all-rtld-routines = $(rtld-routines) $(sysdep-rtld-routines) +# We only need to re-run initializers if ld.so and libc.so might be built +# for different machines, so only shared libraries need dl-altinit. +shared-only-routines = dl-altinit + distribute := rtld-Rules \ $(rtld-routines:=.c) dynamic-link.h do-rel.h dl-machine.h \ dl-cache.h dl-hash.h soinit.c sofini.c ldd.bash.in \ @@ -76,6 +80,7 @@ distribute := rtld-Rules \ tst-tlsmod12.c tst-tls10.h tst-alignmod.c tst-alignmod2.c \ circlemod1.c circlemod1a.c circlemod2.c circlemod2a.c \ circlemod3.c circlemod3a.c nodlopenmod2.c \ + tst-tls19mod1.c tst-tls19mod2.c tst-tls19mod3.c \ tls-macros.h \ reldep8mod1.c reldep8mod2.c reldep8mod3.c \ nodel2mod1.c nodel2mod2.c nodel2mod3.c \ @@ -174,7 +179,7 @@ ifeq (yes,$(have-initfini-array)) tests += tst-array1 tst-array2 tst-array3 tst-array4 tst-array5 endif ifeq (yes,$(build-static)) -tests-static = tst-tls1-static tst-tls2-static tst-stackguard1-static +tests-static = tst-tls1-static tst-tls2-static tst-stackguard1-static tst-ptrguard1-static ifeq (yesyesyes,$(build-static)$(build-shared)$(elf)) tests-static += tst-tls9-static tst-tls9-static-ENV = \ @@ -195,7 +200,7 @@ tests += loadtest restest1 preloadtest loadfail multiload origtest resolvfail \ restest2 next dblload dblunload reldep5 reldep6 reldep7 reldep8 \ circleload1 tst-tls3 tst-tls4 tst-tls5 tst-tls6 tst-tls7 tst-tls8 \ tst-tls10 tst-tls11 tst-tls12 tst-tls13 tst-tls14 tst-tls15 \ - tst-tls16 tst-tls17 tst-tls18 tst-tls-dlinfo \ + tst-tls16 tst-tls17 tst-tls18 tst-tls19 tst-tls-dlinfo \ tst-align tst-align2 $(tests-execstack-$(have-z-execstack)) \ tst-dlmodcount tst-dlopenrpath tst-deep1 \ tst-dlmopen1 tst-dlmopen2 tst-dlmopen3 \ @@ -203,7 +208,8 @@ tests += loadtest restest1 preloadtest loadfail multiload origtest resolvfail \ tst-audit1 tst-audit2 \ tst-stackguard1 tst-addr1 tst-thrlock \ tst-unique1 tst-unique2 \ - tst-initorder + tst-initorder \ + tst-ptrguard1 # reldep9 test-srcs = tst-pathopt tests-execstack-yes = tst-execstack tst-execstack-needed tst-execstack-prog @@ -241,6 +247,7 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \ tst-tlsmod13 tst-tlsmod13a tst-tlsmod14a tst-tlsmod14b \ tst-tlsmod15a tst-tlsmod15b tst-tlsmod16a tst-tlsmod16b \ $(tlsmod17a-modules) tst-tlsmod17b $(tlsmod18a-modules) \ + tst-tls19mod1 tst-tls19mod2 tst-tls19mod3 \ circlemod1 circlemod1a circlemod2 circlemod2a \ circlemod3 circlemod3a \ reldep8mod1 reldep8mod2 reldep8mod3 \ @@ -393,7 +400,7 @@ $(objpfx)ld.so: $(objpfx)librtld.os $(ld-map) | $(AWK) '($$7 ~ /^UND(|EF)$$/ && $$1 != "0:" && $$4 != "REGISTER") { print; p=1 } END { exit p != 0 }' # interp.c exists just to get this string into the libraries. -CFLAGS-interp.c = -D'RUNTIME_LINKER="$(slibdir)/$(rtld-installed-name)"' \ +CFLAGS-interp.c = -D'RUNTIME_LINKER="$(rtlddir)/$(rtld-installed-name)"' \ -DNOT_IN_libc=1 $(objpfx)interp.os: $(common-objpfx)config.make @@ -415,7 +422,7 @@ $(objpfx)trusted-dirs.st: Makefile $(..)Makeconfig $(make-target-directory) echo "$(subst :, ,$(default-rpath) $(user-defined-trusted-dirs))" \ | $(AWK) -f gen-trusted-dirs.awk > ${@:st=T}; - echo '#define DL_DST_LIB "$(notdir $(slibdir))"' >> ${@:st=T} + echo '#define DL_DST_LIB "$(shell echo $(slibdir) | sed 's,/,,')"' >> ${@:st=T} $(move-if-change) ${@:st=T} ${@:st=h} touch $@ CPPFLAGS-dl-load.c = -I$(objpfx). -I$(csu-objpfx). @@ -436,7 +443,7 @@ ldso_install: $(inst_slibdir)/$(rtld-installed-name) endif -common-ldd-rewrite = -e 's%@RTLD@%$(slibdir)/$(rtld-installed-name)%g' \ +common-ldd-rewrite = -e 's%@RTLD@%$(rtlddir)/$(rtld-installed-name)%g' \ -e 's%@VERSION@%$(version)%g' \ -e 's%@PKGVERSION@%$(PKGVERSION)%g' \ -e 's%@REPORT_BUGS_TO@%$(REPORT_BUGS_TO)%g' @@ -527,6 +534,8 @@ $(objpfx)tst-tlsmod13a.so: $(objpfx)tst-tlsmod13.so # For tst-tls9-static, make sure the modules it dlopens have libc.so in DT_NEEDED $(objpfx)tst-tlsmod5.so: $(common-objpfx)libc.so $(objpfx)tst-tlsmod6.so: $(common-objpfx)libc.so +$(objpfx)tst-tls19mod1.so: $(objpfx)tst-tls19mod2.so $(objpfx)tst-tls19mod3.so +$(objpfx)tst-tls19mod3.so: $(objpfx)ld.so $(objpfx)reldep8mod3.so: $(objpfx)reldep8mod1.so $(objpfx)reldep8mod2.so $(objpfx)nodel2mod3.so: $(objpfx)nodel2mod1.so $(objpfx)nodel2mod2.so $(objpfx)reldep9mod2.so: $(objpfx)reldep9mod1.so @@ -824,6 +833,9 @@ $(patsubst %,$(objpfx)%.os,$(tlsmod18a-modules)): $(objpfx)tst-tlsmod18a%.os : t $(compile-command.c) -DN=$* $(patsubst %,$(objpfx)%.so,$(tlsmod18a-modules)): $(objpfx)tst-tlsmod18a%.so: $(objpfx)ld.so +$(objpfx)tst-tls19: $(libdl) +$(objpfx)tst-tls19.out: $(objpfx)tst-tls19mod1.so + CFLAGS-tst-align.c = $(stack-align-test-flags) CFLAGS-tst-align2.c = $(stack-align-test-flags) CFLAGS-tst-alignmod.c = $(stack-align-test-flags) @@ -1065,6 +1077,12 @@ order2mod2.so-no-z-defs = yes tst-stackguard1-ARGS = --command "$(local-built-program-cmd) --child" tst-stackguard1-static-ARGS = --command "$(objpfx)tst-stackguard1-static --child" +tst-ptrguard1-ARGS = --command "$(local-built-program-cmd) --child" +# When built statically, the pointer guard interface uses +# __pointer_chk_guard_local. +CFLAGS-tst-ptrguard1-static.c = -DPTRGUARD_LOCAL +tst-ptrguard1-static-ARGS = --command "$(objpfx)tst-ptrguard1-static --child" + $(objpfx)tst-leaks1: $(libdl) $(objpfx)tst-leaks1-mem: $(objpfx)tst-leaks1.out $(common-objpfx)malloc/mtrace $(objpfx)tst-leaks1.mtrace > $@ @@ -1191,6 +1209,7 @@ $(objpfx)tst-unique2: $(libdl) $(objpfx)tst-unique2mod1.so $(objpfx)tst-unique2.out: $(objpfx)tst-unique2mod2.so $(objpfx)tst-initorder.out: $(objpfx)tst-initorder + $(cross-test-wrapper) \ $(elf-objpfx)${rtld-installed-name} \ --library-path $(rpath-link)$(patsubst %,:%,$(sysdep-library-path)) \ $< > $@ diff --git a/elf/cache.c b/elf/cache.c index b8561e4..9f5be3a 100644 --- a/elf/cache.c +++ b/elf/cache.c @@ -91,6 +91,10 @@ print_entry (const char *lib, int flag, unsigned int osversion, break; case FLAG_MIPS64_LIBN64: fputs (",64bit", stdout); + break; + case FLAG_ARM_LIBHF: + fputs (",hard-float", stdout); + break; case 0: break; default: @@ -426,6 +430,7 @@ save_cache (const char *cache_name) } if (write (fd, strings, total_strlen) != (ssize_t) total_strlen + || fsync (fd) || close (fd)) error (EXIT_FAILURE, errno, _("Writing of cache data failed")); diff --git a/elf/dl-altinit.c b/elf/dl-altinit.c new file mode 100644 index 0000000..5325917 --- /dev/null +++ b/elf/dl-altinit.c @@ -0,0 +1,43 @@ +/* Extra initializers for shared libc. + Copyright (C) 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include +#include + +/* This file is used from the shared libc, to initialize anything which + ld.so should have initialized but didn't - for instance, if ld.so + is built for a machine without HP_TIMING but libc.so is built for + a machine with HP_TIMING, clock_gettime will expect dl_cpuclock_offset + to be initialized. */ + +static void +dlinit_hptiming (void) +{ +#if HP_TIMING_AVAIL || HP_SMALL_TIMING_AVAIL + if (GL(dl_cpuclock_offset) == 0) + HP_TIMING_NOW (GL(dl_cpuclock_offset)); +#endif +} + +static void dlinit_alt (void) __attribute__((constructor)); +static void +dlinit_alt (void) +{ + dlinit_hptiming (); +} diff --git a/elf/dl-cache.c b/elf/dl-cache.c index 544704c..e107e72 100644 --- a/elf/dl-cache.c +++ b/elf/dl-cache.c @@ -245,6 +245,7 @@ _dl_load_cache_lookup (const char *name) if (cache_new != (void *) -1) { uint64_t platform; + int disable_hwcap = 0; /* This is where the strings start. */ cache_data = (const char *) cache_new; @@ -256,6 +257,9 @@ _dl_load_cache_lookup (const char *name) if (platform != (uint64_t) -1) platform = 1ULL << platform; + if (__access ("/etc/ld.so.nohwcap", F_OK) == 0) + disable_hwcap = 1; + #define _DL_HWCAP_TLS_MASK (1LL << 63) uint64_t hwcap_exclude = ~((GLRO(dl_hwcap) & GLRO(dl_hwcap_mask)) | _DL_HWCAP_PLATFORM | _DL_HWCAP_TLS_MASK); @@ -266,6 +270,8 @@ _dl_load_cache_lookup (const char *name) continue; \ if (GLRO(dl_osversion) && lib->osversion > GLRO(dl_osversion)) \ continue; \ + if (disable_hwcap && lib->hwcap != 0) \ + continue; \ if (_DL_PLATFORMS_COUNT \ && (lib->hwcap & _DL_HWCAP_PLATFORM) != 0 \ && (lib->hwcap & _DL_HWCAP_PLATFORM) != platform) \ diff --git a/elf/dl-close.c b/elf/dl-close.c index 866c0a6..c895b15 100644 --- a/elf/dl-close.c +++ b/elf/dl-close.c @@ -421,6 +421,13 @@ _dl_close_worker (struct link_map *map) imap->l_scope_max = new_size; } + else if (new_list != NULL) + { + /* We didn't change the scope array, so reset the search + list. */ + imap->l_searchlist.r_list = NULL; + imap->l_searchlist.r_nlist = 0; + } /* The loader is gone, so mark the object as not having one. Note: l_idx != IDX_STILL_USED -> object will be removed. */ diff --git a/elf/dl-deps.c b/elf/dl-deps.c index 524d76e..6631412 100644 --- a/elf/dl-deps.c +++ b/elf/dl-deps.c @@ -613,61 +613,64 @@ Filters not supported with LD_TRACE_PRELINKING")); map->l_searchlist.r_list[i]->l_reserved = 0; } - /* Now determine the order in which the initialization has to happen. */ + /* Sort the initializer list to take dependencies into account. The binary + itself will always be initialize last. */ memcpy (l_initfini, map->l_searchlist.r_list, nlist * sizeof (struct link_map *)); - - /* We can skip looking for the binary itself which is at the front - of the search list. */ - assert (nlist > 1); - i = 1; - bool seen[nlist]; - memset (seen, false, nlist * sizeof (seen[0])); - while (1) + if (__builtin_expect (nlist > 1, 1)) { - /* Keep track of which object we looked at this round. */ - seen[i] = true; - struct link_map *thisp = l_initfini[i]; - - /* Find the last object in the list for which the current one is - a dependency and move the current object behind the object - with the dependency. */ - unsigned int k = nlist - 1; - while (k > i) + /* We can skip looking for the binary itself which is at the front + of the search list. */ + i = 1; + bool seen[nlist]; + memset (seen, false, nlist * sizeof (seen[0])); + while (1) { - struct link_map **runp = l_initfini[k]->l_initfini; - if (runp != NULL) - /* Look through the dependencies of the object. */ - while (*runp != NULL) - if (__builtin_expect (*runp++ == thisp, 0)) - { - /* Move the current object to the back past the last - object with it as the dependency. */ - memmove (&l_initfini[i], &l_initfini[i + 1], - (k - i) * sizeof (l_initfini[0])); - l_initfini[k] = thisp; - - if (seen[i + 1]) + /* Keep track of which object we looked at this round. */ + seen[i] = true; + struct link_map *thisp = l_initfini[i]; + + /* Find the last object in the list for which the current one is + a dependency and move the current object behind the object + with the dependency. */ + unsigned int k = nlist - 1; + while (k > i) + { + struct link_map **runp = l_initfini[k]->l_initfini; + if (runp != NULL) + /* Look through the dependencies of the object. */ + while (*runp != NULL) + if (__builtin_expect (*runp++ == thisp, 0)) { - ++i; - goto next_clear; + /* Move the current object to the back past the last + object with it as the dependency. */ + memmove (&l_initfini[i], &l_initfini[i + 1], + (k - i) * sizeof (l_initfini[0])); + l_initfini[k] = thisp; + + if (seen[i + 1]) + { + ++i; + goto next_clear; + } + + memmove (&seen[i], &seen[i + 1], + (k - i) * sizeof (seen[0])); + seen[k] = true; + + goto next; } - memmove (&seen[i], &seen[i + 1], (k - i) * sizeof (seen[0])); - seen[k] = true; + --k; + } - goto next; - } + if (++i == nlist) + break; + next_clear: + memset (&seen[i], false, (nlist - i) * sizeof (seen[0])); - --k; + next:; } - - if (++i == nlist) - break; - next_clear: - memset (&seen[i], false, (nlist - i) * sizeof (seen[0])); - - next:; } /* Terminate the list of dependencies. */ diff --git a/elf/dl-fini.c b/elf/dl-fini.c index c8c9a52..f3a1c7c 100644 --- a/elf/dl-fini.c +++ b/elf/dl-fini.c @@ -33,9 +33,12 @@ internal_function _dl_sort_fini (struct link_map *l, struct link_map **maps, size_t nmaps, char *used, Lmid_t ns) { + /* A list of one element need not be sorted. */ + if (nmaps == 1) + return; + /* We can skip looking for the binary itself which is at the front of the search list for the main namespace. */ - assert (nmaps > 1); unsigned int i = ns == LM_ID_BASE; bool seen[nmaps]; memset (seen, false, nmaps * sizeof (seen[0])); @@ -195,9 +198,8 @@ _dl_fini (void) assert (ns == LM_ID_BASE || i == nloaded || i == nloaded - 1); nmaps = i; - if (nmaps > 1) - /* Now we have to do the sorting. */ - _dl_sort_fini (GL(dl_ns)[ns]._ns_loaded, maps, nmaps, NULL, ns); + /* Now we have to do the sorting. */ + _dl_sort_fini (GL(dl_ns)[ns]._ns_loaded, maps, nmaps, NULL, ns); /* We do not rely on the linked list of loaded object anymore from this point on. We have our own list here (maps). The various diff --git a/elf/dl-fptr.c b/elf/dl-fptr.c index e068124..0853894 100644 --- a/elf/dl-fptr.c +++ b/elf/dl-fptr.c @@ -1,5 +1,5 @@ /* Manage function descriptors. Generic version. - Copyright (C) 1999-2004, 2006 Free Software Foundation, Inc. + Copyright (C) 1999-2004, 2006, 2010 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -56,7 +56,12 @@ static struct local } local = { +#ifndef SHARED .root = &local.boot_table, +#else + /* Address of .boot_table is not known until runtime. */ + .root = 0, +#endif .npages = 2, .boot_table = { @@ -93,6 +98,17 @@ new_fdesc_table (struct local *l, size_t *size) return new_table; } +/* Must call _dl_fptr_init before using any other function. */ +void +_dl_fptr_init (void) +{ + struct local *l; + + ELF_MACHINE_LOAD_ADDRESS (l, local); + /* Initialize root once. */ + if (__builtin_expect (l->root == 0, 0)) + l->root = &l->boot_table; +} static ElfW(Addr) make_fdesc (ElfW(Addr) ip, ElfW(Addr) gp) diff --git a/elf/dl-load.c b/elf/dl-load.c index b017258..da2d951 100644 --- a/elf/dl-load.c +++ b/elf/dl-load.c @@ -168,6 +168,87 @@ local_strdup (const char *s) } +static bool +is_trusted_path (const char *path, size_t len) +{ + const char *trun = system_dirs; + + for (size_t idx = 0; idx < nsystem_dirs_len; ++idx) + { + if (len == system_dirs_len[idx] && memcmp (trun, path, len) == 0) + /* Found it. */ + return true; + + trun += system_dirs_len[idx] + 1; + } + + return false; +} + + +static bool +is_trusted_path_normalize (const char *path, size_t len) +{ + if (len == 0) + return false; + + if (*path == ':') + { + ++path; + --len; + } + + char *npath = (char *) alloca (len + 2); + char *wnp = npath; + while (*path != '\0') + { + if (path[0] == '/') + { + if (path[1] == '.') + { + if (path[2] == '.' && (path[3] == '/' || path[3] == '\0')) + { + while (wnp > npath && *--wnp != '/') + ; + path += 3; + continue; + } + else if (path[2] == '/' || path[2] == '\0') + { + path += 2; + continue; + } + } + + if (wnp > npath && wnp[-1] == '/') + { + ++path; + continue; + } + } + + *wnp++ = *path++; + } + + if (wnp == npath || wnp[-1] != '/') + *wnp++ = '/'; + + const char *trun = system_dirs; + + for (size_t idx = 0; idx < nsystem_dirs_len; ++idx) + { + if (wnp - npath >= system_dirs_len[idx] + && memcmp (trun, npath, system_dirs_len[idx]) == 0) + /* Found it. */ + return true; + + trun += system_dirs_len[idx] + 1; + } + + return false; +} + + static size_t is_dst (const char *start, const char *name, const char *str, int is_path, int secure) @@ -200,7 +281,8 @@ is_dst (const char *start, const char *name, const char *str, return 0; if (__builtin_expect (secure, 0) - && ((name[len] != '\0' && (!is_path || name[len] != ':')) + && ((name[len] != '\0' && name[len] != '/' + && (!is_path || name[len] != ':')) || (name != start + 1 && (!is_path || name[-2] != ':')))) return 0; @@ -240,13 +322,14 @@ _dl_dst_substitute (struct link_map *l, const char *name, char *result, int is_path) { const char *const start = name; - char *last_elem, *wp; /* Now fill the result path. While copying over the string we keep track of the start of the last path element. When we come accross a DST we copy over the value or (if the value is not available) leave the entire path element out. */ - last_elem = wp = result; + char *wp = result; + char *last_elem = result; + bool check_for_trusted = false; do { @@ -265,6 +348,9 @@ _dl_dst_substitute (struct link_map *l, const char *name, char *result, else #endif repl = l->l_origin; + + check_for_trusted = (INTUSE(__libc_enable_secure) + && l->l_type == lt_executable); } else if ((len = is_dst (start, name, "PLATFORM", is_path, 0)) != 0) repl = GLRO(dl_platform); @@ -284,6 +370,10 @@ _dl_dst_substitute (struct link_map *l, const char *name, char *result, name += len; while (*name != '\0' && (!is_path || *name != ':')) ++name; + /* Also skip following colon if this is the first rpath + element, but keep an empty element at the end. */ + if (wp == result && is_path && *name == ':' && name[1] != '\0') + ++name; } else /* No DST we recognize. */ @@ -293,11 +383,28 @@ _dl_dst_substitute (struct link_map *l, const char *name, char *result, { *wp++ = *name++; if (is_path && *name == ':') - last_elem = wp; + { + /* In SUID/SGID programs, after $ORIGIN expansion the + normalized path must be rooted in one of the trusted + directories. */ + if (__builtin_expect (check_for_trusted, false) + && !is_trusted_path_normalize (last_elem, wp - last_elem)) + wp = last_elem; + else + last_elem = wp; + + check_for_trusted = false; + } } } while (*name != '\0'); + /* In SUID/SGID programs, after $ORIGIN expansion the normalized + path must be rooted in one of the trusted directories. */ + if (__builtin_expect (check_for_trusted, false) + && !is_trusted_path_normalize (last_elem, wp - last_elem)) + wp = last_elem; + *wp = '\0'; return result; @@ -310,7 +417,7 @@ _dl_dst_substitute (struct link_map *l, const char *name, char *result, belonging to the map is loaded. In this case the path element containing $ORIGIN is left out. */ static char * -expand_dynamic_string_token (struct link_map *l, const char *s) +expand_dynamic_string_token (struct link_map *l, const char *s, int is_path) { /* We make two runs over the string. First we determine how large the resulting string is and then we copy it over. Since this is no @@ -321,7 +428,7 @@ expand_dynamic_string_token (struct link_map *l, const char *s) char *result; /* Determine the number of DST elements. */ - cnt = DL_DST_COUNT (s, 1); + cnt = DL_DST_COUNT (s, is_path); /* If we do not have to replace anything simply copy the string. */ if (__builtin_expect (cnt, 0) == 0) @@ -335,7 +442,7 @@ expand_dynamic_string_token (struct link_map *l, const char *s) if (result == NULL) return NULL; - return _dl_dst_substitute (l, s, result, 1); + return _dl_dst_substitute (l, s, result, is_path); } @@ -407,33 +514,8 @@ fillin_rpath (char *rpath, struct r_search_path_elem **result, const char *sep, cp[len++] = '/'; /* Make sure we don't use untrusted directories if we run SUID. */ - if (__builtin_expect (check_trusted, 0)) - { - const char *trun = system_dirs; - size_t idx; - int unsecure = 1; - - /* All trusted directories must be complete names. */ - if (cp[0] == '/') - { - for (idx = 0; idx < nsystem_dirs_len; ++idx) - { - if (len == system_dirs_len[idx] - && memcmp (trun, cp, len) == 0) - { - /* Found it. */ - unsecure = 0; - break; - } - - trun += system_dirs_len[idx] + 1; - } - } - - if (unsecure) - /* Simply drop this directory. */ - continue; - } + if (__builtin_expect (check_trusted, 0) && !is_trusted_path (cp, len)) + continue; /* See if this directory is already known. */ for (dirp = GL(dl_all_dirs); dirp != NULL; dirp = dirp->next) @@ -551,13 +633,21 @@ decompose_rpath (struct r_search_path_struct *sps, /* Make a writable copy. At the same time expand possible dynamic string tokens. */ - copy = expand_dynamic_string_token (l, rpath); + copy = expand_dynamic_string_token (l, rpath, 1); if (copy == NULL) { errstring = N_("cannot create RUNPATH/RPATH copy"); goto signal_error; } + /* Ignore empty rpaths. */ + if (*copy == 0) + { + free (copy); + sps->dirs = (struct r_search_path_elem **) -1; + return false; + } + /* Count the number of necessary elements in the result array. */ nelems = 0; for (cp = copy; *cp != '\0'; ++cp) @@ -1388,7 +1478,11 @@ cannot allocate TLS data structures for initial thread"); if (__builtin_expect (p + s <= relro_end, 1)) { /* The variable lies in the region protected by RELRO. */ - __mprotect ((void *) p, s, PROT_READ|PROT_WRITE); + if (__mprotect ((void *) p, s, PROT_READ|PROT_WRITE) < 0) + { + errstring = N_("cannot change memory protections"); + goto call_lose_errno; + } __stack_prot |= PROT_READ|PROT_WRITE|PROT_EXEC; __mprotect ((void *) p, s, PROT_READ); } @@ -1547,6 +1641,208 @@ print_search_path (struct r_search_path_elem **list, _dl_debug_printf_c ("\t\t(%s)\n", what); } +#ifdef __arm__ +/* Read an unsigned leb128 value from P, store the value in VAL, return + P incremented past the value. We assume that a word is large enough to + hold any value so encoded; if it is smaller than a pointer on some target, + pointers should not be leb128 encoded on that target. */ +static const unsigned char * +read_uleb128 (const unsigned char *p, unsigned long *val) +{ + unsigned int shift = 0; + unsigned char byte; + unsigned long result; + + result = 0; + do + { + byte = *p++; + result |= (byte & 0x7f) << shift; + shift += 7; + } + while (byte & 0x80); + + *val = result; + return p; +} + + +#define ATTR_TAG_FILE 1 +#define ABI_VFP_args 28 +#define VFP_ARGS_IN_VFP_REGS 1 + +/* Check consistency of ABI in the ARM attributes. Search through the + section headers looking for the ARM attributes section, then + check the VFP_ARGS attribute. */ +static int +check_arm_attributes_hfabi(int fd, ElfW(Ehdr) *ehdr, bool *is_hf) +{ + unsigned int i; + ElfW(Shdr) *shdrs; + int sh_size = ehdr->e_shentsize * ehdr->e_shnum; + + /* Load in the section headers so we can look for the attributes + * section */ + shdrs = alloca(sh_size); + __lseek (fd, ehdr->e_shoff, SEEK_SET); + if ((size_t) __libc_read (fd, (void *) shdrs, sh_size) != sh_size) + return -1; + + for (i = 0; i < ehdr->e_shnum; i++) + { + if (SHT_ARM_ATTRIBUTES == shdrs[i].sh_type) + { + /* We've found a likely section. Load the contents and + * check the tags */ + unsigned char *contents = alloca(shdrs[i].sh_size); + unsigned char *p = contents; + unsigned char * end; + + __lseek (fd, shdrs[i].sh_offset, SEEK_SET); + if ((size_t) __libc_read (fd, (void *) contents, shdrs[i].sh_size) != shdrs[i].sh_size) + return -1; + + /* Sanity-check the attribute section details. Make sure + * that it's the "aeabi" section, that's all we care + * about. */ + if (*p == 'A') + { + unsigned long len = shdrs[i].sh_size - 1; + unsigned long namelen; + p++; + + while (len > 0) + { + unsigned long section_len = p[0] | p[1] << 8 | p[2] << 16 | p[3] << 24; + if (section_len > len) + { + _dl_debug_printf_c (" invalid section len %lu, max remaining %lu\n", section_len, len); + section_len = len; + } + + p += 4; + len -= section_len; + section_len -= 4; + + if (0 != strcmp((char *)p, "aeabi")) + { + _dl_debug_printf_c (" ignoring unknown attr section %s\n", p); + p += section_len; + continue; + } + namelen = strlen((char *)p) + 1; + p += namelen; + section_len -= namelen; + + /* We're in a valid section. Walk through this + * section looking for the tag we care about + * (ABI_VFP_args) */ + while (section_len > 0) + { + unsigned long tag, val; + unsigned long size; + + end = p; + tag = (*p++); + + size = p[0] | p[1] << 8 | p[2] << 16 | p[3] << 24; + if (size > section_len) + { + _dl_debug_printf_c (" invalid subsection length %lu, max allowed %lu\n", size, section_len); + size = section_len; + } + p += 4; + + section_len -= size; + end += size; + if (ATTR_TAG_FILE != tag) + { + /* ignore, we don't care */ + _dl_debug_printf_c (" ignoring unknown subsection with type %u length %lu\n", tag, size); + p = end; + continue; + } + while (p < end) + { + p = read_uleb128 (p, &tag); + /* Handle the different types of tag. */ + if ( (tag == 4) || (tag == 5) || (tag == 67) ) + { + /* Special cases for string values */ + namelen = strlen((char *)p) + 1; + p += namelen; + } + else + { + p = read_uleb128 (p, &val); + } + if ( (tag == ABI_VFP_args) && (val == VFP_ARGS_IN_VFP_REGS) ) + { + *is_hf = 1; + return 0; + } + } + } + } + } + } + } + + return 0; +} + + +/* ARM-specific checks. If we're built using the HF ABI, then fail any + attempts to use the SF ABI (and vice versa). Then, check for + consistency of ABI in terms of passing VFP args. */ +static int +arm_specific_checks(int fd, const char *name, ElfW(Ehdr) *ehdr) +{ + static int all_hf = -1; /* unset */ + bool is_hf = false; + int ret; + + ret = check_arm_attributes_hfabi(fd, ehdr, &is_hf); + if (ret != 0) + return ret; + +#ifdef __ARM_PCS_VFP + if (!is_hf) + return EINVAL; +#else + if (is_hf) + return EINVAL; +#endif + + if (all_hf == -1) + { + if (is_hf) + all_hf = 1; + else + all_hf = 0; + } + else if (all_hf == 1 && !is_hf) + return EINVAL; + else if (all_hf == 0 && is_hf) + return EINVAL; + return 0; +} +#endif + + +/* Run any architecture-specific checks that might be needed for the + current architecture. */ +static int +arch_specific_checks(int fd, const char *name, ElfW(Ehdr) *ehdr) +{ +#ifdef __arm__ + return arm_specific_checks(fd, name, ehdr); +#endif + + return 0; +} + + /* Open a file and verify it is an ELF file for this architecture. We ignore only ELF files for other architectures. Non-ELF files and ELF files with different header information cause fatal errors since @@ -1745,6 +2041,7 @@ open_verify (const char *name, struct filebuf *fbp, struct link_map *loader, /* Check .note.ABI-tag if present. */ for (ph = phdr; ph < &phdr[ehdr->e_phnum]; ++ph) + { if (ph->p_type == PT_NOTE && ph->p_filesz >= 32 && ph->p_align >= 4) { ElfW(Addr) size = ph->p_filesz; @@ -1793,6 +2090,21 @@ open_verify (const char *name, struct filebuf *fbp, struct link_map *loader, break; } } + if (-1 != fd) + { + int error = arch_specific_checks(fd, name, ehdr); + if (EINVAL == error) + { + goto close_and_out; + } + if (0 != error) + { + errstring = N_("Unable to run arch-specific checks\n"); + goto call_lose; + } + } + + } return fd; } @@ -1988,10 +2300,13 @@ _dl_map_object (struct link_map *loader, const char *name, soname = ((const char *) D_PTR (l, l_info[DT_STRTAB]) + l->l_info[DT_SONAME]->d_un.d_val); if (strcmp (name, soname) != 0) +#ifdef __arm__ + if (strcmp(name, "ld-linux.so.3") || strcmp(soname, "ld-linux-armhf.so.3")) +#endif continue; /* We have a match on a new name -- cache it. */ - add_name_to_object (l, soname); + add_name_to_object (l, name); l->l_soname_added = 1; } @@ -2175,7 +2490,7 @@ _dl_map_object (struct link_map *loader, const char *name, { /* The path may contain dynamic string tokens. */ realname = (loader - ? expand_dynamic_string_token (loader, name) + ? expand_dynamic_string_token (loader, name, 0) : local_strdup (name)); if (realname == NULL) fd = -1; diff --git a/elf/dl-lookup.c b/elf/dl-lookup.c index 16d7fbc..a633c86 100644 --- a/elf/dl-lookup.c +++ b/elf/dl-lookup.c @@ -313,39 +313,21 @@ do_lookup_x (const char *undef_name, uint_fast32_t new_hash, definition we have to use it. */ void enter (struct unique_sym *table, size_t size, unsigned int hash, const char *name, - const ElfW(Sym) *sym, struct link_map *map) + const ElfW(Sym) *sym, const struct link_map *map) { size_t idx = hash % size; size_t hash2 = 1 + hash % (size - 2); - while (1) + while (table[idx].name != NULL) { - if (table[idx].name == NULL) - { - table[idx].hashval = hash; - table[idx].name = name; - if ((type_class & ELF_RTYPE_CLASS_COPY) != 0) - { - table[idx].sym = ref; - table[idx].map = undef_map; - } - else - { - table[idx].sym = sym; - table[idx].map = map; - - if (map->l_type == lt_loaded) - /* Make sure we don't unload this object by - setting the appropriate flag. */ - map->l_flags_1 |= DF_1_NODELETE; - } - - return; - } - idx += hash2; if (idx >= size) idx -= size; } + + table[idx].hashval = hash; + table[idx].name = name; + table[idx].sym = sym; + table[idx].map = map; } struct unique_sym_table *tab @@ -423,7 +405,7 @@ do_lookup_x (const char *undef_name, uint_fast32_t new_hash, hash table. */ if (__builtin_expect (tab->size, 0)) { - assert (GLRO(dl_debug_mask) & DL_DEBUG_PRELINK); + assert (GLRO_dl_debug_mask & DL_DEBUG_PRELINK); __rtld_lock_unlock_recursive (tab->lock); goto success; } @@ -440,8 +422,19 @@ do_lookup_x (const char *undef_name, uint_fast32_t new_hash, tab->free = free; } - enter (entries, size, new_hash, strtab + sym->st_name, sym, - (struct link_map *) map); + if ((type_class & ELF_RTYPE_CLASS_COPY) != 0) + enter (entries, size, new_hash, strtab + sym->st_name, ref, + undef_map); + else + { + enter (entries, size, new_hash, strtab + sym->st_name, sym, + map); + + if (map->l_type == lt_loaded) + /* Make sure we don't unload this object by + setting the appropriate flag. */ + ((struct link_map *) map)->l_flags_1 |= DF_1_NODELETE; + } ++tab->n_elements; __rtld_lock_unlock_recursive (tab->lock); diff --git a/elf/dl-open.c b/elf/dl-open.c index ee09f0e..dd543ad 100644 --- a/elf/dl-open.c +++ b/elf/dl-open.c @@ -1,5 +1,5 @@ /* Load a shared object at runtime, relocate it, and run its initializer. - Copyright (C) 1996-2007, 2009, 2010 Free Software Foundation, Inc. + Copyright (C) 1996-2007, 2009, 2010, 2011 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -303,50 +303,115 @@ dl_open_worker (void *a) if (GLRO(dl_lazy)) reloc_mode |= mode & RTLD_LAZY; - /* Relocate the objects loaded. We do this in reverse order so that copy - relocs of earlier objects overwrite the data written by later objects. */ - + /* Sort the objects by dependency for the relocation process. This + allows IFUNC relocations to work and it also means copy + relocation of dependencies are if necessary overwritten. */ + size_t nmaps = 0; struct link_map *l = new; - while (l->l_next) - l = l->l_next; - while (1) + do + { + if (! l->l_real->l_relocated) + ++nmaps; + l = l->l_next; + } + while (l != NULL); + struct link_map *maps[nmaps]; + nmaps = 0; + l = new; + do { if (! l->l_real->l_relocated) + maps[nmaps++] = l; + l = l->l_next; + } + while (l != NULL); + if (nmaps > 1) + { + char seen[nmaps]; + memset (seen, '\0', nmaps); + size_t i = 0; + while (1) { -#ifdef SHARED - if (__builtin_expect (GLRO(dl_profile) != NULL, 0)) + ++seen[i]; + struct link_map *thisp = maps[i]; + + /* Find the last object in the list for which the current one is + a dependency and move the current object behind the object + with the dependency. */ + size_t k = nmaps - 1; + while (k > i) { - /* If this here is the shared object which we want to profile - make sure the profile is started. We can find out whether - this is necessary or not by observing the `_dl_profile_map' - variable. If was NULL but is not NULL afterwars we must - start the profiling. */ - struct link_map *old_profile_map = GL(dl_profile_map); + struct link_map **runp = maps[k]->l_initfini; + if (runp != NULL) + /* Look through the dependencies of the object. */ + while (*runp != NULL) + if (__builtin_expect (*runp++ == thisp, 0)) + { + /* Move the current object to the back past the last + object with it as the dependency. */ + memmove (&maps[i], &maps[i + 1], + (k - i) * sizeof (maps[0])); + maps[k] = thisp; + + if (seen[i + 1] > 1) + { + ++i; + goto next_clear; + } + + char this_seen = seen[i]; + memmove (&seen[i], &seen[i + 1], + (k - i) * sizeof (seen[0])); + seen[k] = this_seen; + + goto next; + } + + --k; + } - _dl_relocate_object (l, l->l_scope, reloc_mode | RTLD_LAZY, 1); + if (++i == nmaps) + break; + next_clear: + memset (&seen[i], 0, (nmaps - i) * sizeof (seen[0])); + next:; + } + } - if (old_profile_map == NULL && GL(dl_profile_map) != NULL) - { - /* We must prepare the profiling. */ - _dl_start_profile (); + for (size_t i = nmaps; i-- > 0; ) + { + l = maps[i]; - /* Prevent unloading the object. */ - GL(dl_profile_map)->l_flags_1 |= DF_1_NODELETE; - } +#ifdef SHARED + if (__builtin_expect (GLRO(dl_profile) != NULL, 0)) + { + /* If this here is the shared object which we want to profile + make sure the profile is started. We can find out whether + this is necessary or not by observing the `_dl_profile_map' + variable. If it was NULL but is not NULL afterwars we must + start the profiling. */ + struct link_map *old_profile_map = GL(dl_profile_map); + + _dl_relocate_object (l, l->l_scope, reloc_mode | RTLD_LAZY, 1); + + if (old_profile_map == NULL && GL(dl_profile_map) != NULL) + { + /* We must prepare the profiling. */ + _dl_start_profile (); + + /* Prevent unloading the object. */ + GL(dl_profile_map)->l_flags_1 |= DF_1_NODELETE; } - else -#endif - _dl_relocate_object (l, l->l_scope, reloc_mode, 0); } - - if (l == new) - break; - l = l->l_prev; + else +#endif + _dl_relocate_object (l, l->l_scope, reloc_mode, 0); } /* If the file is not loaded now as a dependency, add the search list of the newly loaded object to the scope. */ bool any_tls = false; + unsigned int first_static_tls = new->l_searchlist.r_nlist; for (unsigned int i = 0; i < new->l_searchlist.r_nlist; ++i) { struct link_map *imap = new->l_searchlist.r_list[i]; @@ -425,30 +490,9 @@ dl_open_worker (void *a) might have to increase its size. */ _dl_add_to_slotinfo (imap); - if (imap->l_need_tls_init) - { - /* For static TLS we have to allocate the memory here - and now. This includes allocating memory in the DTV. - But we cannot change any DTV other than our own. So, - if we cannot guarantee that there is room in the DTV - we don't even try it and fail the load. - - XXX We could track the minimum DTV slots allocated in - all threads. */ - if (! RTLD_SINGLE_THREAD_P && imap->l_tls_modid > DTV_SURPLUS) - _dl_signal_error (0, "dlopen", NULL, N_("\ -cannot load any more object with static TLS")); - - imap->l_need_tls_init = 0; -#ifdef SHARED - /* Update the slot information data for at least the - generation of the DSO we are allocating data for. */ - _dl_update_slotinfo (imap->l_tls_modid); -#endif - - GL(dl_init_static_tls) (imap); - assert (imap->l_need_tls_init == 0); - } + if (imap->l_need_tls_init + && first_static_tls == new->l_searchlist.r_nlist) + first_static_tls = i; /* We have to bump the generation counter. */ any_tls = true; @@ -460,6 +504,40 @@ cannot load any more object with static TLS")); _dl_fatal_printf (N_("\ TLS generation counter wrapped! Please report this.")); + /* We need a second pass for static tls data, because _dl_update_slotinfo + must not be run while calls to _dl_add_to_slotinfo are still pending. */ + for (unsigned int i = first_static_tls; i < new->l_searchlist.r_nlist; ++i) + { + struct link_map *imap = new->l_searchlist.r_list[i]; + + if (imap->l_need_tls_init + && ! imap->l_init_called + && imap->l_tls_blocksize > 0) + { + /* For static TLS we have to allocate the memory here and + now. This includes allocating memory in the DTV. But we + cannot change any DTV other than our own. So, if we + cannot guarantee that there is room in the DTV we don't + even try it and fail the load. + + XXX We could track the minimum DTV slots allocated in + all threads. */ + if (! RTLD_SINGLE_THREAD_P && imap->l_tls_modid > DTV_SURPLUS) + _dl_signal_error (0, "dlopen", NULL, N_("\ +cannot load any more object with static TLS")); + + imap->l_need_tls_init = 0; +#ifdef SHARED + /* Update the slot information data for at least the + generation of the DSO we are allocating data for. */ + _dl_update_slotinfo (imap->l_tls_modid); +#endif + + GL(dl_init_static_tls) (imap); + assert (imap->l_need_tls_init == 0); + } + } + /* Run the initializer functions of new objects. */ _dl_init (new, args->argc, args->argv, args->env); diff --git a/elf/dl-runtime.c b/elf/dl-runtime.c index ae2d05c..f6a66c3 100644 --- a/elf/dl-runtime.c +++ b/elf/dl-runtime.c @@ -27,6 +27,7 @@ #include #include "dynamic-link.h" #include +#include #if (!defined ELF_MACHINE_NO_RELA && !defined ELF_MACHINE_PLT_REL) \ @@ -146,7 +147,7 @@ _dl_fixup ( if (sym != NULL && __builtin_expect (ELFW(ST_TYPE) (sym->st_info) == STT_GNU_IFUNC, 0)) - value = ((DL_FIXUP_VALUE_TYPE (*) (void)) DL_FIXUP_VALUE_ADDR (value)) (); + value = elf_ifunc_invoke (DL_FIXUP_VALUE_ADDR (value)); /* Finally, fix up the plt itself. */ if (__builtin_expect (GLRO(dl_bind_not), 0)) @@ -235,8 +236,7 @@ _dl_profile_fixup ( if (defsym != NULL && __builtin_expect (ELFW(ST_TYPE) (defsym->st_info) == STT_GNU_IFUNC, 0)) - value = ((DL_FIXUP_VALUE_TYPE (*) (void)) - DL_FIXUP_VALUE_ADDR (value)) (); + value = elf_ifunc_invoke (DL_FIXUP_VALUE_ADDR (value)); } else { @@ -246,8 +246,7 @@ _dl_profile_fixup ( if (__builtin_expect (ELFW(ST_TYPE) (refsym->st_info) == STT_GNU_IFUNC, 0)) - value = ((DL_FIXUP_VALUE_TYPE (*) (void)) - DL_FIXUP_VALUE_ADDR (value)) (); + value = elf_ifunc_invoke (DL_FIXUP_VALUE_ADDR (value)); result = l; } diff --git a/elf/dl-support.c b/elf/dl-support.c index 71a1c37..9061a62 100644 --- a/elf/dl-support.c +++ b/elf/dl-support.c @@ -20,6 +20,7 @@ /* This file defines some things that for the dynamic linker are defined in rtld.c and dl-sysdep.c in ways appropriate to bootstrap dynamic linking. */ +#include #include #include #include @@ -46,7 +47,13 @@ int _dl_debug_mask; #endif int _dl_lazy; ElfW(Addr) _dl_use_load_bias = -2; +#ifdef __GNU__ +/* GNU/Hurd needs this because otherwise libpthread's pthread_mutex_lock gets + * overridden by libX11's stubs. */ +int _dl_dynamic_weak = 1; +#else int _dl_dynamic_weak; +#endif /* If nonzero print warnings about problematic situations. */ int _dl_verbose; diff --git a/elf/dl-sym.c b/elf/dl-sym.c index 4faf05c..0af3e48 100644 --- a/elf/dl-sym.c +++ b/elf/dl-sym.c @@ -27,6 +27,7 @@ #include #include #include +#include #ifdef SHARED @@ -196,8 +197,7 @@ RTLD_NEXT used in code not dynamically loaded")); { DL_FIXUP_VALUE_TYPE fixup = DL_FIXUP_MAKE_VALUE (result, (ElfW(Addr)) value); - fixup = - ((DL_FIXUP_VALUE_TYPE (*) (void)) DL_FIXUP_VALUE_ADDR (fixup)) (); + fixup = elf_ifunc_invoke (DL_FIXUP_VALUE_ADDR (fixup)); value = (void *) DL_FIXUP_VALUE_CODE_ADDR (fixup); } diff --git a/elf/dl-sysdep.c b/elf/dl-sysdep.c index e6c8660..41f2020 100644 --- a/elf/dl-sysdep.c +++ b/elf/dl-sysdep.c @@ -417,6 +417,20 @@ _dl_important_hwcaps (const char *platform, size_t platform_len, size_t *sz, /* For TLS enabled builds always add 'tls'. */ ++cnt; + if (__access ("/etc/ld.so.nohwcap", F_OK) == 0) + { + /* If hwcap is disabled, we only have the base directory to search. */ + result = (struct r_strlenpair *) malloc (sizeof (*result)); + if (result == NULL) + goto no_memory; + + result[0].str = (char *) result; /* Does not really matter. */ + result[0].len = 0; + + *sz = 1; + return result; + } + /* Create temporary data structure to generate result table. */ temp = (struct r_strlenpair *) alloca (cnt * sizeof (*temp)); m = 0; @@ -496,8 +510,11 @@ _dl_important_hwcaps (const char *platform, size_t platform_len, size_t *sz, *sz = 1 << cnt; result = (struct r_strlenpair *) malloc (*sz * sizeof (*result) + total); if (result == NULL) - _dl_signal_error (ENOMEM, NULL, NULL, - N_("cannot create capability list")); + { + no_memory: + _dl_signal_error (ENOMEM, NULL, NULL, + N_("cannot create capability list")); + } if (cnt == 1) { diff --git a/elf/dl-tls.c b/elf/dl-tls.c index 824adc1..65e62da 100644 --- a/elf/dl-tls.c +++ b/elf/dl-tls.c @@ -33,9 +33,6 @@ to allow dynamic loading of modules defining IE-model TLS data. */ #define TLS_STATIC_SURPLUS 64 + DL_NNS * 100 -/* Value used for dtv entries for which the allocation is delayed. */ -#define TLS_DTV_UNALLOCATED ((void *) -1l) - /* Out-of-memory handler. */ #ifdef SHARED diff --git a/elf/elf.h b/elf/elf.h index a9558a3..909888b 100644 --- a/elf/elf.h +++ b/elf/elf.h @@ -142,7 +142,8 @@ typedef struct #define ELFOSABI_SYSV 0 /* Alias. */ #define ELFOSABI_HPUX 1 /* HP-UX */ #define ELFOSABI_NETBSD 2 /* NetBSD. */ -#define ELFOSABI_LINUX 3 /* Linux. */ +#define ELFOSABI_GNU 3 /* GNU. */ +#define ELFOSABI_LINUX 3 /* Alias for ELFOSABI_GNU. */ #define ELFOSABI_SOLARIS 6 /* Sun Solaris. */ #define ELFOSABI_AIX 7 /* IBM AIX. */ #define ELFOSABI_IRIX 8 /* SGI Irix. */ diff --git a/elf/ldconfig.c b/elf/ldconfig.c index cb75a46..0ed8543 100644 --- a/elf/ldconfig.c +++ b/elf/ldconfig.c @@ -59,6 +59,21 @@ #define PACKAGE _libc_intl_domainname +#ifndef PATH_MAX +#define PATH_MAX 1024 +#endif + +/* Get the generated information about the trusted/standard directories. */ +#include "trusted-dirs.h" + +static const char system_dirs[] = SYSTEM_DIRS; +static const size_t system_dirs_len[] = +{ + SYSTEM_DIRS_LEN +}; +#define nsystem_dirs_len \ + (sizeof (system_dirs_len) / sizeof (system_dirs_len[0])) + static const struct { const char *name; @@ -443,6 +458,23 @@ chroot_stat (const char *real_path, const char *path, struct stat64 *st) return ret; } +static const char * const ld_sonames[] = +{ + "ld-kfreebsd-x86-64.so.1", + "ld-linux-aarch64.so.1", + "ld-linux-aarch64_be.so.1", + "ld-linux-armhf.so.3", + "ld-linux-ia64.so.2", + "ld-linux-mipsn8.so.1", + "ld-linux-x32.so.2", + "ld-linux-x86-64.so.2", + "ld-linux.so.2", + "ld-linux.so.3", + "ld.so.1", + "ld64.so.1", + "ld64.so.2", +}; + /* Create a symbolic link from soname to libname in directory path. */ static void create_links (const char *real_path, const char *path, const char *libname, @@ -453,6 +485,7 @@ create_links (const char *real_path, const char *path, const char *libname, struct stat64 stat_lib, stat_so, lstat_so; int do_link = 1; int do_remove = 1; + int i; /* XXX: The logics in this function should be simplified. */ /* Get complete path. */ @@ -481,6 +514,18 @@ create_links (const char *real_path, const char *path, const char *libname, error (0, 0, _("Can't stat %s\n"), full_libname); return; } + + /* Do not change the symlink pointer to the dynamic linker except for + non-existing symlinks, as it might break break multiarch systems. */ + for (i = 0; i < sizeof (ld_sonames) / sizeof (ld_sonames[0]); i++) + if (__glibc_unlikely(!strcmp(soname, ld_sonames[i]))) + { + if (opt_verbose) + error (0, 0, _("%s is the dynamic linker, ignoring\n"), + full_libname); + do_link = 0; + } + if (stat_lib.st_dev == stat_so.st_dev && stat_lib.st_ino == stat_so.st_ino) /* Link is already correct. */ @@ -1062,7 +1107,8 @@ parse_conf (const char *filename, bool do_chroot) if (file == NULL) { - error (0, errno, _("Can't open configuration file %s"), canon); + if (strcmp(canon, LD_SO_CONF) != 0 || opt_verbose) + error (0, errno, _("Can't open configuration file %s"), canon); if (canon != filename) free ((char *) canon); return; @@ -1352,12 +1398,19 @@ main (int argc, char **argv) if (!opt_only_cline) { + const char *strp = system_dirs; + size_t idx = 0; + parse_conf (config_file, true); /* Always add the standard search paths. */ - add_system_dir (SLIBDIR); - if (strcmp (SLIBDIR, LIBDIR)) - add_system_dir (LIBDIR); + do + { + add_system_dir (strp); + strp += system_dirs_len[idx] + 1; + idx++; + } + while (idx < nsystem_dirs_len); } const char *aux_cache_file = _PATH_LDCONFIG_AUX_CACHE; diff --git a/elf/ldd.bash.in b/elf/ldd.bash.in index 2825046..15af6e3 100644 --- a/elf/ldd.bash.in +++ b/elf/ldd.bash.in @@ -153,8 +153,6 @@ for file do echo "ldd: ${file}:" $"not regular file" >&2 result=1 elif test -r "$file"; then - test -x "$file" || echo 'ldd:' $"\ -warning: you do not have execution permission for" "\`$file'" >&2 RTLD= ret=1 for rtld in ${RTLDLIST}; do @@ -167,28 +165,16 @@ warning: you do not have execution permission for" "\`$file'" >&2 fi done case $ret in - 0) - # If the program exits with exit code 5, it means the process has been - # invoked with __libc_enable_secure. Fall back to running it through - # the dynamic linker. - try_trace "$file" - rc=$? - if [ $rc = 5 ]; then - try_trace "$RTLD" "$file" - rc=$? - fi - [ $rc = 0 ] || result=1 + 0|2) + try_trace "$RTLD" "$file" || result=1 ;; - 1) + 1|126) # This can be a non-ELF binary or no binary at all. nonelf "$file" || { echo $" not a dynamic executable" result=1 } ;; - 2) - try_trace "$RTLD" "$file" || result=1 - ;; *) echo 'ldd:' ${RTLD} $"exited with unknown exit code" "($ret)" >&2 exit 1 diff --git a/elf/rtld.c b/elf/rtld.c index 9e9ff36..a376a96 100644 --- a/elf/rtld.c +++ b/elf/rtld.c @@ -1,5 +1,5 @@ /* Run time dynamic linker. - Copyright (C) 1995-2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. + Copyright (C) 1995-2010, 2011 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -17,6 +17,7 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ +#include #include #include #include @@ -154,13 +155,17 @@ struct rtld_global_ro _rtld_global_ro attribute_relro = #ifdef NEED_DL_SYSINFO ._dl_sysinfo = DL_SYSINFO_DEFAULT, #endif +#ifdef __GNU__ +/* GNU/Hurd needs this because otherwise libpthread's pthread_mutex_lock gets + * * overridden by libX11's stubs. */ + ._dl_dynamic_weak = 1, +#endif ._dl_debug_fd = STDERR_FILENO, ._dl_use_load_bias = -2, ._dl_correct_cache_id = _DL_CACHE_DEFAULT_ID, ._dl_hwcap_mask = HWCAP_IMPORTANT, ._dl_lazy = 1, ._dl_fpu_control = _FPU_DEFAULT, - ._dl_pointer_guard = 1, /* Function pointers. */ ._dl_debug_printf = _dl_debug_printf, @@ -392,14 +397,14 @@ _dl_start (void *arg) know it is available. We do not have to clear the memory if we do not have to use the temporary bootstrap_map. Global variables are initialized to zero by default. */ -#ifndef DONT_USE_BOOTSTRAP_MAP +#if !defined DONT_USE_BOOTSTRAP_MAP # ifdef HAVE_BUILTIN_MEMSET __builtin_memset (bootstrap_map.l_info, '\0', sizeof (bootstrap_map.l_info)); # else - for (size_t cnt = 0; - cnt < sizeof (bootstrap_map.l_info) / sizeof (bootstrap_map.l_info[0]); - ++cnt) - bootstrap_map.l_info[cnt] = 0; + /* Clear the whole bootstrap_map structure */ + for (char *cnt = (char *)&(bootstrap_map); + cnt < ((char *)&(bootstrap_map) + sizeof (bootstrap_map)); + *cnt++ = '\0'); # endif # if USE___THREAD bootstrap_map.l_tls_modid = 0; @@ -857,15 +862,12 @@ security_init (void) #endif /* Set up the pointer guard as well, if necessary. */ - if (GLRO(dl_pointer_guard)) - { - uintptr_t pointer_chk_guard = _dl_setup_pointer_guard (_dl_random, - stack_chk_guard); + uintptr_t pointer_chk_guard + = _dl_setup_pointer_guard (_dl_random, stack_chk_guard); #ifdef THREAD_SET_POINTER_GUARD - THREAD_SET_POINTER_GUARD (pointer_chk_guard); + THREAD_SET_POINTER_GUARD (pointer_chk_guard); #endif - __pointer_chk_guard_local = pointer_chk_guard; - } + __pointer_chk_guard_local = pointer_chk_guard; /* We do not need the _dl_random value anymore. The less information we leave behind, the better, so clear the @@ -2179,6 +2181,10 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n", we need it in the memory handling later. */ GLRO(dl_initial_searchlist) = *GL(dl_ns)[LM_ID_BASE]._ns_main_searchlist; + /* Remember the last search directory added at startup, now that + malloc will no longer be the one from dl-minimal.c. */ + GLRO(dl_init_all_dirs) = GL(dl_all_dirs); + if (prelinked) { if (main_map->l_info [ADDRIDX (DT_GNU_CONFLICT)] != NULL) @@ -2298,9 +2304,8 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n", lossage); } - /* Remember the last search directory added at startup, now that - malloc will no longer be the one from dl-minimal.c. */ - GLRO(dl_init_all_dirs) = GL(dl_all_dirs); + /* Make sure no new search directories have been added. */ + assert (GLRO(dl_init_all_dirs) == GL(dl_all_dirs)); if (! prelinked && rtld_multiple_ref) { @@ -2653,9 +2658,6 @@ process_envvars (enum mode *modep) GLRO(dl_use_load_bias) = envline[14] == '1' ? -1 : 0; break; } - - if (memcmp (envline, "POINTER_GUARD", 13) == 0) - GLRO(dl_pointer_guard) = envline[14] != '0'; break; case 14: diff --git a/elf/stackguard-macros.h b/elf/stackguard-macros.h index 97db8bc..8101efa 100644 --- a/elf/stackguard-macros.h +++ b/elf/stackguard-macros.h @@ -3,31 +3,96 @@ #ifdef __i386__ # define STACK_CHK_GUARD \ ({ uintptr_t x; asm ("movl %%gs:0x14, %0" : "=r" (x)); x; }) +#define POINTER_CHK_GUARD \ + ({ \ + uintptr_t x; \ + asm ("movl %%gs:%c1, %0" : "=r" (x) \ + : "i" (offsetof (tcbhead_t, pointer_guard))); \ + x; \ + }) #elif defined __x86_64__ # define STACK_CHK_GUARD \ ({ uintptr_t x; asm ("movq %%fs:0x28, %0" : "=r" (x)); x; }) +#define POINTER_CHK_GUARD \ + ({ uintptr_t x; \ + asm ("mov %%fs:%c1, %0" : "=r" (x) \ + : "i" (offsetof (tcbhead_t, pointer_guard))); x; }) #elif defined __powerpc64__ # define STACK_CHK_GUARD \ ({ uintptr_t x; asm ("ld %0,-28688(13)" : "=r" (x)); x; }) +#define POINTER_CHK_GUARD \ + ({ \ + uintptr_t x; \ + asm ("ld %0,%1(13)" \ + : "=r" (x) \ + : "i" (offsetof (tcbhead_t, pointer_guard) - TLS_TCB_OFFSET - sizeof (tcbhead_t)) \ + ); \ + x; \ + }) #elif defined __powerpc__ # define STACK_CHK_GUARD \ ({ uintptr_t x; asm ("lwz %0,-28680(2)" : "=r" (x)); x; }) +#define POINTER_CHK_GUARD \ + ({ \ + uintptr_t x; \ + asm ("lwz %0,%1(2)" \ + : "=r" (x) \ + : "i" (offsetof (tcbhead_t, pointer_guard) - TLS_TCB_OFFSET - sizeof (tcbhead_t)) \ + ); \ + x; \ + }) #elif defined __sparc__ && defined __arch64__ # define STACK_CHK_GUARD \ ({ uintptr_t x; asm ("ldx [%%g7+0x28], %0" : "=r" (x)); x; }) +#define POINTER_CHK_GUARD \ + ({ uintptr_t x; asm ("ldx [%%g7+0x30], %0" : "=r" (x)); x; }) #elif defined __sparc__ # define STACK_CHK_GUARD \ ({ uintptr_t x; asm ("ld [%%g7+0x14], %0" : "=r" (x)); x; }) +#define POINTER_CHK_GUARD \ + ({ uintptr_t x; asm ("ld [%%g7+0x18], %0" : "=r" (x)); x; }) #elif defined __s390x__ # define STACK_CHK_GUARD \ ({ uintptr_t x; asm ("ear %0,%%a0; sllg %0,%0,32; ear %0,%%a1; lg %0,0x28(%0)" : "=a" (x)); x; }) +/* On s390/s390x there is no unique pointer guard, instead we use the + same value as the stack guard. */ +#define POINTER_CHK_GUARD \ + ({ \ + uintptr_t x; \ + asm ("ear %0,%%a0;" \ + "sllg %0,%0,32;" \ + "ear %0,%%a1;" \ + "lg %0,%1(%0)" \ + : "=a" (x) \ + : "i" (offsetof (tcbhead_t, stack_guard))); \ + x; \ + }) #elif defined __s390__ # define STACK_CHK_GUARD \ ({ uintptr_t x; asm ("ear %0,%%a0; l %0,0x14(%0)" : "=a" (x)); x; }) +/* On s390/s390x there is no unique pointer guard, instead we use the + same value as the stack guard. */ +#define POINTER_CHK_GUARD \ + ({ \ + uintptr_t x; \ + asm ("ear %0,%%a0; l %0,%1(%0)" \ + : "=a" (x) \ + : "i" (offsetof (tcbhead_t, stack_guard))); \ + x; \ + }) #elif defined __ia64__ # define STACK_CHK_GUARD \ ({ uintptr_t x; asm ("adds %0 = -8, r13;; ld8 %0 = [%0]" : "=r" (x)); x; }) +#define POINTER_CHK_GUARD \ + ({ uintptr_t x; asm ("adds %0 = -16, r13;; ld8 %0 = [%0]" : "=r" (x)); x; }) #else extern uintptr_t __stack_chk_guard; # define STACK_CHK_GUARD __stack_chk_guard +#ifdef PTRGUARD_LOCAL +extern uintptr_t __pointer_chk_guard_local; +# define POINTER_CHK_GUARD __pointer_chk_guard_local +#else +extern uintptr_t __pointer_chk_guard; +# define POINTER_CHK_GUARD __pointer_chk_guard +#endif #endif diff --git a/elf/tst-audit4.c b/elf/tst-audit4.c index b17d4a6..c4f1d5b 100644 --- a/elf/tst-audit4.c +++ b/elf/tst-audit4.c @@ -6,16 +6,30 @@ #include #include + +static int +avx_enabled (void) +{ + unsigned int eax, ebx, ecx, edx; + + if (__get_cpuid (1, &eax, &ebx, &ecx, &edx) == 0 + || (ecx & (bit_AVX | bit_OSXSAVE)) != (bit_AVX | bit_OSXSAVE)) + return 0; + + /* Check the OS has AVX and SSE saving enabled. */ + asm ("xgetbv" : "=a" (eax), "=d" (edx) : "c" (0)); + + return (eax & 6) == 6; +} + + extern __m256i audit_test (__m256i, __m256i, __m256i, __m256i, __m256i, __m256i, __m256i, __m256i); int main (void) { - unsigned int eax, ebx, ecx, edx; - /* Run AVX test only if AVX is supported. */ - if (__get_cpuid (1, &eax, &ebx, &ecx, &edx) - && (ecx & bit_AVX)) + if (avx_enabled ()) { __m256i ymm = _mm256_setzero_si256 (); __m256i ret = audit_test (ymm, ymm, ymm, ymm, ymm, ymm, ymm, ymm); diff --git a/elf/tst-audit6.c b/elf/tst-audit6.c index 1f6dcb1..44462ab 100644 --- a/elf/tst-audit6.c +++ b/elf/tst-audit6.c @@ -1,5 +1,6 @@ /* Test case for x86-64 preserved registers in dynamic linker. */ +#ifdef __AVX__ #include #include #include @@ -8,14 +9,28 @@ extern __m128i audit_test (__m128i, __m128i, __m128i, __m128i, __m128i, __m128i, __m128i, __m128i); -int -main (void) + +static int +avx_enabled (void) { unsigned int eax, ebx, ecx, edx; + if (__get_cpuid (1, &eax, &ebx, &ecx, &edx) == 0 + || (ecx & (bit_AVX | bit_OSXSAVE)) != (bit_AVX | bit_OSXSAVE)) + return 0; + + /* Check the OS has AVX and SSE saving enabled. */ + asm ("xgetbv" : "=a" (eax), "=d" (edx) : "c" (0)); + + return (eax & 6) == 6; +} + + +int +main (void) +{ /* Run AVX test only if AVX is supported. */ - if (__get_cpuid (1, &eax, &ebx, &ecx, &edx) - && (ecx & bit_AVX)) + if (avx_enabled ()) { __m128i xmm = _mm_setzero_si128 (); __m128i ret = audit_test (xmm, xmm, xmm, xmm, xmm, xmm, xmm, xmm); @@ -26,3 +41,10 @@ main (void) } return 0; } +#else +int +main (void) +{ + return 0; +} +#endif diff --git a/elf/tst-ptrguard1-static.c b/elf/tst-ptrguard1-static.c new file mode 100644 index 0000000..7aff3b7 --- /dev/null +++ b/elf/tst-ptrguard1-static.c @@ -0,0 +1 @@ +#include "tst-ptrguard1.c" diff --git a/elf/tst-ptrguard1.c b/elf/tst-ptrguard1.c new file mode 100644 index 0000000..c344a04 --- /dev/null +++ b/elf/tst-ptrguard1.c @@ -0,0 +1,202 @@ +/* Copyright (C) 2013 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef POINTER_CHK_GUARD +extern uintptr_t __pointer_chk_guard; +# define POINTER_CHK_GUARD __pointer_chk_guard +#endif + +static const char *command; +static bool child; +static uintptr_t ptr_chk_guard_copy; +static bool ptr_chk_guard_copy_set; +static int fds[2]; + +static void __attribute__ ((constructor)) +con (void) +{ + ptr_chk_guard_copy = POINTER_CHK_GUARD; + ptr_chk_guard_copy_set = true; +} + +static int +uintptr_t_cmp (const void *a, const void *b) +{ + if (*(uintptr_t *) a < *(uintptr_t *) b) + return 1; + if (*(uintptr_t *) a > *(uintptr_t *) b) + return -1; + return 0; +} + +static int +do_test (void) +{ + if (!ptr_chk_guard_copy_set) + { + puts ("constructor has not been run"); + return 1; + } + + if (ptr_chk_guard_copy != POINTER_CHK_GUARD) + { + puts ("POINTER_CHK_GUARD changed between constructor and do_test"); + return 1; + } + + if (child) + { + write (2, &ptr_chk_guard_copy, sizeof (ptr_chk_guard_copy)); + return 0; + } + + if (command == NULL) + { + puts ("missing --command or --child argument"); + return 1; + } + +#define N 16 + uintptr_t child_ptr_chk_guards[N + 1]; + child_ptr_chk_guards[N] = ptr_chk_guard_copy; + int i; + for (i = 0; i < N; ++i) + { + if (pipe (fds) < 0) + { + printf ("couldn't create pipe: %m\n"); + return 1; + } + + pid_t pid = fork (); + if (pid < 0) + { + printf ("fork failed: %m\n"); + return 1; + } + + if (!pid) + { + if (ptr_chk_guard_copy != POINTER_CHK_GUARD) + { + puts ("POINTER_CHK_GUARD changed after fork"); + exit (1); + } + + close (fds[0]); + close (2); + dup2 (fds[1], 2); + close (fds[1]); + + system (command); + exit (0); + } + + close (fds[1]); + + if (TEMP_FAILURE_RETRY (read (fds[0], &child_ptr_chk_guards[i], + sizeof (uintptr_t))) != sizeof (uintptr_t)) + { + puts ("could not read ptr_chk_guard value from child"); + return 1; + } + + close (fds[0]); + + pid_t termpid; + int status; + termpid = TEMP_FAILURE_RETRY (waitpid (pid, &status, 0)); + if (termpid == -1) + { + printf ("waitpid failed: %m\n"); + return 1; + } + else if (termpid != pid) + { + printf ("waitpid returned %ld != %ld\n", + (long int) termpid, (long int) pid); + return 1; + } + else if (!WIFEXITED (status) || WEXITSTATUS (status)) + { + puts ("child hasn't exited with exit status 0"); + return 1; + } + } + + qsort (child_ptr_chk_guards, N + 1, sizeof (uintptr_t), uintptr_t_cmp); + + /* The default pointer guard is the same as the default stack guard. + They are only set to default if dl_random is NULL. */ + uintptr_t default_guard = 0; + unsigned char *p = (unsigned char *) &default_guard; + p[sizeof (uintptr_t) - 1] = 255; + p[sizeof (uintptr_t) - 2] = '\n'; + p[0] = 0; + + /* Test if the pointer guard canaries are either randomized, + or equal to the default pointer guard value. + Even with randomized pointer guards it might happen + that the random number generator generates the same + values, but if that happens in more than half from + the 16 runs, something is very wrong. */ + int ndifferences = 0; + int ndefaults = 0; + for (i = 0; i < N; ++i) + { + if (child_ptr_chk_guards[i] != child_ptr_chk_guards[i+1]) + ndifferences++; + else if (child_ptr_chk_guards[i] == default_guard) + ndefaults++; + } + + printf ("differences %d defaults %d\n", ndifferences, ndefaults); + + if (ndifferences < N / 2 && ndefaults < N / 2) + { + puts ("pointer guard values are not randomized enough"); + puts ("nor equal to the default value"); + return 1; + } + + return 0; +} + +#define OPT_COMMAND 10000 +#define OPT_CHILD 10001 +#define CMDLINE_OPTIONS \ + { "command", required_argument, NULL, OPT_COMMAND }, \ + { "child", no_argument, NULL, OPT_CHILD }, +#define CMDLINE_PROCESS \ + case OPT_COMMAND: \ + command = optarg; \ + break; \ + case OPT_CHILD: \ + child = true; \ + break; +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/elf/tst-stackguard1.c b/elf/tst-stackguard1.c index 480f929..50739e5 100644 --- a/elf/tst-stackguard1.c +++ b/elf/tst-stackguard1.c @@ -160,17 +160,21 @@ do_test (void) the 16 runs, something is very wrong. */ int ndifferences = 0; int ndefaults = 0; + int npartlyrandomized = 0; for (i = 0; i < N; ++i) { if (child_stack_chk_guards[i] != child_stack_chk_guards[i+1]) ndifferences++; else if (child_stack_chk_guards[i] == default_guard) ndefaults++; + else if (*(char *) &child_stack_chk_guards[i] == 0) + npartlyrandomized++; } - printf ("differences %d defaults %d\n", ndifferences, ndefaults); + printf ("differences %d defaults %d partly randomized %d\n", + ndifferences, ndefaults, npartlyrandomized); - if (ndifferences < N / 2 && ndefaults < N / 2) + if ((ndifferences + ndefaults + npartlyrandomized) < 3 * N / 4) { puts ("stack guard canaries are not randomized enough"); puts ("nor equal to the default canary value"); diff --git a/elf/tst-tls19.c b/elf/tst-tls19.c new file mode 100644 index 0000000..acbc1d6 --- /dev/null +++ b/elf/tst-tls19.c @@ -0,0 +1,27 @@ +// BZ 12453 +#include +#include + + +static int +do_test (void) +{ + void* dl = dlopen ("tst-tls19mod1.so", RTLD_LAZY | RTLD_GLOBAL); + if (dl == NULL) + { + printf ("Error loading tst-tls19mod1.so: %s\n", dlerror ()); + return 1; + } + + int (*fn) (void) = dlsym (dl, "foo"); + if (fn == NULL) + { + printf("Error obtaining symbol foo\n"); + return 1; + } + + return fn (); +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/elf/tst-tls19mod1.c b/elf/tst-tls19mod1.c new file mode 100644 index 0000000..2790097 --- /dev/null +++ b/elf/tst-tls19mod1.c @@ -0,0 +1,15 @@ +#include + +extern int bar (void); +extern int baz (void); + +int +foo (void) +{ + int v1 = bar (); + int v2 = baz (); + + printf ("bar=%d, baz=%d\n", v1, v2); + + return v1 != 666 || v2 != 42; +} diff --git a/elf/tst-tls19mod2.c b/elf/tst-tls19mod2.c new file mode 100644 index 0000000..cae702f --- /dev/null +++ b/elf/tst-tls19mod2.c @@ -0,0 +1,13 @@ +static int __thread tbar __attribute__ ((tls_model ("initial-exec"))) = 666; + +void +setter (int a) +{ + tbar = a; +} + +int +bar (void) +{ + return tbar; +} diff --git a/elf/tst-tls19mod3.c b/elf/tst-tls19mod3.c new file mode 100644 index 0000000..e7b2801 --- /dev/null +++ b/elf/tst-tls19mod3.c @@ -0,0 +1,16 @@ +#include + +static int __thread tbaz __attribute__ ((tls_model ("local-dynamic"))) = 42; + +void +setter2 (int a) +{ + tbaz = a; +} + +int +baz (void) +{ + printf ("&tbaz=%p\n", &tbaz); + return tbaz; +} diff --git a/hurd/Makefile b/hurd/Makefile index ab5a848..78f9da6 100644 --- a/hurd/Makefile +++ b/hurd/Makefile @@ -38,8 +38,8 @@ user-interfaces := $(addprefix hurd/,\ auth startup \ process process_request \ msg msg_reply msg_request \ - exec exec_startup crash interrupt \ - fs fsys io term tioctl socket ifsock \ + exec exec_experimental exec_startup crash interrupt \ + fs fs_experimental fsys io term tioctl socket ifsock \ login password pfinet \ ) server-interfaces := hurd/msg faultexc @@ -60,6 +60,7 @@ routines = hurdstartup hurdinit \ vpprintf \ ports-get ports-set hurdports hurdmsg \ errno-loc \ + sysvshm \ $(sig) $(dtable) $(inlines) port-cleanup report-wait xattr sig = hurdsig hurdfault siginfo hurd-raise preempt-sig \ trampoline longjmp-ts catch-exc exc2signal hurdkill sigunwind \ @@ -68,7 +69,7 @@ dtable = dtable port2fd new-fd alloc-fd intern-fd \ getdport openport \ fd-close fd-read fd-write hurdioctl ctty-input ctty-output inlines = $(inline-headers:%.h=%-inlines) -distribute = hurdstartup.h hurdfault.h hurdhost.h \ +distribute = hurdstartup.h hurdfault.h hurdhost.h sysvshm.h \ faultexc.defs intr-rpc.defs intr-rpc.h intr-msg.h Notes # XXX this is a temporary hack; see hurdmalloc.h diff --git a/hurd/Versions b/hurd/Versions index 83c8ab1..6412349 100644 --- a/hurd/Versions +++ b/hurd/Versions @@ -156,6 +156,18 @@ libc { # functions used in macros & inline functions __errno_location; } + GLIBC_2.13_DEBIAN_19 { + # functions used by libpthread and + _hurd_sigstate_set_global_rcv; + _hurd_sigstate_lock; + _hurd_sigstate_pending; + _hurd_sigstate_unlock; + _hurd_sigstate_delete; + } + GLIBC_2.13_DEBIAN_33 { + # "quasi-internal" functions + _hurd_exec_file_name; + } %if !SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2) HURD_CTHREADS_0.3 { diff --git a/hurd/catch-signal.c b/hurd/catch-signal.c index 583f99e..feb0a6c 100644 --- a/hurd/catch-signal.c +++ b/hurd/catch-signal.c @@ -1,5 +1,5 @@ /* Convenience function to catch expected signals during an operation. - Copyright (C) 1996 Free Software Foundation, Inc. + Copyright (C) 1996-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -28,9 +28,12 @@ hurd_catch_signal (sigset_t sigset, error_t (*operate) (struct hurd_signal_preemptor *), sighandler_t handler) { - jmp_buf buf; + /* We need to restore the signal mask, because otherwise the + signal-handling code will have blocked the caught signal and for + instance calling hurd_catch_signal again would then dump core. */ + sigjmp_buf buf; void throw (int signo, long int sigcode, struct sigcontext *scp) - { longjmp (buf, scp->sc_error ?: EGRATUITOUS); } + { siglongjmp (buf, scp->sc_error ?: EGRATUITOUS); } struct hurd_signal_preemptor preemptor = { @@ -41,12 +44,12 @@ hurd_catch_signal (sigset_t sigset, struct hurd_sigstate *const ss = _hurd_self_sigstate (); error_t error; - if (handler == SIG_ERR) + if (handler != SIG_ERR) /* Not our handler; don't bother saving state. */ error = 0; else /* This returns again with nonzero value when we preempt a signal. */ - error = setjmp (buf); + error = sigsetjmp (buf, 1); if (error == 0) { diff --git a/hurd/ctty-input.c b/hurd/ctty-input.c index ef8395a..4da33c7 100644 --- a/hurd/ctty-input.c +++ b/hurd/ctty-input.c @@ -1,5 +1,5 @@ /* _hurd_ctty_input -- Do an input RPC and generate SIGTTIN if necessary. - Copyright (C) 1995,97,99 Free Software Foundation, Inc. + Copyright (C) 1995,97,99,2011 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -44,12 +44,15 @@ _hurd_ctty_input (io_t port, io_t ctty, error_t (*rpc) (io_t)) else { struct hurd_sigstate *ss = _hurd_self_sigstate (); - __spin_lock (&ss->lock); + struct sigaction *actions; + + _hurd_sigstate_lock (ss); + actions = _hurd_sigstate_actions (ss); if (__sigismember (&ss->blocked, SIGTTIN) || - ss->actions[SIGTTIN].sa_handler == SIG_IGN) + actions[SIGTTIN].sa_handler == SIG_IGN) /* We are blocking or ignoring SIGTTIN. Just fail. */ err = EIO; - __spin_unlock (&ss->lock); + _hurd_sigstate_unlock (ss); if (err == EBACKGROUND) { @@ -66,10 +69,11 @@ _hurd_ctty_input (io_t port, io_t ctty, error_t (*rpc) (io_t)) SIGTTIN or resumed after being stopped. Now this is still a "system call", so check to see if we should restart it. */ - __spin_lock (&ss->lock); - if (!(ss->actions[SIGTTIN].sa_flags & SA_RESTART)) + _hurd_sigstate_lock (ss); + actions = _hurd_sigstate_actions (ss); + if (!(actions[SIGTTIN].sa_flags & SA_RESTART)) err = EINTR; - __spin_unlock (&ss->lock); + _hurd_sigstate_unlock (ss); } } } diff --git a/hurd/ctty-output.c b/hurd/ctty-output.c index 92ab95a..6e4bd74 100644 --- a/hurd/ctty-output.c +++ b/hurd/ctty-output.c @@ -1,5 +1,5 @@ /* _hurd_ctty_output -- Do an output RPC and generate SIGTTOU if necessary. - Copyright (C) 1995,97,99 Free Software Foundation, Inc. + Copyright (C) 1995,97,99,2011 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -35,16 +35,19 @@ _hurd_ctty_output (io_t port, io_t ctty, error_t (*rpc) (io_t)) do { + struct sigaction *actions; + /* Don't use the ctty io port if we are blocking or ignoring SIGTTOU. We redo this check at the top of the loop in case the signal handler changed the state. */ - __spin_lock (&ss->lock); + _hurd_sigstate_lock (ss); + actions = _hurd_sigstate_actions (ss); if (__sigismember (&ss->blocked, SIGTTOU) || - ss->actions[SIGTTOU].sa_handler == SIG_IGN) + actions[SIGTTOU].sa_handler == SIG_IGN) err = EIO; else err = 0; - __spin_unlock (&ss->lock); + _hurd_sigstate_unlock (ss); if (err) return (*rpc) (port); @@ -71,10 +74,11 @@ _hurd_ctty_output (io_t port, io_t ctty, error_t (*rpc) (io_t)) SIGTTOU or resumed after being stopped. Now this is still a "system call", so check to see if we should restart it. */ - __spin_lock (&ss->lock); - if (!(ss->actions[SIGTTOU].sa_flags & SA_RESTART)) + _hurd_sigstate_lock (ss); + actions = _hurd_sigstate_actions (ss); + if (!(actions[SIGTTOU].sa_flags & SA_RESTART)) err = EINTR; - __spin_unlock (&ss->lock); + _hurd_sigstate_unlock (ss); } } /* If the last RPC generated a SIGTTOU, loop to try it again. */ diff --git a/hurd/hurd.h b/hurd/hurd.h index 642ea43..be8347d 100644 --- a/hurd/hurd.h +++ b/hurd/hurd.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1993,94,95,96,97,98,99,2001,2002,2007 +/* Copyright (C) 1993,94,95,96,97,98,99,2001,2002,2007,2010 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -48,6 +48,9 @@ #define _HURD_H_EXTERN_INLINE __extern_inline #endif +int __hurd_fail (error_t err); + +#ifdef __USE_EXTERN_INLINES _HURD_H_EXTERN_INLINE int __hurd_fail (error_t err) { @@ -77,6 +80,7 @@ __hurd_fail (error_t err) errno = err; return -1; } +#endif /* Basic ports and info, initialized by startup. */ @@ -243,12 +247,20 @@ extern FILE *fopenport (io_t port, const char *mode); extern FILE *__fopenport (io_t port, const char *mode); -/* Execute a file, replacing TASK's current program image. */ +/* Deprecated: use _hurd_exec_file_name instead. */ extern error_t _hurd_exec (task_t task, file_t file, char *const argv[], - char *const envp[]); + char *const envp[]) __attribute_deprecated__; + +/* Execute a file, replacing TASK's current program image. */ + +extern error_t _hurd_exec_file_name (task_t task, + file_t file, + const char *filename, + char *const argv[], + char *const envp[]); /* Inform the proc server we have exited with STATUS, and kill the diff --git a/hurd/hurd/fd.h b/hurd/hurd/fd.h index 2473476..4333c15 100644 --- a/hurd/hurd/fd.h +++ b/hurd/hurd/fd.h @@ -1,6 +1,5 @@ /* File descriptors. - Copyright (C) 1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2006,2007 - Free Software Foundation, Inc. + Copyright (C) 1993-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -60,11 +59,15 @@ extern struct mutex _hurd_dtable_lock; /* Locks those two variables. */ NULL. The cell is unlocked; when ready to use it, lock it and check for it being unused. */ +struct hurd_fd *_hurd_fd_get (int fd); + +#ifdef __USE_EXTERN_INLINES _HURD_FD_H_EXTERN_INLINE struct hurd_fd * _hurd_fd_get (int fd) { struct hurd_fd *descriptor; + HURD_CRITICAL_BEGIN; __mutex_lock (&_hurd_dtable_lock); if (fd < 0 || fd >= _hurd_dtablesize) descriptor = NULL; @@ -87,9 +90,11 @@ _hurd_fd_get (int fd) } } __mutex_unlock (&_hurd_dtable_lock); + HURD_CRITICAL_END; return descriptor; } +#endif /* Evaluate EXPR with the variable `descriptor' bound to a pointer to the @@ -137,6 +142,9 @@ _hurd_fd_get (int fd) /* Check if ERR should generate a signal. Returns the signal to take, or zero if none. */ +int _hurd_fd_error_signal (error_t err); + +#ifdef __USE_EXTERN_INLINES _HURD_FD_H_EXTERN_INLINE int _hurd_fd_error_signal (error_t err) { @@ -153,11 +161,15 @@ _hurd_fd_error_signal (error_t err) return 0; } } +#endif /* Handle an error from an RPC on a file descriptor's port. You should always use this function to handle errors from RPCs made on file descriptor ports. Some errors are translated into signals. */ +error_t _hurd_fd_error (int fd, error_t err); + +#ifdef __USE_EXTERN_INLINES _HURD_FD_H_EXTERN_INLINE error_t _hurd_fd_error (int fd, error_t err) { @@ -170,20 +182,28 @@ _hurd_fd_error (int fd, error_t err) } return err; } +#endif /* Handle error code ERR from an RPC on file descriptor FD's port. Set `errno' to the appropriate error code, and always return -1. */ +int __hurd_dfail (int fd, error_t err); + +#ifdef __USE_EXTERN_INLINES _HURD_FD_H_EXTERN_INLINE int __hurd_dfail (int fd, error_t err) { errno = _hurd_fd_error (fd, err); return -1; } +#endif /* Likewise, but do not raise SIGPIPE on EPIPE if flags contain MSG_NOSIGNAL. */ +int __hurd_sockfail (int fd, int flags, error_t err); + +#ifdef __USE_EXTERN_INLINES _HURD_FD_H_EXTERN_INLINE int __hurd_sockfail (int fd, int flags, error_t err) { @@ -192,6 +212,7 @@ __hurd_sockfail (int fd, int flags, error_t err) errno = err; return -1; } +#endif /* Set up *FD to have PORT its server port, doing appropriate ctty magic. Does no locking or unlocking. */ @@ -200,7 +221,8 @@ extern void _hurd_port2fd (struct hurd_fd *fd, io_t port, int flags); /* Allocate a new file descriptor and install PORT in it (doing any appropriate ctty magic); consumes a user reference on PORT. FLAGS are - as for `open'; only O_IGNORE_CTTY is meaningful, but all are saved. + as for `open'; only O_IGNORE_CTTY and O_CLOEXEC are meaningful, but all are + saved. If the descriptor table is full, set errno, and return -1. If DEALLOC is nonzero, deallocate PORT first. */ diff --git a/hurd/hurd/port.h b/hurd/hurd/port.h index a1803c3..30769c9 100644 --- a/hurd/hurd/port.h +++ b/hurd/hurd/port.h @@ -62,6 +62,9 @@ struct hurd_port /* Initialize *PORT to INIT. */ +void _hurd_port_init (struct hurd_port *port, mach_port_t init); + +#ifdef __USE_EXTERN_INLINES _HURD_PORT_H_EXTERN_INLINE void _hurd_port_init (struct hurd_port *port, mach_port_t init) { @@ -69,6 +72,7 @@ _hurd_port_init (struct hurd_port *port, mach_port_t init) port->users = NULL; port->port = init; } +#endif /* Cleanup function for non-local exits. */ @@ -77,6 +81,11 @@ extern void _hurd_port_cleanup (void *, jmp_buf, int); /* Get a reference to *PORT, which is locked. Pass return value and LINK to _hurd_port_free when done. */ +mach_port_t +_hurd_port_locked_get (struct hurd_port *port, + struct hurd_userlink *link); + +#ifdef __USE_EXTERN_INLINES _HURD_PORT_H_EXTERN_INLINE mach_port_t _hurd_port_locked_get (struct hurd_port *port, struct hurd_userlink *link) @@ -92,9 +101,15 @@ _hurd_port_locked_get (struct hurd_port *port, __spin_unlock (&port->lock); return result; } +#endif /* Same, but locks PORT first. */ +mach_port_t +_hurd_port_get (struct hurd_port *port, + struct hurd_userlink *link); + +#ifdef __USE_EXTERN_INLINES _HURD_PORT_H_EXTERN_INLINE mach_port_t _hurd_port_get (struct hurd_port *port, struct hurd_userlink *link) @@ -106,10 +121,17 @@ _hurd_port_get (struct hurd_port *port, HURD_CRITICAL_END; return result; } +#endif /* Free a reference gotten with `USED_PORT = _hurd_port_get (PORT, LINK);' */ +void +_hurd_port_free (struct hurd_port *port, + struct hurd_userlink *link, + mach_port_t used_port); + +#ifdef __USE_EXTERN_INLINES _HURD_PORT_H_EXTERN_INLINE void _hurd_port_free (struct hurd_port *port, struct hurd_userlink *link, @@ -129,11 +151,15 @@ _hurd_port_free (struct hurd_port *port, if (dealloc) __mach_port_deallocate (__mach_task_self (), used_port); } +#endif /* Set *PORT's port to NEWPORT. NEWPORT's reference is consumed by PORT->port. PORT->lock is locked. */ +void _hurd_port_locked_set (struct hurd_port *port, mach_port_t newport); + +#ifdef __USE_EXTERN_INLINES _HURD_PORT_H_EXTERN_INLINE void _hurd_port_locked_set (struct hurd_port *port, mach_port_t newport) { @@ -144,9 +170,13 @@ _hurd_port_locked_set (struct hurd_port *port, mach_port_t newport) if (old != MACH_PORT_NULL) __mach_port_deallocate (__mach_task_self (), old); } +#endif /* Same, but locks PORT first. */ +void _hurd_port_set (struct hurd_port *port, mach_port_t newport); + +#ifdef __USE_EXTERN_INLINES _HURD_PORT_H_EXTERN_INLINE void _hurd_port_set (struct hurd_port *port, mach_port_t newport) { @@ -155,6 +185,7 @@ _hurd_port_set (struct hurd_port *port, mach_port_t newport) _hurd_port_locked_set (port, newport); HURD_CRITICAL_END; } +#endif #endif /* hurd/port.h */ diff --git a/hurd/hurd/signal.h b/hurd/hurd/signal.h index 21e30c5..ba13bfe 100644 --- a/hurd/hurd/signal.h +++ b/hurd/hurd/signal.h @@ -1,5 +1,5 @@ /* Implementing POSIX.1 signals under the Hurd. - Copyright (C) 1993,94,95,96,98,99,2002,2007,2008 + Copyright (C) 1993,94,95,96,98,99,2002,2007,2008,2011 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -71,7 +71,13 @@ struct hurd_sigstate sigset_t blocked; /* What signals are blocked. */ sigset_t pending; /* Pending signals, possibly blocked. */ + + /* Signal handlers. ACTIONS[0] is used to mark the threads with POSIX + semantics: if sa_handler is SIG_IGN instead of SIG_DFL, this thread + will receive global signals and use the process-wide action vector + instead of this one. */ struct sigaction actions[NSIG]; + struct sigaltstack sigaltstack; /* Chain of thread-local signal preemptors; see . @@ -127,19 +133,41 @@ extern struct hurd_sigstate *_hurd_self_sigstate (void) by different threads. */ __attribute__ ((__const__)); +/* Process-wide signal state. */ + +extern struct hurd_sigstate *_hurd_global_sigstate; + +/* Mark the given thread as a process-wide signal receiver. */ + +extern void _hurd_sigstate_set_global_rcv (struct hurd_sigstate *ss); + +/* A thread can either use its own action vector and pending signal set + or use the global ones, depending on wether it has been marked as a + global receiver. The accessors below take that into account. */ + +extern void _hurd_sigstate_lock (struct hurd_sigstate *ss); +extern struct sigaction *_hurd_sigstate_actions (struct hurd_sigstate *ss); +extern sigset_t _hurd_sigstate_pending (const struct hurd_sigstate *ss); +extern void _hurd_sigstate_unlock (struct hurd_sigstate *ss); + +/* Used by libpthread to remove stale sigstate structures. */ +extern void _hurd_sigstate_delete (thread_t thread); + #ifndef _HURD_SIGNAL_H_EXTERN_INLINE #define _HURD_SIGNAL_H_EXTERN_INLINE __extern_inline #endif +#ifdef __USE_EXTERN_INLINES _HURD_SIGNAL_H_EXTERN_INLINE struct hurd_sigstate * _hurd_self_sigstate (void) { - struct hurd_sigstate **location = + struct hurd_sigstate **location = (struct hurd_sigstate **) (void *) __hurd_threadvar_location (_HURD_THREADVAR_SIGSTATE); if (*location == NULL) *location = _hurd_thread_sigstate (__mach_thread_self ()); return *location; } +#endif /* Thread listening on our message port; also called the "signal thread". */ @@ -150,12 +178,6 @@ extern thread_t _hurd_msgport_thread; extern mach_port_t _hurd_msgport; - -/* Thread to receive process-global signals. */ - -extern thread_t _hurd_sigthread; - - /* Resource limit on core file size. Enforced by hurdsig.c. */ extern int _hurd_core_limit; @@ -166,10 +188,13 @@ extern int _hurd_core_limit; interrupted lest the signal handler try to take the same lock and deadlock result. */ +void *_hurd_critical_section_lock (void); + +#ifdef __USE_EXTERN_INLINES _HURD_SIGNAL_H_EXTERN_INLINE void * _hurd_critical_section_lock (void) { - struct hurd_sigstate **location = + struct hurd_sigstate **location = (struct hurd_sigstate **) (void *) __hurd_threadvar_location (_HURD_THREADVAR_SIGSTATE); struct hurd_sigstate *ss = *location; if (ss == NULL) @@ -191,7 +216,11 @@ _hurd_critical_section_lock (void) _hurd_critical_section_unlock to unlock it. */ return ss; } +#endif +void _hurd_critical_section_unlock (void *our_lock); + +#ifdef __USE_EXTERN_INLINES _HURD_SIGNAL_H_EXTERN_INLINE void _hurd_critical_section_unlock (void *our_lock) { @@ -201,12 +230,12 @@ _hurd_critical_section_unlock (void *our_lock) else { /* It was us who acquired the critical section lock. Unlock it. */ - struct hurd_sigstate *ss = our_lock; + struct hurd_sigstate *ss = (struct hurd_sigstate *) our_lock; sigset_t pending; - __spin_lock (&ss->lock); + _hurd_sigstate_lock (ss); __spin_unlock (&ss->critical_section_lock); - pending = ss->pending & ~ss->blocked; - __spin_unlock (&ss->lock); + pending = _hurd_sigstate_pending(ss) & ~ss->blocked; + _hurd_sigstate_unlock (ss); if (! __sigisemptyset (&pending)) /* There are unblocked signals pending, which weren't delivered because we were in the critical section. @@ -214,6 +243,7 @@ _hurd_critical_section_unlock (void *our_lock) __msg_sig_post (_hurd_msgport, 0, 0, __mach_task_self ()); } } +#endif /* Convenient macros for simple uses of critical sections. These two must be used as a pair at the same C scoping level. */ @@ -244,6 +274,11 @@ extern void _hurd_raise_signal (struct hurd_sigstate *ss, int signo, extern void _hurd_exception2signal (struct hurd_signal_detail *detail, int *signo); +/* Translate a Mach exception into a signal with a legacy sigcode. */ + +extern void _hurd_exception2signal_legacy (struct hurd_signal_detail *detail, + int *signo); + /* Make the thread described by SS take the signal described by SIGNO and DETAIL. If the process is traced, this will in fact stop with a SIGNO diff --git a/hurd/hurd/threadvar.h b/hurd/hurd/threadvar.h index a0535f7..dd4a59c 100644 --- a/hurd/hurd/threadvar.h +++ b/hurd/hurd/threadvar.h @@ -82,6 +82,8 @@ enum __hurd_threadvar_index extern unsigned long int *__hurd_threadvar_location_from_sp (enum __hurd_threadvar_index __index, void *__sp); + +#ifdef __USE_EXTERN_INLINES _HURD_THREADVAR_H_EXTERN_INLINE unsigned long int * __hurd_threadvar_location_from_sp (enum __hurd_threadvar_index __index, void *__sp) @@ -93,6 +95,7 @@ __hurd_threadvar_location_from_sp (enum __hurd_threadvar_index __index, : (unsigned long int *) ((__stack & __hurd_threadvar_stack_mask) + __hurd_threadvar_stack_offset))[__index]; } +#endif #include /* Define __thread_stack_pointer. */ @@ -106,12 +109,14 @@ __hurd_threadvar_location (enum __hurd_threadvar_index __index) __THROW the same stack frame by different threads. */ __attribute__ ((__const__)); +#ifdef __USE_EXTERN_INLINES _HURD_THREADVAR_H_EXTERN_INLINE unsigned long int * __hurd_threadvar_location (enum __hurd_threadvar_index __index) { return __hurd_threadvar_location_from_sp (__index, __thread_stack_pointer ()); } +#endif #endif /* hurd/threadvar.h */ diff --git a/hurd/hurd/userlink.h b/hurd/hurd/userlink.h index 34457e7..90045a9 100644 --- a/hurd/hurd/userlink.h +++ b/hurd/hurd/userlink.h @@ -77,6 +77,11 @@ struct hurd_userlink /* Attach LINK to the chain of users at *CHAINP. */ +void +_hurd_userlink_link (struct hurd_userlink **chainp, + struct hurd_userlink *link); + +#ifdef __USE_EXTERN_INLINES _HURD_USERLINK_H_EXTERN_INLINE void _hurd_userlink_link (struct hurd_userlink **chainp, struct hurd_userlink *link) @@ -97,11 +102,15 @@ _hurd_userlink_link (struct hurd_userlink **chainp, link->thread.prevp = thread_chainp; *thread_chainp = link; } +#endif /* Detach LINK from its chain. Returns nonzero iff this was the last user of the resource and it should be deallocated. */ +int _hurd_userlink_unlink (struct hurd_userlink *link); + +#ifdef __USE_EXTERN_INLINES _HURD_USERLINK_H_EXTERN_INLINE int _hurd_userlink_unlink (struct hurd_userlink *link) { @@ -124,6 +133,7 @@ _hurd_userlink_unlink (struct hurd_userlink *link) return dealloc; } +#endif /* Clear all users from *CHAINP. Call this when the resource *CHAINP @@ -132,6 +142,9 @@ _hurd_userlink_unlink (struct hurd_userlink *link) value is zero, someone is still using the resource and they will deallocate it when they are finished. */ +int _hurd_userlink_clear (struct hurd_userlink **chainp); + +#ifdef __USE_EXTERN_INLINES _HURD_USERLINK_H_EXTERN_INLINE int _hurd_userlink_clear (struct hurd_userlink **chainp) { @@ -144,5 +157,6 @@ _hurd_userlink_clear (struct hurd_userlink **chainp) *chainp = NULL; return 0; } +#endif #endif /* hurd/userlink.h */ diff --git a/hurd/hurdchdir.c b/hurd/hurdchdir.c index 5115e4d..625eea6 100644 --- a/hurd/hurdchdir.c +++ b/hurd/hurdchdir.c @@ -1,5 +1,5 @@ /* Change a port cell to a directory by looking up a name. - Copyright (C) 1999,2001,02 Free Software Foundation, Inc. + Copyright (C) 1999-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -38,6 +38,9 @@ _hurd_change_directory_port_from_name (struct hurd_port *portcell, len = strlen (name); if (len >= 2 && name[len - 2] == '/' && name[len - 1] == '.') lookup = name; + else if (len == 0) + /* Special-case empty file name according to POSIX. */ + return __hurd_fail (ENOENT); else { char *n = alloca (len + 3); diff --git a/hurd/hurdexec.c b/hurd/hurdexec.c index beae869..283de00 100644 --- a/hurd/hurdexec.c +++ b/hurd/hurdexec.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991,92,93,94,95,96,97,99,2001,02 +/* Copyright (C) 1991,92,93,94,95,96,97,99,2001,2002,2011 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -32,11 +32,29 @@ /* Overlay TASK, executing FILE with arguments ARGV and environment ENVP. If TASK == mach_task_self (), some ports are dealloc'd by the exec server. - ARGV and ENVP are terminated by NULL pointers. */ + ARGV and ENVP are terminated by NULL pointers. + Deprecated: use _hurd_exec_file_name instead. */ error_t _hurd_exec (task_t task, file_t file, char *const argv[], char *const envp[]) { + return _hurd_exec_file_name (task, file, NULL, argv, envp); +} + +link_warning (_hurd_exec, + "_hurd_exec is deprecated, use _hurd_exec_file_name instead"); + +/* Overlay TASK, executing FILE with arguments ARGV and environment ENVP. + If TASK == mach_task_self (), some ports are dealloc'd by the exec server. + ARGV and ENVP are terminated by NULL pointers. FILENAME is the path + (either absolute or relative) to FILE. Passing NULL, though possible, + should be avoided, since then the exec server may not know the path to + FILE if FILE is a script, and will then pass /dev/fd/N to the + interpreter. */ +error_t +_hurd_exec_file_name (task_t task, file_t file, const char *filename, + char *const argv[], char *const envp[]) +{ error_t err; char *args, *env; size_t argslen, envlen; @@ -109,12 +127,13 @@ _hurd_exec (task_t task, file_t file, assert (! __spin_lock_locked (&ss->critical_section_lock)); __spin_lock (&ss->critical_section_lock); - __spin_lock (&ss->lock); + _hurd_sigstate_lock (ss); + struct sigaction *actions = _hurd_sigstate_actions (ss); ints[INIT_SIGMASK] = ss->blocked; - ints[INIT_SIGPENDING] = ss->pending; + ints[INIT_SIGPENDING] = _hurd_sigstate_pending (ss); ints[INIT_SIGIGN] = 0; for (i = 1; i < NSIG; ++i) - if (ss->actions[i].sa_handler == SIG_IGN) + if (actions[i].sa_handler == SIG_IGN) ints[INIT_SIGIGN] |= __sigmask (i); /* We hold the sigstate lock until the exec has failed so that no signal @@ -125,7 +144,7 @@ _hurd_exec (task_t task, file_t file, critical section flag avoids anything we call trying to acquire the sigstate lock. */ - __spin_unlock (&ss->lock); + _hurd_sigstate_unlock (ss); /* Pack up the descriptor table to give the new program. */ __mutex_lock (&_hurd_dtable_lock); @@ -218,7 +237,7 @@ _hurd_exec (task_t task, file_t file, /* We have euid != svuid or egid != svgid. POSIX.1 says that exec sets svuid = euid and svgid = egid. So we must get a new auth port and reauthenticate everything with it. We'll pass the new - ports in file_exec instead of our own ports. */ + ports in file_exec_file_name instead of our own ports. */ auth_t newauth; @@ -362,13 +381,27 @@ _hurd_exec (task_t task, file_t file, if (__sigismember (&_hurdsig_traced, SIGKILL)) flags |= EXEC_SIGTRAP; #endif - err = __file_exec (file, task, flags, - args, argslen, env, envlen, - dtable, MACH_MSG_TYPE_COPY_SEND, dtablesize, - ports, MACH_MSG_TYPE_COPY_SEND, _hurd_nports, - ints, INIT_INT_MAX, - please_dealloc, pdp - please_dealloc, - &_hurd_msgport, task == __mach_task_self () ? 1 : 0); + err = __file_exec_file_name (file, task, flags, + filename ? filename : "", + args, argslen, env, envlen, + dtable, MACH_MSG_TYPE_COPY_SEND, dtablesize, + ports, MACH_MSG_TYPE_COPY_SEND, + _hurd_nports, + ints, INIT_INT_MAX, + please_dealloc, pdp - please_dealloc, + &_hurd_msgport, + task == __mach_task_self () ? 1 : 0); + /* Fall back for backwards compatibility. This can just be removed + when __file_exec goes away. */ + if (err == MIG_BAD_ID) + err = __file_exec (file, task, flags, + args, argslen, env, envlen, + dtable, MACH_MSG_TYPE_COPY_SEND, dtablesize, + ports, MACH_MSG_TYPE_COPY_SEND, _hurd_nports, + ints, INIT_INT_MAX, + please_dealloc, pdp - please_dealloc, + &_hurd_msgport, + task == __mach_task_self () ? 1 : 0); } /* Release references to the standard ports. */ diff --git a/hurd/hurdfault.c b/hurd/hurdfault.c index 36653e1..10b19c8 100644 --- a/hurd/hurdfault.c +++ b/hurd/hurdfault.c @@ -206,6 +206,8 @@ _hurdsig_fault_init (void) /* This state will be restored when we fault. It runs the function above. */ memset (&state, 0, sizeof state); + + MACHINE_THREAD_STATE_FIX_NEW (&state); MACHINE_THREAD_STATE_SET_PC (&state, faulted); MACHINE_THREAD_STATE_SET_SP (&state, faultstack, sizeof faultstack); diff --git a/hurd/hurdinit.c b/hurd/hurdinit.c index 259f8a3..97d3460 100644 --- a/hurd/hurdinit.c +++ b/hurd/hurdinit.c @@ -176,7 +176,7 @@ _hurd_new_proc_init (char **argv, /* This process is "traced", meaning it should stop on signals or exec. We are all set up now to handle signals. Stop ourselves, to inform our parent (presumably a debugger) that the exec has completed. */ - __msg_sig_post (_hurd_msgport, SIGTRAP, 0, __mach_task_self ()); + __msg_sig_post (_hurd_msgport, SIGTRAP, TRAP_TRACE, __mach_task_self ()); } #include diff --git a/hurd/hurdmsg.c b/hurd/hurdmsg.c index ffcce61..fdc7551 100644 --- a/hurd/hurdmsg.c +++ b/hurd/hurdmsg.c @@ -1,4 +1,5 @@ -/* Copyright (C) 1992, 1994, 1995, 1996, 1997 Free Software Foundation, Inc. +/* Copyright (C) 1992, 1994, 1995, 1996, 1997, 2011 + Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -122,17 +123,9 @@ get_int (int which, int *value) case INIT_UMASK: *value = _hurd_umask; return 0; - case INIT_SIGMASK: - { - struct hurd_sigstate *ss = _hurd_thread_sigstate (_hurd_sigthread); - __spin_lock (&ss->lock); - *value = ss->blocked; - __spin_unlock (&ss->lock); - return 0; - } case INIT_SIGPENDING: { - struct hurd_sigstate *ss = _hurd_thread_sigstate (_hurd_sigthread); + struct hurd_sigstate *ss = _hurd_global_sigstate; __spin_lock (&ss->lock); *value = ss->pending; __spin_unlock (&ss->lock); @@ -140,7 +133,7 @@ get_int (int which, int *value) } case INIT_SIGIGN: { - struct hurd_sigstate *ss = _hurd_thread_sigstate (_hurd_sigthread); + struct hurd_sigstate *ss = _hurd_global_sigstate; sigset_t ign; int sig; __spin_lock (&ss->lock); @@ -208,17 +201,9 @@ set_int (int which, int value) return 0; /* These are pretty odd things to do. But you asked for it. */ - case INIT_SIGMASK: - { - struct hurd_sigstate *ss = _hurd_thread_sigstate (_hurd_sigthread); - __spin_lock (&ss->lock); - ss->blocked = value; - __spin_unlock (&ss->lock); - return 0; - } case INIT_SIGPENDING: { - struct hurd_sigstate *ss = _hurd_thread_sigstate (_hurd_sigthread); + struct hurd_sigstate *ss = _hurd_global_sigstate; __spin_lock (&ss->lock); ss->pending = value; __spin_unlock (&ss->lock); @@ -226,7 +211,7 @@ set_int (int which, int value) } case INIT_SIGIGN: { - struct hurd_sigstate *ss = _hurd_thread_sigstate (_hurd_sigthread); + struct hurd_sigstate *ss = _hurd_global_sigstate; int sig; const sigset_t ign = value; __spin_lock (&ss->lock); diff --git a/hurd/hurdselect.c b/hurd/hurdselect.c index a7228f0..54f87da 100644 --- a/hurd/hurdselect.c +++ b/hurd/hurdselect.c @@ -1,6 +1,5 @@ /* Guts of both `select' and `poll' for Hurd. - Copyright (C) 1991,92,93,94,95,96,97,98,99,2001 - Free Software Foundation, Inc. + Copyright (C) 1991-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -50,10 +49,7 @@ _hurd_select (int nfds, error_t err; fd_set rfds, wfds, xfds; int firstfd, lastfd; - mach_msg_timeout_t to = (timeout != NULL ? - (timeout->tv_sec * 1000 + - (timeout->tv_nsec + 999999) / 1000000) : - 0); + mach_msg_timeout_t to = 0; struct { struct hurd_userlink ulink; @@ -72,6 +68,26 @@ _hurd_select (int nfds, assert (sizeof (union typeword) == sizeof (mach_msg_type_t)); assert (sizeof (uint32_t) == sizeof (mach_msg_type_t)); + if (nfds < 0 || nfds > FD_SETSIZE) + { + errno = EINVAL; + return -1; + } + + if (timeout != NULL) + { + if (timeout->tv_sec < 0 || timeout->tv_nsec < 0) + { + errno = EINVAL; + return -1; + } + + to = (timeout->tv_sec * 1000 + + (timeout->tv_nsec + 999999) / 1000000); + if (strcmp(program_invocation_short_name, "vi") && strcmp(program_invocation_short_name, "vim") && strcmp(program_invocation_short_name, "vimdiff") && !to) + to = 1; + } + if (sigmask && __sigprocmask (SIG_SETMASK, sigmask, &oset)) return -1; @@ -223,10 +239,7 @@ _hurd_select (int nfds, { int type = d[i].type; d[i].reply_port = __mach_reply_port (); - err = __io_select (d[i].io_port, d[i].reply_port, - /* Poll only if there's a single descriptor. */ - (firstfd == lastfd) ? to : 0, - &type); + err = __io_select (d[i].io_port, d[i].reply_port, 0, &type); switch (err) { case MACH_RCV_TIMED_OUT: @@ -365,7 +378,7 @@ _hurd_select (int nfds, } /* Look up the respondent's reply port and record its - readiness. */ + readiness. */ { int had = got; if (firstfd != -1) diff --git a/hurd/hurdsig.c b/hurd/hurdsig.c index 7a6b1d5..e5dd6b3 100644 --- a/hurd/hurdsig.c +++ b/hurd/hurdsig.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991,92,93,94,95,96,97,98,99,2000,2001,2002,2005,2008 +/* Copyright (C) 1991,92,93,94,95,96,97,98,99,2000,2001,2002,2005,2008,2011 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -44,9 +44,6 @@ mach_port_t _hurd_msgport; /* Thread listening on it. */ thread_t _hurd_msgport_thread; -/* Thread which receives task-global signals. */ -thread_t _hurd_sigthread; - /* These are set up by _hurdsig_init. */ unsigned long int __hurd_sigthread_stack_base; unsigned long int __hurd_sigthread_stack_end; @@ -55,6 +52,9 @@ unsigned long int *__hurd_sigthread_variables; /* Linked-list of per-thread signal state. */ struct hurd_sigstate *_hurd_sigstates; +/* Sigstate for the task-global signals. */ +struct hurd_sigstate *_hurd_global_sigstate; + /* Timeout for RPC's after interrupt_operation. */ mach_msg_timeout_t _hurd_interrupted_rpc_timeout = 3000; @@ -83,7 +83,7 @@ _hurd_thread_sigstate (thread_t thread) { ss = malloc (sizeof (*ss)); if (ss == NULL) - __libc_fatal ("hurd: Can't allocate thread sigstate\n"); + __libc_fatal ("hurd: Can't allocate sigstate\n"); ss->thread = thread; __spin_lock_init (&ss->lock); @@ -96,16 +96,19 @@ _hurd_thread_sigstate (thread_t thread) ss->intr_port = MACH_PORT_NULL; ss->context = NULL; - /* Initialize the sigaction vector from the default signal receiving - thread's state, and its from the system defaults. */ - if (thread == _hurd_sigthread) - default_sigaction (ss->actions); + if (thread == MACH_PORT_NULL) + { + /* Process-wide sigstate, use the system defaults. */ + default_sigaction (ss->actions); + + /* The global sigstate is not added to the _hurd_sigstates list. + It is created with _hurd_thread_sigstate (MACH_PORT_NULL) + but should be accessed through _hurd_global_sigstate. */ + } else { - struct hurd_sigstate *s; - for (s = _hurd_sigstates; s != NULL; s = s->next) - if (s->thread == _hurd_sigthread) - break; + /* Use the global actions as a default for new threads. */ + struct hurd_sigstate *s = _hurd_global_sigstate; if (s) { __spin_lock (&s->lock); @@ -114,14 +117,109 @@ _hurd_thread_sigstate (thread_t thread) } else default_sigaction (ss->actions); - } - ss->next = _hurd_sigstates; - _hurd_sigstates = ss; + ss->next = _hurd_sigstates; + _hurd_sigstates = ss; + } } __mutex_unlock (&_hurd_siglock); return ss; } + +/* Destroy a sigstate structure. Called by libpthread just before the + * corresponding thread is terminated (the kernel thread port must remain valid + * until this function is called.) */ +void +_hurd_sigstate_delete (thread_t thread) +{ + struct hurd_sigstate **ssp, *ss; + + __mutex_lock (&_hurd_siglock); + for (ssp = &_hurd_sigstates; *ssp; ssp = &(*ssp)->next) + if ((*ssp)->thread == thread) + break; + + ss = *ssp; + if (ss) + *ssp = ss->next; + + __mutex_unlock (&_hurd_siglock); + if (ss) + free (ss); +} + +/* Make SS a global receiver, with pthread signal semantics. */ +void +_hurd_sigstate_set_global_rcv (struct hurd_sigstate *ss) +{ + assert (ss->thread != MACH_PORT_NULL); + ss->actions[0].sa_handler = SIG_IGN; +} + +/* Check whether SS is a global receiver. */ +static int +sigstate_is_global_rcv (const struct hurd_sigstate *ss) +{ + return (_hurd_global_sigstate != NULL) + && (ss->actions[0].sa_handler == SIG_IGN); +} + +/* Lock/unlock a hurd_sigstate structure. If the accessors below require + it, the global sigstate will be locked as well. */ +void +_hurd_sigstate_lock (struct hurd_sigstate *ss) +{ + if (sigstate_is_global_rcv (ss)) + __spin_lock (&_hurd_global_sigstate->lock); + __spin_lock (&ss->lock); +} +void +_hurd_sigstate_unlock (struct hurd_sigstate *ss) +{ + __spin_unlock (&ss->lock); + if (sigstate_is_global_rcv (ss)) + __spin_unlock (&_hurd_global_sigstate->lock); +} + +/* Retreive a thread's full set of pending signals, including the global + ones if appropriate. SS must be locked. */ +sigset_t +_hurd_sigstate_pending (const struct hurd_sigstate *ss) +{ + sigset_t pending = ss->pending; + if (sigstate_is_global_rcv (ss)) + __sigorset (&pending, &pending, &_hurd_global_sigstate->pending); + return pending; +} + +/* Clear a pending signal and return the associated detailed + signal information. SS must be locked, and must have signal SIGNO + pending, either directly or through the global sigstate. */ +static struct hurd_signal_detail +sigstate_clear_pending (struct hurd_sigstate *ss, int signo) +{ + if (sigstate_is_global_rcv (ss) + && __sigismember (&_hurd_global_sigstate->pending, signo)) + { + __sigdelset (&_hurd_global_sigstate->pending, signo); + return _hurd_global_sigstate->pending_data[signo]; + } + + assert (__sigismember (&ss->pending, signo)); + __sigdelset (&ss->pending, signo); + return ss->pending_data[signo]; +} + +/* Retreive a thread's action vector. SS must be locked. */ +struct sigaction * +_hurd_sigstate_actions (struct hurd_sigstate *ss) +{ + if (sigstate_is_global_rcv (ss)) + return _hurd_global_sigstate->actions; + else + return ss->actions; +} + /* Signal delivery itself is on this page. */ @@ -216,6 +314,8 @@ static void abort_thread (struct hurd_sigstate *ss, struct machine_thread_all_state *state, void (*reply) (void)) { + assert (ss->thread != MACH_PORT_NULL); + if (!(state->set & THREAD_ABORTED)) { error_t err = __thread_abort (ss->thread); @@ -355,7 +455,7 @@ _hurdsig_abort_rpcs (struct hurd_sigstate *ss, int signo, int sigthread, call above will retry their RPCs unless we clear SS->intr_port. So we clear it for the thread taking a signal when SA_RESTART is clear, so that its call returns EINTR. */ - if (! signo || !(ss->actions[signo].sa_flags & SA_RESTART)) + if (! signo || !(_hurd_sigstate_actions (ss) [signo].sa_flags & SA_RESTART)) ss->intr_port = MACH_PORT_NULL; } @@ -443,6 +543,30 @@ abort_all_rpcs (int signo, struct machine_thread_all_state *state, int live) } } +/* Wake up any sigsuspend call that is blocking SS->thread. SS must be + locked. */ +static void +wake_sigsuspend (struct hurd_sigstate *ss) +{ + error_t err; + mach_msg_header_t msg; + + if (ss->suspended == MACH_PORT_NULL) + return; + + /* There is a sigsuspend waiting. Tell it to wake up. */ + msg.msgh_bits = MACH_MSGH_BITS (MACH_MSG_TYPE_MAKE_SEND, 0); + msg.msgh_remote_port = ss->suspended; + msg.msgh_local_port = MACH_PORT_NULL; + /* These values do not matter. */ + msg.msgh_id = 8675309; /* Jenny, Jenny. */ + ss->suspended = MACH_PORT_NULL; + err = __mach_msg (&msg, MACH_SEND_MSG, sizeof msg, 0, + MACH_PORT_NULL, MACH_MSG_TIMEOUT_NONE, + MACH_PORT_NULL); + assert_perror (err); +} + struct hurd_signal_preemptor *_hurdsig_preemptors = 0; sigset_t _hurdsig_preempted_set; @@ -453,35 +577,20 @@ weak_alias (_hurdsig_preemptors, _hurdsig_preempters) #define STOPSIGS (sigmask (SIGTTIN) | sigmask (SIGTTOU) | \ sigmask (SIGSTOP) | sigmask (SIGTSTP)) -/* Deliver a signal. SS is not locked. */ -void -_hurd_internal_post_signal (struct hurd_sigstate *ss, - int signo, struct hurd_signal_detail *detail, - mach_port_t reply_port, - mach_msg_type_name_t reply_port_type, - int untraced) +/* Actual delivery of a single signal. Called with SS unlocked. When + the signal is delivered, return SS, locked (or, if SS was originally + _hurd_global_sigstate, the sigstate of the actual thread the signal + was delivered to). If the signal is being traced, return NULL with + SS unlocked. */ +static struct hurd_sigstate * +post_signal (struct hurd_sigstate *ss, + int signo, struct hurd_signal_detail *detail, + int untraced, void (*reply) (void)) { - error_t err; struct machine_thread_all_state thread_state; enum { stop, ignore, core, term, handle } act; - sighandler_t handler; - sigset_t pending; int ss_suspended; - /* Reply to this sig_post message. */ - __typeof (__msg_sig_post_reply) *reply_rpc - = (untraced ? __msg_sig_post_untraced_reply : __msg_sig_post_reply); - void reply (void) - { - error_t err; - if (reply_port == MACH_PORT_NULL) - return; - err = (*reply_rpc) (reply_port, reply_port_type, 0); - reply_port = MACH_PORT_NULL; - if (err != MACH_SEND_INVALID_DEST) /* Ignore dead reply port. */ - assert_perror (err); - } - /* Mark the signal as pending. */ void mark_pending (void) { @@ -526,8 +635,12 @@ _hurd_internal_post_signal (struct hurd_sigstate *ss, assert_perror (err); for (i = 0; i < nthreads; ++i) { - if (threads[i] != _hurd_msgport_thread && - (act != handle || threads[i] != ss->thread)) + if (act == handle && threads[i] == ss->thread) + { + /* The thread that will run the handler is kept suspended. */ + ss_suspended = 1; + } + else if (threads[i] != _hurd_msgport_thread) { err = __thread_resume (threads[i]); assert_perror (err); @@ -540,27 +653,58 @@ _hurd_internal_post_signal (struct hurd_sigstate *ss, (vm_address_t) threads, nthreads * sizeof *threads); _hurd_stopped = 0; - if (act == handle) - /* The thread that will run the handler is already suspended. */ - ss_suspended = 1; } + error_t err; + sighandler_t handler; + if (signo == 0) { if (untraced) - /* This is PTRACE_CONTINUE. */ - resume (); + { + /* This is PTRACE_CONTINUE. */ + act = ignore; + resume (); + } /* This call is just to check for pending signals. */ - __spin_lock (&ss->lock); - goto check_pending_signals; + _hurd_sigstate_lock (ss); + return ss; } - post_signal: - thread_state.set = 0; /* We know nothing. */ - __spin_lock (&ss->lock); + _hurd_sigstate_lock (ss); + + /* If this is a global signal, try to find a thread ready to accept + it right away. This is especially important for untraced signals, + since going through the global pending mask would de-untrace them. */ + if (ss->thread == MACH_PORT_NULL) + { + struct hurd_sigstate *rss; + + __mutex_lock (&_hurd_siglock); + for (rss = _hurd_sigstates; rss != NULL; rss = rss->next) + { + if (! sigstate_is_global_rcv (rss)) + continue; + + /* The global sigstate is already locked. */ + __spin_lock (&rss->lock); + if (! __sigismember (&rss->blocked, signo)) + { + ss = rss; + break; + } + __spin_unlock (&rss->lock); + } + __mutex_unlock (&_hurd_siglock); + } + + /* We want the preemptors to be able to update the blocking mask + without affecting the delivery of this signal, so we save the + current value to test against later. */ + sigset_t blocked = ss->blocked; /* Check for a preempted signal. Preempted signals can arrive during critical sections. */ @@ -618,12 +762,12 @@ _hurd_internal_post_signal (struct hurd_sigstate *ss, mark_pending (); else suspend (); - __spin_unlock (&ss->lock); + _hurd_sigstate_unlock (ss); reply (); - return; + return NULL; } - handler = ss->actions[signo].sa_handler; + handler = _hurd_sigstate_actions (ss) [signo].sa_handler; if (handler == SIG_DFL) /* Figure out the default action for this signal. */ @@ -716,9 +860,7 @@ _hurd_internal_post_signal (struct hurd_sigstate *ss, } /* Handle receipt of a blocked signal, or any signal while stopped. */ - if (act != ignore && /* Signals ignored now are forgotten now. */ - __sigismember (&ss->blocked, signo) || - (signo != SIGKILL && _hurd_stopped)) + if (__sigismember (&blocked, signo) || (signo != SIGKILL && _hurd_stopped)) { mark_pending (); act = ignore; @@ -753,6 +895,7 @@ _hurd_internal_post_signal (struct hurd_sigstate *ss, now's the time to set it going. */ if (ss_suspended) { + assert (ss->thread != MACH_PORT_NULL); err = __thread_resume (ss->thread); assert_perror (err); ss_suspended = 0; @@ -797,6 +940,8 @@ _hurd_internal_post_signal (struct hurd_sigstate *ss, struct sigcontext *scp, ocontext; int wait_for_reply, state_changed; + assert (ss->thread != MACH_PORT_NULL); + /* Stop the thread and abort its pending RPC operations. */ if (! ss_suspended) { @@ -863,7 +1008,7 @@ _hurd_internal_post_signal (struct hurd_sigstate *ss, as a unit. */ crit ? 0 : signo, 1, &thread_state, &state_changed, - &reply) + reply) != MACH_PORT_NULL); if (crit) @@ -931,23 +1076,28 @@ _hurd_internal_post_signal (struct hurd_sigstate *ss, } } + struct sigaction *action = & _hurd_sigstate_actions (ss) [signo]; + /* Backdoor extra argument to signal handler. */ scp->sc_error = detail->error; /* Block requested signals while running the handler. */ scp->sc_mask = ss->blocked; - __sigorset (&ss->blocked, &ss->blocked, &ss->actions[signo].sa_mask); + __sigorset (&ss->blocked, &ss->blocked, &action->sa_mask); /* Also block SIGNO unless we're asked not to. */ - if (! (ss->actions[signo].sa_flags & (SA_RESETHAND | SA_NODEFER))) + if (! (action->sa_flags & (SA_RESETHAND | SA_NODEFER))) __sigaddset (&ss->blocked, signo); /* Reset to SIG_DFL if requested. SIGILL and SIGTRAP cannot be automatically reset when delivered; the system silently enforces this restriction. */ - if (ss->actions[signo].sa_flags & SA_RESETHAND + if (action->sa_flags & SA_RESETHAND && signo != SIGILL && signo != SIGTRAP) - ss->actions[signo].sa_handler = SIG_DFL; + action->sa_handler = SIG_DFL; + + /* Any sigsuspend call must return after the handler does. */ + wake_sigsuspend (ss); /* Start the thread running the handler (or possibly waiting for an RPC reply before running the handler). */ @@ -962,95 +1112,134 @@ _hurd_internal_post_signal (struct hurd_sigstate *ss, } } - /* The signal has either been ignored or is now being handled. We can - consider it delivered and reply to the killer. */ - reply (); + return ss; +} - /* We get here unless the signal was fatal. We still hold SS->lock. - Check for pending signals, and loop to post them. */ - { - /* Return nonzero if SS has any signals pending we should worry about. - We don't worry about any pending signals if we are stopped, nor if - SS is in a critical section. We are guaranteed to get a sig_post - message before any of them become deliverable: either the SIGCONT - signal, or a sig_post with SIGNO==0 as an explicit poll when the - thread finishes its critical section. */ - inline int signals_pending (void) +/* Return the set of pending signals in SS which should be delivered. */ +static sigset_t +pending_signals (struct hurd_sigstate *ss) +{ + /* We don't worry about any pending signals if we are stopped, nor if + SS is in a critical section. We are guaranteed to get a sig_post + message before any of them become deliverable: either the SIGCONT + signal, or a sig_post with SIGNO==0 as an explicit poll when the + thread finishes its critical section. */ + if (_hurd_stopped || __spin_lock_locked (&ss->critical_section_lock)) + return 0; + + return _hurd_sigstate_pending (ss) & ~ss->blocked; +} + +/* Post the specified pending signals in SS and return 1. If one of + them is traced, abort immediately and return 0. SS must be locked on + entry and will be unlocked in all cases. */ +static int +post_pending (struct hurd_sigstate *ss, sigset_t pending, void (*reply) (void)) +{ + int signo; + struct hurd_signal_detail detail; + + /* Make sure SS corresponds to an actual thread, since we assume it won't + change in post_signal. */ + assert (ss->thread != MACH_PORT_NULL); + + for (signo = 1; signo < NSIG; ++signo) + if (__sigismember (&pending, signo)) { - if (_hurd_stopped || __spin_lock_locked (&ss->critical_section_lock)) + detail = sigstate_clear_pending (ss, signo); + _hurd_sigstate_unlock (ss); + + /* Will reacquire the lock, except if the signal is traced. */ + if (! post_signal (ss, signo, &detail, 0, reply)) return 0; - return pending = ss->pending & ~ss->blocked; } - check_pending_signals: - untraced = 0; + /* No more signals pending; SS->lock is still locked. */ + _hurd_sigstate_unlock (ss); - if (signals_pending ()) - { - for (signo = 1; signo < NSIG; ++signo) - if (__sigismember (&pending, signo)) - { - deliver_pending: - __sigdelset (&ss->pending, signo); - *detail = ss->pending_data[signo]; - __spin_unlock (&ss->lock); - goto post_signal; - } - } + return 1; +} - /* No pending signals left undelivered for this thread. - If we were sent signal 0, we need to check for pending - signals for all threads. */ - if (signo == 0) - { - __spin_unlock (&ss->lock); - __mutex_lock (&_hurd_siglock); - for (ss = _hurd_sigstates; ss != NULL; ss = ss->next) - { - __spin_lock (&ss->lock); - for (signo = 1; signo < NSIG; ++signo) - if (__sigismember (&ss->pending, signo) - && (!__sigismember (&ss->blocked, signo) - /* We "deliver" immediately pending blocked signals whose - action might be to ignore, so that if ignored they are - dropped right away. */ - || ss->actions[signo].sa_handler == SIG_IGN - || ss->actions[signo].sa_handler == SIG_DFL)) - { - mutex_unlock (&_hurd_siglock); - goto deliver_pending; - } - __spin_unlock (&ss->lock); - } - __mutex_unlock (&_hurd_siglock); - } - else - { - /* No more signals pending; SS->lock is still locked. - Wake up any sigsuspend call that is blocking SS->thread. */ - if (ss->suspended != MACH_PORT_NULL) - { - /* There is a sigsuspend waiting. Tell it to wake up. */ - error_t err; - mach_msg_header_t msg; - msg.msgh_bits = MACH_MSGH_BITS (MACH_MSG_TYPE_MAKE_SEND, 0); - msg.msgh_remote_port = ss->suspended; - msg.msgh_local_port = MACH_PORT_NULL; - /* These values do not matter. */ - msg.msgh_id = 8675309; /* Jenny, Jenny. */ - ss->suspended = MACH_PORT_NULL; - err = __mach_msg (&msg, MACH_SEND_MSG, sizeof msg, 0, - MACH_PORT_NULL, MACH_MSG_TIMEOUT_NONE, - MACH_PORT_NULL); - assert_perror (err); - } - __spin_unlock (&ss->lock); - } - } +/* Post all the pending signals of all threads and return 1. If a traced + signal is encountered, abort immediately and return 0. */ +static int +post_all_pending_signals (void (*reply) (void)) +{ + struct hurd_sigstate *ss; + sigset_t pending; + + for (;;) + { + __mutex_lock (&_hurd_siglock); + for (ss = _hurd_sigstates; ss != NULL; ss = ss->next) + { + _hurd_sigstate_lock (ss); + + pending = pending_signals (ss); + if (pending) + /* post_pending() below will unlock SS. */ + break; + + _hurd_sigstate_unlock (ss); + } + __mutex_unlock (&_hurd_siglock); - /* All pending signals delivered to all threads. - Now we can send the reply message even for signal 0. */ - reply (); + if (! pending) + return 1; + if (! post_pending (ss, pending, reply)) + return 0; + } +} + +/* Deliver a signal. SS is not locked. */ +void +_hurd_internal_post_signal (struct hurd_sigstate *ss, + int signo, struct hurd_signal_detail *detail, + mach_port_t reply_port, + mach_msg_type_name_t reply_port_type, + int untraced) +{ + /* Reply to this sig_post message. */ + __typeof (__msg_sig_post_reply) *reply_rpc + = (untraced ? __msg_sig_post_untraced_reply : __msg_sig_post_reply); + void reply (void) + { + error_t err; + if (reply_port == MACH_PORT_NULL) + return; + err = (*reply_rpc) (reply_port, reply_port_type, 0); + reply_port = MACH_PORT_NULL; + if (err != MACH_SEND_INVALID_DEST) /* Ignore dead reply port. */ + assert_perror (err); + } + + ss = post_signal (ss, signo, detail, untraced, reply); + if (! ss) + return; + + /* The signal was neither fatal nor traced. We still hold SS->lock. */ + if (signo != 0 && ss->thread != MACH_PORT_NULL) + { + /* The signal has either been ignored or is now being handled. We can + consider it delivered and reply to the killer. */ + reply (); + + /* Post any pending signals for this thread. */ + if (! post_pending (ss, pending_signals (ss), reply)) + return; + } + else + { + /* If this was a process-wide signal or a poll request, we need + to check for pending signals for all threads. */ + _hurd_sigstate_unlock (ss); + if (! post_all_pending_signals (reply)) + return; + + /* All pending signals delivered to all threads. + Now we can send the reply message even for signal 0. */ + reply (); + } } /* Decide whether REFPORT enables the sender to send us a SIGNO signal. @@ -1169,9 +1358,10 @@ _S_msg_sig_post (mach_port_t me, d.code = sigcode; d.exc = 0; - /* Post the signal to the designated signal-receiving thread. This will - reply when the signal can be considered delivered. */ - _hurd_internal_post_signal (_hurd_thread_sigstate (_hurd_sigthread), + /* Post the signal to a global receiver thread (or mark it pending in + the global sigstate). This will reply when the signal can be + considered delivered. */ + _hurd_internal_post_signal (_hurd_global_sigstate, signo, &d, reply_port, reply_port_type, 0); /* Stop if traced. */ @@ -1199,7 +1389,7 @@ _S_msg_sig_post_untraced (mach_port_t me, /* Post the signal to the designated signal-receiving thread. This will reply when the signal can be considered delivered. */ - _hurd_internal_post_signal (_hurd_thread_sigstate (_hurd_sigthread), + _hurd_internal_post_signal (_hurd_global_sigstate, signo, &d, reply_port, reply_port_type, 1); /* Untraced flag. */ @@ -1210,8 +1400,8 @@ extern void __mig_init (void *); #include -/* Initialize the message port and _hurd_sigthread and start the signal - thread. */ +/* Initialize the message port, _hurd_global_sigstate, and start the + signal thread. */ void _hurdsig_init (const int *intarray, size_t intarraysize) @@ -1234,27 +1424,34 @@ _hurdsig_init (const int *intarray, size_t intarraysize) MACH_MSG_TYPE_MAKE_SEND); assert_perror (err); + /* Initialize the global signal state. */ + _hurd_global_sigstate = _hurd_thread_sigstate (MACH_PORT_NULL); + + /* We block all signals, and let actual threads pull them from the + pending mask. */ + __sigfillset(& _hurd_global_sigstate->blocked); + /* Initialize the main thread's signal state. */ ss = _hurd_self_sigstate (); - /* Copy inherited values from our parent (or pre-exec process state) - into the signal settings of the main thread. */ + /* Mark it as a process-wide signal receiver. Threads in this set use + the common action vector in _hurd_global_sigstate. */ + _hurd_sigstate_set_global_rcv (ss); + + /* Copy inherited signal settings from our parent (or pre-exec process + state) */ if (intarraysize > INIT_SIGMASK) ss->blocked = intarray[INIT_SIGMASK]; if (intarraysize > INIT_SIGPENDING) - ss->pending = intarray[INIT_SIGPENDING]; + _hurd_global_sigstate->pending = intarray[INIT_SIGPENDING]; if (intarraysize > INIT_SIGIGN && intarray[INIT_SIGIGN] != 0) { int signo; for (signo = 1; signo < NSIG; ++signo) if (intarray[INIT_SIGIGN] & __sigmask(signo)) - ss->actions[signo].sa_handler = SIG_IGN; + _hurd_global_sigstate->actions[signo].sa_handler = SIG_IGN; } - /* Set the default thread to receive task-global signals - to this one, the main (first) user thread. */ - _hurd_sigthread = ss->thread; - /* Start the signal thread listening on the message port. */ if (__hurd_threadvar_stack_mask == 0) @@ -1268,6 +1465,8 @@ _hurdsig_init (const int *intarray, size_t intarraysize) (vm_address_t *) &__hurd_sigthread_stack_base, &stacksize); assert_perror (err); + err = __mach_setup_tls (_hurd_msgport_thread); + assert_perror (err); __hurd_sigthread_stack_end = __hurd_sigthread_stack_base + stacksize; __hurd_sigthread_variables = @@ -1276,8 +1475,6 @@ _hurdsig_init (const int *intarray, size_t intarraysize) __libc_fatal ("hurd: Can't allocate threadvars for signal thread\n"); memset (__hurd_sigthread_variables, 0, __hurd_threadvar_max * sizeof (unsigned long int)); - __hurd_sigthread_variables[_HURD_THREADVAR_LOCALE] - = (unsigned long int) &_nl_global_locale; /* Reinitialize the MiG support routines so they will use a per-thread variable for the cached reply port. */ diff --git a/hurd/hurdsock.c b/hurd/hurdsock.c index a01b8aa..9c2f2e0 100644 --- a/hurd/hurdsock.c +++ b/hurd/hurdsock.c @@ -1,5 +1,5 @@ /* _hurd_socket_server - Find the server for a socket domain. - Copyright (C) 1991,92,93,94,95,97,99 Free Software Foundation, Inc. + Copyright (C) 1991-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -47,6 +47,12 @@ _hurd_socket_server (int domain, int dead) { socket_t server; + if (domain < 0) + { + errno = EAFNOSUPPORT; + return MACH_PORT_NULL; + } + HURD_CRITICAL_BEGIN; __mutex_lock (&lock); diff --git a/hurd/intern-fd.c b/hurd/intern-fd.c index cd73a70..5d7df43 100644 --- a/hurd/intern-fd.c +++ b/hurd/intern-fd.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1994, 1997 Free Software Foundation, Inc. +/* Copyright (C) 1994-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -20,7 +20,7 @@ #include /* Allocate a new file descriptor and install PORT in it. FLAGS are as for - `open'; only O_IGNORE_CTTY is meaningful. + `open'; only O_IGNORE_CTTY and O_CLOEXEC are meaningful. If the descriptor table is full, set errno, and return -1. If DEALLOC is nonzero, deallocate PORT first. */ diff --git a/hurd/lookup-retry.c b/hurd/lookup-retry.c index 0a88622..c95b282 100644 --- a/hurd/lookup-retry.c +++ b/hurd/lookup-retry.c @@ -1,6 +1,5 @@ /* hairy bits of Hurd file name lookup - Copyright (C) 1992,1993,1994,1995,1996,1997,1999,2001,2002,2003,2005 - Free Software Foundation, Inc. + Copyright (C) 1992-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -45,10 +44,10 @@ lookup_error (error_t error) error_t __hurd_file_name_lookup_retry (error_t (*use_init_port) - (int which, error_t (*operate) (file_t)), + (int which, error_t (*operate) (file_t)), file_t (*get_dtable_port) (int fd), error_t (*lookup) - (file_t dir, char *name, + (file_t dir, char *name, int flags, mode_t mode, retry_type *do_retry, string_t retry_name, mach_port_t *result), @@ -194,7 +193,7 @@ __hurd_file_name_lookup_retry (error_t (*use_init_port) char *end; int save = errno; errno = 0; - fd = (int) strtoul (&retryname[3], &end, 10); + fd = (int) __strtoul_internal (&retryname[3], &end, 10, 0); if (end == NULL || errno || /* Malformed number. */ /* Check for excess text after the number. A slash is valid; it ends the component. Anything else diff --git a/hurd/port2fd.c b/hurd/port2fd.c index 262e6d9..d30b90d 100644 --- a/hurd/port2fd.c +++ b/hurd/port2fd.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1994, 1997, 1999, 2007 Free Software Foundation, Inc. +/* Copyright (C) 1994-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -23,7 +23,7 @@ #include /* Store PORT in file descriptor D, doing appropriate ctty magic. - FLAGS are as for `open'; only O_IGNORE_CTTY is meaningful. + FLAGS are as for `open'; only O_IGNORE_CTTY and O_CLOEXEC are meaningful. D should be locked, and will not be unlocked. */ void diff --git a/hurd/sysvshm.c b/hurd/sysvshm.c new file mode 100644 index 0000000..292cc01 --- /dev/null +++ b/hurd/sysvshm.c @@ -0,0 +1,96 @@ +/* Copyright (C) 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +/* Description of an shm attachment. */ +struct sysvshm_attach +{ + /* Linked list. */ + struct sysvshm_attach *next; + + /* Map address. */ + void *addr; + + /* Map size. */ + size_t size; +}; + +/* List of attachments. */ +static struct sysvshm_attach *attach_list; + +/* A lock to protect the linked list of shared memory attachments. */ +static struct mutex sysvshm_lock = MUTEX_INITIALIZER; + + +/* Adds a segment attachment. */ +error_t +__sysvshm_add (void *addr, size_t size) +{ + struct sysvshm_attach *shm; + + shm = malloc (sizeof (*shm)); + if (!shm) + return errno; + + __mutex_lock (&sysvshm_lock); + shm->addr = addr; + shm->size = size; + shm->next = attach_list; + attach_list = shm; + __mutex_unlock (&sysvshm_lock); + + return 0; +} + +/* Removes a segment attachment. Returns its size if found, or EINVAL + otherwise. */ +error_t +__sysvshm_remove (void *addr, size_t *size) +{ + struct sysvshm_attach *shm; + struct sysvshm_attach **pshm = &attach_list; + + __mutex_lock (&sysvshm_lock); + shm = attach_list; + while (shm) + { + shm = *pshm; + if (shm->addr == addr) + { + *pshm = shm->next; + *size = shm->size; + __mutex_unlock (&sysvshm_lock); + return 0; + } + pshm = &shm->next; + shm = shm->next; + } + __mutex_unlock (&sysvshm_lock); + return EINVAL; +} diff --git a/hurd/sysvshm.h b/hurd/sysvshm.h new file mode 100644 index 0000000..0c561c8 --- /dev/null +++ b/hurd/sysvshm.h @@ -0,0 +1,47 @@ +/* Copyright (C) 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include +#include + +/* The area (from top to bottom) that is used for private keys. These + are all keys that have the second highest bit set. */ +#define SHM_PRIV_KEY_START INT_MAX +#define SHM_PRIV_KEY_END ((INT_MAX / 2) + 1) + +#define SHM_PREFIX "shm-" +#define SHM_DIR _PATH_DEV "shm/" + +/* The maximum number of characters in a shared memory segment file name. + 32 is the max number of characters in a 128 bit number in hex. */ +#if __WORDSIZE > 128 +#error Need to increase SHM_NAMEMAX. +#else +#define SHM_NAMEMAX (sizeof (SHM_PREFIX) - 1 + 32 + 1) +#endif + +/* Use this with printf and its variants. */ +#define SHM_NAMEPRI SHM_PREFIX "%0x" + + +/* Adds a segment attachment. */ +error_t __sysvshm_add (void *addr, size_t size); + +/* Removes a segment attachment. Returns its size if found, or EINVAL + otherwise. */ +error_t __sysvshm_remove (void *addr, size_t *size); diff --git a/hurd/thread-cancel.c b/hurd/thread-cancel.c index c8b6cf5..f463f92 100644 --- a/hurd/thread-cancel.c +++ b/hurd/thread-cancel.c @@ -52,7 +52,6 @@ hurd_thread_cancel (thread_t thread) return 0; } - assert (! __spin_lock_locked (&ss->critical_section_lock)); __spin_lock (&ss->critical_section_lock); __spin_lock (&ss->lock); err = __thread_suspend (thread); diff --git a/iconv/gconv_trans.c b/iconv/gconv_trans.c index 76411cd..21423cc 100644 --- a/iconv/gconv_trans.c +++ b/iconv/gconv_trans.c @@ -242,181 +242,12 @@ __gconv_transliterate (struct __gconv_step *step, return __GCONV_ILLEGAL_INPUT; } - -/* Structure to represent results of found (or not) transliteration - modules. */ -struct known_trans -{ - /* This structure must remain the first member. */ - struct trans_struct info; - - char *fname; - void *handle; - int open_count; -}; - - -/* Tree with results of previous calls to __gconv_translit_find. */ -static void *search_tree; - -/* We modify global data. */ -__libc_lock_define_initialized (static, lock); - - -/* Compare two transliteration entries. */ -static int -trans_compare (const void *p1, const void *p2) -{ - const struct known_trans *s1 = (const struct known_trans *) p1; - const struct known_trans *s2 = (const struct known_trans *) p2; - - return strcmp (s1->info.name, s2->info.name); -} - - -/* Open (maybe reopen) the module named in the struct. Get the function - and data structure pointers we need. */ -static int -open_translit (struct known_trans *trans) -{ - __gconv_trans_query_fct queryfct; - - trans->handle = __libc_dlopen (trans->fname); - if (trans->handle == NULL) - /* Not available. */ - return 1; - - /* Find the required symbol. */ - queryfct = __libc_dlsym (trans->handle, "gconv_trans_context"); - if (queryfct == NULL) - { - /* We cannot live with that. */ - close_and_out: - __libc_dlclose (trans->handle); - trans->handle = NULL; - return 1; - } - - /* Get the context. */ - if (queryfct (trans->info.name, &trans->info.csnames, &trans->info.ncsnames) - != 0) - goto close_and_out; - - /* Of course we also have to have the actual function. */ - trans->info.trans_fct = __libc_dlsym (trans->handle, "gconv_trans"); - if (trans->info.trans_fct == NULL) - goto close_and_out; - - /* Now the optional functions. */ - trans->info.trans_init_fct = - __libc_dlsym (trans->handle, "gconv_trans_init"); - trans->info.trans_context_fct = - __libc_dlsym (trans->handle, "gconv_trans_context"); - trans->info.trans_end_fct = - __libc_dlsym (trans->handle, "gconv_trans_end"); - - trans->open_count = 1; - - return 0; -} - - int internal_function __gconv_translit_find (struct trans_struct *trans) { - struct known_trans **found; - const struct path_elem *runp; - int res = 1; - - /* We have to have a name. */ - assert (trans->name != NULL); - - /* Acquire the lock. */ - __libc_lock_lock (lock); - - /* See whether we know this module already. */ - found = __tfind (trans, &search_tree, trans_compare); - if (found != NULL) - { - /* Is this module available? */ - if ((*found)->handle != NULL) - { - /* Maybe we have to reopen the file. */ - if ((*found)->handle != (void *) -1) - /* The object is not unloaded. */ - res = 0; - else if (open_translit (*found) == 0) - { - /* Copy the data. */ - *trans = (*found)->info; - (*found)->open_count++; - res = 0; - } - } - } - else - { - size_t name_len = strlen (trans->name) + 1; - int need_so = 0; - struct known_trans *newp; - - /* We have to continue looking for the module. */ - if (__gconv_path_elem == NULL) - __gconv_get_path (); - - /* See whether we have to append .so. */ - if (name_len <= 4 || memcmp (&trans->name[name_len - 4], ".so", 3) != 0) - need_so = 1; - - /* Create a new entry. */ - newp = (struct known_trans *) malloc (sizeof (struct known_trans) - + (__gconv_max_path_elem_len - + name_len + 3) - + name_len); - if (newp != NULL) - { - char *cp; - - /* Clear the struct. */ - memset (newp, '\0', sizeof (struct known_trans)); - - /* Store a copy of the module name. */ - newp->info.name = cp = (char *) (newp + 1); - cp = __mempcpy (cp, trans->name, name_len); - - newp->fname = cp; - - /* Search in all the directories. */ - for (runp = __gconv_path_elem; runp->name != NULL; ++runp) - { - cp = __mempcpy (__stpcpy ((char *) newp->fname, runp->name), - trans->name, name_len); - if (need_so) - memcpy (cp, ".so", sizeof (".so")); - - if (open_translit (newp) == 0) - { - /* We found a module. */ - res = 0; - break; - } - } - - if (res) - newp->fname = NULL; - - /* In any case we'll add the entry to our search tree. */ - if (__tsearch (newp, &search_tree, trans_compare) == NULL) - { - /* Yickes, this should not happen. Unload the object. */ - res = 1; - /* XXX unload here. */ - } - } - } - - __libc_lock_unlock (lock); - - return res; + /* Transliteration module loading has been removed because it never + worked as intended and suffered from a security vulnerability. + Consequently, this function always fails. */ + return 1; } diff --git a/iconvdata/Makefile b/iconvdata/Makefile index aa28d8c..7ce061b 100644 --- a/iconvdata/Makefile +++ b/iconvdata/Makefile @@ -379,6 +379,7 @@ $(objpfx)tst-iconv7.out: $(objpfx)gconv-modules \ $(objpfx)iconv-test.out: run-iconv-test.sh $(objpfx)gconv-modules \ $(addprefix $(objpfx),$(modules.so)) \ $(common-objdir)/iconv/iconv_prog TESTS + iconv_modules="$(modules)" \ $(SHELL) -e $< $(common-objdir) '$(cross-test-wrapper)' > $@ $(objpfx)tst-tables.out: tst-tables.sh $(objpfx)gconv-modules \ diff --git a/iconvdata/ibm1364.c b/iconvdata/ibm1364.c index 6881341..5e131f2 100644 --- a/iconvdata/ibm1364.c +++ b/iconvdata/ibm1364.c @@ -221,7 +221,8 @@ enum ++rp2; \ \ uint32_t res; \ - if (__builtin_expect (ch < rp2->start, 0) \ + if (__builtin_expect (rp2->start == 0xffff, 0) \ + || __builtin_expect (ch < rp2->start, 0) \ || (res = DB_TO_UCS4[ch + rp2->idx], \ __builtin_expect (res, L'\1') == L'\0' && ch != '\0')) \ { \ diff --git a/iconvdata/ibm930.c b/iconvdata/ibm930.c index 67d0791..d8be9f7 100644 --- a/iconvdata/ibm930.c +++ b/iconvdata/ibm930.c @@ -1,5 +1,5 @@ /* Conversion from and to IBM930. - Copyright (C) 2000-2002, 2008 Free Software Foundation, Inc. + Copyright (C) 2000-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Masahide Washizawa , 2000. @@ -163,7 +163,8 @@ enum while (ch > rp2->end) \ ++rp2; \ \ - if (__builtin_expect (ch < rp2->start, 0) \ + if (__builtin_expect (rp2->start == 0xffff, 0) \ + || __builtin_expect (ch < rp2->start, 0) \ || (res = __ibm930db_to_ucs4[ch + rp2->idx], \ __builtin_expect (res, L'\1') == L'\0' && ch != '\0')) \ { \ diff --git a/iconvdata/ibm932.c b/iconvdata/ibm932.c index 4fb1582..7dcaba8 100644 --- a/iconvdata/ibm932.c +++ b/iconvdata/ibm932.c @@ -74,11 +74,12 @@ } \ \ ch = (ch * 0x100) + inptr[1]; \ + /* ch was less than 0xfd. */ \ + assert (ch < 0xfd00); \ while (ch > rp2->end) \ ++rp2; \ \ - if (__builtin_expect (rp2 == NULL, 0) \ - || __builtin_expect (ch < rp2->start, 0) \ + if (__builtin_expect (ch < rp2->start, 0) \ || (res = __ibm932db_to_ucs4[ch + rp2->idx], \ __builtin_expect (res, '\1') == 0 && ch !=0)) \ { \ diff --git a/iconvdata/ibm933.c b/iconvdata/ibm933.c index db822ea..e9cbfaf 100644 --- a/iconvdata/ibm933.c +++ b/iconvdata/ibm933.c @@ -162,7 +162,7 @@ enum while (ch > rp2->end) \ ++rp2; \ \ - if (__builtin_expect (rp2 == NULL, 0) \ + if (__builtin_expect (rp2->start == 0xffff, 0) \ || __builtin_expect (ch < rp2->start, 0) \ || (res = __ibm933db_to_ucs4[ch + rp2->idx], \ __builtin_expect (res, L'\1') == L'\0' && ch != '\0')) \ diff --git a/iconvdata/ibm935.c b/iconvdata/ibm935.c index 5b9af9a..5742517 100644 --- a/iconvdata/ibm935.c +++ b/iconvdata/ibm935.c @@ -162,7 +162,7 @@ enum while (ch > rp2->end) \ ++rp2; \ \ - if (__builtin_expect (rp2 == NULL, 0) \ + if (__builtin_expect (rp2->start == 0xffff, 0) \ || __builtin_expect (ch < rp2->start, 0) \ || (res = __ibm935db_to_ucs4[ch + rp2->idx], \ __builtin_expect (res, L'\1') == L'\0' && ch != '\0')) \ diff --git a/iconvdata/ibm937.c b/iconvdata/ibm937.c index 52f7aea..e573794 100644 --- a/iconvdata/ibm937.c +++ b/iconvdata/ibm937.c @@ -162,7 +162,7 @@ enum while (ch > rp2->end) \ ++rp2; \ \ - if (__builtin_expect (rp2 == NULL, 0) \ + if (__builtin_expect (rp2->start == 0xffff, 0) \ || __builtin_expect (ch < rp2->start, 0) \ || (res = __ibm937db_to_ucs4[ch + rp2->idx], \ __builtin_expect (res, L'\1') == L'\0' && ch != '\0')) \ diff --git a/iconvdata/ibm939.c b/iconvdata/ibm939.c index 9f3a363..5eddeeb 100644 --- a/iconvdata/ibm939.c +++ b/iconvdata/ibm939.c @@ -162,7 +162,7 @@ enum while (ch > rp2->end) \ ++rp2; \ \ - if (__builtin_expect (rp2 == NULL, 0) \ + if (__builtin_expect (rp2->start == 0xffff, 0) \ || __builtin_expect (ch < rp2->start, 0) \ || (res = __ibm939db_to_ucs4[ch + rp2->idx], \ __builtin_expect (res, L'\1') == L'\0' && ch != '\0')) \ diff --git a/iconvdata/ibm943.c b/iconvdata/ibm943.c index 119bb1f..0c5c1ed 100644 --- a/iconvdata/ibm943.c +++ b/iconvdata/ibm943.c @@ -75,11 +75,12 @@ } \ \ ch = (ch * 0x100) + inptr[1]; \ + /* ch was less than 0xfd. */ \ + assert (ch < 0xfd00); \ while (ch > rp2->end) \ ++rp2; \ \ - if (__builtin_expect (rp2 == NULL, 0) \ - || __builtin_expect (ch < rp2->start, 0) \ + if (__builtin_expect (ch < rp2->start, 0) \ || (res = __ibm943db_to_ucs4[ch + rp2->idx], \ __builtin_expect (res, '\1') == 0 && ch !=0)) \ { \ diff --git a/iconvdata/run-iconv-test.sh b/iconvdata/run-iconv-test.sh index 03f53b1..3b90680 100755 --- a/iconvdata/run-iconv-test.sh +++ b/iconvdata/run-iconv-test.sh @@ -201,6 +201,24 @@ while read utf8 from filename <&5; do done exec 5<&- +# Check for crashes in decoders. +printf '\016\377\377\377\377\377\377\377' > $temp1 +for from in $iconv_modules ; do + echo $ac_n "test decoder $from $ac_c" + PROG=`eval echo $ICONV` + if $PROG < $temp1 >/dev/null 2>&1 ; then + : # fall through + else + status=$? + if test $status -gt 1 ; then + echo "/FAILED" + failed=1 + continue + fi + fi + echo "OK" +done + exit $failed # Local Variables: # mode:shell-script diff --git a/include/alloca.h b/include/alloca.h index b99c3d1..8350413 100644 --- a/include/alloca.h +++ b/include/alloca.h @@ -49,15 +49,24 @@ libc_hidden_proto (__libc_alloca_cutoff) #if defined stackinfo_get_sp && defined stackinfo_sub_sp # define alloca_account(size, avar) \ - ({ void *old__ = stackinfo_get_sp (); \ - void *m__ = __alloca (size); \ - avar += stackinfo_sub_sp (old__); \ + ({ void *old__ = stackinfo_get_sp (); \ + void *m__ = __alloca (size); \ + avar += stackinfo_sub_sp (old__); \ + m__; }) +# define extend_alloca_account(buf, len, newlen, avar) \ + ({ void *old__ = stackinfo_get_sp (); \ + void *m__ = extend_alloca (buf, len, newlen); \ + avar += stackinfo_sub_sp (old__); \ m__; }) #else # define alloca_account(size, avar) \ - ({ size_t s__ = (size); \ - avar += s__; \ + ({ size_t s__ = (size); \ + avar += s__; \ __alloca (s__); }) +# define extend_alloca_account(buf, len, newlen, avar) \ + ({ size_t s__ = (newlen); \ + avar += s__; \ + extend_alloca (buf, len, s__); }) #endif #endif diff --git a/include/atomic.h b/include/atomic.h index fc4023b..ff15e33 100644 --- a/include/atomic.h +++ b/include/atomic.h @@ -185,7 +185,7 @@ __typeof (*(mem)) __atg5_value = (newvalue); \ \ do \ - __atg5_oldval = *__atg5_memp; \ + __atg5_oldval = *(volatile __typeof (mem))__atg5_memp; \ while (__builtin_expect \ (atomic_compare_and_exchange_bool_acq (__atg5_memp, __atg5_value, \ __atg5_oldval), 0)); \ @@ -206,7 +206,7 @@ __typeof (*(mem)) __atg6_value = (value); \ \ do \ - __atg6_oldval = *__atg6_memp; \ + __atg6_oldval = *(volatile __typeof (mem))__atg6_memp; \ while (__builtin_expect \ (atomic_compare_and_exchange_bool_acq (__atg6_memp, \ __atg6_oldval \ @@ -224,7 +224,7 @@ __typeof (*(mem)) __atg7_value = (value); \ \ do \ - __atg7_oldv = *__atg7_memp; \ + __atg7_oldv = *(volatile __typeof (mem))__atg7_memp; \ while (__builtin_expect \ (catomic_compare_and_exchange_bool_acq (__atg7_memp, \ __atg7_oldv \ @@ -242,7 +242,7 @@ __typeof (mem) __atg8_memp = (mem); \ __typeof (*(mem)) __atg8_value = (value); \ do { \ - __atg8_oldval = *__atg8_memp; \ + __atg8_oldval = *(volatile __typeof (mem))__atg8_memp; \ if (__atg8_oldval >= __atg8_value) \ break; \ } while (__builtin_expect \ @@ -259,7 +259,7 @@ __typeof (mem) __atg9_memp = (mem); \ __typeof (*(mem)) __atg9_value = (value); \ do { \ - __atg9_oldv = *__atg9_memp; \ + __atg9_oldv = *(volatile __typeof (mem))__atg9_memp; \ if (__atg9_oldv >= __atg9_value) \ break; \ } while (__builtin_expect \ @@ -277,7 +277,7 @@ __typeof (mem) __atg10_memp = (mem); \ __typeof (*(mem)) __atg10_value = (value); \ do { \ - __atg10_oldval = *__atg10_memp; \ + __atg10_oldval = *(volatile __typeof (mem))__atg10_memp; \ if (__atg10_oldval <= __atg10_value) \ break; \ } while (__builtin_expect \ @@ -361,7 +361,7 @@ \ do \ { \ - __atg11_oldval = *__atg11_memp; \ + __atg11_oldval = *(volatile __typeof (mem))__atg11_memp; \ if (__builtin_expect (__atg11_oldval <= 0, 0)) \ break; \ } \ @@ -400,7 +400,7 @@ __typeof (*(mem)) __atg14_mask = ((__typeof (*(mem))) 1 << (bit)); \ \ do \ - __atg14_old = (*__atg14_memp); \ + __atg14_old = (*(volatile __typeof (mem))__atg14_memp); \ while (__builtin_expect \ (atomic_compare_and_exchange_bool_acq (__atg14_memp, \ __atg14_old | __atg14_mask,\ @@ -418,7 +418,7 @@ __typeof (*(mem)) __atg15_mask = (mask); \ \ do \ - __atg15_old = (*__atg15_memp); \ + __atg15_old = (*(volatile __typeof (mem))__atg15_memp); \ while (__builtin_expect \ (atomic_compare_and_exchange_bool_acq (__atg15_memp, \ __atg15_old & __atg15_mask, \ @@ -450,7 +450,7 @@ __typeof (*(mem)) __atg16_mask = (mask); \ \ do \ - __atg16_old = (*__atg16_memp); \ + __atg16_old = (*(volatile __typeof (mem))__atg16_memp); \ while (__builtin_expect \ (atomic_compare_and_exchange_bool_acq (__atg16_memp, \ __atg16_old & __atg16_mask,\ @@ -468,7 +468,7 @@ __typeof (*(mem)) __atg17_mask = (mask); \ \ do \ - __atg17_old = (*__atg17_memp); \ + __atg17_old = (*(volatile __typeof (mem))__atg17_memp); \ while (__builtin_expect \ (atomic_compare_and_exchange_bool_acq (__atg17_memp, \ __atg17_old | __atg17_mask, \ @@ -484,7 +484,7 @@ __typeof (*(mem)) __atg18_mask = (mask); \ \ do \ - __atg18_old = (*__atg18_memp); \ + __atg18_old = (*(volatile __typeof (mem))__atg18_memp); \ while (__builtin_expect \ (catomic_compare_and_exchange_bool_acq (__atg18_memp, \ __atg18_old | __atg18_mask,\ @@ -500,7 +500,7 @@ __typeof (*(mem)) __atg19_mask = (mask); \ \ do \ - __atg19_old = (*__atg19_memp); \ + __atg19_old = (*(volatile __typeof (mem))__atg19_memp); \ while (__builtin_expect \ (atomic_compare_and_exchange_bool_acq (__atg19_memp, \ __atg19_old | __atg19_mask,\ diff --git a/include/errno.h b/include/errno.h index 80c7b6e..bdb55c9 100644 --- a/include/errno.h +++ b/include/errno.h @@ -21,7 +21,7 @@ extern int rtld_errno attribute_hidden; # include -# if USE___THREAD +# if USE___THREAD && !defined(__GNU__) # undef errno # ifndef NOT_IN_libc # define errno __libc_errno diff --git a/include/libc-symbols.h b/include/libc-symbols.h index 7ea0890..80989ee 100644 --- a/include/libc-symbols.h +++ b/include/libc-symbols.h @@ -239,12 +239,12 @@ # define __make_section_unallocated(section_string) # endif -/* Tacking on "\n\t#" to the section name makes gcc put it's bogus +/* Tacking on "\n#APP\n\t#" to the section name makes gcc put it's bogus section attributes on what looks like a comment to the assembler. */ # ifdef HAVE_SECTION_QUOTES -# define __sec_comment "\"\n\t#\"" +# define __sec_comment "\"\n#APP\n\t#\"" # else -# define __sec_comment "\n\t#" +# define __sec_comment "\n#APP\n\t#" # endif # define link_warning(symbol, msg) \ __make_section_unallocated (".gnu.warning." #symbol) \ diff --git a/include/string.h b/include/string.h index f73bbf9..ea54d82 100644 --- a/include/string.h +++ b/include/string.h @@ -86,6 +86,7 @@ libc_hidden_proto (__strtok_r) extern char *__strsep_g (char **__stringp, __const char *__delim); libc_hidden_proto (__strsep_g) libc_hidden_proto (strnlen) +libc_hidden_proto (memmem) libc_hidden_builtin_proto (memchr) libc_hidden_builtin_proto (memcpy) diff --git a/include/stubs-prologue.h b/include/stubs-prologue.h index 0577bc6..cf8eba0 100644 --- a/include/stubs-prologue.h +++ b/include/stubs-prologue.h @@ -8,7 +8,7 @@ every time called, usually setting errno to ENOSYS. */ #ifdef _LIBC - #error Applications may not define the macro _LIBC +# error Applications may not define the macro _LIBC #endif @ Placeholder line so we remember to keep the preceding blank line here. diff --git a/include/unistd.h b/include/unistd.h index 0ad2983..cad4ac2 100644 --- a/include/unistd.h +++ b/include/unistd.h @@ -79,6 +79,8 @@ char *__canonicalize_directory_name_internal (__const char *__thisdir, extern int __dup (int __fd); extern int __dup2 (int __fd, int __fd2); libc_hidden_proto (__dup2) +extern int __dup3 (int __fd, int __fd2, int flags); +libc_hidden_proto (__dup3) extern int __execve (__const char *__path, char *__const __argv[], char *__const __envp[]); extern long int __pathconf (__const char *__path, int __name); @@ -171,10 +173,7 @@ extern int __libc_pause (void); extern int __pause_nocancel (void) attribute_hidden; extern int __have_sock_cloexec; -/* At lot of other functionality became available at the same time as - SOCK_CLOEXEC. Avoid defining separate variables for all of them - unless it is really necessary. */ -#define __have_pipe2 __have_sock_cloexec +extern int __have_pipe2; extern int __getlogin_r_loginuid (char *name, size_t namesize) attribute_hidden; diff --git a/intl/locale.alias b/intl/locale.alias index 05c979c..34e7934 100644 --- a/intl/locale.alias +++ b/intl/locale.alias @@ -26,7 +26,7 @@ # Locales should always be specified by their full name. bokmal nb_NO.ISO-8859-1 -bokmål nb_NO.ISO-8859-1 +bokmÃ¥l nb_NO.ISO-8859-1 catalan ca_ES.ISO-8859-1 croatian hr_HR.ISO-8859-2 czech cs_CZ.ISO-8859-2 @@ -34,10 +34,10 @@ danish da_DK.ISO-8859-1 dansk da_DK.ISO-8859-1 deutsch de_DE.ISO-8859-1 dutch nl_NL.ISO-8859-1 -eesti et_EE.ISO-8859-1 -estonian et_EE.ISO-8859-1 +eesti et_EE.ISO-8859-15 +estonian et_EE.ISO-8859-15 finnish fi_FI.ISO-8859-1 -français fr_FR.ISO-8859-1 +français fr_FR.ISO-8859-1 french fr_FR.ISO-8859-1 galego gl_ES.ISO-8859-1 galician gl_ES.ISO-8859-1 @@ -64,7 +64,7 @@ nynorsk nn_NO.ISO-8859-1 polish pl_PL.ISO-8859-2 portuguese pt_PT.ISO-8859-1 romanian ro_RO.ISO-8859-2 -russian ru_RU.ISO-8859-5 +russian ru_RU.KOI8-R slovak sk_SK.ISO-8859-2 slovene sl_SI.ISO-8859-2 slovenian sl_SI.ISO-8859-2 diff --git a/io/fcntl.h b/io/fcntl.h index 0b6b047..4a43a02 100644 --- a/io/fcntl.h +++ b/io/fcntl.h @@ -102,20 +102,6 @@ __BEGIN_DECLS # define SEEK_END 2 /* Seek from end of file. */ #endif /* XPG */ -#ifdef __USE_ATFILE -# define AT_FDCWD -100 /* Special value used to indicate - the *at functions should use the - current working directory. */ -# define AT_SYMLINK_NOFOLLOW 0x100 /* Do not follow symbolic links. */ -# define AT_REMOVEDIR 0x200 /* Remove directory instead of - unlinking file. */ -# define AT_SYMLINK_FOLLOW 0x400 /* Follow symbolic links. */ -# define AT_NO_AUTOMOUNT 0x800 /* Suppress terminal automount - traversal. */ -# define AT_EACCESS 0x200 /* Test access permitted for - effective IDs, not real IDs. */ -#endif - /* Do the file control operation described by CMD on FD. The remaining arguments are interpreted depending on CMD. diff --git a/libio/fileops.c b/libio/fileops.c index d2bcfd7..55aae8a 100644 --- a/libio/fileops.c +++ b/libio/fileops.c @@ -291,7 +291,7 @@ _IO_new_file_fopen (fp, filename, mode, is32not64) #ifdef _LIBC last_recognized = mode; #endif - for (i = 1; i < 6; ++i) + for (i = 1; i < 7; ++i) { switch (*++mode) { @@ -1005,18 +1005,18 @@ _IO_new_file_seekoff (fp, offset, dir, mode) /* Adjust for read-ahead (bytes is buffer). */ offset -= fp->_IO_read_end - fp->_IO_read_ptr; if (fp->_offset == _IO_pos_BAD) - { - if (mode != 0) - goto dumb; - else - { - result = _IO_SYSSEEK (fp, 0, dir); - if (result == EOF) - return result; - - fp->_offset = result; - } - } + { + if (mode != 0) + goto dumb; + else + { + result = _IO_SYSSEEK (fp, 0, dir); + if (result == EOF) + return result; + + fp->_offset = result; + } + } /* Make offset absolute, assuming current pointer is file_ptr(). */ offset += fp->_offset; if (offset < 0) @@ -1278,7 +1278,7 @@ _IO_new_file_write (f, data, n) { f->_flags |= _IO_ERR_SEEN; break; - } + } to_do -= count; data = (void *) ((char *) data + count); } @@ -1366,12 +1366,12 @@ _IO_new_file_xsputn (f, data, n) do_write = to_do - (block_size >= 128 ? to_do % block_size : 0); if (do_write) - { + { count = new_do_write (f, s, do_write); to_do -= count; if (count < do_write) return n - to_do; - } + } /* Now write out the remainder. Normally, this will fit in the buffer, but it's somewhat messier for line-buffered files, diff --git a/libio/stdio.h b/libio/stdio.h index bf16b3f..3a314be 100644 --- a/libio/stdio.h +++ b/libio/stdio.h @@ -706,7 +706,7 @@ extern size_t fread (void *__restrict __ptr, size_t __size, This function is a possible cancellation points and therefore not marked with __THROW. */ extern size_t fwrite (__const void *__restrict __ptr, size_t __size, - size_t __n, FILE *__restrict __s) __wur; + size_t __n, FILE *__restrict __s); __END_NAMESPACE_STD #ifdef __USE_GNU @@ -730,7 +730,7 @@ extern int fputs_unlocked (__const char *__restrict __s, extern size_t fread_unlocked (void *__restrict __ptr, size_t __size, size_t __n, FILE *__restrict __stream) __wur; extern size_t fwrite_unlocked (__const void *__restrict __ptr, size_t __size, - size_t __n, FILE *__restrict __stream) __wur; + size_t __n, FILE *__restrict __stream); #endif diff --git a/libio/wstrops.c b/libio/wstrops.c index c5aae7b..8f56f4d 100644 --- a/libio/wstrops.c +++ b/libio/wstrops.c @@ -96,8 +96,11 @@ _IO_wstr_overflow (fp, c) wchar_t *old_buf = fp->_wide_data->_IO_buf_base; size_t old_wblen = _IO_wblen (fp); _IO_size_t new_size = 2 * old_wblen + 100; - if (new_size < old_wblen) + + if (__builtin_expect ((new_size < old_wblen), 0) + || __builtin_expect ((new_size > SIZE_MAX / sizeof (wchar_t)), 0)) return EOF; + new_buf = (wchar_t *) (*((_IO_strfile *) fp)->_s._allocate_buffer) (new_size * sizeof (wchar_t)); @@ -187,6 +190,9 @@ enlarge_userbuf (_IO_FILE *fp, _IO_off64_t offset, int reading) return 1; _IO_size_t newsize = offset + 100; + if (__builtin_expect ((newsize > SIZE_MAX / sizeof (wchar_t)), 0)) + return 1; + wchar_t *oldbuf = wd->_IO_buf_base; wchar_t *newbuf = (wchar_t *) (*((_IO_strfile *) fp)->_s._allocate_buffer) (newsize diff --git a/libpthread/.cvsignore b/libpthread/.cvsignore new file mode 100644 index 0000000..70845e0 --- /dev/null +++ b/libpthread/.cvsignore @@ -0,0 +1 @@ +Makefile.in diff --git a/libpthread/ChangeLog b/libpthread/ChangeLog new file mode 100644 index 0000000..e991eac --- /dev/null +++ b/libpthread/ChangeLog @@ -0,0 +1,6 @@ +51839d398b0f9885a17ab5c0768b8dec4dd9eb79 is the last commit imported from CVS. +All commits after that one have valid author and committer information. + +Use this to examine the change log for earlier changes: + + $ git show 51839d398b0f9885a17ab5c0768b8dec4dd9eb79:ChangeLog diff --git a/libpthread/Makeconfig b/libpthread/Makeconfig new file mode 100644 index 0000000..9ce18d3 --- /dev/null +++ b/libpthread/Makeconfig @@ -0,0 +1,12 @@ +# Makeconfig fragment for Hurd libpthread add-on. +# This gets included at the end of the main glibc Makeconfig. + +have-thread-library = yes + +shared-thread-library = $(common-objpfx)libpthread/libpthread.so +static-thread-library = $(common-objpfx)libpthread/libpthread.a +bounded-thread-library = $(static-thread-library) + +rpath-dirs += libpthread + ++includes += -I$(..)libpthread/include diff --git a/libpthread/Makefile b/libpthread/Makefile new file mode 100644 index 0000000..2dd4a88 --- /dev/null +++ b/libpthread/Makefile @@ -0,0 +1,336 @@ +# +# Copyright (C) 1994, 1995, 1996, 1997, 2000, 2002, 2004, 2005, 2006, 2007, +# 2008, 2011 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2, or (at +# your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +ifeq ($(..),) +# non-glibc build +IN_GLIBC = no +else +# glibc build +IN_GLIBC = yes +endif + +ifeq ($(IN_GLIBC),no) +dir := libpthread +makemode := library +else +subdir := libpthread + +pthread-version := 0.3 + +srcdir = . +endif + +MICROKERNEL := mach +SYSDEPS := lockfile + +LCLHDRS := + +libpthread-routines := pt-attr pt-attr-destroy pt-attr-getdetachstate \ + pt-attr-getguardsize pt-attr-getinheritsched \ + pt-attr-getschedparam pt-attr-getschedpolicy pt-attr-getscope \ + pt-attr-getstack pt-attr-getstackaddr pt-attr-getstacksize \ + pt-attr-init pt-attr-setdetachstate pt-attr-setguardsize \ + pt-attr-setinheritsched pt-attr-setschedparam \ + pt-attr-setschedpolicy pt-attr-setscope pt-attr-setstack \ + pt-attr-setstackaddr pt-attr-setstacksize \ + \ + pt-barrier-destroy pt-barrier-init pt-barrier-wait \ + pt-barrier pt-barrierattr-destroy pt-barrierattr-init \ + pt-barrierattr-getpshared pt-barrierattr-setpshared \ + \ + pt-destroy-specific pt-init-specific \ + pt-key-create pt-key-delete \ + pt-getspecific pt-setspecific \ + \ + pt-once \ + \ + pt-alloc \ + pt-create \ + pt-getattr \ + pt-equal \ + pt-dealloc \ + pt-detach \ + pt-exit \ + pt-initialize \ + pt-join \ + pt-self \ + pt-sigmask \ + pt-spin-inlines \ + pt-cleanup \ + pt-setcancelstate \ + pt-setcanceltype \ + pt-testcancel \ + pt-cancel \ + \ + pt-mutexattr \ + pt-mutexattr-destroy pt-mutexattr-init \ + pt-mutexattr-getprioceiling pt-mutexattr-getprotocol \ + pt-mutexattr-getpshared pt-mutexattr-gettype \ + pt-mutexattr-setprioceiling pt-mutexattr-setprotocol \ + pt-mutexattr-setpshared pt-mutexattr-settype \ + \ + pt-mutex-init pt-mutex-destroy \ + pt-mutex-lock pt-mutex-trylock pt-mutex-timedlock \ + pt-mutex-unlock \ + pt-mutex-transfer-np \ + pt-mutex-getprioceiling pt-mutex-setprioceiling \ + \ + pt-rwlock-attr \ + pt-rwlockattr-init pt-rwlockattr-destroy \ + pt-rwlockattr-getpshared pt-rwlockattr-setpshared \ + \ + pt-rwlock-init pt-rwlock-destroy \ + pt-rwlock-rdlock pt-rwlock-tryrdlock \ + pt-rwlock-trywrlock pt-rwlock-wrlock \ + pt-rwlock-timedrdlock pt-rwlock-timedwrlock \ + pt-rwlock-unlock \ + \ + pt-cond \ + pt-condattr-init pt-condattr-destroy \ + pt-condattr-getclock pt-condattr-getpshared \ + pt-condattr-setclock pt-condattr-setpshared \ + \ + pt-cond-destroy pt-cond-init \ + pt-cond-brdcast \ + pt-cond-signal \ + pt-cond-wait \ + pt-cond-timedwait \ + pt-hurd-cond-wait \ + \ + pt-stack-alloc \ + pt-thread-alloc \ + pt-thread-dealloc \ + pt-thread-start \ + pt-thread-halt \ + pt-startup \ + \ + pt-getconcurrency pt-setconcurrency \ + \ + pt-block \ + pt-timedblock \ + pt-wakeup \ + pt-docancel \ + pt-sysdep \ + pt-setup \ + pt-machdep \ + pt-spin \ + \ + pt-sigstate-init \ + pt-sigstate-destroy \ + pt-sigstate \ + \ + pt-atfork \ + pt-kill \ + pt-getcpuclockid \ + \ + pt-getschedparam pt-setschedparam pt-setschedprio \ + pt-yield \ + \ + sem-close sem-destroy sem-getvalue sem-init sem-open \ + sem-post sem-timedwait sem-trywait sem-unlink \ + sem-wait \ + \ + cthreads-compat \ + $(SYSDEPS) + +ifeq ($(IN_GLIBC),no) +SRCS := $(addsuffix .c,$(libpthread-routines)) +OBJS = $(addsuffix .o,$(basename $(notdir $(SRCS)))) + +OTHERTAGS = + +libname = libpthread +endif + +headers := \ + pthread.h \ + pthread/pthread.h \ + pthread/pthreadtypes.h \ + semaphore.h \ + \ + bits/pthread.h \ + bits/pthread-np.h \ + bits/pthreadtypes.h \ + bits/mutex.h \ + bits/condition.h \ + bits/condition-attr.h \ + bits/spin-lock.h \ + bits/spin-lock-inline.h \ + bits/cancelation.h \ + bits/thread-attr.h \ + bits/barrier-attr.h \ + bits/barrier.h \ + bits/thread-specific.h \ + bits/once.h \ + bits/mutex-attr.h \ + bits/rwlock.h \ + bits/rwlock-attr.h \ + bits/semaphore.h + +ifeq ($(IN_GLIBC),yes) +distribute := + +routines := forward libc_pthread_init +shared-only-routines = forward + +vpath %.c + +extra-libs := libpthread +extra-libs-others := $(extra-libs) +install-lib-ldscripts := libpthread.so + +include ../Makeconfig +endif + +SYSDEP_PATH = $(srcdir)/sysdeps/$(MICROKERNEL)/hurd/ia32 \ + $(srcdir)/sysdeps/$(MICROKERNEL)/ia32 \ + $(srcdir)/sysdeps/ia32 \ + $(srcdir)/sysdeps/$(MICROKERNEL)/hurd \ + $(srcdir)/sysdeps/$(MICROKERNEL) \ + $(srcdir)/sysdeps/hurd \ + $(srcdir)/sysdeps/generic \ + $(srcdir)/sysdeps/posix \ + $(srcdir)/pthread \ + $(srcdir)/include + +VPATH += $(SYSDEP_PATH) + +ifeq ($(IN_GLIBC),no) +HURDLIBS = ihash +else +LDLIBS-pthread.so = -lihash +endif + +ifeq ($(IN_GLIBC),no) +installhdrs := +installhdrsubdir := . + +include ../Makeconf +endif + +CPPFLAGS += \ + -DENABLE_TLS \ + $(addprefix -I, $(SYSDEP_PATH)) \ + -imacros $(srcdir)/not-in-libc.h + +ifeq ($(IN_GLIBC),no) +CPPFLAGS += \ + -imacros $(srcdir)/include/libc-symbols.h +else +CPPFLAGS += \ + -imacros libc-symbols.h +endif + +ifeq ($(IN_GLIBC),yes) +CFLAGS-lockfile.c = -D_IO_MTSAFE_IO + +all: # Make this the default target; it will be defined in Rules. +endif + +ifeq ($(IN_GLIBC),no) +$(inst_libdir) = $(libdir) +endif + +ifeq ($(IN_GLIBC),no) +install: install-headers +install-headers: $(addprefix $(includedir)/, $(headers)) + +install: $(inst_libdir)/libpthread2.a $(inst_libdir)/libpthread2_pic.a +else +subdir_install: $(inst_libdir)/libpthread2.a +endif + +# XXX: If $(inst_libdir)/libpthread2.a is installed and +# $(inst_libdir)/libpthread is not, we can have some issues. +.PHONY: $(inst_libdir)/libpthread.a $(inst_libdir)/libpthread_pic.a + +# XXX: These rules are a hack. But it is better than messing with +# ../Makeconf at the moment. Note that the linker scripts +# $(srcdir)/libpthread.a and $(srcdir)/libpthread_pic.a get overwritten +# when building in $(srcdir) and not a seperate build directory. +$(inst_libdir)/libpthread2.a: $(inst_libdir)/libpthread.a + mv $< $@ + $(INSTALL_DATA) $(srcdir)/libpthread.a $< + +$(inst_libdir)/libpthread2_pic.a: $(inst_libdir)/libpthread_pic.a + mv $< $@ + $(INSTALL_DATA) $(srcdir)/libpthread_pic.a $< + +ifeq ($(IN_GLIBC),yes) +$(inst_libdir)/libpthread.so: $(objpfx)libpthread.so$(libpthread.so-version) \ + $(+force) + ln -sf $(slibdir)/libpthread.so$(libpthread.so-version) $@ + +libc-link.so = $(common-objpfx)libc.so + +extra-B-pthread.so = -B$(common-objpfx)libpthread/ + +include ../Rules + +# Depend on libc.so so a DT_NEEDED is generated in the shared objects. +# This ensures they will load libc.so for needed symbols if loaded by +# a statically-linked program that hasn't already loaded it. +# Depend on ld.so too to get proper versions of ld.so symbols. +$(objpfx)libpthread.so: $(libc-link.so) $(common-objpfx)libc_nonshared.a \ + $(if $(filter yes,$(elf)), $(elfobjdir)/ld.so) \ + $(common-objpfx)/mach/libmachuser.so \ + $(common-objpfx)/hurd/libhurduser.so +endif + +ifeq ($(IN_GLIBC),no) +.PHONY: $(addprefix $(includedir)/, $(headers)) + +$(addprefix $(includedir)/, $(headers)): + @set -e; \ + t="$@"; \ + t=$${t#$(includedir)/}; \ + header_ok=0; \ + for dir in $(SYSDEP_PATH); \ + do \ + if test -e "$$dir/$$t"; \ + then \ + tdir=`dirname "$@"`; \ + if test ! -e $$tdir; \ + then \ + mkdir $$tdir; \ + fi; \ + echo $(INSTALL_DATA) "$$dir/$$t" "$@"; \ + $(INSTALL_DATA) "$$dir/$$t" "$@"; \ + header_ok=1; \ + break; \ + fi; \ + done; \ + if test "$${header_ok}" -ne 1; \ + then \ + echo; \ + echo '*** 'The header file \`$@\' is required, but not \ +provided, by; \ + echo '*** 'this configuration. Please report this to the \ +maintainer.; \ + echo; \ + false; \ + fi + +# ifeq ($(VERSIONING),yes) +# +# # Adding this dependency gets it included in the command line, +# # where ld will read it as a linker script. +# $(libname).so.$(hurd-version): $(srcdir)/$(libname).map +# +# endif +endif diff --git a/libpthread/Makefile.am b/libpthread/Makefile.am new file mode 100644 index 0000000..e1c062c --- /dev/null +++ b/libpthread/Makefile.am @@ -0,0 +1,168 @@ +# Makefile.am - Makefile template for libpthread. +# Copyright (C) 2003, 2008 Free Software Foundation, Inc. +# +# This file is part of the GNU Hurd. +# +# The GNU Hurd is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# The GNU Hurd is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + +if ARCH_IA32 + arch=ia32 +endif +if ARCH_POWERPC + arch=powerpc +endif + +# The source files are scattered over several directories. Add +# all these directories to the vpath. +SYSDEP_PATH = $(srcdir)/sysdeps/l4/hurd/${arch} \ + $(srcdir)/sysdeps/l4/${arch} \ + $(srcdir)/sysdeps/${arch} \ + $(srcdir)/sysdeps/l4/hurd \ + $(srcdir)/sysdeps/l4 \ + $(srcdir)/sysdeps/hurd \ + $(srcdir)/sysdeps/generic \ + $(srcdir)/sysdeps/posix \ + $(srcdir)/pthread \ + $(srcdir)/signal \ + $(srcdir)/include +vpath %.c $(SYSDEP_PATH) + +AM_CPPFLAGS = $(USER_CPPFLAGS) -I$(srcdir)/pthread \ + $(addprefix -I, $(SYSDEP_PATH)) -imacros $(srcdir)/include/libc-symbols.h +AM_CFLAGS = $(USER_CFLAGS) + +# Sources. +SYSDEPS := lockfile.c + +if ! ENABLE_TESTS +noinst_LIBRARIES = libpthread.a +endif + +libpthread_a_SOURCES = pt-attr.c pt-attr-destroy.c pt-attr-getdetachstate.c \ + pt-attr-getguardsize.c pt-attr-getinheritsched.c \ + pt-attr-getschedparam.c pt-attr-getschedpolicy.c pt-attr-getscope.c \ + pt-attr-getstack.c pt-attr-getstackaddr.c pt-attr-getstacksize.c \ + pt-attr-init.c pt-attr-setdetachstate.c pt-attr-setguardsize.c \ + pt-attr-setinheritsched.c pt-attr-setschedparam.c \ + pt-attr-setschedpolicy.c pt-attr-setscope.c pt-attr-setstack.c \ + pt-attr-setstackaddr.c pt-attr-setstacksize.c pt-attr.c \ + pt-barrier-destroy.c pt-barrier-init.c pt-barrier-wait.c \ + pt-barrier.c pt-barrierattr-destroy.c pt-barrierattr-init.c \ + pt-barrierattr-getpshared.c pt-barrierattr-setpshared.c \ + pt-destroy-specific.c pt-init-specific.c \ + pt-key-create.c pt-key-delete.c \ + pt-getspecific.c pt-setspecific.c \ + pt-once.c \ + pt-alloc.c \ + pt-create.c \ + pt-getattr.c \ + pt-pool-np.c \ + pt-equal.c \ + pt-dealloc.c \ + pt-detach.c \ + pt-exit.c \ + pt-initialize.c \ + pt-join.c \ + pt-self.c \ + pt-sigmask.c \ + pt-spin-inlines.c \ + pt-cleanup.c \ + pt-setcancelstate.c \ + pt-setcanceltype.c \ + pt-testcancel.c \ + pt-cancel.c \ + pt-mutexattr.c \ + pt-mutexattr-destroy.c pt-mutexattr-init.c \ + pt-mutexattr-getprioceiling.c pt-mutexattr-getprotocol.c \ + pt-mutexattr-getpshared.c pt-mutexattr-gettype.c \ + pt-mutexattr-setprioceiling.c pt-mutexattr-setprotocol.c \ + pt-mutexattr-setpshared.c pt-mutexattr-settype.c \ + pt-mutex-init.c pt-mutex-destroy.c \ + pt-mutex-lock.c pt-mutex-trylock.c pt-mutex-timedlock.c \ + pt-mutex-unlock.c \ + pt-mutex-transfer-np.c \ + pt-mutex-getprioceiling.c pt-mutex-setprioceiling.c \ + pt-rwlock-attr.c \ + pt-rwlockattr-init.c pt-rwlockattr-destroy.c \ + pt-rwlockattr-getpshared.c pt-rwlockattr-setpshared.c \ + pt-rwlock-init.c pt-rwlock-destroy.c \ + pt-rwlock-rdlock.c pt-rwlock-tryrdlock.c \ + pt-rwlock-trywrlock.c pt-rwlock-wrlock.c \ + pt-rwlock-timedrdlock.c pt-rwlock-timedwrlock.c \ + pt-rwlock-unlock.c \ + pt-cond.c \ + pt-condattr-init.c pt-condattr-destroy.c \ + pt-condattr-getclock.c pt-condattr-getpshared.c \ + pt-condattr-setclock.c pt-condattr-setpshared.c \ + pt-cond-destroy.c pt-cond-init.c \ + pt-cond-brdcast.c \ + pt-cond-signal.c \ + pt-cond-wait.c \ + pt-cond-timedwait.c \ + pt-stack-alloc.c \ + pt-thread-alloc.c \ + pt-thread-dealloc.c \ + pt-thread-start.c \ + pt-thread-halt.c \ + pt-startup.c \ + pt-getconcurrency.c pt-setconcurrency.c \ + pt-block.c \ + pt-timedblock.c \ + pt-wakeup.c \ + pt-docancel.c \ + pt-sysdep.c \ + pt-setup.c \ + pt-machdep.c \ + pt-spin.c \ + pt-sigstate-init.c \ + pt-sigstate-destroy.c \ + pt-sigstate.c \ + pt-atfork.c \ + pt-kill.c \ + pt-getcpuclockid.c \ + pt-getschedparam.c pt-setschedparam.c pt-setschedprio.c \ + pt-yield.c \ + sem-close.c sem-init.c sem-timedwait.c sem-wait.c \ + sem-destroy.c sem-open.c sem-trywait.c sem-getvalue.c \ + sem-post.c sem-unlink.c \ + \ + pt-setactivity-np.c \ + \ + kill.c \ + killpg.c \ + pt-kill-siginfo-np.c \ + raise.c \ + sigaction.c \ + sigaddset.c \ + sigaltstack.c \ + sigdelset.c \ + sigemptyset.c \ + sigfillset.c \ + sig-internal.c \ + sig-internal.h \ + siginterrupt.c \ + sigismember.c \ + signal.c \ + signal-dispatch.c \ + signal.h \ + sigpending.c \ + sigprocmask.c \ + sigsuspend.c \ + sigtimedwait.c \ + sigwait.c \ + sigwaiter.c \ + sigwaitinfo.c \ + signal-dispatch-lowlevel.c \ + sigprocmask.c diff --git a/libpthread/TODO b/libpthread/TODO new file mode 100644 index 0000000..d7e54da --- /dev/null +++ b/libpthread/TODO @@ -0,0 +1,177 @@ +-*- Mode: outline -*- + +* Interfaces +** All interfaces specified by IEEE Std 1003.1-2001 are present, however, + pthread_kill and pthread_sigmask are defined in and not + as they should be. Once we are compiled with glibc, + this should be eaiser. + +* Test cases. Can never have enough. + +* Ports + Port to other kernels (e.g. Linux and FreeBSD) and test on other + platforms. + +* Implementation details +** pthread_atfork + This cannot be implemented without either changing glibc to export + some hooks (c.f. libc/sysdeps/mach/hurd/fork.c) or by providing a + custom fork implementation that wraps the origial using dlopen et + al. + +** Scheduling and priorities + + We do not support scheduling right now in any way what so ever. + + This affects: + pthread_attr_getinheritsched + pthread_attr_setinheritsched + pthread_attr_getschedparam + pthread_attr_setschedparam + pthread_attr_getschedpolicy + pthread_attr_setschedpolicy + pthread_attr_getscope + pthread_attr_setscope + + pthread_mutexattr_getprioceiling + pthread_mutexattr_setprioceiling + pthread_mutexattr_getprotocol + pthread_mutexattr_setprotocol + pthread_mutex_getprioceiling + pthread_mutex_setprioceiling + + pthread_setschedprio + pthread_getschedparam + pthread_setschedparam + +** Alternate stacks + + Supporting alternate stacks (via pthread_attr_getstackaddr, + pthread_attr_setstackaddr, pthread_attr_getstack, + pthread_attr_setstack, pthread_attr_getstacksize and + pthread_attr_setstacksize) is no problem as long as they are of the + correct size and have the correct alignment. This is due to + limitations in the Hurd TSD implementation + (c.f. ). + +** Cancelation +*** Cancelation points + The only cancelation points are pthread_join, pthread_cond_wait, + pthead_cond_timedwait and pthread_testcancel. Need to explore if + the hurd_sigstate->cancel_hook (c.f. ) provides the + desired semantics. If not, must either wrap the some functions + using dlsym or wait until integration with glibc. +*** Async cancelation + We inject a new IP into the cancelled (running) thread and then + run the cancelation handlers + (c.f. sysdeps/mach/hurd/pt-docancel.c). The handlers need to have + access to the stack as they may use local variables. I think that + this method may leave the frame pointer in a corrupted state if + the thread was in, for instance, the middle of a function call. + The robustness needs to be confirmed. + +** Process Shared Attribute + + Currently, there is no real support for the process shared + attribute. spinlocks work because we just use a test and set loop, + however, barriers, conditions mutexes and rwlocks, however, signal + wakeups via ports of which the names are process local. + + We could have some process local data that is hashed to via the + address of the data structure. Then the first thread that blocks + per process would spin on the shared memory area and all others + would then block as normal. When the resource became available, + the first thread would signal the other local threads as necessary. + Alternatively, there could be some server, however, this opens a + new question: what can we use as an authentication agent. + +** Locking algorithm + + When a thread blocks, it puts itself on a queue and then waits for + a message on a thread local port. The thread which eventually does + the wakeup sends a message to the waiter thereby waking it up. If + the wakeup is a broadcast wakeup (e.g. pthread_cond_broadcast, + pthread_barrier_wait and pthread_rdlock_unlock), the thread must + send O(N) messages where N is the number of waiting threads. If + all the threads instead received on a lock local (rather than + thread local) port then the thread which eventually does the wake + need just do one operation, mach_port_destroy and all of the + waiting threads would wakeup and get MACH_RCV_PORT_DIED back from + mach_msg. Note that the trade off is that the port must be + recreated. This needs to be benchmarked. + + A possible problem with this is scheduling priorities. There may + be a preference for certain threads to wakeup before others + (especially if we are not doing a broadcast, for instance, + pthread_mutex_unlock and pthread_cond_signal). If we take this + approach, the kernel chooses which threads are awakened. If we + find that the kernel makes the wrong choices, we can still overcome + this by merging the two algorithms: have a list of ports sorted in + priority order and the waker does a mach_port_destroy on each as + appropriate. + +** Barriers + + Barriers can be very slow and the contention can be very high. The + above algorithm is very appealing, however, this may be augmented + with an initial number of spins and yields. It is expected that + all of the threads reach the barrier within close succession, thus + queuing a message may be more expensive. This needs to be + benchmarked. + +** Clocks +*** pthread_condattr_setclock allows a process to specify a clock for + use with pthread_cond_timedwaits. What is the correct default for + this, right now, we use CLOCK_REALTIME, however, we are really + using the system clock which, if I understand correctly, is + completely different. +*** Could we even use other clocks? mach_msg uses a relative time against + the system clock. +*** pthread_getcpuclockid just returns CLOCK_THREAD_CPUTIME_ID if defined. + Is this the correct behavior? + +** Timed Blocking +*** pthread_cond_timedwait, pthead_mutex_timedlock, pthread_rwlock_timedrdlock + and pthread_rwlock_timedwrlock all take absolute times. We need + to convert them to relative times for mach_msg. Is there a way + around this? How will clock skew affect us? + +** weak aliases + Use them consistently and correctly and start by reading + http://sources.redhat.com/ml/libc-alpha/2002-08/msg00278.html. + +** TLS + Support for TLS is only implemented for Mach/Hurd (x86). + +* L4 Specific Issues +** Stack +*** Size + The stack size is defined to be a single page in + sysdeps/l4/hurd/pt-sysdep.h. Once we are able to setup regions, + this can be expanded to two megs as suggested by the Mach version. + Until then, however, we need to allocate too much physical memory. +*** Deallocation + __thread_stack_dealloc currently does not deallocate the stack. + For a proper implementation, we need a working memory manager. + +** Scheduling +*** yield + [L4] We cannot use yield for spin locks as L4 only yields to threads of + priority which are greater than or equal to the yielding thread. + If there are threads of lower priority, they are not considered; + the yielding thread is just placed back on the processor. This + introduces priority inversion quite quickly. L4 will not add a + priority suppression function call. As such, we need to do + an ipc with a small time out and then use exponential back off to + do the actual waiting. This sucks. + +** Stub code + [L4] We include in pt-start.c, however, we need a library + so we do not have to play with the corba stuff. + +** Root server and Task server +*** Getting the tids. + pt-start.c has a wonderfully evil hack that will never work well. + +** Paging + We set the pager to the root server. Evil. Fix this in pt-start.c. diff --git a/libpthread/Versions b/libpthread/Versions new file mode 100644 index 0000000..1a8dfee --- /dev/null +++ b/libpthread/Versions @@ -0,0 +1,135 @@ +libc { + GLIBC_2.13_DEBIAN_31 { + pthread_attr_destroy; pthread_attr_getdetachstate; + pthread_attr_getinheritsched; pthread_attr_getschedparam; + pthread_attr_getschedpolicy; pthread_attr_getscope; pthread_attr_init; + pthread_attr_setdetachstate; pthread_attr_setinheritsched; + pthread_attr_setschedparam; pthread_attr_setschedpolicy; + pthread_attr_setscope; + pthread_condattr_destroy; pthread_condattr_init; + pthread_cond_broadcast; pthread_cond_destroy; + pthread_cond_init; pthread_cond_signal; pthread_cond_wait; + pthread_cond_timedwait; + pthread_equal; + pthread_exit; pthread_getschedparam; pthread_setschedparam; + pthread_mutex_destroy; pthread_mutex_init; + pthread_mutex_lock; pthread_mutex_trylock; pthread_mutex_unlock; + pthread_self; pthread_setcancelstate; pthread_setcanceltype; + __pthread_get_cleanup_stack; + GLIBC_PRIVATE { + __libc_pthread_init; + } +} + +libpthread { + GLIBC_2.12 { + __pthread_errorcheck_mutexattr; __pthread_recursive_mutexattr; + + _IO_flockfile; _IO_ftrylockfile; _IO_funlockfile; + + __pthread_get_cleanup_stack; + + __pthread_mutex_transfer_np; + + _pthread_mutex_destroy; _pthread_mutex_init; + _pthread_mutex_lock; _pthread_mutex_trylock; _pthread_mutex_unlock; + _pthread_rwlock_destroy; _pthread_rwlock_init; + + _cthread_init_routine; + + cthread_detach; + cthread_fork; + cthread_keycreate; + cthread_getspecific; + __libc_getspecific; + cthread_setspecific; + __mutex_lock_solid; + __mutex_unlock_solid; + _cthreads_flockfile; + _cthreads_ftrylockfile; + _cthreads_funlockfile; + + flockfile; ftrylockfile; funlockfile; + + pthread_atfork; + + pthread_attr_destroy; pthread_attr_getdetachstate; + pthread_attr_getguardsize; pthread_attr_getinheritsched; + pthread_attr_getschedparam; pthread_attr_getschedpolicy; + pthread_attr_getscope; pthread_attr_getstack; pthread_attr_getstackaddr; + pthread_attr_getstacksize; pthread_attr_init; pthread_attr_setdetachstate; + pthread_attr_setguardsize; pthread_attr_setinheritsched; + pthread_attr_setschedparam; pthread_attr_setschedpolicy; + pthread_attr_setscope; pthread_attr_setstack; pthread_attr_setstackaddr; + pthread_attr_setstacksize; + + pthread_barrier_destroy; pthread_barrier_init; pthread_barrier_wait; + pthread_barrierattr_destroy; pthread_barrierattr_getpshared; + pthread_barrierattr_init; pthread_barrierattr_setpshared; + + pthread_cancel; + + pthread_cond_broadcast; pthread_cond_destroy; pthread_cond_init; + pthread_cond_signal; pthread_cond_timedwait; pthread_cond_wait; + + pthread_condattr_destroy; pthread_condattr_getclock; + pthread_condattr_getpshared; pthread_condattr_init; + pthread_condattr_setclock; pthread_condattr_setpshared; + + pthread_create; pthread_detach; pthread_equal; pthread_exit; + + pthread_getattr_np; + + pthread_getconcurrency; pthread_getcpuclockid; + pthread_getschedparam; pthread_getspecific; + + pthread_join; + + pthread_key_create; pthread_key_delete; + + pthread_kill; + + pthread_mutex_destroy; pthread_mutex_getprioceiling; + pthread_mutex_init; pthread_mutex_lock; pthread_mutex_setprioceiling; + pthread_mutex_timedlock; pthread_mutex_transfer_np; + pthread_mutex_trylock; pthread_mutex_unlock; + + pthread_mutexattr_destroy; pthread_mutexattr_getprioceiling; + pthread_mutexattr_getprotocol; pthread_mutexattr_getpshared; + pthread_mutexattr_gettype; pthread_mutexattr_init; + pthread_mutexattr_setprioceiling; pthread_mutexattr_setprotocol; + pthread_mutexattr_setpshared; pthread_mutexattr_settype; + + pthread_once; + + pthread_rwlock_destroy; pthread_rwlock_init; pthread_rwlock_rdlock; + pthread_rwlock_timedrdlock; pthread_rwlock_timedwrlock; + pthread_rwlock_tryrdlock; pthread_rwlock_trywrlock; + pthread_rwlock_unlock; pthread_rwlock_wrlock; + + pthread_rwlockattr_destroy; pthread_rwlockattr_getpshared; + pthread_rwlockattr_init; pthread_rwlockattr_setpshared; + + pthread_self; + + pthread_setcancelstate; pthread_setcanceltype; + pthread_setconcurrency; pthread_setschedparam; + pthread_setschedprio; pthread_setspecific; + + pthread_sigmask; + pthread_testcancel; + pthread_yield; + + sem_close; sem_destroy; sem_getvalue; sem_init; sem_open; sem_post; + sem_timedwait; sem_trywait; sem_unlink; sem_wait; + + pthread_spin_destroy; pthread_spin_init; pthread_spin_lock; + pthread_spin_trylock; pthread_spin_unlock; + __pthread_spin_destroy; __pthread_spin_init; + __pthread_spin_lock; __pthread_spin_trylock; __pthread_spin_unlock; + _pthread_spin_lock; + } + GLIBC_2.13_DEBIAN_38 { + pthread_hurd_cond_wait_np; + } +} diff --git a/libpthread/configure b/libpthread/configure new file mode 100644 index 0000000..5983490 --- /dev/null +++ b/libpthread/configure @@ -0,0 +1,2 @@ +libc_add_on_canonical=libpthread +libc_add_on_subdirs=. diff --git a/libpthread/configure.in b/libpthread/configure.in new file mode 100644 index 0000000..4e140b1 --- /dev/null +++ b/libpthread/configure.in @@ -0,0 +1,4 @@ +GLIBC_PROVIDES + +libc_add_on_canonical=libpthread +libc_add_on_subdirs=. diff --git a/libpthread/forward.c b/libpthread/forward.c new file mode 100644 index 0000000..c07d7c0 --- /dev/null +++ b/libpthread/forward.c @@ -0,0 +1,127 @@ +/* Copyright (C) 2002, 2003, 2012 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 2002. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include +#include +#include +#include + +/* Pointers to the libc functions. */ +struct pthread_functions __libc_pthread_functions attribute_hidden; + + +# define FORWARD2(name, rettype, decl, params, defaction) \ +rettype \ +name decl \ +{ \ + if (__libc_pthread_functions.ptr_##name == NULL) \ + defaction; \ + \ + return __libc_pthread_functions.ptr_##name params; \ +} + +# define FORWARD(name, decl, params, defretval) \ + FORWARD2 (name, int, decl, params, return defretval) + +FORWARD (pthread_attr_destroy, (pthread_attr_t *attr), (attr), 0) + +FORWARD (pthread_attr_init, (pthread_attr_t *attr), (attr), 0) + +FORWARD (pthread_attr_getdetachstate, + (const pthread_attr_t *attr, int *detachstate), (attr, detachstate), + 0) +FORWARD (pthread_attr_setdetachstate, (pthread_attr_t *attr, int detachstate), + (attr, detachstate), 0) + +FORWARD (pthread_attr_getinheritsched, + (const pthread_attr_t *attr, int *inherit), (attr, inherit), 0) +FORWARD (pthread_attr_setinheritsched, (pthread_attr_t *attr, int inherit), + (attr, inherit), 0) + +FORWARD (pthread_attr_getschedparam, + (const pthread_attr_t *attr, struct sched_param *param), + (attr, param), 0) +FORWARD (pthread_attr_setschedparam, + (pthread_attr_t *attr, const struct sched_param *param), + (attr, param), 0) + +FORWARD (pthread_attr_getschedpolicy, + (const pthread_attr_t *attr, int *policy), (attr, policy), 0) +FORWARD (pthread_attr_setschedpolicy, (pthread_attr_t *attr, int policy), + (attr, policy), 0) + +FORWARD (pthread_attr_getscope, + (const pthread_attr_t *attr, int *scope), (attr, scope), 0) +FORWARD (pthread_attr_setscope, (pthread_attr_t *attr, int scope), + (attr, scope), 0) + + +FORWARD (pthread_condattr_destroy, (pthread_condattr_t *attr), (attr), 0) +FORWARD (pthread_condattr_init, (pthread_condattr_t *attr), (attr), 0) + + +FORWARD (pthread_cond_broadcast, (pthread_cond_t *cond), (cond), 0) +FORWARD (pthread_cond_destroy, (pthread_cond_t *cond), (cond), 0) +FORWARD (pthread_cond_init, + (pthread_cond_t *cond, const pthread_condattr_t *cond_attr), + (cond, cond_attr), 0) +FORWARD (pthread_cond_signal, (pthread_cond_t *cond), (cond), 0) +FORWARD (pthread_cond_wait, (pthread_cond_t *cond, pthread_mutex_t *mutex), + (cond, mutex), 0) +FORWARD (pthread_cond_timedwait, + (pthread_cond_t *cond, pthread_mutex_t *mutex, + const struct timespec *abstime), (cond, mutex, abstime), 0) + +FORWARD (pthread_equal, (pthread_t thread1, pthread_t thread2), + (thread1, thread2), 1) + + +/* Use an alias to avoid warning, as pthread_exit is declared noreturn. */ +FORWARD2 (pthread_exit, void, (void *retval), (retval), exit (EXIT_SUCCESS)) + + +FORWARD (pthread_getschedparam, + (pthread_t target_thread, int *policy, struct sched_param *param), + (target_thread, policy, param), 0) +FORWARD (pthread_setschedparam, + (pthread_t target_thread, int policy, + const struct sched_param *param), (target_thread, policy, param), 0) + + +FORWARD (pthread_mutex_destroy, (pthread_mutex_t *mutex), (mutex), 0) + +FORWARD (pthread_mutex_init, + (pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr), + (mutex, mutexattr), 0) + +FORWARD (pthread_mutex_lock, (pthread_mutex_t *mutex), (mutex), 0) + +FORWARD (pthread_mutex_unlock, (pthread_mutex_t *mutex), (mutex), 0) + + +FORWARD2 (pthread_self, pthread_t, (void), (), return 0) + + +FORWARD (pthread_setcancelstate, (int state, int *oldstate), (state, oldstate), + 0) + +FORWARD (pthread_setcanceltype, (int type, int *oldtype), (type, oldtype), 0) + +struct __pthread_cancelation_handler *dummy_list; +FORWARD2 (__pthread_get_cleanup_stack, struct __pthread_cancelation_handler **, (void), (), return &dummy_list); diff --git a/libpthread/headers.m4 b/libpthread/headers.m4 new file mode 100644 index 0000000..5a58b9b --- /dev/null +++ b/libpthread/headers.m4 @@ -0,0 +1,45 @@ +# headers.m4 - Autoconf snippets to install links for header files. +# Copyright 2003, 2008 Free Software Foundation, Inc. +# Written by Marcus Brinkmann . +# +# This file is free software; as a special exception the author gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. +# +# This file is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +AC_CONFIG_LINKS([ + sysroot/include/pthread.h:libpthread/include/pthread.h + sysroot/include/pthread/pthread.h:libpthread/include/pthread/pthread.h + sysroot/include/pthread/pthreadtypes.h:libpthread/include/pthread/pthreadtypes.h + sysroot/include/bits/memory.h:libpthread/sysdeps/${arch}/bits/memory.h + sysroot/include/bits/spin-lock.h:libpthread/sysdeps/${arch}/bits/spin-lock.h + sysroot/include/bits/spin-lock-inline.h:libpthread/sysdeps/${arch}/bits/spin-lock-inline.h + sysroot/include/bits/pthreadtypes.h:libpthread/sysdeps/generic/bits/pthreadtypes.h + sysroot/include/bits/barrier-attr.h:libpthread/sysdeps/generic/bits/barrier-attr.h + sysroot/include/bits/barrier.h:libpthread/sysdeps/generic/bits/barrier.h + sysroot/include/bits/cancelation.h:libpthread/sysdeps/generic/bits/cancelation.h + sysroot/include/bits/condition-attr.h:libpthread/sysdeps/generic/bits/condition-attr.h + sysroot/include/bits/condition.h:libpthread/sysdeps/generic/bits/condition.h + sysroot/include/bits/mutex-attr.h:libpthread/sysdeps/generic/bits/mutex-attr.h + sysroot/include/bits/mutex.h:libpthread/sysdeps/generic/bits/mutex.h + sysroot/include/bits/once.h:libpthread/sysdeps/generic/bits/once.h + sysroot/include/bits/pthread.h:libpthread/sysdeps/generic/bits/pthread.h + sysroot/include/bits/rwlock-attr.h:libpthread/sysdeps/generic/bits/rwlock-attr.h + sysroot/include/bits/rwlock.h:libpthread/sysdeps/generic/bits/rwlock.h + sysroot/include/bits/thread-attr.h:libpthread/sysdeps/generic/bits/thread-attr.h + sysroot/include/bits/thread-barrier.h:libpthread/sysdeps/generic/bits/thread-barrier.h + sysroot/include/bits/thread-specific.h:libpthread/sysdeps/generic/bits/thread-specific.h + sysroot/include/bits/pthread-np.h:libpthread/sysdeps/l4/hurd/bits/pthread-np.h + sysroot/include/semaphore.h:libpthread/include/semaphore.h + sysroot/include/bits/semaphore.h:libpthread/sysdeps/generic/bits/semaphore.h + sysroot/include/signal.h:libpthread/signal/signal.h +]) + +AC_CONFIG_COMMANDS_POST([ + mkdir -p sysroot/lib libpthread && + ln -sf ../../libpthread/libpthread.a sysroot/lib/ && + touch libpthread/libpthread.a +]) diff --git a/libpthread/include/pthread.h b/libpthread/include/pthread.h new file mode 100644 index 0000000..1d4d3c7 --- /dev/null +++ b/libpthread/include/pthread.h @@ -0,0 +1,7 @@ +#ifndef _PTHREAD_H +#include + +extern int __pthread_mutex_lock (pthread_mutex_t *__mutex); +extern int __pthread_mutex_unlock (pthread_mutex_t *__mutex); + +#endif diff --git a/libpthread/include/pthread/pthread.h b/libpthread/include/pthread/pthread.h new file mode 100644 index 0000000..cd32fb2 --- /dev/null +++ b/libpthread/include/pthread/pthread.h @@ -0,0 +1,755 @@ +/* Copyright (C) 2000, 2002, 2005, 2006, 2007, 2008, 2009, 2010 + Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* + * POSIX Threads Extension: ??? + */ + +#ifndef _PTHREAD_H +#define _PTHREAD_H 1 + +#include + +#include +#ifndef __extern_inline +/* GCC 4.3 and above with -std=c99 or -std=gnu99 implements ISO C99 + inline semantics, unless -fgnu89-inline is used. */ +# if !defined __cplusplus || __GNUC_PREREQ (4,3) +# if defined __GNUC_STDC_INLINE__ || defined __cplusplus +# define __extern_inline extern __inline __attribute__ ((__gnu_inline__)) +# if __GNUC_PREREQ (4,3) +# define __extern_always_inline \ + extern __always_inline __attribute__ ((__gnu_inline__, __artificial__)) +# else +# define __extern_always_inline \ + extern __always_inline __attribute__ ((__gnu_inline__)) +# endif +# else +# define __extern_inline extern __inline +# define __extern_always_inline extern __always_inline +# endif +# endif +#endif + +#include +#include + +__BEGIN_DECLS + +#include + +#include + +/* Possible values for the process shared attribute. */ +#define PTHREAD_PROCESS_PRIVATE __PTHREAD_PROCESS_PRIVATE +#define PTHREAD_PROCESS_SHARED __PTHREAD_PROCESS_SHARED + + +/* Thread attributes. */ + +/* Possible values for the inheritsched attribute. */ +#define PTHREAD_EXPLICIT_SCHED __PTHREAD_EXPLICIT_SCHED +#define PTHREAD_INHERIT_SCHED __PTHREAD_INHERIT_SCHED + +/* Possible values for the `contentionscope' attribute. */ +#define PTHREAD_SCOPE_SYSTEM __PTHREAD_SCOPE_SYSTEM +#define PTHREAD_SCOPE_PROCESS __PTHREAD_SCOPE_PROCESS + +/* Possible values for the `detachstate' attribute. */ +#define PTHREAD_CREATE_JOINABLE __PTHREAD_CREATE_JOINABLE +#define PTHREAD_CREATE_DETACHED __PTHREAD_CREATE_DETACHED + +#include + +/* Initialize the thread attribute object in *ATTR to the default + values. */ +extern int pthread_attr_init (pthread_attr_t *attr); + +/* Destroy the thread attribute object in *ATTR. */ +extern int pthread_attr_destroy (pthread_attr_t *attr); + + +/* Return the value of the inheritsched attribute in *ATTR in + *INHERITSCHED. */ +extern int pthread_attr_getinheritsched (const pthread_attr_t *__restrict attr, + int *__restrict inheritsched); + +/* Set the value of the inheritsched attribute in *ATTR to + INHERITSCHED. */ +extern int pthread_attr_setinheritsched (pthread_attr_t *attr, + int inheritsched); + + +/* Return the value of the schedparam attribute in *ATTR in *PARAM. */ +extern int pthread_attr_getschedparam (const pthread_attr_t *__restrict attr, + struct sched_param *__restrict param); + +/* Set the value of the schedparam attribute in *ATTR to PARAM. */ +extern int pthread_attr_setschedparam (pthread_attr_t *__restrict attr, + const struct sched_param *__restrict param); + + +/* Return the value of the schedpolicy attribute in *ATTR to *POLICY. */ +extern int pthread_attr_getschedpolicy (const pthread_attr_t *__restrict attr, + int *__restrict policy); + +/* Set the value of the schedpolicy attribute in *ATTR to POLICY. */ +extern int pthread_attr_setschedpolicy (pthread_attr_t *attr, + int policy); + + +/* Return the value of the contentionscope attribute in *ATTR in + *CONTENTIONSCOPE. */ +extern int pthread_attr_getscope (const pthread_attr_t *__restrict attr, + int *__restrict contentionscope); + +/* Set the value of the contentionscope attribute in *ATTR to + CONTENTIONSCOPE. */ +extern int pthread_attr_setscope (pthread_attr_t *attr, + int contentionscope); + + +/* Return the value of the stackaddr attribute in *ATTR in + *STACKADDR. */ +extern int pthread_attr_getstackaddr (const pthread_attr_t *__restrict attr, + void **__restrict stackaddr); + +/* Set the value of the stackaddr attribute in *ATTR to STACKADDR. */ +extern int pthread_attr_setstackaddr (pthread_attr_t *attr, + void *stackaddr); + + +#ifdef __USE_XOPEN2K +/* Return the value of the stackaddr and stacksize attributes in *ATTR + in *STACKADDR and *STACKSIZE respectively. */ +extern int pthread_attr_getstack (const pthread_attr_t *__restrict attr, + void **__restrict stackaddr, + size_t *__restrict stacksize); + +/* Set the value of the stackaddr and stacksize attributes in *ATTR to + STACKADDR and STACKSIZE respectively. */ +extern int pthread_attr_setstack (pthread_attr_t *attr, + void *stackaddr, + size_t stacksize); +#endif + + +/* Return the value of the detachstate attribute in *ATTR in + *DETACHSTATE. */ +extern int pthread_attr_getdetachstate (const pthread_attr_t *attr, + int *detachstate); + +/* Set the value of the detachstate attribute in *ATTR to + DETACHSTATE. */ +extern int pthread_attr_setdetachstate (pthread_attr_t *attr, + int detachstate); + + +/* Return the value of the guardsize attribute in *ATTR in + *GUARDSIZE. */ +extern int pthread_attr_getguardsize (const pthread_attr_t *__restrict attr, + size_t *__restrict guardsize); + +/* Set the value of the guardsize attribute in *ATTR to GUARDSIZE. */ +extern int pthread_attr_setguardsize (pthread_attr_t *attr, + size_t guardsize); + + +/* Return the value of the stacksize attribute in *ATTR in + *STACKSIZE. */ +extern int pthread_attr_getstacksize (const pthread_attr_t *__restrict attr, + size_t *__restrict stacksize); + +/* Set the value of the stacksize attribute in *ATTR to STACKSIZE. */ +extern int pthread_attr_setstacksize (pthread_attr_t *attr, + size_t stacksize); + +#ifdef __USE_GNU +/* Initialize thread attribute *ATTR with attributes corresponding to the + already running thread THREAD. It shall be called on an uninitialized ATTR + and destroyed with pthread_attr_destroy when no longer needed. */ +extern int pthread_getattr_np (pthread_t thread, pthread_attr_t *attr); +#endif + + +/* Create a thread with attributes given by ATTR, executing + START_ROUTINE with argument ARG. */ +extern int pthread_create (pthread_t *__restrict __threadp, + __const pthread_attr_t *__restrict __attr, + void *(*__start_routine)(void *), + void *__restrict __arg); + +/* Terminate the current thread and make STATUS available to any + thread that might join us. */ +extern void pthread_exit (void *__status) __attribute__ ((noreturn)); + +/* Make calling thread wait for termination of thread THREAD. Return + the exit status of the thread in *STATUS. */ +extern int pthread_join (pthread_t __threadp, void **__status); + +/* Indicate that the storage for THREAD can be reclaimed when it + terminates. */ +extern int pthread_detach (pthread_t __threadp); + +/* Compare thread IDs T1 and T2. Return nonzero if they are equal, 0 + if they are not. */ +extern int pthread_equal (pthread_t __t1, pthread_t __t2); + +# ifdef __USE_EXTERN_INLINES + +__extern_inline int +pthread_equal (pthread_t __t1, pthread_t __t2) +{ + return __pthread_equal (__t1, __t2); +} + +# endif /* Use extern inlines. */ + + +/* Return the thread ID of the calling thread. */ +extern pthread_t pthread_self (void); + + +/* Mutex attributes. */ + +#define PTHREAD_PRIO_NONE_NP __PTHREAD_PRIO_NONE +#define PTHREAD_PRIO_INHERIT_NP __PTHREAD_PRIO_INHERIT +#define PTHREAD_PRIO_PROTECT_NP __PTHREAD_PRIO_PROTECT +#ifdef __USE_UNIX98 +#define PTHREAD_PRIO_NONE PTHREAD_PRIO_NONE_NP +#define PTHREAD_PRIO_INHERIT PTHREAD_PRIO_INHERIT_NP +#define PTHREAD_PRIO_PROTECT PTHREAD_PRIO_PROTECT_NP +#endif + +#define PTHREAD_MUTEX_TIMED_NP __PTHREAD_MUTEX_TIMED +#define PTHREAD_MUTEX_ERRORCHECK_NP __PTHREAD_MUTEX_ERRORCHECK +#define PTHREAD_MUTEX_RECURSIVE_NP __PTHREAD_MUTEX_RECURSIVE +#if defined __USE_UNIX98 || defined __USE_XOPEN2K8 +#define PTHREAD_MUTEX_NORMAL PTHREAD_MUTEX_TIMED_NP +#define PTHREAD_MUTEX_ERRORCHECK PTHREAD_MUTEX_ERRORCHECK_NP +#define PTHREAD_MUTEX_RECURSIVE PTHREAD_MUTEX_RECURSIVE_NP +#define PTHREAD_MUTEX_DEFAULT PTHREAD_MUTEX_NORMAL +#endif +#ifdef __USE_GNU +/* For compatibility. */ +#define PTHREAD_MUTEX_FAST_NP PTHREAD_MUTEX_TIMED_NP +#endif + +#include + +/* Initialize the mutex attribute object in *ATTR to the default + values. */ +extern int pthread_mutexattr_init(pthread_mutexattr_t *attr); + +/* Destroy the mutex attribute structure in *ATTR. */ +extern int pthread_mutexattr_destroy(pthread_mutexattr_t *attr); + + +#ifdef __USE_UNIX98 +/* Return the value of the prioceiling attribute in *ATTR in + *PRIOCEILING. */ +extern int pthread_mutexattr_getprioceiling(const pthread_mutexattr_t *__restrict attr, + int *__restrict prioceiling); + +/* Set the value of the prioceiling attribute in *ATTR to + PRIOCEILING. */ +extern int pthread_mutexattr_setprioceiling(pthread_mutexattr_t *attr, + int prioceiling); + + +/* Return the value of the protocol attribute in *ATTR in + *PROTOCOL. */ +extern int pthread_mutexattr_getprotocol(const pthread_mutexattr_t *__restrict attr, + int *__restrict protocol); + +/* Set the value of the protocol attribute in *ATTR to PROTOCOL. */ +extern int pthread_mutexattr_setprotocol(pthread_mutexattr_t *attr, + int protocol); +#endif + + +/* Return the value of the process shared attribute in *ATTR in + *PSHARED. */ +extern int pthread_mutexattr_getpshared(const pthread_mutexattr_t *__restrict attr, + int *__restrict pshared); + +/* Set the value of the process shared attribute in *ATTR to + PSHARED. */ +extern int pthread_mutexattr_setpshared(pthread_mutexattr_t *attr, + int pshared); + + +#if defined __USE_UNIX98 || defined __USE_XOPEN2K8 +/* Return the value of the type attribute in *ATTR in *TYPE. */ +extern int pthread_mutexattr_gettype(const pthread_mutexattr_t *__restrict attr, + int *__restrict type); + +/* Set the value of the type attribute in *ATTR to TYPE. */ +extern int pthread_mutexattr_settype(pthread_mutexattr_t *attr, + int type); +#endif + + +/* Mutexes. */ + +#include + +#define PTHREAD_MUTEX_INITIALIZER __PTHREAD_MUTEX_INITIALIZER +/* Static initializer for recursive mutexes. */ + +#ifdef __USE_GNU +# define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP \ + __PTHREAD_ERRORCHECK_MUTEX_INITIALIZER +# define PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP \ + __PTHREAD_RECURSIVE_MUTEX_INITIALIZER +#endif + +/* Create a mutex with attributes given by ATTR and store it in + *__MUTEX. */ +extern int pthread_mutex_init (struct __pthread_mutex *__restrict __mutex, + const pthread_mutexattr_t *__restrict attr); + +/* Destroy the mutex __MUTEX. */ +extern int pthread_mutex_destroy (struct __pthread_mutex *__mutex); + +/* Wait until lock for MUTEX becomes available and lock it. */ +extern int pthread_mutex_lock (pthread_mutex_t *__mutex); + +/* Try to lock MUTEX. */ +extern int pthread_mutex_trylock (pthread_mutex_t *__mutex); + +#ifdef __USE_XOPEN2K +/* Try to lock MUTEX, block until *ABSTIME if it is already held. */ +extern int pthread_mutex_timedlock (struct __pthread_mutex *__restrict mutex, + const struct timespec *__restrict abstime); +#endif + +/* Unlock MUTEX. */ +extern int pthread_mutex_unlock (pthread_mutex_t *__mutex); + +/* Transfer ownership of the mutex MUTEX to the thread TID. The + caller must own the lock. */ +extern int __pthread_mutex_transfer_np (struct __pthread_mutex *mutex, + pthread_t tid); + + +#ifdef __USE_UNIX98 +/* Return the priority ceiling of mutex *MUTEX in *PRIOCEILING. */ +extern int pthread_mutex_getprioceiling (const pthread_mutex_t *__restrict mutex, + int *__restrict prioceiling); + +/* After acquiring the mutex *MUTEX, set its priority ceiling to PRIO + and return the old priority ceiling in *OLDPRIO. Before returning, + release the mutex. */ +extern int pthread_mutex_setprioceiling (pthread_mutex_t *__restrict mutex, + int prio, int *__restrict oldprio); +#endif + + + +/* Condition attributes. */ + +#include + +/* Initialize the condition attribute in *ATTR to the default + values. */ +extern int pthread_condattr_init (pthread_condattr_t *attr); + +/* Destroy the condition attribute structure in *ATTR. */ +extern int pthread_condattr_destroy (pthread_condattr_t *attr); + + +#ifdef __USE_XOPEN2K +/* Return the value of the clock attribute in *ATTR in *CLOCK_ID. */ +extern int pthread_condattr_getclock (const pthread_condattr_t *__restrict attr, + __clockid_t *__restrict clock_id); + +/* Set the value of the clock attribute in *ATTR to CLOCK_ID. */ +extern int pthread_condattr_setclock (pthread_condattr_t *attr, + __clockid_t clock_id); +#endif + + +/* Return the value of the process shared attribute in *ATTR in + *PSHARED. */ +extern int pthread_condattr_getpshared (const pthread_condattr_t *__restrict attr, + int *__restrict pshared); + +/* Set the value of the process shared attribute in *ATTR to + PSHARED. */ +extern int pthread_condattr_setpshared (pthread_condattr_t *attr, + int pshared); + + +/* Condition variables. */ + +#include + +#define PTHREAD_COND_INITIALIZER __PTHREAD_COND_INITIALIZER + +extern int pthread_cond_init (pthread_cond_t *__restrict cond, + const pthread_condattr_t *__restrict attr); + +extern int pthread_cond_destroy (pthread_cond_t *cond); + +/* Unblock at least one of the threads that are blocked on condition + variable COND. */ +extern int pthread_cond_signal (pthread_cond_t *__cond); + +/* Unblock all threads that are blocked on condition variable COND. */ +extern int pthread_cond_broadcast (pthread_cond_t *__cond); + +/* Block on condition variable COND. MUTEX should be held by the + calling thread. On success, MUTEX will be held by the calling + thread. */ +extern int pthread_cond_wait (pthread_cond_t *__restrict __cond, + pthread_mutex_t *__restrict __mutex); + +/* Block on condition variable COND. MUTEX should be held by the + calling thread. On success, MUTEX will be held by the calling + thread. If the time specified by ABSTIME passes, ETIMEDOUT is + returned, and MUTEX will nevertheless be held. */ +extern int pthread_cond_timedwait (pthread_cond_t *__restrict __cond, + pthread_mutex_t *__restrict __mutex, + __const struct timespec *__restrict __abstime); + + +/* Spin locks. */ + +#ifdef __USE_XOPEN2K + +# include + +#define PTHREAD_SPINLOCK_INITIALIZER __PTHREAD_SPIN_LOCK_INITIALIZER + +/* Destroy the spin lock object LOCK. */ +extern int pthread_spin_destroy (pthread_spinlock_t *__lock); + +/* Initialize the spin lock object LOCK. PSHARED determines whether + the spin lock can be operated upon by multiple processes. */ +extern int pthread_spin_init (pthread_spinlock_t *__lock, int __pshared); + +/* Lock the spin lock object LOCK. If the lock is held by another + thread spin until it becomes available. */ +extern int pthread_spin_lock (pthread_spinlock_t *__lock); + +/* Lock the spin lock object LOCK. Fail if the lock is held by + another thread. */ +extern int pthread_spin_trylock (pthread_spinlock_t *__lock); + +/* Unlock the spin lock object LOCK. */ +extern int pthread_spin_unlock (pthread_spinlock_t *__lock); + +# ifdef __USE_EXTERN_INLINES + +# include + +__extern_inline int +pthread_spin_destroy (pthread_spinlock_t *__lock) +{ + return __pthread_spin_destroy (__lock); +} + +__extern_inline int +pthread_spin_init (pthread_spinlock_t *__lock, int __pshared) +{ + return __pthread_spin_init (__lock, __pshared); +} + +__extern_inline int +pthread_spin_lock (pthread_spinlock_t *__lock) +{ + return __pthread_spin_lock (__lock); +} + +__extern_inline int +pthread_spin_trylock (pthread_spinlock_t *__lock) +{ + return __pthread_spin_trylock (__lock); +} + +__extern_inline int +pthread_spin_unlock (pthread_spinlock_t *__lock) +{ + return __pthread_spin_unlock (__lock); +} + +# endif /* Use extern inlines. */ + +#endif /* XPG6. */ + + +/* rwlock attributes. */ + +#if defined __USE_UNIX98 || defined __USE_XOPEN2K + +#include + +/* Initialize rwlock attribute object in *ATTR to the default + values. */ +extern int pthread_rwlockattr_init (pthread_rwlockattr_t *attr); + +/* Destroy the rwlock attribute object in *ATTR. */ +extern int pthread_rwlockattr_destroy (pthread_rwlockattr_t *attr); + + +/* Return the value of the process shared attribute in *ATTR in + *PSHARED. */ +extern int pthread_rwlockattr_getpshared (const pthread_rwlockattr_t *__restrict attr, + int *__restrict pshared); + +/* Set the value of the process shared atrribute in *ATTR to + PSHARED. */ +extern int pthread_rwlockattr_setpshared (pthread_rwlockattr_t *attr, + int pshared); + + +/* rwlocks. */ + +#include + +#define PTHREAD_RWLOCK_INITIALIZER __PTHREAD_RWLOCK_INITIALIZER +/* Create a rwlock object with attributes given by ATTR and strore the + result in *RWLOCK. */ +extern int pthread_rwlock_init (pthread_rwlock_t *__restrict rwlock, + const pthread_rwlockattr_t *__restrict attr); + +/* Destroy the rwlock *RWLOCK. */ +extern int pthread_rwlock_destroy (pthread_rwlock_t *rwlock); + +/* Acquire the rwlock *RWLOCK for reading. */ +extern int pthread_rwlock_rdlock (pthread_rwlock_t *rwlock); + +/* Acquire the rwlock *RWLOCK for reading. */ +extern int pthread_rwlock_tryrdlock (pthread_rwlock_t *rwlock); + +# ifdef __USE_XOPEN2K +/* Acquire the rwlock *RWLOCK for reading blocking until *ABSTIME if + it is already held. */ +extern int pthread_rwlock_timedrdlock (struct __pthread_rwlock *__restrict rwlock, + const struct timespec *__restrict abstime); +# endif + +/* Acquire the rwlock *RWLOCK for writing. */ +extern int pthread_rwlock_wrlock (pthread_rwlock_t *rwlock); + +/* Try to acquire the rwlock *RWLOCK for writing. */ +extern int pthread_rwlock_trywrlock (pthread_rwlock_t *rwlock); + +# ifdef __USE_XOPEN2K +/* Acquire the rwlock *RWLOCK for writing blocking until *ABSTIME if + it is already held. */ +extern int pthread_rwlock_timedwrlock (struct __pthread_rwlock *__restrict rwlock, + const struct timespec *__restrict abstime); +# endif + +/* Release the lock held by the current thread on *RWLOCK. */ +extern int pthread_rwlock_unlock (pthread_rwlock_t *rwlock); + +#endif /* __USE_UNIX98 || __USE_XOPEN2K */ + + + +/* Cancelation. */ + +/* Register a cleanup handler. */ +extern void pthread_cleanup_push (void (*routine) (void *), void *arg); + +/* Unregister a cleanup handler. */ +extern void pthread_cleanup_pop (int execute); + +#include + +#define pthread_cleanup_push(rt, rtarg) __pthread_cleanup_push(rt, rtarg) +#define pthread_cleanup_pop(execute) __pthread_cleanup_pop(execute) + +#define PTHREAD_CANCEL_DISABLE 0 +#define PTHREAD_CANCEL_ENABLE 1 + +/* Return the calling thread's cancelation state in *OLDSTATE and set + its state to STATE. */ +extern int pthread_setcancelstate (int state, int *oldstate); + +#define PTHREAD_CANCEL_DEFERRED 0 +#define PTHREAD_CANCEL_ASYNCHRONOUS 1 + +/* Return the calling thread's cancelation type in *OLDTYPE and set + its type to TYPE. */ +extern int pthread_setcanceltype (int type, int *oldtype); + +/* Value returned by pthread_join if the target thread was + canceled. */ +#define PTHREAD_CANCELED ((void *) -1) + +/* Cancel THEAD. */ +extern int pthread_cancel (pthread_t thread); + +/* Add an explicit cancelation point. */ +extern void pthread_testcancel (void); + + +/* Barriers attributes. */ + +#ifdef __USE_XOPEN2K + +#include + +/* Initialize barrier attribute object in *ATTR to the default + values. */ +extern int pthread_barrierattr_init (pthread_barrierattr_t *attr); + +/* Destroy the barrier attribute object in *ATTR. */ +extern int pthread_barrierattr_destroy (pthread_barrierattr_t *attr); + + +/* Return the value of the process shared attribute in *ATTR in + *PSHARED. */ +extern int pthread_barrierattr_getpshared (const pthread_barrierattr_t *__restrict attr, + int *__restrict pshared); + +/* Set the value of the process shared atrribute in *ATTR to + PSHARED. */ +extern int pthread_barrierattr_setpshared (pthread_barrierattr_t *attr, + int pshared); + + +/* Barriers. */ + +#include + +/* Returned by pthread_barrier_wait to exactly one thread each time a + barrier is passed. */ +#define PTHREAD_BARRIER_SERIAL_THREAD -1 + +/* Initialize barrier BARRIER. */ +extern int pthread_barrier_init (pthread_barrier_t *__restrict barrier, + const pthread_barrierattr_t *__restrict attr, + unsigned count); + +/* Destroy barrier BARRIER. */ +extern int pthread_barrier_destroy (pthread_barrier_t *barrier); + +/* Wait on barrier BARRIER. */ +extern int pthread_barrier_wait (pthread_barrier_t *barrier); + +#endif /* __USE_XOPEN2K */ + + + +/* Thread specific data. */ + +#include + +/* Create a thread specific data key in KEY visible to all threads. + On thread destruction, DESTRUCTOR shall be called with the thread + specific data associate with KEY if it is not NULL. */ +extern int pthread_key_create (pthread_key_t *key, + void (*destructor) (void *)); + +/* Delete the thread specific data key KEY. The associated destructor + function is not called. */ +extern int pthread_key_delete (pthread_key_t key); + +/* Return the caller thread's thread specific value of KEY. */ +extern void *pthread_getspecific (pthread_key_t key); + +/* Set the caller thread's thread specific value of KEY to VALUE. */ +extern int pthread_setspecific (pthread_key_t key, const void *value); + + +/* Dynamic package initialization. */ + +#include + +#define PTHREAD_ONCE_INIT __PTHREAD_ONCE_INIT + +/* Call INIT_ROUTINE if this function has never been called with + *ONCE_CONTROL, otherwise do nothing. */ +extern int pthread_once (pthread_once_t *once_control, + void (*init_routine) (void)); + + +/* Concurrency. */ + +#ifdef __USE_UNIX98 +/* Set the desired concurrency level to NEW_LEVEL. */ +extern int pthread_setconcurrency (int new_level); + +/* Get the current concurrency level. */ +extern int pthread_getconcurrency (void); +#endif + + +/* Forking. */ + +/* Register the function PREPARE to be run before the process forks, + the function PARENT to be run after a fork in the parent and the + function CHILD to be run in the child after the fork. If no + handling is desired then any of PREPARE, PARENT and CHILD may be + NULL. The prepare handles will be called in the reverse order + which they were registered and the parent and child handlers in the + order in which they were registered. */ +extern int pthread_atfork (void (*prepare) (void), void (*parent) (void), + void (*child) (void)); + + +/* Signals (should be in ). */ + +/* Send signal SIGNO to thread THREAD. */ +extern int pthread_kill (pthread_t thread, int signo); + + +/* Time. */ + +#ifdef __USE_XOPEN2K +/* Return the thread cpu clock. */ +extern int pthread_getcpuclockid (pthread_t thread, __clockid_t *clock); +#endif + + +/* Scheduling. */ + +/* Return thread THREAD's scheduling paramters. */ +extern int pthread_getschedparam (pthread_t thread, int *__restrict policy, + struct sched_param *__restrict param); + +/* Set thread THREAD's scheduling paramters. */ +extern int pthread_setschedparam (pthread_t thread, int policy, + const struct sched_param *param); + +/* Set thread THREAD's scheduling priority. */ +extern int pthread_setschedprio (pthread_t thread, int prio); + +#ifdef __USE_GNU +/* Yield the processor to another thread or process. + This function is similar to the POSIX `sched_yield' function but + might be differently implemented in the case of a m-on-n thread + implementation. */ +extern int pthread_yield (void); +#endif + + +/* Kernel-specific interfaces. */ + +#include + + +__END_DECLS + +#endif /* pthread.h */ diff --git a/libpthread/include/pthread/pthreadtypes.h b/libpthread/include/pthread/pthreadtypes.h new file mode 100644 index 0000000..33bd009 --- /dev/null +++ b/libpthread/include/pthread/pthreadtypes.h @@ -0,0 +1,125 @@ +/* Copyright (C) 2000, 2002, 2005, 2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* + * POSIX Threads Extension: ??? + */ + +#ifndef _PTHREADTYPES_H +#define _PTHREADTYPES_H 1 + +#include + +#include + +__BEGIN_DECLS + +#include +typedef __pthread_t pthread_t; + +/* Possible values for the process shared attribute. */ +enum __pthread_process_shared + { + __PTHREAD_PROCESS_PRIVATE = 0, + __PTHREAD_PROCESS_SHARED + }; + +/* Possible values for the inheritsched attribute. */ +enum __pthread_inheritsched + { + __PTHREAD_EXPLICIT_SCHED = 0, + __PTHREAD_INHERIT_SCHED + }; + +/* Possible values for the `contentionscope' attribute. */ +enum __pthread_contentionscope + { + __PTHREAD_SCOPE_SYSTEM = 0, + __PTHREAD_SCOPE_PROCESS + }; + +/* Possible values for the `detachstate' attribute. */ +enum __pthread_detachstate + { + __PTHREAD_CREATE_JOINABLE = 0, + __PTHREAD_CREATE_DETACHED + }; + +#include +typedef struct __pthread_attr pthread_attr_t; + +enum __pthread_mutex_protocol + { + __PTHREAD_PRIO_NONE= 0, + __PTHREAD_PRIO_INHERIT, + __PTHREAD_PRIO_PROTECT + }; + +enum __pthread_mutex_type + { + __PTHREAD_MUTEX_TIMED, + __PTHREAD_MUTEX_ERRORCHECK, + __PTHREAD_MUTEX_RECURSIVE + }; + +#include +typedef struct __pthread_mutexattr pthread_mutexattr_t; + +#include +typedef struct __pthread_mutex pthread_mutex_t; + +#include +typedef struct __pthread_condattr pthread_condattr_t; + +#include +typedef struct __pthread_cond pthread_cond_t; + +#ifdef __USE_XOPEN2K +# include +typedef __pthread_spinlock_t pthread_spinlock_t; +#endif /* XPG6. */ + +#if defined __USE_UNIX98 || defined __USE_XOPEN2K + +#include +typedef struct __pthread_rwlockattr pthread_rwlockattr_t; + +#include +typedef struct __pthread_rwlock pthread_rwlock_t; + +#endif /* __USE_UNIX98 || __USE_XOPEN2K */ + +#ifdef __USE_XOPEN2K + +#include +typedef struct __pthread_barrierattr pthread_barrierattr_t; + +#include +typedef struct __pthread_barrier pthread_barrier_t; + +#endif /* __USE_XOPEN2K */ + +#include +typedef __pthread_key pthread_key_t; + +#include +typedef struct __pthread_once pthread_once_t; + +__END_DECLS + +#endif /* pthreadtypes.h */ diff --git a/libpthread/include/semaphore.h b/libpthread/include/semaphore.h new file mode 100644 index 0000000..657e796 --- /dev/null +++ b/libpthread/include/semaphore.h @@ -0,0 +1,69 @@ +/* Copyright (C) 2005, 2007 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _SEMAPHORE_H +#define _SEMAPHORE_H 1 + +#include + +__BEGIN_DECLS + +#include + +#define SEM_FAILED ((void *) 0) + +typedef struct __semaphore sem_t; + +/* Initialize semaphore *SEM with value VALUE. */ +extern int sem_init (sem_t *sem, int pshared, unsigned value); + +/* Destroy semaphore *SEM created with sem_init. */ +extern int sem_destroy (sem_t *sem); + +/* Store the value of semaphore *SEM in *VALUE. */ +extern int sem_getvalue (sem_t *__restrict sem, int *__restrict value); + +/* Perform a down operation on semaphore *SEM. */ +extern int sem_wait (sem_t *sem); + +/* Perform a down operation on semaphore *SEM if it can be done so + without blocking. */ +extern int sem_trywait (sem_t *sem); + +#ifdef __USE_XOPEN2K +/* Perform a down operation on semaphore *SEM but don't wait longer + than TIMEOUT. */ +extern int sem_timedwait (sem_t *__restrict sem, + const struct timespec *__restrict timeout); +#endif + +/* Perform an up operation on semaphore *SEM. */ +extern int sem_post (sem_t *sem); + +/* Open a named semaphore. */ +extern sem_t *sem_open (const char *name, int open_flags, ...); + +/* Close a semaphore returned by sem_open. */ +extern int sem_close (sem_t *sem); + +/* Unlink a named semaphore. */ +extern int sem_unlink (const char *name); + +__END_DECLS + +#endif /* semaphore.h */ diff --git a/libpthread/libc_pthread_init.c b/libpthread/libc_pthread_init.c new file mode 100644 index 0000000..e6c8b9f --- /dev/null +++ b/libpthread/libc_pthread_init.c @@ -0,0 +1,34 @@ +/* Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Jakub Jelinek , 2002. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include +#include + +void +__libc_pthread_init (functions) + const struct pthread_functions *functions; +{ +#ifdef SHARED + /* We copy the content of the variable pointed to by the FUNCTIONS + parameter to one in libc.so since this means access to the array + can be done with one memory access instead of two. */ + memcpy (&__libc_pthread_functions, functions, + sizeof (__libc_pthread_functions)); +#endif +} diff --git a/libpthread/libpthread.a b/libpthread/libpthread.a new file mode 100644 index 0000000..926315b --- /dev/null +++ b/libpthread/libpthread.a @@ -0,0 +1,20 @@ +/* pthread initializer is weak in glibc. It must be included if glibc + is to start threading. */ +EXTERN(_cthread_init_routine) + +/* Weak references in glibc that must be filled if glibc is to be + thread safe. */ +EXTERN(cthread_detach) +EXTERN(cthread_fork) +EXTERN(cthread_keycreate) +EXTERN(cthread_getspecific) +EXTERN(__libc_getspecific) +EXTERN(cthread_setspecific) +EXTERN(__mutex_lock_solid) +EXTERN(__mutex_unlock_solid) +/* For libio stream locking. */ +EXTERN(_cthreads_flockfile) +EXTERN(_cthreads_funlockfile) +EXTERN(_cthreads_ftrylockfile) + +GROUP(-lpthread2 -lihash -lrt) diff --git a/libpthread/libpthread_pic.a b/libpthread/libpthread_pic.a new file mode 100644 index 0000000..5673b4e --- /dev/null +++ b/libpthread/libpthread_pic.a @@ -0,0 +1,20 @@ +/* pthread initializer is weak in glibc. It must be included if glibc + is to start threading. */ +EXTERN(_cthread_init_routine) + +/* Weak references in glibc that must be filled if glibc is to be + thread safe. */ +EXTERN(cthread_detach) +EXTERN(cthread_fork) +EXTERN(cthread_keycreate) +EXTERN(cthread_getspecific) +EXTERN(__libc_getspecific) +EXTERN(cthread_setspecific) +EXTERN(__mutex_lock_solid) +EXTERN(__mutex_unlock_solid) +/* For libio stream locking. */ +EXTERN(_cthreads_flockfile) +EXTERN(_cthreads_funlockfile) +EXTERN(_cthreads_ftrylockfile) + +GROUP(-lpthread2_pic -lihash_pic) diff --git a/libpthread/lockfile.c b/libpthread/lockfile.c new file mode 100644 index 0000000..040cbfb --- /dev/null +++ b/libpthread/lockfile.c @@ -0,0 +1,65 @@ +/* lockfile - Handle locking and unlocking of streams. Hurd cthreads version. + Copyright (C) 2000,01,02 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include /* Must come before ! */ +#include + +#ifdef _STDIO_USES_IOSTREAM + +void +_cthreads_flockfile (_IO_FILE *fp) +{ + _IO_lock_lock (*fp->_lock); +} + +void +_cthreads_funlockfile (_IO_FILE *fp) +{ + _IO_lock_unlock (*fp->_lock); +} + +int +_cthreads_ftrylockfile (_IO_FILE *fp) +{ + return __libc_lock_trylock_recursive (*fp->_lock); +} + +# undef _IO_flockfile +# undef _IO_funlockfile +# undef _IO_ftrylockfile +# undef flockfile +# undef funlockfile +# undef ftrylockfile + +void _IO_flockfile (_IO_FILE *) + __attribute__ ((alias ("_cthreads_flockfile"))); +void _IO_funlockfile (_IO_FILE *) + __attribute__ ((alias ("_cthreads_funlockfile"))); +int _IO_ftrylockfile (_IO_FILE *) + __attribute__ ((alias ("_cthreads_ftrylockfile"))); + +void flockfile (_IO_FILE *) + __attribute__ ((alias ("_cthreads_flockfile"))); +void funlockfile (_IO_FILE *) + __attribute__ ((alias ("_cthreads_funlockfile"))); +int ftrylockfile (_IO_FILE *) + __attribute__ ((alias ("_cthreads_ftrylockfile"))); + +#endif /* _STDIO_USES_IOSTREAM */ diff --git a/libpthread/not-in-libc.h b/libpthread/not-in-libc.h new file mode 100644 index 0000000..516d4d1 --- /dev/null +++ b/libpthread/not-in-libc.h @@ -0,0 +1,11 @@ +#define __mach_port_insert_right mach_port_insert_right +#define __mach_port_allocate mach_port_allocate +#define __mig_init mig_init +#define __thread_create thread_create +#define __thread_get_state thread_get_state +#define __thread_resume thread_resume +#define __thread_set_state thread_set_state +#define __thread_terminate thread_terminate +#define __vm_allocate vm_allocate +#define __vm_deallocate vm_deallocate +#define __sched_yield sched_yield diff --git a/libpthread/pthread/Versions b/libpthread/pthread/Versions new file mode 100644 index 0000000..e4b4e8b --- /dev/null +++ b/libpthread/pthread/Versions @@ -0,0 +1,15 @@ +libc { + GLIBC_2.2 { + # XXX + __vm_deallocate; __mach_port_insert_right; __mach_reply_port; + __mig_init; __vm_allocate; + + # functions used in inline functions or macros + __pthread_spin_destroy; __pthread_spin_init; __pthread_spin_lock; + _pthread_spin_lock; __pthread_spin_trylock; __pthread_spin_unlock; + + # p* + pthread_spin_destroy; pthread_spin_init; pthread_spin_lock; + pthread_spin_trylock; pthread_spin_unlock; + } +} diff --git a/libpthread/pthread/cthreads-compat.c b/libpthread/pthread/cthreads-compat.c new file mode 100644 index 0000000..cbe8170 --- /dev/null +++ b/libpthread/pthread/cthreads-compat.c @@ -0,0 +1,107 @@ +/* Compatibility routines for cthreads. + Copyright (C) 2000, 2002, 2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +typedef void *cthread_t; +typedef void *(*cthread_fn_t) (void *arg); +typedef int cthread_key_t; + +#define CTHREAD_KEY_INVALID (cthread_key_t) -1 + +void +cthread_detach (cthread_t thread) +{ + int err; + + err = pthread_detach ((pthread_t) thread); + assert_perror (err); +} + +cthread_t +cthread_fork (cthread_fn_t func, void *arg) +{ + pthread_t thread; + int err; + + err = pthread_create (&thread, NULL, func, arg); + assert_perror (err); + + return (cthread_t) thread; +} + +int +cthread_keycreate (cthread_key_t *key) +{ + error_t err; + + err = pthread_key_create (key, 0); + if (err) + { + errno = err; + *key = CTHREAD_KEY_INVALID; + err = -1; + } + + return err; +} + +int +cthread_getspecific (cthread_key_t key, void **val) +{ + *val = pthread_getspecific (key); + return 0; +} + +void * +__libc_getspecific (cthread_key_t key) +{ + return pthread_getspecific (key); +} + +int +cthread_setspecific (cthread_key_t key, void *val) +{ + error_t err; + + err = pthread_setspecific (key, (const void *) val); + if (err) + { + errno = err; + err = -1; + } + + return err; +} + +void +__mutex_lock_solid (void *lock) +{ + __pthread_mutex_lock (lock); +} + +void +__mutex_unlock_solid (void *lock) +{ + if (__pthread_spin_trylock (lock) != 0) + /* Somebody already got the lock, that one will manage waking up others */ + return; + __pthread_mutex_unlock (lock); +} diff --git a/libpthread/pthread/pt-alloc.c b/libpthread/pthread/pt-alloc.c new file mode 100644 index 0000000..6af2da9 --- /dev/null +++ b/libpthread/pthread/pt-alloc.c @@ -0,0 +1,215 @@ +/* Allocate a new thread structure. + Copyright (C) 2000, 2002, 2005, 2007, 2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include +#include +#include +#include + +#include + +/* This braindamage is necessary because the standard says that some + of the threads functions "shall fail" if "No thread could be found + corresponding to that specified by the given thread ID." */ + +/* Thread ID lookup table. */ +struct __pthread **__pthread_threads; + +/* The size of the thread ID lookup table. */ +int __pthread_max_threads; + +/* The total number of thread IDs currently in use, or on the list of + available thread IDs. */ +int __pthread_num_threads; + +/* A lock for the table, and the other variables above. */ +pthread_rwlock_t __pthread_threads_lock; + +/* List of thread structures corresponding to free thread IDs. */ +struct __pthread *__pthread_free_threads; +pthread_mutex_t __pthread_free_threads_lock; + +static inline error_t +initialize_pthread (struct __pthread *new, int recycling) +{ + error_t err; + + err = __pthread_init_specific (new); + if (err) + return err; + + new->cancel_state = PTHREAD_CANCEL_ENABLE; + new->cancel_type = PTHREAD_CANCEL_DEFERRED; + new->cancel_pending = 0; + + if (recycling) + /* Since we are recycling PTHREAD, we can assume certains things + about PTHREAD's current state and save some cycles by not + rewriting the memory. */ + return 0; + + new->stack = 0; + + new->state_lock = (pthread_mutex_t) PTHREAD_MUTEX_INITIALIZER; + new->state_cond = (pthread_cond_t) PTHREAD_COND_INITIALIZER; + + new->cancelation_handlers = 0; + + new->next = 0; + new->prevp = 0; + + return 0; +} + + +/* Allocate a new thread structure and its pthread thread ID (but not + a kernel thread). */ +int +__pthread_alloc (struct __pthread **pthread) +{ + error_t err; + + struct __pthread *new; + struct __pthread **threads; + struct __pthread **old_threads; + int max_threads; + int new_max_threads; + + pthread_mutex_lock (&__pthread_free_threads_lock); + for (new = __pthread_free_threads; new; new = new->next) + { + /* There is no need to take NEW->STATE_LOCK: if NEW is on this + list, then it is protected by __PTHREAD_FREE_THREADS_LOCK + except in __pthread_dealloc where after it is added to the + list (with the lock held), it drops the lock and then sets + NEW->STATE and immediately stops using NEW. */ + if (new->state == PTHREAD_TERMINATED) + { + __pthread_dequeue (new); + break; + } + } + pthread_mutex_unlock (&__pthread_free_threads_lock); + + if (new) + { + /* The thread may still be running. Make sure it is stopped. + If this is the case, then the thread is either at the end of + __pthread_dealloc or in __pthread_thread_halt. In both + cases, we are interrupt it. */ + __pthread_thread_halt (new); + + err = initialize_pthread (new, 1); + if (! err) + *pthread = new; + return err; + } + + /* Allocate a new thread structure. */ + new = malloc (sizeof (struct __pthread)); + if (new == NULL) + return ENOMEM; + + err = initialize_pthread (new, 0); + if (err) + { + free (new); + return err; + } + + retry: + pthread_rwlock_wrlock (&__pthread_threads_lock); + + if (__pthread_num_threads < __pthread_max_threads) + { + /* We have a free slot. Use the slot number plus one as the + thread ID for the new thread. */ + new->thread = 1 + __pthread_num_threads++; + __pthread_threads[new->thread - 1] = NULL; + + pthread_rwlock_unlock (&__pthread_threads_lock); + + *pthread = new; + return 0; + } +#ifdef PTHREAD_THREADS_MAX + else if (__pthread_num_threads >= PTHREAD_THREADS_MAX) + { + /* We have reached the limit on the number of threads per process. */ + pthread_rwlock_unlock (&__pthread_threads_lock); + + free (new); + return EAGAIN; + } +#endif + + /* We are going to enlarge the threads table. Save its current + size. We're going to release the lock before doing the necessary + memory allocation, since that's a potentially blocking operation. */ + max_threads = __pthread_max_threads; + + pthread_rwlock_unlock (&__pthread_threads_lock); + + /* Allocate a new lookup table that's twice as large. */ + new_max_threads + = max_threads > 0 ? max_threads * 2 : _POSIX_THREAD_THREADS_MAX; + threads = malloc (new_max_threads * sizeof (struct __pthread *)); + if (threads == NULL) + { + free (new); + return ENOMEM; + } + + pthread_rwlock_wrlock (&__pthread_threads_lock); + + /* Check if nobody else has already enlarged the table. */ + if (max_threads != __pthread_max_threads) + { + /* Yep, they did. */ + pthread_rwlock_unlock (&__pthread_threads_lock); + + /* Free the newly allocated table and try again to allocate a slot. */ + free (threads); + goto retry; + } + + /* Copy over the contents of the old table. */ + memcpy (threads, __pthread_threads, + __pthread_max_threads * sizeof (struct __pthread *)); + + /* Save the location of the old table. We want to deallocate its + storage after we released the lock. */ + old_threads = __pthread_threads; + + /* Replace the table with the new one. */ + __pthread_max_threads = new_max_threads; + __pthread_threads = threads; + + /* And allocate ourselves one of the newly created slots. */ + new->thread = 1 + __pthread_num_threads++; + __pthread_threads[new->thread - 1] = NULL; + + pthread_rwlock_unlock (&__pthread_threads_lock); + + free (old_threads); + + *pthread = new; + return 0; +} diff --git a/libpthread/pthread/pt-cancel.c b/libpthread/pthread/pt-cancel.c new file mode 100644 index 0000000..d19c557 --- /dev/null +++ b/libpthread/pthread/pt-cancel.c @@ -0,0 +1,40 @@ +/* Cancel a thread. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +#include + +int +pthread_cancel (pthread_t t) +{ + int err = 0; + struct __pthread *p; + + p = __pthread_getid (t); + if (! p) + return ESRCH; + + p->cancel_pending = 1; + if (p->cancel_state == PTHREAD_CANCEL_ENABLE + && p->cancel_type == PTHREAD_CANCEL_ASYNCHRONOUS) + err = __pthread_do_cancel (p); + + return err; +} diff --git a/libpthread/pthread/pt-cleanup.c b/libpthread/pthread/pt-cleanup.c new file mode 100644 index 0000000..58865aa --- /dev/null +++ b/libpthread/pthread/pt-cleanup.c @@ -0,0 +1,28 @@ +/* Add a cancelation handler to the stack. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +#include + +struct __pthread_cancelation_handler ** +__pthread_get_cleanup_stack (void) +{ + return &_pthread_self ()->cancelation_handlers; +} diff --git a/libpthread/pthread/pt-create.c b/libpthread/pthread/pt-create.c new file mode 100644 index 0000000..ca6b66c --- /dev/null +++ b/libpthread/pthread/pt-create.c @@ -0,0 +1,217 @@ +/* Thread creation. + Copyright (C) 2000, 2002, 2005, 2007 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include +#include +#include + +#include + +#include + +#ifdef HAVE_USELOCALE +# include +#endif + +/* The total number of pthreads currently active. This is defined + here since it would be really stupid to have a threads-using + program that doesn't call `pthread_create'. */ +__atomic_t __pthread_total; + + +/* The entry-point for new threads. */ +static void +entry_point (void *(*start_routine)(void *), void *arg) +{ +#ifdef HAVE_USELOCALE + /* A fresh thread needs to be bound to the global locale. */ + uselocale (LC_GLOBAL_LOCALE); +#endif + + __pthread_startup (); + + pthread_exit (start_routine (arg)); +} + +/* Create a thread with attributes given by ATTR, executing + START_ROUTINE with argument ARG. */ +int +pthread_create (pthread_t *thread, const pthread_attr_t *attr, + void *(*start_routine)(void *), void *arg) +{ + int err; + struct __pthread *pthread; + + err = __pthread_create_internal (&pthread, attr, start_routine, arg); + if (! err) + *thread = pthread->thread; + + return err; +} + +/* Internal version of pthread_create. See comment in + pt-internal.h. */ +int +__pthread_create_internal (struct __pthread **thread, + const pthread_attr_t *attr, + void *(*start_routine)(void *), void *arg) +{ + int err; + struct __pthread *pthread; + const struct __pthread_attr *setup; + sigset_t sigset; + + /* Allocate a new thread structure. */ + err = __pthread_alloc (&pthread); + if (err) + goto failed; + + /* Use the default attributes if ATTR is NULL. */ + setup = attr ? attr : &__pthread_default_attr; + + /* Initialize the thread state. */ + pthread->state = (setup->detachstate == PTHREAD_CREATE_DETACHED + ? PTHREAD_DETACHED : PTHREAD_JOINABLE); + + /* If the user supplied a stack, it is not our responsibility to + setup a stack guard. */ + if (setup->stackaddr) + pthread->guardsize = 0; + else + pthread->guardsize = (setup->guardsize <= setup->stacksize + ? setup->guardsize : setup->stacksize); + + /* Find a stack. There are several scenarios: if a detached thread + kills itself, it has no way to deallocate its stack, thus it + leaves PTHREAD->stack set to true. We try to reuse it here, + however, if the user supplied a stack, we cannot use the old one. + Right now, we simply deallocate it. */ + if (pthread->stack) + { + if (setup->stackaddr != __pthread_default_attr.stackaddr) + { + __pthread_stack_dealloc (pthread->stackaddr, + pthread->stacksize); + pthread->stackaddr = setup->stackaddr; + pthread->stacksize = setup->stacksize; + } + } + else + { + err = __pthread_stack_alloc (&pthread->stackaddr, + setup->stacksize); + if (err) + goto failed_stack_alloc; + + pthread->stacksize = setup->stacksize; + pthread->stack = 1; + } + + /* Allocate the kernel thread and other required resources. */ + err = __pthread_thread_alloc (pthread); + if (err) + goto failed_thread_alloc; + +#ifdef ENABLE_TLS + pthread->tcb = _dl_allocate_tls (NULL); + if (!pthread->tcb) + goto failed_thread_tls_alloc; + pthread->tcb->tcb = pthread->tcb; +#endif /* ENABLE_TLS */ + + /* And initialize the rest of the machine context. This may include + additional machine- and system-specific initializations that + prove convenient. */ + err = __pthread_setup (pthread, entry_point, start_routine, arg); + if (err) + goto failed_setup; + + /* Initialize the system-specific signal state for the new + thread. */ + err = __pthread_sigstate_init (pthread); + if (err) + goto failed_sigstate; + + /* Set the new thread's signal mask and set the pending signals to + empty. POSIX says: "The signal mask shall be inherited from the + creating thread. The set of signals pending for the new thread + shall be empty." If the currnet thread is not a pthread then we + just inherit the process' sigmask. */ + if (__pthread_num_threads == 1) + err = sigprocmask (0, 0, &sigset); + else + err = __pthread_sigstate (_pthread_self (), 0, 0, &sigset, 0); + assert_perror (err); + + err = __pthread_sigstate (pthread, SIG_SETMASK, &sigset, 0, 1); + assert_perror (err); + + /* Increase the total number of threads. We do this before actually + starting the new thread, since the new thread might immediately + call `pthread_exit' which decreases the number of threads and + calls `exit' if the number of threads reaches zero. Increasing + the number of threads from within the new thread isn't an option + since this thread might return and call `pthread_exit' before the + new thread runs. */ + __atomic_inc (&__pthread_total); + + /* Store a pointer to this thread in the thread ID lookup table. We + could use __thread_setid, however, we only lock for reading as no + other thread should be using this entry (we also assume that the + store is atomic). */ + pthread_rwlock_rdlock (&__pthread_threads_lock); + __pthread_threads[pthread->thread - 1] = pthread; + pthread_rwlock_unlock (&__pthread_threads_lock); + + /* At this point it is possible to guess our pthread ID. We have to + make sure that all functions taking a pthread_t argument can + handle the fact that this thread isn't really running yet. */ + + /* Schedule the new thread. */ + err = __pthread_thread_start (pthread); + if (err) + goto failed_starting; + + /* At this point the new thread is up and running. */ + + *thread = pthread; + + return 0; + + failed_starting: + __pthread_setid (pthread->thread, NULL); + __atomic_dec (&__pthread_total); + failed_sigstate: + __pthread_sigstate_destroy (pthread); + failed_setup: +#ifdef ENABLE_TLS + _dl_deallocate_tls (pthread->tcb, 1); + failed_thread_tls_alloc: +#endif /* ENABLE_TLS */ + __pthread_thread_dealloc (pthread); + __pthread_thread_halt (pthread); + failed_thread_alloc: + __pthread_stack_dealloc (pthread->stackaddr, pthread->stacksize); + pthread->stack = 0; + failed_stack_alloc: + __pthread_dealloc (pthread); + failed: + return err; +} diff --git a/libpthread/pthread/pt-dealloc.c b/libpthread/pthread/pt-dealloc.c new file mode 100644 index 0000000..92fe1fd --- /dev/null +++ b/libpthread/pthread/pt-dealloc.c @@ -0,0 +1,64 @@ +/* Deallocate a thread structure. + Copyright (C) 2000, 2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include +#include + +#include + +/* List of thread structures corresponding to free thread IDs. */ +extern struct __pthread *__pthread_free_threads; +extern pthread_mutex_t __pthread_free_threads_lock; + + +/* Deallocate the thread structure for PTHREAD. */ +void +__pthread_dealloc (struct __pthread *pthread) +{ + assert (pthread->state != PTHREAD_TERMINATED); + + /* Withdraw this thread from the thread ID lookup table. */ + __pthread_setid (pthread->thread, NULL); + + /* Mark the thread as terminated. We broadcast the condition + here to prevent pthread_join from waiting for this thread to + exit where it was never really started. Such a call to + pthread_join is completely bogus, but unfortunately allowed + by the standards. */ + __pthread_mutex_lock (&pthread->state_lock); + if (pthread->state != PTHREAD_EXITED) + pthread_cond_broadcast (&pthread->state_cond); + __pthread_mutex_unlock (&pthread->state_lock); + + /* We do not actually deallocate the thread structure, but add it to + a list of re-usable thread structures. */ + pthread_mutex_lock (&__pthread_free_threads_lock); + __pthread_enqueue (&__pthread_free_threads, pthread); + pthread_mutex_unlock (&__pthread_free_threads_lock); + + /* Setting PTHREAD->STATE to PTHREAD_TERMINATED makes this TCB + available for reuse. After that point, we can no longer assume + that PTHREAD is valid. + + Note that it is safe to not lock this update to PTHREAD->STATE: + the only way that it can now be accessed is in __pthread_alloc, + which reads this variable. */ + pthread->state = PTHREAD_TERMINATED; +} diff --git a/libpthread/pthread/pt-detach.c b/libpthread/pthread/pt-detach.c new file mode 100644 index 0000000..1e42c45 --- /dev/null +++ b/libpthread/pthread/pt-detach.c @@ -0,0 +1,92 @@ +/* Detach a thread. + Copyright (C) 2000, 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include +#include + +#include + +/* Indicate that the storage for THREAD can be reclaimed when it + terminates. */ +int +pthread_detach (pthread_t thread) +{ + struct __pthread *pthread; + int err = 0; + + /* Lookup the thread structure for THREAD. */ + pthread = __pthread_getid (thread); + if (pthread == NULL) + return ESRCH; + + __pthread_mutex_lock (&pthread->state_lock); + + switch (pthread->state) + { + case PTHREAD_JOINABLE: + /* THREAD still running. Mark it as detached such that its + resources can be reclaimed as soon as the thread exits. */ + pthread->state = PTHREAD_DETACHED; + + /* Broadcast the condition. This will make threads that are + waiting to join THREAD continue with hopefully disastrous + consequences instead of blocking indefinitely. */ + pthread_cond_broadcast (&pthread->state_cond); + __pthread_mutex_unlock (&pthread->state_lock); + break; + + case PTHREAD_EXITED: + /* THREAD has already exited. Make sure that nobody can + reference it anymore, and mark it as terminated. */ + + __pthread_mutex_unlock (&pthread->state_lock); + + /* Make sure the thread is not running before we remove its + stack. (The only possibility is that it is in a call to + __pthread_thread_halt itself, but that is enough to cause a + sigsegv.) */ + __pthread_thread_halt (pthread); + + /* Destroy the stack, the kernel resources and the control + block. */ + assert (pthread->stack); + __pthread_stack_dealloc (pthread->stackaddr, pthread->stacksize); + pthread->stack = 0; + + __pthread_thread_dealloc (pthread); + + __pthread_dealloc (pthread); + break; + + case PTHREAD_TERMINATED: + /* Pretend THREAD wasn't there in the first place. */ + __pthread_mutex_unlock (&pthread->state_lock); + err = ESRCH; + break; + + default: + /* Thou shalt not detach non-joinable threads! */ + __pthread_mutex_unlock (&pthread->state_lock); + err = EINVAL; + break; + } + + return err; +} diff --git a/libpthread/pthread/pt-exit.c b/libpthread/pthread/pt-exit.c new file mode 100644 index 0000000..c47b604 --- /dev/null +++ b/libpthread/pthread/pt-exit.c @@ -0,0 +1,124 @@ +/* Thread termination. + Copyright (C) 2000, 2002, 2005, 2007, 2011 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include +#include +#include + +#include + +#include + + +/* Terminate the current thread and make STATUS available to any + thread that might join it. */ +void +__pthread_exit (void *status) +{ + struct __pthread *self = _pthread_self (); + struct __pthread_cancelation_handler **handlers; + int oldstate; + + /* Run any cancelation handlers. According to POSIX, the + cancellation cleanup handlers should be called with cancellation + disabled. */ + pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, &oldstate); + + for (handlers = __pthread_get_cleanup_stack (); + *handlers; + *handlers = (*handlers)->next) + (*handlers)->handler ((*handlers)->arg); + + pthread_setcancelstate (oldstate, &oldstate); + + /* Destory any thread specific data. */ + __pthread_destroy_specific (self); + + /* Destroy any signal state. */ + __pthread_sigstate_destroy (self); + + /* Decrease the number of threads. We use an atomic operation to + make sure that only the last thread calls `exit'. */ + if (__atomic_dec_and_test (&__pthread_total)) + /* We are the last thread. */ + exit (0); + + /* Note that after this point the process can be terminated at any + point if another thread calls `pthread_exit' and happens to be + the last thread. */ + + __pthread_mutex_lock (&self->state_lock); + + if (self->cancel_state == PTHREAD_CANCEL_ENABLE && self->cancel_pending) + status = PTHREAD_CANCELED; + +#ifdef ENABLE_TLS + if (self->tcb) + _dl_deallocate_tls (self->tcb, 1); +#endif /* ENABLE_TLS */ + + switch (self->state) + { + default: + assert (! "Consistency error: unexpected self->state"); + abort (); + break; + + case PTHREAD_DETACHED: + /* Make sure that nobody can reference this thread anymore, and + mark it as terminated. Our thread ID will immediately become + available for re-use. For obvious reasons, we cannot + deallocate our own stack. However, it will eventually be + reused when this thread structure is recycled. */ + __pthread_mutex_unlock (&self->state_lock); + + __pthread_dealloc (self); + + break; + + case PTHREAD_JOINABLE: + /* We need to stay around for a while since another thread + might want to join us. */ + self->state = PTHREAD_EXITED; + + /* We need to remember the exit status. A thread joining us + might ask for it. */ + self->status = status; + + /* Broadcast the condition. This will wake up threads that are + waiting to join us. */ + pthread_cond_broadcast (&self->state_cond); + __pthread_mutex_unlock (&self->state_lock); + + break; + } + + /* Note that after this point the resources used by this thread can + be freed at any moment if another thread joins or detaches us. + This means that before freeing any resources, such a thread + should make sure that this thread is really halted. */ + + __pthread_thread_halt (self); + + /* NOTREACHED */ + abort (); +} + +strong_alias (__pthread_exit, pthread_exit); diff --git a/libpthread/pthread/pt-getattr.c b/libpthread/pthread/pt-getattr.c new file mode 100644 index 0000000..24599c6 --- /dev/null +++ b/libpthread/pthread/pt-getattr.c @@ -0,0 +1,49 @@ +/* Thread attributes retrieval. + Copyright (C) 2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include +#include + +#include + +/* Initialize thread attribute *ATTR with attributes corresponding to the + already running thread THREAD. It shall be called on an uninitialized ATTR + and destroyed with pthread_attr_destroy when no longer needed. */ +int +pthread_getattr_np (pthread_t thread, pthread_attr_t *attr) +{ + struct __pthread *pthread; + + pthread = __pthread_getid(thread); + if (pthread == NULL) + return ESRCH; + + /* Some attributes (schedparam, inheritsched, contentionscope and schedpolicy) + are not supported yet, so fill them with our default values. */ + *attr = __pthread_default_attr; + + attr->stackaddr = pthread->stackaddr; + attr->stacksize = pthread->stacksize; + attr->guardsize = pthread->guardsize; + attr->detachstate = (pthread->state == PTHREAD_DETACHED + ? PTHREAD_CREATE_DETACHED : PTHREAD_CREATE_JOINABLE); + + return 0; +} diff --git a/libpthread/pthread/pt-initialize.c b/libpthread/pthread/pt-initialize.c new file mode 100644 index 0000000..831a63d --- /dev/null +++ b/libpthread/pthread/pt-initialize.c @@ -0,0 +1,78 @@ +/* Initialize pthreads library. + Copyright (C) 2000,02 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +#include +#include + +#include +#include + +DEFINE_HOOK (__pthread_init, (void)); + +#ifdef IS_IN_libpthread +static const struct pthread_functions pthread_functions = + { + .ptr_pthread_attr_destroy = __pthread_attr_destroy, + .ptr_pthread_attr_init = __pthread_attr_init, + .ptr_pthread_attr_getdetachstate = __pthread_attr_getdetachstate, + .ptr_pthread_attr_setdetachstate = __pthread_attr_setdetachstate, + .ptr_pthread_attr_getinheritsched = __pthread_attr_getinheritsched, + .ptr_pthread_attr_setinheritsched = __pthread_attr_setinheritsched, + .ptr_pthread_attr_getschedparam = __pthread_attr_getschedparam, + .ptr_pthread_attr_setschedparam = __pthread_attr_setschedparam, + .ptr_pthread_attr_getschedpolicy = __pthread_attr_getschedpolicy, + .ptr_pthread_attr_setschedpolicy = __pthread_attr_setschedpolicy, + .ptr_pthread_attr_getscope = __pthread_attr_getscope, + .ptr_pthread_attr_setscope = __pthread_attr_setscope, + .ptr_pthread_condattr_destroy = __pthread_condattr_destroy, + .ptr_pthread_condattr_init = __pthread_condattr_init, + .ptr_pthread_cond_broadcast = __pthread_cond_broadcast, + .ptr_pthread_cond_destroy = __pthread_cond_destroy, + .ptr_pthread_cond_init = __pthread_cond_init, + .ptr_pthread_cond_signal = __pthread_cond_signal, + .ptr_pthread_cond_wait = __pthread_cond_wait, + .ptr_pthread_cond_timedwait = __pthread_cond_timedwait, + .ptr_pthread_equal = __pthread_equal, + .ptr_pthread_exit = __pthread_exit, + .ptr_pthread_getschedparam = __pthread_getschedparam, + .ptr_pthread_setschedparam = __pthread_setschedparam, + .ptr_pthread_mutex_destroy = _pthread_mutex_destroy, + .ptr_pthread_mutex_init = _pthread_mutex_init, + .ptr_pthread_mutex_lock = __pthread_mutex_lock, + .ptr_pthread_mutex_trylock = __pthread_mutex_trylock, + .ptr_pthread_mutex_unlock = __pthread_mutex_unlock, + .ptr_pthread_self = __pthread_self, + .ptr_pthread_setcancelstate = __pthread_setcancelstate, + .ptr_pthread_setcanceltype = __pthread_setcanceltype, + .ptr___pthread_get_cleanup_stack = __pthread_get_cleanup_stack, + }; +#endif /* IS_IN_libpthread */ + +/* Initialize the pthreads library. */ +void +__pthread_init (void) +{ +#ifdef IS_IN_libpthread + __libc_pthread_init(&pthread_functions); +#endif + RUN_HOOK (__pthread_init, ()); +} diff --git a/libpthread/pthread/pt-internal.h b/libpthread/pthread/pt-internal.h new file mode 100644 index 0000000..823d62b --- /dev/null +++ b/libpthread/pthread/pt-internal.h @@ -0,0 +1,321 @@ +/* Internal defenitions for pthreads library. + Copyright (C) 2000, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _PT_INTERNAL_H +#define _PT_INTERNAL_H 1 + +#include +#include +#include +#include +#include + +#include + +#include + +#include +#include + +/* Thread state. */ +enum pthread_state +{ + /* The thread is running and joinable. */ + PTHREAD_JOINABLE = 0, + /* The thread is running and detached. */ + PTHREAD_DETACHED, + /* A joinable thread exited and its return code is available. */ + PTHREAD_EXITED, + /* The thread structure is unallocated and available for reuse. */ + PTHREAD_TERMINATED +}; + +#ifndef PTHREAD_KEY_MEMBERS +# define PTHREAD_KEY_MEMBERS +#endif + +#ifndef PTHREAD_SYSDEP_MEMBERS +# define PTHREAD_SYSDEP_MEMBERS +#endif + +#ifndef IS_IN_libpthread +#ifdef ENABLE_TLS +/* Type of the TCB. */ +typedef struct +{ + void *tcb; /* Points to this structure. */ + void *dtv; /* Vector of pointers to TLS data. */ + thread_t self; /* This thread's control port. */ +} tcbhead_t; +#endif /* ENABLE_TLS */ +#endif /* IS_IN_libpthread */ + +/* This structure describes a POSIX thread. */ +struct __pthread +{ + /* Thread ID. */ + pthread_t thread; + + /* Cancellation. */ + int cancel_state; + int cancel_type; + int cancel_pending; + struct __pthread_cancelation_handler *cancelation_handlers; + + /* Thread stack. */ + void *stackaddr; + size_t stacksize; + size_t guardsize; /* Included in STACKSIZE (i.e. total + stack memory is STACKSIZE, not + STACKSIZE + GUARDSIZE). */ + int stack; /* Nonzero if the stack was allocated. */ + + /* Exit status. */ + void *status; + + /* Thread state. */ + enum pthread_state state; + pthread_mutex_t state_lock; /* Locks the state. */ + pthread_cond_t state_cond; /* Signalled when the state changes. */ + + /* Thread context. */ + struct pthread_mcontext mcontext; + + PTHREAD_KEY_MEMBERS + + PTHREAD_SYSDEP_MEMBERS + +#ifdef ENABLE_TLS + tcbhead_t *tcb; +#endif /* ENABLE_TLS */ + + struct __pthread *next, **prevp; +}; + +/* Enqueue an element THREAD on the queue *HEAD. */ +static inline void +__pthread_enqueue (struct __pthread **head, struct __pthread *thread) +{ + assert (thread->prevp == 0); + + thread->next = *head; + thread->prevp = head; + if (*head) + (*head)->prevp = &thread->next; + *head = thread; +} + +/* Dequeue the element THREAD from the queue it is connected to. */ +static inline void +__pthread_dequeue (struct __pthread *thread) +{ + assert (thread); + + if (thread->next) + thread->next->prevp = thread->prevp; + *thread->prevp = thread->next; + thread->prevp = 0; +} + +/* Iterate over QUEUE storing each element in ELEMENT. */ +#define __pthread_queue_iterate(queue, element) \ + for (struct __pthread *__pdi_next = (queue); \ + ((element) = __pdi_next) \ + && ((__pdi_next = __pdi_next->next), \ + 1); \ + ) + +/* Iterate over QUEUE dequeuing each element, storing it in + ELEMENT. */ +#define __pthread_dequeuing_iterate(queue, element) \ + for (struct __pthread *__pdi_next = (queue); \ + ((element) = __pdi_next) \ + && ((__pdi_next = __pdi_next->next), \ + ((element)->prevp = 0), \ + 1); \ + ) + +/* The total number of threads currently active. */ +extern __atomic_t __pthread_total; + +/* The total number of thread IDs currently in use, or on the list of + available thread IDs. */ +extern int __pthread_num_threads; + +/* Concurrency hint. */ +extern int __pthread_concurrency; + +/* Array of __pthread structures and its lock. Indexed by the pthread + id minus one. (Why not just use the pthread id? Because some + brain-dead users of the pthread interface incorrectly assume that 0 + is an invalid pthread id.) */ +extern struct __pthread **__pthread_threads; +extern pthread_rwlock_t __pthread_threads_lock; + +#define __pthread_getid(thread) \ + ({ struct __pthread *__t; \ + pthread_rwlock_rdlock (&__pthread_threads_lock); \ + __t = __pthread_threads[thread - 1]; \ + pthread_rwlock_unlock (&__pthread_threads_lock); \ + __t; }) + +#define __pthread_setid(thread, pthread) \ + pthread_rwlock_wrlock (&__pthread_threads_lock); \ + __pthread_threads[thread - 1] = pthread; \ + pthread_rwlock_unlock (&__pthread_threads_lock); + +/* Similar to pthread_self, but returns the thread descriptor instead + of the thread ID. */ +#ifndef _pthread_self +extern struct __pthread *_pthread_self (void); +#endif + + +/* Initialize the pthreads library. */ +extern void __pthread_init (void); + +/* Internal version of pthread_create. Rather than return the new + tid, we return the whole __pthread structure in *PTHREAD. */ +extern int __pthread_create_internal (struct __pthread **__restrict pthread, + const pthread_attr_t *__restrict attr, + void *(*start_routine)(void *), + void *__restrict arg); + +/* Allocate a new thread structure and a pthread thread ID (but not a + kernel thread or a stack). */ +extern int __pthread_alloc (struct __pthread **thread); + +/* Deallocate the thread structure. This is the dual of + __pthread_alloc (N.B. it does not call __pthread_stack_alloc nor + __pthread_thread_halt). */ +extern void __pthread_dealloc (struct __pthread *thread); + + +/* Allocate a stack of size STACKSIZE. The stack base shall be + returned in *STACKADDR. */ +extern int __pthread_stack_alloc (void **stackaddr, size_t stacksize); + +/* Deallocate the stack STACKADDR of size STACKSIZE. */ +extern void __pthread_stack_dealloc (void *stackaddr, size_t stacksize); + + +/* Setup thread THREAD's context. */ +extern int __pthread_setup (struct __pthread *__restrict thread, + void (*entry_point)(void *(*)(void *), + void *), + void *(*start_routine)(void *), + void *__restrict arg); + + +/* Allocate a kernel thread (and any miscellaneous system dependent + resources) for THREAD; it must not be placed on the run queue. */ +extern int __pthread_thread_alloc (struct __pthread *thread); + +/* Deallocate any kernel resources associated with THREAD. The thread + must not be running (that is, if __pthread_thread_start was called, + __pthread_thread_halt must first be called). This function will + never be called by a thread on itself. In the case that a thread + exits, its thread structure will be cached and cleaned up + later. */ +extern void __pthread_thread_dealloc (struct __pthread *thread); + +/* Start THREAD making it eligible to run. */ +extern int __pthread_thread_start (struct __pthread *thread); + +/* Stop the kernel thread associated with THREAD. This function may + be called by two threads in parallel. In particular, by the thread + itself and another thread trying to join it. This function must be + implemented such that this is safe. */ +extern void __pthread_thread_halt (struct __pthread *thread); + + +/* Called by a thread just before it calls the provided start + routine. */ +extern void __pthread_startup (void); + +/* Block THREAD. */ +extern void __pthread_block (struct __pthread *thread); + +/* Block THREAD until *ABSTIME is reached. */ +extern error_t __pthread_timedblock (struct __pthread *__restrict thread, + const struct timespec *__restrict abstime, + clockid_t clock_id); + +/* Wakeup THREAD. */ +extern void __pthread_wakeup (struct __pthread *thread); + + +/* Perform a cancelation. */ +extern int __pthread_do_cancel (struct __pthread *thread); + + +/* Initialize the thread specific data structures. THREAD must be the + calling thread. */ +extern error_t __pthread_init_specific (struct __pthread *thread); + +/* Call the destructors on all of the thread specific data in THREAD. + THREAD must be the calling thread. */ +extern void __pthread_destroy_specific (struct __pthread *thread); + + +/* Initialize newly create thread *THREAD's signal state data + structures. */ +extern error_t __pthread_sigstate_init (struct __pthread *thread); + +/* Destroy the signal state data structures associcated with thread + *THREAD. */ +extern void __pthread_sigstate_destroy (struct __pthread *thread); + +/* Modify thread *THREAD's signal state. */ +extern error_t __pthread_sigstate (struct __pthread *__restrict thread, int how, + const sigset_t *__restrict set, + sigset_t *__restrict oset, + int clear_pending); + + +/* Default thread attributes. + FIXME Normally const, see sysdeps/mach/hurd/pt-sysdep.c. */ +extern struct __pthread_attr __pthread_default_attr; + +/* Default barrier attributes. */ +extern const struct __pthread_barrierattr __pthread_default_barrierattr; + +/* Default mutex attributes. */ +extern const struct __pthread_mutexattr __pthread_default_mutexattr; + +/* Default rdlock attributes. */ +const struct __pthread_rwlockattr __pthread_default_rwlockattr; + +/* Default condition attributes. */ +const struct __pthread_condattr __pthread_default_condattr; + + +#ifdef ENABLE_TLS + +/* From glibc. */ + +/* Dynamic linker TLS allocation. */ +extern void *_dl_allocate_tls(void *); + +/* Dynamic linker TLS deallocation. */ +extern void _dl_deallocate_tls(void *, int); + +#endif /* ENABLE_TLS */ + +#endif /* pt-internal.h */ diff --git a/libpthread/pthread/pt-join.c b/libpthread/pthread/pt-join.c new file mode 100644 index 0000000..153058b --- /dev/null +++ b/libpthread/pthread/pt-join.c @@ -0,0 +1,88 @@ +/* Wait for thread termination. + Copyright (C) 2000 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include +#include + +#include + +/* Make calling thread wait for termination of thread THREAD. Return + the exit status of the thread in *STATUS. */ +int +pthread_join (pthread_t thread, void **status) +{ + struct __pthread *pthread; + int err = 0; + + /* Lookup the thread structure for THREAD. */ + pthread = __pthread_getid (thread); + if (pthread == NULL) + return ESRCH; + + __pthread_mutex_lock (&pthread->state_lock); + pthread_cleanup_push ((void (*)(void *)) __pthread_mutex_unlock, + &pthread->state_lock); + + while (pthread->state == PTHREAD_JOINABLE) + pthread_cond_wait (&pthread->state_cond, &pthread->state_lock); + + pthread_cleanup_pop (0); + + switch (pthread->state) + { + case PTHREAD_EXITED: + __pthread_mutex_unlock (&pthread->state_lock); + + /* THREAD has already exited. Salvage its exit status. */ + if (status) + *status = pthread->status; + + /* Make sure the thread is not running before we remove its + stack. (The only possibility is that it is in a call to + __pthread_thread_halt itself, but that is enough to cause a + sigsegv.) */ + __pthread_thread_halt (pthread); + + /* Destroy the stack, the kernel resources and the control + block. */ + assert (pthread->stack); + __pthread_stack_dealloc (pthread->stackaddr, pthread->stacksize); + pthread->stack = 0; + + __pthread_thread_dealloc (pthread); + + __pthread_dealloc (pthread); + break; + + case PTHREAD_TERMINATED: + /* Pretend THREAD wasn't there in the first place. */ + __pthread_mutex_unlock (&pthread->state_lock); + err = ESRCH; + break; + + default: + /* Thou shalt not join non-joinable threads! */ + __pthread_mutex_unlock (&pthread->state_lock); + err = EINVAL; + break; + } + + return err; +} diff --git a/libpthread/pthread/pt-self.c b/libpthread/pthread/pt-self.c new file mode 100644 index 0000000..deb57c0 --- /dev/null +++ b/libpthread/pthread/pt-self.c @@ -0,0 +1,34 @@ +/* Get calling thread's ID. + Copyright (C) 2000, 2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +#include + +/* Return the thread ID of the calling thread. */ +pthread_t +__pthread_self (void) +{ + struct __pthread *self = _pthread_self (); + assert (self); + + return self->thread; +} + +strong_alias (__pthread_self, pthread_self); diff --git a/libpthread/pthread/pt-setcancelstate.c b/libpthread/pthread/pt-setcancelstate.c new file mode 100644 index 0000000..38550ee --- /dev/null +++ b/libpthread/pthread/pt-setcancelstate.c @@ -0,0 +1,45 @@ +/* Set the cancel state for the calling thread. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +#include + +int +__pthread_setcancelstate (int state, int *oldstate) +{ + struct __pthread *p = _pthread_self (); + + switch (state) + { + default: + return EINVAL; + case PTHREAD_CANCEL_ENABLE: + case PTHREAD_CANCEL_DISABLE: + break; + } + + if (oldstate) + *oldstate = p->cancel_state; + p->cancel_state = state; + + return 0; +} + +strong_alias (__pthread_setcancelstate, pthread_setcancelstate); diff --git a/libpthread/pthread/pt-setcanceltype.c b/libpthread/pthread/pt-setcanceltype.c new file mode 100644 index 0000000..7226a3a --- /dev/null +++ b/libpthread/pthread/pt-setcanceltype.c @@ -0,0 +1,45 @@ +/* Set the cancel type for the calling thread. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +#include + +int +__pthread_setcanceltype (int type, int *oldtype) +{ + struct __pthread *p = _pthread_self (); + + switch (type) + { + default: + return EINVAL; + case PTHREAD_CANCEL_DEFERRED: + case PTHREAD_CANCEL_ASYNCHRONOUS: + break; + } + + if (oldtype) + *oldtype = p->cancel_type; + p->cancel_type = type; + + return 0; +} + +strong_alias (__pthread_setcanceltype, pthread_setcanceltype); diff --git a/libpthread/pthread/pt-sigmask.c b/libpthread/pthread/pt-sigmask.c new file mode 100644 index 0000000..1b53873 --- /dev/null +++ b/libpthread/pthread/pt-sigmask.c @@ -0,0 +1,33 @@ +/* Get or set a thread's signal mask. + Copyright (C) 2000 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +#include + +int +pthread_sigmask (int how, const sigset_t *set, + sigset_t *oset) +{ + struct __pthread *self = _pthread_self (); + + /* Do not clear SELF's pending signals. */ + return __pthread_sigstate (self, how, set, oset, 0); +} diff --git a/libpthread/pthread/pt-spin-inlines.c b/libpthread/pthread/pt-spin-inlines.c new file mode 100644 index 0000000..cfb21dd --- /dev/null +++ b/libpthread/pthread/pt-spin-inlines.c @@ -0,0 +1,34 @@ +/* Copyright (C) 2000 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* declares some extern inline functions. These + functions are declared additionally here for use when inlining is + not possible. */ + +#define _FORCE_INLINES +#define __PT_SPIN_INLINE /* empty */ + +#include + +/* Weak aliases for the spin lock functions. Note that + pthread_spin_lock is left out deliberately. We already provide an + implementation for it in pt-spin.c. */ +weak_alias (__pthread_spin_destroy, pthread_spin_destroy); +weak_alias (__pthread_spin_init, pthread_spin_init); +weak_alias (__pthread_spin_trylock, pthread_spin_trylock); +weak_alias (__pthread_spin_unlock, pthread_spin_unlock); diff --git a/libpthread/pthread/pt-testcancel.c b/libpthread/pthread/pt-testcancel.c new file mode 100644 index 0000000..01f1ac9 --- /dev/null +++ b/libpthread/pthread/pt-testcancel.c @@ -0,0 +1,31 @@ +/* Add an explicit cancelation point. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +#include + +void +pthread_testcancel (void) +{ + struct __pthread *p = _pthread_self (); + + if (p->cancel_state == PTHREAD_CANCEL_ENABLE && p->cancel_pending) + pthread_exit (PTHREAD_CANCELED); +} diff --git a/libpthread/pthread/pt-yield.c b/libpthread/pthread/pt-yield.c new file mode 100644 index 0000000..27848bb --- /dev/null +++ b/libpthread/pthread/pt-yield.c @@ -0,0 +1,26 @@ +/* Yield the processor to another thread or process. + Copyright (C) 2010 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int pthread_yield(void) +{ + return sched_yield (); +} diff --git a/libpthread/pthread/pthread-functions.h b/libpthread/pthread/pthread-functions.h new file mode 100644 index 0000000..c0ba858 --- /dev/null +++ b/libpthread/pthread/pthread-functions.h @@ -0,0 +1,116 @@ +/* Copyright (C) 2003, 2012 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 2003. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#ifndef _PTHREAD_FUNCTIONS_H +#define _PTHREAD_FUNCTIONS_H 1 + +#include + +int __pthread_attr_destroy (pthread_attr_t *); +int __pthread_attr_init (pthread_attr_t *); +int __pthread_attr_getdetachstate (const pthread_attr_t *, int *); +int __pthread_attr_setdetachstate (pthread_attr_t *, int); +int __pthread_attr_getinheritsched (const pthread_attr_t *, int *); +int __pthread_attr_setinheritsched (pthread_attr_t *, int); +int __pthread_attr_getschedparam (const pthread_attr_t *, + struct sched_param *); +int __pthread_attr_setschedparam (pthread_attr_t *, + const struct sched_param *); +int __pthread_attr_getschedpolicy (const pthread_attr_t *, int *); +int __pthread_attr_setschedpolicy (pthread_attr_t *, int); +int __pthread_attr_getscope (const pthread_attr_t *, int *); +int __pthread_attr_setscope (pthread_attr_t *, int); +int __pthread_condattr_destroy (pthread_condattr_t *); +int __pthread_condattr_init (pthread_condattr_t *); +int __pthread_cond_broadcast (pthread_cond_t *); +int __pthread_cond_destroy (pthread_cond_t *); +int __pthread_cond_init (pthread_cond_t *, + const pthread_condattr_t *); +int __pthread_cond_signal (pthread_cond_t *); +int __pthread_cond_wait (pthread_cond_t *, pthread_mutex_t *); +int __pthread_cond_timedwait (pthread_cond_t *, pthread_mutex_t *, + const struct timespec *); +int __pthread_equal (pthread_t, pthread_t); +void __pthread_exit (void *); +int __pthread_getschedparam (pthread_t, int *, struct sched_param *); +int __pthread_setschedparam (pthread_t, int, + const struct sched_param *); +int _pthread_mutex_destroy (pthread_mutex_t *); +int _pthread_mutex_init (pthread_mutex_t *, + const pthread_mutexattr_t *); +int __pthread_mutex_lock (pthread_mutex_t *); +int __pthread_mutex_trylock (pthread_mutex_t *); +int __pthread_mutex_unlock (pthread_mutex_t *); +pthread_t __pthread_self (void); +int __pthread_setcancelstate (int, int *); +int __pthread_setcanceltype (int, int *); +struct __pthread_cancelation_handler **__pthread_get_cleanup_stack (void); + +/* Data type shared with libc. The libc uses it to pass on calls to + the thread functions. Wine pokes directly into this structure, + so if possible avoid breaking it and append new hooks to the end. */ +struct pthread_functions +{ + int (*ptr_pthread_attr_destroy) (pthread_attr_t *); + int (*ptr_pthread_attr_init) (pthread_attr_t *); + int (*ptr_pthread_attr_getdetachstate) (const pthread_attr_t *, int *); + int (*ptr_pthread_attr_setdetachstate) (pthread_attr_t *, int); + int (*ptr_pthread_attr_getinheritsched) (const pthread_attr_t *, int *); + int (*ptr_pthread_attr_setinheritsched) (pthread_attr_t *, int); + int (*ptr_pthread_attr_getschedparam) (const pthread_attr_t *, + struct sched_param *); + int (*ptr_pthread_attr_setschedparam) (pthread_attr_t *, + const struct sched_param *); + int (*ptr_pthread_attr_getschedpolicy) (const pthread_attr_t *, int *); + int (*ptr_pthread_attr_setschedpolicy) (pthread_attr_t *, int); + int (*ptr_pthread_attr_getscope) (const pthread_attr_t *, int *); + int (*ptr_pthread_attr_setscope) (pthread_attr_t *, int); + int (*ptr_pthread_condattr_destroy) (pthread_condattr_t *); + int (*ptr_pthread_condattr_init) (pthread_condattr_t *); + int (*ptr_pthread_cond_broadcast) (pthread_cond_t *); + int (*ptr_pthread_cond_destroy) (pthread_cond_t *); + int (*ptr_pthread_cond_init) (pthread_cond_t *, + const pthread_condattr_t *); + int (*ptr_pthread_cond_signal) (pthread_cond_t *); + int (*ptr_pthread_cond_wait) (pthread_cond_t *, pthread_mutex_t *); + int (*ptr_pthread_cond_timedwait) (pthread_cond_t *, pthread_mutex_t *, + const struct timespec *); + int (*ptr_pthread_equal) (pthread_t, pthread_t); + void (*ptr_pthread_exit) (void *); + int (*ptr_pthread_getschedparam) (pthread_t, int *, struct sched_param *); + int (*ptr_pthread_setschedparam) (pthread_t, int, + const struct sched_param *); + int (*ptr_pthread_mutex_destroy) (pthread_mutex_t *); + int (*ptr_pthread_mutex_init) (pthread_mutex_t *, + const pthread_mutexattr_t *); + int (*ptr_pthread_mutex_lock) (pthread_mutex_t *); + int (*ptr_pthread_mutex_trylock) (pthread_mutex_t *); + int (*ptr_pthread_mutex_unlock) (pthread_mutex_t *); + pthread_t (*ptr_pthread_self) (void); + int (*ptr_pthread_setcancelstate) (int, int *); + int (*ptr_pthread_setcanceltype) (int, int *); + struct __pthread_cancelation_handler **(*ptr___pthread_get_cleanup_stack) (void); +}; + +/* Variable in libc.so. */ +extern struct pthread_functions __libc_pthread_functions attribute_hidden; + +void __libc_pthread_init (const struct pthread_functions *functions); + +#endif /* pthread-functions.h */ diff --git a/libpthread/shlib-versions b/libpthread/shlib-versions new file mode 100644 index 0000000..b320be0 --- /dev/null +++ b/libpthread/shlib-versions @@ -0,0 +1 @@ +.*-.*-.* libpthread=0.3 diff --git a/libpthread/sysdeps/generic/bits/barrier-attr.h b/libpthread/sysdeps/generic/bits/barrier-attr.h new file mode 100644 index 0000000..a9900b7 --- /dev/null +++ b/libpthread/sysdeps/generic/bits/barrier-attr.h @@ -0,0 +1,32 @@ +/* Thread barrier attribute type. Generic version. + Copyright (C) 2002, 2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _BITS_BARRIER_ATTR_H +#define _BITS_BARRIER_ATTR_H 1 + +enum __pthread_process_shared; + +/* This structure describes the attributes of a POSIX thread barrier. + Note that not all of them are supported on all systems. */ +struct __pthread_barrierattr +{ + enum __pthread_process_shared pshared; +}; + +#endif /* bits/barrier-attr.h */ diff --git a/libpthread/sysdeps/generic/bits/barrier.h b/libpthread/sysdeps/generic/bits/barrier.h new file mode 100644 index 0000000..5e55931 --- /dev/null +++ b/libpthread/sysdeps/generic/bits/barrier.h @@ -0,0 +1,39 @@ +/* Thread barrier attribute type. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _BITS_BARRIER_H +#define _BITS_BARRIER_H 1 + +#include + +/* This structure describes the attributes of a POSIX barrier. */ +struct __pthread_barrier +{ + __pthread_spinlock_t lock; + struct __pthread *queue; /* List of waiters. */ + unsigned pending; /* Number of that still need to wait on + barrier. */ + unsigned count; /* Number of threads that must wait before + barrier is passed. */ + struct __pthread_barrierattr *attr; + void *data; +}; + + +#endif /* bits/barrier.h */ diff --git a/libpthread/sysdeps/generic/bits/cancelation.h b/libpthread/sysdeps/generic/bits/cancelation.h new file mode 100644 index 0000000..46486f5 --- /dev/null +++ b/libpthread/sysdeps/generic/bits/cancelation.h @@ -0,0 +1,51 @@ +/* Cancelation. Generic version. + Copyright (C) 2002, 2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _BITS_CANCELATION_H +#define _BITS_CANCELATION_H 1 + +struct __pthread_cancelation_handler +{ + void (*handler)(void *); + void *arg; + struct __pthread_cancelation_handler *next; +}; + +/* Returns the thread local location of the cleanup handler stack. */ +struct __pthread_cancelation_handler **__pthread_get_cleanup_stack (void); + +#define __pthread_cleanup_push(rt, rtarg) \ + { \ + struct __pthread_cancelation_handler **__handlers \ + = __pthread_get_cleanup_stack (); \ + struct __pthread_cancelation_handler __handler = \ + { \ + (rt), \ + (rtarg), \ + *__handlers \ + }; \ + *__handlers = &__handler; + +#define __pthread_cleanup_pop(execute) \ + if (execute) \ + __handler.handler (__handler.arg); \ + *__handlers = __handler.next; \ + } + +#endif /* _BITS_CANCELATION_H */ diff --git a/libpthread/sysdeps/generic/bits/condition-attr.h b/libpthread/sysdeps/generic/bits/condition-attr.h new file mode 100644 index 0000000..4cd4e8c --- /dev/null +++ b/libpthread/sysdeps/generic/bits/condition-attr.h @@ -0,0 +1,34 @@ +/* Condition attribute type. Generic version. + Copyright (C) 2002, 2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _BITS_CONDITION_ATTR_H +#define _BITS_CONDITION_ATTR_H 1 + +#include + +enum __pthread_process_shared; + +/* User visible part of a condition attribute variable. */ +struct __pthread_condattr + { + enum __pthread_process_shared pshared; + __clockid_t clock; + }; + +#endif /* bits/condition.h */ diff --git a/libpthread/sysdeps/generic/bits/condition.h b/libpthread/sysdeps/generic/bits/condition.h new file mode 100644 index 0000000..bf13ada --- /dev/null +++ b/libpthread/sysdeps/generic/bits/condition.h @@ -0,0 +1,39 @@ +/* Condition type. Generic version. + Copyright (C) 2000, 2005, 2009 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _BITS_CONDITION_H +#define _BITS_CONDITION_H 1 + +#include + +/* User visible part of a condition variable. */ +struct __pthread_cond + { + __pthread_spinlock_t __lock; + struct __pthread *__queue; + struct __pthread_condattr *__attr; + struct __pthread_condimpl *__impl; + void *__data; + }; + +/* Initializer for a condition variable. */ +#define __PTHREAD_COND_INITIALIZER \ + { __PTHREAD_SPIN_LOCK_INITIALIZER, NULL, NULL, NULL, NULL } + +#endif /* bits/condition.h */ diff --git a/libpthread/sysdeps/generic/bits/mutex-attr.h b/libpthread/sysdeps/generic/bits/mutex-attr.h new file mode 100644 index 0000000..8514ebe --- /dev/null +++ b/libpthread/sysdeps/generic/bits/mutex-attr.h @@ -0,0 +1,41 @@ +/* Mutex attribute type. Generic version. + Copyright (C) 2002, 2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _BITS_MUTEX_ATTR_H +#define _BITS_MUTEX_ATTR_H 1 + +enum __pthread_mutex_protocol; +enum __pthread_process_shared; +enum __pthread_mutex_type; + +/* This structure describes the attributes of a POSIX mutex + attribute. */ +struct __pthread_mutexattr +{ + int prioceiling; + enum __pthread_mutex_protocol protocol; + enum __pthread_process_shared pshared; + enum __pthread_mutex_type mutex_type; +}; + +/* Attributes for a recursive mutex. */ +extern const struct __pthread_mutexattr __pthread_errorcheck_mutexattr; +extern const struct __pthread_mutexattr __pthread_recursive_mutexattr; + +#endif /* bits/mutex-attr.h */ diff --git a/libpthread/sysdeps/generic/bits/mutex.h b/libpthread/sysdeps/generic/bits/mutex.h new file mode 100644 index 0000000..c734c39 --- /dev/null +++ b/libpthread/sysdeps/generic/bits/mutex.h @@ -0,0 +1,75 @@ +/* Mutex type. Generic version. + + Copyright (C) 2000, 2002, 2005, 2006, 2007, 2008, 2009 + Free Software Foundation, Inc. + + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _BITS_MUTEX_H + +#ifndef __need_pthread_mutex +# define _BITS_MUTEX_H 1 +#endif + +#ifndef __pthread_mutex_defined +# if defined __need_pthread_mutex || defined _BITS_MUTEX_H +# undef __need_pthread_mutex +# define __pthread_mutex_defined + +# include +# include + +/* User visible part of a mutex. */ +struct __pthread_mutex + { + __pthread_spinlock_t __held; + __pthread_spinlock_t __lock; + /* In cthreads, mutex_init does not initialized thre third + pointer, as such, we cannot rely on its value for anything. */ + char *cthreadscompat1; + struct __pthread *__queue; + struct __pthread_mutexattr *attr; + void *data; + /* Up to this point, we are completely compatible with cthreads + and what libc expects. */ + void *owner; + unsigned locks; + /* If NULL then the default attributes apply. */ + }; + +/* Initializer for a mutex. N.B. this also happens to be compatible + with the cthread mutex initializer. */ +# define __PTHREAD_MUTEX_INITIALIZER \ + { __PTHREAD_SPIN_LOCK_INITIALIZER, __PTHREAD_SPIN_LOCK_INITIALIZER, 0, 0, 0, 0, 0, 0 } + +# define __PTHREAD_ERRORCHECK_MUTEXATTR ((struct __pthread_mutexattr *) ((unsigned long) __PTHREAD_MUTEX_ERRORCHECK + 1)) + +# define __PTHREAD_ERRORCHECK_MUTEX_INITIALIZER \ + { __PTHREAD_SPIN_LOCK_INITIALIZER, __PTHREAD_SPIN_LOCK_INITIALIZER, 0, 0, \ + __PTHREAD_ERRORCHECK_MUTEXATTR, 0, 0, 0 } + +# define __PTHREAD_RECURSIVE_MUTEXATTR ((struct __pthread_mutexattr *) ((unsigned long) __PTHREAD_MUTEX_RECURSIVE + 1)) + +# define __PTHREAD_RECURSIVE_MUTEX_INITIALIZER \ + { __PTHREAD_SPIN_LOCK_INITIALIZER, __PTHREAD_SPIN_LOCK_INITIALIZER, 0, 0, \ + __PTHREAD_RECURSIVE_MUTEXATTR, 0, 0, 0 } + +# endif +#endif /* Not __pthread_mutex_defined. */ + +#endif /* bits/mutex.h */ diff --git a/libpthread/sysdeps/generic/bits/once.h b/libpthread/sysdeps/generic/bits/once.h new file mode 100644 index 0000000..f4985d6 --- /dev/null +++ b/libpthread/sysdeps/generic/bits/once.h @@ -0,0 +1,34 @@ +/* Dynamic package initialization data structures. Generic version. + Copyright (C) 2002, 2009 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _BITS_ONCE_H +#define _BITS_ONCE_H 1 + +#include + +struct __pthread_once +{ + int run; + __pthread_spinlock_t lock; +}; + +#define __PTHREAD_ONCE_INIT \ + { 0, __PTHREAD_SPIN_LOCK_INITIALIZER } + +#endif /* bits/once.h */ diff --git a/libpthread/sysdeps/generic/bits/pthread-np.h b/libpthread/sysdeps/generic/bits/pthread-np.h new file mode 100644 index 0000000..d5ddbb0 --- /dev/null +++ b/libpthread/sysdeps/generic/bits/pthread-np.h @@ -0,0 +1,27 @@ +/* Non-portable functions. Generic version. + Copyright (C) 2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* + * Never include this file directly; use or instead. + */ + +#ifndef _BITS_PTHREAD_NP_H +#define _BITS_PTHREAD_NP_H 1 + +#endif /* bits/pthread-np.h */ diff --git a/libpthread/sysdeps/generic/bits/pthread.h b/libpthread/sysdeps/generic/bits/pthread.h new file mode 100644 index 0000000..80e6b09 --- /dev/null +++ b/libpthread/sysdeps/generic/bits/pthread.h @@ -0,0 +1,38 @@ +/* Pthread data structures. Generic version. + Copyright (C) 2002, 2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _BITS_PTHREAD_H +#define _BITS_PTHREAD_H 1 + +typedef int __pthread_t; + +/* Return true if __T1 and __T2 both name the same thread. Otherwise, + false. */ +extern int +__pthread_equal (__pthread_t __t1, __pthread_t __t2); + +#ifdef __USE_EXTERN_INLINES +__extern_inline int +__pthread_equal (__pthread_t __t1, __pthread_t __t2) +{ + return __t1 == __t2; +} +#endif + +#endif /* bits/pthread.h */ diff --git a/libpthread/sysdeps/generic/bits/pthreadtypes.h b/libpthread/sysdeps/generic/bits/pthreadtypes.h new file mode 100644 index 0000000..70368ff --- /dev/null +++ b/libpthread/sysdeps/generic/bits/pthreadtypes.h @@ -0,0 +1,29 @@ +/* + Copyright (C) 2000 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#if !defined _BITS_TYPES_H && !defined _PTHREAD_H +# error "Never include directly; use instead." +#endif + +#ifndef _BITS_PTHREADTYPES_H +#define _BITS_PTHREADTYPES_H 1 + +#include + +#endif /* bits/pthreadtypes.h */ diff --git a/libpthread/sysdeps/generic/bits/rwlock-attr.h b/libpthread/sysdeps/generic/bits/rwlock-attr.h new file mode 100644 index 0000000..dba99f1 --- /dev/null +++ b/libpthread/sysdeps/generic/bits/rwlock-attr.h @@ -0,0 +1,32 @@ +/* Thread rwlock attribute type. Generic version. + Copyright (C) 2002, 2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _BITS_RWLOCK_ATTR_H +#define _BITS_RWLOCK_ATTR_H 1 + +enum __pthread_process_shared; + +/* This structure describes the attributes of a POSIX thread rwlock. + Note that not all of them are supported on all systems. */ +struct __pthread_rwlockattr +{ + enum __pthread_process_shared pshared; +}; + +#endif /* bits/rwlock-attr.h */ diff --git a/libpthread/sysdeps/generic/bits/rwlock.h b/libpthread/sysdeps/generic/bits/rwlock.h new file mode 100644 index 0000000..af6b1c8 --- /dev/null +++ b/libpthread/sysdeps/generic/bits/rwlock.h @@ -0,0 +1,46 @@ +/* rwlock type. Generic version. + Copyright (C) 2002, 2005, 2006, 2007, 2009 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _BITS_RWLOCK_H +#define _BITS_RWLOCK_H + +#include + +/* User visible part of a rwlock. If __held is not held and readers + is 0, then the lock is unlocked. If __held is held and readers is + 0, then the lock is held by a writer. If __held is held and + readers is greater than 0, then the lock is held by READERS + readers. */ +struct __pthread_rwlock + { + __pthread_spinlock_t __held; + __pthread_spinlock_t __lock; + int readers; + struct __pthread *readerqueue; + struct __pthread *writerqueue; + struct __pthread_rwlockattr *__attr; + void *__data; + }; + +/* Initializer for a rwlock. */ +#define __PTHREAD_RWLOCK_INITIALIZER \ + { __PTHREAD_SPIN_LOCK_INITIALIZER, __PTHREAD_SPIN_LOCK_INITIALIZER, 0, 0, 0, 0, 0 } + + +#endif /* bits/rwlock.h */ diff --git a/libpthread/sysdeps/generic/bits/semaphore.h b/libpthread/sysdeps/generic/bits/semaphore.h new file mode 100644 index 0000000..5e987c1 --- /dev/null +++ b/libpthread/sysdeps/generic/bits/semaphore.h @@ -0,0 +1,43 @@ +/* Semaphore type. Generic version. + Copyright (C) 2005, 2009 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _BITS_SEMAPHORE_H +#define _BITS_SEMAPHORE_H 1 + +#ifndef _SEMAPHORE_H +#error Never include directly. +#endif + +#include + +/* User visible part of a semaphore. */ +struct __semaphore + { + __pthread_spinlock_t __lock; + struct __pthread *__queue; + int __pshared; + int __value; + void *__data; + }; + +/* Initializer for a semaphore. */ +#define __SEMAPHORE_INITIALIZER(pshared, value) \ + { __PTHREAD_SPIN_LOCK_INITIALIZER, NULL, (pshared), (value), NULL } + +#endif /* bits/mutex.h */ diff --git a/libpthread/sysdeps/generic/bits/thread-attr.h b/libpthread/sysdeps/generic/bits/thread-attr.h new file mode 100644 index 0000000..f2e55f2 --- /dev/null +++ b/libpthread/sysdeps/generic/bits/thread-attr.h @@ -0,0 +1,44 @@ +/* Thread attribute type. Generic version. + Copyright (C) 2000, 2002, 2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _BITS_THREAD_ATTR_H +#define _BITS_THREAD_ATTR_H 1 + +#define __need_schedparam +#include + +enum __pthread_detachstate; +enum __pthread_inheritsched; +enum __pthread_contentionscope; + +/* This structure describes the attributes of a POSIX thread. Note + that not all of them are supported on all systems. */ +struct __pthread_attr +{ + struct __sched_param schedparam; + void *stackaddr; + size_t stacksize; + size_t guardsize; + enum __pthread_detachstate detachstate; + enum __pthread_inheritsched inheritsched; + enum __pthread_contentionscope contentionscope; + int schedpolicy; +}; + +#endif /* bits/thread-attr.h */ diff --git a/libpthread/sysdeps/generic/bits/thread-specific.h b/libpthread/sysdeps/generic/bits/thread-specific.h new file mode 100644 index 0000000..b42d99e --- /dev/null +++ b/libpthread/sysdeps/generic/bits/thread-specific.h @@ -0,0 +1,25 @@ +/* Thread specific data. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _BITS_THREAD_SPECIFIC_H +#define _BITS_THREAD_SPECIFIC_H 1 + +typedef int __pthread_key; + +#endif /* bits/thread-specific.h */ diff --git a/libpthread/sysdeps/generic/killpg.c b/libpthread/sysdeps/generic/killpg.c new file mode 100644 index 0000000..7f7ed87 --- /dev/null +++ b/libpthread/sysdeps/generic/killpg.c @@ -0,0 +1,27 @@ +/* killpg.c - Generic killpg implementation. + Copyright (C) 2008 Free Software Foundation, Inc. + Written by Neal H. Walfield . + + This file is part of the GNU Hurd. + + The GNU Hurd is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public License + as published by the Free Software Foundation; either version 3 of + the License, or (at your option) any later version. + + The GNU Hurd is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this program. If not, see + . */ + +#include "sig-internal.h" + +int +killpg (pid_t pid, int sig) +{ + return kill (-pid, sig); +} diff --git a/libpthread/sysdeps/generic/pt-atfork.c b/libpthread/sysdeps/generic/pt-atfork.c new file mode 100644 index 0000000..2ec2141 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-atfork.c @@ -0,0 +1,31 @@ +/* Register fork handlers. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +pthread_atfork (void (*prepare) (void), + void (*parent) (void), + void (*child) (void)) +{ + return ENOSYS; +} + +stub_warning (pthread_atfork) diff --git a/libpthread/sysdeps/generic/pt-attr-destroy.c b/libpthread/sysdeps/generic/pt-attr-destroy.c new file mode 100644 index 0000000..b9bd374 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-attr-destroy.c @@ -0,0 +1,28 @@ +/* pthread_attr_destroy. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +__pthread_attr_destroy (pthread_attr_t *attr) +{ + return 0; +} +strong_alias (__pthread_attr_destroy, pthread_attr_destroy); diff --git a/libpthread/sysdeps/generic/pt-attr-getdetachstate.c b/libpthread/sysdeps/generic/pt-attr-getdetachstate.c new file mode 100644 index 0000000..b50f913 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-attr-getdetachstate.c @@ -0,0 +1,31 @@ +/* pthread_attr_getdetachstate. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +__pthread_attr_getdetachstate (const pthread_attr_t *attr, + int *detachstate) +{ + *detachstate = attr->detachstate; + return 0; +} + +strong_alias (__pthread_attr_getdetachstate, pthread_attr_getdetachstate); diff --git a/libpthread/sysdeps/generic/pt-attr-getguardsize.c b/libpthread/sysdeps/generic/pt-attr-getguardsize.c new file mode 100644 index 0000000..c1d9f13 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-attr-getguardsize.c @@ -0,0 +1,29 @@ +/* pthread_attr_getguardsize. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +pthread_attr_getguardsize (const pthread_attr_t *attr, + size_t *guardsize) +{ + *guardsize = attr->guardsize; + return 0; +} diff --git a/libpthread/sysdeps/generic/pt-attr-getinheritsched.c b/libpthread/sysdeps/generic/pt-attr-getinheritsched.c new file mode 100644 index 0000000..7f1f601 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-attr-getinheritsched.c @@ -0,0 +1,31 @@ +/* pthread_attr_getinheritsched. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +__pthread_attr_getinheritsched (const pthread_attr_t *attr, + int *inheritsched) +{ + *inheritsched = attr->inheritsched; + return 0; +} + +strong_alias (__pthread_attr_getinheritsched, pthread_attr_getinheritsched); diff --git a/libpthread/sysdeps/generic/pt-attr-getschedparam.c b/libpthread/sysdeps/generic/pt-attr-getschedparam.c new file mode 100644 index 0000000..4519b69 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-attr-getschedparam.c @@ -0,0 +1,34 @@ +/* pthread_attr_getschedparam. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include +#include + +#include + +int +__pthread_attr_getschedparam (const pthread_attr_t *attr, + struct sched_param *param) +{ + memcpy (param, &attr->schedparam, sizeof *param); + return 0; +} + +strong_alias (__pthread_attr_getschedparam, pthread_attr_getschedparam); diff --git a/libpthread/sysdeps/generic/pt-attr-getschedpolicy.c b/libpthread/sysdeps/generic/pt-attr-getschedpolicy.c new file mode 100644 index 0000000..0980bdd --- /dev/null +++ b/libpthread/sysdeps/generic/pt-attr-getschedpolicy.c @@ -0,0 +1,31 @@ +/* pthread_attr_getschedpolicy. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +__pthread_attr_getschedpolicy (const pthread_attr_t *attr, + int *policy) +{ + *policy = attr->schedpolicy; + return 0; +} + +strong_alias (__pthread_attr_getschedpolicy, pthread_attr_getschedpolicy); diff --git a/libpthread/sysdeps/generic/pt-attr-getscope.c b/libpthread/sysdeps/generic/pt-attr-getscope.c new file mode 100644 index 0000000..46eb604 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-attr-getscope.c @@ -0,0 +1,31 @@ +/* pthread_attr_getscope. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +__pthread_attr_getscope (const pthread_attr_t *attr, + int *contentionscope) +{ + *contentionscope = attr->contentionscope; + return 0; +} + +strong_alias (__pthread_attr_getscope, pthread_attr_getscope); diff --git a/libpthread/sysdeps/generic/pt-attr-getstack.c b/libpthread/sysdeps/generic/pt-attr-getstack.c new file mode 100644 index 0000000..7beb79f --- /dev/null +++ b/libpthread/sysdeps/generic/pt-attr-getstack.c @@ -0,0 +1,31 @@ +/* pthread_attr_getstack. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +pthread_attr_getstack (const pthread_attr_t *attr, + void **stackaddr, + size_t *stacksize) +{ + pthread_attr_getstackaddr (attr, stackaddr); + pthread_attr_getstacksize (attr, stacksize); + return 0; +} diff --git a/libpthread/sysdeps/generic/pt-attr-getstackaddr.c b/libpthread/sysdeps/generic/pt-attr-getstackaddr.c new file mode 100644 index 0000000..d43eeff --- /dev/null +++ b/libpthread/sysdeps/generic/pt-attr-getstackaddr.c @@ -0,0 +1,29 @@ +/* pthread_attr_getstackaddr. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +pthread_attr_getstackaddr (const pthread_attr_t *attr, + void **stackaddr) +{ + *stackaddr = attr->stackaddr; + return 0; +} diff --git a/libpthread/sysdeps/generic/pt-attr-getstacksize.c b/libpthread/sysdeps/generic/pt-attr-getstacksize.c new file mode 100644 index 0000000..c1bc661 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-attr-getstacksize.c @@ -0,0 +1,29 @@ +/* pthread_attr_getstacksize. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +pthread_attr_getstacksize (const pthread_attr_t *attr, + size_t *stacksize) +{ + *stacksize = attr->stacksize; + return 0; +} diff --git a/libpthread/sysdeps/generic/pt-attr-init.c b/libpthread/sysdeps/generic/pt-attr-init.c new file mode 100644 index 0000000..f9eb361 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-attr-init.c @@ -0,0 +1,29 @@ +/* pthread_attr_init. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +__pthread_attr_init (pthread_attr_t *attr) +{ + *attr = __pthread_default_attr; + return 0; +} +strong_alias (__pthread_attr_init, pthread_attr_init); diff --git a/libpthread/sysdeps/generic/pt-attr-setdetachstate.c b/libpthread/sysdeps/generic/pt-attr-setdetachstate.c new file mode 100644 index 0000000..abd6bbb --- /dev/null +++ b/libpthread/sysdeps/generic/pt-attr-setdetachstate.c @@ -0,0 +1,40 @@ +/* pthread_attr_setdetachstate. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +__pthread_attr_setdetachstate (pthread_attr_t *attr, + int detachstate) +{ + switch (detachstate) + { + case PTHREAD_CREATE_DETACHED: + case PTHREAD_CREATE_JOINABLE: + attr->detachstate = detachstate; + break; + default: + return EINVAL; + } + + return 0; +} + +strong_alias (__pthread_attr_setdetachstate, pthread_attr_setdetachstate); diff --git a/libpthread/sysdeps/generic/pt-attr-setguardsize.c b/libpthread/sysdeps/generic/pt-attr-setguardsize.c new file mode 100644 index 0000000..b2ba0f0 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-attr-setguardsize.c @@ -0,0 +1,29 @@ +/* pthread_attr_setguardsize. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +pthread_attr_setguardsize (pthread_attr_t *attr, + size_t guardsize) +{ + attr->guardsize = guardsize; + return 0; +} diff --git a/libpthread/sysdeps/generic/pt-attr-setinheritsched.c b/libpthread/sysdeps/generic/pt-attr-setinheritsched.c new file mode 100644 index 0000000..9fdbd4e --- /dev/null +++ b/libpthread/sysdeps/generic/pt-attr-setinheritsched.c @@ -0,0 +1,40 @@ +/* pthread_attr_setinheritsched. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +__pthread_attr_setinheritsched (pthread_attr_t *attr, + int inheritsched) +{ + switch (inheritsched) + { + case PTHREAD_INHERIT_SCHED: + case PTHREAD_EXPLICIT_SCHED: + attr->inheritsched = inheritsched; + break; + default: + return EINVAL; + } + + return 0; +} + +strong_alias (__pthread_attr_setinheritsched, pthread_attr_setinheritsched); diff --git a/libpthread/sysdeps/generic/pt-attr-setschedparam.c b/libpthread/sysdeps/generic/pt-attr-setschedparam.c new file mode 100644 index 0000000..2fd1d3a --- /dev/null +++ b/libpthread/sysdeps/generic/pt-attr-setschedparam.c @@ -0,0 +1,40 @@ +/* pthread_attr_getschedparam. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include +#include + +#include + +int +__pthread_attr_setschedparam (pthread_attr_t *attr, + const struct sched_param *param) +{ + if (memcmp (param, &__pthread_default_attr.schedparam, + sizeof *param) == 0) + { + memcpy (&attr->schedparam, param, sizeof *param); + return 0; + } + + return ENOTSUP; +} + +strong_alias (__pthread_attr_setschedparam, pthread_attr_setschedparam); diff --git a/libpthread/sysdeps/generic/pt-attr-setschedpolicy.c b/libpthread/sysdeps/generic/pt-attr-setschedpolicy.c new file mode 100644 index 0000000..04e93c9 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-attr-setschedpolicy.c @@ -0,0 +1,44 @@ +/* pthread_attr_getschedpolicy. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +__pthread_attr_setschedpolicy (pthread_attr_t *attr, + int policy) +{ + switch (policy) + { + case SCHED_OTHER: + attr->schedpolicy = policy; + break; + + case SCHED_FIFO: + case SCHED_RR: + return ENOTSUP; + + default: + return EINVAL; + } + + return 0; +} + +strong_alias (__pthread_attr_setschedpolicy, pthread_attr_setschedpolicy); diff --git a/libpthread/sysdeps/generic/pt-attr-setscope.c b/libpthread/sysdeps/generic/pt-attr-setscope.c new file mode 100644 index 0000000..d86d7b5 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-attr-setscope.c @@ -0,0 +1,43 @@ +/* pthread_attr_setscope. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +__pthread_attr_setscope (pthread_attr_t *attr, + int contentionscope) +{ + if (contentionscope == __pthread_default_attr.contentionscope) + { + attr->contentionscope = contentionscope; + return 0; + } + + switch (contentionscope) + { + case PTHREAD_SCOPE_PROCESS: + case PTHREAD_SCOPE_SYSTEM: + return ENOTSUP; + default: + return EINVAL; + } +} + +strong_alias (__pthread_attr_setscope, pthread_attr_setscope); diff --git a/libpthread/sysdeps/generic/pt-attr-setstack.c b/libpthread/sysdeps/generic/pt-attr-setstack.c new file mode 100644 index 0000000..360d27a --- /dev/null +++ b/libpthread/sysdeps/generic/pt-attr-setstack.c @@ -0,0 +1,51 @@ +/* pthread_attr_setstack. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +#include + +int +pthread_attr_setstack (pthread_attr_t *attr, + void *stackaddr, + size_t stacksize) +{ + int err; + size_t s; + + /* pthread_attr_setstack should always succeed, thus we set the size + first as it is more discriminating. */ + pthread_attr_getstacksize (attr, &s); + + err = pthread_attr_setstacksize (attr, stacksize); + if (err) + return err; + + err = pthread_attr_setstackaddr (attr, stackaddr); + if (err) + { + int e = pthread_attr_setstacksize (attr, s); + assert_perror (e); + + return err; + } + + return 0; +} diff --git a/libpthread/sysdeps/generic/pt-attr-setstackaddr.c b/libpthread/sysdeps/generic/pt-attr-setstackaddr.c new file mode 100644 index 0000000..431f2d0 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-attr-setstackaddr.c @@ -0,0 +1,29 @@ +/* pthread_attr_setstackaddr. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +pthread_attr_setstackaddr (pthread_attr_t *attr, + void *stackaddr) +{ + attr->stackaddr = stackaddr; + return 0; +} diff --git a/libpthread/sysdeps/generic/pt-attr-setstacksize.c b/libpthread/sysdeps/generic/pt-attr-setstacksize.c new file mode 100644 index 0000000..d0e5102 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-attr-setstacksize.c @@ -0,0 +1,41 @@ +/* pthread_attr_setstacksize. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +pthread_attr_setstacksize (pthread_attr_t *attr, + size_t stacksize) +{ + if (stacksize == __pthread_default_attr.stacksize) + { + attr->stacksize = stacksize; + + /* The guard size cannot be larger than the stack itself, as + such, if the new stack size is smaller than the guard size, + we squash the guard size. */ + if (attr->guardsize > attr->stacksize) + attr->guardsize = attr->stacksize; + + return 0; + } + + return ENOTSUP; +} diff --git a/libpthread/sysdeps/generic/pt-attr.c b/libpthread/sysdeps/generic/pt-attr.c new file mode 100644 index 0000000..eb6067a --- /dev/null +++ b/libpthread/sysdeps/generic/pt-attr.c @@ -0,0 +1,42 @@ +/* Default attributes. Generic version. + Copyright (C) 2000,02 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include +#include +#include + +#include + +/* FIXME Normally const, see sysdeps/mach/hurd/pt-sysdep.c. */ +struct __pthread_attr __pthread_default_attr = +{ + schedparam: { sched_priority: 0 }, + stacksize: PTHREAD_STACK_DEFAULT, + stackaddr: NULL, +#ifdef PAGESIZE + guardsize: PAGESIZE, +#else + guardsize: 0, +#endif /* PAGESIZE */ + detachstate: PTHREAD_CREATE_JOINABLE, + inheritsched: PTHREAD_EXPLICIT_SCHED, + contentionscope: PTHREAD_SCOPE_SYSTEM, + schedpolicy: SCHED_OTHER +}; diff --git a/libpthread/sysdeps/generic/pt-barrier-destroy.c b/libpthread/sysdeps/generic/pt-barrier-destroy.c new file mode 100644 index 0000000..01b938b --- /dev/null +++ b/libpthread/sysdeps/generic/pt-barrier-destroy.c @@ -0,0 +1,27 @@ +/* pthread_barrier_destroy. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +pthread_barrier_destroy (pthread_barrier_t *barrier) +{ + return 0; +} diff --git a/libpthread/sysdeps/generic/pt-barrier-init.c b/libpthread/sysdeps/generic/pt-barrier-init.c new file mode 100644 index 0000000..c42b3bb --- /dev/null +++ b/libpthread/sysdeps/generic/pt-barrier-init.c @@ -0,0 +1,53 @@ +/* pthread_barrier_init. Generic version. + Copyright (C) 2002, 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include +#include + +#include + +int +pthread_barrier_init (pthread_barrier_t *barrier, + const pthread_barrierattr_t *attr, + unsigned count) +{ + if (count == 0) + return EINVAL; + + memset (barrier, 0, sizeof *barrier); + + barrier->lock = PTHREAD_SPINLOCK_INITIALIZER; + barrier->pending = count; + barrier->count = count; + + if (! attr + || memcmp (attr, &__pthread_default_barrierattr, sizeof (*attr) == 0)) + /* Use the default attributes. */ + return 0; + + /* Non-default attributes. */ + + barrier->attr = malloc (sizeof *attr); + if (! barrier->attr) + return ENOMEM; + + *barrier->attr = *attr; + return 0; +} diff --git a/libpthread/sysdeps/generic/pt-barrier-wait.c b/libpthread/sysdeps/generic/pt-barrier-wait.c new file mode 100644 index 0000000..f1de250 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-barrier-wait.c @@ -0,0 +1,61 @@ +/* pthread_barrier_wait. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +#include + +int +pthread_barrier_wait (pthread_barrier_t *barrier) +{ + __pthread_spin_lock (&barrier->lock); + if (-- barrier->pending == 0) + { + barrier->pending = barrier->count; + + if (barrier->count > 1) + { + struct __pthread *wakeup; + + wakeup = barrier->queue; + barrier->queue = NULL; + __pthread_spin_unlock (&barrier->lock); + + /* We can safely walk the list of waiting threads without + holding the lock since it is decoupled from the barrier + variable now. */ + __pthread_dequeuing_iterate (wakeup, wakeup) + __pthread_wakeup (wakeup); + } + + return PTHREAD_BARRIER_SERIAL_THREAD; + } + else + { + struct __pthread *self = _pthread_self (); + + /* Add ourselves to the list of waiters. */ + __pthread_enqueue (&barrier->queue, self); + __pthread_spin_unlock (&barrier->lock); + + __pthread_block (self); + return 0; + } +} diff --git a/libpthread/sysdeps/generic/pt-barrier.c b/libpthread/sysdeps/generic/pt-barrier.c new file mode 100644 index 0000000..d772719 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-barrier.c @@ -0,0 +1,26 @@ +/* Default barrier attributes. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +const struct __pthread_barrierattr __pthread_default_barrierattr = +{ + pshared: PTHREAD_PROCESS_PRIVATE +}; diff --git a/libpthread/sysdeps/generic/pt-barrierattr-destroy.c b/libpthread/sysdeps/generic/pt-barrierattr-destroy.c new file mode 100644 index 0000000..eb39634 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-barrierattr-destroy.c @@ -0,0 +1,27 @@ +/* pthread_barrierattr_destroy. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +pthread_barrierattr_destroy (pthread_barrierattr_t *attr) +{ + return 0; +} diff --git a/libpthread/sysdeps/generic/pt-barrierattr-getpshared.c b/libpthread/sysdeps/generic/pt-barrierattr-getpshared.c new file mode 100644 index 0000000..ed2cdd2 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-barrierattr-getpshared.c @@ -0,0 +1,29 @@ +/* pthread_barrierattr_getpshared. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +pthread_barrierattr_getpshared (const pthread_barrierattr_t *attr, + int *pshared) +{ + *pshared = attr->pshared; + return 0; +} diff --git a/libpthread/sysdeps/generic/pt-barrierattr-init.c b/libpthread/sysdeps/generic/pt-barrierattr-init.c new file mode 100644 index 0000000..45f16cc --- /dev/null +++ b/libpthread/sysdeps/generic/pt-barrierattr-init.c @@ -0,0 +1,28 @@ +/* pthread_barrierattr_init. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +pthread_barrierattr_init (pthread_barrierattr_t *attr) +{ + *attr = __pthread_default_barrierattr; + return 0; +} diff --git a/libpthread/sysdeps/generic/pt-barrierattr-setpshared.c b/libpthread/sysdeps/generic/pt-barrierattr-setpshared.c new file mode 100644 index 0000000..84ef2df --- /dev/null +++ b/libpthread/sysdeps/generic/pt-barrierattr-setpshared.c @@ -0,0 +1,39 @@ +/* pthread_barrierattr_setpshared. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +pthread_barrierattr_setpshared (pthread_barrierattr_t *attr, + int pshared) +{ + switch (pshared) + { + case PTHREAD_PROCESS_PRIVATE: + attr->pshared = pshared; + return 0; + + case PTHREAD_PROCESS_SHARED: + return ENOTSUP; + + default: + return EINVAL; + } +} diff --git a/libpthread/sysdeps/generic/pt-cond-brdcast.c b/libpthread/sysdeps/generic/pt-cond-brdcast.c new file mode 100644 index 0000000..999cc2d --- /dev/null +++ b/libpthread/sysdeps/generic/pt-cond-brdcast.c @@ -0,0 +1,44 @@ +/* Broadcast a condition. Generic version. + Copyright (C) 2000, 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +#include + +/* Unblock all threads that are blocked on condition variable COND. */ +int +__pthread_cond_broadcast (pthread_cond_t *cond) +{ + struct __pthread *wakeup; + + __pthread_spin_lock (&cond->__lock); + + wakeup = cond->__queue; + cond->__queue = NULL; + __pthread_spin_unlock (&cond->__lock); + + /* We can safely walk the list of waiting threads without holding + the lock since it is now decoupled from the condition. */ + __pthread_dequeuing_iterate (wakeup, wakeup) + __pthread_wakeup (wakeup); + + return 0; +} + +strong_alias (__pthread_cond_broadcast, pthread_cond_broadcast); diff --git a/libpthread/sysdeps/generic/pt-cond-destroy.c b/libpthread/sysdeps/generic/pt-cond-destroy.c new file mode 100644 index 0000000..d72ea75 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-cond-destroy.c @@ -0,0 +1,29 @@ +/* pthread_cond_destroy. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +__pthread_cond_destroy (pthread_cond_t *cond) +{ + return 0; +} + +strong_alias (__pthread_cond_destroy, pthread_cond_destroy); diff --git a/libpthread/sysdeps/generic/pt-cond-init.c b/libpthread/sysdeps/generic/pt-cond-init.c new file mode 100644 index 0000000..350f2eb --- /dev/null +++ b/libpthread/sysdeps/generic/pt-cond-init.c @@ -0,0 +1,47 @@ +/* pthread_cond_init. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include +#include + +#include + +int +__pthread_cond_init (pthread_cond_t *cond, + const pthread_condattr_t *attr) +{ + *cond = (pthread_cond_t) __PTHREAD_COND_INITIALIZER; + + if (! attr + || memcmp (attr, &__pthread_default_condattr, sizeof (*attr) == 0)) + /* Use the default attributes. */ + return 0; + + /* Non-default attributes. */ + + cond->__attr = malloc (sizeof *attr); + if (! cond->__attr) + return ENOMEM; + + *cond->__attr = *attr; + return 0; +} + +strong_alias (__pthread_cond_init, pthread_cond_init); diff --git a/libpthread/sysdeps/generic/pt-cond-signal.c b/libpthread/sysdeps/generic/pt-cond-signal.c new file mode 100644 index 0000000..d7c91e6 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-cond-signal.c @@ -0,0 +1,56 @@ +/* Signal a condition. Generic version. + Copyright (C) 2000 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +#include + +static int +cond_signal (struct __pthread_cond *cond, int *unblocked) +{ + struct __pthread *wakeup; + + __pthread_spin_lock (&cond->__lock); + wakeup = cond->__queue; + if (wakeup) + __pthread_dequeue (wakeup); + __pthread_spin_unlock (&cond->__lock); + + if (wakeup) + { + /* We found a thread waiting for the condition to be signalled. + Wake it up! */ + __pthread_wakeup (wakeup); + *unblocked = 1; + } + + return 0; +} + +/* Unblock at least one of the threads that are blocked on condition + variable COND. */ +int +__pthread_cond_signal (pthread_cond_t *cond) +{ + int unblocked = 0; + + return cond_signal (cond, &unblocked); +} + +strong_alias (__pthread_cond_signal, pthread_cond_signal); diff --git a/libpthread/sysdeps/generic/pt-cond-timedwait.c b/libpthread/sysdeps/generic/pt-cond-timedwait.c new file mode 100644 index 0000000..56eb1ec --- /dev/null +++ b/libpthread/sysdeps/generic/pt-cond-timedwait.c @@ -0,0 +1,111 @@ +/* Wait on a condition. Generic version. + Copyright (C) 2000, 2002, 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +#include + +extern int __pthread_cond_timedwait_internal (pthread_cond_t *cond, + pthread_mutex_t *mutex, + const struct timespec *abstime); + +int +__pthread_cond_timedwait (pthread_cond_t *cond, + pthread_mutex_t *mutex, + const struct timespec *abstime) +{ + return __pthread_cond_timedwait_internal (cond, mutex, abstime); +} + +strong_alias (__pthread_cond_timedwait, pthread_cond_timedwait); + +/* Block on condition variable COND until ABSTIME. As a GNU + extension, if ABSTIME is NULL, then wait forever. MUTEX should be + held by the calling thread. On return, MUTEX will be held by the + calling thread. */ +int +__pthread_cond_timedwait_internal (pthread_cond_t *cond, + pthread_mutex_t *mutex, + const struct timespec *abstime) +{ + error_t err; + int canceltype; + clockid_t clock_id = __pthread_default_condattr.clock; + + void cleanup (void *arg) + { + struct __pthread *self = _pthread_self (); + + __pthread_spin_lock (&cond->__lock); + if (self->prevp) + __pthread_dequeue (self); + __pthread_spin_unlock (&cond->__lock); + + pthread_setcanceltype (canceltype, &canceltype); + __pthread_mutex_lock (mutex); + } + + if (abstime && (abstime->tv_nsec < 0 || abstime->tv_nsec >= 1000000000)) + return EINVAL; + + struct __pthread *self = _pthread_self (); + + /* Add ourselves to the list of waiters. */ + __pthread_spin_lock (&cond->__lock); + __pthread_enqueue (&cond->__queue, self); + if (cond->__attr) + clock_id = cond->__attr->clock; + __pthread_spin_unlock (&cond->__lock); + + __pthread_mutex_unlock (mutex); + + /* Enter async cancelation mode. If cancelation is disabled, then + this does not change anything which is exactly what we want. */ + pthread_cleanup_push (cleanup, 0); + pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, &canceltype); + + if (abstime) + { + err = __pthread_timedblock (self, abstime, clock_id); + if (err) + /* We timed out. We may need to disconnect ourself from the + waiter queue. + + FIXME: What do we do if we get a wakeup message before we + disconnect ourself? It may remain until the next time we + block. */ + { + assert (err == ETIMEDOUT); + + __pthread_spin_lock (&mutex->__lock); + if (self->prevp) + __pthread_dequeue (self); + __pthread_spin_unlock (&mutex->__lock); + } + } + else + { + err = 0; + __pthread_block (self); + } + + pthread_cleanup_pop (1); + + return err; +} diff --git a/libpthread/sysdeps/generic/pt-cond-wait.c b/libpthread/sysdeps/generic/pt-cond-wait.c new file mode 100644 index 0000000..38a2ae6 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-cond-wait.c @@ -0,0 +1,39 @@ +/* Wait on a condition. Generic version. + Copyright (C) 2000,02 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +#include + +/* Implemented in pt-cond-timedwait.c. */ +extern int __pthread_cond_timedwait_internal (pthread_cond_t *cond, + pthread_mutex_t *mutex, + const struct timespec *abstime); + + +/* Block on condition variable COND. MUTEX should be held by the + calling thread. On return, MUTEX will be held by the calling + thread. */ +int +__pthread_cond_wait (pthread_cond_t *cond, pthread_mutex_t *mutex) +{ + return __pthread_cond_timedwait_internal (cond, mutex, 0); +} + +strong_alias (__pthread_cond_wait, pthread_cond_wait); diff --git a/libpthread/sysdeps/generic/pt-cond.c b/libpthread/sysdeps/generic/pt-cond.c new file mode 100644 index 0000000..033e767 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-cond.c @@ -0,0 +1,29 @@ +/* Default condition attributes. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +#include + +const struct __pthread_condattr __pthread_default_condattr = +{ + pshared: PTHREAD_PROCESS_PRIVATE, + clock: CLOCK_REALTIME +}; diff --git a/libpthread/sysdeps/generic/pt-condattr-destroy.c b/libpthread/sysdeps/generic/pt-condattr-destroy.c new file mode 100644 index 0000000..9fd55b1 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-condattr-destroy.c @@ -0,0 +1,29 @@ +/* pthread_condattr_destroy. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +__pthread_condattr_destroy (pthread_condattr_t *cond) +{ + return 0; +} + +strong_alias (__pthread_condattr_destroy, pthread_condattr_destroy); diff --git a/libpthread/sysdeps/generic/pt-condattr-getclock.c b/libpthread/sysdeps/generic/pt-condattr-getclock.c new file mode 100644 index 0000000..5b9f889 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-condattr-getclock.c @@ -0,0 +1,31 @@ +/* pthread_condattr_getclock. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +#include + +int +pthread_condattr_getclock (const pthread_condattr_t *attr, + clockid_t *clock) +{ + *clock = attr->clock; + return 0; +} diff --git a/libpthread/sysdeps/generic/pt-condattr-getpshared.c b/libpthread/sysdeps/generic/pt-condattr-getpshared.c new file mode 100644 index 0000000..c072a50 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-condattr-getpshared.c @@ -0,0 +1,29 @@ +/* pthread_condattr_getpshared. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +pthread_condattr_getpshared (const pthread_condattr_t *attr, + int *pshared) +{ + *pshared = attr->pshared; + return 0; +} diff --git a/libpthread/sysdeps/generic/pt-condattr-init.c b/libpthread/sysdeps/generic/pt-condattr-init.c new file mode 100644 index 0000000..8570fd1 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-condattr-init.c @@ -0,0 +1,30 @@ +/* pthread_condattr_init. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +__pthread_condattr_init (pthread_condattr_t *attr) +{ + *attr = __pthread_default_condattr; + return 0; +} + +strong_alias (__pthread_condattr_init, pthread_condattr_init); diff --git a/libpthread/sysdeps/generic/pt-condattr-setclock.c b/libpthread/sysdeps/generic/pt-condattr-setclock.c new file mode 100644 index 0000000..984c17e --- /dev/null +++ b/libpthread/sysdeps/generic/pt-condattr-setclock.c @@ -0,0 +1,33 @@ +/* pthread_condattr_setclock. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +pthread_condattr_setclock (pthread_condattr_t *attr, clockid_t clock) +{ + if (__pthread_default_condattr.clock == clock) + { + attr->clock = clock; + return 0; + } + + return EINVAL; +} diff --git a/libpthread/sysdeps/generic/pt-condattr-setpshared.c b/libpthread/sysdeps/generic/pt-condattr-setpshared.c new file mode 100644 index 0000000..b9f0af8 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-condattr-setpshared.c @@ -0,0 +1,39 @@ +/* pthread_condattr_setpshared. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +pthread_condattr_setpshared (pthread_condattr_t *attr, + int pshared) +{ + switch (pshared) + { + case PTHREAD_PROCESS_PRIVATE: + attr->pshared = pshared; + return 0; + + case PTHREAD_PROCESS_SHARED: + return ENOTSUP; + + default: + return EINVAL; + } +} diff --git a/libpthread/sysdeps/generic/pt-destroy-specific.c b/libpthread/sysdeps/generic/pt-destroy-specific.c new file mode 100644 index 0000000..b627f87 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-destroy-specific.c @@ -0,0 +1,28 @@ +/* __pthread_destory_specific. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +void +__pthread_destory_specifc (struct __pthread *thread) +{ + /* Not support, thus there cannot be any. */ + return; +} diff --git a/libpthread/sysdeps/generic/pt-equal.c b/libpthread/sysdeps/generic/pt-equal.c new file mode 100644 index 0000000..72fc7e6 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-equal.c @@ -0,0 +1,31 @@ +/* Default attributes. Generic version. + Copyright (C) 2000,02 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +/* Return true if __T1 and __T2 both name the same thread. Otherwise, + false. */ +int +__pthread_equal (pthread_t __t1, pthread_t __t2) +{ + return __t1 == __t2; +} + +strong_alias (__pthread_equal, pthread_equal); diff --git a/libpthread/sysdeps/generic/pt-getconcurrency.c b/libpthread/sysdeps/generic/pt-getconcurrency.c new file mode 100644 index 0000000..b55c8ee --- /dev/null +++ b/libpthread/sysdeps/generic/pt-getconcurrency.c @@ -0,0 +1,27 @@ +/* Get the current level of desired concurrency. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +pthread_getconcurrency (void) +{ + return __pthread_concurrency; +} diff --git a/libpthread/sysdeps/generic/pt-getcpuclockid.c b/libpthread/sysdeps/generic/pt-getcpuclockid.c new file mode 100644 index 0000000..03868d3 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-getcpuclockid.c @@ -0,0 +1,35 @@ +/* Return a thread's cpu clockid. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +#include + +int +pthread_getcpuclockid (pthread_t thread, clockid_t *clock) +{ +#ifdef CLOCK_THREAD_CPUTIME_ID + *clock = CLOCK_THREAD_CPUTIME_ID; + return 0; +#else + return ENOSYS; +stub_warning (pthread_getcpuclockid) +#endif +} diff --git a/libpthread/sysdeps/generic/pt-getschedparam.c b/libpthread/sysdeps/generic/pt-getschedparam.c new file mode 100644 index 0000000..00974cf --- /dev/null +++ b/libpthread/sysdeps/generic/pt-getschedparam.c @@ -0,0 +1,31 @@ +/* Get the scheduling parameters for a thread. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +__pthread_getschedparam (pthread_t thread, int *policy, + struct sched_param *param) +{ + return ENOSYS; +} + +strong_alias (__pthread_getschedparam, pthread_getschedparam); +stub_warning (pthread_getschedparam) diff --git a/libpthread/sysdeps/generic/pt-getspecific.c b/libpthread/sysdeps/generic/pt-getspecific.c new file mode 100644 index 0000000..2a7c4a9 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-getspecific.c @@ -0,0 +1,27 @@ +/* pthread_getspecific. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +pthread_getspecific (pthread_key_t key) +{ + return EINVAL; +} diff --git a/libpthread/sysdeps/generic/pt-init-specific.c b/libpthread/sysdeps/generic/pt-init-specific.c new file mode 100644 index 0000000..00744fb --- /dev/null +++ b/libpthread/sysdeps/generic/pt-init-specific.c @@ -0,0 +1,27 @@ +/* __pthread_init_specific. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +error_t +__pthread_init_specific (struct __pthread *thread) +{ + return 0; +} diff --git a/libpthread/sysdeps/generic/pt-key-create.c b/libpthread/sysdeps/generic/pt-key-create.c new file mode 100644 index 0000000..de05095 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-key-create.c @@ -0,0 +1,29 @@ +/* pthread_key_create. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +pthread_key_create (pthread_key_t *key, void (*destructor) (void *)) +{ + return ENOSYS; +} + +stub_warning (pthread_key_create) diff --git a/libpthread/sysdeps/generic/pt-key-delete.c b/libpthread/sysdeps/generic/pt-key-delete.c new file mode 100644 index 0000000..7b4ff63 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-key-delete.c @@ -0,0 +1,29 @@ +/* pthread_key_delete. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +pthread_key_delete (pthread_key_t key) +{ + return ENOSYS; +} + +stub_warning (pthread_key_delete) diff --git a/libpthread/sysdeps/generic/pt-key.h b/libpthread/sysdeps/generic/pt-key.h new file mode 100644 index 0000000..544eb20 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-key.h @@ -0,0 +1,22 @@ +/* pthread_key internal declatations. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +#define PTHREAD_KEY_MEMBERS diff --git a/libpthread/sysdeps/generic/pt-kill.c b/libpthread/sysdeps/generic/pt-kill.c new file mode 100644 index 0000000..0dfac34 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-kill.c @@ -0,0 +1,32 @@ +/* pthread-kill.c - Generic pthread-kill implementation. + Copyright (C) 2008 Free Software Foundation, Inc. + Written by Neal H. Walfield . + + This file is part of the GNU Hurd. + + The GNU Hurd is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public License + as published by the Free Software Foundation; either version 3 of + the License, or (at your option) any later version. + + The GNU Hurd is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this program. If not, see + . */ + +#include "sig-internal.h" + +int +pthread_kill (pthread_t tid, int signo) +{ + siginfo_t si; + memset (&si, 0, sizeof (si)); + si.si_signo = signo; + + return pthread_kill_siginfo_np (tid, si); +} + diff --git a/libpthread/sysdeps/generic/pt-mutex-destroy.c b/libpthread/sysdeps/generic/pt-mutex-destroy.c new file mode 100644 index 0000000..3bbc73f --- /dev/null +++ b/libpthread/sysdeps/generic/pt-mutex-destroy.c @@ -0,0 +1,39 @@ +/* Destroy a mutex. Generic version. + Copyright (C) 2000, 2002, 2006 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include +#include + +#include + +int +_pthread_mutex_destroy (pthread_mutex_t *mutex) +{ + if (mutex->attr == __PTHREAD_ERRORCHECK_MUTEXATTR + || mutex->attr == __PTHREAD_RECURSIVE_MUTEXATTR) + /* Static attributes. */ + ; + else + free (mutex->attr); + + return 0; +} + +strong_alias (_pthread_mutex_destroy, pthread_mutex_destroy); diff --git a/libpthread/sysdeps/generic/pt-mutex-getprioceiling.c b/libpthread/sysdeps/generic/pt-mutex-getprioceiling.c new file mode 100644 index 0000000..ac886a8 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-mutex-getprioceiling.c @@ -0,0 +1,30 @@ +/* Get a mutex' priority ceiling. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +pthread_mutex_getprioceiling (const pthread_mutex_t *mutex, + int *prioceiling) +{ + return ENOSYS; +} + +stub_warning (pthread_mutex_getprioceiling) diff --git a/libpthread/sysdeps/generic/pt-mutex-init.c b/libpthread/sysdeps/generic/pt-mutex-init.c new file mode 100644 index 0000000..2f96028 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-mutex-init.c @@ -0,0 +1,50 @@ +/* Initialize a mutex. Generic version. + Copyright (C) 2000, 2002, 2005, 2006, 2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include +#include +#include + +#include + +int +_pthread_mutex_init (pthread_mutex_t *mutex, + const pthread_mutexattr_t *attr) +{ + *mutex = (pthread_mutex_t) __PTHREAD_MUTEX_INITIALIZER; + + if (! attr + || memcmp (attr, &__pthread_default_mutexattr, sizeof (*attr) == 0)) + /* The default attributes. */ + return 0; + + if (! mutex->attr + || mutex->attr == __PTHREAD_ERRORCHECK_MUTEXATTR + || mutex->attr == __PTHREAD_RECURSIVE_MUTEXATTR) + mutex->attr = malloc (sizeof *attr); + + if (! mutex->attr) + return ENOMEM; + + *mutex->attr = *attr; + return 0; +} + +strong_alias (_pthread_mutex_init, pthread_mutex_init); diff --git a/libpthread/sysdeps/generic/pt-mutex-lock.c b/libpthread/sysdeps/generic/pt-mutex-lock.c new file mode 100644 index 0000000..528e593 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-mutex-lock.c @@ -0,0 +1,37 @@ +/* Lock a mutex. Generic version. + Copyright (C) 2000, 2002, 2006 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +#include + +/* Implemented in pt-mutex-timedlock.c. */ +extern int __pthread_mutex_timedlock_internal (struct __pthread_mutex *mutex, + const struct timespec *abstime); + +/* Lock MUTEX, block if we can't get it. */ +int +__pthread_mutex_lock (struct __pthread_mutex *mutex) +{ + return __pthread_mutex_timedlock_internal (mutex, 0); +} + +strong_alias (__pthread_mutex_lock, _pthread_mutex_lock); +strong_alias (__pthread_mutex_lock, pthread_mutex_lock); diff --git a/libpthread/sysdeps/generic/pt-mutex-setprioceiling.c b/libpthread/sysdeps/generic/pt-mutex-setprioceiling.c new file mode 100644 index 0000000..1358b37 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-mutex-setprioceiling.c @@ -0,0 +1,30 @@ +/* Set a mutex' priority ceiling. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +pthread_mutex_setprioceiling (pthread_mutex_t *mutex, int prio, + int *oldprio) +{ + return ENOSYS; +} + +stub_warning (pthread_mutex_setprioceiling) diff --git a/libpthread/sysdeps/generic/pt-mutex-timedlock.c b/libpthread/sysdeps/generic/pt-mutex-timedlock.c new file mode 100644 index 0000000..48bffaf --- /dev/null +++ b/libpthread/sysdeps/generic/pt-mutex-timedlock.c @@ -0,0 +1,187 @@ +/* Lock a mutex with a timeout. Generic version. + Copyright (C) 2000, 2002, 2005, 2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +#include + +#define LOSE do { * (int *) 0 = 0; } while (1) + +/* Try to lock MUTEX, block until *ABSTIME if it is already held. As + a GNU extension, if TIMESPEC is NULL then wait forever. */ +int +__pthread_mutex_timedlock_internal (struct __pthread_mutex *mutex, + const struct timespec *abstime) +{ + struct __pthread *self; + const struct __pthread_mutexattr *attr = mutex->attr; + + if (attr == __PTHREAD_ERRORCHECK_MUTEXATTR) + attr = &__pthread_errorcheck_mutexattr; + if (attr == __PTHREAD_RECURSIVE_MUTEXATTR) + attr = &__pthread_recursive_mutexattr; + + __pthread_spin_lock (&mutex->__lock); + if (__pthread_spin_trylock (&mutex->__held) == 0) + /* Successfully acquired the lock. */ + { +#ifdef ALWAYS_TRACK_MUTEX_OWNER +#ifndef NDEBUG + self = _pthread_self (); + if (self) + /* The main thread may take a lock before the library is fully + initialized, in particular, before the main thread has a + TCB. */ + { + assert (! mutex->owner); + mutex->owner = _pthread_self (); + } +#endif +#endif + + if (attr) + switch (attr->mutex_type) + { + case PTHREAD_MUTEX_NORMAL: + break; + + case PTHREAD_MUTEX_RECURSIVE: + mutex->locks = 1; + case PTHREAD_MUTEX_ERRORCHECK: + mutex->owner = _pthread_self (); + break; + + default: + LOSE; + } + + __pthread_spin_unlock (&mutex->__lock); + return 0; + } + + /* The lock is busy. */ + + self = _pthread_self (); + assert (self); + + if (! attr || attr->mutex_type == PTHREAD_MUTEX_NORMAL) + { +#if defined(ALWAYS_TRACK_MUTEX_OWNER) + assert (mutex->owner != self); +#endif + } + else + { + switch (attr->mutex_type) + { + case PTHREAD_MUTEX_ERRORCHECK: + if (mutex->owner == self) + { + __pthread_spin_unlock (&mutex->__lock); + return EDEADLK; + } + break; + + case PTHREAD_MUTEX_RECURSIVE: + if (mutex->owner == self) + { + mutex->locks ++; + __pthread_spin_unlock (&mutex->__lock); + return 0; + } + break; + + default: + LOSE; + } + } + +#if !defined(ALWAYS_TRACK_MUTEX_OWNER) + if (attr && attr->mutex_type != PTHREAD_MUTEX_NORMAL) +#endif + assert (mutex->owner); + + if (abstime && (abstime->tv_nsec < 0 || abstime->tv_nsec >= 1000000000)) + return EINVAL; + + /* Add ourselves to the queue. */ + __pthread_enqueue (&mutex->__queue, self); + __pthread_spin_unlock (&mutex->__lock); + + /* Block the thread. */ + if (abstime) + { + error_t err; + + err = __pthread_timedblock (self, abstime, CLOCK_REALTIME); + if (err) + /* We timed out. We may need to disconnect ourself from the + waiter queue. + + FIXME: What do we do if we get a wakeup message before we + disconnect ourself? It may remain until the next time we + block. */ + { + assert (err == ETIMEDOUT); + + __pthread_spin_lock (&mutex->__lock); + if (self->prevp) + __pthread_dequeue (self); + __pthread_spin_unlock (&mutex->__lock); + + return err; + } + } + else + __pthread_block (self); + +#if !defined(ALWAYS_TRACK_MUTEX_OWNER) + if (attr && attr->mutex_type != PTHREAD_MUTEX_NORMAL) +#endif + { + assert (mutex->owner == self); + } + + if (attr) + switch (attr->mutex_type) + { + case PTHREAD_MUTEX_NORMAL: + break; + + case PTHREAD_MUTEX_RECURSIVE: + assert (mutex->locks == 0); + mutex->locks = 1; + case PTHREAD_MUTEX_ERRORCHECK: + mutex->owner = self; + break; + + default: + LOSE; + } + + return 0; +} + +int +pthread_mutex_timedlock (struct __pthread_mutex *mutex, + const struct timespec *abstime) +{ + return __pthread_mutex_timedlock_internal (mutex, abstime); +} diff --git a/libpthread/sysdeps/generic/pt-mutex-transfer-np.c b/libpthread/sysdeps/generic/pt-mutex-transfer-np.c new file mode 100644 index 0000000..967f1c7 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-mutex-transfer-np.c @@ -0,0 +1,66 @@ +/* Transfer ownership of a mutex. Generic version. + Copyright (C) 2008 Free Software Foundation, Inc. + Written by Neal H. Walfield . + + This file is part of the GNU Hurd. + + The GNU Hurd is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public License + as published by the Free Software Foundation; either version 3 of + the License, or (at your option) any later version. + + The GNU Hurd is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this program. If not, see + . */ + +#include +#include + +#include + +int +__pthread_mutex_transfer_np (struct __pthread_mutex *mutex, pthread_t tid) +{ + assert (mutex->owner == _pthread_self ()); + + struct __pthread *thread = __pthread_getid (tid); + const struct __pthread_mutexattr *attr = mutex->attr; + + if (! thread) + return ESRCH; + + if (thread == _pthread_self ()) + return 0; + + if (attr == __PTHREAD_ERRORCHECK_MUTEXATTR) + attr = &__pthread_errorcheck_mutexattr; + if (attr == __PTHREAD_RECURSIVE_MUTEXATTR) + attr = &__pthread_recursive_mutexattr; + + if (attr && attr->mutex_type == PTHREAD_MUTEX_ERRORCHECK) + { + + if (mutex->owner != _pthread_self ()) + return EPERM; + + mutex->owner = thread; + } + +#ifndef NDEBUG +# if !defined(ALWAYS_TRACK_MUTEX_OWNER) + if (attr && attr->mutex_type != PTHREAD_MUTEX_NORMAL) +# endif + { + mutex->owner = thread; + } +#endif + + return 0; +} + +strong_alias (__pthread_mutex_transfer_np, pthread_mutex_transfer_np) diff --git a/libpthread/sysdeps/generic/pt-mutex-trylock.c b/libpthread/sysdeps/generic/pt-mutex-trylock.c new file mode 100644 index 0000000..7a54cc9 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-mutex-trylock.c @@ -0,0 +1,112 @@ +/* Try to Lock a mutex. Generic version. + Copyright (C) 2002, 2005, 2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +#include + +#define LOSE do { * (int *) 0 = 0; } while (1) + +/* Lock MUTEX, return EBUSY if we can't get it. */ +int +__pthread_mutex_trylock (struct __pthread_mutex *mutex) +{ + int err; + struct __pthread *self; + const struct __pthread_mutexattr *attr = mutex->attr; + + if (attr == __PTHREAD_ERRORCHECK_MUTEXATTR) + attr = &__pthread_errorcheck_mutexattr; + if (attr == __PTHREAD_RECURSIVE_MUTEXATTR) + attr = &__pthread_recursive_mutexattr; + + __pthread_spin_lock (&mutex->__lock); + if (__pthread_spin_trylock (&mutex->__held) == 0) + /* Acquired the lock. */ + { +#if defined(ALWAYS_TRACK_MUTEX_OWNER) +#ifndef NDEBUG + self = _pthread_self (); + if (self) + /* The main thread may take a lock before the library is fully + initialized, in particular, before the main thread has a + TCB. */ + { + assert (! mutex->owner); + mutex->owner = _pthread_self (); + } +#endif +#endif + + if (attr) + switch (attr->mutex_type) + { + case PTHREAD_MUTEX_NORMAL: + break; + + case PTHREAD_MUTEX_RECURSIVE: + mutex->locks = 1; + case PTHREAD_MUTEX_ERRORCHECK: + mutex->owner = _pthread_self (); + break; + + default: + LOSE; + } + + __pthread_spin_unlock (&mutex->__lock); + return 0; + } + + err = EBUSY; + + if (attr) + { + self = _pthread_self (); + switch (attr->mutex_type) + { + case PTHREAD_MUTEX_NORMAL: + break; + + case PTHREAD_MUTEX_ERRORCHECK: + /* We could check if MUTEX->OWNER is SELF, however, POSIX + does not permit pthread_mutex_trylock to return EDEADLK + instead of EBUSY, only pthread_mutex_lock. */ + break; + + case PTHREAD_MUTEX_RECURSIVE: + if (mutex->owner == self) + { + mutex->locks ++; + err = 0; + } + break; + + default: + LOSE; + } + } + + __pthread_spin_unlock (&mutex->__lock); + + return err; +} + +strong_alias (__pthread_mutex_trylock, _pthread_mutex_trylock); +strong_alias (__pthread_mutex_trylock, pthread_mutex_trylock); diff --git a/libpthread/sysdeps/generic/pt-mutex-unlock.c b/libpthread/sysdeps/generic/pt-mutex-unlock.c new file mode 100644 index 0000000..09d70f8 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-mutex-unlock.c @@ -0,0 +1,108 @@ +/* Unlock a mutex. Generic version. + Copyright (C) 2000, 2002, 2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +#include + +#define LOSE do { * (int *) 0 = 0; } while (1) + +/* Unlock MUTEX, rescheduling a waiting thread. */ +int +__pthread_mutex_unlock (pthread_mutex_t *mutex) +{ + struct __pthread *wakeup; + const struct __pthread_mutexattr *attr = mutex->attr; + + if (attr == __PTHREAD_ERRORCHECK_MUTEXATTR) + attr = &__pthread_errorcheck_mutexattr; + if (attr == __PTHREAD_RECURSIVE_MUTEXATTR) + attr = &__pthread_recursive_mutexattr; + + __pthread_spin_lock (&mutex->__lock); + + if (! attr || attr->mutex_type == PTHREAD_MUTEX_NORMAL) + { +#if defined(ALWAYS_TRACK_MUTEX_OWNER) +# ifndef NDEBUG + if (_pthread_self ()) + { + assert (mutex->owner); + assert (mutex->owner == _pthread_self ()); + mutex->owner = NULL; + } +# endif +#endif + } + else + switch (attr->mutex_type) + { + case PTHREAD_MUTEX_ERRORCHECK: + case PTHREAD_MUTEX_RECURSIVE: + if (mutex->owner != _pthread_self ()) + { + __pthread_spin_unlock (&mutex->__lock); + return EPERM; + } + + if (attr->mutex_type == PTHREAD_MUTEX_RECURSIVE) + if (--mutex->locks > 0) + { + __pthread_spin_unlock (&mutex->__lock); + return 0; + } + + mutex->owner = 0; + break; + + default: + LOSE; + } + + + if (mutex->__queue == NULL) + { + __pthread_spin_unlock (&mutex->__held); + __pthread_spin_unlock (&mutex->__lock); + return 0; + } + + wakeup = mutex->__queue; + __pthread_dequeue (wakeup); + +#ifndef NDEBUG +# if !defined (ALWAYS_TRACK_MUTEX_OWNER) + if (attr && attr->mutex_type != PTHREAD_MUTEX_NORMAL) +# endif + { + mutex->owner = wakeup; + } +#endif + + /* We do not unlock MUTEX->held: we are transferring the ownership + to the thread that we are waking up. */ + + __pthread_spin_unlock (&mutex->__lock); + __pthread_wakeup (wakeup); + + return 0; +} + +strong_alias (__pthread_mutex_unlock, _pthread_mutex_unlock); +strong_alias (__pthread_mutex_unlock, pthread_mutex_unlock); diff --git a/libpthread/sysdeps/generic/pt-mutexattr-destroy.c b/libpthread/sysdeps/generic/pt-mutexattr-destroy.c new file mode 100644 index 0000000..fe7e95d --- /dev/null +++ b/libpthread/sysdeps/generic/pt-mutexattr-destroy.c @@ -0,0 +1,27 @@ +/* pthread_mutexattr_destroy. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +pthread_mutexattr_destroy (pthread_mutexattr_t *attr) +{ + return 0; +} diff --git a/libpthread/sysdeps/generic/pt-mutexattr-getprioceiling.c b/libpthread/sysdeps/generic/pt-mutexattr-getprioceiling.c new file mode 100644 index 0000000..4865676 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-mutexattr-getprioceiling.c @@ -0,0 +1,30 @@ +/* pthread_mutexattr_getprioceiling. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +pthread_mutexattr_getprioceiling (const pthread_mutexattr_t *attr, + int *prioceiling) +{ + return ENOSYS; +} + +stub_warning (pthread_mutexattr_getprioceiling) diff --git a/libpthread/sysdeps/generic/pt-mutexattr-getprotocol.c b/libpthread/sysdeps/generic/pt-mutexattr-getprotocol.c new file mode 100644 index 0000000..d75021a --- /dev/null +++ b/libpthread/sysdeps/generic/pt-mutexattr-getprotocol.c @@ -0,0 +1,29 @@ +/* pthread_mutexattr_getprotocol. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +pthread_mutexattr_getprotocol (const pthread_mutexattr_t *attr, + int *protocol) +{ + *protocol = attr->protocol; + return 0; +} diff --git a/libpthread/sysdeps/generic/pt-mutexattr-getpshared.c b/libpthread/sysdeps/generic/pt-mutexattr-getpshared.c new file mode 100644 index 0000000..0dad13b --- /dev/null +++ b/libpthread/sysdeps/generic/pt-mutexattr-getpshared.c @@ -0,0 +1,29 @@ +/* pthread_mutexattr_getpshared. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +pthread_mutexattr_getpshared (const pthread_mutexattr_t *attr, + int *pshared) +{ + *pshared = attr->pshared; + return 0; +} diff --git a/libpthread/sysdeps/generic/pt-mutexattr-gettype.c b/libpthread/sysdeps/generic/pt-mutexattr-gettype.c new file mode 100644 index 0000000..ff2caea --- /dev/null +++ b/libpthread/sysdeps/generic/pt-mutexattr-gettype.c @@ -0,0 +1,28 @@ +/* pthread_mutexattr_gettype. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +pthread_mutexattr_gettype (const pthread_mutexattr_t *attr, int *type) +{ + *type = attr->mutex_type; + return 0; +} diff --git a/libpthread/sysdeps/generic/pt-mutexattr-init.c b/libpthread/sysdeps/generic/pt-mutexattr-init.c new file mode 100644 index 0000000..2f23673 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-mutexattr-init.c @@ -0,0 +1,28 @@ +/* pthread_mutexattr_init. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +pthread_mutexattr_init (pthread_mutexattr_t *attr) +{ + *attr = __pthread_default_mutexattr; + return 0; +} diff --git a/libpthread/sysdeps/generic/pt-mutexattr-setprioceiling.c b/libpthread/sysdeps/generic/pt-mutexattr-setprioceiling.c new file mode 100644 index 0000000..bb8a3d6 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-mutexattr-setprioceiling.c @@ -0,0 +1,30 @@ +/* pthread_mutexattr_setprioceiling. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +pthread_mutexattr_setprioceiling (pthread_mutexattr_t *attr, + int prioceiling) +{ + return ENOSYS; +} + +stub_warning (pthread_mutexattr_setprioceiling) diff --git a/libpthread/sysdeps/generic/pt-mutexattr-setprotocol.c b/libpthread/sysdeps/generic/pt-mutexattr-setprotocol.c new file mode 100644 index 0000000..9a0d1b1 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-mutexattr-setprotocol.c @@ -0,0 +1,42 @@ +/* pthread_mutexattr_setprotocol. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +pthread_mutexattr_setprotocol (pthread_mutexattr_t *attr, + int protocol) +{ + if (protocol == __pthread_default_mutexattr.protocol) + { + attr->protocol = protocol; + return 0; + } + + switch (protocol) + { + case PTHREAD_PRIO_NONE: + case PTHREAD_PRIO_INHERIT: + case PTHREAD_PRIO_PROTECT: + return ENOTSUP; + default: + return EINVAL; + } +} diff --git a/libpthread/sysdeps/generic/pt-mutexattr-setpshared.c b/libpthread/sysdeps/generic/pt-mutexattr-setpshared.c new file mode 100644 index 0000000..bcbc4d9 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-mutexattr-setpshared.c @@ -0,0 +1,39 @@ +/* pthread_mutexattr_setpshared. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +pthread_mutexattr_setpshared (pthread_mutexattr_t *attr, + int pshared) +{ + switch (pshared) + { + case PTHREAD_PROCESS_PRIVATE: + attr->pshared = pshared; + return 0; + + case PTHREAD_PROCESS_SHARED: + return ENOTSUP; + + default: + return EINVAL; + } +} diff --git a/libpthread/sysdeps/generic/pt-mutexattr-settype.c b/libpthread/sysdeps/generic/pt-mutexattr-settype.c new file mode 100644 index 0000000..e7ae213 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-mutexattr-settype.c @@ -0,0 +1,37 @@ +/* pthread_mutexattr_settype. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +pthread_mutexattr_settype (pthread_mutexattr_t *attr, int type) +{ + switch (type) + { + case PTHREAD_MUTEX_NORMAL: + case PTHREAD_MUTEX_ERRORCHECK: + case PTHREAD_MUTEX_RECURSIVE: + attr->mutex_type = type; + return 0; + + default: + return EINVAL; + } +} diff --git a/libpthread/sysdeps/generic/pt-mutexattr.c b/libpthread/sysdeps/generic/pt-mutexattr.c new file mode 100644 index 0000000..5ebde6e --- /dev/null +++ b/libpthread/sysdeps/generic/pt-mutexattr.c @@ -0,0 +1,45 @@ +/* Default mutex attributes. Generic version. + Copyright (C) 2000, 2002, 2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +const struct __pthread_mutexattr __pthread_default_mutexattr = +{ + prioceiling: 0, + protocol: PTHREAD_PRIO_NONE, + pshared: PTHREAD_PROCESS_PRIVATE, + mutex_type: PTHREAD_MUTEX_DEFAULT +}; + +const struct __pthread_mutexattr __pthread_errorcheck_mutexattr = +{ + prioceiling: 0, + protocol: PTHREAD_PRIO_NONE, + pshared: PTHREAD_PROCESS_PRIVATE, + mutex_type: PTHREAD_MUTEX_ERRORCHECK +}; + +const struct __pthread_mutexattr __pthread_recursive_mutexattr = +{ + prioceiling: 0, + protocol: PTHREAD_PRIO_NONE, + pshared: PTHREAD_PROCESS_PRIVATE, + mutex_type: PTHREAD_MUTEX_RECURSIVE +}; diff --git a/libpthread/sysdeps/generic/pt-once.c b/libpthread/sysdeps/generic/pt-once.c new file mode 100644 index 0000000..5be5e48 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-once.c @@ -0,0 +1,43 @@ +/* pthread_once. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +#include + +int +pthread_once (pthread_once_t *once_control, void (*init_routine) (void)) +{ + if (once_control->run == 0) + { + __pthread_spin_lock (&once_control->lock); + + if (once_control->run == 0) + { + init_routine (); + __memory_barrier (); + once_control->run = 1; + } + + __pthread_spin_unlock (&once_control->lock); + } + + return 0; +} diff --git a/libpthread/sysdeps/generic/pt-rwlock-attr.c b/libpthread/sysdeps/generic/pt-rwlock-attr.c new file mode 100644 index 0000000..1587fee --- /dev/null +++ b/libpthread/sysdeps/generic/pt-rwlock-attr.c @@ -0,0 +1,26 @@ +/* Default rwlock attributes. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +const struct __pthread_rwlockattr __pthread_default_rwlockattr = +{ + pshared: PTHREAD_PROCESS_PRIVATE +}; diff --git a/libpthread/sysdeps/generic/pt-rwlock-destroy.c b/libpthread/sysdeps/generic/pt-rwlock-destroy.c new file mode 100644 index 0000000..045eebd --- /dev/null +++ b/libpthread/sysdeps/generic/pt-rwlock-destroy.c @@ -0,0 +1,29 @@ +/* Destroy a rwlock. Generic version. + Copyright (C) 2002, 2006 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +_pthread_rwlock_destroy (pthread_rwlock_t *rwlock) +{ + return 0; +} + +strong_alias (_pthread_rwlock_destroy, pthread_rwlock_destroy); diff --git a/libpthread/sysdeps/generic/pt-rwlock-init.c b/libpthread/sysdeps/generic/pt-rwlock-init.c new file mode 100644 index 0000000..c9ff9b2 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-rwlock-init.c @@ -0,0 +1,45 @@ +/* Initialize a rwlock. Generic version. + Copyright (C) 2002, 2005, 2006 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include +#include + +int +_pthread_rwlock_init (pthread_rwlock_t *rwlock, + const pthread_rwlockattr_t *attr) +{ + *rwlock = (pthread_rwlock_t) __PTHREAD_RWLOCK_INITIALIZER; + + if (! attr + || memcmp (attr, &__pthread_default_rwlockattr, sizeof (*attr) == 0)) + /* Use the default attributes. */ + return 0; + + /* Non-default attributes. */ + + rwlock->__attr = malloc (sizeof *attr); + if (! rwlock->__attr) + return ENOMEM; + + *rwlock->__attr = *attr; + return 0; +} + +strong_alias (_pthread_rwlock_init, pthread_rwlock_init); diff --git a/libpthread/sysdeps/generic/pt-rwlock-rdlock.c b/libpthread/sysdeps/generic/pt-rwlock-rdlock.c new file mode 100644 index 0000000..480cf48 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-rwlock-rdlock.c @@ -0,0 +1,32 @@ +/* Acquire a rwlock for reading. Generic version. + Copyright (C) 2002, 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +/* Implemented in pt-rwlock-timedrdlock.c. */ +extern int __pthread_rwlock_timedrdlock_internal (struct __pthread_rwlock *rwlock, + const struct timespec *abstime); + +/* Acquire RWLOCK for reading, block if we can't get it. */ +int +pthread_rwlock_rdlock (struct __pthread_rwlock *rwlock) +{ + return __pthread_rwlock_timedrdlock_internal (rwlock, 0); +} diff --git a/libpthread/sysdeps/generic/pt-rwlock-timedrdlock.c b/libpthread/sysdeps/generic/pt-rwlock-timedrdlock.c new file mode 100644 index 0000000..a110213 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-rwlock-timedrdlock.c @@ -0,0 +1,113 @@ +/* Acquire a rwlock for reading. Generic version. + Copyright (C) 2002, 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +#include + +/* Acquire the rwlock *RWLOCK for reading blocking until *ABSTIME if + it is already held. As a GNU extension, if TIMESPEC is NULL then + wait forever. */ +int +__pthread_rwlock_timedrdlock_internal (struct __pthread_rwlock *rwlock, + const struct timespec *abstime) +{ + struct __pthread *self; + + __pthread_spin_lock (&rwlock->__lock); + if (__pthread_spin_trylock (&rwlock->__held) == 0) + /* Successfully acquired the lock. */ + { + assert (rwlock->readerqueue == 0); + assert (rwlock->writerqueue == 0); + assert (rwlock->readers == 0); + + rwlock->readers = 1; + __pthread_spin_unlock (&rwlock->__lock); + return 0; + } + else + /* Lock is held, but is held by a reader? */ + if (rwlock->readers > 0) + /* Just add ourself to number of readers. */ + { + assert (rwlock->readerqueue == 0); + rwlock->readers ++; + __pthread_spin_unlock (&rwlock->__lock); + return 0; + } + + /* The lock is busy. */ + + /* Better be blocked by a writer. */ + assert (rwlock->readers == 0); + + if (abstime && (abstime->tv_nsec < 0 || abstime->tv_nsec >= 1000000000)) + return EINVAL; + + self = _pthread_self (); + + /* Add ourself to the queue. */ + __pthread_enqueue (&rwlock->readerqueue, self); + __pthread_spin_unlock (&rwlock->__lock); + + /* Block the thread. */ + if (abstime) + { + error_t err; + + err = __pthread_timedblock (self, abstime, CLOCK_REALTIME); + if (err) + /* We timed out. We may need to disconnect ourself from the + waiter queue. + + FIXME: What do we do if we get a wakeup message before we + disconnect ourself? It may remain until the next time we + block. */ + { + assert (err == ETIMEDOUT); + + __pthread_spin_lock (&rwlock->__lock); + if (self->prevp) + /* Disconnect ourself. */ + __pthread_dequeue (self); + __pthread_spin_unlock (&rwlock->__lock); + + return err; + } + } + else + __pthread_block (self); + + + /* The reader count has already been increment by whoever woke us + up. */ + + assert (rwlock->readers > 0); + + return 0; +} + +int +pthread_rwlock_timedrdlock (struct __pthread_rwlock *rwlock, + const struct timespec *abstime) +{ + return __pthread_rwlock_timedrdlock_internal (rwlock, abstime); +} diff --git a/libpthread/sysdeps/generic/pt-rwlock-timedwrlock.c b/libpthread/sysdeps/generic/pt-rwlock-timedwrlock.c new file mode 100644 index 0000000..a5cc579 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-rwlock-timedwrlock.c @@ -0,0 +1,95 @@ +/* Acquire a rwlock for writing. Generic version. + Copyright (C) 2002, 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +#include + +/* Acquire RWLOCK for writing blocking until *ABSTIME if we cannot get + it. As a special GNU extension, if ABSTIME is NULL then the wait + shall not time out. */ +int +__pthread_rwlock_timedwrlock_internal (struct __pthread_rwlock *rwlock, + const struct timespec *abstime) +{ + struct __pthread *self; + + __pthread_spin_lock (&rwlock->__lock); + if (__pthread_spin_trylock (&rwlock->__held) == 0) + /* Successfully acquired the lock. */ + { + assert (rwlock->readerqueue == 0); + assert (rwlock->writerqueue == 0); + assert (rwlock->readers == 0); + + __pthread_spin_unlock (&rwlock->__lock); + return 0; + } + + /* The lock is busy. */ + + if (abstime && (abstime->tv_nsec < 0 || abstime->tv_nsec >= 1000000000)) + return EINVAL; + + self = _pthread_self (); + + /* Add ourselves to the queue. */ + __pthread_enqueue (&rwlock->writerqueue, self); + __pthread_spin_unlock (&rwlock->__lock); + + /* Block the thread. */ + if (abstime) + { + error_t err; + + err = __pthread_timedblock (self, abstime, CLOCK_REALTIME); + if (err) + /* We timed out. We may need to disconnect ourself from the + waiter queue. + + FIXME: What do we do if we get a wakeup message before we + disconnect ourself? It may remain until the next time we + block. */ + { + assert (err == ETIMEDOUT); + + __pthread_spin_lock (&rwlock->__lock); + if (self->prevp) + /* Disconnect ourself. */ + __pthread_dequeue (self); + __pthread_spin_unlock (&rwlock->__lock); + + return err; + } + } + else + __pthread_block (self); + + assert (rwlock->readers == 0); + + return 0; +} + +int +pthread_rwlock_timedwrlock (struct __pthread_rwlock *rwlock, + const struct timespec *abstime) +{ + return __pthread_rwlock_timedwrlock_internal (rwlock, abstime); +} diff --git a/libpthread/sysdeps/generic/pt-rwlock-tryrdlock.c b/libpthread/sysdeps/generic/pt-rwlock-tryrdlock.c new file mode 100644 index 0000000..2419efb --- /dev/null +++ b/libpthread/sysdeps/generic/pt-rwlock-tryrdlock.c @@ -0,0 +1,56 @@ +/* Try to acquire a rwlock for reading. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +#include + +/* Try to acquire RWLOCK. */ +int +pthread_rwlock_tryrdlock (struct __pthread_rwlock *rwlock) +{ + __pthread_spin_lock (&rwlock->__lock); + if (__pthread_spin_trylock (&rwlock->__held) == 0) + /* Successfully acquired the lock. */ + { + assert (rwlock->readerqueue == 0); + assert (rwlock->writerqueue == 0); + assert (rwlock->readers == 0); + + rwlock->readers = 1; + __pthread_spin_unlock (&rwlock->__lock); + return 0; + } + else + /* Lock is held, but is held by a reader? */ + if (rwlock->readers > 0) + { + assert (rwlock->readerqueue == 0); + rwlock->readers ++; + __pthread_spin_unlock (&rwlock->__lock); + return 0; + } + + /* The lock is busy. */ + + __pthread_spin_unlock (&rwlock->__lock); + + return EBUSY; +} diff --git a/libpthread/sysdeps/generic/pt-rwlock-trywrlock.c b/libpthread/sysdeps/generic/pt-rwlock-trywrlock.c new file mode 100644 index 0000000..6b9c5b5 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-rwlock-trywrlock.c @@ -0,0 +1,46 @@ +/* Try to acquire a rwlock for writing. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +#include + +/* Try to acquire RWLOCK for writing. */ +int +pthread_rwlock_trywrlock (struct __pthread_rwlock *rwlock) +{ + __pthread_spin_lock (&rwlock->__lock); + if (__pthread_spin_trylock (&rwlock->__held) == 0) + /* Successfully acquired the lock. */ + { + assert (rwlock->readerqueue == 0); + assert (rwlock->writerqueue == 0); + assert (rwlock->readers == 0); + + __pthread_spin_unlock (&rwlock->__lock); + return 0; + } + + /* The lock is busy. */ + + __pthread_spin_unlock (&rwlock->__lock); + + return EBUSY; +} diff --git a/libpthread/sysdeps/generic/pt-rwlock-unlock.c b/libpthread/sysdeps/generic/pt-rwlock-unlock.c new file mode 100644 index 0000000..fb23a0b --- /dev/null +++ b/libpthread/sysdeps/generic/pt-rwlock-unlock.c @@ -0,0 +1,90 @@ +/* Unlock a rwlock. Generic version. + Copyright (C) 2000,02 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +#include + +/* Unlock *RWLOCK, rescheduling a waiting writer thread or, if there + are no threads waiting for a write lock, rescheduling the reader + threads. */ +int +pthread_rwlock_unlock (pthread_rwlock_t *rwlock) +{ + struct __pthread *wakeup; + + __pthread_spin_lock (&rwlock->__lock); + + assert (__pthread_spin_trylock (&rwlock->__held) == EBUSY); + + if (rwlock->readers > 1) + /* There are other readers. */ + { + rwlock->readers --; + __pthread_spin_unlock (&rwlock->__lock); + return 0; + } + + if (rwlock->readers == 1) + /* Last reader. */ + rwlock->readers = 0; + + + /* Wake someone else up. Try the writer queue first, then the + reader queue if that is empty. */ + + if (rwlock->writerqueue) + { + wakeup = rwlock->writerqueue; + __pthread_dequeue (wakeup); + + /* We do not unlock RWLOCK->held: we are transferring the ownership + to the thread that we are waking up. */ + + __pthread_spin_unlock (&rwlock->__lock); + __pthread_wakeup (wakeup); + + return 0; + } + + if (rwlock->readerqueue) + { + __pthread_queue_iterate (rwlock->readerqueue, wakeup) + rwlock->readers ++; + + wakeup = rwlock->readerqueue; + rwlock->readerqueue = 0; + + __pthread_spin_unlock (&rwlock->__lock); + + /* We can safely walk the list of waiting threads without holding + the lock since it is now decoupled from the rwlock. */ + __pthread_dequeuing_iterate (wakeup, wakeup) + __pthread_wakeup (wakeup); + + return 0; + } + + + /* Noone is waiting. Just unlock it. */ + + __pthread_spin_unlock (&rwlock->__held); + __pthread_spin_unlock (&rwlock->__lock); + return 0; +} diff --git a/libpthread/sysdeps/generic/pt-rwlock-wrlock.c b/libpthread/sysdeps/generic/pt-rwlock-wrlock.c new file mode 100644 index 0000000..be85b90 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-rwlock-wrlock.c @@ -0,0 +1,34 @@ +/* Acquire a rwlock for writing. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +#include + +/* Implemented in pt-rwlock-timedwrlock.c. */ +extern int __pthread_rwlock_timedwrlock_internal (struct __pthread_rwlock *rwlock, + const struct timespec *abstime); + +/* Acquire RWLOCK for writing. */ +int +pthread_rwlock_wrlock (struct __pthread_rwlock *rwlock) +{ + return __pthread_rwlock_timedwrlock_internal (rwlock, 0); +} diff --git a/libpthread/sysdeps/generic/pt-rwlockattr-destroy.c b/libpthread/sysdeps/generic/pt-rwlockattr-destroy.c new file mode 100644 index 0000000..eabfcbe --- /dev/null +++ b/libpthread/sysdeps/generic/pt-rwlockattr-destroy.c @@ -0,0 +1,27 @@ +/* pthread_rwlockattr_destroy. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +pthread_rwlockattr_destroy (pthread_rwlockattr_t *attr) +{ + return 0; +} diff --git a/libpthread/sysdeps/generic/pt-rwlockattr-getpshared.c b/libpthread/sysdeps/generic/pt-rwlockattr-getpshared.c new file mode 100644 index 0000000..e8752c0 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-rwlockattr-getpshared.c @@ -0,0 +1,29 @@ +/* pthread_rwlockattr_getpshared. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +pthread_rwlockattr_getpshared (const pthread_rwlockattr_t *attr, + int *pshared) +{ + *pshared = attr->pshared; + return 0; +} diff --git a/libpthread/sysdeps/generic/pt-rwlockattr-init.c b/libpthread/sysdeps/generic/pt-rwlockattr-init.c new file mode 100644 index 0000000..34da6bf --- /dev/null +++ b/libpthread/sysdeps/generic/pt-rwlockattr-init.c @@ -0,0 +1,28 @@ +/* pthread_rwlockattr_init. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +pthread_rwlockattr_init (pthread_rwlockattr_t *attr) +{ + *attr = __pthread_default_rwlockattr; + return 0; +} diff --git a/libpthread/sysdeps/generic/pt-rwlockattr-setpshared.c b/libpthread/sysdeps/generic/pt-rwlockattr-setpshared.c new file mode 100644 index 0000000..a861d03 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-rwlockattr-setpshared.c @@ -0,0 +1,39 @@ +/* pthread_rwlockattr_setpshared. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +pthread_rwlockattr_setpshared (pthread_rwlockattr_t *attr, + int pshared) +{ + switch (pshared) + { + case PTHREAD_PROCESS_PRIVATE: + attr->pshared = pshared; + return 0; + + case PTHREAD_PROCESS_SHARED: + return ENOTSUP; + + default: + return EINVAL; + } +} diff --git a/libpthread/sysdeps/generic/pt-setconcurrency.c b/libpthread/sysdeps/generic/pt-setconcurrency.c new file mode 100644 index 0000000..cd55b1b --- /dev/null +++ b/libpthread/sysdeps/generic/pt-setconcurrency.c @@ -0,0 +1,34 @@ +/* Set the desired level of concurrency. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int __pthread_concurrency; + +int +pthread_setconcurrency (int new_level) +{ + if (new_level < 0) + return EINVAL; + + __pthread_concurrency = new_level; + + return 0; +} diff --git a/libpthread/sysdeps/generic/pt-setschedparam.c b/libpthread/sysdeps/generic/pt-setschedparam.c new file mode 100644 index 0000000..29e2a4e --- /dev/null +++ b/libpthread/sysdeps/generic/pt-setschedparam.c @@ -0,0 +1,31 @@ +/* Set the scheduling parameters for a thread. Generic version. + Copyright (C) 2002, 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +__pthread_setschedparam (pthread_t thread, int policy, + const struct sched_param *param) +{ + return ENOSYS; +} + +strong_alias (__pthread_setschedparam, pthread_setschedparam); +stub_warning (pthread_setschedparam) diff --git a/libpthread/sysdeps/generic/pt-setschedprio.c b/libpthread/sysdeps/generic/pt-setschedprio.c new file mode 100644 index 0000000..d79690e --- /dev/null +++ b/libpthread/sysdeps/generic/pt-setschedprio.c @@ -0,0 +1,29 @@ +/* Set the scheduling priority of a thread. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +pthread_setschedprio (pthread_t thread, int prio) +{ + return ENOSYS; +} + +stub_warning (pthread_setschedprio) diff --git a/libpthread/sysdeps/generic/pt-setspecific.c b/libpthread/sysdeps/generic/pt-setspecific.c new file mode 100644 index 0000000..d520c5d --- /dev/null +++ b/libpthread/sysdeps/generic/pt-setspecific.c @@ -0,0 +1,27 @@ +/* pthread_setspecific. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +pthread_setspecific (pthread_key_t key, const void *value) +{ + return EINVAL; +} diff --git a/libpthread/sysdeps/generic/pt-startup.c b/libpthread/sysdeps/generic/pt-startup.c new file mode 100644 index 0000000..c21a181 --- /dev/null +++ b/libpthread/sysdeps/generic/pt-startup.c @@ -0,0 +1,25 @@ +/* Thread initialization. Generic version. + Copyright (C) 2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +void +__pthread_startup (void) +{ +} diff --git a/libpthread/sysdeps/generic/raise.c b/libpthread/sysdeps/generic/raise.c new file mode 100644 index 0000000..410f557 --- /dev/null +++ b/libpthread/sysdeps/generic/raise.c @@ -0,0 +1,41 @@ +/* raise.c - Generic raise implementation. + Copyright (C) 2008 Free Software Foundation, Inc. + Written by Neal H. Walfield . + + This file is part of the GNU Hurd. + + The GNU Hurd is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public License + as published by the Free Software Foundation; either version 3 of + the License, or (at your option) any later version. + + The GNU Hurd is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this program. If not, see + . */ + +#include "sig-internal.h" + +int +raise (int signo) +{ + /* According to POSIX, if we implement threads (and we do), then + "the effect of the raise() function shall be equivalent to + calling: pthread_kill(pthread_self(), sig);" */ + +debug (0, ""); + int err = pthread_kill (pthread_self (), signo); +debug (0, ""); + if (err) + { + errno = err; + return -1; + } + + return 0; +} + diff --git a/libpthread/sysdeps/generic/sem-close.c b/libpthread/sysdeps/generic/sem-close.c new file mode 100644 index 0000000..9f48032 --- /dev/null +++ b/libpthread/sysdeps/generic/sem-close.c @@ -0,0 +1,32 @@ +/* Close a named semaphore. Generic version. + Copyright (C) 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +#include + +int +__sem_close (sem_t *sem) +{ + errno = EOPNOTSUPP; + return -1; +} + +strong_alias (__sem_close, sem_close); diff --git a/libpthread/sysdeps/generic/sem-destroy.c b/libpthread/sysdeps/generic/sem-destroy.c new file mode 100644 index 0000000..6486599 --- /dev/null +++ b/libpthread/sysdeps/generic/sem-destroy.c @@ -0,0 +1,38 @@ +/* Destroy a semaphore. Generic version. + Copyright (C) 2005, 2006 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +#include + +int +__sem_destroy (sem_t *sem) +{ + if (sem->__queue) + /* There are threads waiting on *SEM. */ + { + errno = EBUSY; + return -1; + } + + return 0; +} + +strong_alias (__sem_destroy, sem_destroy); diff --git a/libpthread/sysdeps/generic/sem-getvalue.c b/libpthread/sysdeps/generic/sem-getvalue.c new file mode 100644 index 0000000..7762089 --- /dev/null +++ b/libpthread/sysdeps/generic/sem-getvalue.c @@ -0,0 +1,33 @@ +/* Get the value of a semaphore. Generic version. + Copyright (C) 2005, 2006 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +__sem_getvalue (sem_t *restrict sem, int *restrict value) +{ + __pthread_spin_lock (&sem->__lock); + *value = sem->__value; + __pthread_spin_unlock (&sem->__lock); + + return 0; +} + +strong_alias (__sem_getvalue, sem_getvalue); diff --git a/libpthread/sysdeps/generic/sem-init.c b/libpthread/sysdeps/generic/sem-init.c new file mode 100644 index 0000000..d2414f5 --- /dev/null +++ b/libpthread/sysdeps/generic/sem-init.c @@ -0,0 +1,46 @@ +/* Initialize a semaphore. Generic version. + Copyright (C) 2005, 2006 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +#include + +int +__sem_init (sem_t *sem, int pshared, unsigned value) +{ + if (pshared != 0) + { + errno = EOPNOTSUPP; + return -1; + } + +#ifdef SEM_VALUE_MAX + if (value > SEM_VALUE_MAX) + { + errno = EINVAL; + return -1; + } +#endif + + *sem = (sem_t) __SEMAPHORE_INITIALIZER (pshared, value); + return 0; +} + +strong_alias (__sem_init, sem_init); diff --git a/libpthread/sysdeps/generic/sem-open.c b/libpthread/sysdeps/generic/sem-open.c new file mode 100644 index 0000000..bae87ed --- /dev/null +++ b/libpthread/sysdeps/generic/sem-open.c @@ -0,0 +1,32 @@ +/* Open a named semaphore. Generic version. + Copyright (C) 2005, 2006 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +#include + +sem_t * +__sem_open (const char *name, int open_flags, ...) +{ + errno = EOPNOTSUPP; + return SEM_FAILED; +} + +strong_alias (__sem_open, sem_open); diff --git a/libpthread/sysdeps/generic/sem-post.c b/libpthread/sysdeps/generic/sem-post.c new file mode 100644 index 0000000..6d438bf --- /dev/null +++ b/libpthread/sysdeps/generic/sem-post.c @@ -0,0 +1,62 @@ +/* Post a semaphore. Generic version. + Copyright (C) 2005, 2006 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +#include + +int +__sem_post (sem_t *sem) +{ + struct __pthread *wakeup; + + __pthread_spin_lock (&sem->__lock); + if (sem->__value > 0) + /* Do a quick up. */ + { + assert (! sem->__queue); + sem->__value ++; + __pthread_spin_unlock (&sem->__lock); + return 0; + } + + if (! sem->__queue) + /* No one waiting. */ + { + sem->__value = 1; + __pthread_spin_unlock (&sem->__lock); + return 0; + } + + /* Wake someone up. */ + + /* First dequeue someone. */ + wakeup = sem->__queue; + __pthread_dequeue (wakeup); + + /* Then drop the lock and transfer control. */ + __pthread_spin_unlock (&sem->__lock); + + __pthread_wakeup (wakeup); + + return 0; +} + +strong_alias (__sem_post, sem_post); diff --git a/libpthread/sysdeps/generic/sem-timedwait.c b/libpthread/sysdeps/generic/sem-timedwait.c new file mode 100644 index 0000000..94e6dee --- /dev/null +++ b/libpthread/sysdeps/generic/sem-timedwait.c @@ -0,0 +1,91 @@ +/* Wait on a semaphore with a timeout. Generic version. + Copyright (C) 2005, 2006, 2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include +#include + +#include + +int +__sem_timedwait_internal (sem_t *restrict sem, + const struct timespec *restrict timeout) +{ + struct __pthread *self; + + __pthread_spin_lock (&sem->__lock); + if (sem->__value > 0) + /* Successful down. */ + { + sem->__value --; + __pthread_spin_unlock (&sem->__lock); + return 0; + } + + if (timeout && (timeout->tv_nsec < 0 || timeout->tv_nsec >= 1000000000)) + { + errno = EINVAL; + return -1; + } + + /* Add ourselves to the queue. */ + self = _pthread_self (); + + __pthread_enqueue (&sem->__queue, self); + __pthread_spin_unlock (&sem->__lock); + + /* Block the thread. */ + if (timeout) + { + error_t err; + + err = __pthread_timedblock (self, timeout, CLOCK_REALTIME); + if (err) + /* We timed out. We may need to disconnect ourself from the + waiter queue. + + FIXME: What do we do if we get a wakeup message before we + disconnect ourself? It may remain until the next time we + block. */ + { + assert (err == ETIMEDOUT); + + __pthread_spin_lock (&sem->__lock); + if (self->prevp) + __pthread_dequeue (self); + __pthread_spin_unlock (&sem->__lock); + + errno = err; + return -1; + } + } + else + __pthread_block (self); + + return 0; +} + +int +__sem_timedwait (sem_t *restrict sem, + const struct timespec *restrict timeout) +{ + return __sem_timedwait_internal (sem, timeout); +} + +strong_alias (__sem_timedwait, sem_timedwait); diff --git a/libpthread/sysdeps/generic/sem-trywait.c b/libpthread/sysdeps/generic/sem-trywait.c new file mode 100644 index 0000000..437e282 --- /dev/null +++ b/libpthread/sysdeps/generic/sem-trywait.c @@ -0,0 +1,42 @@ +/* Lock a semaphore if it does not require blocking. Generic version. + Copyright (C) 2005, 2006 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +#include + +int +__sem_trywait (sem_t *sem) +{ + __pthread_spin_lock (&sem->__lock); + if (sem->__value > 0) + /* Successful down. */ + { + sem->__value --; + __pthread_spin_unlock (&sem->__lock); + return 0; + } + __pthread_spin_unlock (&sem->__lock); + + errno = EAGAIN; + return -1; +} + +strong_alias (__sem_trywait, sem_trywait); diff --git a/libpthread/sysdeps/generic/sem-unlink.c b/libpthread/sysdeps/generic/sem-unlink.c new file mode 100644 index 0000000..570ed61 --- /dev/null +++ b/libpthread/sysdeps/generic/sem-unlink.c @@ -0,0 +1,32 @@ +/* Unlink a named semaphore. Generic version. + Copyright (C) 2005, 2006 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +#include + +int +__sem_unlink (const char *name) +{ + errno = EOPNOTSUPP; + return -1; +} + +strong_alias (__sem_unlink, sem_unlink); diff --git a/libpthread/sysdeps/generic/sem-wait.c b/libpthread/sysdeps/generic/sem-wait.c new file mode 100644 index 0000000..8347480 --- /dev/null +++ b/libpthread/sysdeps/generic/sem-wait.c @@ -0,0 +1,32 @@ +/* Wait on a semaphore. Generic version. + Copyright (C) 2005, 2006 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +extern int __sem_timedwait_internal (sem_t *restrict sem, + const struct timespec *restrict timeout); + +int +__sem_wait (sem_t *sem) +{ + return __sem_timedwait_internal (sem, 0); +} + +strong_alias (__sem_wait, sem_wait); diff --git a/libpthread/sysdeps/generic/sigaddset.c b/libpthread/sysdeps/generic/sigaddset.c new file mode 100644 index 0000000..14edb71 --- /dev/null +++ b/libpthread/sysdeps/generic/sigaddset.c @@ -0,0 +1,35 @@ +/* sigaddset.c - Generic sigaddset implementation. + Copyright (C) 2008 Free Software Foundation, Inc. + Written by Neal H. Walfield . + + This file is part of the GNU Hurd. + + The GNU Hurd is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public License + as published by the Free Software Foundation; either version 3 of + the License, or (at your option) any later version. + + The GNU Hurd is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this program. If not, see + . */ + +#include "sig-internal.h" + +int +sigaddset (sigset_t *sigset, int signo) +{ + if (signo <= 0 || signo >= NSIG) + { + errno = EINVAL; + return -1; + } + + *sigset |= sigmask (signo); + return 0; +} + diff --git a/libpthread/sysdeps/generic/sigdelset.c b/libpthread/sysdeps/generic/sigdelset.c new file mode 100644 index 0000000..5456467 --- /dev/null +++ b/libpthread/sysdeps/generic/sigdelset.c @@ -0,0 +1,35 @@ +/* sigdelset.c - Generic sigdelset implementation. + Copyright (C) 2008 Free Software Foundation, Inc. + Written by Neal H. Walfield . + + This file is part of the GNU Hurd. + + The GNU Hurd is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public License + as published by the Free Software Foundation; either version 3 of + the License, or (at your option) any later version. + + The GNU Hurd is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this program. If not, see + . */ + +#include "sig-internal.h" + +int +sigdelset (sigset_t *sigset, int signo) +{ + if (signo <= 0 || signo >= NSIG) + { + errno = EINVAL; + return -1; + } + + *sigset &= ~sigmask (signo); + return 0; +} + diff --git a/libpthread/sysdeps/generic/sigemptyset.c b/libpthread/sysdeps/generic/sigemptyset.c new file mode 100644 index 0000000..690c15b --- /dev/null +++ b/libpthread/sysdeps/generic/sigemptyset.c @@ -0,0 +1,29 @@ +/* sigemptyset.c - Generic sigemptyset implementation. + Copyright (C) 2008 Free Software Foundation, Inc. + Written by Neal H. Walfield . + + This file is part of the GNU Hurd. + + The GNU Hurd is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public License + as published by the Free Software Foundation; either version 3 of + the License, or (at your option) any later version. + + The GNU Hurd is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this program. If not, see + . */ + +#include + +int +sigemptyset (sigset_t *sigset) +{ + *sigset = 0; + return 0; +} + diff --git a/libpthread/sysdeps/generic/sigfillset.c b/libpthread/sysdeps/generic/sigfillset.c new file mode 100644 index 0000000..f0ac078 --- /dev/null +++ b/libpthread/sysdeps/generic/sigfillset.c @@ -0,0 +1,29 @@ +/* sigfillset.c - Generic sigfillset implementation. + Copyright (C) 2008 Free Software Foundation, Inc. + Written by Neal H. Walfield . + + This file is part of the GNU Hurd. + + The GNU Hurd is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public License + as published by the Free Software Foundation; either version 3 of + the License, or (at your option) any later version. + + The GNU Hurd is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this program. If not, see + . */ + +#include + +int +sigfillset (sigset_t *sigset) +{ + *sigset = (1ULL << (NSIG - 1)) - 1; + return 0; +} + diff --git a/libpthread/sysdeps/generic/siginterrupt.c b/libpthread/sysdeps/generic/siginterrupt.c new file mode 100644 index 0000000..0899efb --- /dev/null +++ b/libpthread/sysdeps/generic/siginterrupt.c @@ -0,0 +1,36 @@ +/* siginterrupt.c - Generic siginterrupt implementation. + Copyright (C) 2008 Free Software Foundation, Inc. + Written by Neal H. Walfield . + + This file is part of the GNU Hurd. + + The GNU Hurd is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public License + as published by the Free Software Foundation; either version 3 of + the License, or (at your option) any later version. + + The GNU Hurd is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this program. If not, see + . */ + +#include "sig-internal.h" + +int +siginterrupt (int sig, int flag) +{ + int ret; + struct sigaction act; + + sigaction (sig, NULL, &act); + if (flag) + act.sa_flags &= ~SA_RESTART; + else + act.sa_flags |= SA_RESTART; + ret = sigaction(sig, &act, NULL); + return ret; +} diff --git a/libpthread/sysdeps/generic/sigismember.c b/libpthread/sysdeps/generic/sigismember.c new file mode 100644 index 0000000..b3d65c9 --- /dev/null +++ b/libpthread/sysdeps/generic/sigismember.c @@ -0,0 +1,36 @@ +/* sigismember.c - Generic sigismember implementation. + Copyright (C) 2008 Free Software Foundation, Inc. + Written by Neal H. Walfield . + + This file is part of the GNU Hurd. + + The GNU Hurd is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public License + as published by the Free Software Foundation; either version 3 of + the License, or (at your option) any later version. + + The GNU Hurd is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this program. If not, see + . */ + +#include "sig-internal.h" + +int +sigismember (const sigset_t *sigset, int signo) +{ + if (signo <= 0 || signo >= NSIG) + { + errno = EINVAL; + return -1; + } + + if (*sigset & sigmask (signo)) + return 1; + else + return 0; +} diff --git a/libpthread/sysdeps/generic/signal.c b/libpthread/sysdeps/generic/signal.c new file mode 100644 index 0000000..7555d0a --- /dev/null +++ b/libpthread/sysdeps/generic/signal.c @@ -0,0 +1,44 @@ +/* signal.c - Generic signal implementation. + Copyright (C) 2008 Free Software Foundation, Inc. + Written by Neal H. Walfield . + + This file is part of the GNU Hurd. + + The GNU Hurd is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public License + as published by the Free Software Foundation; either version 3 of + the License, or (at your option) any later version. + + The GNU Hurd is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this program. If not, see + . */ + +#include "sig-internal.h" + +void (*signal (int sig, void (*handler)(int)))(int) +{ + struct sigaction sa; + + sa.sa_handler = handler; + sa.sa_flags = SA_RESTART; + + if (sigemptyset (&sa.sa_mask) < 0 + || sigaddset (&sa.sa_mask, sig) < 0) + return SIG_ERR; + + struct sigaction osa; + if (sigaction (sig, &sa, &osa) < 0) + return SIG_ERR; + + return osa.sa_handler; +} + +void (*bsd_signal (int sig, void (*func)(int)))(int) +{ + return signal (sig, func); +} diff --git a/libpthread/sysdeps/generic/sigwait.c b/libpthread/sysdeps/generic/sigwait.c new file mode 100644 index 0000000..7d10bf8 --- /dev/null +++ b/libpthread/sysdeps/generic/sigwait.c @@ -0,0 +1,34 @@ +/* sigwait.c - Generic sigwait implementation. + Copyright (C) 2008 Free Software Foundation, Inc. + Written by Neal H. Walfield . + + This file is part of the GNU Hurd. + + The GNU Hurd is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public License + as published by the Free Software Foundation; either version 3 of + the License, or (at your option) any later version. + + The GNU Hurd is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this program. If not, see + . */ + +#include "sig-internal.h" + +int +sigwait (const sigset_t *restrict set, int *restrict signo) +{ + siginfo_t info; + + if (sigwaitinfo (set, &info) < 0) + return -1; + + *signo = info.si_signo; + return 0; +} + diff --git a/libpthread/sysdeps/hurd/pt-destroy-specific.c b/libpthread/sysdeps/hurd/pt-destroy-specific.c new file mode 100644 index 0000000..f7896e5 --- /dev/null +++ b/libpthread/sysdeps/hurd/pt-destroy-specific.c @@ -0,0 +1,79 @@ +/* __pthread_destory_specific. Hurd version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include +#include + +#include + +void +__pthread_destroy_specific (struct __pthread *thread) +{ + error_t err; + int i; + int seen_one; + + /* Check if there is any thread specific data. */ + if (! thread->thread_specifics) + return; + + __pthread_key_lock_ready (); + + /* Iterate and call the destructors on any thread specific data. */ + for (;;) + { + seen_one = 0; + + __pthread_mutex_lock (&__pthread_key_lock); + + for (i = 0; i < __pthread_key_count; i ++) + { + void *value; + + if (__pthread_key_destructors[i] == PTHREAD_KEY_INVALID) + continue; + + value = hurd_ihash_find (thread->thread_specifics, i); + if (value) + { + err = hurd_ihash_remove (thread->thread_specifics, i); + assert (err == 1); + + if (__pthread_key_destructors[i]) + { + seen_one = 1; + __pthread_key_destructors[i] (value); + } + } + } + + __pthread_mutex_unlock (&__pthread_key_lock); + + if (! seen_one) + break; + + /* This may take a very long time. Let those blocking on + pthread_key_create or pthread_key_delete make progress. */ + sched_yield (); + } + + hurd_ihash_free (thread->thread_specifics); + thread->thread_specifics = 0; +} diff --git a/libpthread/sysdeps/hurd/pt-getspecific.c b/libpthread/sysdeps/hurd/pt-getspecific.c new file mode 100644 index 0000000..71ec63c --- /dev/null +++ b/libpthread/sysdeps/hurd/pt-getspecific.c @@ -0,0 +1,39 @@ +/* pthread_getspecific. Hurd version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +#include + +void * +pthread_getspecific (pthread_key_t key) +{ + struct __pthread *self; + + if (key < 0 || key >= __pthread_key_count + || __pthread_key_destructors[key] == PTHREAD_KEY_INVALID) + return NULL; + + self = _pthread_self (); + if (! self->thread_specifics) + return 0; + + return hurd_ihash_find (self->thread_specifics, key); +} diff --git a/libpthread/sysdeps/hurd/pt-init-specific.c b/libpthread/sysdeps/hurd/pt-init-specific.c new file mode 100644 index 0000000..c1bacbc --- /dev/null +++ b/libpthread/sysdeps/hurd/pt-init-specific.c @@ -0,0 +1,30 @@ +/* __pthread_init_specific. Hurd version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +#include + +error_t +__pthread_init_specific (struct __pthread *thread) +{ + thread->thread_specifics = 0; + return 0; +} diff --git a/libpthread/sysdeps/hurd/pt-key-create.c b/libpthread/sysdeps/hurd/pt-key-create.c new file mode 100644 index 0000000..b3e0141 --- /dev/null +++ b/libpthread/sysdeps/hurd/pt-key-create.c @@ -0,0 +1,109 @@ +/* pthread_key_create. Hurd version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include +#include + +#include + +pthread_mutex_t __pthread_key_lock; + +void (**__pthread_key_destructors) (void *arg); +int __pthread_key_size; +int __pthread_key_count; +int __pthread_key_invalid_count; + +int +pthread_key_create (pthread_key_t *key, void (*destructor) (void *)) +{ + /* Where to look for the next key slot. */ + static int index; + + __pthread_key_lock_ready (); + + __pthread_mutex_lock (&__pthread_key_lock); + + do_search: + /* Use the search hint and try to find a free slot. */ + for (; index < __pthread_key_count + && __pthread_key_destructors[index] != PTHREAD_KEY_INVALID; + index ++) + ; + + /* See if we actually found a free element. */ + if (index < __pthread_key_count) + { + assert (__pthread_key_destructors[index] == PTHREAD_KEY_INVALID); + assert (__pthread_key_invalid_count > 0); + + __pthread_key_invalid_count --; + __pthread_key_destructors[index] = destructor; + *key = index ++; + + __pthread_mutex_unlock (&__pthread_key_lock); + return 0; + } + + assert (index == __pthread_key_count); + + /* No space at the end. */ + if (__pthread_key_size == __pthread_key_count) + { + /* See if it is worth looking for a free element. */ + if (__pthread_key_invalid_count > 4 + && __pthread_key_invalid_count > __pthread_key_size / 8) + { + index = 0; + goto do_search; + } + + + /* Resize the array. */ + { + void *t; + int newsize; + + if (__pthread_key_size == 0) + newsize = 8; + else + newsize = __pthread_key_size * 2; + + t = realloc (__pthread_key_destructors, + newsize * sizeof (*__pthread_key_destructors)); + if (! t) + { + __pthread_mutex_unlock (&__pthread_key_lock); + return ENOMEM; + } + + __pthread_key_size = newsize; + __pthread_key_destructors = t; + } + } + + __pthread_key_destructors[index] = destructor; + *key = index; + + index ++; + __pthread_key_count ++; + + __pthread_mutex_unlock (&__pthread_key_lock); + return 0; +} diff --git a/libpthread/sysdeps/hurd/pt-key-delete.c b/libpthread/sysdeps/hurd/pt-key-delete.c new file mode 100644 index 0000000..9d88647 --- /dev/null +++ b/libpthread/sysdeps/hurd/pt-key-delete.c @@ -0,0 +1,64 @@ +/* pthread_key_delete. Hurd version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +#include + +int +pthread_key_delete (pthread_key_t key) +{ + error_t err = 0; + + __pthread_key_lock_ready (); + + __pthread_mutex_lock (&__pthread_key_lock); + + if (key < 0 || key >= __pthread_key_count + || __pthread_key_destructors[key] == PTHREAD_KEY_INVALID) + err = EINVAL; + else + { + int i; + + __pthread_key_destructors[key] = PTHREAD_KEY_INVALID; + __pthread_key_invalid_count ++; + + pthread_rwlock_rdlock (&__pthread_threads_lock); + for (i = 0; i < __pthread_num_threads; ++i) + { + struct __pthread *t; + + t = __pthread_threads[i]; + + if (t == NULL) + continue; + + /* Just remove the key, no need to care whether it was + already there. */ + if (t->thread_specifics) + hurd_ihash_remove (t->thread_specifics, key); + } + pthread_rwlock_unlock (&__pthread_threads_lock); + } + + __pthread_mutex_unlock (&__pthread_key_lock); + + return err; +} diff --git a/libpthread/sysdeps/hurd/pt-key.h b/libpthread/sysdeps/hurd/pt-key.h new file mode 100644 index 0000000..494e01d --- /dev/null +++ b/libpthread/sysdeps/hurd/pt-key.h @@ -0,0 +1,76 @@ +/* pthread_key internal declatations for the Hurd version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +#define PTHREAD_KEY_MEMBERS \ + hurd_ihash_t thread_specifics; + +#define PTHREAD_KEY_INVALID (void *) (-1) + + +/* __PTHREAD_KEY_DESTRUCTORS is an array of destructors with + __PTHREAD_KEY_SIZE elements. If an element with index less than + __PTHREAD_KEY_COUNT is invalid, it shall contain the value + PTHREAD_KEY_INVALID which shall be distinct from NULL. + + Normally, we just add new keys to the end of the array and realloc + it as necessary. The pthread_key_create routine may decide to + rescan the array if __PTHREAD_KEY_FREE is large. */ +extern void (**__pthread_key_destructors) (void *arg); +extern int __pthread_key_size; +extern int __pthread_key_count; +/* Number of invalid elements in the array. Does not include elements + for which memory has been allocated but which have not yet been + used (i.e. those elements with indexes greater than + __PTHREAD_KEY_COUNT). */ +extern int __pthread_key_invalid_count; + +/* Protects the above variables. This must be a recursive lock: the + destructors may call pthread_key_delete. */ +extern pthread_mutex_t __pthread_key_lock; + +#include + +static inline void +__pthread_key_lock_ready (void) +{ + static pthread_once_t o = PTHREAD_ONCE_INIT; + + void do_init (void) + { + int err; + pthread_mutexattr_t attr; + + err = pthread_mutexattr_init (&attr); + assert_perror (err); + + err = pthread_mutexattr_settype (&attr, PTHREAD_MUTEX_RECURSIVE); + assert_perror (err); + + err = pthread_mutex_init (&__pthread_key_lock, &attr); + assert_perror (err); + + err = pthread_mutexattr_destroy (&attr); + assert_perror (err); + } + + pthread_once (&o, do_init); +} diff --git a/libpthread/sysdeps/hurd/pt-kill.c b/libpthread/sysdeps/hurd/pt-kill.c new file mode 100644 index 0000000..d204e3f --- /dev/null +++ b/libpthread/sysdeps/hurd/pt-kill.c @@ -0,0 +1,52 @@ +/* pthread_kill. Hurd version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include +#include +#include + +#include + +int +pthread_kill (pthread_t thread, int sig) +{ + struct __pthread *pthread; + struct hurd_signal_detail detail; + struct hurd_sigstate *ss; + + /* Lookup the thread structure for THREAD. */ + pthread = __pthread_getid (thread); + if (pthread == NULL) + return ESRCH; + + ss = _hurd_thread_sigstate (pthread->kernel_thread); + assert (ss); + + if (!sig) + return 0; + + detail.exc = 0; + detail.code = sig; + detail.error = 0; + + _hurd_raise_signal (ss, sig, &detail); + + return 0; +} diff --git a/libpthread/sysdeps/hurd/pt-setspecific.c b/libpthread/sysdeps/hurd/pt-setspecific.c new file mode 100644 index 0000000..d0b7302 --- /dev/null +++ b/libpthread/sysdeps/hurd/pt-setspecific.c @@ -0,0 +1,47 @@ +/* pthread_setspecific. Generic version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +#include + +int +pthread_setspecific (pthread_key_t key, const void *value) +{ + error_t err; + struct __pthread *self = _pthread_self (); + + if (key < 0 || key >= __pthread_key_count + || __pthread_key_destructors[key] == PTHREAD_KEY_INVALID) + return EINVAL; + + if (! self->thread_specifics) + { + err = hurd_ihash_create (&self->thread_specifics, HURD_IHASH_NO_LOCP); + if (err) + return ENOMEM; + } + + err = hurd_ihash_add (self->thread_specifics, key, (void *) value); + if (err) + return ENOMEM; + + return 0; +} diff --git a/libpthread/sysdeps/i386/Implies b/libpthread/sysdeps/i386/Implies new file mode 100644 index 0000000..d799fa1 --- /dev/null +++ b/libpthread/sysdeps/i386/Implies @@ -0,0 +1 @@ +ia32 diff --git a/libpthread/sysdeps/ia32/bits/memory.h b/libpthread/sysdeps/ia32/bits/memory.h new file mode 100644 index 0000000..932c408 --- /dev/null +++ b/libpthread/sysdeps/ia32/bits/memory.h @@ -0,0 +1,40 @@ +/* Memory barrier operations. i386 version. + Copyright (C) 2002, 2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _BITS_MEMORY_H +#define _BITS_MEMORY_H 1 + +/* Prevent read and write reordering across this function. */ +static inline void +__memory_barrier (void) +{ + int i; + + /* Any lock'ed instruction will do. We just do a simple + increment. */ + __asm__ __volatile ("lock; incl %0" : "=m" (i) : "m" (i) : "memory"); +} + +/* Prevent read reordering across this function. */ +#define __memory_read_barrier __memory_barrier + +/* Prevent write reordering across this function. */ +#define __memory_write_barrier __memory_barrier + +#endif diff --git a/libpthread/sysdeps/ia32/bits/pt-atomic.h b/libpthread/sysdeps/ia32/bits/pt-atomic.h new file mode 100644 index 0000000..0dfc1f6 --- /dev/null +++ b/libpthread/sysdeps/ia32/bits/pt-atomic.h @@ -0,0 +1,66 @@ +/* Atomic operations. i386 version. + Copyright (C) 2000 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _BITS_ATOMIC_H +#define _BITS_ATOMIC_H 1 + +typedef __volatile int __atomic_t; + +static inline void +__atomic_inc (__atomic_t *__var) +{ + __asm__ __volatile ("lock; incl %0" : "=m" (*__var) : "m" (*__var)); +} + +static inline void +__atomic_dec (__atomic_t *__var) +{ + __asm__ __volatile ("lock; decl %0" : "=m" (*__var) : "m" (*__var)); +} + +static inline int +__atomic_dec_and_test (__atomic_t *__var) +{ + unsigned char __ret; + + __asm__ __volatile ("lock; decl %0; sete %1" + : "=m" (*__var), "=qm" (__ret) : "m" (*__var)); + return __ret != 0; +} + +/* We assume that an __atomicptr_t is only used for pointers to + word-aligned objects, and use the lowest bit for a simple lock. */ +typedef __volatile int * __atomicptr_t; + +/* Actually we don't implement that yet, and assume that we run on + something that has the i486 instruction set. */ +static inline int +__atomicptr_compare_and_swap (__atomicptr_t *__ptr, void *__oldval, + void * __newval) +{ + char __ret; + int __dummy; + + __asm__ __volatile ("lock; cmpxchgl %3, %1; sete %0" + : "=q" (__ret), "=m" (*__ptr), "=a" (__dummy) + : "r" (__newval), "m" (*__ptr), "a" (__oldval)); + return __ret; +} + +#endif diff --git a/libpthread/sysdeps/ia32/bits/spin-lock-inline.h b/libpthread/sysdeps/ia32/bits/spin-lock-inline.h new file mode 100644 index 0000000..e5ed3de --- /dev/null +++ b/libpthread/sysdeps/ia32/bits/spin-lock-inline.h @@ -0,0 +1,98 @@ +/* Machine-specific definitions for spin locks. i386 version. + Copyright (C) 2000, 2005, 2008, 2009 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* + * Never include this file directly; use or instead. + */ + +#ifndef _BITS_SPIN_LOCK_INLINE_H +#define _BITS_SPIN_LOCK_INLINE_H 1 + +#include +#include + +__BEGIN_DECLS + +#if defined __USE_EXTERN_INLINES || defined _FORCE_INLINES + +# ifndef __EBUSY +# include +# define __EBUSY EBUSY +# endif + +# ifndef __PT_SPIN_INLINE +# define __PT_SPIN_INLINE __extern_inline +# endif + +__PT_SPIN_INLINE int __pthread_spin_destroy (__pthread_spinlock_t *__lock); + +__PT_SPIN_INLINE int +__pthread_spin_destroy (__pthread_spinlock_t *__lock) +{ + return 0; +} + +__PT_SPIN_INLINE int __pthread_spin_init (__pthread_spinlock_t *__lock, + int __pshared); + +__PT_SPIN_INLINE int +__pthread_spin_init (__pthread_spinlock_t *__lock, int __pshared) +{ + *__lock = __PTHREAD_SPIN_LOCK_INITIALIZER; + return 0; +} + +__PT_SPIN_INLINE int __pthread_spin_trylock (__pthread_spinlock_t *__lock); + +__PT_SPIN_INLINE int +__pthread_spin_trylock (__pthread_spinlock_t *__lock) +{ + int __locked; + __asm__ __volatile ("xchgl %0, %1" + : "=&r" (__locked), "=m" (*__lock) : "0" (1) : "memory"); + return __locked ? __EBUSY : 0; +} + +__extern_inline int __pthread_spin_lock (__pthread_spinlock_t *__lock); +extern int _pthread_spin_lock (__pthread_spinlock_t *__lock); + +__extern_inline int +__pthread_spin_lock (__pthread_spinlock_t *__lock) +{ + if (__pthread_spin_trylock (__lock)) + return _pthread_spin_lock (__lock); + return 0; +} + +__PT_SPIN_INLINE int __pthread_spin_unlock (__pthread_spinlock_t *__lock); + +__PT_SPIN_INLINE int +__pthread_spin_unlock (__pthread_spinlock_t *__lock) +{ + int __unlocked; + __asm__ __volatile ("xchgl %0, %1" + : "=&r" (__unlocked), "=m" (*__lock) : "0" (0) : "memory"); + return 0; +} + +#endif /* Use extern inlines or force inlines. */ + +__END_DECLS + +#endif /* bits/spin-lock.h */ diff --git a/libpthread/sysdeps/ia32/bits/spin-lock.h b/libpthread/sysdeps/ia32/bits/spin-lock.h new file mode 100644 index 0000000..5ae81e1 --- /dev/null +++ b/libpthread/sysdeps/ia32/bits/spin-lock.h @@ -0,0 +1,39 @@ +/* Machine-specific definitions for spin locks. i386 version. + Copyright (C) 2000, 2005, 2008, 2009 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* + * Never include this file directly; use or instead. + */ + +#ifndef _BITS_SPIN_LOCK_H +#define _BITS_SPIN_LOCK_H 1 + +#include + +__BEGIN_DECLS + +/* The type of a spin lock object. */ +typedef __volatile int __pthread_spinlock_t; + +/* Initializer for a spin lock object. */ +# define __PTHREAD_SPIN_LOCK_INITIALIZER ((__pthread_spinlock_t) 0) + +__END_DECLS + +#endif /* bits/spin-lock.h */ diff --git a/sysdeps/unix/sysv/linux/sparc/fork.S b/libpthread/sysdeps/ia32/machine-sp.h similarity index 67% rename from sysdeps/unix/sysv/linux/sparc/fork.S rename to libpthread/sysdeps/ia32/machine-sp.h index 2459b8c..cef6ab7 100644 --- a/sysdeps/unix/sysv/linux/sparc/fork.S +++ b/libpthread/sysdeps/ia32/machine-sp.h @@ -1,6 +1,6 @@ -/* Copyright (C) 1997, 1999, 2002 Free Software Foundation, Inc. +/* Machine-specific function to return the stack pointer. i386 version. + Copyright (C) 1994, 1997, 2001, 2006 Free Software Foundation, Inc. This file is part of the GNU C Library. - Contributed by Miguel de Icaza , 1997. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -17,14 +17,14 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -#include +#ifndef _MACHINE_SP_H +#define _MACHINE_SP_H -PSEUDO (__libc_fork, fork, 0) - sub %o1, 1, %o1 - retl - and %o0, %o1, %o0 -PSEUDO_END (__libc_fork) +/* Return the current stack pointer. */ -weak_alias (__libc_fork, __fork) -libc_hidden_def (__fork) -weak_alias (__libc_fork, fork) +#define __thread_stack_pointer() ({ \ + register void *__sp__ asm("esp"); \ + __sp__; \ +}) + +#endif /* machine-sp.h */ diff --git a/libpthread/sysdeps/ia32/pt-machdep.h b/libpthread/sysdeps/ia32/pt-machdep.h new file mode 100644 index 0000000..6d45636 --- /dev/null +++ b/libpthread/sysdeps/ia32/pt-machdep.h @@ -0,0 +1,29 @@ +/* Machine dependent pthreads internal defenitions. i386 version. + Copyright (C) 2000 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _PT_MACHDEP_H +#define _PT_MACHDEP_H 1 + +struct pthread_mcontext +{ + void *pc; + void *sp; +}; + +#endif /* pt-machdep.h */ diff --git a/libpthread/sysdeps/l4/bits/pthread-np.h b/libpthread/sysdeps/l4/bits/pthread-np.h new file mode 100644 index 0000000..6a02bdc --- /dev/null +++ b/libpthread/sysdeps/l4/bits/pthread-np.h @@ -0,0 +1,35 @@ +/* Non-portable functions. L4 version. + Copyright (C) 2003, 2007 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* + * Never include this file directly; use or instead. + */ + +#ifndef _BITS_PTHREAD_NP_H +#define _BITS_PTHREAD_NP_H 1 + +#include + +/* Add the thread TID to the internal kernel thread pool. */ +extern int pthread_pool_add_np (l4_thread_id_t tid); + +/* Get the first thread from the pool. */ +extern l4_thread_id_t pthread_pool_get_np (void); + +#endif /* bits/pthread-np.h */ diff --git a/libpthread/sysdeps/l4/hurd/bits/pthread-np.h b/libpthread/sysdeps/l4/hurd/bits/pthread-np.h new file mode 100644 index 0000000..a90793d --- /dev/null +++ b/libpthread/sysdeps/l4/hurd/bits/pthread-np.h @@ -0,0 +1,31 @@ +/* Non-portable functions. Viengoos version. + Copyright (C) 2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* + * Never include this file directly; use or instead. + */ + +#ifndef _BITS_PTHREAD_NP_H +#define _BITS_PTHREAD_NP_H 1 + +#include + +int pthread_setactivity_np (addr_t activity); + +#endif /* bits/pthread-np.h */ diff --git a/libpthread/sysdeps/l4/hurd/ia32/pt-machdep.c b/libpthread/sysdeps/l4/hurd/ia32/pt-machdep.c new file mode 100644 index 0000000..dbf5cd7 --- /dev/null +++ b/libpthread/sysdeps/l4/hurd/ia32/pt-machdep.c @@ -0,0 +1,20 @@ +/* Machine dependent pthreads code. Hurd/i386 version. + Copyright (C) 2000 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* Nothing to do. */ diff --git a/libpthread/sysdeps/l4/hurd/ia32/pt-setup.c b/libpthread/sysdeps/l4/hurd/ia32/pt-setup.c new file mode 100644 index 0000000..579905c --- /dev/null +++ b/libpthread/sysdeps/l4/hurd/ia32/pt-setup.c @@ -0,0 +1,117 @@ +/* Setup thread stack. Viengoos/i386 version. + Copyright (C) 2000, 2002, 2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +#include +#include +#include + +/* The stack layout used on the i386 is: + + ----------------- + | ARG | + ----------------- + | START_ROUTINE | + ----------------- + | Return address | + ----------------- <- %ebp + | Frame pointer | + ----------------- + + We do the following: setup the stack to return to the entry routine. + + +*/ + +/* The stack contains: + + arg + start_routine + 0 <- fake return address + C entry_point +*/ +extern uintptr_t _pthread_entry_point; +__asm__ ("\n\ + .globl _pthread_entry_point, __pthread_entry_point\n\ +_pthread_entry_point:\n\ +__pthread_entry_point:\n\ + pushl $0\n\ + popf\n\ +\n\ + xor %ebp, %ebp\n\ + ret\n"); + +/* Set up the stack for THREAD, such that it appears as if + START_ROUTINE and ARG were passed to the new thread's entry-point. + Return the stack pointer for the new thread. We also take the + opportunity to install THREAD in our utcb. */ +static void * +stack_setup (struct __pthread *thread, + void *(*start_routine)(void *), void *arg, + void (*entry_point)(void *(*)(void *), void *)) +{ + uintptr_t *top; + + /* Calculate top of the new stack. */ + top = (uintptr_t *) ((uintptr_t) thread->stackaddr + thread->stacksize); + + /* Align on 0x10 for MMX operations. */ + top = (uintptr_t) top & ~0xf; + + if (start_routine) + { + /* Set up call frame. */ + *--top = (uintptr_t) arg; /* Argument to START_ROUTINE. */ + *--top = (uintptr_t) start_routine; + *--top = 0; /* Fake return address. */ + *--top = (uintptr_t) entry_point; + } + + return top; +} + +int +__pthread_setup (struct __pthread *thread, + void (*entry_point)(void *(*)(void *), void *), + void *(*start_routine)(void *), void *arg) +{ + thread->mcontext.pc = (void *) &_pthread_entry_point; + thread->mcontext.sp = (void *) stack_setup (thread, start_routine, arg, + entry_point); + + if (__pthread_num_threads == 1) + return 0; + + assert (! ADDR_IS_VOID (thread->exception_area[0])); + + struct exception_page *exception_page = thread->exception_area_va; + + /* SP is set to the end of the exception area minus one word, which + is the location of the exception page. */ + exception_page->exception_handler_sp + = (uintptr_t) thread->exception_area_va + EXCEPTION_AREA_SIZE; + exception_page->exception_handler_sp -= sizeof (void *); + * (void **) exception_page->exception_handler_sp = thread->exception_area_va; + + exception_page->exception_handler_ip = (uintptr_t) &exception_handler_entry; + exception_page->exception_handler_end = (uintptr_t) &exception_handler_end; + + return 0; +} diff --git a/libpthread/sysdeps/l4/hurd/ia32/signal-dispatch-lowlevel.c b/libpthread/sysdeps/l4/hurd/ia32/signal-dispatch-lowlevel.c new file mode 100644 index 0000000..37ef821 --- /dev/null +++ b/libpthread/sysdeps/l4/hurd/ia32/signal-dispatch-lowlevel.c @@ -0,0 +1,213 @@ +/* signal-dispatch-lowlevel.c - ia32 specific signal handling functions. + Copyright (C) 2008 Free Software Foundation, Inc. + Written by Neal H. Walfield . + + This file is part of the GNU Hurd. + + The GNU Hurd is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public License + as published by the Free Software Foundation; either version 3 of + the License, or (at your option) any later version. + + The GNU Hurd is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this program. If not, see + . */ + +#include +#include + +#include +#include +#include +#include + +extern char _signal_dispatch_entry; +/* - 0(%esp) a pointer to the thread's struct signal_state. + - 4(%esp) a pointer to a siginfo_t. + - 8(%esp) is a pointer to the ss_flags field (or NULL). + - 12(%esp)+4 is the value of the sp when the thread was interrupted (intr_sp) + - 0(intr_sp) is the value of the ip when the thread was interrupted. + - 16(%esp) - 16 byte register save area +*/ +__asm__ ("\n\ + .globl _signal_dispatch_entry\n\ +_signal_dispatch_entry:\n\ + /* Save caller saved registers (16 bytes). */\n\ + mov %eax, 16(%esp)\n\ + mov %ecx, 16+4(%esp)\n\ + mov %edx, 16+8(%esp)\n\ + pushf\n\ + popl %eax\n\ + mov %eax, 16+12(%esp)\n\ +\n\ + /* Reset EFLAGS. */\n\ + cld\n\ + call signal_dispatch\n\ +\n\ + /* Get the original stack and begin restoration. */\n\ + mov 12(%esp), %edx\n\ +\n\ + /* Move the saved registers to the user stack. */\n\ + sub $16, %edx\n\ + /* eax. */\n\ + mov 16+0(%esp), %ecx\n\ + mov %ecx, 0(%edx)\n\ + /* ecx. */\n\ + mov 16+4(%esp), %ecx\n\ + mov %ecx, 4(%edx)\n\ + /* edx. */\n\ + mov 16+8(%esp), %ecx\n\ + mov %ecx, 8(%edx)\n\ + /* eflags. */\n\ + mov 16+12(%esp), %ecx\n\ + mov %ecx, 12(%edx)\n\ +\n\ + /* Get the pointer to the sigaltstack flags. */\n\ + mov 8(%esp), %ecx\n\ +\n\ + /* Restore the user stack. */\n\ + mov %edx, %esp\n\ +\n\ + /* Clear the SA_ONSTACK flag. */\n\ + and %ecx, %ecx\n\ + jz after_clear\n\ + lock; and $~1, 0(%ecx)\n\ +after_clear:\n\ +\n\ + /* Restore eflags, the scratch regs and the original sp and ip. */\n\ + popl %eax\n\ + popl %ecx\n\ + popl %edx\n\ + popf\n\ + ret\n"); + +extern char _signal_dispatch_entry_self; +/* - 0(%esp) is the return address (we ignore it) + - 4(%esp) is the sp to load + + Since we are returning to signal_dispatch_lowlevel's caller, we + also need to restore its frame pointer. */ +__asm__ ("\n\ + .globl _signal_dispatch_entry_self\n\ +_signal_dispatch_entry_self:\n\ + mov 0(%ebp), %ebp\n\ + mov 4(%esp), %esp\n\ + jmp _signal_dispatch_entry\n"); + +void +signal_dispatch_lowlevel (struct signal_state *ss, pthread_t tid, + siginfo_t si) +{ + assert (pthread_mutex_trylock (&ss->lock) == EBUSY); + + struct __pthread *thread = __pthread_getid (tid); + + bool self = tid == pthread_self (); + + uintptr_t intr_sp; + + if (self) + { + /* The return address is just before the first argument. */ + intr_sp = (uintptr_t) &ss - 4; + assert (* (void **) intr_sp == __builtin_return_address (0)); + } + else + { + struct hurd_thread_exregs_in in; + memset (&in, 0, sizeof (in)); + struct hurd_thread_exregs_out out; + + error_t err; + err = rm_thread_exregs (ADDR_VOID, thread->object, + HURD_EXREGS_STOP | HURD_EXREGS_ABORT_IPC + | HURD_EXREGS_GET_REGS, + in, &out); + if (err) + panic ("Failed to modify thread " ADDR_FMT, + ADDR_PRINTF (thread->object)); + + intr_sp = out.sp; + + /* Push the ip on the user stack. */ + intr_sp -= 4; + * (uintptr_t *) intr_sp = out.ip; + } + + bool altstack = false; + uintptr_t sp; + if (! (ss->actions[si.si_signo - 1].sa_flags & SA_ONSTACK) + || (ss->stack.ss_flags & SS_DISABLE) + || (ss->stack.ss_flags & SS_ONSTACK)) + { + assert (! self); + sp = intr_sp; + } + else + { + /* The stack grows down. */ + sp = (uintptr_t) ss->stack.ss_sp + ss->stack.ss_size; + + /* We know intimately that SS_ONSTACK is the least significant + bit. */ + assert (SS_ONSTACK == 1); + atomic_bit_set (&ss->stack.ss_flags, 0); + + altstack = true; + } + + /* Set up the call frame for a call to signal_dispatch_entry. */ + + /* Allocate a siginfo structure on the stack. */ + sp = sp - sizeof (siginfo_t); + siginfo_t *sip = (void *) sp; + /* Copy the user supplied values. */ + *sip = si; + + /* Add space for the 4 caller saved registers. */ + sp -= 4 * sizeof (uintptr_t); + + /* Save the interrupted sp. */ + sp -= 4; + * (uintptr_t *) sp = intr_sp; + + /* Address of the ss_flags. */ + sp -= 4; + if (altstack) + * (uintptr_t *) sp = (uintptr_t) &ss->stack.ss_flags; + else + * (uintptr_t *) sp = 0; + + /* Push the parameters to signal_dispatch. */ + + /* signal info structure. */ + sp -= 4; + * (uintptr_t *) sp = (uintptr_t) sip; + + /* The ss. */ + sp -= 4; + * (uintptr_t *) sp = (uintptr_t) ss; + + pthread_mutex_transfer_np (&ss->lock, tid); + + if (self) + ((void (*) (uintptr_t)) &_signal_dispatch_entry_self) ((uintptr_t) sp); + else + { + struct hurd_thread_exregs_in in; + struct hurd_thread_exregs_out out; + + in.sp = sp; + in.ip = (uintptr_t) &_signal_dispatch_entry; + + rm_thread_exregs (ADDR_VOID, thread->object, + HURD_EXREGS_SET_SP_IP + | HURD_EXREGS_START | HURD_EXREGS_ABORT_IPC, + in, &out); + } +} diff --git a/libpthread/sysdeps/l4/hurd/powerpc/pt-machdep.c b/libpthread/sysdeps/l4/hurd/powerpc/pt-machdep.c new file mode 100644 index 0000000..754d203 --- /dev/null +++ b/libpthread/sysdeps/l4/hurd/powerpc/pt-machdep.c @@ -0,0 +1,20 @@ +/* Machine dependent pthreads code. Hurd/PowerPC version. + Copyright (C) 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* Nothing to do. */ diff --git a/libpthread/sysdeps/l4/hurd/powerpc/pt-setup.c b/libpthread/sysdeps/l4/hurd/powerpc/pt-setup.c new file mode 100644 index 0000000..d3cf4ec --- /dev/null +++ b/libpthread/sysdeps/l4/hurd/powerpc/pt-setup.c @@ -0,0 +1,93 @@ +/* Setup thread stack. Hurd/PowerPC version. + Copyright (C) 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +#include + +/* Arguments is passed in registers on the PowerPC. But the + exchange registers syscall only allows us to set the PC and the + stack pointer so we put the entry point and start function on + the stack. */ +struct start_info +{ + void (*entry_point) (void *(*)(void *), void *); + void *(*start_routine) (void *); + void *arg; +}; + +void first_entry_1 (void); + +/* Stage 1 entry function. The start_info structure is inlined on the + stack. Put values into registers and call entry function. */ +asm (" ;\ +first_entry_1: ;\ + lwz 0, 0(1) ;\ + lwz 3, 4(1) ;\ + lwz 4, 8(1) ;\ + mtctr 0 ;\ + bctrl ;\ +"); + +/* Set up the stack for THREAD, such that it appears as if + START_ROUTINE and ARG were passed to the new thread's entry-point. + Return the stack pointer for the new thread. We also take the + opportunity to install THREAD in our utcb. */ +static void * +stack_setup (struct __pthread *thread, + void (*entry_point)(void *(*)(void *), void *), + void *(*start_routine)(void *), void *arg) +{ + l4_word_t *top; + + /* Calculate top of the new stack. */ + top = (l4_word_t *) ((l4_word_t) thread->stackaddr + thread->stacksize); + + /* Initial stack frame. */ + top[-4] = 0; + top = top - 4; + + if (start_routine) + { + struct start_info *info = ((struct start_info *) top) - 1; + + info->entry_point = entry_point; + info->start_routine = start_routine; + info->arg = arg; + return (void *) info; + } + return top; +} + +int +__pthread_setup (struct __pthread *thread, + void (*entry_point)(void *(*)(void *), void *), + void *(*start_routine)(void *), void *arg) +{ + thread->mcontext.pc = first_entry_1; + thread->mcontext.sp = stack_setup (thread, entry_point, + start_routine, arg); + + if (l4_same_threads (thread->threadid, l4_myself ())) + l4_set_user_defined_handle ((l4_word_t) thread); + else + l4_set_user_defined_handle_of (thread->threadid, + (l4_word_t) thread); + return 0; +} diff --git a/libpthread/sysdeps/l4/hurd/pt-block.c b/libpthread/sysdeps/l4/hurd/pt-block.c new file mode 100644 index 0000000..2315b1c --- /dev/null +++ b/libpthread/sysdeps/l4/hurd/pt-block.c @@ -0,0 +1,30 @@ +/* Block a thread. Viengoos version. + Copyright (C) 2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +#include +#include + +/* Block THREAD. */ +void +__pthread_block (struct __pthread *thread) +{ + futex_wait (&thread->threadid, thread->threadid); +} diff --git a/libpthread/sysdeps/l4/hurd/pt-kill.c b/libpthread/sysdeps/l4/hurd/pt-kill.c new file mode 100644 index 0000000..c72e82f --- /dev/null +++ b/libpthread/sysdeps/l4/hurd/pt-kill.c @@ -0,0 +1,3 @@ +/* The generic version is good enough for us, however, the generic + Hurd on Mach version supplies a specialized version */ +#include "../generic/pt-kill.c" diff --git a/libpthread/sysdeps/l4/hurd/pt-setactivity-np.c b/libpthread/sysdeps/l4/hurd/pt-setactivity-np.c new file mode 100644 index 0000000..f2f0723 --- /dev/null +++ b/libpthread/sysdeps/l4/hurd/pt-setactivity-np.c @@ -0,0 +1,39 @@ +/* Set a thread's activity activity. Viengoos version. + Copyright (C) 2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +#include +#include + +int +pthread_setactivity_np (addr_t activity) +{ + struct __pthread *self = _pthread_self (); + + struct hurd_thread_exregs_in in; + in.activity = activity; + + struct hurd_thread_exregs_out out; + int err = rm_thread_exregs (ADDR_VOID, self->object, + HURD_EXREGS_SET_ACTIVITY, + in, &out); + + return err; +} diff --git a/libpthread/sysdeps/l4/hurd/pt-sigstate-destroy.c b/libpthread/sysdeps/l4/hurd/pt-sigstate-destroy.c new file mode 100644 index 0000000..997a036 --- /dev/null +++ b/libpthread/sysdeps/l4/hurd/pt-sigstate-destroy.c @@ -0,0 +1,28 @@ +/* Destroy the signal state. Hurd on L4 version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +#include + +void +__pthread_sigstate_destroy (struct __pthread *thread) +{ + /* Nothing to do. */ +} diff --git a/libpthread/sysdeps/l4/hurd/pt-sigstate-init.c b/libpthread/sysdeps/l4/hurd/pt-sigstate-init.c new file mode 100644 index 0000000..4c40fdb --- /dev/null +++ b/libpthread/sysdeps/l4/hurd/pt-sigstate-init.c @@ -0,0 +1,44 @@ +/* Initialize the signal state. Hurd on L4 version. + Copyright (C) 2003, 2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +#include +#include + +error_t +__pthread_sigstate_init (struct __pthread *thread) +{ + struct signal_state *ss = &thread->ss; + + memset (ss, 0, sizeof (*ss)); + + ss->stack.ss_flags = SS_DISABLE; + + int signo; + for (signo = 1; signo < NSIG; ++signo) + { + sigemptyset (&ss->actions[signo - 1].sa_mask); + ss->actions[signo - 1].sa_flags = SA_RESTART; + ss->actions[signo - 1].sa_handler = SIG_DFL; + ss->lock = (pthread_mutex_t) PTHREAD_MUTEX_INITIALIZER; + } + + return 0; +} diff --git a/libpthread/sysdeps/l4/hurd/pt-sigstate.c b/libpthread/sysdeps/l4/hurd/pt-sigstate.c new file mode 100644 index 0000000..66dd08c --- /dev/null +++ b/libpthread/sysdeps/l4/hurd/pt-sigstate.c @@ -0,0 +1,81 @@ +/* Set a thread's signal state. Hurd on L4 version. + Copyright (C) 2002, 2005, 2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include +#include + +#include + +error_t +__pthread_sigstate (struct __pthread *thread, int how, + const sigset_t *set, sigset_t *oset, + int clear_pending) +{ + struct signal_state *ss = &thread->ss; + pthread_mutex_lock (&ss->lock); + + if (oset) + *oset = ss->blocked; + + if (set) + { + /* Mask out SIGKILL and SIGSTOP. */ + sigset_t s = *set; + sigdelset (&s, SIGKILL); + sigdelset (&s, SIGSTOP); + + switch (how) + { + case SIG_BLOCK: + ss->blocked |= s; + break; + case SIG_UNBLOCK: + ss->blocked &= ~s; + break; + case SIG_SETMASK: + ss->blocked = s; + break; + default: + errno = EINVAL; + pthread_mutex_unlock (&ss->lock); + return -1; + } + } + + if (clear_pending) + sigemptyset (&ss->pending); + + /* A "signal shall remain pending until it is unblocked" (2.4.1). + + "If there are any pending unblocked signals after the call to + sigprocmask(), at least one of those signals shall be delivered + before the call to sigprocmask() returns." + (pthread_sigmask). */ + sigset_t extant = ~ss->blocked & ss->pending; + if (! extant) + extant = ~ss->blocked & process_pending; + + pthread_mutex_unlock (&ss->lock); + + if (extant) + raise (l4_lsb64 (extant)); + + return 0; +} diff --git a/libpthread/sysdeps/l4/hurd/pt-startup.c b/libpthread/sysdeps/l4/hurd/pt-startup.c new file mode 100644 index 0000000..b6461de --- /dev/null +++ b/libpthread/sysdeps/l4/hurd/pt-startup.c @@ -0,0 +1,30 @@ +/* Thread initialization. Hurd/L4 version. + Copyright (C) 2007 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +#include + +void +__pthread_startup (void) +{ + struct __pthread *pthread = _pthread_self (); + pthread->threadid = l4_myself (); +} diff --git a/libpthread/sysdeps/l4/hurd/pt-sysdep.c b/libpthread/sysdeps/l4/hurd/pt-sysdep.c new file mode 100644 index 0000000..1df6c2e --- /dev/null +++ b/libpthread/sysdeps/l4/hurd/pt-sysdep.c @@ -0,0 +1,61 @@ +/* System dependent pthreads code. Hurd version. + Copyright (C) 2000, 2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include +#include + +#include + +int +sched_yield (void) +{ + l4_yield (); + return 0; +} + +/* Forward. */ +static void init_routine (void (*) (void *), void *) + __attribute__ ((noreturn)); + +/* OK, the name of this variable isn't really appropriate, but I don't + want to change it yet. */ +void (*_pthread_init_routine)(void (*) (void *), void *) = &init_routine; + +/* This function is called from the Hurd-specific startup code. It + should return a new stack pointer for the main thread. The caller + will switch to this new stack before doing anything serious. */ +static void +init_routine (void (*entry) (void *), void *arg) +{ + /* Initialize the library. */ + __pthread_init(); + + struct __pthread *thread; + int err; + + /* Create the pthread structure for the main thread (i.e. us). */ + err = __pthread_create_internal (&thread, 0, + (void *(*)(void *)) entry, arg); + assert_perror (err); + + /* Switch stacks. */ + l4_start_sp_ip (l4_myself (), thread->mcontext.sp, + thread->mcontext.pc); +} diff --git a/libpthread/sysdeps/l4/hurd/pt-sysdep.h b/libpthread/sysdeps/l4/hurd/pt-sysdep.h new file mode 100644 index 0000000..08bcd14 --- /dev/null +++ b/libpthread/sysdeps/l4/hurd/pt-sysdep.h @@ -0,0 +1,61 @@ +/* Internal definitions for pthreads library. + Copyright (C) 2000, 2002, 2005, 2007, 2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _PT_SYSDEP_H +#define _PT_SYSDEP_H 1 + +#include +#include +#include + +/* XXX */ +#define _POSIX_THREAD_THREADS_MAX 64 + +/* The default stack size: 2MB. */ +#define PTHREAD_STACK_DEFAULT (2 * 1024 * 1024) + +#include + +#define EXCEPTION_AREA_SIZE EXCEPTION_STACK_SIZE +#define EXCEPTION_AREA_SIZE_LOG2 EXCEPTION_STACK_SIZE_LOG2 +/* The exception page is the first object. */ +#define EXCEPTION_PAGE 0 + +#define PTHREAD_SYSDEP_MEMBERS \ + addr_t object; \ + l4_thread_id_t threadid; \ + addr_t exception_area[EXCEPTION_AREA_SIZE / PAGESIZE]; \ + void *exception_area_va; \ + l4_word_t my_errno; + +extern inline struct __pthread * +__attribute__((__always_inline__)) +_pthread_self (void) +{ + return (struct __pthread *) l4_user_defined_handle (); +} + +extern inline void +__attribute__((__always_inline__)) +__pthread_stack_dealloc (void *stackaddr, size_t stacksize) +{ + munmap (stackaddr, stacksize); +} + +#endif /* pt-sysdep.h */ diff --git a/libpthread/sysdeps/l4/hurd/pt-thread-alloc.c b/libpthread/sysdeps/l4/hurd/pt-thread-alloc.c new file mode 100644 index 0000000..ada7b3b --- /dev/null +++ b/libpthread/sysdeps/l4/hurd/pt-thread-alloc.c @@ -0,0 +1,95 @@ +/* Allocate kernel thread. Viengoos version. + Copyright (C) 2007, 2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include +#include + +#include +#include +#include +#include + +#include + +extern struct hurd_startup_data *__hurd_startup_data; + +extern addr_t meta_data_activity; + +int +__pthread_thread_alloc (struct __pthread *thread) +{ + /* The main thread is already running of course. */ + if (__pthread_num_threads == 1) + { + thread->object = __hurd_startup_data->thread; + thread->threadid = l4_myself (); + return 0; + } + else + { + addr_t exception_area = as_alloc (EXCEPTION_AREA_SIZE_LOG2, 1, true); + + thread->exception_area_va + = ADDR_TO_PTR (addr_extend (exception_area, + 0, EXCEPTION_AREA_SIZE_LOG2)); + + int i; + for (i = 0; i < EXCEPTION_AREA_SIZE / PAGESIZE; i ++) + { + addr_t slot = addr_chop (PTR_TO_ADDR (thread->exception_area_va + + i * PAGESIZE), + PAGESIZE_LOG2); + as_ensure (slot); + + struct storage storage = storage_alloc (ADDR_VOID, cap_page, + STORAGE_LONG_LIVED, + OBJECT_POLICY_DEFAULT, + slot); + if (ADDR_IS_VOID (storage.addr)) + { + int j; + for (j = 0; j < i; j ++) + storage_free (thread->exception_area[j], false); + as_free (exception_area, false); + return EAGAIN; + } + + thread->exception_area[i] = storage.addr; + } + + struct storage storage; + storage = storage_alloc (meta_data_activity, cap_thread, + /* Threads are rarely shortly lived. */ + STORAGE_MEDIUM_LIVED, OBJECT_POLICY_DEFAULT, + ADDR_VOID); + if (ADDR_IS_VOID (storage.addr)) + { + int j; + for (j = 0; j < EXCEPTION_AREA_SIZE / PAGESIZE; j ++) + storage_free (thread->exception_area[j], false); + as_free (exception_area, false); + return EAGAIN; + } + + thread->object = storage.addr; + } + + return 0; +} diff --git a/libpthread/sysdeps/l4/hurd/pt-thread-halt.c b/libpthread/sysdeps/l4/hurd/pt-thread-halt.c new file mode 100644 index 0000000..98fefaa --- /dev/null +++ b/libpthread/sysdeps/l4/hurd/pt-thread-halt.c @@ -0,0 +1,104 @@ +/* Deallocate the kernel thread resources. Viengoos version. + Copyright (C) 2007, 2008 Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +#include + +#include +#include +#include +#include + +/* If we try to deallocate our self, we will end up causing a + deadlock. Thus, when a thread tries to free itself, we add it + here. The next thread to free a thread will free it. */ +ss_mutex_t saved_object_lock; +static addr_t saved_object; + +void +__pthread_thread_halt (struct __pthread *thread, int need_dealloc) +{ + /* We may deallocate THREAD. First save any data we need. */ + + addr_t exception_area[EXCEPTION_AREA_SIZE / PAGESIZE]; + memcpy (exception_area, thread->exception_area, + sizeof (thread->exception_area)); + memset (thread->exception_area, 0, sizeof (thread->exception_area)); + + void *va = thread->exception_area_va; + + addr_t object = thread->object; + l4_thread_id_t tid = thread->threadid; + + if (need_dealloc) + __pthread_dealloc (thread); + + /* The THREAD data structure is no longer valid. */ + thread = NULL; + + /* Deallocate any saved object. */ + ss_mutex_lock (&saved_object_lock); + if (! ADDR_IS_VOID (saved_object)) + { + storage_free (saved_object, false); + saved_object = ADDR_VOID; + } + ss_mutex_unlock (&saved_object_lock); + + /* Free the exception area. */ + + /* Clean up the exception page. */ + exception_page_cleanup + (ADDR_TO_PTR (addr_extend (exception_area[EXCEPTION_PAGE], + 0, PAGESIZE_LOG2))); + + /* Free the storage. */ + int i; + for (i = 0; i < EXCEPTION_AREA_SIZE / PAGESIZE; i ++) + { + assert (! ADDR_IS_VOID (exception_area[i])); + storage_free (exception_area[i], false); + } + + /* And the address space. */ + as_free (addr_chop (PTR_TO_ADDR (va), EXCEPTION_AREA_SIZE_LOG2), false); + + if (tid == l4_myself ()) + /* If we try to storage_free (storage.addr), we will freeze in the + middle. That's no good. We set SAVED_OBJECT to our thread + object and the next thread in will free us. */ + { + ss_mutex_lock (&saved_object_lock); + saved_object = object; + ss_mutex_unlock (&saved_object_lock); + } + else + storage_free (object, false); + + if (tid == l4_myself ()) + { + l4_send_timeout (l4_myself (), L4_NEVER); + panic ("Failed to stop thread %x.%x!", + l4_thread_no (l4_myself ()), l4_version (l4_myself ())); + } + else + thread_stop (object); +} diff --git a/libpthread/sysdeps/l4/hurd/pt-thread-start.c b/libpthread/sysdeps/l4/hurd/pt-thread-start.c new file mode 100644 index 0000000..9db399c --- /dev/null +++ b/libpthread/sysdeps/l4/hurd/pt-thread-start.c @@ -0,0 +1,70 @@ +/* Start thread. L4 version. + Copyright (C) 2007 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include +#include +#include +#include + +#include + +int +__pthread_thread_start (struct __pthread *thread) +{ + error_t err; + + if (__pthread_num_threads == 1) + /* The main thread is already running of course. */ + { + assert (__pthread_total == 1); + assert (l4_is_thread_equal (l4_myself (), thread->threadid)); + l4_set_user_defined_handle ((l4_word_t) thread); + } + else + { + struct hurd_thread_exregs_in in; + struct hurd_thread_exregs_out out; + + in.aspace = ADDR (0, 0); + in.aspace_cap_properties = CAP_PROPERTIES_VOID; + in.aspace_cap_properties_flags = CAP_COPY_COPY_SOURCE_GUARD; + + in.activity = ADDR_VOID; + + in.exception_page = addr_chop (PTR_TO_ADDR (thread->exception_area_va), + PAGESIZE_LOG2); + + in.sp = (l4_word_t) thread->mcontext.sp; + in.ip = (l4_word_t) thread->mcontext.pc; + + in.user_handle = (l4_word_t) thread; + err = rm_thread_exregs (ADDR_VOID, thread->object, + HURD_EXREGS_SET_ASPACE + | HURD_EXREGS_SET_ACTIVITY + | HURD_EXREGS_SET_EXCEPTION_PAGE + | HURD_EXREGS_SET_SP_IP + | HURD_EXREGS_SET_USER_HANDLE + | HURD_EXREGS_START + | HURD_EXREGS_ABORT_IPC, + in, &out); + assert (err == 0); + } + return 0; +} diff --git a/libpthread/sysdeps/l4/hurd/pt-wakeup.c b/libpthread/sysdeps/l4/hurd/pt-wakeup.c new file mode 100644 index 0000000..e568a6f --- /dev/null +++ b/libpthread/sysdeps/l4/hurd/pt-wakeup.c @@ -0,0 +1,46 @@ +/* Wakeup a thread. Viengoos version. + Copyright (C) 2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +#include +#include +#include + +/* Wakeup THREAD. */ +void +__pthread_wakeup (struct __pthread *thread) +{ + /* We need to loop here as the blocked thread may not yet be + blocked! Here's what happens when a thread blocks: it registers + itself as blocked, drops the relevant lock and then actually + blocks (via __pthread_block). This means that after dropping the + lock and before blocking, it may be interrupted and another + thread may try to wake it. */ + long ret; + do + { + ret = futex_wake (&thread->threadid, INT_MAX); + assertx (ret <= 1, "tid: %x, ret: %d", thread->threadid, ret); + + if (ret == 0) + l4_thread_switch (thread->threadid); + } + while (ret == 0); +} diff --git a/libpthread/sysdeps/l4/hurd/sig-sysdep.h b/libpthread/sysdeps/l4/hurd/sig-sysdep.h new file mode 100644 index 0000000..33e1385 --- /dev/null +++ b/libpthread/sysdeps/l4/hurd/sig-sysdep.h @@ -0,0 +1,69 @@ +/* sig-sysdep.h - Hurd system specific header file. + Copyright (C) 2008 Free Software Foundation, Inc. + Written by Neal H. Walfield . + + This file is part of the GNU Hurd. + + The GNU Hurd is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public License + as published by the Free Software Foundation; either version 3 of + the License, or (at your option) any later version. + + The GNU Hurd is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this program. If not, see + . */ + +#include +#include + +struct utcb +{ + l4_word_t saved_sender; + l4_word_t saved_receiver; + l4_word_t saved_timeout; + l4_word_t saved_error_code; + l4_word_t saved_flags; + l4_word_t saved_br0; + l4_msg_t saved_message; +}; + +static inline void +utcb_state_save (struct utcb *buffer) +{ + l4_word_t *utcb = _L4_utcb (); + + buffer->saved_sender = utcb[_L4_UTCB_SENDER]; + buffer->saved_receiver = utcb[_L4_UTCB_RECEIVER]; + buffer->saved_timeout = utcb[_L4_UTCB_TIMEOUT]; + buffer->saved_error_code = utcb[_L4_UTCB_ERROR_CODE]; + buffer->saved_flags = utcb[_L4_UTCB_FLAGS]; + buffer->saved_br0 = utcb[_L4_UTCB_BR0]; + memcpy (&buffer->saved_message, + utcb, L4_NUM_MRS * sizeof (l4_word_t)); +} + +static inline void +utcb_state_restore (struct utcb *buffer) +{ + l4_word_t *utcb = _L4_utcb (); + + utcb[_L4_UTCB_SENDER] = buffer->saved_sender; + utcb[_L4_UTCB_RECEIVER] = buffer->saved_receiver; + utcb[_L4_UTCB_TIMEOUT] = buffer->saved_timeout; + utcb[_L4_UTCB_ERROR_CODE] = buffer->saved_error_code; + utcb[_L4_UTCB_FLAGS] = buffer->saved_flags; + utcb[_L4_UTCB_BR0] = buffer->saved_br0; + memcpy (utcb, &buffer->saved_message, + L4_NUM_MRS * sizeof (l4_word_t)); +} + +#define SIGNAL_DISPATCH_ENTRY \ + struct utcb buffer; utcb_state_save (&buffer); + +#define SIGNAL_DISPATCH_EXIT \ + utcb_state_restore (&buffer); diff --git a/libpthread/sysdeps/l4/hurd/sigprocmask.c b/libpthread/sysdeps/l4/hurd/sigprocmask.c new file mode 100644 index 0000000..a38b379 --- /dev/null +++ b/libpthread/sysdeps/l4/hurd/sigprocmask.c @@ -0,0 +1,41 @@ +/* sigprocmask.c - Generic sigprocmask implementation. + Copyright (C) 2008 Free Software Foundation, Inc. + Written by Neal H. Walfield . + + This file is part of the GNU Hurd. + + The GNU Hurd is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public License + as published by the Free Software Foundation; either version 3 of + the License, or (at your option) any later version. + + The GNU Hurd is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this program. If not, see + . */ + +#include +#include + +int +sigprocmask (int how, const sigset_t *restrict set, sigset_t *restrict old) +{ + struct __pthread *thread = _pthread_self (); + if (! thread) + /* Library is initializing. */ + { + assert (__pthread_num_threads == 1); + + /* We should get the default mask from the startup data structure. */ + if (old) + *old = 0; + + return 0; + } + + return pthread_sigmask (how, set, old); +} diff --git a/libpthread/sysdeps/l4/pt-block.c b/libpthread/sysdeps/l4/pt-block.c new file mode 100644 index 0000000..69e1d35 --- /dev/null +++ b/libpthread/sysdeps/l4/pt-block.c @@ -0,0 +1,47 @@ +/* Block a thread. L4 version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +#include + +#include + +/* Block THREAD. */ +void +__pthread_block (struct __pthread *thread) +{ + debug (5, "%x.%x/%x blocking", + l4_thread_no (thread->threadid), l4_version (thread->threadid), + thread->threadid); + + l4_accept (L4_UNTYPED_WORDS_ACCEPTOR); + l4_msg_tag_t tag = l4_receive (l4_anythread); + if (l4_ipc_failed (tag)) + { + debug (1, "%x.%x failed to block: %d, offset: %x", + l4_thread_no (l4_myself ()), l4_version (l4_myself ()), + (l4_error_code () >> 1) & 0x7, + l4_error_code () >> 4); + assert (! l4_ipc_failed (tag)); + } + else + debug (5, "%x.%x unblocked", + l4_thread_no (thread->threadid), l4_version (thread->threadid)); +} diff --git a/libpthread/sysdeps/l4/pt-docancel.c b/libpthread/sysdeps/l4/pt-docancel.c new file mode 100644 index 0000000..a3965d0 --- /dev/null +++ b/libpthread/sysdeps/l4/pt-docancel.c @@ -0,0 +1,42 @@ +/* Cancel a thread. + Copyright (C) 2002, 2007 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +#include + +static void +call_exit (void) +{ + pthread_exit (0); +} + +int +__pthread_do_cancel (struct __pthread *p) +{ + assert (p->cancel_pending == 1); + assert (p->cancel_state == PTHREAD_CANCEL_ENABLE); + + if (l4_is_thread_equal (l4_myself (), p->threadid)) + call_exit (); + else + l4_start_sp_ip (p->threadid, (l4_word_t) p->mcontext.sp, + (l4_word_t) call_exit); + return 0; +} diff --git a/libpthread/sysdeps/l4/pt-pool-np.c b/libpthread/sysdeps/l4/pt-pool-np.c new file mode 100644 index 0000000..e83022b --- /dev/null +++ b/libpthread/sysdeps/l4/pt-pool-np.c @@ -0,0 +1,54 @@ +/* Thread pool for L4 threads. + Copyright (C) 2004, 2007 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +static pthread_mutex_t pool_lock = PTHREAD_MUTEX_INITIALIZER; + +_L4_thread_id_t pool_list = l4_nilthread; + +/* Add the thread TID to the pthread kernel thread pool. */ +int +pthread_pool_add_np (l4_thread_id_t tid) +{ + __pthread_mutex_lock (&pool_lock); + /* FIXME: Do error checking. */ + l4_set_user_defined_handle_of (tid, pool_list); + pool_list = tid; + __pthread_mutex_unlock (&pool_lock); + + return 0; +} + + +/* Get the first thread from the pool. */ +l4_thread_id_t +pthread_pool_get_np (void) +{ + _L4_thread_id_t tid; + + __pthread_mutex_lock (&pool_lock); + /* FIXME: Do error checking. */ + tid = pool_list; + if (tid != l4_nilthread) + pool_list = l4_user_defined_handle_of (tid); + __pthread_mutex_unlock (&pool_lock); + return tid; +} diff --git a/libpthread/sysdeps/l4/pt-spin.c b/libpthread/sysdeps/l4/pt-spin.c new file mode 100644 index 0000000..b6978b0 --- /dev/null +++ b/libpthread/sysdeps/l4/pt-spin.c @@ -0,0 +1,63 @@ +/* Spin locks. L4 version. + Copyright (C) 2000, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +#include +#include + +/* The default for single processor machines; don't spin, it's + pointless. */ +#ifndef __PTHREAD_SPIN_COUNT +# define __PTHREAD_SPIN_COUNT 1 +#endif + +/* The number of times to spin while trying to lock a spin lock object + before yielding the processor. */ +int __pthread_spin_count = __PTHREAD_SPIN_COUNT; + + +/* Lock the spin lock object LOCK. If the lock is held by another + thread spin until it becomes available. */ +int +_pthread_spin_lock (__pthread_spinlock_t *lock) +{ + l4_time_t timeout; + int i; + + /* Start with a small timeout of 2 microseconds, then back off + exponentially. */ + timeout = l4_time_period (2); + + while (1) + { + for (i = 0; i < __pthread_spin_count; i++) + { + if (__pthread_spin_trylock (lock) == 0) + return 0; + } + l4_sleep (timeout); + + timeout = l4_time_mul2 (timeout); + if (timeout == L4_NEVER) + timeout = L4_TIME_PERIOD_MAX; + } +} + +weak_alias (_pthread_spin_lock, pthread_spin_lock); diff --git a/libpthread/sysdeps/l4/pt-stack-alloc.c b/libpthread/sysdeps/l4/pt-stack-alloc.c new file mode 100644 index 0000000..b7ec12b --- /dev/null +++ b/libpthread/sysdeps/l4/pt-stack-alloc.c @@ -0,0 +1,43 @@ +/* Allocate a new stack. L4 Hurd version. + Copyright (C) 2000, 2007 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +#include + +#include + +/* Allocate a new stack of size STACKSIZE. If successful, store the + address of the newly allocated stack in *STACKADDR and return 0. + Otherwise return an error code (EINVAL for an invalid stack size, + EAGAIN if the system lacked the necessary resources to allocate a + new stack). */ +int +__pthread_stack_alloc (void **stackaddr, size_t stacksize) +{ + void *buffer = mmap (0, stacksize, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + if (buffer == MAP_FAILED) + return EAGAIN; + + *stackaddr = buffer; + + return 0; +} diff --git a/libpthread/sysdeps/l4/pt-thread-alloc.c b/libpthread/sysdeps/l4/pt-thread-alloc.c new file mode 100644 index 0000000..ec69afb --- /dev/null +++ b/libpthread/sysdeps/l4/pt-thread-alloc.c @@ -0,0 +1,43 @@ +/* Allocate kernel thread. L4 version. + Copyright (C) 2003, 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include +#include + +#include + +int +__pthread_thread_alloc (struct __pthread *thread) +{ + error_t err; + + /* The main thread is already running of course. */ + if (__pthread_num_threads == 1) + thread->threadid = l4_myself (); + else + { + thread->threadid = pthread_pool_get_np (); + if (thread->threadid != l4_nilthread) + return 0; + + return EAGAIN; + } + return 0; +} diff --git a/libpthread/sysdeps/l4/pt-thread-dealloc.c b/libpthread/sysdeps/l4/pt-thread-dealloc.c new file mode 100644 index 0000000..c09e486 --- /dev/null +++ b/libpthread/sysdeps/l4/pt-thread-dealloc.c @@ -0,0 +1,32 @@ +/* Deallocate the kernel thread resources. L4 version. + Copyright (C) 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include +#include + +#include + +/* Deallocate any kernel resources associated with THREAD except don't + halt the thread itself. On return, the thread will be marked as + dead and __pthread_halt will be called. */ +void +__pthread_thread_dealloc (struct __pthread *thread) +{ +} diff --git a/libpthread/sysdeps/l4/pt-thread-halt.c b/libpthread/sysdeps/l4/pt-thread-halt.c new file mode 100644 index 0000000..aa2bf43 --- /dev/null +++ b/libpthread/sysdeps/l4/pt-thread-halt.c @@ -0,0 +1,45 @@ +/* Deallocate the kernel thread resources. L4version. + Copyright (C) 2000, 2002, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +#include + +/* Deallocate the kernel thread resources associated with THREAD. */ +void +__pthread_thread_halt (struct __pthread *thread, int need_dealloc) +{ + l4_thread_id_t tid = thread->threadid; + + if (need_dealloc) + __pthread_dealloc (thread); + + /* There is potential race here: once if TID is the current thread, + then once we add TID to the pool, someone can reallocate it + before we call stop. However, to start the thread, the caller + atomically starts and sets the sp and ip, thus, if the stop has + not yet executed at that point, it won't. */ + + if (tid != l4_myself ()) + l4_stop (tid); + pthread_pool_add_np (tid); + if (tid == l4_myself ()) + l4_stop (tid); +} diff --git a/libpthread/sysdeps/l4/pt-thread-start.c b/libpthread/sysdeps/l4/pt-thread-start.c new file mode 100644 index 0000000..144c58b --- /dev/null +++ b/libpthread/sysdeps/l4/pt-thread-start.c @@ -0,0 +1,40 @@ +/* Start thread. L4 version. + Copyright (C) 2003, 2004, 2007 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include +#include + +#include + +/* Start THREAD. Get the kernel thread scheduled and running. */ +int +__pthread_thread_start (struct __pthread *thread) +{ + if (__pthread_num_threads == 1) + /* The main thread is already running of course. */ + { + assert (__pthread_total == 1); + assert (l4_is_thread_equal (l4_myself (), thread->threadid)); + } + else + l4_start_sp_ip (thread->threadid, (l4_word_t) thread->mcontext.sp, + (l4_word_t) thread->mcontext.pc); + return 0; +} diff --git a/libpthread/sysdeps/l4/pt-timedblock.c b/libpthread/sysdeps/l4/pt-timedblock.c new file mode 100644 index 0000000..951644f --- /dev/null +++ b/libpthread/sysdeps/l4/pt-timedblock.c @@ -0,0 +1,36 @@ +/* Block a thread with a timeout. L4 version. + Copyright (C) 2000,02 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include +#include +#include + +#include + +/* Block THREAD. */ +error_t +__pthread_timedblock (struct __pthread *thread, + const struct timespec *abstime, + clockid_t clock_id) +{ +#warning Need gettimeofday to implement properly. + __pthread_block (thread); + return 0; +} diff --git a/libpthread/sysdeps/l4/pt-wakeup.c b/libpthread/sysdeps/l4/pt-wakeup.c new file mode 100644 index 0000000..de37846 --- /dev/null +++ b/libpthread/sysdeps/l4/pt-wakeup.c @@ -0,0 +1,54 @@ +/* Wakeup a thread. L4 version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +#include + +#include + +/* Wakeup THREAD. */ +void +__pthread_wakeup (struct __pthread *thread) +{ + debug (5, "%x.%x/%x waking %x.%x/%x", + l4_thread_no (l4_myself ()), l4_version (l4_myself ()), l4_myself (), + l4_thread_no (thread->threadid), l4_version (thread->threadid), + thread->threadid); + + /* Signal the waiter. */ + l4_msg_t msg; + l4_msg_clear (msg); + l4_msg_set_untyped_words (msg, 0); + l4_msg_load (msg); + + l4_msg_tag_t tag = l4_send (thread->threadid); + if (l4_ipc_failed (tag)) + { + int err = l4_error_code (); + debug (1, "%x.%x failed to wake %x.%x: %s (%d)", + l4_thread_no (l4_myself ()), l4_version (l4_myself ()), + l4_thread_no (thread->threadid), l4_version (thread->threadid), + l4_strerror (err), err); + } + else + debug (5, "%x.%x woke %x.%x", + l4_thread_no (l4_myself ()), l4_version (l4_myself ()), + l4_thread_no (thread->threadid), l4_version (thread->threadid)); +} diff --git a/libpthread/sysdeps/mach/bits/spin-lock-inline.h b/libpthread/sysdeps/mach/bits/spin-lock-inline.h new file mode 100644 index 0000000..f9f7c29 --- /dev/null +++ b/libpthread/sysdeps/mach/bits/spin-lock-inline.h @@ -0,0 +1,90 @@ +/* Definitions of user-visible names for spin locks. + Copyright (C) 1994, 1997, 2002, 2008, 2009 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#ifndef _BITS_SPIN_LOCK_INLINE_H +#define _BITS_SPIN_LOCK_INLINE_H 1 + +#include +#include +#include /* This does all the work. */ + +__BEGIN_DECLS + +#if defined __USE_EXTERN_INLINES || defined _FORCE_INLINES + +# ifndef __EBUSY +# include +# define __EBUSY EBUSY +# endif + +# ifndef __PT_SPIN_INLINE +# define __PT_SPIN_INLINE __extern_inline +# endif + +__PT_SPIN_INLINE int __pthread_spin_destroy (__pthread_spinlock_t *__lock); + +__PT_SPIN_INLINE int +__pthread_spin_destroy (__pthread_spinlock_t *__lock) +{ + return 0; +} + +__PT_SPIN_INLINE int __pthread_spin_init (__pthread_spinlock_t *__lock, + int __pshared); + +__PT_SPIN_INLINE int +__pthread_spin_init (__pthread_spinlock_t *__lock, int __pshared) +{ + *__lock = __PTHREAD_SPIN_LOCK_INITIALIZER; + return 0; +} + +__PT_SPIN_INLINE int __pthread_spin_trylock (__pthread_spinlock_t *__lock); + +__PT_SPIN_INLINE int +__pthread_spin_trylock (__pthread_spinlock_t *__lock) +{ + return __spin_try_lock (__lock) ? 0 : __EBUSY; +} + +__extern_inline int __pthread_spin_lock (__pthread_spinlock_t *__lock); +extern int _pthread_spin_lock (__pthread_spinlock_t *__lock); + +__extern_inline int +__pthread_spin_lock (__pthread_spinlock_t *__lock) +{ + if (__pthread_spin_trylock (__lock)) + return _pthread_spin_lock (__lock); + return 0; +} + +__PT_SPIN_INLINE int __pthread_spin_unlock (__pthread_spinlock_t *__lock); + +__PT_SPIN_INLINE int +__pthread_spin_unlock (__pthread_spinlock_t *__lock) +{ + __spin_unlock (__lock); + return 0; +} + +#endif /* Use extern inlines or force inlines. */ + +__END_DECLS + +#endif /* bits/spin-lock.h */ diff --git a/sysdeps/mach/hurd/bits/libc-tsd.h b/libpthread/sysdeps/mach/bits/spin-lock.h similarity index 57% rename from sysdeps/mach/hurd/bits/libc-tsd.h rename to libpthread/sysdeps/mach/bits/spin-lock.h index 926dd1f..537dac9 100644 --- a/sysdeps/mach/hurd/bits/libc-tsd.h +++ b/libpthread/sysdeps/mach/bits/spin-lock.h @@ -1,5 +1,5 @@ -/* libc-internal interface for thread-specific data. Hurd version. - Copyright (C) 1998,2002,2008 Free Software Foundation, Inc. +/* Definitions of user-visible names for spin locks. + Copyright (C) 1994, 1997, 2002, 2008, 2009 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -17,19 +17,22 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -#ifndef _BITS_LIBC_TSD_H -#define _BITS_LIBC_TSD_H 1 +#ifndef _BITS_SPIN_LOCK_H +#define _BITS_SPIN_LOCK_H 1 -#include +#include +#include /* This does all the work. */ -#define __libc_tsd_define(CLASS, TYPE, KEY) /* nothing, always have threadvars */ +__BEGIN_DECLS -#define __libc_tsd_address(TYPE, KEY) \ - ((TYPE *) __hurd_threadvar_location (_HURD_THREADVAR_##KEY)) +/* The type of a spin lock object. */ +typedef __spin_lock_t __pthread_spinlock_t; -#define __libc_tsd_get(TYPE, KEY) \ - (*__libc_tsd_address (TYPE, KEY)) -#define __libc_tsd_set(TYPE, KEY, VALUE) \ - (*__libc_tsd_address (TYPE, KEY) = (VALUE)) +/* Initializer for a spin lock object. */ +#ifndef __PTHREAD_SPIN_LOCK_INITIALIZER +#error __PTHREAD_SPIN_LOCK_INITIALIZER undefined: should be defined by . +#endif -#endif /* bits/libc-tsd.h */ +__END_DECLS + +#endif /* bits/spin-lock.h */ diff --git a/libpthread/sysdeps/mach/hurd/Implies b/libpthread/sysdeps/mach/hurd/Implies new file mode 100644 index 0000000..16b8348 --- /dev/null +++ b/libpthread/sysdeps/mach/hurd/Implies @@ -0,0 +1 @@ +hurd diff --git a/libpthread/sysdeps/mach/hurd/bits/pthread-np.h b/libpthread/sysdeps/mach/hurd/bits/pthread-np.h new file mode 100644 index 0000000..9817a06 --- /dev/null +++ b/libpthread/sysdeps/mach/hurd/bits/pthread-np.h @@ -0,0 +1,32 @@ +/* Non-portable functions. Hurd on Mach version. + Copyright (C) 2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* + * Never include this file directly; use or instead. + */ + +#ifndef _BITS_PTHREAD_NP_H +#define _BITS_PTHREAD_NP_H 1 + +/* Same as pthread_cond_wait, but for Hurd-specific cancellation. + See hurd_thread_cancel. */ +extern int pthread_hurd_cond_wait_np (pthread_cond_t *__restrict __cond, + pthread_mutex_t *__restrict __mutex); + +#endif /* bits/pthread-np.h */ diff --git a/libpthread/sysdeps/mach/hurd/i386/Implies b/libpthread/sysdeps/mach/hurd/i386/Implies new file mode 100644 index 0000000..d799fa1 --- /dev/null +++ b/libpthread/sysdeps/mach/hurd/i386/Implies @@ -0,0 +1 @@ +ia32 diff --git a/libpthread/sysdeps/mach/hurd/ia32/pt-machdep.c b/libpthread/sysdeps/mach/hurd/ia32/pt-machdep.c new file mode 100644 index 0000000..f3c8cf5 --- /dev/null +++ b/libpthread/sysdeps/mach/hurd/ia32/pt-machdep.c @@ -0,0 +1,83 @@ +/* Machine dependent pthreads code. Hurd/i386 version. + Copyright (C) 2000, 2002, 2007 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +#include +#include +#include +#include +#include + +#define HURD_TLS_DESC_DECL(desc, tcb) \ + struct descriptor desc = \ + { /* low word: */ \ + 0xffff /* limit 0..15 */ \ + | (((unsigned int) (tcb)) << 16) /* base 0..15 */ \ + , /* high word: */ \ + ((((unsigned int) (tcb)) >> 16) & 0xff) /* base 16..23 */ \ + | ((0x12 | 0x60 | 0x80) << 8) /* access = ACC_DATA_W|ACC_PL_U|ACC_P */ \ + | (0xf << 16) /* limit 16..19 */ \ + | ((4 | 8) << 20) /* granularity = SZ_32|SZ_G */ \ + | (((unsigned int) (tcb)) & 0xff000000) /* base 24..31 */ \ + } + +int +__thread_set_pcsptp (thread_t thread, + int set_ip, void *ip, + int set_sp, void *sp, + int set_tp, void *tp) +{ + error_t err; + struct i386_thread_state state; + mach_msg_type_number_t state_count; + + state_count = i386_THREAD_STATE_COUNT; + + err = __thread_get_state (thread, i386_REGS_SEGS_STATE, + (thread_state_t) &state, &state_count); + if (err) + return err; + + if (set_sp) + state.uesp = (unsigned int) sp; + if (set_ip) + state.eip = (unsigned int) ip; + if (set_tp) { + HURD_TLS_DESC_DECL(desc, tp); + int sel; + + asm ("mov %%gs, %w0" : "=q" (sel) : "0" (0)); + if (__builtin_expect (sel, 0x48) & 4) /* LDT selector */ + err = __i386_set_ldt (thread, sel, &desc, 1); + else + err = __i386_set_gdt (thread, &sel, desc); + if (err) + return err; + state.gs = sel; + } + + err = __thread_set_state (thread, i386_REGS_SEGS_STATE, + (thread_state_t) &state, + i386_THREAD_STATE_COUNT); + if (err) + return err; + + return 0; +} diff --git a/libpthread/sysdeps/mach/hurd/ia32/pt-setup.c b/libpthread/sysdeps/mach/hurd/ia32/pt-setup.c new file mode 100644 index 0000000..5420dc8 --- /dev/null +++ b/libpthread/sysdeps/mach/hurd/ia32/pt-setup.c @@ -0,0 +1,108 @@ +/* Setup thread stack. Hurd/i386 version. + Copyright (C) 2000, 2002, 2005, 2007, 2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include +#include + +#include + +/* The stack layout used on the i386 is: + + ----------------- + | ARG | + ----------------- + | START_ROUTINE | + ----------------- + | 0 | + ----------------- + | | + | Fast TSD | + | | + ----------------- + + We need to reserve __hurd_threadvar_max `unsigned long int's' of + (fast) thread-specific data (TSD) for the Hurd. */ + +/* Set up the stack for THREAD, such that it appears as if + START_ROUTINE and ARG were passed to the new thread's entry-point. + Return the stack pointer for the new thread. */ +static void * +stack_setup (struct __pthread *thread, + void *(*start_routine)(void *), void *arg) +{ + error_t err; + uintptr_t *bottom, *top; + + /* Calculate the top of the new stack. */ + bottom = thread->stackaddr; + top = (uintptr_t *) ((uintptr_t) bottom + thread->stacksize); + + /* Next, make room for the TSDs. */ + top -= __hurd_threadvar_max; + + /* Save the self pointer. */ + top[_HURD_THREADVAR_THREAD] = (uintptr_t) thread; + + if (start_routine) + { + /* And then the call frame. */ + top -= 2; + top = (uintptr_t *) ((uintptr_t) top & ~0xf); + top[1] = (uintptr_t) arg; /* Argument to START_ROUTINE. */ + top[0] = (uintptr_t) start_routine; + *--top = 0; /* Fake return address. */ + } + + if (thread->guardsize) + { + err = __vm_protect (__mach_task_self (), (vm_address_t) bottom, + thread->guardsize, 0, 0); + assert_perror (err); + } + + return top; +} + +int +__pthread_setup (struct __pthread *thread, + void (*entry_point)(void *(*)(void *), void *), + void *(*start_routine)(void *), void *arg) +{ + error_t err; + mach_port_t ktid; + + thread->mcontext.pc = entry_point; + thread->mcontext.sp = stack_setup (thread, start_routine, arg); + + thread->tcb->self = thread->kernel_thread; + + ktid = __mach_thread_self (); + if (thread->kernel_thread != ktid) + { + err = __thread_set_pcsptp (thread->kernel_thread, + 1, thread->mcontext.pc, + 1, thread->mcontext.sp, + 1, thread->tcb); + assert_perror (err); + } + __mach_port_deallocate (__mach_task_self (), ktid); + + return 0; +} diff --git a/libpthread/sysdeps/mach/hurd/pt-attr-setstackaddr.c b/libpthread/sysdeps/mach/hurd/pt-attr-setstackaddr.c new file mode 100644 index 0000000..1225ed5 --- /dev/null +++ b/libpthread/sysdeps/mach/hurd/pt-attr-setstackaddr.c @@ -0,0 +1,35 @@ +/* pthread_attr_setstackaddr. Hurd on Mach version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +/* We use fixed sized stacks which require proper alignment. */ +#define __pthread_stacksize __pthread_default_attr.stacksize + +int +pthread_attr_setstackaddr (pthread_attr_t *attr, + void *stackaddr) +{ + if ((long) stackaddr & (__pthread_stacksize - 1)) + return EINVAL; + + attr->stackaddr = stackaddr; + return 0; +} diff --git a/libpthread/sysdeps/mach/hurd/pt-attr-setstacksize.c b/libpthread/sysdeps/mach/hurd/pt-attr-setstacksize.c new file mode 100644 index 0000000..6471c0a --- /dev/null +++ b/libpthread/sysdeps/mach/hurd/pt-attr-setstacksize.c @@ -0,0 +1,35 @@ +/* pthread_attr_setstacksize. Hurd on Mach version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +/* We use fixed sized stacks which require proper alignment. */ +#define __pthread_stacksize __pthread_default_attr.stacksize + +int +pthread_attr_setstacksize (pthread_attr_t *attr, + size_t stacksize) +{ + if (stacksize != __pthread_stacksize) + return EINVAL; + + attr->stacksize = stacksize; + return 0; +} diff --git a/libpthread/sysdeps/mach/hurd/pt-docancel.c b/libpthread/sysdeps/mach/hurd/pt-docancel.c new file mode 100644 index 0000000..105c6fd --- /dev/null +++ b/libpthread/sysdeps/mach/hurd/pt-docancel.c @@ -0,0 +1,64 @@ +/* Cancel a thread. + Copyright (C) 2002, 2007, 2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +#include + +static void +call_exit (void) +{ + pthread_exit (0); +} + +int +__pthread_do_cancel (struct __pthread *p) +{ + mach_port_t ktid; + int me; + + assert (p->cancel_pending == 1); + assert (p->cancel_state == PTHREAD_CANCEL_ENABLE); + + ktid = __mach_thread_self (); + me = p->kernel_thread == ktid; + __mach_port_deallocate (__mach_task_self (), ktid); + + if (me) + call_exit (); + else + { + error_t err; + + err = __thread_suspend (p->kernel_thread); + assert_perror (err); + + err = __thread_abort (p->kernel_thread); + assert_perror (err); + + err = __thread_set_pcsptp (p->kernel_thread, + 1, (void *) call_exit, 0, 0, 0, 0); + assert_perror (err); + + err = __thread_resume (p->kernel_thread); + assert_perror (err); + } + + return 0; +} diff --git a/libpthread/sysdeps/mach/hurd/pt-hurd-cond-wait.c b/libpthread/sysdeps/mach/hurd/pt-hurd-cond-wait.c new file mode 100644 index 0000000..d2b5847 --- /dev/null +++ b/libpthread/sysdeps/mach/hurd/pt-hurd-cond-wait.c @@ -0,0 +1,93 @@ +/* pthread_hurd_cond_wait. Hurd-specific wait on a condition. + Copyright (C) 2012 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include +#include + +#include + +int +pthread_hurd_cond_wait_np (pthread_cond_t *cond, pthread_mutex_t *mutex) +{ + /* This function will be called by hurd_thread_cancel while we are blocked + We wake up all threads blocked on COND, so our thread will wake up and + notice the cancellation flag. */ + void cancel_me (void) + { + pthread_cond_broadcast (cond); + } + struct hurd_sigstate *ss = _hurd_self_sigstate (); + struct __pthread *self = _pthread_self (); + int cancel; + + assert (ss->intr_port == MACH_PORT_NULL); /* Sanity check for signal bugs. */ + + /* Atomically enqueue our thread on the condition variable's queue of + waiters, and mark our sigstate to indicate that `cancel_me' must be + called to wake us up. We must hold the sigstate lock while acquiring + the condition variable's lock and tweaking it, so that + hurd_thread_cancel can never suspend us and then deadlock in + pthread_cond_broadcast waiting for the condition variable's lock. */ + + __spin_lock (&ss->lock); + __pthread_spin_lock (&cond->__lock); + cancel = ss->cancel; + if (cancel) + /* We were cancelled before doing anything. Don't block at all. */ + ss->cancel = 0; + else + { + /* Put us on the queue so that pthread_cond_broadcast will know to wake + us up. */ + __pthread_enqueue (&cond->__queue, self); + /* Tell hurd_thread_cancel how to unblock us. */ + ss->cancel_hook = &cancel_me; + } + __pthread_spin_unlock (&cond->__lock); + __spin_unlock (&ss->lock); + + + if (cancel) + /* Cancelled on entry. Just leave the mutex locked. */ + mutex = NULL; + else + { + /* Now unlock the mutex and block until woken. */ + __pthread_mutex_unlock (mutex); + __pthread_block (self); + } + + __spin_lock (&ss->lock); + /* Clear the hook, now that we are done blocking. */ + ss->cancel_hook = NULL; + /* Check the cancellation flag; we might have unblocked due to + cancellation rather than a normal pthread_cond_signal or + pthread_cond_broadcast (or we might have just happened to get cancelled + right after waking up). */ + cancel |= ss->cancel; + ss->cancel = 0; + __spin_unlock (&ss->lock); + + if (mutex) + /* Reacquire the mutex and return. */ + __pthread_mutex_lock (mutex); + + return cancel; +} diff --git a/libpthread/sysdeps/mach/hurd/pt-init-specific.c b/libpthread/sysdeps/mach/hurd/pt-init-specific.c new file mode 100644 index 0000000..ce866b0 --- /dev/null +++ b/libpthread/sysdeps/mach/hurd/pt-init-specific.c @@ -0,0 +1,29 @@ +/* __pthread_init_specific. Mach version. + Copyright (C) 2002, 2009 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +error_t +__pthread_init_specific (struct __pthread *thread) +{ + thread->thread_specifics = 0; + thread->have_kernel_resources = 0; + return 0; +} diff --git a/libpthread/sysdeps/mach/hurd/pt-sigstate-destroy.c b/libpthread/sysdeps/mach/hurd/pt-sigstate-destroy.c new file mode 100644 index 0000000..8e56c5c --- /dev/null +++ b/libpthread/sysdeps/mach/hurd/pt-sigstate-destroy.c @@ -0,0 +1,28 @@ +/* Destroy the signal state. Hurd on Mach version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +#include + +void +__pthread_sigstate_destroy (struct __pthread *thread) +{ + /* Nothing to do. */ +} diff --git a/libpthread/sysdeps/mach/hurd/pt-sigstate-init.c b/libpthread/sysdeps/mach/hurd/pt-sigstate-init.c new file mode 100644 index 0000000..f8398f4 --- /dev/null +++ b/libpthread/sysdeps/mach/hurd/pt-sigstate-init.c @@ -0,0 +1,51 @@ +/* Initialize the signal state. Hurd on Mach version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include +#include + +#include + +error_t +__pthread_sigstate_init (struct __pthread *thread) +{ + void **location = + (void *) __hurd_threadvar_location_from_sp (_HURD_THREADVAR_SIGSTATE, + thread->stackaddr); + + /* The real initialization happens internally in glibc the first + time that _hurd_self_sigstate is called. */ + *location = 0; + + /* Mark the thread as a global signal receiver so as to conform with + the pthread semantics. However, we must be careful. The first + pthread created is the main thread, during libpthread initialization. + We must not mark it, otherwise the sigprocmask call in + __pthread_create would try to access _hurd_global_sigstate, + which is not initialized yet. When glibc runs _hurdsig_init later + on, the message thread is created, which must not be marked either. */ + if (__pthread_num_threads > 2) + { + struct hurd_sigstate *ss = _hurd_thread_sigstate (thread->kernel_thread); + _hurd_sigstate_set_global_rcv (ss); + } + + return 0; +} diff --git a/libpthread/sysdeps/mach/hurd/pt-sigstate.c b/libpthread/sysdeps/mach/hurd/pt-sigstate.c new file mode 100644 index 0000000..2af3e39 --- /dev/null +++ b/libpthread/sysdeps/mach/hurd/pt-sigstate.c @@ -0,0 +1,77 @@ +/* Set a thread's signal state. Hurd on Mach version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include +#include +#include +#include + +#include + +error_t +__pthread_sigstate (struct __pthread *thread, int how, + const sigset_t *set, sigset_t *oset, + int clear_pending) +{ + error_t err = 0; + struct hurd_sigstate *ss; + sigset_t pending; + + ss = _hurd_thread_sigstate (thread->kernel_thread); + assert (ss); + + _hurd_sigstate_lock (ss); + + if (oset) + *oset = ss->blocked; + + if (set) + switch (how) + { + case SIG_BLOCK: + ss->blocked |= *set; + break; + + case SIG_SETMASK: + ss->blocked = *set; + break; + + case SIG_UNBLOCK: + ss->blocked &= ~*set; + break; + + default: + err = EINVAL; + break; + } + + if (! err && clear_pending) + __sigemptyset (&ss->pending); + + pending = _hurd_sigstate_pending (ss) & ~ss->blocked; + _hurd_sigstate_unlock (ss); + + if (! err && pending) + /* Send a message to the signal thread so it + will wake up and check for pending signals. */ + __msg_sig_post (_hurd_msgport, 0, 0, __mach_task_self ()); + + return err; +} diff --git a/libpthread/sysdeps/mach/hurd/pt-sysdep.c b/libpthread/sysdeps/mach/hurd/pt-sysdep.c new file mode 100644 index 0000000..0471192 --- /dev/null +++ b/libpthread/sysdeps/mach/hurd/pt-sysdep.c @@ -0,0 +1,86 @@ +/* System dependent pthreads code. Hurd version. + Copyright (C) 2000, 2002, 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include +#include + +#include +#include + +#include + +#include + +/* Allow programs that know about this library to override the default stack + size. + + FIXME Stack sizes should normally be set at thread creation time using the + standard interface, but Hurd threadvars have special alignment constraints. + Until they are completely replaced with correct TLS, make this hack + available. */ +extern size_t __pthread_stack_default_size; +weak_extern(__pthread_stack_default_size); + +/* Forward. */ +static void *init_routine (void); + +/* OK, the name of this variable isn't really appropriate, but I don't + want to change it yet. */ +void *(*_cthread_init_routine)(void) = &init_routine; + +/* This function is called from the Hurd-specific startup code. It + should return a new stack pointer for the main thread. The caller + will switch to this new stack before doing anything serious. */ +static void * +init_routine (void) +{ + struct __pthread *thread; + int err; + + /* FIXME */ + if (&__pthread_stack_default_size != NULL) + __pthread_default_attr.stacksize = __pthread_stack_default_size; + + /* Initialize the library. */ + __pthread_init (); + + /* Create the pthread structure for the main thread (i.e. us). */ + err = __pthread_create_internal (&thread, 0, 0, 0); + assert_perror (err); + + ((void **) (__hurd_threadvar_stack_offset))[_HURD_THREADVAR_THREAD] + = thread; + + /* Decrease the number of threads, to take into account that the + signal thread (which will be created by the glibc startup code + when we return from here) shouldn't be seen as a user thread. */ + __pthread_total--; + + /* Make MiG code thread aware. */ + __mig_init (thread->stackaddr); + + /* Make sure we can find the per-thread variables. */ + __hurd_threadvar_stack_mask = ~(__pthread_default_attr.stacksize - 1); + __hurd_threadvar_stack_offset + = (__pthread_default_attr.stacksize + - __hurd_threadvar_max * sizeof (uintptr_t)); + + return thread->mcontext.sp; +} diff --git a/libpthread/sysdeps/mach/hurd/pt-sysdep.h b/libpthread/sysdeps/mach/hurd/pt-sysdep.h new file mode 100644 index 0000000..13e235d --- /dev/null +++ b/libpthread/sysdeps/mach/hurd/pt-sysdep.h @@ -0,0 +1,72 @@ +/* Internal defenitions for pthreads library. + Copyright (C) 2000, 2002, 2007, 2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _PT_SYSDEP_H +#define _PT_SYSDEP_H 1 + +#include + +#include + +/* XXX */ +#define _POSIX_THREAD_THREADS_MAX 64 + +/* The default stack size. */ +#define PTHREAD_STACK_DEFAULT (2 * 1024 * 1024) + +#define PTHREAD_SYSDEP_MEMBERS \ + thread_t kernel_thread; \ + mach_msg_header_t wakeupmsg; \ + int have_kernel_resources; + +#define _HURD_THREADVAR_THREAD _HURD_THREADVAR_DYNAMIC_USER + +#define _pthread_self() \ + ({ \ + struct __pthread *thread; \ + \ + assert (__pthread_threads); \ + thread = *(struct __pthread **) \ + __hurd_threadvar_location (_HURD_THREADVAR_THREAD); \ + \ + assert (thread); \ + assert (({ mach_port_t ktid = __mach_thread_self (); \ + int ok = thread->kernel_thread == ktid; \ + __mach_port_deallocate (__mach_task_self (), ktid);\ + ok; })); \ + thread; \ + }) + +extern inline void +__attribute__((__always_inline__)) +__pthread_stack_dealloc (void *stackaddr, size_t stacksize) +{ + __vm_deallocate (__mach_task_self (), (vm_offset_t) stackaddr, stacksize); +} + +/* Change thread THREAD's program counter to PC if SET_PC is true, + its stack pointer to SP if SET_IP is true, and its thread pointer + to TP if SET_TP is true. */ +extern int __thread_set_pcsptp (thread_t thread, + int set_pc, void *pc, + int set_sp, void *sp, + int set_tp, void *tp); + + +#endif /* pt-sysdep.h */ diff --git a/libpthread/sysdeps/mach/pt-block.c b/libpthread/sysdeps/mach/pt-block.c new file mode 100644 index 0000000..a947b27 --- /dev/null +++ b/libpthread/sysdeps/mach/pt-block.c @@ -0,0 +1,39 @@ +/* Block a thread. Mach version. + Copyright (C) 2000 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +#include +#include + +#include + +/* Block THREAD. */ +void +__pthread_block (struct __pthread *thread) +{ + mach_msg_header_t msg; + error_t err; + + err = __mach_msg (&msg, MACH_RCV_MSG, 0, sizeof msg, + thread->wakeupmsg.msgh_remote_port, + MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL); + assert_perror (err); +} diff --git a/libpthread/sysdeps/mach/pt-spin.c b/libpthread/sysdeps/mach/pt-spin.c new file mode 100644 index 0000000..d9a2a32 --- /dev/null +++ b/libpthread/sysdeps/mach/pt-spin.c @@ -0,0 +1,36 @@ +/* Spin locks. Mach version. + Copyright (C) 2002, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +/* In glibc. */ +extern void __spin_lock_solid (__pthread_spinlock_t *lock); + +/* Lock the spin lock object LOCK. If the lock is held by another + thread spin until it becomes available. */ +int +_pthread_spin_lock (__pthread_spinlock_t *lock) +{ + __spin_lock_solid (lock); + return 0; +} + +weak_alias (_pthread_spin_lock, pthread_spin_lock); +weak_alias (_pthread_spin_lock, __pthread_spin_lock); diff --git a/libpthread/sysdeps/mach/pt-stack-alloc.c b/libpthread/sysdeps/mach/pt-stack-alloc.c new file mode 100644 index 0000000..0956fc7 --- /dev/null +++ b/libpthread/sysdeps/mach/pt-stack-alloc.c @@ -0,0 +1,74 @@ +/* Allocate a new stack. Mach version. + Copyright (C) 2000,02 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +#include +#include + +#include + +#define __pthread_stacksize __pthread_default_attr.stacksize + +/* The next address to use for stack allocation. */ +static vm_address_t next_stack_base = VM_MIN_ADDRESS; + + +/* Allocate a new stack of size STACKSIZE. If successful, store the + address of the newly allocated stack in *STACKADDR and return 0. + Otherwise return an error code (EINVAL for an invalid stack size, + EAGAIN if the system lacked the necessary resources to allocate a + new stack). */ +int +__pthread_stack_alloc (void **stackaddr, size_t stacksize) +{ + vm_offset_t base; + int i = 0; + + if (stacksize != __pthread_stacksize) + return EINVAL; + + get_stack: + i ++; + for (base = next_stack_base; + base < VM_MAX_ADDRESS + && __vm_allocate (__mach_task_self (), &base, + __pthread_stacksize, FALSE) != KERN_SUCCESS; + base += __pthread_stacksize) + ; + + if (base >= VM_MAX_ADDRESS) + { + if (i == 1) + { + next_stack_base = VM_MIN_ADDRESS; + goto get_stack; + } + else + return EAGAIN; + } + + if (base >= VM_MAX_ADDRESS) + return EAGAIN; + + next_stack_base = base + __pthread_stacksize; + + (*stackaddr) = (void *) base; + return 0; +} diff --git a/libpthread/sysdeps/mach/pt-thread-alloc.c b/libpthread/sysdeps/mach/pt-thread-alloc.c new file mode 100644 index 0000000..3d7c046 --- /dev/null +++ b/libpthread/sysdeps/mach/pt-thread-alloc.c @@ -0,0 +1,106 @@ +/* Start thread. Mach version. + Copyright (C) 2000, 2002, 2005, 2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include +#include + +#include + +#include + +/* Prepare a wakeup message. */ +static error_t +create_wakeupmsg (struct __pthread *thread) +{ + kern_return_t err; + + /* Build wakeup message. */ + thread->wakeupmsg.msgh_bits = MACH_MSGH_BITS (MACH_MSG_TYPE_COPY_SEND, 0); + thread->wakeupmsg.msgh_size = 0; + + err = __mach_port_allocate (__mach_task_self (), MACH_PORT_RIGHT_RECEIVE, + &thread->wakeupmsg.msgh_remote_port); + if (err) + return EAGAIN; + + thread->wakeupmsg.msgh_local_port = MACH_PORT_NULL; + thread->wakeupmsg.msgh_seqno = 0; + thread->wakeupmsg.msgh_id = 0; + + err = __mach_port_insert_right (__mach_task_self (), + thread->wakeupmsg.msgh_remote_port, + thread->wakeupmsg.msgh_remote_port, + MACH_MSG_TYPE_MAKE_SEND); + if (err) + { + __mach_port_destroy (__mach_task_self (), + thread->wakeupmsg.msgh_remote_port); + return EAGAIN; + } + + return 0; +} + +/* Allocate any resouces for THREAD. The new kernel thread should not + be eligible to be scheduled. */ +int +__pthread_thread_alloc (struct __pthread *thread) +{ + if (thread->have_kernel_resources) + return 0; + + error_t err; + + err = create_wakeupmsg (thread); + if (err) + return err; + + /* If there are no pthreads in the system then the pthread library + is bootstrapping and the main thread must create initialize + itself. The thread itself is already running, it just has not + pthread context. We want to reuse what it already has (including + the kernel thread), however, we must determine which thread is + the main thread. + + We cannot test if __pthread_total is one as we later decrement + before creating the signal thread. Currently, we check if + __pthread_num_threads--the number of allocated thread + structures--is one. __pthread_alloc has already been called in + __pthread_create_internal for us. This predicate could be improved, + however, it is sufficient for now. */ + if (__pthread_num_threads == 1) + { + assert (__pthread_total == 0); + thread->kernel_thread = __mach_thread_self (); + /* We implicitly hold a reference drop the one that we just + acquired. */ + __mach_port_deallocate (__mach_task_self (), thread->kernel_thread); + } + else + { + err = __thread_create (__mach_task_self (), &thread->kernel_thread); + if (err) + return EAGAIN; + } + + thread->have_kernel_resources = 1; + + return 0; +} diff --git a/libpthread/sysdeps/mach/pt-thread-dealloc.c b/libpthread/sysdeps/mach/pt-thread-dealloc.c new file mode 100644 index 0000000..0c4a4fc --- /dev/null +++ b/libpthread/sysdeps/mach/pt-thread-dealloc.c @@ -0,0 +1,43 @@ +/* Deallocate the kernel thread resources. Mach version. + Copyright (C) 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include +#include + +#include + +/* Deallocate any kernel resources associated with THREAD except don't + halt the thread itself. On return, the thread will be marked as + dead and __pthread_halt will be called. */ +void +__pthread_thread_dealloc (struct __pthread *thread) +{ + /* Why no assert? Easy. When Mach kills a task, it starts by + invalidating the task port and then terminating the threads one + by one. But while it is terminating them, they are still + eligible to be scheduled. Imagine we have two threads, one calls + exit, one calls pthread_exit. The second one may run this after + the mask port can been destroyed thus gratuitously triggering the + assert. */ + __mach_port_destroy (__mach_task_self (), + thread->wakeupmsg.msgh_remote_port); + + thread->have_kernel_resources = 0; +} diff --git a/libpthread/sysdeps/mach/pt-thread-halt.c b/libpthread/sysdeps/mach/pt-thread-halt.c new file mode 100644 index 0000000..808043d --- /dev/null +++ b/libpthread/sysdeps/mach/pt-thread-halt.c @@ -0,0 +1,54 @@ +/* Deallocate the kernel thread resources. Mach version. + Copyright (C) 2000, 2002, 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include +#include + +#include + +/* Stop the kernel thread associated with THREAD. If NEED_DEALLOC is + true, the function must call __pthread_dealloc on THREAD. + + NB: The thread executing this function may be the thread which is + being halted, thus the last action should be halting the thread + itself. */ +void +__pthread_thread_halt (struct __pthread *thread) +{ + if (thread->have_kernel_resources) + { + _hurd_sigstate_delete (thread->kernel_thread); + + if (thread == _pthread_self ()) + { + while (1) + { + error_t err = __thread_suspend (thread->kernel_thread); + assert_perror (err); + assert (! "Failed to suspend self."); + } + } + else + { + error_t err = __thread_terminate (thread->kernel_thread); + assert_perror (err); + } + } +} diff --git a/libpthread/sysdeps/mach/pt-thread-start.c b/libpthread/sysdeps/mach/pt-thread-start.c new file mode 100644 index 0000000..11b017f --- /dev/null +++ b/libpthread/sysdeps/mach/pt-thread-start.c @@ -0,0 +1,49 @@ +/* Start thread. Mach version. + Copyright (C) 2000,02 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include +#include + +#include + +/* Start THREAD. Get the kernel thread scheduled and running. */ +int +__pthread_thread_start (struct __pthread *thread) +{ + error_t err; + + if (__pthread_num_threads == 1) + { + /* The main thread is already running: do nothing. */ + assert (__pthread_total == 1); + assert (({ mach_port_t ktid = __mach_thread_self (); + int ok = thread->kernel_thread == ktid; + __mach_port_deallocate (__mach_task_self (), + thread->kernel_thread); + ok; })); + } + else + { + err = __thread_resume (thread->kernel_thread); + assert_perror (err); + } + + return 0; +} diff --git a/libpthread/sysdeps/mach/pt-timedblock.c b/libpthread/sysdeps/mach/pt-timedblock.c new file mode 100644 index 0000000..88beaa2 --- /dev/null +++ b/libpthread/sysdeps/mach/pt-timedblock.c @@ -0,0 +1,69 @@ +/* Block a thread with a timeout. Mach version. + Copyright (C) 2000, 2002, 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include +#include +#include + +#include +#include + +#include + +/* Block THREAD. */ +error_t +__pthread_timedblock (struct __pthread *thread, + const struct timespec *abstime, + clockid_t clock_id) +{ + error_t err; + mach_msg_header_t msg; + mach_msg_timeout_t timeout; + struct timeval now; + + /* We have an absolute time and now we have to convert it to a + relative time. Arg. */ + + err = gettimeofday(&now, NULL); + assert (! err); + + if (now.tv_sec > abstime->tv_sec + || (now.tv_sec == abstime->tv_sec + && now.tv_usec > ((abstime->tv_nsec + 999) / 1000))) + return ETIMEDOUT; + + timeout = (abstime->tv_sec - now.tv_sec) * 1000; + + if (((abstime->tv_nsec + 999) / 1000) >= now.tv_usec) + timeout += (((abstime->tv_nsec + 999) / 1000) - now.tv_usec + 999) / 1000; + else + /* Need to do a carry. */ + timeout -= (now.tv_usec + 999) / 1000 - + ((abstime->tv_nsec + 999999) / 1000000); + + err = __mach_msg (&msg, MACH_RCV_MSG | MACH_RCV_TIMEOUT, 0, + sizeof msg, thread->wakeupmsg.msgh_remote_port, + timeout, MACH_PORT_NULL); + if (err == EMACH_RCV_TIMED_OUT) + return ETIMEDOUT; + + assert_perror (err); + return 0; +} diff --git a/libpthread/sysdeps/mach/pt-wakeup.c b/libpthread/sysdeps/mach/pt-wakeup.c new file mode 100644 index 0000000..4920d10 --- /dev/null +++ b/libpthread/sysdeps/mach/pt-wakeup.c @@ -0,0 +1,38 @@ +/* Wakeup a thread. Mach version. + Copyright (C) 2000, 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +#include +#include + +#include + +/* Wakeup THREAD. */ +void +__pthread_wakeup (struct __pthread *thread) +{ + error_t err; + + err = __mach_msg (&thread->wakeupmsg, MACH_SEND_MSG, + sizeof (thread->wakeupmsg), 0, MACH_PORT_NULL, + MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL); + assert_perror (err); +} diff --git a/libpthread/sysdeps/posix/pt-spin.c b/libpthread/sysdeps/posix/pt-spin.c new file mode 100644 index 0000000..cb809c6 --- /dev/null +++ b/libpthread/sysdeps/posix/pt-spin.c @@ -0,0 +1,54 @@ +/* Spin locks. + Copyright (C) 2000, 2004, 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +/* The default for single processor machines; don't spin, it's + pointless. */ +#ifndef __PTHREAD_SPIN_COUNT +# define __PTHREAD_SPIN_COUNT 1 +#endif + +/* The number of times to spin while trying to lock a spin lock object + before yielding the processor. */ +int __pthread_spin_count = __PTHREAD_SPIN_COUNT; + + +/* Lock the spin lock object LOCK. If the lock is held by another + thread spin until it becomes available. */ +int +_pthread_spin_lock (__pthread_spinlock_t *lock) +{ + int i; + + while (1) + { + for (i = 0; i < __pthread_spin_count; i++) + { + if (__pthread_spin_trylock (lock) == 0) + return 0; + } + + __sched_yield (); + } +} + +weak_alias (_pthread_spin_lock, pthread_spin_lock); +weak_alias (_pthread_spin_lock, __pthread_spin_lock); diff --git a/libpthread/sysdeps/powerpc/bits/machine-lock.h b/libpthread/sysdeps/powerpc/bits/machine-lock.h new file mode 100644 index 0000000..cba6b0a --- /dev/null +++ b/libpthread/sysdeps/powerpc/bits/machine-lock.h @@ -0,0 +1,78 @@ +/* Machine-specific definition for spin locks. PowerPC version. + Copyright (C) 1994,97,2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#ifndef _MACHINE_LOCK_H +#define _MACHINE_LOCK_H + +/* The type of a spin lock variable. */ + +typedef __volatile long int __spin_lock_t; + +/* Value to initialize `__spin_lock_t' variables to. */ + +#define __SPIN_LOCK_INITIALIZER 0L + + +#ifndef _EXTERN_INLINE +#define _EXTERN_INLINE extern __inline +#endif + +/* Unlock LOCK. */ + +_EXTERN_INLINE void +__spin_unlock (__spin_lock_t *__lock) +{ + long int __locked; + __asm__ __volatile__ ("\ +0: lwarx %0,0,%1\n\ + stwcx. %2,0,%1\n\ + bne- 0b\n\ +" : "=&r" (__locked) : "r" (__lock), "r" (0) : "cr0"); +} + +/* Try to lock LOCK; return nonzero if we locked it, zero if another has. */ + +_EXTERN_INLINE int +__spin_try_lock (register __spin_lock_t *__lock) +{ + long int __rtn; + __asm__ __volatile__ ("\ +0: lwarx %0,0,%1\n\ + stwcx. %2,0,%1\n\ + bne- 0b\n\ +" : "=&r" (__rtn) : "r" (__lock), "r" (1) : "cr0"); + return !__rtn; +} + +/* Return nonzero if LOCK is locked. */ + +_EXTERN_INLINE int +__spin_lock_locked (__spin_lock_t *__lock) +{ + long int __rtn; + __asm__ __volatile__ ("\ +0: lwarx %0,0,%1\n\ + stwcx. %0,0,%1\n\ + bne- 0b\n\ +" : "=&r" (__rtn) : "r" (__lock) : "cr0"); + return __rtn; +} + + +#endif /* machine-lock.h */ diff --git a/libpthread/sysdeps/powerpc/bits/memory.h b/libpthread/sysdeps/powerpc/bits/memory.h new file mode 100644 index 0000000..96624c3 --- /dev/null +++ b/libpthread/sysdeps/powerpc/bits/memory.h @@ -0,0 +1,36 @@ +/* Memory barrier operations. PowerPC version. + Copyright (C) 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _BITS_MEMORY_H +#define _BITS_MEMORY_H 1 + +/* Prevent read and write reordering across this function. */ +inline void +__memory_barrier (void) +{ + asm ("sync" ::: "memory"); +} + +/* Prevent read reordering across this function. */ +#define __memory_read_barrier __memory_barrier + +/* Prevent write reordering across this function. */ +#define __memory_write_barrier __memory_barrier + +#endif diff --git a/libpthread/sysdeps/powerpc/bits/spin-lock.h b/libpthread/sysdeps/powerpc/bits/spin-lock.h new file mode 100644 index 0000000..1dc2571 --- /dev/null +++ b/libpthread/sysdeps/powerpc/bits/spin-lock.h @@ -0,0 +1,108 @@ +/* Machine-specific definitions for spin locks. PowerPC version. + Copyright (C) 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* + * Never include this file directly; use or instead. + */ + +#ifndef _BITS_SPIN_LOCK_H +#define _BITS_SPIN_LOCK_H 1 + +#include + +__BEGIN_DECLS + +/* The type of a spin lock object. */ +typedef __volatile int __pthread_spinlock_t; + +/* Initializer for a spin lock object. */ +# define __SPIN_LOCK_INITIALIZER ((__pthread_spinlock_t) 0) + +#if defined __USE_EXTERN_INLINES || defined _FORCE_INLINES + +# ifndef __EBUSY +# include +# define __EBUSY EBUSY +# endif + +# ifndef __PT_SPIN_INLINE +# define __PT_SPIN_INLINE extern __inline +# endif + +__PT_SPIN_INLINE int __pthread_spin_destroy (__pthread_spinlock_t *__lock); + +__PT_SPIN_INLINE int +__pthread_spin_destroy (__pthread_spinlock_t *__lock) +{ + return 0; +} + +__PT_SPIN_INLINE int __pthread_spin_init (__pthread_spinlock_t *__lock, + int __pshared); + +__PT_SPIN_INLINE int +__pthread_spin_init (__pthread_spinlock_t *__lock, int __pshared) +{ + *__lock = __SPIN_LOCK_INITIALIZER; + return 0; +} + +__PT_SPIN_INLINE int __pthread_spin_trylock (__pthread_spinlock_t *__lock); + +__PT_SPIN_INLINE int +__pthread_spin_trylock (__pthread_spinlock_t *__lock) +{ + long int __rtn; + __asm__ __volatile__ ("\ +0: lwarx %0,0,%1\n\ + stwcx. %2,0,%1\n\ + bne- 0b\n\ +" : "=&r" (__rtn) : "r" (__lock), "r" (1) : "cr0"); + return __rtn ? __EBUSY : 0; +} + +extern inline int __pthread_spin_lock (__pthread_spinlock_t *__lock); +extern int _pthread_spin_lock (__pthread_spinlock_t *__lock); + +extern inline int +__pthread_spin_lock (__pthread_spinlock_t *__lock) +{ + if (__pthread_spin_trylock (__lock)) + return _pthread_spin_lock (__lock); + return 0; +} + +__PT_SPIN_INLINE int __pthread_spin_unlock (__pthread_spinlock_t *__lock); + +__PT_SPIN_INLINE int +__pthread_spin_unlock (__pthread_spinlock_t *__lock) +{ + long int __locked; + __asm__ __volatile__ ("\ +0: lwarx %0,0,%1\n\ + stwcx. %2,0,%1\n\ + bne- 0b\n\ +" : "=&r" (__locked) : "r" (__lock), "r" (0) : "cr0"); +} + +#endif /* Use extern inlines or force inlines. */ + +__END_DECLS + +#endif /* bits/spin-lock.h */ diff --git a/sysdeps/mach/hurd/dl-cache.c b/libpthread/sysdeps/powerpc/machine-sp.h similarity index 66% rename from sysdeps/mach/hurd/dl-cache.c rename to libpthread/sysdeps/powerpc/machine-sp.h index f7ad3a8..aa787c5 100644 --- a/sysdeps/mach/hurd/dl-cache.c +++ b/libpthread/sysdeps/powerpc/machine-sp.h @@ -1,5 +1,5 @@ -/* Stubby version of dl-cache; the Hurd doesn't support this "feature". - Copyright (C) 1996, 1997 Free Software Foundation, Inc. +/* Machine-specific function to return the stack pointer. i386 version. + Copyright (C) 1994,97,2001 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -17,13 +17,15 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -const char * -_dl_load_cache_lookup (const char *name) -{ - return 0; -} +#ifndef _MACHINE_SP_H +#define _MACHINE_SP_H -void -_dl_unload_cache (void) -{ -} +/* Return the current stack pointer. */ + +#define __thread_stack_pointer() ({ \ + void *__sp__; \ + __asm__ ("mr %0, 1" : "=r" (__sp__)); \ + __sp__; \ +}) + +#endif /* machine-sp.h */ diff --git a/libpthread/sysdeps/powerpc/pt-machdep.h b/libpthread/sysdeps/powerpc/pt-machdep.h new file mode 100644 index 0000000..6d45636 --- /dev/null +++ b/libpthread/sysdeps/powerpc/pt-machdep.h @@ -0,0 +1,29 @@ +/* Machine dependent pthreads internal defenitions. i386 version. + Copyright (C) 2000 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _PT_MACHDEP_H +#define _PT_MACHDEP_H 1 + +struct pthread_mcontext +{ + void *pc; + void *sp; +}; + +#endif /* pt-machdep.h */ diff --git a/libpthread/tests/.cvsignore b/libpthread/tests/.cvsignore new file mode 100644 index 0000000..70845e0 --- /dev/null +++ b/libpthread/tests/.cvsignore @@ -0,0 +1 @@ +Makefile.in diff --git a/libpthread/tests/Makefile b/libpthread/tests/Makefile new file mode 100644 index 0000000..5ebc01d --- /dev/null +++ b/libpthread/tests/Makefile @@ -0,0 +1,29 @@ +CFLAGS=-Wall -g + +LDLIBS = -lpthread + +CHECK_SRC := test-1.c test-2.c test-3.c test-6.c test-7.c test-8.c \ + test-9.c test-10.c test-11.c test-12.c test-13.c test-14.c \ + test-15.c test-16.c test-17.c test-__pthread_destroy_specific-skip.c + +CHECK_OBJS := $(addsuffix .o,$(basename $(notdir $(CHECK_SRC)))) +CHECK_PROGS := $(basename $(notdir $(CHECK_SRC))) \ + $(addsuffix -static, $(basename $(CHECK_SRC))) + +%-static: %.o + $(CC) -static $(CFLAGS) $(LDFLAGS) $< -o $@ $(LDLIBS) + +check: $(CHECK_OBJS) $(CHECK_PROGS) + for i in $(CHECK_PROGS); do \ + echo -n Running $$i...\ ; \ + if ./$$i 2>&1 > $$i.out; \ + then \ + echo Success.; \ + else \ + echo Failure.; \ + fi \ + done + +clean: + rm -f $(CHECK_OBJS) $(CHECK_PROGS) \ + $(addsuffix .out,$(basename $(notdir $(CHECK_PROGS)))) \ No newline at end of file diff --git a/libpthread/tests/test-1.c b/libpthread/tests/test-1.c new file mode 100644 index 0000000..6ec1afb --- /dev/null +++ b/libpthread/tests/test-1.c @@ -0,0 +1,50 @@ +#define _GNU_SOURCE + +#include +#include +#include +#include +#include +#include + +#define THREADS 500 + +void * +foo (void *arg) +{ + pthread_mutex_t *mutex = arg; + pthread_mutex_lock (mutex); + pthread_mutex_unlock (mutex); + return mutex; +} + +int +main (int argc, char **argv) +{ + int i; + error_t err; + pthread_t tid[THREADS]; + pthread_mutex_t mutex[THREADS]; + + for (i = 0; i < THREADS; i ++) + { + pthread_mutex_init (&mutex[i], 0); + pthread_mutex_lock (&mutex[i]); + err = pthread_create (&tid[i], 0, foo, &mutex[i]); + if (err) + error (1, err, "pthread_create"); + sched_yield (); + } + + for (i = THREADS - 1; i >= 0; i --) + { + void *ret; + pthread_mutex_unlock (&mutex[i]); + err = pthread_join (tid[i], &ret); + if (err) + error (1, err, "pthread_join"); + assert (ret == &mutex[i]); + } + + return 0; +} diff --git a/libpthread/tests/test-10.c b/libpthread/tests/test-10.c new file mode 100644 index 0000000..bec05c1 --- /dev/null +++ b/libpthread/tests/test-10.c @@ -0,0 +1,46 @@ +/* Test error checking mutexes. */ + +#define _GNU_SOURCE + +#include +#include +#include +#include + +int +main (int argc, char **argv) +{ + error_t err; + pthread_mutexattr_t mattr; + pthread_mutex_t mutex; + + err = pthread_mutexattr_init (&mattr); + if (err) + error (1, err, "pthread_mutexattr_init"); + + err = pthread_mutexattr_settype (&mattr, PTHREAD_MUTEX_ERRORCHECK); + if (err) + error (1, err, "pthread_mutexattr_settype"); + + err = pthread_mutex_init (&mutex, &mattr); + if (err) + error (1, err, "pthread_mutex_init"); + + err = pthread_mutexattr_destroy (&mattr); + if (err) + error (1, err, "pthread_mutexattr_destroy"); + + err = pthread_mutex_lock (&mutex); + assert (err == 0); + + err = pthread_mutex_lock (&mutex); + assert (err == EDEADLK); + + err = pthread_mutex_unlock (&mutex); + assert (err == 0); + + err = pthread_mutex_unlock (&mutex); + assert (err == EPERM); + + return 0; +} diff --git a/libpthread/tests/test-11.c b/libpthread/tests/test-11.c new file mode 100644 index 0000000..de779a4 --- /dev/null +++ b/libpthread/tests/test-11.c @@ -0,0 +1,143 @@ +/* Test rwlocks. */ + +#define _GNU_SOURCE + +#include +#include +#include +#include + +#define THREADS 1 + +int a; +int b; + +/* Get a read lock and assert that a == b. */ +void * +test1 (void *arg) +{ + error_t err; + pthread_rwlock_t *lock = arg; + int i; + + for (i = 0; i < 200; i ++) + { + err = pthread_rwlock_rdlock (lock); + assert (err == 0); + + assert (a == b); + + sched_yield (); + + assert (a == b); + + err = pthread_rwlock_unlock (lock); + assert (err == 0); + } + + return 0; +} + +int +main (int argc, char **argv) +{ + error_t err; + pthread_rwlockattr_t attr; + pthread_rwlock_t lock; + int pshared; + + int i; + pthread_t tid[THREADS]; + void *ret; + + err = pthread_rwlockattr_init (&attr); + if (err) + error (1, err, "pthread_rwlockattr_init"); + + err = pthread_rwlockattr_getpshared (&attr, &pshared); + if (err) + error (1, err, "pthread_rwlockattr_getpshared"); + + /* Assert the default state as mandated by POSIX. */ + assert (pshared == PTHREAD_PROCESS_PRIVATE); + + err = pthread_rwlockattr_setpshared (&attr, pshared); + if (err) + error (1, err, "pthread_rwlockattr_setpshared"); + + err = pthread_rwlock_init (&lock, &attr); + if (err) + error (1, err, "pthread_rwlock_init"); + + err = pthread_rwlockattr_destroy (&attr); + if (err) + error (1, err, "pthread_rwlockattr_destroy"); + + /* Now test the lock. */ + + for (i = 0; i < THREADS; i ++) + { + err = pthread_create (&tid[i], 0, test1, &lock); + if (err) + error (1, err, "pthread_create"); + } + + for (i = 0; i < 10; i ++) + { + sched_yield (); + + /* Get a write lock. */ + pthread_rwlock_wrlock (&lock); + /* Increment a and b giving other threads a chance to run in + between. */ + sched_yield (); + a ++; + sched_yield (); + b ++; + sched_yield (); + /* Unlock. */ + pthread_rwlock_unlock (&lock); + } + + for (i = 0; i < THREADS; i ++) + { + err = pthread_join (tid[i], &ret); + if (err) + error (1, err, "pthread_join"); + } + + /* Read lock it. */ + err = pthread_rwlock_tryrdlock (&lock); + assert (err == 0); + + /* Try to write lock it. It should fail with EBUSY. */ + err = pthread_rwlock_trywrlock (&lock); + assert (err == EBUSY); + + /* Drop the read lock. */ + err = pthread_rwlock_unlock (&lock); + assert (err == 0); + + /* Get a write lock. */ + err = pthread_rwlock_trywrlock (&lock); + assert (err == 0); + + /* Fail trying to acquire another write lock. */ + err = pthread_rwlock_trywrlock (&lock); + assert (err == EBUSY); + + /* Try to get a read lock which should also fail. */ + err = pthread_rwlock_tryrdlock (&lock); + assert (err == EBUSY); + + /* Unlock it. */ + err = pthread_rwlock_unlock (&lock); + assert (err == 0); + + + err = pthread_rwlock_destroy (&lock); + if (err) + error (1, err, "pthread_rwlock_destroy"); + + return 0; +} diff --git a/libpthread/tests/test-12.c b/libpthread/tests/test-12.c new file mode 100644 index 0000000..2b78490 --- /dev/null +++ b/libpthread/tests/test-12.c @@ -0,0 +1,29 @@ +/* Test concurrency level. */ + +#define _GNU_SOURCE + +#include +#include +#include +#include + +int +main (int argc, char **argv) +{ + int i; + int err; + + i = pthread_getconcurrency (); + assert (i == 0); + + err = pthread_setconcurrency (-1); + assert (err == EINVAL); + + err = pthread_setconcurrency (4); + assert (err == 0); + + i = pthread_getconcurrency (); + assert (i == 4); + + return 0; +} diff --git a/libpthread/tests/test-13.c b/libpthread/tests/test-13.c new file mode 100644 index 0000000..13b0905 --- /dev/null +++ b/libpthread/tests/test-13.c @@ -0,0 +1,66 @@ +/* Test condition attributes and pthread_cond_timedwait. */ + +#define _GNU_SOURCE + +#include +#include +#include +#include +#include +#include + +int +main (int argc, char **argv) +{ + error_t err; + int i; + pthread_condattr_t attr; + pthread_cond_t cond; + struct timespec ts; + pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; + struct timeval before, after; + int diff; + + err = pthread_condattr_init (&attr); + if (err) + error (1, err, "pthread_condattr_init"); + + err = pthread_condattr_getpshared (&attr, &i); + if (err) + error (1, err, "pthread_condattr_getpshared"); + assert (i == PTHREAD_PROCESS_PRIVATE); + + err = pthread_condattr_setpshared (&attr, PTHREAD_PROCESS_PRIVATE); + assert (err == 0); + + err = pthread_cond_init (&cond, &attr); + if (err) + error (1, err, "pthread_cond_init"); + + err = pthread_condattr_destroy (&attr); + if (err) + error (1, err, "pthread_condattr_destroy"); + + gettimeofday (&before, 0); + ts.tv_sec = before.tv_sec + 1; + ts.tv_nsec = before.tv_usec * 1000; + + printf ("Starting wait @ %d\n", (int) before.tv_sec); + + pthread_mutex_lock (&m); + err = pthread_cond_timedwait (&cond, &m, &ts); + + gettimeofday (&after, 0); + + printf ("End wait @ %d (err = %d)\n", (int) after.tv_sec, err); + + assert (err == ETIMEDOUT); + + diff = after.tv_sec * 1000000 + after.tv_usec + - before.tv_sec * 1000000 - before.tv_usec; + + if (diff < 900000 || diff > 1100000) + error (1, EGRATUITOUS, "pthread_cond_timedwait waited %d us", diff); + + return 0; +} diff --git a/libpthread/tests/test-14.c b/libpthread/tests/test-14.c new file mode 100644 index 0000000..b1dbfa6 --- /dev/null +++ b/libpthread/tests/test-14.c @@ -0,0 +1,44 @@ +/* Test pthread_mutex_timedlock. */ + +#define _GNU_SOURCE + +#include +#include +#include +#include +#include +#include + +int +main (int argc, char **argv) +{ + error_t err; + struct timespec ts; + pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; + struct timeval before, after; + int diff; + + gettimeofday (&before, 0); + ts.tv_sec = before.tv_sec + 1; + ts.tv_nsec = before.tv_usec * 1000; + + printf ("Starting wait @ %d\n", (int) before.tv_sec); + + pthread_mutex_lock (&m); + /* A default mutex shall dead lock if locked twice. As such we do + not need spawn a second thread. */ + err = pthread_mutex_timedlock (&m, &ts); + assert (err == ETIMEDOUT); + + gettimeofday (&after, 0); + + printf ("End wait @ %d\n", (int) after.tv_sec); + + diff = after.tv_sec * 1000000 + after.tv_usec + - before.tv_sec * 1000000 - before.tv_usec; + + if (diff < 900000 || diff > 1100000) + error (1, EGRATUITOUS, "pthread_mutex_timedlock waited %d us", diff); + + return 0; +} diff --git a/libpthread/tests/test-15.c b/libpthread/tests/test-15.c new file mode 100644 index 0000000..173f8b6 --- /dev/null +++ b/libpthread/tests/test-15.c @@ -0,0 +1,87 @@ +/* Test pthread_rwlock_timedrdlock and pthread_rwlock_timedwrlock. */ + +#define _GNU_SOURCE + +#include +#include +#include +#include +#include +#include + +#define THREADS 10 + +pthread_rwlock_t rwlock; + +void * +test (void *arg) +{ + error_t err; + int foo = (int) arg; + struct timespec ts; + struct timeval before, after; + int diff; + + gettimeofday (&before, 0); + ts.tv_sec = before.tv_sec + 1; + ts.tv_nsec = before.tv_usec * 1000; + + printf ("Thread %d starting wait @ %d\n", pthread_self (), + (int) before.tv_sec); + + if (foo % 2 == 0) + err = pthread_rwlock_timedrdlock (&rwlock, &ts); + else + err = pthread_rwlock_timedwrlock (&rwlock, &ts); + + assert (err == ETIMEDOUT); + + gettimeofday (&after, 0); + + printf ("Thread %d ending wait @ %d\n", pthread_self (), + (int) after.tv_sec); + + diff = after.tv_sec * 1000000 + after.tv_usec + - before.tv_sec * 1000000 - before.tv_usec; + + if (diff < 900000 || diff > 1100000) + error (1, EGRATUITOUS, "pthread_mutex_timedlock waited %d us", diff); + + return 0; +} + +int +main (int argc, char **argv) +{ + error_t err; + int i; + pthread_t tid[THREADS]; + + err = pthread_rwlock_init (&rwlock, 0); + if (err) + error (1, err, "pthread_rwlock_init"); + + /* Lock it so all the threads will block. */ + err = pthread_rwlock_wrlock (&rwlock); + assert (err == 0); + + for (i = 0; i < THREADS; i ++) + { + err = pthread_create (&tid[i], 0, test, (void *) i); + if (err) + error (1, err, "pthread_create"); + } + + for (i = 0; i < THREADS; i ++) + { + void *ret; + + err = pthread_join (tid[i], &ret); + if (err) + error (1, err, "pthread_join"); + + assert (ret == 0); + } + + return 0; +} diff --git a/libpthread/tests/test-16.c b/libpthread/tests/test-16.c new file mode 100644 index 0000000..3660f5f --- /dev/null +++ b/libpthread/tests/test-16.c @@ -0,0 +1,71 @@ +/* Test pthread_kill.c. */ + +#define _GNU_SOURCE + +#include +#include +#include +#include +#include +#include +#include + +pthread_t testthread; + +int i; + +void * +test (void *arg) +{ + error_t err; + + printf ("test: %d\n", pthread_self ()); + + err = pthread_kill (pthread_self (), SIGINFO); + if (err) + error (1, err, "pthread_kill"); + + /* To avoid using condition variables in a signal handler. */ + while (i == 0) + sched_yield (); + + return 0; +} + +static void +handler (int sig) +{ + assert (pthread_equal (pthread_self (), testthread)); + printf ("handler: %d\n", pthread_self ()); + i = 1; +} + +int +main (int argc, char **argv) +{ + error_t err; + struct sigaction sa; + void *ret; + + printf ("main: %d\n", pthread_self ()); + + sa.sa_handler = handler; + sa.sa_mask = 0; + sa.sa_flags = 0; + + err = sigaction (SIGINFO, &sa, 0); + if (err) + error (1, err, "sigaction"); + + err = pthread_create (&testthread, 0, test, 0); + if (err) + error (1, err, "pthread_create"); + + err = pthread_join (testthread, &ret); + if (err) + error (1, err, "pthread_join"); + + assert (ret == 0); + + return 0; +} diff --git a/libpthread/tests/test-17.c b/libpthread/tests/test-17.c new file mode 100644 index 0000000..a8bd150 --- /dev/null +++ b/libpthread/tests/test-17.c @@ -0,0 +1,57 @@ +/* Test that the key reuse inside libpthread does not cause thread + specific values to persist. */ + +#define _GNU_SOURCE 1 + +#include +#include +#include +#include + +void +work (int iter) +{ + error_t err; + pthread_key_t key1; + pthread_key_t key2; + void *value1; + void *value2; + + printf ("work/%d: start\n", iter); + err = pthread_key_create (&key1, NULL); + assert (err == 0); + err = pthread_key_create (&key2, NULL); + assert (err == 0); + + value1 = pthread_getspecific (key1); + value2 = pthread_getspecific (key2); + printf ("work/%d: pre-setspecific: %p,%p\n", iter, value1, value2); + assert (value1 == NULL); + assert (value2 == NULL); + err = pthread_setspecific (key1, (void *)(0x100 + iter)); + assert (err == 0); + err = pthread_setspecific (key2, (void *)(0x200 + iter)); + assert (err == 0); + + value1 = pthread_getspecific (key1); + value2 = pthread_getspecific (key2); + printf ("work/%d: post-setspecific: %p,%p\n", iter, value1, value2); + assert (value1 == (void *)(0x100 + iter)); + assert (value2 == (void *)(0x200 + iter)); + + err = pthread_key_delete (key1); + assert (err == 0); + err = pthread_key_delete (key2); + assert (err == 0); +} + +int +main (int argc, char *argv[]) +{ + int i; + + for (i = 0; i < 8; ++i) + work (i + 1); + + return 0; +} diff --git a/libpthread/tests/test-2.c b/libpthread/tests/test-2.c new file mode 100644 index 0000000..701462e --- /dev/null +++ b/libpthread/tests/test-2.c @@ -0,0 +1,39 @@ +/* Test detachability. */ +#define _GNU_SOURCE + +#include +#include +#include +#include +#include + +void * +thread (void *arg) +{ + while (1) + sched_yield (); +} + +int +main (int argc, char **argv) +{ + int err; + pthread_t tid; + void *ret; + + err = pthread_create (&tid, 0, thread, 0); + if (err) + error (1, err, "pthread_create"); + + err = pthread_detach (tid); + if (err) + error (1, err, "pthread_detach"); + + err = pthread_detach (tid); + assert (err == EINVAL); + + err = pthread_join (tid, &ret); + assert (err == EINVAL); + + return 0; +} diff --git a/libpthread/tests/test-3.c b/libpthread/tests/test-3.c new file mode 100644 index 0000000..7db2e43 --- /dev/null +++ b/libpthread/tests/test-3.c @@ -0,0 +1,55 @@ +/* Test the thread attribute get and set methods. */ + +#define _GNU_SOURCE + +#include +#include +#include +#include + +int +main (int argc, char *argv[]) +{ + error_t err; + pthread_attr_t attr; + + int i; + struct sched_param sp; + void *p; + size_t sz; + + err = pthread_attr_init (&attr); + assert_perror (err); + + err = pthread_attr_destroy (&attr); + assert_perror (err); + + err = pthread_attr_init (&attr); + assert_perror (err); + +#define TEST1(foo, rv, v) \ + err = pthread_attr_get##foo (&attr, rv); \ + assert_perror (err); \ + \ + err = pthread_attr_set##foo (&attr, v); \ + assert_perror (err); + +#define TEST(foo, rv, v) TEST1(foo, rv, v) + + TEST(inheritsched, &i, i); + TEST(schedparam, &sp, &sp); + TEST(schedpolicy, &i, i); + TEST(scope, &i, i); + TEST(stackaddr, &p, p); + TEST(detachstate, &i, i); + TEST(guardsize, &sz, sz); + TEST(stacksize, &sz, sz); + + err = pthread_attr_getstack (&attr, &p, &sz); + assert_perror (err); + + err = pthread_attr_setstack (&attr, p, sz); + assert_perror (err); + + return 0; +} diff --git a/libpthread/tests/test-4.c b/libpthread/tests/test-4.c new file mode 100644 index 0000000..de9c8fe --- /dev/null +++ b/libpthread/tests/test-4.c @@ -0,0 +1,86 @@ +/* Test the stack guard. */ + +#define _GNU_SOURCE + +#include +#include +#include +#include +#include +#include + +size_t stacksize; + +void * +thr (void *arg) +{ + int i; + char *foo; + + foo = alloca (3 * stacksize / 4); + for (i = 0; i < sizeof foo; i ++) + foo[i] = -1; + + return (void *) 1; +} + +int +main (int argc, char *argv[]) +{ + error_t err; + pid_t child; + + child = fork (); + switch (child) + { + case -1: + error (1, errno, "fork"); + break; + + case 0: + { + pthread_attr_t attr; + pthread_t tid; + void *ret; + + err = pthread_attr_init (&attr); + assert_perror (err); + + err = pthread_attr_getstacksize (&attr, &stacksize); + assert_perror (err); + + err = pthread_attr_setguardsize (&attr, stacksize / 2); + if (err == ENOTSUP) + { + printf ("Stack guard attribute not supported.\n"); + return 1; + } + assert_perror (err); + + err = pthread_create (&tid, &attr, thr, 0); + assert_perror (err); + + err = pthread_attr_destroy (&attr); + assert_perror (err); + + err = pthread_join (tid, &ret); + /* Should never be successful. */ + printf ("Thread did not segfault!?!\n"); + assert_perror (err); + return 0; + } + + default: + { + pid_t pid; + int status; + + pid = waitpid (child, &status, 0); + printf ("pid = %d; child = %d; status = %d\n", pid, child, status); + assert (pid == child); + assert (status != 0); + } + } + + return 0; +} diff --git a/libpthread/tests/test-5.c b/libpthread/tests/test-5.c new file mode 100644 index 0000000..0f5000b --- /dev/null +++ b/libpthread/tests/test-5.c @@ -0,0 +1,75 @@ +/* Test signals. */ + +#define _GNU_SOURCE + +#include +#include +#include +#include +#include +#include +#include +#include + +void * +thr (void *arg) +{ + * (int *)0 = 0; + return 0; +} + +int foobar; + +int +main (int argc, char *argv[]) +{ + error_t err; + pid_t child; + + struct rlimit limit; + + limit.rlim_cur = 0; + limit.rlim_max = 0; + + err = setrlimit (RLIMIT_CORE, &limit); + if (err) + error (1, err, "setrlimit"); + + child = fork (); + switch (child) + { + case -1: + error (1, errno, "fork"); + break; + + case 0: + { + pthread_t tid; + void *ret; + + err = pthread_create (&tid, 0, thr, 0); + if (err) + error (1, err, "pthread_create"); + + err = pthread_join (tid, &ret); + assert_perror (err); + + /* Should have never returned. Our parent expects us to fail + thus we succeed and indicate the error. */ + return 0; + } + + default: + { + pid_t pid; + int status; + + pid = waitpid (child, &status, 0); + printf ("pid = %d; child = %d; status = %d\n", pid, child, status); + assert (pid == child); + assert (status != 0); + } + } + + return 0; +} diff --git a/libpthread/tests/test-6.c b/libpthread/tests/test-6.c new file mode 100644 index 0000000..edf2919 --- /dev/null +++ b/libpthread/tests/test-6.c @@ -0,0 +1,96 @@ +#define _GNU_SOURCE + +#include +#include +#include +#include +#include + +#define THREADS 500 +#define WAITS 3 + +void * +dowait (void *arg) +{ + pthread_barrier_t *barrier = arg; + int ret; + + ret = pthread_barrier_wait (barrier); + printf ("%d ", pthread_self ()); + return (void *) ret; +} + +int +main (int argc, char **argv) +{ + pthread_barrierattr_t attr; + pthread_barrier_t barrier; + + int i, j; + error_t err; + pthread_t tid[THREADS]; + + int havesyncs; + + err = pthread_barrierattr_init (&attr); + if (err) + error (1, err, "pthread_barrierattr_init"); + + err = pthread_barrierattr_getpshared (&attr, &i); + if (err) + error (1, err, "pthread_barrierattr_getpshared"); + assert (i == PTHREAD_PROCESS_PRIVATE || i == PTHREAD_PROCESS_SHARED); + + err = pthread_barrierattr_setpshared (&attr, PTHREAD_PROCESS_PRIVATE); + if (err) + error (1, err, "pthread_barrierattr_setpshared"); + + err = pthread_barrier_init (&barrier, &attr, THREADS + 1); + if (err) + error (1, err, "pthread_barrier_init"); + + for (j = 0; j < WAITS; j ++) + { + + for (i = 0; i < THREADS; i ++) + { + err = pthread_create (&tid[i], 0, dowait, &barrier); + if (err) + error (1, err, "pthread_create (%d)", i); + } + + printf ("Manager will now call pthread_barrier_wait.\n"); + + havesyncs + = pthread_barrier_wait (&barrier) == PTHREAD_BARRIER_SERIAL_THREAD + ? 1 : 0; + + for (i = THREADS - 1; i >= 0; i --) + { + void *ret; + err = pthread_join (tid[i], &ret); + if (err) + error (1, err, "pthread_join"); + + switch ((int) ret) + { + case 0: + break; + + case PTHREAD_BARRIER_SERIAL_THREAD: + havesyncs ++; + break; + + default: + assert (! "Unknown value returned from pthread_barrier_wait."); + break; + } + } + + printf ("\n"); + + assert (havesyncs == 1); + } + + return 0; +} diff --git a/libpthread/tests/test-7.c b/libpthread/tests/test-7.c new file mode 100644 index 0000000..22fb1ca --- /dev/null +++ b/libpthread/tests/test-7.c @@ -0,0 +1,70 @@ +#define _GNU_SOURCE + +#include +#include +#include +#include +#include + +#define THREADS 10 +#define KEYS 400 + +pthread_key_t key[KEYS]; + +void * +thr (void *arg) +{ + error_t err; + int i; + + for (i = 0; i < KEYS; i ++) + { + printf ("pthread_getspecific(%d).\n", key[i]); + assert (pthread_getspecific (key[i]) == NULL); + printf ("pthread_setspecific(%d, %d).\n", key[i], pthread_self ()); + err = pthread_setspecific (key[i], (void *) pthread_self ()); + printf ("pthread_setspecific(%d, %d) => %d.\n", key[i], pthread_self (), err); + assert_perror (err); + } + + return 0; +} + +int +main (int argc, char **argv) +{ + error_t err; + int i; + pthread_t tid[THREADS]; + + void des (void *val) + { + assert ((pthread_t) val == pthread_self ()); + } + + assert (pthread_getspecific ((pthread_key_t) 0) == NULL); + assert (pthread_setspecific ((pthread_key_t) 0, (void *) 0x1) == EINVAL); + + for (i = 0; i < KEYS; i ++) + err = pthread_key_create (&key[i], des); + + for (i = 0; i < THREADS; i ++) + { + err = pthread_create (&tid[i], 0, thr, 0); + if (err) + error (1, err, "pthread_create (%d)", i); + } + + for (i = 0; i < THREADS; i ++) + { + void *ret; + + err = pthread_join (tid[i], &ret); + if (err) + error (1, err, "pthread_join"); + + assert (ret == 0); + } + + return 0; +} diff --git a/libpthread/tests/test-8.c b/libpthread/tests/test-8.c new file mode 100644 index 0000000..85a7f8f --- /dev/null +++ b/libpthread/tests/test-8.c @@ -0,0 +1,60 @@ +#define _GNU_SOURCE + +#include +#include +#include +#include + +#define THREADS 10 + +pthread_once_t inc_var_once = PTHREAD_ONCE_INIT; +int var; + +void +inc_var (void) +{ + var ++; +} + +void * +thr (void *arg) +{ + int i; + + for (i = 0; i < 500; i ++) + pthread_once (&inc_var_once, inc_var); + + return 0; +} + +int +main (int argc, char **argv) +{ + error_t err; + int i; + pthread_t tid[THREADS]; + + for (i = 0; i < THREADS; i ++) + { + err = pthread_create (&tid[i], 0, thr, 0); + if (err) + error (1, err, "pthread_create (%d)", i); + } + + assert (thr (0) == 0); + + for (i = 0; i < THREADS; i ++) + { + void *ret; + + err = pthread_join (tid[i], &ret); + if (err) + error (1, err, "pthread_join"); + + assert (ret == 0); + } + + assert (var == 1); + + return 0; +} diff --git a/libpthread/tests/test-9.c b/libpthread/tests/test-9.c new file mode 100644 index 0000000..8205157 --- /dev/null +++ b/libpthread/tests/test-9.c @@ -0,0 +1,88 @@ +/* Test recursive mutexes. */ + +#define _GNU_SOURCE + +#include +#include +#include +#include + +#define THREADS 10 + +int foo; + +void * +thr (void *arg) +{ + int i; + + pthread_mutex_lock (arg); + + foo = pthread_self (); + + for (i = 0; i < 500; i ++) + pthread_mutex_lock (arg); + for (i = 0; i < 500; i ++) + pthread_mutex_unlock (arg); + + assert (foo == pthread_self ()); + + pthread_mutex_unlock (arg); + + return 0; +} + +int +main (int argc, char **argv) +{ + error_t err; + int i; + pthread_t tid[THREADS]; + pthread_mutexattr_t mattr; + pthread_mutex_t mutex; + + err = pthread_mutexattr_init (&mattr); + if (err) + error (1, err, "pthread_mutexattr_init"); + + err = pthread_mutexattr_settype (&mattr, PTHREAD_MUTEX_RECURSIVE); + if (err) + error (1, err, "pthread_mutexattr_settype"); + + err = pthread_mutex_init (&mutex, &mattr); + if (err) + error (1, err, "pthread_mutex_init"); + + err = pthread_mutexattr_destroy (&mattr); + if (err) + error (1, err, "pthread_mutexattr_destroy"); + + pthread_mutex_lock (&mutex); + pthread_mutex_lock (&mutex); + pthread_mutex_unlock (&mutex); + pthread_mutex_unlock (&mutex); + + for (i = 0; i < THREADS; i ++) + { + err = pthread_create (&tid[i], 0, thr, &mutex); + if (err) + error (1, err, "pthread_create (%d)", i); + } + + for (i = 0; i < THREADS; i ++) + { + void *ret; + + err = pthread_join (tid[i], &ret); + if (err) + error (1, err, "pthread_join"); + + assert (ret == 0); + } + + err = pthread_mutex_destroy (&mutex); + if (err) + error (1, err, "pthread_mutex_destroy"); + + return 0; +} diff --git a/libpthread/tests/test-__pthread_destroy_specific-skip.c b/libpthread/tests/test-__pthread_destroy_specific-skip.c new file mode 100644 index 0000000..b2c4c0b --- /dev/null +++ b/libpthread/tests/test-__pthread_destroy_specific-skip.c @@ -0,0 +1,83 @@ +/* Check that __pthread_destroy_specific works correctly if it has to skip + unused slots. */ + +#define _GNU_SOURCE + +#include +#include +#include + + +#define N_k 42 + +static volatile int v; + +static void +d (void *x) +{ + int *i = (int *) x; + + if (v != *i) + error (1, 0, "FAILED %d %d", v, *i); + v += 2; + + printf ("%s %d\n", __FUNCTION__, *i); + fflush (stdout); +} + +static void * +test (void *x) +{ + pthread_key_t k[N_k]; + static int k_v[N_k]; + + int err, i; + + for (i = 0; i < N_k; i += 1) + { + err = pthread_key_create (&k[i], &d); + if (err != 0) + error (1, err, "pthread_key_create %d", i); + } + + for (i = 0; i < N_k; i += 1) + { + k_v[i] = i; + err = pthread_setspecific (k[i], &k_v[i]); + if (err != 0) + error (1, err, "pthread_setspecific %d", i); + } + + /* Delete every even key. */ + for (i = 0; i < N_k; i += 2) + { + err = pthread_key_delete (k[i]); + if (err != 0) + error (1, err, "pthread_key_delete %d", i); + } + + v = 1; + pthread_exit (NULL); + + return NULL; +} + + +int main(void) +{ + pthread_t tid; + int err; + + err = pthread_create (&tid, 0, test, NULL); + if (err != 0) + error (1, err, "pthread_create"); + + err = pthread_join(tid, NULL); + if (err) + error (1, err, "pthread_join"); + + if (v != N_k + 1) + error (1, 0, "FAILED END %d %d", v, N_k + 1); + + return 0; +} diff --git a/linuxthreads/Makeconfig b/linuxthreads/Makeconfig index 5470c22..e8ca182 100644 --- a/linuxthreads/Makeconfig +++ b/linuxthreads/Makeconfig @@ -9,3 +9,8 @@ static-thread-library = $(common-objpfx)linuxthreads/libpthread.a bounded-thread-library = $(common-objpfx)linuxthreads/libpthread_b.a rpath-dirs += linuxthreads + +# This makes for ptw-*.? object rules in sysd-rules. +ptw-CPPFLAGS := -DPTW +sysd-rules-patterns += ptw-%:% + diff --git a/linuxthreads/Makefile b/linuxthreads/Makefile index e3f4fc7..ac3cab2 100644 --- a/linuxthreads/Makefile +++ b/linuxthreads/Makefile @@ -51,6 +51,7 @@ libpthread-routines := attr cancel condvar join manager mutex ptfork \ ptw-open ptw-open64 ptw-pause ptw-pread ptw-pread64 \ ptw-pwrite ptw-pwrite64 ptw-tcdrain ptw-wait \ ptw-waitpid pt-system old_pthread_atfork pthread_atfork \ + pthread_condattr_getclock pthread_condattr_setclock \ ptcleanup # pthread_setuid pthread_seteuid pthread_setreuid \ # pthread_setresuid \ @@ -111,7 +112,7 @@ tests = ex1 ex2 ex3 ex4 ex5 ex6 ex7 ex8 ex9 $(librt-tests) ex12 ex13 joinrace \ ex17 ex18 tst-cancel tst-context bug-sleep \ tst-cancel1 tst-cancel2 tst-cancel3 tst-cancel4 tst-cancel5 \ tst-cancel6 tst-cancel7 tst-cancel8 tst-popen tst-popen2 tst-attr1 \ - tst-stack1 tst-align tst-tsd1 tst-sighandler1 tst-sighandler2 + tst-stack1 tst-align tst-tsd1 test-srcs = tst-signal # These tests are linked with libc before libpthread tests-reverse += tst-cancel5 @@ -314,7 +315,8 @@ endif ifeq (yes,$(build-shared)) $(objpfx)tst-_res1mod2.so: $(objpfx)tst-_res1mod1.so -$(objpfx)tst-_res1: $(objpfx)tst-_res1mod2.so $(shared-thread-library) +$(objpfx)tst-_res1: $(objpfx)tst-_res1mod1.so $(objpfx)tst-_res1mod2.so \ + $(shared-thread-library) $(objpfx)tst-tls1: $(objpfx)tst-tls1mod.so $(shared-thread-library) diff --git a/linuxthreads/Versions b/linuxthreads/Versions index 615a132..4acf74d 100644 --- a/linuxthreads/Versions +++ b/linuxthreads/Versions @@ -172,6 +172,9 @@ libpthread { pthread_cond_wait; pthread_cond_timedwait; pthread_cond_signal; pthread_cond_broadcast; } + GLIBC_2.3.3 { + pthread_condattr_getclock; pthread_condattr_setclock; + } # Hey you!! Yes, YOU! Do not add new symbols here! # The linuxthreads libpthread ABI froze at GLIBC_2.3.2 and lacks diff --git a/linuxthreads/condvar.c b/linuxthreads/condvar.c index 6ab95b8..118203b 100644 --- a/linuxthreads/condvar.c +++ b/linuxthreads/condvar.c @@ -31,6 +31,7 @@ int __pthread_cond_init(pthread_cond_t *cond, { __pthread_init_lock(&cond->__c_lock); cond->__c_waiting = NULL; + cond->__clock_id = cond_attr ? cond_attr->__clock_id : CLOCK_REALTIME; return 0; } versioned_symbol (libpthread, __pthread_cond_init, pthread_cond_init, @@ -198,7 +199,7 @@ pthread_cond_timedwait_relative(pthread_cond_t *cond, spurious_wakeup_count = 0; while (1) { - if (!timedsuspend(self, abstime)) { + if (!__pthread_timedsuspend_new_clk(self, abstime, cond->__clock_id)) { int was_on_queue; /* __pthread_lock will queue back any spurious restarts that @@ -312,6 +313,7 @@ compat_symbol (libpthread, __old_pthread_cond_broadcast, int __pthread_condattr_init(pthread_condattr_t *attr) { + attr->__clock_id = CLOCK_REALTIME; return 0; } strong_alias (__pthread_condattr_init, pthread_condattr_init) diff --git a/linuxthreads/descr.h b/linuxthreads/descr.h index 95e4d90..eb5b33d 100644 --- a/linuxthreads/descr.h +++ b/linuxthreads/descr.h @@ -23,6 +23,7 @@ #include #include #include +#include #include /* Fast thread-specific data internal to libc. */ @@ -71,7 +72,7 @@ typedef struct _pthread_extricate_struct { /* Atomic counter made possible by compare_and_swap */ struct pthread_atomic { long p_count; - int p_spinlock; + __atomic_lock_t p_spinlock; }; @@ -123,12 +124,23 @@ struct _pthread_descr_struct uintptr_t sysinfo; uintptr_t stack_guard; uintptr_t pointer_guard; +# ifdef __FreeBSD_kernel__ + long gscope_flag; +# else + int gscope_flag; +# endif } data; void *__padding[16]; } p_header; # define p_multiple_threads p_header.data.multiple_threads +# define p_gscope_flag p_header.data.gscope_flag #elif TLS_MULTIPLE_THREADS_IN_TCB int p_multiple_threads; +# ifdef __FreeBSD_kernel__ + long p_gscope_flag; +# else + int p_gscope_flag; +# endif #endif pthread_descr p_nextlive, p_prevlive; @@ -248,8 +260,8 @@ extern int __pthread_nonstandard_stacks; extern pthread_descr __pthread_find_self (void) __attribute__ ((pure)); -static inline pthread_descr thread_self (void) __attribute__ ((pure)); -static inline pthread_descr thread_self (void) +extern inline pthread_descr thread_self (void) __attribute__ ((pure)); +extern inline pthread_descr thread_self (void) { #ifdef THREAD_SELF return THREAD_SELF; diff --git a/linuxthreads/internals.h b/linuxthreads/internals.h index 6050217..4d16bb1 100644 --- a/linuxthreads/internals.h +++ b/linuxthreads/internals.h @@ -381,6 +381,7 @@ extern int __pthread_timedsuspend_old(pthread_descr self, const struct timespec extern void __pthread_restart_new(pthread_descr th); extern void __pthread_suspend_new(pthread_descr self); extern int __pthread_timedsuspend_new(pthread_descr self, const struct timespec *abs); +extern int __pthread_timedsuspend_new_clk(pthread_descr self, const struct timespec *abs, clockid_t clock_id); extern void __pthread_wait_for_restart_signal(pthread_descr self); diff --git a/linuxthreads/man/pthread_atfork.man b/linuxthreads/man/pthread_atfork.man index b682bed..ee8a48e 100644 --- a/linuxthreads/man/pthread_atfork.man +++ b/linuxthreads/man/pthread_atfork.man @@ -10,44 +10,44 @@ int pthread_atfork(void (*prepare)(void), void (*parent)(void), void (*child)(vo .SH DESCRIPTION -!pthread_atfork! registers handler functions to be called just before -and just after a new process is created with !fork!(2). The |prepare| +\fBpthread_atfork\fP registers handler functions to be called just before +and just after a new process is created with \fBfork\fP(2). The \fIprepare\fP handler will be called from the parent process, just before the new -process is created. The |parent| handler will be called from the parent -process, just before !fork!(2) returns. The |child| handler will be -called from the child process, just before !fork!(2) returns. +process is created. The \fIparent\fP handler will be called from the parent +process, just before \fBfork\fP(2) returns. The \fIchild\fP handler will be +called from the child process, just before \fBfork\fP(2) returns. -One or several of the three handlers |prepare|, |parent| and |child| -can be given as !NULL!, meaning that no handler needs to be called at +One or several of the three handlers \fIprepare\fP, \fIparent\fP and \fIchild\fP +can be given as \fBNULL\fP, meaning that no handler needs to be called at the corresponding point. -!pthread_atfork! can be called several times to install several sets -of handlers. At !fork!(2) time, the |prepare| handlers are called in -LIFO order (last added with !pthread_atfork!, first called before !fork!), -while the |parent| and |child| handlers are called in FIFO order +\fBpthread_atfork\fP can be called several times to install several sets +of handlers. At \fBfork\fP(2) time, the \fIprepare\fP handlers are called in +LIFO order (last added with \fBpthread_atfork\fP, first called before \fBfork\fP), +while the \fIparent\fP and \fIchild\fP handlers are called in FIFO order (first added, first called). -To understand the purpose of !pthread_atfork!, recall that !fork!(2) +To understand the purpose of \fBpthread_atfork\fP, recall that \fBfork\fP(2) duplicates the whole memory space, including mutexes in their current locking state, but only the calling thread: other threads are not running in the child process. The mutexes are not usable after the -!fork! and must be initialized with |pthread_mutex_init| in the child +\fBfork\fP and must be initialized with \fIpthread_mutex_init\fP in the child process. This is a limitation of the current implementation and might or might not be present in future versions. .SH "RETURN VALUE" -!pthread_atfork! returns 0 on success and a non-zero error code on error. +\fBpthread_atfork\fP returns 0 on success and a non-zero error code on error. .SH ERRORS .TP -!ENOMEM! +\fBENOMEM\fP insufficient memory available to register the handlers. .SH AUTHOR Xavier Leroy .SH "SEE ALSO" -!fork!(2), -!pthread_mutex_lock!(3), -!pthread_mutex_unlock!(3). +\fBfork\fP(2), +\fBpthread_mutex_lock\fP(3), +\fBpthread_mutex_unlock\fP(3). diff --git a/linuxthreads/man/pthread_attr_init.man b/linuxthreads/man/pthread_attr_init.man index bd5a169..ea35674 100644 --- a/linuxthreads/man/pthread_attr_init.man +++ b/linuxthreads/man/pthread_attr_init.man @@ -45,27 +45,27 @@ int pthread_attr_getscope(const pthread_attr_t *attr, int *scope); .SH DESCRIPTION Setting attributes for threads is achieved by filling a -thread attribute object |attr| of type !pthread_attr_t!, then passing it as -second argument to !pthread_create!(3). Passing !NULL! is equivalent to +thread attribute object \fIattr\fP of type \fBpthread_attr_t\fP, then passing it as +second argument to \fBpthread_create\fP(3). Passing \fBNULL\fP is equivalent to passing a thread attribute object with all attributes set to their default values. -!pthread_attr_init! initializes the thread attribute object |attr| and +\fBpthread_attr_init\fP initializes the thread attribute object \fIattr\fP and fills it with default values for the attributes. (The default values are listed below for each attribute.) -Each attribute |attrname| (see below for a list of all attributes) can -be individually set using the function !pthread_attr_set!|attrname| -and retrieved using the function !pthread_attr_get!|attrname|. +Each attribute \fIattrname\fP (see below for a list of all attributes) can +be individually set using the function \fBpthread_attr_set\fP\fIattrname\fP +and retrieved using the function \fBpthread_attr_get\fP\fIattrname\fP. -!pthread_attr_destroy! destroys a thread attribute object, which -must not be reused until it is reinitialized. !pthread_attr_destroy! +\fBpthread_attr_destroy\fP destroys a thread attribute object, which +must not be reused until it is reinitialized. \fBpthread_attr_destroy\fP does nothing in the LinuxThreads implementation. Attribute objects are consulted only when creating a new thread. The same attribute object can be used for creating several threads. Modifying an attribute object after a call to -!pthread_create! does not change the attributes of the thread +\fBpthread_create\fP does not change the attributes of the thread previously created. The following thread attributes are supported: @@ -73,149 +73,149 @@ The following thread attributes are supported: .SS detachstate Control whether the thread is created in the joinable state (value -!PTHREAD_CREATE_JOINABLE!) or in the detached state -(!PTHREAD_CREATE_DETACHED!). +\fBPTHREAD_CREATE_JOINABLE\fP) or in the detached state +(\fBPTHREAD_CREATE_DETACHED\fP). -Default value: !PTHREAD_CREATE_JOINABLE!. +Default value: \fBPTHREAD_CREATE_JOINABLE\fP. In the joinable state, another thread can synchronize on the thread -termination and recover its termination code using !pthread_join!(3), +termination and recover its termination code using \fBpthread_join\fP(3), but some of the thread resources are kept allocated after the thread terminates, and reclaimed only when another thread performs -!pthread_join!(3) on that thread. +\fBpthread_join\fP(3) on that thread. In the detached state, the thread resources are immediately freed when -it terminates, but !pthread_join!(3) cannot be used to synchronize on +it terminates, but \fBpthread_join\fP(3) cannot be used to synchronize on the thread termination. A thread created in the joinable state can later be put in the -detached thread using !pthread_detach!(3). +detached state using \fBpthread_detach\fP(3). .SS schedpolicy Select the scheduling policy for the thread: one of -!SCHED_OTHER! (regular, non-realtime scheduling), -!SCHED_RR! (realtime, round-robin) or -!SCHED_FIFO! (realtime, first-in first-out). See -!sched_setpolicy!(2) for more information on scheduling policies. +\fBSCHED_OTHER\fP (regular, non-realtime scheduling), +\fBSCHED_RR\fP (realtime, round-robin) or +\fBSCHED_FIFO\fP (realtime, first-in first-out). See +\fBsched_setpolicy\fP(2) for more information on scheduling policies. -Default value: !SCHED_OTHER!. +Default value: \fBSCHED_OTHER\fP. -The realtime scheduling policies !SCHED_RR! and !SCHED_FIFO! are +The realtime scheduling policies \fBSCHED_RR\fP and \fBSCHED_FIFO\fP are available only to processes with superuser privileges. The scheduling policy of a thread can be changed after creation with -!pthread_setschedparam!(3). +\fBpthread_setschedparam\fP(3). .SS schedparam Contain the scheduling parameters (essentially, the scheduling -priority) for the thread. See !sched_setparam!(2) for more information +priority) for the thread. See \fBsched_setparam\fP(2) for more information on scheduling parameters. Default value: priority is 0. -This attribute is not significant if the scheduling policy is !SCHED_OTHER!; -it only matters for the realtime policies !SCHED_RR! and !SCHED_FIFO!. +This attribute is not significant if the scheduling policy is \fBSCHED_OTHER\fP; +it only matters for the realtime policies \fBSCHED_RR\fP and \fBSCHED_FIFO\fP. The scheduling priority of a thread can be changed after creation with -!pthread_setschedparam!(3). +\fBpthread_setschedparam\fP(3). .SS inheritsched Indicate whether the scheduling policy and scheduling parameters for the newly created thread are determined by the values of the -|schedpolicy| and |schedparam| attributes (value -!PTHREAD_EXPLICIT_SCHED!) or are inherited from the parent thread -(value !PTHREAD_INHERIT_SCHED!). +\fIschedpolicy\fP and \fIschedparam\fP attributes (value +\fBPTHREAD_EXPLICIT_SCHED\fP) or are inherited from the parent thread +(value \fBPTHREAD_INHERIT_SCHED\fP). -Default value: !PTHREAD_EXPLICIT_SCHED!. +Default value: \fBPTHREAD_EXPLICIT_SCHED\fP. .SS scope Define the scheduling contention scope for the created thread. The only value supported in the LinuxThreads implementation is -!PTHREAD_SCOPE_SYSTEM!, meaning that the threads contend for CPU time +\fBPTHREAD_SCOPE_SYSTEM\fP, meaning that the threads contend for CPU time with all processes running on the machine. In particular, thread priorities are interpreted relative to the priorities of all other processes on the machine. The other value specified by the standard, -!PTHREAD_SCOPE_PROCESS!, means that scheduling contention occurs only +\fBPTHREAD_SCOPE_PROCESS\fP, means that scheduling contention occurs only between the threads of the running process: thread priorities are interpreted relative to the priorities of the other threads of the process, regardless of the priorities of other processes. -!PTHREAD_SCOPE_PROCESS! is not supported in LinuxThreads. +\fBPTHREAD_SCOPE_PROCESS\fP is not supported in LinuxThreads. -Default value: !PTHREAD_SCOPE_SYSTEM!. +Default value: \fBPTHREAD_SCOPE_SYSTEM\fP. .SH "RETURN VALUE" All functions return 0 on success and a non-zero error code on error. -On success, the !pthread_attr_get!|attrname| functions also store the -current value of the attribute |attrname| in the location pointed to +On success, the \fBpthread_attr_get\fP\fIattrname\fP functions also store the +current value of the attribute \fIattrname\fP in the location pointed to by their second argument. .SH ERRORS -The !pthread_attr_setdetachstate! function returns the following error +The \fBpthread_attr_setdetachstate\fP function returns the following error codes on error: .RS .TP -!EINVAL! -the specified |detachstate| is not one of !PTHREAD_CREATE_JOINABLE! or -!PTHREAD_CREATE_DETACHED!. +\fBEINVAL\fP +the specified \fIdetachstate\fP is not one of \fBPTHREAD_CREATE_JOINABLE\fP or +\fBPTHREAD_CREATE_DETACHED\fP. .RE -The !pthread_attr_setschedparam! function returns the following error +The \fBpthread_attr_setschedparam\fP function returns the following error codes on error: .RS .TP -!EINVAL! -the priority specified in |param| is outside the range of allowed -priorities for the scheduling policy currently in |attr| -(1 to 99 for !SCHED_FIFO! and !SCHED_RR!; 0 for !SCHED_OTHER!). +\fBEINVAL\fP +the priority specified in \fIparam\fP is outside the range of allowed +priorities for the scheduling policy currently in \fIattr\fP +(1 to 99 for \fBSCHED_FIFO\fP and \fBSCHED_RR\fP; 0 for \fBSCHED_OTHER\fP). .RE -The !pthread_attr_setschedpolicy! function returns the following error +The \fBpthread_attr_setschedpolicy\fP function returns the following error codes on error: .RS .TP -!EINVAL! -the specified |policy| is not one of !SCHED_OTHER!, !SCHED_FIFO!, or -!SCHED_RR!. +\fBEINVAL\fP +the specified \fIpolicy\fP is not one of \fBSCHED_OTHER\fP, \fBSCHED_FIFO\fP, or +\fBSCHED_RR\fP. .TP -!ENOTSUP! -|policy| is !SCHED_FIFO! or !SCHED_RR!, and the effective user of the +\fBENOTSUP\fP +\fIpolicy\fP is \fBSCHED_FIFO\fP or \fBSCHED_RR\fP, and the effective user of the calling process is not super-user. .RE -The !pthread_attr_setinheritsched! function returns the following error +The \fBpthread_attr_setinheritsched\fP function returns the following error codes on error: .RS .TP -!EINVAL! -the specified |inherit| is not one of !PTHREAD_INHERIT_SCHED! or -!PTHREAD_EXPLICIT_SCHED!. +\fBEINVAL\fP +the specified \fIinherit\fP is not one of \fBPTHREAD_INHERIT_SCHED\fP or +\fBPTHREAD_EXPLICIT_SCHED\fP. .RE -The !pthread_attr_setscope! function returns the following error +The \fBpthread_attr_setscope\fP function returns the following error codes on error: .RS .TP -!EINVAL! -the specified |scope| is not one of !PTHREAD_SCOPE_SYSTEM! or -!PTHREAD_SCOPE_PROCESS!. +\fBEINVAL\fP +the specified \fIscope\fP is not one of \fBPTHREAD_SCOPE_SYSTEM\fP or +\fBPTHREAD_SCOPE_PROCESS\fP. .TP -!ENOTSUP! -the specified |scope| is !PTHREAD_SCOPE_PROCESS! (not supported). +\fBENOTSUP\fP +the specified \fIscope\fP is \fBPTHREAD_SCOPE_PROCESS\fP (not supported). .RE .SH AUTHOR Xavier Leroy .SH "SEE ALSO" -!pthread_create!(3), -!pthread_join!(3), -!pthread_detach!(3), -!pthread_setschedparam!(3). +\fBpthread_create\fP(3), +\fBpthread_join\fP(3), +\fBpthread_detach\fP(3), +\fBpthread_setschedparam\fP(3). diff --git a/linuxthreads/man/pthread_cancel.man b/linuxthreads/man/pthread_cancel.man index 202d5c9..5379375 100644 --- a/linuxthreads/man/pthread_cancel.man +++ b/linuxthreads/man/pthread_cancel.man @@ -27,119 +27,119 @@ target thread can then either ignore the request, honor it immediately, or defer it till it reaches a cancellation point. When a thread eventually honors a cancellation request, it performs as -if !pthread_exit(PTHREAD_CANCELED)! has been called at that point: +if \fBpthread_exit(PTHREAD_CANCELED)\fP has been called at that point: all cleanup handlers are executed in reverse order, finalization functions for thread-specific data are called, and finally the thread -stops executing with the return value !PTHREAD_CANCELED!. See -!pthread_exit!(3) for more information. +stops executing with the return value \fBPTHREAD_CANCELED\fP. See +\fBpthread_exit\fP(3) for more information. -!pthread_cancel! sends a cancellation request to the thread denoted -by the |thread| argument. +\fBpthread_cancel\fP sends a cancellation request to the thread denoted +by the \fIthread\fP argument. -!pthread_setcancelstate! changes the cancellation state for the +\fBpthread_setcancelstate\fP changes the cancellation state for the calling thread -- that is, whether cancellation requests are ignored -or not. The |state| argument is the new cancellation state: either -!PTHREAD_CANCEL_ENABLE! to enable cancellation, or -!PTHREAD_CANCEL_DISABLE! to disable cancellation (cancellation -requests are ignored). If |oldstate| is not !NULL!, the previous -cancellation state is stored in the location pointed to by |oldstate|, +or not. The \fIstate\fP argument is the new cancellation state: either +\fBPTHREAD_CANCEL_ENABLE\fP to enable cancellation, or +\fBPTHREAD_CANCEL_DISABLE\fP to disable cancellation (cancellation +requests are ignored). If \fIoldstate\fP is not \fBNULL\fP, the previous +cancellation state is stored in the location pointed to by \fIoldstate\fP, and can thus be restored later by another call to -!pthread_setcancelstate!. +\fBpthread_setcancelstate\fP. -!pthread_setcanceltype! changes the type of responses to cancellation +\fBpthread_setcanceltype\fP changes the type of responses to cancellation requests for the calling thread: asynchronous (immediate) or deferred. -The |type| argument is the new cancellation type: either -!PTHREAD_CANCEL_ASYNCHRONOUS! to cancel the calling thread as soon as -the cancellation request is received, or !PTHREAD_CANCEL_DEFERRED! to +The \fItype\fP argument is the new cancellation type: either +\fBPTHREAD_CANCEL_ASYNCHRONOUS\fP to cancel the calling thread as soon as +the cancellation request is received, or \fBPTHREAD_CANCEL_DEFERRED\fP to keep the cancellation request pending until the next cancellation -point. If |oldtype| is not !NULL!, the previous -cancellation state is stored in the location pointed to by |oldtype|, +point. If \fIoldtype\fP is not \fBNULL\fP, the previous +cancellation state is stored in the location pointed to by \fIoldtype\fP, and can thus be restored later by another call to -!pthread_setcanceltype!. +\fBpthread_setcanceltype\fP. -Threads are always created by !pthread_create!(3) with cancellation +Threads are always created by \fBpthread_create\fP(3) with cancellation enabled and deferred. That is, the initial cancellation state is -!PTHREAD_CANCEL_ENABLE! and the initial type is -!PTHREAD_CANCEL_DEFERRED!. +\fBPTHREAD_CANCEL_ENABLE\fP and the initial type is +\fBPTHREAD_CANCEL_DEFERRED\fP. Cancellation points are those points in the program execution where a test for pending cancellation requests is performed and cancellation is executed if positive. The following POSIX threads functions are cancellation points: -!pthread_join!(3) +\fBpthread_join\fP(3) .br -!pthread_cond_wait!(3) +\fBpthread_cond_wait\fP(3) .br -!pthread_cond_timedwait!(3) +\fBpthread_cond_timedwait\fP(3) .br -!pthread_testcancel!(3) +\fBpthread_testcancel\fP(3) .br -!sem_wait!(3) +\fBsem_wait\fP(3) .br -!sigwait!(3) +\fBsigwait\fP(3) All other POSIX threads functions are guaranteed not to be cancellation points. That is, they never perform cancellation in deferred cancellation mode. -!pthread_testcancel! does nothing except testing for pending +\fBpthread_testcancel\fP does nothing except testing for pending cancellation and executing it. Its purpose is to introduce explicit checks for cancellation in long sequences of code that do not call cancellation point functions otherwise. .SH "RETURN VALUE" -!pthread_cancel!, !pthread_setcancelstate! and -!pthread_setcanceltype! return 0 on success and a non-zero error code +\fBpthread_cancel\fP, \fBpthread_setcancelstate\fP and +\fBpthread_setcanceltype\fP return 0 on success and a non-zero error code on error. .SH ERRORS -!pthread_cancel! returns the following error code on error: +\fBpthread_cancel\fP returns the following error code on error: .RS .TP -!ESRCH! -no thread could be found corresponding to that specified by the |thread| ID. +\fBESRCH\fP +no thread could be found corresponding to that specified by the \fIthread\fP ID. .RE -!pthread_setcancelstate! returns the following error code on error: +\fBpthread_setcancelstate\fP returns the following error code on error: .RS .TP -!EINVAL! -the |state| argument is not !PTHREAD_CANCEL_ENABLE! nor -!PTHREAD_CANCEL_DISABLE! +\fBEINVAL\fP +the \fIstate\fP argument is not \fBPTHREAD_CANCEL_ENABLE\fP nor +\fBPTHREAD_CANCEL_DISABLE\fP .RE -!pthread_setcanceltype! returns the following error code on error: +\fBpthread_setcanceltype\fP returns the following error code on error: .RS .TP -!EINVAL! -the |type| argument is not !PTHREAD_CANCEL_DEFERRED! nor -!PTHREAD_CANCEL_ASYNCHRONOUS! +\fBEINVAL\fP +the \fItype\fP argument is not \fBPTHREAD_CANCEL_DEFERRED\fP nor +\fBPTHREAD_CANCEL_ASYNCHRONOUS\fP .RE .SH AUTHOR Xavier Leroy .SH "SEE ALSO" -!pthread_exit!(3), -!pthread_cleanup_push!(3), -!pthread_cleanup_pop!(3). +\fBpthread_exit\fP(3), +\fBpthread_cleanup_push\fP(3), +\fBpthread_cleanup_pop\fP(3). .SH BUGS POSIX specifies that a number of system calls (basically, all -system calls that may block, such as !read!(2), !write!(2), !wait!(2), +system calls that may block, such as \fBread\fP(2), \fBwrite\fP(2), \fBwait\fP(2), etc.) and library functions that may call these system calls (e.g. -!fprintf!(3)) are cancellation points. LinuxThreads is not yet +\fBfprintf\fP(3)) are cancellation points. LinuxThreads is not yet integrated enough with the C library to implement this, and thus none of the C library functions is a cancellation point. For system calls at least, there is a workaround. Cancellation requests are transmitted to the target thread by sending it a signal. That signal will interrupt all blocking system calls, causing -them to return immediately with the !EINTR! error. So, checking for -cancellation during a !read! system call, for instance, can be +them to return immediately with the \fBEINTR\fP error. So, checking for +cancellation during a \fBread\fP system call, for instance, can be achieved as follows: .RS diff --git a/linuxthreads/man/pthread_cleanup_push.man b/linuxthreads/man/pthread_cleanup_push.man index 1591431..2e9d59d 100644 --- a/linuxthreads/man/pthread_cleanup_push.man +++ b/linuxthreads/man/pthread_cleanup_push.man @@ -21,7 +21,7 @@ void pthread_cleanup_pop_restore_np(int execute); .SH DESCRIPTION Cleanup handlers are functions that get called when a thread -terminates, either by calling !pthread_exit!(3) or because of +terminates, either by calling \fBpthread_exit\fP(3) or because of cancellation. Cleanup handlers are installed and removed following a stack-like discipline. @@ -32,41 +32,41 @@ remain locked forever and prevent other threads from executing normally. The best way to avoid this is, just before locking the mutex, to install a cleanup handler whose effect is to unlock the mutex. Cleanup handlers can be used similarly to free blocks allocated -with !malloc!(3) or close file descriptors on thread termination. +with \fBmalloc\fP(3) or close file descriptors on thread termination. -!pthread_cleanup_push! installs the |routine| function with argument -|arg| as a cleanup handler. From this point on to the matching -!pthread_cleanup_pop!, the function |routine| will be called with -arguments |arg| when the thread terminates, either through !pthread_exit!(3) +\fBpthread_cleanup_push\fP installs the \fIroutine\fP function with argument +\fIarg\fP as a cleanup handler. From this point on to the matching +\fBpthread_cleanup_pop\fP, the function \fIroutine\fP will be called with +arguments \fIarg\fP when the thread terminates, either through \fBpthread_exit\fP(3) or by cancellation. If several cleanup handlers are active at that point, they are called in LIFO order: the most recently installed handler is called first. -!pthread_cleanup_pop! removes the most recently installed cleanup -handler. If the |execute| argument is not 0, it also executes the -handler, by calling the |routine| function with arguments |arg|. If -the |execute| argument is 0, the handler is only removed but not +\fBpthread_cleanup_pop\fP removes the most recently installed cleanup +handler. If the \fIexecute\fP argument is not 0, it also executes the +handler, by calling the \fIroutine\fP function with arguments \fIarg\fP. If +the \fIexecute\fP argument is 0, the handler is only removed but not executed. -Matching pairs of !pthread_cleanup_push! and !pthread_cleanup_pop! +Matching pairs of \fBpthread_cleanup_push\fP and \fBpthread_cleanup_pop\fP must occur in the same function, at the same level of block nesting. -Actually, !pthread_cleanup_push! and !pthread_cleanup_pop! are macros, -and the expansion of !pthread_cleanup_push! introduces an open brace !{! -with the matching closing brace !}! being introduced by the expansion -of the matching !pthread_cleanup_pop!. - -!pthread_cleanup_push_defer_np! is a non-portable extension that -combines !pthread_cleanup_push! and !pthread_setcanceltype!(3). -It pushes a cleanup handler just as !pthread_cleanup_push! does, but +Actually, \fBpthread_cleanup_push\fP and \fBpthread_cleanup_pop\fP are macros, +and the expansion of \fBpthread_cleanup_push\fP introduces an open brace \fB{\fP +with the matching closing brace \fB}\fP being introduced by the expansion +of the matching \fBpthread_cleanup_pop\fP. + +\fBpthread_cleanup_push_defer_np\fP is a non-portable extension that +combines \fBpthread_cleanup_push\fP and \fBpthread_setcanceltype\fP(3). +It pushes a cleanup handler just as \fBpthread_cleanup_push\fP does, but also saves the current cancellation type and sets it to deferred cancellation. This ensures that the cleanup mechanism is effective even if the thread was initially in asynchronous cancellation mode. -!pthread_cleanup_pop_restore_np! pops a cleanup handler introduced by -!pthread_cleanup_push_defer_np!, and restores the cancellation type to -its value at the time !pthread_cleanup_push_defer_np! was called. +\fBpthread_cleanup_pop_restore_np\fP pops a cleanup handler introduced by +\fBpthread_cleanup_push_defer_np\fP, and restores the cancellation type to +its value at the time \fBpthread_cleanup_push_defer_np\fP was called. -!pthread_cleanup_push_defer_np! and !pthread_cleanup_pop_restore_np! +\fBpthread_cleanup_push_defer_np\fP and \fBpthread_cleanup_pop_restore_np\fP must occur in matching pairs, at the same level of block nesting. The following sequence @@ -113,14 +113,14 @@ None. Xavier Leroy .SH "SEE ALSO" -!pthread_exit!(3), -!pthread_cancel!(3), -!pthread_setcanceltype!(3). +\fBpthread_exit\fP(3), +\fBpthread_cancel\fP(3), +\fBpthread_setcanceltype\fP(3). .SH EXAMPLE -Here is how to lock a mutex |mut| in such a way that it will be -unlocked if the thread is canceled while |mut| is locked: +Here is how to lock a mutex \fImut\fP in such a way that it will be +unlocked if the thread is canceled while \fImut\fP is locked: .RS .ft 3 @@ -149,10 +149,10 @@ pthread_cleanup_pop(1); .fi Notice that the code above is safe only in deferred cancellation mode -(see !pthread_setcanceltype!(3)). In asynchronous cancellation mode, -a cancellation can occur between !pthread_cleanup_push! and -!pthread_mutex_lock!, or between !pthread_mutex_unlock! and -!pthread_cleanup_pop!, resulting in both cases in the thread trying to +(see \fBpthread_setcanceltype\fP(3)). In asynchronous cancellation mode, +a cancellation can occur between \fBpthread_cleanup_push\fP and +\fBpthread_mutex_lock\fP, or between \fBpthread_mutex_unlock\fP and +\fBpthread_cleanup_pop\fP, resulting in both cases in the thread trying to unlock a mutex not locked by the current thread. This is the main reason why asynchronous cancellation is difficult to use. @@ -177,7 +177,7 @@ pthread_setcanceltype(oldtype, NULL); The code above can be rewritten in a more compact and more efficient way, using the non-portable functions -!pthread_cleanup_push_defer_np! and !pthread_cleanup_pop_restore_np!: +\fBpthread_cleanup_push_defer_np\fP and \fBpthread_cleanup_pop_restore_np\fP: .RS .ft 3 diff --git a/linuxthreads/man/pthread_cond_init.man b/linuxthreads/man/pthread_cond_init.man index 4913062..a5b0af5 100644 --- a/linuxthreads/man/pthread_cond_init.man +++ b/linuxthreads/man/pthread_cond_init.man @@ -40,31 +40,31 @@ the race condition where a thread prepares to wait on a condition variable and another thread signals the condition just before the first thread actually waits on it. -!pthread_cond_init! initializes the condition variable |cond|, using the -condition attributes specified in |cond_attr|, or default attributes -if |cond_attr| is !NULL!. The LinuxThreads implementation supports no -attributes for conditions, hence the |cond_attr| parameter is actually +\fBpthread_cond_init\fP initializes the condition variable \fIcond\fP, using the +condition attributes specified in \fIcond_attr\fP, or default attributes +if \fIcond_attr\fP is \fBNULL\fP. The LinuxThreads implementation supports no +attributes for conditions, hence the \fIcond_attr\fP parameter is actually ignored. -Variables of type !pthread_cond_t! can also be initialized -statically, using the constant !PTHREAD_COND_INITIALIZER!. +Variables of type \fBpthread_cond_t\fP can also be initialized +statically, using the constant \fBPTHREAD_COND_INITIALIZER\fP. -!pthread_cond_signal! restarts one of the threads that are waiting on -the condition variable |cond|. If no threads are waiting on |cond|, -nothing happens. If several threads are waiting on |cond|, exactly one +\fBpthread_cond_signal\fP restarts one of the threads that are waiting on +the condition variable \fIcond\fP. If no threads are waiting on \fIcond\fP, +nothing happens. If several threads are waiting on \fIcond\fP, exactly one is restarted, but it is not specified which. -!pthread_cond_broadcast! restarts all the threads that are waiting on -the condition variable |cond|. Nothing happens if no threads are -waiting on |cond|. +\fBpthread_cond_broadcast\fP restarts all the threads that are waiting on +the condition variable \fIcond\fP. Nothing happens if no threads are +waiting on \fIcond\fP. -!pthread_cond_wait! atomically unlocks the |mutex| (as per -!pthread_unlock_mutex!) and waits for the condition variable |cond| to +\fBpthread_cond_wait\fP atomically unlocks the \fImutex\fP (as per +\fBpthread_unlock_mutex\fP) and waits for the condition variable \fIcond\fP to be signaled. The thread execution is suspended and does not consume -any CPU time until the condition variable is signaled. The |mutex| +any CPU time until the condition variable is signaled. The \fImutex\fP must be locked by the calling thread on entrance to -!pthread_cond_wait!. Before returning to the calling thread, -!pthread_cond_wait! re-acquires |mutex| (as per !pthread_lock_mutex!). +\fBpthread_cond_wait\fP. Before returning to the calling thread, +\fBpthread_cond_wait\fP re-acquires \fImutex\fP (as per \fBpthread_lock_mutex\fP). Unlocking the mutex and suspending on the condition variable is done atomically. Thus, if all threads always acquire the mutex before @@ -72,37 +72,37 @@ signaling the condition, this guarantees that the condition cannot be signaled (and thus ignored) between the time a thread locks the mutex and the time it waits on the condition variable. -!pthread_cond_timedwait! atomically unlocks |mutex| and waits on -|cond|, as !pthread_cond_wait! does, but it also bounds the duration -of the wait. If |cond| has not been signaled within the amount of time -specified by |abstime|, the mutex |mutex| is re-acquired and -!pthread_cond_timedwait! returns the error !ETIMEDOUT!. -The |abstime| parameter specifies an absolute time, with the same -origin as !time!(2) and !gettimeofday!(2): an |abstime| of 0 +\fBpthread_cond_timedwait\fP atomically unlocks \fImutex\fP and waits on +\fIcond\fP, as \fBpthread_cond_wait\fP does, but it also bounds the duration +of the wait. If \fIcond\fP has not been signaled within the amount of time +specified by \fIabstime\fP, the mutex \fImutex\fP is re-acquired and +\fBpthread_cond_timedwait\fP returns the error \fBETIMEDOUT\fP. +The \fIabstime\fP parameter specifies an absolute time, with the same +origin as \fBtime\fP(2) and \fBgettimeofday\fP(2): an \fIabstime\fP of 0 corresponds to 00:00:00 GMT, January 1, 1970. -!pthread_cond_destroy! destroys a condition variable, freeing the +\fBpthread_cond_destroy\fP destroys a condition variable, freeing the resources it might hold. No threads must be waiting on the condition -variable on entrance to !pthread_cond_destroy!. In the LinuxThreads +variable on entrance to \fBpthread_cond_destroy\fP. In the LinuxThreads implementation, no resources are associated with condition variables, -thus !pthread_cond_destroy! actually does nothing except checking that +thus \fBpthread_cond_destroy\fP actually does nothing except checking that the condition has no waiting threads. .SH CANCELLATION -!pthread_cond_wait! and !pthread_cond_timedwait! are cancellation +\fBpthread_cond_wait\fP and \fBpthread_cond_timedwait\fP are cancellation points. If a thread is cancelled while suspended in one of these functions, the thread immediately resumes execution, then locks again -the |mutex| argument to !pthread_cond_wait! and -!pthread_cond_timedwait!, and finally executes the cancellation. -Consequently, cleanup handlers are assured that |mutex| is locked when +the \fImutex\fP argument to \fBpthread_cond_wait\fP and +\fBpthread_cond_timedwait\fP, and finally executes the cancellation. +Consequently, cleanup handlers are assured that \fImutex\fP is locked when they are called. .SH "ASYNC-SIGNAL SAFETY" The condition functions are not async-signal safe, and should not be called from a signal handler. In particular, calling -!pthread_cond_signal! or !pthread_cond_broadcast! from a signal +\fBpthread_cond_signal\fP or \fBpthread_cond_broadcast\fP from a signal handler may deadlock the calling thread. .SH "RETURN VALUE" @@ -112,45 +112,45 @@ error code on error. .SH ERRORS -!pthread_cond_init!, !pthread_cond_signal!, !pthread_cond_broadcast!, -and !pthread_cond_wait! never return an error code. +\fBpthread_cond_init\fP, \fBpthread_cond_signal\fP, \fBpthread_cond_broadcast\fP, +and \fBpthread_cond_wait\fP never return an error code. -The !pthread_cond_timedwait! function returns the following error codes +The \fBpthread_cond_timedwait\fP function returns the following error codes on error: .RS .TP -!ETIMEDOUT! +\fBETIMEDOUT\fP the condition variable was not signaled until the timeout specified by -|abstime| +\fIabstime\fP .TP -!EINTR! -!pthread_cond_timedwait! was interrupted by a signal +\fBEINTR\fP +\fBpthread_cond_timedwait\fP was interrupted by a signal .RE -The !pthread_cond_destroy! function returns the following error code +The \fBpthread_cond_destroy\fP function returns the following error code on error: .RS .TP -!EBUSY! -some threads are currently waiting on |cond|. +\fBEBUSY\fP +some threads are currently waiting on \fIcond\fP. .RE .SH AUTHOR Xavier Leroy .SH "SEE ALSO" -!pthread_condattr_init!(3), -!pthread_mutex_lock!(3), -!pthread_mutex_unlock!(3), -!gettimeofday!(2), -!nanosleep!(2). +\fBpthread_condattr_init\fP(3), +\fBpthread_mutex_lock\fP(3), +\fBpthread_mutex_unlock\fP(3), +\fBgettimeofday\fP(2), +\fBnanosleep\fP(2). .SH EXAMPLE -Consider two shared variables |x| and |y|, protected by the mutex |mut|, -and a condition variable |cond| that is to be signaled whenever |x| -becomes greater than |y|. +Consider two shared variables \fIx\fP and \fIy\fP, protected by the mutex \fImut\fP, +and a condition variable \fIcond\fP that is to be signaled whenever \fIx\fP +becomes greater than \fIy\fP. .RS .ft 3 @@ -164,7 +164,7 @@ pthread_cond_t cond = PTHREAD_COND_INITIALIZER; .RE .fi -Waiting until |x| is greater than |y| is performed as follows: +Waiting until \fIx\fP is greater than \fIy\fP is performed as follows: .RS .ft 3 @@ -181,8 +181,8 @@ pthread_mutex_unlock(&mut); .RE .fi -Modifications on |x| and |y| that may cause |x| to become greater than -|y| should signal the condition if needed: +Modifications on \fIx\fP and \fIy\fP that may cause \fIx\fP to become greater than +\fIy\fP should signal the condition if needed: .RS .ft 3 @@ -199,11 +199,11 @@ pthread_mutex_unlock(&mut); If it can be proved that at most one waiting thread needs to be waken up (for instance, if there are only two threads communicating through -|x| and |y|), !pthread_cond_signal! can be used as a slightly more -efficient alternative to !pthread_cond_broadcast!. In doubt, use -!pthread_cond_broadcast!. +\fIx\fP and \fIy\fP), \fBpthread_cond_signal\fP can be used as a slightly more +efficient alternative to \fBpthread_cond_broadcast\fP. In doubt, use +\fBpthread_cond_broadcast\fP. -To wait for |x| to becomes greater than |y| with a timeout of 5 +To wait for \fIx\fP to becomes greater than \fIy\fP with a timeout of 5 seconds, do: .RS diff --git a/linuxthreads/man/pthread_condattr_init.man b/linuxthreads/man/pthread_condattr_init.man index f491cbe..23749f2 100644 --- a/linuxthreads/man/pthread_condattr_init.man +++ b/linuxthreads/man/pthread_condattr_init.man @@ -15,25 +15,25 @@ int pthread_condattr_destroy(pthread_condattr_t *attr); .SH DESCRIPTION Condition attributes can be specified at condition creation time, by passing a -condition attribute object as second argument to !pthread_cond_init!(3). -Passing !NULL! is equivalent to passing a condition attribute object with +condition attribute object as second argument to \fBpthread_cond_init\fP(3). +Passing \fBNULL\fP is equivalent to passing a condition attribute object with all attributes set to their default values. The LinuxThreads implementation supports no attributes for conditions. The functions on condition attributes are included only for compliance with the POSIX standard. -!pthread_condattr_init! initializes the condition attribute object -|attr| and fills it with default values for the attributes. -!pthread_condattr_destroy! destroys a condition attribute object, +\fBpthread_condattr_init\fP initializes the condition attribute object +\fIattr\fP and fills it with default values for the attributes. +\fBpthread_condattr_destroy\fP destroys a condition attribute object, which must not be reused until it is reinitialized. Both functions do nothing in the LinuxThreads implementation. .SH "RETURN VALUE" -!pthread_condattr_init! and !pthread_condattr_destroy! always return 0. +\fBpthread_condattr_init\fP and \fBpthread_condattr_destroy\fP always return 0. .SH AUTHOR Xavier Leroy .SH "SEE ALSO" -!pthread_cond_init!(3). +\fBpthread_cond_init\fP(3). diff --git a/linuxthreads/man/pthread_create.man b/linuxthreads/man/pthread_create.man index a940047..e831b27 100644 --- a/linuxthreads/man/pthread_create.man +++ b/linuxthreads/man/pthread_create.man @@ -9,38 +9,38 @@ pthread_create \- create a new thread int pthread_create(pthread_t * thread, pthread_attr_t * attr, void * (*start_routine)(void *), void * arg); .SH DESCRIPTION -!pthread_create! creates a new thread of control that executes +\fBpthread_create\fP creates a new thread of control that executes concurrently with the calling thread. The new thread applies the -function |start_routine| passing it |arg| as first argument. The new -thread terminates either explicitly, by calling !pthread_exit!(3), -or implicitly, by returning from the |start_routine| function. The -latter case is equivalent to calling !pthread_exit!(3) with the result -returned by |start_routine| as exit code. - -The |attr| argument specifies thread attributes to be applied to the -new thread. See !pthread_attr_init!(3) for a complete list of thread -attributes. The |attr| argument can also be !NULL!, in which case +function \fIstart_routine\fP passing it \fIarg\fP as first argument. The new +thread terminates either explicitly, by calling \fBpthread_exit\fP(3), +or implicitly, by returning from the \fIstart_routine\fP function. The +latter case is equivalent to calling \fBpthread_exit\fP(3) with the result +returned by \fIstart_routine\fP as exit code. + +The \fIattr\fP argument specifies thread attributes to be applied to the +new thread. See \fBpthread_attr_init\fP(3) for a complete list of thread +attributes. The \fIattr\fP argument can also be \fBNULL\fP, in which case default attributes are used: the created thread is joinable (not detached) and has default (non real-time) scheduling policy. .SH "RETURN VALUE" On success, the identifier of the newly created thread is stored in -the location pointed by the |thread| argument, and a 0 is returned. On +the location pointed by the \fIthread\fP argument, and a 0 is returned. On error, a non-zero error code is returned. .SH ERRORS .TP -!EAGAIN! +\fBEAGAIN\fP not enough system resources to create a process for the new thread. .TP -!EAGAIN! -more than !PTHREAD_THREADS_MAX! threads are already active. +\fBEAGAIN\fP +more than \fBPTHREAD_THREADS_MAX\fP threads are already active. .SH AUTHOR Xavier Leroy .SH "SEE ALSO" -!pthread_exit!(3), -!pthread_join!(3), -!pthread_detach!(3), -!pthread_attr_init!(3). +\fBpthread_exit\fP(3), +\fBpthread_join\fP(3), +\fBpthread_detach\fP(3), +\fBpthread_attr_init\fP(3). diff --git a/linuxthreads/man/pthread_detach.man b/linuxthreads/man/pthread_detach.man index 7b43f45..60ae949 100644 --- a/linuxthreads/man/pthread_detach.man +++ b/linuxthreads/man/pthread_detach.man @@ -9,36 +9,36 @@ pthread_detach \- put a running thread in the detached state int pthread_detach(pthread_t th); .SH DESCRIPTION -!pthread_detach! put the thread |th| in the detached state. This -guarantees that the memory resources consumed by |th| will be freed -immediately when |th| terminates. However, this prevents other threads -from synchronizing on the termination of |th| using !pthread_join!. +\fBpthread_detach\fP put the thread \fIth\fP in the detached state. This +guarantees that the memory resources consumed by \fIth\fP will be freed +immediately when \fIth\fP terminates. However, this prevents other threads +from synchronizing on the termination of \fIth\fP using \fBpthread_join\fP. A thread can be created initially in the detached state, using the -!detachstate! attribute to !pthread_create!(3). In contrast, -!pthread_detach! applies to threads created in the joinable state, and +\fBdetachstate\fP attribute to \fBpthread_create\fP(3). In contrast, +\fBpthread_detach\fP applies to threads created in the joinable state, and which need to be put in the detached state later. -After !pthread_detach! completes, subsequent attempts to perform -!pthread_join! on |th| will fail. If another thread is already joining -the thread |th| at the time !pthread_detach! is called, -!pthread_detach! does nothing and leaves |th| in the joinable state. +After \fBpthread_detach\fP completes, subsequent attempts to perform +\fBpthread_join\fP on \fIth\fP will fail. If another thread is already joining +the thread \fIth\fP at the time \fBpthread_detach\fP is called, +\fBpthread_detach\fP does nothing and leaves \fIth\fP in the joinable state. .SH "RETURN VALUE" On success, 0 is returned. On error, a non-zero error code is returned. .SH ERRORS .TP -!ESRCH! -No thread could be found corresponding to that specified by |th| +\fBESRCH\fP +No thread could be found corresponding to that specified by \fIth\fP .TP -!EINVAL! -the thread |th| is already in the detached state +\fBEINVAL\fP +the thread \fIth\fP is already in the detached state .SH AUTHOR Xavier Leroy .SH "SEE ALSO" -!pthread_create!(3), -!pthread_join!(3), -!pthread_attr_setdetachstate!(3). \ No newline at end of file +\fBpthread_create\fP(3), +\fBpthread_join\fP(3), +\fBpthread_attr_setdetachstate\fP(3). \ No newline at end of file diff --git a/linuxthreads/man/pthread_equal.man b/linuxthreads/man/pthread_equal.man index 1a03965..ada8c4c 100644 --- a/linuxthreads/man/pthread_equal.man +++ b/linuxthreads/man/pthread_equal.man @@ -9,15 +9,15 @@ pthread_equal \- compare two thread identifiers int pthread_equal(pthread_t thread1, pthread_t thread2); .SH DESCRIPTION -!pthread_equal! determines if two thread identifiers refer to the same +\fBpthread_equal\fP determines if two thread identifiers refer to the same thread. .SH "RETURN VALUE" -A non-zero value is returned if |thread1| and |thread2| refer to the +A non-zero value is returned if \fIthread1\fP and \fIthread2\fP refer to the same thread. Otherwise, 0 is returned. .SH AUTHOR Xavier Leroy .SH "SEE ALSO" -!pthread_self!(3). +\fBpthread_self\fP(3). diff --git a/linuxthreads/man/pthread_exit.man b/linuxthreads/man/pthread_exit.man index 54751e9..8574665 100644 --- a/linuxthreads/man/pthread_exit.man +++ b/linuxthreads/man/pthread_exit.man @@ -9,24 +9,24 @@ pthread_exit \- terminate the calling thread void pthread_exit(void *retval); .SH DESCRIPTION -!pthread_exit! terminates the execution of the calling thread. +\fBpthread_exit\fP terminates the execution of the calling thread. All cleanup handlers that have been set for the calling thread with -!pthread_cleanup_push!(3) are executed in reverse order (the most +\fBpthread_cleanup_push\fP(3) are executed in reverse order (the most recently pushed handler is executed first). Finalization functions for -thread-specific data are then called for all keys that have non-!NULL! +thread-specific data are then called for all keys that have non-\fBNULL\fP values associated with them in the calling thread (see -!pthread_key_create!(3)). Finally, execution of the calling thread is +\fBpthread_key_create\fP(3)). Finally, execution of the calling thread is stopped. -The |retval| argument is the return value of the thread. It can be -consulted from another thread using !pthread_join!(3). +The \fIretval\fP argument is the return value of the thread. It can be +consulted from another thread using \fBpthread_join\fP(3). .SH "RETURN VALUE" -The !pthread_exit! function never returns. +The \fBpthread_exit\fP function never returns. .SH AUTHOR Xavier Leroy .SH "SEE ALSO" -!pthread_create!(3), -!pthread_join!(3). +\fBpthread_create\fP(3), +\fBpthread_join\fP(3). diff --git a/linuxthreads/man/pthread_join.man b/linuxthreads/man/pthread_join.man index d587093..52e0c2b 100644 --- a/linuxthreads/man/pthread_join.man +++ b/linuxthreads/man/pthread_join.man @@ -9,62 +9,62 @@ pthread_join \- wait for termination of another thread int pthread_join(pthread_t th, void **thread_return); .SH DESCRIPTION -!pthread_join! suspends the execution of the calling thread until the -thread identified by |th| terminates, either by calling !pthread_exit!(3) +\fBpthread_join\fP suspends the execution of the calling thread until the +thread identified by \fIth\fP terminates, either by calling \fBpthread_exit\fP(3) or by being cancelled. -If |thread_return| is not !NULL!, the return value of |th| is stored -in the location pointed to by |thread_return|. The return value of -|th| is either the argument it gave to !pthread_exit!(3), or -!PTHREAD_CANCELED! if |th| was cancelled. +If \fIthread_return\fP is not \fBNULL\fP, the return value of \fIth\fP is stored +in the location pointed to by \fIthread_return\fP. The return value of +\fIth\fP is either the argument it gave to \fBpthread_exit\fP(3), or +\fBPTHREAD_CANCELED\fP if \fIth\fP was cancelled. -The joined thread !th! must be in the joinable state: it must not have -been detached using !pthread_detach!(3) or the -!PTHREAD_CREATE_DETACHED! attribute to !pthread_create!(3). +The joined thread \fBth\fP must be in the joinable state: it must not have +been detached using \fBpthread_detach\fP(3) or the +\fBPTHREAD_CREATE_DETACHED\fP attribute to \fBpthread_create\fP(3). When a joinable thread terminates, its memory resources (thread descriptor and stack) are not deallocated until another thread -performs !pthread_join! on it. Therefore, !pthread_join! must be +performs \fBpthread_join\fP on it. Therefore, \fBpthread_join\fP must be called once for each joinable thread created to avoid memory leaks. At most one thread can wait for the termination of a given -thread. Calling !pthread_join! on a thread |th| on which another +thread. Calling \fBpthread_join\fP on a thread \fIth\fP on which another thread is already waiting for termination returns an error. .SH CANCELLATION -!pthread_join! is a cancellation point. If a thread is canceled while -suspended in !pthread_join!, the thread execution resumes immediately -and the cancellation is executed without waiting for the |th| thread -to terminate. If cancellation occurs during !pthread_join!, the |th| +\fBpthread_join\fP is a cancellation point. If a thread is canceled while +suspended in \fBpthread_join\fP, the thread execution resumes immediately +and the cancellation is executed without waiting for the \fIth\fP thread +to terminate. If cancellation occurs during \fBpthread_join\fP, the \fIth\fP thread remains not joined. .SH "RETURN VALUE" -On success, the return value of |th| is stored in the location pointed -to by |thread_return|, and 0 is returned. On error, a non-zero error +On success, the return value of \fIth\fP is stored in the location pointed +to by \fIthread_return\fP, and 0 is returned. On error, a non-zero error code is returned. .SH ERRORS .TP -!ESRCH! -No thread could be found corresponding to that specified by |th|. +\fBESRCH\fP +No thread could be found corresponding to that specified by \fIth\fP. .TP -!EINVAL! -The |th| thread has been detached. +\fBEINVAL\fP +The \fIth\fP thread has been detached. .TP -!EINVAL! -Another thread is already waiting on termination of |th|. +\fBEINVAL\fP +Another thread is already waiting on termination of \fIth\fP. .TP -!EDEADLK! -The |th| argument refers to the calling thread. +\fBEDEADLK\fP +The \fIth\fP argument refers to the calling thread. .SH AUTHOR Xavier Leroy .SH "SEE ALSO" -!pthread_exit!(3), -!pthread_detach!(3), -!pthread_create!(3), -!pthread_attr_setdetachstate!(3), -!pthread_cleanup_push!(3), -!pthread_key_create!(3). +\fBpthread_exit\fP(3), +\fBpthread_detach\fP(3), +\fBpthread_create\fP(3), +\fBpthread_attr_setdetachstate\fP(3), +\fBpthread_cleanup_push\fP(3), +\fBpthread_key_create\fP(3). diff --git a/linuxthreads/man/pthread_key_create.man b/linuxthreads/man/pthread_key_create.man index 6823e30..dfb7401 100644 --- a/linuxthreads/man/pthread_key_create.man +++ b/linuxthreads/man/pthread_key_create.man @@ -23,81 +23,81 @@ is the POSIX threads answer to this need. Each thread possesses a private memory block, the thread-specific data area, or TSD area for short. This area is indexed by TSD keys. The TSD -area associates values of type !void *! to TSD keys. TSD keys are +area associates values of type \fBvoid *\fP to TSD keys. TSD keys are common to all threads, but the value associated with a given TSD key can be different in each thread. -For concreteness, the TSD areas can be viewed as arrays of !void *! +For concreteness, the TSD areas can be viewed as arrays of \fBvoid *\fP pointers, TSD keys as integer indices into these arrays, and the value of a TSD key as the value of the corresponding array element in the calling thread. -When a thread is created, its TSD area initially associates !NULL! +When a thread is created, its TSD area initially associates \fBNULL\fP with all keys. -!pthread_key_create! allocates a new TSD key. The key is stored in the -location pointed to by |key|. There is a limit of !PTHREAD_KEYS_MAX! +\fBpthread_key_create\fP allocates a new TSD key. The key is stored in the +location pointed to by \fIkey\fP. There is a limit of \fBPTHREAD_KEYS_MAX\fP on the number of keys allocated at a given time. The value initially -associated with the returned key is !NULL! in all currently executing +associated with the returned key is \fBNULL\fP in all currently executing threads. -The |destr_function| argument, if not !NULL!, specifies a destructor +The \fIdestr_function\fP argument, if not \fBNULL\fP, specifies a destructor function associated with the key. When a thread terminates via -!pthread_exit! or by cancellation, |destr_function| is called with +\fBpthread_exit\fP or by cancellation, \fIdestr_function\fP is called with arguments the value associated with the key in that thread. The -|destr_function| is not called if that value is !NULL!. The order in +\fIdestr_function\fP is not called if that value is \fBNULL\fP. The order in which destructor functions are called at thread termination time is unspecified. -Before the destructor function is called, the !NULL! value is +Before the destructor function is called, the \fBNULL\fP value is associated with the key in the current thread. A destructor function -might, however, re-associate non-!NULL! values to that key or some +might, however, re-associate non-\fBNULL\fP values to that key or some other key. To deal with this, if after all the destructors have been -called for all non-!NULL! values, there are still some non-!NULL! +called for all non-\fBNULL\fP values, there are still some non-\fBNULL\fP values with associated destructors, then the process is repeated. The LinuxThreads implementation stops the process after -!PTHREAD_DESTRUCTOR_ITERATIONS! iterations, even if some non-!NULL! +\fBPTHREAD_DESTRUCTOR_ITERATIONS\fP iterations, even if some non-\fBNULL\fP values with associated descriptors remain. Other implementations may loop indefinitely. -!pthread_key_delete! deallocates a TSD key. It does not check whether -non-!NULL! values are associated with that key in the currently +\fBpthread_key_delete\fP deallocates a TSD key. It does not check whether +non-\fBNULL\fP values are associated with that key in the currently executing threads, nor call the destructor function associated with the key. -!pthread_setspecific! changes the value associated with |key| in the -calling thread, storing the given |pointer| instead. +\fBpthread_setspecific\fP changes the value associated with \fIkey\fP in the +calling thread, storing the given \fIpointer\fP instead. -!pthread_getspecific! returns the value currently associated with -|key| in the calling thread. +\fBpthread_getspecific\fP returns the value currently associated with +\fIkey\fP in the calling thread. .SH "RETURN VALUE" -!pthread_key_create!, !pthread_key_delete!, and !pthread_setspecific! +\fBpthread_key_create\fP, \fBpthread_key_delete\fP, and \fBpthread_setspecific\fP return 0 on success and a non-zero error code on failure. If -successful, !pthread_key_create! stores the newly allocated key in the -location pointed to by its |key| argument. +successful, \fBpthread_key_create\fP stores the newly allocated key in the +location pointed to by its \fIkey\fP argument. -!pthread_getspecific! returns the value associated with |key| on -success, and !NULL! on error. +\fBpthread_getspecific\fP returns the value associated with \fIkey\fP on +success, and \fBNULL\fP on error. .SH ERRORS -!pthread_key_create! returns the following error code on error: +\fBpthread_key_create\fP returns the following error code on error: .RS .TP -!EAGAIN! -!PTHREAD_KEYS_MAX! keys are already allocated +\fBEAGAIN\fP +\fBPTHREAD_KEYS_MAX\fP keys are already allocated .RE -!pthread_key_delete! and !pthread_setspecific! return the following +\fBpthread_key_delete\fP and \fBpthread_setspecific\fP return the following error code on error: .RS .TP -!EINVAL! -|key| is not a valid, allocated TSD key +\fBEINVAL\fP +\fIkey\fP is not a valid, allocated TSD key .RE -!pthread_getspecific! returns !NULL! if |key| is not a valid, +\fBpthread_getspecific\fP returns \fBNULL\fP if \fIkey\fP is not a valid, allocated TSD key. .SH AUTHOR diff --git a/linuxthreads/man/pthread_kill_other_threads_np.man b/linuxthreads/man/pthread_kill_other_threads_np.man index 0de42d5..c99cb4f 100644 --- a/linuxthreads/man/pthread_kill_other_threads_np.man +++ b/linuxthreads/man/pthread_kill_other_threads_np.man @@ -9,14 +9,14 @@ pthread_kill_other_threads_np \- terminate all threads in program except calling void pthread_kill_other_threads_np(void); .SH DESCRIPTION -!pthread_kill_other_threads_np! is a non-portable LinuxThreads extension. +\fBpthread_kill_other_threads_np\fP is a non-portable LinuxThreads extension. It causes all threads in the program to terminate immediately, except the calling thread which proceeds normally. It is intended to be -called just before a thread calls one of the !exec! functions, -e.g. !execve!(2). +called just before a thread calls one of the \fBexec\fP functions, +e.g. \fBexecve\fP(2). Termination of the other threads is not performed through -!pthread_cancel!(3) and completely bypasses the cancellation +\fBpthread_cancel\fP(3) and completely bypasses the cancellation mechanism. Hence, the current settings for cancellation state and cancellation type are ignored, and the cleanup handlers are not executed in the terminated threads. @@ -25,16 +25,16 @@ executed in the terminated threads. Xavier Leroy .SH "SEE ALSO" -!execve!(2), -!pthread_setcancelstate!(3), -!pthread_setcanceltype!(3), -!pthread_cancel!(3). +\fBexecve\fP(2), +\fBpthread_setcancelstate\fP(3), +\fBpthread_setcanceltype\fP(3), +\fBpthread_cancel\fP(3). .SH BUGS -According to POSIX 1003.1c, a successful !exec*! in one of the threads +According to POSIX 1003.1c, a successful \fBexec*\fP in one of the threads should terminate automatically all other threads in the program. This behavior is not yet implemented in LinuxThreads. -Calling !pthread_kill_other_threads_np! before !exec*! achieves much -of the same behavior, except that if !exec*! ultimately fails, then +Calling \fBpthread_kill_other_threads_np\fP before \fBexec*\fP achieves much +of the same behavior, except that if \fBexec*\fP ultimately fails, then all other threads are already killed. diff --git a/linuxthreads/man/pthread_mutex_init.man b/linuxthreads/man/pthread_mutex_init.man index a0bed5f..d7622b2 100644 --- a/linuxthreads/man/pthread_mutex_init.man +++ b/linuxthreads/man/pthread_mutex_init.man @@ -38,75 +38,75 @@ different threads simultaneously. A thread attempting to lock a mutex that is already locked by another thread is suspended until the owning thread unlocks the mutex first. -!pthread_mutex_init! initializes the mutex object pointed to by -|mutex| according to the mutex attributes specified in |mutexattr|. -If |mutexattr| is !NULL!, default attributes are used instead. +\fBpthread_mutex_init\fP initializes the mutex object pointed to by +\fImutex\fP according to the mutex attributes specified in \fImutexattr\fP. +If \fImutexattr\fP is \fBNULL\fP, default attributes are used instead. The LinuxThreads implementation supports only one mutex attributes, -the |mutex kind|, which is either ``fast'', ``recursive'', or +the \fImutex kind\fP, which is either ``fast'', ``recursive'', or ``error checking''. The kind of a mutex determines whether it can be locked again by a thread that already owns it. -The default kind is ``fast''. See !pthread_mutexattr_init!(3) for more +The default kind is ``fast''. See \fBpthread_mutexattr_init\fP(3) for more information on mutex attributes. -Variables of type !pthread_mutex_t! can also be initialized -statically, using the constants !PTHREAD_MUTEX_INITIALIZER! (for fast -mutexes), !PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP! (for recursive -mutexes), and !PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP! (for error checking +Variables of type \fBpthread_mutex_t\fP can also be initialized +statically, using the constants \fBPTHREAD_MUTEX_INITIALIZER\fP (for fast +mutexes), \fBPTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP\fP (for recursive +mutexes), and \fBPTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP\fP (for error checking mutexes). -!pthread_mutex_lock! locks the given mutex. If the mutex is currently +\fBpthread_mutex_lock\fP locks the given mutex. If the mutex is currently unlocked, it becomes locked and owned by the calling thread, and -!pthread_mutex_lock! returns immediately. If the mutex is already -locked by another thread, !pthread_mutex_lock! suspends the calling +\fBpthread_mutex_lock\fP returns immediately. If the mutex is already +locked by another thread, \fBpthread_mutex_lock\fP suspends the calling thread until the mutex is unlocked. If the mutex is already locked by the calling thread, the behavior of -!pthread_mutex_lock! depends on the kind of the mutex. If the mutex is +\fBpthread_mutex_lock\fP depends on the kind of the mutex. If the mutex is of the ``fast'' kind, the calling thread is suspended until the mutex is unlocked, thus effectively causing the calling thread to deadlock. If the mutex is of the ``error checking'' kind, -!pthread_mutex_lock! returns immediately with the error code !EDEADLK!. -If the mutex is of the ``recursive'' kind, !pthread_mutex_lock! +\fBpthread_mutex_lock\fP returns immediately with the error code \fBEDEADLK\fP. +If the mutex is of the ``recursive'' kind, \fBpthread_mutex_lock\fP succeeds and returns immediately, recording the number of times the calling thread has locked the mutex. An equal number of -!pthread_mutex_unlock! operations must be performed before the mutex +\fBpthread_mutex_unlock\fP operations must be performed before the mutex returns to the unlocked state. -!pthread_mutex_trylock! behaves identically to !pthread_mutex_lock!, +\fBpthread_mutex_trylock\fP behaves identically to \fBpthread_mutex_lock\fP, except that it does not block the calling thread if the mutex is already locked by another thread (or by the calling thread in the case -of a ``fast'' mutex). Instead, !pthread_mutex_trylock! returns -immediately with the error code !EBUSY!. +of a ``fast'' mutex). Instead, \fBpthread_mutex_trylock\fP returns +immediately with the error code \fBEBUSY\fP. -!pthread_mutex_unlock! unlocks the given mutex. The mutex is assumed +\fBpthread_mutex_unlock\fP unlocks the given mutex. The mutex is assumed to be locked and owned by the calling thread on entrance to -!pthread_mutex_unlock!. If the mutex is of the ``fast'' kind, -!pthread_mutex_unlock! always returns it to the unlocked state. If it +\fBpthread_mutex_unlock\fP. If the mutex is of the ``fast'' kind, +\fBpthread_mutex_unlock\fP always returns it to the unlocked state. If it is of the ``recursive'' kind, it decrements the locking count of the -mutex (number of !pthread_mutex_lock! operations performed on it by +mutex (number of \fBpthread_mutex_lock\fP operations performed on it by the calling thread), and only when this count reaches zero is the mutex actually unlocked. On ``error checking'' and ``recursive'' mutexes, -!pthread_mutex_unlock! actually checks at run-time that the mutex is +\fBpthread_mutex_unlock\fP actually checks at run-time that the mutex is locked on entrance, and that it was locked by the same thread that is -now calling !pthread_mutex_unlock!. If these conditions are not met, +now calling \fBpthread_mutex_unlock\fP. If these conditions are not met, an error code is returned and the mutex remains unchanged. ``Fast'' mutexes perform no such checks, thus allowing a locked mutex to be unlocked by a thread other than its owner. This is non-portable behavior and must not be relied upon. -!pthread_mutex_destroy! destroys a mutex object, freeing the resources +\fBpthread_mutex_destroy\fP destroys a mutex object, freeing the resources it might hold. The mutex must be unlocked on entrance. In the LinuxThreads implementation, no resources are associated with mutex -objects, thus !pthread_mutex_destroy! actually does nothing except +objects, thus \fBpthread_mutex_destroy\fP actually does nothing except checking that the mutex is unlocked. .SH CANCELLATION None of the mutex functions is a cancellation point, not even -!pthread_mutex_lock!, in spite of the fact that it can suspend a +\fBpthread_mutex_lock\fP, in spite of the fact that it can suspend a thread for arbitrary durations. This way, the status of mutexes at cancellation points is predictable, allowing cancellation handlers to unlock precisely those mutexes that need to be unlocked before the @@ -117,58 +117,58 @@ cancellation should never hold a mutex for extended periods of time. The mutex functions are not async-signal safe. What this means is that they should not be called from a signal handler. In particular, -calling !pthread_mutex_lock! or !pthread_mutex_unlock! from a signal +calling \fBpthread_mutex_lock\fP or \fBpthread_mutex_unlock\fP from a signal handler may deadlock the calling thread. .SH "RETURN VALUE" -!pthread_mutex_init! always returns 0. The other mutex functions +\fBpthread_mutex_init\fP always returns 0. The other mutex functions return 0 on success and a non-zero error code on error. .SH ERRORS -The !pthread_mutex_lock! function returns the following error code +The \fBpthread_mutex_lock\fP function returns the following error code on error: .RS .TP -!EINVAL! +\fBEINVAL\fP the mutex has not been properly initialized. .TP -!EDEADLK! +\fBEDEADLK\fP the mutex is already locked by the calling thread (``error checking'' mutexes only). .RE -The !pthread_mutex_trylock! function returns the following error codes +The \fBpthread_mutex_trylock\fP function returns the following error codes on error: .RS .TP -!EBUSY! +\fBEBUSY\fP the mutex could not be acquired because it was currently locked. .TP -!EINVAL! +\fBEINVAL\fP the mutex has not been properly initialized. .RE -The !pthread_mutex_unlock! function returns the following error code +The \fBpthread_mutex_unlock\fP function returns the following error code on error: .RS .TP -!EINVAL! +\fBEINVAL\fP the mutex has not been properly initialized. .TP -!EPERM! +\fBEPERM\fP the calling thread does not own the mutex (``error checking'' mutexes only). .RE -The !pthread_mutex_destroy! function returns the following error code +The \fBpthread_mutex_destroy\fP function returns the following error code on error: .RS .TP -!EBUSY! +\fBEBUSY\fP the mutex is currently locked. .RE @@ -176,13 +176,13 @@ the mutex is currently locked. Xavier Leroy .SH "SEE ALSO" -!pthread_mutexattr_init!(3), -!pthread_mutexattr_setkind_np!(3), -!pthread_cancel!(3). +\fBpthread_mutexattr_init\fP(3), +\fBpthread_mutexattr_setkind_np\fP(3), +\fBpthread_cancel\fP(3). .SH EXAMPLE -A shared global variable |x| can be protected by a mutex as follows: +A shared global variable \fIx\fP can be protected by a mutex as follows: .RS .ft 3 @@ -195,8 +195,8 @@ pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER; .RE .fi -All accesses and modifications to |x| should be bracketed by calls to -!pthread_mutex_lock! and !pthread_mutex_unlock! as follows: +All accesses and modifications to \fIx\fP should be bracketed by calls to +\fBpthread_mutex_lock\fP and \fBpthread_mutex_unlock\fP as follows: .RS .ft 3 diff --git a/linuxthreads/man/pthread_mutexattr_init.man b/linuxthreads/man/pthread_mutexattr_init.man index b838948..144a78c 100644 --- a/linuxthreads/man/pthread_mutexattr_init.man +++ b/linuxthreads/man/pthread_mutexattr_init.man @@ -21,64 +21,64 @@ int pthread_mutexattr_gettype(const pthread_mutexattr_t *attr, int *kind); .SH DESCRIPTION Mutex attributes can be specified at mutex creation time, by passing a -mutex attribute object as second argument to !pthread_mutex_init!(3). -Passing !NULL! is equivalent to passing a mutex attribute object with +mutex attribute object as second argument to \fBpthread_mutex_init\fP(3). +Passing \fBNULL\fP is equivalent to passing a mutex attribute object with all attributes set to their default values. -!pthread_mutexattr_init! initializes the mutex attribute object |attr| +\fBpthread_mutexattr_init\fP initializes the mutex attribute object \fIattr\fP and fills it with default values for the attributes. -!pthread_mutexattr_destroy! destroys a mutex attribute object, which -must not be reused until it is reinitialized. !pthread_mutexattr_destroy! +\fBpthread_mutexattr_destroy\fP destroys a mutex attribute object, which +must not be reused until it is reinitialized. \fBpthread_mutexattr_destroy\fP does nothing in the LinuxThreads implementation. LinuxThreads supports only one mutex attribute: the mutex kind, which -is either !PTHREAD_MUTEX_FAST_NP! for ``fast'' mutexes, -!PTHREAD_MUTEX_RECURSIVE_NP! for ``recursive'' mutexes, -or !PTHREAD_MUTEX_ERRORCHECK_NP! for ``error checking'' mutexes. -As the !NP! suffix indicates, this is a non-portable extension to the +is either \fBPTHREAD_MUTEX_FAST_NP\fP for ``fast'' mutexes, +\fBPTHREAD_MUTEX_RECURSIVE_NP\fP for ``recursive'' mutexes, +or \fBPTHREAD_MUTEX_ERRORCHECK_NP\fP for ``error checking'' mutexes. +As the \fBNP\fP suffix indicates, this is a non-portable extension to the POSIX standard and should not be employed in portable programs. The mutex kind determines what happens if a thread attempts to lock a -mutex it already owns with !pthread_mutex_lock!(3). If the mutex is of -the ``fast'' kind, !pthread_mutex_lock!(3) simply suspends the calling +mutex it already owns with \fBpthread_mutex_lock\fP(3). If the mutex is of +the ``fast'' kind, \fBpthread_mutex_lock\fP(3) simply suspends the calling thread forever. If the mutex is of the ``error checking'' kind, -!pthread_mutex_lock!(3) returns immediately with the error code -!EDEADLK!. If the mutex is of the ``recursive'' kind, the call to -!pthread_mutex_lock!(3) returns immediately with a success return +\fBpthread_mutex_lock\fP(3) returns immediately with the error code +\fBEDEADLK\fP. If the mutex is of the ``recursive'' kind, the call to +\fBpthread_mutex_lock\fP(3) returns immediately with a success return code. The number of times the thread owning the mutex has locked it is recorded in the mutex. The owning thread must call -!pthread_mutex_unlock!(3) the same number of times before the mutex +\fBpthread_mutex_unlock\fP(3) the same number of times before the mutex returns to the unlocked state. -The default mutex kind is ``fast'', that is, !PTHREAD_MUTEX_FAST_NP!. +The default mutex kind is ``fast'', that is, \fBPTHREAD_MUTEX_FAST_NP\fP. -!pthread_mutexattr_settype! sets the mutex kind attribute in |attr| -to the value specified by |kind|. +\fBpthread_mutexattr_settype\fP sets the mutex kind attribute in \fIattr\fP +to the value specified by \fIkind\fP. -!pthread_mutexattr_gettype! retrieves the current value of the -mutex kind attribute in |attr| and stores it in the location pointed -to by |kind|. +\fBpthread_mutexattr_gettype\fP retrieves the current value of the +mutex kind attribute in \fIattr\fP and stores it in the location pointed +to by \fIkind\fP. .SH "RETURN VALUE" -!pthread_mutexattr_init!, !pthread_mutexattr_destroy! and -!pthread_mutexattr_gettype! always return 0. +\fBpthread_mutexattr_init\fP, \fBpthread_mutexattr_destroy\fP and +\fBpthread_mutexattr_gettype\fP always return 0. -!pthread_mutexattr_settype! returns 0 on success and a non-zero +\fBpthread_mutexattr_settype\fP returns 0 on success and a non-zero error code on error. .SH ERRORS -On error, !pthread_mutexattr_settype! returns the following error code: +On error, \fBpthread_mutexattr_settype\fP returns the following error code: .TP -!EINVAL! -|kind| is neither !PTHREAD_MUTEX_FAST_NP! nor !PTHREAD_MUTEX_RECURSIVE_NP! -nor !PTHREAD_MUTEX_ERRORCHECK_NP! +\fBEINVAL\fP +\fIkind\fP is neither \fBPTHREAD_MUTEX_FAST_NP\fP nor \fBPTHREAD_MUTEX_RECURSIVE_NP\fP +nor \fBPTHREAD_MUTEX_ERRORCHECK_NP\fP .SH AUTHOR Xavier Leroy .SH "SEE ALSO" -!pthread_mutex_init!(3), -!pthread_mutex_lock!(3), -!pthread_mutex_unlock!(3). +\fBpthread_mutex_init\fP(3), +\fBpthread_mutex_lock\fP(3), +\fBpthread_mutex_unlock\fP(3). diff --git a/linuxthreads/man/pthread_mutexattr_setkind_np.man b/linuxthreads/man/pthread_mutexattr_setkind_np.man index e10f47d..4a6c165 100644 --- a/linuxthreads/man/pthread_mutexattr_setkind_np.man +++ b/linuxthreads/man/pthread_mutexattr_setkind_np.man @@ -14,26 +14,26 @@ int pthread_mutexattr_getkind_np(const pthread_mutexattr_t *attr, int *kind); .SH DESCRIPTION -These functions are deprecated, use !pthread_mutexattr_settype!(3) -and !pthread_mutexattr_gettype!(3) instead. +These functions are deprecated, use \fBpthread_mutexattr_settype\fP(3) +and \fBpthread_mutexattr_gettype\fP(3) instead. .SH "RETURN VALUE" -!pthread_mutexattr_getkind_np! always returns 0. +\fBpthread_mutexattr_getkind_np\fP always returns 0. -!pthread_mutexattr_setkind_np! returns 0 on success and a non-zero +\fBpthread_mutexattr_setkind_np\fP returns 0 on success and a non-zero error code on error. .SH ERRORS -On error, !pthread_mutexattr_setkind_np! returns the following error code: +On error, \fBpthread_mutexattr_setkind_np\fP returns the following error code: .TP -!EINVAL! -|kind| is neither !PTHREAD_MUTEX_FAST_NP! nor !PTHREAD_MUTEX_RECURSIVE_NP! -nor !PTHREAD_MUTEX_ERRORCHECK_NP! +\fBEINVAL\fP +\fIkind\fP is neither \fBPTHREAD_MUTEX_FAST_NP\fP nor \fBPTHREAD_MUTEX_RECURSIVE_NP\fP +nor \fBPTHREAD_MUTEX_ERRORCHECK_NP\fP .SH AUTHOR Xavier Leroy .SH "SEE ALSO" -!pthread_mutexattr_settype!(3), -!pthread_mutexattr_gettype!(3). +\fBpthread_mutexattr_settype\fP(3), +\fBpthread_mutexattr_gettype\fP(3). diff --git a/linuxthreads/man/pthread_once.man b/linuxthreads/man/pthread_once.man index e9d117b..7a87abe 100644 --- a/linuxthreads/man/pthread_once.man +++ b/linuxthreads/man/pthread_once.man @@ -12,19 +12,19 @@ int pthread_once(pthread_once_t *once_control, void (*init_routine) (void)); .SH DESCRIPTION -The purpose of !pthread_once! is to ensure that a piece of -initialization code is executed at most once. The |once_control| +The purpose of \fBpthread_once\fP is to ensure that a piece of +initialization code is executed at most once. The \fIonce_control\fP argument points to a static or extern variable statically initialized -to !PTHREAD_ONCE_INIT!. +to \fBPTHREAD_ONCE_INIT\fP. -The first time !pthread_once! is called with a given |once_control| -argument, it calls |init_routine| with no argument and changes the -value of the |once_control| variable to record that initialization has -been performed. Subsequent calls to !pthread_once! with the same -!once_control! argument do nothing. +The first time \fBpthread_once\fP is called with a given \fIonce_control\fP +argument, it calls \fIinit_routine\fP with no argument and changes the +value of the \fIonce_control\fP variable to record that initialization has +been performed. Subsequent calls to \fBpthread_once\fP with the same +\fBonce_control\fP argument do nothing. .SH "RETURN VALUE" -!pthread_once! always returns 0. +\fBpthread_once\fP always returns 0. .SH ERRORS None. diff --git a/linuxthreads/man/pthread_self.man b/linuxthreads/man/pthread_self.man index 3aa4a00..0d09d93 100644 --- a/linuxthreads/man/pthread_self.man +++ b/linuxthreads/man/pthread_self.man @@ -9,15 +9,15 @@ pthread_self \- return identifier of current thread pthread_t pthread_self(void); .SH DESCRIPTION -!pthread_self! return the thread identifier for the calling thread. +\fBpthread_self\fP return the thread identifier for the calling thread. .SH AUTHOR Xavier Leroy .SH "SEE ALSO" -!pthread_equal!(3), -!pthread_join!(3), -!pthread_detach!(3), -!pthread_setschedparam!(3), -!pthread_getschedparam!(3). +\fBpthread_equal\fP(3), +\fBpthread_join\fP(3), +\fBpthread_detach\fP(3), +\fBpthread_setschedparam\fP(3), +\fBpthread_getschedparam\fP(3). diff --git a/linuxthreads/man/pthread_setschedparam.man b/linuxthreads/man/pthread_setschedparam.man index 3992927..f3d26ec 100644 --- a/linuxthreads/man/pthread_setschedparam.man +++ b/linuxthreads/man/pthread_setschedparam.man @@ -14,66 +14,66 @@ int pthread_getschedparam(pthread_t target_thread, int *policy, struct sched_par .SH DESCRIPTION -!pthread_setschedparam! sets the scheduling parameters for the thread -|target_thread| as indicated by |policy| and |param|. |policy| can be -either !SCHED_OTHER! (regular, non-realtime scheduling), !SCHED_RR! -(realtime, round-robin) or !SCHED_FIFO! (realtime, first-in -first-out). |param| specifies the scheduling priority for the two -realtime policies. See !sched_setpolicy!(2) for more information on +\fBpthread_setschedparam\fP sets the scheduling parameters for the thread +\fItarget_thread\fP as indicated by \fIpolicy\fP and \fIparam\fP. \fIpolicy\fP can be +either \fBSCHED_OTHER\fP (regular, non-realtime scheduling), \fBSCHED_RR\fP +(realtime, round-robin) or \fBSCHED_FIFO\fP (realtime, first-in +first-out). \fIparam\fP specifies the scheduling priority for the two +realtime policies. See \fBsched_setpolicy\fP(2) for more information on scheduling policies. -The realtime scheduling policies !SCHED_RR! and !SCHED_FIFO! are +The realtime scheduling policies \fBSCHED_RR\fP and \fBSCHED_FIFO\fP are available only to processes with superuser privileges. -!pthread_getschedparam! retrieves the scheduling policy and scheduling -parameters for the thread |target_thread| and store them in the -locations pointed to by |policy| and |param|, respectively. +\fBpthread_getschedparam\fP retrieves the scheduling policy and scheduling +parameters for the thread \fItarget_thread\fP and store them in the +locations pointed to by \fIpolicy\fP and \fIparam\fP, respectively. .SH "RETURN VALUE" -!pthread_setschedparam! and !pthread_getschedparam! return 0 on +\fBpthread_setschedparam\fP and \fBpthread_getschedparam\fP return 0 on success and a non-zero error code on error. .SH ERRORS -On error, !pthread_setschedparam! returns the following error codes: +On error, \fBpthread_setschedparam\fP returns the following error codes: .RS .TP -!EINVAL! -|policy| is not one of !SCHED_OTHER!, !SCHED_RR!, !SCHED_FIFO! +\fBEINVAL\fP +\fIpolicy\fP is not one of \fBSCHED_OTHER\fP, \fBSCHED_RR\fP, \fBSCHED_FIFO\fP .TP -!EINVAL! -the priority value specified by |param| is not valid for the specified policy +\fBEINVAL\fP +the priority value specified by \fIparam\fP is not valid for the specified policy .TP -!EPERM! +\fBEPERM\fP the calling process does not have superuser permissions .TP -!ESRCH! -the |target_thread| is invalid or has already terminated +\fBESRCH\fP +the \fItarget_thread\fP is invalid or has already terminated .TP -!EFAULT! -|param| points outside the process memory space +\fBEFAULT\fP +\fIparam\fP points outside the process memory space .RE -On error, !pthread_getschedparam! returns the following error codes: +On error, \fBpthread_getschedparam\fP returns the following error codes: .RS .TP -!ESRCH! -the |target_thread| is invalid or has already terminated +\fBESRCH\fP +the \fItarget_thread\fP is invalid or has already terminated .TP -!EFAULT! -|policy| or |param| point outside the process memory space +\fBEFAULT\fP +\fIpolicy\fP or \fIparam\fP point outside the process memory space .RE .SH AUTHOR Xavier Leroy .SH "SEE ALSO" -!sched_setscheduler!(2), -!sched_getscheduler!(2), -!sched_getparam!(2), -!pthread_attr_setschedpolicy!(3), -!pthread_attr_setschedparam!(3). +\fBsched_setscheduler\fP(2), +\fBsched_getscheduler\fP(2), +\fBsched_getparam\fP(2), +\fBpthread_attr_setschedpolicy\fP(3), +\fBpthread_attr_setschedparam\fP(3). diff --git a/linuxthreads/man/pthread_sigmask.man b/linuxthreads/man/pthread_sigmask.man index 784161d..aa8b102 100644 --- a/linuxthreads/man/pthread_sigmask.man +++ b/linuxthreads/man/pthread_sigmask.man @@ -19,36 +19,36 @@ int sigwait(const sigset_t *set, int *sig); .SH DESCRIPTION -!pthread_sigmask! changes the signal mask for the calling thread as -described by the |how| and |newmask| arguments. If |oldmask| is not -!NULL!, the previous signal mask is stored in the location pointed to -by |oldmask|. - -The meaning of the |how| and |newmask| arguments is the same as for -!sigprocmask!(2). If |how| is !SIG_SETMASK!, the signal mask is set to -|newmask|. If |how| is !SIG_BLOCK!, the signals specified to |newmask| -are added to the current signal mask. If |how| is !SIG_UNBLOCK!, the -signals specified to |newmask| are removed from the current signal +\fBpthread_sigmask\fP changes the signal mask for the calling thread as +described by the \fIhow\fP and \fInewmask\fP arguments. If \fIoldmask\fP is not +\fBNULL\fP, the previous signal mask is stored in the location pointed to +by \fIoldmask\fP. + +The meaning of the \fIhow\fP and \fInewmask\fP arguments is the same as for +\fBsigprocmask\fP(2). If \fIhow\fP is \fBSIG_SETMASK\fP, the signal mask is set to +\fInewmask\fP. If \fIhow\fP is \fBSIG_BLOCK\fP, the signals specified to \fInewmask\fP +are added to the current signal mask. If \fIhow\fP is \fBSIG_UNBLOCK\fP, the +signals specified to \fInewmask\fP are removed from the current signal mask. Recall that signal masks are set on a per-thread basis, but signal -actions and signal handlers, as set with !sigaction!(2), are shared +actions and signal handlers, as set with \fBsigaction\fP(2), are shared between all threads. -!pthread_kill! send signal number |signo| to the thread -|thread|. The signal is delivered and handled as described in -!kill!(2). +\fBpthread_kill\fP send signal number \fIsigno\fP to the thread +\fIthread\fP. The signal is delivered and handled as described in +\fBkill\fP(2). -!sigwait! suspends the calling thread until one of the signals -in |set| is delivered to the calling thread. It then stores the number -of the signal received in the location pointed to by |sig| and -returns. The signals in |set| must be blocked and not ignored on -entrance to !sigwait!. If the delivered signal has a signal handler -function attached, that function is |not| called. +\fBsigwait\fP suspends the calling thread until one of the signals +in \fIset\fP is delivered to the calling thread. It then stores the number +of the signal received in the location pointed to by \fIsig\fP and +returns. The signals in \fIset\fP must be blocked and not ignored on +entrance to \fBsigwait\fP. If the delivered signal has a signal handler +function attached, that function is \fInot\fP called. .SH CANCELLATION -!sigwait! is a cancellation point. +\fBsigwait\fP is a cancellation point. .SH "RETURN VALUE" @@ -56,50 +56,50 @@ On success, 0 is returned. On failure, a non-zero error code is returned. .SH ERRORS -The !pthread_sigmask! function returns the following error codes +The \fBpthread_sigmask\fP function returns the following error codes on error: .RS .TP -!EINVAL! -|how| is not one of !SIG_SETMASK!, !SIG_BLOCK!, or !SIG_UNBLOCK! +\fBEINVAL\fP +\fIhow\fP is not one of \fBSIG_SETMASK\fP, \fBSIG_BLOCK\fP, or \fBSIG_UNBLOCK\fP .TP -!EFAULT! -|newmask| or |oldmask| point to invalid addresses +\fBEFAULT\fP +\fInewmask\fP or \fIoldmask\fP point to invalid addresses .RE -The !pthread_kill! function returns the following error codes +The \fBpthread_kill\fP function returns the following error codes on error: .RS .TP -!EINVAL! -|signo| is not a valid signal number +\fBEINVAL\fP +\fIsigno\fP is not a valid signal number .TP -!ESRCH! -the thread |thread| does not exist (e.g. it has already terminated) +\fBESRCH\fP +the thread \fIthread\fP does not exist (e.g. it has already terminated) .RE -The !sigwait! function never returns an error. +The \fBsigwait\fP function never returns an error. .SH AUTHOR Xavier Leroy .SH "SEE ALSO" -!sigprocmask!(2), -!kill!(2), -!sigaction!(2), -!sigsuspend!(2). +\fBsigprocmask\fP(2), +\fBkill\fP(2), +\fBsigaction\fP(2), +\fBsigsuspend\fP(2). .SH NOTES -For !sigwait! to work reliably, the signals being waited for must be +For \fBsigwait\fP to work reliably, the signals being waited for must be blocked in all threads, not only in the calling thread, since otherwise the POSIX semantics for signal delivery do not guarantee -that it's the thread doing the !sigwait! that will receive the signal. +that it's the thread doing the \fBsigwait\fP that will receive the signal. The best way to achieve this is block those signals before any threads are created, and never unblock them in the program other than by -calling !sigwait!. +calling \fBsigwait\fP. .SH BUGS @@ -112,11 +112,11 @@ not currently block the signal. In LinuxThreads, each thread is actually a kernel process with its own PID, so external signals are always directed to one particular thread. -If, for instance, another thread is blocked in !sigwait! on that +If, for instance, another thread is blocked in \fBsigwait\fP on that signal, it will not be restarted. -The LinuxThreads implementation of !sigwait! installs dummy signal -handlers for the signals in |set| for the duration of the wait. Since +The LinuxThreads implementation of \fBsigwait\fP installs dummy signal +handlers for the signals in \fIset\fP for the duration of the wait. Since signal handlers are shared between all threads, other threads must not attach their own signal handlers to these signals, or alternatively they should all block these signals (which is recommended anyway -- diff --git a/linuxthreads/man/sem_init.man b/linuxthreads/man/sem_init.man index e3a1a63..a24af96 100644 --- a/linuxthreads/man/sem_init.man +++ b/linuxthreads/man/sem_init.man @@ -26,98 +26,98 @@ int sem_destroy(sem_t * sem); .SH DESCRIPTION This manual page documents POSIX 1003.1b semaphores, not to be -confused with SystemV semaphores as described in !ipc!(5), !semctl!(2) -and !semop!(2). +confused with SystemV semaphores as described in \fBipc\fP(5), \fBsemctl\fP(2) +and \fBsemop\fP(2). Semaphores are counters for resources shared between threads. The basic operations on semaphores are: increment the counter atomically, and wait until the counter is non-null and decrement it atomically. -!sem_init! initializes the semaphore object pointed to by |sem|. The -count associated with the semaphore is set initially to |value|. The -|pshared| argument indicates whether the semaphore is local to the -current process (|pshared| is zero) or is to be shared between several -processes (|pshared| is not zero). LinuxThreads currently does not -support process-shared semaphores, thus !sem_init! always returns with -error !ENOSYS! if |pshared| is not zero. +\fBsem_init\fP initializes the semaphore object pointed to by \fIsem\fP. The +count associated with the semaphore is set initially to \fIvalue\fP. The +\fIpshared\fP argument indicates whether the semaphore is local to the +current process (\fIpshared\fP is zero) or is to be shared between several +processes (\fIpshared\fP is not zero). LinuxThreads currently does not +support process-shared semaphores, thus \fBsem_init\fP always returns with +error \fBENOSYS\fP if \fIpshared\fP is not zero. -!sem_wait! suspends the calling thread until the semaphore pointed to -by |sem| has non-zero count. It then atomically decreases the +\fBsem_wait\fP suspends the calling thread until the semaphore pointed to +by \fIsem\fP has non-zero count. It then atomically decreases the semaphore count. -!sem_trywait! is a non-blocking variant of !sem_wait!. If the -semaphore pointed to by |sem| has non-zero count, the count is -atomically decreased and !sem_trywait! immediately returns 0. -If the semaphore count is zero, !sem_trywait! immediately returns with -error !EAGAIN!. +\fBsem_trywait\fP is a non-blocking variant of \fBsem_wait\fP. If the +semaphore pointed to by \fIsem\fP has non-zero count, the count is +atomically decreased and \fBsem_trywait\fP immediately returns 0. +If the semaphore count is zero, \fBsem_trywait\fP immediately returns with +error \fBEAGAIN\fP. -!sem_post! atomically increases the count of the semaphore pointed to -by |sem|. This function never blocks and can safely be used in +\fBsem_post\fP atomically increases the count of the semaphore pointed to +by \fIsem\fP. This function never blocks and can safely be used in asynchronous signal handlers. -!sem_getvalue! stores in the location pointed to by |sval| the current -count of the semaphore |sem|. +\fBsem_getvalue\fP stores in the location pointed to by \fIsval\fP the current +count of the semaphore \fIsem\fP. -!sem_destroy! destroys a semaphore object, freeing the resources it +\fBsem_destroy\fP destroys a semaphore object, freeing the resources it might hold. No threads should be waiting on the semaphore at the time -!sem_destroy! is called. In the LinuxThreads implementation, no -resources are associated with semaphore objects, thus !sem_destroy! +\fBsem_destroy\fP is called. In the LinuxThreads implementation, no +resources are associated with semaphore objects, thus \fBsem_destroy\fP actually does nothing except checking that no thread is waiting on the semaphore. .SH CANCELLATION -!sem_wait! is a cancellation point. +\fBsem_wait\fP is a cancellation point. .SH "ASYNC-SIGNAL SAFETY" On processors supporting atomic compare-and-swap (Intel 486, Pentium -and later, Alpha, PowerPC, MIPS II, Motorola 68k), the !sem_post! +and later, Alpha, PowerPC, MIPS II, Motorola 68k), the \fBsem_post\fP function is async-signal safe and can therefore be called from signal handlers. This is the only thread synchronization function provided by POSIX threads that is async-signal safe. On the Intel 386 and the Sparc, the current LinuxThreads -implementation of !sem_post! is not async-signal safe by lack of the +implementation of \fBsem_post\fP is not async-signal safe by lack of the required atomic operations. .SH "RETURN VALUE" -The !sem_wait! and !sem_getvalue! functions always return 0. +The \fBsem_wait\fP and \fBsem_getvalue\fP functions always return 0. All other semaphore functions return 0 on success and -1 on error, in -addition to writing an error code in !errno!. +addition to writing an error code in \fBerrno\fP. .SH ERRORS -The !sem_init! function sets !errno! to the following codes on error: +The \fBsem_init\fP function sets \fBerrno\fP to the following codes on error: .RS .TP -!EINVAL! -|value| exceeds the maximal counter value !SEM_VALUE_MAX! +\fBEINVAL\fP +\fIvalue\fP exceeds the maximal counter value \fBSEM_VALUE_MAX\fP .TP -!ENOSYS! -|pshared| is not zero +\fBENOSYS\fP +\fIpshared\fP is not zero .RE -The !sem_trywait! function sets !errno! to the following error code on error: +The \fBsem_trywait\fP function sets \fBerrno\fP to the following error code on error: .RS .TP -!EAGAIN! +\fBEAGAIN\fP the semaphore count is currently 0 .RE -The !sem_post! function sets !errno! to the following error code on error: +The \fBsem_post\fP function sets \fBerrno\fP to the following error code on error: .RS .TP -!ERANGE! -after incrementation, the semaphore value would exceed !SEM_VALUE_MAX! +\fBERANGE\fP +after incrementation, the semaphore value would exceed \fBSEM_VALUE_MAX\fP (the semaphore count is left unchanged in this case) .RE -The !sem_destroy! function sets !errno! to the following error code on error: +The \fBsem_destroy\fP function sets \fBerrno\fP to the following error code on error: .RS .TP -!EBUSY! +\fBEBUSY\fP some threads are currently blocked waiting on the semaphore. .RE @@ -125,8 +125,8 @@ some threads are currently blocked waiting on the semaphore. Xavier Leroy .SH "SEE ALSO" -!pthread_mutex_init!(3), -!pthread_cond_init!(3), -!pthread_cancel!(3), -!ipc!(5). +\fBpthread_mutex_init\fP(3), +\fBpthread_cond_init\fP(3), +\fBpthread_cancel\fP(3), +\fBipc\fP(5). diff --git a/linuxthreads/oldsemaphore.c b/linuxthreads/oldsemaphore.c index d35683b..4ae0ded 100644 --- a/linuxthreads/oldsemaphore.c +++ b/linuxthreads/oldsemaphore.c @@ -31,7 +31,7 @@ typedef struct { long int sem_status; - int sem_spinlock; + __atomic_lock_t sem_spinlock; } old_sem_t; extern int __old_sem_init (old_sem_t *__sem, int __pshared, unsigned int __value); diff --git a/linuxthreads/pt-machine.c b/linuxthreads/pt-machine.c index 5cd477c..ff0d3e2 100644 --- a/linuxthreads/pt-machine.c +++ b/linuxthreads/pt-machine.c @@ -19,7 +19,9 @@ #define PT_EI -extern long int testandset (int *spinlock); +#include + +extern long int testandset (__atomic_lock_t *spinlock); extern int __compare_and_swap (long int *p, long int oldval, long int newval); #include diff --git a/linuxthreads/pthread.c b/linuxthreads/pthread.c index 44933b4..105be59 100644 --- a/linuxthreads/pthread.c +++ b/linuxthreads/pthread.c @@ -309,7 +309,7 @@ __pthread_initialize_minimal(void) pthread_descr self; /* First of all init __pthread_handles[0] and [1] if needed. */ -# if __LT_SPINLOCK_INIT != 0 +# ifdef __LT_INITIALIZER_NOT_ZERO __pthread_handles[0].h_lock = __LOCK_INITIALIZER; __pthread_handles[1].h_lock = __LOCK_INITIALIZER; # endif @@ -379,7 +379,7 @@ cannot allocate TLS data structures for initial thread\n"; # endif /* self->p_start_args need not be initialized, it's all zero. */ self->p_userstack = 1; -# if __LT_SPINLOCK_INIT != 0 +# ifdef __LT_INITIALIZER_NOT_ZERO self->p_resume_count = (struct pthread_atomic) __ATOMIC_INITIALIZER; # endif self->p_alloca_cutoff = __MAX_ALLOCA_CUTOFF; @@ -393,7 +393,7 @@ cannot allocate TLS data structures for initial thread\n"; #else /* USE_TLS */ /* First of all init __pthread_handles[0] and [1]. */ -# if __LT_SPINLOCK_INIT != 0 +# ifdef __LT_INITIALIZER_NOT_ZERO __pthread_handles[0].h_lock = __LOCK_INITIALIZER; __pthread_handles[1].h_lock = __LOCK_INITIALIZER; # endif @@ -429,6 +429,8 @@ __pthread_init_max_stacksize(void) #ifdef FLOATING_STACKS if (limit.rlim_cur == RLIM_INFINITY) limit.rlim_cur = ARCH_STACK_MAX_SIZE; + if (limit.rlim_cur > 4 * ARCH_STACK_MAX_SIZE) + limit.rlim_cur = 4 * ARCH_STACK_MAX_SIZE; # ifdef NEED_SEPARATE_REGISTER_STACK max_stack = limit.rlim_cur / 2; # else @@ -662,6 +664,29 @@ int __pthread_initialize_manager(void) free(__pthread_manager_thread_bos); return -1; } + /* Make sure the file descriptors of the pipe doesn't collide + with stdin, stdout or stderr if they have been closed. */ + if (manager_pipe[0] < 3) { + int new_fd; + new_fd = fcntl(manager_pipe[0], F_DUPFD, 3); + close(manager_pipe[0]); + if (new_fd == -1) { + free(__pthread_manager_thread_bos); + return -1; + } + manager_pipe[0] = new_fd; + } + if (manager_pipe[1] < 3) { + int new_fd; + new_fd = fcntl(manager_pipe[1], F_DUPFD, 3); + close(manager_pipe[1]); + if (new_fd == -1) { + close(manager_pipe[0]); + free(__pthread_manager_thread_bos); + return -1; + } + manager_pipe[1] = new_fd; + } #ifdef USE_TLS /* Allocate memory for the thread descriptor and the dtv. */ @@ -696,8 +721,8 @@ int __pthread_initialize_manager(void) # endif mgr->p_start_args = (struct pthread_start_args) PTHREAD_START_ARGS_INITIALIZER(__pthread_manager); mgr->p_nr = 1; -# if __LT_SPINLOCK_INIT != 0 - self->p_resume_count = (struct pthread_atomic) __ATOMIC_INITIALIZER; +# ifdef __LT_INITIALIZER_NOT_ZERO + mgr->p_resume_count = (struct pthread_atomic) __ATOMIC_INITIALIZER; # endif mgr->p_alloca_cutoff = PTHREAD_STACK_MIN / 4; #else @@ -1199,6 +1224,15 @@ void __pthread_kill_other_threads_np(void) /* Reset the signal handlers behaviour for the signals the implementation uses since this would be passed to the new process. */ +#if 1 + /* + do not do it as it is wrong. + the __pthread_kill_other_threads_np() is used just before exec, + the successfull one resets signals with handler into DFL behaviour anyway (in kernel), + the failed one needs the signal handler as before to allow creating of new threads + as already noted above + */ +#else sigemptyset(&sa.sa_mask); sa.sa_flags = 0; sa.sa_handler = SIG_DFL; @@ -1206,6 +1240,7 @@ void __pthread_kill_other_threads_np(void) __libc_sigaction(__pthread_sig_cancel, &sa, NULL); if (__pthread_sig_debug > 0) __libc_sigaction(__pthread_sig_debug, &sa, NULL); +#endif } weak_alias (__pthread_kill_other_threads_np, pthread_kill_other_threads_np) @@ -1287,6 +1322,7 @@ __pthread_timedsuspend_old(pthread_descr self, const struct timespec *abstime) struct timespec reltime; /* Compute a time offset relative to now. */ +#error "gettimeofday() ignores pthread_condattr_setclock() setting" __gettimeofday (&now, NULL); reltime.tv_nsec = abstime->tv_nsec - now.tv_usec * 1000; reltime.tv_sec = abstime->tv_sec - now.tv_sec; @@ -1357,6 +1393,12 @@ void __pthread_restart_new(pthread_descr th) int __pthread_timedsuspend_new(pthread_descr self, const struct timespec *abstime) { + return __pthread_timedsuspend_new_clk (self, abstime, CLOCK_REALTIME); +} + +int +__pthread_timedsuspend_new_clk(pthread_descr self, const struct timespec *abstime, clockid_t clock_id) +{ sigset_t unblock, initial_mask; int was_signalled = 0; sigjmp_buf jmpbuf; @@ -1370,12 +1412,11 @@ __pthread_timedsuspend_new(pthread_descr self, const struct timespec *abstime) sigprocmask(SIG_UNBLOCK, &unblock, &initial_mask); while (1) { - struct timeval now; - struct timespec reltime; + struct timespec now, reltime; /* Compute a time offset relative to now. */ - __gettimeofday (&now, NULL); - reltime.tv_nsec = abstime->tv_nsec - now.tv_usec * 1000; + INLINE_SYSCALL (clock_gettime, 2, clock_id, &now); + reltime.tv_nsec = abstime->tv_nsec - now.tv_nsec; reltime.tv_sec = abstime->tv_sec - now.tv_sec; if (reltime.tv_nsec < 0) { reltime.tv_nsec += 1000000000; diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_cond_wait.S b/linuxthreads/pthread_condattr_getclock.c similarity index 77% rename from nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_cond_wait.S rename to linuxthreads/pthread_condattr_getclock.c index 9b57fba..5c558bc 100644 --- a/nptl/sysdeps/unix/sysv/linux/i386/i586/pthread_cond_wait.S +++ b/linuxthreads/pthread_condattr_getclock.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2003 Free Software Foundation, Inc. +/* Copyright (C) 2003, 2004, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 2003. @@ -17,4 +17,14 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -#include "../i486/pthread_cond_wait.S" +#include + +int +pthread_condattr_getclock (attr, clock_id) + const pthread_condattr_t *attr; + clockid_t *clock_id; +{ + *clock_id = attr->__clock_id; + + return 0; +} diff --git a/linuxthreads/pthread_condattr_setclock.c b/linuxthreads/pthread_condattr_setclock.c new file mode 100644 index 0000000..9cea046 --- /dev/null +++ b/linuxthreads/pthread_condattr_setclock.c @@ -0,0 +1,63 @@ +/* Copyright (C) 2003, 2004, 2007, 2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 2003. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include +#include +#include +#include +#include +#include +#include + +int +pthread_condattr_setclock (attr, clock_id) + pthread_condattr_t *attr; + clockid_t clock_id; +{ + /* Only a few clocks are allowed. CLOCK_REALTIME is always allowed. + CLOCK_MONOTONIC only if the kernel has the necessary support. */ + if (clock_id == CLOCK_MONOTONIC) + { +#ifndef __ASSUME_POSIX_TIMERS +# ifdef SYS_clock_getres + /* Check whether the clock is available. */ + static int avail; + + if (avail == 0) + { + struct timespec ts; + + avail = INLINE_SYSCALL (clock_getres, 2, CLOCK_MONOTONIC, &ts); + } + + if (avail < 0) +# endif + /* Not available. */ + return EINVAL; +#endif + } + else if (clock_id != CLOCK_REALTIME) + /* If more clocks are allowed some day the storing of the clock ID + in the pthread_cond_t structure needs to be adjusted. */ + return EINVAL; + + attr->__clock_id = clock_id; + + return 0; +} diff --git a/linuxthreads/semaphore.h b/linuxthreads/semaphore.h deleted file mode 100644 index 8407007..0000000 --- a/linuxthreads/semaphore.h +++ /dev/null @@ -1,87 +0,0 @@ -/* Linuxthreads - a simple clone()-based implementation of Posix */ -/* threads for Linux. */ -/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr) */ -/* */ -/* This program is free software; you can redistribute it and/or */ -/* modify it under the terms of the GNU Library General Public License */ -/* as published by the Free Software Foundation; either version 2 */ -/* of the License, or (at your option) any later version. */ -/* */ -/* This program is distributed in the hope that it will be useful, */ -/* but WITHOUT ANY WARRANTY; without even the implied warranty of */ -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ -/* GNU Library General Public License for more details. */ - -#ifndef _SEMAPHORE_H -#define _SEMAPHORE_H 1 - -#include -#include -#ifdef __USE_XOPEN2K -# define __need_timespec -# include -#endif - -#ifndef _PTHREAD_DESCR_DEFINED -/* Thread descriptors. Needed for `sem_t' definition. */ -typedef struct _pthread_descr_struct *_pthread_descr; -# define _PTHREAD_DESCR_DEFINED -#endif - -/* System specific semaphore definition. */ -typedef struct -{ - struct _pthread_fastlock __sem_lock; - int __sem_value; - _pthread_descr __sem_waiting; -} sem_t; - - - -/* Value returned if `sem_open' failed. */ -#define SEM_FAILED ((sem_t *) 0) - -/* Maximum value the semaphore can have. */ -#define SEM_VALUE_MAX (2147483647) - - -__BEGIN_DECLS - -/* Initialize semaphore object SEM to VALUE. If PSHARED then share it - with other processes. */ -extern int sem_init (sem_t *__sem, int __pshared, unsigned int __value) __THROW; - -/* Free resources associated with semaphore object SEM. */ -extern int sem_destroy (sem_t *__sem) __THROW; - -/* Open a named semaphore NAME with open flaot OFLAG. */ -extern sem_t *sem_open (__const char *__name, int __oflag, ...) __THROW; - -/* Close descriptor for named semaphore SEM. */ -extern int sem_close (sem_t *__sem) __THROW; - -/* Remove named semaphore NAME. */ -extern int sem_unlink (__const char *__name) __THROW; - -/* Wait for SEM being posted. */ -extern int sem_wait (sem_t *__sem); - -#ifdef __USE_XOPEN2K -/* Similar to `sem_wait' but wait only until ABSTIME. */ -extern int sem_timedwait (sem_t *__restrict __sem, - __const struct timespec *__restrict __abstime); -#endif - -/* Test whether SEM is posted. */ -extern int sem_trywait (sem_t *__sem) __THROW; - -/* Post SEM. */ -extern int sem_post (sem_t *__sem) __THROW; - -/* Get current value of SEM and store it in *SVAL. */ -extern int sem_getvalue (sem_t *__restrict __sem, int *__restrict __sval) - __THROW; - -__END_DECLS - -#endif /* semaphore.h */ diff --git a/linuxthreads/signals.c b/linuxthreads/signals.c index 50f5599..0a03e17 100644 --- a/linuxthreads/signals.c +++ b/linuxthreads/signals.c @@ -99,9 +99,11 @@ int __pthread_sigaction(int sig, const struct sigaction * act, if (act->sa_handler != SIG_IGN && act->sa_handler != SIG_DFL && sig > 0 && sig < NSIG) { +#if !defined(__FreeBSD_kernel__) if (act->sa_flags & SA_SIGINFO) newact.sa_handler = (__sighandler_t) __pthread_sighandler_rt; else +#endif newact.sa_handler = (__sighandler_t) __pthread_sighandler; if (old == SIG_IGN || old == SIG_DFL || old == SIG_ERR) __sighandler[sig].old = (arch_sighandler_t) act->sa_handler; diff --git a/linuxthreads/spinlock.c b/linuxthreads/spinlock.c index 7872abf..86de4e5 100644 --- a/linuxthreads/spinlock.c +++ b/linuxthreads/spinlock.c @@ -24,9 +24,9 @@ #include "spinlock.h" #include "restart.h" -static void __pthread_acquire(int * spinlock); +static void __pthread_acquire(__atomic_lock_t * spinlock); -static inline void __pthread_release(int * spinlock) +static inline void __pthread_release(__atomic_lock_t * spinlock) { WRITE_MEMORY_BARRIER(); *spinlock = __LT_SPINLOCK_INIT; @@ -269,11 +269,11 @@ again: struct wait_node { struct wait_node *next; /* Next node in null terminated linked list */ pthread_descr thr; /* The thread waiting with this node */ - int abandoned; /* Atomic flag */ + __atomic_lock_t abandoned; /* Atomic flag */ }; static long wait_node_free_list; -static int wait_node_free_list_spinlock; +__pthread_lock_define_initialized(static, wait_node_free_list_spinlock); /* Allocate a new node from the head of the free list using an atomic operation, or else using malloc if that list is empty. A fundamental @@ -376,7 +376,7 @@ void __pthread_alt_lock(struct _pthread_fastlock * lock, if (self == NULL) self = thread_self(); - wait_node.abandoned = 0; + wait_node.abandoned = __LT_SPINLOCK_INIT; wait_node.next = (struct wait_node *) lock->__status; wait_node.thr = self; lock->__status = (long) &wait_node; @@ -402,7 +402,7 @@ void __pthread_alt_lock(struct _pthread_fastlock * lock, wait_node.thr = self; newstatus = (long) &wait_node; } - wait_node.abandoned = 0; + wait_node.abandoned = __LT_SPINLOCK_INIT; wait_node.next = (struct wait_node *) oldstatus; /* Make sure the store in wait_node.next completes before performing the compare-and-swap */ @@ -451,7 +451,7 @@ int __pthread_alt_timedlock(struct _pthread_fastlock * lock, if (self == NULL) self = thread_self(); - p_wait_node->abandoned = 0; + p_wait_node->abandoned = __LT_SPINLOCK_INIT; p_wait_node->next = (struct wait_node *) lock->__status; p_wait_node->thr = self; lock->__status = (long) p_wait_node; @@ -474,7 +474,7 @@ int __pthread_alt_timedlock(struct _pthread_fastlock * lock, p_wait_node->thr = self; newstatus = (long) p_wait_node; } - p_wait_node->abandoned = 0; + p_wait_node->abandoned = __LT_SPINLOCK_INIT; p_wait_node->next = (struct wait_node *) oldstatus; /* Make sure the store in wait_node.next completes before performing the compare-and-swap */ @@ -574,7 +574,7 @@ void __pthread_alt_unlock(struct _pthread_fastlock *lock) while (p_node != (struct wait_node *) 1) { int prio; - if (p_node->abandoned) { + if (lock_held(&p_node->abandoned)) { /* Remove abandoned node. */ #if defined TEST_FOR_COMPARE_AND_SWAP if (!__pthread_has_cas) @@ -674,7 +674,7 @@ int __pthread_has_cas = 0; #if !defined HAS_COMPARE_AND_SWAP || defined TEST_FOR_COMPARE_AND_SWAP int __pthread_compare_and_swap(long * ptr, long oldval, long newval, - int * spinlock) + __atomic_lock_t * spinlock) { int res; @@ -711,7 +711,7 @@ int __pthread_compare_and_swap(long * ptr, long oldval, long newval, - When nanosleep() returns, we try again, doing MAX_SPIN_COUNT sched_yield(), then sleeping again if needed. */ -static void __pthread_acquire(int * spinlock) +static void __pthread_acquire(__atomic_lock_t * spinlock) { int cnt = 0; struct timespec tm; diff --git a/linuxthreads/spinlock.h b/linuxthreads/spinlock.h index de69a81..6070cfc 100644 --- a/linuxthreads/spinlock.h +++ b/linuxthreads/spinlock.h @@ -33,14 +33,28 @@ #endif #endif +/* Define lock_held for all arches that don't need a modified copy. */ +#ifndef __LT_INITIALIZER_NOT_ZERO +# define lock_held(p) *(p) +#endif + +/* Initliazers for possibly complex structures */ +#ifdef __LT_INITIALIZER_NOT_ZERO +# define __pthread_lock_define_initialized(CLASS,NAME) \ + CLASS __atomic_lock_t NAME = __LT_SPINLOCK_ALT_INIT +#else +# define __pthread_lock_define_initialized(CLASS,NAME) \ + CLASS __atomic_lock_t NAME +#endif + #if defined(TEST_FOR_COMPARE_AND_SWAP) extern int __pthread_has_cas; extern int __pthread_compare_and_swap(long * ptr, long oldval, long newval, - int * spinlock); + __atomic_lock_t * spinlock); static inline int compare_and_swap(long * ptr, long oldval, long newval, - int * spinlock) + __atomic_lock_t * spinlock) { if (__builtin_expect (__pthread_has_cas, 1)) return __compare_and_swap(ptr, oldval, newval); @@ -58,7 +72,7 @@ static inline int compare_and_swap(long * ptr, long oldval, long newval, static inline int compare_and_swap_with_release_semantics (long * ptr, long oldval, - long newval, int * spinlock) + long newval, __atomic_lock_t * spinlock) { return __compare_and_swap_with_release_semantics (ptr, oldval, newval); @@ -67,7 +81,7 @@ compare_and_swap_with_release_semantics (long * ptr, long oldval, #endif static inline int compare_and_swap(long * ptr, long oldval, long newval, - int * spinlock) + __atomic_lock_t * spinlock) { return __compare_and_swap(ptr, oldval, newval); } @@ -75,10 +89,10 @@ static inline int compare_and_swap(long * ptr, long oldval, long newval, #else extern int __pthread_compare_and_swap(long * ptr, long oldval, long newval, - int * spinlock); + __atomic_lock_t * spinlock); static inline int compare_and_swap(long * ptr, long oldval, long newval, - int * spinlock) + __atomic_lock_t * spinlock) { return __pthread_compare_and_swap(ptr, oldval, newval, spinlock); } diff --git a/linuxthreads/sysdeps/i386/tls.h b/linuxthreads/sysdeps/i386/tls.h index 27503f0..6968ea0 100644 --- a/linuxthreads/sysdeps/i386/tls.h +++ b/linuxthreads/sysdeps/i386/tls.h @@ -50,6 +50,11 @@ typedef struct uintptr_t sysinfo; uintptr_t stack_guard; uintptr_t pointer_guard; +#ifdef __FreeBSD_kernel__ + long gscope_flag; +# else + int gscope_flag; +# endif } tcbhead_t; #else /* __ASSEMBLER__ */ @@ -240,6 +245,25 @@ TLS_DO_MODIFY_LDT_KERNEL_CHECK( \ ((descr)->p_header.data.pointer_guard \ = THREAD_GETMEM (THREAD_SELF, p_header.data.pointer_guard)) +/* Get and set the global scope generation counter in the TCB head. */ +#define THREAD_GSCOPE_FLAG_UNUSED 0 +#define THREAD_GSCOPE_FLAG_USED 1 +#define THREAD_GSCOPE_FLAG_WAIT 2 +#define THREAD_GSCOPE_RESET_FLAG() \ + do \ + { int __res; \ + asm volatile ("xchgl %0, %%gs:%P1" \ + : "=r" (__res) \ + : "i" (offsetof (struct _pthread_descr_struct, p_gscope_flag)), \ + "0" (THREAD_GSCOPE_FLAG_UNUSED)); \ + if (__res == THREAD_GSCOPE_FLAG_WAIT) \ + lll_futex_wake (&THREAD_SELF->p_gscope_flag, 1); \ + } \ + while (0) +#define THREAD_GSCOPE_SET_FLAG() \ + THREAD_SETMEM (THREAD_SELF, p_gscope_flag, THREAD_GSCOPE_FLAG_USED) +#define THREAD_GSCOPE_WAIT() \ + do { /* GL(dl_wait_lookup_done) () */ } while (0) # endif /* HAVE_TLS_SUPPORT && (FLOATING_STACKS || !IS_IN_libpthread) */ #endif /* __ASSEMBLER__ */ diff --git a/linuxthreads/sysdeps/pthread/Makefile b/linuxthreads/sysdeps/pthread/Makefile index f73f40e..514cdd8 100644 --- a/linuxthreads/sysdeps/pthread/Makefile +++ b/linuxthreads/sysdeps/pthread/Makefile @@ -1,3 +1,9 @@ +ifeq ($(subdir),csu) +routines += unwind-resume +shared-only-routines += unwind-resume +CFLAGS-unwind-resume.c += -fexceptions -fasynchronous-unwind-tables +endif + ifeq ($(subdir),rt) librt-sysdep_routines += timer_routines CPPFLAGS += -DBROKEN_THREAD_SIGNALS diff --git a/linuxthreads/sysdeps/pthread/bits/initspin.h b/linuxthreads/sysdeps/pthread/bits/initspin.h index a19ec07..c214e3a 100644 --- a/linuxthreads/sysdeps/pthread/bits/initspin.h +++ b/linuxthreads/sysdeps/pthread/bits/initspin.h @@ -23,6 +23,7 @@ #define __LT_SPINLOCK_INIT 0 /* Macros for lock initializers, using the above definition. */ -#define __LOCK_INITIALIZER { 0, __LT_SPINLOCK_INIT } +#define __LOCK_INITIALIZER ((struct _pthread_fastlock){ 0, __LT_SPINLOCK_INIT }) +#define __LOCK_ALT_INITIALIZER { 0, __LT_SPINLOCK_INIT } #define __ALT_LOCK_INITIALIZER { 0, __LT_SPINLOCK_INIT } #define __ATOMIC_INITIALIZER { 0, __LT_SPINLOCK_INIT } diff --git a/linuxthreads/sysdeps/pthread/bits/libc-lock.h b/linuxthreads/sysdeps/pthread/bits/libc-lock.h index e19d029..8ff53df 100644 --- a/linuxthreads/sysdeps/pthread/bits/libc-lock.h +++ b/linuxthreads/sysdeps/pthread/bits/libc-lock.h @@ -25,6 +25,10 @@ #if defined _LIBC && !defined NOT_IN_libc #include +#else +/* This function is called to initialize the pthread library. */ +/* We need a prototype before it is bellow marked as weak */ +extern void __pthread_initialize (void); #endif /* Mutex type. */ @@ -71,12 +75,12 @@ typedef pthread_key_t __libc_key_t; initialized locks must be set to one due to the lack of normal atomic operations.) */ -#if __LT_SPINLOCK_INIT == 0 +#ifdef __LT_INITIALIZER_NOT_ZERO # define __libc_lock_define_initialized(CLASS,NAME) \ - CLASS __libc_lock_t NAME; + CLASS __libc_lock_t NAME = PTHREAD_MUTEX_INITIALIZER; #else # define __libc_lock_define_initialized(CLASS,NAME) \ - CLASS __libc_lock_t NAME = PTHREAD_MUTEX_INITIALIZER; + CLASS __libc_lock_t NAME; #endif #define __libc_rwlock_define_initialized(CLASS,NAME) \ @@ -158,6 +162,9 @@ typedef pthread_key_t __libc_key_t; #define __rtld_lock_init_recursive(NAME) \ __libc_lock_init_recursive (NAME) +#define __rtld_lock_initialize(NAME) \ + (void) ((NAME) = (__rtld_lock_recursive_t) _RTLD_LOCK_RECURSIVE_INITIALIZER) + /* Finalize the named lock variable, which must be locked. It cannot be used again until __libc_lock_init is called again on it. This must be called on a lock variable before the containing storage is reused. */ @@ -242,6 +249,9 @@ typedef pthread_key_t __libc_key_t; } \ } while (0) +/* Get once control variable. */ +#define __libc_once_get(ONCE_CONTROL) \ + ((ONCE_CONTROL) != PTHREAD_ONCE_INIT) /* Start critical region with cleanup. */ #define __libc_cleanup_region_start(DOIT, FCT, ARG) \ @@ -376,8 +386,10 @@ weak_extern (__pthread_initialize) weak_extern (__pthread_atfork) weak_extern (BP_SYM (_pthread_cleanup_push)) weak_extern (BP_SYM (_pthread_cleanup_pop)) +#ifdef __USE_GNU weak_extern (BP_SYM (_pthread_cleanup_push_defer)) weak_extern (BP_SYM (_pthread_cleanup_pop_restore)) +#endif # else # pragma weak __pthread_mutex_init # pragma weak __pthread_mutex_destroy @@ -399,8 +411,10 @@ weak_extern (BP_SYM (_pthread_cleanup_pop_restore)) # pragma weak __pthread_once # pragma weak __pthread_initialize # pragma weak __pthread_atfork +#ifdef __USE_GNU # pragma weak _pthread_cleanup_push_defer # pragma weak _pthread_cleanup_pop_restore +#endif # pragma weak _pthread_cleanup_push # pragma weak _pthread_cleanup_pop # endif diff --git a/linuxthreads/sysdeps/pthread/bits/pthreadtypes.h b/linuxthreads/sysdeps/pthread/bits/pthreadtypes.h index d1daef0..ecdd6b5 100644 --- a/linuxthreads/sysdeps/pthread/bits/pthreadtypes.h +++ b/linuxthreads/sysdeps/pthread/bits/pthreadtypes.h @@ -22,12 +22,14 @@ #define __need_schedparam #include +typedef int __atomic_lock_t; + /* Fast locks (not abstract because mutexes and conditions aren't abstract). */ struct _pthread_fastlock { - long int __status; /* "Free" or "taken" or head of waiting list */ - int __spinlock; /* Used by compare_and_swap emulation. Also, - adaptive SMP lock stores spin count here. */ + long int __status; /* "Free" or "taken" or head of waiting list */ + __atomic_lock_t __spinlock; /* Used by compare_and_swap emulation. Also, + adaptive SMP lock stores spin count here. */ }; #ifndef _PTHREAD_DESCR_DEFINED @@ -64,16 +66,21 @@ typedef struct { struct _pthread_fastlock __c_lock; /* Protect against concurrent access */ _pthread_descr __c_waiting; /* Threads waiting on this condition */ - char __padding[48 - sizeof (struct _pthread_fastlock) + /* Since we only support two clock_id types in pthread_condattr_setclock(), + * this can be shrinked into a single bit if we need more space. */ + int __clock_id; + char __padding[48 - sizeof (struct _pthread_fastlock) - sizeof (int) - sizeof (_pthread_descr) - sizeof (__pthread_cond_align_t)]; __pthread_cond_align_t __align; } pthread_cond_t; /* Attribute for conditionally variables. */ -typedef struct +typedef struct pthread_condattr { - int __dummy; + /* Since we only support two clock_id types in pthread_condattr_setclock(), + * this can be shrinked into a single bit if we need more space. */ + int __clock_id; } pthread_condattr_t; /* Keys for thread-specific data */ diff --git a/linuxthreads/sysdeps/pthread/pthread.h b/linuxthreads/sysdeps/pthread/pthread.h index 86c7ff7..89ad88f 100644 --- a/linuxthreads/sysdeps/pthread/pthread.h +++ b/linuxthreads/sysdeps/pthread/pthread.h @@ -31,26 +31,26 @@ __BEGIN_DECLS /* Initializers. */ #define PTHREAD_MUTEX_INITIALIZER \ - {0, 0, 0, PTHREAD_MUTEX_TIMED_NP, __LOCK_INITIALIZER} + {0, 0, 0, PTHREAD_MUTEX_TIMED_NP, __LOCK_ALT_INITIALIZER} #ifdef __USE_GNU # define PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP \ - {0, 0, 0, PTHREAD_MUTEX_RECURSIVE_NP, __LOCK_INITIALIZER} + {0, 0, 0, PTHREAD_MUTEX_RECURSIVE_NP, __LOCK_ALT_INITIALIZER} # define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP \ - {0, 0, 0, PTHREAD_MUTEX_ERRORCHECK_NP, __LOCK_INITIALIZER} + {0, 0, 0, PTHREAD_MUTEX_ERRORCHECK_NP, __LOCK_ALT_INITIALIZER} # define PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP \ - {0, 0, 0, PTHREAD_MUTEX_ADAPTIVE_NP, __LOCK_INITIALIZER} + {0, 0, 0, PTHREAD_MUTEX_ADAPTIVE_NP, __LOCK_ALT_INITIALIZER} #endif -#define PTHREAD_COND_INITIALIZER {__LOCK_INITIALIZER, 0, "", 0} +#define PTHREAD_COND_INITIALIZER {__LOCK_ALT_INITIALIZER, 0, CLOCK_REALTIME, "", 0} #if defined __USE_UNIX98 || defined __USE_XOPEN2K # define PTHREAD_RWLOCK_INITIALIZER \ - { __LOCK_INITIALIZER, 0, NULL, NULL, NULL, \ + { __LOCK_ALT_INITIALIZER, 0, NULL, NULL, NULL, \ PTHREAD_RWLOCK_DEFAULT_NP, PTHREAD_PROCESS_PRIVATE } #endif #ifdef __USE_GNU # define PTHREAD_RWLOCK_WRITER_NONRECURSIVE_INITIALIZER_NP \ - { __LOCK_INITIALIZER, 0, NULL, NULL, NULL, \ + { __LOCK_ALT_INITIALIZER, 0, NULL, NULL, NULL, \ PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP, PTHREAD_PROCESS_PRIVATE } #endif @@ -86,7 +86,7 @@ enum PTHREAD_MUTEX_RECURSIVE_NP, PTHREAD_MUTEX_ERRORCHECK_NP, PTHREAD_MUTEX_ADAPTIVE_NP -#ifdef __USE_UNIX98 +#if defined __USE_UNIX98 || defined __USE_XOPEN2K8 , PTHREAD_MUTEX_NORMAL = PTHREAD_MUTEX_TIMED_NP, PTHREAD_MUTEX_RECURSIVE = PTHREAD_MUTEX_RECURSIVE_NP, @@ -241,7 +241,6 @@ extern int pthread_attr_setscope (pthread_attr_t *__attr, int __scope) extern int pthread_attr_getscope (__const pthread_attr_t *__restrict __attr, int *__restrict __scope) __THROW; -#ifdef __USE_UNIX98 /* Set the size of the guard area at the bottom of the thread. */ extern int pthread_attr_setguardsize (pthread_attr_t *__attr, size_t __guardsize) __THROW; @@ -250,7 +249,6 @@ extern int pthread_attr_setguardsize (pthread_attr_t *__attr, extern int pthread_attr_getguardsize (__const pthread_attr_t *__restrict __attr, size_t *__restrict __guardsize) __THROW; -#endif /* Set the starting address of the stack of the thread to be created. Depending on whether the stack grows up or down the value must either @@ -371,7 +369,7 @@ extern int pthread_mutexattr_getpshared (__const pthread_mutexattr_t * extern int pthread_mutexattr_setpshared (pthread_mutexattr_t *__attr, int __pshared) __THROW; -#ifdef __USE_UNIX98 +#if defined __USE_UNIX98 || defined __USE_XOPEN2K8 /* Set the mutex kind attribute in *ATTR to KIND (either PTHREAD_MUTEX_NORMAL, PTHREAD_MUTEX_RECURSIVE, PTHREAD_MUTEX_ERRORCHECK, or PTHREAD_MUTEX_DEFAULT). */ diff --git a/linuxthreads/sysdeps/pthread/semaphore.h b/linuxthreads/sysdeps/pthread/semaphore.h index 8793768..8407007 100644 --- a/linuxthreads/sysdeps/pthread/semaphore.h +++ b/linuxthreads/sysdeps/pthread/semaphore.h @@ -1 +1,87 @@ -#include +/* Linuxthreads - a simple clone()-based implementation of Posix */ +/* threads for Linux. */ +/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr) */ +/* */ +/* This program is free software; you can redistribute it and/or */ +/* modify it under the terms of the GNU Library General Public License */ +/* as published by the Free Software Foundation; either version 2 */ +/* of the License, or (at your option) any later version. */ +/* */ +/* This program is distributed in the hope that it will be useful, */ +/* but WITHOUT ANY WARRANTY; without even the implied warranty of */ +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ +/* GNU Library General Public License for more details. */ + +#ifndef _SEMAPHORE_H +#define _SEMAPHORE_H 1 + +#include +#include +#ifdef __USE_XOPEN2K +# define __need_timespec +# include +#endif + +#ifndef _PTHREAD_DESCR_DEFINED +/* Thread descriptors. Needed for `sem_t' definition. */ +typedef struct _pthread_descr_struct *_pthread_descr; +# define _PTHREAD_DESCR_DEFINED +#endif + +/* System specific semaphore definition. */ +typedef struct +{ + struct _pthread_fastlock __sem_lock; + int __sem_value; + _pthread_descr __sem_waiting; +} sem_t; + + + +/* Value returned if `sem_open' failed. */ +#define SEM_FAILED ((sem_t *) 0) + +/* Maximum value the semaphore can have. */ +#define SEM_VALUE_MAX (2147483647) + + +__BEGIN_DECLS + +/* Initialize semaphore object SEM to VALUE. If PSHARED then share it + with other processes. */ +extern int sem_init (sem_t *__sem, int __pshared, unsigned int __value) __THROW; + +/* Free resources associated with semaphore object SEM. */ +extern int sem_destroy (sem_t *__sem) __THROW; + +/* Open a named semaphore NAME with open flaot OFLAG. */ +extern sem_t *sem_open (__const char *__name, int __oflag, ...) __THROW; + +/* Close descriptor for named semaphore SEM. */ +extern int sem_close (sem_t *__sem) __THROW; + +/* Remove named semaphore NAME. */ +extern int sem_unlink (__const char *__name) __THROW; + +/* Wait for SEM being posted. */ +extern int sem_wait (sem_t *__sem); + +#ifdef __USE_XOPEN2K +/* Similar to `sem_wait' but wait only until ABSTIME. */ +extern int sem_timedwait (sem_t *__restrict __sem, + __const struct timespec *__restrict __abstime); +#endif + +/* Test whether SEM is posted. */ +extern int sem_trywait (sem_t *__sem) __THROW; + +/* Post SEM. */ +extern int sem_post (sem_t *__sem) __THROW; + +/* Get current value of SEM and store it in *SVAL. */ +extern int sem_getvalue (sem_t *__restrict __sem, int *__restrict __sval) + __THROW; + +__END_DECLS + +#endif /* semaphore.h */ diff --git a/linuxthreads/sysdeps/pthread/unwind-resume.c b/linuxthreads/sysdeps/pthread/unwind-resume.c new file mode 100644 index 0000000..088f4c6 --- /dev/null +++ b/linuxthreads/sysdeps/pthread/unwind-resume.c @@ -0,0 +1,64 @@ +/* Copyright (C) 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Jakub Jelinek . + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation; either version 2.1 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include +#include + +static void (*libgcc_s_resume) (struct _Unwind_Exception *exc); +static _Unwind_Reason_Code (*libgcc_s_personality) + (int, _Unwind_Action, _Unwind_Exception_Class, struct _Unwind_Exception *, + struct _Unwind_Context *); + +static void +init (void) +{ + void *resume, *personality; + void *handle; + + handle = __libc_dlopen ("libgcc_s.so.1"); + + if (handle == NULL + || (resume = __libc_dlsym (handle, "_Unwind_Resume")) == NULL + || (personality = __libc_dlsym (handle, "__gcc_personality_v0")) == NULL) + __libc_fatal ("libgcc_s.so.1 must be installed for pthread_cancel to work\n"); + + libgcc_s_resume = resume; + libgcc_s_personality = personality; +} + +void +_Unwind_Resume (struct _Unwind_Exception *exc) +{ + if (__builtin_expect (libgcc_s_resume == NULL, 0)) + init (); + libgcc_s_resume (exc); +} + +_Unwind_Reason_Code +__gcc_personality_v0 (int version, _Unwind_Action actions, + _Unwind_Exception_Class exception_class, + struct _Unwind_Exception *ue_header, + struct _Unwind_Context *context) +{ + if (__builtin_expect (libgcc_s_personality == NULL, 0)) + init (); + return libgcc_s_personality (version, actions, exception_class, + ue_header, context); +} diff --git a/linuxthreads/sysdeps/unix/sysv/linux/fatal-prepare.h b/linuxthreads/sysdeps/unix/sysv/linux/fatal-prepare.h new file mode 100644 index 0000000..622b4c5 --- /dev/null +++ b/linuxthreads/sysdeps/unix/sysv/linux/fatal-prepare.h @@ -0,0 +1,39 @@ +/* Copyright (C) 2003, 2007 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include + +/* We have to completely disable cancellation. assert() must not be a + cancellation point but the implementation uses write() etc. */ +#ifdef SHARED +# include +# define FATAL_PREPARE \ + { \ + int (*fp) (int, int *); \ + fp = __libc_pthread_functions.ptr_pthread_setcancelstate; \ + if (fp != NULL) \ + fp (PTHREAD_CANCEL_DISABLE, NULL); \ + } +#else +# pragma weak pthread_setcancelstate +# define FATAL_PREPARE \ + { \ + if (pthread_setcancelstate != NULL) \ + pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, NULL); \ + } +#endif diff --git a/linuxthreads/sysdeps/unix/sysv/linux/rtld-lowlevel.h b/linuxthreads/sysdeps/unix/sysv/linux/rtld-lowlevel.h new file mode 100644 index 0000000..6b3d368 --- /dev/null +++ b/linuxthreads/sysdeps/unix/sysv/linux/rtld-lowlevel.h @@ -0,0 +1,153 @@ +/* Defintions for lowlevel handling in ld.so. + Copyright (C) 2006 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#ifndef _RTLD_LOWLEVEL_H +#define _RTLD_LOWLEVEL_H 1 + +#include +#include + + +/* Special multi-reader lock used in ld.so. */ +#define __RTLD_MRLOCK_WRITER 1 +#define __RTLD_MRLOCK_RWAIT 2 +#define __RTLD_MRLOCK_WWAIT 4 +#define __RTLD_MRLOCK_RBITS \ + ~(__RTLD_MRLOCK_WRITER | __RTLD_MRLOCK_RWAIT | __RTLD_MRLOCK_WWAIT) +#define __RTLD_MRLOCK_INC 8 +#define __RTLD_MRLOCK_TRIES 5 + + +typedef int __rtld_mrlock_t; + + +#define __rtld_mrlock_define(CLASS,NAME) \ + CLASS __rtld_mrlock_t NAME; + + +#define _RTLD_MRLOCK_INITIALIZER 0 +#define __rtld_mrlock_initialize(NAME) \ + (void) ((NAME) = 0) + + +#define __rtld_mrlock_lock(lock) \ + do { \ + __label__ out; \ + while (1) \ + { \ + int oldval; \ + for (int tries = 0; tries < __RTLD_MRLOCK_TRIES; ++tries) \ + { \ + oldval = lock; \ + while (__builtin_expect ((oldval \ + & (__RTLD_MRLOCK_WRITER \ + | __RTLD_MRLOCK_WWAIT)) \ + == 0, 1)) \ + { \ + int newval = ((oldval & __RTLD_MRLOCK_RBITS) \ + + __RTLD_MRLOCK_INC); \ + int ret = atomic_compare_and_exchange_val_acq (&(lock), \ + newval, \ + oldval); \ + if (__builtin_expect (ret == oldval, 1)) \ + goto out; \ + oldval = ret; \ + } \ + atomic_delay (); \ + } \ + if ((oldval & __RTLD_MRLOCK_RWAIT) == 0) \ + { \ + atomic_or (&(lock), __RTLD_MRLOCK_RWAIT); \ + oldval |= __RTLD_MRLOCK_RWAIT; \ + } \ + lll_futex_wait (lock, oldval); \ + } \ + out:; \ + } while (0) + + +#define __rtld_mrlock_unlock(lock) \ + do { \ + int oldval = atomic_exchange_and_add (&(lock), -__RTLD_MRLOCK_INC); \ + if (__builtin_expect ((oldval \ + & (__RTLD_MRLOCK_RBITS | __RTLD_MRLOCK_WWAIT)) \ + == (__RTLD_MRLOCK_INC | __RTLD_MRLOCK_WWAIT), 0)) \ + /* We have to wake all threads since there might be some queued \ + readers already. */ \ + lll_futex_wake (&(lock), 0x7fffffff); \ + } while (0) + + +/* There can only ever be one thread trying to get the exclusive lock. */ +#define __rtld_mrlock_change(lock) \ + do { \ + __label__ out; \ + while (1) \ + { \ + int oldval; \ + for (int tries = 0; tries < __RTLD_MRLOCK_TRIES; ++tries) \ + { \ + oldval = lock; \ + while (__builtin_expect ((oldval & __RTLD_MRLOCK_RBITS) == 0, 1)) \ + { \ + int newval = ((oldval & __RTLD_MRLOCK_RWAIT) \ + + __RTLD_MRLOCK_WRITER); \ + int ret = atomic_compare_and_exchange_val_acq (&(lock), \ + newval, \ + oldval); \ + if (__builtin_expect (ret == oldval, 1)) \ + goto out; \ + oldval = ret; \ + } \ + atomic_delay (); \ + } \ + atomic_or (&(lock), __RTLD_MRLOCK_WWAIT); \ + oldval |= __RTLD_MRLOCK_WWAIT; \ + lll_futex_wait (lock, oldval); \ + } \ + out:; \ + } while (0) + + +#define __rtld_mrlock_done(lock) \ + do { \ + int oldval = atomic_exchange_and_add (&(lock), -__RTLD_MRLOCK_WRITER); \ + if (__builtin_expect ((oldval & __RTLD_MRLOCK_RWAIT) != 0, 0)) \ + lll_futex_wake (&(lock), 0x7fffffff); \ + } while (0) + + +/* Function to wait for variable become zero. Used in ld.so for + reference counters. */ +#define __rtld_waitzero(word) \ + do { \ + while (1) \ + { \ + int val = word; \ + if (val == 0) \ + break; \ + lll_futex_wait (&(word), val); \ + } \ + } while (0) + + +#define __rtld_notify(word) \ + lll_futex_wake (&(word), 1) + +#endif diff --git a/linuxthreads/sysdeps/x86_64/tls.h b/linuxthreads/sysdeps/x86_64/tls.h index 5a1a166..351df13 100644 --- a/linuxthreads/sysdeps/x86_64/tls.h +++ b/linuxthreads/sysdeps/x86_64/tls.h @@ -49,6 +49,11 @@ typedef struct uintptr_t sysinfo; uintptr_t stack_guard; uintptr_t pointer_guard; +# ifdef __FreeBSD_kernel__ + long gscope_flag; +# else + int gscope_flag; +# endif } tcbhead_t; #else /* __ASSEMBLER__ */ @@ -147,6 +152,43 @@ typedef struct ((descr)->p_header.data.pointer_guard \ = THREAD_GETMEM (THREAD_SELF, p_header.data.pointer_guard)) +/* Get and set the global scope generation counter in the TCB head. */ +#define THREAD_GSCOPE_FLAG_UNUSED 0 +#define THREAD_GSCOPE_FLAG_USED 1 +#define THREAD_GSCOPE_FLAG_WAIT 2 +#ifdef __FreeBSD_kernel__ +# define THREAD_GSCOPE_RESET_FLAG() \ + do \ + { int __res; \ + asm volatile ("xchgl %0, %%fs:%P1" \ + : "=r" (__res) \ + : "i" (offsetof (struct _pthread_descr_struct, p_gscope_flag)), \ + "0" (THREAD_GSCOPE_FLAG_UNUSED)); \ + if (__res == THREAD_GSCOPE_FLAG_WAIT) \ + lll_futex_wake (&THREAD_SELF->p_gscope_flag, 1); \ + } \ + while (0) +#else +/* As the FreeBSD kernel defines futex as long (compared to int with + a Linux kernel), we need to use xchgq instead of xchgl to handle + the gscope_flag variable. */ +# define THREAD_GSCOPE_RESET_FLAG() \ + do \ + { long __res; \ + asm volatile ("xchgq %0, %%fs:%P1" \ + : "=r" (__res) \ + : "i" (offsetof (struct _pthread_descr_struct, p_gscope_flag)), \ + "0" (THREAD_GSCOPE_FLAG_UNUSED)); \ + if (__res == THREAD_GSCOPE_FLAG_WAIT) \ + lll_futex_wake (&THREAD_SELF->p_gscope_flag, 1); \ + } \ + while (0) +#endif /* __FreeBSD_kernel__ */ +#define THREAD_GSCOPE_SET_FLAG() \ + THREAD_SETMEM (THREAD_SELF, p_gscope_flag, THREAD_GSCOPE_FLAG_USED) +#define THREAD_GSCOPE_WAIT() \ + do { /* GL(dl_wait_lookup_done) () */ } while (0) + # endif /* HAVE_TLS_SUPPORT */ #endif /* __ASSEMBLER__ */ diff --git a/locale/C-translit.h b/locale/C-translit.h index adb009b..5c85157 100644 --- a/locale/C-translit.h +++ b/locale/C-translit.h @@ -1,4 +1,4 @@ -#define NTRANSLIT 1353 +#define NTRANSLIT 1354 static const uint32_t translit_from_idx[] = { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, @@ -113,7 +113,7 @@ static const uint32_t translit_from_idx[] = 2616, 2618, 2620, 2622, 2624, 2626, 2628, 2630, 2632, 2634, 2636, 2638, 2640, 2642, 2644, 2646, 2648, 2650, 2652, 2654, 2656, 2658, 2660, 2662, 2664, 2666, 2668, 2670, 2672, 2674, 2676, 2678, 2680, 2682, 2684, 2686, - 2688, 2690, 2692, 2694, 2696, 2698, 2700, 2702, 2704 + 2688, 2690, 2692, 2694, 2696, 2698, 2700, 2702, 2704, 2706 }; static const wchar_t translit_from_tbl[] = L"\x00a0" L"\0" L"\x00a9" L"\0" L"\x00ab" L"\0" L"\x00ad" L"\0" L"\x00ae" @@ -134,334 +134,334 @@ static const wchar_t translit_from_tbl[] = L"\0" L"\x2035" L"\0" L"\x2036" L"\0" L"\x2037" L"\0" L"\x2039" L"\0" L"\x203a" L"\0" L"\x203c" L"\0" L"\x2044" L"\0" L"\x2047" L"\0" L"\x2048" L"\0" L"\x2049" L"\0" L"\x205f" L"\0" L"\x2060" L"\0" L"\x2061" L"\0" - L"\x2062" L"\0" L"\x2063" L"\0" L"\x20a8" L"\0" L"\x20ac" L"\0" L"\x2100" - L"\0" L"\x2101" L"\0" L"\x2102" L"\0" L"\x2105" L"\0" L"\x2106" L"\0" - L"\x210a" L"\0" L"\x210b" L"\0" L"\x210c" L"\0" L"\x210d" L"\0" L"\x210e" - L"\0" L"\x2110" L"\0" L"\x2111" L"\0" L"\x2112" L"\0" L"\x2113" L"\0" - L"\x2115" L"\0" L"\x2116" L"\0" L"\x2119" L"\0" L"\x211a" L"\0" L"\x211b" - L"\0" L"\x211c" L"\0" L"\x211d" L"\0" L"\x2121" L"\0" L"\x2122" L"\0" - L"\x2124" L"\0" L"\x2126" L"\0" L"\x2128" L"\0" L"\x212c" L"\0" L"\x212d" - L"\0" L"\x212e" L"\0" L"\x212f" L"\0" L"\x2130" L"\0" L"\x2131" L"\0" - L"\x2133" L"\0" L"\x2134" L"\0" L"\x2139" L"\0" L"\x2145" L"\0" L"\x2146" - L"\0" L"\x2147" L"\0" L"\x2148" L"\0" L"\x2149" L"\0" L"\x2153" L"\0" - L"\x2154" L"\0" L"\x2155" L"\0" L"\x2156" L"\0" L"\x2157" L"\0" L"\x2158" - L"\0" L"\x2159" L"\0" L"\x215a" L"\0" L"\x215b" L"\0" L"\x215c" L"\0" - L"\x215d" L"\0" L"\x215e" L"\0" L"\x215f" L"\0" L"\x2160" L"\0" L"\x2161" - L"\0" L"\x2162" L"\0" L"\x2163" L"\0" L"\x2164" L"\0" L"\x2165" L"\0" - L"\x2166" L"\0" L"\x2167" L"\0" L"\x2168" L"\0" L"\x2169" L"\0" L"\x216a" - L"\0" L"\x216b" L"\0" L"\x216c" L"\0" L"\x216d" L"\0" L"\x216e" L"\0" - L"\x216f" L"\0" L"\x2170" L"\0" L"\x2171" L"\0" L"\x2172" L"\0" L"\x2173" - L"\0" L"\x2174" L"\0" L"\x2175" L"\0" L"\x2176" L"\0" L"\x2177" L"\0" - L"\x2178" L"\0" L"\x2179" L"\0" L"\x217a" L"\0" L"\x217b" L"\0" L"\x217c" - L"\0" L"\x217d" L"\0" L"\x217e" L"\0" L"\x217f" L"\0" L"\x2190" L"\0" - L"\x2192" L"\0" L"\x2194" L"\0" L"\x21d0" L"\0" L"\x21d2" L"\0" L"\x21d4" - L"\0" L"\x2212" L"\0" L"\x2215" L"\0" L"\x2216" L"\0" L"\x2217" L"\0" - L"\x2223" L"\0" L"\x2236" L"\0" L"\x223c" L"\0" L"\x2264" L"\0" L"\x2265" - L"\0" L"\x226a" L"\0" L"\x226b" L"\0" L"\x22d8" L"\0" L"\x22d9" L"\0" - L"\x2400" L"\0" L"\x2401" L"\0" L"\x2402" L"\0" L"\x2403" L"\0" L"\x2404" - L"\0" L"\x2405" L"\0" L"\x2406" L"\0" L"\x2407" L"\0" L"\x2408" L"\0" - L"\x2409" L"\0" L"\x240a" L"\0" L"\x240b" L"\0" L"\x240c" L"\0" L"\x240d" - L"\0" L"\x240e" L"\0" L"\x240f" L"\0" L"\x2410" L"\0" L"\x2411" L"\0" - L"\x2412" L"\0" L"\x2413" L"\0" L"\x2414" L"\0" L"\x2415" L"\0" L"\x2416" - L"\0" L"\x2417" L"\0" L"\x2418" L"\0" L"\x2419" L"\0" L"\x241a" L"\0" - L"\x241b" L"\0" L"\x241c" L"\0" L"\x241d" L"\0" L"\x241e" L"\0" L"\x241f" - L"\0" L"\x2420" L"\0" L"\x2421" L"\0" L"\x2423" L"\0" L"\x2424" L"\0" - L"\x2460" L"\0" L"\x2461" L"\0" L"\x2462" L"\0" L"\x2463" L"\0" L"\x2464" - L"\0" L"\x2465" L"\0" L"\x2466" L"\0" L"\x2467" L"\0" L"\x2468" L"\0" - L"\x2469" L"\0" L"\x246a" L"\0" L"\x246b" L"\0" L"\x246c" L"\0" L"\x246d" - L"\0" L"\x246e" L"\0" L"\x246f" L"\0" L"\x2470" L"\0" L"\x2471" L"\0" - L"\x2472" L"\0" L"\x2473" L"\0" L"\x2474" L"\0" L"\x2475" L"\0" L"\x2476" - L"\0" L"\x2477" L"\0" L"\x2478" L"\0" L"\x2479" L"\0" L"\x247a" L"\0" - L"\x247b" L"\0" L"\x247c" L"\0" L"\x247d" L"\0" L"\x247e" L"\0" L"\x247f" - L"\0" L"\x2480" L"\0" L"\x2481" L"\0" L"\x2482" L"\0" L"\x2483" L"\0" - L"\x2484" L"\0" L"\x2485" L"\0" L"\x2486" L"\0" L"\x2487" L"\0" L"\x2488" - L"\0" L"\x2489" L"\0" L"\x248a" L"\0" L"\x248b" L"\0" L"\x248c" L"\0" - L"\x248d" L"\0" L"\x248e" L"\0" L"\x248f" L"\0" L"\x2490" L"\0" L"\x2491" - L"\0" L"\x2492" L"\0" L"\x2493" L"\0" L"\x2494" L"\0" L"\x2495" L"\0" - L"\x2496" L"\0" L"\x2497" L"\0" L"\x2498" L"\0" L"\x2499" L"\0" L"\x249a" - L"\0" L"\x249b" L"\0" L"\x249c" L"\0" L"\x249d" L"\0" L"\x249e" L"\0" - L"\x249f" L"\0" L"\x24a0" L"\0" L"\x24a1" L"\0" L"\x24a2" L"\0" L"\x24a3" - L"\0" L"\x24a4" L"\0" L"\x24a5" L"\0" L"\x24a6" L"\0" L"\x24a7" L"\0" - L"\x24a8" L"\0" L"\x24a9" L"\0" L"\x24aa" L"\0" L"\x24ab" L"\0" L"\x24ac" - L"\0" L"\x24ad" L"\0" L"\x24ae" L"\0" L"\x24af" L"\0" L"\x24b0" L"\0" - L"\x24b1" L"\0" L"\x24b2" L"\0" L"\x24b3" L"\0" L"\x24b4" L"\0" L"\x24b5" - L"\0" L"\x24b6" L"\0" L"\x24b7" L"\0" L"\x24b8" L"\0" L"\x24b9" L"\0" - L"\x24ba" L"\0" L"\x24bb" L"\0" L"\x24bc" L"\0" L"\x24bd" L"\0" L"\x24be" - L"\0" L"\x24bf" L"\0" L"\x24c0" L"\0" L"\x24c1" L"\0" L"\x24c2" L"\0" - L"\x24c3" L"\0" L"\x24c4" L"\0" L"\x24c5" L"\0" L"\x24c6" L"\0" L"\x24c7" - L"\0" L"\x24c8" L"\0" L"\x24c9" L"\0" L"\x24ca" L"\0" L"\x24cb" L"\0" - L"\x24cc" L"\0" L"\x24cd" L"\0" L"\x24ce" L"\0" L"\x24cf" L"\0" L"\x24d0" - L"\0" L"\x24d1" L"\0" L"\x24d2" L"\0" L"\x24d3" L"\0" L"\x24d4" L"\0" - L"\x24d5" L"\0" L"\x24d6" L"\0" L"\x24d7" L"\0" L"\x24d8" L"\0" L"\x24d9" - L"\0" L"\x24da" L"\0" L"\x24db" L"\0" L"\x24dc" L"\0" L"\x24dd" L"\0" - L"\x24de" L"\0" L"\x24df" L"\0" L"\x24e0" L"\0" L"\x24e1" L"\0" L"\x24e2" - L"\0" L"\x24e3" L"\0" L"\x24e4" L"\0" L"\x24e5" L"\0" L"\x24e6" L"\0" - L"\x24e7" L"\0" L"\x24e8" L"\0" L"\x24e9" L"\0" L"\x24ea" L"\0" L"\x2500" - L"\0" L"\x2502" L"\0" L"\x250c" L"\0" L"\x2510" L"\0" L"\x2514" L"\0" - L"\x2518" L"\0" L"\x251c" L"\0" L"\x2524" L"\0" L"\x252c" L"\0" L"\x2534" - L"\0" L"\x253c" L"\0" L"\x25e6" L"\0" L"\x2a74" L"\0" L"\x2a75" L"\0" - L"\x2a76" L"\0" L"\x3000" L"\0" L"\x30a0" L"\0" L"\x3251" L"\0" L"\x3252" - L"\0" L"\x3253" L"\0" L"\x3254" L"\0" L"\x3255" L"\0" L"\x3256" L"\0" - L"\x3257" L"\0" L"\x3258" L"\0" L"\x3259" L"\0" L"\x325a" L"\0" L"\x325b" - L"\0" L"\x325c" L"\0" L"\x325d" L"\0" L"\x325e" L"\0" L"\x325f" L"\0" - L"\x32b1" L"\0" L"\x32b2" L"\0" L"\x32b3" L"\0" L"\x32b4" L"\0" L"\x32b5" - L"\0" L"\x32b6" L"\0" L"\x32b7" L"\0" L"\x32b8" L"\0" L"\x32b9" L"\0" - L"\x32ba" L"\0" L"\x32bb" L"\0" L"\x32bc" L"\0" L"\x32bd" L"\0" L"\x32be" - L"\0" L"\x32bf" L"\0" L"\x3371" L"\0" L"\x3372" L"\0" L"\x3373" L"\0" - L"\x3374" L"\0" L"\x3375" L"\0" L"\x3376" L"\0" L"\x3380" L"\0" L"\x3381" - L"\0" L"\x3382" L"\0" L"\x3383" L"\0" L"\x3384" L"\0" L"\x3385" L"\0" - L"\x3386" L"\0" L"\x3387" L"\0" L"\x3388" L"\0" L"\x3389" L"\0" L"\x338a" - L"\0" L"\x338b" L"\0" L"\x338c" L"\0" L"\x338d" L"\0" L"\x338e" L"\0" - L"\x338f" L"\0" L"\x3390" L"\0" L"\x3391" L"\0" L"\x3392" L"\0" L"\x3393" - L"\0" L"\x3394" L"\0" L"\x3395" L"\0" L"\x3396" L"\0" L"\x3397" L"\0" - L"\x3398" L"\0" L"\x3399" L"\0" L"\x339a" L"\0" L"\x339b" L"\0" L"\x339c" - L"\0" L"\x339d" L"\0" L"\x339e" L"\0" L"\x339f" L"\0" L"\x33a0" L"\0" - L"\x33a1" L"\0" L"\x33a2" L"\0" L"\x33a3" L"\0" L"\x33a4" L"\0" L"\x33a5" - L"\0" L"\x33a6" L"\0" L"\x33a7" L"\0" L"\x33a8" L"\0" L"\x33a9" L"\0" - L"\x33aa" L"\0" L"\x33ab" L"\0" L"\x33ac" L"\0" L"\x33ad" L"\0" L"\x33ae" - L"\0" L"\x33af" L"\0" L"\x33b0" L"\0" L"\x33b1" L"\0" L"\x33b2" L"\0" - L"\x33b3" L"\0" L"\x33b4" L"\0" L"\x33b5" L"\0" L"\x33b6" L"\0" L"\x33b7" - L"\0" L"\x33b8" L"\0" L"\x33b9" L"\0" L"\x33ba" L"\0" L"\x33bb" L"\0" - L"\x33bc" L"\0" L"\x33bd" L"\0" L"\x33be" L"\0" L"\x33bf" L"\0" L"\x33c2" - L"\0" L"\x33c3" L"\0" L"\x33c4" L"\0" L"\x33c5" L"\0" L"\x33c6" L"\0" - L"\x33c7" L"\0" L"\x33c8" L"\0" L"\x33c9" L"\0" L"\x33ca" L"\0" L"\x33cb" - L"\0" L"\x33cc" L"\0" L"\x33cd" L"\0" L"\x33ce" L"\0" L"\x33cf" L"\0" - L"\x33d0" L"\0" L"\x33d1" L"\0" L"\x33d2" L"\0" L"\x33d3" L"\0" L"\x33d4" - L"\0" L"\x33d5" L"\0" L"\x33d6" L"\0" L"\x33d7" L"\0" L"\x33d8" L"\0" - L"\x33d9" L"\0" L"\x33da" L"\0" L"\x33db" L"\0" L"\x33dc" L"\0" L"\x33dd" - L"\0" L"\xfb00" L"\0" L"\xfb01" L"\0" L"\xfb02" L"\0" L"\xfb03" L"\0" - L"\xfb04" L"\0" L"\xfb06" L"\0" L"\xfb29" L"\0" L"\xfe00" L"\0" L"\xfe01" - L"\0" L"\xfe02" L"\0" L"\xfe03" L"\0" L"\xfe04" L"\0" L"\xfe05" L"\0" - L"\xfe06" L"\0" L"\xfe07" L"\0" L"\xfe08" L"\0" L"\xfe09" L"\0" L"\xfe0a" - L"\0" L"\xfe0b" L"\0" L"\xfe0c" L"\0" L"\xfe0d" L"\0" L"\xfe0e" L"\0" - L"\xfe0f" L"\0" L"\xfe4d" L"\0" L"\xfe4e" L"\0" L"\xfe4f" L"\0" L"\xfe50" - L"\0" L"\xfe52" L"\0" L"\xfe54" L"\0" L"\xfe55" L"\0" L"\xfe56" L"\0" - L"\xfe57" L"\0" L"\xfe59" L"\0" L"\xfe5a" L"\0" L"\xfe5b" L"\0" L"\xfe5c" - L"\0" L"\xfe5f" L"\0" L"\xfe60" L"\0" L"\xfe61" L"\0" L"\xfe62" L"\0" - L"\xfe63" L"\0" L"\xfe64" L"\0" L"\xfe65" L"\0" L"\xfe66" L"\0" L"\xfe68" - L"\0" L"\xfe69" L"\0" L"\xfe6a" L"\0" L"\xfe6b" L"\0" L"\xfeff" L"\0" - L"\xff01" L"\0" L"\xff02" L"\0" L"\xff03" L"\0" L"\xff04" L"\0" L"\xff05" - L"\0" L"\xff06" L"\0" L"\xff07" L"\0" L"\xff08" L"\0" L"\xff09" L"\0" - L"\xff0a" L"\0" L"\xff0b" L"\0" L"\xff0c" L"\0" L"\xff0d" L"\0" L"\xff0e" - L"\0" L"\xff0f" L"\0" L"\xff10" L"\0" L"\xff11" L"\0" L"\xff12" L"\0" - L"\xff13" L"\0" L"\xff14" L"\0" L"\xff15" L"\0" L"\xff16" L"\0" L"\xff17" - L"\0" L"\xff18" L"\0" L"\xff19" L"\0" L"\xff1a" L"\0" L"\xff1b" L"\0" - L"\xff1c" L"\0" L"\xff1d" L"\0" L"\xff1e" L"\0" L"\xff1f" L"\0" L"\xff20" - L"\0" L"\xff21" L"\0" L"\xff22" L"\0" L"\xff23" L"\0" L"\xff24" L"\0" - L"\xff25" L"\0" L"\xff26" L"\0" L"\xff27" L"\0" L"\xff28" L"\0" L"\xff29" - L"\0" L"\xff2a" L"\0" L"\xff2b" L"\0" L"\xff2c" L"\0" L"\xff2d" L"\0" - L"\xff2e" L"\0" L"\xff2f" L"\0" L"\xff30" L"\0" L"\xff31" L"\0" L"\xff32" - L"\0" L"\xff33" L"\0" L"\xff34" L"\0" L"\xff35" L"\0" L"\xff36" L"\0" - L"\xff37" L"\0" L"\xff38" L"\0" L"\xff39" L"\0" L"\xff3a" L"\0" L"\xff3b" - L"\0" L"\xff3c" L"\0" L"\xff3d" L"\0" L"\xff3e" L"\0" L"\xff3f" L"\0" - L"\xff40" L"\0" L"\xff41" L"\0" L"\xff42" L"\0" L"\xff43" L"\0" L"\xff44" - L"\0" L"\xff45" L"\0" L"\xff46" L"\0" L"\xff47" L"\0" L"\xff48" L"\0" - L"\xff49" L"\0" L"\xff4a" L"\0" L"\xff4b" L"\0" L"\xff4c" L"\0" L"\xff4d" - L"\0" L"\xff4e" L"\0" L"\xff4f" L"\0" L"\xff50" L"\0" L"\xff51" L"\0" - L"\xff52" L"\0" L"\xff53" L"\0" L"\xff54" L"\0" L"\xff55" L"\0" L"\xff56" - L"\0" L"\xff57" L"\0" L"\xff58" L"\0" L"\xff59" L"\0" L"\xff5a" L"\0" - L"\xff5b" L"\0" L"\xff5c" L"\0" L"\xff5d" L"\0" L"\xff5e" L"\0" - L"\x0001d400" L"\0" L"\x0001d401" L"\0" L"\x0001d402" L"\0" L"\x0001d403" - L"\0" L"\x0001d404" L"\0" L"\x0001d405" L"\0" L"\x0001d406" L"\0" - L"\x0001d407" L"\0" L"\x0001d408" L"\0" L"\x0001d409" L"\0" L"\x0001d40a" - L"\0" L"\x0001d40b" L"\0" L"\x0001d40c" L"\0" L"\x0001d40d" L"\0" - L"\x0001d40e" L"\0" L"\x0001d40f" L"\0" L"\x0001d410" L"\0" L"\x0001d411" - L"\0" L"\x0001d412" L"\0" L"\x0001d413" L"\0" L"\x0001d414" L"\0" - L"\x0001d415" L"\0" L"\x0001d416" L"\0" L"\x0001d417" L"\0" L"\x0001d418" - L"\0" L"\x0001d419" L"\0" L"\x0001d41a" L"\0" L"\x0001d41b" L"\0" - L"\x0001d41c" L"\0" L"\x0001d41d" L"\0" L"\x0001d41e" L"\0" L"\x0001d41f" - L"\0" L"\x0001d420" L"\0" L"\x0001d421" L"\0" L"\x0001d422" L"\0" - L"\x0001d423" L"\0" L"\x0001d424" L"\0" L"\x0001d425" L"\0" L"\x0001d426" - L"\0" L"\x0001d427" L"\0" L"\x0001d428" L"\0" L"\x0001d429" L"\0" - L"\x0001d42a" L"\0" L"\x0001d42b" L"\0" L"\x0001d42c" L"\0" L"\x0001d42d" - L"\0" L"\x0001d42e" L"\0" L"\x0001d42f" L"\0" L"\x0001d430" L"\0" - L"\x0001d431" L"\0" L"\x0001d432" L"\0" L"\x0001d433" L"\0" L"\x0001d434" - L"\0" L"\x0001d435" L"\0" L"\x0001d436" L"\0" L"\x0001d437" L"\0" - L"\x0001d438" L"\0" L"\x0001d439" L"\0" L"\x0001d43a" L"\0" L"\x0001d43b" - L"\0" L"\x0001d43c" L"\0" L"\x0001d43d" L"\0" L"\x0001d43e" L"\0" - L"\x0001d43f" L"\0" L"\x0001d440" L"\0" L"\x0001d441" L"\0" L"\x0001d442" - L"\0" L"\x0001d443" L"\0" L"\x0001d444" L"\0" L"\x0001d445" L"\0" - L"\x0001d446" L"\0" L"\x0001d447" L"\0" L"\x0001d448" L"\0" L"\x0001d449" - L"\0" L"\x0001d44a" L"\0" L"\x0001d44b" L"\0" L"\x0001d44c" L"\0" - L"\x0001d44d" L"\0" L"\x0001d44e" L"\0" L"\x0001d44f" L"\0" L"\x0001d450" - L"\0" L"\x0001d451" L"\0" L"\x0001d452" L"\0" L"\x0001d453" L"\0" - L"\x0001d454" L"\0" L"\x0001d456" L"\0" L"\x0001d457" L"\0" L"\x0001d458" - L"\0" L"\x0001d459" L"\0" L"\x0001d45a" L"\0" L"\x0001d45b" L"\0" - L"\x0001d45c" L"\0" L"\x0001d45d" L"\0" L"\x0001d45e" L"\0" L"\x0001d45f" - L"\0" L"\x0001d460" L"\0" L"\x0001d461" L"\0" L"\x0001d462" L"\0" - L"\x0001d463" L"\0" L"\x0001d464" L"\0" L"\x0001d465" L"\0" L"\x0001d466" - L"\0" L"\x0001d467" L"\0" L"\x0001d468" L"\0" L"\x0001d469" L"\0" - L"\x0001d46a" L"\0" L"\x0001d46b" L"\0" L"\x0001d46c" L"\0" L"\x0001d46d" - L"\0" L"\x0001d46e" L"\0" L"\x0001d46f" L"\0" L"\x0001d470" L"\0" - L"\x0001d471" L"\0" L"\x0001d472" L"\0" L"\x0001d473" L"\0" L"\x0001d474" - L"\0" L"\x0001d475" L"\0" L"\x0001d476" L"\0" L"\x0001d477" L"\0" - L"\x0001d478" L"\0" L"\x0001d479" L"\0" L"\x0001d47a" L"\0" L"\x0001d47b" - L"\0" L"\x0001d47c" L"\0" L"\x0001d47d" L"\0" L"\x0001d47e" L"\0" - L"\x0001d47f" L"\0" L"\x0001d480" L"\0" L"\x0001d481" L"\0" L"\x0001d482" - L"\0" L"\x0001d483" L"\0" L"\x0001d484" L"\0" L"\x0001d485" L"\0" - L"\x0001d486" L"\0" L"\x0001d487" L"\0" L"\x0001d488" L"\0" L"\x0001d489" - L"\0" L"\x0001d48a" L"\0" L"\x0001d48b" L"\0" L"\x0001d48c" L"\0" - L"\x0001d48d" L"\0" L"\x0001d48e" L"\0" L"\x0001d48f" L"\0" L"\x0001d490" - L"\0" L"\x0001d491" L"\0" L"\x0001d492" L"\0" L"\x0001d493" L"\0" - L"\x0001d494" L"\0" L"\x0001d495" L"\0" L"\x0001d496" L"\0" L"\x0001d497" - L"\0" L"\x0001d498" L"\0" L"\x0001d499" L"\0" L"\x0001d49a" L"\0" - L"\x0001d49b" L"\0" L"\x0001d49c" L"\0" L"\x0001d49e" L"\0" L"\x0001d49f" - L"\0" L"\x0001d4a2" L"\0" L"\x0001d4a5" L"\0" L"\x0001d4a6" L"\0" - L"\x0001d4a9" L"\0" L"\x0001d4aa" L"\0" L"\x0001d4ab" L"\0" L"\x0001d4ac" - L"\0" L"\x0001d4ae" L"\0" L"\x0001d4af" L"\0" L"\x0001d4b0" L"\0" - L"\x0001d4b1" L"\0" L"\x0001d4b2" L"\0" L"\x0001d4b3" L"\0" L"\x0001d4b4" - L"\0" L"\x0001d4b5" L"\0" L"\x0001d4b6" L"\0" L"\x0001d4b7" L"\0" - L"\x0001d4b8" L"\0" L"\x0001d4b9" L"\0" L"\x0001d4bb" L"\0" L"\x0001d4bd" - L"\0" L"\x0001d4be" L"\0" L"\x0001d4bf" L"\0" L"\x0001d4c0" L"\0" - L"\x0001d4c2" L"\0" L"\x0001d4c3" L"\0" L"\x0001d4c5" L"\0" L"\x0001d4c6" - L"\0" L"\x0001d4c7" L"\0" L"\x0001d4c8" L"\0" L"\x0001d4c9" L"\0" - L"\x0001d4ca" L"\0" L"\x0001d4cb" L"\0" L"\x0001d4cc" L"\0" L"\x0001d4cd" - L"\0" L"\x0001d4ce" L"\0" L"\x0001d4cf" L"\0" L"\x0001d4d0" L"\0" - L"\x0001d4d1" L"\0" L"\x0001d4d2" L"\0" L"\x0001d4d3" L"\0" L"\x0001d4d4" - L"\0" L"\x0001d4d5" L"\0" L"\x0001d4d6" L"\0" L"\x0001d4d7" L"\0" - L"\x0001d4d8" L"\0" L"\x0001d4d9" L"\0" L"\x0001d4da" L"\0" L"\x0001d4db" - L"\0" L"\x0001d4dc" L"\0" L"\x0001d4dd" L"\0" L"\x0001d4de" L"\0" - L"\x0001d4df" L"\0" L"\x0001d4e0" L"\0" L"\x0001d4e1" L"\0" L"\x0001d4e2" - L"\0" L"\x0001d4e3" L"\0" L"\x0001d4e4" L"\0" L"\x0001d4e5" L"\0" - L"\x0001d4e6" L"\0" L"\x0001d4e7" L"\0" L"\x0001d4e8" L"\0" L"\x0001d4e9" - L"\0" L"\x0001d4ea" L"\0" L"\x0001d4eb" L"\0" L"\x0001d4ec" L"\0" - L"\x0001d4ed" L"\0" L"\x0001d4ee" L"\0" L"\x0001d4ef" L"\0" L"\x0001d4f0" - L"\0" L"\x0001d4f1" L"\0" L"\x0001d4f2" L"\0" L"\x0001d4f3" L"\0" - L"\x0001d4f4" L"\0" L"\x0001d4f5" L"\0" L"\x0001d4f6" L"\0" L"\x0001d4f7" - L"\0" L"\x0001d4f8" L"\0" L"\x0001d4f9" L"\0" L"\x0001d4fa" L"\0" - L"\x0001d4fb" L"\0" L"\x0001d4fc" L"\0" L"\x0001d4fd" L"\0" L"\x0001d4fe" - L"\0" L"\x0001d4ff" L"\0" L"\x0001d500" L"\0" L"\x0001d501" L"\0" - L"\x0001d502" L"\0" L"\x0001d503" L"\0" L"\x0001d504" L"\0" L"\x0001d505" - L"\0" L"\x0001d507" L"\0" L"\x0001d508" L"\0" L"\x0001d509" L"\0" - L"\x0001d50a" L"\0" L"\x0001d50d" L"\0" L"\x0001d50e" L"\0" L"\x0001d50f" - L"\0" L"\x0001d510" L"\0" L"\x0001d511" L"\0" L"\x0001d512" L"\0" - L"\x0001d513" L"\0" L"\x0001d514" L"\0" L"\x0001d516" L"\0" L"\x0001d517" - L"\0" L"\x0001d518" L"\0" L"\x0001d519" L"\0" L"\x0001d51a" L"\0" - L"\x0001d51b" L"\0" L"\x0001d51c" L"\0" L"\x0001d51e" L"\0" L"\x0001d51f" - L"\0" L"\x0001d520" L"\0" L"\x0001d521" L"\0" L"\x0001d522" L"\0" - L"\x0001d523" L"\0" L"\x0001d524" L"\0" L"\x0001d525" L"\0" L"\x0001d526" - L"\0" L"\x0001d527" L"\0" L"\x0001d528" L"\0" L"\x0001d529" L"\0" - L"\x0001d52a" L"\0" L"\x0001d52b" L"\0" L"\x0001d52c" L"\0" L"\x0001d52d" - L"\0" L"\x0001d52e" L"\0" L"\x0001d52f" L"\0" L"\x0001d530" L"\0" - L"\x0001d531" L"\0" L"\x0001d532" L"\0" L"\x0001d533" L"\0" L"\x0001d534" - L"\0" L"\x0001d535" L"\0" L"\x0001d536" L"\0" L"\x0001d537" L"\0" - L"\x0001d538" L"\0" L"\x0001d539" L"\0" L"\x0001d53b" L"\0" L"\x0001d53c" - L"\0" L"\x0001d53d" L"\0" L"\x0001d53e" L"\0" L"\x0001d540" L"\0" - L"\x0001d541" L"\0" L"\x0001d542" L"\0" L"\x0001d543" L"\0" L"\x0001d544" - L"\0" L"\x0001d546" L"\0" L"\x0001d54a" L"\0" L"\x0001d54b" L"\0" - L"\x0001d54c" L"\0" L"\x0001d54d" L"\0" L"\x0001d54e" L"\0" L"\x0001d54f" - L"\0" L"\x0001d550" L"\0" L"\x0001d552" L"\0" L"\x0001d553" L"\0" - L"\x0001d554" L"\0" L"\x0001d555" L"\0" L"\x0001d556" L"\0" L"\x0001d557" - L"\0" L"\x0001d558" L"\0" L"\x0001d559" L"\0" L"\x0001d55a" L"\0" - L"\x0001d55b" L"\0" L"\x0001d55c" L"\0" L"\x0001d55d" L"\0" L"\x0001d55e" - L"\0" L"\x0001d55f" L"\0" L"\x0001d560" L"\0" L"\x0001d561" L"\0" - L"\x0001d562" L"\0" L"\x0001d563" L"\0" L"\x0001d564" L"\0" L"\x0001d565" - L"\0" L"\x0001d566" L"\0" L"\x0001d567" L"\0" L"\x0001d568" L"\0" - L"\x0001d569" L"\0" L"\x0001d56a" L"\0" L"\x0001d56b" L"\0" L"\x0001d56c" - L"\0" L"\x0001d56d" L"\0" L"\x0001d56e" L"\0" L"\x0001d56f" L"\0" - L"\x0001d570" L"\0" L"\x0001d571" L"\0" L"\x0001d572" L"\0" L"\x0001d573" - L"\0" L"\x0001d574" L"\0" L"\x0001d575" L"\0" L"\x0001d576" L"\0" - L"\x0001d577" L"\0" L"\x0001d578" L"\0" L"\x0001d579" L"\0" L"\x0001d57a" - L"\0" L"\x0001d57b" L"\0" L"\x0001d57c" L"\0" L"\x0001d57d" L"\0" - L"\x0001d57e" L"\0" L"\x0001d57f" L"\0" L"\x0001d580" L"\0" L"\x0001d581" - L"\0" L"\x0001d582" L"\0" L"\x0001d583" L"\0" L"\x0001d584" L"\0" - L"\x0001d585" L"\0" L"\x0001d586" L"\0" L"\x0001d587" L"\0" L"\x0001d588" - L"\0" L"\x0001d589" L"\0" L"\x0001d58a" L"\0" L"\x0001d58b" L"\0" - L"\x0001d58c" L"\0" L"\x0001d58d" L"\0" L"\x0001d58e" L"\0" L"\x0001d58f" - L"\0" L"\x0001d590" L"\0" L"\x0001d591" L"\0" L"\x0001d592" L"\0" - L"\x0001d593" L"\0" L"\x0001d594" L"\0" L"\x0001d595" L"\0" L"\x0001d596" - L"\0" L"\x0001d597" L"\0" L"\x0001d598" L"\0" L"\x0001d599" L"\0" - L"\x0001d59a" L"\0" L"\x0001d59b" L"\0" L"\x0001d59c" L"\0" L"\x0001d59d" - L"\0" L"\x0001d59e" L"\0" L"\x0001d59f" L"\0" L"\x0001d5a0" L"\0" - L"\x0001d5a1" L"\0" L"\x0001d5a2" L"\0" L"\x0001d5a3" L"\0" L"\x0001d5a4" - L"\0" L"\x0001d5a5" L"\0" L"\x0001d5a6" L"\0" L"\x0001d5a7" L"\0" - L"\x0001d5a8" L"\0" L"\x0001d5a9" L"\0" L"\x0001d5aa" L"\0" L"\x0001d5ab" - L"\0" L"\x0001d5ac" L"\0" L"\x0001d5ad" L"\0" L"\x0001d5ae" L"\0" - L"\x0001d5af" L"\0" L"\x0001d5b0" L"\0" L"\x0001d5b1" L"\0" L"\x0001d5b2" - L"\0" L"\x0001d5b3" L"\0" L"\x0001d5b4" L"\0" L"\x0001d5b5" L"\0" - L"\x0001d5b6" L"\0" L"\x0001d5b7" L"\0" L"\x0001d5b8" L"\0" L"\x0001d5b9" - L"\0" L"\x0001d5ba" L"\0" L"\x0001d5bb" L"\0" L"\x0001d5bc" L"\0" - L"\x0001d5bd" L"\0" L"\x0001d5be" L"\0" L"\x0001d5bf" L"\0" L"\x0001d5c0" - L"\0" L"\x0001d5c1" L"\0" L"\x0001d5c2" L"\0" L"\x0001d5c3" L"\0" - L"\x0001d5c4" L"\0" L"\x0001d5c5" L"\0" L"\x0001d5c6" L"\0" L"\x0001d5c7" - L"\0" L"\x0001d5c8" L"\0" L"\x0001d5c9" L"\0" L"\x0001d5ca" L"\0" - L"\x0001d5cb" L"\0" L"\x0001d5cc" L"\0" L"\x0001d5cd" L"\0" L"\x0001d5ce" - L"\0" L"\x0001d5cf" L"\0" L"\x0001d5d0" L"\0" L"\x0001d5d1" L"\0" - L"\x0001d5d2" L"\0" L"\x0001d5d3" L"\0" L"\x0001d5d4" L"\0" L"\x0001d5d5" - L"\0" L"\x0001d5d6" L"\0" L"\x0001d5d7" L"\0" L"\x0001d5d8" L"\0" - L"\x0001d5d9" L"\0" L"\x0001d5da" L"\0" L"\x0001d5db" L"\0" L"\x0001d5dc" - L"\0" L"\x0001d5dd" L"\0" L"\x0001d5de" L"\0" L"\x0001d5df" L"\0" - L"\x0001d5e0" L"\0" L"\x0001d5e1" L"\0" L"\x0001d5e2" L"\0" L"\x0001d5e3" - L"\0" L"\x0001d5e4" L"\0" L"\x0001d5e5" L"\0" L"\x0001d5e6" L"\0" - L"\x0001d5e7" L"\0" L"\x0001d5e8" L"\0" L"\x0001d5e9" L"\0" L"\x0001d5ea" - L"\0" L"\x0001d5eb" L"\0" L"\x0001d5ec" L"\0" L"\x0001d5ed" L"\0" - L"\x0001d5ee" L"\0" L"\x0001d5ef" L"\0" L"\x0001d5f0" L"\0" L"\x0001d5f1" - L"\0" L"\x0001d5f2" L"\0" L"\x0001d5f3" L"\0" L"\x0001d5f4" L"\0" - L"\x0001d5f5" L"\0" L"\x0001d5f6" L"\0" L"\x0001d5f7" L"\0" L"\x0001d5f8" - L"\0" L"\x0001d5f9" L"\0" L"\x0001d5fa" L"\0" L"\x0001d5fb" L"\0" - L"\x0001d5fc" L"\0" L"\x0001d5fd" L"\0" L"\x0001d5fe" L"\0" L"\x0001d5ff" - L"\0" L"\x0001d600" L"\0" L"\x0001d601" L"\0" L"\x0001d602" L"\0" - L"\x0001d603" L"\0" L"\x0001d604" L"\0" L"\x0001d605" L"\0" L"\x0001d606" - L"\0" L"\x0001d607" L"\0" L"\x0001d608" L"\0" L"\x0001d609" L"\0" - L"\x0001d60a" L"\0" L"\x0001d60b" L"\0" L"\x0001d60c" L"\0" L"\x0001d60d" - L"\0" L"\x0001d60e" L"\0" L"\x0001d60f" L"\0" L"\x0001d610" L"\0" - L"\x0001d611" L"\0" L"\x0001d612" L"\0" L"\x0001d613" L"\0" L"\x0001d614" - L"\0" L"\x0001d615" L"\0" L"\x0001d616" L"\0" L"\x0001d617" L"\0" - L"\x0001d618" L"\0" L"\x0001d619" L"\0" L"\x0001d61a" L"\0" L"\x0001d61b" - L"\0" L"\x0001d61c" L"\0" L"\x0001d61d" L"\0" L"\x0001d61e" L"\0" - L"\x0001d61f" L"\0" L"\x0001d620" L"\0" L"\x0001d621" L"\0" L"\x0001d622" - L"\0" L"\x0001d623" L"\0" L"\x0001d624" L"\0" L"\x0001d625" L"\0" - L"\x0001d626" L"\0" L"\x0001d627" L"\0" L"\x0001d628" L"\0" L"\x0001d629" - L"\0" L"\x0001d62a" L"\0" L"\x0001d62b" L"\0" L"\x0001d62c" L"\0" - L"\x0001d62d" L"\0" L"\x0001d62e" L"\0" L"\x0001d62f" L"\0" L"\x0001d630" - L"\0" L"\x0001d631" L"\0" L"\x0001d632" L"\0" L"\x0001d633" L"\0" - L"\x0001d634" L"\0" L"\x0001d635" L"\0" L"\x0001d636" L"\0" L"\x0001d637" - L"\0" L"\x0001d638" L"\0" L"\x0001d639" L"\0" L"\x0001d63a" L"\0" - L"\x0001d63b" L"\0" L"\x0001d63c" L"\0" L"\x0001d63d" L"\0" L"\x0001d63e" - L"\0" L"\x0001d63f" L"\0" L"\x0001d640" L"\0" L"\x0001d641" L"\0" - L"\x0001d642" L"\0" L"\x0001d643" L"\0" L"\x0001d644" L"\0" L"\x0001d645" - L"\0" L"\x0001d646" L"\0" L"\x0001d647" L"\0" L"\x0001d648" L"\0" - L"\x0001d649" L"\0" L"\x0001d64a" L"\0" L"\x0001d64b" L"\0" L"\x0001d64c" - L"\0" L"\x0001d64d" L"\0" L"\x0001d64e" L"\0" L"\x0001d64f" L"\0" - L"\x0001d650" L"\0" L"\x0001d651" L"\0" L"\x0001d652" L"\0" L"\x0001d653" - L"\0" L"\x0001d654" L"\0" L"\x0001d655" L"\0" L"\x0001d656" L"\0" - L"\x0001d657" L"\0" L"\x0001d658" L"\0" L"\x0001d659" L"\0" L"\x0001d65a" - L"\0" L"\x0001d65b" L"\0" L"\x0001d65c" L"\0" L"\x0001d65d" L"\0" - L"\x0001d65e" L"\0" L"\x0001d65f" L"\0" L"\x0001d660" L"\0" L"\x0001d661" - L"\0" L"\x0001d662" L"\0" L"\x0001d663" L"\0" L"\x0001d664" L"\0" - L"\x0001d665" L"\0" L"\x0001d666" L"\0" L"\x0001d667" L"\0" L"\x0001d668" - L"\0" L"\x0001d669" L"\0" L"\x0001d66a" L"\0" L"\x0001d66b" L"\0" - L"\x0001d66c" L"\0" L"\x0001d66d" L"\0" L"\x0001d66e" L"\0" L"\x0001d66f" - L"\0" L"\x0001d670" L"\0" L"\x0001d671" L"\0" L"\x0001d672" L"\0" - L"\x0001d673" L"\0" L"\x0001d674" L"\0" L"\x0001d675" L"\0" L"\x0001d676" - L"\0" L"\x0001d677" L"\0" L"\x0001d678" L"\0" L"\x0001d679" L"\0" - L"\x0001d67a" L"\0" L"\x0001d67b" L"\0" L"\x0001d67c" L"\0" L"\x0001d67d" - L"\0" L"\x0001d67e" L"\0" L"\x0001d67f" L"\0" L"\x0001d680" L"\0" - L"\x0001d681" L"\0" L"\x0001d682" L"\0" L"\x0001d683" L"\0" L"\x0001d684" - L"\0" L"\x0001d685" L"\0" L"\x0001d686" L"\0" L"\x0001d687" L"\0" - L"\x0001d688" L"\0" L"\x0001d689" L"\0" L"\x0001d68a" L"\0" L"\x0001d68b" - L"\0" L"\x0001d68c" L"\0" L"\x0001d68d" L"\0" L"\x0001d68e" L"\0" - L"\x0001d68f" L"\0" L"\x0001d690" L"\0" L"\x0001d691" L"\0" L"\x0001d692" - L"\0" L"\x0001d693" L"\0" L"\x0001d694" L"\0" L"\x0001d695" L"\0" - L"\x0001d696" L"\0" L"\x0001d697" L"\0" L"\x0001d698" L"\0" L"\x0001d699" - L"\0" L"\x0001d69a" L"\0" L"\x0001d69b" L"\0" L"\x0001d69c" L"\0" - L"\x0001d69d" L"\0" L"\x0001d69e" L"\0" L"\x0001d69f" L"\0" L"\x0001d6a0" - L"\0" L"\x0001d6a1" L"\0" L"\x0001d6a2" L"\0" L"\x0001d6a3" L"\0" - L"\x0001d7ce" L"\0" L"\x0001d7cf" L"\0" L"\x0001d7d0" L"\0" L"\x0001d7d1" - L"\0" L"\x0001d7d2" L"\0" L"\x0001d7d3" L"\0" L"\x0001d7d4" L"\0" - L"\x0001d7d5" L"\0" L"\x0001d7d6" L"\0" L"\x0001d7d7" L"\0" L"\x0001d7d8" - L"\0" L"\x0001d7d9" L"\0" L"\x0001d7da" L"\0" L"\x0001d7db" L"\0" - L"\x0001d7dc" L"\0" L"\x0001d7dd" L"\0" L"\x0001d7de" L"\0" L"\x0001d7df" - L"\0" L"\x0001d7e0" L"\0" L"\x0001d7e1" L"\0" L"\x0001d7e2" L"\0" - L"\x0001d7e3" L"\0" L"\x0001d7e4" L"\0" L"\x0001d7e5" L"\0" L"\x0001d7e6" - L"\0" L"\x0001d7e7" L"\0" L"\x0001d7e8" L"\0" L"\x0001d7e9" L"\0" - L"\x0001d7ea" L"\0" L"\x0001d7eb" L"\0" L"\x0001d7ec" L"\0" L"\x0001d7ed" - L"\0" L"\x0001d7ee" L"\0" L"\x0001d7ef" L"\0" L"\x0001d7f0" L"\0" - L"\x0001d7f1" L"\0" L"\x0001d7f2" L"\0" L"\x0001d7f3" L"\0" L"\x0001d7f4" - L"\0" L"\x0001d7f5" L"\0" L"\x0001d7f6" L"\0" L"\x0001d7f7" L"\0" - L"\x0001d7f8" L"\0" L"\x0001d7f9" L"\0" L"\x0001d7fa" L"\0" L"\x0001d7fb" - L"\0" L"\x0001d7fc" L"\0" L"\x0001d7fd" L"\0" L"\x0001d7fe" L"\0" - L"\x0001d7ff"; + L"\x2062" L"\0" L"\x2063" L"\0" L"\x20a8" L"\0" L"\x20ac" L"\0" L"\x20b9" + L"\0" L"\x2100" L"\0" L"\x2101" L"\0" L"\x2102" L"\0" L"\x2105" L"\0" + L"\x2106" L"\0" L"\x210a" L"\0" L"\x210b" L"\0" L"\x210c" L"\0" L"\x210d" + L"\0" L"\x210e" L"\0" L"\x2110" L"\0" L"\x2111" L"\0" L"\x2112" L"\0" + L"\x2113" L"\0" L"\x2115" L"\0" L"\x2116" L"\0" L"\x2119" L"\0" L"\x211a" + L"\0" L"\x211b" L"\0" L"\x211c" L"\0" L"\x211d" L"\0" L"\x2121" L"\0" + L"\x2122" L"\0" L"\x2124" L"\0" L"\x2126" L"\0" L"\x2128" L"\0" L"\x212c" + L"\0" L"\x212d" L"\0" L"\x212e" L"\0" L"\x212f" L"\0" L"\x2130" L"\0" + L"\x2131" L"\0" L"\x2133" L"\0" L"\x2134" L"\0" L"\x2139" L"\0" L"\x2145" + L"\0" L"\x2146" L"\0" L"\x2147" L"\0" L"\x2148" L"\0" L"\x2149" L"\0" + L"\x2153" L"\0" L"\x2154" L"\0" L"\x2155" L"\0" L"\x2156" L"\0" L"\x2157" + L"\0" L"\x2158" L"\0" L"\x2159" L"\0" L"\x215a" L"\0" L"\x215b" L"\0" + L"\x215c" L"\0" L"\x215d" L"\0" L"\x215e" L"\0" L"\x215f" L"\0" L"\x2160" + L"\0" L"\x2161" L"\0" L"\x2162" L"\0" L"\x2163" L"\0" L"\x2164" L"\0" + L"\x2165" L"\0" L"\x2166" L"\0" L"\x2167" L"\0" L"\x2168" L"\0" L"\x2169" + L"\0" L"\x216a" L"\0" L"\x216b" L"\0" L"\x216c" L"\0" L"\x216d" L"\0" + L"\x216e" L"\0" L"\x216f" L"\0" L"\x2170" L"\0" L"\x2171" L"\0" L"\x2172" + L"\0" L"\x2173" L"\0" L"\x2174" L"\0" L"\x2175" L"\0" L"\x2176" L"\0" + L"\x2177" L"\0" L"\x2178" L"\0" L"\x2179" L"\0" L"\x217a" L"\0" L"\x217b" + L"\0" L"\x217c" L"\0" L"\x217d" L"\0" L"\x217e" L"\0" L"\x217f" L"\0" + L"\x2190" L"\0" L"\x2192" L"\0" L"\x2194" L"\0" L"\x21d0" L"\0" L"\x21d2" + L"\0" L"\x21d4" L"\0" L"\x2212" L"\0" L"\x2215" L"\0" L"\x2216" L"\0" + L"\x2217" L"\0" L"\x2223" L"\0" L"\x2236" L"\0" L"\x223c" L"\0" L"\x2264" + L"\0" L"\x2265" L"\0" L"\x226a" L"\0" L"\x226b" L"\0" L"\x22d8" L"\0" + L"\x22d9" L"\0" L"\x2400" L"\0" L"\x2401" L"\0" L"\x2402" L"\0" L"\x2403" + L"\0" L"\x2404" L"\0" L"\x2405" L"\0" L"\x2406" L"\0" L"\x2407" L"\0" + L"\x2408" L"\0" L"\x2409" L"\0" L"\x240a" L"\0" L"\x240b" L"\0" L"\x240c" + L"\0" L"\x240d" L"\0" L"\x240e" L"\0" L"\x240f" L"\0" L"\x2410" L"\0" + L"\x2411" L"\0" L"\x2412" L"\0" L"\x2413" L"\0" L"\x2414" L"\0" L"\x2415" + L"\0" L"\x2416" L"\0" L"\x2417" L"\0" L"\x2418" L"\0" L"\x2419" L"\0" + L"\x241a" L"\0" L"\x241b" L"\0" L"\x241c" L"\0" L"\x241d" L"\0" L"\x241e" + L"\0" L"\x241f" L"\0" L"\x2420" L"\0" L"\x2421" L"\0" L"\x2423" L"\0" + L"\x2424" L"\0" L"\x2460" L"\0" L"\x2461" L"\0" L"\x2462" L"\0" L"\x2463" + L"\0" L"\x2464" L"\0" L"\x2465" L"\0" L"\x2466" L"\0" L"\x2467" L"\0" + L"\x2468" L"\0" L"\x2469" L"\0" L"\x246a" L"\0" L"\x246b" L"\0" L"\x246c" + L"\0" L"\x246d" L"\0" L"\x246e" L"\0" L"\x246f" L"\0" L"\x2470" L"\0" + L"\x2471" L"\0" L"\x2472" L"\0" L"\x2473" L"\0" L"\x2474" L"\0" L"\x2475" + L"\0" L"\x2476" L"\0" L"\x2477" L"\0" L"\x2478" L"\0" L"\x2479" L"\0" + L"\x247a" L"\0" L"\x247b" L"\0" L"\x247c" L"\0" L"\x247d" L"\0" L"\x247e" + L"\0" L"\x247f" L"\0" L"\x2480" L"\0" L"\x2481" L"\0" L"\x2482" L"\0" + L"\x2483" L"\0" L"\x2484" L"\0" L"\x2485" L"\0" L"\x2486" L"\0" L"\x2487" + L"\0" L"\x2488" L"\0" L"\x2489" L"\0" L"\x248a" L"\0" L"\x248b" L"\0" + L"\x248c" L"\0" L"\x248d" L"\0" L"\x248e" L"\0" L"\x248f" L"\0" L"\x2490" + L"\0" L"\x2491" L"\0" L"\x2492" L"\0" L"\x2493" L"\0" L"\x2494" L"\0" + L"\x2495" L"\0" L"\x2496" L"\0" L"\x2497" L"\0" L"\x2498" L"\0" L"\x2499" + L"\0" L"\x249a" L"\0" L"\x249b" L"\0" L"\x249c" L"\0" L"\x249d" L"\0" + L"\x249e" L"\0" L"\x249f" L"\0" L"\x24a0" L"\0" L"\x24a1" L"\0" L"\x24a2" + L"\0" L"\x24a3" L"\0" L"\x24a4" L"\0" L"\x24a5" L"\0" L"\x24a6" L"\0" + L"\x24a7" L"\0" L"\x24a8" L"\0" L"\x24a9" L"\0" L"\x24aa" L"\0" L"\x24ab" + L"\0" L"\x24ac" L"\0" L"\x24ad" L"\0" L"\x24ae" L"\0" L"\x24af" L"\0" + L"\x24b0" L"\0" L"\x24b1" L"\0" L"\x24b2" L"\0" L"\x24b3" L"\0" L"\x24b4" + L"\0" L"\x24b5" L"\0" L"\x24b6" L"\0" L"\x24b7" L"\0" L"\x24b8" L"\0" + L"\x24b9" L"\0" L"\x24ba" L"\0" L"\x24bb" L"\0" L"\x24bc" L"\0" L"\x24bd" + L"\0" L"\x24be" L"\0" L"\x24bf" L"\0" L"\x24c0" L"\0" L"\x24c1" L"\0" + L"\x24c2" L"\0" L"\x24c3" L"\0" L"\x24c4" L"\0" L"\x24c5" L"\0" L"\x24c6" + L"\0" L"\x24c7" L"\0" L"\x24c8" L"\0" L"\x24c9" L"\0" L"\x24ca" L"\0" + L"\x24cb" L"\0" L"\x24cc" L"\0" L"\x24cd" L"\0" L"\x24ce" L"\0" L"\x24cf" + L"\0" L"\x24d0" L"\0" L"\x24d1" L"\0" L"\x24d2" L"\0" L"\x24d3" L"\0" + L"\x24d4" L"\0" L"\x24d5" L"\0" L"\x24d6" L"\0" L"\x24d7" L"\0" L"\x24d8" + L"\0" L"\x24d9" L"\0" L"\x24da" L"\0" L"\x24db" L"\0" L"\x24dc" L"\0" + L"\x24dd" L"\0" L"\x24de" L"\0" L"\x24df" L"\0" L"\x24e0" L"\0" L"\x24e1" + L"\0" L"\x24e2" L"\0" L"\x24e3" L"\0" L"\x24e4" L"\0" L"\x24e5" L"\0" + L"\x24e6" L"\0" L"\x24e7" L"\0" L"\x24e8" L"\0" L"\x24e9" L"\0" L"\x24ea" + L"\0" L"\x2500" L"\0" L"\x2502" L"\0" L"\x250c" L"\0" L"\x2510" L"\0" + L"\x2514" L"\0" L"\x2518" L"\0" L"\x251c" L"\0" L"\x2524" L"\0" L"\x252c" + L"\0" L"\x2534" L"\0" L"\x253c" L"\0" L"\x25e6" L"\0" L"\x2a74" L"\0" + L"\x2a75" L"\0" L"\x2a76" L"\0" L"\x3000" L"\0" L"\x30a0" L"\0" L"\x3251" + L"\0" L"\x3252" L"\0" L"\x3253" L"\0" L"\x3254" L"\0" L"\x3255" L"\0" + L"\x3256" L"\0" L"\x3257" L"\0" L"\x3258" L"\0" L"\x3259" L"\0" L"\x325a" + L"\0" L"\x325b" L"\0" L"\x325c" L"\0" L"\x325d" L"\0" L"\x325e" L"\0" + L"\x325f" L"\0" L"\x32b1" L"\0" L"\x32b2" L"\0" L"\x32b3" L"\0" L"\x32b4" + L"\0" L"\x32b5" L"\0" L"\x32b6" L"\0" L"\x32b7" L"\0" L"\x32b8" L"\0" + L"\x32b9" L"\0" L"\x32ba" L"\0" L"\x32bb" L"\0" L"\x32bc" L"\0" L"\x32bd" + L"\0" L"\x32be" L"\0" L"\x32bf" L"\0" L"\x3371" L"\0" L"\x3372" L"\0" + L"\x3373" L"\0" L"\x3374" L"\0" L"\x3375" L"\0" L"\x3376" L"\0" L"\x3380" + L"\0" L"\x3381" L"\0" L"\x3382" L"\0" L"\x3383" L"\0" L"\x3384" L"\0" + L"\x3385" L"\0" L"\x3386" L"\0" L"\x3387" L"\0" L"\x3388" L"\0" L"\x3389" + L"\0" L"\x338a" L"\0" L"\x338b" L"\0" L"\x338c" L"\0" L"\x338d" L"\0" + L"\x338e" L"\0" L"\x338f" L"\0" L"\x3390" L"\0" L"\x3391" L"\0" L"\x3392" + L"\0" L"\x3393" L"\0" L"\x3394" L"\0" L"\x3395" L"\0" L"\x3396" L"\0" + L"\x3397" L"\0" L"\x3398" L"\0" L"\x3399" L"\0" L"\x339a" L"\0" L"\x339b" + L"\0" L"\x339c" L"\0" L"\x339d" L"\0" L"\x339e" L"\0" L"\x339f" L"\0" + L"\x33a0" L"\0" L"\x33a1" L"\0" L"\x33a2" L"\0" L"\x33a3" L"\0" L"\x33a4" + L"\0" L"\x33a5" L"\0" L"\x33a6" L"\0" L"\x33a7" L"\0" L"\x33a8" L"\0" + L"\x33a9" L"\0" L"\x33aa" L"\0" L"\x33ab" L"\0" L"\x33ac" L"\0" L"\x33ad" + L"\0" L"\x33ae" L"\0" L"\x33af" L"\0" L"\x33b0" L"\0" L"\x33b1" L"\0" + L"\x33b2" L"\0" L"\x33b3" L"\0" L"\x33b4" L"\0" L"\x33b5" L"\0" L"\x33b6" + L"\0" L"\x33b7" L"\0" L"\x33b8" L"\0" L"\x33b9" L"\0" L"\x33ba" L"\0" + L"\x33bb" L"\0" L"\x33bc" L"\0" L"\x33bd" L"\0" L"\x33be" L"\0" L"\x33bf" + L"\0" L"\x33c2" L"\0" L"\x33c3" L"\0" L"\x33c4" L"\0" L"\x33c5" L"\0" + L"\x33c6" L"\0" L"\x33c7" L"\0" L"\x33c8" L"\0" L"\x33c9" L"\0" L"\x33ca" + L"\0" L"\x33cb" L"\0" L"\x33cc" L"\0" L"\x33cd" L"\0" L"\x33ce" L"\0" + L"\x33cf" L"\0" L"\x33d0" L"\0" L"\x33d1" L"\0" L"\x33d2" L"\0" L"\x33d3" + L"\0" L"\x33d4" L"\0" L"\x33d5" L"\0" L"\x33d6" L"\0" L"\x33d7" L"\0" + L"\x33d8" L"\0" L"\x33d9" L"\0" L"\x33da" L"\0" L"\x33db" L"\0" L"\x33dc" + L"\0" L"\x33dd" L"\0" L"\xfb00" L"\0" L"\xfb01" L"\0" L"\xfb02" L"\0" + L"\xfb03" L"\0" L"\xfb04" L"\0" L"\xfb06" L"\0" L"\xfb29" L"\0" L"\xfe00" + L"\0" L"\xfe01" L"\0" L"\xfe02" L"\0" L"\xfe03" L"\0" L"\xfe04" L"\0" + L"\xfe05" L"\0" L"\xfe06" L"\0" L"\xfe07" L"\0" L"\xfe08" L"\0" L"\xfe09" + L"\0" L"\xfe0a" L"\0" L"\xfe0b" L"\0" L"\xfe0c" L"\0" L"\xfe0d" L"\0" + L"\xfe0e" L"\0" L"\xfe0f" L"\0" L"\xfe4d" L"\0" L"\xfe4e" L"\0" L"\xfe4f" + L"\0" L"\xfe50" L"\0" L"\xfe52" L"\0" L"\xfe54" L"\0" L"\xfe55" L"\0" + L"\xfe56" L"\0" L"\xfe57" L"\0" L"\xfe59" L"\0" L"\xfe5a" L"\0" L"\xfe5b" + L"\0" L"\xfe5c" L"\0" L"\xfe5f" L"\0" L"\xfe60" L"\0" L"\xfe61" L"\0" + L"\xfe62" L"\0" L"\xfe63" L"\0" L"\xfe64" L"\0" L"\xfe65" L"\0" L"\xfe66" + L"\0" L"\xfe68" L"\0" L"\xfe69" L"\0" L"\xfe6a" L"\0" L"\xfe6b" L"\0" + L"\xfeff" L"\0" L"\xff01" L"\0" L"\xff02" L"\0" L"\xff03" L"\0" L"\xff04" + L"\0" L"\xff05" L"\0" L"\xff06" L"\0" L"\xff07" L"\0" L"\xff08" L"\0" + L"\xff09" L"\0" L"\xff0a" L"\0" L"\xff0b" L"\0" L"\xff0c" L"\0" L"\xff0d" + L"\0" L"\xff0e" L"\0" L"\xff0f" L"\0" L"\xff10" L"\0" L"\xff11" L"\0" + L"\xff12" L"\0" L"\xff13" L"\0" L"\xff14" L"\0" L"\xff15" L"\0" L"\xff16" + L"\0" L"\xff17" L"\0" L"\xff18" L"\0" L"\xff19" L"\0" L"\xff1a" L"\0" + L"\xff1b" L"\0" L"\xff1c" L"\0" L"\xff1d" L"\0" L"\xff1e" L"\0" L"\xff1f" + L"\0" L"\xff20" L"\0" L"\xff21" L"\0" L"\xff22" L"\0" L"\xff23" L"\0" + L"\xff24" L"\0" L"\xff25" L"\0" L"\xff26" L"\0" L"\xff27" L"\0" L"\xff28" + L"\0" L"\xff29" L"\0" L"\xff2a" L"\0" L"\xff2b" L"\0" L"\xff2c" L"\0" + L"\xff2d" L"\0" L"\xff2e" L"\0" L"\xff2f" L"\0" L"\xff30" L"\0" L"\xff31" + L"\0" L"\xff32" L"\0" L"\xff33" L"\0" L"\xff34" L"\0" L"\xff35" L"\0" + L"\xff36" L"\0" L"\xff37" L"\0" L"\xff38" L"\0" L"\xff39" L"\0" L"\xff3a" + L"\0" L"\xff3b" L"\0" L"\xff3c" L"\0" L"\xff3d" L"\0" L"\xff3e" L"\0" + L"\xff3f" L"\0" L"\xff40" L"\0" L"\xff41" L"\0" L"\xff42" L"\0" L"\xff43" + L"\0" L"\xff44" L"\0" L"\xff45" L"\0" L"\xff46" L"\0" L"\xff47" L"\0" + L"\xff48" L"\0" L"\xff49" L"\0" L"\xff4a" L"\0" L"\xff4b" L"\0" L"\xff4c" + L"\0" L"\xff4d" L"\0" L"\xff4e" L"\0" L"\xff4f" L"\0" L"\xff50" L"\0" + L"\xff51" L"\0" L"\xff52" L"\0" L"\xff53" L"\0" L"\xff54" L"\0" L"\xff55" + L"\0" L"\xff56" L"\0" L"\xff57" L"\0" L"\xff58" L"\0" L"\xff59" L"\0" + L"\xff5a" L"\0" L"\xff5b" L"\0" L"\xff5c" L"\0" L"\xff5d" L"\0" L"\xff5e" + L"\0" L"\x0001d400" L"\0" L"\x0001d401" L"\0" L"\x0001d402" L"\0" + L"\x0001d403" L"\0" L"\x0001d404" L"\0" L"\x0001d405" L"\0" L"\x0001d406" + L"\0" L"\x0001d407" L"\0" L"\x0001d408" L"\0" L"\x0001d409" L"\0" + L"\x0001d40a" L"\0" L"\x0001d40b" L"\0" L"\x0001d40c" L"\0" L"\x0001d40d" + L"\0" L"\x0001d40e" L"\0" L"\x0001d40f" L"\0" L"\x0001d410" L"\0" + L"\x0001d411" L"\0" L"\x0001d412" L"\0" L"\x0001d413" L"\0" L"\x0001d414" + L"\0" L"\x0001d415" L"\0" L"\x0001d416" L"\0" L"\x0001d417" L"\0" + L"\x0001d418" L"\0" L"\x0001d419" L"\0" L"\x0001d41a" L"\0" L"\x0001d41b" + L"\0" L"\x0001d41c" L"\0" L"\x0001d41d" L"\0" L"\x0001d41e" L"\0" + L"\x0001d41f" L"\0" L"\x0001d420" L"\0" L"\x0001d421" L"\0" L"\x0001d422" + L"\0" L"\x0001d423" L"\0" L"\x0001d424" L"\0" L"\x0001d425" L"\0" + L"\x0001d426" L"\0" L"\x0001d427" L"\0" L"\x0001d428" L"\0" L"\x0001d429" + L"\0" L"\x0001d42a" L"\0" L"\x0001d42b" L"\0" L"\x0001d42c" L"\0" + L"\x0001d42d" L"\0" L"\x0001d42e" L"\0" L"\x0001d42f" L"\0" L"\x0001d430" + L"\0" L"\x0001d431" L"\0" L"\x0001d432" L"\0" L"\x0001d433" L"\0" + L"\x0001d434" L"\0" L"\x0001d435" L"\0" L"\x0001d436" L"\0" L"\x0001d437" + L"\0" L"\x0001d438" L"\0" L"\x0001d439" L"\0" L"\x0001d43a" L"\0" + L"\x0001d43b" L"\0" L"\x0001d43c" L"\0" L"\x0001d43d" L"\0" L"\x0001d43e" + L"\0" L"\x0001d43f" L"\0" L"\x0001d440" L"\0" L"\x0001d441" L"\0" + L"\x0001d442" L"\0" L"\x0001d443" L"\0" L"\x0001d444" L"\0" L"\x0001d445" + L"\0" L"\x0001d446" L"\0" L"\x0001d447" L"\0" L"\x0001d448" L"\0" + L"\x0001d449" L"\0" L"\x0001d44a" L"\0" L"\x0001d44b" L"\0" L"\x0001d44c" + L"\0" L"\x0001d44d" L"\0" L"\x0001d44e" L"\0" L"\x0001d44f" L"\0" + L"\x0001d450" L"\0" L"\x0001d451" L"\0" L"\x0001d452" L"\0" L"\x0001d453" + L"\0" L"\x0001d454" L"\0" L"\x0001d456" L"\0" L"\x0001d457" L"\0" + L"\x0001d458" L"\0" L"\x0001d459" L"\0" L"\x0001d45a" L"\0" L"\x0001d45b" + L"\0" L"\x0001d45c" L"\0" L"\x0001d45d" L"\0" L"\x0001d45e" L"\0" + L"\x0001d45f" L"\0" L"\x0001d460" L"\0" L"\x0001d461" L"\0" L"\x0001d462" + L"\0" L"\x0001d463" L"\0" L"\x0001d464" L"\0" L"\x0001d465" L"\0" + L"\x0001d466" L"\0" L"\x0001d467" L"\0" L"\x0001d468" L"\0" L"\x0001d469" + L"\0" L"\x0001d46a" L"\0" L"\x0001d46b" L"\0" L"\x0001d46c" L"\0" + L"\x0001d46d" L"\0" L"\x0001d46e" L"\0" L"\x0001d46f" L"\0" L"\x0001d470" + L"\0" L"\x0001d471" L"\0" L"\x0001d472" L"\0" L"\x0001d473" L"\0" + L"\x0001d474" L"\0" L"\x0001d475" L"\0" L"\x0001d476" L"\0" L"\x0001d477" + L"\0" L"\x0001d478" L"\0" L"\x0001d479" L"\0" L"\x0001d47a" L"\0" + L"\x0001d47b" L"\0" L"\x0001d47c" L"\0" L"\x0001d47d" L"\0" L"\x0001d47e" + L"\0" L"\x0001d47f" L"\0" L"\x0001d480" L"\0" L"\x0001d481" L"\0" + L"\x0001d482" L"\0" L"\x0001d483" L"\0" L"\x0001d484" L"\0" L"\x0001d485" + L"\0" L"\x0001d486" L"\0" L"\x0001d487" L"\0" L"\x0001d488" L"\0" + L"\x0001d489" L"\0" L"\x0001d48a" L"\0" L"\x0001d48b" L"\0" L"\x0001d48c" + L"\0" L"\x0001d48d" L"\0" L"\x0001d48e" L"\0" L"\x0001d48f" L"\0" + L"\x0001d490" L"\0" L"\x0001d491" L"\0" L"\x0001d492" L"\0" L"\x0001d493" + L"\0" L"\x0001d494" L"\0" L"\x0001d495" L"\0" L"\x0001d496" L"\0" + L"\x0001d497" L"\0" L"\x0001d498" L"\0" L"\x0001d499" L"\0" L"\x0001d49a" + L"\0" L"\x0001d49b" L"\0" L"\x0001d49c" L"\0" L"\x0001d49e" L"\0" + L"\x0001d49f" L"\0" L"\x0001d4a2" L"\0" L"\x0001d4a5" L"\0" L"\x0001d4a6" + L"\0" L"\x0001d4a9" L"\0" L"\x0001d4aa" L"\0" L"\x0001d4ab" L"\0" + L"\x0001d4ac" L"\0" L"\x0001d4ae" L"\0" L"\x0001d4af" L"\0" L"\x0001d4b0" + L"\0" L"\x0001d4b1" L"\0" L"\x0001d4b2" L"\0" L"\x0001d4b3" L"\0" + L"\x0001d4b4" L"\0" L"\x0001d4b5" L"\0" L"\x0001d4b6" L"\0" L"\x0001d4b7" + L"\0" L"\x0001d4b8" L"\0" L"\x0001d4b9" L"\0" L"\x0001d4bb" L"\0" + L"\x0001d4bd" L"\0" L"\x0001d4be" L"\0" L"\x0001d4bf" L"\0" L"\x0001d4c0" + L"\0" L"\x0001d4c2" L"\0" L"\x0001d4c3" L"\0" L"\x0001d4c5" L"\0" + L"\x0001d4c6" L"\0" L"\x0001d4c7" L"\0" L"\x0001d4c8" L"\0" L"\x0001d4c9" + L"\0" L"\x0001d4ca" L"\0" L"\x0001d4cb" L"\0" L"\x0001d4cc" L"\0" + L"\x0001d4cd" L"\0" L"\x0001d4ce" L"\0" L"\x0001d4cf" L"\0" L"\x0001d4d0" + L"\0" L"\x0001d4d1" L"\0" L"\x0001d4d2" L"\0" L"\x0001d4d3" L"\0" + L"\x0001d4d4" L"\0" L"\x0001d4d5" L"\0" L"\x0001d4d6" L"\0" L"\x0001d4d7" + L"\0" L"\x0001d4d8" L"\0" L"\x0001d4d9" L"\0" L"\x0001d4da" L"\0" + L"\x0001d4db" L"\0" L"\x0001d4dc" L"\0" L"\x0001d4dd" L"\0" L"\x0001d4de" + L"\0" L"\x0001d4df" L"\0" L"\x0001d4e0" L"\0" L"\x0001d4e1" L"\0" + L"\x0001d4e2" L"\0" L"\x0001d4e3" L"\0" L"\x0001d4e4" L"\0" L"\x0001d4e5" + L"\0" L"\x0001d4e6" L"\0" L"\x0001d4e7" L"\0" L"\x0001d4e8" L"\0" + L"\x0001d4e9" L"\0" L"\x0001d4ea" L"\0" L"\x0001d4eb" L"\0" L"\x0001d4ec" + L"\0" L"\x0001d4ed" L"\0" L"\x0001d4ee" L"\0" L"\x0001d4ef" L"\0" + L"\x0001d4f0" L"\0" L"\x0001d4f1" L"\0" L"\x0001d4f2" L"\0" L"\x0001d4f3" + L"\0" L"\x0001d4f4" L"\0" L"\x0001d4f5" L"\0" L"\x0001d4f6" L"\0" + L"\x0001d4f7" L"\0" L"\x0001d4f8" L"\0" L"\x0001d4f9" L"\0" L"\x0001d4fa" + L"\0" L"\x0001d4fb" L"\0" L"\x0001d4fc" L"\0" L"\x0001d4fd" L"\0" + L"\x0001d4fe" L"\0" L"\x0001d4ff" L"\0" L"\x0001d500" L"\0" L"\x0001d501" + L"\0" L"\x0001d502" L"\0" L"\x0001d503" L"\0" L"\x0001d504" L"\0" + L"\x0001d505" L"\0" L"\x0001d507" L"\0" L"\x0001d508" L"\0" L"\x0001d509" + L"\0" L"\x0001d50a" L"\0" L"\x0001d50d" L"\0" L"\x0001d50e" L"\0" + L"\x0001d50f" L"\0" L"\x0001d510" L"\0" L"\x0001d511" L"\0" L"\x0001d512" + L"\0" L"\x0001d513" L"\0" L"\x0001d514" L"\0" L"\x0001d516" L"\0" + L"\x0001d517" L"\0" L"\x0001d518" L"\0" L"\x0001d519" L"\0" L"\x0001d51a" + L"\0" L"\x0001d51b" L"\0" L"\x0001d51c" L"\0" L"\x0001d51e" L"\0" + L"\x0001d51f" L"\0" L"\x0001d520" L"\0" L"\x0001d521" L"\0" L"\x0001d522" + L"\0" L"\x0001d523" L"\0" L"\x0001d524" L"\0" L"\x0001d525" L"\0" + L"\x0001d526" L"\0" L"\x0001d527" L"\0" L"\x0001d528" L"\0" L"\x0001d529" + L"\0" L"\x0001d52a" L"\0" L"\x0001d52b" L"\0" L"\x0001d52c" L"\0" + L"\x0001d52d" L"\0" L"\x0001d52e" L"\0" L"\x0001d52f" L"\0" L"\x0001d530" + L"\0" L"\x0001d531" L"\0" L"\x0001d532" L"\0" L"\x0001d533" L"\0" + L"\x0001d534" L"\0" L"\x0001d535" L"\0" L"\x0001d536" L"\0" L"\x0001d537" + L"\0" L"\x0001d538" L"\0" L"\x0001d539" L"\0" L"\x0001d53b" L"\0" + L"\x0001d53c" L"\0" L"\x0001d53d" L"\0" L"\x0001d53e" L"\0" L"\x0001d540" + L"\0" L"\x0001d541" L"\0" L"\x0001d542" L"\0" L"\x0001d543" L"\0" + L"\x0001d544" L"\0" L"\x0001d546" L"\0" L"\x0001d54a" L"\0" L"\x0001d54b" + L"\0" L"\x0001d54c" L"\0" L"\x0001d54d" L"\0" L"\x0001d54e" L"\0" + L"\x0001d54f" L"\0" L"\x0001d550" L"\0" L"\x0001d552" L"\0" L"\x0001d553" + L"\0" L"\x0001d554" L"\0" L"\x0001d555" L"\0" L"\x0001d556" L"\0" + L"\x0001d557" L"\0" L"\x0001d558" L"\0" L"\x0001d559" L"\0" L"\x0001d55a" + L"\0" L"\x0001d55b" L"\0" L"\x0001d55c" L"\0" L"\x0001d55d" L"\0" + L"\x0001d55e" L"\0" L"\x0001d55f" L"\0" L"\x0001d560" L"\0" L"\x0001d561" + L"\0" L"\x0001d562" L"\0" L"\x0001d563" L"\0" L"\x0001d564" L"\0" + L"\x0001d565" L"\0" L"\x0001d566" L"\0" L"\x0001d567" L"\0" L"\x0001d568" + L"\0" L"\x0001d569" L"\0" L"\x0001d56a" L"\0" L"\x0001d56b" L"\0" + L"\x0001d56c" L"\0" L"\x0001d56d" L"\0" L"\x0001d56e" L"\0" L"\x0001d56f" + L"\0" L"\x0001d570" L"\0" L"\x0001d571" L"\0" L"\x0001d572" L"\0" + L"\x0001d573" L"\0" L"\x0001d574" L"\0" L"\x0001d575" L"\0" L"\x0001d576" + L"\0" L"\x0001d577" L"\0" L"\x0001d578" L"\0" L"\x0001d579" L"\0" + L"\x0001d57a" L"\0" L"\x0001d57b" L"\0" L"\x0001d57c" L"\0" L"\x0001d57d" + L"\0" L"\x0001d57e" L"\0" L"\x0001d57f" L"\0" L"\x0001d580" L"\0" + L"\x0001d581" L"\0" L"\x0001d582" L"\0" L"\x0001d583" L"\0" L"\x0001d584" + L"\0" L"\x0001d585" L"\0" L"\x0001d586" L"\0" L"\x0001d587" L"\0" + L"\x0001d588" L"\0" L"\x0001d589" L"\0" L"\x0001d58a" L"\0" L"\x0001d58b" + L"\0" L"\x0001d58c" L"\0" L"\x0001d58d" L"\0" L"\x0001d58e" L"\0" + L"\x0001d58f" L"\0" L"\x0001d590" L"\0" L"\x0001d591" L"\0" L"\x0001d592" + L"\0" L"\x0001d593" L"\0" L"\x0001d594" L"\0" L"\x0001d595" L"\0" + L"\x0001d596" L"\0" L"\x0001d597" L"\0" L"\x0001d598" L"\0" L"\x0001d599" + L"\0" L"\x0001d59a" L"\0" L"\x0001d59b" L"\0" L"\x0001d59c" L"\0" + L"\x0001d59d" L"\0" L"\x0001d59e" L"\0" L"\x0001d59f" L"\0" L"\x0001d5a0" + L"\0" L"\x0001d5a1" L"\0" L"\x0001d5a2" L"\0" L"\x0001d5a3" L"\0" + L"\x0001d5a4" L"\0" L"\x0001d5a5" L"\0" L"\x0001d5a6" L"\0" L"\x0001d5a7" + L"\0" L"\x0001d5a8" L"\0" L"\x0001d5a9" L"\0" L"\x0001d5aa" L"\0" + L"\x0001d5ab" L"\0" L"\x0001d5ac" L"\0" L"\x0001d5ad" L"\0" L"\x0001d5ae" + L"\0" L"\x0001d5af" L"\0" L"\x0001d5b0" L"\0" L"\x0001d5b1" L"\0" + L"\x0001d5b2" L"\0" L"\x0001d5b3" L"\0" L"\x0001d5b4" L"\0" L"\x0001d5b5" + L"\0" L"\x0001d5b6" L"\0" L"\x0001d5b7" L"\0" L"\x0001d5b8" L"\0" + L"\x0001d5b9" L"\0" L"\x0001d5ba" L"\0" L"\x0001d5bb" L"\0" L"\x0001d5bc" + L"\0" L"\x0001d5bd" L"\0" L"\x0001d5be" L"\0" L"\x0001d5bf" L"\0" + L"\x0001d5c0" L"\0" L"\x0001d5c1" L"\0" L"\x0001d5c2" L"\0" L"\x0001d5c3" + L"\0" L"\x0001d5c4" L"\0" L"\x0001d5c5" L"\0" L"\x0001d5c6" L"\0" + L"\x0001d5c7" L"\0" L"\x0001d5c8" L"\0" L"\x0001d5c9" L"\0" L"\x0001d5ca" + L"\0" L"\x0001d5cb" L"\0" L"\x0001d5cc" L"\0" L"\x0001d5cd" L"\0" + L"\x0001d5ce" L"\0" L"\x0001d5cf" L"\0" L"\x0001d5d0" L"\0" L"\x0001d5d1" + L"\0" L"\x0001d5d2" L"\0" L"\x0001d5d3" L"\0" L"\x0001d5d4" L"\0" + L"\x0001d5d5" L"\0" L"\x0001d5d6" L"\0" L"\x0001d5d7" L"\0" L"\x0001d5d8" + L"\0" L"\x0001d5d9" L"\0" L"\x0001d5da" L"\0" L"\x0001d5db" L"\0" + L"\x0001d5dc" L"\0" L"\x0001d5dd" L"\0" L"\x0001d5de" L"\0" L"\x0001d5df" + L"\0" L"\x0001d5e0" L"\0" L"\x0001d5e1" L"\0" L"\x0001d5e2" L"\0" + L"\x0001d5e3" L"\0" L"\x0001d5e4" L"\0" L"\x0001d5e5" L"\0" L"\x0001d5e6" + L"\0" L"\x0001d5e7" L"\0" L"\x0001d5e8" L"\0" L"\x0001d5e9" L"\0" + L"\x0001d5ea" L"\0" L"\x0001d5eb" L"\0" L"\x0001d5ec" L"\0" L"\x0001d5ed" + L"\0" L"\x0001d5ee" L"\0" L"\x0001d5ef" L"\0" L"\x0001d5f0" L"\0" + L"\x0001d5f1" L"\0" L"\x0001d5f2" L"\0" L"\x0001d5f3" L"\0" L"\x0001d5f4" + L"\0" L"\x0001d5f5" L"\0" L"\x0001d5f6" L"\0" L"\x0001d5f7" L"\0" + L"\x0001d5f8" L"\0" L"\x0001d5f9" L"\0" L"\x0001d5fa" L"\0" L"\x0001d5fb" + L"\0" L"\x0001d5fc" L"\0" L"\x0001d5fd" L"\0" L"\x0001d5fe" L"\0" + L"\x0001d5ff" L"\0" L"\x0001d600" L"\0" L"\x0001d601" L"\0" L"\x0001d602" + L"\0" L"\x0001d603" L"\0" L"\x0001d604" L"\0" L"\x0001d605" L"\0" + L"\x0001d606" L"\0" L"\x0001d607" L"\0" L"\x0001d608" L"\0" L"\x0001d609" + L"\0" L"\x0001d60a" L"\0" L"\x0001d60b" L"\0" L"\x0001d60c" L"\0" + L"\x0001d60d" L"\0" L"\x0001d60e" L"\0" L"\x0001d60f" L"\0" L"\x0001d610" + L"\0" L"\x0001d611" L"\0" L"\x0001d612" L"\0" L"\x0001d613" L"\0" + L"\x0001d614" L"\0" L"\x0001d615" L"\0" L"\x0001d616" L"\0" L"\x0001d617" + L"\0" L"\x0001d618" L"\0" L"\x0001d619" L"\0" L"\x0001d61a" L"\0" + L"\x0001d61b" L"\0" L"\x0001d61c" L"\0" L"\x0001d61d" L"\0" L"\x0001d61e" + L"\0" L"\x0001d61f" L"\0" L"\x0001d620" L"\0" L"\x0001d621" L"\0" + L"\x0001d622" L"\0" L"\x0001d623" L"\0" L"\x0001d624" L"\0" L"\x0001d625" + L"\0" L"\x0001d626" L"\0" L"\x0001d627" L"\0" L"\x0001d628" L"\0" + L"\x0001d629" L"\0" L"\x0001d62a" L"\0" L"\x0001d62b" L"\0" L"\x0001d62c" + L"\0" L"\x0001d62d" L"\0" L"\x0001d62e" L"\0" L"\x0001d62f" L"\0" + L"\x0001d630" L"\0" L"\x0001d631" L"\0" L"\x0001d632" L"\0" L"\x0001d633" + L"\0" L"\x0001d634" L"\0" L"\x0001d635" L"\0" L"\x0001d636" L"\0" + L"\x0001d637" L"\0" L"\x0001d638" L"\0" L"\x0001d639" L"\0" L"\x0001d63a" + L"\0" L"\x0001d63b" L"\0" L"\x0001d63c" L"\0" L"\x0001d63d" L"\0" + L"\x0001d63e" L"\0" L"\x0001d63f" L"\0" L"\x0001d640" L"\0" L"\x0001d641" + L"\0" L"\x0001d642" L"\0" L"\x0001d643" L"\0" L"\x0001d644" L"\0" + L"\x0001d645" L"\0" L"\x0001d646" L"\0" L"\x0001d647" L"\0" L"\x0001d648" + L"\0" L"\x0001d649" L"\0" L"\x0001d64a" L"\0" L"\x0001d64b" L"\0" + L"\x0001d64c" L"\0" L"\x0001d64d" L"\0" L"\x0001d64e" L"\0" L"\x0001d64f" + L"\0" L"\x0001d650" L"\0" L"\x0001d651" L"\0" L"\x0001d652" L"\0" + L"\x0001d653" L"\0" L"\x0001d654" L"\0" L"\x0001d655" L"\0" L"\x0001d656" + L"\0" L"\x0001d657" L"\0" L"\x0001d658" L"\0" L"\x0001d659" L"\0" + L"\x0001d65a" L"\0" L"\x0001d65b" L"\0" L"\x0001d65c" L"\0" L"\x0001d65d" + L"\0" L"\x0001d65e" L"\0" L"\x0001d65f" L"\0" L"\x0001d660" L"\0" + L"\x0001d661" L"\0" L"\x0001d662" L"\0" L"\x0001d663" L"\0" L"\x0001d664" + L"\0" L"\x0001d665" L"\0" L"\x0001d666" L"\0" L"\x0001d667" L"\0" + L"\x0001d668" L"\0" L"\x0001d669" L"\0" L"\x0001d66a" L"\0" L"\x0001d66b" + L"\0" L"\x0001d66c" L"\0" L"\x0001d66d" L"\0" L"\x0001d66e" L"\0" + L"\x0001d66f" L"\0" L"\x0001d670" L"\0" L"\x0001d671" L"\0" L"\x0001d672" + L"\0" L"\x0001d673" L"\0" L"\x0001d674" L"\0" L"\x0001d675" L"\0" + L"\x0001d676" L"\0" L"\x0001d677" L"\0" L"\x0001d678" L"\0" L"\x0001d679" + L"\0" L"\x0001d67a" L"\0" L"\x0001d67b" L"\0" L"\x0001d67c" L"\0" + L"\x0001d67d" L"\0" L"\x0001d67e" L"\0" L"\x0001d67f" L"\0" L"\x0001d680" + L"\0" L"\x0001d681" L"\0" L"\x0001d682" L"\0" L"\x0001d683" L"\0" + L"\x0001d684" L"\0" L"\x0001d685" L"\0" L"\x0001d686" L"\0" L"\x0001d687" + L"\0" L"\x0001d688" L"\0" L"\x0001d689" L"\0" L"\x0001d68a" L"\0" + L"\x0001d68b" L"\0" L"\x0001d68c" L"\0" L"\x0001d68d" L"\0" L"\x0001d68e" + L"\0" L"\x0001d68f" L"\0" L"\x0001d690" L"\0" L"\x0001d691" L"\0" + L"\x0001d692" L"\0" L"\x0001d693" L"\0" L"\x0001d694" L"\0" L"\x0001d695" + L"\0" L"\x0001d696" L"\0" L"\x0001d697" L"\0" L"\x0001d698" L"\0" + L"\x0001d699" L"\0" L"\x0001d69a" L"\0" L"\x0001d69b" L"\0" L"\x0001d69c" + L"\0" L"\x0001d69d" L"\0" L"\x0001d69e" L"\0" L"\x0001d69f" L"\0" + L"\x0001d6a0" L"\0" L"\x0001d6a1" L"\0" L"\x0001d6a2" L"\0" L"\x0001d6a3" + L"\0" L"\x0001d7ce" L"\0" L"\x0001d7cf" L"\0" L"\x0001d7d0" L"\0" + L"\x0001d7d1" L"\0" L"\x0001d7d2" L"\0" L"\x0001d7d3" L"\0" L"\x0001d7d4" + L"\0" L"\x0001d7d5" L"\0" L"\x0001d7d6" L"\0" L"\x0001d7d7" L"\0" + L"\x0001d7d8" L"\0" L"\x0001d7d9" L"\0" L"\x0001d7da" L"\0" L"\x0001d7db" + L"\0" L"\x0001d7dc" L"\0" L"\x0001d7dd" L"\0" L"\x0001d7de" L"\0" + L"\x0001d7df" L"\0" L"\x0001d7e0" L"\0" L"\x0001d7e1" L"\0" L"\x0001d7e2" + L"\0" L"\x0001d7e3" L"\0" L"\x0001d7e4" L"\0" L"\x0001d7e5" L"\0" + L"\x0001d7e6" L"\0" L"\x0001d7e7" L"\0" L"\x0001d7e8" L"\0" L"\x0001d7e9" + L"\0" L"\x0001d7ea" L"\0" L"\x0001d7eb" L"\0" L"\x0001d7ec" L"\0" + L"\x0001d7ed" L"\0" L"\x0001d7ee" L"\0" L"\x0001d7ef" L"\0" L"\x0001d7f0" + L"\0" L"\x0001d7f1" L"\0" L"\x0001d7f2" L"\0" L"\x0001d7f3" L"\0" + L"\x0001d7f4" L"\0" L"\x0001d7f5" L"\0" L"\x0001d7f6" L"\0" L"\x0001d7f7" + L"\0" L"\x0001d7f8" L"\0" L"\x0001d7f9" L"\0" L"\x0001d7fa" L"\0" + L"\x0001d7fb" L"\0" L"\x0001d7fc" L"\0" L"\x0001d7fd" L"\0" L"\x0001d7fe" + L"\0" L"\x0001d7ff"; static const uint32_t translit_to_idx[] = { 0, 3, 8, 12, 15, 20, 23, 26, 30, 37, 44, 51, @@ -471,22 +471,22 @@ static const uint32_t translit_to_idx[] = 180, 183, 186, 189, 192, 196, 199, 202, 205, 208, 211, 214, 217, 221, 224, 227, 230, 233, 237, 242, 245, 248, 252, 257, 260, 263, 267, 270, 274, 278, 282, 285, 287, 289, 291, 293, - 297, 302, 307, 312, 315, 320, 325, 328, 331, 334, 337, 340, - 343, 346, 349, 352, 355, 359, 362, 365, 368, 371, 374, 379, - 385, 388, 393, 396, 399, 402, 405, 408, 411, 414, 417, 420, - 423, 426, 429, 432, 435, 438, 445, 452, 459, 466, 473, 480, - 487, 494, 501, 508, 515, 522, 527, 530, 534, 539, 543, 546, - 550, 555, 561, 565, 568, 572, 577, 580, 583, 586, 589, 592, - 596, 601, 605, 608, 612, 617, 623, 627, 630, 634, 639, 642, - 645, 648, 651, 655, 659, 664, 668, 672, 677, 680, 683, 686, - 689, 692, 695, 698, 702, 706, 710, 714, 719, 724, 729, 734, - 739, 744, 749, 754, 759, 764, 768, 772, 776, 780, 784, 788, - 792, 796, 801, 806, 811, 816, 821, 826, 831, 836, 841, 845, - 850, 855, 859, 863, 867, 871, 875, 880, 883, 887, 892, 897, - 902, 907, 912, 917, 922, 927, 932, 938, 944, 950, 956, 962, - 968, 974, 980, 986, 992, 998, 1003, 1008, 1013, 1018, 1023, 1028, - 1033, 1038, 1043, 1049, 1055, 1061, 1067, 1073, 1079, 1085, 1091, 1097, - 1103, 1109, 1113, 1117, 1121, 1125, 1129, 1133, 1137, 1141, 1145, 1150, + 297, 302, 307, 312, 317, 320, 325, 330, 333, 336, 339, 342, + 345, 348, 351, 354, 357, 360, 364, 367, 370, 373, 376, 379, + 384, 390, 393, 398, 401, 404, 407, 410, 413, 416, 419, 422, + 425, 428, 431, 434, 437, 440, 443, 450, 457, 464, 471, 478, + 485, 492, 499, 506, 513, 520, 527, 532, 535, 539, 544, 548, + 551, 555, 560, 566, 570, 573, 577, 582, 585, 588, 591, 594, + 597, 601, 606, 610, 613, 617, 622, 628, 632, 635, 639, 644, + 647, 650, 653, 656, 660, 664, 669, 673, 677, 682, 685, 688, + 691, 694, 697, 700, 703, 707, 711, 715, 719, 724, 729, 734, + 739, 744, 749, 754, 759, 764, 769, 773, 777, 781, 785, 789, + 793, 797, 801, 806, 811, 816, 821, 826, 831, 836, 841, 846, + 850, 855, 860, 864, 868, 872, 876, 880, 885, 888, 892, 897, + 902, 907, 912, 917, 922, 927, 932, 937, 943, 949, 955, 961, + 967, 973, 979, 985, 991, 997, 1003, 1008, 1013, 1018, 1023, 1028, + 1033, 1038, 1043, 1048, 1054, 1060, 1066, 1072, 1078, 1084, 1090, 1096, + 1102, 1108, 1114, 1118, 1122, 1126, 1130, 1134, 1138, 1142, 1146, 1150, 1155, 1160, 1165, 1170, 1175, 1180, 1185, 1190, 1195, 1200, 1205, 1210, 1215, 1220, 1225, 1230, 1235, 1240, 1245, 1250, 1255, 1260, 1265, 1270, 1275, 1280, 1285, 1290, 1295, 1300, 1305, 1310, 1315, 1320, 1325, 1330, @@ -494,89 +494,89 @@ static const uint32_t translit_to_idx[] = 1395, 1400, 1405, 1410, 1415, 1420, 1425, 1430, 1435, 1440, 1445, 1450, 1455, 1460, 1465, 1470, 1475, 1480, 1485, 1490, 1495, 1500, 1505, 1510, 1515, 1520, 1525, 1530, 1535, 1540, 1545, 1550, 1555, 1560, 1565, 1570, - 1575, 1580, 1585, 1590, 1595, 1598, 1601, 1604, 1607, 1610, 1613, 1616, - 1619, 1622, 1625, 1628, 1631, 1636, 1640, 1645, 1648, 1651, 1657, 1663, - 1669, 1675, 1681, 1687, 1693, 1699, 1705, 1711, 1717, 1723, 1729, 1735, - 1741, 1747, 1753, 1759, 1765, 1771, 1777, 1783, 1789, 1795, 1801, 1807, - 1813, 1819, 1825, 1831, 1836, 1840, 1844, 1849, 1853, 1857, 1861, 1865, - 1869, 1873, 1877, 1881, 1885, 1889, 1894, 1900, 1904, 1908, 1912, 1916, - 1920, 1924, 1928, 1933, 1938, 1943, 1948, 1952, 1956, 1960, 1964, 1968, - 1972, 1976, 1980, 1984, 1988, 1994, 2000, 2005, 2011, 2017, 2023, 2028, - 2034, 2039, 2046, 2050, 2055, 2060, 2065, 2070, 2077, 2086, 2090, 2094, - 2098, 2102, 2106, 2110, 2114, 2118, 2122, 2126, 2130, 2134, 2138, 2142, - 2146, 2150, 2156, 2160, 2164, 2168, 2174, 2179, 2183, 2187, 2191, 2195, - 2199, 2203, 2207, 2211, 2215, 2219, 2224, 2228, 2232, 2237, 2242, 2246, - 2252, 2257, 2261, 2265, 2269, 2273, 2277, 2281, 2285, 2290, 2295, 2299, - 2302, 2304, 2306, 2308, 2310, 2312, 2314, 2316, 2318, 2320, 2322, 2324, - 2326, 2328, 2330, 2332, 2334, 2337, 2340, 2343, 2346, 2349, 2352, 2355, - 2358, 2361, 2364, 2367, 2370, 2373, 2376, 2379, 2382, 2385, 2388, 2391, - 2394, 2397, 2400, 2403, 2406, 2409, 2411, 2414, 2417, 2420, 2423, 2426, - 2429, 2432, 2435, 2438, 2441, 2444, 2447, 2450, 2453, 2456, 2459, 2462, - 2465, 2468, 2471, 2474, 2477, 2480, 2483, 2486, 2489, 2492, 2495, 2498, - 2501, 2504, 2507, 2510, 2513, 2516, 2519, 2522, 2525, 2528, 2531, 2534, - 2537, 2540, 2543, 2546, 2549, 2552, 2555, 2558, 2561, 2564, 2567, 2570, - 2573, 2576, 2579, 2582, 2585, 2588, 2591, 2594, 2597, 2600, 2603, 2606, - 2609, 2612, 2615, 2618, 2621, 2624, 2627, 2630, 2633, 2636, 2639, 2642, - 2645, 2648, 2651, 2654, 2657, 2660, 2663, 2666, 2669, 2672, 2675, 2678, - 2681, 2684, 2687, 2690, 2693, 2696, 2699, 2702, 2705, 2708, 2711, 2714, - 2717, 2720, 2723, 2726, 2729, 2732, 2735, 2738, 2741, 2744, 2747, 2750, - 2753, 2756, 2759, 2762, 2765, 2768, 2771, 2774, 2777, 2780, 2783, 2786, - 2789, 2792, 2795, 2798, 2801, 2804, 2807, 2810, 2813, 2816, 2819, 2822, - 2825, 2828, 2831, 2834, 2837, 2840, 2843, 2846, 2849, 2852, 2855, 2858, - 2861, 2864, 2867, 2870, 2873, 2876, 2879, 2882, 2885, 2888, 2891, 2894, - 2897, 2900, 2903, 2906, 2909, 2912, 2915, 2918, 2921, 2924, 2927, 2930, - 2933, 2936, 2939, 2942, 2945, 2948, 2951, 2954, 2957, 2960, 2963, 2966, - 2969, 2972, 2975, 2978, 2981, 2984, 2987, 2990, 2993, 2996, 2999, 3002, - 3005, 3008, 3011, 3014, 3017, 3020, 3023, 3026, 3029, 3032, 3035, 3038, - 3041, 3044, 3047, 3050, 3053, 3056, 3059, 3062, 3065, 3068, 3071, 3074, - 3077, 3080, 3083, 3086, 3089, 3092, 3095, 3098, 3101, 3104, 3107, 3110, - 3113, 3116, 3119, 3122, 3125, 3128, 3131, 3134, 3137, 3140, 3143, 3146, - 3149, 3152, 3155, 3158, 3161, 3164, 3167, 3170, 3173, 3176, 3179, 3182, - 3185, 3188, 3191, 3194, 3197, 3200, 3203, 3206, 3209, 3212, 3215, 3218, - 3221, 3224, 3227, 3230, 3233, 3236, 3239, 3242, 3245, 3248, 3251, 3254, - 3257, 3260, 3263, 3266, 3269, 3272, 3275, 3278, 3281, 3284, 3287, 3290, - 3293, 3296, 3299, 3302, 3305, 3308, 3311, 3314, 3317, 3320, 3323, 3326, - 3329, 3332, 3335, 3338, 3341, 3344, 3347, 3350, 3353, 3356, 3359, 3362, - 3365, 3368, 3371, 3374, 3377, 3380, 3383, 3386, 3389, 3392, 3395, 3398, - 3401, 3404, 3407, 3410, 3413, 3416, 3419, 3422, 3425, 3428, 3431, 3434, - 3437, 3440, 3443, 3446, 3449, 3452, 3455, 3458, 3461, 3464, 3467, 3470, - 3473, 3476, 3479, 3482, 3485, 3488, 3491, 3494, 3497, 3500, 3503, 3506, - 3509, 3512, 3515, 3518, 3521, 3524, 3527, 3530, 3533, 3536, 3539, 3542, - 3545, 3548, 3551, 3554, 3557, 3560, 3563, 3566, 3569, 3572, 3575, 3578, - 3581, 3584, 3587, 3590, 3593, 3596, 3599, 3602, 3605, 3608, 3611, 3614, - 3617, 3620, 3623, 3626, 3629, 3632, 3635, 3638, 3641, 3644, 3647, 3650, - 3653, 3656, 3659, 3662, 3665, 3668, 3671, 3674, 3677, 3680, 3683, 3686, - 3689, 3692, 3695, 3698, 3701, 3704, 3707, 3710, 3713, 3716, 3719, 3722, - 3725, 3728, 3731, 3734, 3737, 3740, 3743, 3746, 3749, 3752, 3755, 3758, - 3761, 3764, 3767, 3770, 3773, 3776, 3779, 3782, 3785, 3788, 3791, 3794, - 3797, 3800, 3803, 3806, 3809, 3812, 3815, 3818, 3821, 3824, 3827, 3830, - 3833, 3836, 3839, 3842, 3845, 3848, 3851, 3854, 3857, 3860, 3863, 3866, - 3869, 3872, 3875, 3878, 3881, 3884, 3887, 3890, 3893, 3896, 3899, 3902, - 3905, 3908, 3911, 3914, 3917, 3920, 3923, 3926, 3929, 3932, 3935, 3938, - 3941, 3944, 3947, 3950, 3953, 3956, 3959, 3962, 3965, 3968, 3971, 3974, - 3977, 3980, 3983, 3986, 3989, 3992, 3995, 3998, 4001, 4004, 4007, 4010, - 4013, 4016, 4019, 4022, 4025, 4028, 4031, 4034, 4037, 4040, 4043, 4046, - 4049, 4052, 4055, 4058, 4061, 4064, 4067, 4070, 4073, 4076, 4079, 4082, - 4085, 4088, 4091, 4094, 4097, 4100, 4103, 4106, 4109, 4112, 4115, 4118, - 4121, 4124, 4127, 4130, 4133, 4136, 4139, 4142, 4145, 4148, 4151, 4154, - 4157, 4160, 4163, 4166, 4169, 4172, 4175, 4178, 4181, 4184, 4187, 4190, - 4193, 4196, 4199, 4202, 4205, 4208, 4211, 4214, 4217, 4220, 4223, 4226, - 4229, 4232, 4235, 4238, 4241, 4244, 4247, 4250, 4253, 4256, 4259, 4262, - 4265, 4268, 4271, 4274, 4277, 4280, 4283, 4286, 4289, 4292, 4295, 4298, - 4301, 4304, 4307, 4310, 4313, 4316, 4319, 4322, 4325, 4328, 4331, 4334, - 4337, 4340, 4343, 4346, 4349, 4352, 4355, 4358, 4361, 4364, 4367, 4370, - 4373, 4376, 4379, 4382, 4385, 4388, 4391, 4394, 4397, 4400, 4403, 4406, - 4409, 4412, 4415, 4418, 4421, 4424, 4427, 4430, 4433, 4436, 4439, 4442, - 4445, 4448, 4451, 4454, 4457, 4460, 4463, 4466, 4469, 4472, 4475, 4478, - 4481, 4484, 4487, 4490, 4493, 4496, 4499, 4502, 4505, 4508, 4511, 4514, - 4517, 4520, 4523, 4526, 4529, 4532, 4535, 4538, 4541, 4544, 4547, 4550, - 4553, 4556, 4559, 4562, 4565, 4568, 4571, 4574, 4577, 4580, 4583, 4586, - 4589, 4592, 4595, 4598, 4601, 4604, 4607, 4610, 4613, 4616, 4619, 4622, - 4625, 4628, 4631, 4634, 4637, 4640, 4643, 4646, 4649, 4652, 4655, 4658, - 4661, 4664, 4667, 4670, 4673, 4676, 4679, 4682, 4685, 4688, 4691, 4694, - 4697, 4700, 4703, 4706, 4709, 4712, 4715, 4718, 4721, 4724, 4727, 4730, - 4733, 4736, 4739, 4742, 4745, 4748, 4751, 4754, 4757, 4760, 4763, 4766, - 4769, 4772, 4775, 4778, 4781, 4784, 4787, 4790, 4793 + 1575, 1580, 1585, 1590, 1595, 1600, 1603, 1606, 1609, 1612, 1615, 1618, + 1621, 1624, 1627, 1630, 1633, 1636, 1641, 1645, 1650, 1653, 1656, 1662, + 1668, 1674, 1680, 1686, 1692, 1698, 1704, 1710, 1716, 1722, 1728, 1734, + 1740, 1746, 1752, 1758, 1764, 1770, 1776, 1782, 1788, 1794, 1800, 1806, + 1812, 1818, 1824, 1830, 1836, 1841, 1845, 1849, 1854, 1858, 1862, 1866, + 1870, 1874, 1878, 1882, 1886, 1890, 1894, 1899, 1905, 1909, 1913, 1917, + 1921, 1925, 1929, 1933, 1938, 1943, 1948, 1953, 1957, 1961, 1965, 1969, + 1973, 1977, 1981, 1985, 1989, 1993, 1999, 2005, 2010, 2016, 2022, 2028, + 2033, 2039, 2044, 2051, 2055, 2060, 2065, 2070, 2075, 2082, 2091, 2095, + 2099, 2103, 2107, 2111, 2115, 2119, 2123, 2127, 2131, 2135, 2139, 2143, + 2147, 2151, 2155, 2161, 2165, 2169, 2173, 2179, 2184, 2188, 2192, 2196, + 2200, 2204, 2208, 2212, 2216, 2220, 2224, 2229, 2233, 2237, 2242, 2247, + 2251, 2257, 2262, 2266, 2270, 2274, 2278, 2282, 2286, 2290, 2295, 2300, + 2304, 2307, 2309, 2311, 2313, 2315, 2317, 2319, 2321, 2323, 2325, 2327, + 2329, 2331, 2333, 2335, 2337, 2339, 2342, 2345, 2348, 2351, 2354, 2357, + 2360, 2363, 2366, 2369, 2372, 2375, 2378, 2381, 2384, 2387, 2390, 2393, + 2396, 2399, 2402, 2405, 2408, 2411, 2414, 2416, 2419, 2422, 2425, 2428, + 2431, 2434, 2437, 2440, 2443, 2446, 2449, 2452, 2455, 2458, 2461, 2464, + 2467, 2470, 2473, 2476, 2479, 2482, 2485, 2488, 2491, 2494, 2497, 2500, + 2503, 2506, 2509, 2512, 2515, 2518, 2521, 2524, 2527, 2530, 2533, 2536, + 2539, 2542, 2545, 2548, 2551, 2554, 2557, 2560, 2563, 2566, 2569, 2572, + 2575, 2578, 2581, 2584, 2587, 2590, 2593, 2596, 2599, 2602, 2605, 2608, + 2611, 2614, 2617, 2620, 2623, 2626, 2629, 2632, 2635, 2638, 2641, 2644, + 2647, 2650, 2653, 2656, 2659, 2662, 2665, 2668, 2671, 2674, 2677, 2680, + 2683, 2686, 2689, 2692, 2695, 2698, 2701, 2704, 2707, 2710, 2713, 2716, + 2719, 2722, 2725, 2728, 2731, 2734, 2737, 2740, 2743, 2746, 2749, 2752, + 2755, 2758, 2761, 2764, 2767, 2770, 2773, 2776, 2779, 2782, 2785, 2788, + 2791, 2794, 2797, 2800, 2803, 2806, 2809, 2812, 2815, 2818, 2821, 2824, + 2827, 2830, 2833, 2836, 2839, 2842, 2845, 2848, 2851, 2854, 2857, 2860, + 2863, 2866, 2869, 2872, 2875, 2878, 2881, 2884, 2887, 2890, 2893, 2896, + 2899, 2902, 2905, 2908, 2911, 2914, 2917, 2920, 2923, 2926, 2929, 2932, + 2935, 2938, 2941, 2944, 2947, 2950, 2953, 2956, 2959, 2962, 2965, 2968, + 2971, 2974, 2977, 2980, 2983, 2986, 2989, 2992, 2995, 2998, 3001, 3004, + 3007, 3010, 3013, 3016, 3019, 3022, 3025, 3028, 3031, 3034, 3037, 3040, + 3043, 3046, 3049, 3052, 3055, 3058, 3061, 3064, 3067, 3070, 3073, 3076, + 3079, 3082, 3085, 3088, 3091, 3094, 3097, 3100, 3103, 3106, 3109, 3112, + 3115, 3118, 3121, 3124, 3127, 3130, 3133, 3136, 3139, 3142, 3145, 3148, + 3151, 3154, 3157, 3160, 3163, 3166, 3169, 3172, 3175, 3178, 3181, 3184, + 3187, 3190, 3193, 3196, 3199, 3202, 3205, 3208, 3211, 3214, 3217, 3220, + 3223, 3226, 3229, 3232, 3235, 3238, 3241, 3244, 3247, 3250, 3253, 3256, + 3259, 3262, 3265, 3268, 3271, 3274, 3277, 3280, 3283, 3286, 3289, 3292, + 3295, 3298, 3301, 3304, 3307, 3310, 3313, 3316, 3319, 3322, 3325, 3328, + 3331, 3334, 3337, 3340, 3343, 3346, 3349, 3352, 3355, 3358, 3361, 3364, + 3367, 3370, 3373, 3376, 3379, 3382, 3385, 3388, 3391, 3394, 3397, 3400, + 3403, 3406, 3409, 3412, 3415, 3418, 3421, 3424, 3427, 3430, 3433, 3436, + 3439, 3442, 3445, 3448, 3451, 3454, 3457, 3460, 3463, 3466, 3469, 3472, + 3475, 3478, 3481, 3484, 3487, 3490, 3493, 3496, 3499, 3502, 3505, 3508, + 3511, 3514, 3517, 3520, 3523, 3526, 3529, 3532, 3535, 3538, 3541, 3544, + 3547, 3550, 3553, 3556, 3559, 3562, 3565, 3568, 3571, 3574, 3577, 3580, + 3583, 3586, 3589, 3592, 3595, 3598, 3601, 3604, 3607, 3610, 3613, 3616, + 3619, 3622, 3625, 3628, 3631, 3634, 3637, 3640, 3643, 3646, 3649, 3652, + 3655, 3658, 3661, 3664, 3667, 3670, 3673, 3676, 3679, 3682, 3685, 3688, + 3691, 3694, 3697, 3700, 3703, 3706, 3709, 3712, 3715, 3718, 3721, 3724, + 3727, 3730, 3733, 3736, 3739, 3742, 3745, 3748, 3751, 3754, 3757, 3760, + 3763, 3766, 3769, 3772, 3775, 3778, 3781, 3784, 3787, 3790, 3793, 3796, + 3799, 3802, 3805, 3808, 3811, 3814, 3817, 3820, 3823, 3826, 3829, 3832, + 3835, 3838, 3841, 3844, 3847, 3850, 3853, 3856, 3859, 3862, 3865, 3868, + 3871, 3874, 3877, 3880, 3883, 3886, 3889, 3892, 3895, 3898, 3901, 3904, + 3907, 3910, 3913, 3916, 3919, 3922, 3925, 3928, 3931, 3934, 3937, 3940, + 3943, 3946, 3949, 3952, 3955, 3958, 3961, 3964, 3967, 3970, 3973, 3976, + 3979, 3982, 3985, 3988, 3991, 3994, 3997, 4000, 4003, 4006, 4009, 4012, + 4015, 4018, 4021, 4024, 4027, 4030, 4033, 4036, 4039, 4042, 4045, 4048, + 4051, 4054, 4057, 4060, 4063, 4066, 4069, 4072, 4075, 4078, 4081, 4084, + 4087, 4090, 4093, 4096, 4099, 4102, 4105, 4108, 4111, 4114, 4117, 4120, + 4123, 4126, 4129, 4132, 4135, 4138, 4141, 4144, 4147, 4150, 4153, 4156, + 4159, 4162, 4165, 4168, 4171, 4174, 4177, 4180, 4183, 4186, 4189, 4192, + 4195, 4198, 4201, 4204, 4207, 4210, 4213, 4216, 4219, 4222, 4225, 4228, + 4231, 4234, 4237, 4240, 4243, 4246, 4249, 4252, 4255, 4258, 4261, 4264, + 4267, 4270, 4273, 4276, 4279, 4282, 4285, 4288, 4291, 4294, 4297, 4300, + 4303, 4306, 4309, 4312, 4315, 4318, 4321, 4324, 4327, 4330, 4333, 4336, + 4339, 4342, 4345, 4348, 4351, 4354, 4357, 4360, 4363, 4366, 4369, 4372, + 4375, 4378, 4381, 4384, 4387, 4390, 4393, 4396, 4399, 4402, 4405, 4408, + 4411, 4414, 4417, 4420, 4423, 4426, 4429, 4432, 4435, 4438, 4441, 4444, + 4447, 4450, 4453, 4456, 4459, 4462, 4465, 4468, 4471, 4474, 4477, 4480, + 4483, 4486, 4489, 4492, 4495, 4498, 4501, 4504, 4507, 4510, 4513, 4516, + 4519, 4522, 4525, 4528, 4531, 4534, 4537, 4540, 4543, 4546, 4549, 4552, + 4555, 4558, 4561, 4564, 4567, 4570, 4573, 4576, 4579, 4582, 4585, 4588, + 4591, 4594, 4597, 4600, 4603, 4606, 4609, 4612, 4615, 4618, 4621, 4624, + 4627, 4630, 4633, 4636, 4639, 4642, 4645, 4648, 4651, 4654, 4657, 4660, + 4663, 4666, 4669, 4672, 4675, 4678, 4681, 4684, 4687, 4690, 4693, 4696, + 4699, 4702, 4705, 4708, 4711, 4714, 4717, 4720, 4723, 4726, 4729, 4732, + 4735, 4738, 4741, 4744, 4747, 4750, 4753, 4756, 4759, 4762, 4765, 4768, + 4771, 4774, 4777, 4780, 4783, 4786, 4789, 4792, 4795, 4798 }; static const wchar_t translit_to_tbl[] = L" \0" L"\0" L"(C)\0" L"\0" L"<<\0" L"\0" L"-\0" L"\0" L"(R)\0" L"\0" L"u\0" @@ -594,73 +594,73 @@ static const wchar_t translit_to_tbl[] = L"\0" L"..\0" L"\0" L"...\0" L"\0" L" \0" L"\0" L"`\0" L"\0" L"``\0" L"\0" L"```\0" L"\0" L"<\0" L"\0" L">\0" L"\0" L"!!\0" L"\0" L"/\0" L"\0" L"??\0" L"\0" L"?!\0" L"\0" L"!?\0" L"\0" L" \0" L"\0" L"\0" L"\0" L"\0" L"\0" L"\0" - L"\0" L"\0" L"\0" L"Rs\0" L"\0" L"EUR\0" L"\0" L"a/c\0" L"\0" L"a/s\0" L"\0" - L"C\0" L"\0" L"c/o\0" L"\0" L"c/u\0" L"\0" L"g\0" L"\0" L"H\0" L"\0" L"H\0" - L"\0" L"H\0" L"\0" L"h\0" L"\0" L"I\0" L"\0" L"I\0" L"\0" L"L\0" L"\0" - L"l\0" L"\0" L"N\0" L"\0" L"No\0" L"\0" L"P\0" L"\0" L"Q\0" L"\0" L"R\0" - L"\0" L"R\0" L"\0" L"R\0" L"\0" L"TEL\0" L"\0" L"(TM)\0" L"\0" L"Z\0" L"\0" - L"Ohm\0" L"\0" L"Z\0" L"\0" L"B\0" L"\0" L"C\0" L"\0" L"e\0" L"\0" L"e\0" - L"\0" L"E\0" L"\0" L"F\0" L"\0" L"M\0" L"\0" L"o\0" L"\0" L"i\0" L"\0" - L"D\0" L"\0" L"d\0" L"\0" L"e\0" L"\0" L"i\0" L"\0" L"j\0" L"\0" L" 1/3 \0" - L"\0" L" 2/3 \0" L"\0" L" 1/5 \0" L"\0" L" 2/5 \0" L"\0" L" 3/5 \0" L"\0" - L" 4/5 \0" L"\0" L" 1/6 \0" L"\0" L" 5/6 \0" L"\0" L" 1/8 \0" L"\0" - L" 3/8 \0" L"\0" L" 5/8 \0" L"\0" L" 7/8 \0" L"\0" L" 1/\0" L"\0" L"I\0" - L"\0" L"II\0" L"\0" L"III\0" L"\0" L"IV\0" L"\0" L"V\0" L"\0" L"VI\0" L"\0" - L"VII\0" L"\0" L"VIII\0" L"\0" L"IX\0" L"\0" L"X\0" L"\0" L"XI\0" L"\0" - L"XII\0" L"\0" L"L\0" L"\0" L"C\0" L"\0" L"D\0" L"\0" L"M\0" L"\0" L"i\0" - L"\0" L"ii\0" L"\0" L"iii\0" L"\0" L"iv\0" L"\0" L"v\0" L"\0" L"vi\0" L"\0" - L"vii\0" L"\0" L"viii\0" L"\0" L"ix\0" L"\0" L"x\0" L"\0" L"xi\0" L"\0" - L"xii\0" L"\0" L"l\0" L"\0" L"c\0" L"\0" L"d\0" L"\0" L"m\0" L"\0" L"<-\0" - L"\0" L"->\0" L"\0" L"<->\0" L"\0" L"<=\0" L"\0" L"=>\0" L"\0" L"<=>\0" - L"\0" L"-\0" L"\0" L"/\0" L"\0" L"\\\0" L"\0" L"*\0" L"\0" L"|\0" L"\0" - L":\0" L"\0" L"~\0" L"\0" L"<=\0" L"\0" L">=\0" L"\0" L"<<\0" L"\0" L">>\0" - L"\0" L"<<<\0" L"\0" L">>>\0" L"\0" L"NUL\0" L"\0" L"SOH\0" L"\0" L"STX\0" - L"\0" L"ETX\0" L"\0" L"EOT\0" L"\0" L"ENQ\0" L"\0" L"ACK\0" L"\0" L"BEL\0" - L"\0" L"BS\0" L"\0" L"HT\0" L"\0" L"LF\0" L"\0" L"VT\0" L"\0" L"FF\0" L"\0" - L"CR\0" L"\0" L"SO\0" L"\0" L"SI\0" L"\0" L"DLE\0" L"\0" L"DC1\0" L"\0" - L"DC2\0" L"\0" L"DC3\0" L"\0" L"DC4\0" L"\0" L"NAK\0" L"\0" L"SYN\0" L"\0" - L"ETB\0" L"\0" L"CAN\0" L"\0" L"EM\0" L"\0" L"SUB\0" L"\0" L"ESC\0" L"\0" - L"FS\0" L"\0" L"GS\0" L"\0" L"RS\0" L"\0" L"US\0" L"\0" L"SP\0" L"\0" - L"DEL\0" L"\0" L"_\0" L"\0" L"NL\0" L"\0" L"(1)\0" L"\0" L"(2)\0" L"\0" - L"(3)\0" L"\0" L"(4)\0" L"\0" L"(5)\0" L"\0" L"(6)\0" L"\0" L"(7)\0" L"\0" - L"(8)\0" L"\0" L"(9)\0" L"\0" L"(10)\0" L"\0" L"(11)\0" L"\0" L"(12)\0" - L"\0" L"(13)\0" L"\0" L"(14)\0" L"\0" L"(15)\0" L"\0" L"(16)\0" L"\0" - L"(17)\0" L"\0" L"(18)\0" L"\0" L"(19)\0" L"\0" L"(20)\0" L"\0" L"(1)\0" - L"\0" L"(2)\0" L"\0" L"(3)\0" L"\0" L"(4)\0" L"\0" L"(5)\0" L"\0" L"(6)\0" - L"\0" L"(7)\0" L"\0" L"(8)\0" L"\0" L"(9)\0" L"\0" L"(10)\0" L"\0" L"(11)\0" - L"\0" L"(12)\0" L"\0" L"(13)\0" L"\0" L"(14)\0" L"\0" L"(15)\0" L"\0" - L"(16)\0" L"\0" L"(17)\0" L"\0" L"(18)\0" L"\0" L"(19)\0" L"\0" L"(20)\0" - L"\0" L"1.\0" L"\0" L"2.\0" L"\0" L"3.\0" L"\0" L"4.\0" L"\0" L"5.\0" L"\0" - L"6.\0" L"\0" L"7.\0" L"\0" L"8.\0" L"\0" L"9.\0" L"\0" L"10.\0" L"\0" - L"11.\0" L"\0" L"12.\0" L"\0" L"13.\0" L"\0" L"14.\0" L"\0" L"15.\0" L"\0" - L"16.\0" L"\0" L"17.\0" L"\0" L"18.\0" L"\0" L"19.\0" L"\0" L"20.\0" L"\0" - L"(a)\0" L"\0" L"(b)\0" L"\0" L"(c)\0" L"\0" L"(d)\0" L"\0" L"(e)\0" L"\0" - L"(f)\0" L"\0" L"(g)\0" L"\0" L"(h)\0" L"\0" L"(i)\0" L"\0" L"(j)\0" L"\0" - L"(k)\0" L"\0" L"(l)\0" L"\0" L"(m)\0" L"\0" L"(n)\0" L"\0" L"(o)\0" L"\0" - L"(p)\0" L"\0" L"(q)\0" L"\0" L"(r)\0" L"\0" L"(s)\0" L"\0" L"(t)\0" L"\0" - L"(u)\0" L"\0" L"(v)\0" L"\0" L"(w)\0" L"\0" L"(x)\0" L"\0" L"(y)\0" L"\0" - L"(z)\0" L"\0" L"(A)\0" L"\0" L"(B)\0" L"\0" L"(C)\0" L"\0" L"(D)\0" L"\0" - L"(E)\0" L"\0" L"(F)\0" L"\0" L"(G)\0" L"\0" L"(H)\0" L"\0" L"(I)\0" L"\0" - L"(J)\0" L"\0" L"(K)\0" L"\0" L"(L)\0" L"\0" L"(M)\0" L"\0" L"(N)\0" L"\0" - L"(O)\0" L"\0" L"(P)\0" L"\0" L"(Q)\0" L"\0" L"(R)\0" L"\0" L"(S)\0" L"\0" - L"(T)\0" L"\0" L"(U)\0" L"\0" L"(V)\0" L"\0" L"(W)\0" L"\0" L"(X)\0" L"\0" - L"(Y)\0" L"\0" L"(Z)\0" L"\0" L"(a)\0" L"\0" L"(b)\0" L"\0" L"(c)\0" L"\0" - L"(d)\0" L"\0" L"(e)\0" L"\0" L"(f)\0" L"\0" L"(g)\0" L"\0" L"(h)\0" L"\0" - L"(i)\0" L"\0" L"(j)\0" L"\0" L"(k)\0" L"\0" L"(l)\0" L"\0" L"(m)\0" L"\0" - L"(n)\0" L"\0" L"(o)\0" L"\0" L"(p)\0" L"\0" L"(q)\0" L"\0" L"(r)\0" L"\0" - L"(s)\0" L"\0" L"(t)\0" L"\0" L"(u)\0" L"\0" L"(v)\0" L"\0" L"(w)\0" L"\0" - L"(x)\0" L"\0" L"(y)\0" L"\0" L"(z)\0" L"\0" L"(0)\0" L"\0" L"-\0" L"\0" - L"|\0" L"\0" L"+\0" L"\0" L"+\0" L"\0" L"+\0" L"\0" L"+\0" L"\0" L"+\0" - L"\0" L"+\0" L"\0" L"+\0" L"\0" L"+\0" L"\0" L"+\0" L"\0" L"o\0" L"\0" - L"::=\0" L"\0" L"==\0" L"\0" L"===\0" L"\0" L" \0" L"\0" L"=\0" L"\0" - L"(21)\0" L"\0" L"(22)\0" L"\0" L"(23)\0" L"\0" L"(24)\0" L"\0" L"(25)\0" - L"\0" L"(26)\0" L"\0" L"(27)\0" L"\0" L"(28)\0" L"\0" L"(29)\0" L"\0" - L"(30)\0" L"\0" L"(31)\0" L"\0" L"(32)\0" L"\0" L"(33)\0" L"\0" L"(34)\0" - L"\0" L"(35)\0" L"\0" L"(36)\0" L"\0" L"(37)\0" L"\0" L"(38)\0" L"\0" - L"(39)\0" L"\0" L"(40)\0" L"\0" L"(41)\0" L"\0" L"(42)\0" L"\0" L"(43)\0" - L"\0" L"(44)\0" L"\0" L"(45)\0" L"\0" L"(46)\0" L"\0" L"(47)\0" L"\0" - L"(48)\0" L"\0" L"(49)\0" L"\0" L"(50)\0" L"\0" L"hPa\0" L"\0" L"da\0" L"\0" - L"AU\0" L"\0" L"bar\0" L"\0" L"oV\0" L"\0" L"pc\0" L"\0" L"pA\0" L"\0" + L"\0" L"\0" L"\0" L"Rs\0" L"\0" L"EUR\0" L"\0" L"INR\0" L"\0" L"a/c\0" L"\0" + L"a/s\0" L"\0" L"C\0" L"\0" L"c/o\0" L"\0" L"c/u\0" L"\0" L"g\0" L"\0" + L"H\0" L"\0" L"H\0" L"\0" L"H\0" L"\0" L"h\0" L"\0" L"I\0" L"\0" L"I\0" + L"\0" L"L\0" L"\0" L"l\0" L"\0" L"N\0" L"\0" L"No\0" L"\0" L"P\0" L"\0" + L"Q\0" L"\0" L"R\0" L"\0" L"R\0" L"\0" L"R\0" L"\0" L"TEL\0" L"\0" L"(TM)\0" + L"\0" L"Z\0" L"\0" L"Ohm\0" L"\0" L"Z\0" L"\0" L"B\0" L"\0" L"C\0" L"\0" + L"e\0" L"\0" L"e\0" L"\0" L"E\0" L"\0" L"F\0" L"\0" L"M\0" L"\0" L"o\0" + L"\0" L"i\0" L"\0" L"D\0" L"\0" L"d\0" L"\0" L"e\0" L"\0" L"i\0" L"\0" + L"j\0" L"\0" L" 1/3 \0" L"\0" L" 2/3 \0" L"\0" L" 1/5 \0" L"\0" L" 2/5 \0" + L"\0" L" 3/5 \0" L"\0" L" 4/5 \0" L"\0" L" 1/6 \0" L"\0" L" 5/6 \0" L"\0" + L" 1/8 \0" L"\0" L" 3/8 \0" L"\0" L" 5/8 \0" L"\0" L" 7/8 \0" L"\0" L" 1/\0" + L"\0" L"I\0" L"\0" L"II\0" L"\0" L"III\0" L"\0" L"IV\0" L"\0" L"V\0" L"\0" + L"VI\0" L"\0" L"VII\0" L"\0" L"VIII\0" L"\0" L"IX\0" L"\0" L"X\0" L"\0" + L"XI\0" L"\0" L"XII\0" L"\0" L"L\0" L"\0" L"C\0" L"\0" L"D\0" L"\0" L"M\0" + L"\0" L"i\0" L"\0" L"ii\0" L"\0" L"iii\0" L"\0" L"iv\0" L"\0" L"v\0" L"\0" + L"vi\0" L"\0" L"vii\0" L"\0" L"viii\0" L"\0" L"ix\0" L"\0" L"x\0" L"\0" + L"xi\0" L"\0" L"xii\0" L"\0" L"l\0" L"\0" L"c\0" L"\0" L"d\0" L"\0" L"m\0" + L"\0" L"<-\0" L"\0" L"->\0" L"\0" L"<->\0" L"\0" L"<=\0" L"\0" L"=>\0" L"\0" + L"<=>\0" L"\0" L"-\0" L"\0" L"/\0" L"\0" L"\\\0" L"\0" L"*\0" L"\0" L"|\0" + L"\0" L":\0" L"\0" L"~\0" L"\0" L"<=\0" L"\0" L">=\0" L"\0" L"<<\0" L"\0" + L">>\0" L"\0" L"<<<\0" L"\0" L">>>\0" L"\0" L"NUL\0" L"\0" L"SOH\0" L"\0" + L"STX\0" L"\0" L"ETX\0" L"\0" L"EOT\0" L"\0" L"ENQ\0" L"\0" L"ACK\0" L"\0" + L"BEL\0" L"\0" L"BS\0" L"\0" L"HT\0" L"\0" L"LF\0" L"\0" L"VT\0" L"\0" + L"FF\0" L"\0" L"CR\0" L"\0" L"SO\0" L"\0" L"SI\0" L"\0" L"DLE\0" L"\0" + L"DC1\0" L"\0" L"DC2\0" L"\0" L"DC3\0" L"\0" L"DC4\0" L"\0" L"NAK\0" L"\0" + L"SYN\0" L"\0" L"ETB\0" L"\0" L"CAN\0" L"\0" L"EM\0" L"\0" L"SUB\0" L"\0" + L"ESC\0" L"\0" L"FS\0" L"\0" L"GS\0" L"\0" L"RS\0" L"\0" L"US\0" L"\0" + L"SP\0" L"\0" L"DEL\0" L"\0" L"_\0" L"\0" L"NL\0" L"\0" L"(1)\0" L"\0" + L"(2)\0" L"\0" L"(3)\0" L"\0" L"(4)\0" L"\0" L"(5)\0" L"\0" L"(6)\0" L"\0" + L"(7)\0" L"\0" L"(8)\0" L"\0" L"(9)\0" L"\0" L"(10)\0" L"\0" L"(11)\0" L"\0" + L"(12)\0" L"\0" L"(13)\0" L"\0" L"(14)\0" L"\0" L"(15)\0" L"\0" L"(16)\0" + L"\0" L"(17)\0" L"\0" L"(18)\0" L"\0" L"(19)\0" L"\0" L"(20)\0" L"\0" + L"(1)\0" L"\0" L"(2)\0" L"\0" L"(3)\0" L"\0" L"(4)\0" L"\0" L"(5)\0" L"\0" + L"(6)\0" L"\0" L"(7)\0" L"\0" L"(8)\0" L"\0" L"(9)\0" L"\0" L"(10)\0" L"\0" + L"(11)\0" L"\0" L"(12)\0" L"\0" L"(13)\0" L"\0" L"(14)\0" L"\0" L"(15)\0" + L"\0" L"(16)\0" L"\0" L"(17)\0" L"\0" L"(18)\0" L"\0" L"(19)\0" L"\0" + L"(20)\0" L"\0" L"1.\0" L"\0" L"2.\0" L"\0" L"3.\0" L"\0" L"4.\0" L"\0" + L"5.\0" L"\0" L"6.\0" L"\0" L"7.\0" L"\0" L"8.\0" L"\0" L"9.\0" L"\0" + L"10.\0" L"\0" L"11.\0" L"\0" L"12.\0" L"\0" L"13.\0" L"\0" L"14.\0" L"\0" + L"15.\0" L"\0" L"16.\0" L"\0" L"17.\0" L"\0" L"18.\0" L"\0" L"19.\0" L"\0" + L"20.\0" L"\0" L"(a)\0" L"\0" L"(b)\0" L"\0" L"(c)\0" L"\0" L"(d)\0" L"\0" + L"(e)\0" L"\0" L"(f)\0" L"\0" L"(g)\0" L"\0" L"(h)\0" L"\0" L"(i)\0" L"\0" + L"(j)\0" L"\0" L"(k)\0" L"\0" L"(l)\0" L"\0" L"(m)\0" L"\0" L"(n)\0" L"\0" + L"(o)\0" L"\0" L"(p)\0" L"\0" L"(q)\0" L"\0" L"(r)\0" L"\0" L"(s)\0" L"\0" + L"(t)\0" L"\0" L"(u)\0" L"\0" L"(v)\0" L"\0" L"(w)\0" L"\0" L"(x)\0" L"\0" + L"(y)\0" L"\0" L"(z)\0" L"\0" L"(A)\0" L"\0" L"(B)\0" L"\0" L"(C)\0" L"\0" + L"(D)\0" L"\0" L"(E)\0" L"\0" L"(F)\0" L"\0" L"(G)\0" L"\0" L"(H)\0" L"\0" + L"(I)\0" L"\0" L"(J)\0" L"\0" L"(K)\0" L"\0" L"(L)\0" L"\0" L"(M)\0" L"\0" + L"(N)\0" L"\0" L"(O)\0" L"\0" L"(P)\0" L"\0" L"(Q)\0" L"\0" L"(R)\0" L"\0" + L"(S)\0" L"\0" L"(T)\0" L"\0" L"(U)\0" L"\0" L"(V)\0" L"\0" L"(W)\0" L"\0" + L"(X)\0" L"\0" L"(Y)\0" L"\0" L"(Z)\0" L"\0" L"(a)\0" L"\0" L"(b)\0" L"\0" + L"(c)\0" L"\0" L"(d)\0" L"\0" L"(e)\0" L"\0" L"(f)\0" L"\0" L"(g)\0" L"\0" + L"(h)\0" L"\0" L"(i)\0" L"\0" L"(j)\0" L"\0" L"(k)\0" L"\0" L"(l)\0" L"\0" + L"(m)\0" L"\0" L"(n)\0" L"\0" L"(o)\0" L"\0" L"(p)\0" L"\0" L"(q)\0" L"\0" + L"(r)\0" L"\0" L"(s)\0" L"\0" L"(t)\0" L"\0" L"(u)\0" L"\0" L"(v)\0" L"\0" + L"(w)\0" L"\0" L"(x)\0" L"\0" L"(y)\0" L"\0" L"(z)\0" L"\0" L"(0)\0" L"\0" + L"-\0" L"\0" L"|\0" L"\0" L"+\0" L"\0" L"+\0" L"\0" L"+\0" L"\0" L"+\0" + L"\0" L"+\0" L"\0" L"+\0" L"\0" L"+\0" L"\0" L"+\0" L"\0" L"+\0" L"\0" + L"o\0" L"\0" L"::=\0" L"\0" L"==\0" L"\0" L"===\0" L"\0" L" \0" L"\0" L"=\0" + L"\0" L"(21)\0" L"\0" L"(22)\0" L"\0" L"(23)\0" L"\0" L"(24)\0" L"\0" + L"(25)\0" L"\0" L"(26)\0" L"\0" L"(27)\0" L"\0" L"(28)\0" L"\0" L"(29)\0" + L"\0" L"(30)\0" L"\0" L"(31)\0" L"\0" L"(32)\0" L"\0" L"(33)\0" L"\0" + L"(34)\0" L"\0" L"(35)\0" L"\0" L"(36)\0" L"\0" L"(37)\0" L"\0" L"(38)\0" + L"\0" L"(39)\0" L"\0" L"(40)\0" L"\0" L"(41)\0" L"\0" L"(42)\0" L"\0" + L"(43)\0" L"\0" L"(44)\0" L"\0" L"(45)\0" L"\0" L"(46)\0" L"\0" L"(47)\0" + L"\0" L"(48)\0" L"\0" L"(49)\0" L"\0" L"(50)\0" L"\0" L"hPa\0" L"\0" L"da\0" + L"\0" L"AU\0" L"\0" L"bar\0" L"\0" L"oV\0" L"\0" L"pc\0" L"\0" L"pA\0" L"\0" L"nA\0" L"\0" L"uA\0" L"\0" L"mA\0" L"\0" L"kA\0" L"\0" L"KB\0" L"\0" L"MB\0" L"\0" L"GB\0" L"\0" L"cal\0" L"\0" L"kcal\0" L"\0" L"pF\0" L"\0" L"nF\0" L"\0" L"uF\0" L"\0" L"ug\0" L"\0" L"mg\0" L"\0" L"kg\0" L"\0" diff --git a/locale/C-translit.h.in b/locale/C-translit.h.in index ab0b130..8efca2e 100644 --- a/locale/C-translit.h.in +++ b/locale/C-translit.h.in @@ -103,8 +103,10 @@ "\x2061" "" /* FUNCTION APPLICATION */ "\x2062" "" /* INVISIBLE TIMES */ "\x2063" "" /* INVISIBLE SEPARATOR */ +"\x20a1" "CRC" /* COLON SIGN */ "\x20a8" "Rs" /* RUPEE SIGN */ "\x20ac" "EUR" /* EURO SIGN */ +"\x20b9" "INR" /* INDIAN RUPEE SIGN */ "\x2100" "a/c" /* ACCOUNT OF */ "\x2101" "a/s" /* ADDRESSED TO THE SUBJECT */ "\x2102" "C" /* DOUBLE-STRUCK CAPITAL C */ diff --git a/locale/findlocale.c b/locale/findlocale.c index 6b88c96..9951b61 100644 --- a/locale/findlocale.c +++ b/locale/findlocale.c @@ -18,6 +18,7 @@ 02111-1307 USA. */ #include +#include #include #include #include @@ -58,6 +59,45 @@ struct loaded_l10nfile *_nl_locale_file_list[__LC_LAST]; const char _nl_default_locale_path[] attribute_hidden = LOCALEDIR; +/* Checks if the name is actually present, that is, not NULL and not + empty. */ +static inline int +name_present (const char *name) +{ + return name != NULL && name[0] != '\0'; +} + +/* Checks that the locale name neither extremely long, nor contains a + ".." path component (to prevent directory traversal). */ +static inline int +valid_locale_name (const char *name) +{ + /* Not set. */ + size_t namelen = strlen (name); + /* Name too long. The limit is arbitrary and prevents stack overflow + issues later. */ + if (__glibc_unlikely (namelen > 255)) + return 0; + /* Directory traversal attempt. */ + static const char slashdot[4] = {'/', '.', '.', '/'}; + if (__glibc_unlikely (memmem (name, namelen, + slashdot, sizeof (slashdot)) != NULL)) + return 0; + if (namelen == 2 && __glibc_unlikely (name[0] == '.' && name [1] == '.')) + return 0; + if (namelen >= 3 + && __glibc_unlikely (((name[0] == '.' + && name[1] == '.' + && name[2] == '/') + || (name[namelen - 3] == '/' + && name[namelen - 2] == '.' + && name[namelen - 1] == '.')))) + return 0; + /* If there is a slash in the name, it must start with one. */ + if (__glibc_unlikely (memchr (name, '/', namelen) != NULL) && name[0] != '/') + return 0; + return 1; +} struct __locale_data * internal_function @@ -66,7 +106,7 @@ _nl_find_locale (const char *locale_path, size_t locale_path_len, { int mask; /* Name of the locale for this category. */ - char *loc_name; + char *loc_name = (char *) *name; const char *language; const char *modifier; const char *territory; @@ -74,31 +114,39 @@ _nl_find_locale (const char *locale_path, size_t locale_path_len, const char *normalized_codeset; struct loaded_l10nfile *locale_file; - if ((*name)[0] == '\0') + if (loc_name[0] == '\0') { /* The user decides which locale to use by setting environment variables. */ - *name = getenv ("LC_ALL"); - if (*name == NULL || (*name)[0] == '\0') - *name = getenv (_nl_category_names.str + loc_name = getenv ("LC_ALL"); + if (!name_present (loc_name)) + loc_name = getenv (_nl_category_names.str + _nl_category_name_idxs[category]); - if (*name == NULL || (*name)[0] == '\0') - *name = getenv ("LANG"); + if (!name_present (loc_name)) + loc_name = getenv ("LANG"); + if (!name_present (loc_name)) + loc_name = (char *) _nl_C_name; } - if (*name == NULL || (*name)[0] == '\0' - || (__builtin_expect (__libc_enable_secure, 0) - && strchr (*name, '/') != NULL)) - *name = (char *) _nl_C_name; + /* We used to fall back to the C locale if the name contains a slash + character '/', but we now check for directory traversal in + valid_locale_name, so this is no longer necessary. */ - if (__builtin_expect (strcmp (*name, _nl_C_name), 1) == 0 - || __builtin_expect (strcmp (*name, _nl_POSIX_name), 1) == 0) + if (__builtin_expect (strcmp (loc_name, _nl_C_name), 1) == 0 + || __builtin_expect (strcmp (loc_name, _nl_POSIX_name), 1) == 0) { /* We need not load anything. The needed data is contained in the library itself. */ *name = (char *) _nl_C_name; return _nl_C[category]; } + else if (!valid_locale_name (loc_name)) + { + __set_errno (EINVAL); + return NULL; + } + + *name = loc_name; /* We really have to load some data. First we try the archive, but only if there was no LOCPATH environment variable specified. */ diff --git a/locale/loadarchive.c b/locale/loadarchive.c index 663202e..0c708c2 100644 --- a/locale/loadarchive.c +++ b/locale/loadarchive.c @@ -274,6 +274,10 @@ _nl_load_locale_from_archive (int category, const char **namep) namehashtab = (struct namehashent *) ((char *) head + head->namehash_offset); + /* Avoid division by 0 if the file is corrupted. */ + if (__glibc_unlikely (head->namehash_size == 0)) + goto close_and_out; + idx = hval % head->namehash_size; incr = 1 + hval % (head->namehash_size - 2); diff --git a/locale/nl_langinfo_l.c b/locale/nl_langinfo_l.c index 573fed0..7467c7e 100644 --- a/locale/nl_langinfo_l.c +++ b/locale/nl_langinfo_l.c @@ -21,6 +21,7 @@ #include #include #include +#include #include "localeinfo.h" @@ -44,7 +45,21 @@ __nl_langinfo_l (item, l) if (index == _NL_ITEM_INDEX (_NL_LOCALE_NAME (category))) return (char *) l->__names[category]; +#if defined NL_CURRENT_INDIRECT + /* Make direct reference to every _nl_current_CATEGORY symbol, + since we know only at runtime which categories are used. */ + switch (category) + { +# define DEFINE_CATEGORY(category, category_name, items, a) \ + case category: data = *_nl_current_##category; break; +# include "categories.def" +# undef DEFINE_CATEGORY + default: /* Should be impossible. */ + abort(); + } +#else data = l->__locales[category]; +#endif if (index >= data->nstrings) /* Bogus index for this category: bogus item. */ diff --git a/locale/programs/3level.h b/locale/programs/3level.h index d2a7fd0..15ba3cc 100644 --- a/locale/programs/3level.h +++ b/locale/programs/3level.h @@ -201,6 +201,42 @@ CONCAT(TABLE,_iterate) (struct TABLE *t, } } } + +/* GCC ATM seems to do a poor job with pointers to nested functions passed + to inlined functions. Help it a little bit with this hack. */ +#define wchead_table_iterate(tp, fn) \ +do \ + { \ + struct wchead_table *t = (tp); \ + uint32_t index1; \ + for (index1 = 0; index1 < t->level1_size; index1++) \ + { \ + uint32_t lookup1 = t->level1[index1]; \ + if (lookup1 != ((uint32_t) ~0)) \ + { \ + uint32_t lookup1_shifted = lookup1 << t->q; \ + uint32_t index2; \ + for (index2 = 0; index2 < (1 << t->q); index2++) \ + { \ + uint32_t lookup2 = t->level2[index2 + lookup1_shifted]; \ + if (lookup2 != ((uint32_t) ~0)) \ + { \ + uint32_t lookup2_shifted = lookup2 << t->p; \ + uint32_t index3; \ + for (index3 = 0; index3 < (1 << t->p); index3++) \ + { \ + struct element_t *lookup3 \ + = t->level3[index3 + lookup2_shifted]; \ + if (lookup3 != NULL) \ + fn ((((index1 << t->q) + index2) << t->p) + index3, \ + lookup3); \ + } \ + } \ + } \ + } \ + } \ + } while (0) + #endif #ifndef NO_FINALIZE diff --git a/locale/programs/ld-collate.c b/locale/programs/ld-collate.c index e60f25a..d24e95b 100644 --- a/locale/programs/ld-collate.c +++ b/locale/programs/ld-collate.c @@ -164,6 +164,24 @@ struct symbol_t size_t line; }; +/* Data type for toggles. */ +struct toggle_list_t; + +struct toggle_list_t +{ + const char *name; + + /* Predecessor in the list. */ + struct toggle_list_t *last; + + /* This flag is set when a keyword is undefined. */ + int is_undefined; + + /* Where does the branch come from. */ + const char *file; + size_t line; +}; + /* Sparse table of struct element_t *. */ #define TABLE wchead_table #define ELEMENT struct element_t * @@ -185,14 +203,6 @@ struct symbol_t #include "3level.h" -/* Simple name list for the preprocessor. */ -struct name_list -{ - struct name_list *next; - char str[0]; -}; - - /* The real definition of the struct for the LC_COLLATE locale. */ struct locale_collate_t { @@ -227,6 +237,9 @@ struct locale_collate_t /* This value is used when handling ellipsis. */ struct element_t ellipsis_weight; + /* This is a stack of . */ + struct toggle_list_t *flow_control; + /* Known collating elements. */ hash_table elem_table; @@ -254,15 +267,6 @@ struct locale_collate_t /* The arrays with the collation sequence order. */ unsigned char mbseqorder[256]; struct collseq_table wcseqorder; - - /* State of the preprocessor. */ - enum - { - else_none = 0, - else_ignore, - else_seen - } - else_action; }; @@ -270,9 +274,6 @@ struct locale_collate_t LC_COLLATE category descriptions in all files. */ static uint32_t nrules; -/* List of defined preprocessor symbols. */ -static struct name_list *defined; - /* We need UTF-8 encoding of numbers. */ static inline int @@ -1487,6 +1488,56 @@ order for `%.*s' already defined at %s:%Zu"), } +static struct token * +flow_skip (struct linereader *ldfile, const struct charmap_t *charmap, + struct locale_collate_t *collate) +{ + int level = 0; + struct token *now; + enum token_t nowtok; + while (1) + { + lr_ignore_rest (ldfile, 0); + now = lr_token (ldfile, charmap, NULL, NULL, 0); + nowtok = now->tok; + if (nowtok == tok_eof) + break; + else if (nowtok == tok_ifdef || nowtok == tok_ifndef) + ++level ; + else if (nowtok == tok_else) + { + if (strcmp (collate->flow_control->name, "else") == 0) + lr_error (ldfile, + _("%s: `else' statement at `%s:%Zu' cannot be followed by another `else' statement"), + "LC_COLLATE", collate->flow_control->name, collate->flow_control->line); + if (level == 0) + { + collate->flow_control->name = "else"; + collate->flow_control->file = ldfile->fname; + collate->flow_control->line = ldfile->lineno; + break; + } + } + else if (nowtok == tok_endif) + { + if (level == 0) + { + collate->flow_control = collate->flow_control->last; + break; + } + --level ; + } + } + if (nowtok == tok_eof) + WITH_CUR_LOCALE (error (0, 0, _("\ +%s: unterminated `%s' flow control beginning at %s:%Zu"), + "LC_COLLATE", collate->flow_control->name, + collate->flow_control->file, + collate->flow_control->line)); + return now; +} + + static void collate_startup (struct linereader *ldfile, struct localedef_t *locale, struct localedef_t *copy_locale, int ignore_content) @@ -1555,6 +1606,7 @@ collate_finish (struct localedef_t *locale, const struct charmap_t *charmap) int i; int need_undefined = 0; struct section_list *sect; + enum coll_sort_rule *orules; int ruleidx; int nr_wide_elems = 0; @@ -1566,18 +1618,28 @@ collate_finish (struct localedef_t *locale, const struct charmap_t *charmap) "LC_COLLATE")); return; } + if (nrules == 0) + { + /* An error message has already been printed: + empty category description not allowed. */ + return; + } /* If this assertion is hit change the type in `element_t'. */ assert (nrules <= sizeof (runp->used_in_level) * 8); /* Make sure that the `position' rule is used either in all sections or in none. */ + sect = collate->sections; + while (sect != NULL && sect->rules == NULL) + sect = sect->next; + orules = sect->rules; for (i = 0; i < nrules; ++i) for (sect = collate->sections; sect != NULL; sect = sect->next) if (sect != collate->current_section && sect->rules != NULL && ((sect->rules[i] & sort_position) - != (collate->current_section->rules[i] & sort_position))) + != (orules[i] & sort_position))) { WITH_CUR_LOCALE (error (0, 0, _("\ %s: `position' must be used for a specific level in all sections or none"), @@ -2500,46 +2562,6 @@ collate_output (struct localedef_t *locale, const struct charmap_t *charmap, } -static enum token_t -skip_to (struct linereader *ldfile, struct locale_collate_t *collate, - const struct charmap_t *charmap, int to_endif) -{ - while (1) - { - struct token *now = lr_token (ldfile, charmap, NULL, NULL, 0); - enum token_t nowtok = now->tok; - - if (nowtok == tok_eof || nowtok == tok_end) - return nowtok; - - if (nowtok == tok_ifdef || nowtok == tok_ifndef) - { - lr_error (ldfile, _("%s: nested conditionals not supported"), - "LC_COLLATE"); - nowtok = skip_to (ldfile, collate, charmap, tok_endif); - if (nowtok == tok_eof || nowtok == tok_end) - return nowtok; - } - else if (nowtok == tok_endif || (!to_endif && nowtok == tok_else)) - { - lr_ignore_rest (ldfile, 1); - return nowtok; - } - else if (!to_endif && (nowtok == tok_elifdef || nowtok == tok_elifndef)) - { - /* Do not read the rest of the line. */ - return nowtok; - } - else if (nowtok == tok_else) - { - lr_error (ldfile, _("%s: more then one 'else'"), "LC_COLLATE"); - } - - lr_ignore_rest (ldfile, 0); - } -} - - void collate_read (struct linereader *ldfile, struct localedef_t *result, const struct charmap_t *charmap, const char *repertoire_name, @@ -2563,6 +2585,8 @@ collate_read (struct linereader *ldfile, struct localedef_t *result, */ int state = 0; + static struct toggle_list_t *defined_keywords = NULL; + /* Get the repertoire we have to use. */ if (repertoire_name != NULL) repertoire = repertoire_read (repertoire_name); @@ -2570,8 +2594,6 @@ collate_read (struct linereader *ldfile, struct localedef_t *result, /* The rest of the line containing `LC_COLLATE' must be free. */ lr_ignore_rest (ldfile, 1); - while (1) - { do { now = lr_token (ldfile, charmap, result, NULL, verbose); @@ -2579,29 +2601,80 @@ collate_read (struct linereader *ldfile, struct localedef_t *result, } while (nowtok == tok_eol); - if (nowtok != tok_define) - break; - + while (nowtok == tok_define || nowtok == tok_undef) + { + /* Ignore the rest of the line if we don't need the input of + this line. */ if (ignore_content) - lr_ignore_rest (ldfile, 0); - else - { - arg = lr_token (ldfile, charmap, result, NULL, verbose); - if (arg->tok != tok_ident) - SYNTAX_ERROR (_("%s: syntax error"), "LC_COLLATE"); + { + lr_ignore_rest (ldfile, 0); + now = lr_token (ldfile, charmap, result, NULL, verbose); + nowtok = now->tok; + continue; + } + + arg = lr_token (ldfile, charmap, result, NULL, verbose); + if (arg->tok != tok_ident) + goto err_label; + + if (nowtok == tok_define) + { + struct toggle_list_t *runp = defined_keywords; + char *name; + + while (runp != NULL) + if (strncmp (runp->name, arg->val.str.startmb, + arg->val.str.lenmb) == 0 + && runp->name[arg->val.str.lenmb] == '\0') + SYNTAX_ERROR (_("%s: syntax error"), "LC_COLLATE"); + else + runp = runp->last; + + if (runp != NULL && runp->is_undefined == 0) + { + lr_ignore_rest (ldfile, 0); + SYNTAX_ERROR (_("%s: syntax error"), "LC_COLLATE"); + } + + if (runp == NULL) + { + runp = (struct toggle_list_t *) xcalloc (1, sizeof (*runp)); + runp->last = defined_keywords; + defined_keywords = runp; + } else { - /* Simply add the new symbol. */ - struct name_list *newsym = xmalloc (sizeof (*newsym) - + arg->val.str.lenmb + 1); - memcpy (newsym->str, arg->val.str.startmb, arg->val.str.lenmb); - newsym->str[arg->val.str.lenmb] = '\0'; - newsym->next = defined; - defined = newsym; + free ((char *) runp->name); + runp->is_undefined = 0; + } - lr_ignore_rest (ldfile, 1); + name = (char *) xmalloc (arg->val.str.lenmb + 1); + memcpy (name, arg->val.str.startmb, arg->val.str.lenmb); + name[arg->val.str.lenmb] = '\0'; + runp->name = name; + } + else + { + struct toggle_list_t *runp = defined_keywords; + while (runp != NULL) + if (strncmp (runp->name, arg->val.str.startmb, + arg->val.str.lenmb) == 0 + && runp->name[arg->val.str.lenmb] == '\0') + { + runp->is_undefined = 1; + SYNTAX_ERROR (_("%s: syntax error"), "LC_COLLATE"); } - } + else + runp = runp->last; + } + + lr_ignore_rest (ldfile, 1); + do + { + now = lr_token (ldfile, charmap, result, NULL, verbose); + nowtok = now->tok; + } + while (nowtok == tok_eol); } if (nowtok == tok_copy) @@ -2679,14 +2752,23 @@ collate_read (struct linereader *ldfile, struct localedef_t *result, switch (nowtok) { case tok_copy: - /* Allow copying other locales. */ + /* Ignore the rest of the line if we don't need the input of + this line. */ + if (ignore_content) + { + lr_ignore_rest (ldfile, 0); + break; + } + now = lr_token (ldfile, charmap, result, NULL, verbose); if (now->tok != tok_string) goto err_label; - if (! ignore_content) - load_locale (LC_COLLATE, now->val.str.startmb, repertoire_name, - charmap, result); + if (state == 1 || state == 3 || state == 5) + goto err_label; + + load_locale (LC_COLLATE, now->val.str.startmb, repertoire_name, + charmap, result); lr_ignore_rest (ldfile, 1); break; @@ -2700,9 +2782,6 @@ collate_read (struct linereader *ldfile, struct localedef_t *result, break; } - if (state != 0) - goto err_label; - arg = lr_token (ldfile, charmap, result, NULL, verbose); if (arg->tok != tok_number) goto err_label; @@ -2723,7 +2802,7 @@ collate_read (struct linereader *ldfile, struct localedef_t *result, break; } - if (state != 0) + if (state == 1 || state == 3 || state == 5) goto err_label; arg = lr_token (ldfile, charmap, result, repertoire, verbose); @@ -2770,7 +2849,7 @@ collate_read (struct linereader *ldfile, struct localedef_t *result, break; } - if (state != 0 && state != 2) + if (state == 1 || state == 3 || state == 5) goto err_label; arg = lr_token (ldfile, charmap, result, repertoire, verbose); @@ -2836,7 +2915,7 @@ collate_read (struct linereader *ldfile, struct localedef_t *result, break; } - if (state != 0 && state != 2) + if (state == 1 || state == 3 || state == 5) goto err_label; arg = lr_token (ldfile, charmap, result, repertoire, verbose); @@ -2982,7 +3061,7 @@ collate_read (struct linereader *ldfile, struct localedef_t *result, break; } - if (state != 0) + if (state == 1 || state == 3 || state == 5) goto err_label; arg = lr_token (ldfile, charmap, result, repertoire, verbose); @@ -3103,7 +3182,7 @@ error while adding equivalent collating symbol")); break; } - if (state != 0 && state != 1 && state != 2) + if (state == 3 || state == 5) goto err_label; state = 1; @@ -3362,6 +3441,9 @@ error while adding equivalent collating symbol")); no_error = 0; } } + /* Update current section. */ + if (collate->cursor != NULL) + collate->current_section = collate->cursor->section; lr_ignore_rest (ldfile, no_error); } @@ -3411,8 +3493,6 @@ error while adding equivalent collating symbol")); %s: missing `reorder-end' keyword"), "LC_COLLATE")); state = 4; } - else if (state != 2 && state != 4) - goto err_label; state = 5; /* Get the name of the sections we are adding after. */ @@ -3501,8 +3581,20 @@ error while adding equivalent collating symbol")); } else if (arg != NULL) { + void *ptr = NULL; symstr = arg->val.str.startmb; symlen = arg->val.str.lenmb; + if (state != 5 + && find_entry (&charmap->char_table, symstr, symlen, &ptr) != 0 + && (repertoire == NULL || + find_entry (&repertoire->char_table, symstr, symlen, &ptr) != 0) + && find_entry (&collate->elem_table, symstr, symlen, &ptr) != 0 + && find_entry (&collate->sym_table, symstr, symlen, &ptr) != 0) + { + if (verbose) + lr_error (ldfile, _("%s: symbol `%.*s' not known"), + "LC_COLLATE", (int) symlen, symstr); + } } else { @@ -3743,49 +3835,9 @@ error while adding equivalent collating symbol")); repertoire, result, nowtok); break; - case tok_end: - seen_end: - /* Next we assume `LC_COLLATE'. */ - if (!ignore_content) - { - if (state == 0 && copy_locale == NULL) - /* We must either see a copy statement or have - ordering values. */ - lr_error (ldfile, - _("%s: empty category description not allowed"), - "LC_COLLATE"); - else if (state == 1) - { - lr_error (ldfile, _("%s: missing `order_end' keyword"), - "LC_COLLATE"); - - /* Handle ellipsis at end of list. */ - if (was_ellipsis != tok_none) - { - handle_ellipsis (ldfile, NULL, 0, was_ellipsis, charmap, - repertoire, result); - was_ellipsis = tok_none; - } - } - else if (state == 3) - WITH_CUR_LOCALE (error (0, 0, _("\ -%s: missing `reorder-end' keyword"), "LC_COLLATE")); - else if (state == 5) - WITH_CUR_LOCALE (error (0, 0, _("\ -%s: missing `reorder-sections-end' keyword"), "LC_COLLATE")); - } - arg = lr_token (ldfile, charmap, result, NULL, verbose); - if (arg->tok == tok_eof) - break; - if (arg->tok == tok_eol) - lr_error (ldfile, _("%s: incomplete `END' line"), "LC_COLLATE"); - else if (arg->tok != tok_lc_collate) - lr_error (ldfile, _("\ -%1$s: definition does not end with `END %1$s'"), "LC_COLLATE"); - lr_ignore_rest (ldfile, arg->tok == tok_lc_collate); - return; - - case tok_define: + case tok_ifdef: + /* Ignore the rest of the line if we don't need the input of + this line. */ if (ignore_content) { lr_ignore_rest (ldfile, 0); @@ -3795,171 +3847,160 @@ error while adding equivalent collating symbol")); arg = lr_token (ldfile, charmap, result, NULL, verbose); if (arg->tok != tok_ident) goto err_label; - - /* Simply add the new symbol. */ - struct name_list *newsym = xmalloc (sizeof (*newsym) - + arg->val.str.lenmb + 1); - memcpy (newsym->str, arg->val.str.startmb, arg->val.str.lenmb); - newsym->str[arg->val.str.lenmb] = '\0'; - newsym->next = defined; - defined = newsym; - - lr_ignore_rest (ldfile, 1); - break; - - case tok_undef: - if (ignore_content) + else { - lr_ignore_rest (ldfile, 0); - break; - } + struct toggle_list_t *runp = defined_keywords; + struct toggle_list_t *flow = (struct toggle_list_t *) xcalloc (1, sizeof (*runp)); + flow->name = "ifdef"; + flow->file = ldfile->fname; + flow->line = ldfile->lineno; + flow->last = collate->flow_control; + collate->flow_control = flow; - arg = lr_token (ldfile, charmap, result, NULL, verbose); - if (arg->tok != tok_ident) - goto err_label; - - /* Remove _all_ occurrences of the symbol from the list. */ - struct name_list *prevdef = NULL; - struct name_list *curdef = defined; - while (curdef != NULL) - if (strncmp (arg->val.str.startmb, curdef->str, - arg->val.str.lenmb) == 0 - && curdef->str[arg->val.str.lenmb] == '\0') - { - if (prevdef == NULL) - defined = curdef->next; + while (runp != NULL) + if (strncmp (runp->name, arg->val.str.startmb, + arg->val.str.lenmb) == 0 + && runp->name[arg->val.str.lenmb] == '\0') + break; else - prevdef->next = curdef->next; - - struct name_list *olddef = curdef; - curdef = curdef->next; - - free (olddef); - } - else - { - prevdef = curdef; - curdef = curdef->next; - } + runp = runp->last; + if (runp == NULL) + { + now = flow_skip(ldfile, charmap, collate); + if (now->tok == tok_eof) + WITH_CUR_LOCALE (error (0, 0, _("\ +%s: unterminated `%s' flow control"), "LC_COLLATE", collate->flow_control->name)); + } + } lr_ignore_rest (ldfile, 1); break; - case tok_ifdef: case tok_ifndef: + /* Ignore the rest of the line if we don't need the input of + this line. */ if (ignore_content) { lr_ignore_rest (ldfile, 0); break; } - found_ifdef: arg = lr_token (ldfile, charmap, result, NULL, verbose); if (arg->tok != tok_ident) goto err_label; - lr_ignore_rest (ldfile, 1); - - if (collate->else_action == else_none) + else { - curdef = defined; - while (curdef != NULL) - if (strncmp (arg->val.str.startmb, curdef->str, + struct toggle_list_t *runp = defined_keywords; + struct toggle_list_t *flow = (struct toggle_list_t *) xcalloc (1, sizeof (*runp)); + flow->name = "ifndef"; + flow->file = ldfile->fname; + flow->line = ldfile->lineno; + flow->last = collate->flow_control; + collate->flow_control = flow; + + while (runp != NULL) + if (strncmp (runp->name, arg->val.str.startmb, arg->val.str.lenmb) == 0 - && curdef->str[arg->val.str.lenmb] == '\0') + && runp->name[arg->val.str.lenmb] == '\0') break; else - curdef = curdef->next; + runp = runp->last; - if ((nowtok == tok_ifdef && curdef != NULL) - || (nowtok == tok_ifndef && curdef == NULL)) - { - /* We have to use the if-branch. */ - collate->else_action = else_ignore; - } - else + if (runp != NULL) { - /* We have to use the else-branch, if there is one. */ - nowtok = skip_to (ldfile, collate, charmap, 0); - if (nowtok == tok_else) - collate->else_action = else_seen; - else if (nowtok == tok_elifdef) - { - nowtok = tok_ifdef; - goto found_ifdef; - } - else if (nowtok == tok_elifndef) - { - nowtok = tok_ifndef; - goto found_ifdef; - } - else if (nowtok == tok_eof) - goto seen_eof; - else if (nowtok == tok_end) - goto seen_end; + now = flow_skip(ldfile, charmap, collate); + if (now->tok == tok_eof) + WITH_CUR_LOCALE (error (0, 0, _("\ +%s: unterminated `%s' flow control"), "LC_COLLATE", collate->flow_control->name)); } } - else - { - /* XXX Should it really become necessary to support nested - preprocessor handling we will push the state here. */ - lr_error (ldfile, _("%s: nested conditionals not supported"), - "LC_COLLATE"); - nowtok = skip_to (ldfile, collate, charmap, 1); - if (nowtok == tok_eof) - goto seen_eof; - else if (nowtok == tok_end) - goto seen_end; - } + lr_ignore_rest (ldfile, 1); break; - case tok_elifdef: - case tok_elifndef: case tok_else: + /* Ignore the rest of the line if we don't need the input of + this line. */ if (ignore_content) { lr_ignore_rest (ldfile, 0); break; } - lr_ignore_rest (ldfile, 1); - - if (collate->else_action == else_ignore) - { - /* Ignore everything until the endif. */ - nowtok = skip_to (ldfile, collate, charmap, 1); - if (nowtok == tok_eof) - goto seen_eof; - else if (nowtok == tok_end) - goto seen_end; - } - else - { - assert (collate->else_action == else_none); - lr_error (ldfile, _("\ -%s: '%s' without matching 'ifdef' or 'ifndef'"), "LC_COLLATE", - nowtok == tok_else ? "else" - : nowtok == tok_elifdef ? "elifdef" : "elifndef"); - } + if (strcmp (collate->flow_control->name, "else") == 0) + lr_error (ldfile, + _("%s: `else' statement at `%s:%Zu' cannot be followed by another `else' statement"), + "LC_COLLATE", collate->flow_control->name, collate->flow_control->line); + collate->flow_control->name = "else"; + collate->flow_control->file = ldfile->fname; + collate->flow_control->line = ldfile->lineno; + now = flow_skip(ldfile, charmap, collate); + if (now->tok == tok_eof) + WITH_CUR_LOCALE (error (0, 0, _("\ +%s: unterminated `%s' flow control"), "LC_COLLATE", collate->flow_control->name)); break; case tok_endif: + /* Ignore the rest of the line if we don't need the input of + this line. */ if (ignore_content) { lr_ignore_rest (ldfile, 0); break; } - lr_ignore_rest (ldfile, 1); + if (collate->flow_control == NULL) + goto err_label; + else + collate->flow_control = collate->flow_control->last; + break; - if (collate->else_action != else_ignore - && collate->else_action != else_seen) - lr_error (ldfile, _("\ -%s: 'endif' without matching 'ifdef' or 'ifndef'"), "LC_COLLATE"); + case tok_end: + /* Next we assume `LC_COLLATE'. */ + if (!ignore_content) + { + if (state == 0 && copy_locale == NULL) + /* We must either see a copy statement or have + ordering values. */ + lr_error (ldfile, + _("%s: empty category description not allowed"), + "LC_COLLATE"); + else if (state == 1) + { + lr_error (ldfile, _("%s: missing `order_end' keyword"), + "LC_COLLATE"); - /* XXX If we support nested preprocessor directives we pop - the state here. */ - collate->else_action = else_none; - break; + /* Handle ellipsis at end of list. */ + if (was_ellipsis != tok_none) + { + handle_ellipsis (ldfile, NULL, 0, was_ellipsis, charmap, + repertoire, result); + was_ellipsis = tok_none; + } + } + else if (state == 3) + WITH_CUR_LOCALE (error (0, 0, _("\ +%s: missing `reorder-end' keyword"), "LC_COLLATE")); + else if (state == 5) + WITH_CUR_LOCALE (error (0, 0, _("\ +%s: missing `reorder-sections-end' keyword"), "LC_COLLATE")); + if (collate->flow_control != NULL + && strcmp(collate->flow_control->file, ldfile->fname) == 0) + WITH_CUR_LOCALE (error (0, 0, _("\ +%s: unterminated `%s' flow control beginning at %s:%Zu"), + "LC_COLLATE", collate->flow_control->name, + collate->flow_control->file, + collate->flow_control->line)); + } + arg = lr_token (ldfile, charmap, result, NULL, verbose); + if (arg->tok == tok_eof) + break; + if (arg->tok == tok_eol) + lr_error (ldfile, _("%s: incomplete `END' line"), "LC_COLLATE"); + else if (arg->tok != tok_lc_collate) + lr_error (ldfile, _("\ +%1$s: definition does not end with `END %1$s'"), "LC_COLLATE"); + lr_ignore_rest (ldfile, arg->tok == tok_lc_collate); + return; default: err_label: @@ -3971,7 +4012,6 @@ error while adding equivalent collating symbol")); nowtok = now->tok; } - seen_eof: /* When we come here we reached the end of the file. */ lr_error (ldfile, _("%s: premature end of file"), "LC_COLLATE"); } diff --git a/locale/programs/ld-identification.c b/locale/programs/ld-identification.c index 883f727..c307dc3 100644 --- a/locale/programs/ld-identification.c +++ b/locale/programs/ld-identification.c @@ -147,6 +147,9 @@ No definition for %s category found"), "LC_IDENTIFICATION")); "LC_IDENTIFICATION", #cat)); \ identification->cat = ""; \ } +#define TEST_ELEM_OPT(cat) \ + if (identification->cat == NULL) \ + identification->cat = ""; \ TEST_ELEM (title); TEST_ELEM (source); @@ -157,9 +160,9 @@ No definition for %s category found"), "LC_IDENTIFICATION")); TEST_ELEM (fax); TEST_ELEM (language); TEST_ELEM (territory); - TEST_ELEM (audience); - TEST_ELEM (application); - TEST_ELEM (abbreviation); + TEST_ELEM_OPT (audience); + TEST_ELEM_OPT (application); + TEST_ELEM_OPT (abbreviation); TEST_ELEM (revision); TEST_ELEM (date); diff --git a/locale/programs/locale.c b/locale/programs/locale.c index b1c0954..ae11a42 100644 --- a/locale/programs/locale.c +++ b/locale/programs/locale.c @@ -796,6 +796,7 @@ show_locale_vars (void) { size_t cat_no; const char *lcall = getenv ("LC_ALL") ? : ""; + const char *language = getenv ("LANGUAGE") ? : ""; const char *lang = getenv ("LANG") ? : ""; auto void get_source (const char *name); @@ -814,6 +815,9 @@ show_locale_vars (void) /* LANG has to be the first value. */ print_assignment ("LANG", lang, false); + if (getenv ("POSIXLY_CORRECT") == NULL) + printf ("LANGUAGE=%s\n", language); + /* Now all categories in an unspecified order. */ for (cat_no = 0; cat_no < NCATEGORIES; ++cat_no) if (cat_no != LC_ALL) diff --git a/locale/programs/locarchive.c b/locale/programs/locarchive.c index 27d589b..527ea74 100644 --- a/locale/programs/locarchive.c +++ b/locale/programs/locarchive.c @@ -134,7 +134,7 @@ create_archive (const char *archivefname, struct locarhandle *ah) size_t reserved = RESERVE_MMAP_SIZE; int xflags = 0; if (total < reserved - && ((p = mmap64 (NULL, reserved, PROT_NONE, MAP_PRIVATE | MAP_ANON, + && ((p = mmap64 (NULL, reserved, PROT_NONE, MAP_SHARED | MAP_ANON, -1, 0)) != MAP_FAILED)) xflags = MAP_FIXED; else @@ -397,7 +397,7 @@ enlarge_archive (struct locarhandle *ah, const struct locarhead *head) size_t reserved = RESERVE_MMAP_SIZE; int xflags = 0; if (total < reserved - && ((p = mmap64 (NULL, reserved, PROT_NONE, MAP_PRIVATE | MAP_ANON, + && ((p = mmap64 (NULL, reserved, PROT_NONE, MAP_SHARED | MAP_ANON, -1, 0)) != MAP_FAILED)) xflags = MAP_FIXED; else @@ -416,7 +416,16 @@ enlarge_archive (struct locarhandle *ah, const struct locarhead *head) } /* Lock the new file. */ +#ifdef __GNU__ + struct flock fl; + fl.l_whence = SEEK_SET; + fl.l_start = 0; + fl.l_len = 0; + fl.l_type = F_WRLCK; + if (fcntl(fd, F_SETLKW, &fl) != 0) +#else if (lockf64 (fd, F_LOCK, total) != 0) +#endif { int errval = errno; unlink (fname); @@ -564,7 +573,16 @@ open_archive (struct locarhandle *ah, bool readonly) error (EXIT_FAILURE, errno, _("cannot stat locale archive \"%s\""), archivefname); +#ifdef __GNU__ + struct flock fl; + fl.l_whence = SEEK_SET; + fl.l_start = 0; + fl.l_len = 0; + fl.l_type = F_WRLCK; + if (!readonly && fcntl(fd, F_SETLKW, &fl) == -1) +#else if (!readonly && lockf64 (fd, F_LOCK, sizeof (struct locarhead)) == -1) +#endif { close (fd); @@ -615,7 +633,7 @@ open_archive (struct locarhandle *ah, bool readonly) int xflags = 0; void *p; if (st.st_size < reserved - && ((p = mmap64 (NULL, reserved, PROT_NONE, MAP_PRIVATE | MAP_ANON, + && ((p = mmap64 (NULL, reserved, PROT_NONE, MAP_SHARED | MAP_ANON, -1, 0)) != MAP_FAILED)) xflags = MAP_FIXED; else diff --git a/locale/setlocale.c b/locale/setlocale.c index 58daaf1..556aa60 100644 --- a/locale/setlocale.c +++ b/locale/setlocale.c @@ -125,7 +125,7 @@ new_composite_name (int category, const char *newnames[__LC_LAST]) _nl_global_locale.__names[i]); last_len = strlen (name); cumlen += _nl_category_name_sizes[i] + 1 + last_len + 1; - if (i > 0 && same && strcmp (name, newnames[0]) != 0) + if (same && name != newnames[0] && strcmp (name, newnames[0]) != 0) same = 0; } @@ -244,6 +244,8 @@ setlocale (int category, const char *locale) of entries of the form `CATEGORY=VALUE'. */ const char *newnames[__LC_LAST]; struct __locale_data *newdata[__LC_LAST]; + /* Copy of the locale argument, for in-place splitting. */ + char *locale_copy = NULL; /* Set all name pointers to the argument name. */ for (category = 0; category < __LC_LAST; ++category) @@ -253,7 +255,13 @@ setlocale (int category, const char *locale) if (__builtin_expect (strchr (locale, ';') != NULL, 0)) { /* This is a composite name. Make a copy and split it up. */ - char *np = strdupa (locale); + locale_copy = strdup (locale); + if (__glibc_unlikely (locale_copy == NULL)) + { + __libc_rwlock_unlock (__libc_setlocale_lock); + return NULL; + } + char *np = locale_copy; char *cp; int cnt; @@ -271,6 +279,7 @@ setlocale (int category, const char *locale) { error_return: __libc_rwlock_unlock (__libc_setlocale_lock); + free (locale_copy); /* Bogus category name. */ ERROR_RETURN; @@ -363,8 +372,9 @@ setlocale (int category, const char *locale) /* Critical section left. */ __libc_rwlock_unlock (__libc_setlocale_lock); - /* Free the resources (the locale path variable). */ + /* Free the resources. */ free (locale_path); + free (locale_copy); return composite; } diff --git a/locale/weight.h b/locale/weight.h index dc70a00..75effd3 100644 --- a/locale/weight.h +++ b/locale/weight.h @@ -20,7 +20,7 @@ /* Find index of weight. */ auto inline int32_t __attribute ((always_inline)) -findidx (const unsigned char **cpp) +findidx (const unsigned char **cpp, size_t len) { int_fast32_t i = table[*(*cpp)++]; const unsigned char *cp; @@ -34,6 +34,7 @@ findidx (const unsigned char **cpp) Search for the correct one. */ cp = &extra[-i]; usrc = *cpp; + --len; while (1) { size_t nhere; @@ -56,7 +57,7 @@ findidx (const unsigned char **cpp) already. */ size_t cnt; - for (cnt = 0; cnt < nhere; ++cnt) + for (cnt = 0; cnt < nhere && cnt < len; ++cnt) if (cp[cnt] != usrc[cnt]) break; @@ -79,13 +80,13 @@ findidx (const unsigned char **cpp) size_t cnt; size_t offset = 0; - for (cnt = 0; cnt < nhere; ++cnt) + for (cnt = 0; cnt < nhere && cnt < len; ++cnt) if (cp[cnt] != usrc[cnt]) break; if (cnt != nhere) { - if (cp[cnt] > usrc[cnt]) + if (cnt == len || cp[cnt] > usrc[cnt]) { /* Cannot be in this range. */ cp += 2 * nhere; diff --git a/locale/weightwc.h b/locale/weightwc.h index 9ea1126..fadeaed 100644 --- a/locale/weightwc.h +++ b/locale/weightwc.h @@ -20,7 +20,7 @@ /* Find index of weight. */ auto inline int32_t __attribute ((always_inline)) -findidx (const wint_t **cpp) +findidx (const wint_t **cpp, size_t len) { wint_t ch = *(*cpp)++; int32_t i = __collidx_table_lookup ((const char *) table, ch); @@ -32,6 +32,7 @@ findidx (const wint_t **cpp) /* Oh well, more than one sequence starting with this byte. Search for the correct one. */ const int32_t *cp = (const int32_t *) &extra[-i]; + --len; while (1) { size_t nhere; @@ -54,7 +55,7 @@ findidx (const wint_t **cpp) already. */ size_t cnt; - for (cnt = 0; cnt < nhere; ++cnt) + for (cnt = 0; cnt < nhere && cnt < len; ++cnt) if (cp[cnt] != usrc[cnt]) break; @@ -75,7 +76,7 @@ findidx (const wint_t **cpp) size_t cnt; size_t offset; - for (cnt = 0; cnt < nhere - 1; ++cnt) + for (cnt = 0; cnt < nhere - 1 && cnt < len; ++cnt) if (cp[cnt] != usrc[cnt]) break; diff --git a/localedata/Makefile b/localedata/Makefile index ac1bed7..d6a21e5 100644 --- a/localedata/Makefile +++ b/localedata/Makefile @@ -50,7 +50,7 @@ vpath %.h tests-mbwc test-srcs := collate-test xfrm-test tst-fmon tst-rpmatch tst-trans \ tst-mbswcs1 tst-mbswcs2 tst-mbswcs3 tst-mbswcs4 tst-mbswcs5 \ - tst-ctype tst-wctype tst-langinfo tst-numeric + tst-ctype tst-wctype tst-langinfo tst-langinfo-static tst-numeric test-input := de_DE.ISO-8859-1 en_US.ISO-8859-1 da_DK.ISO-8859-1 \ hr_HR.ISO-8859-2 sv_SE.ISO-8859-1 tr_TR.UTF-8 fr_FR.UTF-8 \ si_LK.UTF-8 @@ -178,7 +178,8 @@ ifeq (y,$(OPTION_EGLIBC_LOCALE_CODE)) tests: $(objpfx)sort-test.out $(objpfx)tst-fmon.out $(objpfx)tst-locale.out \ $(objpfx)tst-rpmatch.out $(objpfx)tst-trans.out \ $(objpfx)tst-mbswcs.out $(objpfx)tst-ctype.out \ - $(objpfx)tst-langinfo.out $(objpfx)tst-numeric.out + $(objpfx)tst-langinfo.out $(objpfx)tst-langinfo-static.out\ + $(objpfx)tst-numeric.out ifeq (y,$(OPTION_POSIX_WIDE_CHAR_DEVICE_IO)) tests: $(objpfx)tst-wctype.out endif @@ -224,7 +225,11 @@ $(objpfx)tst-wctype.out: tst-wctype.sh $(objpfx)tst-wctype \ $(objpfx)tst-langinfo.out: tst-langinfo.sh $(objpfx)tst-langinfo \ $(objpfx)sort-test.out \ $(addprefix $(objpfx),$(CTYPE_FILES)) - $(SHELL) -e $< $(common-objpfx) '$(built-program-cmd)' + $(SHELL) -e $< $(common-objpfx) '$(built-program-cmd)' > $@ +$(objpfx)tst-langinfo-static.out: tst-langinfo.sh $(objpfx)tst-langinfo-static \ + $(objpfx)sort-test.out \ + $(addprefix $(objpfx),$(CTYPE_FILES)) + $(SHELL) -e $< $(common-objpfx) '$(built-program-cmd)' > $@ $(objpfx)tst-digits.out: $(objpfx)tst-locale.out $(objpfx)tst-mbswcs6.out: $(addprefix $(objpfx),$(CTYPE_FILES)) # eglibc: endif @@ -255,7 +260,7 @@ $(INSTALL-SUPPORTED-LOCALES): install-locales-dir echo -n `echo $$locale | sed 's/\([^\@]*\)\(\@.*\)*/\2/'`; \ echo -n '...'; \ input=`echo $$locale | sed 's/\([^.]*\)[^@]*\(.*\)/\1\2/'`; \ - $(LOCALEDEF) --alias-file=../intl/locale.alias \ + $(LOCALEDEF) --alias-file=../intl/locale.alias --no-archive \ -i locales/$$input -c -f charmaps/$$charset \ $(addprefix --prefix=,$(install_root)) $$locale; \ echo ' done'; \ diff --git a/localedata/SUPPORTED b/localedata/SUPPORTED index d665961..02221ef 100644 --- a/localedata/SUPPORTED +++ b/localedata/SUPPORTED @@ -53,6 +53,7 @@ ast_ES/ISO-8859-15 \ be_BY.UTF-8/UTF-8 \ be_BY/CP1251 \ be_BY@latin/UTF-8 \ +bem_ZM/UTF-8 \ ber_DZ/UTF-8 \ ber_MA/UTF-8 \ bg_BG.UTF-8/UTF-8 \ @@ -72,6 +73,8 @@ ca_AD/ISO-8859-15 \ ca_ES.UTF-8/UTF-8 \ ca_ES/ISO-8859-1 \ ca_ES@euro/ISO-8859-15 \ +ca_ES.UTF-8@valencia/UTF-8 \ +ca_ES@valencia/ISO-8859-15 \ ca_FR.UTF-8/UTF-8 \ ca_FR/ISO-8859-15 \ ca_IT.UTF-8/UTF-8 \ @@ -96,6 +99,7 @@ de_CH/ISO-8859-1 \ de_DE.UTF-8/UTF-8 \ de_DE/ISO-8859-1 \ de_DE@euro/ISO-8859-15 \ +de_LI.UTF-8/UTF-8 \ de_LU.UTF-8/UTF-8 \ de_LU/ISO-8859-1 \ de_LU@euro/ISO-8859-15 \ @@ -113,9 +117,11 @@ en_BW/ISO-8859-1 \ en_CA.UTF-8/UTF-8 \ en_CA/ISO-8859-1 \ en_DK.UTF-8/UTF-8 \ +en_DK.ISO-8859-15/ISO-8859-15 \ en_DK/ISO-8859-1 \ en_GB.UTF-8/UTF-8 \ en_GB/ISO-8859-1 \ +en_GB.ISO-8859-15/ISO-8859-15 \ en_HK.UTF-8/UTF-8 \ en_HK/ISO-8859-1 \ en_IE.UTF-8/UTF-8 \ @@ -131,10 +137,14 @@ en_SG.UTF-8/UTF-8 \ en_SG/ISO-8859-1 \ en_US.UTF-8/UTF-8 \ en_US/ISO-8859-1 \ +en_US.ISO-8859-15/ISO-8859-15 \ en_ZA.UTF-8/UTF-8 \ en_ZA/ISO-8859-1 \ +en_ZM/UTF-8 \ en_ZW.UTF-8/UTF-8 \ en_ZW/ISO-8859-1 \ +eo.UTF-8/UTF-8 \ +eo/ISO-8859-3 \ es_AR.UTF-8/UTF-8 \ es_AR/ISO-8859-1 \ es_BO.UTF-8/UTF-8 \ @@ -182,7 +192,11 @@ et_EE.ISO-8859-15/ISO-8859-15 \ eu_ES.UTF-8/UTF-8 \ eu_ES/ISO-8859-1 \ eu_ES@euro/ISO-8859-15 \ +eu_FR.UTF-8/UTF-8 \ +eu_FR/ISO-8859-1 \ +eu_FR@euro/ISO-8859-15 \ fa_IR/UTF-8 \ +ff_SN/UTF-8 \ fi_FI.UTF-8/UTF-8 \ fi_FI/ISO-8859-1 \ fi_FI@euro/ISO-8859-15 \ @@ -227,13 +241,14 @@ hi_IN/UTF-8 \ hne_IN/UTF-8 \ hr_HR.UTF-8/UTF-8 \ hr_HR/ISO-8859-2 \ -hsb_DE/ISO-8859-2 \ hsb_DE.UTF-8/UTF-8 \ +hsb_DE/ISO-8859-2 \ ht_HT/UTF-8 \ hu_HU.UTF-8/UTF-8 \ hu_HU/ISO-8859-2 \ hy_AM/UTF-8 \ hy_AM.ARMSCII-8/ARMSCII-8 \ +ia/UTF-8 \ id_ID.UTF-8/UTF-8 \ id_ID/ISO-8859-1 \ ig_NG/UTF-8 \ @@ -248,18 +263,19 @@ it_IT@euro/ISO-8859-15 \ iu_CA/UTF-8 \ iw_IL.UTF-8/UTF-8 \ iw_IL/ISO-8859-8 \ -ja_JP.EUC-JP/EUC-JP \ ja_JP.UTF-8/UTF-8 \ +ja_JP.EUC-JP/EUC-JP \ ka_GE.UTF-8/UTF-8 \ ka_GE/GEORGIAN-PS \ kk_KZ.UTF-8/UTF-8 \ kk_KZ/PT154 \ +kk_KZ/RK1048 \ kl_GL.UTF-8/UTF-8 \ kl_GL/ISO-8859-1 \ km_KH/UTF-8 \ kn_IN/UTF-8 \ -ko_KR.EUC-KR/EUC-KR \ ko_KR.UTF-8/UTF-8 \ +ko_KR.EUC-KR/EUC-KR \ kok_IN/UTF-8 \ ks_IN/UTF-8 \ ks_IN@devanagari/UTF-8 \ @@ -315,6 +331,7 @@ om_ET/UTF-8 \ om_KE.UTF-8/UTF-8 \ om_KE/ISO-8859-1 \ or_IN/UTF-8 \ +os_RU/UTF-8 \ pa_IN/UTF-8 \ pa_PK/UTF-8 \ pap_AN/UTF-8 \ @@ -328,9 +345,10 @@ pt_PT/ISO-8859-1 \ pt_PT@euro/ISO-8859-15 \ ro_RO.UTF-8/UTF-8 \ ro_RO/ISO-8859-2 \ -ru_RU.KOI8-R/KOI8-R \ ru_RU.UTF-8/UTF-8 \ +ru_RU.KOI8-R/KOI8-R \ ru_RU/ISO-8859-5 \ +ru_RU.CP1251/CP1251 \ ru_UA.UTF-8/UTF-8 \ ru_UA/KOI8-U \ rw_RW/UTF-8 \ @@ -367,6 +385,9 @@ sv_FI/ISO-8859-1 \ sv_FI@euro/ISO-8859-15 \ sv_SE.UTF-8/UTF-8 \ sv_SE/ISO-8859-1 \ +sv_SE.ISO-8859-15/ISO-8859-15 \ +sw_KE/UTF-8 \ +sw_TZ/UTF-8 \ ta_IN/UTF-8 \ te_IN/UTF-8 \ tg_TJ.UTF-8/UTF-8 \ @@ -391,31 +412,32 @@ ug_CN/UTF-8 \ uk_UA.UTF-8/UTF-8 \ uk_UA/KOI8-U \ ur_PK/UTF-8 \ +uz_UZ.UTF-8/UTF-8 \ uz_UZ/ISO-8859-1 \ uz_UZ@cyrillic/UTF-8 \ ve_ZA/UTF-8 \ -vi_VN.TCVN/TCVN5712-1 \ vi_VN/UTF-8 \ +vi_VN.TCVN/TCVN5712-1 \ +wa_BE.UTF-8/UTF-8 \ wa_BE/ISO-8859-1 \ wa_BE@euro/ISO-8859-15 \ -wa_BE.UTF-8/UTF-8 \ wo_SN/UTF-8 \ xh_ZA.UTF-8/UTF-8 \ xh_ZA/ISO-8859-1 \ yi_US.UTF-8/UTF-8 \ yi_US/CP1255 \ yo_NG/UTF-8 \ +zh_CN.UTF-8/UTF-8 \ zh_CN.GB18030/GB18030 \ zh_CN.GBK/GBK \ -zh_CN.UTF-8/UTF-8 \ zh_CN/GB2312 \ zh_HK.UTF-8/UTF-8 \ zh_HK/BIG5-HKSCS \ zh_SG.UTF-8/UTF-8 \ zh_SG.GBK/GBK \ zh_SG/GB2312 \ -zh_TW.EUC-TW/EUC-TW \ zh_TW.UTF-8/UTF-8 \ +zh_TW.EUC-TW/EUC-TW \ zh_TW/BIG5 \ zu_ZA.UTF-8/UTF-8 \ zu_ZA/ISO-8859-1 \ diff --git a/localedata/charmaps/UTF-8 b/localedata/charmaps/UTF-8 index 736a283..4cb9bcb 100644 --- a/localedata/charmaps/UTF-8 +++ b/localedata/charmaps/UTF-8 @@ -1312,6 +1312,10 @@ CHARMAP /xd4/xa1 CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK /xd4/xa2 CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK /xd4/xa3 CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK + /xd4/xa4 CYRILLIC CAPITAL LETTER PE WITH DESCENDER + /xd4/xa5 CYRILLIC SMALL LETTER PE WITH DESCENDER + /xd4/xa6 CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER + /xd4/xa7 CYRILLIC SMALL LETTER SHHA WITH DESCENDER /xd4/xb1 ARMENIAN CAPITAL LETTER AYB /xd4/xb2 ARMENIAN CAPITAL LETTER BEN /xd4/xb3 ARMENIAN CAPITAL LETTER GIM @@ -1513,6 +1517,7 @@ CHARMAP /xd8/x9b ARABIC SEMICOLON /xd8/x9e ARABIC TRIPLE DOT PUNCTUATION MARK /xd8/x9f ARABIC QUESTION MARK + /xd8/xa0 ARABIC LETTER KASHMIRI YEH /xd8/xa1 ARABIC LETTER HAMZA /xd8/xa2 ARABIC LETTER ALEF WITH MADDA ABOVE /xd8/xa3 ARABIC LETTER ALEF WITH HAMZA ABOVE @@ -1575,6 +1580,7 @@ CHARMAP /xd9/x9c ARABIC VOWEL SIGN DOT BELOW /xd9/x9d ARABIC REVERSED DAMMA /xd9/x9e ARABIC FATHA WITH TWO DOTS + /xd9/x9f ARABIC WAVY HAMZA BELOW /xd9/xa0 ARABIC-INDIC DIGIT ZERO /xd9/xa1 ARABIC-INDIC DIGIT ONE /xd9/xa2 ARABIC-INDIC DIGIT TWO @@ -1969,6 +1975,97 @@ CHARMAP /xdf/xb8 NKO COMMA /xdf/xb9 NKO EXCLAMATION MARK /xdf/xba NKO LAJANYALAN + /xe0/xa0/x80 SAMARITAN LETTER ALAF + /xe0/xa0/x81 SAMARITAN LETTER BIT + /xe0/xa0/x82 SAMARITAN LETTER GAMAN + /xe0/xa0/x83 SAMARITAN LETTER DALAT + /xe0/xa0/x84 SAMARITAN LETTER IY + /xe0/xa0/x85 SAMARITAN LETTER BAA + /xe0/xa0/x86 SAMARITAN LETTER ZEN + /xe0/xa0/x87 SAMARITAN LETTER IT + /xe0/xa0/x88 SAMARITAN LETTER TIT + /xe0/xa0/x89 SAMARITAN LETTER YUT + /xe0/xa0/x8a SAMARITAN LETTER KAAF + /xe0/xa0/x8b SAMARITAN LETTER LABAT + /xe0/xa0/x8c SAMARITAN LETTER MIM + /xe0/xa0/x8d SAMARITAN LETTER NUN + /xe0/xa0/x8e SAMARITAN LETTER SINGAAT + /xe0/xa0/x8f SAMARITAN LETTER IN + /xe0/xa0/x90 SAMARITAN LETTER FI + /xe0/xa0/x91 SAMARITAN LETTER TSAADIY + /xe0/xa0/x92 SAMARITAN LETTER QUF + /xe0/xa0/x93 SAMARITAN LETTER RISH + /xe0/xa0/x94 SAMARITAN LETTER SHAN + /xe0/xa0/x95 SAMARITAN LETTER TAAF + /xe0/xa0/x96 SAMARITAN MARK IN + /xe0/xa0/x97 SAMARITAN MARK IN-ALAF + /xe0/xa0/x98 SAMARITAN MARK OCCLUSION + /xe0/xa0/x99 SAMARITAN MARK DAGESH + /xe0/xa0/x9a SAMARITAN MODIFIER LETTER EPENTHETIC YUT + /xe0/xa0/x9b SAMARITAN MARK EPENTHETIC YUT + /xe0/xa0/x9c SAMARITAN VOWEL SIGN LONG E + /xe0/xa0/x9d SAMARITAN VOWEL SIGN E + /xe0/xa0/x9e SAMARITAN VOWEL SIGN OVERLONG AA + /xe0/xa0/x9f SAMARITAN VOWEL SIGN LONG AA + /xe0/xa0/xa0 SAMARITAN VOWEL SIGN AA + /xe0/xa0/xa1 SAMARITAN VOWEL SIGN OVERLONG A + /xe0/xa0/xa2 SAMARITAN VOWEL SIGN LONG A + /xe0/xa0/xa3 SAMARITAN VOWEL SIGN A + /xe0/xa0/xa4 SAMARITAN MODIFIER LETTER SHORT A + /xe0/xa0/xa5 SAMARITAN VOWEL SIGN SHORT A + /xe0/xa0/xa6 SAMARITAN VOWEL SIGN LONG U + /xe0/xa0/xa7 SAMARITAN VOWEL SIGN U + /xe0/xa0/xa8 SAMARITAN MODIFIER LETTER I + /xe0/xa0/xa9 SAMARITAN VOWEL SIGN LONG I + /xe0/xa0/xaa SAMARITAN VOWEL SIGN I + /xe0/xa0/xab SAMARITAN VOWEL SIGN O + /xe0/xa0/xac SAMARITAN VOWEL SIGN SUKUN + /xe0/xa0/xad SAMARITAN MARK NEQUDAA + /xe0/xa0/xb0 SAMARITAN PUNCTUATION NEQUDAA + /xe0/xa0/xb1 SAMARITAN PUNCTUATION AFSAAQ + /xe0/xa0/xb2 SAMARITAN PUNCTUATION ANGED + /xe0/xa0/xb3 SAMARITAN PUNCTUATION BAU + /xe0/xa0/xb4 SAMARITAN PUNCTUATION ATMAAU + /xe0/xa0/xb5 SAMARITAN PUNCTUATION SHIYYAALAA + /xe0/xa0/xb6 SAMARITAN ABBREVIATION MARK + /xe0/xa0/xb7 SAMARITAN PUNCTUATION MELODIC QITSA + /xe0/xa0/xb8 SAMARITAN PUNCTUATION ZIQAA + /xe0/xa0/xb9 SAMARITAN PUNCTUATION QITSA + /xe0/xa0/xba SAMARITAN PUNCTUATION ZAEF + /xe0/xa0/xbb SAMARITAN PUNCTUATION TURU + /xe0/xa0/xbc SAMARITAN PUNCTUATION ARKAANU + /xe0/xa0/xbd SAMARITAN PUNCTUATION SOF MASHFAAT + /xe0/xa0/xbe SAMARITAN PUNCTUATION ANNAAU + /xe0/xa1/x80 MANDAIC LETTER HALQA + /xe0/xa1/x81 MANDAIC LETTER AB + /xe0/xa1/x82 MANDAIC LETTER AG + /xe0/xa1/x83 MANDAIC LETTER AD + /xe0/xa1/x84 MANDAIC LETTER AH + /xe0/xa1/x85 MANDAIC LETTER USHENNA + /xe0/xa1/x86 MANDAIC LETTER AZ + /xe0/xa1/x87 MANDAIC LETTER IT + /xe0/xa1/x88 MANDAIC LETTER ATT + /xe0/xa1/x89 MANDAIC LETTER AKSA + /xe0/xa1/x8a MANDAIC LETTER AK + /xe0/xa1/x8b MANDAIC LETTER AL + /xe0/xa1/x8c MANDAIC LETTER AM + /xe0/xa1/x8d MANDAIC LETTER AN + /xe0/xa1/x8e MANDAIC LETTER AS + /xe0/xa1/x8f MANDAIC LETTER IN + /xe0/xa1/x90 MANDAIC LETTER AP + /xe0/xa1/x91 MANDAIC LETTER ASZ + /xe0/xa1/x92 MANDAIC LETTER AQ + /xe0/xa1/x93 MANDAIC LETTER AR + /xe0/xa1/x94 MANDAIC LETTER ASH + /xe0/xa1/x95 MANDAIC LETTER AT + /xe0/xa1/x96 MANDAIC LETTER DUSHENNA + /xe0/xa1/x97 MANDAIC LETTER KAD + /xe0/xa1/x98 MANDAIC LETTER AIN + /xe0/xa1/x99 MANDAIC AFFRICATION MARK + /xe0/xa1/x9a MANDAIC VOCALIZATION MARK + /xe0/xa1/x9b MANDAIC GEMINATION MARK + /xe0/xa1/x9e MANDAIC PUNCTUATION + /xe0/xa4/x80 DEVANAGARI SIGN INVERTED CANDRABINDU /xe0/xa4/x81 DEVANAGARI SIGN CANDRABINDU /xe0/xa4/x82 DEVANAGARI SIGN ANUSVARA /xe0/xa4/x83 DEVANAGARI SIGN VISARGA @@ -2026,6 +2123,8 @@ CHARMAP /xe0/xa4/xb7 DEVANAGARI LETTER SSA /xe0/xa4/xb8 DEVANAGARI LETTER SA /xe0/xa4/xb9 DEVANAGARI LETTER HA + /xe0/xa4/xba DEVANAGARI VOWEL SIGN OE + /xe0/xa4/xbb DEVANAGARI VOWEL SIGN OOE /xe0/xa4/xbc DEVANAGARI SIGN NUKTA /xe0/xa4/xbd DEVANAGARI SIGN AVAGRAHA /xe0/xa4/xbe DEVANAGARI VOWEL SIGN AA @@ -2044,11 +2143,16 @@ CHARMAP /xe0/xa5/x8b DEVANAGARI VOWEL SIGN O /xe0/xa5/x8c DEVANAGARI VOWEL SIGN AU /xe0/xa5/x8d DEVANAGARI SIGN VIRAMA + /xe0/xa5/x8e DEVANAGARI VOWEL SIGN PRISHTHAMATRA E + /xe0/xa5/x8f DEVANAGARI VOWEL SIGN AW /xe0/xa5/x90 DEVANAGARI OM /xe0/xa5/x91 DEVANAGARI STRESS SIGN UDATTA /xe0/xa5/x92 DEVANAGARI STRESS SIGN ANUDATTA /xe0/xa5/x93 DEVANAGARI GRAVE ACCENT /xe0/xa5/x94 DEVANAGARI ACUTE ACCENT + /xe0/xa5/x95 DEVANAGARI VOWEL SIGN CANDRA LONG E + /xe0/xa5/x96 DEVANAGARI VOWEL SIGN UE + /xe0/xa5/x97 DEVANAGARI VOWEL SIGN UUE /xe0/xa5/x98 DEVANAGARI LETTER QA /xe0/xa5/x99 DEVANAGARI LETTER KHHA /xe0/xa5/x9a DEVANAGARI LETTER GHHA @@ -2076,6 +2180,13 @@ CHARMAP /xe0/xa5/xb0 DEVANAGARI ABBREVIATION SIGN /xe0/xa5/xb1 DEVANAGARI SIGN HIGH SPACING DOT /xe0/xa5/xb2 DEVANAGARI LETTER CANDRA A + /xe0/xa5/xb3 DEVANAGARI LETTER OE + /xe0/xa5/xb4 DEVANAGARI LETTER OOE + /xe0/xa5/xb5 DEVANAGARI LETTER AW + /xe0/xa5/xb6 DEVANAGARI LETTER UE + /xe0/xa5/xb7 DEVANAGARI LETTER UUE + /xe0/xa5/xb9 DEVANAGARI LETTER ZHA + /xe0/xa5/xba DEVANAGARI LETTER HEAVY YA /xe0/xa5/xbb DEVANAGARI LETTER GGA /xe0/xa5/xbc DEVANAGARI LETTER JJA /xe0/xa5/xbd DEVANAGARI LETTER GLOTTAL STOP @@ -2172,6 +2283,7 @@ CHARMAP /xe0/xa7/xb8 BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR /xe0/xa7/xb9 BENGALI CURRENCY DENOMINATOR SIXTEEN /xe0/xa7/xba BENGALI ISSHAR + /xe0/xa7/xbb BENGALI GANDA MARK /xe0/xa8/x81 GURMUKHI SIGN ADAK BINDI /xe0/xa8/x82 GURMUKHI SIGN BINDI /xe0/xa8/x83 GURMUKHI SIGN VISARGA @@ -2418,6 +2530,12 @@ CHARMAP /xe0/xad/xaf ORIYA DIGIT NINE /xe0/xad/xb0 ORIYA ISSHAR /xe0/xad/xb1 ORIYA LETTER WA + /xe0/xad/xb2 ORIYA FRACTION ONE QUARTER + /xe0/xad/xb3 ORIYA FRACTION ONE HALF + /xe0/xad/xb4 ORIYA FRACTION THREE QUARTERS + /xe0/xad/xb5 ORIYA FRACTION ONE SIXTEENTH + /xe0/xad/xb6 ORIYA FRACTION ONE EIGHTH + /xe0/xad/xb7 ORIYA FRACTION THREE SIXTEENTHS /xe0/xae/x82 TAMIL SIGN ANUSVARA /xe0/xae/x83 TAMIL SIGN VISARGA /xe0/xae/x85 TAMIL LETTER A @@ -2705,6 +2823,7 @@ CHARMAP /xe0/xb4/xa6 MALAYALAM LETTER DA /xe0/xb4/xa7 MALAYALAM LETTER DHA /xe0/xb4/xa8 MALAYALAM LETTER NA + /xe0/xb4/xa9 MALAYALAM LETTER NNNA /xe0/xb4/xaa MALAYALAM LETTER PA /xe0/xb4/xab MALAYALAM LETTER PHA /xe0/xb4/xac MALAYALAM LETTER BA @@ -2721,6 +2840,7 @@ CHARMAP /xe0/xb4/xb7 MALAYALAM LETTER SSA /xe0/xb4/xb8 MALAYALAM LETTER SA /xe0/xb4/xb9 MALAYALAM LETTER HA + /xe0/xb4/xba MALAYALAM LETTER TTTA /xe0/xb4/xbd MALAYALAM SIGN AVAGRAHA /xe0/xb4/xbe MALAYALAM VOWEL SIGN AA /xe0/xb4/xbf MALAYALAM VOWEL SIGN I @@ -2736,6 +2856,7 @@ CHARMAP /xe0/xb5/x8b MALAYALAM VOWEL SIGN OO /xe0/xb5/x8c MALAYALAM VOWEL SIGN AU /xe0/xb5/x8d MALAYALAM SIGN VIRAMA + /xe0/xb5/x8e MALAYALAM LETTER DOT REPH /xe0/xb5/x97 MALAYALAM AU LENGTH MARK /xe0/xb5/xa0 MALAYALAM LETTER VOCALIC RR /xe0/xb5/xa1 MALAYALAM LETTER VOCALIC LL @@ -3131,6 +3252,10 @@ CHARMAP /xe0/xbe/x89 TIBETAN SIGN MCHU CAN /xe0/xbe/x8a TIBETAN SIGN GRU CAN RGYINGS /xe0/xbe/x8b TIBETAN SIGN GRU MED RGYINGS + /xe0/xbe/x8c TIBETAN SIGN INVERTED MCHU CAN + /xe0/xbe/x8d TIBETAN SUBJOINED SIGN LCE TSA CAN + /xe0/xbe/x8e TIBETAN SUBJOINED SIGN MCHU CAN + /xe0/xbe/x8f TIBETAN SUBJOINED SIGN INVERTED MCHU CAN /xe0/xbe/x90 TIBETAN SUBJOINED LETTER KA /xe0/xbe/x91 TIBETAN SUBJOINED LETTER KHA /xe0/xbe/x92 TIBETAN SUBJOINED LETTER GA @@ -3197,6 +3322,12 @@ CHARMAP /xe0/xbf/x92 TIBETAN MARK NYIS TSHEG /xe0/xbf/x93 TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA /xe0/xbf/x94 TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA + /xe0/xbf/x95 RIGHT-FACING SVASTI SIGN + /xe0/xbf/x96 LEFT-FACING SVASTI SIGN + /xe0/xbf/x97 RIGHT-FACING SVASTI SIGN WITH DOTS + /xe0/xbf/x98 LEFT-FACING SVASTI SIGN WITH DOTS + /xe0/xbf/x99 TIBETAN MARK LEADING MCHAN RTAGS + /xe0/xbf/x9a TIBETAN MARK TRAILING MCHAN RTAGS /xe1/x80/x80 MYANMAR LETTER KA /xe1/x80/x81 MYANMAR LETTER KHA /xe1/x80/x82 MYANMAR LETTER GA @@ -3351,6 +3482,10 @@ CHARMAP /xe1/x82/x97 MYANMAR SHAN DIGIT SEVEN /xe1/x82/x98 MYANMAR SHAN DIGIT EIGHT /xe1/x82/x99 MYANMAR SHAN DIGIT NINE + /xe1/x82/x9a MYANMAR SIGN KHAMTI TONE-1 + /xe1/x82/x9b MYANMAR SIGN KHAMTI TONE-3 + /xe1/x82/x9c MYANMAR VOWEL SIGN AITON A + /xe1/x82/x9d MYANMAR VOWEL SIGN AITON AI /xe1/x82/x9e MYANMAR SYMBOL SHAN ONE /xe1/x82/x9f MYANMAR SYMBOL SHAN EXCLAMATION /xe1/x82/xa0 GEORGIAN CAPITAL LETTER AN @@ -3526,6 +3661,11 @@ CHARMAP /xe1/x85/x97 HANGUL CHOSEONG KAPYEOUNPHIEUPH /xe1/x85/x98 HANGUL CHOSEONG SSANGHIEUH /xe1/x85/x99 HANGUL CHOSEONG YEORINHIEUH + /xe1/x85/x9a HANGUL CHOSEONG KIYEOK-TIKEUT + /xe1/x85/x9b HANGUL CHOSEONG NIEUN-SIOS + /xe1/x85/x9c HANGUL CHOSEONG NIEUN-CIEUC + /xe1/x85/x9d HANGUL CHOSEONG NIEUN-HIEUH + /xe1/x85/x9e HANGUL CHOSEONG TIKEUT-RIEUL /xe1/x85/x9f HANGUL CHOSEONG FILLER /xe1/x85/xa0 HANGUL JUNGSEONG FILLER /xe1/x85/xa1 HANGUL JUNGSEONG A @@ -3594,6 +3734,11 @@ CHARMAP /xe1/x86/xa0 HANGUL JUNGSEONG ARAEA-U /xe1/x86/xa1 HANGUL JUNGSEONG ARAEA-I /xe1/x86/xa2 HANGUL JUNGSEONG SSANGARAEA + /xe1/x86/xa3 HANGUL JUNGSEONG A-EU + /xe1/x86/xa4 HANGUL JUNGSEONG YA-U + /xe1/x86/xa5 HANGUL JUNGSEONG YEO-YA + /xe1/x86/xa6 HANGUL JUNGSEONG O-YA + /xe1/x86/xa7 HANGUL JUNGSEONG O-YAE /xe1/x86/xa8 HANGUL JONGSEONG KIYEOK /xe1/x86/xa9 HANGUL JONGSEONG SSANGKIYEOK /xe1/x86/xaa HANGUL JONGSEONG KIYEOK-SIOS @@ -3676,6 +3821,12 @@ CHARMAP /xe1/x87/xb7 HANGUL JONGSEONG HIEUH-MIEUM /xe1/x87/xb8 HANGUL JONGSEONG HIEUH-PIEUP /xe1/x87/xb9 HANGUL JONGSEONG YEORINHIEUH + /xe1/x87/xba HANGUL JONGSEONG KIYEOK-NIEUN + /xe1/x87/xbb HANGUL JONGSEONG KIYEOK-PIEUP + /xe1/x87/xbc HANGUL JONGSEONG KIYEOK-CHIEUCH + /xe1/x87/xbd HANGUL JONGSEONG KIYEOK-KHIEUKH + /xe1/x87/xbe HANGUL JONGSEONG KIYEOK-HIEUH + /xe1/x87/xbf HANGUL JONGSEONG SSANGNIEUN /xe1/x88/x80 ETHIOPIC SYLLABLE HA /xe1/x88/x81 ETHIOPIC SYLLABLE HU /xe1/x88/x82 ETHIOPIC SYLLABLE HI @@ -4002,6 +4153,8 @@ CHARMAP /xe1/x8d/x98 ETHIOPIC SYLLABLE RYA /xe1/x8d/x99 ETHIOPIC SYLLABLE MYA /xe1/x8d/x9a ETHIOPIC SYLLABLE FYA + /xe1/x8d/x9d ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK + /xe1/x8d/x9e ETHIOPIC COMBINING VOWEL LENGTH MARK /xe1/x8d/x9f ETHIOPIC COMBINING GEMINATION MARK /xe1/x8d/xa0 ETHIOPIC SECTION MARK /xe1/x8d/xa1 ETHIOPIC WORDSPACE @@ -4143,6 +4296,7 @@ CHARMAP /xe1/x8f/xb2 CHEROKEE LETTER YO /xe1/x8f/xb3 CHEROKEE LETTER YU /xe1/x8f/xb4 CHEROKEE LETTER YV + /xe1/x90/x80 CANADIAN SYLLABICS HYPHEN /xe1/x90/x81 CANADIAN SYLLABICS E /xe1/x90/x82 CANADIAN SYLLABICS AAI /xe1/x90/x83 CANADIAN SYLLABICS I @@ -4773,6 +4927,15 @@ CHARMAP /xe1/x99/xb4 CANADIAN SYLLABICS NNGOO /xe1/x99/xb5 CANADIAN SYLLABICS NNGA /xe1/x99/xb6 CANADIAN SYLLABICS NNGAA + /xe1/x99/xb7 CANADIAN SYLLABICS WOODS-CREE THWEE + /xe1/x99/xb8 CANADIAN SYLLABICS WOODS-CREE THWI + /xe1/x99/xb9 CANADIAN SYLLABICS WOODS-CREE THWII + /xe1/x99/xba CANADIAN SYLLABICS WOODS-CREE THWO + /xe1/x99/xbb CANADIAN SYLLABICS WOODS-CREE THWOO + /xe1/x99/xbc CANADIAN SYLLABICS WOODS-CREE THWA + /xe1/x99/xbd CANADIAN SYLLABICS WOODS-CREE THWAA + /xe1/x99/xbe CANADIAN SYLLABICS WOODS-CREE FINAL TH + /xe1/x99/xbf CANADIAN SYLLABICS BLACKFOOT W /xe1/x9a/x80 OGHAM SPACE MARK /xe1/x9a/x81 OGHAM LETTER BEITH /xe1/x9a/x82 OGHAM LETTER LUIS @@ -5234,6 +5397,76 @@ CHARMAP /xe1/xa2/xa8 MONGOLIAN LETTER MANCHU ALI GALI BHA /xe1/xa2/xa9 MONGOLIAN LETTER ALI GALI DAGALGA /xe1/xa2/xaa MONGOLIAN LETTER MANCHU ALI GALI LHA + /xe1/xa2/xb0 CANADIAN SYLLABICS OY + /xe1/xa2/xb1 CANADIAN SYLLABICS AY + /xe1/xa2/xb2 CANADIAN SYLLABICS AAY + /xe1/xa2/xb3 CANADIAN SYLLABICS WAY + /xe1/xa2/xb4 CANADIAN SYLLABICS POY + /xe1/xa2/xb5 CANADIAN SYLLABICS PAY + /xe1/xa2/xb6 CANADIAN SYLLABICS PWOY + /xe1/xa2/xb7 CANADIAN SYLLABICS TAY + /xe1/xa2/xb8 CANADIAN SYLLABICS KAY + /xe1/xa2/xb9 CANADIAN SYLLABICS KWAY + /xe1/xa2/xba CANADIAN SYLLABICS MAY + /xe1/xa2/xbb CANADIAN SYLLABICS NOY + /xe1/xa2/xbc CANADIAN SYLLABICS NAY + /xe1/xa2/xbd CANADIAN SYLLABICS LAY + /xe1/xa2/xbe CANADIAN SYLLABICS SOY + /xe1/xa2/xbf CANADIAN SYLLABICS SAY + /xe1/xa3/x80 CANADIAN SYLLABICS SHOY + /xe1/xa3/x81 CANADIAN SYLLABICS SHAY + /xe1/xa3/x82 CANADIAN SYLLABICS SHWOY + /xe1/xa3/x83 CANADIAN SYLLABICS YOY + /xe1/xa3/x84 CANADIAN SYLLABICS YAY + /xe1/xa3/x85 CANADIAN SYLLABICS RAY + /xe1/xa3/x86 CANADIAN SYLLABICS NWI + /xe1/xa3/x87 CANADIAN SYLLABICS OJIBWAY NWI + /xe1/xa3/x88 CANADIAN SYLLABICS NWII + /xe1/xa3/x89 CANADIAN SYLLABICS OJIBWAY NWII + /xe1/xa3/x8a CANADIAN SYLLABICS NWO + /xe1/xa3/x8b CANADIAN SYLLABICS OJIBWAY NWO + /xe1/xa3/x8c CANADIAN SYLLABICS NWOO + /xe1/xa3/x8d CANADIAN SYLLABICS OJIBWAY NWOO + /xe1/xa3/x8e CANADIAN SYLLABICS RWEE + /xe1/xa3/x8f CANADIAN SYLLABICS RWI + /xe1/xa3/x90 CANADIAN SYLLABICS RWII + /xe1/xa3/x91 CANADIAN SYLLABICS RWO + /xe1/xa3/x92 CANADIAN SYLLABICS RWOO + /xe1/xa3/x93 CANADIAN SYLLABICS RWA + /xe1/xa3/x94 CANADIAN SYLLABICS OJIBWAY P + /xe1/xa3/x95 CANADIAN SYLLABICS OJIBWAY T + /xe1/xa3/x96 CANADIAN SYLLABICS OJIBWAY K + /xe1/xa3/x97 CANADIAN SYLLABICS OJIBWAY C + /xe1/xa3/x98 CANADIAN SYLLABICS OJIBWAY M + /xe1/xa3/x99 CANADIAN SYLLABICS OJIBWAY N + /xe1/xa3/x9a CANADIAN SYLLABICS OJIBWAY S + /xe1/xa3/x9b CANADIAN SYLLABICS OJIBWAY SH + /xe1/xa3/x9c CANADIAN SYLLABICS EASTERN W + /xe1/xa3/x9d CANADIAN SYLLABICS WESTERN W + /xe1/xa3/x9e CANADIAN SYLLABICS FINAL SMALL RING + /xe1/xa3/x9f CANADIAN SYLLABICS FINAL RAISED DOT + /xe1/xa3/xa0 CANADIAN SYLLABICS R-CREE RWE + /xe1/xa3/xa1 CANADIAN SYLLABICS WEST-CREE LOO + /xe1/xa3/xa2 CANADIAN SYLLABICS WEST-CREE LAA + /xe1/xa3/xa3 CANADIAN SYLLABICS THWE + /xe1/xa3/xa4 CANADIAN SYLLABICS THWA + /xe1/xa3/xa5 CANADIAN SYLLABICS TTHWE + /xe1/xa3/xa6 CANADIAN SYLLABICS TTHOO + /xe1/xa3/xa7 CANADIAN SYLLABICS TTHAA + /xe1/xa3/xa8 CANADIAN SYLLABICS TLHWE + /xe1/xa3/xa9 CANADIAN SYLLABICS TLHOO + /xe1/xa3/xaa CANADIAN SYLLABICS SAYISI SHWE + /xe1/xa3/xab CANADIAN SYLLABICS SAYISI SHOO + /xe1/xa3/xac CANADIAN SYLLABICS SAYISI HOO + /xe1/xa3/xad CANADIAN SYLLABICS CARRIER GWU + /xe1/xa3/xae CANADIAN SYLLABICS CARRIER DENE GEE + /xe1/xa3/xaf CANADIAN SYLLABICS CARRIER GAA + /xe1/xa3/xb0 CANADIAN SYLLABICS CARRIER GWA + /xe1/xa3/xb1 CANADIAN SYLLABICS SAYISI JUU + /xe1/xa3/xb2 CANADIAN SYLLABICS CARRIER JWA + /xe1/xa3/xb3 CANADIAN SYLLABICS BEAVER DENE L + /xe1/xa3/xb4 CANADIAN SYLLABICS BEAVER DENE R + /xe1/xa3/xb5 CANADIAN SYLLABICS CARRIER DENTAL S /xe1/xa4/x80 LIMBU VOWEL-CARRIER LETTER /xe1/xa4/x81 LIMBU LETTER KA /xe1/xa4/x82 LIMBU LETTER KHA @@ -5377,6 +5610,8 @@ CHARMAP /xe1/xa6/xa7 NEW TAI LUE LETTER HIGH XVA /xe1/xa6/xa8 NEW TAI LUE LETTER LOW KVA /xe1/xa6/xa9 NEW TAI LUE LETTER LOW XVA + /xe1/xa6/xaa NEW TAI LUE LETTER HIGH SUA + /xe1/xa6/xab NEW TAI LUE LETTER LOW SUA /xe1/xa6/xb0 NEW TAI LUE VOWEL SIGN VOWEL SHORTENER /xe1/xa6/xb1 NEW TAI LUE VOWEL SIGN AA /xe1/xa6/xb2 NEW TAI LUE VOWEL SIGN II @@ -5413,6 +5648,7 @@ CHARMAP /xe1/xa7/x97 NEW TAI LUE DIGIT SEVEN /xe1/xa7/x98 NEW TAI LUE DIGIT EIGHT /xe1/xa7/x99 NEW TAI LUE DIGIT NINE + /xe1/xa7/x9a NEW TAI LUE THAM DIGIT ONE /xe1/xa7/x9e NEW TAI LUE SIGN LAE /xe1/xa7/x9f NEW TAI LUE SIGN LAEV /xe1/xa7/xa0 KHMER SYMBOL PATHAMASAT @@ -5477,6 +5713,133 @@ CHARMAP /xe1/xa8/x9b BUGINESE VOWEL SIGN AE /xe1/xa8/x9e BUGINESE PALLAWA /xe1/xa8/x9f BUGINESE END OF SECTION + /xe1/xa8/xa0 TAI THAM LETTER HIGH KA + /xe1/xa8/xa1 TAI THAM LETTER HIGH KHA + /xe1/xa8/xa2 TAI THAM LETTER HIGH KXA + /xe1/xa8/xa3 TAI THAM LETTER LOW KA + /xe1/xa8/xa4 TAI THAM LETTER LOW KXA + /xe1/xa8/xa5 TAI THAM LETTER LOW KHA + /xe1/xa8/xa6 TAI THAM LETTER NGA + /xe1/xa8/xa7 TAI THAM LETTER HIGH CA + /xe1/xa8/xa8 TAI THAM LETTER HIGH CHA + /xe1/xa8/xa9 TAI THAM LETTER LOW CA + /xe1/xa8/xaa TAI THAM LETTER LOW SA + /xe1/xa8/xab TAI THAM LETTER LOW CHA + /xe1/xa8/xac TAI THAM LETTER NYA + /xe1/xa8/xad TAI THAM LETTER RATA + /xe1/xa8/xae TAI THAM LETTER HIGH RATHA + /xe1/xa8/xaf TAI THAM LETTER DA + /xe1/xa8/xb0 TAI THAM LETTER LOW RATHA + /xe1/xa8/xb1 TAI THAM LETTER RANA + /xe1/xa8/xb2 TAI THAM LETTER HIGH TA + /xe1/xa8/xb3 TAI THAM LETTER HIGH THA + /xe1/xa8/xb4 TAI THAM LETTER LOW TA + /xe1/xa8/xb5 TAI THAM LETTER LOW THA + /xe1/xa8/xb6 TAI THAM LETTER NA + /xe1/xa8/xb7 TAI THAM LETTER BA + /xe1/xa8/xb8 TAI THAM LETTER HIGH PA + /xe1/xa8/xb9 TAI THAM LETTER HIGH PHA + /xe1/xa8/xba TAI THAM LETTER HIGH FA + /xe1/xa8/xbb TAI THAM LETTER LOW PA + /xe1/xa8/xbc TAI THAM LETTER LOW FA + /xe1/xa8/xbd TAI THAM LETTER LOW PHA + /xe1/xa8/xbe TAI THAM LETTER MA + /xe1/xa8/xbf TAI THAM LETTER LOW YA + /xe1/xa9/x80 TAI THAM LETTER HIGH YA + /xe1/xa9/x81 TAI THAM LETTER RA + /xe1/xa9/x82 TAI THAM LETTER RUE + /xe1/xa9/x83 TAI THAM LETTER LA + /xe1/xa9/x84 TAI THAM LETTER LUE + /xe1/xa9/x85 TAI THAM LETTER WA + /xe1/xa9/x86 TAI THAM LETTER HIGH SHA + /xe1/xa9/x87 TAI THAM LETTER HIGH SSA + /xe1/xa9/x88 TAI THAM LETTER HIGH SA + /xe1/xa9/x89 TAI THAM LETTER HIGH HA + /xe1/xa9/x8a TAI THAM LETTER LLA + /xe1/xa9/x8b TAI THAM LETTER A + /xe1/xa9/x8c TAI THAM LETTER LOW HA + /xe1/xa9/x8d TAI THAM LETTER I + /xe1/xa9/x8e TAI THAM LETTER II + /xe1/xa9/x8f TAI THAM LETTER U + /xe1/xa9/x90 TAI THAM LETTER UU + /xe1/xa9/x91 TAI THAM LETTER EE + /xe1/xa9/x92 TAI THAM LETTER OO + /xe1/xa9/x93 TAI THAM LETTER LAE + /xe1/xa9/x94 TAI THAM LETTER GREAT SA + /xe1/xa9/x95 TAI THAM CONSONANT SIGN MEDIAL RA + /xe1/xa9/x96 TAI THAM CONSONANT SIGN MEDIAL LA + /xe1/xa9/x97 TAI THAM CONSONANT SIGN LA TANG LAI + /xe1/xa9/x98 TAI THAM SIGN MAI KANG LAI + /xe1/xa9/x99 TAI THAM CONSONANT SIGN FINAL NGA + /xe1/xa9/x9a TAI THAM CONSONANT SIGN LOW PA + /xe1/xa9/x9b TAI THAM CONSONANT SIGN HIGH RATHA OR LOW PA + /xe1/xa9/x9c TAI THAM CONSONANT SIGN MA + /xe1/xa9/x9d TAI THAM CONSONANT SIGN BA + /xe1/xa9/x9e TAI THAM CONSONANT SIGN SA + /xe1/xa9/xa0 TAI THAM SIGN SAKOT + /xe1/xa9/xa1 TAI THAM VOWEL SIGN A + /xe1/xa9/xa2 TAI THAM VOWEL SIGN MAI SAT + /xe1/xa9/xa3 TAI THAM VOWEL SIGN AA + /xe1/xa9/xa4 TAI THAM VOWEL SIGN TALL AA + /xe1/xa9/xa5 TAI THAM VOWEL SIGN I + /xe1/xa9/xa6 TAI THAM VOWEL SIGN II + /xe1/xa9/xa7 TAI THAM VOWEL SIGN UE + /xe1/xa9/xa8 TAI THAM VOWEL SIGN UUE + /xe1/xa9/xa9 TAI THAM VOWEL SIGN U + /xe1/xa9/xaa TAI THAM VOWEL SIGN UU + /xe1/xa9/xab TAI THAM VOWEL SIGN O + /xe1/xa9/xac TAI THAM VOWEL SIGN OA BELOW + /xe1/xa9/xad TAI THAM VOWEL SIGN OY + /xe1/xa9/xae TAI THAM VOWEL SIGN E + /xe1/xa9/xaf TAI THAM VOWEL SIGN AE + /xe1/xa9/xb0 TAI THAM VOWEL SIGN OO + /xe1/xa9/xb1 TAI THAM VOWEL SIGN AI + /xe1/xa9/xb2 TAI THAM VOWEL SIGN THAM AI + /xe1/xa9/xb3 TAI THAM VOWEL SIGN OA ABOVE + /xe1/xa9/xb4 TAI THAM SIGN MAI KANG + /xe1/xa9/xb5 TAI THAM SIGN TONE-1 + /xe1/xa9/xb6 TAI THAM SIGN TONE-2 + /xe1/xa9/xb7 TAI THAM SIGN KHUEN TONE-3 + /xe1/xa9/xb8 TAI THAM SIGN KHUEN TONE-4 + /xe1/xa9/xb9 TAI THAM SIGN KHUEN TONE-5 + /xe1/xa9/xba TAI THAM SIGN RA HAAM + /xe1/xa9/xbb TAI THAM SIGN MAI SAM + /xe1/xa9/xbc TAI THAM SIGN KHUEN-LUE KARAN + /xe1/xa9/xbf TAI THAM COMBINING CRYPTOGRAMMIC DOT + /xe1/xaa/x80 TAI THAM HORA DIGIT ZERO + /xe1/xaa/x81 TAI THAM HORA DIGIT ONE + /xe1/xaa/x82 TAI THAM HORA DIGIT TWO + /xe1/xaa/x83 TAI THAM HORA DIGIT THREE + /xe1/xaa/x84 TAI THAM HORA DIGIT FOUR + /xe1/xaa/x85 TAI THAM HORA DIGIT FIVE + /xe1/xaa/x86 TAI THAM HORA DIGIT SIX + /xe1/xaa/x87 TAI THAM HORA DIGIT SEVEN + /xe1/xaa/x88 TAI THAM HORA DIGIT EIGHT + /xe1/xaa/x89 TAI THAM HORA DIGIT NINE + /xe1/xaa/x90 TAI THAM THAM DIGIT ZERO + /xe1/xaa/x91 TAI THAM THAM DIGIT ONE + /xe1/xaa/x92 TAI THAM THAM DIGIT TWO + /xe1/xaa/x93 TAI THAM THAM DIGIT THREE + /xe1/xaa/x94 TAI THAM THAM DIGIT FOUR + /xe1/xaa/x95 TAI THAM THAM DIGIT FIVE + /xe1/xaa/x96 TAI THAM THAM DIGIT SIX + /xe1/xaa/x97 TAI THAM THAM DIGIT SEVEN + /xe1/xaa/x98 TAI THAM THAM DIGIT EIGHT + /xe1/xaa/x99 TAI THAM THAM DIGIT NINE + /xe1/xaa/xa0 TAI THAM SIGN WIANG + /xe1/xaa/xa1 TAI THAM SIGN WIANGWAAK + /xe1/xaa/xa2 TAI THAM SIGN SAWAN + /xe1/xaa/xa3 TAI THAM SIGN KEOW + /xe1/xaa/xa4 TAI THAM SIGN HOY + /xe1/xaa/xa5 TAI THAM SIGN DOKMAI + /xe1/xaa/xa6 TAI THAM SIGN REVERSED ROTATED RANA + /xe1/xaa/xa7 TAI THAM SIGN MAI YAMOK + /xe1/xaa/xa8 TAI THAM SIGN KAAN + /xe1/xaa/xa9 TAI THAM SIGN KAANKUU + /xe1/xaa/xaa TAI THAM SIGN SATKAAN + /xe1/xaa/xab TAI THAM SIGN SATKAANKUU + /xe1/xaa/xac TAI THAM SIGN HANG + /xe1/xaa/xad TAI THAM SIGN CAANG /xe1/xac/x80 BALINESE SIGN ULU RICEM /xe1/xac/x81 BALINESE SIGN ULU CANDRA /xe1/xac/x82 BALINESE SIGN CECEK @@ -5653,6 +6016,62 @@ CHARMAP /xe1/xae/xb7 SUNDANESE DIGIT SEVEN /xe1/xae/xb8 SUNDANESE DIGIT EIGHT /xe1/xae/xb9 SUNDANESE DIGIT NINE + /xe1/xaf/x80 BATAK LETTER A + /xe1/xaf/x81 BATAK LETTER SIMALUNGUN A + /xe1/xaf/x82 BATAK LETTER HA + /xe1/xaf/x83 BATAK LETTER SIMALUNGUN HA + /xe1/xaf/x84 BATAK LETTER MANDAILING HA + /xe1/xaf/x85 BATAK LETTER BA + /xe1/xaf/x86 BATAK LETTER KARO BA + /xe1/xaf/x87 BATAK LETTER PA + /xe1/xaf/x88 BATAK LETTER SIMALUNGUN PA + /xe1/xaf/x89 BATAK LETTER NA + /xe1/xaf/x8a BATAK LETTER MANDAILING NA + /xe1/xaf/x8b BATAK LETTER WA + /xe1/xaf/x8c BATAK LETTER SIMALUNGUN WA + /xe1/xaf/x8d BATAK LETTER PAKPAK WA + /xe1/xaf/x8e BATAK LETTER GA + /xe1/xaf/x8f BATAK LETTER SIMALUNGUN GA + /xe1/xaf/x90 BATAK LETTER JA + /xe1/xaf/x91 BATAK LETTER DA + /xe1/xaf/x92 BATAK LETTER RA + /xe1/xaf/x93 BATAK LETTER SIMALUNGUN RA + /xe1/xaf/x94 BATAK LETTER MA + /xe1/xaf/x95 BATAK LETTER SIMALUNGUN MA + /xe1/xaf/x96 BATAK LETTER SOUTHERN TA + /xe1/xaf/x97 BATAK LETTER NORTHERN TA + /xe1/xaf/x98 BATAK LETTER SA + /xe1/xaf/x99 BATAK LETTER SIMALUNGUN SA + /xe1/xaf/x9a BATAK LETTER MANDAILING SA + /xe1/xaf/x9b BATAK LETTER YA + /xe1/xaf/x9c BATAK LETTER SIMALUNGUN YA + /xe1/xaf/x9d BATAK LETTER NGA + /xe1/xaf/x9e BATAK LETTER LA + /xe1/xaf/x9f BATAK LETTER SIMALUNGUN LA + /xe1/xaf/xa0 BATAK LETTER NYA + /xe1/xaf/xa1 BATAK LETTER CA + /xe1/xaf/xa2 BATAK LETTER NDA + /xe1/xaf/xa3 BATAK LETTER MBA + /xe1/xaf/xa4 BATAK LETTER I + /xe1/xaf/xa5 BATAK LETTER U + /xe1/xaf/xa6 BATAK SIGN TOMPI + /xe1/xaf/xa7 BATAK VOWEL SIGN E + /xe1/xaf/xa8 BATAK VOWEL SIGN PAKPAK E + /xe1/xaf/xa9 BATAK VOWEL SIGN EE + /xe1/xaf/xaa BATAK VOWEL SIGN I + /xe1/xaf/xab BATAK VOWEL SIGN KARO I + /xe1/xaf/xac BATAK VOWEL SIGN O + /xe1/xaf/xad BATAK VOWEL SIGN KARO O + /xe1/xaf/xae BATAK VOWEL SIGN U + /xe1/xaf/xaf BATAK VOWEL SIGN U FOR SIMALUNGUN SA + /xe1/xaf/xb0 BATAK CONSONANT SIGN NG + /xe1/xaf/xb1 BATAK CONSONANT SIGN H + /xe1/xaf/xb2 BATAK PANGOLAT + /xe1/xaf/xb3 BATAK PANONGONAN + /xe1/xaf/xbc BATAK SYMBOL BINDU NA METEK + /xe1/xaf/xbd BATAK SYMBOL BINDU PINARBORAS + /xe1/xaf/xbe BATAK SYMBOL BINDU JUDUL + /xe1/xaf/xbf BATAK SYMBOL BINDU PANGOLAT /xe1/xb0/x80 LEPCHA LETTER KA /xe1/xb0/x81 LEPCHA LETTER KLA /xe1/xb0/x82 LEPCHA LETTER KHA @@ -5775,6 +6194,41 @@ CHARMAP /xe1/xb1/xbd OL CHIKI AHAD /xe1/xb1/xbe OL CHIKI PUNCTUATION MUCAAD /xe1/xb1/xbf OL CHIKI PUNCTUATION DOUBLE MUCAAD + /xe1/xb3/x90 VEDIC TONE KARSHANA + /xe1/xb3/x91 VEDIC TONE SHARA + /xe1/xb3/x92 VEDIC TONE PRENKHA + /xe1/xb3/x93 VEDIC SIGN NIHSHVASA + /xe1/xb3/x94 VEDIC SIGN YAJURVEDIC MIDLINE SVARITA + /xe1/xb3/x95 VEDIC TONE YAJURVEDIC AGGRAVATED INDEPENDENT SVARITA + /xe1/xb3/x96 VEDIC TONE YAJURVEDIC INDEPENDENT SVARITA + /xe1/xb3/x97 VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA + /xe1/xb3/x98 VEDIC TONE CANDRA BELOW + /xe1/xb3/x99 VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA SCHROEDER + /xe1/xb3/x9a VEDIC TONE DOUBLE SVARITA + /xe1/xb3/x9b VEDIC TONE TRIPLE SVARITA + /xe1/xb3/x9c VEDIC TONE KATHAKA ANUDATTA + /xe1/xb3/x9d VEDIC TONE DOT BELOW + /xe1/xb3/x9e VEDIC TONE TWO DOTS BELOW + /xe1/xb3/x9f VEDIC TONE THREE DOTS BELOW + /xe1/xb3/xa0 VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA + /xe1/xb3/xa1 VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA + /xe1/xb3/xa2 VEDIC SIGN VISARGA SVARITA + /xe1/xb3/xa3 VEDIC SIGN VISARGA UDATTA + /xe1/xb3/xa4 VEDIC SIGN REVERSED VISARGA UDATTA + /xe1/xb3/xa5 VEDIC SIGN VISARGA ANUDATTA + /xe1/xb3/xa6 VEDIC SIGN REVERSED VISARGA ANUDATTA + /xe1/xb3/xa7 VEDIC SIGN VISARGA UDATTA WITH TAIL + /xe1/xb3/xa8 VEDIC SIGN VISARGA ANUDATTA WITH TAIL + /xe1/xb3/xa9 VEDIC SIGN ANUSVARA ANTARGOMUKHA + /xe1/xb3/xaa VEDIC SIGN ANUSVARA BAHIRGOMUKHA + /xe1/xb3/xab VEDIC SIGN ANUSVARA VAMAGOMUKHA + /xe1/xb3/xac VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL + /xe1/xb3/xad VEDIC SIGN TIRYAK + /xe1/xb3/xae VEDIC SIGN HEXIFORM LONG ANUSVARA + /xe1/xb3/xaf VEDIC SIGN LONG ANUSVARA + /xe1/xb3/xb0 VEDIC SIGN RTHANG LONG ANUSVARA + /xe1/xb3/xb1 VEDIC SIGN ANUSVARA UBHAYATO MUKHA + /xe1/xb3/xb2 VEDIC SIGN ARDHAVISARGA /xe1/xb4/x80 LATIN LETTER SMALL CAPITAL A /xe1/xb4/x81 LATIN LETTER SMALL CAPITAL AE /xe1/xb4/x82 LATIN SMALL LETTER TURNED AE @@ -6006,6 +6460,8 @@ CHARMAP /xe1/xb7/xa4 COMBINING LATIN SMALL LETTER S /xe1/xb7/xa5 COMBINING LATIN SMALL LETTER LONG S /xe1/xb7/xa6 COMBINING LATIN SMALL LETTER Z + /xe1/xb7/xbc COMBINING DOUBLE INVERTED BREVE BELOW + /xe1/xb7/xbd COMBINING ALMOST EQUAL TO BELOW /xe1/xb7/xbe COMBINING LEFT ARROWHEAD ABOVE /xe1/xb7/xbf COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW /xe1/xb8/x80 LATIN CAPITAL LETTER A WITH RING BELOW @@ -6638,6 +7094,14 @@ CHARMAP /xe2/x82/x92 LATIN SUBSCRIPT SMALL LETTER O /xe2/x82/x93 LATIN SUBSCRIPT SMALL LETTER X /xe2/x82/x94 LATIN SUBSCRIPT SMALL LETTER SCHWA + /xe2/x82/x95 LATIN SUBSCRIPT SMALL LETTER H + /xe2/x82/x96 LATIN SUBSCRIPT SMALL LETTER K + /xe2/x82/x97 LATIN SUBSCRIPT SMALL LETTER L + /xe2/x82/x98 LATIN SUBSCRIPT SMALL LETTER M + /xe2/x82/x99 LATIN SUBSCRIPT SMALL LETTER N + /xe2/x82/x9a LATIN SUBSCRIPT SMALL LETTER P + /xe2/x82/x9b LATIN SUBSCRIPT SMALL LETTER S + /xe2/x82/x9c LATIN SUBSCRIPT SMALL LETTER T /xe2/x82/xa0 EURO-CURRENCY SIGN /xe2/x82/xa1 COLON SIGN /xe2/x82/xa2 CRUZEIRO SIGN @@ -6660,6 +7124,10 @@ CHARMAP /xe2/x82/xb3 AUSTRAL SIGN /xe2/x82/xb4 HRYVNIA SIGN /xe2/x82/xb5 CEDI SIGN + /xe2/x82/xb6 LIVRE TOURNOIS SIGN + /xe2/x82/xb7 SPESMILO SIGN + /xe2/x82/xb8 TENGE SIGN + /xe2/x82/xb9 INDIAN RUPEE SIGN /xe2/x83/x90 COMBINING LEFT HARPOON ABOVE /xe2/x83/x91 COMBINING RIGHT HARPOON ABOVE /xe2/x83/x92 COMBINING LONG VERTICAL LINE OVERLAY @@ -6773,6 +7241,9 @@ CHARMAP /xe2/x85/x8d AKTIESELSKAB /xe2/x85/x8e TURNED SMALL F /xe2/x85/x8f SYMBOL FOR SAMARITAN SOURCE + /xe2/x85/x90 VULGAR FRACTION ONE SEVENTH + /xe2/x85/x91 VULGAR FRACTION ONE NINTH + /xe2/x85/x92 VULGAR FRACTION ONE TENTH /xe2/x85/x93 VULGAR FRACTION ONE THIRD /xe2/x85/x94 VULGAR FRACTION TWO THIRDS /xe2/x85/x95 VULGAR FRACTION ONE FIFTH @@ -6827,6 +7298,7 @@ CHARMAP /xe2/x86/x86 ROMAN NUMERAL FIFTY EARLY FORM /xe2/x86/x87 ROMAN NUMERAL FIFTY THOUSAND /xe2/x86/x88 ROMAN NUMERAL ONE HUNDRED THOUSAND + /xe2/x86/x89 VULGAR FRACTION ZERO THIRDS /xe2/x86/x90 LEFTWARDS ARROW /xe2/x86/x91 UPWARDS ARROW /xe2/x86/x92 RIGHTWARDS ARROW @@ -7427,6 +7899,18 @@ CHARMAP /xe2/x8f/xa5 FLATNESS /xe2/x8f/xa6 AC CURRENT /xe2/x8f/xa7 ELECTRICAL INTERSECTION + /xe2/x8f/xa8 DECIMAL EXPONENT SYMBOL + /xe2/x8f/xa9 BLACK RIGHT-POINTING DOUBLE TRIANGLE + /xe2/x8f/xaa BLACK LEFT-POINTING DOUBLE TRIANGLE + /xe2/x8f/xab BLACK UP-POINTING DOUBLE TRIANGLE + /xe2/x8f/xac BLACK DOWN-POINTING DOUBLE TRIANGLE + /xe2/x8f/xad BLACK RIGHT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR + /xe2/x8f/xae BLACK LEFT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR + /xe2/x8f/xaf BLACK RIGHT-POINTING TRIANGLE WITH DOUBLE VERTICAL BAR + /xe2/x8f/xb0 ALARM CLOCK + /xe2/x8f/xb1 STOPWATCH + /xe2/x8f/xb2 TIMER CLOCK + /xe2/x8f/xb3 HOURGLASS WITH FLOWING SAND /xe2/x90/x80 SYMBOL FOR NULL /xe2/x90/x81 SYMBOL FOR START OF HEADING /xe2/x90/x82 SYMBOL FOR START OF TEXT @@ -8051,6 +8535,8 @@ CHARMAP /xe2/x9a/x9b ATOM SYMBOL /xe2/x9a/x9c FLEUR-DE-LIS /xe2/x9a/x9d OUTLINED WHITE STAR + /xe2/x9a/x9e THREE LINES CONVERGING RIGHT + /xe2/x9a/x9f THREE LINES CONVERGING LEFT /xe2/x9a/xa0 WARNING SIGN /xe2/x9a/xa1 HIGH VOLTAGE SIGN /xe2/x9a/xa2 DOUBLED FEMALE SIGN @@ -8080,18 +8566,84 @@ CHARMAP /xe2/x9a/xba SEMISEXTILE /xe2/x9a/xbb QUINCUNX /xe2/x9a/xbc SESQUIQUADRATE + /xe2/x9a/xbd SOCCER BALL + /xe2/x9a/xbe BASEBALL + /xe2/x9a/xbf SQUARED KEY /xe2/x9b/x80 WHITE DRAUGHTS MAN /xe2/x9b/x81 WHITE DRAUGHTS KING /xe2/x9b/x82 BLACK DRAUGHTS MAN /xe2/x9b/x83 BLACK DRAUGHTS KING + /xe2/x9b/x84 SNOWMAN WITHOUT SNOW + /xe2/x9b/x85 SUN BEHIND CLOUD + /xe2/x9b/x86 RAIN + /xe2/x9b/x87 BLACK SNOWMAN + /xe2/x9b/x88 THUNDER CLOUD AND RAIN + /xe2/x9b/x89 TURNED WHITE SHOGI PIECE + /xe2/x9b/x8a TURNED BLACK SHOGI PIECE + /xe2/x9b/x8b WHITE DIAMOND IN SQUARE + /xe2/x9b/x8c CROSSING LANES + /xe2/x9b/x8d DISABLED CAR + /xe2/x9b/x8e OPHIUCHUS + /xe2/x9b/x8f PICK + /xe2/x9b/x90 CAR SLIDING + /xe2/x9b/x91 HELMET WITH WHITE CROSS + /xe2/x9b/x92 CIRCLED CROSSING LANES + /xe2/x9b/x93 CHAINS + /xe2/x9b/x94 NO ENTRY + /xe2/x9b/x95 ALTERNATE ONE-WAY LEFT WAY TRAFFIC + /xe2/x9b/x96 BLACK TWO-WAY LEFT WAY TRAFFIC + /xe2/x9b/x97 WHITE TWO-WAY LEFT WAY TRAFFIC + /xe2/x9b/x98 BLACK LEFT LANE MERGE + /xe2/x9b/x99 WHITE LEFT LANE MERGE + /xe2/x9b/x9a DRIVE SLOW SIGN + /xe2/x9b/x9b HEAVY WHITE DOWN-POINTING TRIANGLE + /xe2/x9b/x9c LEFT CLOSED ENTRY + /xe2/x9b/x9d SQUARED SALTIRE + /xe2/x9b/x9e FALLING DIAGONAL IN WHITE CIRCLE IN BLACK SQUARE + /xe2/x9b/x9f BLACK TRUCK + /xe2/x9b/xa0 RESTRICTED LEFT ENTRY-1 + /xe2/x9b/xa1 RESTRICTED LEFT ENTRY-2 + /xe2/x9b/xa2 ASTRONOMICAL SYMBOL FOR URANUS + /xe2/x9b/xa3 HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE + /xe2/x9b/xa4 PENTAGRAM + /xe2/x9b/xa5 RIGHT-HANDED INTERLACED PENTAGRAM + /xe2/x9b/xa6 LEFT-HANDED INTERLACED PENTAGRAM + /xe2/x9b/xa7 INVERTED PENTAGRAM + /xe2/x9b/xa8 BLACK CROSS ON SHIELD + /xe2/x9b/xa9 SHINTO SHRINE + /xe2/x9b/xaa CHURCH + /xe2/x9b/xab CASTLE + /xe2/x9b/xac HISTORIC SITE + /xe2/x9b/xad GEAR WITHOUT HUB + /xe2/x9b/xae GEAR WITH HANDLES + /xe2/x9b/xaf MAP SYMBOL FOR LIGHTHOUSE + /xe2/x9b/xb0 MOUNTAIN + /xe2/x9b/xb1 UMBRELLA ON GROUND + /xe2/x9b/xb2 FOUNTAIN + /xe2/x9b/xb3 FLAG IN HOLE + /xe2/x9b/xb4 FERRY + /xe2/x9b/xb5 SAILBOAT + /xe2/x9b/xb6 SQUARE FOUR CORNERS + /xe2/x9b/xb7 SKIER + /xe2/x9b/xb8 ICE SKATE + /xe2/x9b/xb9 PERSON WITH BALL + /xe2/x9b/xba TENT + /xe2/x9b/xbb JAPANESE BANK SYMBOL + /xe2/x9b/xbc HEADSTONE GRAVEYARD SYMBOL + /xe2/x9b/xbd FUEL PUMP + /xe2/x9b/xbe CUP ON BLACK SQUARE + /xe2/x9b/xbf WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE /xe2/x9c/x81 UPPER BLADE SCISSORS /xe2/x9c/x82 BLACK SCISSORS /xe2/x9c/x83 LOWER BLADE SCISSORS /xe2/x9c/x84 WHITE SCISSORS + /xe2/x9c/x85 WHITE HEAVY CHECK MARK /xe2/x9c/x86 TELEPHONE LOCATION SIGN /xe2/x9c/x87 TAPE DRIVE /xe2/x9c/x88 AIRPLANE /xe2/x9c/x89 ENVELOPE + /xe2/x9c/x8a RAISED FIST + /xe2/x9c/x8b RAISED HAND /xe2/x9c/x8c VICTORY HAND /xe2/x9c/x8d WRITING HAND /xe2/x9c/x8e LOWER RIGHT PENCIL @@ -8120,6 +8672,7 @@ CHARMAP /xe2/x9c/xa5 FOUR CLUB-SPOKED ASTERISK /xe2/x9c/xa6 BLACK FOUR POINTED STAR /xe2/x9c/xa7 WHITE FOUR POINTED STAR + /xe2/x9c/xa8 SPARKLES /xe2/x9c/xa9 STRESS OUTLINED WHITE STAR /xe2/x9c/xaa CIRCLED WHITE STAR /xe2/x9c/xab OPEN CENTRE BLACK STAR @@ -8155,12 +8708,18 @@ CHARMAP /xe2/x9d/x89 BALLOON-SPOKED ASTERISK /xe2/x9d/x8a EIGHT TEARDROP-SPOKED PROPELLER ASTERISK /xe2/x9d/x8b HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK + /xe2/x9d/x8c CROSS MARK /xe2/x9d/x8d SHADOWED WHITE CIRCLE + /xe2/x9d/x8e NEGATIVE SQUARED CROSS MARK /xe2/x9d/x8f LOWER RIGHT DROP-SHADOWED WHITE SQUARE /xe2/x9d/x90 UPPER RIGHT DROP-SHADOWED WHITE SQUARE /xe2/x9d/x91 LOWER RIGHT SHADOWED WHITE SQUARE /xe2/x9d/x92 UPPER RIGHT SHADOWED WHITE SQUARE + /xe2/x9d/x93 BLACK QUESTION MARK ORNAMENT + /xe2/x9d/x94 WHITE QUESTION MARK ORNAMENT + /xe2/x9d/x95 WHITE EXCLAMATION MARK ORNAMENT /xe2/x9d/x96 BLACK DIAMOND MINUS WHITE X + /xe2/x9d/x97 HEAVY EXCLAMATION MARK SYMBOL /xe2/x9d/x98 LIGHT VERTICAL BAR /xe2/x9d/x99 MEDIUM VERTICAL BAR /xe2/x9d/x9a HEAVY VERTICAL BAR @@ -8168,6 +8727,8 @@ CHARMAP /xe2/x9d/x9c HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT /xe2/x9d/x9d HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT /xe2/x9d/x9e HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT + /xe2/x9d/x9f HEAVY LOW SINGLE COMMA QUOTATION MARK ORNAMENT + /xe2/x9d/xa0 HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT /xe2/x9d/xa1 CURVED STEM PARAGRAPH SIGN ORNAMENT /xe2/x9d/xa2 HEAVY EXCLAMATION MARK ORNAMENT /xe2/x9d/xa3 HEAVY HEART EXCLAMATION MARK ORNAMENT @@ -8220,6 +8781,9 @@ CHARMAP /xe2/x9e/x92 DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE /xe2/x9e/x93 DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN /xe2/x9e/x94 HEAVY WIDE-HEADED RIGHTWARDS ARROW + /xe2/x9e/x95 HEAVY PLUS SIGN + /xe2/x9e/x96 HEAVY MINUS SIGN + /xe2/x9e/x97 HEAVY DIVISION SIGN /xe2/x9e/x98 HEAVY SOUTH EAST ARROW /xe2/x9e/x99 HEAVY RIGHTWARDS ARROW /xe2/x9e/x9a HEAVY NORTH EAST ARROW @@ -8244,6 +8808,7 @@ CHARMAP /xe2/x9e/xad HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW /xe2/x9e/xae HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW /xe2/x9e/xaf NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW + /xe2/x9e/xb0 CURLY LOOP /xe2/x9e/xb1 NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW /xe2/x9e/xb2 CIRCLED HEAVY WHITE RIGHTWARDS ARROW /xe2/x9e/xb3 WHITE-FEATHERED RIGHTWARDS ARROW @@ -8258,6 +8823,7 @@ CHARMAP /xe2/x9e/xbc WEDGE-TAILED RIGHTWARDS ARROW /xe2/x9e/xbd HEAVY WEDGE-TAILED RIGHTWARDS ARROW /xe2/x9e/xbe OPEN-OUTLINED RIGHTWARDS ARROW + /xe2/x9e/xbf DOUBLE CURLY LOOP /xe2/x9f/x80 THREE DIMENSIONAL ANGLE /xe2/x9f/x81 WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE /xe2/x9f/x82 PERPENDICULAR @@ -8270,6 +8836,8 @@ CHARMAP /xe2/x9f/x89 SUPERSET PRECEDING SOLIDUS /xe2/x9f/x8a VERTICAL BAR WITH HORIZONTAL STROKE /xe2/x9f/x8c LONG DIVISION + /xe2/x9f/x8e SQUARED LOGICAL AND + /xe2/x9f/x8f SQUARED LOGICAL OR /xe2/x9f/x90 WHITE DIAMOND WITH CENTRED DOT /xe2/x9f/x91 AND WITH DOT /xe2/x9f/x92 ELEMENT OF OPENING UPWARDS @@ -9168,6 +9736,11 @@ CHARMAP /xe2/xad/x92 WHITE SMALL STAR /xe2/xad/x93 BLACK RIGHT-POINTING PENTAGON /xe2/xad/x94 WHITE RIGHT-POINTING PENTAGON + /xe2/xad/x95 HEAVY LARGE CIRCLE + /xe2/xad/x96 HEAVY OVAL WITH OVAL INSIDE + /xe2/xad/x97 HEAVY CIRCLE WITH CIRCLE INSIDE + /xe2/xad/x98 HEAVY CIRCLE + /xe2/xad/x99 HEAVY CIRCLED SALTIRE /xe2/xb0/x80 GLAGOLITIC CAPITAL LETTER AZU /xe2/xb0/x81 GLAGOLITIC CAPITAL LETTER BUKY /xe2/xb0/x82 GLAGOLITIC CAPITAL LETTER VEDE @@ -9278,6 +9851,7 @@ CHARMAP /xe2/xb1/xad LATIN CAPITAL LETTER ALPHA /xe2/xb1/xae LATIN CAPITAL LETTER M WITH HOOK /xe2/xb1/xaf LATIN CAPITAL LETTER TURNED A + /xe2/xb1/xb0 LATIN CAPITAL LETTER TURNED ALPHA /xe2/xb1/xb1 LATIN SMALL LETTER V WITH RIGHT HOOK /xe2/xb1/xb2 LATIN CAPITAL LETTER W WITH HOOK /xe2/xb1/xb3 LATIN SMALL LETTER W WITH HOOK @@ -9291,6 +9865,8 @@ CHARMAP /xe2/xb1/xbb LATIN LETTER SMALL CAPITAL TURNED E /xe2/xb1/xbc LATIN SUBSCRIPT SMALL LETTER J /xe2/xb1/xbd MODIFIER LETTER CAPITAL V + /xe2/xb1/xbe LATIN CAPITAL LETTER S WITH SWASH TAIL + /xe2/xb1/xbf LATIN CAPITAL LETTER Z WITH SWASH TAIL /xe2/xb2/x80 COPTIC CAPITAL LETTER ALFA /xe2/xb2/x81 COPTIC SMALL LETTER ALFA /xe2/xb2/x82 COPTIC CAPITAL LETTER VIDA @@ -9398,6 +9974,13 @@ CHARMAP /xe2/xb3/xa8 COPTIC SYMBOL TAU RO /xe2/xb3/xa9 COPTIC SYMBOL KHI RO /xe2/xb3/xaa COPTIC SYMBOL SHIMA SIMA + /xe2/xb3/xab COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI + /xe2/xb3/xac COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI + /xe2/xb3/xad COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA + /xe2/xb3/xae COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA + /xe2/xb3/xaf COPTIC COMBINING NI ABOVE + /xe2/xb3/xb0 COPTIC COMBINING SPIRITUS ASPER + /xe2/xb3/xb1 COPTIC COMBINING SPIRITUS LENIS /xe2/xb3/xb9 COPTIC OLD NUBIAN FULL STOP /xe2/xb3/xba COPTIC OLD NUBIAN DIRECT QUESTION MARK /xe2/xb3/xbb COPTIC OLD NUBIAN INDIRECT QUESTION MARK @@ -9498,6 +10081,8 @@ CHARMAP /xe2/xb5/xa4 TIFINAGH LETTER TAWELLEMET YAZ /xe2/xb5/xa5 TIFINAGH LETTER YAZZ /xe2/xb5/xaf TIFINAGH MODIFIER LETTER LABIALIZATION MARK + /xe2/xb5/xb0 TIFINAGH SEPARATOR MARK + /xe2/xb5/xbf TIFINAGH CONSONANT JOINER /xe2/xb6/x80 ETHIOPIC SYLLABLE LOA /xe2/xb6/x81 ETHIOPIC SYLLABLE MOA /xe2/xb6/x82 ETHIOPIC SYLLABLE ROA @@ -9658,6 +10243,7 @@ CHARMAP /xe2/xb8/xae REVERSED QUESTION MARK /xe2/xb8/xaf VERTICAL TILDE /xe2/xb8/xb0 RING POINT + /xe2/xb8/xb1 WORD SEPARATOR MIDDLE DOT /xe2/xba/x80 CJK RADICAL REPEAT /xe2/xba/x81 CJK RADICAL CLIFF /xe2/xba/x82 CJK RADICAL SECOND ONE @@ -10427,6 +11013,9 @@ CHARMAP /xe3/x86/xb5 BOPOMOFO FINAL LETTER T /xe3/x86/xb6 BOPOMOFO FINAL LETTER K /xe3/x86/xb7 BOPOMOFO FINAL LETTER H + /xe3/x86/xb8 BOPOMOFO LETTER GH + /xe3/x86/xb9 BOPOMOFO LETTER LH + /xe3/x86/xba BOPOMOFO LETTER ZY /xe3/x87/x80 CJK STROKE T /xe3/x87/x81 CJK STROKE WG /xe3/x87/x82 CJK STROKE XG @@ -10546,6 +11135,18 @@ CHARMAP /xe3/x89/x81 PARENTHESIZED IDEOGRAPH REST /xe3/x89/x82 PARENTHESIZED IDEOGRAPH SELF /xe3/x89/x83 PARENTHESIZED IDEOGRAPH REACH + /xe3/x89/x84 CIRCLED IDEOGRAPH QUESTION + /xe3/x89/x85 CIRCLED IDEOGRAPH KINDERGARTEN + /xe3/x89/x86 CIRCLED IDEOGRAPH SCHOOL + /xe3/x89/x87 CIRCLED IDEOGRAPH KOTO + /xe3/x89/x88 CIRCLED NUMBER TEN ON BLACK SQUARE + /xe3/x89/x89 CIRCLED NUMBER TWENTY ON BLACK SQUARE + /xe3/x89/x8a CIRCLED NUMBER THIRTY ON BLACK SQUARE + /xe3/x89/x8b CIRCLED NUMBER FORTY ON BLACK SQUARE + /xe3/x89/x8c CIRCLED NUMBER FIFTY ON BLACK SQUARE + /xe3/x89/x8d CIRCLED NUMBER SIXTY ON BLACK SQUARE + /xe3/x89/x8e CIRCLED NUMBER SEVENTY ON BLACK SQUARE + /xe3/x89/x8f CIRCLED NUMBER EIGHTY ON BLACK SQUARE /xe3/x89/x90 PARTNERSHIP SIGN /xe3/x89/x91 CIRCLED NUMBER TWENTY ONE /xe3/x89/x92 CIRCLED NUMBER TWENTY TWO @@ -12691,6 +13292,54 @@ CHARMAP /xea/x93/x84 YI RADICAL ZZIET /xea/x93/x85 YI RADICAL NBIE /xea/x93/x86 YI RADICAL KE + /xea/x93/x90 LISU LETTER BA + /xea/x93/x91 LISU LETTER PA + /xea/x93/x92 LISU LETTER PHA + /xea/x93/x93 LISU LETTER DA + /xea/x93/x94 LISU LETTER TA + /xea/x93/x95 LISU LETTER THA + /xea/x93/x96 LISU LETTER GA + /xea/x93/x97 LISU LETTER KA + /xea/x93/x98 LISU LETTER KHA + /xea/x93/x99 LISU LETTER JA + /xea/x93/x9a LISU LETTER CA + /xea/x93/x9b LISU LETTER CHA + /xea/x93/x9c LISU LETTER DZA + /xea/x93/x9d LISU LETTER TSA + /xea/x93/x9e LISU LETTER TSHA + /xea/x93/x9f LISU LETTER MA + /xea/x93/xa0 LISU LETTER NA + /xea/x93/xa1 LISU LETTER LA + /xea/x93/xa2 LISU LETTER SA + /xea/x93/xa3 LISU LETTER ZHA + /xea/x93/xa4 LISU LETTER ZA + /xea/x93/xa5 LISU LETTER NGA + /xea/x93/xa6 LISU LETTER HA + /xea/x93/xa7 LISU LETTER XA + /xea/x93/xa8 LISU LETTER HHA + /xea/x93/xa9 LISU LETTER FA + /xea/x93/xaa LISU LETTER WA + /xea/x93/xab LISU LETTER SHA + /xea/x93/xac LISU LETTER YA + /xea/x93/xad LISU LETTER GHA + /xea/x93/xae LISU LETTER A + /xea/x93/xaf LISU LETTER AE + /xea/x93/xb0 LISU LETTER E + /xea/x93/xb1 LISU LETTER EU + /xea/x93/xb2 LISU LETTER I + /xea/x93/xb3 LISU LETTER O + /xea/x93/xb4 LISU LETTER U + /xea/x93/xb5 LISU LETTER UE + /xea/x93/xb6 LISU LETTER UH + /xea/x93/xb7 LISU LETTER OE + /xea/x93/xb8 LISU LETTER TONE MYA TI + /xea/x93/xb9 LISU LETTER TONE NA PO + /xea/x93/xba LISU LETTER TONE MYA CYA + /xea/x93/xbb LISU LETTER TONE MYA BO + /xea/x93/xbc LISU LETTER TONE MYA NA + /xea/x93/xbd LISU LETTER TONE MYA JEU + /xea/x93/xbe LISU PUNCTUATION COMMA + /xea/x93/xbf LISU PUNCTUATION FULL STOP /xea/x94/x80 VAI SYLLABLE EE /xea/x94/x81 VAI SYLLABLE EEN /xea/x94/x82 VAI SYLLABLE HEE @@ -13023,6 +13672,8 @@ CHARMAP /xea/x99/x9d CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS /xea/x99/x9e CYRILLIC CAPITAL LETTER YN /xea/x99/x9f CYRILLIC SMALL LETTER YN + /xea/x99/xa0 CYRILLIC CAPITAL LETTER REVERSED TSE + /xea/x99/xa1 CYRILLIC SMALL LETTER REVERSED TSE /xea/x99/xa2 CYRILLIC CAPITAL LETTER SOFT DE /xea/x99/xa3 CYRILLIC SMALL LETTER SOFT DE /xea/x99/xa4 CYRILLIC CAPITAL LETTER SOFT EL @@ -13069,6 +13720,94 @@ CHARMAP /xea/x9a/x95 CYRILLIC SMALL LETTER HWE /xea/x9a/x96 CYRILLIC CAPITAL LETTER SHWE /xea/x9a/x97 CYRILLIC SMALL LETTER SHWE + /xea/x9a/xa0 BAMUM LETTER A + /xea/x9a/xa1 BAMUM LETTER KA + /xea/x9a/xa2 BAMUM LETTER U + /xea/x9a/xa3 BAMUM LETTER KU + /xea/x9a/xa4 BAMUM LETTER EE + /xea/x9a/xa5 BAMUM LETTER REE + /xea/x9a/xa6 BAMUM LETTER TAE + /xea/x9a/xa7 BAMUM LETTER O + /xea/x9a/xa8 BAMUM LETTER NYI + /xea/x9a/xa9 BAMUM LETTER I + /xea/x9a/xaa BAMUM LETTER LA + /xea/x9a/xab BAMUM LETTER PA + /xea/x9a/xac BAMUM LETTER RII + /xea/x9a/xad BAMUM LETTER RIEE + /xea/x9a/xae BAMUM LETTER LEEEE + /xea/x9a/xaf BAMUM LETTER MEEEE + /xea/x9a/xb0 BAMUM LETTER TAA + /xea/x9a/xb1 BAMUM LETTER NDAA + /xea/x9a/xb2 BAMUM LETTER NJAEM + /xea/x9a/xb3 BAMUM LETTER M + /xea/x9a/xb4 BAMUM LETTER SUU + /xea/x9a/xb5 BAMUM LETTER MU + /xea/x9a/xb6 BAMUM LETTER SHII + /xea/x9a/xb7 BAMUM LETTER SI + /xea/x9a/xb8 BAMUM LETTER SHEUX + /xea/x9a/xb9 BAMUM LETTER SEUX + /xea/x9a/xba BAMUM LETTER KYEE + /xea/x9a/xbb BAMUM LETTER KET + /xea/x9a/xbc BAMUM LETTER NUAE + /xea/x9a/xbd BAMUM LETTER NU + /xea/x9a/xbe BAMUM LETTER NJUAE + /xea/x9a/xbf BAMUM LETTER YOQ + /xea/x9b/x80 BAMUM LETTER SHU + /xea/x9b/x81 BAMUM LETTER YUQ + /xea/x9b/x82 BAMUM LETTER YA + /xea/x9b/x83 BAMUM LETTER NSHA + /xea/x9b/x84 BAMUM LETTER KEUX + /xea/x9b/x85 BAMUM LETTER PEUX + /xea/x9b/x86 BAMUM LETTER NJEE + /xea/x9b/x87 BAMUM LETTER NTEE + /xea/x9b/x88 BAMUM LETTER PUE + /xea/x9b/x89 BAMUM LETTER WUE + /xea/x9b/x8a BAMUM LETTER PEE + /xea/x9b/x8b BAMUM LETTER FEE + /xea/x9b/x8c BAMUM LETTER RU + /xea/x9b/x8d BAMUM LETTER LU + /xea/x9b/x8e BAMUM LETTER MI + /xea/x9b/x8f BAMUM LETTER NI + /xea/x9b/x90 BAMUM LETTER REUX + /xea/x9b/x91 BAMUM LETTER RAE + /xea/x9b/x92 BAMUM LETTER KEN + /xea/x9b/x93 BAMUM LETTER NGKWAEN + /xea/x9b/x94 BAMUM LETTER NGGA + /xea/x9b/x95 BAMUM LETTER NGA + /xea/x9b/x96 BAMUM LETTER SHO + /xea/x9b/x97 BAMUM LETTER PUAE + /xea/x9b/x98 BAMUM LETTER FU + /xea/x9b/x99 BAMUM LETTER FOM + /xea/x9b/x9a BAMUM LETTER WA + /xea/x9b/x9b BAMUM LETTER NA + /xea/x9b/x9c BAMUM LETTER LI + /xea/x9b/x9d BAMUM LETTER PI + /xea/x9b/x9e BAMUM LETTER LOQ + /xea/x9b/x9f BAMUM LETTER KO + /xea/x9b/xa0 BAMUM LETTER MBEN + /xea/x9b/xa1 BAMUM LETTER REN + /xea/x9b/xa2 BAMUM LETTER MEN + /xea/x9b/xa3 BAMUM LETTER MA + /xea/x9b/xa4 BAMUM LETTER TI + /xea/x9b/xa5 BAMUM LETTER KI + /xea/x9b/xa6 BAMUM LETTER MO + /xea/x9b/xa7 BAMUM LETTER MBAA + /xea/x9b/xa8 BAMUM LETTER TET + /xea/x9b/xa9 BAMUM LETTER KPA + /xea/x9b/xaa BAMUM LETTER TEN + /xea/x9b/xab BAMUM LETTER NTUU + /xea/x9b/xac BAMUM LETTER SAMBA + /xea/x9b/xad BAMUM LETTER FAAMAE + /xea/x9b/xae BAMUM LETTER KOVUU + /xea/x9b/xaf BAMUM LETTER KOGHOM + /xea/x9b/xb0 BAMUM COMBINING MARK KOQNDON + /xea/x9b/xb1 BAMUM COMBINING MARK TUKWENTIS + /xea/x9b/xb2 BAMUM NJAEMLI + /xea/x9b/xb3 BAMUM FULL STOP + /xea/x9b/xb4 BAMUM COLON + /xea/x9b/xb5 BAMUM COMMA + /xea/x9b/xb6 BAMUM SEMICOLON + /xea/x9b/xb7 BAMUM QUESTION MARK /xea/x9c/x80 MODIFIER LETTER CHINESE TONE YIN PING /xea/x9c/x81 MODIFIER LETTER CHINESE TONE YANG PING /xea/x9c/x82 MODIFIER LETTER CHINESE TONE YIN SHANG @@ -13210,6 +13949,21 @@ CHARMAP /xea/x9e/x8a MODIFIER LETTER SHORT EQUALS SIGN /xea/x9e/x8b LATIN CAPITAL LETTER SALTILLO /xea/x9e/x8c LATIN SMALL LETTER SALTILLO + /xea/x9e/x8d LATIN CAPITAL LETTER TURNED H + /xea/x9e/x8e LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT + /xea/x9e/x90 LATIN CAPITAL LETTER N WITH DESCENDER + /xea/x9e/x91 LATIN SMALL LETTER N WITH DESCENDER + /xea/x9e/xa0 LATIN CAPITAL LETTER G WITH OBLIQUE STROKE + /xea/x9e/xa1 LATIN SMALL LETTER G WITH OBLIQUE STROKE + /xea/x9e/xa2 LATIN CAPITAL LETTER K WITH OBLIQUE STROKE + /xea/x9e/xa3 LATIN SMALL LETTER K WITH OBLIQUE STROKE + /xea/x9e/xa4 LATIN CAPITAL LETTER N WITH OBLIQUE STROKE + /xea/x9e/xa5 LATIN SMALL LETTER N WITH OBLIQUE STROKE + /xea/x9e/xa6 LATIN CAPITAL LETTER R WITH OBLIQUE STROKE + /xea/x9e/xa7 LATIN SMALL LETTER R WITH OBLIQUE STROKE + /xea/x9e/xa8 LATIN CAPITAL LETTER S WITH OBLIQUE STROKE + /xea/x9e/xa9 LATIN SMALL LETTER S WITH OBLIQUE STROKE + /xea/x9f/xba LATIN LETTER SMALL CAPITAL TURNED M /xea/x9f/xbb LATIN EPIGRAPHIC LETTER REVERSED F /xea/x9f/xbc LATIN EPIGRAPHIC LETTER REVERSED P /xea/x9f/xbd LATIN EPIGRAPHIC LETTER INVERTED M @@ -13259,6 +14013,16 @@ CHARMAP /xea/xa0/xa9 SYLOTI NAGRI POETRY MARK-2 /xea/xa0/xaa SYLOTI NAGRI POETRY MARK-3 /xea/xa0/xab SYLOTI NAGRI POETRY MARK-4 + /xea/xa0/xb0 NORTH INDIC FRACTION ONE QUARTER + /xea/xa0/xb1 NORTH INDIC FRACTION ONE HALF + /xea/xa0/xb2 NORTH INDIC FRACTION THREE QUARTERS + /xea/xa0/xb3 NORTH INDIC FRACTION ONE SIXTEENTH + /xea/xa0/xb4 NORTH INDIC FRACTION ONE EIGHTH + /xea/xa0/xb5 NORTH INDIC FRACTION THREE SIXTEENTHS + /xea/xa0/xb6 NORTH INDIC QUARTER MARK + /xea/xa0/xb7 NORTH INDIC PLACEHOLDER MARK + /xea/xa0/xb8 NORTH INDIC RUPEE MARK + /xea/xa0/xb9 NORTH INDIC QUANTITY MARK /xea/xa1/x80 PHAGS-PA LETTER KA /xea/xa1/x81 PHAGS-PA LETTER KHA /xea/xa1/x82 PHAGS-PA LETTER GA @@ -13396,6 +14160,34 @@ CHARMAP /xea/xa3/x97 SAURASHTRA DIGIT SEVEN /xea/xa3/x98 SAURASHTRA DIGIT EIGHT /xea/xa3/x99 SAURASHTRA DIGIT NINE + /xea/xa3/xa0 COMBINING DEVANAGARI DIGIT ZERO + /xea/xa3/xa1 COMBINING DEVANAGARI DIGIT ONE + /xea/xa3/xa2 COMBINING DEVANAGARI DIGIT TWO + /xea/xa3/xa3 COMBINING DEVANAGARI DIGIT THREE + /xea/xa3/xa4 COMBINING DEVANAGARI DIGIT FOUR + /xea/xa3/xa5 COMBINING DEVANAGARI DIGIT FIVE + /xea/xa3/xa6 COMBINING DEVANAGARI DIGIT SIX + /xea/xa3/xa7 COMBINING DEVANAGARI DIGIT SEVEN + /xea/xa3/xa8 COMBINING DEVANAGARI DIGIT EIGHT + /xea/xa3/xa9 COMBINING DEVANAGARI DIGIT NINE + /xea/xa3/xaa COMBINING DEVANAGARI LETTER A + /xea/xa3/xab COMBINING DEVANAGARI LETTER U + /xea/xa3/xac COMBINING DEVANAGARI LETTER KA + /xea/xa3/xad COMBINING DEVANAGARI LETTER NA + /xea/xa3/xae COMBINING DEVANAGARI LETTER PA + /xea/xa3/xaf COMBINING DEVANAGARI LETTER RA + /xea/xa3/xb0 COMBINING DEVANAGARI LETTER VI + /xea/xa3/xb1 COMBINING DEVANAGARI SIGN AVAGRAHA + /xea/xa3/xb2 DEVANAGARI SIGN SPACING CANDRABINDU + /xea/xa3/xb3 DEVANAGARI SIGN CANDRABINDU VIRAMA + /xea/xa3/xb4 DEVANAGARI SIGN DOUBLE CANDRABINDU VIRAMA + /xea/xa3/xb5 DEVANAGARI SIGN CANDRABINDU TWO + /xea/xa3/xb6 DEVANAGARI SIGN CANDRABINDU THREE + /xea/xa3/xb7 DEVANAGARI SIGN CANDRABINDU AVAGRAHA + /xea/xa3/xb8 DEVANAGARI SIGN PUSHPIKA + /xea/xa3/xb9 DEVANAGARI GAP FILLER + /xea/xa3/xba DEVANAGARI CARET + /xea/xa3/xbb DEVANAGARI HEADSTROKE /xea/xa4/x80 KAYAH LI DIGIT ZERO /xea/xa4/x81 KAYAH LI DIGIT ONE /xea/xa4/x82 KAYAH LI DIGIT TWO @@ -13481,6 +14273,126 @@ CHARMAP /xea/xa5/x92 REJANG CONSONANT SIGN H /xea/xa5/x93 REJANG VIRAMA /xea/xa5/x9f REJANG SECTION MARK + /xea/xa5/xa0 HANGUL CHOSEONG TIKEUT-MIEUM + /xea/xa5/xa1 HANGUL CHOSEONG TIKEUT-PIEUP + /xea/xa5/xa2 HANGUL CHOSEONG TIKEUT-SIOS + /xea/xa5/xa3 HANGUL CHOSEONG TIKEUT-CIEUC + /xea/xa5/xa4 HANGUL CHOSEONG RIEUL-KIYEOK + /xea/xa5/xa5 HANGUL CHOSEONG RIEUL-SSANGKIYEOK + /xea/xa5/xa6 HANGUL CHOSEONG RIEUL-TIKEUT + /xea/xa5/xa7 HANGUL CHOSEONG RIEUL-SSANGTIKEUT + /xea/xa5/xa8 HANGUL CHOSEONG RIEUL-MIEUM + /xea/xa5/xa9 HANGUL CHOSEONG RIEUL-PIEUP + /xea/xa5/xaa HANGUL CHOSEONG RIEUL-SSANGPIEUP + /xea/xa5/xab HANGUL CHOSEONG RIEUL-KAPYEOUNPIEUP + /xea/xa5/xac HANGUL CHOSEONG RIEUL-SIOS + /xea/xa5/xad HANGUL CHOSEONG RIEUL-CIEUC + /xea/xa5/xae HANGUL CHOSEONG RIEUL-KHIEUKH + /xea/xa5/xaf HANGUL CHOSEONG MIEUM-KIYEOK + /xea/xa5/xb0 HANGUL CHOSEONG MIEUM-TIKEUT + /xea/xa5/xb1 HANGUL CHOSEONG MIEUM-SIOS + /xea/xa5/xb2 HANGUL CHOSEONG PIEUP-SIOS-THIEUTH + /xea/xa5/xb3 HANGUL CHOSEONG PIEUP-KHIEUKH + /xea/xa5/xb4 HANGUL CHOSEONG PIEUP-HIEUH + /xea/xa5/xb5 HANGUL CHOSEONG SSANGSIOS-PIEUP + /xea/xa5/xb6 HANGUL CHOSEONG IEUNG-RIEUL + /xea/xa5/xb7 HANGUL CHOSEONG IEUNG-HIEUH + /xea/xa5/xb8 HANGUL CHOSEONG SSANGCIEUC-HIEUH + /xea/xa5/xb9 HANGUL CHOSEONG SSANGTHIEUTH + /xea/xa5/xba HANGUL CHOSEONG PHIEUPH-HIEUH + /xea/xa5/xbb HANGUL CHOSEONG HIEUH-SIOS + /xea/xa5/xbc HANGUL CHOSEONG SSANGYEORINHIEUH + /xea/xa6/x80 JAVANESE SIGN PANYANGGA + /xea/xa6/x81 JAVANESE SIGN CECAK + /xea/xa6/x82 JAVANESE SIGN LAYAR + /xea/xa6/x83 JAVANESE SIGN WIGNYAN + /xea/xa6/x84 JAVANESE LETTER A + /xea/xa6/x85 JAVANESE LETTER I KAWI + /xea/xa6/x86 JAVANESE LETTER I + /xea/xa6/x87 JAVANESE LETTER II + /xea/xa6/x88 JAVANESE LETTER U + /xea/xa6/x89 JAVANESE LETTER PA CEREK + /xea/xa6/x8a JAVANESE LETTER NGA LELET + /xea/xa6/x8b JAVANESE LETTER NGA LELET RASWADI + /xea/xa6/x8c JAVANESE LETTER E + /xea/xa6/x8d JAVANESE LETTER AI + /xea/xa6/x8e JAVANESE LETTER O + /xea/xa6/x8f JAVANESE LETTER KA + /xea/xa6/x90 JAVANESE LETTER KA SASAK + /xea/xa6/x91 JAVANESE LETTER KA MURDA + /xea/xa6/x92 JAVANESE LETTER GA + /xea/xa6/x93 JAVANESE LETTER GA MURDA + /xea/xa6/x94 JAVANESE LETTER NGA + /xea/xa6/x95 JAVANESE LETTER CA + /xea/xa6/x96 JAVANESE LETTER CA MURDA + /xea/xa6/x97 JAVANESE LETTER JA + /xea/xa6/x98 JAVANESE LETTER NYA MURDA + /xea/xa6/x99 JAVANESE LETTER JA MAHAPRANA + /xea/xa6/x9a JAVANESE LETTER NYA + /xea/xa6/x9b JAVANESE LETTER TTA + /xea/xa6/x9c JAVANESE LETTER TTA MAHAPRANA + /xea/xa6/x9d JAVANESE LETTER DDA + /xea/xa6/x9e JAVANESE LETTER DDA MAHAPRANA + /xea/xa6/x9f JAVANESE LETTER NA MURDA + /xea/xa6/xa0 JAVANESE LETTER TA + /xea/xa6/xa1 JAVANESE LETTER TA MURDA + /xea/xa6/xa2 JAVANESE LETTER DA + /xea/xa6/xa3 JAVANESE LETTER DA MAHAPRANA + /xea/xa6/xa4 JAVANESE LETTER NA + /xea/xa6/xa5 JAVANESE LETTER PA + /xea/xa6/xa6 JAVANESE LETTER PA MURDA + /xea/xa6/xa7 JAVANESE LETTER BA + /xea/xa6/xa8 JAVANESE LETTER BA MURDA + /xea/xa6/xa9 JAVANESE LETTER MA + /xea/xa6/xaa JAVANESE LETTER YA + /xea/xa6/xab JAVANESE LETTER RA + /xea/xa6/xac JAVANESE LETTER RA AGUNG + /xea/xa6/xad JAVANESE LETTER LA + /xea/xa6/xae JAVANESE LETTER WA + /xea/xa6/xaf JAVANESE LETTER SA MURDA + /xea/xa6/xb0 JAVANESE LETTER SA MAHAPRANA + /xea/xa6/xb1 JAVANESE LETTER SA + /xea/xa6/xb2 JAVANESE LETTER HA + /xea/xa6/xb3 JAVANESE SIGN CECAK TELU + /xea/xa6/xb4 JAVANESE VOWEL SIGN TARUNG + /xea/xa6/xb5 JAVANESE VOWEL SIGN TOLONG + /xea/xa6/xb6 JAVANESE VOWEL SIGN WULU + /xea/xa6/xb7 JAVANESE VOWEL SIGN WULU MELIK + /xea/xa6/xb8 JAVANESE VOWEL SIGN SUKU + /xea/xa6/xb9 JAVANESE VOWEL SIGN SUKU MENDUT + /xea/xa6/xba JAVANESE VOWEL SIGN TALING + /xea/xa6/xbb JAVANESE VOWEL SIGN DIRGA MURE + /xea/xa6/xbc JAVANESE VOWEL SIGN PEPET + /xea/xa6/xbd JAVANESE CONSONANT SIGN KERET + /xea/xa6/xbe JAVANESE CONSONANT SIGN PENGKAL + /xea/xa6/xbf JAVANESE CONSONANT SIGN CAKRA + /xea/xa7/x80 JAVANESE PANGKON + /xea/xa7/x81 JAVANESE LEFT RERENGGAN + /xea/xa7/x82 JAVANESE RIGHT RERENGGAN + /xea/xa7/x83 JAVANESE PADA ANDAP + /xea/xa7/x84 JAVANESE PADA MADYA + /xea/xa7/x85 JAVANESE PADA LUHUR + /xea/xa7/x86 JAVANESE PADA WINDU + /xea/xa7/x87 JAVANESE PADA PANGKAT + /xea/xa7/x88 JAVANESE PADA LINGSA + /xea/xa7/x89 JAVANESE PADA LUNGSI + /xea/xa7/x8a JAVANESE PADA ADEG + /xea/xa7/x8b JAVANESE PADA ADEG ADEG + /xea/xa7/x8c JAVANESE PADA PISELEH + /xea/xa7/x8d JAVANESE TURNED PADA PISELEH + /xea/xa7/x8f JAVANESE PANGRANGKEP + /xea/xa7/x90 JAVANESE DIGIT ZERO + /xea/xa7/x91 JAVANESE DIGIT ONE + /xea/xa7/x92 JAVANESE DIGIT TWO + /xea/xa7/x93 JAVANESE DIGIT THREE + /xea/xa7/x94 JAVANESE DIGIT FOUR + /xea/xa7/x95 JAVANESE DIGIT FIVE + /xea/xa7/x96 JAVANESE DIGIT SIX + /xea/xa7/x97 JAVANESE DIGIT SEVEN + /xea/xa7/x98 JAVANESE DIGIT EIGHT + /xea/xa7/x99 JAVANESE DIGIT NINE + /xea/xa7/x9e JAVANESE PADA TIRTA TUMETES + /xea/xa7/x9f JAVANESE PADA ISEN-ISEN /xea/xa8/x80 CHAM LETTER A /xea/xa8/x81 CHAM LETTER I /xea/xa8/x82 CHAM LETTER U @@ -13564,6 +14476,194 @@ CHARMAP /xea/xa9/x9d CHAM PUNCTUATION DANDA /xea/xa9/x9e CHAM PUNCTUATION DOUBLE DANDA /xea/xa9/x9f CHAM PUNCTUATION TRIPLE DANDA + /xea/xa9/xa0 MYANMAR LETTER KHAMTI GA + /xea/xa9/xa1 MYANMAR LETTER KHAMTI CA + /xea/xa9/xa2 MYANMAR LETTER KHAMTI CHA + /xea/xa9/xa3 MYANMAR LETTER KHAMTI JA + /xea/xa9/xa4 MYANMAR LETTER KHAMTI JHA + /xea/xa9/xa5 MYANMAR LETTER KHAMTI NYA + /xea/xa9/xa6 MYANMAR LETTER KHAMTI TTA + /xea/xa9/xa7 MYANMAR LETTER KHAMTI TTHA + /xea/xa9/xa8 MYANMAR LETTER KHAMTI DDA + /xea/xa9/xa9 MYANMAR LETTER KHAMTI DDHA + /xea/xa9/xaa MYANMAR LETTER KHAMTI DHA + /xea/xa9/xab MYANMAR LETTER KHAMTI NA + /xea/xa9/xac MYANMAR LETTER KHAMTI SA + /xea/xa9/xad MYANMAR LETTER KHAMTI HA + /xea/xa9/xae MYANMAR LETTER KHAMTI HHA + /xea/xa9/xaf MYANMAR LETTER KHAMTI FA + /xea/xa9/xb0 MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION + /xea/xa9/xb1 MYANMAR LETTER KHAMTI XA + /xea/xa9/xb2 MYANMAR LETTER KHAMTI ZA + /xea/xa9/xb3 MYANMAR LETTER KHAMTI RA + /xea/xa9/xb4 MYANMAR LOGOGRAM KHAMTI OAY + /xea/xa9/xb5 MYANMAR LOGOGRAM KHAMTI QN + /xea/xa9/xb6 MYANMAR LOGOGRAM KHAMTI HM + /xea/xa9/xb7 MYANMAR SYMBOL AITON EXCLAMATION + /xea/xa9/xb8 MYANMAR SYMBOL AITON ONE + /xea/xa9/xb9 MYANMAR SYMBOL AITON TWO + /xea/xa9/xba MYANMAR LETTER AITON RA + /xea/xa9/xbb MYANMAR SIGN PAO KAREN TONE + /xea/xaa/x80 TAI VIET LETTER LOW KO + /xea/xaa/x81 TAI VIET LETTER HIGH KO + /xea/xaa/x82 TAI VIET LETTER LOW KHO + /xea/xaa/x83 TAI VIET LETTER HIGH KHO + /xea/xaa/x84 TAI VIET LETTER LOW KHHO + /xea/xaa/x85 TAI VIET LETTER HIGH KHHO + /xea/xaa/x86 TAI VIET LETTER LOW GO + /xea/xaa/x87 TAI VIET LETTER HIGH GO + /xea/xaa/x88 TAI VIET LETTER LOW NGO + /xea/xaa/x89 TAI VIET LETTER HIGH NGO + /xea/xaa/x8a TAI VIET LETTER LOW CO + /xea/xaa/x8b TAI VIET LETTER HIGH CO + /xea/xaa/x8c TAI VIET LETTER LOW CHO + /xea/xaa/x8d TAI VIET LETTER HIGH CHO + /xea/xaa/x8e TAI VIET LETTER LOW SO + /xea/xaa/x8f TAI VIET LETTER HIGH SO + /xea/xaa/x90 TAI VIET LETTER LOW NYO + /xea/xaa/x91 TAI VIET LETTER HIGH NYO + /xea/xaa/x92 TAI VIET LETTER LOW DO + /xea/xaa/x93 TAI VIET LETTER HIGH DO + /xea/xaa/x94 TAI VIET LETTER LOW TO + /xea/xaa/x95 TAI VIET LETTER HIGH TO + /xea/xaa/x96 TAI VIET LETTER LOW THO + /xea/xaa/x97 TAI VIET LETTER HIGH THO + /xea/xaa/x98 TAI VIET LETTER LOW NO + /xea/xaa/x99 TAI VIET LETTER HIGH NO + /xea/xaa/x9a TAI VIET LETTER LOW BO + /xea/xaa/x9b TAI VIET LETTER HIGH BO + /xea/xaa/x9c TAI VIET LETTER LOW PO + /xea/xaa/x9d TAI VIET LETTER HIGH PO + /xea/xaa/x9e TAI VIET LETTER LOW PHO + /xea/xaa/x9f TAI VIET LETTER HIGH PHO + /xea/xaa/xa0 TAI VIET LETTER LOW FO + /xea/xaa/xa1 TAI VIET LETTER HIGH FO + /xea/xaa/xa2 TAI VIET LETTER LOW MO + /xea/xaa/xa3 TAI VIET LETTER HIGH MO + /xea/xaa/xa4 TAI VIET LETTER LOW YO + /xea/xaa/xa5 TAI VIET LETTER HIGH YO + /xea/xaa/xa6 TAI VIET LETTER LOW RO + /xea/xaa/xa7 TAI VIET LETTER HIGH RO + /xea/xaa/xa8 TAI VIET LETTER LOW LO + /xea/xaa/xa9 TAI VIET LETTER HIGH LO + /xea/xaa/xaa TAI VIET LETTER LOW VO + /xea/xaa/xab TAI VIET LETTER HIGH VO + /xea/xaa/xac TAI VIET LETTER LOW HO + /xea/xaa/xad TAI VIET LETTER HIGH HO + /xea/xaa/xae TAI VIET LETTER LOW O + /xea/xaa/xaf TAI VIET LETTER HIGH O + /xea/xaa/xb0 TAI VIET MAI KANG + /xea/xaa/xb1 TAI VIET VOWEL AA + /xea/xaa/xb2 TAI VIET VOWEL I + /xea/xaa/xb3 TAI VIET VOWEL UE + /xea/xaa/xb4 TAI VIET VOWEL U + /xea/xaa/xb5 TAI VIET VOWEL E + /xea/xaa/xb6 TAI VIET VOWEL O + /xea/xaa/xb7 TAI VIET MAI KHIT + /xea/xaa/xb8 TAI VIET VOWEL IA + /xea/xaa/xb9 TAI VIET VOWEL UEA + /xea/xaa/xba TAI VIET VOWEL UA + /xea/xaa/xbb TAI VIET VOWEL AUE + /xea/xaa/xbc TAI VIET VOWEL AY + /xea/xaa/xbd TAI VIET VOWEL AN + /xea/xaa/xbe TAI VIET VOWEL AM + /xea/xaa/xbf TAI VIET TONE MAI EK + /xea/xab/x80 TAI VIET TONE MAI NUENG + /xea/xab/x81 TAI VIET TONE MAI THO + /xea/xab/x82 TAI VIET TONE MAI SONG + /xea/xab/x9b TAI VIET SYMBOL KON + /xea/xab/x9c TAI VIET SYMBOL NUENG + /xea/xab/x9d TAI VIET SYMBOL SAM + /xea/xab/x9e TAI VIET SYMBOL HO HOI + /xea/xab/x9f TAI VIET SYMBOL KOI KOI + /xea/xac/x81 ETHIOPIC SYLLABLE TTHU + /xea/xac/x82 ETHIOPIC SYLLABLE TTHI + /xea/xac/x83 ETHIOPIC SYLLABLE TTHAA + /xea/xac/x84 ETHIOPIC SYLLABLE TTHEE + /xea/xac/x85 ETHIOPIC SYLLABLE TTHE + /xea/xac/x86 ETHIOPIC SYLLABLE TTHO + /xea/xac/x89 ETHIOPIC SYLLABLE DDHU + /xea/xac/x8a ETHIOPIC SYLLABLE DDHI + /xea/xac/x8b ETHIOPIC SYLLABLE DDHAA + /xea/xac/x8c ETHIOPIC SYLLABLE DDHEE + /xea/xac/x8d ETHIOPIC SYLLABLE DDHE + /xea/xac/x8e ETHIOPIC SYLLABLE DDHO + /xea/xac/x91 ETHIOPIC SYLLABLE DZU + /xea/xac/x92 ETHIOPIC SYLLABLE DZI + /xea/xac/x93 ETHIOPIC SYLLABLE DZAA + /xea/xac/x94 ETHIOPIC SYLLABLE DZEE + /xea/xac/x95 ETHIOPIC SYLLABLE DZE + /xea/xac/x96 ETHIOPIC SYLLABLE DZO + /xea/xac/xa0 ETHIOPIC SYLLABLE CCHHA + /xea/xac/xa1 ETHIOPIC SYLLABLE CCHHU + /xea/xac/xa2 ETHIOPIC SYLLABLE CCHHI + /xea/xac/xa3 ETHIOPIC SYLLABLE CCHHAA + /xea/xac/xa4 ETHIOPIC SYLLABLE CCHHEE + /xea/xac/xa5 ETHIOPIC SYLLABLE CCHHE + /xea/xac/xa6 ETHIOPIC SYLLABLE CCHHO + /xea/xac/xa8 ETHIOPIC SYLLABLE BBA + /xea/xac/xa9 ETHIOPIC SYLLABLE BBU + /xea/xac/xaa ETHIOPIC SYLLABLE BBI + /xea/xac/xab ETHIOPIC SYLLABLE BBAA + /xea/xac/xac ETHIOPIC SYLLABLE BBEE + /xea/xac/xad ETHIOPIC SYLLABLE BBE + /xea/xac/xae ETHIOPIC SYLLABLE BBO + /xea/xaf/x80 MEETEI MAYEK LETTER KOK + /xea/xaf/x81 MEETEI MAYEK LETTER SAM + /xea/xaf/x82 MEETEI MAYEK LETTER LAI + /xea/xaf/x83 MEETEI MAYEK LETTER MIT + /xea/xaf/x84 MEETEI MAYEK LETTER PA + /xea/xaf/x85 MEETEI MAYEK LETTER NA + /xea/xaf/x86 MEETEI MAYEK LETTER CHIL + /xea/xaf/x87 MEETEI MAYEK LETTER TIL + /xea/xaf/x88 MEETEI MAYEK LETTER KHOU + /xea/xaf/x89 MEETEI MAYEK LETTER NGOU + /xea/xaf/x8a MEETEI MAYEK LETTER THOU + /xea/xaf/x8b MEETEI MAYEK LETTER WAI + /xea/xaf/x8c MEETEI MAYEK LETTER YANG + /xea/xaf/x8d MEETEI MAYEK LETTER HUK + /xea/xaf/x8e MEETEI MAYEK LETTER UN + /xea/xaf/x8f MEETEI MAYEK LETTER I + /xea/xaf/x90 MEETEI MAYEK LETTER PHAM + /xea/xaf/x91 MEETEI MAYEK LETTER ATIYA + /xea/xaf/x92 MEETEI MAYEK LETTER GOK + /xea/xaf/x93 MEETEI MAYEK LETTER JHAM + /xea/xaf/x94 MEETEI MAYEK LETTER RAI + /xea/xaf/x95 MEETEI MAYEK LETTER BA + /xea/xaf/x96 MEETEI MAYEK LETTER JIL + /xea/xaf/x97 MEETEI MAYEK LETTER DIL + /xea/xaf/x98 MEETEI MAYEK LETTER GHOU + /xea/xaf/x99 MEETEI MAYEK LETTER DHOU + /xea/xaf/x9a MEETEI MAYEK LETTER BHAM + /xea/xaf/x9b MEETEI MAYEK LETTER KOK LONSUM + /xea/xaf/x9c MEETEI MAYEK LETTER LAI LONSUM + /xea/xaf/x9d MEETEI MAYEK LETTER MIT LONSUM + /xea/xaf/x9e MEETEI MAYEK LETTER PA LONSUM + /xea/xaf/x9f MEETEI MAYEK LETTER NA LONSUM + /xea/xaf/xa0 MEETEI MAYEK LETTER TIL LONSUM + /xea/xaf/xa1 MEETEI MAYEK LETTER NGOU LONSUM + /xea/xaf/xa2 MEETEI MAYEK LETTER I LONSUM + /xea/xaf/xa3 MEETEI MAYEK VOWEL SIGN ONAP + /xea/xaf/xa4 MEETEI MAYEK VOWEL SIGN INAP + /xea/xaf/xa5 MEETEI MAYEK VOWEL SIGN ANAP + /xea/xaf/xa6 MEETEI MAYEK VOWEL SIGN YENAP + /xea/xaf/xa7 MEETEI MAYEK VOWEL SIGN SOUNAP + /xea/xaf/xa8 MEETEI MAYEK VOWEL SIGN UNAP + /xea/xaf/xa9 MEETEI MAYEK VOWEL SIGN CHEINAP + /xea/xaf/xaa MEETEI MAYEK VOWEL SIGN NUNG + /xea/xaf/xab MEETEI MAYEK CHEIKHEI + /xea/xaf/xac MEETEI MAYEK LUM IYEK + /xea/xaf/xad MEETEI MAYEK APUN IYEK + /xea/xaf/xb0 MEETEI MAYEK DIGIT ZERO + /xea/xaf/xb1 MEETEI MAYEK DIGIT ONE + /xea/xaf/xb2 MEETEI MAYEK DIGIT TWO + /xea/xaf/xb3 MEETEI MAYEK DIGIT THREE + /xea/xaf/xb4 MEETEI MAYEK DIGIT FOUR + /xea/xaf/xb5 MEETEI MAYEK DIGIT FIVE + /xea/xaf/xb6 MEETEI MAYEK DIGIT SIX + /xea/xaf/xb7 MEETEI MAYEK DIGIT SEVEN + /xea/xaf/xb8 MEETEI MAYEK DIGIT EIGHT + /xea/xaf/xb9 MEETEI MAYEK DIGIT NINE /xea/xb0/x80 HANGUL SYLLABLE GA /xea/xb0/x81 HANGUL SYLLABLE GAG /xea/xb0/x82 HANGUL SYLLABLE GAGG @@ -24736,6 +25836,78 @@ CHARMAP /xed/x9e/xa1 HANGUL SYLLABLE HIT /xed/x9e/xa2 HANGUL SYLLABLE HIP /xed/x9e/xa3 HANGUL SYLLABLE HIH + /xed/x9e/xb0 HANGUL JUNGSEONG O-YEO + /xed/x9e/xb1 HANGUL JUNGSEONG O-O-I + /xed/x9e/xb2 HANGUL JUNGSEONG YO-A + /xed/x9e/xb3 HANGUL JUNGSEONG YO-AE + /xed/x9e/xb4 HANGUL JUNGSEONG YO-EO + /xed/x9e/xb5 HANGUL JUNGSEONG U-YEO + /xed/x9e/xb6 HANGUL JUNGSEONG U-I-I + /xed/x9e/xb7 HANGUL JUNGSEONG YU-AE + /xed/x9e/xb8 HANGUL JUNGSEONG YU-O + /xed/x9e/xb9 HANGUL JUNGSEONG EU-A + /xed/x9e/xba HANGUL JUNGSEONG EU-EO + /xed/x9e/xbb HANGUL JUNGSEONG EU-E + /xed/x9e/xbc HANGUL JUNGSEONG EU-O + /xed/x9e/xbd HANGUL JUNGSEONG I-YA-O + /xed/x9e/xbe HANGUL JUNGSEONG I-YAE + /xed/x9e/xbf HANGUL JUNGSEONG I-YEO + /xed/x9f/x80 HANGUL JUNGSEONG I-YE + /xed/x9f/x81 HANGUL JUNGSEONG I-O-I + /xed/x9f/x82 HANGUL JUNGSEONG I-YO + /xed/x9f/x83 HANGUL JUNGSEONG I-YU + /xed/x9f/x84 HANGUL JUNGSEONG I-I + /xed/x9f/x85 HANGUL JUNGSEONG ARAEA-A + /xed/x9f/x86 HANGUL JUNGSEONG ARAEA-E + /xed/x9f/x8b HANGUL JONGSEONG NIEUN-RIEUL + /xed/x9f/x8c HANGUL JONGSEONG NIEUN-CHIEUCH + /xed/x9f/x8d HANGUL JONGSEONG SSANGTIKEUT + /xed/x9f/x8e HANGUL JONGSEONG SSANGTIKEUT-PIEUP + /xed/x9f/x8f HANGUL JONGSEONG TIKEUT-PIEUP + /xed/x9f/x90 HANGUL JONGSEONG TIKEUT-SIOS + /xed/x9f/x91 HANGUL JONGSEONG TIKEUT-SIOS-KIYEOK + /xed/x9f/x92 HANGUL JONGSEONG TIKEUT-CIEUC + /xed/x9f/x93 HANGUL JONGSEONG TIKEUT-CHIEUCH + /xed/x9f/x94 HANGUL JONGSEONG TIKEUT-THIEUTH + /xed/x9f/x95 HANGUL JONGSEONG RIEUL-SSANGKIYEOK + /xed/x9f/x96 HANGUL JONGSEONG RIEUL-KIYEOK-HIEUH + /xed/x9f/x97 HANGUL JONGSEONG SSANGRIEUL-KHIEUKH + /xed/x9f/x98 HANGUL JONGSEONG RIEUL-MIEUM-HIEUH + /xed/x9f/x99 HANGUL JONGSEONG RIEUL-PIEUP-TIKEUT + /xed/x9f/x9a HANGUL JONGSEONG RIEUL-PIEUP-PHIEUPH + /xed/x9f/x9b HANGUL JONGSEONG RIEUL-YESIEUNG + /xed/x9f/x9c HANGUL JONGSEONG RIEUL-YEORINHIEUH-HIEUH + /xed/x9f/x9d HANGUL JONGSEONG KAPYEOUNRIEUL + /xed/x9f/x9e HANGUL JONGSEONG MIEUM-NIEUN + /xed/x9f/x9f HANGUL JONGSEONG MIEUM-SSANGNIEUN + /xed/x9f/xa0 HANGUL JONGSEONG SSANGMIEUM + /xed/x9f/xa1 HANGUL JONGSEONG MIEUM-PIEUP-SIOS + /xed/x9f/xa2 HANGUL JONGSEONG MIEUM-CIEUC + /xed/x9f/xa3 HANGUL JONGSEONG PIEUP-TIKEUT + /xed/x9f/xa4 HANGUL JONGSEONG PIEUP-RIEUL-PHIEUPH + /xed/x9f/xa5 HANGUL JONGSEONG PIEUP-MIEUM + /xed/x9f/xa6 HANGUL JONGSEONG SSANGPIEUP + /xed/x9f/xa7 HANGUL JONGSEONG PIEUP-SIOS-TIKEUT + /xed/x9f/xa8 HANGUL JONGSEONG PIEUP-CIEUC + /xed/x9f/xa9 HANGUL JONGSEONG PIEUP-CHIEUCH + /xed/x9f/xaa HANGUL JONGSEONG SIOS-MIEUM + /xed/x9f/xab HANGUL JONGSEONG SIOS-KAPYEOUNPIEUP + /xed/x9f/xac HANGUL JONGSEONG SSANGSIOS-KIYEOK + /xed/x9f/xad HANGUL JONGSEONG SSANGSIOS-TIKEUT + /xed/x9f/xae HANGUL JONGSEONG SIOS-PANSIOS + /xed/x9f/xaf HANGUL JONGSEONG SIOS-CIEUC + /xed/x9f/xb0 HANGUL JONGSEONG SIOS-CHIEUCH + /xed/x9f/xb1 HANGUL JONGSEONG SIOS-THIEUTH + /xed/x9f/xb2 HANGUL JONGSEONG SIOS-HIEUH + /xed/x9f/xb3 HANGUL JONGSEONG PANSIOS-PIEUP + /xed/x9f/xb4 HANGUL JONGSEONG PANSIOS-KAPYEOUNPIEUP + /xed/x9f/xb5 HANGUL JONGSEONG YESIEUNG-MIEUM + /xed/x9f/xb6 HANGUL JONGSEONG YESIEUNG-HIEUH + /xed/x9f/xb7 HANGUL JONGSEONG CIEUC-PIEUP + /xed/x9f/xb8 HANGUL JONGSEONG CIEUC-SSANGPIEUP + /xed/x9f/xb9 HANGUL JONGSEONG SSANGCIEUC + /xed/x9f/xba HANGUL JONGSEONG PHIEUPH-SIOS + /xed/x9f/xbb HANGUL JONGSEONG PHIEUPH-THIEUTH % /xed/xa0/x80 % /xed/xad/xbf % /xed/xae/x80 @@ -25203,6 +26375,9 @@ CHARMAP /xef/xa9/xa8 CJK COMPATIBILITY IDEOGRAPH-FA68 /xef/xa9/xa9 CJK COMPATIBILITY IDEOGRAPH-FA69 /xef/xa9/xaa CJK COMPATIBILITY IDEOGRAPH-FA6A + /xef/xa9/xab CJK COMPATIBILITY IDEOGRAPH-FA6B + /xef/xa9/xac CJK COMPATIBILITY IDEOGRAPH-FA6C + /xef/xa9/xad CJK COMPATIBILITY IDEOGRAPH-FA6D /xef/xa9/xb0 CJK COMPATIBILITY IDEOGRAPH-FA70 /xef/xa9/xb1 CJK COMPATIBILITY IDEOGRAPH-FA71 /xef/xa9/xb2 CJK COMPATIBILITY IDEOGRAPH-FA72 @@ -25465,6 +26640,22 @@ CHARMAP /xef/xae/xaf ARABIC LETTER YEH BARREE FINAL FORM /xef/xae/xb0 ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM /xef/xae/xb1 ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM + /xef/xae/xb2 ARABIC SYMBOL DOT ABOVE + /xef/xae/xb3 ARABIC SYMBOL DOT BELOW + /xef/xae/xb4 ARABIC SYMBOL TWO DOTS ABOVE + /xef/xae/xb5 ARABIC SYMBOL TWO DOTS BELOW + /xef/xae/xb6 ARABIC SYMBOL THREE DOTS ABOVE + /xef/xae/xb7 ARABIC SYMBOL THREE DOTS BELOW + /xef/xae/xb8 ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS ABOVE + /xef/xae/xb9 ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS BELOW + /xef/xae/xba ARABIC SYMBOL FOUR DOTS ABOVE + /xef/xae/xbb ARABIC SYMBOL FOUR DOTS BELOW + /xef/xae/xbc ARABIC SYMBOL DOUBLE VERTICAL BAR BELOW + /xef/xae/xbd ARABIC SYMBOL TWO DOTS VERTICALLY ABOVE + /xef/xae/xbe ARABIC SYMBOL TWO DOTS VERTICALLY BELOW + /xef/xae/xbf ARABIC SYMBOL RING + /xef/xaf/x80 ARABIC SYMBOL SMALL TAH ABOVE + /xef/xaf/x81 ARABIC SYMBOL SMALL TAH BELOW /xef/xaf/x93 ARABIC LETTER NG ISOLATED FORM /xef/xaf/x94 ARABIC LETTER NG FINAL FORM /xef/xaf/x95 ARABIC LETTER NG INITIAL FORM @@ -27269,6 +28460,37 @@ CHARMAP /xf0/x90/xa0/xb8 CYPRIOT SYLLABLE XE /xf0/x90/xa0/xbc CYPRIOT SYLLABLE ZA /xf0/x90/xa0/xbf CYPRIOT SYLLABLE ZO + /xf0/x90/xa1/x80 IMPERIAL ARAMAIC LETTER ALEPH + /xf0/x90/xa1/x81 IMPERIAL ARAMAIC LETTER BETH + /xf0/x90/xa1/x82 IMPERIAL ARAMAIC LETTER GIMEL + /xf0/x90/xa1/x83 IMPERIAL ARAMAIC LETTER DALETH + /xf0/x90/xa1/x84 IMPERIAL ARAMAIC LETTER HE + /xf0/x90/xa1/x85 IMPERIAL ARAMAIC LETTER WAW + /xf0/x90/xa1/x86 IMPERIAL ARAMAIC LETTER ZAYIN + /xf0/x90/xa1/x87 IMPERIAL ARAMAIC LETTER HETH + /xf0/x90/xa1/x88 IMPERIAL ARAMAIC LETTER TETH + /xf0/x90/xa1/x89 IMPERIAL ARAMAIC LETTER YODH + /xf0/x90/xa1/x8a IMPERIAL ARAMAIC LETTER KAPH + /xf0/x90/xa1/x8b IMPERIAL ARAMAIC LETTER LAMEDH + /xf0/x90/xa1/x8c IMPERIAL ARAMAIC LETTER MEM + /xf0/x90/xa1/x8d IMPERIAL ARAMAIC LETTER NUN + /xf0/x90/xa1/x8e IMPERIAL ARAMAIC LETTER SAMEKH + /xf0/x90/xa1/x8f IMPERIAL ARAMAIC LETTER AYIN + /xf0/x90/xa1/x90 IMPERIAL ARAMAIC LETTER PE + /xf0/x90/xa1/x91 IMPERIAL ARAMAIC LETTER SADHE + /xf0/x90/xa1/x92 IMPERIAL ARAMAIC LETTER QOPH + /xf0/x90/xa1/x93 IMPERIAL ARAMAIC LETTER RESH + /xf0/x90/xa1/x94 IMPERIAL ARAMAIC LETTER SHIN + /xf0/x90/xa1/x95 IMPERIAL ARAMAIC LETTER TAW + /xf0/x90/xa1/x97 IMPERIAL ARAMAIC SECTION SIGN + /xf0/x90/xa1/x98 IMPERIAL ARAMAIC NUMBER ONE + /xf0/x90/xa1/x99 IMPERIAL ARAMAIC NUMBER TWO + /xf0/x90/xa1/x9a IMPERIAL ARAMAIC NUMBER THREE + /xf0/x90/xa1/x9b IMPERIAL ARAMAIC NUMBER TEN + /xf0/x90/xa1/x9c IMPERIAL ARAMAIC NUMBER TWENTY + /xf0/x90/xa1/x9d IMPERIAL ARAMAIC NUMBER ONE HUNDRED + /xf0/x90/xa1/x9e IMPERIAL ARAMAIC NUMBER ONE THOUSAND + /xf0/x90/xa1/x9f IMPERIAL ARAMAIC NUMBER TEN THOUSAND /xf0/x90/xa4/x80 PHOENICIAN LETTER ALF /xf0/x90/xa4/x81 PHOENICIAN LETTER BET /xf0/x90/xa4/x82 PHOENICIAN LETTER GAML @@ -27295,6 +28517,8 @@ CHARMAP /xf0/x90/xa4/x97 PHOENICIAN NUMBER TEN /xf0/x90/xa4/x98 PHOENICIAN NUMBER TWENTY /xf0/x90/xa4/x99 PHOENICIAN NUMBER ONE HUNDRED + /xf0/x90/xa4/x9a PHOENICIAN NUMBER TWO + /xf0/x90/xa4/x9b PHOENICIAN NUMBER THREE /xf0/x90/xa4/x9f PHOENICIAN WORD SEPARATOR /xf0/x90/xa4/xa0 LYDIAN LETTER A /xf0/x90/xa4/xa1 LYDIAN LETTER B @@ -27388,6 +28612,434 @@ CHARMAP /xf0/x90/xa9/x96 KHAROSHTHI PUNCTUATION DANDA /xf0/x90/xa9/x97 KHAROSHTHI PUNCTUATION DOUBLE DANDA /xf0/x90/xa9/x98 KHAROSHTHI PUNCTUATION LINES + /xf0/x90/xa9/xa0 OLD SOUTH ARABIAN LETTER HE + /xf0/x90/xa9/xa1 OLD SOUTH ARABIAN LETTER LAMEDH + /xf0/x90/xa9/xa2 OLD SOUTH ARABIAN LETTER HETH + /xf0/x90/xa9/xa3 OLD SOUTH ARABIAN LETTER MEM + /xf0/x90/xa9/xa4 OLD SOUTH ARABIAN LETTER QOPH + /xf0/x90/xa9/xa5 OLD SOUTH ARABIAN LETTER WAW + /xf0/x90/xa9/xa6 OLD SOUTH ARABIAN LETTER SHIN + /xf0/x90/xa9/xa7 OLD SOUTH ARABIAN LETTER RESH + /xf0/x90/xa9/xa8 OLD SOUTH ARABIAN LETTER BETH + /xf0/x90/xa9/xa9 OLD SOUTH ARABIAN LETTER TAW + /xf0/x90/xa9/xaa OLD SOUTH ARABIAN LETTER SAT + /xf0/x90/xa9/xab OLD SOUTH ARABIAN LETTER KAPH + /xf0/x90/xa9/xac OLD SOUTH ARABIAN LETTER NUN + /xf0/x90/xa9/xad OLD SOUTH ARABIAN LETTER KHETH + /xf0/x90/xa9/xae OLD SOUTH ARABIAN LETTER SADHE + /xf0/x90/xa9/xaf OLD SOUTH ARABIAN LETTER SAMEKH + /xf0/x90/xa9/xb0 OLD SOUTH ARABIAN LETTER FE + /xf0/x90/xa9/xb1 OLD SOUTH ARABIAN LETTER ALEF + /xf0/x90/xa9/xb2 OLD SOUTH ARABIAN LETTER AYN + /xf0/x90/xa9/xb3 OLD SOUTH ARABIAN LETTER DHADHE + /xf0/x90/xa9/xb4 OLD SOUTH ARABIAN LETTER GIMEL + /xf0/x90/xa9/xb5 OLD SOUTH ARABIAN LETTER DALETH + /xf0/x90/xa9/xb6 OLD SOUTH ARABIAN LETTER GHAYN + /xf0/x90/xa9/xb7 OLD SOUTH ARABIAN LETTER TETH + /xf0/x90/xa9/xb8 OLD SOUTH ARABIAN LETTER ZAYN + /xf0/x90/xa9/xb9 OLD SOUTH ARABIAN LETTER DHALETH + /xf0/x90/xa9/xba OLD SOUTH ARABIAN LETTER YODH + /xf0/x90/xa9/xbb OLD SOUTH ARABIAN LETTER THAW + /xf0/x90/xa9/xbc OLD SOUTH ARABIAN LETTER THETH + /xf0/x90/xa9/xbd OLD SOUTH ARABIAN NUMBER ONE + /xf0/x90/xa9/xbe OLD SOUTH ARABIAN NUMBER FIFTY + /xf0/x90/xa9/xbf OLD SOUTH ARABIAN NUMERIC INDICATOR + /xf0/x90/xac/x80 AVESTAN LETTER A + /xf0/x90/xac/x81 AVESTAN LETTER AA + /xf0/x90/xac/x82 AVESTAN LETTER AO + /xf0/x90/xac/x83 AVESTAN LETTER AAO + /xf0/x90/xac/x84 AVESTAN LETTER AN + /xf0/x90/xac/x85 AVESTAN LETTER AAN + /xf0/x90/xac/x86 AVESTAN LETTER AE + /xf0/x90/xac/x87 AVESTAN LETTER AEE + /xf0/x90/xac/x88 AVESTAN LETTER E + /xf0/x90/xac/x89 AVESTAN LETTER EE + /xf0/x90/xac/x8a AVESTAN LETTER O + /xf0/x90/xac/x8b AVESTAN LETTER OO + /xf0/x90/xac/x8c AVESTAN LETTER I + /xf0/x90/xac/x8d AVESTAN LETTER II + /xf0/x90/xac/x8e AVESTAN LETTER U + /xf0/x90/xac/x8f AVESTAN LETTER UU + /xf0/x90/xac/x90 AVESTAN LETTER KE + /xf0/x90/xac/x91 AVESTAN LETTER XE + /xf0/x90/xac/x92 AVESTAN LETTER XYE + /xf0/x90/xac/x93 AVESTAN LETTER XVE + /xf0/x90/xac/x94 AVESTAN LETTER GE + /xf0/x90/xac/x95 AVESTAN LETTER GGE + /xf0/x90/xac/x96 AVESTAN LETTER GHE + /xf0/x90/xac/x97 AVESTAN LETTER CE + /xf0/x90/xac/x98 AVESTAN LETTER JE + /xf0/x90/xac/x99 AVESTAN LETTER TE + /xf0/x90/xac/x9a AVESTAN LETTER THE + /xf0/x90/xac/x9b AVESTAN LETTER DE + /xf0/x90/xac/x9c AVESTAN LETTER DHE + /xf0/x90/xac/x9d AVESTAN LETTER TTE + /xf0/x90/xac/x9e AVESTAN LETTER PE + /xf0/x90/xac/x9f AVESTAN LETTER FE + /xf0/x90/xac/xa0 AVESTAN LETTER BE + /xf0/x90/xac/xa1 AVESTAN LETTER BHE + /xf0/x90/xac/xa2 AVESTAN LETTER NGE + /xf0/x90/xac/xa3 AVESTAN LETTER NGYE + /xf0/x90/xac/xa4 AVESTAN LETTER NGVE + /xf0/x90/xac/xa5 AVESTAN LETTER NE + /xf0/x90/xac/xa6 AVESTAN LETTER NYE + /xf0/x90/xac/xa7 AVESTAN LETTER NNE + /xf0/x90/xac/xa8 AVESTAN LETTER ME + /xf0/x90/xac/xa9 AVESTAN LETTER HME + /xf0/x90/xac/xaa AVESTAN LETTER YYE + /xf0/x90/xac/xab AVESTAN LETTER YE + /xf0/x90/xac/xac AVESTAN LETTER VE + /xf0/x90/xac/xad AVESTAN LETTER RE + /xf0/x90/xac/xae AVESTAN LETTER LE + /xf0/x90/xac/xaf AVESTAN LETTER SE + /xf0/x90/xac/xb0 AVESTAN LETTER ZE + /xf0/x90/xac/xb1 AVESTAN LETTER SHE + /xf0/x90/xac/xb2 AVESTAN LETTER ZHE + /xf0/x90/xac/xb3 AVESTAN LETTER SHYE + /xf0/x90/xac/xb4 AVESTAN LETTER SSHE + /xf0/x90/xac/xb5 AVESTAN LETTER HE + /xf0/x90/xac/xb9 AVESTAN ABBREVIATION MARK + /xf0/x90/xac/xba TINY TWO DOTS OVER ONE DOT PUNCTUATION + /xf0/x90/xac/xbb SMALL TWO DOTS OVER ONE DOT PUNCTUATION + /xf0/x90/xac/xbc LARGE TWO DOTS OVER ONE DOT PUNCTUATION + /xf0/x90/xac/xbd LARGE ONE DOT OVER TWO DOTS PUNCTUATION + /xf0/x90/xac/xbe LARGE TWO RINGS OVER ONE RING PUNCTUATION + /xf0/x90/xac/xbf LARGE ONE RING OVER TWO RINGS PUNCTUATION + /xf0/x90/xad/x80 INSCRIPTIONAL PARTHIAN LETTER ALEPH + /xf0/x90/xad/x81 INSCRIPTIONAL PARTHIAN LETTER BETH + /xf0/x90/xad/x82 INSCRIPTIONAL PARTHIAN LETTER GIMEL + /xf0/x90/xad/x83 INSCRIPTIONAL PARTHIAN LETTER DALETH + /xf0/x90/xad/x84 INSCRIPTIONAL PARTHIAN LETTER HE + /xf0/x90/xad/x85 INSCRIPTIONAL PARTHIAN LETTER WAW + /xf0/x90/xad/x86 INSCRIPTIONAL PARTHIAN LETTER ZAYIN + /xf0/x90/xad/x87 INSCRIPTIONAL PARTHIAN LETTER HETH + /xf0/x90/xad/x88 INSCRIPTIONAL PARTHIAN LETTER TETH + /xf0/x90/xad/x89 INSCRIPTIONAL PARTHIAN LETTER YODH + /xf0/x90/xad/x8a INSCRIPTIONAL PARTHIAN LETTER KAPH + /xf0/x90/xad/x8b INSCRIPTIONAL PARTHIAN LETTER LAMEDH + /xf0/x90/xad/x8c INSCRIPTIONAL PARTHIAN LETTER MEM + /xf0/x90/xad/x8d INSCRIPTIONAL PARTHIAN LETTER NUN + /xf0/x90/xad/x8e INSCRIPTIONAL PARTHIAN LETTER SAMEKH + /xf0/x90/xad/x8f INSCRIPTIONAL PARTHIAN LETTER AYIN + /xf0/x90/xad/x90 INSCRIPTIONAL PARTHIAN LETTER PE + /xf0/x90/xad/x91 INSCRIPTIONAL PARTHIAN LETTER SADHE + /xf0/x90/xad/x92 INSCRIPTIONAL PARTHIAN LETTER QOPH + /xf0/x90/xad/x93 INSCRIPTIONAL PARTHIAN LETTER RESH + /xf0/x90/xad/x94 INSCRIPTIONAL PARTHIAN LETTER SHIN + /xf0/x90/xad/x95 INSCRIPTIONAL PARTHIAN LETTER TAW + /xf0/x90/xad/x98 INSCRIPTIONAL PARTHIAN NUMBER ONE + /xf0/x90/xad/x99 INSCRIPTIONAL PARTHIAN NUMBER TWO + /xf0/x90/xad/x9a INSCRIPTIONAL PARTHIAN NUMBER THREE + /xf0/x90/xad/x9b INSCRIPTIONAL PARTHIAN NUMBER FOUR + /xf0/x90/xad/x9c INSCRIPTIONAL PARTHIAN NUMBER TEN + /xf0/x90/xad/x9d INSCRIPTIONAL PARTHIAN NUMBER TWENTY + /xf0/x90/xad/x9e INSCRIPTIONAL PARTHIAN NUMBER ONE HUNDRED + /xf0/x90/xad/x9f INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND + /xf0/x90/xad/xa0 INSCRIPTIONAL PAHLAVI LETTER ALEPH + /xf0/x90/xad/xa1 INSCRIPTIONAL PAHLAVI LETTER BETH + /xf0/x90/xad/xa2 INSCRIPTIONAL PAHLAVI LETTER GIMEL + /xf0/x90/xad/xa3 INSCRIPTIONAL PAHLAVI LETTER DALETH + /xf0/x90/xad/xa4 INSCRIPTIONAL PAHLAVI LETTER HE + /xf0/x90/xad/xa5 INSCRIPTIONAL PAHLAVI LETTER WAW-AYIN-RESH + /xf0/x90/xad/xa6 INSCRIPTIONAL PAHLAVI LETTER ZAYIN + /xf0/x90/xad/xa7 INSCRIPTIONAL PAHLAVI LETTER HETH + /xf0/x90/xad/xa8 INSCRIPTIONAL PAHLAVI LETTER TETH + /xf0/x90/xad/xa9 INSCRIPTIONAL PAHLAVI LETTER YODH + /xf0/x90/xad/xaa INSCRIPTIONAL PAHLAVI LETTER KAPH + /xf0/x90/xad/xab INSCRIPTIONAL PAHLAVI LETTER LAMEDH + /xf0/x90/xad/xac INSCRIPTIONAL PAHLAVI LETTER MEM-QOPH + /xf0/x90/xad/xad INSCRIPTIONAL PAHLAVI LETTER NUN + /xf0/x90/xad/xae INSCRIPTIONAL PAHLAVI LETTER SAMEKH + /xf0/x90/xad/xaf INSCRIPTIONAL PAHLAVI LETTER PE + /xf0/x90/xad/xb0 INSCRIPTIONAL PAHLAVI LETTER SADHE + /xf0/x90/xad/xb1 INSCRIPTIONAL PAHLAVI LETTER SHIN + /xf0/x90/xad/xb2 INSCRIPTIONAL PAHLAVI LETTER TAW + /xf0/x90/xad/xb8 INSCRIPTIONAL PAHLAVI NUMBER ONE + /xf0/x90/xad/xb9 INSCRIPTIONAL PAHLAVI NUMBER TWO + /xf0/x90/xad/xba INSCRIPTIONAL PAHLAVI NUMBER THREE + /xf0/x90/xad/xbb INSCRIPTIONAL PAHLAVI NUMBER FOUR + /xf0/x90/xad/xbc INSCRIPTIONAL PAHLAVI NUMBER TEN + /xf0/x90/xad/xbd INSCRIPTIONAL PAHLAVI NUMBER TWENTY + /xf0/x90/xad/xbe INSCRIPTIONAL PAHLAVI NUMBER ONE HUNDRED + /xf0/x90/xad/xbf INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND + /xf0/x90/xb0/x80 OLD TURKIC LETTER ORKHON A + /xf0/x90/xb0/x81 OLD TURKIC LETTER YENISEI A + /xf0/x90/xb0/x82 OLD TURKIC LETTER YENISEI AE + /xf0/x90/xb0/x83 OLD TURKIC LETTER ORKHON I + /xf0/x90/xb0/x84 OLD TURKIC LETTER YENISEI I + /xf0/x90/xb0/x85 OLD TURKIC LETTER YENISEI E + /xf0/x90/xb0/x86 OLD TURKIC LETTER ORKHON O + /xf0/x90/xb0/x87 OLD TURKIC LETTER ORKHON OE + /xf0/x90/xb0/x88 OLD TURKIC LETTER YENISEI OE + /xf0/x90/xb0/x89 OLD TURKIC LETTER ORKHON AB + /xf0/x90/xb0/x8a OLD TURKIC LETTER YENISEI AB + /xf0/x90/xb0/x8b OLD TURKIC LETTER ORKHON AEB + /xf0/x90/xb0/x8c OLD TURKIC LETTER YENISEI AEB + /xf0/x90/xb0/x8d OLD TURKIC LETTER ORKHON AG + /xf0/x90/xb0/x8e OLD TURKIC LETTER YENISEI AG + /xf0/x90/xb0/x8f OLD TURKIC LETTER ORKHON AEG + /xf0/x90/xb0/x90 OLD TURKIC LETTER YENISEI AEG + /xf0/x90/xb0/x91 OLD TURKIC LETTER ORKHON AD + /xf0/x90/xb0/x92 OLD TURKIC LETTER YENISEI AD + /xf0/x90/xb0/x93 OLD TURKIC LETTER ORKHON AED + /xf0/x90/xb0/x94 OLD TURKIC LETTER ORKHON EZ + /xf0/x90/xb0/x95 OLD TURKIC LETTER YENISEI EZ + /xf0/x90/xb0/x96 OLD TURKIC LETTER ORKHON AY + /xf0/x90/xb0/x97 OLD TURKIC LETTER YENISEI AY + /xf0/x90/xb0/x98 OLD TURKIC LETTER ORKHON AEY + /xf0/x90/xb0/x99 OLD TURKIC LETTER YENISEI AEY + /xf0/x90/xb0/x9a OLD TURKIC LETTER ORKHON AEK + /xf0/x90/xb0/x9b OLD TURKIC LETTER YENISEI AEK + /xf0/x90/xb0/x9c OLD TURKIC LETTER ORKHON OEK + /xf0/x90/xb0/x9d OLD TURKIC LETTER YENISEI OEK + /xf0/x90/xb0/x9e OLD TURKIC LETTER ORKHON AL + /xf0/x90/xb0/x9f OLD TURKIC LETTER YENISEI AL + /xf0/x90/xb0/xa0 OLD TURKIC LETTER ORKHON AEL + /xf0/x90/xb0/xa1 OLD TURKIC LETTER ORKHON ELT + /xf0/x90/xb0/xa2 OLD TURKIC LETTER ORKHON EM + /xf0/x90/xb0/xa3 OLD TURKIC LETTER ORKHON AN + /xf0/x90/xb0/xa4 OLD TURKIC LETTER ORKHON AEN + /xf0/x90/xb0/xa5 OLD TURKIC LETTER YENISEI AEN + /xf0/x90/xb0/xa6 OLD TURKIC LETTER ORKHON ENT + /xf0/x90/xb0/xa7 OLD TURKIC LETTER YENISEI ENT + /xf0/x90/xb0/xa8 OLD TURKIC LETTER ORKHON ENC + /xf0/x90/xb0/xa9 OLD TURKIC LETTER YENISEI ENC + /xf0/x90/xb0/xaa OLD TURKIC LETTER ORKHON ENY + /xf0/x90/xb0/xab OLD TURKIC LETTER YENISEI ENY + /xf0/x90/xb0/xac OLD TURKIC LETTER YENISEI ANG + /xf0/x90/xb0/xad OLD TURKIC LETTER ORKHON ENG + /xf0/x90/xb0/xae OLD TURKIC LETTER YENISEI AENG + /xf0/x90/xb0/xaf OLD TURKIC LETTER ORKHON EP + /xf0/x90/xb0/xb0 OLD TURKIC LETTER ORKHON OP + /xf0/x90/xb0/xb1 OLD TURKIC LETTER ORKHON IC + /xf0/x90/xb0/xb2 OLD TURKIC LETTER ORKHON EC + /xf0/x90/xb0/xb3 OLD TURKIC LETTER YENISEI EC + /xf0/x90/xb0/xb4 OLD TURKIC LETTER ORKHON AQ + /xf0/x90/xb0/xb5 OLD TURKIC LETTER YENISEI AQ + /xf0/x90/xb0/xb6 OLD TURKIC LETTER ORKHON IQ + /xf0/x90/xb0/xb7 OLD TURKIC LETTER YENISEI IQ + /xf0/x90/xb0/xb8 OLD TURKIC LETTER ORKHON OQ + /xf0/x90/xb0/xb9 OLD TURKIC LETTER YENISEI OQ + /xf0/x90/xb0/xba OLD TURKIC LETTER ORKHON AR + /xf0/x90/xb0/xbb OLD TURKIC LETTER YENISEI AR + /xf0/x90/xb0/xbc OLD TURKIC LETTER ORKHON AER + /xf0/x90/xb0/xbd OLD TURKIC LETTER ORKHON AS + /xf0/x90/xb0/xbe OLD TURKIC LETTER ORKHON AES + /xf0/x90/xb0/xbf OLD TURKIC LETTER ORKHON ASH + /xf0/x90/xb1/x80 OLD TURKIC LETTER YENISEI ASH + /xf0/x90/xb1/x81 OLD TURKIC LETTER ORKHON ESH + /xf0/x90/xb1/x82 OLD TURKIC LETTER YENISEI ESH + /xf0/x90/xb1/x83 OLD TURKIC LETTER ORKHON AT + /xf0/x90/xb1/x84 OLD TURKIC LETTER YENISEI AT + /xf0/x90/xb1/x85 OLD TURKIC LETTER ORKHON AET + /xf0/x90/xb1/x86 OLD TURKIC LETTER YENISEI AET + /xf0/x90/xb1/x87 OLD TURKIC LETTER ORKHON OT + /xf0/x90/xb1/x88 OLD TURKIC LETTER ORKHON BASH + /xf0/x90/xb9/xa0 RUMI DIGIT ONE + /xf0/x90/xb9/xa1 RUMI DIGIT TWO + /xf0/x90/xb9/xa2 RUMI DIGIT THREE + /xf0/x90/xb9/xa3 RUMI DIGIT FOUR + /xf0/x90/xb9/xa4 RUMI DIGIT FIVE + /xf0/x90/xb9/xa5 RUMI DIGIT SIX + /xf0/x90/xb9/xa6 RUMI DIGIT SEVEN + /xf0/x90/xb9/xa7 RUMI DIGIT EIGHT + /xf0/x90/xb9/xa8 RUMI DIGIT NINE + /xf0/x90/xb9/xa9 RUMI NUMBER TEN + /xf0/x90/xb9/xaa RUMI NUMBER TWENTY + /xf0/x90/xb9/xab RUMI NUMBER THIRTY + /xf0/x90/xb9/xac RUMI NUMBER FORTY + /xf0/x90/xb9/xad RUMI NUMBER FIFTY + /xf0/x90/xb9/xae RUMI NUMBER SIXTY + /xf0/x90/xb9/xaf RUMI NUMBER SEVENTY + /xf0/x90/xb9/xb0 RUMI NUMBER EIGHTY + /xf0/x90/xb9/xb1 RUMI NUMBER NINETY + /xf0/x90/xb9/xb2 RUMI NUMBER ONE HUNDRED + /xf0/x90/xb9/xb3 RUMI NUMBER TWO HUNDRED + /xf0/x90/xb9/xb4 RUMI NUMBER THREE HUNDRED + /xf0/x90/xb9/xb5 RUMI NUMBER FOUR HUNDRED + /xf0/x90/xb9/xb6 RUMI NUMBER FIVE HUNDRED + /xf0/x90/xb9/xb7 RUMI NUMBER SIX HUNDRED + /xf0/x90/xb9/xb8 RUMI NUMBER SEVEN HUNDRED + /xf0/x90/xb9/xb9 RUMI NUMBER EIGHT HUNDRED + /xf0/x90/xb9/xba RUMI NUMBER NINE HUNDRED + /xf0/x90/xb9/xbb RUMI FRACTION ONE HALF + /xf0/x90/xb9/xbc RUMI FRACTION ONE QUARTER + /xf0/x90/xb9/xbd RUMI FRACTION ONE THIRD + /xf0/x90/xb9/xbe RUMI FRACTION TWO THIRDS + /xf0/x91/x80/x80 BRAHMI SIGN CANDRABINDU + /xf0/x91/x80/x81 BRAHMI SIGN ANUSVARA + /xf0/x91/x80/x82 BRAHMI SIGN VISARGA + /xf0/x91/x80/x83 BRAHMI SIGN JIHVAMULIYA + /xf0/x91/x80/x84 BRAHMI SIGN UPADHMANIYA + /xf0/x91/x80/x85 BRAHMI LETTER A + /xf0/x91/x80/x86 BRAHMI LETTER AA + /xf0/x91/x80/x87 BRAHMI LETTER I + /xf0/x91/x80/x88 BRAHMI LETTER II + /xf0/x91/x80/x89 BRAHMI LETTER U + /xf0/x91/x80/x8a BRAHMI LETTER UU + /xf0/x91/x80/x8b BRAHMI LETTER VOCALIC R + /xf0/x91/x80/x8c BRAHMI LETTER VOCALIC RR + /xf0/x91/x80/x8d BRAHMI LETTER VOCALIC L + /xf0/x91/x80/x8e BRAHMI LETTER VOCALIC LL + /xf0/x91/x80/x8f BRAHMI LETTER E + /xf0/x91/x80/x90 BRAHMI LETTER AI + /xf0/x91/x80/x91 BRAHMI LETTER O + /xf0/x91/x80/x92 BRAHMI LETTER AU + /xf0/x91/x80/x93 BRAHMI LETTER KA + /xf0/x91/x80/x94 BRAHMI LETTER KHA + /xf0/x91/x80/x95 BRAHMI LETTER GA + /xf0/x91/x80/x96 BRAHMI LETTER GHA + /xf0/x91/x80/x97 BRAHMI LETTER NGA + /xf0/x91/x80/x98 BRAHMI LETTER CA + /xf0/x91/x80/x99 BRAHMI LETTER CHA + /xf0/x91/x80/x9a BRAHMI LETTER JA + /xf0/x91/x80/x9b BRAHMI LETTER JHA + /xf0/x91/x80/x9c BRAHMI LETTER NYA + /xf0/x91/x80/x9d BRAHMI LETTER TTA + /xf0/x91/x80/x9e BRAHMI LETTER TTHA + /xf0/x91/x80/x9f BRAHMI LETTER DDA + /xf0/x91/x80/xa0 BRAHMI LETTER DDHA + /xf0/x91/x80/xa1 BRAHMI LETTER NNA + /xf0/x91/x80/xa2 BRAHMI LETTER TA + /xf0/x91/x80/xa3 BRAHMI LETTER THA + /xf0/x91/x80/xa4 BRAHMI LETTER DA + /xf0/x91/x80/xa5 BRAHMI LETTER DHA + /xf0/x91/x80/xa6 BRAHMI LETTER NA + /xf0/x91/x80/xa7 BRAHMI LETTER PA + /xf0/x91/x80/xa8 BRAHMI LETTER PHA + /xf0/x91/x80/xa9 BRAHMI LETTER BA + /xf0/x91/x80/xaa BRAHMI LETTER BHA + /xf0/x91/x80/xab BRAHMI LETTER MA + /xf0/x91/x80/xac BRAHMI LETTER YA + /xf0/x91/x80/xad BRAHMI LETTER RA + /xf0/x91/x80/xae BRAHMI LETTER LA + /xf0/x91/x80/xaf BRAHMI LETTER VA + /xf0/x91/x80/xb0 BRAHMI LETTER SHA + /xf0/x91/x80/xb1 BRAHMI LETTER SSA + /xf0/x91/x80/xb2 BRAHMI LETTER SA + /xf0/x91/x80/xb3 BRAHMI LETTER HA + /xf0/x91/x80/xb4 BRAHMI LETTER LLA + /xf0/x91/x80/xb5 BRAHMI LETTER OLD TAMIL LLLA + /xf0/x91/x80/xb6 BRAHMI LETTER OLD TAMIL RRA + /xf0/x91/x80/xb7 BRAHMI LETTER OLD TAMIL NNNA + /xf0/x91/x80/xb8 BRAHMI VOWEL SIGN AA + /xf0/x91/x80/xb9 BRAHMI VOWEL SIGN BHATTIPROLU AA + /xf0/x91/x80/xba BRAHMI VOWEL SIGN I + /xf0/x91/x80/xbb BRAHMI VOWEL SIGN II + /xf0/x91/x80/xbc BRAHMI VOWEL SIGN U + /xf0/x91/x80/xbd BRAHMI VOWEL SIGN UU + /xf0/x91/x80/xbe BRAHMI VOWEL SIGN VOCALIC R + /xf0/x91/x80/xbf BRAHMI VOWEL SIGN VOCALIC RR + /xf0/x91/x81/x80 BRAHMI VOWEL SIGN VOCALIC L + /xf0/x91/x81/x81 BRAHMI VOWEL SIGN VOCALIC LL + /xf0/x91/x81/x82 BRAHMI VOWEL SIGN E + /xf0/x91/x81/x83 BRAHMI VOWEL SIGN AI + /xf0/x91/x81/x84 BRAHMI VOWEL SIGN O + /xf0/x91/x81/x85 BRAHMI VOWEL SIGN AU + /xf0/x91/x81/x86 BRAHMI VIRAMA + /xf0/x91/x81/x87 BRAHMI DANDA + /xf0/x91/x81/x88 BRAHMI DOUBLE DANDA + /xf0/x91/x81/x89 BRAHMI PUNCTUATION DOT + /xf0/x91/x81/x8a BRAHMI PUNCTUATION DOUBLE DOT + /xf0/x91/x81/x8b BRAHMI PUNCTUATION LINE + /xf0/x91/x81/x8c BRAHMI PUNCTUATION CRESCENT BAR + /xf0/x91/x81/x8d BRAHMI PUNCTUATION LOTUS + /xf0/x91/x81/x92 BRAHMI NUMBER ONE + /xf0/x91/x81/x93 BRAHMI NUMBER TWO + /xf0/x91/x81/x94 BRAHMI NUMBER THREE + /xf0/x91/x81/x95 BRAHMI NUMBER FOUR + /xf0/x91/x81/x96 BRAHMI NUMBER FIVE + /xf0/x91/x81/x97 BRAHMI NUMBER SIX + /xf0/x91/x81/x98 BRAHMI NUMBER SEVEN + /xf0/x91/x81/x99 BRAHMI NUMBER EIGHT + /xf0/x91/x81/x9a BRAHMI NUMBER NINE + /xf0/x91/x81/x9b BRAHMI NUMBER TEN + /xf0/x91/x81/x9c BRAHMI NUMBER TWENTY + /xf0/x91/x81/x9d BRAHMI NUMBER THIRTY + /xf0/x91/x81/x9e BRAHMI NUMBER FORTY + /xf0/x91/x81/x9f BRAHMI NUMBER FIFTY + /xf0/x91/x81/xa0 BRAHMI NUMBER SIXTY + /xf0/x91/x81/xa1 BRAHMI NUMBER SEVENTY + /xf0/x91/x81/xa2 BRAHMI NUMBER EIGHTY + /xf0/x91/x81/xa3 BRAHMI NUMBER NINETY + /xf0/x91/x81/xa4 BRAHMI NUMBER ONE HUNDRED + /xf0/x91/x81/xa5 BRAHMI NUMBER ONE THOUSAND + /xf0/x91/x81/xa6 BRAHMI DIGIT ZERO + /xf0/x91/x81/xa7 BRAHMI DIGIT ONE + /xf0/x91/x81/xa8 BRAHMI DIGIT TWO + /xf0/x91/x81/xa9 BRAHMI DIGIT THREE + /xf0/x91/x81/xaa BRAHMI DIGIT FOUR + /xf0/x91/x81/xab BRAHMI DIGIT FIVE + /xf0/x91/x81/xac BRAHMI DIGIT SIX + /xf0/x91/x81/xad BRAHMI DIGIT SEVEN + /xf0/x91/x81/xae BRAHMI DIGIT EIGHT + /xf0/x91/x81/xaf BRAHMI DIGIT NINE + /xf0/x91/x82/x80 KAITHI SIGN CANDRABINDU + /xf0/x91/x82/x81 KAITHI SIGN ANUSVARA + /xf0/x91/x82/x82 KAITHI SIGN VISARGA + /xf0/x91/x82/x83 KAITHI LETTER A + /xf0/x91/x82/x84 KAITHI LETTER AA + /xf0/x91/x82/x85 KAITHI LETTER I + /xf0/x91/x82/x86 KAITHI LETTER II + /xf0/x91/x82/x87 KAITHI LETTER U + /xf0/x91/x82/x88 KAITHI LETTER UU + /xf0/x91/x82/x89 KAITHI LETTER E + /xf0/x91/x82/x8a KAITHI LETTER AI + /xf0/x91/x82/x8b KAITHI LETTER O + /xf0/x91/x82/x8c KAITHI LETTER AU + /xf0/x91/x82/x8d KAITHI LETTER KA + /xf0/x91/x82/x8e KAITHI LETTER KHA + /xf0/x91/x82/x8f KAITHI LETTER GA + /xf0/x91/x82/x90 KAITHI LETTER GHA + /xf0/x91/x82/x91 KAITHI LETTER NGA + /xf0/x91/x82/x92 KAITHI LETTER CA + /xf0/x91/x82/x93 KAITHI LETTER CHA + /xf0/x91/x82/x94 KAITHI LETTER JA + /xf0/x91/x82/x95 KAITHI LETTER JHA + /xf0/x91/x82/x96 KAITHI LETTER NYA + /xf0/x91/x82/x97 KAITHI LETTER TTA + /xf0/x91/x82/x98 KAITHI LETTER TTHA + /xf0/x91/x82/x99 KAITHI LETTER DDA + /xf0/x91/x82/x9a KAITHI LETTER DDDHA + /xf0/x91/x82/x9b KAITHI LETTER DDHA + /xf0/x91/x82/x9c KAITHI LETTER RHA + /xf0/x91/x82/x9d KAITHI LETTER NNA + /xf0/x91/x82/x9e KAITHI LETTER TA + /xf0/x91/x82/x9f KAITHI LETTER THA + /xf0/x91/x82/xa0 KAITHI LETTER DA + /xf0/x91/x82/xa1 KAITHI LETTER DHA + /xf0/x91/x82/xa2 KAITHI LETTER NA + /xf0/x91/x82/xa3 KAITHI LETTER PA + /xf0/x91/x82/xa4 KAITHI LETTER PHA + /xf0/x91/x82/xa5 KAITHI LETTER BA + /xf0/x91/x82/xa6 KAITHI LETTER BHA + /xf0/x91/x82/xa7 KAITHI LETTER MA + /xf0/x91/x82/xa8 KAITHI LETTER YA + /xf0/x91/x82/xa9 KAITHI LETTER RA + /xf0/x91/x82/xaa KAITHI LETTER LA + /xf0/x91/x82/xab KAITHI LETTER VA + /xf0/x91/x82/xac KAITHI LETTER SHA + /xf0/x91/x82/xad KAITHI LETTER SSA + /xf0/x91/x82/xae KAITHI LETTER SA + /xf0/x91/x82/xaf KAITHI LETTER HA + /xf0/x91/x82/xb0 KAITHI VOWEL SIGN AA + /xf0/x91/x82/xb1 KAITHI VOWEL SIGN I + /xf0/x91/x82/xb2 KAITHI VOWEL SIGN II + /xf0/x91/x82/xb3 KAITHI VOWEL SIGN U + /xf0/x91/x82/xb4 KAITHI VOWEL SIGN UU + /xf0/x91/x82/xb5 KAITHI VOWEL SIGN E + /xf0/x91/x82/xb6 KAITHI VOWEL SIGN AI + /xf0/x91/x82/xb7 KAITHI VOWEL SIGN O + /xf0/x91/x82/xb8 KAITHI VOWEL SIGN AU + /xf0/x91/x82/xb9 KAITHI SIGN VIRAMA + /xf0/x91/x82/xba KAITHI SIGN NUKTA + /xf0/x91/x82/xbb KAITHI ABBREVIATION SIGN + /xf0/x91/x82/xbc KAITHI ENUMERATION SIGN + /xf0/x91/x82/xbd KAITHI NUMBER SIGN + /xf0/x91/x82/xbe KAITHI SECTION MARK + /xf0/x91/x82/xbf KAITHI DOUBLE SECTION MARK + /xf0/x91/x83/x80 KAITHI DANDA + /xf0/x91/x83/x81 KAITHI DOUBLE DANDA /xf0/x92/x80/x80 CUNEIFORM SIGN A /xf0/x92/x80/x81 CUNEIFORM SIGN A TIMES A /xf0/x92/x80/x82 CUNEIFORM SIGN A TIMES BAD @@ -28370,6 +30022,1648 @@ CHARMAP /xf0/x92/x91/xb1 CUNEIFORM PUNCTUATION SIGN VERTICAL COLON /xf0/x92/x91/xb2 CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON /xf0/x92/x91/xb3 CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON + /xf0/x93/x80/x80 EGYPTIAN HIEROGLYPH A001 + /xf0/x93/x80/x81 EGYPTIAN HIEROGLYPH A002 + /xf0/x93/x80/x82 EGYPTIAN HIEROGLYPH A003 + /xf0/x93/x80/x83 EGYPTIAN HIEROGLYPH A004 + /xf0/x93/x80/x84 EGYPTIAN HIEROGLYPH A005 + /xf0/x93/x80/x85 EGYPTIAN HIEROGLYPH A005A + /xf0/x93/x80/x86 EGYPTIAN HIEROGLYPH A006 + /xf0/x93/x80/x87 EGYPTIAN HIEROGLYPH A006A + /xf0/x93/x80/x88 EGYPTIAN HIEROGLYPH A006B + /xf0/x93/x80/x89 EGYPTIAN HIEROGLYPH A007 + /xf0/x93/x80/x8a EGYPTIAN HIEROGLYPH A008 + /xf0/x93/x80/x8b EGYPTIAN HIEROGLYPH A009 + /xf0/x93/x80/x8c EGYPTIAN HIEROGLYPH A010 + /xf0/x93/x80/x8d EGYPTIAN HIEROGLYPH A011 + /xf0/x93/x80/x8e EGYPTIAN HIEROGLYPH A012 + /xf0/x93/x80/x8f EGYPTIAN HIEROGLYPH A013 + /xf0/x93/x80/x90 EGYPTIAN HIEROGLYPH A014 + /xf0/x93/x80/x91 EGYPTIAN HIEROGLYPH A014A + /xf0/x93/x80/x92 EGYPTIAN HIEROGLYPH A015 + /xf0/x93/x80/x93 EGYPTIAN HIEROGLYPH A016 + /xf0/x93/x80/x94 EGYPTIAN HIEROGLYPH A017 + /xf0/x93/x80/x95 EGYPTIAN HIEROGLYPH A017A + /xf0/x93/x80/x96 EGYPTIAN HIEROGLYPH A018 + /xf0/x93/x80/x97 EGYPTIAN HIEROGLYPH A019 + /xf0/x93/x80/x98 EGYPTIAN HIEROGLYPH A020 + /xf0/x93/x80/x99 EGYPTIAN HIEROGLYPH A021 + /xf0/x93/x80/x9a EGYPTIAN HIEROGLYPH A022 + /xf0/x93/x80/x9b EGYPTIAN HIEROGLYPH A023 + /xf0/x93/x80/x9c EGYPTIAN HIEROGLYPH A024 + /xf0/x93/x80/x9d EGYPTIAN HIEROGLYPH A025 + /xf0/x93/x80/x9e EGYPTIAN HIEROGLYPH A026 + /xf0/x93/x80/x9f EGYPTIAN HIEROGLYPH A027 + /xf0/x93/x80/xa0 EGYPTIAN HIEROGLYPH A028 + /xf0/x93/x80/xa1 EGYPTIAN HIEROGLYPH A029 + /xf0/x93/x80/xa2 EGYPTIAN HIEROGLYPH A030 + /xf0/x93/x80/xa3 EGYPTIAN HIEROGLYPH A031 + /xf0/x93/x80/xa4 EGYPTIAN HIEROGLYPH A032 + /xf0/x93/x80/xa5 EGYPTIAN HIEROGLYPH A032A + /xf0/x93/x80/xa6 EGYPTIAN HIEROGLYPH A033 + /xf0/x93/x80/xa7 EGYPTIAN HIEROGLYPH A034 + /xf0/x93/x80/xa8 EGYPTIAN HIEROGLYPH A035 + /xf0/x93/x80/xa9 EGYPTIAN HIEROGLYPH A036 + /xf0/x93/x80/xaa EGYPTIAN HIEROGLYPH A037 + /xf0/x93/x80/xab EGYPTIAN HIEROGLYPH A038 + /xf0/x93/x80/xac EGYPTIAN HIEROGLYPH A039 + /xf0/x93/x80/xad EGYPTIAN HIEROGLYPH A040 + /xf0/x93/x80/xae EGYPTIAN HIEROGLYPH A040A + /xf0/x93/x80/xaf EGYPTIAN HIEROGLYPH A041 + /xf0/x93/x80/xb0 EGYPTIAN HIEROGLYPH A042 + /xf0/x93/x80/xb1 EGYPTIAN HIEROGLYPH A042A + /xf0/x93/x80/xb2 EGYPTIAN HIEROGLYPH A043 + /xf0/x93/x80/xb3 EGYPTIAN HIEROGLYPH A043A + /xf0/x93/x80/xb4 EGYPTIAN HIEROGLYPH A044 + /xf0/x93/x80/xb5 EGYPTIAN HIEROGLYPH A045 + /xf0/x93/x80/xb6 EGYPTIAN HIEROGLYPH A045A + /xf0/x93/x80/xb7 EGYPTIAN HIEROGLYPH A046 + /xf0/x93/x80/xb8 EGYPTIAN HIEROGLYPH A047 + /xf0/x93/x80/xb9 EGYPTIAN HIEROGLYPH A048 + /xf0/x93/x80/xba EGYPTIAN HIEROGLYPH A049 + /xf0/x93/x80/xbb EGYPTIAN HIEROGLYPH A050 + /xf0/x93/x80/xbc EGYPTIAN HIEROGLYPH A051 + /xf0/x93/x80/xbd EGYPTIAN HIEROGLYPH A052 + /xf0/x93/x80/xbe EGYPTIAN HIEROGLYPH A053 + /xf0/x93/x80/xbf EGYPTIAN HIEROGLYPH A054 + /xf0/x93/x81/x80 EGYPTIAN HIEROGLYPH A055 + /xf0/x93/x81/x81 EGYPTIAN HIEROGLYPH A056 + /xf0/x93/x81/x82 EGYPTIAN HIEROGLYPH A057 + /xf0/x93/x81/x83 EGYPTIAN HIEROGLYPH A058 + /xf0/x93/x81/x84 EGYPTIAN HIEROGLYPH A059 + /xf0/x93/x81/x85 EGYPTIAN HIEROGLYPH A060 + /xf0/x93/x81/x86 EGYPTIAN HIEROGLYPH A061 + /xf0/x93/x81/x87 EGYPTIAN HIEROGLYPH A062 + /xf0/x93/x81/x88 EGYPTIAN HIEROGLYPH A063 + /xf0/x93/x81/x89 EGYPTIAN HIEROGLYPH A064 + /xf0/x93/x81/x8a EGYPTIAN HIEROGLYPH A065 + /xf0/x93/x81/x8b EGYPTIAN HIEROGLYPH A066 + /xf0/x93/x81/x8c EGYPTIAN HIEROGLYPH A067 + /xf0/x93/x81/x8d EGYPTIAN HIEROGLYPH A068 + /xf0/x93/x81/x8e EGYPTIAN HIEROGLYPH A069 + /xf0/x93/x81/x8f EGYPTIAN HIEROGLYPH A070 + /xf0/x93/x81/x90 EGYPTIAN HIEROGLYPH B001 + /xf0/x93/x81/x91 EGYPTIAN HIEROGLYPH B002 + /xf0/x93/x81/x92 EGYPTIAN HIEROGLYPH B003 + /xf0/x93/x81/x93 EGYPTIAN HIEROGLYPH B004 + /xf0/x93/x81/x94 EGYPTIAN HIEROGLYPH B005 + /xf0/x93/x81/x95 EGYPTIAN HIEROGLYPH B005A + /xf0/x93/x81/x96 EGYPTIAN HIEROGLYPH B006 + /xf0/x93/x81/x97 EGYPTIAN HIEROGLYPH B007 + /xf0/x93/x81/x98 EGYPTIAN HIEROGLYPH B008 + /xf0/x93/x81/x99 EGYPTIAN HIEROGLYPH B009 + /xf0/x93/x81/x9a EGYPTIAN HIEROGLYPH C001 + /xf0/x93/x81/x9b EGYPTIAN HIEROGLYPH C002 + /xf0/x93/x81/x9c EGYPTIAN HIEROGLYPH C002A + /xf0/x93/x81/x9d EGYPTIAN HIEROGLYPH C002B + /xf0/x93/x81/x9e EGYPTIAN HIEROGLYPH C002C + /xf0/x93/x81/x9f EGYPTIAN HIEROGLYPH C003 + /xf0/x93/x81/xa0 EGYPTIAN HIEROGLYPH C004 + /xf0/x93/x81/xa1 EGYPTIAN HIEROGLYPH C005 + /xf0/x93/x81/xa2 EGYPTIAN HIEROGLYPH C006 + /xf0/x93/x81/xa3 EGYPTIAN HIEROGLYPH C007 + /xf0/x93/x81/xa4 EGYPTIAN HIEROGLYPH C008 + /xf0/x93/x81/xa5 EGYPTIAN HIEROGLYPH C009 + /xf0/x93/x81/xa6 EGYPTIAN HIEROGLYPH C010 + /xf0/x93/x81/xa7 EGYPTIAN HIEROGLYPH C010A + /xf0/x93/x81/xa8 EGYPTIAN HIEROGLYPH C011 + /xf0/x93/x81/xa9 EGYPTIAN HIEROGLYPH C012 + /xf0/x93/x81/xaa EGYPTIAN HIEROGLYPH C013 + /xf0/x93/x81/xab EGYPTIAN HIEROGLYPH C014 + /xf0/x93/x81/xac EGYPTIAN HIEROGLYPH C015 + /xf0/x93/x81/xad EGYPTIAN HIEROGLYPH C016 + /xf0/x93/x81/xae EGYPTIAN HIEROGLYPH C017 + /xf0/x93/x81/xaf EGYPTIAN HIEROGLYPH C018 + /xf0/x93/x81/xb0 EGYPTIAN HIEROGLYPH C019 + /xf0/x93/x81/xb1 EGYPTIAN HIEROGLYPH C020 + /xf0/x93/x81/xb2 EGYPTIAN HIEROGLYPH C021 + /xf0/x93/x81/xb3 EGYPTIAN HIEROGLYPH C022 + /xf0/x93/x81/xb4 EGYPTIAN HIEROGLYPH C023 + /xf0/x93/x81/xb5 EGYPTIAN HIEROGLYPH C024 + /xf0/x93/x81/xb6 EGYPTIAN HIEROGLYPH D001 + /xf0/x93/x81/xb7 EGYPTIAN HIEROGLYPH D002 + /xf0/x93/x81/xb8 EGYPTIAN HIEROGLYPH D003 + /xf0/x93/x81/xb9 EGYPTIAN HIEROGLYPH D004 + /xf0/x93/x81/xba EGYPTIAN HIEROGLYPH D005 + /xf0/x93/x81/xbb EGYPTIAN HIEROGLYPH D006 + /xf0/x93/x81/xbc EGYPTIAN HIEROGLYPH D007 + /xf0/x93/x81/xbd EGYPTIAN HIEROGLYPH D008 + /xf0/x93/x81/xbe EGYPTIAN HIEROGLYPH D008A + /xf0/x93/x81/xbf EGYPTIAN HIEROGLYPH D009 + /xf0/x93/x82/x80 EGYPTIAN HIEROGLYPH D010 + /xf0/x93/x82/x81 EGYPTIAN HIEROGLYPH D011 + /xf0/x93/x82/x82 EGYPTIAN HIEROGLYPH D012 + /xf0/x93/x82/x83 EGYPTIAN HIEROGLYPH D013 + /xf0/x93/x82/x84 EGYPTIAN HIEROGLYPH D014 + /xf0/x93/x82/x85 EGYPTIAN HIEROGLYPH D015 + /xf0/x93/x82/x86 EGYPTIAN HIEROGLYPH D016 + /xf0/x93/x82/x87 EGYPTIAN HIEROGLYPH D017 + /xf0/x93/x82/x88 EGYPTIAN HIEROGLYPH D018 + /xf0/x93/x82/x89 EGYPTIAN HIEROGLYPH D019 + /xf0/x93/x82/x8a EGYPTIAN HIEROGLYPH D020 + /xf0/x93/x82/x8b EGYPTIAN HIEROGLYPH D021 + /xf0/x93/x82/x8c EGYPTIAN HIEROGLYPH D022 + /xf0/x93/x82/x8d EGYPTIAN HIEROGLYPH D023 + /xf0/x93/x82/x8e EGYPTIAN HIEROGLYPH D024 + /xf0/x93/x82/x8f EGYPTIAN HIEROGLYPH D025 + /xf0/x93/x82/x90 EGYPTIAN HIEROGLYPH D026 + /xf0/x93/x82/x91 EGYPTIAN HIEROGLYPH D027 + /xf0/x93/x82/x92 EGYPTIAN HIEROGLYPH D027A + /xf0/x93/x82/x93 EGYPTIAN HIEROGLYPH D028 + /xf0/x93/x82/x94 EGYPTIAN HIEROGLYPH D029 + /xf0/x93/x82/x95 EGYPTIAN HIEROGLYPH D030 + /xf0/x93/x82/x96 EGYPTIAN HIEROGLYPH D031 + /xf0/x93/x82/x97 EGYPTIAN HIEROGLYPH D031A + /xf0/x93/x82/x98 EGYPTIAN HIEROGLYPH D032 + /xf0/x93/x82/x99 EGYPTIAN HIEROGLYPH D033 + /xf0/x93/x82/x9a EGYPTIAN HIEROGLYPH D034 + /xf0/x93/x82/x9b EGYPTIAN HIEROGLYPH D034A + /xf0/x93/x82/x9c EGYPTIAN HIEROGLYPH D035 + /xf0/x93/x82/x9d EGYPTIAN HIEROGLYPH D036 + /xf0/x93/x82/x9e EGYPTIAN HIEROGLYPH D037 + /xf0/x93/x82/x9f EGYPTIAN HIEROGLYPH D038 + /xf0/x93/x82/xa0 EGYPTIAN HIEROGLYPH D039 + /xf0/x93/x82/xa1 EGYPTIAN HIEROGLYPH D040 + /xf0/x93/x82/xa2 EGYPTIAN HIEROGLYPH D041 + /xf0/x93/x82/xa3 EGYPTIAN HIEROGLYPH D042 + /xf0/x93/x82/xa4 EGYPTIAN HIEROGLYPH D043 + /xf0/x93/x82/xa5 EGYPTIAN HIEROGLYPH D044 + /xf0/x93/x82/xa6 EGYPTIAN HIEROGLYPH D045 + /xf0/x93/x82/xa7 EGYPTIAN HIEROGLYPH D046 + /xf0/x93/x82/xa8 EGYPTIAN HIEROGLYPH D046A + /xf0/x93/x82/xa9 EGYPTIAN HIEROGLYPH D047 + /xf0/x93/x82/xaa EGYPTIAN HIEROGLYPH D048 + /xf0/x93/x82/xab EGYPTIAN HIEROGLYPH D048A + /xf0/x93/x82/xac EGYPTIAN HIEROGLYPH D049 + /xf0/x93/x82/xad EGYPTIAN HIEROGLYPH D050 + /xf0/x93/x82/xae EGYPTIAN HIEROGLYPH D050A + /xf0/x93/x82/xaf EGYPTIAN HIEROGLYPH D050B + /xf0/x93/x82/xb0 EGYPTIAN HIEROGLYPH D050C + /xf0/x93/x82/xb1 EGYPTIAN HIEROGLYPH D050D + /xf0/x93/x82/xb2 EGYPTIAN HIEROGLYPH D050E + /xf0/x93/x82/xb3 EGYPTIAN HIEROGLYPH D050F + /xf0/x93/x82/xb4 EGYPTIAN HIEROGLYPH D050G + /xf0/x93/x82/xb5 EGYPTIAN HIEROGLYPH D050H + /xf0/x93/x82/xb6 EGYPTIAN HIEROGLYPH D050I + /xf0/x93/x82/xb7 EGYPTIAN HIEROGLYPH D051 + /xf0/x93/x82/xb8 EGYPTIAN HIEROGLYPH D052 + /xf0/x93/x82/xb9 EGYPTIAN HIEROGLYPH D052A + /xf0/x93/x82/xba EGYPTIAN HIEROGLYPH D053 + /xf0/x93/x82/xbb EGYPTIAN HIEROGLYPH D054 + /xf0/x93/x82/xbc EGYPTIAN HIEROGLYPH D054A + /xf0/x93/x82/xbd EGYPTIAN HIEROGLYPH D055 + /xf0/x93/x82/xbe EGYPTIAN HIEROGLYPH D056 + /xf0/x93/x82/xbf EGYPTIAN HIEROGLYPH D057 + /xf0/x93/x83/x80 EGYPTIAN HIEROGLYPH D058 + /xf0/x93/x83/x81 EGYPTIAN HIEROGLYPH D059 + /xf0/x93/x83/x82 EGYPTIAN HIEROGLYPH D060 + /xf0/x93/x83/x83 EGYPTIAN HIEROGLYPH D061 + /xf0/x93/x83/x84 EGYPTIAN HIEROGLYPH D062 + /xf0/x93/x83/x85 EGYPTIAN HIEROGLYPH D063 + /xf0/x93/x83/x86 EGYPTIAN HIEROGLYPH D064 + /xf0/x93/x83/x87 EGYPTIAN HIEROGLYPH D065 + /xf0/x93/x83/x88 EGYPTIAN HIEROGLYPH D066 + /xf0/x93/x83/x89 EGYPTIAN HIEROGLYPH D067 + /xf0/x93/x83/x8a EGYPTIAN HIEROGLYPH D067A + /xf0/x93/x83/x8b EGYPTIAN HIEROGLYPH D067B + /xf0/x93/x83/x8c EGYPTIAN HIEROGLYPH D067C + /xf0/x93/x83/x8d EGYPTIAN HIEROGLYPH D067D + /xf0/x93/x83/x8e EGYPTIAN HIEROGLYPH D067E + /xf0/x93/x83/x8f EGYPTIAN HIEROGLYPH D067F + /xf0/x93/x83/x90 EGYPTIAN HIEROGLYPH D067G + /xf0/x93/x83/x91 EGYPTIAN HIEROGLYPH D067H + /xf0/x93/x83/x92 EGYPTIAN HIEROGLYPH E001 + /xf0/x93/x83/x93 EGYPTIAN HIEROGLYPH E002 + /xf0/x93/x83/x94 EGYPTIAN HIEROGLYPH E003 + /xf0/x93/x83/x95 EGYPTIAN HIEROGLYPH E004 + /xf0/x93/x83/x96 EGYPTIAN HIEROGLYPH E005 + /xf0/x93/x83/x97 EGYPTIAN HIEROGLYPH E006 + /xf0/x93/x83/x98 EGYPTIAN HIEROGLYPH E007 + /xf0/x93/x83/x99 EGYPTIAN HIEROGLYPH E008 + /xf0/x93/x83/x9a EGYPTIAN HIEROGLYPH E008A + /xf0/x93/x83/x9b EGYPTIAN HIEROGLYPH E009 + /xf0/x93/x83/x9c EGYPTIAN HIEROGLYPH E009A + /xf0/x93/x83/x9d EGYPTIAN HIEROGLYPH E010 + /xf0/x93/x83/x9e EGYPTIAN HIEROGLYPH E011 + /xf0/x93/x83/x9f EGYPTIAN HIEROGLYPH E012 + /xf0/x93/x83/xa0 EGYPTIAN HIEROGLYPH E013 + /xf0/x93/x83/xa1 EGYPTIAN HIEROGLYPH E014 + /xf0/x93/x83/xa2 EGYPTIAN HIEROGLYPH E015 + /xf0/x93/x83/xa3 EGYPTIAN HIEROGLYPH E016 + /xf0/x93/x83/xa4 EGYPTIAN HIEROGLYPH E016A + /xf0/x93/x83/xa5 EGYPTIAN HIEROGLYPH E017 + /xf0/x93/x83/xa6 EGYPTIAN HIEROGLYPH E017A + /xf0/x93/x83/xa7 EGYPTIAN HIEROGLYPH E018 + /xf0/x93/x83/xa8 EGYPTIAN HIEROGLYPH E019 + /xf0/x93/x83/xa9 EGYPTIAN HIEROGLYPH E020 + /xf0/x93/x83/xaa EGYPTIAN HIEROGLYPH E020A + /xf0/x93/x83/xab EGYPTIAN HIEROGLYPH E021 + /xf0/x93/x83/xac EGYPTIAN HIEROGLYPH E022 + /xf0/x93/x83/xad EGYPTIAN HIEROGLYPH E023 + /xf0/x93/x83/xae EGYPTIAN HIEROGLYPH E024 + /xf0/x93/x83/xaf EGYPTIAN HIEROGLYPH E025 + /xf0/x93/x83/xb0 EGYPTIAN HIEROGLYPH E026 + /xf0/x93/x83/xb1 EGYPTIAN HIEROGLYPH E027 + /xf0/x93/x83/xb2 EGYPTIAN HIEROGLYPH E028 + /xf0/x93/x83/xb3 EGYPTIAN HIEROGLYPH E028A + /xf0/x93/x83/xb4 EGYPTIAN HIEROGLYPH E029 + /xf0/x93/x83/xb5 EGYPTIAN HIEROGLYPH E030 + /xf0/x93/x83/xb6 EGYPTIAN HIEROGLYPH E031 + /xf0/x93/x83/xb7 EGYPTIAN HIEROGLYPH E032 + /xf0/x93/x83/xb8 EGYPTIAN HIEROGLYPH E033 + /xf0/x93/x83/xb9 EGYPTIAN HIEROGLYPH E034 + /xf0/x93/x83/xba EGYPTIAN HIEROGLYPH E034A + /xf0/x93/x83/xbb EGYPTIAN HIEROGLYPH E036 + /xf0/x93/x83/xbc EGYPTIAN HIEROGLYPH E037 + /xf0/x93/x83/xbd EGYPTIAN HIEROGLYPH E038 + /xf0/x93/x83/xbe EGYPTIAN HIEROGLYPH F001 + /xf0/x93/x83/xbf EGYPTIAN HIEROGLYPH F001A + /xf0/x93/x84/x80 EGYPTIAN HIEROGLYPH F002 + /xf0/x93/x84/x81 EGYPTIAN HIEROGLYPH F003 + /xf0/x93/x84/x82 EGYPTIAN HIEROGLYPH F004 + /xf0/x93/x84/x83 EGYPTIAN HIEROGLYPH F005 + /xf0/x93/x84/x84 EGYPTIAN HIEROGLYPH F006 + /xf0/x93/x84/x85 EGYPTIAN HIEROGLYPH F007 + /xf0/x93/x84/x86 EGYPTIAN HIEROGLYPH F008 + /xf0/x93/x84/x87 EGYPTIAN HIEROGLYPH F009 + /xf0/x93/x84/x88 EGYPTIAN HIEROGLYPH F010 + /xf0/x93/x84/x89 EGYPTIAN HIEROGLYPH F011 + /xf0/x93/x84/x8a EGYPTIAN HIEROGLYPH F012 + /xf0/x93/x84/x8b EGYPTIAN HIEROGLYPH F013 + /xf0/x93/x84/x8c EGYPTIAN HIEROGLYPH F013A + /xf0/x93/x84/x8d EGYPTIAN HIEROGLYPH F014 + /xf0/x93/x84/x8e EGYPTIAN HIEROGLYPH F015 + /xf0/x93/x84/x8f EGYPTIAN HIEROGLYPH F016 + /xf0/x93/x84/x90 EGYPTIAN HIEROGLYPH F017 + /xf0/x93/x84/x91 EGYPTIAN HIEROGLYPH F018 + /xf0/x93/x84/x92 EGYPTIAN HIEROGLYPH F019 + /xf0/x93/x84/x93 EGYPTIAN HIEROGLYPH F020 + /xf0/x93/x84/x94 EGYPTIAN HIEROGLYPH F021 + /xf0/x93/x84/x95 EGYPTIAN HIEROGLYPH F021A + /xf0/x93/x84/x96 EGYPTIAN HIEROGLYPH F022 + /xf0/x93/x84/x97 EGYPTIAN HIEROGLYPH F023 + /xf0/x93/x84/x98 EGYPTIAN HIEROGLYPH F024 + /xf0/x93/x84/x99 EGYPTIAN HIEROGLYPH F025 + /xf0/x93/x84/x9a EGYPTIAN HIEROGLYPH F026 + /xf0/x93/x84/x9b EGYPTIAN HIEROGLYPH F027 + /xf0/x93/x84/x9c EGYPTIAN HIEROGLYPH F028 + /xf0/x93/x84/x9d EGYPTIAN HIEROGLYPH F029 + /xf0/x93/x84/x9e EGYPTIAN HIEROGLYPH F030 + /xf0/x93/x84/x9f EGYPTIAN HIEROGLYPH F031 + /xf0/x93/x84/xa0 EGYPTIAN HIEROGLYPH F031A + /xf0/x93/x84/xa1 EGYPTIAN HIEROGLYPH F032 + /xf0/x93/x84/xa2 EGYPTIAN HIEROGLYPH F033 + /xf0/x93/x84/xa3 EGYPTIAN HIEROGLYPH F034 + /xf0/x93/x84/xa4 EGYPTIAN HIEROGLYPH F035 + /xf0/x93/x84/xa5 EGYPTIAN HIEROGLYPH F036 + /xf0/x93/x84/xa6 EGYPTIAN HIEROGLYPH F037 + /xf0/x93/x84/xa7 EGYPTIAN HIEROGLYPH F037A + /xf0/x93/x84/xa8 EGYPTIAN HIEROGLYPH F038 + /xf0/x93/x84/xa9 EGYPTIAN HIEROGLYPH F038A + /xf0/x93/x84/xaa EGYPTIAN HIEROGLYPH F039 + /xf0/x93/x84/xab EGYPTIAN HIEROGLYPH F040 + /xf0/x93/x84/xac EGYPTIAN HIEROGLYPH F041 + /xf0/x93/x84/xad EGYPTIAN HIEROGLYPH F042 + /xf0/x93/x84/xae EGYPTIAN HIEROGLYPH F043 + /xf0/x93/x84/xaf EGYPTIAN HIEROGLYPH F044 + /xf0/x93/x84/xb0 EGYPTIAN HIEROGLYPH F045 + /xf0/x93/x84/xb1 EGYPTIAN HIEROGLYPH F045A + /xf0/x93/x84/xb2 EGYPTIAN HIEROGLYPH F046 + /xf0/x93/x84/xb3 EGYPTIAN HIEROGLYPH F046A + /xf0/x93/x84/xb4 EGYPTIAN HIEROGLYPH F047 + /xf0/x93/x84/xb5 EGYPTIAN HIEROGLYPH F047A + /xf0/x93/x84/xb6 EGYPTIAN HIEROGLYPH F048 + /xf0/x93/x84/xb7 EGYPTIAN HIEROGLYPH F049 + /xf0/x93/x84/xb8 EGYPTIAN HIEROGLYPH F050 + /xf0/x93/x84/xb9 EGYPTIAN HIEROGLYPH F051 + /xf0/x93/x84/xba EGYPTIAN HIEROGLYPH F051A + /xf0/x93/x84/xbb EGYPTIAN HIEROGLYPH F051B + /xf0/x93/x84/xbc EGYPTIAN HIEROGLYPH F051C + /xf0/x93/x84/xbd EGYPTIAN HIEROGLYPH F052 + /xf0/x93/x84/xbe EGYPTIAN HIEROGLYPH F053 + /xf0/x93/x84/xbf EGYPTIAN HIEROGLYPH G001 + /xf0/x93/x85/x80 EGYPTIAN HIEROGLYPH G002 + /xf0/x93/x85/x81 EGYPTIAN HIEROGLYPH G003 + /xf0/x93/x85/x82 EGYPTIAN HIEROGLYPH G004 + /xf0/x93/x85/x83 EGYPTIAN HIEROGLYPH G005 + /xf0/x93/x85/x84 EGYPTIAN HIEROGLYPH G006 + /xf0/x93/x85/x85 EGYPTIAN HIEROGLYPH G006A + /xf0/x93/x85/x86 EGYPTIAN HIEROGLYPH G007 + /xf0/x93/x85/x87 EGYPTIAN HIEROGLYPH G007A + /xf0/x93/x85/x88 EGYPTIAN HIEROGLYPH G007B + /xf0/x93/x85/x89 EGYPTIAN HIEROGLYPH G008 + /xf0/x93/x85/x8a EGYPTIAN HIEROGLYPH G009 + /xf0/x93/x85/x8b EGYPTIAN HIEROGLYPH G010 + /xf0/x93/x85/x8c EGYPTIAN HIEROGLYPH G011 + /xf0/x93/x85/x8d EGYPTIAN HIEROGLYPH G011A + /xf0/x93/x85/x8e EGYPTIAN HIEROGLYPH G012 + /xf0/x93/x85/x8f EGYPTIAN HIEROGLYPH G013 + /xf0/x93/x85/x90 EGYPTIAN HIEROGLYPH G014 + /xf0/x93/x85/x91 EGYPTIAN HIEROGLYPH G015 + /xf0/x93/x85/x92 EGYPTIAN HIEROGLYPH G016 + /xf0/x93/x85/x93 EGYPTIAN HIEROGLYPH G017 + /xf0/x93/x85/x94 EGYPTIAN HIEROGLYPH G018 + /xf0/x93/x85/x95 EGYPTIAN HIEROGLYPH G019 + /xf0/x93/x85/x96 EGYPTIAN HIEROGLYPH G020 + /xf0/x93/x85/x97 EGYPTIAN HIEROGLYPH G020A + /xf0/x93/x85/x98 EGYPTIAN HIEROGLYPH G021 + /xf0/x93/x85/x99 EGYPTIAN HIEROGLYPH G022 + /xf0/x93/x85/x9a EGYPTIAN HIEROGLYPH G023 + /xf0/x93/x85/x9b EGYPTIAN HIEROGLYPH G024 + /xf0/x93/x85/x9c EGYPTIAN HIEROGLYPH G025 + /xf0/x93/x85/x9d EGYPTIAN HIEROGLYPH G026 + /xf0/x93/x85/x9e EGYPTIAN HIEROGLYPH G026A + /xf0/x93/x85/x9f EGYPTIAN HIEROGLYPH G027 + /xf0/x93/x85/xa0 EGYPTIAN HIEROGLYPH G028 + /xf0/x93/x85/xa1 EGYPTIAN HIEROGLYPH G029 + /xf0/x93/x85/xa2 EGYPTIAN HIEROGLYPH G030 + /xf0/x93/x85/xa3 EGYPTIAN HIEROGLYPH G031 + /xf0/x93/x85/xa4 EGYPTIAN HIEROGLYPH G032 + /xf0/x93/x85/xa5 EGYPTIAN HIEROGLYPH G033 + /xf0/x93/x85/xa6 EGYPTIAN HIEROGLYPH G034 + /xf0/x93/x85/xa7 EGYPTIAN HIEROGLYPH G035 + /xf0/x93/x85/xa8 EGYPTIAN HIEROGLYPH G036 + /xf0/x93/x85/xa9 EGYPTIAN HIEROGLYPH G036A + /xf0/x93/x85/xaa EGYPTIAN HIEROGLYPH G037 + /xf0/x93/x85/xab EGYPTIAN HIEROGLYPH G037A + /xf0/x93/x85/xac EGYPTIAN HIEROGLYPH G038 + /xf0/x93/x85/xad EGYPTIAN HIEROGLYPH G039 + /xf0/x93/x85/xae EGYPTIAN HIEROGLYPH G040 + /xf0/x93/x85/xaf EGYPTIAN HIEROGLYPH G041 + /xf0/x93/x85/xb0 EGYPTIAN HIEROGLYPH G042 + /xf0/x93/x85/xb1 EGYPTIAN HIEROGLYPH G043 + /xf0/x93/x85/xb2 EGYPTIAN HIEROGLYPH G043A + /xf0/x93/x85/xb3 EGYPTIAN HIEROGLYPH G044 + /xf0/x93/x85/xb4 EGYPTIAN HIEROGLYPH G045 + /xf0/x93/x85/xb5 EGYPTIAN HIEROGLYPH G045A + /xf0/x93/x85/xb6 EGYPTIAN HIEROGLYPH G046 + /xf0/x93/x85/xb7 EGYPTIAN HIEROGLYPH G047 + /xf0/x93/x85/xb8 EGYPTIAN HIEROGLYPH G048 + /xf0/x93/x85/xb9 EGYPTIAN HIEROGLYPH G049 + /xf0/x93/x85/xba EGYPTIAN HIEROGLYPH G050 + /xf0/x93/x85/xbb EGYPTIAN HIEROGLYPH G051 + /xf0/x93/x85/xbc EGYPTIAN HIEROGLYPH G052 + /xf0/x93/x85/xbd EGYPTIAN HIEROGLYPH G053 + /xf0/x93/x85/xbe EGYPTIAN HIEROGLYPH G054 + /xf0/x93/x85/xbf EGYPTIAN HIEROGLYPH H001 + /xf0/x93/x86/x80 EGYPTIAN HIEROGLYPH H002 + /xf0/x93/x86/x81 EGYPTIAN HIEROGLYPH H003 + /xf0/x93/x86/x82 EGYPTIAN HIEROGLYPH H004 + /xf0/x93/x86/x83 EGYPTIAN HIEROGLYPH H005 + /xf0/x93/x86/x84 EGYPTIAN HIEROGLYPH H006 + /xf0/x93/x86/x85 EGYPTIAN HIEROGLYPH H006A + /xf0/x93/x86/x86 EGYPTIAN HIEROGLYPH H007 + /xf0/x93/x86/x87 EGYPTIAN HIEROGLYPH H008 + /xf0/x93/x86/x88 EGYPTIAN HIEROGLYPH I001 + /xf0/x93/x86/x89 EGYPTIAN HIEROGLYPH I002 + /xf0/x93/x86/x8a EGYPTIAN HIEROGLYPH I003 + /xf0/x93/x86/x8b EGYPTIAN HIEROGLYPH I004 + /xf0/x93/x86/x8c EGYPTIAN HIEROGLYPH I005 + /xf0/x93/x86/x8d EGYPTIAN HIEROGLYPH I005A + /xf0/x93/x86/x8e EGYPTIAN HIEROGLYPH I006 + /xf0/x93/x86/x8f EGYPTIAN HIEROGLYPH I007 + /xf0/x93/x86/x90 EGYPTIAN HIEROGLYPH I008 + /xf0/x93/x86/x91 EGYPTIAN HIEROGLYPH I009 + /xf0/x93/x86/x92 EGYPTIAN HIEROGLYPH I009A + /xf0/x93/x86/x93 EGYPTIAN HIEROGLYPH I010 + /xf0/x93/x86/x94 EGYPTIAN HIEROGLYPH I010A + /xf0/x93/x86/x95 EGYPTIAN HIEROGLYPH I011 + /xf0/x93/x86/x96 EGYPTIAN HIEROGLYPH I011A + /xf0/x93/x86/x97 EGYPTIAN HIEROGLYPH I012 + /xf0/x93/x86/x98 EGYPTIAN HIEROGLYPH I013 + /xf0/x93/x86/x99 EGYPTIAN HIEROGLYPH I014 + /xf0/x93/x86/x9a EGYPTIAN HIEROGLYPH I015 + /xf0/x93/x86/x9b EGYPTIAN HIEROGLYPH K001 + /xf0/x93/x86/x9c EGYPTIAN HIEROGLYPH K002 + /xf0/x93/x86/x9d EGYPTIAN HIEROGLYPH K003 + /xf0/x93/x86/x9e EGYPTIAN HIEROGLYPH K004 + /xf0/x93/x86/x9f EGYPTIAN HIEROGLYPH K005 + /xf0/x93/x86/xa0 EGYPTIAN HIEROGLYPH K006 + /xf0/x93/x86/xa1 EGYPTIAN HIEROGLYPH K007 + /xf0/x93/x86/xa2 EGYPTIAN HIEROGLYPH K008 + /xf0/x93/x86/xa3 EGYPTIAN HIEROGLYPH L001 + /xf0/x93/x86/xa4 EGYPTIAN HIEROGLYPH L002 + /xf0/x93/x86/xa5 EGYPTIAN HIEROGLYPH L002A + /xf0/x93/x86/xa6 EGYPTIAN HIEROGLYPH L003 + /xf0/x93/x86/xa7 EGYPTIAN HIEROGLYPH L004 + /xf0/x93/x86/xa8 EGYPTIAN HIEROGLYPH L005 + /xf0/x93/x86/xa9 EGYPTIAN HIEROGLYPH L006 + /xf0/x93/x86/xaa EGYPTIAN HIEROGLYPH L006A + /xf0/x93/x86/xab EGYPTIAN HIEROGLYPH L007 + /xf0/x93/x86/xac EGYPTIAN HIEROGLYPH L008 + /xf0/x93/x86/xad EGYPTIAN HIEROGLYPH M001 + /xf0/x93/x86/xae EGYPTIAN HIEROGLYPH M001A + /xf0/x93/x86/xaf EGYPTIAN HIEROGLYPH M001B + /xf0/x93/x86/xb0 EGYPTIAN HIEROGLYPH M002 + /xf0/x93/x86/xb1 EGYPTIAN HIEROGLYPH M003 + /xf0/x93/x86/xb2 EGYPTIAN HIEROGLYPH M003A + /xf0/x93/x86/xb3 EGYPTIAN HIEROGLYPH M004 + /xf0/x93/x86/xb4 EGYPTIAN HIEROGLYPH M005 + /xf0/x93/x86/xb5 EGYPTIAN HIEROGLYPH M006 + /xf0/x93/x86/xb6 EGYPTIAN HIEROGLYPH M007 + /xf0/x93/x86/xb7 EGYPTIAN HIEROGLYPH M008 + /xf0/x93/x86/xb8 EGYPTIAN HIEROGLYPH M009 + /xf0/x93/x86/xb9 EGYPTIAN HIEROGLYPH M010 + /xf0/x93/x86/xba EGYPTIAN HIEROGLYPH M010A + /xf0/x93/x86/xbb EGYPTIAN HIEROGLYPH M011 + /xf0/x93/x86/xbc EGYPTIAN HIEROGLYPH M012 + /xf0/x93/x86/xbd EGYPTIAN HIEROGLYPH M012A + /xf0/x93/x86/xbe EGYPTIAN HIEROGLYPH M012B + /xf0/x93/x86/xbf EGYPTIAN HIEROGLYPH M012C + /xf0/x93/x87/x80 EGYPTIAN HIEROGLYPH M012D + /xf0/x93/x87/x81 EGYPTIAN HIEROGLYPH M012E + /xf0/x93/x87/x82 EGYPTIAN HIEROGLYPH M012F + /xf0/x93/x87/x83 EGYPTIAN HIEROGLYPH M012G + /xf0/x93/x87/x84 EGYPTIAN HIEROGLYPH M012H + /xf0/x93/x87/x85 EGYPTIAN HIEROGLYPH M013 + /xf0/x93/x87/x86 EGYPTIAN HIEROGLYPH M014 + /xf0/x93/x87/x87 EGYPTIAN HIEROGLYPH M015 + /xf0/x93/x87/x88 EGYPTIAN HIEROGLYPH M015A + /xf0/x93/x87/x89 EGYPTIAN HIEROGLYPH M016 + /xf0/x93/x87/x8a EGYPTIAN HIEROGLYPH M016A + /xf0/x93/x87/x8b EGYPTIAN HIEROGLYPH M017 + /xf0/x93/x87/x8c EGYPTIAN HIEROGLYPH M017A + /xf0/x93/x87/x8d EGYPTIAN HIEROGLYPH M018 + /xf0/x93/x87/x8e EGYPTIAN HIEROGLYPH M019 + /xf0/x93/x87/x8f EGYPTIAN HIEROGLYPH M020 + /xf0/x93/x87/x90 EGYPTIAN HIEROGLYPH M021 + /xf0/x93/x87/x91 EGYPTIAN HIEROGLYPH M022 + /xf0/x93/x87/x92 EGYPTIAN HIEROGLYPH M022A + /xf0/x93/x87/x93 EGYPTIAN HIEROGLYPH M023 + /xf0/x93/x87/x94 EGYPTIAN HIEROGLYPH M024 + /xf0/x93/x87/x95 EGYPTIAN HIEROGLYPH M024A + /xf0/x93/x87/x96 EGYPTIAN HIEROGLYPH M025 + /xf0/x93/x87/x97 EGYPTIAN HIEROGLYPH M026 + /xf0/x93/x87/x98 EGYPTIAN HIEROGLYPH M027 + /xf0/x93/x87/x99 EGYPTIAN HIEROGLYPH M028 + /xf0/x93/x87/x9a EGYPTIAN HIEROGLYPH M028A + /xf0/x93/x87/x9b EGYPTIAN HIEROGLYPH M029 + /xf0/x93/x87/x9c EGYPTIAN HIEROGLYPH M030 + /xf0/x93/x87/x9d EGYPTIAN HIEROGLYPH M031 + /xf0/x93/x87/x9e EGYPTIAN HIEROGLYPH M031A + /xf0/x93/x87/x9f EGYPTIAN HIEROGLYPH M032 + /xf0/x93/x87/xa0 EGYPTIAN HIEROGLYPH M033 + /xf0/x93/x87/xa1 EGYPTIAN HIEROGLYPH M033A + /xf0/x93/x87/xa2 EGYPTIAN HIEROGLYPH M033B + /xf0/x93/x87/xa3 EGYPTIAN HIEROGLYPH M034 + /xf0/x93/x87/xa4 EGYPTIAN HIEROGLYPH M035 + /xf0/x93/x87/xa5 EGYPTIAN HIEROGLYPH M036 + /xf0/x93/x87/xa6 EGYPTIAN HIEROGLYPH M037 + /xf0/x93/x87/xa7 EGYPTIAN HIEROGLYPH M038 + /xf0/x93/x87/xa8 EGYPTIAN HIEROGLYPH M039 + /xf0/x93/x87/xa9 EGYPTIAN HIEROGLYPH M040 + /xf0/x93/x87/xaa EGYPTIAN HIEROGLYPH M040A + /xf0/x93/x87/xab EGYPTIAN HIEROGLYPH M041 + /xf0/x93/x87/xac EGYPTIAN HIEROGLYPH M042 + /xf0/x93/x87/xad EGYPTIAN HIEROGLYPH M043 + /xf0/x93/x87/xae EGYPTIAN HIEROGLYPH M044 + /xf0/x93/x87/xaf EGYPTIAN HIEROGLYPH N001 + /xf0/x93/x87/xb0 EGYPTIAN HIEROGLYPH N002 + /xf0/x93/x87/xb1 EGYPTIAN HIEROGLYPH N003 + /xf0/x93/x87/xb2 EGYPTIAN HIEROGLYPH N004 + /xf0/x93/x87/xb3 EGYPTIAN HIEROGLYPH N005 + /xf0/x93/x87/xb4 EGYPTIAN HIEROGLYPH N006 + /xf0/x93/x87/xb5 EGYPTIAN HIEROGLYPH N007 + /xf0/x93/x87/xb6 EGYPTIAN HIEROGLYPH N008 + /xf0/x93/x87/xb7 EGYPTIAN HIEROGLYPH N009 + /xf0/x93/x87/xb8 EGYPTIAN HIEROGLYPH N010 + /xf0/x93/x87/xb9 EGYPTIAN HIEROGLYPH N011 + /xf0/x93/x87/xba EGYPTIAN HIEROGLYPH N012 + /xf0/x93/x87/xbb EGYPTIAN HIEROGLYPH N013 + /xf0/x93/x87/xbc EGYPTIAN HIEROGLYPH N014 + /xf0/x93/x87/xbd EGYPTIAN HIEROGLYPH N015 + /xf0/x93/x87/xbe EGYPTIAN HIEROGLYPH N016 + /xf0/x93/x87/xbf EGYPTIAN HIEROGLYPH N017 + /xf0/x93/x88/x80 EGYPTIAN HIEROGLYPH N018 + /xf0/x93/x88/x81 EGYPTIAN HIEROGLYPH N018A + /xf0/x93/x88/x82 EGYPTIAN HIEROGLYPH N018B + /xf0/x93/x88/x83 EGYPTIAN HIEROGLYPH N019 + /xf0/x93/x88/x84 EGYPTIAN HIEROGLYPH N020 + /xf0/x93/x88/x85 EGYPTIAN HIEROGLYPH N021 + /xf0/x93/x88/x86 EGYPTIAN HIEROGLYPH N022 + /xf0/x93/x88/x87 EGYPTIAN HIEROGLYPH N023 + /xf0/x93/x88/x88 EGYPTIAN HIEROGLYPH N024 + /xf0/x93/x88/x89 EGYPTIAN HIEROGLYPH N025 + /xf0/x93/x88/x8a EGYPTIAN HIEROGLYPH N025A + /xf0/x93/x88/x8b EGYPTIAN HIEROGLYPH N026 + /xf0/x93/x88/x8c EGYPTIAN HIEROGLYPH N027 + /xf0/x93/x88/x8d EGYPTIAN HIEROGLYPH N028 + /xf0/x93/x88/x8e EGYPTIAN HIEROGLYPH N029 + /xf0/x93/x88/x8f EGYPTIAN HIEROGLYPH N030 + /xf0/x93/x88/x90 EGYPTIAN HIEROGLYPH N031 + /xf0/x93/x88/x91 EGYPTIAN HIEROGLYPH N032 + /xf0/x93/x88/x92 EGYPTIAN HIEROGLYPH N033 + /xf0/x93/x88/x93 EGYPTIAN HIEROGLYPH N033A + /xf0/x93/x88/x94 EGYPTIAN HIEROGLYPH N034 + /xf0/x93/x88/x95 EGYPTIAN HIEROGLYPH N034A + /xf0/x93/x88/x96 EGYPTIAN HIEROGLYPH N035 + /xf0/x93/x88/x97 EGYPTIAN HIEROGLYPH N035A + /xf0/x93/x88/x98 EGYPTIAN HIEROGLYPH N036 + /xf0/x93/x88/x99 EGYPTIAN HIEROGLYPH N037 + /xf0/x93/x88/x9a EGYPTIAN HIEROGLYPH N037A + /xf0/x93/x88/x9b EGYPTIAN HIEROGLYPH N038 + /xf0/x93/x88/x9c EGYPTIAN HIEROGLYPH N039 + /xf0/x93/x88/x9d EGYPTIAN HIEROGLYPH N040 + /xf0/x93/x88/x9e EGYPTIAN HIEROGLYPH N041 + /xf0/x93/x88/x9f EGYPTIAN HIEROGLYPH N042 + /xf0/x93/x88/xa0 EGYPTIAN HIEROGLYPH NL001 + /xf0/x93/x88/xa1 EGYPTIAN HIEROGLYPH NL002 + /xf0/x93/x88/xa2 EGYPTIAN HIEROGLYPH NL003 + /xf0/x93/x88/xa3 EGYPTIAN HIEROGLYPH NL004 + /xf0/x93/x88/xa4 EGYPTIAN HIEROGLYPH NL005 + /xf0/x93/x88/xa5 EGYPTIAN HIEROGLYPH NL005A + /xf0/x93/x88/xa6 EGYPTIAN HIEROGLYPH NL006 + /xf0/x93/x88/xa7 EGYPTIAN HIEROGLYPH NL007 + /xf0/x93/x88/xa8 EGYPTIAN HIEROGLYPH NL008 + /xf0/x93/x88/xa9 EGYPTIAN HIEROGLYPH NL009 + /xf0/x93/x88/xaa EGYPTIAN HIEROGLYPH NL010 + /xf0/x93/x88/xab EGYPTIAN HIEROGLYPH NL011 + /xf0/x93/x88/xac EGYPTIAN HIEROGLYPH NL012 + /xf0/x93/x88/xad EGYPTIAN HIEROGLYPH NL013 + /xf0/x93/x88/xae EGYPTIAN HIEROGLYPH NL014 + /xf0/x93/x88/xaf EGYPTIAN HIEROGLYPH NL015 + /xf0/x93/x88/xb0 EGYPTIAN HIEROGLYPH NL016 + /xf0/x93/x88/xb1 EGYPTIAN HIEROGLYPH NL017 + /xf0/x93/x88/xb2 EGYPTIAN HIEROGLYPH NL017A + /xf0/x93/x88/xb3 EGYPTIAN HIEROGLYPH NL018 + /xf0/x93/x88/xb4 EGYPTIAN HIEROGLYPH NL019 + /xf0/x93/x88/xb5 EGYPTIAN HIEROGLYPH NL020 + /xf0/x93/x88/xb6 EGYPTIAN HIEROGLYPH NU001 + /xf0/x93/x88/xb7 EGYPTIAN HIEROGLYPH NU002 + /xf0/x93/x88/xb8 EGYPTIAN HIEROGLYPH NU003 + /xf0/x93/x88/xb9 EGYPTIAN HIEROGLYPH NU004 + /xf0/x93/x88/xba EGYPTIAN HIEROGLYPH NU005 + /xf0/x93/x88/xbb EGYPTIAN HIEROGLYPH NU006 + /xf0/x93/x88/xbc EGYPTIAN HIEROGLYPH NU007 + /xf0/x93/x88/xbd EGYPTIAN HIEROGLYPH NU008 + /xf0/x93/x88/xbe EGYPTIAN HIEROGLYPH NU009 + /xf0/x93/x88/xbf EGYPTIAN HIEROGLYPH NU010 + /xf0/x93/x89/x80 EGYPTIAN HIEROGLYPH NU010A + /xf0/x93/x89/x81 EGYPTIAN HIEROGLYPH NU011 + /xf0/x93/x89/x82 EGYPTIAN HIEROGLYPH NU011A + /xf0/x93/x89/x83 EGYPTIAN HIEROGLYPH NU012 + /xf0/x93/x89/x84 EGYPTIAN HIEROGLYPH NU013 + /xf0/x93/x89/x85 EGYPTIAN HIEROGLYPH NU014 + /xf0/x93/x89/x86 EGYPTIAN HIEROGLYPH NU015 + /xf0/x93/x89/x87 EGYPTIAN HIEROGLYPH NU016 + /xf0/x93/x89/x88 EGYPTIAN HIEROGLYPH NU017 + /xf0/x93/x89/x89 EGYPTIAN HIEROGLYPH NU018 + /xf0/x93/x89/x8a EGYPTIAN HIEROGLYPH NU018A + /xf0/x93/x89/x8b EGYPTIAN HIEROGLYPH NU019 + /xf0/x93/x89/x8c EGYPTIAN HIEROGLYPH NU020 + /xf0/x93/x89/x8d EGYPTIAN HIEROGLYPH NU021 + /xf0/x93/x89/x8e EGYPTIAN HIEROGLYPH NU022 + /xf0/x93/x89/x8f EGYPTIAN HIEROGLYPH NU022A + /xf0/x93/x89/x90 EGYPTIAN HIEROGLYPH O001 + /xf0/x93/x89/x91 EGYPTIAN HIEROGLYPH O001A + /xf0/x93/x89/x92 EGYPTIAN HIEROGLYPH O002 + /xf0/x93/x89/x93 EGYPTIAN HIEROGLYPH O003 + /xf0/x93/x89/x94 EGYPTIAN HIEROGLYPH O004 + /xf0/x93/x89/x95 EGYPTIAN HIEROGLYPH O005 + /xf0/x93/x89/x96 EGYPTIAN HIEROGLYPH O005A + /xf0/x93/x89/x97 EGYPTIAN HIEROGLYPH O006 + /xf0/x93/x89/x98 EGYPTIAN HIEROGLYPH O006A + /xf0/x93/x89/x99 EGYPTIAN HIEROGLYPH O006B + /xf0/x93/x89/x9a EGYPTIAN HIEROGLYPH O006C + /xf0/x93/x89/x9b EGYPTIAN HIEROGLYPH O006D + /xf0/x93/x89/x9c EGYPTIAN HIEROGLYPH O006E + /xf0/x93/x89/x9d EGYPTIAN HIEROGLYPH O006F + /xf0/x93/x89/x9e EGYPTIAN HIEROGLYPH O007 + /xf0/x93/x89/x9f EGYPTIAN HIEROGLYPH O008 + /xf0/x93/x89/xa0 EGYPTIAN HIEROGLYPH O009 + /xf0/x93/x89/xa1 EGYPTIAN HIEROGLYPH O010 + /xf0/x93/x89/xa2 EGYPTIAN HIEROGLYPH O010A + /xf0/x93/x89/xa3 EGYPTIAN HIEROGLYPH O010B + /xf0/x93/x89/xa4 EGYPTIAN HIEROGLYPH O010C + /xf0/x93/x89/xa5 EGYPTIAN HIEROGLYPH O011 + /xf0/x93/x89/xa6 EGYPTIAN HIEROGLYPH O012 + /xf0/x93/x89/xa7 EGYPTIAN HIEROGLYPH O013 + /xf0/x93/x89/xa8 EGYPTIAN HIEROGLYPH O014 + /xf0/x93/x89/xa9 EGYPTIAN HIEROGLYPH O015 + /xf0/x93/x89/xaa EGYPTIAN HIEROGLYPH O016 + /xf0/x93/x89/xab EGYPTIAN HIEROGLYPH O017 + /xf0/x93/x89/xac EGYPTIAN HIEROGLYPH O018 + /xf0/x93/x89/xad EGYPTIAN HIEROGLYPH O019 + /xf0/x93/x89/xae EGYPTIAN HIEROGLYPH O019A + /xf0/x93/x89/xaf EGYPTIAN HIEROGLYPH O020 + /xf0/x93/x89/xb0 EGYPTIAN HIEROGLYPH O020A + /xf0/x93/x89/xb1 EGYPTIAN HIEROGLYPH O021 + /xf0/x93/x89/xb2 EGYPTIAN HIEROGLYPH O022 + /xf0/x93/x89/xb3 EGYPTIAN HIEROGLYPH O023 + /xf0/x93/x89/xb4 EGYPTIAN HIEROGLYPH O024 + /xf0/x93/x89/xb5 EGYPTIAN HIEROGLYPH O024A + /xf0/x93/x89/xb6 EGYPTIAN HIEROGLYPH O025 + /xf0/x93/x89/xb7 EGYPTIAN HIEROGLYPH O025A + /xf0/x93/x89/xb8 EGYPTIAN HIEROGLYPH O026 + /xf0/x93/x89/xb9 EGYPTIAN HIEROGLYPH O027 + /xf0/x93/x89/xba EGYPTIAN HIEROGLYPH O028 + /xf0/x93/x89/xbb EGYPTIAN HIEROGLYPH O029 + /xf0/x93/x89/xbc EGYPTIAN HIEROGLYPH O029A + /xf0/x93/x89/xbd EGYPTIAN HIEROGLYPH O030 + /xf0/x93/x89/xbe EGYPTIAN HIEROGLYPH O030A + /xf0/x93/x89/xbf EGYPTIAN HIEROGLYPH O031 + /xf0/x93/x8a/x80 EGYPTIAN HIEROGLYPH O032 + /xf0/x93/x8a/x81 EGYPTIAN HIEROGLYPH O033 + /xf0/x93/x8a/x82 EGYPTIAN HIEROGLYPH O033A + /xf0/x93/x8a/x83 EGYPTIAN HIEROGLYPH O034 + /xf0/x93/x8a/x84 EGYPTIAN HIEROGLYPH O035 + /xf0/x93/x8a/x85 EGYPTIAN HIEROGLYPH O036 + /xf0/x93/x8a/x86 EGYPTIAN HIEROGLYPH O036A + /xf0/x93/x8a/x87 EGYPTIAN HIEROGLYPH O036B + /xf0/x93/x8a/x88 EGYPTIAN HIEROGLYPH O036C + /xf0/x93/x8a/x89 EGYPTIAN HIEROGLYPH O036D + /xf0/x93/x8a/x8a EGYPTIAN HIEROGLYPH O037 + /xf0/x93/x8a/x8b EGYPTIAN HIEROGLYPH O038 + /xf0/x93/x8a/x8c EGYPTIAN HIEROGLYPH O039 + /xf0/x93/x8a/x8d EGYPTIAN HIEROGLYPH O040 + /xf0/x93/x8a/x8e EGYPTIAN HIEROGLYPH O041 + /xf0/x93/x8a/x8f EGYPTIAN HIEROGLYPH O042 + /xf0/x93/x8a/x90 EGYPTIAN HIEROGLYPH O043 + /xf0/x93/x8a/x91 EGYPTIAN HIEROGLYPH O044 + /xf0/x93/x8a/x92 EGYPTIAN HIEROGLYPH O045 + /xf0/x93/x8a/x93 EGYPTIAN HIEROGLYPH O046 + /xf0/x93/x8a/x94 EGYPTIAN HIEROGLYPH O047 + /xf0/x93/x8a/x95 EGYPTIAN HIEROGLYPH O048 + /xf0/x93/x8a/x96 EGYPTIAN HIEROGLYPH O049 + /xf0/x93/x8a/x97 EGYPTIAN HIEROGLYPH O050 + /xf0/x93/x8a/x98 EGYPTIAN HIEROGLYPH O050A + /xf0/x93/x8a/x99 EGYPTIAN HIEROGLYPH O050B + /xf0/x93/x8a/x9a EGYPTIAN HIEROGLYPH O051 + /xf0/x93/x8a/x9b EGYPTIAN HIEROGLYPH P001 + /xf0/x93/x8a/x9c EGYPTIAN HIEROGLYPH P001A + /xf0/x93/x8a/x9d EGYPTIAN HIEROGLYPH P002 + /xf0/x93/x8a/x9e EGYPTIAN HIEROGLYPH P003 + /xf0/x93/x8a/x9f EGYPTIAN HIEROGLYPH P003A + /xf0/x93/x8a/xa0 EGYPTIAN HIEROGLYPH P004 + /xf0/x93/x8a/xa1 EGYPTIAN HIEROGLYPH P005 + /xf0/x93/x8a/xa2 EGYPTIAN HIEROGLYPH P006 + /xf0/x93/x8a/xa3 EGYPTIAN HIEROGLYPH P007 + /xf0/x93/x8a/xa4 EGYPTIAN HIEROGLYPH P008 + /xf0/x93/x8a/xa5 EGYPTIAN HIEROGLYPH P009 + /xf0/x93/x8a/xa6 EGYPTIAN HIEROGLYPH P010 + /xf0/x93/x8a/xa7 EGYPTIAN HIEROGLYPH P011 + /xf0/x93/x8a/xa8 EGYPTIAN HIEROGLYPH Q001 + /xf0/x93/x8a/xa9 EGYPTIAN HIEROGLYPH Q002 + /xf0/x93/x8a/xaa EGYPTIAN HIEROGLYPH Q003 + /xf0/x93/x8a/xab EGYPTIAN HIEROGLYPH Q004 + /xf0/x93/x8a/xac EGYPTIAN HIEROGLYPH Q005 + /xf0/x93/x8a/xad EGYPTIAN HIEROGLYPH Q006 + /xf0/x93/x8a/xae EGYPTIAN HIEROGLYPH Q007 + /xf0/x93/x8a/xaf EGYPTIAN HIEROGLYPH R001 + /xf0/x93/x8a/xb0 EGYPTIAN HIEROGLYPH R002 + /xf0/x93/x8a/xb1 EGYPTIAN HIEROGLYPH R002A + /xf0/x93/x8a/xb2 EGYPTIAN HIEROGLYPH R003 + /xf0/x93/x8a/xb3 EGYPTIAN HIEROGLYPH R003A + /xf0/x93/x8a/xb4 EGYPTIAN HIEROGLYPH R003B + /xf0/x93/x8a/xb5 EGYPTIAN HIEROGLYPH R004 + /xf0/x93/x8a/xb6 EGYPTIAN HIEROGLYPH R005 + /xf0/x93/x8a/xb7 EGYPTIAN HIEROGLYPH R006 + /xf0/x93/x8a/xb8 EGYPTIAN HIEROGLYPH R007 + /xf0/x93/x8a/xb9 EGYPTIAN HIEROGLYPH R008 + /xf0/x93/x8a/xba EGYPTIAN HIEROGLYPH R009 + /xf0/x93/x8a/xbb EGYPTIAN HIEROGLYPH R010 + /xf0/x93/x8a/xbc EGYPTIAN HIEROGLYPH R010A + /xf0/x93/x8a/xbd EGYPTIAN HIEROGLYPH R011 + /xf0/x93/x8a/xbe EGYPTIAN HIEROGLYPH R012 + /xf0/x93/x8a/xbf EGYPTIAN HIEROGLYPH R013 + /xf0/x93/x8b/x80 EGYPTIAN HIEROGLYPH R014 + /xf0/x93/x8b/x81 EGYPTIAN HIEROGLYPH R015 + /xf0/x93/x8b/x82 EGYPTIAN HIEROGLYPH R016 + /xf0/x93/x8b/x83 EGYPTIAN HIEROGLYPH R016A + /xf0/x93/x8b/x84 EGYPTIAN HIEROGLYPH R017 + /xf0/x93/x8b/x85 EGYPTIAN HIEROGLYPH R018 + /xf0/x93/x8b/x86 EGYPTIAN HIEROGLYPH R019 + /xf0/x93/x8b/x87 EGYPTIAN HIEROGLYPH R020 + /xf0/x93/x8b/x88 EGYPTIAN HIEROGLYPH R021 + /xf0/x93/x8b/x89 EGYPTIAN HIEROGLYPH R022 + /xf0/x93/x8b/x8a EGYPTIAN HIEROGLYPH R023 + /xf0/x93/x8b/x8b EGYPTIAN HIEROGLYPH R024 + /xf0/x93/x8b/x8c EGYPTIAN HIEROGLYPH R025 + /xf0/x93/x8b/x8d EGYPTIAN HIEROGLYPH R026 + /xf0/x93/x8b/x8e EGYPTIAN HIEROGLYPH R027 + /xf0/x93/x8b/x8f EGYPTIAN HIEROGLYPH R028 + /xf0/x93/x8b/x90 EGYPTIAN HIEROGLYPH R029 + /xf0/x93/x8b/x91 EGYPTIAN HIEROGLYPH S001 + /xf0/x93/x8b/x92 EGYPTIAN HIEROGLYPH S002 + /xf0/x93/x8b/x93 EGYPTIAN HIEROGLYPH S002A + /xf0/x93/x8b/x94 EGYPTIAN HIEROGLYPH S003 + /xf0/x93/x8b/x95 EGYPTIAN HIEROGLYPH S004 + /xf0/x93/x8b/x96 EGYPTIAN HIEROGLYPH S005 + /xf0/x93/x8b/x97 EGYPTIAN HIEROGLYPH S006 + /xf0/x93/x8b/x98 EGYPTIAN HIEROGLYPH S006A + /xf0/x93/x8b/x99 EGYPTIAN HIEROGLYPH S007 + /xf0/x93/x8b/x9a EGYPTIAN HIEROGLYPH S008 + /xf0/x93/x8b/x9b EGYPTIAN HIEROGLYPH S009 + /xf0/x93/x8b/x9c EGYPTIAN HIEROGLYPH S010 + /xf0/x93/x8b/x9d EGYPTIAN HIEROGLYPH S011 + /xf0/x93/x8b/x9e EGYPTIAN HIEROGLYPH S012 + /xf0/x93/x8b/x9f EGYPTIAN HIEROGLYPH S013 + /xf0/x93/x8b/xa0 EGYPTIAN HIEROGLYPH S014 + /xf0/x93/x8b/xa1 EGYPTIAN HIEROGLYPH S014A + /xf0/x93/x8b/xa2 EGYPTIAN HIEROGLYPH S014B + /xf0/x93/x8b/xa3 EGYPTIAN HIEROGLYPH S015 + /xf0/x93/x8b/xa4 EGYPTIAN HIEROGLYPH S016 + /xf0/x93/x8b/xa5 EGYPTIAN HIEROGLYPH S017 + /xf0/x93/x8b/xa6 EGYPTIAN HIEROGLYPH S017A + /xf0/x93/x8b/xa7 EGYPTIAN HIEROGLYPH S018 + /xf0/x93/x8b/xa8 EGYPTIAN HIEROGLYPH S019 + /xf0/x93/x8b/xa9 EGYPTIAN HIEROGLYPH S020 + /xf0/x93/x8b/xaa EGYPTIAN HIEROGLYPH S021 + /xf0/x93/x8b/xab EGYPTIAN HIEROGLYPH S022 + /xf0/x93/x8b/xac EGYPTIAN HIEROGLYPH S023 + /xf0/x93/x8b/xad EGYPTIAN HIEROGLYPH S024 + /xf0/x93/x8b/xae EGYPTIAN HIEROGLYPH S025 + /xf0/x93/x8b/xaf EGYPTIAN HIEROGLYPH S026 + /xf0/x93/x8b/xb0 EGYPTIAN HIEROGLYPH S026A + /xf0/x93/x8b/xb1 EGYPTIAN HIEROGLYPH S026B + /xf0/x93/x8b/xb2 EGYPTIAN HIEROGLYPH S027 + /xf0/x93/x8b/xb3 EGYPTIAN HIEROGLYPH S028 + /xf0/x93/x8b/xb4 EGYPTIAN HIEROGLYPH S029 + /xf0/x93/x8b/xb5 EGYPTIAN HIEROGLYPH S030 + /xf0/x93/x8b/xb6 EGYPTIAN HIEROGLYPH S031 + /xf0/x93/x8b/xb7 EGYPTIAN HIEROGLYPH S032 + /xf0/x93/x8b/xb8 EGYPTIAN HIEROGLYPH S033 + /xf0/x93/x8b/xb9 EGYPTIAN HIEROGLYPH S034 + /xf0/x93/x8b/xba EGYPTIAN HIEROGLYPH S035 + /xf0/x93/x8b/xbb EGYPTIAN HIEROGLYPH S035A + /xf0/x93/x8b/xbc EGYPTIAN HIEROGLYPH S036 + /xf0/x93/x8b/xbd EGYPTIAN HIEROGLYPH S037 + /xf0/x93/x8b/xbe EGYPTIAN HIEROGLYPH S038 + /xf0/x93/x8b/xbf EGYPTIAN HIEROGLYPH S039 + /xf0/x93/x8c/x80 EGYPTIAN HIEROGLYPH S040 + /xf0/x93/x8c/x81 EGYPTIAN HIEROGLYPH S041 + /xf0/x93/x8c/x82 EGYPTIAN HIEROGLYPH S042 + /xf0/x93/x8c/x83 EGYPTIAN HIEROGLYPH S043 + /xf0/x93/x8c/x84 EGYPTIAN HIEROGLYPH S044 + /xf0/x93/x8c/x85 EGYPTIAN HIEROGLYPH S045 + /xf0/x93/x8c/x86 EGYPTIAN HIEROGLYPH S046 + /xf0/x93/x8c/x87 EGYPTIAN HIEROGLYPH T001 + /xf0/x93/x8c/x88 EGYPTIAN HIEROGLYPH T002 + /xf0/x93/x8c/x89 EGYPTIAN HIEROGLYPH T003 + /xf0/x93/x8c/x8a EGYPTIAN HIEROGLYPH T003A + /xf0/x93/x8c/x8b EGYPTIAN HIEROGLYPH T004 + /xf0/x93/x8c/x8c EGYPTIAN HIEROGLYPH T005 + /xf0/x93/x8c/x8d EGYPTIAN HIEROGLYPH T006 + /xf0/x93/x8c/x8e EGYPTIAN HIEROGLYPH T007 + /xf0/x93/x8c/x8f EGYPTIAN HIEROGLYPH T007A + /xf0/x93/x8c/x90 EGYPTIAN HIEROGLYPH T008 + /xf0/x93/x8c/x91 EGYPTIAN HIEROGLYPH T008A + /xf0/x93/x8c/x92 EGYPTIAN HIEROGLYPH T009 + /xf0/x93/x8c/x93 EGYPTIAN HIEROGLYPH T009A + /xf0/x93/x8c/x94 EGYPTIAN HIEROGLYPH T010 + /xf0/x93/x8c/x95 EGYPTIAN HIEROGLYPH T011 + /xf0/x93/x8c/x96 EGYPTIAN HIEROGLYPH T011A + /xf0/x93/x8c/x97 EGYPTIAN HIEROGLYPH T012 + /xf0/x93/x8c/x98 EGYPTIAN HIEROGLYPH T013 + /xf0/x93/x8c/x99 EGYPTIAN HIEROGLYPH T014 + /xf0/x93/x8c/x9a EGYPTIAN HIEROGLYPH T015 + /xf0/x93/x8c/x9b EGYPTIAN HIEROGLYPH T016 + /xf0/x93/x8c/x9c EGYPTIAN HIEROGLYPH T016A + /xf0/x93/x8c/x9d EGYPTIAN HIEROGLYPH T017 + /xf0/x93/x8c/x9e EGYPTIAN HIEROGLYPH T018 + /xf0/x93/x8c/x9f EGYPTIAN HIEROGLYPH T019 + /xf0/x93/x8c/xa0 EGYPTIAN HIEROGLYPH T020 + /xf0/x93/x8c/xa1 EGYPTIAN HIEROGLYPH T021 + /xf0/x93/x8c/xa2 EGYPTIAN HIEROGLYPH T022 + /xf0/x93/x8c/xa3 EGYPTIAN HIEROGLYPH T023 + /xf0/x93/x8c/xa4 EGYPTIAN HIEROGLYPH T024 + /xf0/x93/x8c/xa5 EGYPTIAN HIEROGLYPH T025 + /xf0/x93/x8c/xa6 EGYPTIAN HIEROGLYPH T026 + /xf0/x93/x8c/xa7 EGYPTIAN HIEROGLYPH T027 + /xf0/x93/x8c/xa8 EGYPTIAN HIEROGLYPH T028 + /xf0/x93/x8c/xa9 EGYPTIAN HIEROGLYPH T029 + /xf0/x93/x8c/xaa EGYPTIAN HIEROGLYPH T030 + /xf0/x93/x8c/xab EGYPTIAN HIEROGLYPH T031 + /xf0/x93/x8c/xac EGYPTIAN HIEROGLYPH T032 + /xf0/x93/x8c/xad EGYPTIAN HIEROGLYPH T032A + /xf0/x93/x8c/xae EGYPTIAN HIEROGLYPH T033 + /xf0/x93/x8c/xaf EGYPTIAN HIEROGLYPH T033A + /xf0/x93/x8c/xb0 EGYPTIAN HIEROGLYPH T034 + /xf0/x93/x8c/xb1 EGYPTIAN HIEROGLYPH T035 + /xf0/x93/x8c/xb2 EGYPTIAN HIEROGLYPH T036 + /xf0/x93/x8c/xb3 EGYPTIAN HIEROGLYPH U001 + /xf0/x93/x8c/xb4 EGYPTIAN HIEROGLYPH U002 + /xf0/x93/x8c/xb5 EGYPTIAN HIEROGLYPH U003 + /xf0/x93/x8c/xb6 EGYPTIAN HIEROGLYPH U004 + /xf0/x93/x8c/xb7 EGYPTIAN HIEROGLYPH U005 + /xf0/x93/x8c/xb8 EGYPTIAN HIEROGLYPH U006 + /xf0/x93/x8c/xb9 EGYPTIAN HIEROGLYPH U006A + /xf0/x93/x8c/xba EGYPTIAN HIEROGLYPH U006B + /xf0/x93/x8c/xbb EGYPTIAN HIEROGLYPH U007 + /xf0/x93/x8c/xbc EGYPTIAN HIEROGLYPH U008 + /xf0/x93/x8c/xbd EGYPTIAN HIEROGLYPH U009 + /xf0/x93/x8c/xbe EGYPTIAN HIEROGLYPH U010 + /xf0/x93/x8c/xbf EGYPTIAN HIEROGLYPH U011 + /xf0/x93/x8d/x80 EGYPTIAN HIEROGLYPH U012 + /xf0/x93/x8d/x81 EGYPTIAN HIEROGLYPH U013 + /xf0/x93/x8d/x82 EGYPTIAN HIEROGLYPH U014 + /xf0/x93/x8d/x83 EGYPTIAN HIEROGLYPH U015 + /xf0/x93/x8d/x84 EGYPTIAN HIEROGLYPH U016 + /xf0/x93/x8d/x85 EGYPTIAN HIEROGLYPH U017 + /xf0/x93/x8d/x86 EGYPTIAN HIEROGLYPH U018 + /xf0/x93/x8d/x87 EGYPTIAN HIEROGLYPH U019 + /xf0/x93/x8d/x88 EGYPTIAN HIEROGLYPH U020 + /xf0/x93/x8d/x89 EGYPTIAN HIEROGLYPH U021 + /xf0/x93/x8d/x8a EGYPTIAN HIEROGLYPH U022 + /xf0/x93/x8d/x8b EGYPTIAN HIEROGLYPH U023 + /xf0/x93/x8d/x8c EGYPTIAN HIEROGLYPH U023A + /xf0/x93/x8d/x8d EGYPTIAN HIEROGLYPH U024 + /xf0/x93/x8d/x8e EGYPTIAN HIEROGLYPH U025 + /xf0/x93/x8d/x8f EGYPTIAN HIEROGLYPH U026 + /xf0/x93/x8d/x90 EGYPTIAN HIEROGLYPH U027 + /xf0/x93/x8d/x91 EGYPTIAN HIEROGLYPH U028 + /xf0/x93/x8d/x92 EGYPTIAN HIEROGLYPH U029 + /xf0/x93/x8d/x93 EGYPTIAN HIEROGLYPH U029A + /xf0/x93/x8d/x94 EGYPTIAN HIEROGLYPH U030 + /xf0/x93/x8d/x95 EGYPTIAN HIEROGLYPH U031 + /xf0/x93/x8d/x96 EGYPTIAN HIEROGLYPH U032 + /xf0/x93/x8d/x97 EGYPTIAN HIEROGLYPH U032A + /xf0/x93/x8d/x98 EGYPTIAN HIEROGLYPH U033 + /xf0/x93/x8d/x99 EGYPTIAN HIEROGLYPH U034 + /xf0/x93/x8d/x9a EGYPTIAN HIEROGLYPH U035 + /xf0/x93/x8d/x9b EGYPTIAN HIEROGLYPH U036 + /xf0/x93/x8d/x9c EGYPTIAN HIEROGLYPH U037 + /xf0/x93/x8d/x9d EGYPTIAN HIEROGLYPH U038 + /xf0/x93/x8d/x9e EGYPTIAN HIEROGLYPH U039 + /xf0/x93/x8d/x9f EGYPTIAN HIEROGLYPH U040 + /xf0/x93/x8d/xa0 EGYPTIAN HIEROGLYPH U041 + /xf0/x93/x8d/xa1 EGYPTIAN HIEROGLYPH U042 + /xf0/x93/x8d/xa2 EGYPTIAN HIEROGLYPH V001 + /xf0/x93/x8d/xa3 EGYPTIAN HIEROGLYPH V001A + /xf0/x93/x8d/xa4 EGYPTIAN HIEROGLYPH V001B + /xf0/x93/x8d/xa5 EGYPTIAN HIEROGLYPH V001C + /xf0/x93/x8d/xa6 EGYPTIAN HIEROGLYPH V001D + /xf0/x93/x8d/xa7 EGYPTIAN HIEROGLYPH V001E + /xf0/x93/x8d/xa8 EGYPTIAN HIEROGLYPH V001F + /xf0/x93/x8d/xa9 EGYPTIAN HIEROGLYPH V001G + /xf0/x93/x8d/xaa EGYPTIAN HIEROGLYPH V001H + /xf0/x93/x8d/xab EGYPTIAN HIEROGLYPH V001I + /xf0/x93/x8d/xac EGYPTIAN HIEROGLYPH V002 + /xf0/x93/x8d/xad EGYPTIAN HIEROGLYPH V002A + /xf0/x93/x8d/xae EGYPTIAN HIEROGLYPH V003 + /xf0/x93/x8d/xaf EGYPTIAN HIEROGLYPH V004 + /xf0/x93/x8d/xb0 EGYPTIAN HIEROGLYPH V005 + /xf0/x93/x8d/xb1 EGYPTIAN HIEROGLYPH V006 + /xf0/x93/x8d/xb2 EGYPTIAN HIEROGLYPH V007 + /xf0/x93/x8d/xb3 EGYPTIAN HIEROGLYPH V007A + /xf0/x93/x8d/xb4 EGYPTIAN HIEROGLYPH V007B + /xf0/x93/x8d/xb5 EGYPTIAN HIEROGLYPH V008 + /xf0/x93/x8d/xb6 EGYPTIAN HIEROGLYPH V009 + /xf0/x93/x8d/xb7 EGYPTIAN HIEROGLYPH V010 + /xf0/x93/x8d/xb8 EGYPTIAN HIEROGLYPH V011 + /xf0/x93/x8d/xb9 EGYPTIAN HIEROGLYPH V011A + /xf0/x93/x8d/xba EGYPTIAN HIEROGLYPH V011B + /xf0/x93/x8d/xbb EGYPTIAN HIEROGLYPH V011C + /xf0/x93/x8d/xbc EGYPTIAN HIEROGLYPH V012 + /xf0/x93/x8d/xbd EGYPTIAN HIEROGLYPH V012A + /xf0/x93/x8d/xbe EGYPTIAN HIEROGLYPH V012B + /xf0/x93/x8d/xbf EGYPTIAN HIEROGLYPH V013 + /xf0/x93/x8e/x80 EGYPTIAN HIEROGLYPH V014 + /xf0/x93/x8e/x81 EGYPTIAN HIEROGLYPH V015 + /xf0/x93/x8e/x82 EGYPTIAN HIEROGLYPH V016 + /xf0/x93/x8e/x83 EGYPTIAN HIEROGLYPH V017 + /xf0/x93/x8e/x84 EGYPTIAN HIEROGLYPH V018 + /xf0/x93/x8e/x85 EGYPTIAN HIEROGLYPH V019 + /xf0/x93/x8e/x86 EGYPTIAN HIEROGLYPH V020 + /xf0/x93/x8e/x87 EGYPTIAN HIEROGLYPH V020A + /xf0/x93/x8e/x88 EGYPTIAN HIEROGLYPH V020B + /xf0/x93/x8e/x89 EGYPTIAN HIEROGLYPH V020C + /xf0/x93/x8e/x8a EGYPTIAN HIEROGLYPH V020D + /xf0/x93/x8e/x8b EGYPTIAN HIEROGLYPH V020E + /xf0/x93/x8e/x8c EGYPTIAN HIEROGLYPH V020F + /xf0/x93/x8e/x8d EGYPTIAN HIEROGLYPH V020G + /xf0/x93/x8e/x8e EGYPTIAN HIEROGLYPH V020H + /xf0/x93/x8e/x8f EGYPTIAN HIEROGLYPH V020I + /xf0/x93/x8e/x90 EGYPTIAN HIEROGLYPH V020J + /xf0/x93/x8e/x91 EGYPTIAN HIEROGLYPH V020K + /xf0/x93/x8e/x92 EGYPTIAN HIEROGLYPH V020L + /xf0/x93/x8e/x93 EGYPTIAN HIEROGLYPH V021 + /xf0/x93/x8e/x94 EGYPTIAN HIEROGLYPH V022 + /xf0/x93/x8e/x95 EGYPTIAN HIEROGLYPH V023 + /xf0/x93/x8e/x96 EGYPTIAN HIEROGLYPH V023A + /xf0/x93/x8e/x97 EGYPTIAN HIEROGLYPH V024 + /xf0/x93/x8e/x98 EGYPTIAN HIEROGLYPH V025 + /xf0/x93/x8e/x99 EGYPTIAN HIEROGLYPH V026 + /xf0/x93/x8e/x9a EGYPTIAN HIEROGLYPH V027 + /xf0/x93/x8e/x9b EGYPTIAN HIEROGLYPH V028 + /xf0/x93/x8e/x9c EGYPTIAN HIEROGLYPH V028A + /xf0/x93/x8e/x9d EGYPTIAN HIEROGLYPH V029 + /xf0/x93/x8e/x9e EGYPTIAN HIEROGLYPH V029A + /xf0/x93/x8e/x9f EGYPTIAN HIEROGLYPH V030 + /xf0/x93/x8e/xa0 EGYPTIAN HIEROGLYPH V030A + /xf0/x93/x8e/xa1 EGYPTIAN HIEROGLYPH V031 + /xf0/x93/x8e/xa2 EGYPTIAN HIEROGLYPH V031A + /xf0/x93/x8e/xa3 EGYPTIAN HIEROGLYPH V032 + /xf0/x93/x8e/xa4 EGYPTIAN HIEROGLYPH V033 + /xf0/x93/x8e/xa5 EGYPTIAN HIEROGLYPH V033A + /xf0/x93/x8e/xa6 EGYPTIAN HIEROGLYPH V034 + /xf0/x93/x8e/xa7 EGYPTIAN HIEROGLYPH V035 + /xf0/x93/x8e/xa8 EGYPTIAN HIEROGLYPH V036 + /xf0/x93/x8e/xa9 EGYPTIAN HIEROGLYPH V037 + /xf0/x93/x8e/xaa EGYPTIAN HIEROGLYPH V037A + /xf0/x93/x8e/xab EGYPTIAN HIEROGLYPH V038 + /xf0/x93/x8e/xac EGYPTIAN HIEROGLYPH V039 + /xf0/x93/x8e/xad EGYPTIAN HIEROGLYPH V040 + /xf0/x93/x8e/xae EGYPTIAN HIEROGLYPH V040A + /xf0/x93/x8e/xaf EGYPTIAN HIEROGLYPH W001 + /xf0/x93/x8e/xb0 EGYPTIAN HIEROGLYPH W002 + /xf0/x93/x8e/xb1 EGYPTIAN HIEROGLYPH W003 + /xf0/x93/x8e/xb2 EGYPTIAN HIEROGLYPH W003A + /xf0/x93/x8e/xb3 EGYPTIAN HIEROGLYPH W004 + /xf0/x93/x8e/xb4 EGYPTIAN HIEROGLYPH W005 + /xf0/x93/x8e/xb5 EGYPTIAN HIEROGLYPH W006 + /xf0/x93/x8e/xb6 EGYPTIAN HIEROGLYPH W007 + /xf0/x93/x8e/xb7 EGYPTIAN HIEROGLYPH W008 + /xf0/x93/x8e/xb8 EGYPTIAN HIEROGLYPH W009 + /xf0/x93/x8e/xb9 EGYPTIAN HIEROGLYPH W009A + /xf0/x93/x8e/xba EGYPTIAN HIEROGLYPH W010 + /xf0/x93/x8e/xbb EGYPTIAN HIEROGLYPH W010A + /xf0/x93/x8e/xbc EGYPTIAN HIEROGLYPH W011 + /xf0/x93/x8e/xbd EGYPTIAN HIEROGLYPH W012 + /xf0/x93/x8e/xbe EGYPTIAN HIEROGLYPH W013 + /xf0/x93/x8e/xbf EGYPTIAN HIEROGLYPH W014 + /xf0/x93/x8f/x80 EGYPTIAN HIEROGLYPH W014A + /xf0/x93/x8f/x81 EGYPTIAN HIEROGLYPH W015 + /xf0/x93/x8f/x82 EGYPTIAN HIEROGLYPH W016 + /xf0/x93/x8f/x83 EGYPTIAN HIEROGLYPH W017 + /xf0/x93/x8f/x84 EGYPTIAN HIEROGLYPH W017A + /xf0/x93/x8f/x85 EGYPTIAN HIEROGLYPH W018 + /xf0/x93/x8f/x86 EGYPTIAN HIEROGLYPH W018A + /xf0/x93/x8f/x87 EGYPTIAN HIEROGLYPH W019 + /xf0/x93/x8f/x88 EGYPTIAN HIEROGLYPH W020 + /xf0/x93/x8f/x89 EGYPTIAN HIEROGLYPH W021 + /xf0/x93/x8f/x8a EGYPTIAN HIEROGLYPH W022 + /xf0/x93/x8f/x8b EGYPTIAN HIEROGLYPH W023 + /xf0/x93/x8f/x8c EGYPTIAN HIEROGLYPH W024 + /xf0/x93/x8f/x8d EGYPTIAN HIEROGLYPH W024A + /xf0/x93/x8f/x8e EGYPTIAN HIEROGLYPH W025 + /xf0/x93/x8f/x8f EGYPTIAN HIEROGLYPH X001 + /xf0/x93/x8f/x90 EGYPTIAN HIEROGLYPH X002 + /xf0/x93/x8f/x91 EGYPTIAN HIEROGLYPH X003 + /xf0/x93/x8f/x92 EGYPTIAN HIEROGLYPH X004 + /xf0/x93/x8f/x93 EGYPTIAN HIEROGLYPH X004A + /xf0/x93/x8f/x94 EGYPTIAN HIEROGLYPH X004B + /xf0/x93/x8f/x95 EGYPTIAN HIEROGLYPH X005 + /xf0/x93/x8f/x96 EGYPTIAN HIEROGLYPH X006 + /xf0/x93/x8f/x97 EGYPTIAN HIEROGLYPH X006A + /xf0/x93/x8f/x98 EGYPTIAN HIEROGLYPH X007 + /xf0/x93/x8f/x99 EGYPTIAN HIEROGLYPH X008 + /xf0/x93/x8f/x9a EGYPTIAN HIEROGLYPH X008A + /xf0/x93/x8f/x9b EGYPTIAN HIEROGLYPH Y001 + /xf0/x93/x8f/x9c EGYPTIAN HIEROGLYPH Y001A + /xf0/x93/x8f/x9d EGYPTIAN HIEROGLYPH Y002 + /xf0/x93/x8f/x9e EGYPTIAN HIEROGLYPH Y003 + /xf0/x93/x8f/x9f EGYPTIAN HIEROGLYPH Y004 + /xf0/x93/x8f/xa0 EGYPTIAN HIEROGLYPH Y005 + /xf0/x93/x8f/xa1 EGYPTIAN HIEROGLYPH Y006 + /xf0/x93/x8f/xa2 EGYPTIAN HIEROGLYPH Y007 + /xf0/x93/x8f/xa3 EGYPTIAN HIEROGLYPH Y008 + /xf0/x93/x8f/xa4 EGYPTIAN HIEROGLYPH Z001 + /xf0/x93/x8f/xa5 EGYPTIAN HIEROGLYPH Z002 + /xf0/x93/x8f/xa6 EGYPTIAN HIEROGLYPH Z002A + /xf0/x93/x8f/xa7 EGYPTIAN HIEROGLYPH Z002B + /xf0/x93/x8f/xa8 EGYPTIAN HIEROGLYPH Z002C + /xf0/x93/x8f/xa9 EGYPTIAN HIEROGLYPH Z002D + /xf0/x93/x8f/xaa EGYPTIAN HIEROGLYPH Z003 + /xf0/x93/x8f/xab EGYPTIAN HIEROGLYPH Z003A + /xf0/x93/x8f/xac EGYPTIAN HIEROGLYPH Z003B + /xf0/x93/x8f/xad EGYPTIAN HIEROGLYPH Z004 + /xf0/x93/x8f/xae EGYPTIAN HIEROGLYPH Z004A + /xf0/x93/x8f/xaf EGYPTIAN HIEROGLYPH Z005 + /xf0/x93/x8f/xb0 EGYPTIAN HIEROGLYPH Z005A + /xf0/x93/x8f/xb1 EGYPTIAN HIEROGLYPH Z006 + /xf0/x93/x8f/xb2 EGYPTIAN HIEROGLYPH Z007 + /xf0/x93/x8f/xb3 EGYPTIAN HIEROGLYPH Z008 + /xf0/x93/x8f/xb4 EGYPTIAN HIEROGLYPH Z009 + /xf0/x93/x8f/xb5 EGYPTIAN HIEROGLYPH Z010 + /xf0/x93/x8f/xb6 EGYPTIAN HIEROGLYPH Z011 + /xf0/x93/x8f/xb7 EGYPTIAN HIEROGLYPH Z012 + /xf0/x93/x8f/xb8 EGYPTIAN HIEROGLYPH Z013 + /xf0/x93/x8f/xb9 EGYPTIAN HIEROGLYPH Z014 + /xf0/x93/x8f/xba EGYPTIAN HIEROGLYPH Z015 + /xf0/x93/x8f/xbb EGYPTIAN HIEROGLYPH Z015A + /xf0/x93/x8f/xbc EGYPTIAN HIEROGLYPH Z015B + /xf0/x93/x8f/xbd EGYPTIAN HIEROGLYPH Z015C + /xf0/x93/x8f/xbe EGYPTIAN HIEROGLYPH Z015D + /xf0/x93/x8f/xbf EGYPTIAN HIEROGLYPH Z015E + /xf0/x93/x90/x80 EGYPTIAN HIEROGLYPH Z015F + /xf0/x93/x90/x81 EGYPTIAN HIEROGLYPH Z015G + /xf0/x93/x90/x82 EGYPTIAN HIEROGLYPH Z015H + /xf0/x93/x90/x83 EGYPTIAN HIEROGLYPH Z015I + /xf0/x93/x90/x84 EGYPTIAN HIEROGLYPH Z016 + /xf0/x93/x90/x85 EGYPTIAN HIEROGLYPH Z016A + /xf0/x93/x90/x86 EGYPTIAN HIEROGLYPH Z016B + /xf0/x93/x90/x87 EGYPTIAN HIEROGLYPH Z016C + /xf0/x93/x90/x88 EGYPTIAN HIEROGLYPH Z016D + /xf0/x93/x90/x89 EGYPTIAN HIEROGLYPH Z016E + /xf0/x93/x90/x8a EGYPTIAN HIEROGLYPH Z016F + /xf0/x93/x90/x8b EGYPTIAN HIEROGLYPH Z016G + /xf0/x93/x90/x8c EGYPTIAN HIEROGLYPH Z016H + /xf0/x93/x90/x8d EGYPTIAN HIEROGLYPH AA001 + /xf0/x93/x90/x8e EGYPTIAN HIEROGLYPH AA002 + /xf0/x93/x90/x8f EGYPTIAN HIEROGLYPH AA003 + /xf0/x93/x90/x90 EGYPTIAN HIEROGLYPH AA004 + /xf0/x93/x90/x91 EGYPTIAN HIEROGLYPH AA005 + /xf0/x93/x90/x92 EGYPTIAN HIEROGLYPH AA006 + /xf0/x93/x90/x93 EGYPTIAN HIEROGLYPH AA007 + /xf0/x93/x90/x94 EGYPTIAN HIEROGLYPH AA007A + /xf0/x93/x90/x95 EGYPTIAN HIEROGLYPH AA007B + /xf0/x93/x90/x96 EGYPTIAN HIEROGLYPH AA008 + /xf0/x93/x90/x97 EGYPTIAN HIEROGLYPH AA009 + /xf0/x93/x90/x98 EGYPTIAN HIEROGLYPH AA010 + /xf0/x93/x90/x99 EGYPTIAN HIEROGLYPH AA011 + /xf0/x93/x90/x9a EGYPTIAN HIEROGLYPH AA012 + /xf0/x93/x90/x9b EGYPTIAN HIEROGLYPH AA013 + /xf0/x93/x90/x9c EGYPTIAN HIEROGLYPH AA014 + /xf0/x93/x90/x9d EGYPTIAN HIEROGLYPH AA015 + /xf0/x93/x90/x9e EGYPTIAN HIEROGLYPH AA016 + /xf0/x93/x90/x9f EGYPTIAN HIEROGLYPH AA017 + /xf0/x93/x90/xa0 EGYPTIAN HIEROGLYPH AA018 + /xf0/x93/x90/xa1 EGYPTIAN HIEROGLYPH AA019 + /xf0/x93/x90/xa2 EGYPTIAN HIEROGLYPH AA020 + /xf0/x93/x90/xa3 EGYPTIAN HIEROGLYPH AA021 + /xf0/x93/x90/xa4 EGYPTIAN HIEROGLYPH AA022 + /xf0/x93/x90/xa5 EGYPTIAN HIEROGLYPH AA023 + /xf0/x93/x90/xa6 EGYPTIAN HIEROGLYPH AA024 + /xf0/x93/x90/xa7 EGYPTIAN HIEROGLYPH AA025 + /xf0/x93/x90/xa8 EGYPTIAN HIEROGLYPH AA026 + /xf0/x93/x90/xa9 EGYPTIAN HIEROGLYPH AA027 + /xf0/x93/x90/xaa EGYPTIAN HIEROGLYPH AA028 + /xf0/x93/x90/xab EGYPTIAN HIEROGLYPH AA029 + /xf0/x93/x90/xac EGYPTIAN HIEROGLYPH AA030 + /xf0/x93/x90/xad EGYPTIAN HIEROGLYPH AA031 + /xf0/x93/x90/xae EGYPTIAN HIEROGLYPH AA032 + /xf0/x96/xa0/x80 BAMUM LETTER PHASE-A NGKUE MFON + /xf0/x96/xa0/x81 BAMUM LETTER PHASE-A GBIEE FON + /xf0/x96/xa0/x82 BAMUM LETTER PHASE-A PON MFON PIPAEMGBIEE + /xf0/x96/xa0/x83 BAMUM LETTER PHASE-A PON MFON PIPAEMBA + /xf0/x96/xa0/x84 BAMUM LETTER PHASE-A NAA MFON + /xf0/x96/xa0/x85 BAMUM LETTER PHASE-A SHUENSHUET + /xf0/x96/xa0/x86 BAMUM LETTER PHASE-A TITA MFON + /xf0/x96/xa0/x87 BAMUM LETTER PHASE-A NZA MFON + /xf0/x96/xa0/x88 BAMUM LETTER PHASE-A SHINDA PA NJI + /xf0/x96/xa0/x89 BAMUM LETTER PHASE-A PON PA NJI PIPAEMGBIEE + /xf0/x96/xa0/x8a BAMUM LETTER PHASE-A PON PA NJI PIPAEMBA + /xf0/x96/xa0/x8b BAMUM LETTER PHASE-A MAEMBGBIEE + /xf0/x96/xa0/x8c BAMUM LETTER PHASE-A TU MAEMBA + /xf0/x96/xa0/x8d BAMUM LETTER PHASE-A NGANGU + /xf0/x96/xa0/x8e BAMUM LETTER PHASE-A MAEMVEUX + /xf0/x96/xa0/x8f BAMUM LETTER PHASE-A MANSUAE + /xf0/x96/xa0/x90 BAMUM LETTER PHASE-A MVEUAENGAM + /xf0/x96/xa0/x91 BAMUM LETTER PHASE-A SEUNYAM + /xf0/x96/xa0/x92 BAMUM LETTER PHASE-A NTOQPEN + /xf0/x96/xa0/x93 BAMUM LETTER PHASE-A KEUKEUTNDA + /xf0/x96/xa0/x94 BAMUM LETTER PHASE-A NKINDI + /xf0/x96/xa0/x95 BAMUM LETTER PHASE-A SUU + /xf0/x96/xa0/x96 BAMUM LETTER PHASE-A NGKUENZEUM + /xf0/x96/xa0/x97 BAMUM LETTER PHASE-A LAPAQ + /xf0/x96/xa0/x98 BAMUM LETTER PHASE-A LET KUT + /xf0/x96/xa0/x99 BAMUM LETTER PHASE-A NTAP MFAA + /xf0/x96/xa0/x9a BAMUM LETTER PHASE-A MAEKEUP + /xf0/x96/xa0/x9b BAMUM LETTER PHASE-A PASHAE + /xf0/x96/xa0/x9c BAMUM LETTER PHASE-A GHEUAERAE + /xf0/x96/xa0/x9d BAMUM LETTER PHASE-A PAMSHAE + /xf0/x96/xa0/x9e BAMUM LETTER PHASE-A MON NGGEUAET + /xf0/x96/xa0/x9f BAMUM LETTER PHASE-A NZUN MEUT + /xf0/x96/xa0/xa0 BAMUM LETTER PHASE-A U YUQ NAE + /xf0/x96/xa0/xa1 BAMUM LETTER PHASE-A GHEUAEGHEUAE + /xf0/x96/xa0/xa2 BAMUM LETTER PHASE-A NTAP NTAA + /xf0/x96/xa0/xa3 BAMUM LETTER PHASE-A SISA + /xf0/x96/xa0/xa4 BAMUM LETTER PHASE-A MGBASA + /xf0/x96/xa0/xa5 BAMUM LETTER PHASE-A MEUNJOMNDEUQ + /xf0/x96/xa0/xa6 BAMUM LETTER PHASE-A MOOMPUQ + /xf0/x96/xa0/xa7 BAMUM LETTER PHASE-A KAFA + /xf0/x96/xa0/xa8 BAMUM LETTER PHASE-A PA LEERAEWA + /xf0/x96/xa0/xa9 BAMUM LETTER PHASE-A NDA LEERAEWA + /xf0/x96/xa0/xaa BAMUM LETTER PHASE-A PET + /xf0/x96/xa0/xab BAMUM LETTER PHASE-A MAEMKPEN + /xf0/x96/xa0/xac BAMUM LETTER PHASE-A NIKA + /xf0/x96/xa0/xad BAMUM LETTER PHASE-A PUP + /xf0/x96/xa0/xae BAMUM LETTER PHASE-A TUAEP + /xf0/x96/xa0/xaf BAMUM LETTER PHASE-A LUAEP + /xf0/x96/xa0/xb0 BAMUM LETTER PHASE-A SONJAM + /xf0/x96/xa0/xb1 BAMUM LETTER PHASE-A TEUTEUWEN + /xf0/x96/xa0/xb2 BAMUM LETTER PHASE-A MAENYI + /xf0/x96/xa0/xb3 BAMUM LETTER PHASE-A KET + /xf0/x96/xa0/xb4 BAMUM LETTER PHASE-A NDAANGGEUAET + /xf0/x96/xa0/xb5 BAMUM LETTER PHASE-A KUOQ + /xf0/x96/xa0/xb6 BAMUM LETTER PHASE-A MOOMEUT + /xf0/x96/xa0/xb7 BAMUM LETTER PHASE-A SHUM + /xf0/x96/xa0/xb8 BAMUM LETTER PHASE-A LOMMAE + /xf0/x96/xa0/xb9 BAMUM LETTER PHASE-A FIRI + /xf0/x96/xa0/xba BAMUM LETTER PHASE-A ROM + /xf0/x96/xa0/xbb BAMUM LETTER PHASE-A KPOQ + /xf0/x96/xa0/xbc BAMUM LETTER PHASE-A SOQ + /xf0/x96/xa0/xbd BAMUM LETTER PHASE-A MAP PIEET + /xf0/x96/xa0/xbe BAMUM LETTER PHASE-A SHIRAE + /xf0/x96/xa0/xbf BAMUM LETTER PHASE-A NTAP + /xf0/x96/xa1/x80 BAMUM LETTER PHASE-A SHOQ NSHUT YUM + /xf0/x96/xa1/x81 BAMUM LETTER PHASE-A NYIT MONGKEUAEQ + /xf0/x96/xa1/x82 BAMUM LETTER PHASE-A PAARAE + /xf0/x96/xa1/x83 BAMUM LETTER PHASE-A NKAARAE + /xf0/x96/xa1/x84 BAMUM LETTER PHASE-A UNKNOWN + /xf0/x96/xa1/x85 BAMUM LETTER PHASE-A NGGEN + /xf0/x96/xa1/x86 BAMUM LETTER PHASE-A MAESI + /xf0/x96/xa1/x87 BAMUM LETTER PHASE-A NJAM + /xf0/x96/xa1/x88 BAMUM LETTER PHASE-A MBANYI + /xf0/x96/xa1/x89 BAMUM LETTER PHASE-A NYET + /xf0/x96/xa1/x8a BAMUM LETTER PHASE-A TEUAEN + /xf0/x96/xa1/x8b BAMUM LETTER PHASE-A SOT + /xf0/x96/xa1/x8c BAMUM LETTER PHASE-A PAAM + /xf0/x96/xa1/x8d BAMUM LETTER PHASE-A NSHIEE + /xf0/x96/xa1/x8e BAMUM LETTER PHASE-A MAEM + /xf0/x96/xa1/x8f BAMUM LETTER PHASE-A NYI + /xf0/x96/xa1/x90 BAMUM LETTER PHASE-A KAQ + /xf0/x96/xa1/x91 BAMUM LETTER PHASE-A NSHA + /xf0/x96/xa1/x92 BAMUM LETTER PHASE-A VEE + /xf0/x96/xa1/x93 BAMUM LETTER PHASE-A LU + /xf0/x96/xa1/x94 BAMUM LETTER PHASE-A NEN + /xf0/x96/xa1/x95 BAMUM LETTER PHASE-A NAQ + /xf0/x96/xa1/x96 BAMUM LETTER PHASE-A MBAQ + /xf0/x96/xa1/x97 BAMUM LETTER PHASE-B NSHUET + /xf0/x96/xa1/x98 BAMUM LETTER PHASE-B TU MAEMGBIEE + /xf0/x96/xa1/x99 BAMUM LETTER PHASE-B SIEE + /xf0/x96/xa1/x9a BAMUM LETTER PHASE-B SET TU + /xf0/x96/xa1/x9b BAMUM LETTER PHASE-B LOM NTEUM + /xf0/x96/xa1/x9c BAMUM LETTER PHASE-B MBA MAELEE + /xf0/x96/xa1/x9d BAMUM LETTER PHASE-B KIEEM + /xf0/x96/xa1/x9e BAMUM LETTER PHASE-B YEURAE + /xf0/x96/xa1/x9f BAMUM LETTER PHASE-B MBAARAE + /xf0/x96/xa1/xa0 BAMUM LETTER PHASE-B KAM + /xf0/x96/xa1/xa1 BAMUM LETTER PHASE-B PEESHI + /xf0/x96/xa1/xa2 BAMUM LETTER PHASE-B YAFU LEERAEWA + /xf0/x96/xa1/xa3 BAMUM LETTER PHASE-B LAM NSHUT NYAM + /xf0/x96/xa1/xa4 BAMUM LETTER PHASE-B NTIEE SHEUOQ + /xf0/x96/xa1/xa5 BAMUM LETTER PHASE-B NDU NJAA + /xf0/x96/xa1/xa6 BAMUM LETTER PHASE-B GHEUGHEUAEM + /xf0/x96/xa1/xa7 BAMUM LETTER PHASE-B PIT + /xf0/x96/xa1/xa8 BAMUM LETTER PHASE-B TU NSIEE + /xf0/x96/xa1/xa9 BAMUM LETTER PHASE-B SHET NJAQ + /xf0/x96/xa1/xaa BAMUM LETTER PHASE-B SHEUAEQTU + /xf0/x96/xa1/xab BAMUM LETTER PHASE-B MFON TEUAEQ + /xf0/x96/xa1/xac BAMUM LETTER PHASE-B MBIT MBAAKET + /xf0/x96/xa1/xad BAMUM LETTER PHASE-B NYI NTEUM + /xf0/x96/xa1/xae BAMUM LETTER PHASE-B KEUPUQ + /xf0/x96/xa1/xaf BAMUM LETTER PHASE-B GHEUGHEN + /xf0/x96/xa1/xb0 BAMUM LETTER PHASE-B KEUYEUX + /xf0/x96/xa1/xb1 BAMUM LETTER PHASE-B LAANAE + /xf0/x96/xa1/xb2 BAMUM LETTER PHASE-B PARUM + /xf0/x96/xa1/xb3 BAMUM LETTER PHASE-B VEUM + /xf0/x96/xa1/xb4 BAMUM LETTER PHASE-B NGKINDI MVOP + /xf0/x96/xa1/xb5 BAMUM LETTER PHASE-B NGGEU MBU + /xf0/x96/xa1/xb6 BAMUM LETTER PHASE-B WUAET + /xf0/x96/xa1/xb7 BAMUM LETTER PHASE-B SAKEUAE + /xf0/x96/xa1/xb8 BAMUM LETTER PHASE-B TAAM + /xf0/x96/xa1/xb9 BAMUM LETTER PHASE-B MEUQ + /xf0/x96/xa1/xba BAMUM LETTER PHASE-B NGGUOQ + /xf0/x96/xa1/xbb BAMUM LETTER PHASE-B NGGUOQ LARGE + /xf0/x96/xa1/xbc BAMUM LETTER PHASE-B MFIYAQ + /xf0/x96/xa1/xbd BAMUM LETTER PHASE-B SUE + /xf0/x96/xa1/xbe BAMUM LETTER PHASE-B MBEURI + /xf0/x96/xa1/xbf BAMUM LETTER PHASE-B MONTIEEN + /xf0/x96/xa2/x80 BAMUM LETTER PHASE-B NYAEMAE + /xf0/x96/xa2/x81 BAMUM LETTER PHASE-B PUNGAAM + /xf0/x96/xa2/x82 BAMUM LETTER PHASE-B MEUT NGGEET + /xf0/x96/xa2/x83 BAMUM LETTER PHASE-B FEUX + /xf0/x96/xa2/x84 BAMUM LETTER PHASE-B MBUOQ + /xf0/x96/xa2/x85 BAMUM LETTER PHASE-B FEE + /xf0/x96/xa2/x86 BAMUM LETTER PHASE-B KEUAEM + /xf0/x96/xa2/x87 BAMUM LETTER PHASE-B MA NJEUAENA + /xf0/x96/xa2/x88 BAMUM LETTER PHASE-B MA NJUQA + /xf0/x96/xa2/x89 BAMUM LETTER PHASE-B LET + /xf0/x96/xa2/x8a BAMUM LETTER PHASE-B NGGAAM + /xf0/x96/xa2/x8b BAMUM LETTER PHASE-B NSEN + /xf0/x96/xa2/x8c BAMUM LETTER PHASE-B MA + /xf0/x96/xa2/x8d BAMUM LETTER PHASE-B KIQ + /xf0/x96/xa2/x8e BAMUM LETTER PHASE-B NGOM + /xf0/x96/xa2/x8f BAMUM LETTER PHASE-C NGKUE MAEMBA + /xf0/x96/xa2/x90 BAMUM LETTER PHASE-C NZA + /xf0/x96/xa2/x91 BAMUM LETTER PHASE-C YUM + /xf0/x96/xa2/x92 BAMUM LETTER PHASE-C WANGKUOQ + /xf0/x96/xa2/x93 BAMUM LETTER PHASE-C NGGEN + /xf0/x96/xa2/x94 BAMUM LETTER PHASE-C NDEUAEREE + /xf0/x96/xa2/x95 BAMUM LETTER PHASE-C NGKAQ + /xf0/x96/xa2/x96 BAMUM LETTER PHASE-C GHARAE + /xf0/x96/xa2/x97 BAMUM LETTER PHASE-C MBEEKEET + /xf0/x96/xa2/x98 BAMUM LETTER PHASE-C GBAYI + /xf0/x96/xa2/x99 BAMUM LETTER PHASE-C NYIR MKPARAQ MEUN + /xf0/x96/xa2/x9a BAMUM LETTER PHASE-C NTU MBIT + /xf0/x96/xa2/x9b BAMUM LETTER PHASE-C MBEUM + /xf0/x96/xa2/x9c BAMUM LETTER PHASE-C PIRIEEN + /xf0/x96/xa2/x9d BAMUM LETTER PHASE-C NDOMBU + /xf0/x96/xa2/x9e BAMUM LETTER PHASE-C MBAA CABBAGE-TREE + /xf0/x96/xa2/x9f BAMUM LETTER PHASE-C KEUSHEUAEP + /xf0/x96/xa2/xa0 BAMUM LETTER PHASE-C GHAP + /xf0/x96/xa2/xa1 BAMUM LETTER PHASE-C KEUKAQ + /xf0/x96/xa2/xa2 BAMUM LETTER PHASE-C YU MUOMAE + /xf0/x96/xa2/xa3 BAMUM LETTER PHASE-C NZEUM + /xf0/x96/xa2/xa4 BAMUM LETTER PHASE-C MBUE + /xf0/x96/xa2/xa5 BAMUM LETTER PHASE-C NSEUAEN + /xf0/x96/xa2/xa6 BAMUM LETTER PHASE-C MBIT + /xf0/x96/xa2/xa7 BAMUM LETTER PHASE-C YEUQ + /xf0/x96/xa2/xa8 BAMUM LETTER PHASE-C KPARAQ + /xf0/x96/xa2/xa9 BAMUM LETTER PHASE-C KAA + /xf0/x96/xa2/xaa BAMUM LETTER PHASE-C SEUX + /xf0/x96/xa2/xab BAMUM LETTER PHASE-C NDIDA + /xf0/x96/xa2/xac BAMUM LETTER PHASE-C TAASHAE + /xf0/x96/xa2/xad BAMUM LETTER PHASE-C NJUEQ + /xf0/x96/xa2/xae BAMUM LETTER PHASE-C TITA YUE + /xf0/x96/xa2/xaf BAMUM LETTER PHASE-C SUAET + /xf0/x96/xa2/xb0 BAMUM LETTER PHASE-C NGGUAEN NYAM + /xf0/x96/xa2/xb1 BAMUM LETTER PHASE-C VEUX + /xf0/x96/xa2/xb2 BAMUM LETTER PHASE-C NANSANAQ + /xf0/x96/xa2/xb3 BAMUM LETTER PHASE-C MA KEUAERI + /xf0/x96/xa2/xb4 BAMUM LETTER PHASE-C NTAA + /xf0/x96/xa2/xb5 BAMUM LETTER PHASE-C NGGUON + /xf0/x96/xa2/xb6 BAMUM LETTER PHASE-C LAP + /xf0/x96/xa2/xb7 BAMUM LETTER PHASE-C MBIRIEEN + /xf0/x96/xa2/xb8 BAMUM LETTER PHASE-C MGBASAQ + /xf0/x96/xa2/xb9 BAMUM LETTER PHASE-C NTEUNGBA + /xf0/x96/xa2/xba BAMUM LETTER PHASE-C TEUTEUX + /xf0/x96/xa2/xbb BAMUM LETTER PHASE-C NGGUM + /xf0/x96/xa2/xbc BAMUM LETTER PHASE-C FUE + /xf0/x96/xa2/xbd BAMUM LETTER PHASE-C NDEUT + /xf0/x96/xa2/xbe BAMUM LETTER PHASE-C NSA + /xf0/x96/xa2/xbf BAMUM LETTER PHASE-C NSHAQ + /xf0/x96/xa3/x80 BAMUM LETTER PHASE-C BUNG + /xf0/x96/xa3/x81 BAMUM LETTER PHASE-C VEUAEPEN + /xf0/x96/xa3/x82 BAMUM LETTER PHASE-C MBERAE + /xf0/x96/xa3/x83 BAMUM LETTER PHASE-C RU + /xf0/x96/xa3/x84 BAMUM LETTER PHASE-C NJAEM + /xf0/x96/xa3/x85 BAMUM LETTER PHASE-C LAM + /xf0/x96/xa3/x86 BAMUM LETTER PHASE-C TITUAEP + /xf0/x96/xa3/x87 BAMUM LETTER PHASE-C NSUOT NGOM + /xf0/x96/xa3/x88 BAMUM LETTER PHASE-C NJEEEE + /xf0/x96/xa3/x89 BAMUM LETTER PHASE-C KET + /xf0/x96/xa3/x8a BAMUM LETTER PHASE-C NGGU + /xf0/x96/xa3/x8b BAMUM LETTER PHASE-C MAESI + /xf0/x96/xa3/x8c BAMUM LETTER PHASE-C MBUAEM + /xf0/x96/xa3/x8d BAMUM LETTER PHASE-C LU + /xf0/x96/xa3/x8e BAMUM LETTER PHASE-C KUT + /xf0/x96/xa3/x8f BAMUM LETTER PHASE-C NJAM + /xf0/x96/xa3/x90 BAMUM LETTER PHASE-C NGOM + /xf0/x96/xa3/x91 BAMUM LETTER PHASE-C WUP + /xf0/x96/xa3/x92 BAMUM LETTER PHASE-C NGGUEET + /xf0/x96/xa3/x93 BAMUM LETTER PHASE-C NSOM + /xf0/x96/xa3/x94 BAMUM LETTER PHASE-C NTEN + /xf0/x96/xa3/x95 BAMUM LETTER PHASE-C KUOP NKAARAE + /xf0/x96/xa3/x96 BAMUM LETTER PHASE-C NSUN + /xf0/x96/xa3/x97 BAMUM LETTER PHASE-C NDAM + /xf0/x96/xa3/x98 BAMUM LETTER PHASE-C MA NSIEE + /xf0/x96/xa3/x99 BAMUM LETTER PHASE-C YAA + /xf0/x96/xa3/x9a BAMUM LETTER PHASE-C NDAP + /xf0/x96/xa3/x9b BAMUM LETTER PHASE-C SHUEQ + /xf0/x96/xa3/x9c BAMUM LETTER PHASE-C SETFON + /xf0/x96/xa3/x9d BAMUM LETTER PHASE-C MBI + /xf0/x96/xa3/x9e BAMUM LETTER PHASE-C MAEMBA + /xf0/x96/xa3/x9f BAMUM LETTER PHASE-C MBANYI + /xf0/x96/xa3/xa0 BAMUM LETTER PHASE-C KEUSEUX + /xf0/x96/xa3/xa1 BAMUM LETTER PHASE-C MBEUX + /xf0/x96/xa3/xa2 BAMUM LETTER PHASE-C KEUM + /xf0/x96/xa3/xa3 BAMUM LETTER PHASE-C MBAA PICKET + /xf0/x96/xa3/xa4 BAMUM LETTER PHASE-C YUWOQ + /xf0/x96/xa3/xa5 BAMUM LETTER PHASE-C NJEUX + /xf0/x96/xa3/xa6 BAMUM LETTER PHASE-C MIEE + /xf0/x96/xa3/xa7 BAMUM LETTER PHASE-C MUAE + /xf0/x96/xa3/xa8 BAMUM LETTER PHASE-C SHIQ + /xf0/x96/xa3/xa9 BAMUM LETTER PHASE-C KEN LAW + /xf0/x96/xa3/xaa BAMUM LETTER PHASE-C KEN FATIGUE + /xf0/x96/xa3/xab BAMUM LETTER PHASE-C NGAQ + /xf0/x96/xa3/xac BAMUM LETTER PHASE-C NAQ + /xf0/x96/xa3/xad BAMUM LETTER PHASE-C LIQ + /xf0/x96/xa3/xae BAMUM LETTER PHASE-C PIN + /xf0/x96/xa3/xaf BAMUM LETTER PHASE-C PEN + /xf0/x96/xa3/xb0 BAMUM LETTER PHASE-C TET + /xf0/x96/xa3/xb1 BAMUM LETTER PHASE-D MBUO + /xf0/x96/xa3/xb2 BAMUM LETTER PHASE-D WAP + /xf0/x96/xa3/xb3 BAMUM LETTER PHASE-D NJI + /xf0/x96/xa3/xb4 BAMUM LETTER PHASE-D MFON + /xf0/x96/xa3/xb5 BAMUM LETTER PHASE-D NJIEE + /xf0/x96/xa3/xb6 BAMUM LETTER PHASE-D LIEE + /xf0/x96/xa3/xb7 BAMUM LETTER PHASE-D NJEUT + /xf0/x96/xa3/xb8 BAMUM LETTER PHASE-D NSHEE + /xf0/x96/xa3/xb9 BAMUM LETTER PHASE-D NGGAAMAE + /xf0/x96/xa3/xba BAMUM LETTER PHASE-D NYAM + /xf0/x96/xa3/xbb BAMUM LETTER PHASE-D WUAEN + /xf0/x96/xa3/xbc BAMUM LETTER PHASE-D NGKUN + /xf0/x96/xa3/xbd BAMUM LETTER PHASE-D SHEE + /xf0/x96/xa3/xbe BAMUM LETTER PHASE-D NGKAP + /xf0/x96/xa3/xbf BAMUM LETTER PHASE-D KEUAETMEUN + /xf0/x96/xa4/x80 BAMUM LETTER PHASE-D TEUT + /xf0/x96/xa4/x81 BAMUM LETTER PHASE-D SHEUAE + /xf0/x96/xa4/x82 BAMUM LETTER PHASE-D NJAP + /xf0/x96/xa4/x83 BAMUM LETTER PHASE-D SUE + /xf0/x96/xa4/x84 BAMUM LETTER PHASE-D KET + /xf0/x96/xa4/x85 BAMUM LETTER PHASE-D YAEMMAE + /xf0/x96/xa4/x86 BAMUM LETTER PHASE-D KUOM + /xf0/x96/xa4/x87 BAMUM LETTER PHASE-D SAP + /xf0/x96/xa4/x88 BAMUM LETTER PHASE-D MFEUT + /xf0/x96/xa4/x89 BAMUM LETTER PHASE-D NDEUX + /xf0/x96/xa4/x8a BAMUM LETTER PHASE-D MALEERI + /xf0/x96/xa4/x8b BAMUM LETTER PHASE-D MEUT + /xf0/x96/xa4/x8c BAMUM LETTER PHASE-D SEUAEQ + /xf0/x96/xa4/x8d BAMUM LETTER PHASE-D YEN + /xf0/x96/xa4/x8e BAMUM LETTER PHASE-D NJEUAEM + /xf0/x96/xa4/x8f BAMUM LETTER PHASE-D KEUOT MBUAE + /xf0/x96/xa4/x90 BAMUM LETTER PHASE-D NGKEURI + /xf0/x96/xa4/x91 BAMUM LETTER PHASE-D TU + /xf0/x96/xa4/x92 BAMUM LETTER PHASE-D GHAA + /xf0/x96/xa4/x93 BAMUM LETTER PHASE-D NGKYEE + /xf0/x96/xa4/x94 BAMUM LETTER PHASE-D FEUFEUAET + /xf0/x96/xa4/x95 BAMUM LETTER PHASE-D NDEE + /xf0/x96/xa4/x96 BAMUM LETTER PHASE-D MGBOFUM + /xf0/x96/xa4/x97 BAMUM LETTER PHASE-D LEUAEP + /xf0/x96/xa4/x98 BAMUM LETTER PHASE-D NDON + /xf0/x96/xa4/x99 BAMUM LETTER PHASE-D MONI + /xf0/x96/xa4/x9a BAMUM LETTER PHASE-D MGBEUN + /xf0/x96/xa4/x9b BAMUM LETTER PHASE-D PUUT + /xf0/x96/xa4/x9c BAMUM LETTER PHASE-D MGBIEE + /xf0/x96/xa4/x9d BAMUM LETTER PHASE-D MFO + /xf0/x96/xa4/x9e BAMUM LETTER PHASE-D LUM + /xf0/x96/xa4/x9f BAMUM LETTER PHASE-D NSIEEP + /xf0/x96/xa4/xa0 BAMUM LETTER PHASE-D MBAA + /xf0/x96/xa4/xa1 BAMUM LETTER PHASE-D KWAET + /xf0/x96/xa4/xa2 BAMUM LETTER PHASE-D NYET + /xf0/x96/xa4/xa3 BAMUM LETTER PHASE-D TEUAEN + /xf0/x96/xa4/xa4 BAMUM LETTER PHASE-D SOT + /xf0/x96/xa4/xa5 BAMUM LETTER PHASE-D YUWOQ + /xf0/x96/xa4/xa6 BAMUM LETTER PHASE-D KEUM + /xf0/x96/xa4/xa7 BAMUM LETTER PHASE-D RAEM + /xf0/x96/xa4/xa8 BAMUM LETTER PHASE-D TEEEE + /xf0/x96/xa4/xa9 BAMUM LETTER PHASE-D NGKEUAEQ + /xf0/x96/xa4/xaa BAMUM LETTER PHASE-D MFEUAE + /xf0/x96/xa4/xab BAMUM LETTER PHASE-D NSIEET + /xf0/x96/xa4/xac BAMUM LETTER PHASE-D KEUP + /xf0/x96/xa4/xad BAMUM LETTER PHASE-D PIP + /xf0/x96/xa4/xae BAMUM LETTER PHASE-D PEUTAE + /xf0/x96/xa4/xaf BAMUM LETTER PHASE-D NYUE + /xf0/x96/xa4/xb0 BAMUM LETTER PHASE-D LET + /xf0/x96/xa4/xb1 BAMUM LETTER PHASE-D NGGAAM + /xf0/x96/xa4/xb2 BAMUM LETTER PHASE-D MFIEE + /xf0/x96/xa4/xb3 BAMUM LETTER PHASE-D NGGWAEN + /xf0/x96/xa4/xb4 BAMUM LETTER PHASE-D YUOM + /xf0/x96/xa4/xb5 BAMUM LETTER PHASE-D PAP + /xf0/x96/xa4/xb6 BAMUM LETTER PHASE-D YUOP + /xf0/x96/xa4/xb7 BAMUM LETTER PHASE-D NDAM + /xf0/x96/xa4/xb8 BAMUM LETTER PHASE-D NTEUM + /xf0/x96/xa4/xb9 BAMUM LETTER PHASE-D SUAE + /xf0/x96/xa4/xba BAMUM LETTER PHASE-D KUN + /xf0/x96/xa4/xbb BAMUM LETTER PHASE-D NGGEUX + /xf0/x96/xa4/xbc BAMUM LETTER PHASE-D NGKIEE + /xf0/x96/xa4/xbd BAMUM LETTER PHASE-D TUOT + /xf0/x96/xa4/xbe BAMUM LETTER PHASE-D MEUN + /xf0/x96/xa4/xbf BAMUM LETTER PHASE-D KUQ + /xf0/x96/xa5/x80 BAMUM LETTER PHASE-D NSUM + /xf0/x96/xa5/x81 BAMUM LETTER PHASE-D TEUN + /xf0/x96/xa5/x82 BAMUM LETTER PHASE-D MAENJET + /xf0/x96/xa5/x83 BAMUM LETTER PHASE-D NGGAP + /xf0/x96/xa5/x84 BAMUM LETTER PHASE-D LEUM + /xf0/x96/xa5/x85 BAMUM LETTER PHASE-D NGGUOM + /xf0/x96/xa5/x86 BAMUM LETTER PHASE-D NSHUT + /xf0/x96/xa5/x87 BAMUM LETTER PHASE-D NJUEQ + /xf0/x96/xa5/x88 BAMUM LETTER PHASE-D GHEUAE + /xf0/x96/xa5/x89 BAMUM LETTER PHASE-D KU + /xf0/x96/xa5/x8a BAMUM LETTER PHASE-D REN OLD + /xf0/x96/xa5/x8b BAMUM LETTER PHASE-D TAE + /xf0/x96/xa5/x8c BAMUM LETTER PHASE-D TOQ + /xf0/x96/xa5/x8d BAMUM LETTER PHASE-D NYI + /xf0/x96/xa5/x8e BAMUM LETTER PHASE-D RII + /xf0/x96/xa5/x8f BAMUM LETTER PHASE-D LEEEE + /xf0/x96/xa5/x90 BAMUM LETTER PHASE-D MEEEE + /xf0/x96/xa5/x91 BAMUM LETTER PHASE-D M + /xf0/x96/xa5/x92 BAMUM LETTER PHASE-D SUU + /xf0/x96/xa5/x93 BAMUM LETTER PHASE-D MU + /xf0/x96/xa5/x94 BAMUM LETTER PHASE-D SHII + /xf0/x96/xa5/x95 BAMUM LETTER PHASE-D SHEUX + /xf0/x96/xa5/x96 BAMUM LETTER PHASE-D KYEE + /xf0/x96/xa5/x97 BAMUM LETTER PHASE-D NU + /xf0/x96/xa5/x98 BAMUM LETTER PHASE-D SHU + /xf0/x96/xa5/x99 BAMUM LETTER PHASE-D NTEE + /xf0/x96/xa5/x9a BAMUM LETTER PHASE-D PEE + /xf0/x96/xa5/x9b BAMUM LETTER PHASE-D NI + /xf0/x96/xa5/x9c BAMUM LETTER PHASE-D SHOQ + /xf0/x96/xa5/x9d BAMUM LETTER PHASE-D PUQ + /xf0/x96/xa5/x9e BAMUM LETTER PHASE-D MVOP + /xf0/x96/xa5/x9f BAMUM LETTER PHASE-D LOQ + /xf0/x96/xa5/xa0 BAMUM LETTER PHASE-D REN MUCH + /xf0/x96/xa5/xa1 BAMUM LETTER PHASE-D TI + /xf0/x96/xa5/xa2 BAMUM LETTER PHASE-D NTUU + /xf0/x96/xa5/xa3 BAMUM LETTER PHASE-D MBAA SEVEN + /xf0/x96/xa5/xa4 BAMUM LETTER PHASE-D SAQ + /xf0/x96/xa5/xa5 BAMUM LETTER PHASE-D FAA + /xf0/x96/xa5/xa6 BAMUM LETTER PHASE-E NDAP + /xf0/x96/xa5/xa7 BAMUM LETTER PHASE-E TOON + /xf0/x96/xa5/xa8 BAMUM LETTER PHASE-E MBEUM + /xf0/x96/xa5/xa9 BAMUM LETTER PHASE-E LAP + /xf0/x96/xa5/xaa BAMUM LETTER PHASE-E VOM + /xf0/x96/xa5/xab BAMUM LETTER PHASE-E LOON + /xf0/x96/xa5/xac BAMUM LETTER PHASE-E PAA + /xf0/x96/xa5/xad BAMUM LETTER PHASE-E SOM + /xf0/x96/xa5/xae BAMUM LETTER PHASE-E RAQ + /xf0/x96/xa5/xaf BAMUM LETTER PHASE-E NSHUOP + /xf0/x96/xa5/xb0 BAMUM LETTER PHASE-E NDUN + /xf0/x96/xa5/xb1 BAMUM LETTER PHASE-E PUAE + /xf0/x96/xa5/xb2 BAMUM LETTER PHASE-E TAM + /xf0/x96/xa5/xb3 BAMUM LETTER PHASE-E NGKA + /xf0/x96/xa5/xb4 BAMUM LETTER PHASE-E KPEUX + /xf0/x96/xa5/xb5 BAMUM LETTER PHASE-E WUO + /xf0/x96/xa5/xb6 BAMUM LETTER PHASE-E SEE + /xf0/x96/xa5/xb7 BAMUM LETTER PHASE-E NGGEUAET + /xf0/x96/xa5/xb8 BAMUM LETTER PHASE-E PAAM + /xf0/x96/xa5/xb9 BAMUM LETTER PHASE-E TOO + /xf0/x96/xa5/xba BAMUM LETTER PHASE-E KUOP + /xf0/x96/xa5/xbb BAMUM LETTER PHASE-E LOM + /xf0/x96/xa5/xbc BAMUM LETTER PHASE-E NSHIEE + /xf0/x96/xa5/xbd BAMUM LETTER PHASE-E NGOP + /xf0/x96/xa5/xbe BAMUM LETTER PHASE-E MAEM + /xf0/x96/xa5/xbf BAMUM LETTER PHASE-E NGKEUX + /xf0/x96/xa6/x80 BAMUM LETTER PHASE-E NGOQ + /xf0/x96/xa6/x81 BAMUM LETTER PHASE-E NSHUE + /xf0/x96/xa6/x82 BAMUM LETTER PHASE-E RIMGBA + /xf0/x96/xa6/x83 BAMUM LETTER PHASE-E NJEUX + /xf0/x96/xa6/x84 BAMUM LETTER PHASE-E PEEM + /xf0/x96/xa6/x85 BAMUM LETTER PHASE-E SAA + /xf0/x96/xa6/x86 BAMUM LETTER PHASE-E NGGURAE + /xf0/x96/xa6/x87 BAMUM LETTER PHASE-E MGBA + /xf0/x96/xa6/x88 BAMUM LETTER PHASE-E GHEUX + /xf0/x96/xa6/x89 BAMUM LETTER PHASE-E NGKEUAEM + /xf0/x96/xa6/x8a BAMUM LETTER PHASE-E NJAEMLI + /xf0/x96/xa6/x8b BAMUM LETTER PHASE-E MAP + /xf0/x96/xa6/x8c BAMUM LETTER PHASE-E LOOT + /xf0/x96/xa6/x8d BAMUM LETTER PHASE-E NGGEEEE + /xf0/x96/xa6/x8e BAMUM LETTER PHASE-E NDIQ + /xf0/x96/xa6/x8f BAMUM LETTER PHASE-E TAEN NTEUM + /xf0/x96/xa6/x90 BAMUM LETTER PHASE-E SET + /xf0/x96/xa6/x91 BAMUM LETTER PHASE-E PUM + /xf0/x96/xa6/x92 BAMUM LETTER PHASE-E NDAA SOFTNESS + /xf0/x96/xa6/x93 BAMUM LETTER PHASE-E NGGUAESHAE NYAM + /xf0/x96/xa6/x94 BAMUM LETTER PHASE-E YIEE + /xf0/x96/xa6/x95 BAMUM LETTER PHASE-E GHEUN + /xf0/x96/xa6/x96 BAMUM LETTER PHASE-E TUAE + /xf0/x96/xa6/x97 BAMUM LETTER PHASE-E YEUAE + /xf0/x96/xa6/x98 BAMUM LETTER PHASE-E PO + /xf0/x96/xa6/x99 BAMUM LETTER PHASE-E TUMAE + /xf0/x96/xa6/x9a BAMUM LETTER PHASE-E KEUAE + /xf0/x96/xa6/x9b BAMUM LETTER PHASE-E SUAEN + /xf0/x96/xa6/x9c BAMUM LETTER PHASE-E TEUAEQ + /xf0/x96/xa6/x9d BAMUM LETTER PHASE-E VEUAE + /xf0/x96/xa6/x9e BAMUM LETTER PHASE-E WEUX + /xf0/x96/xa6/x9f BAMUM LETTER PHASE-E LAAM + /xf0/x96/xa6/xa0 BAMUM LETTER PHASE-E PU + /xf0/x96/xa6/xa1 BAMUM LETTER PHASE-E TAAQ + /xf0/x96/xa6/xa2 BAMUM LETTER PHASE-E GHAAMAE + /xf0/x96/xa6/xa3 BAMUM LETTER PHASE-E NGEUREUT + /xf0/x96/xa6/xa4 BAMUM LETTER PHASE-E SHEUAEQ + /xf0/x96/xa6/xa5 BAMUM LETTER PHASE-E MGBEN + /xf0/x96/xa6/xa6 BAMUM LETTER PHASE-E MBEE + /xf0/x96/xa6/xa7 BAMUM LETTER PHASE-E NZAQ + /xf0/x96/xa6/xa8 BAMUM LETTER PHASE-E NKOM + /xf0/x96/xa6/xa9 BAMUM LETTER PHASE-E GBET + /xf0/x96/xa6/xaa BAMUM LETTER PHASE-E TUM + /xf0/x96/xa6/xab BAMUM LETTER PHASE-E KUET + /xf0/x96/xa6/xac BAMUM LETTER PHASE-E YAP + /xf0/x96/xa6/xad BAMUM LETTER PHASE-E NYI CLEAVER + /xf0/x96/xa6/xae BAMUM LETTER PHASE-E YIT + /xf0/x96/xa6/xaf BAMUM LETTER PHASE-E MFEUQ + /xf0/x96/xa6/xb0 BAMUM LETTER PHASE-E NDIAQ + /xf0/x96/xa6/xb1 BAMUM LETTER PHASE-E PIEEQ + /xf0/x96/xa6/xb2 BAMUM LETTER PHASE-E YUEQ + /xf0/x96/xa6/xb3 BAMUM LETTER PHASE-E LEUAEM + /xf0/x96/xa6/xb4 BAMUM LETTER PHASE-E FUE + /xf0/x96/xa6/xb5 BAMUM LETTER PHASE-E GBEUX + /xf0/x96/xa6/xb6 BAMUM LETTER PHASE-E NGKUP + /xf0/x96/xa6/xb7 BAMUM LETTER PHASE-E KET + /xf0/x96/xa6/xb8 BAMUM LETTER PHASE-E MAE + /xf0/x96/xa6/xb9 BAMUM LETTER PHASE-E NGKAAMI + /xf0/x96/xa6/xba BAMUM LETTER PHASE-E GHET + /xf0/x96/xa6/xbb BAMUM LETTER PHASE-E FA + /xf0/x96/xa6/xbc BAMUM LETTER PHASE-E NTUM + /xf0/x96/xa6/xbd BAMUM LETTER PHASE-E PEUT + /xf0/x96/xa6/xbe BAMUM LETTER PHASE-E YEUM + /xf0/x96/xa6/xbf BAMUM LETTER PHASE-E NGGEUAE + /xf0/x96/xa7/x80 BAMUM LETTER PHASE-E NYI BETWEEN + /xf0/x96/xa7/x81 BAMUM LETTER PHASE-E NZUQ + /xf0/x96/xa7/x82 BAMUM LETTER PHASE-E POON + /xf0/x96/xa7/x83 BAMUM LETTER PHASE-E MIEE + /xf0/x96/xa7/x84 BAMUM LETTER PHASE-E FUET + /xf0/x96/xa7/x85 BAMUM LETTER PHASE-E NAE + /xf0/x96/xa7/x86 BAMUM LETTER PHASE-E MUAE + /xf0/x96/xa7/x87 BAMUM LETTER PHASE-E GHEUAE + /xf0/x96/xa7/x88 BAMUM LETTER PHASE-E FU I + /xf0/x96/xa7/x89 BAMUM LETTER PHASE-E MVI + /xf0/x96/xa7/x8a BAMUM LETTER PHASE-E PUAQ + /xf0/x96/xa7/x8b BAMUM LETTER PHASE-E NGKUM + /xf0/x96/xa7/x8c BAMUM LETTER PHASE-E KUT + /xf0/x96/xa7/x8d BAMUM LETTER PHASE-E PIET + /xf0/x96/xa7/x8e BAMUM LETTER PHASE-E NTAP + /xf0/x96/xa7/x8f BAMUM LETTER PHASE-E YEUAET + /xf0/x96/xa7/x90 BAMUM LETTER PHASE-E NGGUP + /xf0/x96/xa7/x91 BAMUM LETTER PHASE-E PA PEOPLE + /xf0/x96/xa7/x92 BAMUM LETTER PHASE-E FU CALL + /xf0/x96/xa7/x93 BAMUM LETTER PHASE-E FOM + /xf0/x96/xa7/x94 BAMUM LETTER PHASE-E NJEE + /xf0/x96/xa7/x95 BAMUM LETTER PHASE-E A + /xf0/x96/xa7/x96 BAMUM LETTER PHASE-E TOQ + /xf0/x96/xa7/x97 BAMUM LETTER PHASE-E O + /xf0/x96/xa7/x98 BAMUM LETTER PHASE-E I + /xf0/x96/xa7/x99 BAMUM LETTER PHASE-E LAQ + /xf0/x96/xa7/x9a BAMUM LETTER PHASE-E PA PLURAL + /xf0/x96/xa7/x9b BAMUM LETTER PHASE-E TAA + /xf0/x96/xa7/x9c BAMUM LETTER PHASE-E TAQ + /xf0/x96/xa7/x9d BAMUM LETTER PHASE-E NDAA MY HOUSE + /xf0/x96/xa7/x9e BAMUM LETTER PHASE-E SHIQ + /xf0/x96/xa7/x9f BAMUM LETTER PHASE-E YEUX + /xf0/x96/xa7/xa0 BAMUM LETTER PHASE-E NGUAE + /xf0/x96/xa7/xa1 BAMUM LETTER PHASE-E YUAEN + /xf0/x96/xa7/xa2 BAMUM LETTER PHASE-E YOQ SWIMMING + /xf0/x96/xa7/xa3 BAMUM LETTER PHASE-E YOQ COVER + /xf0/x96/xa7/xa4 BAMUM LETTER PHASE-E YUQ + /xf0/x96/xa7/xa5 BAMUM LETTER PHASE-E YUN + /xf0/x96/xa7/xa6 BAMUM LETTER PHASE-E KEUX + /xf0/x96/xa7/xa7 BAMUM LETTER PHASE-E PEUX + /xf0/x96/xa7/xa8 BAMUM LETTER PHASE-E NJEE EPOCH + /xf0/x96/xa7/xa9 BAMUM LETTER PHASE-E PUE + /xf0/x96/xa7/xaa BAMUM LETTER PHASE-E WUE + /xf0/x96/xa7/xab BAMUM LETTER PHASE-E FEE + /xf0/x96/xa7/xac BAMUM LETTER PHASE-E VEE + /xf0/x96/xa7/xad BAMUM LETTER PHASE-E LU + /xf0/x96/xa7/xae BAMUM LETTER PHASE-E MI + /xf0/x96/xa7/xaf BAMUM LETTER PHASE-E REUX + /xf0/x96/xa7/xb0 BAMUM LETTER PHASE-E RAE + /xf0/x96/xa7/xb1 BAMUM LETTER PHASE-E NGUAET + /xf0/x96/xa7/xb2 BAMUM LETTER PHASE-E NGA + /xf0/x96/xa7/xb3 BAMUM LETTER PHASE-E SHO + /xf0/x96/xa7/xb4 BAMUM LETTER PHASE-E SHOQ + /xf0/x96/xa7/xb5 BAMUM LETTER PHASE-E FU REMEDY + /xf0/x96/xa7/xb6 BAMUM LETTER PHASE-E NA + /xf0/x96/xa7/xb7 BAMUM LETTER PHASE-E PI + /xf0/x96/xa7/xb8 BAMUM LETTER PHASE-E LOQ + /xf0/x96/xa7/xb9 BAMUM LETTER PHASE-E KO + /xf0/x96/xa7/xba BAMUM LETTER PHASE-E MEN + /xf0/x96/xa7/xbb BAMUM LETTER PHASE-E MA + /xf0/x96/xa7/xbc BAMUM LETTER PHASE-E MAQ + /xf0/x96/xa7/xbd BAMUM LETTER PHASE-E TEU + /xf0/x96/xa7/xbe BAMUM LETTER PHASE-E KI + /xf0/x96/xa7/xbf BAMUM LETTER PHASE-E MON + /xf0/x96/xa8/x80 BAMUM LETTER PHASE-E TEN + /xf0/x96/xa8/x81 BAMUM LETTER PHASE-E FAQ + /xf0/x96/xa8/x82 BAMUM LETTER PHASE-E GHOM + /xf0/x96/xa8/x83 BAMUM LETTER PHASE-F KA + /xf0/x96/xa8/x84 BAMUM LETTER PHASE-F U + /xf0/x96/xa8/x85 BAMUM LETTER PHASE-F KU + /xf0/x96/xa8/x86 BAMUM LETTER PHASE-F EE + /xf0/x96/xa8/x87 BAMUM LETTER PHASE-F REE + /xf0/x96/xa8/x88 BAMUM LETTER PHASE-F TAE + /xf0/x96/xa8/x89 BAMUM LETTER PHASE-F NYI + /xf0/x96/xa8/x8a BAMUM LETTER PHASE-F LA + /xf0/x96/xa8/x8b BAMUM LETTER PHASE-F RII + /xf0/x96/xa8/x8c BAMUM LETTER PHASE-F RIEE + /xf0/x96/xa8/x8d BAMUM LETTER PHASE-F MEEEE + /xf0/x96/xa8/x8e BAMUM LETTER PHASE-F TAA + /xf0/x96/xa8/x8f BAMUM LETTER PHASE-F NDAA + /xf0/x96/xa8/x90 BAMUM LETTER PHASE-F NJAEM + /xf0/x96/xa8/x91 BAMUM LETTER PHASE-F M + /xf0/x96/xa8/x92 BAMUM LETTER PHASE-F SUU + /xf0/x96/xa8/x93 BAMUM LETTER PHASE-F SHII + /xf0/x96/xa8/x94 BAMUM LETTER PHASE-F SI + /xf0/x96/xa8/x95 BAMUM LETTER PHASE-F SEUX + /xf0/x96/xa8/x96 BAMUM LETTER PHASE-F KYEE + /xf0/x96/xa8/x97 BAMUM LETTER PHASE-F KET + /xf0/x96/xa8/x98 BAMUM LETTER PHASE-F NUAE + /xf0/x96/xa8/x99 BAMUM LETTER PHASE-F NU + /xf0/x96/xa8/x9a BAMUM LETTER PHASE-F NJUAE + /xf0/x96/xa8/x9b BAMUM LETTER PHASE-F YOQ + /xf0/x96/xa8/x9c BAMUM LETTER PHASE-F SHU + /xf0/x96/xa8/x9d BAMUM LETTER PHASE-F YA + /xf0/x96/xa8/x9e BAMUM LETTER PHASE-F NSHA + /xf0/x96/xa8/x9f BAMUM LETTER PHASE-F PEUX + /xf0/x96/xa8/xa0 BAMUM LETTER PHASE-F NTEE + /xf0/x96/xa8/xa1 BAMUM LETTER PHASE-F WUE + /xf0/x96/xa8/xa2 BAMUM LETTER PHASE-F PEE + /xf0/x96/xa8/xa3 BAMUM LETTER PHASE-F RU + /xf0/x96/xa8/xa4 BAMUM LETTER PHASE-F NI + /xf0/x96/xa8/xa5 BAMUM LETTER PHASE-F REUX + /xf0/x96/xa8/xa6 BAMUM LETTER PHASE-F KEN + /xf0/x96/xa8/xa7 BAMUM LETTER PHASE-F NGKWAEN + /xf0/x96/xa8/xa8 BAMUM LETTER PHASE-F NGGA + /xf0/x96/xa8/xa9 BAMUM LETTER PHASE-F SHO + /xf0/x96/xa8/xaa BAMUM LETTER PHASE-F PUAE + /xf0/x96/xa8/xab BAMUM LETTER PHASE-F FOM + /xf0/x96/xa8/xac BAMUM LETTER PHASE-F WA + /xf0/x96/xa8/xad BAMUM LETTER PHASE-F LI + /xf0/x96/xa8/xae BAMUM LETTER PHASE-F LOQ + /xf0/x96/xa8/xaf BAMUM LETTER PHASE-F KO + /xf0/x96/xa8/xb0 BAMUM LETTER PHASE-F MBEN + /xf0/x96/xa8/xb1 BAMUM LETTER PHASE-F REN + /xf0/x96/xa8/xb2 BAMUM LETTER PHASE-F MA + /xf0/x96/xa8/xb3 BAMUM LETTER PHASE-F MO + /xf0/x96/xa8/xb4 BAMUM LETTER PHASE-F MBAA + /xf0/x96/xa8/xb5 BAMUM LETTER PHASE-F TET + /xf0/x96/xa8/xb6 BAMUM LETTER PHASE-F KPA + /xf0/x96/xa8/xb7 BAMUM LETTER PHASE-F SAMBA + /xf0/x96/xa8/xb8 BAMUM LETTER PHASE-F VUEQ + /xf0/x9b/x80/x80 KATAKANA LETTER ARCHAIC E + /xf0/x9b/x80/x81 HIRAGANA LETTER ARCHAIC YE /xf0/x9d/x80/x80 BYZANTINE MUSICAL SYMBOL PSILI /xf0/x9d/x80/x81 BYZANTINE MUSICAL SYMBOL DASEIA /xf0/x9d/x80/x82 BYZANTINE MUSICAL SYMBOL PERISPOMENI @@ -30151,6 +33445,1097 @@ CHARMAP /xf0/x9f/x82/x91 DOMINO TILE VERTICAL-06-04 /xf0/x9f/x82/x92 DOMINO TILE VERTICAL-06-05 /xf0/x9f/x82/x93 DOMINO TILE VERTICAL-06-06 + /xf0/x9f/x82/xa0 PLAYING CARD BACK + /xf0/x9f/x82/xa1 PLAYING CARD ACE OF SPADES + /xf0/x9f/x82/xa2 PLAYING CARD TWO OF SPADES + /xf0/x9f/x82/xa3 PLAYING CARD THREE OF SPADES + /xf0/x9f/x82/xa4 PLAYING CARD FOUR OF SPADES + /xf0/x9f/x82/xa5 PLAYING CARD FIVE OF SPADES + /xf0/x9f/x82/xa6 PLAYING CARD SIX OF SPADES + /xf0/x9f/x82/xa7 PLAYING CARD SEVEN OF SPADES + /xf0/x9f/x82/xa8 PLAYING CARD EIGHT OF SPADES + /xf0/x9f/x82/xa9 PLAYING CARD NINE OF SPADES + /xf0/x9f/x82/xaa PLAYING CARD TEN OF SPADES + /xf0/x9f/x82/xab PLAYING CARD JACK OF SPADES + /xf0/x9f/x82/xac PLAYING CARD KNIGHT OF SPADES + /xf0/x9f/x82/xad PLAYING CARD QUEEN OF SPADES + /xf0/x9f/x82/xae PLAYING CARD KING OF SPADES + /xf0/x9f/x82/xb1 PLAYING CARD ACE OF HEARTS + /xf0/x9f/x82/xb2 PLAYING CARD TWO OF HEARTS + /xf0/x9f/x82/xb3 PLAYING CARD THREE OF HEARTS + /xf0/x9f/x82/xb4 PLAYING CARD FOUR OF HEARTS + /xf0/x9f/x82/xb5 PLAYING CARD FIVE OF HEARTS + /xf0/x9f/x82/xb6 PLAYING CARD SIX OF HEARTS + /xf0/x9f/x82/xb7 PLAYING CARD SEVEN OF HEARTS + /xf0/x9f/x82/xb8 PLAYING CARD EIGHT OF HEARTS + /xf0/x9f/x82/xb9 PLAYING CARD NINE OF HEARTS + /xf0/x9f/x82/xba PLAYING CARD TEN OF HEARTS + /xf0/x9f/x82/xbb PLAYING CARD JACK OF HEARTS + /xf0/x9f/x82/xbc PLAYING CARD KNIGHT OF HEARTS + /xf0/x9f/x82/xbd PLAYING CARD QUEEN OF HEARTS + /xf0/x9f/x82/xbe PLAYING CARD KING OF HEARTS + /xf0/x9f/x83/x81 PLAYING CARD ACE OF DIAMONDS + /xf0/x9f/x83/x82 PLAYING CARD TWO OF DIAMONDS + /xf0/x9f/x83/x83 PLAYING CARD THREE OF DIAMONDS + /xf0/x9f/x83/x84 PLAYING CARD FOUR OF DIAMONDS + /xf0/x9f/x83/x85 PLAYING CARD FIVE OF DIAMONDS + /xf0/x9f/x83/x86 PLAYING CARD SIX OF DIAMONDS + /xf0/x9f/x83/x87 PLAYING CARD SEVEN OF DIAMONDS + /xf0/x9f/x83/x88 PLAYING CARD EIGHT OF DIAMONDS + /xf0/x9f/x83/x89 PLAYING CARD NINE OF DIAMONDS + /xf0/x9f/x83/x8a PLAYING CARD TEN OF DIAMONDS + /xf0/x9f/x83/x8b PLAYING CARD JACK OF DIAMONDS + /xf0/x9f/x83/x8c PLAYING CARD KNIGHT OF DIAMONDS + /xf0/x9f/x83/x8d PLAYING CARD QUEEN OF DIAMONDS + /xf0/x9f/x83/x8e PLAYING CARD KING OF DIAMONDS + /xf0/x9f/x83/x8f PLAYING CARD BLACK JOKER + /xf0/x9f/x83/x91 PLAYING CARD ACE OF CLUBS + /xf0/x9f/x83/x92 PLAYING CARD TWO OF CLUBS + /xf0/x9f/x83/x93 PLAYING CARD THREE OF CLUBS + /xf0/x9f/x83/x94 PLAYING CARD FOUR OF CLUBS + /xf0/x9f/x83/x95 PLAYING CARD FIVE OF CLUBS + /xf0/x9f/x83/x96 PLAYING CARD SIX OF CLUBS + /xf0/x9f/x83/x97 PLAYING CARD SEVEN OF CLUBS + /xf0/x9f/x83/x98 PLAYING CARD EIGHT OF CLUBS + /xf0/x9f/x83/x99 PLAYING CARD NINE OF CLUBS + /xf0/x9f/x83/x9a PLAYING CARD TEN OF CLUBS + /xf0/x9f/x83/x9b PLAYING CARD JACK OF CLUBS + /xf0/x9f/x83/x9c PLAYING CARD KNIGHT OF CLUBS + /xf0/x9f/x83/x9d PLAYING CARD QUEEN OF CLUBS + /xf0/x9f/x83/x9e PLAYING CARD KING OF CLUBS + /xf0/x9f/x83/x9f PLAYING CARD WHITE JOKER + /xf0/x9f/x84/x80 DIGIT ZERO FULL STOP + /xf0/x9f/x84/x81 DIGIT ZERO COMMA + /xf0/x9f/x84/x82 DIGIT ONE COMMA + /xf0/x9f/x84/x83 DIGIT TWO COMMA + /xf0/x9f/x84/x84 DIGIT THREE COMMA + /xf0/x9f/x84/x85 DIGIT FOUR COMMA + /xf0/x9f/x84/x86 DIGIT FIVE COMMA + /xf0/x9f/x84/x87 DIGIT SIX COMMA + /xf0/x9f/x84/x88 DIGIT SEVEN COMMA + /xf0/x9f/x84/x89 DIGIT EIGHT COMMA + /xf0/x9f/x84/x8a DIGIT NINE COMMA + /xf0/x9f/x84/x90 PARENTHESIZED LATIN CAPITAL LETTER A + /xf0/x9f/x84/x91 PARENTHESIZED LATIN CAPITAL LETTER B + /xf0/x9f/x84/x92 PARENTHESIZED LATIN CAPITAL LETTER C + /xf0/x9f/x84/x93 PARENTHESIZED LATIN CAPITAL LETTER D + /xf0/x9f/x84/x94 PARENTHESIZED LATIN CAPITAL LETTER E + /xf0/x9f/x84/x95 PARENTHESIZED LATIN CAPITAL LETTER F + /xf0/x9f/x84/x96 PARENTHESIZED LATIN CAPITAL LETTER G + /xf0/x9f/x84/x97 PARENTHESIZED LATIN CAPITAL LETTER H + /xf0/x9f/x84/x98 PARENTHESIZED LATIN CAPITAL LETTER I + /xf0/x9f/x84/x99 PARENTHESIZED LATIN CAPITAL LETTER J + /xf0/x9f/x84/x9a PARENTHESIZED LATIN CAPITAL LETTER K + /xf0/x9f/x84/x9b PARENTHESIZED LATIN CAPITAL LETTER L + /xf0/x9f/x84/x9c PARENTHESIZED LATIN CAPITAL LETTER M + /xf0/x9f/x84/x9d PARENTHESIZED LATIN CAPITAL LETTER N + /xf0/x9f/x84/x9e PARENTHESIZED LATIN CAPITAL LETTER O + /xf0/x9f/x84/x9f PARENTHESIZED LATIN CAPITAL LETTER P + /xf0/x9f/x84/xa0 PARENTHESIZED LATIN CAPITAL LETTER Q + /xf0/x9f/x84/xa1 PARENTHESIZED LATIN CAPITAL LETTER R + /xf0/x9f/x84/xa2 PARENTHESIZED LATIN CAPITAL LETTER S + /xf0/x9f/x84/xa3 PARENTHESIZED LATIN CAPITAL LETTER T + /xf0/x9f/x84/xa4 PARENTHESIZED LATIN CAPITAL LETTER U + /xf0/x9f/x84/xa5 PARENTHESIZED LATIN CAPITAL LETTER V + /xf0/x9f/x84/xa6 PARENTHESIZED LATIN CAPITAL LETTER W + /xf0/x9f/x84/xa7 PARENTHESIZED LATIN CAPITAL LETTER X + /xf0/x9f/x84/xa8 PARENTHESIZED LATIN CAPITAL LETTER Y + /xf0/x9f/x84/xa9 PARENTHESIZED LATIN CAPITAL LETTER Z + /xf0/x9f/x84/xaa TORTOISE SHELL BRACKETED LATIN CAPITAL LETTER S + /xf0/x9f/x84/xab CIRCLED ITALIC LATIN CAPITAL LETTER C + /xf0/x9f/x84/xac CIRCLED ITALIC LATIN CAPITAL LETTER R + /xf0/x9f/x84/xad CIRCLED CD + /xf0/x9f/x84/xae CIRCLED WZ + /xf0/x9f/x84/xb0 SQUARED LATIN CAPITAL LETTER A + /xf0/x9f/x84/xb1 SQUARED LATIN CAPITAL LETTER B + /xf0/x9f/x84/xb2 SQUARED LATIN CAPITAL LETTER C + /xf0/x9f/x84/xb3 SQUARED LATIN CAPITAL LETTER D + /xf0/x9f/x84/xb4 SQUARED LATIN CAPITAL LETTER E + /xf0/x9f/x84/xb5 SQUARED LATIN CAPITAL LETTER F + /xf0/x9f/x84/xb6 SQUARED LATIN CAPITAL LETTER G + /xf0/x9f/x84/xb7 SQUARED LATIN CAPITAL LETTER H + /xf0/x9f/x84/xb8 SQUARED LATIN CAPITAL LETTER I + /xf0/x9f/x84/xb9 SQUARED LATIN CAPITAL LETTER J + /xf0/x9f/x84/xba SQUARED LATIN CAPITAL LETTER K + /xf0/x9f/x84/xbb SQUARED LATIN CAPITAL LETTER L + /xf0/x9f/x84/xbc SQUARED LATIN CAPITAL LETTER M + /xf0/x9f/x84/xbd SQUARED LATIN CAPITAL LETTER N + /xf0/x9f/x84/xbe SQUARED LATIN CAPITAL LETTER O + /xf0/x9f/x84/xbf SQUARED LATIN CAPITAL LETTER P + /xf0/x9f/x85/x80 SQUARED LATIN CAPITAL LETTER Q + /xf0/x9f/x85/x81 SQUARED LATIN CAPITAL LETTER R + /xf0/x9f/x85/x82 SQUARED LATIN CAPITAL LETTER S + /xf0/x9f/x85/x83 SQUARED LATIN CAPITAL LETTER T + /xf0/x9f/x85/x84 SQUARED LATIN CAPITAL LETTER U + /xf0/x9f/x85/x85 SQUARED LATIN CAPITAL LETTER V + /xf0/x9f/x85/x86 SQUARED LATIN CAPITAL LETTER W + /xf0/x9f/x85/x87 SQUARED LATIN CAPITAL LETTER X + /xf0/x9f/x85/x88 SQUARED LATIN CAPITAL LETTER Y + /xf0/x9f/x85/x89 SQUARED LATIN CAPITAL LETTER Z + /xf0/x9f/x85/x8a SQUARED HV + /xf0/x9f/x85/x8b SQUARED MV + /xf0/x9f/x85/x8c SQUARED SD + /xf0/x9f/x85/x8d SQUARED SS + /xf0/x9f/x85/x8e SQUARED PPV + /xf0/x9f/x85/x8f SQUARED WC + /xf0/x9f/x85/x90 NEGATIVE CIRCLED LATIN CAPITAL LETTER A + /xf0/x9f/x85/x91 NEGATIVE CIRCLED LATIN CAPITAL LETTER B + /xf0/x9f/x85/x92 NEGATIVE CIRCLED LATIN CAPITAL LETTER C + /xf0/x9f/x85/x93 NEGATIVE CIRCLED LATIN CAPITAL LETTER D + /xf0/x9f/x85/x94 NEGATIVE CIRCLED LATIN CAPITAL LETTER E + /xf0/x9f/x85/x95 NEGATIVE CIRCLED LATIN CAPITAL LETTER F + /xf0/x9f/x85/x96 NEGATIVE CIRCLED LATIN CAPITAL LETTER G + /xf0/x9f/x85/x97 NEGATIVE CIRCLED LATIN CAPITAL LETTER H + /xf0/x9f/x85/x98 NEGATIVE CIRCLED LATIN CAPITAL LETTER I + /xf0/x9f/x85/x99 NEGATIVE CIRCLED LATIN CAPITAL LETTER J + /xf0/x9f/x85/x9a NEGATIVE CIRCLED LATIN CAPITAL LETTER K + /xf0/x9f/x85/x9b NEGATIVE CIRCLED LATIN CAPITAL LETTER L + /xf0/x9f/x85/x9c NEGATIVE CIRCLED LATIN CAPITAL LETTER M + /xf0/x9f/x85/x9d NEGATIVE CIRCLED LATIN CAPITAL LETTER N + /xf0/x9f/x85/x9e NEGATIVE CIRCLED LATIN CAPITAL LETTER O + /xf0/x9f/x85/x9f NEGATIVE CIRCLED LATIN CAPITAL LETTER P + /xf0/x9f/x85/xa0 NEGATIVE CIRCLED LATIN CAPITAL LETTER Q + /xf0/x9f/x85/xa1 NEGATIVE CIRCLED LATIN CAPITAL LETTER R + /xf0/x9f/x85/xa2 NEGATIVE CIRCLED LATIN CAPITAL LETTER S + /xf0/x9f/x85/xa3 NEGATIVE CIRCLED LATIN CAPITAL LETTER T + /xf0/x9f/x85/xa4 NEGATIVE CIRCLED LATIN CAPITAL LETTER U + /xf0/x9f/x85/xa5 NEGATIVE CIRCLED LATIN CAPITAL LETTER V + /xf0/x9f/x85/xa6 NEGATIVE CIRCLED LATIN CAPITAL LETTER W + /xf0/x9f/x85/xa7 NEGATIVE CIRCLED LATIN CAPITAL LETTER X + /xf0/x9f/x85/xa8 NEGATIVE CIRCLED LATIN CAPITAL LETTER Y + /xf0/x9f/x85/xa9 NEGATIVE CIRCLED LATIN CAPITAL LETTER Z + /xf0/x9f/x85/xb0 NEGATIVE SQUARED LATIN CAPITAL LETTER A + /xf0/x9f/x85/xb1 NEGATIVE SQUARED LATIN CAPITAL LETTER B + /xf0/x9f/x85/xb2 NEGATIVE SQUARED LATIN CAPITAL LETTER C + /xf0/x9f/x85/xb3 NEGATIVE SQUARED LATIN CAPITAL LETTER D + /xf0/x9f/x85/xb4 NEGATIVE SQUARED LATIN CAPITAL LETTER E + /xf0/x9f/x85/xb5 NEGATIVE SQUARED LATIN CAPITAL LETTER F + /xf0/x9f/x85/xb6 NEGATIVE SQUARED LATIN CAPITAL LETTER G + /xf0/x9f/x85/xb7 NEGATIVE SQUARED LATIN CAPITAL LETTER H + /xf0/x9f/x85/xb8 NEGATIVE SQUARED LATIN CAPITAL LETTER I + /xf0/x9f/x85/xb9 NEGATIVE SQUARED LATIN CAPITAL LETTER J + /xf0/x9f/x85/xba NEGATIVE SQUARED LATIN CAPITAL LETTER K + /xf0/x9f/x85/xbb NEGATIVE SQUARED LATIN CAPITAL LETTER L + /xf0/x9f/x85/xbc NEGATIVE SQUARED LATIN CAPITAL LETTER M + /xf0/x9f/x85/xbd NEGATIVE SQUARED LATIN CAPITAL LETTER N + /xf0/x9f/x85/xbe NEGATIVE SQUARED LATIN CAPITAL LETTER O + /xf0/x9f/x85/xbf NEGATIVE SQUARED LATIN CAPITAL LETTER P + /xf0/x9f/x86/x80 NEGATIVE SQUARED LATIN CAPITAL LETTER Q + /xf0/x9f/x86/x81 NEGATIVE SQUARED LATIN CAPITAL LETTER R + /xf0/x9f/x86/x82 NEGATIVE SQUARED LATIN CAPITAL LETTER S + /xf0/x9f/x86/x83 NEGATIVE SQUARED LATIN CAPITAL LETTER T + /xf0/x9f/x86/x84 NEGATIVE SQUARED LATIN CAPITAL LETTER U + /xf0/x9f/x86/x85 NEGATIVE SQUARED LATIN CAPITAL LETTER V + /xf0/x9f/x86/x86 NEGATIVE SQUARED LATIN CAPITAL LETTER W + /xf0/x9f/x86/x87 NEGATIVE SQUARED LATIN CAPITAL LETTER X + /xf0/x9f/x86/x88 NEGATIVE SQUARED LATIN CAPITAL LETTER Y + /xf0/x9f/x86/x89 NEGATIVE SQUARED LATIN CAPITAL LETTER Z + /xf0/x9f/x86/x8a CROSSED NEGATIVE SQUARED LATIN CAPITAL LETTER P + /xf0/x9f/x86/x8b NEGATIVE SQUARED IC + /xf0/x9f/x86/x8c NEGATIVE SQUARED PA + /xf0/x9f/x86/x8d NEGATIVE SQUARED SA + /xf0/x9f/x86/x8e NEGATIVE SQUARED AB + /xf0/x9f/x86/x8f NEGATIVE SQUARED WC + /xf0/x9f/x86/x90 SQUARE DJ + /xf0/x9f/x86/x91 SQUARED CL + /xf0/x9f/x86/x92 SQUARED COOL + /xf0/x9f/x86/x93 SQUARED FREE + /xf0/x9f/x86/x94 SQUARED ID + /xf0/x9f/x86/x95 SQUARED NEW + /xf0/x9f/x86/x96 SQUARED NG + /xf0/x9f/x86/x97 SQUARED OK + /xf0/x9f/x86/x98 SQUARED SOS + /xf0/x9f/x86/x99 SQUARED UP WITH EXCLAMATION MARK + /xf0/x9f/x86/x9a SQUARED VS + /xf0/x9f/x87/xa6 REGIONAL INDICATOR SYMBOL LETTER A + /xf0/x9f/x87/xa7 REGIONAL INDICATOR SYMBOL LETTER B + /xf0/x9f/x87/xa8 REGIONAL INDICATOR SYMBOL LETTER C + /xf0/x9f/x87/xa9 REGIONAL INDICATOR SYMBOL LETTER D + /xf0/x9f/x87/xaa REGIONAL INDICATOR SYMBOL LETTER E + /xf0/x9f/x87/xab REGIONAL INDICATOR SYMBOL LETTER F + /xf0/x9f/x87/xac REGIONAL INDICATOR SYMBOL LETTER G + /xf0/x9f/x87/xad REGIONAL INDICATOR SYMBOL LETTER H + /xf0/x9f/x87/xae REGIONAL INDICATOR SYMBOL LETTER I + /xf0/x9f/x87/xaf REGIONAL INDICATOR SYMBOL LETTER J + /xf0/x9f/x87/xb0 REGIONAL INDICATOR SYMBOL LETTER K + /xf0/x9f/x87/xb1 REGIONAL INDICATOR SYMBOL LETTER L + /xf0/x9f/x87/xb2 REGIONAL INDICATOR SYMBOL LETTER M + /xf0/x9f/x87/xb3 REGIONAL INDICATOR SYMBOL LETTER N + /xf0/x9f/x87/xb4 REGIONAL INDICATOR SYMBOL LETTER O + /xf0/x9f/x87/xb5 REGIONAL INDICATOR SYMBOL LETTER P + /xf0/x9f/x87/xb6 REGIONAL INDICATOR SYMBOL LETTER Q + /xf0/x9f/x87/xb7 REGIONAL INDICATOR SYMBOL LETTER R + /xf0/x9f/x87/xb8 REGIONAL INDICATOR SYMBOL LETTER S + /xf0/x9f/x87/xb9 REGIONAL INDICATOR SYMBOL LETTER T + /xf0/x9f/x87/xba REGIONAL INDICATOR SYMBOL LETTER U + /xf0/x9f/x87/xbb REGIONAL INDICATOR SYMBOL LETTER V + /xf0/x9f/x87/xbc REGIONAL INDICATOR SYMBOL LETTER W + /xf0/x9f/x87/xbd REGIONAL INDICATOR SYMBOL LETTER X + /xf0/x9f/x87/xbe REGIONAL INDICATOR SYMBOL LETTER Y + /xf0/x9f/x87/xbf REGIONAL INDICATOR SYMBOL LETTER Z + /xf0/x9f/x88/x80 SQUARE HIRAGANA HOKA + /xf0/x9f/x88/x81 SQUARED KATAKANA KOKO + /xf0/x9f/x88/x82 SQUARED KATAKANA SA + /xf0/x9f/x88/x90 SQUARED CJK UNIFIED IDEOGRAPH-624B + /xf0/x9f/x88/x91 SQUARED CJK UNIFIED IDEOGRAPH-5B57 + /xf0/x9f/x88/x92 SQUARED CJK UNIFIED IDEOGRAPH-53CC + /xf0/x9f/x88/x93 SQUARED KATAKANA DE + /xf0/x9f/x88/x94 SQUARED CJK UNIFIED IDEOGRAPH-4E8C + /xf0/x9f/x88/x95 SQUARED CJK UNIFIED IDEOGRAPH-591A + /xf0/x9f/x88/x96 SQUARED CJK UNIFIED IDEOGRAPH-89E3 + /xf0/x9f/x88/x97 SQUARED CJK UNIFIED IDEOGRAPH-5929 + /xf0/x9f/x88/x98 SQUARED CJK UNIFIED IDEOGRAPH-4EA4 + /xf0/x9f/x88/x99 SQUARED CJK UNIFIED IDEOGRAPH-6620 + /xf0/x9f/x88/x9a SQUARED CJK UNIFIED IDEOGRAPH-7121 + /xf0/x9f/x88/x9b SQUARED CJK UNIFIED IDEOGRAPH-6599 + /xf0/x9f/x88/x9c SQUARED CJK UNIFIED IDEOGRAPH-524D + /xf0/x9f/x88/x9d SQUARED CJK UNIFIED IDEOGRAPH-5F8C + /xf0/x9f/x88/x9e SQUARED CJK UNIFIED IDEOGRAPH-518D + /xf0/x9f/x88/x9f SQUARED CJK UNIFIED IDEOGRAPH-65B0 + /xf0/x9f/x88/xa0 SQUARED CJK UNIFIED IDEOGRAPH-521D + /xf0/x9f/x88/xa1 SQUARED CJK UNIFIED IDEOGRAPH-7D42 + /xf0/x9f/x88/xa2 SQUARED CJK UNIFIED IDEOGRAPH-751F + /xf0/x9f/x88/xa3 SQUARED CJK UNIFIED IDEOGRAPH-8CA9 + /xf0/x9f/x88/xa4 SQUARED CJK UNIFIED IDEOGRAPH-58F0 + /xf0/x9f/x88/xa5 SQUARED CJK UNIFIED IDEOGRAPH-5439 + /xf0/x9f/x88/xa6 SQUARED CJK UNIFIED IDEOGRAPH-6F14 + /xf0/x9f/x88/xa7 SQUARED CJK UNIFIED IDEOGRAPH-6295 + /xf0/x9f/x88/xa8 SQUARED CJK UNIFIED IDEOGRAPH-6355 + /xf0/x9f/x88/xa9 SQUARED CJK UNIFIED IDEOGRAPH-4E00 + /xf0/x9f/x88/xaa SQUARED CJK UNIFIED IDEOGRAPH-4E09 + /xf0/x9f/x88/xab SQUARED CJK UNIFIED IDEOGRAPH-904A + /xf0/x9f/x88/xac SQUARED CJK UNIFIED IDEOGRAPH-5DE6 + /xf0/x9f/x88/xad SQUARED CJK UNIFIED IDEOGRAPH-4E2D + /xf0/x9f/x88/xae SQUARED CJK UNIFIED IDEOGRAPH-53F3 + /xf0/x9f/x88/xaf SQUARED CJK UNIFIED IDEOGRAPH-6307 + /xf0/x9f/x88/xb0 SQUARED CJK UNIFIED IDEOGRAPH-8D70 + /xf0/x9f/x88/xb1 SQUARED CJK UNIFIED IDEOGRAPH-6253 + /xf0/x9f/x88/xb2 SQUARED CJK UNIFIED IDEOGRAPH-7981 + /xf0/x9f/x88/xb3 SQUARED CJK UNIFIED IDEOGRAPH-7A7A + /xf0/x9f/x88/xb4 SQUARED CJK UNIFIED IDEOGRAPH-5408 + /xf0/x9f/x88/xb5 SQUARED CJK UNIFIED IDEOGRAPH-6E80 + /xf0/x9f/x88/xb6 SQUARED CJK UNIFIED IDEOGRAPH-6709 + /xf0/x9f/x88/xb7 SQUARED CJK UNIFIED IDEOGRAPH-6708 + /xf0/x9f/x88/xb8 SQUARED CJK UNIFIED IDEOGRAPH-7533 + /xf0/x9f/x88/xb9 SQUARED CJK UNIFIED IDEOGRAPH-5272 + /xf0/x9f/x88/xba SQUARED CJK UNIFIED IDEOGRAPH-55B6 + /xf0/x9f/x89/x80 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C + /xf0/x9f/x89/x81 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E09 + /xf0/x9f/x89/x82 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E8C + /xf0/x9f/x89/x83 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-5B89 + /xf0/x9f/x89/x84 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-70B9 + /xf0/x9f/x89/x85 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6253 + /xf0/x9f/x89/x86 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-76D7 + /xf0/x9f/x89/x87 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-52DD + /xf0/x9f/x89/x88 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557 + /xf0/x9f/x89/x90 CIRCLED IDEOGRAPH ADVANTAGE + /xf0/x9f/x89/x91 CIRCLED IDEOGRAPH ACCEPT + /xf0/x9f/x8c/x80 CYCLONE + /xf0/x9f/x8c/x81 FOGGY + /xf0/x9f/x8c/x82 CLOSED UMBRELLA + /xf0/x9f/x8c/x83 NIGHT WITH STARS + /xf0/x9f/x8c/x84 SUNRISE OVER MOUNTAINS + /xf0/x9f/x8c/x85 SUNRISE + /xf0/x9f/x8c/x86 CITYSCAPE AT DUSK + /xf0/x9f/x8c/x87 SUNSET OVER BUILDINGS + /xf0/x9f/x8c/x88 RAINBOW + /xf0/x9f/x8c/x89 BRIDGE AT NIGHT + /xf0/x9f/x8c/x8a WATER WAVE + /xf0/x9f/x8c/x8b VOLCANO + /xf0/x9f/x8c/x8c MILKY WAY + /xf0/x9f/x8c/x8d EARTH GLOBE EUROPE-AFRICA + /xf0/x9f/x8c/x8e EARTH GLOBE AMERICAS + /xf0/x9f/x8c/x8f EARTH GLOBE ASIA-AUSTRALIA + /xf0/x9f/x8c/x90 GLOBE WITH MERIDIANS + /xf0/x9f/x8c/x91 NEW MOON SYMBOL + /xf0/x9f/x8c/x92 WAXING CRESCENT MOON SYMBOL + /xf0/x9f/x8c/x93 FIRST QUARTER MOON SYMBOL + /xf0/x9f/x8c/x94 WAXING GIBBOUS MOON SYMBOL + /xf0/x9f/x8c/x95 FULL MOON SYMBOL + /xf0/x9f/x8c/x96 WANING GIBBOUS MOON SYMBOL + /xf0/x9f/x8c/x97 LAST QUARTER MOON SYMBOL + /xf0/x9f/x8c/x98 WANING CRESCENT MOON SYMBOL + /xf0/x9f/x8c/x99 CRESCENT MOON + /xf0/x9f/x8c/x9a NEW MOON WITH FACE + /xf0/x9f/x8c/x9b FIRST QUARTER MOON WITH FACE + /xf0/x9f/x8c/x9c LAST QUARTER MOON WITH FACE + /xf0/x9f/x8c/x9d FULL MOON WITH FACE + /xf0/x9f/x8c/x9e SUN WITH FACE + /xf0/x9f/x8c/x9f GLOWING STAR + /xf0/x9f/x8c/xa0 SHOOTING STAR + /xf0/x9f/x8c/xb0 CHESTNUT + /xf0/x9f/x8c/xb1 SEEDLING + /xf0/x9f/x8c/xb2 EVERGREEN TREE + /xf0/x9f/x8c/xb3 DECIDUOUS TREE + /xf0/x9f/x8c/xb4 PALM TREE + /xf0/x9f/x8c/xb5 CACTUS + /xf0/x9f/x8c/xb7 TULIP + /xf0/x9f/x8c/xb8 CHERRY BLOSSOM + /xf0/x9f/x8c/xb9 ROSE + /xf0/x9f/x8c/xba HIBISCUS + /xf0/x9f/x8c/xbb SUNFLOWER + /xf0/x9f/x8c/xbc BLOSSOM + /xf0/x9f/x8c/xbd EAR OF MAIZE + /xf0/x9f/x8c/xbe EAR OF RICE + /xf0/x9f/x8c/xbf HERB + /xf0/x9f/x8d/x80 FOUR LEAF CLOVER + /xf0/x9f/x8d/x81 MAPLE LEAF + /xf0/x9f/x8d/x82 FALLEN LEAF + /xf0/x9f/x8d/x83 LEAF FLUTTERING IN WIND + /xf0/x9f/x8d/x84 MUSHROOM + /xf0/x9f/x8d/x85 TOMATO + /xf0/x9f/x8d/x86 AUBERGINE + /xf0/x9f/x8d/x87 GRAPES + /xf0/x9f/x8d/x88 MELON + /xf0/x9f/x8d/x89 WATERMELON + /xf0/x9f/x8d/x8a TANGERINE + /xf0/x9f/x8d/x8b LEMON + /xf0/x9f/x8d/x8c BANANA + /xf0/x9f/x8d/x8d PINEAPPLE + /xf0/x9f/x8d/x8e RED APPLE + /xf0/x9f/x8d/x8f GREEN APPLE + /xf0/x9f/x8d/x90 PEAR + /xf0/x9f/x8d/x91 PEACH + /xf0/x9f/x8d/x92 CHERRIES + /xf0/x9f/x8d/x93 STRAWBERRY + /xf0/x9f/x8d/x94 HAMBURGER + /xf0/x9f/x8d/x95 SLICE OF PIZZA + /xf0/x9f/x8d/x96 MEAT ON BONE + /xf0/x9f/x8d/x97 POULTRY LEG + /xf0/x9f/x8d/x98 RICE CRACKER + /xf0/x9f/x8d/x99 RICE BALL + /xf0/x9f/x8d/x9a COOKED RICE + /xf0/x9f/x8d/x9b CURRY AND RICE + /xf0/x9f/x8d/x9c STEAMING BOWL + /xf0/x9f/x8d/x9d SPAGHETTI + /xf0/x9f/x8d/x9e BREAD + /xf0/x9f/x8d/x9f FRENCH FRIES + /xf0/x9f/x8d/xa0 ROASTED SWEET POTATO + /xf0/x9f/x8d/xa1 DANGO + /xf0/x9f/x8d/xa2 ODEN + /xf0/x9f/x8d/xa3 SUSHI + /xf0/x9f/x8d/xa4 FRIED SHRIMP + /xf0/x9f/x8d/xa5 FISH CAKE WITH SWIRL DESIGN + /xf0/x9f/x8d/xa6 SOFT ICE CREAM + /xf0/x9f/x8d/xa7 SHAVED ICE + /xf0/x9f/x8d/xa8 ICE CREAM + /xf0/x9f/x8d/xa9 DOUGHNUT + /xf0/x9f/x8d/xaa COOKIE + /xf0/x9f/x8d/xab CHOCOLATE BAR + /xf0/x9f/x8d/xac CANDY + /xf0/x9f/x8d/xad LOLLIPOP + /xf0/x9f/x8d/xae CUSTARD + /xf0/x9f/x8d/xaf HONEY POT + /xf0/x9f/x8d/xb0 SHORTCAKE + /xf0/x9f/x8d/xb1 BENTO BOX + /xf0/x9f/x8d/xb2 POT OF FOOD + /xf0/x9f/x8d/xb3 COOKING + /xf0/x9f/x8d/xb4 FORK AND KNIFE + /xf0/x9f/x8d/xb5 TEACUP WITHOUT HANDLE + /xf0/x9f/x8d/xb6 SAKE BOTTLE AND CUP + /xf0/x9f/x8d/xb7 WINE GLASS + /xf0/x9f/x8d/xb8 COCKTAIL GLASS + /xf0/x9f/x8d/xb9 TROPICAL DRINK + /xf0/x9f/x8d/xba BEER MUG + /xf0/x9f/x8d/xbb CLINKING BEER MUGS + /xf0/x9f/x8d/xbc BABY BOTTLE + /xf0/x9f/x8e/x80 RIBBON + /xf0/x9f/x8e/x81 WRAPPED PRESENT + /xf0/x9f/x8e/x82 BIRTHDAY CAKE + /xf0/x9f/x8e/x83 JACK-O-LANTERN + /xf0/x9f/x8e/x84 CHRISTMAS TREE + /xf0/x9f/x8e/x85 FATHER CHRISTMAS + /xf0/x9f/x8e/x86 FIREWORKS + /xf0/x9f/x8e/x87 FIREWORK SPARKLER + /xf0/x9f/x8e/x88 BALLOON + /xf0/x9f/x8e/x89 PARTY POPPER + /xf0/x9f/x8e/x8a CONFETTI BALL + /xf0/x9f/x8e/x8b TANABATA TREE + /xf0/x9f/x8e/x8c CROSSED FLAGS + /xf0/x9f/x8e/x8d PINE DECORATION + /xf0/x9f/x8e/x8e JAPANESE DOLLS + /xf0/x9f/x8e/x8f CARP STREAMER + /xf0/x9f/x8e/x90 WIND CHIME + /xf0/x9f/x8e/x91 MOON VIEWING CEREMONY + /xf0/x9f/x8e/x92 SCHOOL SATCHEL + /xf0/x9f/x8e/x93 GRADUATION CAP + /xf0/x9f/x8e/xa0 CAROUSEL HORSE + /xf0/x9f/x8e/xa1 FERRIS WHEEL + /xf0/x9f/x8e/xa2 ROLLER COASTER + /xf0/x9f/x8e/xa3 FISHING POLE AND FISH + /xf0/x9f/x8e/xa4 MICROPHONE + /xf0/x9f/x8e/xa5 MOVIE CAMERA + /xf0/x9f/x8e/xa6 CINEMA + /xf0/x9f/x8e/xa7 HEADPHONE + /xf0/x9f/x8e/xa8 ARTIST PALETTE + /xf0/x9f/x8e/xa9 TOP HAT + /xf0/x9f/x8e/xaa CIRCUS TENT + /xf0/x9f/x8e/xab TICKET + /xf0/x9f/x8e/xac CLAPPER BOARD + /xf0/x9f/x8e/xad PERFORMING ARTS + /xf0/x9f/x8e/xae VIDEO GAME + /xf0/x9f/x8e/xaf DIRECT HIT + /xf0/x9f/x8e/xb0 SLOT MACHINE + /xf0/x9f/x8e/xb1 BILLIARDS + /xf0/x9f/x8e/xb2 GAME DIE + /xf0/x9f/x8e/xb3 BOWLING + /xf0/x9f/x8e/xb4 FLOWER PLAYING CARDS + /xf0/x9f/x8e/xb5 MUSICAL NOTE + /xf0/x9f/x8e/xb6 MULTIPLE MUSICAL NOTES + /xf0/x9f/x8e/xb7 SAXOPHONE + /xf0/x9f/x8e/xb8 GUITAR + /xf0/x9f/x8e/xb9 MUSICAL KEYBOARD + /xf0/x9f/x8e/xba TRUMPET + /xf0/x9f/x8e/xbb VIOLIN + /xf0/x9f/x8e/xbc MUSICAL SCORE + /xf0/x9f/x8e/xbd RUNNING SHIRT WITH SASH + /xf0/x9f/x8e/xbe TENNIS RACQUET AND BALL + /xf0/x9f/x8e/xbf SKI AND SKI BOOT + /xf0/x9f/x8f/x80 BASKETBALL AND HOOP + /xf0/x9f/x8f/x81 CHEQUERED FLAG + /xf0/x9f/x8f/x82 SNOWBOARDER + /xf0/x9f/x8f/x83 RUNNER + /xf0/x9f/x8f/x84 SURFER + /xf0/x9f/x8f/x86 TROPHY + /xf0/x9f/x8f/x87 HORSE RACING + /xf0/x9f/x8f/x88 AMERICAN FOOTBALL + /xf0/x9f/x8f/x89 RUGBY FOOTBALL + /xf0/x9f/x8f/x8a SWIMMER + /xf0/x9f/x8f/xa0 HOUSE BUILDING + /xf0/x9f/x8f/xa1 HOUSE WITH GARDEN + /xf0/x9f/x8f/xa2 OFFICE BUILDING + /xf0/x9f/x8f/xa3 JAPANESE POST OFFICE + /xf0/x9f/x8f/xa4 EUROPEAN POST OFFICE + /xf0/x9f/x8f/xa5 HOSPITAL + /xf0/x9f/x8f/xa6 BANK + /xf0/x9f/x8f/xa7 AUTOMATED TELLER MACHINE + /xf0/x9f/x8f/xa8 HOTEL + /xf0/x9f/x8f/xa9 LOVE HOTEL + /xf0/x9f/x8f/xaa CONVENIENCE STORE + /xf0/x9f/x8f/xab SCHOOL + /xf0/x9f/x8f/xac DEPARTMENT STORE + /xf0/x9f/x8f/xad FACTORY + /xf0/x9f/x8f/xae IZAKAYA LANTERN + /xf0/x9f/x8f/xaf JAPANESE CASTLE + /xf0/x9f/x8f/xb0 EUROPEAN CASTLE + /xf0/x9f/x90/x80 RAT + /xf0/x9f/x90/x81 MOUSE + /xf0/x9f/x90/x82 OX + /xf0/x9f/x90/x83 WATER BUFFALO + /xf0/x9f/x90/x84 COW + /xf0/x9f/x90/x85 TIGER + /xf0/x9f/x90/x86 LEOPARD + /xf0/x9f/x90/x87 RABBIT + /xf0/x9f/x90/x88 CAT + /xf0/x9f/x90/x89 DRAGON + /xf0/x9f/x90/x8a CROCODILE + /xf0/x9f/x90/x8b WHALE + /xf0/x9f/x90/x8c SNAIL + /xf0/x9f/x90/x8d SNAKE + /xf0/x9f/x90/x8e HORSE + /xf0/x9f/x90/x8f RAM + /xf0/x9f/x90/x90 GOAT + /xf0/x9f/x90/x91 SHEEP + /xf0/x9f/x90/x92 MONKEY + /xf0/x9f/x90/x93 ROOSTER + /xf0/x9f/x90/x94 CHICKEN + /xf0/x9f/x90/x95 DOG + /xf0/x9f/x90/x96 PIG + /xf0/x9f/x90/x97 BOAR + /xf0/x9f/x90/x98 ELEPHANT + /xf0/x9f/x90/x99 OCTOPUS + /xf0/x9f/x90/x9a SPIRAL SHELL + /xf0/x9f/x90/x9b BUG + /xf0/x9f/x90/x9c ANT + /xf0/x9f/x90/x9d HONEYBEE + /xf0/x9f/x90/x9e LADY BEETLE + /xf0/x9f/x90/x9f FISH + /xf0/x9f/x90/xa0 TROPICAL FISH + /xf0/x9f/x90/xa1 BLOWFISH + /xf0/x9f/x90/xa2 TURTLE + /xf0/x9f/x90/xa3 HATCHING CHICK + /xf0/x9f/x90/xa4 BABY CHICK + /xf0/x9f/x90/xa5 FRONT-FACING BABY CHICK + /xf0/x9f/x90/xa6 BIRD + /xf0/x9f/x90/xa7 PENGUIN + /xf0/x9f/x90/xa8 KOALA + /xf0/x9f/x90/xa9 POODLE + /xf0/x9f/x90/xaa DROMEDARY CAMEL + /xf0/x9f/x90/xab BACTRIAN CAMEL + /xf0/x9f/x90/xac DOLPHIN + /xf0/x9f/x90/xad MOUSE FACE + /xf0/x9f/x90/xae COW FACE + /xf0/x9f/x90/xaf TIGER FACE + /xf0/x9f/x90/xb0 RABBIT FACE + /xf0/x9f/x90/xb1 CAT FACE + /xf0/x9f/x90/xb2 DRAGON FACE + /xf0/x9f/x90/xb3 SPOUTING WHALE + /xf0/x9f/x90/xb4 HORSE FACE + /xf0/x9f/x90/xb5 MONKEY FACE + /xf0/x9f/x90/xb6 DOG FACE + /xf0/x9f/x90/xb7 PIG FACE + /xf0/x9f/x90/xb8 FROG FACE + /xf0/x9f/x90/xb9 HAMSTER FACE + /xf0/x9f/x90/xba WOLF FACE + /xf0/x9f/x90/xbb BEAR FACE + /xf0/x9f/x90/xbc PANDA FACE + /xf0/x9f/x90/xbd PIG NOSE + /xf0/x9f/x90/xbe PAW PRINTS + /xf0/x9f/x91/x80 EYES + /xf0/x9f/x91/x82 EAR + /xf0/x9f/x91/x83 NOSE + /xf0/x9f/x91/x84 MOUTH + /xf0/x9f/x91/x85 TONGUE + /xf0/x9f/x91/x86 WHITE UP POINTING BACKHAND INDEX + /xf0/x9f/x91/x87 WHITE DOWN POINTING BACKHAND INDEX + /xf0/x9f/x91/x88 WHITE LEFT POINTING BACKHAND INDEX + /xf0/x9f/x91/x89 WHITE RIGHT POINTING BACKHAND INDEX + /xf0/x9f/x91/x8a FISTED HAND SIGN + /xf0/x9f/x91/x8b WAVING HAND SIGN + /xf0/x9f/x91/x8c OK HAND SIGN + /xf0/x9f/x91/x8d THUMBS UP SIGN + /xf0/x9f/x91/x8e THUMBS DOWN SIGN + /xf0/x9f/x91/x8f CLAPPING HANDS SIGN + /xf0/x9f/x91/x90 OPEN HANDS SIGN + /xf0/x9f/x91/x91 CROWN + /xf0/x9f/x91/x92 WOMANS HAT + /xf0/x9f/x91/x93 EYEGLASSES + /xf0/x9f/x91/x94 NECKTIE + /xf0/x9f/x91/x95 T-SHIRT + /xf0/x9f/x91/x96 JEANS + /xf0/x9f/x91/x97 DRESS + /xf0/x9f/x91/x98 KIMONO + /xf0/x9f/x91/x99 BIKINI + /xf0/x9f/x91/x9a WOMANS CLOTHES + /xf0/x9f/x91/x9b PURSE + /xf0/x9f/x91/x9c HANDBAG + /xf0/x9f/x91/x9d POUCH + /xf0/x9f/x91/x9e MANS SHOE + /xf0/x9f/x91/x9f ATHLETIC SHOE + /xf0/x9f/x91/xa0 HIGH-HEELED SHOE + /xf0/x9f/x91/xa1 WOMANS SANDAL + /xf0/x9f/x91/xa2 WOMANS BOOTS + /xf0/x9f/x91/xa3 FOOTPRINTS + /xf0/x9f/x91/xa4 BUST IN SILHOUETTE + /xf0/x9f/x91/xa5 BUSTS IN SILHOUETTE + /xf0/x9f/x91/xa6 BOY + /xf0/x9f/x91/xa7 GIRL + /xf0/x9f/x91/xa8 MAN + /xf0/x9f/x91/xa9 WOMAN + /xf0/x9f/x91/xaa FAMILY + /xf0/x9f/x91/xab MAN AND WOMAN HOLDING HANDS + /xf0/x9f/x91/xac TWO MEN HOLDING HANDS + /xf0/x9f/x91/xad TWO WOMEN HOLDING HANDS + /xf0/x9f/x91/xae POLICE OFFICER + /xf0/x9f/x91/xaf WOMAN WITH BUNNY EARS + /xf0/x9f/x91/xb0 BRIDE WITH VEIL + /xf0/x9f/x91/xb1 PERSON WITH BLOND HAIR + /xf0/x9f/x91/xb2 MAN WITH GUA PI MAO + /xf0/x9f/x91/xb3 MAN WITH TURBAN + /xf0/x9f/x91/xb4 OLDER MAN + /xf0/x9f/x91/xb5 OLDER WOMAN + /xf0/x9f/x91/xb6 BABY + /xf0/x9f/x91/xb7 CONSTRUCTION WORKER + /xf0/x9f/x91/xb8 PRINCESS + /xf0/x9f/x91/xb9 JAPANESE OGRE + /xf0/x9f/x91/xba JAPANESE GOBLIN + /xf0/x9f/x91/xbb GHOST + /xf0/x9f/x91/xbc BABY ANGEL + /xf0/x9f/x91/xbd EXTRATERRESTRIAL ALIEN + /xf0/x9f/x91/xbe ALIEN MONSTER + /xf0/x9f/x91/xbf IMP + /xf0/x9f/x92/x80 SKULL + /xf0/x9f/x92/x81 INFORMATION DESK PERSON + /xf0/x9f/x92/x82 GUARDSMAN + /xf0/x9f/x92/x83 DANCER + /xf0/x9f/x92/x84 LIPSTICK + /xf0/x9f/x92/x85 NAIL POLISH + /xf0/x9f/x92/x86 FACE MASSAGE + /xf0/x9f/x92/x87 HAIRCUT + /xf0/x9f/x92/x88 BARBER POLE + /xf0/x9f/x92/x89 SYRINGE + /xf0/x9f/x92/x8a PILL + /xf0/x9f/x92/x8b KISS MARK + /xf0/x9f/x92/x8c LOVE LETTER + /xf0/x9f/x92/x8d RING + /xf0/x9f/x92/x8e GEM STONE + /xf0/x9f/x92/x8f KISS + /xf0/x9f/x92/x90 BOUQUET + /xf0/x9f/x92/x91 COUPLE WITH HEART + /xf0/x9f/x92/x92 WEDDING + /xf0/x9f/x92/x93 BEATING HEART + /xf0/x9f/x92/x94 BROKEN HEART + /xf0/x9f/x92/x95 TWO HEARTS + /xf0/x9f/x92/x96 SPARKLING HEART + /xf0/x9f/x92/x97 GROWING HEART + /xf0/x9f/x92/x98 HEART WITH ARROW + /xf0/x9f/x92/x99 BLUE HEART + /xf0/x9f/x92/x9a GREEN HEART + /xf0/x9f/x92/x9b YELLOW HEART + /xf0/x9f/x92/x9c PURPLE HEART + /xf0/x9f/x92/x9d HEART WITH RIBBON + /xf0/x9f/x92/x9e REVOLVING HEARTS + /xf0/x9f/x92/x9f HEART DECORATION + /xf0/x9f/x92/xa0 DIAMOND SHAPE WITH A DOT INSIDE + /xf0/x9f/x92/xa1 ELECTRIC LIGHT BULB + /xf0/x9f/x92/xa2 ANGER SYMBOL + /xf0/x9f/x92/xa3 BOMB + /xf0/x9f/x92/xa4 SLEEPING SYMBOL + /xf0/x9f/x92/xa5 COLLISION SYMBOL + /xf0/x9f/x92/xa6 SPLASHING SWEAT SYMBOL + /xf0/x9f/x92/xa7 DROPLET + /xf0/x9f/x92/xa8 DASH SYMBOL + /xf0/x9f/x92/xa9 PILE OF POO + /xf0/x9f/x92/xaa FLEXED BICEPS + /xf0/x9f/x92/xab DIZZY SYMBOL + /xf0/x9f/x92/xac SPEECH BALLOON + /xf0/x9f/x92/xad THOUGHT BALLOON + /xf0/x9f/x92/xae WHITE FLOWER + /xf0/x9f/x92/xaf HUNDRED POINTS SYMBOL + /xf0/x9f/x92/xb0 MONEY BAG + /xf0/x9f/x92/xb1 CURRENCY EXCHANGE + /xf0/x9f/x92/xb2 HEAVY DOLLAR SIGN + /xf0/x9f/x92/xb3 CREDIT CARD + /xf0/x9f/x92/xb4 BANKNOTE WITH YEN SIGN + /xf0/x9f/x92/xb5 BANKNOTE WITH DOLLAR SIGN + /xf0/x9f/x92/xb6 BANKNOTE WITH EURO SIGN + /xf0/x9f/x92/xb7 BANKNOTE WITH POUND SIGN + /xf0/x9f/x92/xb8 MONEY WITH WINGS + /xf0/x9f/x92/xb9 CHART WITH UPWARDS TREND AND YEN SIGN + /xf0/x9f/x92/xba SEAT + /xf0/x9f/x92/xbb PERSONAL COMPUTER + /xf0/x9f/x92/xbc BRIEFCASE + /xf0/x9f/x92/xbd MINIDISC + /xf0/x9f/x92/xbe FLOPPY DISK + /xf0/x9f/x92/xbf OPTICAL DISC + /xf0/x9f/x93/x80 DVD + /xf0/x9f/x93/x81 FILE FOLDER + /xf0/x9f/x93/x82 OPEN FILE FOLDER + /xf0/x9f/x93/x83 PAGE WITH CURL + /xf0/x9f/x93/x84 PAGE FACING UP + /xf0/x9f/x93/x85 CALENDAR + /xf0/x9f/x93/x86 TEAR-OFF CALENDAR + /xf0/x9f/x93/x87 CARD INDEX + /xf0/x9f/x93/x88 CHART WITH UPWARDS TREND + /xf0/x9f/x93/x89 CHART WITH DOWNWARDS TREND + /xf0/x9f/x93/x8a BAR CHART + /xf0/x9f/x93/x8b CLIPBOARD + /xf0/x9f/x93/x8c PUSHPIN + /xf0/x9f/x93/x8d ROUND PUSHPIN + /xf0/x9f/x93/x8e PAPERCLIP + /xf0/x9f/x93/x8f STRAIGHT RULER + /xf0/x9f/x93/x90 TRIANGULAR RULER + /xf0/x9f/x93/x91 BOOKMARK TABS + /xf0/x9f/x93/x92 LEDGER + /xf0/x9f/x93/x93 NOTEBOOK + /xf0/x9f/x93/x94 NOTEBOOK WITH DECORATIVE COVER + /xf0/x9f/x93/x95 CLOSED BOOK + /xf0/x9f/x93/x96 OPEN BOOK + /xf0/x9f/x93/x97 GREEN BOOK + /xf0/x9f/x93/x98 BLUE BOOK + /xf0/x9f/x93/x99 ORANGE BOOK + /xf0/x9f/x93/x9a BOOKS + /xf0/x9f/x93/x9b NAME BADGE + /xf0/x9f/x93/x9c SCROLL + /xf0/x9f/x93/x9d MEMO + /xf0/x9f/x93/x9e TELEPHONE RECEIVER + /xf0/x9f/x93/x9f PAGER + /xf0/x9f/x93/xa0 FAX MACHINE + /xf0/x9f/x93/xa1 SATELLITE ANTENNA + /xf0/x9f/x93/xa2 PUBLIC ADDRESS LOUDSPEAKER + /xf0/x9f/x93/xa3 CHEERING MEGAPHONE + /xf0/x9f/x93/xa4 OUTBOX TRAY + /xf0/x9f/x93/xa5 INBOX TRAY + /xf0/x9f/x93/xa6 PACKAGE + /xf0/x9f/x93/xa7 E-MAIL SYMBOL + /xf0/x9f/x93/xa8 INCOMING ENVELOPE + /xf0/x9f/x93/xa9 ENVELOPE WITH DOWNWARDS ARROW ABOVE + /xf0/x9f/x93/xaa CLOSED MAILBOX WITH LOWERED FLAG + /xf0/x9f/x93/xab CLOSED MAILBOX WITH RAISED FLAG + /xf0/x9f/x93/xac OPEN MAILBOX WITH RAISED FLAG + /xf0/x9f/x93/xad OPEN MAILBOX WITH LOWERED FLAG + /xf0/x9f/x93/xae POSTBOX + /xf0/x9f/x93/xaf POSTAL HORN + /xf0/x9f/x93/xb0 NEWSPAPER + /xf0/x9f/x93/xb1 MOBILE PHONE + /xf0/x9f/x93/xb2 MOBILE PHONE WITH RIGHTWARDS ARROW AT LEFT + /xf0/x9f/x93/xb3 VIBRATION MODE + /xf0/x9f/x93/xb4 MOBILE PHONE OFF + /xf0/x9f/x93/xb5 NO MOBILE PHONES + /xf0/x9f/x93/xb6 ANTENNA WITH BARS + /xf0/x9f/x93/xb7 CAMERA + /xf0/x9f/x93/xb9 VIDEO CAMERA + /xf0/x9f/x93/xba TELEVISION + /xf0/x9f/x93/xbb RADIO + /xf0/x9f/x93/xbc VIDEOCASSETTE + /xf0/x9f/x94/x80 TWISTED RIGHTWARDS ARROWS + /xf0/x9f/x94/x81 CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS + /xf0/x9f/x94/x82 CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS WITH CIRCLED ONE OVERLAY + /xf0/x9f/x94/x83 CLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS + /xf0/x9f/x94/x84 ANTICLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS + /xf0/x9f/x94/x85 LOW BRIGHTNESS SYMBOL + /xf0/x9f/x94/x86 HIGH BRIGHTNESS SYMBOL + /xf0/x9f/x94/x87 SPEAKER WITH CANCELLATION STROKE + /xf0/x9f/x94/x88 SPEAKER + /xf0/x9f/x94/x89 SPEAKER WITH ONE SOUND WAVE + /xf0/x9f/x94/x8a SPEAKER WITH THREE SOUND WAVES + /xf0/x9f/x94/x8b BATTERY + /xf0/x9f/x94/x8c ELECTRIC PLUG + /xf0/x9f/x94/x8d LEFT-POINTING MAGNIFYING GLASS + /xf0/x9f/x94/x8e RIGHT-POINTING MAGNIFYING GLASS + /xf0/x9f/x94/x8f LOCK WITH INK PEN + /xf0/x9f/x94/x90 CLOSED LOCK WITH KEY + /xf0/x9f/x94/x91 KEY + /xf0/x9f/x94/x92 LOCK + /xf0/x9f/x94/x93 OPEN LOCK + /xf0/x9f/x94/x94 BELL + /xf0/x9f/x94/x95 BELL WITH CANCELLATION STROKE + /xf0/x9f/x94/x96 BOOKMARK + /xf0/x9f/x94/x97 LINK SYMBOL + /xf0/x9f/x94/x98 RADIO BUTTON + /xf0/x9f/x94/x99 BACK WITH LEFTWARDS ARROW ABOVE + /xf0/x9f/x94/x9a END WITH LEFTWARDS ARROW ABOVE + /xf0/x9f/x94/x9b ON WITH EXCLAMATION MARK WITH LEFT RIGHT ARROW ABOVE + /xf0/x9f/x94/x9c SOON WITH RIGHTWARDS ARROW ABOVE + /xf0/x9f/x94/x9d TOP WITH UPWARDS ARROW ABOVE + /xf0/x9f/x94/x9e NO ONE UNDER EIGHTEEN SYMBOL + /xf0/x9f/x94/x9f KEYCAP TEN + /xf0/x9f/x94/xa0 INPUT SYMBOL FOR LATIN CAPITAL LETTERS + /xf0/x9f/x94/xa1 INPUT SYMBOL FOR LATIN SMALL LETTERS + /xf0/x9f/x94/xa2 INPUT SYMBOL FOR NUMBERS + /xf0/x9f/x94/xa3 INPUT SYMBOL FOR SYMBOLS + /xf0/x9f/x94/xa4 INPUT SYMBOL FOR LATIN LETTERS + /xf0/x9f/x94/xa5 FIRE + /xf0/x9f/x94/xa6 ELECTRIC TORCH + /xf0/x9f/x94/xa7 WRENCH + /xf0/x9f/x94/xa8 HAMMER + /xf0/x9f/x94/xa9 NUT AND BOLT + /xf0/x9f/x94/xaa HOCHO + /xf0/x9f/x94/xab PISTOL + /xf0/x9f/x94/xac MICROSCOPE + /xf0/x9f/x94/xad TELESCOPE + /xf0/x9f/x94/xae CRYSTAL BALL + /xf0/x9f/x94/xaf SIX POINTED STAR WITH MIDDLE DOT + /xf0/x9f/x94/xb0 JAPANESE SYMBOL FOR BEGINNER + /xf0/x9f/x94/xb1 TRIDENT EMBLEM + /xf0/x9f/x94/xb2 BLACK SQUARE BUTTON + /xf0/x9f/x94/xb3 WHITE SQUARE BUTTON + /xf0/x9f/x94/xb4 LARGE RED CIRCLE + /xf0/x9f/x94/xb5 LARGE BLUE CIRCLE + /xf0/x9f/x94/xb6 LARGE ORANGE DIAMOND + /xf0/x9f/x94/xb7 LARGE BLUE DIAMOND + /xf0/x9f/x94/xb8 SMALL ORANGE DIAMOND + /xf0/x9f/x94/xb9 SMALL BLUE DIAMOND + /xf0/x9f/x94/xba UP-POINTING RED TRIANGLE + /xf0/x9f/x94/xbb DOWN-POINTING RED TRIANGLE + /xf0/x9f/x94/xbc UP-POINTING SMALL RED TRIANGLE + /xf0/x9f/x94/xbd DOWN-POINTING SMALL RED TRIANGLE + /xf0/x9f/x95/x90 CLOCK FACE ONE OCLOCK + /xf0/x9f/x95/x91 CLOCK FACE TWO OCLOCK + /xf0/x9f/x95/x92 CLOCK FACE THREE OCLOCK + /xf0/x9f/x95/x93 CLOCK FACE FOUR OCLOCK + /xf0/x9f/x95/x94 CLOCK FACE FIVE OCLOCK + /xf0/x9f/x95/x95 CLOCK FACE SIX OCLOCK + /xf0/x9f/x95/x96 CLOCK FACE SEVEN OCLOCK + /xf0/x9f/x95/x97 CLOCK FACE EIGHT OCLOCK + /xf0/x9f/x95/x98 CLOCK FACE NINE OCLOCK + /xf0/x9f/x95/x99 CLOCK FACE TEN OCLOCK + /xf0/x9f/x95/x9a CLOCK FACE ELEVEN OCLOCK + /xf0/x9f/x95/x9b CLOCK FACE TWELVE OCLOCK + /xf0/x9f/x95/x9c CLOCK FACE ONE-THIRTY + /xf0/x9f/x95/x9d CLOCK FACE TWO-THIRTY + /xf0/x9f/x95/x9e CLOCK FACE THREE-THIRTY + /xf0/x9f/x95/x9f CLOCK FACE FOUR-THIRTY + /xf0/x9f/x95/xa0 CLOCK FACE FIVE-THIRTY + /xf0/x9f/x95/xa1 CLOCK FACE SIX-THIRTY + /xf0/x9f/x95/xa2 CLOCK FACE SEVEN-THIRTY + /xf0/x9f/x95/xa3 CLOCK FACE EIGHT-THIRTY + /xf0/x9f/x95/xa4 CLOCK FACE NINE-THIRTY + /xf0/x9f/x95/xa5 CLOCK FACE TEN-THIRTY + /xf0/x9f/x95/xa6 CLOCK FACE ELEVEN-THIRTY + /xf0/x9f/x95/xa7 CLOCK FACE TWELVE-THIRTY + /xf0/x9f/x97/xbb MOUNT FUJI + /xf0/x9f/x97/xbc TOKYO TOWER + /xf0/x9f/x97/xbd STATUE OF LIBERTY + /xf0/x9f/x97/xbe SILHOUETTE OF JAPAN + /xf0/x9f/x97/xbf MOYAI + /xf0/x9f/x98/x81 GRINNING FACE WITH SMILING EYES + /xf0/x9f/x98/x82 FACE WITH TEARS OF JOY + /xf0/x9f/x98/x83 SMILING FACE WITH OPEN MOUTH + /xf0/x9f/x98/x84 SMILING FACE WITH OPEN MOUTH AND SMILING EYES + /xf0/x9f/x98/x85 SMILING FACE WITH OPEN MOUTH AND COLD SWEAT + /xf0/x9f/x98/x86 SMILING FACE WITH OPEN MOUTH AND TIGHTLY-CLOSED EYES + /xf0/x9f/x98/x87 SMILING FACE WITH HALO + /xf0/x9f/x98/x88 SMILING FACE WITH HORNS + /xf0/x9f/x98/x89 WINKING FACE + /xf0/x9f/x98/x8a SMILING FACE WITH SMILING EYES + /xf0/x9f/x98/x8b FACE SAVOURING DELICIOUS FOOD + /xf0/x9f/x98/x8c RELIEVED FACE + /xf0/x9f/x98/x8d SMILING FACE WITH HEART-SHAPED EYES + /xf0/x9f/x98/x8e SMILING FACE WITH SUNGLASSES + /xf0/x9f/x98/x8f SMIRKING FACE + /xf0/x9f/x98/x90 NEUTRAL FACE + /xf0/x9f/x98/x92 UNAMUSED FACE + /xf0/x9f/x98/x93 FACE WITH COLD SWEAT + /xf0/x9f/x98/x94 PENSIVE FACE + /xf0/x9f/x98/x96 CONFOUNDED FACE + /xf0/x9f/x98/x98 FACE THROWING A KISS + /xf0/x9f/x98/x9a KISSING FACE WITH CLOSED EYES + /xf0/x9f/x98/x9c FACE WITH STUCK-OUT TONGUE AND WINKING EYE + /xf0/x9f/x98/x9d FACE WITH STUCK-OUT TONGUE AND TIGHTLY-CLOSED EYES + /xf0/x9f/x98/x9e DISAPPOINTED FACE + /xf0/x9f/x98/xa0 ANGRY FACE + /xf0/x9f/x98/xa1 POUTING FACE + /xf0/x9f/x98/xa2 CRYING FACE + /xf0/x9f/x98/xa3 PERSEVERING FACE + /xf0/x9f/x98/xa4 FACE WITH LOOK OF TRIUMPH + /xf0/x9f/x98/xa5 DISAPPOINTED BUT RELIEVED FACE + /xf0/x9f/x98/xa8 FEARFUL FACE + /xf0/x9f/x98/xa9 WEARY FACE + /xf0/x9f/x98/xaa SLEEPY FACE + /xf0/x9f/x98/xab TIRED FACE + /xf0/x9f/x98/xad LOUDLY CRYING FACE + /xf0/x9f/x98/xb0 FACE WITH OPEN MOUTH AND COLD SWEAT + /xf0/x9f/x98/xb1 FACE SCREAMING IN FEAR + /xf0/x9f/x98/xb2 ASTONISHED FACE + /xf0/x9f/x98/xb3 FLUSHED FACE + /xf0/x9f/x98/xb5 DIZZY FACE + /xf0/x9f/x98/xb6 FACE WITHOUT MOUTH + /xf0/x9f/x98/xb7 FACE WITH MEDICAL MASK + /xf0/x9f/x98/xb8 GRINNING CAT FACE WITH SMILING EYES + /xf0/x9f/x98/xb9 CAT FACE WITH TEARS OF JOY + /xf0/x9f/x98/xba SMILING CAT FACE WITH OPEN MOUTH + /xf0/x9f/x98/xbb SMILING CAT FACE WITH HEART-SHAPED EYES + /xf0/x9f/x98/xbc CAT FACE WITH WRY SMILE + /xf0/x9f/x98/xbd KISSING CAT FACE WITH CLOSED EYES + /xf0/x9f/x98/xbe POUTING CAT FACE + /xf0/x9f/x98/xbf CRYING CAT FACE + /xf0/x9f/x99/x80 WEARY CAT FACE + /xf0/x9f/x99/x85 FACE WITH NO GOOD GESTURE + /xf0/x9f/x99/x86 FACE WITH OK GESTURE + /xf0/x9f/x99/x87 PERSON BOWING DEEPLY + /xf0/x9f/x99/x88 SEE-NO-EVIL MONKEY + /xf0/x9f/x99/x89 HEAR-NO-EVIL MONKEY + /xf0/x9f/x99/x8a SPEAK-NO-EVIL MONKEY + /xf0/x9f/x99/x8b HAPPY PERSON RAISING ONE HAND + /xf0/x9f/x99/x8c PERSON RAISING BOTH HANDS IN CELEBRATION + /xf0/x9f/x99/x8d PERSON FROWNING + /xf0/x9f/x99/x8e PERSON WITH POUTING FACE + /xf0/x9f/x99/x8f PERSON WITH FOLDED HANDS + /xf0/x9f/x9a/x80 ROCKET + /xf0/x9f/x9a/x81 HELICOPTER + /xf0/x9f/x9a/x82 STEAM LOCOMOTIVE + /xf0/x9f/x9a/x83 RAILWAY CAR + /xf0/x9f/x9a/x84 HIGH-SPEED TRAIN + /xf0/x9f/x9a/x85 HIGH-SPEED TRAIN WITH BULLET NOSE + /xf0/x9f/x9a/x86 TRAIN + /xf0/x9f/x9a/x87 METRO + /xf0/x9f/x9a/x88 LIGHT RAIL + /xf0/x9f/x9a/x89 STATION + /xf0/x9f/x9a/x8a TRAM + /xf0/x9f/x9a/x8b TRAM CAR + /xf0/x9f/x9a/x8c BUS + /xf0/x9f/x9a/x8d ONCOMING BUS + /xf0/x9f/x9a/x8e TROLLEYBUS + /xf0/x9f/x9a/x8f BUS STOP + /xf0/x9f/x9a/x90 MINIBUS + /xf0/x9f/x9a/x91 AMBULANCE + /xf0/x9f/x9a/x92 FIRE ENGINE + /xf0/x9f/x9a/x93 POLICE CAR + /xf0/x9f/x9a/x94 ONCOMING POLICE CAR + /xf0/x9f/x9a/x95 TAXI + /xf0/x9f/x9a/x96 ONCOMING TAXI + /xf0/x9f/x9a/x97 AUTOMOBILE + /xf0/x9f/x9a/x98 ONCOMING AUTOMOBILE + /xf0/x9f/x9a/x99 RECREATIONAL VEHICLE + /xf0/x9f/x9a/x9a DELIVERY TRUCK + /xf0/x9f/x9a/x9b ARTICULATED LORRY + /xf0/x9f/x9a/x9c TRACTOR + /xf0/x9f/x9a/x9d MONORAIL + /xf0/x9f/x9a/x9e MOUNTAIN RAILWAY + /xf0/x9f/x9a/x9f SUSPENSION RAILWAY + /xf0/x9f/x9a/xa0 MOUNTAIN CABLEWAY + /xf0/x9f/x9a/xa1 AERIAL TRAMWAY + /xf0/x9f/x9a/xa2 SHIP + /xf0/x9f/x9a/xa3 ROWBOAT + /xf0/x9f/x9a/xa4 SPEEDBOAT + /xf0/x9f/x9a/xa5 HORIZONTAL TRAFFIC LIGHT + /xf0/x9f/x9a/xa6 VERTICAL TRAFFIC LIGHT + /xf0/x9f/x9a/xa7 CONSTRUCTION SIGN + /xf0/x9f/x9a/xa8 POLICE CARS REVOLVING LIGHT + /xf0/x9f/x9a/xa9 TRIANGULAR FLAG ON POST + /xf0/x9f/x9a/xaa DOOR + /xf0/x9f/x9a/xab NO ENTRY SIGN + /xf0/x9f/x9a/xac SMOKING SYMBOL + /xf0/x9f/x9a/xad NO SMOKING SYMBOL + /xf0/x9f/x9a/xae PUT LITTER IN ITS PLACE SYMBOL + /xf0/x9f/x9a/xaf DO NOT LITTER SYMBOL + /xf0/x9f/x9a/xb0 POTABLE WATER SYMBOL + /xf0/x9f/x9a/xb1 NON-POTABLE WATER SYMBOL + /xf0/x9f/x9a/xb2 BICYCLE + /xf0/x9f/x9a/xb3 NO BICYCLES + /xf0/x9f/x9a/xb4 BICYCLIST + /xf0/x9f/x9a/xb5 MOUNTAIN BICYCLIST + /xf0/x9f/x9a/xb6 PEDESTRIAN + /xf0/x9f/x9a/xb7 NO PEDESTRIANS + /xf0/x9f/x9a/xb8 CHILDREN CROSSING + /xf0/x9f/x9a/xb9 MENS SYMBOL + /xf0/x9f/x9a/xba WOMENS SYMBOL + /xf0/x9f/x9a/xbb RESTROOM + /xf0/x9f/x9a/xbc BABY SYMBOL + /xf0/x9f/x9a/xbd TOILET + /xf0/x9f/x9a/xbe WATER CLOSET + /xf0/x9f/x9a/xbf SHOWER + /xf0/x9f/x9b/x80 BATH + /xf0/x9f/x9b/x81 BATHTUB + /xf0/x9f/x9b/x82 PASSPORT CONTROL + /xf0/x9f/x9b/x83 CUSTOMS + /xf0/x9f/x9b/x84 BAGGAGE CLAIM + /xf0/x9f/x9b/x85 LEFT LUGGAGE + /xf0/x9f/x9c/x80 ALCHEMICAL SYMBOL FOR QUINTESSENCE + /xf0/x9f/x9c/x81 ALCHEMICAL SYMBOL FOR AIR + /xf0/x9f/x9c/x82 ALCHEMICAL SYMBOL FOR FIRE + /xf0/x9f/x9c/x83 ALCHEMICAL SYMBOL FOR EARTH + /xf0/x9f/x9c/x84 ALCHEMICAL SYMBOL FOR WATER + /xf0/x9f/x9c/x85 ALCHEMICAL SYMBOL FOR AQUAFORTIS + /xf0/x9f/x9c/x86 ALCHEMICAL SYMBOL FOR AQUA REGIA + /xf0/x9f/x9c/x87 ALCHEMICAL SYMBOL FOR AQUA REGIA-2 + /xf0/x9f/x9c/x88 ALCHEMICAL SYMBOL FOR AQUA VITAE + /xf0/x9f/x9c/x89 ALCHEMICAL SYMBOL FOR AQUA VITAE-2 + /xf0/x9f/x9c/x8a ALCHEMICAL SYMBOL FOR VINEGAR + /xf0/x9f/x9c/x8b ALCHEMICAL SYMBOL FOR VINEGAR-2 + /xf0/x9f/x9c/x8c ALCHEMICAL SYMBOL FOR VINEGAR-3 + /xf0/x9f/x9c/x8d ALCHEMICAL SYMBOL FOR SULFUR + /xf0/x9f/x9c/x8e ALCHEMICAL SYMBOL FOR PHILOSOPHERS SULFUR + /xf0/x9f/x9c/x8f ALCHEMICAL SYMBOL FOR BLACK SULFUR + /xf0/x9f/x9c/x90 ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE + /xf0/x9f/x9c/x91 ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE-2 + /xf0/x9f/x9c/x92 ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE-3 + /xf0/x9f/x9c/x93 ALCHEMICAL SYMBOL FOR CINNABAR + /xf0/x9f/x9c/x94 ALCHEMICAL SYMBOL FOR SALT + /xf0/x9f/x9c/x95 ALCHEMICAL SYMBOL FOR NITRE + /xf0/x9f/x9c/x96 ALCHEMICAL SYMBOL FOR VITRIOL + /xf0/x9f/x9c/x97 ALCHEMICAL SYMBOL FOR VITRIOL-2 + /xf0/x9f/x9c/x98 ALCHEMICAL SYMBOL FOR ROCK SALT + /xf0/x9f/x9c/x99 ALCHEMICAL SYMBOL FOR ROCK SALT-2 + /xf0/x9f/x9c/x9a ALCHEMICAL SYMBOL FOR GOLD + /xf0/x9f/x9c/x9b ALCHEMICAL SYMBOL FOR SILVER + /xf0/x9f/x9c/x9c ALCHEMICAL SYMBOL FOR IRON ORE + /xf0/x9f/x9c/x9d ALCHEMICAL SYMBOL FOR IRON ORE-2 + /xf0/x9f/x9c/x9e ALCHEMICAL SYMBOL FOR CROCUS OF IRON + /xf0/x9f/x9c/x9f ALCHEMICAL SYMBOL FOR REGULUS OF IRON + /xf0/x9f/x9c/xa0 ALCHEMICAL SYMBOL FOR COPPER ORE + /xf0/x9f/x9c/xa1 ALCHEMICAL SYMBOL FOR IRON-COPPER ORE + /xf0/x9f/x9c/xa2 ALCHEMICAL SYMBOL FOR SUBLIMATE OF COPPER + /xf0/x9f/x9c/xa3 ALCHEMICAL SYMBOL FOR CROCUS OF COPPER + /xf0/x9f/x9c/xa4 ALCHEMICAL SYMBOL FOR CROCUS OF COPPER-2 + /xf0/x9f/x9c/xa5 ALCHEMICAL SYMBOL FOR COPPER ANTIMONIATE + /xf0/x9f/x9c/xa6 ALCHEMICAL SYMBOL FOR SALT OF COPPER ANTIMONIATE + /xf0/x9f/x9c/xa7 ALCHEMICAL SYMBOL FOR SUBLIMATE OF SALT OF COPPER + /xf0/x9f/x9c/xa8 ALCHEMICAL SYMBOL FOR VERDIGRIS + /xf0/x9f/x9c/xa9 ALCHEMICAL SYMBOL FOR TIN ORE + /xf0/x9f/x9c/xaa ALCHEMICAL SYMBOL FOR LEAD ORE + /xf0/x9f/x9c/xab ALCHEMICAL SYMBOL FOR ANTIMONY ORE + /xf0/x9f/x9c/xac ALCHEMICAL SYMBOL FOR SUBLIMATE OF ANTIMONY + /xf0/x9f/x9c/xad ALCHEMICAL SYMBOL FOR SALT OF ANTIMONY + /xf0/x9f/x9c/xae ALCHEMICAL SYMBOL FOR SUBLIMATE OF SALT OF ANTIMONY + /xf0/x9f/x9c/xaf ALCHEMICAL SYMBOL FOR VINEGAR OF ANTIMONY + /xf0/x9f/x9c/xb0 ALCHEMICAL SYMBOL FOR REGULUS OF ANTIMONY + /xf0/x9f/x9c/xb1 ALCHEMICAL SYMBOL FOR REGULUS OF ANTIMONY-2 + /xf0/x9f/x9c/xb2 ALCHEMICAL SYMBOL FOR REGULUS + /xf0/x9f/x9c/xb3 ALCHEMICAL SYMBOL FOR REGULUS-2 + /xf0/x9f/x9c/xb4 ALCHEMICAL SYMBOL FOR REGULUS-3 + /xf0/x9f/x9c/xb5 ALCHEMICAL SYMBOL FOR REGULUS-4 + /xf0/x9f/x9c/xb6 ALCHEMICAL SYMBOL FOR ALKALI + /xf0/x9f/x9c/xb7 ALCHEMICAL SYMBOL FOR ALKALI-2 + /xf0/x9f/x9c/xb8 ALCHEMICAL SYMBOL FOR MARCASITE + /xf0/x9f/x9c/xb9 ALCHEMICAL SYMBOL FOR SAL-AMMONIAC + /xf0/x9f/x9c/xba ALCHEMICAL SYMBOL FOR ARSENIC + /xf0/x9f/x9c/xbb ALCHEMICAL SYMBOL FOR REALGAR + /xf0/x9f/x9c/xbc ALCHEMICAL SYMBOL FOR REALGAR-2 + /xf0/x9f/x9c/xbd ALCHEMICAL SYMBOL FOR AURIPIGMENT + /xf0/x9f/x9c/xbe ALCHEMICAL SYMBOL FOR BISMUTH ORE + /xf0/x9f/x9c/xbf ALCHEMICAL SYMBOL FOR TARTAR + /xf0/x9f/x9d/x80 ALCHEMICAL SYMBOL FOR TARTAR-2 + /xf0/x9f/x9d/x81 ALCHEMICAL SYMBOL FOR QUICK LIME + /xf0/x9f/x9d/x82 ALCHEMICAL SYMBOL FOR BORAX + /xf0/x9f/x9d/x83 ALCHEMICAL SYMBOL FOR BORAX-2 + /xf0/x9f/x9d/x84 ALCHEMICAL SYMBOL FOR BORAX-3 + /xf0/x9f/x9d/x85 ALCHEMICAL SYMBOL FOR ALUM + /xf0/x9f/x9d/x86 ALCHEMICAL SYMBOL FOR OIL + /xf0/x9f/x9d/x87 ALCHEMICAL SYMBOL FOR SPIRIT + /xf0/x9f/x9d/x88 ALCHEMICAL SYMBOL FOR TINCTURE + /xf0/x9f/x9d/x89 ALCHEMICAL SYMBOL FOR GUM + /xf0/x9f/x9d/x8a ALCHEMICAL SYMBOL FOR WAX + /xf0/x9f/x9d/x8b ALCHEMICAL SYMBOL FOR POWDER + /xf0/x9f/x9d/x8c ALCHEMICAL SYMBOL FOR CALX + /xf0/x9f/x9c/xb7 ALCHEMICAL SYMBOL FOR ALKALI-2 + /xf0/x9f/x9c/xb8 ALCHEMICAL SYMBOL FOR MARCASITE + /xf0/x9f/x9c/xb9 ALCHEMICAL SYMBOL FOR SAL-AMMONIAC + /xf0/x9f/x9c/xba ALCHEMICAL SYMBOL FOR ARSENIC + /xf0/x9f/x9c/xbb ALCHEMICAL SYMBOL FOR REALGAR + /xf0/x9f/x9c/xbc ALCHEMICAL SYMBOL FOR REALGAR-2 + /xf0/x9f/x9c/xbd ALCHEMICAL SYMBOL FOR AURIPIGMENT + /xf0/x9f/x9c/xbe ALCHEMICAL SYMBOL FOR BISMUTH ORE + /xf0/x9f/x9c/xbf ALCHEMICAL SYMBOL FOR TARTAR + /xf0/x9f/x9d/x80 ALCHEMICAL SYMBOL FOR TARTAR-2 + /xf0/x9f/x9d/x81 ALCHEMICAL SYMBOL FOR QUICK LIME + /xf0/x9f/x9d/x82 ALCHEMICAL SYMBOL FOR BORAX + /xf0/x9f/x9d/x83 ALCHEMICAL SYMBOL FOR BORAX-2 + /xf0/x9f/x9d/x84 ALCHEMICAL SYMBOL FOR BORAX-3 + /xf0/x9f/x9d/x85 ALCHEMICAL SYMBOL FOR ALUM + /xf0/x9f/x9d/x86 ALCHEMICAL SYMBOL FOR OIL + /xf0/x9f/x9d/x87 ALCHEMICAL SYMBOL FOR SPIRIT + /xf0/x9f/x9d/x88 ALCHEMICAL SYMBOL FOR TINCTURE + /xf0/x9f/x9d/x89 ALCHEMICAL SYMBOL FOR GUM + /xf0/x9f/x9d/x8a ALCHEMICAL SYMBOL FOR WAX + /xf0/x9f/x9d/x8b ALCHEMICAL SYMBOL FOR POWDER + /xf0/x9f/x9d/x8c ALCHEMICAL SYMBOL FOR CALX + /xf0/x9f/x9d/x8d ALCHEMICAL SYMBOL FOR TUTTY + /xf0/x9f/x9d/x8e ALCHEMICAL SYMBOL FOR CAPUT MORTUUM + /xf0/x9f/x9d/x8f ALCHEMICAL SYMBOL FOR SCEPTER OF JOVE + /xf0/x9f/x9d/x90 ALCHEMICAL SYMBOL FOR CADUCEUS + /xf0/x9f/x9d/x91 ALCHEMICAL SYMBOL FOR TRIDENT + /xf0/x9f/x9d/x92 ALCHEMICAL SYMBOL FOR STARRED TRIDENT + /xf0/x9f/x9d/x93 ALCHEMICAL SYMBOL FOR LODESTONE + /xf0/x9f/x9d/x94 ALCHEMICAL SYMBOL FOR SOAP + /xf0/x9f/x9d/x95 ALCHEMICAL SYMBOL FOR URINE + /xf0/x9f/x9d/x96 ALCHEMICAL SYMBOL FOR HORSE DUNG + /xf0/x9f/x9d/x97 ALCHEMICAL SYMBOL FOR ASHES + /xf0/x9f/x9d/x98 ALCHEMICAL SYMBOL FOR POT ASHES + /xf0/x9f/x9d/x99 ALCHEMICAL SYMBOL FOR BRICK + /xf0/x9f/x9d/x9a ALCHEMICAL SYMBOL FOR POWDERED BRICK + /xf0/x9f/x9d/x9b ALCHEMICAL SYMBOL FOR AMALGAM + /xf0/x9f/x9d/x9c ALCHEMICAL SYMBOL FOR STRATUM SUPER STRATUM + /xf0/x9f/x9d/x9d ALCHEMICAL SYMBOL FOR STRATUM SUPER STRATUM-2 + /xf0/x9f/x9d/x9e ALCHEMICAL SYMBOL FOR SUBLIMATION + /xf0/x9f/x9d/x9f ALCHEMICAL SYMBOL FOR PRECIPITATE + /xf0/x9f/x9d/xa0 ALCHEMICAL SYMBOL FOR DISTILL + /xf0/x9f/x9d/xa1 ALCHEMICAL SYMBOL FOR DISSOLVE + /xf0/x9f/x9d/xa2 ALCHEMICAL SYMBOL FOR DISSOLVE-2 + /xf0/x9f/x9d/xa3 ALCHEMICAL SYMBOL FOR PURIFY + /xf0/x9f/x9d/xa4 ALCHEMICAL SYMBOL FOR PUTREFACTION + /xf0/x9f/x9d/xa5 ALCHEMICAL SYMBOL FOR CRUCIBLE + /xf0/x9f/x9d/xa6 ALCHEMICAL SYMBOL FOR CRUCIBLE-2 + /xf0/x9f/x9d/xa7 ALCHEMICAL SYMBOL FOR CRUCIBLE-3 + /xf0/x9f/x9d/xa8 ALCHEMICAL SYMBOL FOR CRUCIBLE-4 + /xf0/x9f/x9d/xa9 ALCHEMICAL SYMBOL FOR CRUCIBLE-5 + /xf0/x9f/x9d/xaa ALCHEMICAL SYMBOL FOR ALEMBIC + /xf0/x9f/x9d/xab ALCHEMICAL SYMBOL FOR BATH OF MARY + /xf0/x9f/x9d/xac ALCHEMICAL SYMBOL FOR BATH OF VAPOURS + /xf0/x9f/x9d/xad ALCHEMICAL SYMBOL FOR RETORT + /xf0/x9f/x9d/xae ALCHEMICAL SYMBOL FOR HOUR + /xf0/x9f/x9d/xaf ALCHEMICAL SYMBOL FOR NIGHT + /xf0/x9f/x9d/xb0 ALCHEMICAL SYMBOL FOR DAY-NIGHT + /xf0/x9f/x9d/xb1 ALCHEMICAL SYMBOL FOR MONTH + /xf0/x9f/x9d/xb2 ALCHEMICAL SYMBOL FOR HALF DRAM + /xf0/x9f/x9d/xb3 ALCHEMICAL SYMBOL FOR HALF OUNCE + /xf0/xa0/x80/x80 + /xf0/xaa/x9b/x96 + /xf0/xaa/x9c/x80 + /xf0/xab/x9c/xb4 + /xf0/xab/x9d/x80 + /xf0/xab/xa0/x9d .. /xf0/xa0/x80/x80 .. /xf0/xa0/x81/x80 .. /xf0/xa0/x82/x80 diff --git a/localedata/locales/C b/localedata/locales/C new file mode 100644 index 0000000..0744136 --- /dev/null +++ b/localedata/locales/C @@ -0,0 +1,395038 @@ +escape_char / +comment_char % +% Locale for C locale in UTF-8 +% Contributed by Aurelien Jarno , 2011 + +LC_IDENTIFICATION +title "C locale" +source "" +address "" +contact "" +email "aurel32@debian.org" +tel "" +fax "" +language "C" +territory "" +revision "1.5" +date "2012-11-18" +% +category "C:2012";LC_IDENTIFICATION +category "C:2012";LC_CTYPE +category "C:2012";LC_COLLATE +category "C:2012";LC_TIME +END LC_IDENTIFICATION + +LC_CTYPE +% The following is a copy of i18n with the following change: +% - The "blank", "cntrl", "space" classes are defined as specified by POSIX + +% The "upper" class reflects the uppercase characters of class "alpha" +upper / +% BASIC LATIN/ + ..;/ +% LATIN-1 SUPPLEMENT/ + ..;..;/ +% LATIN EXTENDED-A/ + ..(2)..;/ + ..(2)..;/ + ..(2)..;/ + ..(2)..;/ +% LATIN EXTENDED-B/ + ;..(2)..;;/ + ..;..;;;/ + ..;;;;/ + ..(2)..;/ + ;;;;;;..;/ + ;;;;;;;;/ + ;;/ + ..(2)..;/ + ..(2)..;/ + ;;;..;..(2)..;/ + ..(2)..;/ + ;;;;/ + ;..;;;;;/ +% BASIC GREEK/ + ;;;/ + ;..;;;;..;/ + ..;..(2)..;/ +% GREEK SYMBOLS AND COPTIC/ + ..(2)..;;/ + ;..;..;/ +% CYRILLIC/ + ..;..(2)..;/ + ;..(2)..;;..(2)..;/ + ..(2)..;/ +% CYRILLIC SUPPLEMENT/ + ..(2)..;/ +% ARMENIAN/ + ..;/ +% GEORGIAN/ +% is not addressed as the letters does not have a uppercase/lowercase relation/ +% well, there are three georgian blocks defined; one caseless (the one usually/ +% used), one defined as uppercase and one as lowercase. defining the uppercase one here/ + ..;/ +% LATIN EXTENDED ADDITIONAL/ + ..(2)..;/ + ..(2)..;;/ + ..(2)..;/ +% GREEK EXTENDED/ + ..;..;..;..;/ + ..;..(2)..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ +% LETTERLIKE SYMBOLS/ + ;..;/ + ;/ +% NUMBER FORMS/ + ..;/ + ;/ +% ENCLOSED ALPHANUMERICS/ + ..;/ +% GLAGOLITIC/ + ..;/ +% LATIN EXTENDED-C/ + ;..;..(2)..;..;/ + ;;;/ +% COPTIC/ + ..(2)..;/ +% CYRILLIC SUPPLEMENT 2/ + ..(2)..;..(2)..;..(2)..;/ +% LATIN EXTENDED-D/ + ..(2)..;..(2)..;..(2)..;/ + ..(2)..;/ +% HALFWIDTH AND FULLWIDTH FORMS/ + ..;/ +% DESERET/ + .. + +% The "lower" class reflects the lowercase characters of class "alpha" +lower / +% BASIC LATIN/ + ..;/ +% LATIN-1 SUPPLEMENT/ + ;..;..;/ +% LATIN EXTENDED-A/ + ..(2)..;..(2)..;/ + ..(2)..;..(2)..;;/ +% LATIN EXTENDED-B/ + ;;;;;;;/ + ;;;;;;;;/ + ;;;;;;;;/ + ;;;..(2)..;/ + ..(2)..;;;;..(2)..;/ + ..(2)..;..(2)..;/ + ;;..(2)..;/ +% IPA EXTENSIONS/ + ;;;;;;;;;/ + ;;;;;;;;..;/ + ;/ +% COMBINING DIACRITICAL MARKS/ + ;/ +% BASIC GREEK/ + ;;;/ + ..;/ + ..;..;/ +% GREEK SYMBOLS AND COPTIC/ + ;;;;..(2)..;..;/ + ;;;/ +% CYRILLIC/ + ..;..(2)..;/ + ;..(2)..;..(2)..;/ + ;/ + ..(2)..;/ +% ARMENIAN/ + ..;/ +% PHONETIC EXTENSIONS/ + ;/ +% LATIN EXTENDED ADDITIONAL/ + ..(2)..;..;;..(2)..;/ +% GREEK EXTENDED/ + ..;..;..;..;/ + ..;..(2)..;..;..;/ + ..;..;..;;;/ + ;;;;;;;;/ + ;/ +% LETTERLIKE SYMBOLS/ + ;/ +% NUMBER FORMS/ + ..;;/ +% ENCLOSED ALPHANUMERICS/ + ..;/ +% GLAGOLITIC/ + ..;/ +% LATIN EXTENDED-C/ + ;;..(2)..;;;;/ + ..;/ +% COPTIC/ + ..(2)..;/ +% GEORGIAN SUPPLEMENT/ +% well, there are three georgian blocks defined; one caseless (the one usually/ +% used), one defined as uppercase and one as lowercase. defining the lowercase one here/ + ..;/ +% CYRILLIC SUPPLEMENT 2/ + ..(2)..;..(2)..;..(2)..;/ +% LATIN EXTENDED-D/ + ..(2)..;;..(2)..;..;/ + ..(2)..;..(2)..;;/ +% HALFWIDTH AND FULLWIDTH FORMS/ + ..;/ +% DESERET/ + .. + +% The "alpha" class of the "i18n" FDCC-set is reflecting +% the recommendations in TR 10176 annex A +alpha / +% BASIC LATIN/ + ..;..;/ +% LATIN-1 SUPPLEMENT/ + ;;;..;..;/ + ..;/ +% LATIN EXTENDED-A/ + ..;/ +% LATIN EXTENDED-B/ + ..;/ +% IPA EXTENSIONS/ + ..;/ +% SPACING MODIFIER LETTERS/ + ..;..;..;/ + ;/ +% COMBINING DIACRITICAL MARKS/ + ;/ +% BASIC GREEK/ + ..;..;..;;/ + ..;;..;/ + ..;/ +% GREEK SYMBOLS AND COPTIC/ + ..;..;/ +% CYRILLIC/ + ..;..;/ +% CYRILLIC SUPPLEMENT/ + ..;/ +% ARMENIAN/ + ..;;..;/ +% HEBREW/ + ..;..;/ +% ARABIC/ + ..;..;..;/ + ;..;..;..;;/ +% SYRIAC/ + ;..;..;/ +% ARABIC SUPPLEMENT/ + ..;/ +% THAANA/ + ..;;/ +% NKO/ + ..;..;;/ +% - All Matras of Indic and Sinhala are moved from punct to alpha class/ +% - Added Unicode 5.1 charctares of Indic scripts/ +% DEVANAGARI/ + ..;..;/ + ..;..;/ + ;;;..;/ +% TABLE 18 BENGALI/ + ..;..;;;..;/ + ..;;..;..;/ + ;;..;;/ + ;;..;..;/ +% GURMUKHI/ + ..;..;;;..;/ + ..;;;;;;;/ + ;..;;;..;;/ + ..;;..;/ +% GUJARATI/ + ..;/ + ..;..;..;/ + ..;;;..;..;/ + ..;..;/ + ;..;;/ +% ORIYA/ + ..;..;;;..;/ + ..;;;..;..;/ + ..;..;..;;;/ + ..;;;/ +% TAMIL/ + ;;..;..;..;;/ + ;;;;;;..;/ + ..;..;..;..;/ + ;;..;/ +% TELUGU/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ +% KANNADA/ + ..;..;..;..;/ + ..;..;..;..;..;/ + ..;;..;;;/ +% MALAYALAM/ + ..;..;..;..;/ + ..;..;/ + ..;..;;/ + ..;..;/ +% SINHALA/ + ..;..;..;..;;/ + ..;;/ + ..;;..;..;/ +% THAI/ + ..;..;..;..;/ +% LAO/ + ..;;..;;;/ + ..;..;..;;;/ + ..;..;..;;/ + ..;;..;/ +% TIBETAN/ + ;..;..;..;/ +% MYANMAR/ + ..;..;..;;;/ + ;..;..;;/ +% GEORGIAN/ + ..;..;;/ +% HANGUL JAMO/ + ..;..;..;/ +% ETHIOPIC/ + ..;..;/ + ..;;..;..;/ + ..;..;..;/ + ..;;..;..;/ + ..;/ + ..;..;/ +% ETHIOPIC EXTENDED/ + ..;/ +% CHEROKEE/ + ..;/ +% UNIFIED CANADIAN ABORIGINAL SYLLABICS/ + ..;..;/ +% OGHAM/ + ..;/ +% RUNIC/ + ..;..;/ +% TAGALOG/ + ..;..;/ +% HANUNOO/ + ..;/ +% BUHID/ + ..;/ +% TAGBANWA/ + ..;..;/ +% KHMER/ + ..;;;/ +% MONGOLIAN/ + ..;..;;/ +% LIMBU/ + ..;..;/ +% TAI LE/ + ..;..;/ +% NEW TAI LUE/ + ..;..;..;/ +% BUGINESE/ + ..;/ +% BALINESE/ + ..;..;..;/ +% SUNDANESE/ + ..;..;/ +% LEPCHA/ + ..;..;/ +% OL CHIKI/ + ..;/ +% PHONETIC EXTENSIONS/ + ..;/ +% LATIN EXTENDED ADDITIONAL/ + ..;..;/ +% GREEK EXTENDED/ + ..;..;..;..;/ + ..;;;;..;/ + ..;..;;..;/ + ..;..;..;..;/ + ..;..;/ +% SUPERSCRIPTS AND SUBSCRIPTS/ + ;;..;/ +% LETTERLIKE SYMBOLS/ + ;;..;;..;;/ + ;..;..;/ + ..;..;;/ +% NUMBER FORMS/ + ..;/ +% ENCLOSED ALPHANUMERICS/ + ..;/ +% GLAGOLITIC/ + ..;..;/ +% LATIN EXTENDED-C/ + ..;..;/ +% COPTIC/ + ..;/ +% GEORGIAN SUPPLEMENT/ + ..;/ +% TIFINAGH/ + ..;;/ +% ETHIOPIC EXTENDED/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;/ +% CJK SYMBOLS AND PUNCTUATION/ + ..;..;..;..;/ +% HIRAGANA/ + ..;..;/ +% KATAKANA/ + ..;..;/ +% BOPOMOFO/ + ..;/ +% HANGUL COMPATIBILITY JAMO/ + ..;/ +% BOPOMOFO EXTENDED/ + ..;/ +% KATAKANA PHONETIC EXTENSIONS/ + ..;/ +% CJK UNIFIED IDEOGRAPHS EXTENSION/ + ..;/ +% CJK UNIFIED IDEOGRAPHS/ + ..;/ +% YI SYLLABLES/ + ..;/ +% VAI SYLLABLES/ + ..;..;..;/ +% CYRILLIC SUPPLEMENT 2/ + ..;..;..;/ +% LATIN EXTENDED-D/ + ..;..;..;/ +% SYLOTI NEGRI/ + ;;..;..;..;/ +% PHAGS PA/ + ..;/ +% SAURASHTRA/ + ..;/ +% KAYAH LI/ + ..;/ +% REJANG/ + ..;/ +% CHAM/ + ..;..;..;/ +% HANGUL SYLLABLES/ + ..;/ +% CJK COMPATIBILITY IDEOGRAPHS/ + ..;..;/ + ..;/ +% ALPHABETIC PRESENTATION FORMS/ + ..;..;;..;/ + ..;..;;;;;/ + ;..;/ +% ARABIC PRESENTATION FORMS-A/ + ..;..;..;..;/ + ..;/ +% ARABIC PRESENTATION FORMS-B/ + ..;..;/ +% HALFWIDTH AND FULLWIDTH FORMS/ + ..;..;..;..;/ + ..;..;..;/ +% LINEAR B SYLLABARY/ + ..;..;/ + ..;..;/ + ..;..;/ +% LINEAR B IDEOGRAMS/ + ..;/ +% ANCIENT GREEK NUMBERS/ + ..;/ +% LYCIAN/ + ..;/ +% CARIAN/ + ..;/ +% OLD ITALIC/ + ..;/ +% GOTHIC/ + ..;/ +% UGARITIC/ + ..;/ +% OLD PERSIAN/ + ..;..;/ + ..;/ +% DESERET/ + ..;/ +% SHAVIAN/ + ..;/ +% OSMANYA/ + ..;..;/ +% CYPRIOT SYLLABARY/ + ..;;..;/ + ..;;;/ +% PHOENICIAN/ + ..;;..;/ +% KHAROSHTI/ + ..;..;/ +% CUNEIFORM/ + ..;/ +% CUNEIFORM NUMBERS AND PONCTUATION/ + ..;/ +% BYZANTINE MUSICAL SYMBOLS/ +% MATHEMATICAL ALPHANUMERIC SYMBOLS/ + ..;..;/ + ..;;..;/ + ..;..;;/ + ..;..;/ + ..;..;/ + ..;..;/ + ..;..;;/ + ..;..;/ + ..;..;/ + ..;..;/ + ..;..;/ + ..;..;/ + ..;..;/ + ..;..;/ +% CJK UNIFIED IDEOGRAPHS EXTENSION/ + ..;/ +% CJK COMPATIBILITY IDEOGRAPHS SUPPLEMENT/ + ..;/ +% The non-ASCII number characters are included here because ISO C 99 / +% forbids us to classify them as digits; however, they behave more like / +% alphanumeric than like punctuation. / +% ARABIC/ + ..;..;/ +% DEVANAGARI/ + ..;/ +% BENGALI/ + ..;/ +% GURMUKHI/ + ..;/ +% GUJARATI/ + ..;/ +% ORIYA/ + ..;/ +% TAMIL/ + ..;/ +% TELUGU/ + ..;..;/ +% KANNADA/ + ..;/ +% MALAYALAM/ + ..;..;/ +% THAI/ + ..;/ +% LAO/ + ..;/ +% TIBETAN/ + ..;/ +% MYANMAR/ + ..;/ +% KHMER/ + ..;/ +% MONGOLIAN/ + ..;/ +% SUNDANESE/ + ..;/ +% LEPCHA/ + ..;/ +% OL CHIKI/ + ..;/ +% VAI/ + ..;/ +% SAURASHTRA/ + ..;/ +% KAYAH LI/ + ..;/ +% CHAM/ + ..;/ +% HALFWIDTH AND FULLWIDTH FORMS/ + .. + +% The "digit" class must only contain the BASIC LATIN digits, says ISO C 99 +% (sections 7.25.2.1.5 and 5.2.1). +digit / + .. + +% The "outdigit" information is by default "0" to "9". We don't have to +% provide it here since localedef will fill in the bits and it would +% prevent locales copy-ing this file define their own values. +% outdigit .. + +space / +% ISO/IEC 6429/ + ..;/ +% BASIC LATIN/ + ;/ + +cntrl / + ..;;/ + +punct / + ..;..;..;..;/ + ..;..;..;..;/ + ;;..;..;..;/ + ..;..;..;;/ + ..;;;..;..;/ + ..;..;..;..;/ + ..;..;..;/ + ..;..;;;..;/ + ..;..;..;;;/ + ..;..;..;..;/ + ;;/ + ;/ + ;;;..;;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;;;/ + ;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;;..;..;;/ + ..;..;;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;/ + ..;..;;..;/ + ..;..;..;..;/ + ;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ;..;..;;;;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;;..;;/ + ..;..;..;..;/ + ..;;..;..;/ + ..;..;/ + ..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;;;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;/ + ..;;;;..;/ + ..;;;..;..;/ + ..;..;;..;;/ + ..;..;/ + ..;;;..;/ + ..;..;..;..;/ + ..;..;;..;/ + ..;..;..;..;/ + ..;..;..;/ + ..;..;/ + ..;..;;/ + ;..;;/ + ..;..;/ + ..;..;/ + ..;..;/ + ..;..;/ + ..;..;/ + ..;..;/ + ..;;;;;/ + ;;;;;;/ + ;..;..;/ + ..;.. + +graph / + ..;..;..;/ + ..;;..;..;/ + ..;..;..;/ + ..;..;..;..;/ + ..;..;..;/ + ..;..;..;/ + ..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;;..;/ + ..;..;..;;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;;/ + ..;..;..;;/ + ..;/ + ;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ;..;..;;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;;..;/ + ..;..;..;..;/ + ..;..;;;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;;..;/ + ..;..;..;..;/ + ..;/ + ..;;..;;..;/ + ;..;..;..;/ + ..;..;;..;;/ + ;..;..;..;;/ + ;..;..;..;/ + ..;;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;;;/ + ..;..;/ + ..;..;..;..;/ + ..;..;;..;/ + ..;..;..;..;/ + ..;;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ;;;..;..;/ + ..;..;..;..;/ + ..;..;;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;;..;;/ + ..;..;..;..;/ + ..;;..;..;/ + ..;/ + ..;..;..;..;/ + ..;..;..;;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ;..;..;..;/ + ..;..;..;..;/ + ..;..;..;/ + ..;..;/ + ..;..;/ + ..;..;/ + ..;..;/ + ..;..;/ + ..;..;/ + ..;..;/ + ..;..;/ + ..;..;/ + ..;..;/ + ..;;..;/ + ..;;;/ + ..;;..;/ + ..;..;/ + ..;..;/ + ..;..;/ + ..;..;/ + ..;..;/ + ..;..;/ + ..;..;/ + ..;..;/ + ..;..;/ + ..;;..;/ + ..;..;;/ + ..;..;/ + ..;..;/ + ..;..;/ + ..;..;;/ + ..;..;/ + ..;..;/ + ..;..;/ + ..;..;;/ + ..;..;/ + ..;.. + +print / + ..;..;..;/ + ..;;..;..;/ + ..;..;..;/ + ..;..;..;..;/ + ..;..;..;/ + ..;..;..;/ + ..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;;..;/ + ..;..;..;;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;;/ + ..;..;..;;/ + ..;/ + ;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ;..;..;;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;;..;/ + ..;..;..;..;/ + ..;..;;;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;;..;/ + ..;..;..;..;/ + ..;/ + ..;;..;;..;/ + ;..;..;..;/ + ..;..;;..;;/ + ;..;..;..;;/ + ;..;..;..;/ + ..;;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;;;/ + ..;..;/ + ..;..;..;..;/ + ..;..;;..;/ + ..;..;..;..;/ + ..;;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ;;;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ;..;;..;..;/ + ..;..;..;;/ + ..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;/ + ..;..;..;/ + ..;..;..;..;/ + ;..;..;..;/ + ..;/ + ..;..;..;..;/ + ..;..;..;;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;;..;/ + ..;..;..;..;/ + ..;..;..;/ + ..;..;/ + ..;..;/ + ..;..;/ + ..;..;/ + ..;..;/ + ..;..;/ + ..;..;/ + ..;..;/ + ..;..;/ + ..;..;/ + ..;..;/ + ..;;..;/ + ..;;;/ + ..;;..;/ + ..;..;/ + ..;..;/ + ..;..;/ + ..;..;/ + ..;..;/ + ..;..;/ + ..;..;/ + ..;..;/ + ..;..;/ + ..;;..;/ + ..;..;;/ + ..;..;/ + ..;..;/ + ..;..;/ + ..;..;;/ + ..;..;/ + ..;..;/ + ..;..;/ + ..;..;;/ + ..;..;/ + ..;.. + +% The "xdigit" class must only contain the BASIC LATIN digits and A-F, a-f, +% says ISO C 99 (sections 7.25.2.1.12 and 6.4.4.1). +xdigit / + ..;..;.. + +blank / + ; + +toupper / + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);/ + (,);(,);/ + (,);(,);/ + (,);(,);/ + (,);(,);/ + (,);(,);/ + (,);(,);/ + (,);(,);/ + (,);(,);/ + (,);(,);/ + (,);(,);/ + (,);(,);/ + (,);(,);/ + (,);(,);/ + (,);(,);/ + (,);(,);/ + (,);(,);/ + (,);(,);/ + (,);(,);/ + (,);(,);/ + (,);(,) + +tolower / + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);/ + (,);(,);/ + (,);(,);/ + (,);(,);/ + (,);(,);/ + (,);(,);/ + (,);(,);/ + (,);(,);/ + (,);(,);/ + (,);(,);/ + (,);(,);/ + (,);(,);/ + (,);(,);/ + (,);(,);/ + (,);(,);/ + (,);(,);/ + (,);(,);/ + (,);(,);/ + (,);(,);/ + (,);(,);/ + (,) + +map "totitle"; / + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);(,);/ + (,);(,);(,);/ + (,);(,);/ + (,);(,);/ + (,);(,);/ + (,);(,);/ + (,);(,);/ + (,);(,);/ + (,);(,);/ + (,);(,);/ + (,);(,);/ + (,);(,);/ + (,);(,);/ + (,);(,);/ + (,);(,);/ + (,);(,);/ + (,);(,);/ + (,);(,);/ + (,);(,);/ + (,);(,);/ + (,);(,);/ + (,);(,) + +% The "combining" class reflects ISO/IEC 10646-1 annex B.1 +% That is, all combining characters (level 2+3). +class "combining"; / + ..;..;..;..;/ + ;..;..;;..;/ + ..;;..;..;/ + ..;..;;..;/ + ..;..;..;;/ + ..;..;..;..;/ + ;..;..;..;;/ + ..;..;;..;/ + ..;..;;..;/ + ;..;/ + ;..;..;..;/ + ..;..;;..;/ + ..;..;..;;/ + ..;..;..;;;/ + ..;..;..;..;/ + ..;..;..;;/ + ..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ;..;..;;..;/ + ;..;..;;..;/ + ..;;..;..;/ + ..;..;;;;/ + ..;..;..;..;/ + ..;;..;/ + ..;..;..;..;/ + ..;..;;/ + ;..;..;/ + ..;..;..;;/ + ..;;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;;;;;/ + ;..;;..;..;/ + ..;..;/ + ..;..;;/ + ..;..;/ + ..;..;/ + ..;..;/ + .. + +% The "combining_level3" class reflects ISO/IEC 10646-1 annex B.2 +% That is, combining characters of level 3. +class "combining_level3"; / + ..;;..;..;;/ + ..;;..;;;;/ + ..;..;;..;/ + ..;..;;..;/ + ..;..;;..;/ + ..;;..;..;/ + ..;;..;;..;/ + ;/ + ..;..;..;..;/ + ..;;..;..;/ + ..;..;;..;/ + ..;..;;;..;/ + ..;..;..;..;/ + ..;/ + ..;;..;..;/ + ..;..;..;..;/ + ..;..;..;;/ + ..;/ + ..;;..;;..;/ + ..;;..;..;;/ + ..;..;..;..;/ + ..;;..;..;/ + ..;..;..;..;/ + ..;/ + ..;..;;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;..;..;/ + ..;..;;;;/ + ..;;..;..;/ + ..;;;;;/ + ..;.. + +translit_start +include "translit_combining";"" +translit_end + +END LC_CTYPE + +LC_COLLATE +order_start forward + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +UNDEFINED +order_end +END LC_COLLATE + +LC_TIME +% Abbreviated weekday names (%a) +abday "";"";/ + "";"";/ + "";"";/ + "" + +% Full weekday names (%A) +day "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "" + +% Abbreviated month names (%b) +abmon "";"";/ + "";"";/ + "";"";/ + "";"";/ + "";"";/ + "";"" + +% Full month names (%B) +mon "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "" + +% Week description, consists of three fields: +% 1. Number of days in a week. +% 2. Gregorian date that is a first weekday (19971130 for Sunday, 19971201 for Monday). +% 3. The weekday number to be contained in the first week of the year. +% +% ISO 8601 conforming applications should use the values 7, 19971201 (a +% Monday), and 4 (Thursday), respectively. +week 7;19971130;7 +first_weekday 1 +first_workday 2 + +% Appropriate date and time representation (%c) +% "%a %d %b %Y %r %Z" +d_t_fmt "" + +% Appropriate date representation (%x) +% "%m/%d/%Y" +d_fmt "" + +% Appropriate time representation (%X) +% "%T" +t_fmt "" + +% Appropriate AM/PM time representation (%r) +% "%I:%M:%S %p" +t_fmt_ampm "/ +" + +% Strings for AM/PM +% +am_pm "";"" + +% Appropriate date representation (date(1)) "%a %b %e %H:%M:%S %Z %Y" +date_fmt "/ +/ +" + +END LC_TIME diff --git a/localedata/locales/aa_DJ b/localedata/locales/aa_DJ index 184b8c4..1c6eeff 100644 --- a/localedata/locales/aa_DJ +++ b/localedata/locales/aa_DJ @@ -273,5 +273,7 @@ d_t_fmt "/ date_fmt "/ " % +% FIXME: found in CLDR +first_weekday 7 END LC_TIME % diff --git a/localedata/locales/aa_ER b/localedata/locales/aa_ER index 1f369a1..2933f17 100644 --- a/localedata/locales/aa_ER +++ b/localedata/locales/aa_ER @@ -223,5 +223,7 @@ d_t_fmt "/ " % +% FIXME: found in CLDR +first_weekday 7 END LC_TIME % diff --git a/localedata/locales/aa_ER@saaho b/localedata/locales/aa_ER@saaho index 0929967..1ef79f3 100644 --- a/localedata/locales/aa_ER@saaho +++ b/localedata/locales/aa_ER@saaho @@ -207,5 +207,7 @@ d_t_fmt "/ " % +% FIXME: found in CLDR +first_weekday 7 END LC_TIME % diff --git a/localedata/locales/aa_ET b/localedata/locales/aa_ET index b0a1d8d..3e66d94 100644 --- a/localedata/locales/aa_ET +++ b/localedata/locales/aa_ET @@ -226,5 +226,7 @@ d_t_fmt "/ " % +% FIXME: found in CLDR +first_weekday 7 END LC_TIME % diff --git a/localedata/locales/af_ZA b/localedata/locales/af_ZA index ec58860..6525051 100644 --- a/localedata/locales/af_ZA +++ b/localedata/locales/af_ZA @@ -164,6 +164,8 @@ t_fmt_ampm "" date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 1 END LC_TIME LC_MESSAGES diff --git a/localedata/locales/am_ET b/localedata/locales/am_ET index 5aa2ca1..1badc50 100644 --- a/localedata/locales/am_ET +++ b/localedata/locales/am_ET @@ -1564,5 +1564,7 @@ date_fmt "/ / " % +% FIXME: found in CLDR +first_weekday 7 END LC_TIME % diff --git a/localedata/locales/ar_AE b/localedata/locales/ar_AE index e787bf3..ac5f688 100644 --- a/localedata/locales/ar_AE +++ b/localedata/locales/ar_AE @@ -141,6 +141,8 @@ t_fmt_ampm "/ date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 7 END LC_TIME diff --git a/localedata/locales/ar_BH b/localedata/locales/ar_BH index 4839d5f..c0a57d7 100644 --- a/localedata/locales/ar_BH +++ b/localedata/locales/ar_BH @@ -145,6 +145,8 @@ t_fmt_ampm "/ date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 7 END LC_TIME diff --git a/localedata/locales/ar_DZ b/localedata/locales/ar_DZ index 1e2838e..cecffcb 100644 --- a/localedata/locales/ar_DZ +++ b/localedata/locales/ar_DZ @@ -144,6 +144,8 @@ t_fmt_ampm "/ date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 7 END LC_TIME diff --git a/localedata/locales/ar_EG b/localedata/locales/ar_EG index ec0e9e2..fa95688 100644 --- a/localedata/locales/ar_EG +++ b/localedata/locales/ar_EG @@ -148,6 +148,8 @@ t_fmt_ampm "/ date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 7 END LC_TIME diff --git a/localedata/locales/ar_IN b/localedata/locales/ar_IN index a20cd6d..c4c529a 100644 --- a/localedata/locales/ar_IN +++ b/localedata/locales/ar_IN @@ -52,7 +52,7 @@ LC_MONETARY % for IBM Class for Unicode. % int_curr_symbol "" -currency_symbol "" +currency_symbol "" mon_decimal_point "" mon_thousands_sep "" mon_grouping 3;2 @@ -127,6 +127,8 @@ t_fmt "" % +% FIXME: copied from other *_IN locales +first_weekday 1 END LC_TIME diff --git a/localedata/locales/ar_IQ b/localedata/locales/ar_IQ index fc4a9fc..e16d3ba 100644 --- a/localedata/locales/ar_IQ +++ b/localedata/locales/ar_IQ @@ -144,6 +144,8 @@ t_fmt_ampm "/ date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 7 END LC_TIME diff --git a/localedata/locales/ar_JO b/localedata/locales/ar_JO index 8102187..e8274f9 100644 --- a/localedata/locales/ar_JO +++ b/localedata/locales/ar_JO @@ -162,6 +162,8 @@ t_fmt_ampm "/ date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 7 END LC_TIME diff --git a/localedata/locales/ar_KW b/localedata/locales/ar_KW index e2d1735..4dbe418 100644 --- a/localedata/locales/ar_KW +++ b/localedata/locales/ar_KW @@ -144,6 +144,8 @@ t_fmt_ampm "/ date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 7 END LC_TIME diff --git a/localedata/locales/ar_LB b/localedata/locales/ar_LB index cb0b7d7..48f6e45 100644 --- a/localedata/locales/ar_LB +++ b/localedata/locales/ar_LB @@ -161,6 +161,8 @@ t_fmt_ampm "/ date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 7 END LC_TIME diff --git a/localedata/locales/ar_LY b/localedata/locales/ar_LY index 5ab5838..020cf79 100644 --- a/localedata/locales/ar_LY +++ b/localedata/locales/ar_LY @@ -144,6 +144,8 @@ t_fmt_ampm "/ date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 7 END LC_TIME diff --git a/localedata/locales/ar_MA b/localedata/locales/ar_MA index 744b8a6..4506d3a 100644 --- a/localedata/locales/ar_MA +++ b/localedata/locales/ar_MA @@ -144,6 +144,8 @@ t_fmt_ampm "/ date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 7 END LC_TIME diff --git a/localedata/locales/ar_OM b/localedata/locales/ar_OM index b43475e..4cd6fb3 100644 --- a/localedata/locales/ar_OM +++ b/localedata/locales/ar_OM @@ -144,6 +144,8 @@ t_fmt_ampm "/ date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 7 END LC_TIME diff --git a/localedata/locales/ar_QA b/localedata/locales/ar_QA index 9793256..45b2804 100644 --- a/localedata/locales/ar_QA +++ b/localedata/locales/ar_QA @@ -144,6 +144,8 @@ t_fmt_ampm "/ date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 7 END LC_TIME diff --git a/localedata/locales/ar_SA b/localedata/locales/ar_SA index e9a3aa4..9df6c75 100644 --- a/localedata/locales/ar_SA +++ b/localedata/locales/ar_SA @@ -43,223 +43,8 @@ END LC_CTYPE % Set up the LC_COLLATE category LC_COLLATE - - -order_start forward; forward - - - - - - - - - - - - ; - ; - ; - ; - ; - ; - ; - ; - ; - ; - ; - ; - ; - ; - ; - ; - ; - ; - ; - ; - ; - ; - ; - ; - ; - ; - ; - ; - ; - ; - ; - ; - ; - ; - ; - ; - ; - ; - ; - ; - ; - ; - ; - ; - ; - ; - ; - ; - ; - ; - ; - ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IGNORE - IGNORE - IGNORE - IGNORE - IGNORE - IGNORE - IGNORE - IGNORE - IGNORE -order_end - - +% Copy the template from ISO/IEC 14651 +copy "iso14651_t1" END LC_COLLATE @@ -347,6 +132,8 @@ era_d_fmt "" date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 7 END LC_TIME diff --git a/localedata/locales/ar_SD b/localedata/locales/ar_SD index c4a2f86..2d204a9 100644 --- a/localedata/locales/ar_SD +++ b/localedata/locales/ar_SD @@ -144,6 +144,8 @@ t_fmt_ampm "/ date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 7 END LC_TIME diff --git a/localedata/locales/ar_SY b/localedata/locales/ar_SY index 8bc02e4..8adb6c5 100644 --- a/localedata/locales/ar_SY +++ b/localedata/locales/ar_SY @@ -161,6 +161,8 @@ t_fmt_ampm "/ date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 5 END LC_TIME diff --git a/localedata/locales/ar_TN b/localedata/locales/ar_TN index f2ffc4e..97f2117 100644 --- a/localedata/locales/ar_TN +++ b/localedata/locales/ar_TN @@ -144,6 +144,8 @@ t_fmt_ampm "/ date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 7 END LC_TIME diff --git a/localedata/locales/ar_YE b/localedata/locales/ar_YE index 91da9e9..b22402e 100644 --- a/localedata/locales/ar_YE +++ b/localedata/locales/ar_YE @@ -144,6 +144,8 @@ t_fmt_ampm "/ date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 7 END LC_TIME diff --git a/localedata/locales/as_IN b/localedata/locales/as_IN index 5c2b5bd..47164eb 100644 --- a/localedata/locales/as_IN +++ b/localedata/locales/as_IN @@ -51,7 +51,7 @@ END LC_NUMERIC %%%%%%%%%%%%% LC_MONETARY int_curr_symbol "" -currency_symbol "" +currency_symbol "" mon_decimal_point "" mon_thousands_sep "" mon_grouping 3;2 diff --git a/localedata/locales/az_AZ b/localedata/locales/az_AZ index 24e3779..01c5c56 100644 --- a/localedata/locales/az_AZ +++ b/localedata/locales/az_AZ @@ -274,6 +274,8 @@ d_fmt "" t_fmt "" am_pm "";"" t_fmt_ampm "" +% FIXME: found in CLDR +first_weekday 2 END LC_TIME LC_PAPER diff --git a/localedata/locales/be_BY b/localedata/locales/be_BY index 111b3b1..744f82e 100644 --- a/localedata/locales/be_BY +++ b/localedata/locales/be_BY @@ -145,6 +145,9 @@ t_fmt_ampm "" date_fmt "/ / " +% Copied from be_BY@alternative +first_weekday 2 +first_workday 2 END LC_TIME LC_PAPER diff --git a/localedata/locales/be_BY@latin b/localedata/locales/be_BY@latin index 6dbbfad..c0fbd59 100644 --- a/localedata/locales/be_BY@latin +++ b/localedata/locales/be_BY@latin @@ -102,6 +102,9 @@ t_fmt_ampm "" date_fmt "/ / " +% Copied from be_BY@alternative +first_weekday 2 +first_workday 2 END LC_TIME LC_COLLATE diff --git a/localedata/locales/bem_ZM b/localedata/locales/bem_ZM new file mode 100644 index 0000000..edb5cf3 --- /dev/null +++ b/localedata/locales/bem_ZM @@ -0,0 +1,195 @@ +comment_char % +escape_char / +% Charset: UTF-8 +% Authors: +% 2011-04-18, Anthony Musaluke +% 2011-04-18, info@2xlibre.net +% Distribution and use is free, also +% for commercial purposes. + +LC_IDENTIFICATION +title "Bemba locale for Zambia" +source "ANLoc" +contact "Martin Benjamin" +email "locales@africanlocalization.net" +language "Bemba" +territory "Zambia" +revision "1.0" +date "2011-04-18" +% +category "bem_ZM:2000";LC_IDENTIFICATION +category "bem_ZM:2000";LC_CTYPE +category "bem_ZM:2000";LC_COLLATE +category "bem_ZM:2000";LC_TIME +category "bem_ZM:2000";LC_NUMERIC +category "bem_ZM:2000";LC_MONETARY +category "bem_ZM:2000";LC_PAPER +category "bem_ZM:2000";LC_MEASUREMENT +category "bem_ZM:2000";LC_MESSAGES +category "bem_ZM:2000";LC_NAME +category "bem_ZM:2000";LC_ADDRESS +category "bem_ZM:2000";LC_TELEPHONE +END LC_IDENTIFICATION + +LC_CTYPE +copy "i18n" + +translit_start +include "translit_combining";"" +translit_end +END LC_CTYPE + +LC_COLLATE +copy "iso14651_t1" +END LC_COLLATE + +LC_TIME +% Januari, Februari, Machi, Epreo, Mei, Juni, Julai, Ogasti, Septemba, Oktoba, Novemba, Disemba +mon "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "" +% Jan, Feb, Mar, Apr, May, Jun, July, Aug, Sep, Oct, Nov, Dec +abmon "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "" +% Pa Mulungu, Palichimo, Palichibuli, Palichitatu, Palichine, Palichisano, Pachibelushi +day "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "" +% Sun, Mon, Tue, Wed, Thu, Fri, Sat +abday "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "" +week 7;19971130;4 +first_weekday 1 +first_workday 2 +% %a %d %b %Y %R %Z +d_t_fmt "/ +" +% %m/%d/%Y +d_fmt "" +% %T (HH:MM:SS) +t_fmt "" +% uluchelo, akasuba +am_pm "";/ + "" +% %I:%M:%S %p +t_fmt_ampm "" +END LC_TIME + +LC_NUMERIC +% . +decimal_point "" +% , +thousands_sep "" +grouping 3 +END LC_NUMERIC + +LC_MONETARY +% K +currency_symbol "" +% ZMK +int_curr_symbol "" +% . +mon_decimal_point "" +% , +mon_thousands_sep "" +mon_grouping 3 +positive_sign "" +% - +negative_sign "" +frac_digits 2 +int_frac_digits 2 +p_cs_precedes 1 +p_sep_by_space 0 +n_cs_precedes 1 +n_sep_by_space 0 +p_sign_posn 1 +n_sign_posn 1 +END LC_MONETARY + +LC_PAPER +height 297 +width 210 +END LC_PAPER + +LC_MEASUREMENT +measurement 1 +END LC_MEASUREMENT + +LC_MESSAGES +% ^[yYeE].* +yesexpr "" +% ^[nNaA].* +noexpr "" +END LC_MESSAGES + +LC_NAME +% %p%t%d1%g%t%M%f +name_fmt "" +% Ba +name_gen "" +% Ba +name_miss "" +% Ba +name_mr "" +% Bana +name_mrs "" +% Ba +name_ms "" +END LC_NAME + +LC_ADDRESS +% %a%N%f%N%e %h%N%b %s%N%z%N%T%N%c%N +postal_fmt "/ +/ +" +% Zambia +country_name "" +% ZM +country_post "" +% ZM +country_ab2 "" +% ZMB +country_ab3 "" +country_num 894 +lang_name "" +lang_term "" +END LC_ADDRESS + +LC_TELEPHONE +% +%c %A %l +tel_int_fmt "" +% %A %l +tel_dom_fmt "" +% 00 +int_select "" +% 260 +int_prefix "" +END LC_TELEPHONE diff --git a/localedata/locales/bn_IN b/localedata/locales/bn_IN index d049a23..93126d0 100644 --- a/localedata/locales/bn_IN +++ b/localedata/locales/bn_IN @@ -53,7 +53,7 @@ LC_MONETARY % for IBM Class for Unicode. % int_curr_symbol "" -currency_symbol "" +currency_symbol "" mon_decimal_point "" mon_thousands_sep "" mon_grouping 2;3 @@ -145,6 +145,8 @@ t_fmt "" % +% FIXME +first_weekday 1 END LC_TIME diff --git a/localedata/locales/br_FR b/localedata/locales/br_FR index 3ca47cc..b173041 100644 --- a/localedata/locales/br_FR +++ b/localedata/locales/br_FR @@ -141,6 +141,8 @@ d_fmt "" t_fmt "" am_pm "";"" t_fmt_ampm "" +% FIXME: found in CLDR +first_weekday 2 END LC_TIME LC_PAPER diff --git a/localedata/locales/bs_BA b/localedata/locales/bs_BA index fa5877e..73028b1 100644 --- a/localedata/locales/bs_BA +++ b/localedata/locales/bs_BA @@ -208,6 +208,8 @@ d_fmt "" t_fmt "" am_pm "";"" t_fmt_ampm "" +% FIXME: found in CLDR +first_weekday 2 END LC_TIME LC_PAPER diff --git a/localedata/locales/byn_ER b/localedata/locales/byn_ER index 0440fbd..69a3ce1 100644 --- a/localedata/locales/byn_ER +++ b/localedata/locales/byn_ER @@ -218,5 +218,7 @@ date_fmt "/ / " % +% FIXME: found in CLDR +first_weekday 7 END LC_TIME % diff --git a/localedata/locales/ca_ES b/localedata/locales/ca_ES index cd83bcc..e426c01 100644 --- a/localedata/locales/ca_ES +++ b/localedata/locales/ca_ES @@ -138,6 +138,8 @@ t_fmt_ampm "" date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 2 END LC_TIME LC_PAPER diff --git a/localedata/locales/ca_ES@valencia b/localedata/locales/ca_ES@valencia new file mode 100644 index 0000000..9f1040a --- /dev/null +++ b/localedata/locales/ca_ES@valencia @@ -0,0 +1,96 @@ +comment_char % +escape_char / +% +% Valencian (southern Catalan) locale for Spain with Euro +% +% Note that this locale is almost the same as ca_ES@euro. The point of having +% a separate locale is only for PO translations, which have a lot of social +% support and are very appreciated by the Valencian-speaking community. +% +% Contact: Jordi Mallach +% Email: jordi@gnu.org +% Tel: +% Fax: +% Language: ca +% Territory: ES +% Option: euro +% Revision: 1.0 +% Date: 2006-04-06 +% Application: general +% Users: general +% Repertoiremap: mnemonic,ds +% Charset: ISO-8859-15 +% Distribution and use is free, also +% for commercial purposes. + +LC_IDENTIFICATION +title "Valencian (southern Catalan) locale for Spain with Euro" +source "" +address "" +contact "Jordi Mallach" +email "jordi@gnu.org" +tel "" +fax "" +language "Catalan" +territory "Spain" +revision "1.0" +date "2006-04-06" +% +category "ca_ES@valencia:2006";LC_IDENTIFICATION +category "ca_ES@valencia:2006";LC_CTYPE +category "ca_ES@valencia:2006";LC_COLLATE +category "ca_ES@valencia:2006";LC_MONETARY +category "ca_ES@valencia:2006";LC_NUMERIC +category "ca_ES@valencia:2006";LC_TIME +category "ca_ES@valencia:2006";LC_MESSAGES +category "ca_ES@valencia:2006";LC_PAPER +category "ca_ES@valencia:2006";LC_NAME +category "ca_ES@valencia:2006";LC_ADDRESS +category "ca_ES@valencia:2006";LC_TELEPHONE +category "ca_ES@valencia:2006";LC_MEASUREMENT + +END LC_IDENTIFICATION + +LC_CTYPE +copy "i18n" +END LC_CTYPE + +LC_COLLATE +copy "ca_ES" +END LC_COLLATE + +LC_MONETARY +copy "ca_ES" +END LC_MONETARY + +LC_NUMERIC +copy "ca_ES" +END LC_NUMERIC + +LC_TIME +copy "ca_ES" +END LC_TIME + +LC_MESSAGES +copy "ca_ES" +END LC_MESSAGES + +LC_PAPER +copy "ca_ES" +END LC_PAPER + +LC_NAME +copy "ca_ES" +END LC_NAME + +LC_ADDRESS +copy "ca_ES" +END LC_ADDRESS + +LC_TELEPHONE +copy "ca_ES" +END LC_TELEPHONE + +LC_MEASUREMENT +copy "ca_ES" +END LC_MEASUREMENT diff --git a/localedata/locales/csb_PL b/localedata/locales/csb_PL index 93c9ae2..7e645aa 100644 --- a/localedata/locales/csb_PL +++ b/localedata/locales/csb_PL @@ -93,38 +93,45 @@ reorder-after reorder-after ;;;IGNORE - ;;;IGNORE ;;;IGNORE +reorder-after + ;;;IGNORE ;;;IGNORE reorder-after ;;;IGNORE - ;;;IGNORE ;;;IGNORE +reorder-after + ;;;IGNORE ;;;IGNORE reorder-after ;;;IGNORE +reorder-after ;;;IGNORE reorder-after ;;;IGNORE +reorder-after ;;;IGNORE reorder-after ;;;IGNORE - ;;;IGNORE ;;;IGNORE - ;;;IGNORE ;;;IGNORE +reorder-after + ;;;IGNORE + ;;;IGNORE ;;;IGNORE reorder-after ;;;IGNORE +reorder-after ;;;IGNORE reorder-after ;;;IGNORE +reorder-after ;;;IGNORE reorder-end diff --git a/localedata/locales/cy_GB b/localedata/locales/cy_GB index 9615c3f..bcabb29 100644 --- a/localedata/locales/cy_GB +++ b/localedata/locales/cy_GB @@ -248,8 +248,13 @@ mon "";/ d_t_fmt "" d_fmt "" t_fmt "" -am_pm "";"" -t_fmt_ampm "" +am_pm "";"" +t_fmt_ampm "" +date_fmt "/ +/ +" +week 7;19971130;4 +first_weekday 2 END LC_TIME LC_MESSAGES diff --git a/localedata/locales/da_DK b/localedata/locales/da_DK index c4b451d..381156a 100644 --- a/localedata/locales/da_DK +++ b/localedata/locales/da_DK @@ -81,34 +81,37 @@ reorder-after % and are treated as in Danish reorder-after ;;;IGNORE - ;;;IGNORE ;;;IGNORE +reorder-after + ;;;IGNORE ;;;IGNORE % is a separate letter in Danish reorder-after ;;;IGNORE - ;;;IGNORE ;;;IGNORE - ;;;IGNORE ;;;IGNORE - ;;;IGNORE ;;;IGNORE - ;;;IGNORE % is a separate letter in Danish ;;;IGNORE - ;;;IGNORE ;;;IGNORE - ;;;IGNORE ;;;IGNORE - ;;;IGNORE ;;;IGNORE - ;;;IGNORE % is a separate letter in Danish ;;;IGNORE - ;;;IGNORE ;;;IGNORE ;;;IGNORE + +reorder-after + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE ;;;IGNORE ;;;IGNORE @@ -116,6 +119,7 @@ reorder-after % removed from latest iso14651 tables. reorder-after "";"";"";IGNORE +reorder-after "";"";"";IGNORE reorder-after @@ -123,8 +127,9 @@ reorder-after reorder-after ;;;IGNORE - ;;;IGNORE ;;;IGNORE +reorder-after + ;;;IGNORE ;;;IGNORE reorder-end diff --git a/localedata/locales/de_AT b/localedata/locales/de_AT index 4e0b7fb..1cc53d0 100644 --- a/localedata/locales/de_AT +++ b/localedata/locales/de_AT @@ -102,7 +102,7 @@ abmon "";"";/ "";"";/ "";"" mon "";/ - "";/ + "";/ "";/ "";/ "";/ diff --git a/localedata/locales/de_BE b/localedata/locales/de_BE index 3e7f11d..4ac740a 100644 --- a/localedata/locales/de_BE +++ b/localedata/locales/de_BE @@ -119,6 +119,8 @@ t_fmt_ampm "" date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 2 END LC_TIME LC_PAPER diff --git a/localedata/locales/de_LI b/localedata/locales/de_LI new file mode 100644 index 0000000..62e799b --- /dev/null +++ b/localedata/locales/de_LI @@ -0,0 +1,94 @@ +comment_char % +escape_char / +% +% German locale for Liechtenstein +% Language: de +% Territory: LI +% Revision: 1.0 +% Date: 2007-11-27 +% Users: general +% Repertoiremap: mnemonic.ds +% Charset: ISO-8859-1 +% Distribution and use is free, also +% for commercial purposes. + +LC_IDENTIFICATION +title "German locale for Liechtenstein" +source "" +address "" +contact "" +email "bug-glibc-locales@gnu.org" +tel "" +fax "" +language "German" +territory "Liechtenstein" +revision "1.0" +date "2007-11-27" +% +category "de_LI:2000";LC_IDENTIFICATION +category "de_LI:2000";LC_CTYPE +category "de_LI:2000";LC_COLLATE +category "de_LI:2000";LC_TIME +category "de_LI:2000";LC_NUMERIC +category "de_LI:2000";LC_MONETARY +category "de_LI:2000";LC_MESSAGES +category "de_LI:2000";LC_PAPER +category "de_LI:2000";LC_NAME +category "de_LI:2000";LC_ADDRESS +category "de_LI:2000";LC_TELEPHONE + +END LC_IDENTIFICATION + +LC_CTYPE +copy "de_CH" +END LC_CTYPE + +LC_COLLATE +copy "de_CH" +END LC_COLLATE + +LC_MESSAGES +copy "de_CH" +END LC_MESSAGES + +LC_MONETARY +copy "de_CH" +END LC_MONETARY + +LC_NUMERIC +copy "de_CH" +END LC_NUMERIC + +LC_TIME +copy "de_CH" +END LC_TIME + +LC_PAPER +copy "de_CH" +END LC_PAPER + +LC_TELEPHONE +tel_int_fmt "/ +" +int_prefix "" +END LC_TELEPHONE + +LC_MEASUREMENT +copy "de_CH" +END LC_MEASUREMENT + +LC_NAME +copy "de_CH" +END LC_NAME + +LC_ADDRESS +postal_fmt "/ +/ +/ +/ +" +country_ab2 "" +country_ab3 "" +country_num 438 +END LC_ADDRESS + diff --git a/localedata/locales/de_LU b/localedata/locales/de_LU index 66baf3f..df3ffc5 100644 --- a/localedata/locales/de_LU +++ b/localedata/locales/de_LU @@ -119,6 +119,8 @@ t_fmt_ampm "" date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 2 END LC_TIME LC_PAPER diff --git a/localedata/locales/dz_BT b/localedata/locales/dz_BT index 7b3fe1e..94fd333 100644 --- a/localedata/locales/dz_BT +++ b/localedata/locales/dz_BT @@ -56,7 +56,30 @@ END LC_CTYPE LC_COLLATE copy "iso14651_t1" -script +% Collation rules written by Pema Geyleg, Pablo Saratxaga and Denis +% Barbier, based on Dzongkha collation chart provided by Christopher J Fynn +% at http://www.btinternet.com/~c.fynn/misc/DZ_bt/dzongkha-collate.html + +% Third level + +% Nominal, subjoined or variant forms +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +% Tibetan signs +collating-symbol +collating-symbol +collating-symbol + +% Second level +collating-symbol +collating-symbol +collating-symbol + +% Primary level +collating-symbol % 30 base letters collating-symbol @@ -96,669 +119,736 @@ collating-symbol collating-symbol collating-symbol -% pre-radicals -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol - -% nominal, subjoined or variant forms -collating-symbol -collating-symbol -collating-symbol - -% ka-radicals -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" - -% kha-radicals -collating-symbol -collating-symbol -collating-element from "" -collating-element from "" - -% ga-radicals -% as there are ambiguous, the next letter has to be added too; -% so the are in fact double elements: the ga-radical -% itself, and the following letter. -collating-symbol % ambiguous -collating-symbol % ambiguous -collating-symbol % ambiguous -collating-symbol % ambiguous -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" - -% nga-radicals -% as there are ambiguous, the next letter has to be added too; -% so the are in fact double elements: the nga-radical -% itself, and the following letter. -collating-symbol % ambiguous -collating-symbol % ambiguous -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" - -% ca-radicals -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" - -% cha-radicals -collating-symbol -collating-symbol -collating-element from "" -collating-element from "" - -% ja-radicals -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" - -% nya-radicals -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" - -% ta-radicals -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" - -% tha-radicals -collating-symbol -collating-symbol -collating-element from "" -collating-element from "" - -% da-radicals -% as there are ambiguous, the next letter has to be added too; -% so the are in fact double elements: the da-radical -% itself, and the following letter. -collating-symbol % ambiguous -collating-symbol % ambiguous -collating-symbol % ambiguous -collating-symbol % ambiguous -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" - -% na-radicals -% as there are ambiguous, the next letter has to be added too; -% so the are in fact double elements: the na-radical -% itself, and the following letter. -collating-symbol % ambiguous -collating-symbol % ambiguous -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" - -% pa-radicals -% as there are ambiguous, the next letter has to be added too; -% so the are in fact double elements: the pa-radical -% itself, and the following letter. -collating-symbol % ambiguous in Dzongkha -collating-symbol -collating-symbol -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" - -% pha-radicals -collating-symbol -collating-element from "" - -% ba-radicals -% as there are ambiguous, the next letter has to be added too; -% so the are in fact double elements: the ba-radical -% itself, and the following letter. -collating-symbol % ambiguous -collating-symbol % ambiguous -collating-symbol -collating-symbol -collating-symbol -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" - -% ma-radicals -% as there are ambiguous, the next letter has to be added too; -% so the are in fact double elements: the ma-radical -% itself, and the following letter. -collating-symbol % ambiguous -collating-symbol -collating-symbol -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" - -% tsa-radicals -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" - -% tsha-radicals -collating-symbol -collating-symbol -collating-element from "" -collating-element from "" - -% dza-radicals -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" - -% zha-radicals -collating-symbol -collating-symbol -collating-element from "" -collating-element from "" - -% za-radicals -collating-symbol -collating-symbol -collating-element from "" -collating-element from "" - -% ya-radicals -collating-symbol -collating-element from "" - -% ra-radicals -% as there are ambiguous, the next letter has to be added too; -% so the are in fact double elements: the ra-radical -% itself, and the following letter. -collating-symbol % ambiguous -collating-element from "" - -% sha-radicals -collating-symbol -collating-symbol -collating-element from "" -collating-element from "" - -% sa-radicals -% as there are ambiguous, the next letter has to be added too; -% so the are in fact double elements: the sa-radical -% itself, and the following letter. -collating-symbol % ambiguous -collating-symbol % ambiguous -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" - -% ha-radicals -collating-symbol -collating-element from "" - -% generic definitions -reorder-after +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol + +% +collating-symbol +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +% +collating-symbol +collating-element from "" +collating-element from "" +collating-element from "" +% +collating-symbol +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +%%% Not in Fynn's chart +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +%%% Not in Fynn's chart +collating-element from "" +%%% Not in Fynn's chart +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +%%% Not in Fynn's chart +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +% +collating-symbol +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +% +collating-symbol +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +% +collating-symbol +collating-element from "" +collating-element from "" +% +collating-symbol +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +% +collating-symbol +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +% +collating-symbol +collating-symbol +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +% +collating-symbol +collating-symbol +collating-element from "" +collating-element from "" +% +collating-symbol +collating-symbol +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +%%% Not in Fynn's chart +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +%%% Not in Fynn's chart +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +%%% Not in Fynn's chart +collating-element from "" +%%% Not in Fynn's chart +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +% +collating-symbol +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +%%% Not in Fynn's chart +collating-element from "" +%%% Not in Fynn's chart +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +%%% Not in Fynn's chart +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +% +collating-symbol +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +% +collating-symbol +collating-element from "" +collating-element from "" +% +collating-symbol +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +%%% Not in Fynn's chart +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +% +collating-symbol +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +%%% Not in Fynn's chart +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +% +collating-symbol +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +% +collating-symbol +collating-element from "" +collating-element from "" +% +collating-symbol +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +% +collating-symbol +collating-element from "" +collating-element from "" +% +collating-symbol +collating-element from "" +collating-element from "" +% +collating-symbol +collating-element from "" +collating-element from "" +% +collating-symbol +collating-element from "" +collating-element from "" +collating-element from "" +% +collating-symbol +collating-element from "" +% +collating-symbol +% +collating-symbol +% +collating-symbol +collating-element from "" +collating-element from "" +% +collating-symbol +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +%%% Not in Fynn's chart +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" +% +collating-symbol +collating-element from "" +% +collating-symbol +collating-symbol +collating-symbol +collating-element from "" +collating-element from "" +collating-element from "" +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol + +reorder-after + + + + + + reorder-after - - - - - - - - - - - - - - - -% a better place than after cyrillic ya should be defined + + + +reorder-after + + reorder-after + - - - - - - - - - - + + + - - - - - - - - - + - - - - - - - + - - - - + - - + - - - - - + - - - - - - + - - - - - - - - + - - + - - - - - - - - - - + - - - - - - + - - - + - + - - - - - + - - - + - - - - - - + - - + - - - - + + - - + - - + + - + - + + - - + - - + - + + + -%order_start ;forward;forward;forward;forward,position + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +reorder-end -% specific definitions -reorder-after -% digits +script + +order_start ;forward;forward;forward;forward,position <0>;;IGNORE;IGNORE <0>;;IGNORE;IGNORE <1>;;IGNORE;IGNORE @@ -780,430 +870,580 @@ reorder-after <9>;;IGNORE;IGNORE <9>;;IGNORE;IGNORE -% letters - ;;;IGNORE % ka - ;;;IGNORE - "";"";"";IGNORE % kssa - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE % kha - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE % ga - ;;;IGNORE - "";"";"";IGNORE % gha - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE % nga - ;;;IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE % ca - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE % cha - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE % ja - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE % nya - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE % ta - ;;;IGNORE - ;;;IGNORE % tta - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE % tha - ;;;IGNORE - ;;;IGNORE % ttha - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE % da - ;;;IGNORE - ;;;IGNORE % dda - ;;;IGNORE - "";"";"";IGNORE % dha - "";"";"";IGNORE - "";"";"";IGNORE % ddha - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE % na - ;;;IGNORE - ;;;IGNORE % nna - ;;;IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE % pa - ;;;IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE % pha - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE % ba - ;;;IGNORE - "";"";"";IGNORE % bha - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE % ma - ;;;IGNORE - ;;;IGNORE % - ;;;IGNORE % - ;;;IGNORE % - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE % tsa - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE % tsha - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE % dza - ;;;IGNORE - "";"";"";IGNORE % dzha - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE % wa - ;;;IGNORE - ;;;IGNORE % fixed wa - ;;;IGNORE % zha - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE % za - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE % -a - ;;;IGNORE - ;;;IGNORE % ya - ;;;IGNORE - ;;;IGNORE % fixed ya - ;;;IGNORE - ;;;IGNORE % ra - ;;;IGNORE - ;;;IGNORE % fixed ra - ;;;IGNORE - ;;;IGNORE % vocalic r -% FIXME; which of the two? - ;;;IGNORE % vocalic rr -% "";";";IGNORE % vocalic rr - "";"";"";IGNORE - ;;;IGNORE % la - ;;;IGNORE - ;;;IGNORE % vocalic l -% FIXME; which of the two? - ;;;IGNORE % vocalic ll -% "";";";IGNORE % vocalic ll - ;;;IGNORE % sha - ;;;IGNORE - ;;;IGNORE % ssa - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE % sa - ;;;IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE % ha - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE % a - ;;;IGNORE - -% explicit vowels - IGNORE;;IGNORE;IGNORE % long vowel mark % FIXME - ;;;IGNORE % i - ;;;IGNORE % reversed i - ;;;IGNORE % ii - ;;;IGNORE % reversed ii - ;;;IGNORE % u - ;;;IGNORE % uu - ;;;IGNORE % e - ;;;IGNORE % ee - ;;;IGNORE % o - ;;;IGNORE % oo - -% FIXME: 0F39, 0F7F, 0F84, 0F85, 0F86, 0F87, - -% FIXME: 0F88, UF89, UF8A, 0F8B - IGNORE;;IGNORE;IGNORE - IGNORE;;IGNORE;IGNORE - IGNORE;;IGNORE;IGNORE - IGNORE;;IGNORE;IGNORE - -reorder-end + ;IGNORE;IGNORE;IGNORE + + ;;;IGNORE + ;;;IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + + ;;;IGNORE + ;;;IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + + ;;;IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + + ;;;IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + + ;;;IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + + ;;;IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + + ;;;IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + + ;;;IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + + ;;;IGNORE + ;;;IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + + ;;;IGNORE + ;;;IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + + ;;;IGNORE + ;;;IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + + ;;;IGNORE + ;;;IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + + ;;;IGNORE + ;;;IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + + ;;;IGNORE + ;;;IGNORE + "";"";"";IGNORE + + ;;;IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + + ;;;IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + + ;;;IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + + ;;;IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + + ;;;IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + + ;;;IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + + ;;;IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + + ;;;IGNORE + "";"";"";IGNORE + + ;;;IGNORE + ;;;IGNORE + + ;;;IGNORE + + ;;;IGNORE + ;;;IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + + ;;;IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + "";"";"";IGNORE + + ;;;IGNORE + "";"";"";IGNORE + + ;;;IGNORE + + ;;;IGNORE + + ;;;IGNORE + + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + + ;;;IGNORE + ;;;IGNORE + + ;;;IGNORE + ;;;IGNORE + + ;;;IGNORE + ;;;IGNORE + + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE +order_end END LC_COLLATE @@ -1306,7 +1546,8 @@ t_fmt_ampm "/ / " - +% FIXME: found in CLDR +first_weekday 2 END LC_TIME LC_MESSAGES diff --git a/localedata/locales/el_GR b/localedata/locales/el_GR index bb1db14..e7a661a 100644 --- a/localedata/locales/el_GR +++ b/localedata/locales/el_GR @@ -139,6 +139,8 @@ t_fmt_ampm "" +% FIXME: found in CLDR +first_weekday 2 END LC_TIME LC_PAPER diff --git a/localedata/locales/en_AU b/localedata/locales/en_AU index 39aa7e2..e8d1cb6 100644 --- a/localedata/locales/en_AU +++ b/localedata/locales/en_AU @@ -114,9 +114,11 @@ t_fmt "" am_pm "";"" t_fmt_ampm "/ " -date_fmt "/ +date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 1 END LC_TIME LC_MESSAGES diff --git a/localedata/locales/en_CA b/localedata/locales/en_CA index 5e0ef2c..a52692d 100644 --- a/localedata/locales/en_CA +++ b/localedata/locales/en_CA @@ -132,6 +132,8 @@ t_fmt_ampm "/ / " +% FIXME: found in CLDR +first_weekday 1 END LC_TIME LC_MESSAGES diff --git a/localedata/locales/en_DK b/localedata/locales/en_DK index 3ec5170..3b367e1 100644 --- a/localedata/locales/en_DK +++ b/localedata/locales/en_DK @@ -60,27 +60,11 @@ copy "en_GB" END LC_CTYPE LC_MONETARY -int_curr_symbol "" -currency_symbol "" -mon_decimal_point "" -mon_thousands_sep "" -mon_grouping 3;3 -positive_sign "" -negative_sign "" -int_frac_digits 2 -frac_digits 2 -p_cs_precedes 1 -p_sep_by_space 0 -n_cs_precedes 1 -n_sep_by_space 0 -p_sign_posn 1 -n_sign_posn 1 +copy "da_DK" END LC_MONETARY LC_NUMERIC -decimal_point "" -thousands_sep "" -grouping 3;3 +copy "da_DK" END LC_NUMERIC LC_TIME @@ -128,8 +112,7 @@ first_workday 2 END LC_TIME LC_MESSAGES -yesexpr "" -noexpr "" +copy "da_DK" END LC_MESSAGES LC_PAPER @@ -145,17 +128,9 @@ copy "da_DK" END LC_MEASUREMENT LC_NAME -name_fmt "/ -" +copy "da_DK" END LC_NAME LC_ADDRESS -postal_fmt "/ -/ -/ -/ -" -country_ab2 "" -country_ab3 "" -country_num 208 +copy "da_DK" END LC_ADDRESS diff --git a/localedata/locales/en_GB b/localedata/locales/en_GB index 6a81d6d..32a4e6c 100644 --- a/localedata/locales/en_GB +++ b/localedata/locales/en_GB @@ -116,8 +116,8 @@ mon "";/ d_t_fmt "" d_fmt "" t_fmt "" -am_pm "";"" -t_fmt_ampm "" +am_pm "";"" +t_fmt_ampm "" date_fmt "/ / " diff --git a/localedata/locales/en_HK b/localedata/locales/en_HK index 7f00765..7646cb8 100644 --- a/localedata/locales/en_HK +++ b/localedata/locales/en_HK @@ -133,6 +133,8 @@ t_fmt "" % +% FIXME +first_weekday 1 END LC_TIME diff --git a/localedata/locales/en_IE b/localedata/locales/en_IE index 171e3b1..f58f788 100644 --- a/localedata/locales/en_IE +++ b/localedata/locales/en_IE @@ -115,6 +115,8 @@ t_fmt_ampm "" date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 2 END LC_TIME LC_MESSAGES diff --git a/localedata/locales/en_IN b/localedata/locales/en_IN index 3af445a..40298c3 100644 --- a/localedata/locales/en_IN +++ b/localedata/locales/en_IN @@ -52,7 +52,7 @@ LC_MONETARY % for IBM Class for Unicode. % int_curr_symbol "" -currency_symbol "" +currency_symbol "" mon_decimal_point "" mon_thousands_sep "" mon_grouping 3;2 @@ -132,6 +132,8 @@ t_fmt "" % +% FIXME +first_weekday 1 END LC_TIME diff --git a/localedata/locales/en_NZ b/localedata/locales/en_NZ index 815134f..b597460 100644 --- a/localedata/locales/en_NZ +++ b/localedata/locales/en_NZ @@ -117,6 +117,8 @@ t_fmt_ampm "/ date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 1 END LC_TIME LC_MESSAGES diff --git a/localedata/locales/en_PH b/localedata/locales/en_PH index 9f78c1f..8606312 100644 --- a/localedata/locales/en_PH +++ b/localedata/locales/en_PH @@ -133,6 +133,8 @@ t_fmt "" % +% FIXME: found in CLDR +first_weekday 1 END LC_TIME diff --git a/localedata/locales/en_SG b/localedata/locales/en_SG index 0e9196c..7a3ee1a 100644 --- a/localedata/locales/en_SG +++ b/localedata/locales/en_SG @@ -131,6 +131,8 @@ t_fmt "" % +% FIXME: found in CLDR +first_weekday 1 END LC_TIME diff --git a/localedata/locales/en_ZA b/localedata/locales/en_ZA index 8620171..9f3cd12 100644 --- a/localedata/locales/en_ZA +++ b/localedata/locales/en_ZA @@ -205,6 +205,8 @@ t_fmt_ampm "" date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 1 END LC_TIME LC_MESSAGES diff --git a/localedata/locales/en_ZM b/localedata/locales/en_ZM new file mode 100644 index 0000000..ac8e680 --- /dev/null +++ b/localedata/locales/en_ZM @@ -0,0 +1,92 @@ +comment_char % +escape_char / +% Charset: UTF-8 +% Authors: +% 2011-04-18, Anthony Musaluke +% 2011-04-18, info@2xlibre.net +% Distribution and use is free, also +% for commercial purposes. + +LC_IDENTIFICATION +title "English locale for Zambia" +source "ANLoc" +contact "Martin Benjamin" +email "locales@africanlocalization.net" +language "English" +territory "Zambia" +revision "1.0" +date "2011-04-18" +% +category "en_ZM:2000";LC_IDENTIFICATION +category "en_ZM:2000";LC_CTYPE +category "en_ZM:2000";LC_COLLATE +category "en_ZM:2000";LC_TIME +category "en_ZM:2000";LC_NUMERIC +category "en_ZM:2000";LC_MONETARY +category "en_ZM:2000";LC_PAPER +category "en_ZM:2000";LC_MEASUREMENT +category "en_ZM:2000";LC_MESSAGES +category "en_ZM:2000";LC_NAME +category "en_ZM:2000";LC_ADDRESS +category "en_ZM:2000";LC_TELEPHONE +END LC_IDENTIFICATION + +LC_CTYPE +copy "i18n" + +translit_start +include "translit_combining";"" +translit_end +END LC_CTYPE + +LC_COLLATE +copy "iso14651_t1" +END LC_COLLATE + +LC_TIME +copy "en_GB" +END LC_TIME + +LC_NUMERIC +copy "en_GB" +END LC_NUMERIC + +LC_MONETARY +copy "bem_ZM" +END LC_MONETARY + +LC_PAPER +copy "bem_ZM" +END LC_PAPER + +LC_MEASUREMENT +copy "bem_ZM" +END LC_MEASUREMENT + +LC_MESSAGES +copy "bem_ZM" +END LC_MESSAGES + +LC_NAME +copy "en_GB" +END LC_NAME + +LC_ADDRESS +% %a%N%f%N%e %h%N%b %s%N%z%N%T%N%c%N +postal_fmt "/ +/ +" +% Zambia +country_name "" +% ZM +country_post "" +% ZM +country_ab2 "" +% ZMB +country_ab3 "" +country_num 894 +END LC_ADDRESS + +LC_TELEPHONE +copy "bem_ZM" +END LC_TELEPHONE diff --git a/localedata/locales/eo b/localedata/locales/eo new file mode 100644 index 0000000..42ec879 --- /dev/null +++ b/localedata/locales/eo @@ -0,0 +1,216 @@ +comment_char % +escape_char / + +% Esperanto language locale for ... +% Edmund GRIMLEY EVANS + +LC_IDENTIFICATION +title "Esperanto locale" +source "" +address "" +contact "" +email "debian-esperanto@lists.debian.org" +tel "" +fax "" +language "Esperanto" +territory "" +revision "draft" +date "2002-07-04" +% +category "eo:2000";LC_IDENTIFICATION +category "eo:2000";LC_CTYPE +category "eo:2000";LC_COLLATE +category "eo:2000";LC_TIME +category "eo:2000";LC_NUMERIC +category "eo:2000";LC_MONETARY +category "eo:2000";LC_MESSAGES +category "eo:2000";LC_PAPER +category "eo:2000";LC_NAME +category "eo:2000";LC_ADDRESS +category "eo:2000";LC_TELEPHONE + +END LC_IDENTIFICATION + +LC_CTYPE +copy "i18n" +END LC_CTYPE + +LC_COLLATE +copy "iso14651_t1" + +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol + +reorder-after + +reorder-after + +reorder-after + +reorder-after + +reorder-after + +reorder-after + + +reorder-after + ;;;IGNORE % Ĉ +reorder-after + ;;;IGNORE % ĉ +reorder-after + ;;;IGNORE % Ĝ +reorder-after + ;;;IGNORE % ĝ +reorder-after + ;;;IGNORE % Ĥ +reorder-after + ;;;IGNORE % Ä¥ +reorder-after + ;;;IGNORE % Ä´ +reorder-after + ;;;IGNORE % ĵ +reorder-after + ;;;IGNORE % Ŝ +reorder-after + ;;;IGNORE % ŝ +reorder-after + ;;;IGNORE % Ŭ +reorder-after + ;;;IGNORE % Å­ + +reorder-end + +END LC_COLLATE + +LC_MONETARY +int_curr_symbol "" % "EUR" +currency_symbol "" % "EUR" +% "" ne eblas en ISO-8859-3 +mon_decimal_point "" +mon_thousands_sep "" +mon_grouping 3;3 +positive_sign "" +negative_sign "" +int_frac_digits 2 +frac_digits 2 +p_cs_precedes 1 +p_sep_by_space 1 +n_cs_precedes 1 +n_sep_by_space 1 +p_sign_posn 1 +n_sign_posn 1 +END LC_MONETARY + +LC_NUMERIC +decimal_point "" +thousands_sep "" +grouping 0;0 +END LC_NUMERIC + +LC_TIME + +% "dim";"lun";"mar";"mer";"ĵaÅ­";"ven";"sab" +abday "";"";/ + "";"";/ + "";"";/ + "" + +% "dimanĉo";"lundo";"mardo";"merkredo";"ĵaÅ­do";"vendredo";"sabato" +day "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "" + +% "Jan";"Feb";"Mar";"Apr";"Maj";"Jun";"Jul";"AÅ­g";"Sep";"Okt";"Nov";"Dec" +abmon "";"";/ + "";"";/ + "";"";/ + "";"";/ + "";"";/ + "";"" + +% "Januaro";"Februaro";"Marto";"Aprilo";"Majo";"Junio"; +% "Julio";"AÅ­gusto";"Septembro";"Oktobro";"Novembro";"Decembro" +mon "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "" + +am_pm "";"" + +% "%a %d %b %Y %T %z" +d_t_fmt "" + +% "%Y-%m-%d" +d_fmt "" + +% "%T" +t_fmt "" + +t_fmt_ampm "" + +% date_fmt ? + +END LC_TIME + +LC_MESSAGES +% "^[JjYy].*" +yesexpr "" +% "^[Nn].*" +noexpr "" +END LC_MESSAGES + +LC_PAPER +height 297 +width 210 +END LC_PAPER + +LC_TELEPHONE +% "+%c %a %l" +tel_int_fmt "/ +" +% "00" +int_select "" +END LC_TELEPHONE + +LC_MEASUREMENT +measurement 1 +END LC_MEASUREMENT + +LC_NAME +% "%d%t%g%t%m%t%f" +name_fmt "/ +" +name_mr "" % "s-ro" +name_mrs "" % "s-ino" +name_ms "" % "s-ino" +END LC_NAME + +LC_ADDRESS +% "%f%N%a%N%d%N%b%N%s %h %e %r%N%%z %T%N%c%N" +postal_fmt "/ +/ +/ +/ +" +% "Esperanto" +lang_name "" +lang_ab "" % "eo" +lang_term "" % "epo" +END LC_ADDRESS diff --git a/localedata/locales/es_AR b/localedata/locales/es_AR index c757638..6787eb7 100644 --- a/localedata/locales/es_AR +++ b/localedata/locales/es_AR @@ -122,6 +122,8 @@ t_fmt_ampm "" date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 1 END LC_TIME LC_PAPER diff --git a/localedata/locales/es_BO b/localedata/locales/es_BO index c77bb1d..669827c 100644 --- a/localedata/locales/es_BO +++ b/localedata/locales/es_BO @@ -56,8 +56,7 @@ copy "es_ES" END LC_CTYPE LC_MESSAGES -yesexpr "" -noexpr "" +copy "es_ES" END LC_MESSAGES LC_MONETARY @@ -79,9 +78,7 @@ n_sign_posn 1 END LC_MONETARY LC_NUMERIC -decimal_point "" -thousands_sep "" -grouping 0;0 +copy "es_ES" END LC_NUMERIC LC_TIME @@ -122,6 +119,8 @@ t_fmt_ampm "" date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 2 END LC_TIME LC_PAPER diff --git a/localedata/locales/es_CL b/localedata/locales/es_CL index ff44fa8..d2c7814 100644 --- a/localedata/locales/es_CL +++ b/localedata/locales/es_CL @@ -56,8 +56,7 @@ copy "es_ES" END LC_CTYPE LC_MESSAGES -yesexpr "" -noexpr "" +copy "es_ES" END LC_MESSAGES LC_MONETARY @@ -79,9 +78,7 @@ n_sign_posn 1 END LC_MONETARY LC_NUMERIC -decimal_point "" -thousands_sep "" -grouping 0;0 +copy "es_ES" END LC_NUMERIC LC_TIME @@ -122,6 +119,8 @@ t_fmt_ampm "" date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 2 END LC_TIME LC_PAPER diff --git a/localedata/locales/es_CO b/localedata/locales/es_CO index 4c1de13..cd8e8d3 100644 --- a/localedata/locales/es_CO +++ b/localedata/locales/es_CO @@ -56,8 +56,7 @@ copy "es_ES" END LC_CTYPE LC_MESSAGES -yesexpr "" -noexpr "" +copy "es_ES" END LC_MESSAGES LC_MONETARY @@ -79,9 +78,7 @@ n_sign_posn 1 END LC_MONETARY LC_NUMERIC -decimal_point "" -thousands_sep "" -grouping 0;0 +copy "es_ES" END LC_NUMERIC LC_TIME diff --git a/localedata/locales/es_CR b/localedata/locales/es_CR index 6cff560..0031b59 100644 --- a/localedata/locales/es_CR +++ b/localedata/locales/es_CR @@ -47,8 +47,7 @@ copy "es_ES" END LC_CTYPE LC_MESSAGES -yesexpr "" -noexpr "" +copy "es_ES" END LC_MESSAGES LC_MONETARY diff --git a/localedata/locales/es_DO b/localedata/locales/es_DO index fcd0f9e..ebea84d 100644 --- a/localedata/locales/es_DO +++ b/localedata/locales/es_DO @@ -56,8 +56,7 @@ copy "es_ES" END LC_CTYPE LC_MESSAGES -yesexpr "" -noexpr "" +copy "es_ES" END LC_MESSAGES LC_MONETARY @@ -79,9 +78,7 @@ n_sign_posn 1 END LC_MONETARY LC_NUMERIC -decimal_point "" -thousands_sep "" -grouping 0;0 +copy "es_ES" END LC_NUMERIC LC_TIME @@ -122,6 +119,8 @@ t_fmt_ampm "" date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 2 END LC_TIME LC_PAPER diff --git a/localedata/locales/es_EC b/localedata/locales/es_EC index b8d4c8f..46718e6 100644 --- a/localedata/locales/es_EC +++ b/localedata/locales/es_EC @@ -56,8 +56,7 @@ copy "es_ES" END LC_CTYPE LC_MESSAGES -yesexpr "" -noexpr "" +copy "es_ES" END LC_MESSAGES LC_MONETARY @@ -79,9 +78,7 @@ n_sign_posn 1 END LC_MONETARY LC_NUMERIC -decimal_point "" -thousands_sep "" -grouping 0;0 +copy "es_ES" END LC_NUMERIC LC_TIME @@ -122,6 +119,8 @@ t_fmt_ampm "" date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 2 END LC_TIME LC_PAPER diff --git a/localedata/locales/es_ES b/localedata/locales/es_ES index fba4125..acab1fa 100644 --- a/localedata/locales/es_ES +++ b/localedata/locales/es_ES @@ -50,6 +50,18 @@ END LC_IDENTIFICATION LC_COLLATE % Copy the template from ISO/IEC 14651 copy "iso14651_t1" + +collating-symbol + +reorder-after + + +reorder-after + ;;;IGNORE +reorder-after + ;;;IGNORE + +reorder-end END LC_COLLATE LC_CTYPE @@ -85,8 +97,8 @@ END LC_MONETARY LC_NUMERIC decimal_point "" -thousands_sep "" -grouping 0;0 +thousands_sep "" +grouping 3;3 END LC_NUMERIC LC_TIME diff --git a/localedata/locales/es_GT b/localedata/locales/es_GT index 455b076..3d0087c 100644 --- a/localedata/locales/es_GT +++ b/localedata/locales/es_GT @@ -55,8 +55,7 @@ copy "es_ES" END LC_CTYPE LC_MESSAGES -yesexpr "" -noexpr "" +copy "es_ES" END LC_MESSAGES LC_MONETARY @@ -78,9 +77,7 @@ n_sign_posn 1 END LC_MONETARY LC_NUMERIC -decimal_point "" -thousands_sep "" -grouping 0;0 +copy "es_ES" END LC_NUMERIC LC_TIME @@ -121,6 +118,8 @@ t_fmt_ampm "" date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 2 END LC_TIME LC_PAPER diff --git a/localedata/locales/es_HN b/localedata/locales/es_HN index 53892b4..22d9a4f 100644 --- a/localedata/locales/es_HN +++ b/localedata/locales/es_HN @@ -56,8 +56,7 @@ copy "es_ES" END LC_CTYPE LC_MESSAGES -yesexpr "" -noexpr "" +copy "es_ES" END LC_MESSAGES LC_MONETARY @@ -79,9 +78,7 @@ n_sign_posn 1 END LC_MONETARY LC_NUMERIC -decimal_point "" -thousands_sep "" -grouping 0;0 +copy "es_ES" END LC_NUMERIC LC_TIME @@ -122,6 +119,8 @@ t_fmt_ampm "" date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 2 END LC_TIME LC_PAPER diff --git a/localedata/locales/es_MX b/localedata/locales/es_MX index 91dac23..ca2d85c 100644 --- a/localedata/locales/es_MX +++ b/localedata/locales/es_MX @@ -56,15 +56,14 @@ copy "es_ES" END LC_CTYPE LC_MESSAGES -yesexpr "" -noexpr "" +copy "es_ES" END LC_MESSAGES LC_MONETARY int_curr_symbol "" currency_symbol "" mon_decimal_point "" -mon_thousands_sep "" +mon_thousands_sep "" mon_grouping 3;3 positive_sign "" negative_sign "" @@ -80,8 +79,8 @@ END LC_MONETARY LC_NUMERIC decimal_point "" -thousands_sep "" -grouping 0;0 +thousands_sep "" +grouping 3;3 END LC_NUMERIC LC_TIME @@ -122,6 +121,8 @@ t_fmt_ampm "" date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 2 END LC_TIME LC_PAPER diff --git a/localedata/locales/es_NI b/localedata/locales/es_NI index ec984a7..e2da30c 100644 --- a/localedata/locales/es_NI +++ b/localedata/locales/es_NI @@ -47,8 +47,7 @@ copy "es_ES" END LC_CTYPE LC_MESSAGES -yesexpr "" -noexpr "" +copy "es_ES" END LC_MESSAGES LC_MONETARY @@ -70,9 +69,7 @@ n_sign_posn 1 END LC_MONETARY LC_NUMERIC -decimal_point "" -thousands_sep "" -grouping 0;0 +copy "es_ES" END LC_NUMERIC LC_TIME @@ -114,6 +111,8 @@ am_pm "";"" date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 2 END LC_TIME LC_PAPER diff --git a/localedata/locales/es_PA b/localedata/locales/es_PA index ac969a6..42f08e6 100644 --- a/localedata/locales/es_PA +++ b/localedata/locales/es_PA @@ -56,8 +56,7 @@ copy "es_ES" END LC_CTYPE LC_MESSAGES -yesexpr "" -noexpr "" +copy "es_ES" END LC_MESSAGES LC_MONETARY @@ -79,9 +78,7 @@ n_sign_posn 1 END LC_MONETARY LC_NUMERIC -decimal_point "" -thousands_sep "" -grouping 0;0 +copy "es_ES" END LC_NUMERIC LC_TIME @@ -122,6 +119,8 @@ t_fmt_ampm "" date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 2 END LC_TIME LC_PAPER diff --git a/localedata/locales/es_PE b/localedata/locales/es_PE index 634c927..f21b3e3 100644 --- a/localedata/locales/es_PE +++ b/localedata/locales/es_PE @@ -56,8 +56,7 @@ copy "es_ES" END LC_CTYPE LC_MESSAGES -yesexpr "" -noexpr "" +copy "es_ES" END LC_MESSAGES LC_MONETARY @@ -79,9 +78,7 @@ n_sign_posn 1 END LC_MONETARY LC_NUMERIC -decimal_point "" -thousands_sep "" -grouping 0;0 +copy "es_ES" END LC_NUMERIC LC_TIME @@ -123,6 +120,8 @@ am_pm "";"" date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 2 END LC_TIME LC_PAPER diff --git a/localedata/locales/es_PR b/localedata/locales/es_PR index 546b6c2..7996d67 100644 --- a/localedata/locales/es_PR +++ b/localedata/locales/es_PR @@ -47,8 +47,7 @@ copy "es_ES" END LC_CTYPE LC_MESSAGES -yesexpr "" -noexpr "" +copy "es_ES" END LC_MESSAGES LC_MONETARY @@ -70,9 +69,7 @@ n_sign_posn 1 END LC_MONETARY LC_NUMERIC -decimal_point "" -thousands_sep "" -grouping 0;0 +copy "es_ES" END LC_NUMERIC LC_TIME @@ -113,6 +110,8 @@ t_fmt_ampm "" date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 2 END LC_TIME LC_PAPER diff --git a/localedata/locales/es_PY b/localedata/locales/es_PY index 2c31b2f..dad6c65 100644 --- a/localedata/locales/es_PY +++ b/localedata/locales/es_PY @@ -56,8 +56,7 @@ copy "es_ES" END LC_CTYPE LC_MESSAGES -yesexpr "" -noexpr "" +copy "es_ES" END LC_MESSAGES LC_MONETARY @@ -79,9 +78,7 @@ n_sign_posn 1 END LC_MONETARY LC_NUMERIC -decimal_point "" -thousands_sep "" -grouping 0;0 +copy "es_ES" END LC_NUMERIC LC_TIME @@ -122,6 +119,8 @@ t_fmt_ampm "" date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 2 END LC_TIME LC_PAPER diff --git a/localedata/locales/es_SV b/localedata/locales/es_SV index 7b17304..78fcc20 100644 --- a/localedata/locales/es_SV +++ b/localedata/locales/es_SV @@ -56,8 +56,7 @@ copy "es_ES" END LC_CTYPE LC_MESSAGES -yesexpr "" -noexpr "" +copy "es_ES" END LC_MESSAGES LC_MONETARY @@ -79,9 +78,7 @@ n_sign_posn 1 END LC_MONETARY LC_NUMERIC -decimal_point "" -thousands_sep "" -grouping 0;0 +copy "es_ES" END LC_NUMERIC LC_TIME @@ -122,6 +119,8 @@ t_fmt_ampm "" date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 2 END LC_TIME LC_PAPER diff --git a/localedata/locales/es_US b/localedata/locales/es_US index 71e8ac8..04945f3 100644 --- a/localedata/locales/es_US +++ b/localedata/locales/es_US @@ -174,6 +174,8 @@ t_fmt_ampm "" date_fmt "/ / " +% FIXME +first_weekday 1 END LC_TIME LC_PAPER diff --git a/localedata/locales/es_UY b/localedata/locales/es_UY index 8b7ed0d..1a8de9c 100644 --- a/localedata/locales/es_UY +++ b/localedata/locales/es_UY @@ -56,8 +56,7 @@ copy "es_ES" END LC_CTYPE LC_MESSAGES -yesexpr "" -noexpr "" +copy "es_ES" END LC_MESSAGES LC_MONETARY @@ -79,9 +78,7 @@ n_sign_posn 1 END LC_MONETARY LC_NUMERIC -decimal_point "" -thousands_sep "" -grouping 0;0 +copy "es_ES" END LC_NUMERIC LC_TIME @@ -122,6 +119,8 @@ t_fmt_ampm "" date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 2 END LC_TIME LC_PAPER diff --git a/localedata/locales/es_VE b/localedata/locales/es_VE index ca6637a..a6906b0 100644 --- a/localedata/locales/es_VE +++ b/localedata/locales/es_VE @@ -56,8 +56,7 @@ copy "es_ES" END LC_CTYPE LC_MESSAGES -yesexpr "" -noexpr "" +copy "es_ES" END LC_MESSAGES LC_MONETARY @@ -79,9 +78,7 @@ n_sign_posn 1 END LC_MONETARY LC_NUMERIC -decimal_point "" -thousands_sep "" -grouping 0;0 +copy "es_ES" END LC_NUMERIC LC_TIME @@ -123,6 +120,8 @@ t_fmt_ampm "/ date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 2 END LC_TIME LC_PAPER diff --git a/localedata/locales/et_EE b/localedata/locales/et_EE index 33d3110..0020577 100644 --- a/localedata/locales/et_EE +++ b/localedata/locales/et_EE @@ -55,2067 +55,48 @@ category "et_EE:2000";LC_TELEPHONE END LC_IDENTIFICATION LC_COLLATE - -% Base collation scheme: 1994-03-22 - -% Ordering algorithm: -% 1. Spaces and hyphen (but not soft -% hyphen) before punctuation -% characters, punctuation characters -% before numbers, -% numbers before letters. -% 2. Letters with diacritical marks are -% members of equivalence classes -% 3. A distinction is made with regards -% to case as noted below. -% 4. Special characters are ignored -% when comparing letters, but then -% they are considered -% 5. The alphabets are sorted in order -% of first appearance in ISO 10646: -% Latin, Greek, Cyrillic, etc. -% -% According to Greek specifications, -% the steps 2. and 3. above are reversed -% for the Greek script - -% collating symbols - -% The collating symbol naming is -% mostly taken from ISO 10646-1, -% for example the case and accent -% names are from this standard. - -collating-symbol -collating-symbol -collating-symbol -collating-symbol - -% and -% are for cases like Danish -% and Spanish being treated -% as one letter. - -% The ...... collating -% symbols have defined weights as -% the last character in a group of -% Latin letters. They are used -% to specify deltas by locales using -% a locale as the default ordering -% and by "replace-after" statements -% specifying the changed placement -% in an ordering of a character. - -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol - -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol - -% letter;accent;case;specials - -order_start forward;backward/ - ;forward;position - -% or letters first: - - - - - - -% Accents: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;;;IGNORE - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; -<"=> IGNORE;IGNORE;IGNORE;<"=> - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; -UNDEFINED IGNORE;IGNORE;IGNORE - - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;; - ;; - ;; - ;; - ;; - ;; - ;; - ;; - ;; - ;; - ;;;IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;; - ;;; - ;;; - ;;; - ;;; - ;;; - ;;; - ;;; - ;;; - ;;; - ;;; - ;;; - ;;; - ;;; - ;; - ;; - ;; - ;; - ;; - ;; - ;; - ;; - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - -% Arabic collating - - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - -% katakana/hiragana sorting -% base is katakana, as this is present in most charsets -% normal before voiced before semi-voiced -% small vocals before normal vocals -% katakana before hiragana - - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - -order_end +define UPPERCASE_FIRST +copy "iso14651_t1" + +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol + +reorder-after + + + +reorder-after + + + + + +reorder-after + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE +reorder-after + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + +reorder-after + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE +reorder-after + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + +reorder-end END LC_COLLATE @@ -2128,8 +109,8 @@ translit_end END LC_CTYPE LC_MONETARY -int_curr_symbol "" -currency_symbol "" +int_curr_symbol "" +currency_symbol "" mon_decimal_point "" mon_thousands_sep "" mon_grouping 3;3 diff --git a/localedata/locales/eu_ES b/localedata/locales/eu_ES index f433aed..36b7600 100644 --- a/localedata/locales/eu_ES +++ b/localedata/locales/eu_ES @@ -131,6 +131,7 @@ t_fmt_ampm "" date_fmt "/ / " +first_weekday 2 END LC_TIME LC_PAPER diff --git a/localedata/locales/eu_FR b/localedata/locales/eu_FR new file mode 100644 index 0000000..2abc1fe --- /dev/null +++ b/localedata/locales/eu_FR @@ -0,0 +1,83 @@ +comment_char % +escape_char / +% +% Basque Language Locale for France +% Language: eu +% Territory: FR +% Revision: 1.0 +% Date: 2004-06-24 +% Users: general +% Charset: ISO-8859-1 +% Distribution and use is free, also +% for commercial purposes. + +LC_IDENTIFICATION +title "Basque locale for France" +source "Christian Perrier and the Debian Project" +address "" +contact "Christian Perrier" +email "bubulle@debian.org" +tel "" +fax "" +language "Basque" +territory "France" +revision "1.0" +date "2004-06-24" +% +category "eu_FR:2000";LC_IDENTIFICATION +category "eu_FR:2000";LC_CTYPE +category "eu_FR:2000";LC_COLLATE +category "eu_FR:2000";LC_TIME +category "eu_FR:2000";LC_NUMERIC +category "eu_FR:2000";LC_MONETARY +category "eu_FR:2000";LC_MESSAGES +category "eu_FR:2000";LC_PAPER +category "eu_FR:2000";LC_NAME +category "eu_FR:2000";LC_ADDRESS +category "eu_FR:2000";LC_TELEPHONE + +END LC_IDENTIFICATION + +LC_COLLATE +copy "iso14651_t1" +END LC_COLLATE + +LC_CTYPE +copy "i18n" +END LC_CTYPE + +LC_MESSAGES +copy "eu_ES" +END LC_MESSAGES + +LC_MONETARY +copy "fr_FR" +END LC_MONETARY + +LC_NUMERIC +copy "fr_FR" +END LC_NUMERIC + +LC_TIME +copy "eu_ES" +END LC_TIME + +LC_PAPER +copy "fr_FR" +END LC_PAPER + +LC_TELEPHONE +copy "fr_FR" +END LC_TELEPHONE + +LC_MEASUREMENT +copy "fr_FR" +END LC_MEASUREMENT + +LC_NAME +copy "eu_ES" +END LC_NAME + +LC_ADDRESS +copy "fr_FR" +END LC_ADDRESS diff --git a/localedata/locales/eu_FR@euro b/localedata/locales/eu_FR@euro new file mode 100644 index 0000000..5b0d872 --- /dev/null +++ b/localedata/locales/eu_FR@euro @@ -0,0 +1,83 @@ +comment_char % +escape_char / +% +% Basque Language Locale for France +% Language: eu +% Territory: FR +% Revision: 1.0 +% Date: 2004-06-24 +% Users: general +% Charset: ISO-8859-15 +% Distribution and use is free, also +% for commercial purposes. + +LC_IDENTIFICATION +title "Basque locale for France" +source "Christian Perrier and the Debian Project" +address "" +contact "Christian Perrier" +email "bubulle@debian.org" +tel "" +fax "" +language "Basque" +territory "France" +revision "1.0" +date "2004-06-24" +% +category "eu_FR:2000";LC_IDENTIFICATION +category "eu_FR:2000";LC_CTYPE +category "eu_FR:2000";LC_COLLATE +category "eu_FR:2000";LC_TIME +category "eu_FR:2000";LC_NUMERIC +category "eu_FR:2000";LC_MONETARY +category "eu_FR:2000";LC_MESSAGES +category "eu_FR:2000";LC_PAPER +category "eu_FR:2000";LC_NAME +category "eu_FR:2000";LC_ADDRESS +category "eu_FR:2000";LC_TELEPHONE + +END LC_IDENTIFICATION + +LC_COLLATE +copy "iso14651_t1" +END LC_COLLATE + +LC_CTYPE +copy "i18n" +END LC_CTYPE + +LC_MESSAGES +copy "eu_ES" +END LC_MESSAGES + +LC_MONETARY +copy "fr_FR" +END LC_MONETARY + +LC_NUMERIC +copy "fr_FR" +END LC_NUMERIC + +LC_TIME +copy "eu_ES" +END LC_TIME + +LC_PAPER +copy "fr_FR" +END LC_PAPER + +LC_TELEPHONE +copy "fr_FR" +END LC_TELEPHONE + +LC_MEASUREMENT +copy "fr_FR" +END LC_MEASUREMENT + +LC_NAME +copy "eu_ES" +END LC_NAME + +LC_ADDRESS +copy "fr_FR" +END LC_ADDRESS diff --git a/localedata/locales/ff_SN b/localedata/locales/ff_SN new file mode 100644 index 0000000..976c1fd --- /dev/null +++ b/localedata/locales/ff_SN @@ -0,0 +1,196 @@ +comment_char % +escape_char / +% Charset: UTF-8 +% Authors: +% 2011-03-28, admin@pulaar-fulfulde.org +% 2011-03-28, info@2xlibre.net +% Distribution and use is free, also +% for commercial purposes. + +LC_IDENTIFICATION +title "Fulah locale for Senegal" +source "Pular-Fulfulde.org" +contact "Ibrahima Sarr" +email "admin@pulaar-fulfulde.org" +language "ff" +territory "Senegal" +revision "1.0" +date "2011-03-28" +% +category "ff_SN:2000";LC_IDENTIFICATION +category "ff_SN:2000";LC_CTYPE +category "ff_SN:2000";LC_COLLATE +category "ff_SN:2000";LC_TIME +category "ff_SN:2000";LC_NUMERIC +category "ff_SN:2000";LC_MONETARY +category "ff_SN:2000";LC_PAPER +category "ff_SN:2000";LC_MEASUREMENT +category "ff_SN:2000";LC_MESSAGES +category "ff_SN:2000";LC_NAME +category "ff_SN:2000";LC_ADDRESS +category "ff_SN:2000";LC_TELEPHONE +END LC_IDENTIFICATION + +LC_CTYPE +copy "i18n" + +translit_start +include "translit_combining";"" +translit_end +END LC_CTYPE + +LC_COLLATE +copy "iso14651_t1" +END LC_COLLATE + +LC_TIME +% siilo, colte, mbooy, seeɗto, duujal, korse, morso, juko, siilto, yarkomaa, jolal, bowte +mon "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "" +% sii, col, mbo, see, duu, kor, mor, juk, slt, yar, jol, bow +abmon "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "" +% dewo, aaɓnde, mawbaare, njeslaare, naasaande, mawnde, hoore-biir +day "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "" +% dew, aaɓ, maw, nje, naa, mwd, hbi +abday "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "" +week 7;19971129;1 +first_weekday 1 +% %a %d %b %Y %R %Z +d_t_fmt "/ +" +% %d/%m/%Y +d_fmt "" +% %R +t_fmt "" +% subaka, kikiiɗe +am_pm "";/ + "" +END LC_TIME + +LC_NUMERIC +% , +decimal_point "" +% . +thousands_sep "" +grouping 3 +END LC_NUMERIC + +LC_MONETARY +% CFA +currency_symbol "" +% XOF +int_curr_symbol "" +% . +mon_decimal_point "" +% , +mon_thousands_sep "" +mon_grouping 3 +positive_sign "" +% - +negative_sign "" +frac_digits 2 +int_frac_digits 2 +p_cs_precedes 0 +p_sep_by_space 1 +n_cs_precedes 0 +n_sep_by_space 1 +p_sign_posn 1 +n_sign_posn 1 +END LC_MONETARY + +LC_PAPER +height 297 +width 210 +END LC_PAPER + +LC_MEASUREMENT +measurement 1 +END LC_MEASUREMENT + +LC_MESSAGES +% ^[yYeE].* +yesexpr "" +% ^[nNaA].* +noexpr "" +END LC_MESSAGES + +LC_NAME +% %p%t%g%m%t%f +name_fmt "" +% kaddol +name_gen "" +% sokna +name_miss "" +% ceerno +name_mr "" +% sokna +name_mrs "" +% sokna +name_ms "" +END LC_NAME + +LC_ADDRESS +% %a%N%f%N%d%N%b%N%h %s %e %r%N%T, %S %z%N%c%N +postal_fmt "/ +/ +/ +" +% Senegaal +country_name "" +% SN +country_post "" +% SN +country_ab2 "" +% SEN +country_ab3 "" +country_num 686 +% Pulaar +lang_name "" +% ff +lang_ab "" +END LC_ADDRESS + +LC_TELEPHONE +% %c %a %l +tel_int_fmt "" +% %a %l +tel_dom_fmt "" +% 00 +int_select "" +% 221 +int_prefix "" +END LC_TELEPHONE + diff --git a/localedata/locales/fi_FI b/localedata/locales/fi_FI index c360487..acc9ce6 100644 --- a/localedata/locales/fi_FI +++ b/localedata/locales/fi_FI @@ -63,60 +63,65 @@ reorder-after -reorder-after +reorder-after ;;;IGNORE - ;;;IGNORE ;;;IGNORE - ;;;IGNORE ;;;IGNORE - ;;;IGNORE ;;;IGNORE - ;;;IGNORE ;;;IGNORE - ;;;IGNORE ;;;IGNORE - ;;;IGNORE ;;;IGNORE - ;;;IGNORE ;;;IGNORE - ;;;IGNORE ;;;IGNORE - ;;;IGNORE ;;;IGNORE +reorder-after + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE ;;;IGNORE -reorder-after +reorder-after ;;; - ;;; ;;; - ;;; ;;; - ;;; ;;; - ;;; ;;; - ;;; ;;; - ;;; ;;; - ;;; ;;; +reorder-after + ;;; + ;;; + ;;; + ;;; + ;;; + ;;; + ;;; ;;; reorder-after ;;;IGNORE +reorder-after ;;;IGNORE % Present in iso14651_t1, but these definitions seem to have been % removed from latest iso14651 tables. -reorder-after +reorder-after "";"";"";IGNORE +reorder-after "";"";"";IGNORE reorder-after ;;;IGNORE - ;;;IGNORE ;;;IGNORE +reorder-after + ;;;IGNORE ;;;IGNORE reorder-end diff --git a/localedata/locales/fo_FO b/localedata/locales/fo_FO index c19c2ea..fea4b09 100644 --- a/localedata/locales/fo_FO +++ b/localedata/locales/fo_FO @@ -95,14 +95,18 @@ mon "";/ "";/ "";/ "" -d_t_fmt "" +d_t_fmt "/ +/ +" d_fmt "" t_fmt "" am_pm "";"" t_fmt_ampm "" -date_fmt "/ -/ -" +date_fmt "/ +/ +/ +/ +" END LC_TIME LC_MESSAGES diff --git a/localedata/locales/fr_BE b/localedata/locales/fr_BE index f9c911a..5abe6d7 100644 --- a/localedata/locales/fr_BE +++ b/localedata/locales/fr_BE @@ -42,6 +42,7 @@ category "fr_BE:2000";LC_PAPER category "fr_BE:2000";LC_NAME category "fr_BE:2000";LC_ADDRESS category "fr_BE:2000";LC_TELEPHONE +category "fr_BE:2000";LC_MEASUREMENT END LC_IDENTIFICATION @@ -117,9 +118,10 @@ d_fmt "" t_fmt "" am_pm "";"" t_fmt_ampm "" -date_fmt "/ -/ -" +date_fmt "/ +/ +/ +" week 7;19971130;4 first_weekday 2 @@ -146,8 +148,7 @@ measurement 1 END LC_MEASUREMENT LC_NAME -name_fmt "/ -" +copy "fr_FR" END LC_NAME LC_ADDRESS @@ -159,4 +160,13 @@ postal_fmt "/ country_ab2 "" country_ab3 "" country_num 056 +country_name "" +country_car "" +% FIXME +country_post "" +country_isbn 2 +lang_name "" +lang_ab "" +lang_term "" +lang_lib "" END LC_ADDRESS diff --git a/localedata/locales/fr_CA b/localedata/locales/fr_CA index 992a4b1..aff339a 100644 --- a/localedata/locales/fr_CA +++ b/localedata/locales/fr_CA @@ -43,6 +43,7 @@ category "fr_CA:2000";LC_PAPER category "fr_CA:2000";LC_NAME category "fr_CA:2000";LC_ADDRESS category "fr_CA:2000";LC_TELEPHONE +category "fr_CA:2000";LC_MEASUREMENT END LC_IDENTIFICATION @@ -118,9 +119,12 @@ d_fmt "" t_fmt "" am_pm "";"" t_fmt_ampm "" -date_fmt "/ -/ -" +date_fmt "/ +/ +/ +" +week 7;19971130;4 +first_weekday 2 END LC_TIME LC_PAPER @@ -136,8 +140,7 @@ copy "en_CA" END LC_MEASUREMENT LC_NAME -name_fmt "/ -" +copy "fr_FR" END LC_NAME LC_ADDRESS @@ -149,6 +152,10 @@ postal_fmt "/ country_ab2 "" country_ab3 "" country_num 124 +country_name "" +country_car "" +country_post "" +country_isbn 2 lang_name "" lang_ab "" lang_term "" diff --git a/localedata/locales/fr_CH b/localedata/locales/fr_CH index 7cb6282..957b438 100644 --- a/localedata/locales/fr_CH +++ b/localedata/locales/fr_CH @@ -43,6 +43,7 @@ category "fr_CH:2000";LC_PAPER category "fr_CH:2000";LC_NAME category "fr_CH:2000";LC_ADDRESS category "fr_CH:2000";LC_TELEPHONE +category "fr_CH:2000";LC_MEASUREMENT END LC_IDENTIFICATION @@ -64,9 +65,7 @@ copy "de_CH" END LC_MONETARY LC_NUMERIC -decimal_point "" -thousands_sep "" -grouping 0;0 +copy "de_CH" END LC_NUMERIC LC_TIME @@ -104,9 +103,12 @@ d_fmt "" t_fmt "" am_pm "";"" t_fmt_ampm "" -date_fmt "/ -/ -" +date_fmt "/ +/ +/ +" +week 7;19971130;4 +first_weekday 2 END LC_TIME LC_PAPER @@ -128,8 +130,7 @@ measurement 1 END LC_MEASUREMENT LC_NAME -name_fmt "/ -" +copy "fr_FR" END LC_NAME LC_ADDRESS @@ -141,4 +142,12 @@ postal_fmt "/ country_ab2 "" country_ab3 "" country_num 756 +country_name "" +country_car "" +country_post "" +country_isbn 2 +lang_name "" +lang_ab "" +lang_term "" +lang_lib "" END LC_ADDRESS diff --git a/localedata/locales/fr_FR b/localedata/locales/fr_FR index dd54bcf..8b4c61c 100644 --- a/localedata/locales/fr_FR +++ b/localedata/locales/fr_FR @@ -44,6 +44,7 @@ category "fr_FR:2000";LC_PAPER category "fr_FR:2000";LC_NAME category "fr_FR:2000";LC_ADDRESS category "fr_FR:2000";LC_TELEPHONE +category "fr_FR:2000";LC_MEASUREMENT END LC_IDENTIFICATION @@ -137,9 +138,10 @@ d_fmt "" t_fmt "" am_pm "";"" t_fmt_ampm "" -date_fmt "/ -/ -" +date_fmt "/ +/ +/ +" week 7;19971130;4 first_weekday 2 @@ -166,6 +168,11 @@ END LC_MEASUREMENT LC_NAME name_fmt "/ " +name_gen "" +name_mr "" +name_mrs "" +name_miss "" +name_ms "" END LC_NAME LC_ADDRESS @@ -177,4 +184,12 @@ postal_fmt "/ country_ab2 "" country_ab3 "" country_num 250 +country_name "" +country_car "" +country_post "" +country_isbn 2 +lang_name "" +lang_ab "" +lang_term "" +lang_lib "" END LC_ADDRESS diff --git a/localedata/locales/fr_LU b/localedata/locales/fr_LU index 80b29b6..86a8d80 100644 --- a/localedata/locales/fr_LU +++ b/localedata/locales/fr_LU @@ -42,6 +42,7 @@ category "fr_LU:2000";LC_PAPER category "fr_LU:2000";LC_NAME category "fr_LU:2000";LC_ADDRESS category "fr_LU:2000";LC_TELEPHONE +category "fr_LU:2000";LC_MEASUREMENT END LC_IDENTIFICATION @@ -78,8 +79,8 @@ END LC_MONETARY LC_NUMERIC decimal_point "" -thousands_sep "" -grouping 0;0 +thousands_sep "" +grouping 3;3 END LC_NUMERIC LC_TIME @@ -117,9 +118,12 @@ d_fmt "" t_fmt "" am_pm "";"" t_fmt_ampm "" -date_fmt "/ -/ -" +date_fmt "/ +/ +/ +" +week 7;19971130;4 +first_weekday 2 END LC_TIME LC_PAPER @@ -141,8 +145,7 @@ measurement 1 END LC_MEASUREMENT LC_NAME -name_fmt "/ -" +copy "fr_FR" END LC_NAME LC_ADDRESS @@ -154,4 +157,12 @@ postal_fmt "/ country_ab2 "" country_ab3 "" country_num 442 +country_name "" +country_car "" +country_post "" +country_isbn 2 +lang_name "" +lang_ab "" +lang_term "" +lang_lib "" END LC_ADDRESS diff --git a/localedata/locales/ga_IE b/localedata/locales/ga_IE index a8086a6..3b688cc 100644 --- a/localedata/locales/ga_IE +++ b/localedata/locales/ga_IE @@ -117,6 +117,8 @@ t_fmt_ampm "" date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 2 END LC_TIME LC_MESSAGES diff --git a/localedata/locales/gd_GB b/localedata/locales/gd_GB index a83839c..0c08cb6 100644 --- a/localedata/locales/gd_GB +++ b/localedata/locales/gd_GB @@ -122,6 +122,8 @@ d_fmt "" t_fmt "" am_pm "";"" t_fmt_ampm "" +% FIXME: found in CLDR +first_weekday 2 END LC_TIME LC_MESSAGES diff --git a/localedata/locales/gez_ER b/localedata/locales/gez_ER index 229c9b8..799c23f 100644 --- a/localedata/locales/gez_ER +++ b/localedata/locales/gez_ER @@ -215,5 +215,7 @@ date_fmt "/ / " % +% FIXME: found in CLDR +first_weekday 7 END LC_TIME % diff --git a/localedata/locales/gez_ET b/localedata/locales/gez_ET index 24e09f6..1f94e19 100644 --- a/localedata/locales/gez_ET +++ b/localedata/locales/gez_ET @@ -216,5 +216,7 @@ date_fmt "/ / " % +% FIXME: found in CLDR +first_weekday 7 END LC_TIME % diff --git a/localedata/locales/gl_ES b/localedata/locales/gl_ES index 4efe5c1..7c1ed5b 100644 --- a/localedata/locales/gl_ES +++ b/localedata/locales/gl_ES @@ -121,6 +121,8 @@ t_fmt_ampm "" date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 2 END LC_TIME LC_PAPER diff --git a/localedata/locales/gu_IN b/localedata/locales/gu_IN index 2c3d729..a99f5db 100644 --- a/localedata/locales/gu_IN +++ b/localedata/locales/gu_IN @@ -71,7 +71,7 @@ LC_MONETARY % for IBM Class for Unicode/Java % int_curr_symbol "" -currency_symbol "" +currency_symbol "" mon_decimal_point "" mon_thousands_sep "" mon_grouping 3 @@ -178,6 +178,8 @@ t_fmt_ampm "/ date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 1 END LC_TIME LC_MESSAGES diff --git a/localedata/locales/gv_GB b/localedata/locales/gv_GB index 16efd8d..43951df 100644 --- a/localedata/locales/gv_GB +++ b/localedata/locales/gv_GB @@ -131,6 +131,8 @@ t_fmt_ampm "" date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 2 END LC_TIME LC_MESSAGES diff --git a/localedata/locales/he_IL b/localedata/locales/he_IL index e744d47..1275197 100644 --- a/localedata/locales/he_IL +++ b/localedata/locales/he_IL @@ -123,6 +123,8 @@ t_fmt_ampm "/ / " +% FIXME: found in CLDR +first_weekday 1 END LC_TIME LC_MESSAGES diff --git a/localedata/locales/hi_IN b/localedata/locales/hi_IN index 5aca5d9..f6b9f56 100644 --- a/localedata/locales/hi_IN +++ b/localedata/locales/hi_IN @@ -69,7 +69,7 @@ LC_MONETARY % for IBM Class for Unicode/Java % int_curr_symbol "" -currency_symbol "" +currency_symbol "" mon_decimal_point "" mon_thousands_sep "" mon_grouping 3 @@ -173,6 +173,8 @@ t_fmt_ampm "/ date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 1 END LC_TIME diff --git a/localedata/locales/hr_HR b/localedata/locales/hr_HR index f4f1cc4..2b950ab 100644 --- a/localedata/locales/hr_HR +++ b/localedata/locales/hr_HR @@ -48,10 +48,25 @@ category "hr_HR:2000";LC_TELEPHONE END LC_IDENTIFICATION LC_COLLATE -collating-element from "" -collating-element from "" -collating-element from "" -collating-element from "" +copy "iso14651_t1" + +collating-symbol +collating-symbol + +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol + +collating-symbol +collating-symbol +collating-symbol + +collating-element from "" +collating-element from "" +collating-element from "" +collating-element from "" collating-element from "" collating-element from "" collating-element from "" @@ -61,2078 +76,71 @@ collating-element from "" collating-element from "" collating-element from "" -% Base collation scheme: 1994-03-22 - -% Ordering algorithm: -% 1. Spaces and hyphen (but not soft -% hyphen) before punctuation -% characters, punctuation characters -% before numbers, -% numbers before letters. -% 2. Letters with diacritical marks are -% members of equivalence classes -% 3. A distinction is made with regards -% to case as noted below. -% 4. Special characters are ignored -% when comparing letters, but then -% they are considered -% 5. The alphabets are sorted in order -% of first appearance in ISO 10646: -% Latin, Greek, Cyrillic, etc. -% -% According to Greek specifications, -% the steps 2. and 3. above are reversed -% for the Greek script - -% collating symbols - -% The collating symbol naming is -% mostly taken from ISO 10646-1, -% for example the case and accent -% names are from this standard. - -collating-symbol -collating-symbol -collating-symbol -collating-symbol - -% and -% are for cases like Danish -% and Spanish being treated -% as one letter. - -% The ...... collating -% symbols have defined weights as -% the last character in a group of -% Latin letters. They are used -% to specify deltas by locales using -% a locale as the default ordering -% and by "replace-after" statements -% specifying the changed placement -% in an ordering of a character. - -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol - -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol - -% letter;accent;case;specials - -order_start forward;backward/ - ;forward;position - -% or letters first: - - - - - - -% Accents: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;;;IGNORE - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; -<"=> IGNORE;IGNORE;IGNORE;<"=> - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; -UNDEFINED IGNORE;IGNORE;IGNORE - - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - -% Arabic collating - - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - -% katakana/hiragana sorting -% base is katakana, as this is present in most charsets -% normal before voiced before semi-voiced -% small vocals before normal vocals -% katakana before hiragana - - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - -order_end +reorder-after + + + +reorder-after + + + +reorder-after + + + +reorder-after + + +reorder-after + + +reorder-after + + +reorder-after + + +reorder-after + ;;;IGNORE + ;;;IGNORE +reorder-after + ;;;IGNORE + ;;;IGNORE + +reorder-after + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE +reorder-after + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + +reorder-after + ;;;IGNORE + ;;;IGNORE +reorder-after + ;;;IGNORE + ;;;IGNORE + +reorder-after + ;;;IGNORE + ;;;IGNORE +reorder-after + ;;;IGNORE + ;;;IGNORE + +reorder-after + ;;;IGNORE +reorder-after + ;;;IGNORE + +reorder-after + ;;;IGNORE +reorder-after + ;;;IGNORE + +reorder-end END LC_COLLATE @@ -2212,6 +220,8 @@ t_fmt_ampm "" date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 2 END LC_TIME LC_PAPER diff --git a/localedata/locales/hsb_DE b/localedata/locales/hsb_DE index 0929897..780f728 100644 --- a/localedata/locales/hsb_DE +++ b/localedata/locales/hsb_DE @@ -34,7 +34,14 @@ category "i18n:1997";LC_TELEPHONE END LC_IDENTIFICATION +LC_CTYPE +copy "i18n" +END LC_CTYPE + LC_COLLATE +% Copy the template from ISO/IEC 14651 +copy "iso14651_t1" + collating-element from "" collating-element from "" collating-element from "" @@ -44,2081 +51,122 @@ collating-element from "" collating-element from "" collating-element from "" -% Base collation scheme: 1994-03-22 - -% Ordering algorithm: -% 1. Spaces and hyphen (but not soft -% hyphen) before punctuation -% characters, punctuation characters -% before numbers, -% numbers before letters. -% 2. Letters with diacritical marks are -% members of equivalence classes -% 3. A distinction is made with regards -% to case as noted below. -% 4. Special characters are ignored -% when comparing letters, but then -% they are considered -% 5. The alphabets are sorted in order -% of first appearance in ISO 10646: -% Latin, Greek, Cyrillic, etc. -% -% According to Greek specifications, -% the steps 2. and 3. above are reversed -% for the Greek script - -% collating symbols - -% The collating symbol naming is -% mostly taken from ISO 10646-1, -% for example the case and accent -% names are from this standard. - -collating-symbol -collating-symbol -collating-symbol -collating-symbol - -% and -% are for cases like Danish -% and Spanish being treated -% as one letter. - -% The ...... collating -% symbols have defined weights as -% the last character in a group of -% Latin letters. They are used -% to specify deltas by locales using -% a locale as the default ordering -% and by "replace-after" statements -% specifying the changed placement -% in an ordering of a character. - -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol - -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol - -% letter;accent;case;specials - -order_start forward;backward/ - ;forward;position - -% or letters first: +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol + +collating-symbol +collating-symbol + +reorder-after + + + +reorder-after + + +reorder-after + + +reorder-after + + +reorder-after + + +reorder-after + + +reorder-after + + +% Is oacute really used? +reorder-after + + +reorder-after + + +reorder-after + + +reorder-after + + +reorder-after + + +reorder-after + ;;;IGNORE +reorder-after + ;;;IGNORE + +reorder-after + ;;;IGNORE + ;;;IGNORE +reorder-after + ;;;IGNORE + ;;;IGNORE + +reorder-after + ;;;IGNORE +reorder-after + ;;;IGNORE + +reorder-after + ;;;IGNORE + ;;;IGNORE +reorder-after + ;;;IGNORE + ;;;IGNORE + +reorder-after + ;;;IGNORE +reorder-after + ;;;IGNORE + +reorder-after + ;;;IGNORE +reorder-after + ;;;IGNORE + +reorder-after + ;;;IGNORE +reorder-after + ;;;IGNORE + +reorder-after + ;;;IGNORE +reorder-after + ;;;IGNORE + +reorder-after + ;;;IGNORE +reorder-after + ;;;IGNORE + +reorder-after + ;;;IGNORE +reorder-after + ;;;IGNORE + +reorder-after + ;;;IGNORE +reorder-after + ;;;IGNORE - - - - - -% Accents: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;;;IGNORE - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; -<"=> IGNORE;IGNORE;IGNORE;<"=> - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; -UNDEFINED IGNORE;IGNORE;IGNORE - - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - -% Arabic collating - - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - -% katakana/hiragana sorting -% base is katakana, as this is present in most charsets -% normal before voiced before semi-voiced -% small vocals before normal vocals -% katakana before hiragana - - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - -order_end +reorder-end END LC_COLLATE -LC_CTYPE -copy "i18n" -END LC_CTYPE - LC_MESSAGES yesexpr "" noexpr "" diff --git a/localedata/locales/hy_AM b/localedata/locales/hy_AM index d479730..737b1a7 100644 --- a/localedata/locales/hy_AM +++ b/localedata/locales/hy_AM @@ -147,6 +147,8 @@ d_fmt "" t_fmt "" am_pm "";"" t_fmt_ampm "" +% FIXME: found in CLDR +first_weekday 2 END LC_TIME LC_MESSAGES diff --git a/localedata/locales/ia b/localedata/locales/ia new file mode 100644 index 0000000..8a2dc58 --- /dev/null +++ b/localedata/locales/ia @@ -0,0 +1,139 @@ +comment_char % +escape_char / +% +% Interlingua Language Locale + +LC_IDENTIFICATION +title "Interlingua locale" +source "" +address "" +contact "" +email "mardy@despammed.com" +tel "" +fax "" +language "Interlingua" +territory "" +revision "1.0" +date "2003-11-25" +% +category "ia:2000";LC_IDENTIFICATION +category "ia:2000";LC_CTYPE +category "ia:2000";LC_COLLATE +category "ia:2000";LC_TIME +category "ia:2000";LC_NUMERIC +category "ia:2000";LC_MONETARY +category "ia:2000";LC_MESSAGES +category "ia:2000";LC_PAPER +category "ia:2000";LC_NAME +category "ia:2000";LC_ADDRESS +category "ia:2000";LC_TELEPHONE + +END LC_IDENTIFICATION + +LC_COLLATE +copy "iso14651_t1" +END LC_COLLATE + +LC_CTYPE +copy "i18n" +END LC_CTYPE + +LC_MESSAGES +yesexpr "" +noexpr "" +END LC_MESSAGES + +LC_MONETARY +int_curr_symbol "" +currency_symbol "" +mon_decimal_point "" +mon_thousands_sep "" +mon_grouping 3;3 +positive_sign "" +negative_sign "" +int_frac_digits 2 +frac_digits 2 +p_cs_precedes 1 +p_sep_by_space 1 +n_cs_precedes 1 +n_sep_by_space 1 +p_sign_posn 1 +n_sign_posn 1 +END LC_MONETARY + +LC_NUMERIC +decimal_point "" +thousands_sep "" +grouping 0;0 +END LC_NUMERIC + +LC_TIME +abday "";"";/ + "";"";/ + "";"";/ + "" +day "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "" +abmon "";"";/ + "";"";/ + "";"";/ + "";"";/ + "";"";/ + "";"" +mon "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "" +d_t_fmt "" +d_fmt "" +t_fmt "" +am_pm "";"" +t_fmt_ampm "" +date_fmt "/ +/ +" +END LC_TIME + +LC_PAPER +% FIXME +height 297 +% FIXME +width 210 +END LC_PAPER + +LC_TELEPHONE +tel_int_fmt "/ +" +int_select "" +END LC_TELEPHONE + +LC_MEASUREMENT +% FIXME +measurement 1 +END LC_MEASUREMENT + +LC_NAME +name_fmt "/ +" +END LC_NAME + +LC_ADDRESS +postal_fmt "/ +/ +/ +/ +" +END LC_ADDRESS diff --git a/localedata/locales/id_ID b/localedata/locales/id_ID index fceb891..1ab3baa 100644 --- a/localedata/locales/id_ID +++ b/localedata/locales/id_ID @@ -120,6 +120,8 @@ t_fmt_ampm "" date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 2 END LC_TIME LC_MESSAGES diff --git a/localedata/locales/is_IS b/localedata/locales/is_IS index b4e3919..1704146 100644 --- a/localedata/locales/is_IS +++ b/localedata/locales/is_IS @@ -2223,6 +2223,8 @@ t_fmt_ampm "" date_fmt "/ / " +% FIXME: found in Java +first_weekday 2 END LC_TIME LC_MESSAGES diff --git a/localedata/locales/iso14651_t1_common b/localedata/locales/iso14651_t1_common index 66a486b..37e8539 100644 --- a/localedata/locales/iso14651_t1_common +++ b/localedata/locales/iso14651_t1_common @@ -2810,7 +2810,11 @@ collating-symbol # SYMB. N° # +ifdef UPPERCASE_FIRST + +else +endif # forme de base (bas de casse, arabe intrinsèque, # hébreu intrinsèque, etc. # basic form (lower case, intrinsic Arabic @@ -2829,14 +2833,21 @@ collating-symbol # medial/mdian # 6 # +ifdef UPPERCASE_FIRST + # 7 + # 8 + # 9 + # 10 + # 11 + # 12 +else # 7 # 8 # 9 # 10 # 11 - -#alternate lower case/ -# 12 + # 12 alternate lower case +endif # #minuscules spéciales après majuscules # / diff --git a/localedata/locales/it_CH b/localedata/locales/it_CH index 51a2846..9f12527 100644 --- a/localedata/locales/it_CH +++ b/localedata/locales/it_CH @@ -57,9 +57,7 @@ copy "de_CH" END LC_MONETARY LC_NUMERIC -decimal_point "" -thousands_sep "" -grouping 3;3 +copy "de_CH" END LC_NUMERIC LC_TIME @@ -100,6 +98,8 @@ t_fmt_ampm "" date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 2 END LC_TIME LC_PAPER diff --git a/localedata/locales/it_IT b/localedata/locales/it_IT index 31acd53..56ff334 100644 --- a/localedata/locales/it_IT +++ b/localedata/locales/it_IT @@ -124,6 +124,8 @@ t_fmt_ampm "" date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 2 END LC_TIME LC_PAPER diff --git a/localedata/locales/ja_JP b/localedata/locales/ja_JP index 54e55b1..26be7ed 100644 --- a/localedata/locales/ja_JP +++ b/localedata/locales/ja_JP @@ -15006,6 +15006,8 @@ alt_digits "";"";"";"";"";"";/ "";"";/ "";"";/ "";"" +% FIXME: found in CLDR +first_weekday 1 END LC_TIME diff --git a/localedata/locales/kk_KZ b/localedata/locales/kk_KZ index cec3891..704754b 100644 --- a/localedata/locales/kk_KZ +++ b/localedata/locales/kk_KZ @@ -232,6 +232,8 @@ t_fmt_ampm "" date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 2 END LC_TIME LC_PAPER diff --git a/localedata/locales/km_KH b/localedata/locales/km_KH index 488e53a..890f306 100644 --- a/localedata/locales/km_KH +++ b/localedata/locales/km_KH @@ -1841,6 +1841,8 @@ am_pm "";"" +% FIXME: found in CLDR +first_weekday 2 END LC_TIME LC_MESSAGES diff --git a/localedata/locales/kn_IN b/localedata/locales/kn_IN index 9b61dc0..a8aac28 100644 --- a/localedata/locales/kn_IN +++ b/localedata/locales/kn_IN @@ -72,7 +72,7 @@ LC_MONETARY % int_curr_symbol "" % *** Change this to reflect Kannada , in Dev it is RA with VS U attached -currency_symbol "" +currency_symbol "" mon_decimal_point "" mon_thousands_sep "" mon_grouping 3 @@ -182,6 +182,8 @@ t_fmt_ampm "/ date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 1 END LC_TIME diff --git a/localedata/locales/ko_KR b/localedata/locales/ko_KR index 59653ad..77a8be6 100644 --- a/localedata/locales/ko_KR +++ b/localedata/locales/ko_KR @@ -6189,6 +6189,8 @@ date_fmt / / / " +% FIXME: found in CLDR +first_weekday 1 END LC_TIME diff --git a/localedata/locales/kok_IN b/localedata/locales/kok_IN index 1600359..8f30139 100644 --- a/localedata/locales/kok_IN +++ b/localedata/locales/kok_IN @@ -49,7 +49,7 @@ LC_MONETARY % for IBM Class for Unicode. % int_curr_symbol "" -currency_symbol "" +currency_symbol "" mon_decimal_point "" mon_thousands_sep "" mon_grouping 3 diff --git a/localedata/locales/ks_IN b/localedata/locales/ks_IN index 5d53c93..77cc8c2 100644 --- a/localedata/locales/ks_IN +++ b/localedata/locales/ks_IN @@ -57,7 +57,7 @@ LC_MONETARY % for IBM Class for Unicode. % int_curr_symbol "" -currency_symbol "" +currency_symbol "" mon_decimal_point "" mon_thousands_sep "" mon_grouping 3 diff --git a/localedata/locales/ku_TR b/localedata/locales/ku_TR index 9639e26..02ef0e7 100644 --- a/localedata/locales/ku_TR +++ b/localedata/locales/ku_TR @@ -16,6 +16,8 @@ comment_char % % Distribution and use is free, also % for commercial purposes. % History: +% 0.2 2005-04-24 Erdal Ronah +% Fix LC_CTYPE and LC_NAME sections. Remove dotless i from LC_COLLATE LC_IDENTIFICATION title "Kurdish (latin) locale for Turkey" @@ -27,8 +29,8 @@ tel "" fax "" language "Kurdish" territory "Turkey" -revision "0.1" -date "2003-07-27" +revision "0.2" +date "2005-04-24" % category "ku_TR:2000";LC_IDENTIFICATION category "ku_TR:2000";LC_CTYPE @@ -46,7 +48,7 @@ category "ku_TR:2000";LC_MEASUREMENT END LC_IDENTIFICATION LC_CTYPE -copy "tr_TR" +copy "i18n" END LC_CTYPE LC_COLLATE @@ -56,7 +58,6 @@ copy "iso14651_t1" collating-symbol collating-symbol > -collating-symbol collating-symbol > collating-symbol collating-symbol > @@ -65,9 +66,7 @@ reorder-after reorder-after > -reorder-after - - +reorder-after > reorder-after @@ -84,13 +83,9 @@ reorder-after reorder-after >;;;IGNORE -reorder-after - ;;;IGNORE - ;;;IGNORE +reorder-after >;;;IGNORE -reorder-after - ;;;IGNORE - ;;;IGNORE +reorder-after >;;;IGNORE reorder-after @@ -116,35 +111,35 @@ copy "tr_TR" END LC_NUMERIC LC_TIME -abday "";"";/ - "";"";/ - "";"";/ - "" -day "";/ - "";/ - "";/ - "";/ - "";/ - "";/ - "" +abday "";"";/ + "";"";/ + "";"";/ + "" +day "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "" abmon "";"";/ "";"";/ "";"";/ "";"";/ "";"";/ "";"" -mon "";/ - "";/ - "";/ - "";/ - "";/ - "";/ - "";/ - "";/ - "";/ - "";/ - "";/ - "" +mon "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "" % format: %A %d %B %Y %T %Z d_t_fmt "" % format: %d/%m/%Y @@ -154,6 +149,8 @@ am_pm "";"" t_fmt_ampm "" % format: %A %d %B %Y date_fmt "" +% FIXME: found in CLDR +first_weekday 2 END LC_TIME LC_MESSAGES @@ -182,15 +179,15 @@ LC_NAME name_fmt "/ " % TODO -% Sayýn -name_gen "" +% Birz +name_gen "" % "M." -name_mr "" -% "Jne" -name_mrs "" -name_ms "" -% "Kc,k" -name_miss "" +name_mr "" +% "Birz" +name_mrs "" +name_ms "" +% "Birz" +name_miss "" END LC_NAME LC_ADDRESS @@ -199,17 +196,16 @@ postal_fmt "/ / / " -% TODO -country_name "" -country_post "TR" -country_ab2 "TR" -country_ab3 "TUR" +country_name "" +country_post "" +country_ab2 "" +country_ab3 "" country_num 792 country_isbn 975 -country_car "TR" -% "kurdi" -lang_name "" -lang_ab "ku" -lang_term "kur" -lang_lib "kur" +country_car "" +% "kurd" +lang_name "" +lang_ab "" +lang_term "" +lang_lib "" END LC_ADDRESS diff --git a/localedata/locales/kw_GB b/localedata/locales/kw_GB index 35d7c83..46005be 100644 --- a/localedata/locales/kw_GB +++ b/localedata/locales/kw_GB @@ -123,6 +123,8 @@ t_fmt_ampm "" date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 2 END LC_TIME LC_MESSAGES diff --git a/localedata/locales/lo_LA b/localedata/locales/lo_LA index 29ab3f3..3c62b56 100644 --- a/localedata/locales/lo_LA +++ b/localedata/locales/lo_LA @@ -718,6 +718,8 @@ date_fmt "/ " % ICT-7ICT-7 timezone "" +% FIXME: found in CLDR +first_weekday 1 END LC_TIME LC_MESSAGES diff --git a/localedata/locales/lt_LT b/localedata/locales/lt_LT index b709d83..ec4f7af 100644 --- a/localedata/locales/lt_LT +++ b/localedata/locales/lt_LT @@ -58,2067 +58,13 @@ category "lt_LT:2000";LC_TELEPHONE END LC_IDENTIFICATION LC_COLLATE +define UPPERCASE_FIRST +copy "iso14651_t1" -% Base collation scheme: 1994-03-22 +reorder-after + -% Ordering algorithm: -% 1. Spaces and hyphen (but not soft -% hyphen) before punctuation -% characters, punctuation characters -% before numbers, -% numbers before letters. -% 2. Letters with diacritical marks are -% members of equivalence classes -% 3. A distinction is made with regards -% to case as noted below. -% 4. Special characters are ignored -% when comparing letters, but then -% they are considered -% 5. The alphabets are sorted in order -% of first appearance in ISO 10646: -% Latin, Greek, Cyrillic, etc. -% -% According to Greek specifications, -% the steps 2. and 3. above are reversed -% for the Greek script - -% collating symbols - -% The collating symbol naming is -% mostly taken from ISO 10646-1, -% for example the case and accent -% names are from this standard. - -collating-symbol -collating-symbol -collating-symbol -collating-symbol - -% and -% are for cases like Danish -% and Spanish being treated -% as one letter. - -% The ...... collating -% symbols have defined weights as -% the last character in a group of -% Latin letters. They are used -% to specify deltas by locales using -% a locale as the default ordering -% and by "replace-after" statements -% specifying the changed placement -% in an ordering of a character. - -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol - -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol - -% letter;accent;case;specials - -order_start forward;backward/ - ;forward;position - -% or letters first: - - - - - - -% Accents: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;;;IGNORE - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; -<"=> IGNORE;IGNORE;IGNORE;<"=> - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; -UNDEFINED IGNORE;IGNORE;IGNORE - - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - -% Arabic collating - - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - -% katakana/hiragana sorting -% base is katakana, as this is present in most charsets -% normal before voiced before semi-voiced -% small vocals before normal vocals -% katakana before hiragana - - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - -order_end +reorder-end END LC_COLLATE @@ -2191,6 +137,8 @@ t_fmt_ampm "" date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 2 END LC_TIME LC_MESSAGES diff --git a/localedata/locales/lv_LV b/localedata/locales/lv_LV index fdf0f37..d897409 100644 --- a/localedata/locales/lv_LV +++ b/localedata/locales/lv_LV @@ -2183,6 +2183,8 @@ t_fmt_ampm "" date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 2 END LC_TIME LC_MESSAGES diff --git a/localedata/locales/ml_IN b/localedata/locales/ml_IN index 6c97a5a..aabd45c 100644 --- a/localedata/locales/ml_IN +++ b/localedata/locales/ml_IN @@ -69,7 +69,7 @@ LC_MONETARY % for IBM Class for Unicode. % int_curr_symbol "" -currency_symbol "" +currency_symbol "" mon_decimal_point "" mon_thousands_sep "" mon_grouping 3;2 @@ -163,6 +163,8 @@ t_fmt "" % +% FIXME +first_weekday 1 END LC_TIME % LC_MESSAGES diff --git a/localedata/locales/mn_MN b/localedata/locales/mn_MN index 8da3878..96b94b9 100644 --- a/localedata/locales/mn_MN +++ b/localedata/locales/mn_MN @@ -220,6 +220,8 @@ t_fmt_ampm "" % "%Z %Y ony %B %e, %a %H:%M:%S" date_fmt "/ " +% FIXME: found in CLDR +first_weekday 2 END LC_TIME LC_MESSAGES diff --git a/localedata/locales/mr_IN b/localedata/locales/mr_IN index e5658a1..d9bbdb1 100644 --- a/localedata/locales/mr_IN +++ b/localedata/locales/mr_IN @@ -70,7 +70,7 @@ LC_MONETARY % for IBM Class for Unicode. % int_curr_symbol "" -currency_symbol "" +currency_symbol "" mon_decimal_point "" mon_thousands_sep "" mon_grouping 3 @@ -170,6 +170,8 @@ t_fmt_ampm "/ date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 1 END LC_TIME diff --git a/localedata/locales/ms_MY b/localedata/locales/ms_MY index 84c866e..b1691b6 100644 --- a/localedata/locales/ms_MY +++ b/localedata/locales/ms_MY @@ -139,6 +139,8 @@ t_fmt "" % +% FIXME: found in CLDR +first_weekday 2 END LC_TIME diff --git a/localedata/locales/nb_NO b/localedata/locales/nb_NO index e491643..87fc21d 100644 --- a/localedata/locales/nb_NO +++ b/localedata/locales/nb_NO @@ -127,6 +127,21 @@ copy "i18n" translit_start include "translit_combining";"" + +% Norwegian transliteration +% LATIN CAPITAL LETTER A WITH RING ABOVE -> "Aa" + "";"" +% LATIN SMALL LETTER A WITH RING ABOVE -> "aa" + "";"" +% LATIN CAPITAL LETTER O WITH STROKE -> "Oe" + "";"" +% LATIN SMALL LETTER O WITH STROKE -> "oe" + "";"" +% LATIN CAPITAL LETTER AE -> "Ae" + "" +% LATIN SMALL LETTER AE -> "ae" + "" + translit_end END LC_CTYPE diff --git a/localedata/locales/ne_NP b/localedata/locales/ne_NP index 875d7a3..d79316d 100644 --- a/localedata/locales/ne_NP +++ b/localedata/locales/ne_NP @@ -153,6 +153,8 @@ t_fmt_ampm "/ date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 1 END LC_TIME diff --git a/localedata/locales/nl_BE b/localedata/locales/nl_BE index 33f3e1c..cef0eaf 100644 --- a/localedata/locales/nl_BE +++ b/localedata/locales/nl_BE @@ -104,6 +104,8 @@ t_fmt_ampm "" date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 2 END LC_TIME LC_PAPER diff --git a/localedata/locales/nr_ZA b/localedata/locales/nr_ZA index 698b9d1..0b3ddec 100644 --- a/localedata/locales/nr_ZA +++ b/localedata/locales/nr_ZA @@ -162,6 +162,8 @@ date_fmt "/ % %Z - time-zone name, % %Y - year with century as a decimal number,e.g. 2001. +% FIXME: found in CLDR +first_weekday 1 END LC_TIME LC_MESSAGES diff --git a/localedata/locales/nso_ZA b/localedata/locales/nso_ZA index c3351ee..bfbbac4 100644 --- a/localedata/locales/nso_ZA +++ b/localedata/locales/nso_ZA @@ -157,6 +157,8 @@ date_fmt "/ % %Z - time-zone name, % %Y - year with century as a decimal number,e.g. 2001. +% FIXME: found in CLDR +first_weekday 1 END LC_TIME LC_MESSAGES diff --git a/localedata/locales/oc_FR b/localedata/locales/oc_FR index 156f812..6c06e4a 100644 --- a/localedata/locales/oc_FR +++ b/localedata/locales/oc_FR @@ -123,6 +123,8 @@ d_fmt "" t_fmt "" am_pm "";"" t_fmt_ampm "" +% FIXME: found in CLDR +first_weekday 2 END LC_TIME LC_NAME diff --git a/localedata/locales/om_ET b/localedata/locales/om_ET index 6ccd5fe..a7c5ea5 100644 --- a/localedata/locales/om_ET +++ b/localedata/locales/om_ET @@ -233,5 +233,7 @@ d_t_fmt "/ " % +% FIXME: found in CLDR +first_weekday 7 END LC_TIME % diff --git a/localedata/locales/or_IN b/localedata/locales/or_IN index 22ee031..1c6d8c7 100644 --- a/localedata/locales/or_IN +++ b/localedata/locales/or_IN @@ -607,7 +607,7 @@ END LC_NUMERIC %%%%%%%%%%%%% LC_MONETARY int_curr_symbol "" -currency_symbol "" +currency_symbol "" mon_decimal_point "" mon_thousands_sep "" mon_grouping 3;2 diff --git a/localedata/locales/os_RU b/localedata/locales/os_RU new file mode 100644 index 0000000..c914d18 --- /dev/null +++ b/localedata/locales/os_RU @@ -0,0 +1,171 @@ +comment_char % +escape_char / + +% +% Ossetian Language Locale for Russia +% Language: os +% Territory: RU +% Revision: 1.0 +% Date: 2011-05-06 +% Application: general +% Users: general +% Charset: UTF-8 +% Distribution and use is free, also +% for commercial purposes. +% +% Based on ru_RU, cv_RU, da_DK +% Modifed by: +% Soslan Khubulov +% + +LC_IDENTIFICATION +title "Ossetian locale for Russia" +source "RAP" +address "Sankt Jorgens Alle 8, DK-1615 Kobenhavn V, Danmark" +contact "" +email "bug-glibc-locales@gnu.org" +tel "" +fax "" +language "Ossetian" +territory "Russia" +revision "1.0" +date "2000-06-29" + +category "os_RU:2000";LC_IDENTIFICATION +category "os_RU:2000";LC_CTYPE +category "os_RU:2000";LC_COLLATE +category "os_RU:2000";LC_TIME +category "os_RU:2000";LC_NUMERIC +category "os_RU:2000";LC_MONETARY +category "os_RU:2000";LC_MESSAGES +category "os_RU:2000";LC_PAPER +category "os_RU:2000";LC_NAME +category "os_RU:2000";LC_ADDRESS +category "os_RU:2000";LC_TELEPHONE + +END LC_IDENTIFICATION + +LC_COLLATE +copy "iso14651_t1" + +collating-symbol + +reorder-after + + +reorder-after + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE +reorder-end +END LC_COLLATE + +LC_CTYPE +copy "i18n" + +translit_start +include "translit_combining";"" +translit_end + +END LC_CTYPE + +LC_MESSAGES +yesexpr "" +noexpr "" +END LC_MESSAGES + +LC_MONETARY +int_curr_symbol "" +currency_symbol "" +mon_decimal_point "" +mon_thousands_sep "" +mon_grouping 3;3 +positive_sign "" +negative_sign "" +int_frac_digits 2 +frac_digits 2 +p_cs_precedes 0 +p_sep_by_space 1 +n_cs_precedes 0 +n_sep_by_space 1 +p_sign_posn 1 +n_sign_posn 1 +END LC_MONETARY + +LC_NUMERIC +copy "ru_RU" +END LC_NUMERIC + +LC_TIME +abday "";"";/ + "";"";/ + "";"";/ + "" +day "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "" + +abmon "";/ +"";/ +"";/ +"";/ +"";/ +"";/ +"";/ +"";/ +"";/ +"";/ +"";/ +"" + +mon "";/ +"";/ +"";/ +"";/ +"";/ +"";/ +"";/ +"";/ +"";/ +"";/ +"";/ +"" +d_t_fmt "/ +" +d_fmt "" +t_fmt "" +am_pm "";"" +t_fmt_ampm "" +date_fmt "/ +/ +" +first_weekday 2 +first_workday 2 + +END LC_TIME + +LC_PAPER +copy "ru_RU" +END LC_PAPER + +LC_TELEPHONE +copy "ru_RU" +END LC_TELEPHONE + +LC_MEASUREMENT +copy "ru_RU" +END LC_MEASUREMENT + +LC_NAME +copy "ru_RU" +END LC_NAME + +LC_ADDRESS +copy "ru_RU" +END LC_ADDRESS + diff --git a/localedata/locales/pa_IN b/localedata/locales/pa_IN index 98cb916..e1e8f69 100644 --- a/localedata/locales/pa_IN +++ b/localedata/locales/pa_IN @@ -66,7 +66,7 @@ END LC_COLLATE LC_MONETARY % This is the POSIX Locale definition the LC_MONETARY category. int_curr_symbol "" -currency_symbol "" +currency_symbol "" mon_decimal_point "" mon_thousands_sep "" mon_grouping 3 @@ -170,6 +170,8 @@ t_fmt_ampm "/ date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 1 END LC_TIME diff --git a/localedata/locales/pl_PL b/localedata/locales/pl_PL index 1bce8f5..b4f8590 100644 --- a/localedata/locales/pl_PL +++ b/localedata/locales/pl_PL @@ -48,2067 +48,88 @@ category "pl_PL:2000";LC_TELEPHONE END LC_IDENTIFICATION LC_COLLATE - -% Base collation scheme: 1994-03-22 - -% Ordering algorithm: -% 1. Spaces and hyphen (but not soft -% hyphen) before punctuation -% characters, punctuation characters -% before numbers, -% numbers before letters. -% 2. Letters with diacritical marks are -% members of equivalence classes -% 3. A distinction is made with regards -% to case as noted below. -% 4. Special characters are ignored -% when comparing letters, but then -% they are considered -% 5. The alphabets are sorted in order -% of first appearance in ISO 10646: -% Latin, Greek, Cyrillic, etc. -% -% According to Greek specifications, -% the steps 2. and 3. above are reversed -% for the Greek script - -% collating symbols - -% The collating symbol naming is -% mostly taken from ISO 10646-1, -% for example the case and accent -% names are from this standard. - -collating-symbol -collating-symbol -collating-symbol -collating-symbol - -% and -% are for cases like Danish -% and Spanish being treated -% as one letter. - -% The ...... collating -% symbols have defined weights as -% the last character in a group of -% Latin letters. They are used -% to specify deltas by locales using -% a locale as the default ordering -% and by "replace-after" statements -% specifying the changed placement -% in an ordering of a character. - -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol - -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol - -% letter;accent;case;specials - -order_start forward;backward/ - ;forward;position - -% or letters first: - - - - - - -% Accents: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;;;IGNORE - ;IGNORE;; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; -<"=> IGNORE;IGNORE;IGNORE;<"=> - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; -UNDEFINED IGNORE;IGNORE;IGNORE - - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - -% Arabic collating - - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - -% katakana/hiragana sorting -% base is katakana, as this is present in most charsets -% normal before voiced before semi-voiced -% small vocals before normal vocals -% katakana before hiragana - - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - -order_end +copy "iso14651_t1" + +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol + +reorder-after + + +reorder-after + + +reorder-after + + +reorder-after + + +reorder-after + + +reorder-after + + +reorder-after + + +reorder-after + + + +reorder-after + ;IGNORE;; +reorder-after + ;;;IGNORE +reorder-after + ;;;IGNORE + +reorder-after + ;;;IGNORE +reorder-after + ;;;IGNORE + +reorder-after + ;;;IGNORE +reorder-after + ;;;IGNORE + +reorder-after + ;;;IGNORE +reorder-after + ;;;IGNORE + +reorder-after + ;;;IGNORE +reorder-after + ;;;IGNORE + +reorder-after + ;;;IGNORE +reorder-after + ;;;IGNORE + +reorder-after + ;;;IGNORE +reorder-after + ;;;IGNORE + +reorder-after + ;;;IGNORE + ;;;IGNORE +reorder-after + ;;;IGNORE + ;;;IGNORE + +reorder-end END LC_COLLATE diff --git a/localedata/locales/pt_BR b/localedata/locales/pt_BR index 22f6131..49f6257 100644 --- a/localedata/locales/pt_BR +++ b/localedata/locales/pt_BR @@ -120,6 +120,7 @@ t_fmt_ampm "" date_fmt "/ / " +first_weekday 1 END LC_TIME LC_PAPER diff --git a/localedata/locales/pt_PT b/localedata/locales/pt_PT index f11be1c..1fb62f5 100644 --- a/localedata/locales/pt_PT +++ b/localedata/locales/pt_PT @@ -124,6 +124,8 @@ t_fmt_ampm "" date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 2 END LC_TIME LC_PAPER diff --git a/localedata/locales/ru_UA b/localedata/locales/ru_UA index c2ca7b1..b8bf465 100644 --- a/localedata/locales/ru_UA +++ b/localedata/locales/ru_UA @@ -141,6 +141,7 @@ t_fmt_ampm "" date_fmt "/ / " +week 7;19971201;4 END LC_TIME LC_PAPER diff --git a/localedata/locales/rw_RW b/localedata/locales/rw_RW index 437df4b..0a0b110 100644 --- a/localedata/locales/rw_RW +++ b/localedata/locales/rw_RW @@ -109,6 +109,8 @@ t_fmt_ampm "" date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 2 END LC_TIME LC_MESSAGES diff --git a/localedata/locales/sa_IN b/localedata/locales/sa_IN index 8dac294..d6bf551 100644 --- a/localedata/locales/sa_IN +++ b/localedata/locales/sa_IN @@ -52,7 +52,7 @@ LC_MONETARY % for IBM Class for Unicode/Java % int_curr_symbol "" -currency_symbol "" +currency_symbol "" mon_decimal_point "" mon_thousands_sep "" mon_grouping 3 @@ -182,6 +182,8 @@ t_fmt_ampm "/ date_fmt "/ / " +% FIXME: copied from other *_IN locales +first_weekday 1 END LC_TIME diff --git a/localedata/locales/sd_IN b/localedata/locales/sd_IN index 4688ddc..77d6af2 100644 --- a/localedata/locales/sd_IN +++ b/localedata/locales/sd_IN @@ -57,7 +57,7 @@ LC_MONETARY % for IBM Class for Unicode. % int_curr_symbol "" -currency_symbol "" +currency_symbol "" mon_decimal_point "" mon_thousands_sep "" mon_grouping 3 diff --git a/localedata/locales/sd_IN@devanagari b/localedata/locales/sd_IN@devanagari index e54fc92..41def11 100644 --- a/localedata/locales/sd_IN@devanagari +++ b/localedata/locales/sd_IN@devanagari @@ -53,7 +53,7 @@ LC_MONETARY % for IBM Class for Unicode. % int_curr_symbol "" -currency_symbol "" +currency_symbol "" mon_decimal_point "" mon_thousands_sep "" mon_grouping 3 diff --git a/localedata/locales/se_NO b/localedata/locales/se_NO index 0504ec0..5e13c98 100644 --- a/localedata/locales/se_NO +++ b/localedata/locales/se_NO @@ -137,7 +137,7 @@ reorder-after ;;;IGNORE % ezh caron reorder-after - ;;;IGNORE % EZH + ;;;IGNORE % EZH ;;;IGNORE % EZH caron reorder-after @@ -164,9 +164,10 @@ reorder-after reorder-after ;;;IGNORE % Kcaron -reorder-after +reorder-after ;"";"";IGNORE % ß ;;;IGNORE % 288 +reorder-after ;;;IGNORE % 405 @@ -276,6 +277,9 @@ date_fmt "< " % %a %b-%e %H:%M:%S %Z %Y søn jan-31 21:15:11 CET 2001 +% FIXME: found in CLDR +first_weekday 2 +first_workday 2 END LC_TIME LC_MESSAGES diff --git a/localedata/locales/sid_ET b/localedata/locales/sid_ET index 8ce3234..cf4ff9c 100644 --- a/localedata/locales/sid_ET +++ b/localedata/locales/sid_ET @@ -222,5 +222,7 @@ d_t_fmt "/ " +% FIXME: found in CLDR +first_weekday 7 END LC_TIME % diff --git a/localedata/locales/sl_SI b/localedata/locales/sl_SI index 78c83c4..1e4ab51 100644 --- a/localedata/locales/sl_SI +++ b/localedata/locales/sl_SI @@ -48,2067 +48,37 @@ category "sl_SI:2000";LC_TELEPHONE END LC_IDENTIFICATION LC_COLLATE +copy "iso14651_t1" -% Base collation scheme: 1994-03-22 +collating-symbol +collating-symbol +collating-symbol -% Ordering algorithm: -% 1. Spaces and hyphen (but not soft -% hyphen) before punctuation -% characters, punctuation characters -% before numbers, -% numbers before letters. -% 2. Letters with diacritical marks are -% members of equivalence classes -% 3. A distinction is made with regards -% to case as noted below. -% 4. Special characters are ignored -% when comparing letters, but then -% they are considered -% 5. The alphabets are sorted in order -% of first appearance in ISO 10646: -% Latin, Greek, Cyrillic, etc. -% -% According to Greek specifications, -% the steps 2. and 3. above are reversed -% for the Greek script - -% collating symbols - -% The collating symbol naming is -% mostly taken from ISO 10646-1, -% for example the case and accent -% names are from this standard. - -collating-symbol -collating-symbol -collating-symbol -collating-symbol - -% and -% are for cases like Danish -% and Spanish being treated -% as one letter. - -% The ...... collating -% symbols have defined weights as -% the last character in a group of -% Latin letters. They are used -% to specify deltas by locales using -% a locale as the default ordering -% and by "replace-after" statements -% specifying the changed placement -% in an ordering of a character. - -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol - -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol - -% letter;accent;case;specials - -order_start forward;backward/ - ;forward;position - -% or letters first: - - - - - - -% Accents: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;;;IGNORE - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; -<"=> IGNORE;IGNORE;IGNORE;<"=> - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; -UNDEFINED IGNORE;IGNORE;IGNORE - - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - -% Arabic collating - - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE +reorder-after + - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE +reorder-after + - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE +reorder-after + - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE +reorder-after + ;;;IGNORE +reorder-after + ;;;IGNORE -% katakana/hiragana sorting -% base is katakana, as this is present in most charsets -% normal before voiced before semi-voiced -% small vocals before normal vocals -% katakana before hiragana +reorder-after + ;;;IGNORE +reorder-after + ;;;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE +reorder-after + ;;;IGNORE +reorder-after + ;;;IGNORE -order_end +reorder-end END LC_COLLATE @@ -2187,6 +157,8 @@ t_fmt_ampm "" date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 2 END LC_TIME LC_PAPER diff --git a/localedata/locales/so_DJ b/localedata/locales/so_DJ index f6d5cb2..12c972a 100644 --- a/localedata/locales/so_DJ +++ b/localedata/locales/so_DJ @@ -222,5 +222,7 @@ d_t_fmt "/ date_fmt "/ " % +% FIXME: found in CLDR +first_weekday 7 END LC_TIME % diff --git a/localedata/locales/so_ET b/localedata/locales/so_ET index ea6336e..0d9ae04 100644 --- a/localedata/locales/so_ET +++ b/localedata/locales/so_ET @@ -219,5 +219,7 @@ d_t_fmt "/ " % +% FIXME: found in CLDR +first_weekday 7 END LC_TIME % diff --git a/localedata/locales/so_KE b/localedata/locales/so_KE index 5d67049..8492b47 100644 --- a/localedata/locales/so_KE +++ b/localedata/locales/so_KE @@ -218,5 +218,7 @@ d_t_fmt "/ " % +% FIXME: found in CLDR +first_weekday 7 END LC_TIME % diff --git a/localedata/locales/so_SO b/localedata/locales/so_SO index acaaa3f..7ce845c 100644 --- a/localedata/locales/so_SO +++ b/localedata/locales/so_SO @@ -278,5 +278,7 @@ d_t_fmt "/ " % +% FIXME: found in CLDR +first_weekday 7 END LC_TIME % diff --git a/localedata/locales/sq_AL b/localedata/locales/sq_AL index ec2e30d..4fd945b 100644 --- a/localedata/locales/sq_AL +++ b/localedata/locales/sq_AL @@ -290,6 +290,8 @@ t_fmt_ampm "/ date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 2 END LC_TIME diff --git a/localedata/locales/ss_ZA b/localedata/locales/ss_ZA index c30060e..5510a08 100644 --- a/localedata/locales/ss_ZA +++ b/localedata/locales/ss_ZA @@ -167,6 +167,8 @@ date_fmt "/ % %Z - time-zone name, % %Y - year with century as a decimal number,e.g. 2001. +% FIXME: found in CLDR +first_weekday 1 END LC_TIME LC_MESSAGES diff --git a/localedata/locales/st_ZA b/localedata/locales/st_ZA index 67e356c..bd57102 100644 --- a/localedata/locales/st_ZA +++ b/localedata/locales/st_ZA @@ -164,6 +164,8 @@ date_fmt "/ % %Z - time-zone name, % %Y - year with century as a decimal number,e.g. 2001. +% FIXME: found in CLDR +first_weekday 1 END LC_TIME LC_MESSAGES diff --git a/localedata/locales/sv_FI b/localedata/locales/sv_FI index af9ec12..77a3ab3 100644 --- a/localedata/locales/sv_FI +++ b/localedata/locales/sv_FI @@ -98,7 +98,7 @@ mon "";/ "";/ "" d_t_fmt "/ -/ +/ " d_fmt "" t_fmt "" @@ -107,6 +107,8 @@ t_fmt_ampm "" date_fmt "/ / " +first_weekday 2 % Monday +first_workday 2 % Monday END LC_TIME LC_PAPER diff --git a/localedata/locales/sv_SE b/localedata/locales/sv_SE index f558e24..5bac002 100644 --- a/localedata/locales/sv_SE +++ b/localedata/locales/sv_SE @@ -169,14 +169,23 @@ mon "";/ "";/ "";/ "" -d_t_fmt "" +% +% Appropriate date and time representation (%c) +% "%a %e %b %Y %H:%M:%S" +d_t_fmt "" +% +% Appropriate date representation (%x) "%Y-%m-%d" d_fmt "" -t_fmt "" +% +% Appropriate time representation (%X) "%H:%M:%S" +t_fmt "" am_pm "";"" t_fmt_ampm "" -date_fmt "/ -/ -" +% +% Appropriate date representation (date(1)) "%a %e %b %Y %H:%M:%S %Z" +date_fmt "/ +/ +" first_weekday 2 first_workday 2 END LC_TIME diff --git a/localedata/locales/sw_KE b/localedata/locales/sw_KE new file mode 100644 index 0000000..61dd49d --- /dev/null +++ b/localedata/locales/sw_KE @@ -0,0 +1,170 @@ +comment_char % +escape_char / +% Charset: UTF-8 +% Authors: +% 2011-03-07, locales@kamusi.org +% 2011-03-07, info@2xlibre.net +% Distribution and use is free, also +% for commercial purposes. + +LC_IDENTIFICATION +title "Swahili locale for Kenya" +source "Kamusi Project" +contact "Martin Benjamin" +email "locales@kamusi.org" +tel "" +fax "" +language "sw" +territory "Kenya" +revision "1.0" +date "2011-03-07" +% +category "sw_KE:2000";LC_IDENTIFICATION +category "sw_KE:2000";LC_CTYPE +category "sw_KE:2000";LC_COLLATE +category "sw_KE:2000";LC_TIME +category "sw_KE:2000";LC_NUMERIC +category "sw_KE:2000";LC_MONETARY +category "sw_KE:2000";LC_PAPER +category "sw_KE:2000";LC_MEASUREMENT +category "sw_KE:2000";LC_MESSAGES +category "sw_KE:2000";LC_NAME +category "sw_KE:2000";LC_ADDRESS +category "sw_KE:2000";LC_TELEPHONE +END LC_IDENTIFICATION + +LC_CTYPE +copy "i18n" + +translit_start +include "translit_combining";"" +translit_end +END LC_CTYPE + +LC_COLLATE +copy "iso14651_t1" +END LC_COLLATE + +LC_TIME +% Januari, Februari, Machi, Aprili, Mei, Juni, Julai, Agosti, Septemba, Oktoba, Novemba, Desemba +mon "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "" +% Jan, Feb, Mac, Apr, Mei, Jun, Jul, Ago, Sep, Okt, Nov, Des +abmon "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "" +% Jumapili, Jumatatu, Jumanne, Jumatano, Alhamisi, Ijumaa, Jumamosi +day "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "" +% J2, J3, J4, J5, Alh, Ij, J1 +abday "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "" +week 7;19971130;4 +first_weekday 2 +first_workday 2 +% %e %B %Y %I:%M:%S %p %Z +d_t_fmt "/ +" +% %d/%m/%Y +d_fmt "" +% %I:%M:%S %p +t_fmt "" +% asubuhi, alasiri +am_pm "";/ + "" +% %I:%M:%S %p +t_fmt_ampm "" +END LC_TIME + +LC_NUMERIC +copy "om_KE" +END LC_NUMERIC + +LC_MONETARY +copy "om_KE" +END LC_MONETARY + +LC_PAPER +copy "om_KE" +END LC_PAPER + +LC_MEASUREMENT +copy "om_KE" +END LC_MEASUREMENT + +LC_MESSAGES +% ^[nNyY].* +yesexpr "" +% ^[hHlL].* +noexpr "" +END LC_MESSAGES + +LC_NAME +% %p%t%g%m%t%f +name_fmt "" +% Bw. +name_mr "" +% Bi. +name_ms "" +END LC_NAME + +LC_ADDRESS +% %a%N%f%N%d%N%b%N%h %s %e %r%N%T, %S %z%N%c%N +postal_fmt "/ +/ +/ +" +% Kenya +country_name "" +% KE +country_post "" +% KE +country_ab2 "" +% KEN +country_ab3 "" +country_num 404 +% Kiswahili +lang_name "" +% sw +lang_ab "" +END LC_ADDRESS + +LC_TELEPHONE +% %c %a %l +tel_int_fmt "" +% %A %l +tel_dom_fmt "" +% 000 +int_select "" +% 254 +int_prefix "" +END LC_TELEPHONE diff --git a/localedata/locales/sw_TZ b/localedata/locales/sw_TZ new file mode 100644 index 0000000..71fd8cd --- /dev/null +++ b/localedata/locales/sw_TZ @@ -0,0 +1,121 @@ +comment_char % +escape_char / +% Charset: UTF-8 +% Authors: +% 2011-03-07, locales@kamusi.org +% 2011-03-07, info@2xlibre.net +% Distribution and use is free, also +% for commercial purposes. + +LC_IDENTIFICATION +title "Swahili locale for Tanzania" +source "Kamusi Project" +contact "Martin Benjamin" +email "locales@kamusi.org" +tel "" +fax "" +language "sw" +territory "Tanzania" +revision "1.0" +date "2011-03-07" +% +category "sw_TZ:2000";LC_IDENTIFICATION +category "sw_TZ:2000";LC_CTYPE +category "sw_TZ:2000";LC_COLLATE +category "sw_TZ:2000";LC_TIME +category "sw_TZ:2000";LC_NUMERIC +category "sw_TZ:2000";LC_MONETARY +category "sw_TZ:2000";LC_PAPER +category "sw_TZ:2000";LC_MEASUREMENT +category "sw_TZ:2000";LC_MESSAGES +category "sw_TZ:2000";LC_NAME +category "sw_TZ:2000";LC_ADDRESS +category "sw_TZ:2000";LC_TELEPHONE +END LC_IDENTIFICATION + +LC_CTYPE +copy "sw_KE" +END LC_CTYPE + +LC_COLLATE +copy "iso14651_t1" +END LC_COLLATE + +LC_TIME +copy "sw_KE" +END LC_TIME + +LC_NUMERIC +copy "sw_KE" +END LC_NUMERIC + +LC_MONETARY +% TSh +currency_symbol "" +% TZS +int_curr_symbol "" +% . +mon_decimal_point "" +% , +mon_thousands_sep "" +mon_grouping 3 +positive_sign "" +% - +negative_sign "" +frac_digits 2 +int_frac_digits 2 +p_cs_precedes 1 +p_sep_by_space 0 +n_cs_precedes 1 +n_sep_by_space 0 +p_sign_posn 1 +n_sign_posn 1 +END LC_MONETARY + +LC_PAPER +copy "sw_KE" +END LC_PAPER + +LC_MEASUREMENT +measurement 1 +END LC_MEASUREMENT + +LC_MESSAGES +copy "sw_KE" +END LC_MESSAGES + +LC_NAME +copy "sw_KE" +END LC_NAME + +LC_ADDRESS +% %a%N%f%N%d%N%b%N%h %s %e %r%N%T, %S %z%N%c%N +postal_fmt "/ +/ +/ +" +% Tanzania +country_name "" +% TZ +country_post "" +% TZ +country_ab2 "" +% TZA +country_ab3 "" +country_num 834 +% Kiswahili +lang_name "" +% sw +lang_ab "" +END LC_ADDRESS + +LC_TELEPHONE +% %c %a %l +tel_int_fmt "" +% %A %l +tel_dom_fmt "" +% 000 +int_select "" +% 255 +int_prefix "" +END LC_TELEPHONE diff --git a/localedata/locales/ta_IN b/localedata/locales/ta_IN index 19c41f6..8b12f2f 100644 --- a/localedata/locales/ta_IN +++ b/localedata/locales/ta_IN @@ -74,7 +74,7 @@ LC_MONETARY % for IBM Class for Unicode. % int_curr_symbol "" -currency_symbol "" +currency_symbol "" mon_decimal_point "" mon_thousands_sep "" mon_grouping 3;2 @@ -154,6 +154,8 @@ t_fmt "" % +% FIXME: found in CLDR +first_weekday 1 END LC_TIME diff --git a/localedata/locales/te_IN b/localedata/locales/te_IN index 38040f8..0e68d4f 100644 --- a/localedata/locales/te_IN +++ b/localedata/locales/te_IN @@ -73,7 +73,7 @@ LC_MONETARY % for IBM Class for Unicode. % int_curr_symbol "" -currency_symbol "" +currency_symbol "" mon_decimal_point "" mon_thousands_sep "" mon_grouping 3;2 @@ -156,6 +156,8 @@ t_fmt "" % +% FIXME: found in CLDR +first_weekday 1 END LC_TIME diff --git a/localedata/locales/th_TH b/localedata/locales/th_TH index 5bcf10e..2fbdff1 100644 --- a/localedata/locales/th_TH +++ b/localedata/locales/th_TH @@ -913,6 +913,8 @@ date_fmt "/ " % ICT-7ICT-7 timezone "" +% FIXME: found in CLDR +first_weekday 1 END LC_TIME LC_MESSAGES diff --git a/localedata/locales/ti_ER b/localedata/locales/ti_ER index cc2c4eb..02a48f2 100644 --- a/localedata/locales/ti_ER +++ b/localedata/locales/ti_ER @@ -270,5 +270,7 @@ date_fmt "/ / " % +% FIXME: found in CLDR +first_weekday 7 END LC_TIME % diff --git a/localedata/locales/ti_ET b/localedata/locales/ti_ET index 3c714e9..43e0766 100644 --- a/localedata/locales/ti_ET +++ b/localedata/locales/ti_ET @@ -1072,5 +1072,7 @@ date_fmt "/ / " % +% FIXME: found in CLDR +first_weekday 7 END LC_TIME % diff --git a/localedata/locales/tig_ER b/localedata/locales/tig_ER index 80d0afb..9c66dac 100644 --- a/localedata/locales/tig_ER +++ b/localedata/locales/tig_ER @@ -218,5 +218,7 @@ date_fmt "/ / " % +% FIXME: found in CLDR +first_weekday 7 END LC_TIME % diff --git a/localedata/locales/tl_PH b/localedata/locales/tl_PH index 40c6a71..c51deda 100644 --- a/localedata/locales/tl_PH +++ b/localedata/locales/tl_PH @@ -140,7 +140,19 @@ t_fmt_ampm "" + +% "^[hHnN].*" for "No" +noexpr "" + +% "Oo" for "Yes" +yesstr "" + +% "Hindi" for "No" +nostr "" + END LC_MESSAGES LC_PAPER diff --git a/localedata/locales/tn_ZA b/localedata/locales/tn_ZA index c717d1e..54160e5 100644 --- a/localedata/locales/tn_ZA +++ b/localedata/locales/tn_ZA @@ -169,6 +169,8 @@ date_fmt "/ % %Z - time-zone name, % %Y - year with century as a decimal number,e.g. 2001. +% FIXME: found in CLDR +first_weekday 1 END LC_TIME LC_MESSAGES diff --git a/localedata/locales/tr_TR b/localedata/locales/tr_TR index fa44fb0..0d3a873 100644 --- a/localedata/locales/tr_TR +++ b/localedata/locales/tr_TR @@ -61,2067 +61,67 @@ category "tr_TR:2000";LC_MEASUREMENT END LC_IDENTIFICATION LC_COLLATE +define UPPERCASE_FIRST +% Copy the template from ISO/IEC 14651 +copy "iso14651_t1" -% Base collation scheme: 1994-03-22 +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol -% Ordering algorithm: -% 1. Spaces and hyphen (but not soft -% hyphen) before punctuation -% characters, punctuation characters -% before numbers, -% numbers before letters. -% 2. Letters with diacritical marks are -% members of equivalence classes -% 3. A distinction is made with regards -% to case as noted below. -% 4. Special characters are ignored -% when comparing letters, but then -% they are considered -% 5. The alphabets are sorted in order -% of first appearance in ISO 10646: -% Latin, Greek, Cyrillic, etc. -% -% According to Greek specifications, -% the steps 2. and 3. above are reversed -% for the Greek script - -% collating symbols - -% The collating symbol naming is -% mostly taken from ISO 10646-1, -% for example the case and accent -% names are from this standard. - -collating-symbol -collating-symbol -collating-symbol -collating-symbol - -% and -% are for cases like Danish -% and Spanish being treated -% as one letter. - -% The ...... collating -% symbols have defined weights as -% the last character in a group of -% Latin letters. They are used -% to specify deltas by locales using -% a locale as the default ordering -% and by "replace-after" statements -% specifying the changed placement -% in an ordering of a character. - -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol +reorder-after + -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol -collating-symbol +reorder-after + -% letter;accent;case;specials +reorder-after + -order_start forward;backward/ - ;forward;position +reorder-after + -% or letters first: +reorder-after + - - - - +reorder-after + -% Accents: +reorder-after + ;;;IGNORE +reorder-after + ;;;IGNORE - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +reorder-after + ;;;IGNORE +reorder-after + ;;;IGNORE - ;;;IGNORE - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; -<"=> IGNORE;IGNORE;IGNORE;<"=> - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; -UNDEFINED IGNORE;IGNORE;IGNORE +reorder-after + ;;;IGNORE + ;;;IGNORE +reorder-after + ;;;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - "";"";"";IGNORE - "";"";"";IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;;;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE - ;IGNORE;IGNORE;IGNORE +reorder-after + ;;;IGNORE +reorder-after + ;;;IGNORE -% Arabic collating +reorder-after + ;;;IGNORE +reorder-after + ;;;IGNORE - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; - IGNORE;IGNORE;IGNORE; +reorder-after + ;;;IGNORE +reorder-after + ;;;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - IGNORE;IGNORE;;IGNORE - - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - "";"";"";IGNORE - -% katakana/hiragana sorting -% base is katakana, as this is present in most charsets -% normal before voiced before semi-voiced -% small vocals before normal vocals -% katakana before hiragana - - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - ;;IGNORE;IGNORE - -order_end +reorder-end END LC_COLLATE @@ -3540,6 +1540,8 @@ t_fmt_ampm "/ date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 2 END LC_TIME LC_PAPER @@ -3591,10 +1593,10 @@ country_ab2 "" country_ab3 "" % Turkish lang_name "" -% tr +% tur lang_term "" +% tur +lang_lib "" % tr -lang_lib "" -%tr lang_ab "" END LC_ADDRESS diff --git a/localedata/locales/translit_neutral b/localedata/locales/translit_neutral index 5883d28..5712361 100644 --- a/localedata/locales/translit_neutral +++ b/localedata/locales/translit_neutral @@ -128,6 +128,8 @@ include "translit_wide";"" "" % DONG SIGN "" +% COLON SIGN + "" % EURO SIGN "" % TRADE MARK SIGN diff --git a/localedata/locales/ts_ZA b/localedata/locales/ts_ZA index 010cba2..36495b6 100644 --- a/localedata/locales/ts_ZA +++ b/localedata/locales/ts_ZA @@ -164,6 +164,8 @@ date_fmt "/ % %Z - time-zone name, % %Y - year with century as a decimal number,e.g. 2001. +% FIXME: found in CLDR +first_weekday 1 END LC_TIME LC_MESSAGES diff --git a/localedata/locales/tt_RU b/localedata/locales/tt_RU index bfa6bb8..cc963a7 100644 --- a/localedata/locales/tt_RU +++ b/localedata/locales/tt_RU @@ -297,6 +297,8 @@ d_fmt "" t_fmt "" am_pm "";"" t_fmt_ampm "" +% FIXME: found in CLDR +first_weekday 2 END LC_TIME LC_PAPER diff --git a/localedata/locales/uz_UZ b/localedata/locales/uz_UZ index d003bc6..466f8bf 100644 --- a/localedata/locales/uz_UZ +++ b/localedata/locales/uz_UZ @@ -260,6 +260,8 @@ t_fmt "" am_pm "";"" t_fmt_ampm "" date_fmt "" +% FIXME: found in CLDR +first_weekday 7 END LC_TIME LC_MESSAGES diff --git a/localedata/locales/uz_UZ@cyrillic b/localedata/locales/uz_UZ@cyrillic index 6c3f752..88f7ad0 100644 --- a/localedata/locales/uz_UZ@cyrillic +++ b/localedata/locales/uz_UZ@cyrillic @@ -263,6 +263,8 @@ t_fmt "" am_pm "";"" t_fmt_ampm "" date_fmt "" +% FIXME: found in CLDR +first_weekday 7 END LC_TIME LC_MESSAGES diff --git a/localedata/locales/ve_ZA b/localedata/locales/ve_ZA index f715cf5..c5db9a0 100644 --- a/localedata/locales/ve_ZA +++ b/localedata/locales/ve_ZA @@ -166,6 +166,8 @@ date_fmt "/ % %Z - time-zone name, % %Y - year with century as a decimal number,e.g. 2001. +% FIXME: found in CLDR +first_weekday 1 END LC_TIME LC_MESSAGES diff --git a/localedata/locales/vi_VN b/localedata/locales/vi_VN index 582f065..81829fb 100644 --- a/localedata/locales/vi_VN +++ b/localedata/locales/vi_VN @@ -294,6 +294,8 @@ t_fmt "" am_pm "";"" t_fmt_ampm "" date_fmt "" +% FIXME: found in CLDR +first_weekday 2 END LC_TIME % yes: Va^ng / Da. diff --git a/localedata/locales/wa_BE b/localedata/locales/wa_BE index f02e527..f48b2bc 100644 --- a/localedata/locales/wa_BE +++ b/localedata/locales/wa_BE @@ -163,7 +163,8 @@ t_fmt "" am_pm "";"" t_fmt_ampm "" % prumî djoû del samwinne (1=londi) -first_weekday 1 +% FIXME No, 2=lundi +first_weekday 2 END LC_TIME LC_NAME diff --git a/localedata/locales/wal_ET b/localedata/locales/wal_ET index 33953cd..e9f9a9f 100644 --- a/localedata/locales/wal_ET +++ b/localedata/locales/wal_ET @@ -110,7 +110,6 @@ country_num 231 % 210 found in at least one ISO 3166 doc % country_car unknown % country_isbn unknown, Need ISO 2108 lang_name "" -lang_ab "" lang_term "" lang_lib "" @@ -233,5 +232,7 @@ date_fmt "/ / / " +% FIXME: found in CLDR +first_weekday 7 END LC_TIME % diff --git a/localedata/locales/xh_ZA b/localedata/locales/xh_ZA index f0f56ed..319e3f0 100644 --- a/localedata/locales/xh_ZA +++ b/localedata/locales/xh_ZA @@ -164,6 +164,8 @@ date_fmt "/ % time-zone name, % year with century as a decimal number,e.g. 2001. % +% FIXME: found in CLDR +first_weekday 1 END LC_TIME LC_MESSAGES diff --git a/localedata/locales/yi_US b/localedata/locales/yi_US index 134eeed..0e4828c 100644 --- a/localedata/locales/yi_US +++ b/localedata/locales/yi_US @@ -186,6 +186,8 @@ t_fmt "" am_pm "";"" t_fmt_ampm "" cal_direction 3 +% FIXME: found in CLDR +first_weekday 1 END LC_TIME LC_MESSAGES diff --git a/localedata/locales/zh_CN b/localedata/locales/zh_CN index 11df003..cec70f7 100644 --- a/localedata/locales/zh_CN +++ b/localedata/locales/zh_CN @@ -135,6 +135,8 @@ t_fmt_ampm "/ / " +% FIXME: found in CLDR +first_weekday 2 END LC_TIME LC_MESSAGES diff --git a/localedata/locales/zh_HK b/localedata/locales/zh_HK index 1674d81..58b5fbd 100644 --- a/localedata/locales/zh_HK +++ b/localedata/locales/zh_HK @@ -141,6 +141,8 @@ t_fmt_ampm "/ date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 1 END LC_TIME diff --git a/localedata/locales/zh_SG b/localedata/locales/zh_SG index 2d052f4..0f2f64f 100644 --- a/localedata/locales/zh_SG +++ b/localedata/locales/zh_SG @@ -130,6 +130,8 @@ t_fmt "";"";"";/ "";"";"" % d_t_fmt: "%Y%m%d (%A) %H
%M%S" -d_t_fmt "/ +d_t_fmt "/ / / / " -d_fmt "/ +d_fmt "/ " t_fmt "" @@ -128,6 +128,9 @@ date_fmt "/ / " +% FIXME: found in CLDR +first_weekday 1 + END LC_TIME LC_MESSAGES diff --git a/localedata/locales/zu_ZA b/localedata/locales/zu_ZA index b74e6e8..bcfda2f 100644 --- a/localedata/locales/zu_ZA +++ b/localedata/locales/zu_ZA @@ -170,6 +170,8 @@ date_fmt "/ % %Z - time-zone name, % %Y - year with century as a decimal number,e.g. 2001. +% FIXME: found in CLDR +first_weekday 1 END LC_TIME LC_MESSAGES diff --git a/localedata/sort-test.sh b/localedata/sort-test.sh index 67de72e..f880520 100644 --- a/localedata/sort-test.sh +++ b/localedata/sort-test.sh @@ -30,11 +30,17 @@ for l in $lang; do ${common_objpfx}localedata/xfrm-test $id < $cns.in \ > ${common_objpfx}localedata/$cns.xout || here=1 cmp -s $cns.in ${common_objpfx}localedata/$cns.xout || here=1 + LOCPATH=${common_objpfx}localedata GCONV_PATH=${common_objpfx}/iconvdata \ + LC_ALL=$l ${run_program_prefix} \ + ${common_objpfx}localedata/xfrm-test $id -nocache < $cns.in \ + > ${common_objpfx}localedata/$cns.nocache.xout || here=1 + cmp -s $cns.in ${common_objpfx}localedata/$cns.nocache.xout || here=1 if test $here -eq 0; then echo "$l xfrm-test OK" else echo "$l xfrm-test FAIL" diff -u $cns.in ${common_objpfx}localedata/$cns.xout | sed 's/^/ /' + diff -u $cns.in ${common_objpfx}localedata/$cns.nocache.xout | sed 's/^/ /' status=1 fi done diff --git a/localedata/tst-langinfo-static.c b/localedata/tst-langinfo-static.c new file mode 100644 index 0000000..46856a0 --- /dev/null +++ b/localedata/tst-langinfo-static.c @@ -0,0 +1 @@ +#include "tst-langinfo.c" diff --git a/localedata/tst-langinfo.sh b/localedata/tst-langinfo.sh index b169ade..274778a 100755 --- a/localedata/tst-langinfo.sh +++ b/localedata/tst-langinfo.sh @@ -341,7 +341,6 @@ ja_JP.EUC-JP CODESET EUC-JP EOF LOCPATH=${common_objpfx}localedata GCONV_PATH=${common_objpfx}iconvdata \ LC_ALL=tt_TT ${run_program_prefix} \ - ${common_objpfx}localedata/tst-langinfo \ - > ${common_objpfx}localedata/tst-langinfo.out + ${common_objpfx}localedata/tst-langinfo exit $? diff --git a/localedata/xfrm-test.c b/localedata/xfrm-test.c index 199bb6b..4473d49 100644 --- a/localedata/xfrm-test.c +++ b/localedata/xfrm-test.c @@ -24,7 +24,10 @@ #include #include #include +#include +/* Keep in sync with string/strxfrm_l.c. */ +#define SMALL_STR_SIZE 4095 struct lines { @@ -38,6 +41,7 @@ int main (int argc, char *argv[]) { int result = 0; + bool nocache = false; size_t nstrings, nstrings_max; struct lines *strings; char *line = NULL; @@ -45,7 +49,18 @@ main (int argc, char *argv[]) size_t n; if (argc < 2) - error (1, 0, "usage: %s ", argv[0]); + error (1, 0, "usage: %s [-nocache]", argv[0]); + + if (argc == 3) + { + if (strcmp (argv[2], "-nocache") == 0) + nocache = true; + else + { + printf ("Unknown option %s!\n", argv[2]); + exit (1); + } + } setlocale (LC_ALL, ""); @@ -60,9 +75,9 @@ main (int argc, char *argv[]) while (1) { - char saved, *newp; - int needed; - int l; + char saved, *word, *newp; + size_t l, line_len, needed; + if (getline (&line, &len, stdin) < 0) break; @@ -84,10 +99,35 @@ main (int argc, char *argv[]) saved = line[l]; line[l] = '\0'; - needed = strxfrm (NULL, line, 0); + + if (nocache) + { + line_len = strlen (line); + word = malloc (line_len + SMALL_STR_SIZE + 1); + if (word == NULL) + { + printf ("malloc failed: %m\n"); + exit (1); + } + memset (word, ' ', SMALL_STR_SIZE); + memcpy (word + SMALL_STR_SIZE, line, line_len); + word[line_len + SMALL_STR_SIZE] = '\0'; + } + else + word = line; + + needed = strxfrm (NULL, word, 0); newp = malloc (needed + 1); - strxfrm (newp, line, needed + 1); + if (newp == NULL) + { + printf ("malloc failed: %m\n"); + exit (1); + } + strxfrm (newp, word, needed + 1); strings[nstrings].xfrm = newp; + + if (nocache) + free (word); line[l] = saved; ++nstrings; } diff --git a/mach/Makefile b/mach/Makefile index 314f2ef..acfd524 100644 --- a/mach/Makefile +++ b/mach/Makefile @@ -120,7 +120,7 @@ ifndef mach-shortcuts # $(mach-shortcuts) will be set, and that will change how # mach_interface.defs is processed: it will get the -D flags below. user-interfaces := $(filter-out $(mach-interface-list:%=mach/%) \ - mach/mach_port mach/mach_host mach/mach4 \ + mach/mach_port mach/mach_host mach/mach4 mach/gnumach \ device/device_request,\ $(user-interfaces)) endif diff --git a/mach/lock-intern.h b/mach/lock-intern.h index 4aaaedc..a854ddc 100644 --- a/mach/lock-intern.h +++ b/mach/lock-intern.h @@ -29,11 +29,15 @@ /* Initialize LOCK. */ +void __spin_lock_init (__spin_lock_t *__lock); + +#ifdef __USE_EXTERN_INLINES _EXTERN_INLINE void __spin_lock_init (__spin_lock_t *__lock) { *__lock = __SPIN_LOCK_INITIALIZER; } +#endif /* Lock LOCK, blocking if we can't get it. */ @@ -41,12 +45,16 @@ extern void __spin_lock_solid (__spin_lock_t *__lock); /* Lock the spin lock LOCK. */ +void __spin_lock (__spin_lock_t *__lock); + +#ifdef __USE_EXTERN_INLINES _EXTERN_INLINE void __spin_lock (__spin_lock_t *__lock) { if (! __spin_try_lock (__lock)) __spin_lock_solid (__lock); } +#endif /* Name space-clean internal interface to mutex locks. @@ -71,27 +79,39 @@ extern void __mutex_unlock_solid (void *__lock); /* Lock the mutex lock LOCK. */ +void __mutex_lock (void *__lock); + +#ifdef __USE_EXTERN_INLINES _EXTERN_INLINE void __mutex_lock (void *__lock) { if (! __spin_try_lock ((__spin_lock_t *) __lock)) __mutex_lock_solid (__lock); } +#endif /* Unlock the mutex lock LOCK. */ +void __mutex_unlock (void *__lock); + +#ifdef __USE_EXTERN_INLINES _EXTERN_INLINE void __mutex_unlock (void *__lock) { __spin_unlock ((__spin_lock_t *) __lock); __mutex_unlock_solid (__lock); } +#endif +int __mutex_trylock (void *__lock); + +#ifdef __USE_EXTERN_INLINES _EXTERN_INLINE int __mutex_trylock (void *__lock) { return __spin_try_lock ((__spin_lock_t *) __lock); } +#endif #endif /* lock-intern.h */ diff --git a/mach/mach.h b/mach/mach.h index f8fd44b..502db5a 100644 --- a/mach/mach.h +++ b/mach/mach.h @@ -101,5 +101,8 @@ kern_return_t mach_setup_thread (task_t task, thread_t thread, void *pc, vm_address_t *stack_base, vm_size_t *stack_size); +/* Give THREAD a TLS area. */ +kern_return_t __mach_setup_tls (thread_t thread); +kern_return_t mach_setup_tls (thread_t thread); #endif /* mach.h */ diff --git a/mach/mach/mig_support.h b/mach/mach/mig_support.h index f02e8d4..fdd43a6 100644 --- a/mach/mach/mig_support.h +++ b/mach/mach/mig_support.h @@ -67,6 +67,8 @@ extern void mig_reply_setup (const mach_msg_header_t *__request, /* Idiocy support function. */ extern vm_size_t mig_strncpy (char *__dst, const char *__src, vm_size_t __len); extern vm_size_t __mig_strncpy (char *__dst, const char *__src, vm_size_t); + +#ifdef __USE_EXTERN_INLINES __extern_inline vm_size_t __mig_strncpy (char *__dst, const char *__src, vm_size_t __len) { @@ -77,6 +79,7 @@ mig_strncpy (char *__dst, const char *__src, vm_size_t __len) { return __mig_strncpy (__dst, __src, __len); } +#endif diff --git a/mach/setup-thread.c b/mach/setup-thread.c index fecffd9..bf0bfa9 100644 --- a/mach/setup-thread.c +++ b/mach/setup-thread.c @@ -20,6 +20,7 @@ #include #include #include +#include #include "sysdep.h" /* Defines stack direction. */ #define STACK_SIZE (16 * 1024 * 1024) /* 16MB, arbitrary. */ @@ -73,8 +74,35 @@ __mach_setup_thread (task_t task, thread_t thread, void *pc, if (error = __vm_protect (task, stack, __vm_page_size, 0, VM_PROT_NONE)) return error; - return __thread_set_state (thread, MACHINE_THREAD_STATE_FLAVOR, + return __thread_set_state (thread, MACHINE_NEW_THREAD_STATE_FLAVOR, (natural_t *) &ts, tssize); } weak_alias (__mach_setup_thread, mach_setup_thread) + +/* Give THREAD a TLS area. */ +kern_return_t +__mach_setup_tls (thread_t thread) +{ + kern_return_t error; + struct machine_thread_state ts; + mach_msg_type_number_t tssize = MACHINE_THREAD_STATE_COUNT; + tcbhead_t *tcb; + + if (error = __thread_get_state (thread, MACHINE_THREAD_STATE_FLAVOR, + (natural_t *) &ts, &tssize)) + return error; + assert (tssize == MACHINE_THREAD_STATE_COUNT); + + tcb = _dl_allocate_tls(NULL); + if (!tcb) + return KERN_RESOURCE_SHORTAGE; + + _hurd_tls_new(thread, &ts, tcb); + + error = __thread_set_state (thread, MACHINE_THREAD_STATE_FLAVOR, + (natural_t *) &ts, tssize); + return error; +} + +weak_alias (__mach_setup_tls, mach_setup_tls) diff --git a/mach/spin-lock.c b/mach/spin-lock.c index aaebc55..1b1e69c 100644 --- a/mach/spin-lock.c +++ b/mach/spin-lock.c @@ -1,3 +1,4 @@ +#define __USE_EXTERN_INLINES 1 #define _EXTERN_INLINE /* Empty to define the real functions. */ #include "spin-lock.h" diff --git a/malloc/hooks.c b/malloc/hooks.c index 28845ee..c48eaff 100644 --- a/malloc/hooks.c +++ b/malloc/hooks.c @@ -404,10 +404,21 @@ memalign_check(alignment, bytes, caller) if (alignment <= MALLOC_ALIGNMENT) return malloc_check(bytes, NULL); if (alignment < MINSIZE) alignment = MINSIZE; - if (bytes+1 == 0) { - MALLOC_FAILURE_ACTION; - return NULL; - } + /* If the alignment is greater than SIZE_MAX / 2 + 1 it cannot be a + power of 2 and will cause overflow in the check below. */ + if (alignment > SIZE_MAX / 2 + 1) + { + __set_errno (EINVAL); + return 0; + } + + /* Check for overflow. */ + if (bytes > SIZE_MAX - alignment - MINSIZE) + { + MALLOC_FAILURE_ACTION; + return 0; + } + checked_request2size(bytes+1, nb); (void)mutex_lock(&main_arena.mutex); mem = (top_check() >= 0) ? _int_memalign(&main_arena, alignment, bytes+1) : diff --git a/malloc/malloc.c b/malloc/malloc.c index 3e06b87..6eaa85e 100644 --- a/malloc/malloc.c +++ b/malloc/malloc.c @@ -3874,6 +3874,21 @@ public_mEMALIGn(size_t alignment, size_t bytes) /* Otherwise, ensure that it is at least a minimum chunk size */ if (alignment < MINSIZE) alignment = MINSIZE; + /* If the alignment is greater than SIZE_MAX / 2 + 1 it cannot be a + power of 2 and will cause overflow in the check below. */ + if (alignment > SIZE_MAX / 2 + 1) + { + __set_errno (EINVAL); + return 0; + } + + /* Check for overflow. */ + if (bytes > SIZE_MAX - alignment - MINSIZE) + { + __set_errno (ENOMEM); + return 0; + } + arena_get(ar_ptr, bytes + alignment + MINSIZE); if(!ar_ptr) return 0; @@ -3919,6 +3934,13 @@ public_vALLOc(size_t bytes) size_t pagesz = mp_.pagesize; + /* Check for overflow. */ + if (bytes > SIZE_MAX - pagesz - MINSIZE) + { + __set_errno (ENOMEM); + return 0; + } + __malloc_ptr_t (*hook) __MALLOC_PMT ((size_t, size_t, __const __malloc_ptr_t)) = force_reg (__memalign_hook); @@ -3967,6 +3989,13 @@ public_pVALLOc(size_t bytes) size_t page_mask = mp_.pagesize - 1; size_t rounded_bytes = (bytes + page_mask) & ~(page_mask); + /* Check for overflow. */ + if (bytes > SIZE_MAX - 2*pagesz - MINSIZE) + { + __set_errno (ENOMEM); + return 0; + } + __malloc_ptr_t (*hook) __MALLOC_PMT ((size_t, size_t, __const __malloc_ptr_t)) = force_reg (__memalign_hook); diff --git a/manual/Makefile b/manual/Makefile new file mode 100644 index 0000000..c5866eb --- /dev/null +++ b/manual/Makefile @@ -0,0 +1,254 @@ +# Copyright (C) 1992-1999,2000,2001,2002,2003,2004,2006 +# Free Software Foundation, Inc. +# This file is part of the GNU C Library. + +# The GNU C Library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. + +# The GNU C Library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public +# License along with the GNU C Library; if not, write to the Free +# Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +# 02111-1307 USA. + +# Makefile for the GNU C Library manual. + +subdir := manual +export subdir := $(subdir) + +# Allow override +INSTALL_INFO = install-info + +.PHONY: all dvi pdf info html +all: dvi +dvi: libc.dvi +pdf: libc.pdf + +# Get glibc's configuration info. +ifneq (,$(wildcard ../Makeconfig)) +include ../Makeconfig +else +MAKEINFO = makeinfo +TEXI2DVI = texi2dvi +AWK = gawk +endif + +TEXI2PDF = texi2dvi --pdf + +ifneq ($(strip $(MAKEINFO)),:) +all: info +info: libc.info +endif + +# scripts we use +ifndef move-if-change +move-if-change = ./move-if-change +endif +mkinstalldirs = $(..)scripts/mkinstalldirs + +chapters = $(addsuffix .texi, \ + intro errno memory ctype string charset locale \ + message search pattern io stdio llio filesys \ + pipe socket terminal syslog math arith time \ + resource setjmp signal startup process job nss \ + users sysinfo conf crypt debug) +add-chapters = $(wildcard $(foreach d, $(add-ons), ../$d/$d.texi)) +appendices = lang.texi header.texi install.texi maint.texi contrib.texi \ + freemanuals.texi + +-include texis +texis: texis.awk $(chapters) $(add-chapters) $(appendices) lesser.texi fdl.texi + $(AWK) -f $^ > $@.T + mv -f $@.T $@ + +nonexamples = $(filter-out $(add-chapters) %.c.texi, $(texis)) +examples = $(filter-out $(foreach d, $(add-ons), ../$d/%.c.texi), \ + $(filter %.c.texi, $(texis))) + +# Kludge: implicit rule so Make knows the one command does it all. +chapters.% top-menu.%: libc-texinfo.sh $(texis) Makefile + AWK=$(AWK) $(SHELL) $< '$(chapters)' '$(add-chapters)' '$(appendices)' + +libc.dvi libc.pdf libc.info: chapters.texi top-menu.texi dir-add.texi \ + libm-err.texi +libc.dvi libc.pdf: texinfo.tex + +html: libc/index.html +libc/index.html: chapters.texi top-menu.texi dir-add.texi libm-err.texi + $(MAKEINFO) --html libc.texinfo + +# Generate the summary from the Texinfo source files for each chapter. +summary.texi: stamp-summary ; +stamp-summary: summary.awk $(filter-out summary.texi, $(texis)) + $(AWK) -f $^ | sort -t' ' -df -k 1,1 | tr '\014' '\012' > summary-tmp + $(move-if-change) summary-tmp summary.texi + touch $@ + +# Generate a file which can be added to the `dir' content to provide direct +# access to the documentation of the function, variables, and other +# definitions. +dir-add.texi: xtract-typefun.awk $(texis) + (echo "@dircategory GNU C library functions and macros"; \ + echo "@direntry"; \ + $(AWK) -f $^ | sort; \ + echo "@end direntry") > $@.new + mv -f $@.new $@ + +# The table with the math errors is generated. +libm-err.texi: stamp-libm-err +stamp-libm-err: libm-err-tab.pl $(wildcard $(foreach dir,$(sysdirs),\ + $(dir)/libm-test-ulps)) + pwd=`pwd`; \ + $(PERL) $< $$pwd/.. > libm-err-tmp + $(move-if-change) libm-err-tmp libm-err.texi + touch $@ + +# Generate Texinfo files from the C source for the example programs. +%.c.texi: examples/%.c + sed -e 's,[{}],@&,g' \ + -e 's,/\*\(@.*\)\*/,\1,g' \ + -e 's,/\* *,/* @r{,g' -e 's, *\*/,} */,' \ + -e 's/\(@[a-z][a-z]*\)@{\([^}]*\)@}/\1{\2}/g'\ + $< | expand > $@.new + mv -f $@.new $@ + +%.info: %.texinfo + LANGUAGE=C LC_ALL=C $(MAKEINFO) $< + +%.dvi: %.texinfo + $(TEXI2DVI) $< + +%.pdf: %.texinfo + $(TEXI2PDF) $< + +# Distribution. +minimal-dist = summary.awk texis.awk tsort.awk libc-texinfo.sh libc.texinfo \ + libm-err.texi stamp-libm-err \ + $(filter-out summary.texi, $(nonexamples)) \ + $(patsubst %.c.texi,examples/%.c, $(examples)) + +doc-only-dist = Makefile COPYING.LIB +distribute = $(minimal-dist) $(examples) stdio-fp.c \ + libc.info* libc.?? libc.??s texinfo.tex \ + xtract-typefun.awk dir-add.texi dir libm-err-tab.pl +export distribute := $(distribute) + +tar-it = tar chovf $@ $^ + +manual.tar: $(doc-only-dist) $(minimal-dist) ; $(tar-it) +mandist.tar: $(doc-only-dist) $(distribute) ; $(tar-it) + +edition := $(shell sed -n 's/^@set EDITION \([0-9][0-9.]*\)[^0-9.]*.*$$/\1/p' \ + libc.texinfo) + +glibc-doc-$(edition).tar: $(doc-only-dist) $(distribute) + @rm -f glibc-doc-$(edition) + ln -s . glibc-doc-$(edition) + tar chovf $@ $(addprefix glibc-doc-$(edition)/,$^) + rm -f glibc-doc-$(edition) + +%.Z: % + compress -c $< > $@.new + mv -f $@.new $@ +%.gz: % + gzip -9 -c $< > $@.new + mv -f $@.new $@ +%.uu: % + uuencode $< < $< > $@.new + mv -f $@.new $@ + +.PHONY: mostlyclean distclean realclean clean +mostlyclean: + -rm -f libc.dvi libc.pdf libc.tmp libc.info* + -rm -f $(objpfx)stubs + -rm -f $(foreach o,$(object-suffixes-for-libc),$(objpfx)stamp$o) +clean: mostlyclean +distclean: clean +indices = cp fn pg tp vr ky +realclean: distclean + -rm -f texis summary.texi stamp-summary *.c.texi dir-add.texi + -rm -f $(foreach index,$(indices),libc.$(index) libc.$(index)s) + -rm -f libc.log libc.aux libc.toc dir-add.texinfo + -rm -f top-menu.texi chapters.texi + +.PHONY: install subdir_install installdirs install-data +install-data subdir_install: install +ifneq ($(strip $(MAKEINFO)),:) +install: $(inst_infodir)/libc.info + @if $(SHELL) -c '$(INSTALL_INFO) --version' >/dev/null 2>&1; then \ + test -f $(inst_infodir)/dir || $(INSTALL_DATA) dir $(inst_infodir);\ + $(INSTALL_INFO) --info-dir=$(inst_infodir) $(inst_infodir)/libc.info;\ + else : ; fi +endif +# Catchall implicit rule for other installation targets from the parent. +install-%: ; + +$(inst_infodir)/libc.info: libc.info installdirs + for file in $<*; do \ + $(INSTALL_DATA) $$file $(@D)/$$file; \ + done + +installdirs: + $(mkinstalldirs) $(inst_infodir) + +.PHONY: dist +dist: # glibc-doc-$(edition).tar.gz + +ifneq (,$(wildcard ../Make-dist)) +dist: ../Make-dist + $(MAKE) -f $< $(Make-dist-args) +endif + +ifndef ETAGS +ETAGS = etags -T +endif +TAGS: $(minimal-dist) + $(ETAGS) -o $@ $^ + +# The parent makefile sometimes invokes us with targets `subdir_REAL-TARGET'. +subdir_%: % ; +# For targets we don't define, do nothing. +subdir_%: ; + +# These are targets that each glibc subdirectory is expected to understand. +# ../Rules defines them for code subdirectories; for us, they are no-ops. +# None of these should be `subdir_TARGET'; those targets are transformed +# by the implicit rule above into `TARGET' deps. +glibc-targets := lib objects objs others tests xtests lint.out echo-headers +.PHONY: $(glibc-targets) +$(glibc-targets): + +# Create stamp files if they don't exist, so the parent makefile's rules for +# updating the library archives are happy with us, and never think we have +# changed the library. +lib: $(foreach o,$(object-suffixes-for-libc),$(objpfx)stamp$o) +ifdef objpfx +.PHONY: stubs +stubs: $(objpfx)stubs +endif +$(objpfx)stubs ../po/manual.pot $(objpfx)stamp%: + $(make-target-directory) + touch $@ + +# Make the target directory if it doesn't exist, using the `mkinstalldirs' +# script that does `mkdir -p' even if `mkdir' doesn't support that flag. +define make-target-directory +$(addprefix $(mkinstalldirs) ,\ + $(filter-out $(wildcard $(@D:%/=%)),$(@D:%/=%))) +endef + +# The top-level glibc Makefile expects subdir_install to update the stubs file. +subdir_install: stubs + +# Get rid of these variables if they came from the parent. +routines = +aux = +sources = +objects = +headers = diff --git a/math/Makefile b/math/Makefile index 3d5a00c..04cd48e 100644 --- a/math/Makefile +++ b/math/Makefile @@ -92,16 +92,20 @@ distribute += $(filter-out $(generated),$(long-m-yes:=.c) $(long-c-yes:=.c)) # Rules for the test suite. tests = test-matherr test-fenv basic-test \ test-misc test-fpucw tst-definitions test-tgmath test-tgmath-ret \ - bug-nextafter bug-nexttoward bug-tgmath1 test-tgmath-int test-tgmath2 \ + bug-nextafter bug-nexttoward bug-tgmath1 test-tgmath-int \ test-dbl-wrap tests-$(OPTION_EGLIBC_LIBM_BIG) += atest-exp atest-sincos atest-exp2 -# We do the `long double' tests only if this data type is available and -# distinct from `double'. +# We do the `long double' tests only if this data type is available. test-longdouble-yes = test-ldouble test-ildoubl distribute += $(test-longdouble-yes:=.c) +ifeq ($(long-double-fcts),yes) +# If we have distinct types then enable testing. +test-long-double-fcts = yes +endif + ifneq (no,$(PERL)) -libm-tests = test-float test-double $(test-longdouble-$(long-double-fcts)) \ +libm-tests = test-float test-double $(test-longdouble-$(test-long-double-fcts)) \ test-ifloat test-idouble libm-tests.o = $(addsuffix .o,$(libm-tests)) @@ -178,11 +182,15 @@ math-CPPFLAGS += -D__NO_MATH_INLINES -D__LIBC_INTERNAL_MATH_INLINES ifneq ($(long-double-fcts),yes) # The `double' and `long double' types are the same on this machine. # We won't compile the `long double' code at all. Tell the `double' code -# to define aliases for the `FUNCl' names. To avoid type conflicts in -# defining those aliases, tell to declare the `FUNCl' names with -# `double' instead of `long double'. +# to define aliases for the `FUNCl' names. +ifeq ($(header-long-double-fcts),yes) +math-CPPFLAGS += -DNO_LONG_DOUBLE +else +# To avoid type conflicts in defining those aliases, tell to +# declare the `FUNCl' names with `double' instead of `long double'. math-CPPFLAGS += -DNO_LONG_DOUBLE -D_Mlong_double_=double endif +endif # The fdlibm code generates a lot of these warnings but is otherwise clean. override CFLAGS += -Wno-uninitialized diff --git a/misc/Makefile b/misc/Makefile index 65dd1aa..447976d 100644 --- a/misc/Makefile +++ b/misc/Makefile @@ -86,7 +86,7 @@ endif gpl2lgpl := error.c error.h tests := tst-dirname tst-tsearch tst-fdset tst-mntent tst-hsearch \ - tst-pselect tst-insremque tst-mntent2 bug-hsearch1 + tst-pselect tst-insremque tst-mntent2 bug-hsearch1 bug18240 tests-$(OPTION_POSIX_WIDE_CHAR_DEVICE_IO) += tst-error1 tests-$(OPTION_EGLIBC_FCVT) += tst-efgcvt # eglibc: ifeq (no,$(cross-compiling)) diff --git a/misc/bug18240.c b/misc/bug18240.c new file mode 100644 index 0000000..4b26865 --- /dev/null +++ b/misc/bug18240.c @@ -0,0 +1,75 @@ +/* Test integer wraparound in hcreate. + Copyright (C) 2016 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include +#include +#include +#include +#include + +static void +test_size (size_t size) +{ + int res = hcreate (size); + if (res == 0) + { + if (errno == ENOMEM) + return; + printf ("error: hcreate (%zu): %m\n", size); + exit (1); + } + char *keys[100]; + for (int i = 0; i < 100; ++i) + { + if (asprintf (keys + i, "%d", i) < 0) + { + printf ("error: asprintf: %m\n"); + exit (1); + } + ENTRY e = { keys[i], (char *) "value" }; + if (hsearch (e, ENTER) == NULL) + { + printf ("error: hsearch (\"%s\"): %m\n", keys[i]); + exit (1); + } + } + hdestroy (); + + for (int i = 0; i < 100; ++i) + free (keys[i]); +} + +static int +do_test (void) +{ + test_size (500); + test_size (-1); + test_size (-3); + test_size (INT_MAX - 2); + test_size (INT_MAX - 1); + test_size (INT_MAX); + test_size (((unsigned) INT_MAX) + 1); + test_size (UINT_MAX - 2); + test_size (UINT_MAX - 1); + test_size (UINT_MAX); + return 0; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/misc/chflags.c b/misc/chflags.c index b678121..12bdb8f 100644 --- a/misc/chflags.c +++ b/misc/chflags.c @@ -22,12 +22,12 @@ /* Change the flags of FILE to FLAGS. */ -int chflags (const char *file, int flags) __THROW; +int chflags (const char *file, unsigned long int flags) __THROW; int chflags (file, flags) const char *file; - int flags; + unsigned long int flags; { if (file == NULL) { diff --git a/misc/fchflags.c b/misc/fchflags.c index f191194..f64f4f9 100644 --- a/misc/fchflags.c +++ b/misc/fchflags.c @@ -22,12 +22,12 @@ /* Change the flags of the file FD refers to to FLAGS. */ -int fchflags (int fd, int flags) __THROW; +int fchflags (int fd, unsigned long int flags) __THROW; int fchflags (fd, flags) int fd; - int flags; + unsigned long int flags; { if (fd < 0) { diff --git a/misc/hsearch_r.c b/misc/hsearch_r.c index 73b9565..c5108c2 100644 --- a/misc/hsearch_r.c +++ b/misc/hsearch_r.c @@ -21,7 +21,7 @@ #include #include #include - +#include #include /* [Aho,Sethi,Ullman] Compilers: Principles, Techniques and Tools, 1986 @@ -48,15 +48,12 @@ static int isprime (unsigned int number) { /* no even number will be passed */ - unsigned int div = 3; - - while (div * div < number && number % div != 0) - div += 2; - - return number % div != 0; + for (unsigned int div = 3; div <= number / div; div += 2) + if (number % div == 0) + return 0; + return 1; } - /* Before using the hash table we must allocate memory for it. Test for an existing table are done. We allocate one element more as the found prime number says. This is done for more effective @@ -83,10 +80,19 @@ hcreate_r (nel, htab) use will not work. */ if (nel < 3) nel = 3; - /* Change nel to the first prime number not smaller as nel. */ - nel |= 1; /* make odd */ - while (!isprime (nel)) - nel += 2; + + /* Change nel to the first prime number in the range [nel, UINT_MAX - 2], + The '- 2' means 'nel += 2' cannot overflow. */ + for (nel |= 1; ; nel += 2) + { + if (UINT_MAX - 2 < nel) + { + __set_errno (ENOMEM); + return 0; + } + if (isprime (nel)) + break; + } htab->size = nel; htab->filled = 0; diff --git a/misc/madvise.c b/misc/madvise.c index 7a4aa8a..532c874 100644 --- a/misc/madvise.c +++ b/misc/madvise.c @@ -30,5 +30,5 @@ madvise (__ptr_t addr, size_t len, int advice) return -1; } libc_hidden_def (madvise) -stub_warning (madvise) -#include +/* stub_warning (madvise) +#include */ diff --git a/misc/mktemp.c b/misc/mktemp.c index c42fd5e..f15e1ce 100644 --- a/misc/mktemp.c +++ b/misc/mktemp.c @@ -33,4 +33,4 @@ mktemp (template) return template; } -link_warning (mktemp, "the use of `mktemp' is dangerous, better use `mkstemp'") +link_warning (mktemp, "the use of `mktemp' is dangerous, better use `mkstemp' or `mkdtemp'") diff --git a/misc/mntent_r.c b/misc/mntent_r.c index 9598528..69bcc62 100644 --- a/misc/mntent_r.c +++ b/misc/mntent_r.c @@ -263,8 +263,8 @@ __addmntent (FILE *stream, const struct mntent *mnt) mntcopy.mnt_type, mntcopy.mnt_opts, mntcopy.mnt_freq, - mntcopy.mnt_passno) - < 0 ? 1 : 0); + mntcopy.mnt_passno) < 0 + || fflush (stream) != 0); } weak_alias (__addmntent, addmntent) diff --git a/misc/sys/cdefs.h b/misc/sys/cdefs.h index c9495a4..e901888 100644 --- a/misc/sys/cdefs.h +++ b/misc/sys/cdefs.h @@ -350,6 +350,12 @@ # endif #endif +#if __GNUC__ >= 3 +# define __glibc_unlikely(cond) __builtin_expect((cond), 0) +#else +# define __glibc_unlikely(cond) (cond) +#endif + #include #if defined __LONG_DOUBLE_MATH_OPTIONAL && defined __NO_LONG_DOUBLE_MATH diff --git a/nis/nss b/nis/nss index 0ac6774..c43e88b 100644 --- a/nis/nss +++ b/nis/nss @@ -34,4 +34,4 @@ # server cannot be trusted to send the passwd.adjuct table only to # privileged clients. Instead the passwd.adjunct.byname table is # used to synthesize the shadow.byname table if it does not exist. -#ADJUNCT_AS_SHADOW=TRUE +ADJUNCT_AS_SHADOW=TRUE diff --git a/nis/nss_nis/nis-alias.c b/nis/nss_nis/nis-alias.c index 9286e36..a748ec7 100644 --- a/nis/nss_nis/nis-alias.c +++ b/nis/nss_nis/nis-alias.c @@ -142,10 +142,10 @@ internal_nis_getaliasent_r (struct aliasent *alias, char *buffer, int yperr; if (new_start) - yperr = yp_first (domain, "mail.aliases", &outkey, &keylen, &result, + yperr = yp_first (domain, "mail.aliases", &outkey, &keylen, &result, &len); else - yperr = yp_next (domain, "mail.aliases", oldkey, oldkeylen, &outkey, + yperr = yp_next (domain, "mail.aliases", oldkey, oldkeylen, &outkey, &keylen, &result, &len); if (__builtin_expect (yperr != YPERR_SUCCESS, 0)) @@ -153,20 +153,20 @@ internal_nis_getaliasent_r (struct aliasent *alias, char *buffer, enum nss_status retval = yperr2nss (yperr); if (retval == NSS_STATUS_TRYAGAIN) - *errnop = errno; - return retval; - } + *errnop = errno; + return retval; + } if (__builtin_expect ((size_t) (len + 1) > buflen, 0)) - { + { free (result); - *errnop = ERANGE; - return NSS_STATUS_TRYAGAIN; - } + *errnop = ERANGE; + return NSS_STATUS_TRYAGAIN; + } char *p = strncpy (buffer, result, len); buffer[len] = '\0'; while (isspace (*p)) - ++p; + ++p; free (result); parse_res = _nss_nis_parse_aliasent (outkey, p, alias, buffer, @@ -213,13 +213,25 @@ _nss_nis_getaliasbyname_r (const char *name, struct aliasent *alias, return NSS_STATUS_UNAVAIL; } - size_t namlen = strlen (name); - char name2[namlen + 1]; - char *domain; if (__builtin_expect (yp_get_default_domain (&domain), 0)) return NSS_STATUS_UNAVAIL; + size_t namlen = strlen (name); + char *name2; + int use_alloca = __libc_use_alloca (namlen + 1); + if (use_alloca) + name2 = __alloca (namlen + 1); + else + { + name2 = malloc (namlen + 1); + if (name2 == NULL) + { + *errnop = ENOMEM; + return NSS_STATUS_TRYAGAIN; + } + } + /* Convert name to lowercase. */ size_t i; for (i = 0; i < namlen; ++i) @@ -230,6 +242,9 @@ _nss_nis_getaliasbyname_r (const char *name, struct aliasent *alias, int len; int yperr = yp_match (domain, "mail.aliases", name2, namlen, &result, &len); + if (!use_alloca) + free (name2); + if (__builtin_expect (yperr != YPERR_SUCCESS, 0)) { enum nss_status retval = yperr2nss (yperr); diff --git a/nis/nss_nis/nis-netgrp.c b/nis/nss_nis/nis-netgrp.c index 5a88b72..d31fa2b 100644 --- a/nis/nss_nis/nis-netgrp.c +++ b/nis/nss_nis/nis-netgrp.c @@ -72,7 +72,10 @@ _nss_nis_setnetgrent (const char *group, struct __netgrent *netgrp) and the last byte is filled with NUL. So we can simply use that buffer. */ assert (len >= 0); - assert (malloc_usable_size (netgrp->data) >= len + 1); + /* Call to malloc_usable_size disabled, this breaks if applications + redefine malloc/free with a different implementation. + This assert is always true, see yp_match. */ + /* assert (malloc_usable_size (netgrp->data) >= len + 1); */ assert (netgrp->data[len] == '\0'); netgrp->data_size = len; diff --git a/nptl/Makefile b/nptl/Makefile index 2ac4d5c..dc95870 100644 --- a/nptl/Makefile +++ b/nptl/Makefile @@ -279,9 +279,9 @@ tests-$(OPTION_EGLIBC_LOCALE_CODE) += tst-locale1 # Files which must not be linked with libpthread. tests-nolibpthread = tst-unload -# This sets the stack resource limit to 1023kb, which is not a multiple -# of the page size since every architecture's page size is > 1k. -tst-oddstacklimit-ENV = ; ulimit -s 1023; +# This sets the stack resource limit to 8193kb, which is not a multiple +# of the page size since every architecture's page size is 4096 bytes. +tst-oddstacklimit-ENV = ; ulimit -s 8193; distribute = eintr.c tst-cleanup4aux.c @@ -445,6 +445,35 @@ CFLAGS-tst-cleanupx3.c += -fexceptions CFLAGS-tst-cleanupx4.c += -fexceptions CFLAGS-tst-oncex3.c += -fexceptions CFLAGS-tst-oncex4.c += -fexceptions + +ldflags-libgcc_s = -Wl,--as-needed -lgcc_s -Wl,--no-as-needed +LDFLAGS-tst-cancelx2 += $(ldflags-libgcc_s) +LDFLAGS-tst-cancelx3 += $(ldflags-libgcc_s) +LDFLAGS-tst-cancelx4 += $(ldflags-libgcc_s) +LDFLAGS-tst-cancelx5 += $(ldflags-libgcc_s) +LDFLAGS-tst-cancelx6 += $(ldflags-libgcc_s) +LDFLAGS-tst-cancelx7 += $(ldflags-libgcc_s) +LDFLAGS-tst-cancelx8 += $(ldflags-libgcc_s) +LDFLAGS-tst-cancelx9 += $(ldflags-libgcc_s) +LDFLAGS-tst-cancelx10 += $(ldflags-libgcc_s) +LDFLAGS-tst-cancelx11 += $(ldflags-libgcc_s) +LDFLAGS-tst-cancelx12 += $(ldflags-libgcc_s) +LDFLAGS-tst-cancelx13 += $(ldflags-libgcc_s) +LDFLAGS-tst-cancelx14 += $(ldflags-libgcc_s) +LDFLAGS-tst-cancelx15 += $(ldflags-libgcc_s) +LDFLAGS-tst-cancelx16 += $(ldflags-libgcc_s) +LDFLAGS-tst-cancelx17 += $(ldflags-libgcc_s) +LDFLAGS-tst-cancelx18 += $(ldflags-libgcc_s) +LDFLAGS-tst-cancelx20 += $(ldflags-libgcc_s) +LDFLAGS-tst-cancelx21 += $(ldflags-libgcc_s) +LDFLAGS-tst-cleanupx0 += $(ldflags-libgcc_s) +LDFLAGS-tst-cleanupx1 += $(ldflags-libgcc_s) +LDFLAGS-tst-cleanupx2 += $(ldflags-libgcc_s) +LDFLAGS-tst-cleanupx3 += $(ldflags-libgcc_s) +LDFLAGS-tst-cleanupx4 += $(ldflags-libgcc_s) +LDFLAGS-tst-oncex3 += $(ldflags-libgcc_s) +LDFLAGS-tst-oncex4 += $(ldflags-libgcc_s) + CFLAGS-tst-align.c += $(stack-align-test-flags) CFLAGS-tst-align3.c += $(stack-align-test-flags) CFLAGS-tst-initializers1.c = -W -Wall -Werror diff --git a/nptl/allocatestack.c b/nptl/allocatestack.c index 831e98e..4f9893a 100644 --- a/nptl/allocatestack.c +++ b/nptl/allocatestack.c @@ -26,7 +26,9 @@ #include #include #include +#include #include +#include #include #include @@ -241,6 +243,10 @@ get_cached_stack (size_t *sizep, void **memp) /* Clear the DTV. */ dtv_t *dtv = GET_DTV (TLS_TPADJ (result)); + for (size_t cnt = 0; cnt < dtv[-1].counter; ++cnt) + if (! dtv[1 + cnt].pointer.is_static + && dtv[1 + cnt].pointer.val != TLS_DTV_UNALLOCATED) + free (dtv[1 + cnt].pointer.val); memset (dtv, '\0', (dtv[-1].counter + 1) * sizeof (dtv_t)); /* Re-initialize the TLS. */ @@ -356,6 +362,15 @@ allocate_stack (const struct pthread_attr *attr, struct pthread **pdp, if (__builtin_expect (attr->flags & ATTR_FLAG_STACKADDR, 0)) { uintptr_t adj; +#if _STACK_GROWS_DOWN + char * stackaddr = (char *) attr->stackaddr; +#else + /* Assume the same layout as the _STACK_GROWS_DOWN case, + with struct pthread at the top of the stack block. + Later we adjust the guard location and stack address + to match the _STACK_GROWS_UP case. */ + char * stackaddr = (char *) attr->stackaddr + attr->stacksize; +#endif /* If the user also specified the size of the stack make sure it is large enough. */ @@ -365,11 +380,11 @@ allocate_stack (const struct pthread_attr *attr, struct pthread **pdp, /* Adjust stack size for alignment of the TLS block. */ #if TLS_TCB_AT_TP - adj = ((uintptr_t) attr->stackaddr - TLS_TCB_SIZE) + adj = ((uintptr_t) stackaddr - TLS_TCB_SIZE) & __static_tls_align_m1; assert (size > adj + TLS_TCB_SIZE); #elif TLS_DTV_AT_TP - adj = ((uintptr_t) attr->stackaddr - __static_tls_size) + adj = ((uintptr_t) stackaddr - __static_tls_size) & __static_tls_align_m1; assert (size > adj); #endif @@ -379,10 +394,10 @@ allocate_stack (const struct pthread_attr *attr, struct pthread **pdp, the stack. It is the user's responsibility to do this if it is wanted. */ #if TLS_TCB_AT_TP - pd = (struct pthread *) ((uintptr_t) attr->stackaddr + pd = (struct pthread *) ((uintptr_t) stackaddr - TLS_TCB_SIZE - adj); #elif TLS_DTV_AT_TP - pd = (struct pthread *) (((uintptr_t) attr->stackaddr + pd = (struct pthread *) (((uintptr_t) stackaddr - __static_tls_size - adj) - TLS_PRE_TCB_SIZE); #endif @@ -394,7 +409,7 @@ allocate_stack (const struct pthread_attr *attr, struct pthread **pdp, pd->specific[0] = pd->specific_1stblock; /* Remember the stack-related values. */ - pd->stackblock = (char *) attr->stackaddr - size; + pd->stackblock = (char *) stackaddr - size; pd->stackblock_size = size; /* This is a user-provided stack. It will not be queued in the @@ -625,7 +640,7 @@ allocate_stack (const struct pthread_attr *attr, struct pthread **pdp, char *guard = mem + (((size - guardsize) / 2) & ~pagesize_m1); #elif _STACK_GROWS_DOWN char *guard = mem; -# elif _STACK_GROWS_UP +#elif _STACK_GROWS_UP char *guard = (char *) (((uintptr_t) pd - guardsize) & ~pagesize_m1); #endif if (mprotect (guard, guardsize, PROT_NONE) != 0) @@ -678,9 +693,13 @@ allocate_stack (const struct pthread_attr *attr, struct pthread **pdp, prot) != 0) goto mprot_error; #elif _STACK_GROWS_UP - if (mprotect ((char *) pd - pd->guardsize, - pd->guardsize - guardsize, prot) != 0) - goto mprot_error; + char *new_guard = (char *) (((uintptr_t) pd - guardsize) & ~pagesize_m1); + char *old_guard = (char *) (((uintptr_t) pd - pd->guardsize) & ~pagesize_m1); + /* The guard size difference might be > 0, but once rounded + to the nearest page the size difference might be zero. */ + if (old_guard - new_guard > 0) + if (mprotect (old_guard, new_guard - old_guard, prot) != 0) + goto mprot_error; #endif pd->guardsize = guardsize; @@ -723,8 +742,10 @@ allocate_stack (const struct pthread_attr *attr, struct pthread **pdp, #elif _STACK_GROWS_DOWN *stack = stacktop; #elif _STACK_GROWS_UP + /* We don't use stacktop. In _STACK_GROWS_UP the start + of the stack is simply stackblock (lowest address of + the stored block of memory for the stack). */ *stack = pd->stackblock; - assert (*stack > 0); #endif return 0; diff --git a/nptl/descr.h b/nptl/descr.h index 9c366e7..e57e29e 100644 --- a/nptl/descr.h +++ b/nptl/descr.h @@ -26,6 +26,7 @@ #include #include #include +#define __need_list_t #include #include #include diff --git a/nptl/nptl-init.c b/nptl/nptl-init.c index 851bab2..f5f93dd 100644 --- a/nptl/nptl-init.c +++ b/nptl/nptl-init.c @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include diff --git a/nptl/pthreadP.h b/nptl/pthreadP.h index 43ca44c..0451dca 100644 --- a/nptl/pthreadP.h +++ b/nptl/pthreadP.h @@ -207,8 +207,8 @@ extern int __pthread_debug attribute_hidden; /* Simplified test. This will not catch all invalid descriptors but is better than nothing. And if the test triggers the thread descriptor is guaranteed to be invalid. */ -# define INVALID_TD_P(pd) __builtin_expect ((pd)->tid <= 0, 0) -# define INVALID_NOT_TERMINATED_TD_P(pd) __builtin_expect ((pd)->tid < 0, 0) +# define INVALID_TD_P(pd) __builtin_expect (!pd || ((pd)->tid <= 0), 0) +# define INVALID_NOT_TERMINATED_TD_P(pd) __builtin_expect (!pd || ((pd)->tid < 0), 0) #endif diff --git a/nptl/pthread_attr_getstack.c b/nptl/pthread_attr_getstack.c index 1db135e..54e754f 100644 --- a/nptl/pthread_attr_getstack.c +++ b/nptl/pthread_attr_getstack.c @@ -33,7 +33,11 @@ __pthread_attr_getstack (attr, stackaddr, stacksize) iattr = (struct pthread_attr *) attr; /* Store the result. */ +#ifdef _STACK_GROWS_DOWN *stackaddr = (char *) iattr->stackaddr - iattr->stacksize; +#else + *stackaddr = (char *) iattr->stackaddr; +#endif *stacksize = iattr->stacksize; return 0; diff --git a/nptl/pthread_attr_setstack.c b/nptl/pthread_attr_setstack.c index be79e32..aa60d8f 100644 --- a/nptl/pthread_attr_setstack.c +++ b/nptl/pthread_attr_setstack.c @@ -48,7 +48,11 @@ __pthread_attr_setstack (attr, stackaddr, stacksize) #endif iattr->stacksize = stacksize; +#if _STACK_GROWS_DOWN iattr->stackaddr = (char *) stackaddr + stacksize; +#else + iattr->stackaddr = (char *) stackaddr; +#endif iattr->flags |= ATTR_FLAG_STACKADDR; return 0; @@ -81,7 +85,11 @@ __old_pthread_attr_setstack (pthread_attr_t *attr, void *stackaddr, # endif iattr->stacksize = stacksize; +#if _STACK_GROWS_DOWN iattr->stackaddr = (char *) stackaddr + stacksize; +#else + iattr->stackaddr = (char *) stackaddr; +#endif iattr->flags |= ATTR_FLAG_STACKADDR; return 0; diff --git a/nptl/pthread_barrier_wait.c b/nptl/pthread_barrier_wait.c index 9d80cad..c15b6ac 100644 --- a/nptl/pthread_barrier_wait.c +++ b/nptl/pthread_barrier_wait.c @@ -64,7 +64,7 @@ pthread_barrier_wait (barrier) do lll_futex_wait (&ibarrier->curr_event, event, ibarrier->private ^ FUTEX_PRIVATE_FLAG); - while (event == ibarrier->curr_event); + while (event == *(volatile unsigned int *)&ibarrier->curr_event); } /* Make sure the init_count is stored locally or in a register. */ diff --git a/nptl/pthread_create.c b/nptl/pthread_create.c index 649cdae..879a218 100644 --- a/nptl/pthread_create.c +++ b/nptl/pthread_create.c @@ -392,12 +392,25 @@ start_thread (void *arg) #ifdef _STACK_GROWS_DOWN char *sp = CURRENT_STACK_FRAME; size_t freesize = (sp - (char *) pd->stackblock) & ~pagesize_m1; -#else -# error "to do" -#endif assert (freesize < pd->stackblock_size); if (freesize > PTHREAD_STACK_MIN) madvise (pd->stackblock, freesize - PTHREAD_STACK_MIN, MADV_DONTNEED); +#else + /* Page aligned start of memory to free (higher than or equal + to current sp plus the minimum stack size). */ + void *freeblock = (void*)((size_t)(CURRENT_STACK_FRAME + + PTHREAD_STACK_MIN + + pagesize_m1) + & ~pagesize_m1); + char *free_end = (char *) (((uintptr_t) pd - pd->guardsize) & ~pagesize_m1); + /* Is there any space to free? */ + if (free_end > (char *)freeblock) + { + size_t freesize = (size_t)(free_end - (char *)freeblock); + assert (freesize < pd->stackblock_size); + madvise (freeblock, freesize, MADV_DONTNEED); + } +#endif /* If the thread is detached free the TCB. */ if (IS_DETACHED (pd)) diff --git a/nptl/pthread_getattr_np.c b/nptl/pthread_getattr_np.c index 9c25caf..1b694cc 100644 --- a/nptl/pthread_getattr_np.c +++ b/nptl/pthread_getattr_np.c @@ -61,7 +61,11 @@ pthread_getattr_np (thread_id, attr) if (__builtin_expect (thread->stackblock != NULL, 1)) { iattr->stacksize = thread->stackblock_size; +#ifdef _STACK_GROWS_DOWN iattr->stackaddr = (char *) thread->stackblock + iattr->stacksize; +#else + iattr->stackaddr = (char *) thread->stackblock; +#endif } else { @@ -110,13 +114,21 @@ pthread_getattr_np (thread_id, attr) { /* Found the entry. Now we have the info we need. */ iattr->stacksize = rl.rlim_cur; +#ifdef _STACK_GROWS_DOWN iattr->stackaddr = (void *) to; /* The limit might be too high. */ if ((size_t) iattr->stacksize > (size_t) iattr->stackaddr - last_to) iattr->stacksize = (size_t) iattr->stackaddr - last_to; +#else + iattr->stackaddr = (void *) from; + /* The limit might be too high. */ + if ((size_t) iattr->stacksize + > to - (size_t) iattr->stackaddr) + iattr->stacksize = to - (size_t) iattr->stackaddr; +#endif /* We succeed and no need to look further. */ ret = 0; break; diff --git a/nptl/pthread_mutex_trylock.c b/nptl/pthread_mutex_trylock.c index 25029be..20a40a2 100644 --- a/nptl/pthread_mutex_trylock.c +++ b/nptl/pthread_mutex_trylock.c @@ -240,7 +240,8 @@ __pthread_mutex_trylock (mutex) private), 0, 0); if (INTERNAL_SYSCALL_ERROR_P (e, __err) - && INTERNAL_SYSCALL_ERRNO (e, __err) == EWOULDBLOCK) + && ((INTERNAL_SYSCALL_ERRNO (e, __err) == EWOULDBLOCK) + || (INTERNAL_SYSCALL_ERRNO (e, __err) == EAGAIN))) { THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, NULL); diff --git a/nptl/sysdeps/pthread/Makefile b/nptl/sysdeps/pthread/Makefile index 0f2f749..418d5f0 100644 --- a/nptl/sysdeps/pthread/Makefile +++ b/nptl/sysdeps/pthread/Makefile @@ -36,7 +36,9 @@ endif ifeq ($(have-forced-unwind),yes) tests += tst-mqueue8x +ldflags-libgcc_s = -Wl,--as-needed -lgcc_s -Wl,--no-as-needed CFLAGS-tst-mqueue8x.c += -fexceptions +LDFLAGS-tst-mqueue8x += $(ldflags-libgcc_s) endif endif diff --git a/nptl/sysdeps/pthread/aio_misc.h b/nptl/sysdeps/pthread/aio_misc.h index f36825e..edef3d4 100644 --- a/nptl/sysdeps/pthread/aio_misc.h +++ b/nptl/sysdeps/pthread/aio_misc.h @@ -51,7 +51,7 @@ { \ status = lll_futex_timed_wait (futexaddr, oldval, timeout, \ LLL_PRIVATE); \ - if (status != -EWOULDBLOCK) \ + if (status != -EWOULDBLOCK && status != -EAGAIN) \ break; \ \ oldval = *futexaddr; \ @@ -66,7 +66,7 @@ else if (status == -ETIMEDOUT) \ result = EAGAIN; \ else \ - assert (status == 0 || status == -EWOULDBLOCK); \ + assert (status == 0 || status == -EWOULDBLOCK || status == -EAGAIN);\ \ pthread_mutex_lock (&__aio_requests_mutex); \ } \ diff --git a/nptl/sysdeps/pthread/bits/libc-lock.h b/nptl/sysdeps/pthread/bits/libc-lock.h index b38f958..02db663 100644 --- a/nptl/sysdeps/pthread/bits/libc-lock.h +++ b/nptl/sysdeps/pthread/bits/libc-lock.h @@ -451,6 +451,9 @@ libc_hidden_proto (__libc_lock_unlock_recursive_fn); } \ } while (0) +/* Get once control variable. */ +#define __libc_once_get(ONCE_CONTROL) \ + ((ONCE_CONTROL) != PTHREAD_ONCE_INIT) /* Note that for I/O cleanup handling we are using the old-style cancel handling. It does not have to be integrated with C++ snce diff --git a/nptl/sysdeps/pthread/gai_misc.h b/nptl/sysdeps/pthread/gai_misc.h index 9094c1e..7591d93 100644 --- a/nptl/sysdeps/pthread/gai_misc.h +++ b/nptl/sysdeps/pthread/gai_misc.h @@ -52,7 +52,7 @@ { \ status = lll_futex_timed_wait (futexaddr, oldval, timeout, \ LLL_PRIVATE); \ - if (status != -EWOULDBLOCK) \ + if (status != -EWOULDBLOCK && status != -EAGAIN) \ break; \ \ oldval = *futexaddr; \ @@ -67,7 +67,7 @@ else if (status == -ETIMEDOUT) \ result = EAGAIN; \ else \ - assert (status == 0 || status == -EWOULDBLOCK); \ + assert (status == 0 || status == -EWOULDBLOCK || status == -EAGAIN);\ \ pthread_mutex_lock (&__gai_requests_mutex); \ } \ diff --git a/nptl/sysdeps/pthread/list.h b/nptl/sysdeps/pthread/list.h index 6ddccb9..cfc4aba 100644 --- a/nptl/sysdeps/pthread/list.h +++ b/nptl/sysdeps/pthread/list.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2002, 2009 Free Software Foundation, Inc. +/* Copyright (C) 2002, 2009, 2011 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 2002. @@ -18,27 +18,39 @@ 02111-1307 USA. */ #ifndef _LIST_H -#define _LIST_H 1 + +#ifndef __need_list_t +# define _LIST_H 1 +#endif /* The definitions of this file are adopted from those which can be found in the Linux kernel headers to enable people familiar with the latter find their way in these sources as well. */ +#if defined __need_list_t || defined _LIST_H +# ifndef __list_t_defined +# define __list_t_defined /* Basic type for the double-link list. */ typedef struct list_head { struct list_head *next; struct list_head *prev; } list_t; +# endif +# undef __need_list_t +#endif + +#ifdef _LIST_H +# include /* Define a variable with the head and tail of the list. */ -#define LIST_HEAD(name) \ +# define LIST_HEAD(name) \ list_t name = { &(name), &(name) } /* Initialize a new list head. */ -#define INIT_LIST_HEAD(ptr) \ +# define INIT_LIST_HEAD(ptr) \ (ptr)->next = (ptr)->prev = (ptr) @@ -49,6 +61,7 @@ list_add (list_t *newp, list_t *head) newp->next = head->next; newp->prev = head; head->next->prev = newp; + atomic_write_barrier (); head->next = newp; } @@ -78,26 +91,28 @@ list_splice (list_t *add, list_t *head) /* Get typed element from list at a given position. */ -#define list_entry(ptr, type, member) \ +# define list_entry(ptr, type, member) \ ((type *) ((char *) (ptr) - (unsigned long) (&((type *) 0)->member))) /* Iterate forward over the elements of the list. */ -#define list_for_each(pos, head) \ +# define list_for_each(pos, head) \ for (pos = (head)->next; pos != (head); pos = pos->next) /* Iterate forward over the elements of the list. */ -#define list_for_each_prev(pos, head) \ +# define list_for_each_prev(pos, head) \ for (pos = (head)->prev; pos != (head); pos = pos->prev) /* Iterate backwards over the elements list. The list elements can be removed from the list while doing this. */ -#define list_for_each_prev_safe(pos, p, head) \ +# define list_for_each_prev_safe(pos, p, head) \ for (pos = (head)->prev, p = pos->prev; \ pos != (head); \ pos = p, p = pos->prev) +#endif /* _LIST_H */ + #endif /* list.h */ diff --git a/nptl/sysdeps/pthread/pthread.h b/nptl/sysdeps/pthread/pthread.h index 4c83665..f09c663 100644 --- a/nptl/sysdeps/pthread/pthread.h +++ b/nptl/sysdeps/pthread/pthread.h @@ -652,7 +652,7 @@ __pthread_cleanup_routine (struct __pthread_cleanup_frame *__frame) void *__cancel_arg = (arg); \ int __not_first_call = __sigsetjmp ((struct __jmp_buf_tag *) (void *) \ __cancel_buf.__cancel_jmp_buf, 0); \ - if (__builtin_expect (__not_first_call, 0)) \ + if (__glibc_unlikely (__not_first_call)) \ { \ __cancel_routine (__cancel_arg); \ __pthread_unwind_next (&__cancel_buf); \ @@ -687,7 +687,7 @@ extern void __pthread_unregister_cancel (__pthread_unwind_buf_t *__buf) void *__cancel_arg = (arg); \ int __not_first_call = __sigsetjmp ((struct __jmp_buf_tag *) (void *) \ __cancel_buf.__cancel_jmp_buf, 0); \ - if (__builtin_expect (__not_first_call, 0)) \ + if (__glibc_unlikely (__not_first_call)) \ { \ __cancel_routine (__cancel_arg); \ __pthread_unwind_next (&__cancel_buf); \ diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S deleted file mode 100644 index 53970d7..0000000 --- a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S +++ /dev/null @@ -1,592 +0,0 @@ -/* Copyright (C) 2002-2004,2006-2007,2009,2010 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper , 2002. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, write to the Free - Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307 USA. */ - -#include -#include -#include -#include -#include -#include -#include -#include - - - .text - -/* int pthread_cond_wait (pthread_cond_t *cond, pthread_mutex_t *mutex) */ - .globl __pthread_cond_wait - .type __pthread_cond_wait, @function - .align 16 -__pthread_cond_wait: -.LSTARTCODE: - cfi_startproc -#ifdef SHARED - cfi_personality(DW_EH_PE_pcrel | DW_EH_PE_sdata4 | DW_EH_PE_indirect, - DW.ref.__gcc_personality_v0) - cfi_lsda(DW_EH_PE_pcrel | DW_EH_PE_sdata4, .LexceptSTART) -#else - cfi_personality(DW_EH_PE_udata4, __gcc_personality_v0) - cfi_lsda(DW_EH_PE_udata4, .LexceptSTART) -#endif - - pushl %ebp - cfi_adjust_cfa_offset(4) - cfi_rel_offset(%ebp, 0) - pushl %edi - cfi_adjust_cfa_offset(4) - cfi_rel_offset(%edi, 0) - pushl %esi - cfi_adjust_cfa_offset(4) - cfi_rel_offset(%esi, 0) - pushl %ebx - cfi_adjust_cfa_offset(4) - cfi_rel_offset(%ebx, 0) - - xorl %esi, %esi - movl 20(%esp), %ebx - - /* Get internal lock. */ - movl $1, %edx - xorl %eax, %eax - LOCK -#if cond_lock == 0 - cmpxchgl %edx, (%ebx) -#else - cmpxchgl %edx, cond_lock(%ebx) -#endif - jnz 1f - - /* Store the reference to the mutex. If there is already a - different value in there this is a bad user bug. */ -2: cmpl $-1, dep_mutex(%ebx) - movl 24(%esp), %eax - je 15f - movl %eax, dep_mutex(%ebx) - - /* Unlock the mutex. */ -15: xorl %edx, %edx - call __pthread_mutex_unlock_usercnt - - testl %eax, %eax - jne 12f - - addl $1, total_seq(%ebx) - adcl $0, total_seq+4(%ebx) - addl $1, cond_futex(%ebx) - addl $(1 << nwaiters_shift), cond_nwaiters(%ebx) - -#define FRAME_SIZE 20 - subl $FRAME_SIZE, %esp - cfi_adjust_cfa_offset(FRAME_SIZE) - cfi_remember_state - - /* Get and store current wakeup_seq value. */ - movl wakeup_seq(%ebx), %edi - movl wakeup_seq+4(%ebx), %edx - movl broadcast_seq(%ebx), %eax - movl %edi, 4(%esp) - movl %edx, 8(%esp) - movl %eax, 12(%esp) - - /* Reset the pi-requeued flag. */ -8: movl $0, 16(%esp) - movl cond_futex(%ebx), %ebp - - /* Unlock. */ - LOCK -#if cond_lock == 0 - subl $1, (%ebx) -#else - subl $1, cond_lock(%ebx) -#endif - jne 3f - -.LcleanupSTART: -4: call __pthread_enable_asynccancel - movl %eax, (%esp) - - xorl %ecx, %ecx - cmpl $-1, dep_mutex(%ebx) - sete %cl - je 18f - - movl dep_mutex(%ebx), %edi - /* Requeue to a non-robust PI mutex if the PI bit is set and - the robust bit is not set. */ - movl MUTEX_KIND(%edi), %eax - andl $(ROBUST_BIT|PI_BIT), %eax - cmpl $PI_BIT, %eax - jne 18f - - movl $(FUTEX_WAIT_REQUEUE_PI|FUTEX_PRIVATE_FLAG), %ecx - movl %ebp, %edx - xorl %esi, %esi - addl $cond_futex, %ebx - movl $SYS_futex, %eax - ENTER_KERNEL - subl $cond_futex, %ebx - /* Set the pi-requeued flag only if the kernel has returned 0. The - kernel does not hold the mutex on error. */ - cmpl $0, %eax - sete 16(%esp) - je 19f - - /* Normal and PI futexes dont mix. Use normal futex functions only - if the kernel does not support the PI futex functions. */ - cmpl $-ENOSYS, %eax - jne 19f - xorl %ecx, %ecx - -18: subl $1, %ecx -#ifdef __ASSUME_PRIVATE_FUTEX - andl $FUTEX_PRIVATE_FLAG, %ecx -#else - andl %gs:PRIVATE_FUTEX, %ecx -#endif -#if FUTEX_WAIT != 0 - addl $FUTEX_WAIT, %ecx -#endif - movl %ebp, %edx - addl $cond_futex, %ebx -.Ladd_cond_futex: - movl $SYS_futex, %eax - ENTER_KERNEL - subl $cond_futex, %ebx -.Lsub_cond_futex: - -19: movl (%esp), %eax - call __pthread_disable_asynccancel -.LcleanupEND: - - /* Lock. */ - movl $1, %edx - xorl %eax, %eax - LOCK -#if cond_lock == 0 - cmpxchgl %edx, (%ebx) -#else - cmpxchgl %edx, cond_lock(%ebx) -#endif - jnz 5f - -6: movl broadcast_seq(%ebx), %eax - cmpl 12(%esp), %eax - jne 16f - - movl woken_seq(%ebx), %eax - movl woken_seq+4(%ebx), %ecx - - movl wakeup_seq(%ebx), %edi - movl wakeup_seq+4(%ebx), %edx - - cmpl 8(%esp), %edx - jne 7f - cmpl 4(%esp), %edi - je 8b - -7: cmpl %ecx, %edx - jne 9f - cmp %eax, %edi - je 8b - -9: addl $1, woken_seq(%ebx) - adcl $0, woken_seq+4(%ebx) - - /* Unlock */ -16: subl $(1 << nwaiters_shift), cond_nwaiters(%ebx) - - /* Wake up a thread which wants to destroy the condvar object. */ - movl total_seq(%ebx), %eax - andl total_seq+4(%ebx), %eax - cmpl $0xffffffff, %eax - jne 17f - movl cond_nwaiters(%ebx), %eax - andl $~((1 << nwaiters_shift) - 1), %eax - jne 17f - - addl $cond_nwaiters, %ebx - movl $SYS_futex, %eax -#if FUTEX_PRIVATE_FLAG > 255 - xorl %ecx, %ecx -#endif - cmpl $-1, dep_mutex-cond_nwaiters(%ebx) - sete %cl - subl $1, %ecx -#ifdef __ASSUME_PRIVATE_FUTEX - andl $FUTEX_PRIVATE_FLAG, %ecx -#else - andl %gs:PRIVATE_FUTEX, %ecx -#endif - addl $FUTEX_WAKE, %ecx - movl $1, %edx - ENTER_KERNEL - subl $cond_nwaiters, %ebx - -17: LOCK -#if cond_lock == 0 - subl $1, (%ebx) -#else - subl $1, cond_lock(%ebx) -#endif - jne 10f - - /* With requeue_pi, the mutex lock is held in the kernel. */ -11: movl 24+FRAME_SIZE(%esp), %eax - movl 16(%esp), %ecx - testl %ecx, %ecx - jnz 21f - - call __pthread_mutex_cond_lock -20: addl $FRAME_SIZE, %esp - cfi_adjust_cfa_offset(-FRAME_SIZE); - -14: popl %ebx - cfi_adjust_cfa_offset(-4) - cfi_restore(%ebx) - popl %esi - cfi_adjust_cfa_offset(-4) - cfi_restore(%esi) - popl %edi - cfi_adjust_cfa_offset(-4) - cfi_restore(%edi) - popl %ebp - cfi_adjust_cfa_offset(-4) - cfi_restore(%ebp) - - /* We return the result of the mutex_lock operation. */ - ret - - cfi_restore_state - -21: call __pthread_mutex_cond_lock_adjust - xorl %eax, %eax - jmp 20b - - cfi_adjust_cfa_offset(-FRAME_SIZE); - /* Initial locking failed. */ -1: -#if cond_lock == 0 - movl %ebx, %edx -#else - leal cond_lock(%ebx), %edx -#endif -#if (LLL_SHARED-LLL_PRIVATE) > 255 - xorl %ecx, %ecx -#endif - cmpl $-1, dep_mutex(%ebx) - setne %cl - subl $1, %ecx - andl $(LLL_SHARED-LLL_PRIVATE), %ecx -#if LLL_PRIVATE != 0 - addl $LLL_PRIVATE, %ecx -#endif - call __lll_lock_wait - jmp 2b - - /* The initial unlocking of the mutex failed. */ -12: - LOCK -#if cond_lock == 0 - subl $1, (%ebx) -#else - subl $1, cond_lock(%ebx) -#endif - jne 14b - - movl %eax, %esi -#if cond_lock == 0 - movl %ebx, %eax -#else - leal cond_lock(%ebx), %eax -#endif -#if (LLL_SHARED-LLL_PRIVATE) > 255 - xorl %ecx, %ecx -#endif - cmpl $-1, dep_mutex(%ebx) - setne %cl - subl $1, %ecx - andl $(LLL_SHARED-LLL_PRIVATE), %ecx -#if LLL_PRIVATE != 0 - addl $LLL_PRIVATE, %ecx -#endif - call __lll_unlock_wake - - movl %esi, %eax - jmp 14b - - cfi_adjust_cfa_offset(FRAME_SIZE) - - /* Unlock in loop requires wakeup. */ -3: -#if cond_lock == 0 - movl %ebx, %eax -#else - leal cond_lock(%ebx), %eax -#endif -#if (LLL_SHARED-LLL_PRIVATE) > 255 - xorl %ecx, %ecx -#endif - cmpl $-1, dep_mutex(%ebx) - setne %cl - subl $1, %ecx - andl $(LLL_SHARED-LLL_PRIVATE), %ecx -#if LLL_PRIVATE != 0 - addl $LLL_PRIVATE, %ecx -#endif - call __lll_unlock_wake - jmp 4b - - /* Locking in loop failed. */ -5: -#if cond_lock == 0 - movl %ebx, %edx -#else - leal cond_lock(%ebx), %edx -#endif -#if (LLL_SHARED-LLL_PRIVATE) > 255 - xorl %ecx, %ecx -#endif - cmpl $-1, dep_mutex(%ebx) - setne %cl - subl $1, %ecx - andl $(LLL_SHARED-LLL_PRIVATE), %ecx -#if LLL_PRIVATE != 0 - addl $LLL_PRIVATE, %ecx -#endif - call __lll_lock_wait - jmp 6b - - /* Unlock after loop requires wakeup. */ -10: -#if cond_lock == 0 - movl %ebx, %eax -#else - leal cond_lock(%ebx), %eax -#endif -#if (LLL_SHARED-LLL_PRIVATE) > 255 - xorl %ecx, %ecx -#endif - cmpl $-1, dep_mutex(%ebx) - setne %cl - subl $1, %ecx - andl $(LLL_SHARED-LLL_PRIVATE), %ecx -#if LLL_PRIVATE != 0 - addl $LLL_PRIVATE, %ecx -#endif - call __lll_unlock_wake - jmp 11b - .size __pthread_cond_wait, .-__pthread_cond_wait -versioned_symbol (libpthread, __pthread_cond_wait, pthread_cond_wait, - GLIBC_2_3_2) - - - .type __condvar_w_cleanup2, @function -__condvar_w_cleanup2: - subl $cond_futex, %ebx - .size __condvar_w_cleanup2, .-__condvar_w_cleanup2 -.LSbl4: - .type __condvar_w_cleanup, @function -__condvar_w_cleanup: - movl %eax, %esi - - /* Get internal lock. */ - movl $1, %edx - xorl %eax, %eax - LOCK -#if cond_lock == 0 - cmpxchgl %edx, (%ebx) -#else - cmpxchgl %edx, cond_lock(%ebx) -#endif - jz 1f - -#if cond_lock == 0 - movl %ebx, %edx -#else - leal cond_lock(%ebx), %edx -#endif -#if (LLL_SHARED-LLL_PRIVATE) > 255 - xorl %ecx, %ecx -#endif - cmpl $-1, dep_mutex(%ebx) - setne %cl - subl $1, %ecx - andl $(LLL_SHARED-LLL_PRIVATE), %ecx -#if LLL_PRIVATE != 0 - addl $LLL_PRIVATE, %ecx -#endif - call __lll_lock_wait - -1: movl broadcast_seq(%ebx), %eax - cmpl 12(%esp), %eax - jne 3f - - /* We increment the wakeup_seq counter only if it is lower than - total_seq. If this is not the case the thread was woken and - then canceled. In this case we ignore the signal. */ - movl total_seq(%ebx), %eax - movl total_seq+4(%ebx), %edi - cmpl wakeup_seq+4(%ebx), %edi - jb 6f - ja 7f - cmpl wakeup_seq(%ebx), %eax - jbe 7f - -6: addl $1, wakeup_seq(%ebx) - adcl $0, wakeup_seq+4(%ebx) - addl $1, cond_futex(%ebx) - -7: addl $1, woken_seq(%ebx) - adcl $0, woken_seq+4(%ebx) - -3: subl $(1 << nwaiters_shift), cond_nwaiters(%ebx) - - /* Wake up a thread which wants to destroy the condvar object. */ - xorl %edi, %edi - movl total_seq(%ebx), %eax - andl total_seq+4(%ebx), %eax - cmpl $0xffffffff, %eax - jne 4f - movl cond_nwaiters(%ebx), %eax - andl $~((1 << nwaiters_shift) - 1), %eax - jne 4f - - addl $cond_nwaiters, %ebx - movl $SYS_futex, %eax -#if FUTEX_PRIVATE_FLAG > 255 - xorl %ecx, %ecx -#endif - cmpl $-1, dep_mutex-cond_nwaiters(%ebx) - sete %cl - subl $1, %ecx -#ifdef __ASSUME_PRIVATE_FUTEX - andl $FUTEX_PRIVATE_FLAG, %ecx -#else - andl %gs:PRIVATE_FUTEX, %ecx -#endif - addl $FUTEX_WAKE, %ecx - movl $1, %edx - ENTER_KERNEL - subl $cond_nwaiters, %ebx - movl $1, %edi - -4: LOCK -#if cond_lock == 0 - subl $1, (%ebx) -#else - subl $1, cond_lock(%ebx) -#endif - je 2f - -#if cond_lock == 0 - movl %ebx, %eax -#else - leal cond_lock(%ebx), %eax -#endif -#if (LLL_SHARED-LLL_PRIVATE) > 255 - xorl %ecx, %ecx -#endif - cmpl $-1, dep_mutex(%ebx) - setne %cl - subl $1, %ecx - andl $(LLL_SHARED-LLL_PRIVATE), %ecx -#if LLL_PRIVATE != 0 - addl $LLL_PRIVATE, %ecx -#endif - call __lll_unlock_wake - - /* Wake up all waiters to make sure no signal gets lost. */ -2: testl %edi, %edi - jnz 5f - addl $cond_futex, %ebx -#if FUTEX_PRIVATE_FLAG > 255 - xorl %ecx, %ecx -#endif - cmpl $-1, dep_mutex-cond_futex(%ebx) - sete %cl - subl $1, %ecx -#ifdef __ASSUME_PRIVATE_FUTEX - andl $FUTEX_PRIVATE_FLAG, %ecx -#else - andl %gs:PRIVATE_FUTEX, %ecx -#endif - addl $FUTEX_WAKE, %ecx - movl $SYS_futex, %eax - movl $0x7fffffff, %edx - ENTER_KERNEL - -5: movl 24+FRAME_SIZE(%esp), %eax - call __pthread_mutex_cond_lock - - movl %esi, (%esp) -.LcallUR: - call _Unwind_Resume - hlt -.LENDCODE: - cfi_endproc - .size __condvar_w_cleanup, .-__condvar_w_cleanup - - - .section .gcc_except_table,"a",@progbits -.LexceptSTART: - .byte DW_EH_PE_omit # @LPStart format (omit) - .byte DW_EH_PE_omit # @TType format (omit) - .byte DW_EH_PE_sdata4 # call-site format - # DW_EH_PE_sdata4 - .uleb128 .Lcstend-.Lcstbegin -.Lcstbegin: - .long .LcleanupSTART-.LSTARTCODE - .long .Ladd_cond_futex-.LcleanupSTART - .long __condvar_w_cleanup-.LSTARTCODE - .uleb128 0 - .long .Ladd_cond_futex-.LSTARTCODE - .long .Lsub_cond_futex-.Ladd_cond_futex - .long __condvar_w_cleanup2-.LSTARTCODE - .uleb128 0 - .long .Lsub_cond_futex-.LSTARTCODE - .long .LcleanupEND-.Lsub_cond_futex - .long __condvar_w_cleanup-.LSTARTCODE - .uleb128 0 - .long .LcallUR-.LSTARTCODE - .long .LENDCODE-.LcallUR - .long 0 - .uleb128 0 -.Lcstend: - -#ifdef PIC - .section .gnu.linkonce.t.__i686.get_pc_thunk.cx,"ax",@progbits - .globl __i686.get_pc_thunk.cx - .hidden __i686.get_pc_thunk.cx - .type __i686.get_pc_thunk.cx,@function -__i686.get_pc_thunk.cx: - movl (%esp), %ecx; - ret - .size __i686.get_pc_thunk.cx,.-__i686.get_pc_thunk.cx -#endif - -#ifdef SHARED - .hidden DW.ref.__gcc_personality_v0 - .weak DW.ref.__gcc_personality_v0 - .section .gnu.linkonce.d.DW.ref.__gcc_personality_v0,"aw",@progbits - .align 4 - .type DW.ref.__gcc_personality_v0, @object - .size DW.ref.__gcc_personality_v0, 4 -DW.ref.__gcc_personality_v0: - .long __gcc_personality_v0 -#endif diff --git a/nptl/sysdeps/unix/sysv/linux/libc-lowlevellock.c b/nptl/sysdeps/unix/sysv/linux/libc-lowlevellock.c index b192822..9e880a5 100644 --- a/nptl/sysdeps/unix/sysv/linux/libc-lowlevellock.c +++ b/nptl/sysdeps/unix/sysv/linux/libc-lowlevellock.c @@ -18,4 +18,4 @@ 02111-1307 USA. */ /* No difference to lowlevellock.c, except we lose a couple of functions. */ -#include "lowlevellock.c" +#include diff --git a/nptl/sysdeps/unix/sysv/linux/sem_timedwait.c b/nptl/sysdeps/unix/sysv/linux/sem_timedwait.c index fdf0d74..c4d8a6e 100644 --- a/nptl/sysdeps/unix/sysv/linux/sem_timedwait.c +++ b/nptl/sysdeps/unix/sysv/linux/sem_timedwait.c @@ -90,7 +90,7 @@ sem_timedwait (sem_t *sem, const struct timespec *abstime) /* Disable asynchronous cancellation. */ __pthread_disable_asynccancel (oldtype); - if (err != 0 && err != -EWOULDBLOCK) + if (err != 0 && err != -EWOULDBLOCK && err != -EAGAIN) { __set_errno (-err); err = -1; diff --git a/nptl/sysdeps/unix/sysv/linux/sem_wait.c b/nptl/sysdeps/unix/sysv/linux/sem_wait.c index 20e2b48..0c8070f 100644 --- a/nptl/sysdeps/unix/sysv/linux/sem_wait.c +++ b/nptl/sysdeps/unix/sysv/linux/sem_wait.c @@ -62,7 +62,7 @@ __new_sem_wait (sem_t *sem) /* Disable asynchronous cancellation. */ __pthread_disable_asynccancel (oldtype); - if (err != 0 && err != -EWOULDBLOCK) + if (err != 0 && err != -EWOULDBLOCK && err != -EAGAIN) { __set_errno (-err); err = -1; @@ -107,7 +107,7 @@ __old_sem_wait (sem_t *sem) /* Disable asynchronous cancellation. */ __pthread_disable_asynccancel (oldtype); } - while (err == 0 || err == -EWOULDBLOCK); + while (err == 0 || err == -EWOULDBLOCK || err == -EAGAIN); __set_errno (-err); return -1; diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/cancellation.S b/nptl/sysdeps/unix/sysv/linux/x86_64/cancellation.S index 6806962..fdeb08d 100644 --- a/nptl/sysdeps/unix/sysv/linux/x86_64/cancellation.S +++ b/nptl/sysdeps/unix/sysv/linux/x86_64/cancellation.S @@ -71,7 +71,9 @@ ENTRY(__pthread_enable_asynccancel) 1: ret -3: movq $TCB_PTHREAD_CANCELED, %fs:RESULT +3: subq $8, %rsp + cfi_adjust_cfa_offset(8) + movq $TCB_PTHREAD_CANCELED, %fs:RESULT lock orl $TCB_EXITING_BITMASK, %fs:CANCELHANDLING movq %fs:CLEANUP_JMP_BUF, %rdi diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S index e6535fb..3ca4d33 100644 --- a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S +++ b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S @@ -63,9 +63,9 @@ __pthread_cond_timedwait: cfi_adjust_cfa_offset(8) cfi_rel_offset(%r15, 0) #ifdef __ASSUME_FUTEX_CLOCK_REALTIME -# define FRAME_SIZE 32 +# define FRAME_SIZE (32+8) #else -# define FRAME_SIZE 48 +# define FRAME_SIZE (48+8) #endif subq $FRAME_SIZE, %rsp cfi_adjust_cfa_offset(FRAME_SIZE) diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S index f5b929e..78be977 100644 --- a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S +++ b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S @@ -45,7 +45,7 @@ __pthread_cond_wait: cfi_lsda(DW_EH_PE_udata4, .LexceptSTART) #endif -#define FRAME_SIZE 32 +#define FRAME_SIZE (32+8) leaq -FRAME_SIZE(%rsp), %rsp cfi_adjust_cfa_offset(FRAME_SIZE) diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S index f5d055c..8f3c68c 100644 --- a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S +++ b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S @@ -210,7 +210,7 @@ pthread_rwlock_timedrdlock: cfi_restore(%r12) retq -#ifdef __ASSUME_PRIVATE_FUTEX +#ifdef __ASSUME_FUTEX_CLOCK_REALTIME cfi_adjust_cfa_offset(16) cfi_rel_offset(%r12, 8) cfi_rel_offset(%r13, 0) diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedwrlock.S b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedwrlock.S index 6ed8b49..9aaaeba 100644 --- a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedwrlock.S +++ b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedwrlock.S @@ -192,7 +192,7 @@ pthread_rwlock_timedwrlock: 7: movq %rdx, %rax -#ifndef __ASSUME_PRIVATE_FUTEX +#ifndef __ASSUME_FUTEX_CLOCK_REALTIME addq $16, %rsp cfi_adjust_cfa_offset(-16) popq %r14 @@ -207,7 +207,7 @@ pthread_rwlock_timedwrlock: cfi_restore(%r12) retq -#ifdef __ASSUME_PRIVATE_FUTEX +#ifdef __ASSUME_FUTEX_CLOCK_REALTIME cfi_adjust_cfa_offset(16) cfi_rel_offset(%r12, 8) cfi_rel_offset(%r13, 0) diff --git a/nptl/tst-eintr1.c b/nptl/tst-eintr1.c index 43a5df5..ed66675 100644 --- a/nptl/tst-eintr1.c +++ b/nptl/tst-eintr1.c @@ -49,6 +49,16 @@ tf1 (void *arg) puts ("pthread_create returned EINTR"); exit (1); } + if (e == EAGAIN) + { + /* The kernel might not have processed the last few + pthread_join()s yet. Tolerate that, but record the + event in test output so attentive people reading + logs can notice if pthread_join() stops working + altogether. */ + write (STDOUT_FILENO, "!", 1); + continue; + } char buf[100]; printf ("tf1: pthread_create failed: %s\n", diff --git a/nptl/tst-stackguard1.c b/nptl/tst-stackguard1.c index 15c30ae..77ebbfb 100644 --- a/nptl/tst-stackguard1.c +++ b/nptl/tst-stackguard1.c @@ -190,17 +190,21 @@ do_test (void) the 16 runs, something is very wrong. */ int ndifferences = 0; int ndefaults = 0; + int npartlyrandomized = 0; for (i = 0; i < N; ++i) { if (child_stack_chk_guards[i] != child_stack_chk_guards[i+1]) ndifferences++; else if (child_stack_chk_guards[i] == default_guard) ndefaults++; + else if (*(char *) &child_stack_chk_guards[i] == 0) + npartlyrandomized++; } - printf ("differences %d defaults %d\n", ndifferences, ndefaults); + printf ("differences %d defaults %d partly randomized %d\n", + ndifferences, ndefaults, npartlyrandomized); - if (ndifferences < N / 2 && ndefaults < N / 2) + if ((ndifferences + ndefaults + npartlyrandomized) < 3 * N / 4) { puts ("stack guard canaries are not randomized enough"); puts ("nor equal to the default canary value"); diff --git a/nptl_db/ChangeLog b/nptl_db/ChangeLog index f79fc18..81ebfcd 100644 --- a/nptl_db/ChangeLog +++ b/nptl_db/ChangeLog @@ -1,3 +1,7 @@ +2011-09-15 Andreas Schwab + + * thread_dbP.h: Include + 2009-08-23 Roland McGrath * td_ta_map_lwp2thr.c (__td_ta_lookup_th_unique): Move ta_ok check diff --git a/nptl_db/thread_dbP.h b/nptl_db/thread_dbP.h index e5db9bf..54f5fc8 100644 --- a/nptl_db/thread_dbP.h +++ b/nptl_db/thread_dbP.h @@ -1,5 +1,5 @@ /* Private header for thread debug library - Copyright (C) 2003, 2004, 2007 Free Software Foundation, Inc. + Copyright (C) 2003, 2004, 2007, 2011 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -29,6 +29,7 @@ #include "proc_service.h" #include "thread_db.h" #include "../nptl/pthreadP.h" /* This is for *_BITMASK only. */ +#include /* Indeces for the symbol names. */ enum diff --git a/nscd.manifest b/nscd.manifest deleted file mode 100644 index 97e8c31..0000000 --- a/nscd.manifest +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/nscd/Depend b/nscd/Depend index fe673ba..273aee5 100644 --- a/nscd/Depend +++ b/nscd/Depend @@ -1 +1,2 @@ linuxthreads +libpthread diff --git a/nscd/aicache.c b/nscd/aicache.c index 3cb2208..19a363e 100644 --- a/nscd/aicache.c +++ b/nscd/aicache.c @@ -528,7 +528,7 @@ next_nip: } out: - _res.options = old_res_options; + _res.options |= old_res_options & RES_USE_INET6; if (dataset != NULL && !alloca_used) { diff --git a/nscd/connections.c b/nscd/connections.c index 69f6533..8a8c8f4 100644 --- a/nscd/connections.c +++ b/nscd/connections.c @@ -1834,6 +1834,7 @@ main_loop_poll (void) /* We have a new incoming connection. Accept the connection. */ int fd; +#ifdef SOCK_NONBLOCK #ifndef __ASSUME_ACCEPT4 fd = -1; if (have_accept4 >= 0) @@ -1850,6 +1851,9 @@ main_loop_poll (void) if (have_accept4 < 0) fd = TEMP_FAILURE_RETRY (accept (sock, NULL, NULL)); #endif +#else + fd = TEMP_FAILURE_RETRY (accept (sock, NULL, NULL)); +#endif /* Use the descriptor if we have not reached the limit. */ if (fd >= 0) @@ -2039,7 +2043,7 @@ main_loop_epoll (int efd) { /* A new connection. */ int fd; - +#ifdef SOCK_NONBLOCK # ifndef __ASSUME_ACCEPT4 fd = -1; if (have_accept4 >= 0) @@ -2056,6 +2060,9 @@ main_loop_epoll (int efd) if (have_accept4 < 0) fd = TEMP_FAILURE_RETRY (accept (sock, NULL, NULL)); # endif +#else + fd = TEMP_FAILURE_RETRY (accept (sock, NULL, NULL)); +#endif /* Use the descriptor if we have not reached the limit. */ if (fd >= 0) diff --git a/nscd/nscd.h b/nscd/nscd.h index 3279b85..b7de6e9 100644 --- a/nscd/nscd.h +++ b/nscd/nscd.h @@ -103,10 +103,10 @@ struct database_dyn /* Paths of the file for the persistent storage. */ -#define _PATH_NSCD_PASSWD_DB "/var/db/nscd/passwd" -#define _PATH_NSCD_GROUP_DB "/var/db/nscd/group" -#define _PATH_NSCD_HOSTS_DB "/var/db/nscd/hosts" -#define _PATH_NSCD_SERVICES_DB "/var/db/nscd/services" +#define _PATH_NSCD_PASSWD_DB "/var/cache/nscd/passwd" +#define _PATH_NSCD_GROUP_DB "/var/cache/nscd/group" +#define _PATH_NSCD_HOSTS_DB "/var/cache/nscd/hosts" +#define _PATH_NSCD_SERVICES_DB "/var/cache/nscd/services" /* Path used when not using persistent storage. */ #define _PATH_NSCD_XYZ_DB_TMP "/var/run/nscd/dbXXXXXX" diff --git a/nscd/nscd_getserv_r.c b/nscd/nscd_getserv_r.c index dce4165..e6ab511 100644 --- a/nscd/nscd_getserv_r.c +++ b/nscd/nscd_getserv_r.c @@ -17,6 +17,7 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ +#include #include #include #include @@ -80,6 +81,7 @@ nscd_getserv_r (const char *crit, size_t critlen, const char *proto, { int gc_cycle; int nretries = 0; + size_t alloca_used = 0; /* If the mapping is available, try to search there instead of communicating with the nscd. */ @@ -88,13 +90,23 @@ nscd_getserv_r (const char *crit, size_t critlen, const char *proto, &gc_cycle); size_t protolen = proto == NULL ? 0 : strlen (proto); size_t keylen = critlen + 1 + protolen + 1; - char *key = alloca (keylen); + int alloca_key = __libc_use_alloca (keylen); + char *key; + if (alloca_key) + key = alloca_account (keylen, alloca_used); + else + { + key = malloc (keylen); + if (key == NULL) + return -1; + } memcpy (__mempcpy (__mempcpy (key, crit, critlen), "/", 1), proto ?: "", protolen + 1); retry:; const char *s_name = NULL; const char *s_proto = NULL; + int alloca_aliases_len = 0; const uint32_t *aliases_len = NULL; const char *aliases_list = NULL; int retval = -1; @@ -112,6 +124,7 @@ nscd_getserv_r (const char *crit, size_t critlen, const char *proto, s_name = (char *) (&found->data[0].servdata + 1); serv_resp = found->data[0].servdata; s_proto = s_name + serv_resp.s_name_len; + alloca_aliases_len = 1; aliases_len = (uint32_t *) (s_proto + serv_resp.s_proto_len); aliases_list = ((char *) aliases_len + serv_resp.s_aliases_cnt * sizeof (uint32_t)); @@ -136,8 +149,24 @@ nscd_getserv_r (const char *crit, size_t critlen, const char *proto, if (((uintptr_t) aliases_len & (__alignof__ (*aliases_len) - 1)) != 0) { - uint32_t *tmp = alloca (serv_resp.s_aliases_cnt - * sizeof (uint32_t)); + uint32_t *tmp; + alloca_aliases_len + = __libc_use_alloca (alloca_used + + (serv_resp.s_aliases_cnt + * sizeof (uint32_t))); + if (alloca_aliases_len) + tmp = alloca_account (serv_resp.s_aliases_cnt + * sizeof (uint32_t), + alloca_used); + else + { + tmp = malloc (serv_resp.s_aliases_cnt * sizeof (uint32_t)); + if (tmp == NULL) + { + retval = ENOMEM; + goto out; + } + } aliases_len = memcpy (tmp, aliases_len, serv_resp.s_aliases_cnt * sizeof (uint32_t)); @@ -217,8 +246,25 @@ nscd_getserv_r (const char *crit, size_t critlen, const char *proto, if (serv_resp.s_aliases_cnt > 0) { - aliases_len = alloca (serv_resp.s_aliases_cnt - * sizeof (uint32_t)); + assert (alloca_aliases_len == 0); + alloca_aliases_len + = __libc_use_alloca (alloca_used + + (serv_resp.s_aliases_cnt + * sizeof (uint32_t))); + if (alloca_aliases_len) + aliases_len = alloca_account (serv_resp.s_aliases_cnt + * sizeof (uint32_t), + alloca_used); + else + { + aliases_len = malloc (serv_resp.s_aliases_cnt + * sizeof (uint32_t)); + if (aliases_len == NULL) + { + retval = ENOMEM; + goto out_close; + } + } vec[n].iov_base = (void *) aliases_len; vec[n].iov_len = serv_resp.s_aliases_cnt * sizeof (uint32_t); @@ -326,8 +372,17 @@ nscd_getserv_r (const char *crit, size_t critlen, const char *proto, } if (retval != -1) - goto retry; + { + if (!alloca_aliases_len) + free (aliases_len); + goto retry; + } } + if (!alloca_aliases_len) + free ((void *) aliases_len); + if (!alloca_key) + free (key); + return retval; } diff --git a/nss/Makefile b/nss/Makefile index dc816b1..16e49c6 100644 --- a/nss/Makefile +++ b/nss/Makefile @@ -47,7 +47,7 @@ routines-$(OPTION_EGLIBC_INET) += digits_dots others := getent install-bin := getent -tests = tst-nss-test1 +tests = tst-nss-test1 test-digits-dots tests-$(OPTION_EGLIBC_INET) += test-netdb xtests-$(OPTION_EGLIBC_INET) += bug-erange diff --git a/nss/digits_dots.c b/nss/digits_dots.c index 9576dd5..4b0b61c 100644 --- a/nss/digits_dots.c +++ b/nss/digits_dots.c @@ -47,7 +47,10 @@ __nss_hostname_digits_dots (const char *name, struct hostent *resbuf, { if (h_errnop) *h_errnop = NETDB_INTERNAL; - *result = NULL; + if (buffer_size == NULL) + *status = NSS_STATUS_TRYAGAIN; + else + *result = NULL; return -1; } @@ -84,14 +87,16 @@ __nss_hostname_digits_dots (const char *name, struct hostent *resbuf, } size_needed = (sizeof (*host_addr) - + sizeof (*h_addr_ptrs) + strlen (name) + 1); + + sizeof (*h_addr_ptrs) + + sizeof (*h_alias_ptr) + strlen (name) + 1); if (buffer_size == NULL) { if (buflen < size_needed) { + *status = NSS_STATUS_TRYAGAIN; if (h_errnop != NULL) - *h_errnop = TRY_AGAIN; + *h_errnop = NETDB_INTERNAL; __set_errno (ERANGE); goto done; } @@ -110,7 +115,7 @@ __nss_hostname_digits_dots (const char *name, struct hostent *resbuf, *buffer_size = 0; __set_errno (save); if (h_errnop != NULL) - *h_errnop = TRY_AGAIN; + *h_errnop = NETDB_INTERNAL; *result = NULL; goto done; } @@ -150,7 +155,9 @@ __nss_hostname_digits_dots (const char *name, struct hostent *resbuf, if (! ok) { *h_errnop = HOST_NOT_FOUND; - if (buffer_size) + if (buffer_size == NULL) + *status = NSS_STATUS_NOTFOUND; + else *result = NULL; goto done; } @@ -191,7 +198,7 @@ __nss_hostname_digits_dots (const char *name, struct hostent *resbuf, if (buffer_size == NULL) *status = NSS_STATUS_SUCCESS; else - *result = resbuf; + *result = resbuf; goto done; } @@ -202,15 +209,6 @@ __nss_hostname_digits_dots (const char *name, struct hostent *resbuf, if ((isxdigit (name[0]) && strchr (name, ':') != NULL) || name[0] == ':') { - const char *cp; - char *hostname; - typedef unsigned char host_addr_t[16]; - host_addr_t *host_addr; - typedef char *host_addr_list_t[2]; - host_addr_list_t *h_addr_ptrs; - size_t size_needed; - int addr_size; - switch (af) { default: @@ -226,7 +224,10 @@ __nss_hostname_digits_dots (const char *name, struct hostent *resbuf, /* This is not possible. We cannot represent an IPv6 address in an `struct in_addr' variable. */ *h_errnop = HOST_NOT_FOUND; - *result = NULL; + if (buffer_size == NULL) + *status = NSS_STATUS_NOTFOUND; + else + *result = NULL; goto done; case AF_INET6: @@ -234,42 +235,6 @@ __nss_hostname_digits_dots (const char *name, struct hostent *resbuf, break; } - size_needed = (sizeof (*host_addr) - + sizeof (*h_addr_ptrs) + strlen (name) + 1); - - if (buffer_size == NULL && buflen < size_needed) - { - if (h_errnop != NULL) - *h_errnop = TRY_AGAIN; - __set_errno (ERANGE); - goto done; - } - else if (buffer_size != NULL && *buffer_size < size_needed) - { - char *new_buf; - *buffer_size = size_needed; - new_buf = realloc (*buffer, *buffer_size); - - if (new_buf == NULL) - { - save = errno; - free (*buffer); - __set_errno (save); - *buffer = NULL; - *buffer_size = 0; - *result = NULL; - goto done; - } - *buffer = new_buf; - } - - memset (*buffer, '\0', size_needed); - - host_addr = (host_addr_t *) *buffer; - h_addr_ptrs = (host_addr_list_t *) - ((char *) host_addr + sizeof (*host_addr)); - hostname = (char *) h_addr_ptrs + sizeof (*h_addr_ptrs); - for (cp = name;; ++cp) { if (!*cp) @@ -282,7 +247,9 @@ __nss_hostname_digits_dots (const char *name, struct hostent *resbuf, if (inet_pton (AF_INET6, name, host_addr) <= 0) { *h_errnop = HOST_NOT_FOUND; - if (buffer_size) + if (buffer_size == NULL) + *status = NSS_STATUS_NOTFOUND; + else *result = NULL; goto done; } diff --git a/nss/getXXbyYY_r.c b/nss/getXXbyYY_r.c index 0dbb003..22b2187 100644 --- a/nss/getXXbyYY_r.c +++ b/nss/getXXbyYY_r.c @@ -180,6 +180,9 @@ INTERNAL (REENTRANT_NAME) (ADD_PARAMS, LOOKUP_TYPE *resbuf, char *buffer, case -1: return errno; case 1: +#ifdef NEED_H_ERRNO + any_service = true; +#endif goto done; } #endif diff --git a/nss/nss_files/files-XXX.c b/nss/nss_files/files-XXX.c index 852b58a..ab3f474 100644 --- a/nss/nss_files/files-XXX.c +++ b/nss/nss_files/files-XXX.c @@ -136,7 +136,7 @@ CONCAT(_nss_files_set,ENTNAME) (int stayopen) __libc_lock_lock (lock); - status = internal_setent (stayopen); + status = internal_setent (1); if (status == NSS_STATUS_SUCCESS && fgetpos (stream, &position) < 0) { diff --git a/nss/nss_files/files-hosts.c b/nss/nss_files/files-hosts.c index 83de650..08119ce 100644 --- a/nss/nss_files/files-hosts.c +++ b/nss/nss_files/files-hosts.c @@ -480,7 +480,7 @@ _nss_files_gethostbyname4_r (const char *name, struct gaih_addrtuple **pat, else { *errnop = errno; - *herrnop = NO_DATA; + *herrnop = HOST_NOT_FOUND; } __libc_lock_unlock (lock); diff --git a/nss/nss_files/files-parse.c b/nss/nss_files/files-parse.c index 66604bf..6b7f483 100644 --- a/nss/nss_files/files-parse.c +++ b/nss/nss_files/files-parse.c @@ -21,6 +21,7 @@ #include #include #include +#include /* These symbols are defined by the including source file: @@ -160,7 +161,12 @@ strtou32 (const char *nptr, char **endptr, int base) # define INT_FIELD(variable, terminator_p, swallow, base, convert) \ { \ char *endp; \ - variable = convert (strtou32 (line, &endp, base)); \ + unsigned long long tmp; \ + /* Prevent from 32-bit overflow. */ \ + tmp = __strtoull_internal (line, &endp, base, 0); \ + if (tmp > UINT_MAX) \ + return 0; \ + variable = convert ((unsigned long int)tmp); \ if (endp == line) \ return 0; \ else if (terminator_p (*endp)) \ @@ -175,10 +181,15 @@ strtou32 (const char *nptr, char **endptr, int base) # define INT_FIELD_MAYBE_NULL(variable, terminator_p, swallow, base, convert, default) \ { \ char *endp; \ + unsigned long long tmp; \ if (*line == '\0') \ /* We expect some more input, so don't allow the string to end here. */ \ return 0; \ - variable = convert (strtou32 (line, &endp, base)); \ + /* Prevent from 32-bit overflow. */ \ + tmp = __strtoull_internal (line, &endp, base, 0); \ + if (tmp > UINT_MAX) \ + return 0; \ + variable = convert ((unsigned long int)tmp); \ if (endp == line) \ variable = default; \ if (terminator_p (*endp)) \ diff --git a/nss/nsswitch.c b/nss/nsswitch.c index a9197b7..20668b3 100644 --- a/nss/nsswitch.c +++ b/nss/nsswitch.c @@ -98,6 +98,12 @@ static const char *const __nss_shlib_revision = LIBNSS_FILES_SO + 15; /* The root of the whole data base. */ static name_database *service_table; +/* List of default service lists that were generated by glibc because + /etc/nsswitch.conf did not provide a value. + The list is only maintained so we can free such service lists in + __libc_freeres. */ +static name_database_entry *defconfig_entries; + #else /* __OPTION_EGLIBC_NSSWITCH */ /* Bring in the statically initialized service table we generated at @@ -164,8 +170,27 @@ __nss_database_lookup (const char *database, const char *alternate_name, DEFCONFIG specifies the default service list for this database, or null to use the most common default. */ if (*ni == NULL) - *ni = nss_parse_service_list (defconfig - ?: "nis [NOTFOUND=return] files"); + { + *ni = nss_parse_service_list (defconfig + ?: "nis [NOTFOUND=return] files"); + if (*ni != NULL) + { + /* Record the memory we've just allocated in defconfig_entries list, + so we can free it later. */ + name_database_entry *entry; + + /* Allocate ENTRY plus size of name (1 here). */ + entry = (name_database_entry *) malloc (sizeof (*entry) + 1); + + if (entry != NULL) + { + entry->next = defconfig_entries; + entry->service = *ni; + entry->name = ""; + defconfig_entries = entry; + } + } + } #else /* Without the dynamic behavior, we can't process defconfig. The databases the user specified at library build time are all you @@ -409,9 +434,20 @@ __nss_lookup_function (service_user *ni, const char *fct_name) ni->library->lib_handle = __libc_dlopen (shlib_name); if (ni->library->lib_handle == NULL) { - /* Failed to load the library. */ - ni->library->lib_handle = (void *) -1l; - __set_errno (saved_errno); + /* Failed to load the library. Try a fallback. */ + int n = __snprintf(shlib_name, shlen, "libnss_%s.so.%d.%d", + ni->library->name, __GLIBC__, __GLIBC_MINOR__); + if (n >= shlen) + ni->library->lib_handle = NULL; + else + ni->library->lib_handle = __libc_dlopen (shlib_name); + + if (ni->library->lib_handle == NULL) + { + /* Ok, really fail now. */ + ni->library->lib_handle = (void *) -1l; + __set_errno (saved_errno); + } } } @@ -666,7 +702,7 @@ nss_parse_service_list (const char *line) else if (__strncasecmp (name, "UNAVAIL", 7) == 0) status = NSS_STATUS_UNAVAIL; else - return result; + goto finish; } else if (line - name == 8) { @@ -675,15 +711,15 @@ nss_parse_service_list (const char *line) else if (__strncasecmp (name, "TRYAGAIN", 8) == 0) status = NSS_STATUS_TRYAGAIN; else - return result; + goto finish; } else - return result; + goto finish; while (isspace (line[0])) ++line; if (line[0] != '=') - return result; + goto finish; do ++line; while (isspace (line[0])); @@ -699,7 +735,7 @@ nss_parse_service_list (const char *line) && __strncasecmp (name, "CONTINUE", 8) == 0) action = NSS_ACTION_CONTINUE; else - return result; + goto finish; if (not) { @@ -727,6 +763,11 @@ nss_parse_service_list (const char *line) *nextp = new_service; nextp = &new_service->next; + continue; + + finish: + free (new_service); + return result; } } @@ -814,21 +855,9 @@ __nss_disable_nscd (void) #if __OPTION_EGLIBC_NSSWITCH -/* Free all resources if necessary. */ -libc_freeres_fn (free_mem) +static void +free_database_entries (name_database_entry *entry) { - name_database *top = service_table; - name_database_entry *entry; - service_library *library; - - if (top == NULL) - /* Maybe we have not read the nsswitch.conf file. */ - return; - - /* Don't disturb ongoing other threads (if there are any). */ - service_table = NULL; - - entry = top->entry; while (entry != NULL) { name_database_entry *olde = entry; @@ -848,6 +877,36 @@ libc_freeres_fn (free_mem) entry = entry->next; free (olde); } +} + +/* Free all resources if necessary. */ +libc_freeres_fn (free_defconfig) +{ + name_database_entry *entry = defconfig_entries; + + if (entry == NULL) + /* defconfig was not used. */ + return; + + /* Don't disturb ongoing other threads (if there are any). */ + defconfig_entries = NULL; + + free_database_entries (entry); +} + +libc_freeres_fn (free_mem) +{ + name_database *top = service_table; + service_library *library; + + if (top == NULL) + /* Maybe we have not read the nsswitch.conf file. */ + return; + + /* Don't disturb ongoing other threads (if there are any). */ + service_table = NULL; + + free_database_entries (top->entry); library = top->library; while (library != NULL) diff --git a/nss/test-digits-dots.c b/nss/test-digits-dots.c new file mode 100644 index 0000000..1efa344 --- /dev/null +++ b/nss/test-digits-dots.c @@ -0,0 +1,38 @@ +/* Copyright (C) 2013 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +/* Testcase for BZ #15014 */ + +#include +#include +#include + +static int +do_test (void) +{ + char buf[32]; + struct hostent *result = NULL; + struct hostent ret; + int h_err = 0; + int err; + + err = gethostbyname_r ("1.2.3.4", &ret, buf, sizeof (buf), &result, &h_err); + return err == ERANGE && h_err == NETDB_INTERNAL ? EXIT_SUCCESS : EXIT_FAILURE; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/packaging/eglibc-2.13-debian.patch.gz b/packaging/eglibc-2.13-debian.patch.gz deleted file mode 100755 index d30d8e7dd3f638cc8c06d2172ad01c9e79a02c5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 206145 zcmV(zK<2+6iwFozjyFyK17&AyX<}n7GA=PQEo5b4X<=?IaA9;~XaL+hYkS(p(x1(* zn5J%w0>TI|7Zc}%*f`+{v0cC??K$nMBc#Qs5fVodaoi;R?eEO&N=SekCq2*eUfdL< z+1c6Ix$gx#SS;KaIt`~;Ju;4L>*%OuSRKbO>P_3JPh0I~&1l!BV%l^%RZ-}z;&~7r z!*45pCj1+Csve#P)5xeqZY-V^&a7A*1Hfb@ptrh#8dN*S_0Dm%1GTDQK&jfPRtp8h zfGf*>2acG!mJdrSw&xR-27RLD%(M-$JQW%J+Z%9CV{&l#Lpc=(}D61bOb%aYHzP{i66FY;zfk znfpOIM0f#&kDL|2^`qF#Akw?#d1e>{v9@27Em{EzrSIX*%8OkqwCAw&EL%hn2jB(4 zJD3F_4HjCVE22Wlo#Aw5AU?#QrD!uy{2Pkp{o)K~8^xiE65lV%3Fr&Up1Z!#%I;CS z32w99)U-lrkqnr$Ba3dM-7J)Z7m3~NTO<*gr-~d918I8@Y2_P#rQ`p(p@ImhAaHvS zZprpfNoS{uI3(f2{o)pTnw|wBf#Yq>Jg8qfZ~?xDw{sB+(uL9;#B%}B+zN%Gv~mZQ z?|^gXTMO4lnEy_M71X`dQ>0XsJUqZ)qWdi-%9+fW8wxuPkb_{xeC3%yY7FfU&tdBN zdHV@t&tcP14{%JwrS!8RxMD_02Fq0pfe$m+L;F;$p&W3W)R-#(=UIb=f8par?@hmA z9h8Y0aU`b>ZUoWNb8RFs74fYQK4TxSKnV|LBgzm3{Guim-MZ-gMCo6;$HOW?(jW)G z_OI|+J6(3503o4bJjVfhccX2TTTnWx(iZ}hj7l`5J`Gm*=B#xj8G@8mVg0RF)|J|HIm45+8qi!xJ$fo?og{+Vc_1C7 z+k5FGQ_9bbXN?@#ESsZRz1&3EH0oueO2T2s#ZWx6&}sA#gYleAH8o8|jZAGjQsw)V zPJq31jgd9IEI*7xTt$UV0FORA8xCHK(UqT{qo6lYbewmLjv@KXHEH=IVnvY%WA#;; zV~kJ~F3lLP@+$mM(s_QMM>F_@3kohfm-lh~eU_ z|Kj>3`qYy{c6lWcvo{|1M-%gvdDcH2j-uM+d>C%9>GFHk#!^353Oks#*t)!7;ZO+;dWDc3d&K0KD-ZH2gi~#0}A3% z3^p1+JV~HPzYO^Xa>p`8j~KgpoK1lKGtK_RSvoVehD074^OIu1P@twSM?!mAhT5L| z`-Q59Vh)6`oXV$e934hjQ8=vc?5k3?Rc*G#QMFR(ShboZHk6&~AT^x>as5C-lhK8B za7GNfB$SAPH_OG63c*}r#TH-^U)k{rlMltOtIP4=CmOb1F{W6Jbn09c@enJIvOS7X zgfpxhDg_-|PJ`uL=-$jx8>bpzhh~{RTV<@QFwD_soj+S}9tr{DU>4tEu)^q#;m(rk z8u)glP})h2c<7Xgmd>Q`%R+RgA=AlJH>=%GlQAu-}rlEG3TS$5J(s z32TutF4H`{x;DrC$$0RO{+>~-HFAv?*!p5H8SfR_@B||FcYzZqnx?&6nF}j=M^UMu zll$E*rB1CdwC*sRiiIG}V-`IiF^23-Ucz|8^r=Nt|F~( z$nzil(Pa@SA)%!Pzff6&?rxf>-Ba^w)F1VKgkr4>9YdqG?at=7ha z567-=F2n+xAQ`F*2ftJgu(pt0wJzMw$@q#@9!3_YUojl;a37Nhvj_b53%lZ49a0l+ zcNdb9CI`%rioaAU-5uB@Su`#e@v2>-2~Sg-Q|)bH zQq2;|Q=oX9+Tc#iztN1dW~c3tv8H8Yz{uLK8A^K_8kHEk$2%qi{j6zQB0`1#zZTJk zS$>m@*lPbbONpk%b?&!_D+$IN0g zK}cDq(Jra6q@3hiu#~Sge(i3Eh`Qew(|W_<<*7+)u_6bpMBP-o$oEoaRR%g3B$+it zyKj}YbD)G~CRAFU7ucX0wtAh9`hDfzxn8_TO&a8G$Hoqg+ES5gg{{Dx=xiO|%lj6bzr;Fr3{r_ z2kJZ1QhtSF##$yrf!r$EwYL*HZlL1?-(@yK&W_BWwgk}GG<%WVu70p>HP;9b2Vfm{ij($S{F^XxcrC4N* z7O6_%rzcov5H>F5iH6*$V@g^#@pnaVmLSM>^1+X)tiaau!LX0!u)!1W{81#BExSnx z!t&Y89me(h7|c_(F%>-CIhfX6^OWUyCvHC4Y@!g4Ari4}qFN%{|G`OT+4;{&05&Wt z6gW(@)1opqB28d>zhZ~sp|8r#mixrO2u8v+eCE&8$|=M8fFG}!a)Qb~{QBGn#zkfS_-oJf_u zH-9%%@beUt&NtDF?RR<16r5nn(S0|IMh#}t@I0?ZoIW4Sv#m{YuS$irdTZ(!wMwOC zPa8(7l~-Y|gH&J+MCz;6X-}9xX-{}Xhf;fc$0wu$WLsE{2&26{ey4Oowug_lXGIad z)9F$Imd^zUgB31sM6^f8PmZT2?;7Asv|26$ba;GpF}Yf?Sk9f0cAm(E5NbL2D*P#; zQpOMjL*>t+cr_*WQfNWw-k@pY6G@UO-!14XjvVX^S5zGg+!2`M_KrzgfORM2LGjXj-2VSET3E*mG*?piv&4>Vfawr6Qvf zL*&V(Q_Qfyr`Ty5DTx5Pgq+Ss`0w2?;E6AAS_{jQ-j}1q=Y%EXDOxkFfr%7}jEr7{0!tos zMj;bS@uWX`q+v$qL((oRPYn1BSiT}ie85Pw_8XmmqW6gK* zx<5L3^u;Ryj}9nLK9JTIt_3hH)}VftsWDHC!dmcZh#)%VJ3EU-;OnX>lM+!p?ALWZ zXKOU7Qk|X?1*RJGSY2{4zjWszy;cBpje-ZnS)lpdhAwA2UBE%~!}HN(c=r5-Ce>5IkUQqY<==>NMcjH~XewjgCzwO2z^{*~R6Z6IO%dt7R zq#k()_1eyu(g$so?9`jem(%u9(-4hHr7`PtnyvPBzD)4f=`w-HklmCqTipkUD0?$P z{uTg(Or=TSdX7(WX(vgFy*P8q%26=d#Q};KOX1KHK5uyzBe^!!a!tur!KY6!i|%}z zs3a?20@_{>F=G+a-c0CCWSj*Rd~quewij5LCGwThugX6xIP0~ej?rSVA3Eawp}+FHjL35YN$%Bh zmF^QX=xCPDiTiY+C7*C8ldQAF&XasPx_`*||3gpbOA7lhpUx8*l$SfZBOqPCl7$3D zokf%#d?@J72fP$M)=nN=t)`x9bN8WZ3qPVuA+RK9G^cxJcii*7DR)7*bW@B8D943b z#Yjd}G|NCnWW_X#5P~Ij)sXc&@UVUhlb(MnkM*>j0=Rn8J?jm+P$3zX{y^yrr#nN+;^ex>R@MF3n$RytM zN2jl_Pw&NGIGFrQ6FDDDF8bp!oL`Qh2Uoq(WN>;t?2X{+dUSO;?pFZDLL?HGvfU;1 zRN`cK3oa5xjII+Ua`+i_9wD1pqEVHPy0?Y<9+|YTrd-~ArCRxJ1I>He5W5st`~cU& zGPbC+OIl|d_ZoW{jyfamN(=MBT{&(}udnRw#Ym;29Ll7~K`Ov>zU;$Y7d9nMLW!O%O7rT@zmS=D7lF34(fl z-kH1d)xjE|Qq)nS(W*A=N<|pemT1+s3xrIUT*Ath3AM%%l?n94WrB%f@&e0|rGiQK z+*iwd#gNttqzP3%U?!zfKy8MBZm6vOF-iF=tV^2>Gp0NAG1}pxn^Xw2osJ>bntH;V z-`dua4>i(VKN`OCe0e6dz;^Jb^!o=q;m5@)vH> z;4$O?>7_Z|OZ=1>?`qhaV6J+T113ypO6W}~^j4KG)_#T1_Yj7a)=KQS36#h&VKj)6 z;+~d}7zp)eDF~jyHro2u)&1jS^p)2@GK75N%QpG*w+C=e0!!pKmZvToxODH}F%&Z+ zJ>DVv^cupq^h>N$TX)|XnW%WrMJ5SIZeTZ?cGYTDDoxR`>xQ#CGN~^4$fSU5D76~z z_u*G+DBNz|1|j|4ps22e(vAn(v|$(r^FUyRkZgTlwn zuDty3@Wpoel6$tq8QPy2On<|2&Lj=)_Mmc-+IjKKIfvp0znQd);Hc|_JQ|-Tn-aB{ z!O>KLO9|mTtOx^b#!=iG-||eg@XsRApt=En!;z06+knfv>2LhoBe`8pet+Yidsd&oMnSbFx7_yUA=3M}L-S{!X^j)KwFm1rujptQSo4i5D1D8(A{S;p)VXRbEl6wn*@g7jc~(r@=4zJ%~?G4qzPBHo;X*%1721 z_%say4+#qYpN#S=1Ctxv1TVwP@@O3{Nvv;jaHs08G)o*`-P@IMQ@yNt*{B^+Ag_g3 zLLAb;Rgg?tS~A=U77;C0)uwJpYsXws$b<707qki?3z24SMNy!))S^?<#SKYO`(B8kI`5 zeN=CE8aoq*>XAzv3MPMeb3_|uN68Ow-dH~UvMEV*bcM|RZ}$Fmy^S166h(haPm%U? zwI%an-bqdj7)Nr`QWWHTwt>UQn7+247P{VeA@uW=9&01`j~ z$fWG5HM3TErb|)+5dZ=}AP^CVSWTDgb_HiP>Kov8B@{T;r!;%;0js=WLr+C;lFMw~bp$zEtBf11^d(JYr>=akRlZdD81eGEUC=?b%fHdN zebT=5PF}MM(&5|Vv) zrB_6EAUtE}`~a4p*`$|VCG3QQc z9>8-~bgQAVZL18Ik|t*QlS#rzzmvcwd9Kz>A@xnigO6{;1N3b=0yS$5{!Wfa-{C84 zJcX!m7P4N$JG5f({C>%=+wD4Cx0zJZRLSzCqYF^>gf+K{mNQjc5`P=Y7gCAPPA>4% z$i8G%A_&BM>27WPn`p>3!%fJJdbKKS11RHLeuh3Zm3{iig$(H2Us=iDU_+?T^bxwB z`uK#4-eUF&1@@VvMFONCzB3?@B!%w+0rv~11nbrk{chv+a^Pg@Td%}c06XCZ+?QcMGRk1hq`P_cSTH`s7a_>r zizJ%^Ck)p23pnK1S@;hW>HO{`$+7fs_2X3gn@7W-HRQ-S?4 zV|SbJ1BsgQIt%~sO$4h843*41;H$|##Jl?ee&6wLO?}(|``bA6!-DWtAe@%*Pv}`Q> zmAgSSpePi!=q}V?m%kdkWnlcU@hfdhx!OkaHHjb5{O*>aVO;`;`1M_k*5AR$aJH}3 zM=r#dCE4x%Q!Y>9a6uuc;@ilKMO_gKc(bh}i3%?>j?b>%^?N(qp*@&djqH&vsLtFBJA+9}C~pa10I=tftt=+)hEe{doP1u{XGvCLE73xI?xi z*5FZq1`G;m1&F3XgaWT&TAVwcITo__t@54-)N;=O7N%l83YQFC(b%OXdRJU&3d-yj z0{U-tcVEiKT5*b^DulR0&nsb`xv%${OQ8))h#E6JS zo?_^2MLJOEicqw2y2%X*1eC@H>`x)ksU+IUM=a3kvD(iQqyu|%p{NsLqB1t*3l4I;4KDw;7Fnw1LP1P<=uDiYV!c?7p0 zwp$k~ydUCogu4~G$|nLGIn^_=&nbo#kMV|v-e#>$;`~=X#FV`b(lQ=M;W}YH=`)26 zEP0qzcf}+LEKvL%9`31?oMIaZ!{bx)7$meS0xv)19vSS{om>p6C;;fjkZ^6zm~oq< zs<}x~_=MO0I2tW(mtczLlVqJ2{_%OdjEmB;1uuHoDF@zvsIY}QE?X{LvR=i&htc(n z?y&)DB%VS&exc<;5x+0vwKlQn<9+!%{}p(~nF-xTH-RWhuMtfU*p(JULZ;oAr3p(K zT)^y@I;Sq*on3UV-oChm|6-?}a&MVt8@2o`^o4jN<>_Cp(^NMM2?2$X*4UG*hsj<2 z>C2~R(x#gz$#zKH4S_ra=8FeSF>8G2v;-GgqL);={9SGE88I<1NMLPv=EG?*kHFO` zMDa?*)M|hdtLu3m@+pe6$vtZ%Ij4(K+| z<)M;R)uAV06^f!3SFJn(O!y$s-J8rje61v?7;VRQOV&vkG%d+?8#PXyS~WkZ=pT2Z z)R%?qP&EHYs}~K`a0!D|vj0?ycs?1PRXsU^huD|h%l89V7Ee(D4{&^#h2$?9`itlD z1s4~dzYwcT+_=)c`D^8Gs)R~cuxh>2LHCzNT|O(NtsRPWadpx+;s(at!xwEiY~6rH z+8=J&U@&8FcV1393S^@8Xjr zG0>(GLjZrMr{dOeylcOtCTzkD9#9(z5V z1FeezT*xuJGYtaomzv`V?1{;kJT#;y=FSYnacn2}&zD^DG>>=x3a)^ED<>Xmh3HTGL?>2J@MFj|Z=Pur+z1S4>)BX{BT$UoGwmL}1#}7E<@>7>`E1 zAw*H0Zd(ww41Es3cF1((&7W0@sx{V@KQ@0dmwPqk(;0sftz#hXYQQ!gwxBn zS$2gp2JEWL+OQ#=`-%@S9FO@PNiYB4FMs)qfD%Fs-9`kJ?A{pQX0Q8W&=>BJQEiRe zli{dbu2x%}O6c;);4p?y2LDRWQ1QWdLxgP@FSv{U;FB&Y!b`%*fL0;AO&CnVcwMid zG3tH*Pt=R@(JlNH;QdiK-|UhTt5teM@tF9@LK{>%#0i&2F$d#lcy~=t9AK_a1{mmD zc>X0yP91WfLD~UD?-@(OS;Ut}6rx27IRrh1k17a?H}M_55s{zmj(gm9QJq`)iBE33 z8dgX3Hk;h`q*5K(-S-k8ZFZB-ct7345cGT82~CS4&Pc-JNemWu>*d{=ct@fmf|)ZR zrt_QWkXLbg@$Rf%!+ z6HiH`2cGyq#yjbj_phR0!i-XISE7sE7@sVTrML?wk7w&y{7jybg#wwR64$p4o=_1J zD9BU#ctY=>`1@b%K@nyPBYTiq6nwA2+a*zF!k)zCsCYRFw+`JNgC?Y9IK_*9$_7Ia zyStjv*mS`tY#|e13!1J$+Lp)kU|& zqgvjmjLj5(X(sBTD+h0ZzWze4_wb5^6kAMCXKMuXAx7kUjKML-pgMwHDnAbp(nCU_ zI{|4w(Q!TpC@!PiD&7lwE%5YiRxA99{=3af}-b%jHCvyH(M$g}4Ky!jr7tFd~l@f|8(sXyhF zOL(`sd8)iyR#vcbOa3dE!TRs}SH080(eY(}->A78vCe%VhF zo6HS39_&*-`_N0(7^r50@Hhk*h~7D#)F9;vOTMqDgR9UbzglVYOa3xk#Sw&Yo#?w7 z&Qp>w@gl)w(a{a&Z%S4kg#t8`_}s&YulI@?m*g-6p#@~gKgge1vxgLCsR>MV%7r8HOTe-F2Cum2I1FvoP zDn%X~1{g7WPVRcMMj6-YtwynmFQ;MI2Rk5hg{$k4a43Dw{`jcS_6dv$4pesirld03 zF{~Nx)@faj9vpW%{v=K)-brKD89jI&8+h}h>UU9VFQp0|1&#Kd;wKPm-eqtFOL`OR z^x55wZ3ueJq|d4>WD`r3z6aiutzDw<3MxwugT|ukN zJ{Ahf7wH+r9i)M--==o8Y7R1{D!lu|-)@UAnjkO_PL5zbAHNxN-~DB9*gbsP+qZG? zB*56v{2~Gec52NE@bPLhoV3goKPHUI$dj+QZkzbt3x2fF%)FqqV?cS@-lLmE@RWhQ z4F2$MDEZ~()8G$JNo2adn}t;WY4GZgHQ^8oXEKD}0%IxoD?)_o(kgiR2due|uDrBD zsOXa@f-Q~>K7$6Iv37pm7J(*T;`5*J0;M&SJt02h9d7L<_!GzYjGYbOY4G&tzazqD zO1D5^_MLRurS6fl8wTNnq;UU+Iw!~dt6%nE{79b`6YhaPt!A-`6#7ct0Yl(6U*mIb zV?wv_Kd|1h-Vl8%yJ9E(2T0?T3JzZjV`R6OUgBYpw-IOtn?-PqzKz1U$Q!pn=^vaX zhmoLqfI;9s;`2a6V6z^9$2MI1hVZ;_jb7d8wmyZ!d9}E^zDba!llhfJ;d=EjfG3KP zm}60}8h!VN|5W(IU)jhZ1Y9%tn^+-RDlp8=(*((u2G3~8e-mgb!QWst$;F8Kx$?QT zD|WUMw+6=NYM*m7@ua=_xms(_btj6```5m<^VEQkcgTyf1koD=8Jg7(-9QpK#(5tBe=7 z5!;Bticy9KJ&iHS*X?bHkEVZ&X0sw{&;f;vg35aSF`7@oor`fub{GI6SYa{sQ3T6{ z*OCuJ+*SvP+uGwV&$6kDcg9i)u9zT43Y%)7AWZ*M@R3_v!4VI0GNN!92tf&i4jRM0$&@6N?+zwK=Hc)l$3`X}GPZoao zDtI8s`1b=g#Uz!*>|->RxIRWJh`6c!jlHAC^6};dpVsQ;YoLgI4iA4fV zNjA>$EP}EEw5Rb(-rf=20QeOd!ywwMFiZx->!3o1gkc5fu@^w-Bi?8H0MQPkaLf~~ zuHls7$3Kq>4zEf@$EA0Z;qfIquQHe5;{i{m|9jRd8UjT&F_-o~F)T-2^q|QG6T|NA0%h5CRYPG^ubYFYJ zZK)w2kB(ozCeMZeh$uyRFb_W#OX2XSYU4BxC7xLcj`I;6|1>V9D4j6<@x6Q^EzEt$ zo0D4%?!}Mcbf(!j;2%^(o8NbeAJEC^;P_~8(CznBZy>?HYSlI>rE9gS2=3Ioyga{r z8So(NeBC|!CVnQo5r+|fx-F+aNlW}P_$J<$W?44F!qw?MqNht!=}f^L@Q_)+4H<*# z%JGOpntL{KHw9pMa8y5cj}M8E)aFJ#xW+`R#UX!Q4dD%>`B&QD$Z#9-pa^%%B3mx^ zB)=9oh0)N0W>bkL zrf9M$(9~oR{1rld93TB9*g3j_^nIuUJ~=+T+WlMd+>e6c?RDSFb-Q^I z$Q2-c;cnrT|8fS2r6z8R);eC7&_VV3E?kYPQcIBf&J_lYPGz!J+bfrwjJfVb&9uTG z4VmZ;(q*Irtbn1b06!@`)_5^M%_WaxLu(o4tJ=co2SvIF-th1Rc&^^F1N&NX1+WUt zMc#~2#9c6C0Z9Zrp5jh`Sr<8B-;4uE=5NNZ+qDTPCbK~MCkK*%Iua;TM3_~2Cw7+y zlE849YIAIAgBL*!_E54$_($nrr-KxfngvT!47?sZM-&Z{J1_6n;5b65k&y1dMnmz+ zjr=B(u|{*y3O`K@WE`IH(;)ii9eDLGG)F>2_7HpwXLk{RX}h0Wc3(i=pcpa;%@)^p z5oW}56^S$j&31b@YL&~QNhcbHhJTL}nAm``7&rmCZFY)e^oI3{I~!GsnBoV+m)_yE zB8F(;Z2MCXNH*}^*?IqcU%FWGAf=clkInUekSVjfT+YB-6Qi1fZ!D0Q+muOy8m$%_ z2-1#j45TC^`xAwXzgf({?pfkgTLd34#2{+WA|~mGB^&&Z(LDDoBHCy)1{>k+c%a2J^)TgzTAkkds6;znQX=kluu9aG3flrlfWY5Nr3hOJGHXSY~)t(*vS~ z=-n}lM&KJPDXgOU*HQVT9I!$HtSUF9Z>uAlk4LoNW;LkhA z3#i6c5)oD45-38@v43fr8*6Jldx8GfQJGN_Y+C7Wk_n9V+Iu6&jv2N0>J4*snNVVR zncpcoH@a)L_{RT_-~?;LB5?ut#$z&Dyo^TE$y8?Un8NgfV8;fEYWm^g1C!ylw&ugZ z*?IZ6e_rZzntP?{b_q)UzqXPBl>EQ{kFAJtops2z&4c=ZR zMKxCRuV{3`VB*2yPig^%5o+L8q8}jYglwnXBv%uRB*sFS&0j%36YKF+Q=r;!RuqK z$q75#{(s>#-kPiiuP?PGq3Hkp|5(ew;xdQ9rAw~aqPbpdZC%gI$zmnb5p*p$GB9?Qk*UhFIZR zq$0ZPou2=>cXWKY#Zc4;1-o=FKB^AKiJmm+EIar_rbkIvYZqk)8-)FJ&Yqo}54!KJ z&QCEVLFH42Q~hqa#89w2PW>zh@79Z3cy*$Xd=)~#UUrpFqwRGM4}1N-GTbY;XmTfR zbSzne*&UMBNQ4m+_eU6q;`j*e6WpB{{t`{_hmG6h^Grdprx0;iZi#dh?FpAo|NWX!_ z_fvLIvioqM0LYam)|E=LSOv!<{);)NnDLjzWJ1HD%sv=vi$=DqXllD-OaO_VP;48O zLP#1L>whYa=+FUnEd$<6q^cm5cK1yP z-P^o({(9G}k@Eg8nKiV*C)Ly{za)SDA|tXHBp@rFGImS!q1?k%->DnpgTPI&bft!t}`*TCoV zxJznn3PeCZ%{?MAITrCD24kGGzrbuVVGZEpM0gVqK)uV$0VChpzG^zv=1LBEy%>xa zusQIxq3oc@z9ioJDzR;#q(IdZB{R7dw_3ujSj05fhVUs~-mT}x7>PSMZ9lo?0jPPhR*N!44O6_M$f^A;qI*xOtzmt_E~sI>+89Q* zqfJ1l2b=hYQAa9xGo>Gi-hQ^_k`t zoZo$-C^GR2IDzQ#18yU0iA*5au8e9m2)aKCtDTy;E$y&kgW5~cS*chL3R-C964ex* zAeh8mPfe}iW7U@QdpQI>5%NWZvT-RuO^j&+6r%8~0S(F;!2Jj$Q<+Ype+D}b?1cZr4!*rEQG#2Dnjo{w z12*7JRVJj@(DT4rRE2!CrF4;_I$&ZY)Sj`?nQ)#PPnGbvTKHKUkItq7W2oy{sxA1$ z5PEy;W6-E{;G$Ccvv>^9j2h#;3S-TUTB9;-d$zX#wCrwCM3Gp~WvDI``!eS-2wC$r zBs^9>KEy8|-C1mW*ApZw`IHy;Gq&Wwz2k!c!svxxP#^Oe97i~{xB+2AcLKZ+&B<_z zd5dLezA7YCgL^@(!Gq897u5s7;BlM-@lurjK?o5@!h`Qx!PjQrQi7ItwDwv``6W%1 zvlBwdMev;Apno*@zePnOm@(O?6E-@jYiTwf3(s}bBt>Si(Ev3j{9qq&O>0%@_Ok<# zw3qB)*(I741MxWo?UDHvy@uc;EX;EMZE)1e7OB>sT4F+a!0yf4u<5!p(fXT|Ca3(>X6^Rz(Wa$=@IfRABX$~~Tr?B*xA&i43 z;I#Xsh|ldXwjb!!<_kFn@TfLcHMlD0>WsExi~2l3rxcn2jr5K&LO|CLa>_XwFY-KOJT@Ee=gii&@F3V1;*-RG1(K_BPvGIygmcgwkS&rnuzgD?OLJ+tW z@rK|X`N{F?b4EpQ^4dWkWpYU-mSpr3EMP01?h!12>NeOdZkH$=!dl(C%Dg+e5WJQ> zaIm_^P^Vy0M_GmqJ81kdKZ&(9v-6T20?Vf$-5;^DuPv`^%ob)XF(xEhd%P3wN`Qci&gJM z1uG_n44^c0+9)UmUdV2Wx6?K0={d&~CbsGAl5!F9P)pDOc+0#ET$Wxn^G6ck#efiV zCUszNGM-}?PYIN$o?iB@-d&yrf9{^V>pgV{Rd}!j74QS#ff^}S55`FNSF~DiA6ATB z!7AZjWv4{+NOZi%_&TJ|e!se4ouvp}Pp~ce9VH&dZ0;uP29B?~`EpIXHQ}ihm&=f{ zk^_l0y6>*uo?mVUe+fT=z37DX=^^-*{wm{Nf11u$)37{Qy^@sd_j*D1q<{WYEHk!& ziV8hx1;9>tvQxK|kg6Wa%IXS3EGj7zJWyJj@97a zn!aZQeeMP>?};&g4M!{r_AA@T>|8^48%hGeYHxGxSpp|i?w{eyXWZBi%Sh$z(61*& z%9FVaYrumh`D0+JAmYbUtiU?i?V@1lR+O+SV+0@^OPdd0XEe1lCY zdZz7Q=o_9FmfjUCy;Fdxe|$a49wu^Ix|b4v7`Xb2EEWzfWnRE@fF3AJSKIQ90{YLz zrclRM(-Vbn$5J-+OdDkPDVUT=ID0-^3b6qnt{U|5#!=}Vmv1kVftG`vE9DUe)!XK} z^cZs>MBoAkkP%y*31}IVxTT)9Fae_J zJuo@sTf~Jx1;b6ZAZ%{aV~^Cn=C>dm6D&80f!}+!#j#NiP8aN8en9N=G$Nt;A<=xH zECJ5!<=90I5uHP*7wu4ISdtrWh63ctkJH6n%%~%@CP2Iv2JONn7n?5am{3Q(D+mjC^n@LDNO=cV zxMI5T7IxB*0y9A3VlEx2N5IR#IRM5djjG;$;mjV}XjNp(RlTF(l8+ze5O5TnXhCFG zR!xa}QOnB;c-vw|y|whP#xfN5iATz%4lR?kTzCW;Wyu2~Aui+f6P&{I^^KuP?p7j1 z!-r^@q&gZWmq@uAM5FK!ly_(rPH#2-VNhxrtssm>tZZg6LZVtIY>4{pDd~NxS~5%e z>M6QMHoaw?oU%Hsmk?QOjD6iMK~O+tOhBb{H^vrWgm^ zm8;LYuVHOsC=9e*@vgyS|<>Iy#5OazF0^ahB9_S7+1Fnv* z1fk?^M#@Ggm-3xdfq=?%!d6Ki_WI!b>TU1x3ApxRtj;1{0A4_$zm!?c89p^k(BY+$ zKrX31RVfB5@H8r|7Q^Wr7>=w4>M5-vYNbk`Fu-3HcWcIG`VnwOYzG7#>NKh_q2sp; zd^nKAhk<*&F~lkQ6fu%1147v>$B+`RO9A5=R#FuPW>j_#4WNv{asA^)!?W;Wb^5IQ zS0@K)0ny<#MF`nYpv*9^9c?BdZD}DBgF#SIWg3LT1gMG1gtT=Fp{j~_&{B3HM=J;z z2ruhDPG`|IQ38+i^g0KjTRk;EU5tW<;IAYtF$x2Ag-e36823}S3U3n?iM80e4?_$b zNHRjmS%um^D38!iw*$kQgY-#G#%etH1;U*t58j0%ea-M;&VjY(_pj+JY2g za^W%;q#OzfyT+mu4TDHj;R_BF7*hP4l0XQ)THwPHg8p#g;9JvJU*r3Dh~QeG91O|T zRW8Up>$nVy_)B_~+FJW~F6Hc5j{RX>aGF*yHv2w+ z$7#a)n+W_;GGC#nsUGBD}hWe+qAW4T=JTh<3i3ht1|2T z!}E*YfRZwphUSDv#=LKI!9Kirhjv13c2q=Zvv4M=M75Zlcf$U}Z#TD~@|{OzkiH=v z%XCC?OmbI7W+0-hs1GY;!f_r+MXAcQQg~_DRvI@O1O~YT9Qg{ zYCCbNU_vM(6$aT@Oe`n}T+T+>NmF@DsXIVj{bes5bAWreg0^|QJi*uDtDbpui5>h&KMIH7eQ85d9>snK=;mpug!J^7mFsXz0;=)Of z<*b8>PBGISpRq;t1T11Iv-+$w^jWNay8OBoS#*DOY20XsQG2L^*IQ)MVGK@h)vFT| zS4_7~t_-8@IcG=_?!Ih-bV=na&ySR26SA>o`O98bq2F|1H;Oy}0(p2?mi zg?9>(AuV_ET?4Uv=iIKwM7Jui@Vz~R)9&3ui;C57W(Z}*FvfwA$`SuJYops4Du zE-!Oz_GB2TeXf(Yn3|lTu2H(Ylt-oTJh|$>yI`YI$Dys-WQktFNQ6ID66pgqCtMui z9xQ+phhlaK*e7*O-dx*Ii`1CFk*?-w*Y} zC4JG#SZ=&A@3~^$^~_Vnc4PBze0Dqg;w{f`{JQgiO*m&k6JGU6&_(R*Ign#<&VV8R zniF7(<1!*22 zXg2+XC(Z1(5D66%Y8}x_E1KfnmB;lbb>~0tqIg{lZWa*Jb-LbG4T5m!fmab4R)aOX zN|<6GDn?JtrjrUFfxF{JG!%`^O?P9b>|%oT913`?#U-6oY&s40kFi z(1vR>Ba|U^YMyq~`wwpkc%-zXsjYECuf09htBF>}6L#~Rk6o)psCW1x8%K=o!F_{k zygt+S&&st~<1dI2=KT?E6nGnqDN_kq$dc>1#^wkyzlW3JpUzROMY1LH8->Zf6cqTh zA|DdNm7Z}sTG7+ED9r%2QF9d~#mwI>VXC_|e}KjB=F+co8VjR7$gPH|5HQ9*7U==Y- zeT1b^weSU0)tf4ABafuR?Jg$oL5_zzc|1s$o3!7Yu{Be+HGR`Lwl%m#>$@5qrI~<9 zZ^&YL?WEJv)((J~dpjFdvSp?hGdHyw7 zAGW|aU(zmZT`@1eK9k@reJvh=``p1IcvIYaf{aSQC3y&OVIXADo!uv7a3RtM^uXFse12=4|_AvKV;pZRSg{l<>D%7o3k_(-&!v z`c}8jzjWM^H$b3ifBTn*Z=YUq zLaQ6{@pRUA)fbXEeK)dEIk}8j>8#z29K^O=UF@`0?+FfS8`qa##}ptGiK=>^Yf1;p zyEvu#mt~7(TJfLg33VmDiqKoWSZc1YZ-aw(Z@@{03jt#PbN4jHS?@3}7CWHghj<;` z;<3c8%EK_GY{ErQ{ce}EQiO%HTo_=x2+aBhW8y$x@TGt71S9T>-%(J(r~A3^uz_)w zgz)T7#HRkuMIFEyuoYk4#gjq=ja9-*i6(eZ4~Vp>k2ES@gAdz;vf;s$?7GCza$tCG z(%O88))b?FP|yTC1_?UyU9a$}L#gKywez7I97rR=Z8U(m-@?>=2bkt?GENMTgdS6m z-QqO_CQ@m`NXOO{m?qYEO+a8smJ;Gyld^XA*wz)OYbI94Jhg|=BWqTf;R7n4#jE-4 zfC8d&Ig|dNNKokBxVobkXtY-F4XM)ABKv_ak&s{AQcw$&Ce-&`l9<5Vt}dT&`61{p ziX_Z&Inhu6jPF+T>Xp{F+Heu2KaA!xhwv}t;EvoZvlGPsuF$LA)scd|BgqEI(U~M3 zLm2ZD054R??QkY@fqt+Ll(`__G1wux6kH(zH)y^v8T?vxO{QE@;$pT9r#xmmAZ@}B6c+a( z^1~44bWQPs^tf<>TcAk@JI)r6={v2YsVmp=+1qoA-5OnvGePj9EQa7B;A z;87_ttvGo>yIrDSWt1veOz~(2O=DPa%2~98?Cs?5jyzL)_gN5;ya-7$&6}YKTyl$` z5s8kU8OvwWptvOScL7{b+b(@(zkbFf)Fw^K!E1W_0oo(H<3eBPP`C}(;KqOLkdR1C zC!0)qVZm%(**B~N58Bk8^T}U2X_(l`yQMh|>Er!Menyua?XxP(E7}eiu4Vsf?gfy zCC}?%6B0#H<=c6-8DH7ZG{2fz+pf@pQ0Rb9k^~QjXXp?|&b^>EB1pj`2wPITTeiEL zizo#bQSxjsWgR1N3jTiNB#_i*E!2&>o&e!JO2h?CR4Uk$X~ci}v- zma~CJKX&2B!wnp;-!7r>M~zXfxContCP z<`+k=e1+x}Uuu_J8dfptZF|Zo=y>Jta zc^AOP=4{Y+E1@Prw7ieE5%_3K<6E@#3D^2ZW8_BeVlDVNpj2c91@gzfXfhio~>5!+Ncqt2S>?6ywNz~D~E)NPZT&IURtNC`Pn{VmVG!MpG?a0k{DyAZN31c2lp#-72AcqqE zWS`C!c<=pnw8_$dTy&ZX@@tY6lXJ>ZJk6(sY3(oF(~A?dSG?t#z?;QACUF6>g>)?r zKC>VA-jp=CbUjD2@j8iCFSD@e++r$N0%}X(^2)KrTx0NZyWne^$$IP;I)r@f7jn0+ zU`+ZD2rJ2C9n@(tH1;sTJpai)Syt#y74=AyDIhpotf!+$;jLhX35Spa8r*!s2@f$d zoqO!)+a-+U=w1)I_#EHQb3ts=zk(ivc8++M?v`lm@qCMe=hky(MRLKzd0fmdZSgHZ5?Kb9{!yn4-(57jJ zJFOK1aEYT-tylWi;2O471je9sgnkwwxzaPKY#BnBNC^K8Nkc#~;Q_B14=5_pMm6a! z@jUt}$JooSdybjRCa10*+>-J{uGT7YEq!CJTCcQf<#N~@R>Dc{r#l*|EET<086#I$ ziuGzxpdavj2cB8LWdN#9RX;Vc!g=}w)Xst}5VU1sQhl3=Hte*;c=zByq6Z!%+Y%R! zWD7=~mu;StfWw6RVuh`tE_G_Elfw5t4ZA@|DNjAVseBr_YdlTAD^z!mmq zPLMbqBAr|iDHjV~1NFQMB3l?~1QH%NqHJfX1IPIpyv04fI_{nv|3m@$((R_4AAjbV zPHb%#GTK(%HH_9%4-T+3+O|*daucp_6By$ z6nwbItMDdVE+a@@q^Pz1utD^RO)O&_V4F{E2pSb>TsIq6A#>kkj7`~K;7GRd_|y%m zj**=FaWLTJPpQY{`+B)kG5obX=OSMQceL`+Ebmqx7 zHZBsQFz#@#cJ+hqSkWhZy3PBd;!u0@GsKn4)t`he6iX=LXTHd6#t-$x4IZvtcQLpJ zi}wOD7B~b#zs1CO4>Bg2^4!GIIv~@UZ5TegxZ!lb_`Koe~$xxeRFWb8AV3O zbh$dp!2t<8~TLJ4+fpRF-+zGRidtlhDre>&m3f$v~?(84>aw8gU>Vm$a- zvCb|`^aJwX;zCdkP-?zN)?(?wuPSS07iC!KZMmKpL4>=Qc*&>-p@YRKCGBLZVn4U# zQx&WRdKDoM+i7EAOv#f98&?nuDcR`2+r?R`SwWJODAnQ8vWV&AspI3j6@LiEPgQ`S z=U~LQ;PE?AiIG5(2`m--ULD>tY?vkkBO;bGH|o#fFow^ci^_D0QQ%Q1*5%mLdl=ME zU3JMp_et;S__TL){_g6Dc%~>?Q$)was}p3gVZ4|@ur&(wEbT3z?u6&e)9WcEFobdp z%8OUqYe?&J8!aZ|5TjYY1YAjDZ0HsL>lfQxs@qVT&w?sD7?uuoPv@K0f;q1W|KD_O z3)#kH@;{OM4POpl=_u>2w98Igmpt{$tST?;aOG}zt6wzHu-t|l>+7ql~ zp;03KvsFY%;cgbQF-TjIF^eNrk*+j`wq26kUO!j^`#8%Y6M=ev+%C9~xJPP7WZXm{ zWW15sAdKV1XqsfkO;ZVs_IM09W=iTjY|pBsn=08w5szoOHo#>ZB(#C$yzu#wmI-q8 zKk25@AgeO4rn@tbAj3`DBf=VbyEF$hQAwBYVXl2?XJ!UhPw_Vzo z#VT-K*R=+Gs*c4fHFMgvT1OYV?YhzY+-NN~bJWC9XRyrf4S#n=Vqx%Kdpq+o;=E5=g_DXq4 z36O`cOgsWVdC2hBEhKSj+ef?)$&e>~Xspo^^>aQqz3p?SobvfGxhC%5UH?6!7$&4r z)s9I>S%;1eA(2%1U^Ug*uM#4VVNcR(T9e%7Nq-Av=G_dw&BOU3o<-3TKBSq2nugPn z7B_#=Tq;lB73jO{34OHrjKCQ>g+%1*`vp6kLO3j?6dHWyxBbr#>^jLb2aJFmhwW_Gh=s9m2l5$#l&wEq0`KPoRXn)5as&@+V5$sj)UEs3C?DO40 zt}CS<`3@rH_?g5tla5A|5arcbL5COgG;#3Jxbav<*{K#gY?Syz8Kt_KcmBx!+BHUm zi6^HNO9%B>%5n^p=cDj&3W{)kUwaZMRLpn!FnZM*n2mb{!&`_DBm~;lwl020$JpP`;KD zuaR)ZC_9&#G+d$`O3&lP-Ea*y&d6=bqD(vH9PfH$xvb6>oSpT_fM$oi<}H%@xQ7Ky zk+%LV`<`B8NO_6fVw+56P!OaRv18-g5b;b9>>@l~Z2EpxJrVQx#n`gCPa1pG(J(5P zYxQD!gO=$6!e_6<7c zOWbbB+rEikN}#)?Y%6{#JStZbZfI`nsCWxJn%#|gI@fLP;KCZ6q5@MYoq3cAo^L6w z2KMBcchd;2S|Zo{#;M_L9q{X-Q;E90!u2NODCl|aHy?|&BUwuE^mxeiBG@eP_yKsE zCW~df*xn@7xI;DLTpcNei9T`Mj4C2V`R_kA#jQ!X6vAKQI;e0qmvU#5=_avb(6xn zQJQs>dxaX=kzal@9PnAuTnG+ps63H{E9k-{lhxhbZ>kgfv z1a1f4d5DY+Epyww(PRi_6u8u&*0Ur`?sWPH*+31VL_|-{O1jz5EQr82+ofcJcxqg2 z;R>#REI*`kHDX(0HjT+HO`AgT$>nZEM!!@~OcB?1I_JzD$hKWjBLrweCj+xw6QpmMJ?9oxoRZ>t_iLGgUr4$l_y*S?=y;=(9YEgP@sP!^d zOu<|+w*INBMvX|UuN;d5HOhq`HBc}HBPTASzsx?rgHP#2;&^gC0JE;Z$;#)LdAJ0( ziQRNYF=zbCb0dA>bPOprCsUc{$)2!R4W>-C(Nr{LS0aTX4@p@e5s4N_nRSE=l`cHi zWC?Cuq#G|fl1ZwyO_LSZqj%qQkI%UE1Aj-u1PFUPuo#aUmG}(677<6W$cZInP-R7$ zEtGEQ!30}H(wm%q^arQizdX@2@!<@9f8ZfM%0~AJ2`a@oTtP-!F*my3BD7!r96uUw z&-XZU^XxtbL&z&T62dImF{#C6$M&#MpER1~a;p+XdyT!EvZI10Lv~bZa@nzkvSUk? z9jOw?j>|iUVJOn%ip@>85y5UKoVPAgQkf!Bu5YpgK|aUWq~eId_`_#=i}aLkyJYjv zyp7mWe^53b_cA7#1W<~YJ>bX0j(#nG95{DirR3l(2X7bmU?$*Bp*)~gtVh&h5+R(X z;t}8UUy7rX5)%qoC*r498~V~O+ZU!u7vy*RF|Ly~g^g(=(dzUmr063nZcL*>ZW_rp z?qWl*;QJUkQdf|KE7ZhMq(w$ZlSq3S_C(8On_TEM)!9k})khsKUMe7Vqh$@tOM;?Q zm%YNi$fKM0MflSg>0-5>*zP>(-q=^q<9fse6tF39Q3_U}m7J9B02NZ*$y)VK7eo<4 zR19%Qhuq}{Mi|{L*Vr>|iZTxav>C}gI|-*V^7qmo9m4Z2ep~^R2vw=^5o?SI(LWi> z$~L2#R~<$|jW8gH%ARxzvVBa1u+B$*VpxtZZqQOT>IOt9*qDeTL`BkHg*f&F<|2^E zr%WQ{kULY-+ZPLOJZ$*c7sU34i8n%pe+fE4CTnzP?I=uU)P4?I!ak>tj4T}g>#{l8 zvWuhG^)vVq!(D@24`I1Rb5!j>5XLXe>}XFzp4n(VIgoAaFf+lUtRzCYhL!qWi%Egu zIP8oXqnuJ;f+j-mQ5<4m~u*mCeRk3h$T=e2W!A6mHgofjM&68Z1ob;=2^EjGK(swcVy4mFk zZf}`;=96YSZZ_J@YP44_cbe@+tCcsdg2a-wV?HUC;=N+60UM^)&^8PxtJr>#@~}ml zysgJZ#%!UaDrb|z<~?&)zwF!Ds=aj zG^_YRK=_4&5|PpGL-e5140b%Jk%gxB@pux&;1dsQ%`0Iptd{Sb?klZz}|Do}WAK zX#x;gr-`V;Pm^)8)2{5*%jIS*s*GyGoTrJzl5v{IdUTq!YH*sc|0<^mRDsh(I(8YV z5q;_CQW(H$LYT0}KIh+Pin9(Ix_k4NQ@M_b#G_vtHKlBoXx=sq&2PN`KeAT^Yp*P- ztlUxmMMQ3jrYfJEA;&tF!XKx&H7TaaI>arH>?hl$jBJ>C1LXkCPzKKJl0Yhhj7JI! zTL;&n;e{y`^R`sUkbh{(J4&%C<){nCim1vv^|L!6r#W`@hRVlZ$jruRHs+u~K}DWH z2fHP~p6r+sBu$mh8#Li(7cAYxK=x#P^F%(0wW>y5;#*qbK?Daq_|-@AJ5&1SKY(6Fn^gUPC731PQwdl9O0%NFW5TnFu#b-Yn0ZzpIb8u4DLrt z3?lo;$D;0acr%~Uith;4nxuH3r+<)@jn+p?0`)U ztF$gZ46dgiqq#U3AhnUf@Fi8`Ltf-C3t=YbbQMfI!C^& z8kqN(nr0sM+N6mziF?2YXgCq zO!RA52+AoF!Ii#W(ep<;aLcAq;3~a-ZBS-IU8iwL4eF7$bEn#W45IY-kC~1gid$hxFk~e9luJXy}OyhQ%abMq^#+J>}ahi&y zyt;q{E=wbz*W`MER;N~v>XmYNJQ=ndm1<7CfPpJRJ7Cnt{Cf3bry3OK2fR(9i?5z{ zJe{onr!5z89Krvi58Cu2sHwSh$5VtRC#SBA#MJR2hI+l~AK@Q( z6vj7;)tX1O#*Yx)8i++)3+jTplH4QNUywtL)so7|Sg0#y>{ZfLJb{5I(EK-w(3pXO zEfhk+U&1-i;6uj+W&u+o$Wb&bAOp|dV5m{KAS+O93%3(kfDuOeX6IOx&>Sy-uPI(F zo7QzSmuI3NqF-*O(JyJjGB> zb7FmQ#1V-!sGKs}B-V2jfFU88P{e4*8e$0|o>-Mm`)vzjE&ZtGazy!$ZX|S5lglr0 z@KKh6P^fbIz6S`g<#dXUfEb;_(5e3N3pek16JCms}bhR{Jx*(2;;Vo8C^* z>sVgrf9Sm@=TA3Nd_<25ZXFA&|1*!*oa&WwPZ#|{%5k5rBmpulGm`~Wo=An94w}Xoa6zd zx1bg?gAI>$&;~9g0iByEuf>|CG*Z&`as?aB)?17`%kv&i2u9l7)p+h?IGob+e`{ZT zn9NY;5*t@UB-3Vup5h4QNHk%X0)xhodqUn2a5Wyt;QBVqiVqi7;k!n3cDt|{xUyR$ z3je&Mb72HsTT9y|3?W#AEHva!3eg`0X2onO&V6xTf|fueS%3>jCJu7|c0Am9757bW zwLpEJ7~7PGpG7x65uiF5P@I^?A>p-V!c7fAqyUH6kJsSShhcV98?gmNY78DU785ZY zZpoY}edjUmU_|1v0^XaKc#4vaecS&=dJQ?ZR0K#UMJs*O>t9{IJG?r-92{TuE>VZp zXMCL13VBFAk@YM^4CU0ZqQTwiLzIskGPy4)V%WIRoyHhz3}HmJgV|!SMB#S=2Us+F zNXrZ32)sU@C~D(4k)hC5oCL;(ppD>cjk?NGdfD58P|EeI?>HkPrkZ{u*$$6x0%QHazLJ7ib{`lF?*+l}eyCKqR;i%I3!`2nvW-d9l1dP-H_^2| z)J+;Gn4``aYtSKpE5;LLn-x=OK_x}plCx$((RNDFl6g`Y|F(SH9xSBxlfOW-IVyuU zQ8=C5ts=@c%poRsGh;O3lA+`rq*r%|Fr92M=fwi?X?ugUYTvOSDM%eNPBgK{B--RgYt_9iA!e=Ckiz?1p)Kv##H_G=O4L60&29rE zTIfIVpfG)nlsb{*#h;jA^9iB-w&z120wh|`LFfJydr2Fl=MeMmOgpk1Bomr%&JpP_ z3}L}c8Cy=aflvk+dTxcsWrC*2WZe_usyhj+UCOiK)obn~aCUJ!-A7aFom1z^q|gCM z(F0yQm@hNcuPz|2iLH#IMs3_Imq&YhqhVu`R}0&*96^a!qM9>G=^-9=c< zT*25V6O^x4;jIkY%_9ZtUc*+j=ti97(Pf3SCEwP>dYPeF=ciU=(x{sY9l1u{p*mV8 z1iv*PF;u&%YP&6RGHqL=2Y$cCiwDHRV}j)^B@H=VlZJXt_G5h2CU0kIiaMzufif*; z)Dw_gpD2ODw@Xp^x=i0cMm%2VMkpCw0a$g%gzVsmmY03xnFT05m2MjY6xt(8v6++L zj%yLd&yw{PnWuP>#*X*l14OE@MC*1Yy3LOv$!}c_-bNUWP}K~?5Ce67%`?2I26TF5 zh_4bYnYTeJNx4=MEwwe2I7UiPUBp#i73t~}m&xwZELK}Vfqp

?e4YGa?4t4 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

x59Qo`{q}ED_IDsj8O6P(^5ZFt&Kup@(t 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ὪP=xV6FYz3Poe&kWDBX=J( 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 diff --git a/packaging/eglibc.change b/packaging/eglibc.change deleted file mode 100644 index c8ae03e..0000000 --- a/packaging/eglibc.change +++ /dev/null @@ -1,8 +0,0 @@ -* Tue Nov 27 2012 Kwanwoo Nam - 2.13 -- Install locales which setting requested. - -* Wed Jun 6 2012 Junfeng Dong - 2.13 -- Anas' changes: Only install UTF locales of supported languages. - -* Tue Jul 26 2011 Junfeng Dong - 2.13 -- Import. diff --git a/packaging/eglibc.spec b/packaging/eglibc.spec index bb5f6fe..9f7bf93 100644 --- a/packaging/eglibc.spec +++ b/packaging/eglibc.spec @@ -21,11 +21,6 @@ Source11: build-locale-archive.c Source12: tzdata-update.c Source13: generate-supported.mk -Patch1: slp-limit-hack.patch -Patch2: eglibc-2.13-debian.patch.gz -Patch3: glibc-arm-atomics-disable-qemu.patch -Patch4: use_fullpath.patch - Provides: ldconfig # The dynamic linker supports DT_GNU_HASH Provides: rtld(GNU_HASH) @@ -163,10 +158,6 @@ If unsure if you need this, don't install this package. %prep %setup -q -%patch1 -p1 -%patch2 -p1 -%patch3 -p1 -%patch4 -p1 # Hack here. rm -rf manual tar xf %SOURCE1 @@ -197,7 +188,7 @@ BuildFlags="$BuildFlags -fasynchronous-unwind-tables" EnableKernel="--enable-kernel=%{enablekernel}" echo "$GCC" > Gcc -AddOns=`echo */configure | sed -e 's!/configure!!g;s!\(linuxthreads\|nptl\|rtkaio\|powerpc-cpu\)\( \|$\)!!g;s! \+$!!;s! !,!g;s!^!,!;/^,\*$/d'` +AddOns=`echo */configure | sed -e 's!/configure!!g;s!\(linuxthreads\|libpthread\|nptl\|rtkaio\|powerpc-cpu\)\( \|$\)!!g;s! \+$!!;s! !,!g;s!^!,!;/^,\*$/d'` %ifarch %{arm} AddOns=,ports$AddOns @@ -421,7 +412,7 @@ grep '%{_prefix}/bin' < rpm.filelist >> common.filelist grep '%{_prefix}/lib/locale' < rpm.filelist | grep -v /locale-archive.tmpl >> common.filelist %endif mkdir -p $RPM_BUILD_ROOT/%{_libexecdir}/ -mv -f build-%{nptl_target_cpu}-linuxnptl/login/pt_chown $RPM_BUILD_ROOT/%{_libexecdir}/ +mv -f build-%{nptl_target_cpu}-linuxnptl/login/pt_chown $RPM_BUILD_ROOT/%{_libexecdir}/ echo '%{_libexecdir}/pt_chown' >> rpm.filelist grep '%{_libexecdir}/pt_chown' < rpm.filelist >> common.filelist grep '%{_prefix}/sbin/[^gi]' < rpm.filelist >> common.filelist @@ -618,7 +609,7 @@ rm -f *.filelist* %attr(4711,root,root) %{_libexecdir}/pt_chown %doc documentation/* /usr/share/license/%{name}-common -%manifest eglibc-common.manifest +%manifest eglibc.manifest %files -f devel.filelist devel %defattr(-,root,root) @@ -637,7 +628,7 @@ rm -f *.filelist* %files -f nscd.filelist -n nscd /usr/share/license/nscd -%manifest nscd.manifest +%manifest eglibc.manifest %defattr(-,root,root) %config(noreplace) /etc/nscd.conf %config /etc/rc.d/init.d/nscd diff --git a/packaging/eglibc_2.13-10.diff.gz b/packaging/eglibc_2.13-10.diff.gz deleted file mode 100755 index 307386ff476b4f2d7f1544761f61a949eacfd04e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 861024 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%0ANMv;y69J0*=n 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

f#j5IyrRxKUN82pXlTa%xhDB2iie6se~b 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 z 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

qh6JxiUe}x+F#4 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

@recGsej7in6F{vH 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 diff --git a/packaging/gcc-4.5_4.5.3-3.diff.gz b/packaging/gcc-4.5_4.5.3-3.diff.gz deleted file mode 100755 index e176a9702a822bb04e20d7b1bf14e94e9779d2bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1085038 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

;w_QO<@S^SOz5c!3G<(qBcoaoYxP5(Su| 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

NJN0)JI4A0d*J`}zvD5r_~!vnSHF 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⪚CQtkP`}P?Q#45dXd&$M*O#cAU10ctAp; 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 z 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 z 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≪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 z z%Z-gwuBz%m+4C?7TtZ4W=%yb>BbT6Et`!L(t~(Bt5;VX02N_DZ$3u84Q!ns_OfLZe zyF&9f2O50ID{+P8GMvv$a#-zM3T=vc%c(kbciHNrLJDD9B%IaWC?PKk@AL{o>z|BW zZ3}`h5dJIs6e5F~^amm=1OuTy1Q8-hG_VvksD6F-qMOTtzKHIQxs&boa69kO6bXc> zXgLmXebwc)?@9+qO$p%I+Yk^~)4PW!ev0 z{{PubvEE_xFI&JDVgZL0;0LjQY1ObT7Th|du;0OINLNuD!psyiR{}Gj7pZ|{v)EIt ziNTke1#`F0Welr8fn&o;8{Ror^jG2FQ4wdRqaIlGz*P@E)RBy98?6Nxl#zS);3A?U zLls0Ud>~!vJZo`03s5>+gv4R}I?bVV#otQE2#v{jQ})v4MJ{qNk%FQ~+pi|yFH+}S7j zJAa@Py-M(5-AT9#?)AeeG@$?t7|1|zH{jBtoNk2j@UXY|}G29I*L!ee8$}~I<2dURVQ%p!ZIZii14}WB3sKx_x zts}7Y1wKI{1+>^3)Y^B;0ah`9SWvK*xXw$@>*Y>?9 z_OUMrOk{wsyY@%j^nN1hKzap^gBf#n`q;o@-HdI0o2=OaopP14dOG%aal!$txqFxu6(YdZjXs!WCRn`H*nRsRa7) zys>qBT`g*3x=%&pXg<{DUOwLz>rHSUrMw+rPa=vi$Qu>jg0&$dTsrQbF_J&kopG4Q z{3@sGom6Xq(wID>0Tk~mGWB~BpN24Wog}^>2ct|iwf2}U$rN8Gc<9l9Xzyk$7}#2S zk#bb+i3m}>pa2?hPiKrs3elxjbgQsiH1DgcmDku?O5ni_$}P}rs;ko1iZ@a(%CqC% z=Uf!)DSs3Vp~<3DL*Vy_(?tokv&D)hSnvpaF@fp(MwN6+0;^H-WHG&`KKG0!OjeVmh z2xdWTW@-T9wie(8nU+WT9y?3Qt&<95>?eQp{s&|6{4&hu{%Xc%EDlYwM1`CWltT4m zf4zzuedYwx-xIudoM&O!`RRJM{eQ%ZNhYVc7EVcc1?X*xZm)lM`6v6QAH6z8rNwEC z8S@iDZj>c@VHaK|COfsTsbMRrM-2p?nHkggU6Fl|cNu0>SH_^d3bSObc=D-EThZko00030|Lk39 zQzJ(b{Ve~A8Wsl=7>Ukfi0@&c!;!0E|6av<7K{c{Nr@8D znYZs7YmG1<2^vzp%#ponwyL)1cd;B3zsPHn`D#58-(bP(P$LV56~I!byb{lwvjT>g z$dE-9SjZ_wUzAJ)HmO6Oi{pj}a35L{yL5ba5?k$>okNZ~$|)R8Ay+lUW7CB&+sWu; z*Q4|Kk)SHA(yJ%L=31f5^GR;sOm4<-grV$->_#2K@+bI1+&CM5Le@bX?8ix}xT9Fo zTT#4=+bU|yo1?R)p3K&pk|`z?a6FM4c6SOUva(Z9s{-hN%(=;I2bMgZxqTd#9`q4r zn8+q>(+Ldzxbj9mh&826vZ%M_oA77W`y8|OfDbS!C%#Ram;J961* z8YZ%uS*oJ3e?N?7v5rz$@gqi~v#&2gWg(37a^5Q%hG3|#lz=u(NO>?3pAMl?F}PJ@ zNow;7N7F9k*PEW$HOLVVmodqK?M#pla`o#^<}|L6+8mB1o7!!2P791023G}}>{fNp zcy_YH%q@?K&uZ2Kv!)!$gw7Z%mE_~tZK+nM%QCsBL@xMsG;JIOOQrG*k>%RfC+%^U5ZQ==MEW(VpCS`c}XL%IZsZCU_7Pcoj#)a%w<_Q!Q zM&kVjyc&C&@C5C6es$J71qAV;4uuX-tApLj_MlvJ15Zvbv2!4Fx1!1=Dps7Z;e_V% zfV)wgb-49gPv6t>+=8!=^|UMr?7U+=-T0-^tet!BYey%wONKUPwgt|mJ?556nXF_+ z=STShacS{efA`Dc_w82reWv_b^ChG5%lZJ=qt%@-8%x|QGiY@M$52e5Q!S(|h zO2CgS77xbO1snYTX&|nRpmFj}oQ3@eFxSd%oQ=f2xWm1;^M`v;{nd?syc@%4w@_HU zD9%S?QI#iT*-l8?F14SVfX~;P4c>3ws!sj%SPcYDl4Cz_$>_&5-SZrMChY90;f5{h z^wj^Q(^LP0PPeZ;KWZMouQkju>8%V1pny7K?>_X$;uaVugN^II^*Tei0rWhLcm!5* zW62l*)Nkbon2p3!Sy1#P%O@nDu!U20NE4R+BdIbdw5Mh-#g#9%W0y`m##sLe9icmZ zrtj&gydnRmy=ZBVOP|W@v2_JJrt!8FPS~|HAmkzFmgEaRYuJYk=V?$QTM z&ywZ~j&ie!T$hMD&LQqH;4`^DRHw%^#<|Jm4_Z@yg~rVgZ2f(kkV$T}tH%ywU+A=>BSk&k^Fd=n;#;a1j(odDyi3YYJ!_+Nxq1+?6 zHK$$~w860QWI55aUq=oJi<4z`b<^Q>f)l~p>@x;~I!_+sKHnCvXDVX3dJ;QkhJCFi zWzvx)pB1H0tNWSSS(xIVw}eD@!`zgeU_I9uc`k)(fV{U?aF!1pEoQKw4Ao8O4{1P8 z$26Ktg<`R=TP&({Slp{rclI+Z2ZB_@lf>;bjVBsRDe&ujtJc4etoV3#)M$EFb(qne zsBgZh0kPPi@PAH+iZUye4vN)-N>v@#8clvjGPt0FubRgksvO1&DaBV?oaZA7L-kdt zr=l+h+q_V8hf`|IE}B9ZIsGoLt6s(1@yZ^Eq%d`tCy+MKi!mk2=|-WwD)pPf%8(1y zMwIU)%&ceQ_3XNMJ-IGr4=L*P7XB@W9WQh`_J)3se}Ahsw*M`v zmi*>*KHZ|0kA8zcyUe!w65aO3Z;OXCPd-f^m5E3JibD$OQNFw_Y&eFq#!)g!`?wE& z1uLDoH>A>e+Km_YLS~T@=b4mCy2G;bRbt{)=C7OO&)WfiUSW@a?`NM$#P`gMvNA+h zQu8sd-%w+*MZuHsus!c!J8y577IOMA!^ej!bukWx=XG_aE!@+(4KteUqa^lb*4oS> zFV}R${KvILkG;-Jz!Cr`gVhBrs>A>SN96ZMKi0h1gyQJz^r#_pOzaL0cF?#2C85QK zMxh7x79quQ7>-I6cDGTg>=@rFC>MLFjvfYJBx0ZAV3}|nSZ9)UT^66&yzovxG}E6l zDve*?l62RE*^c_V!r$M>-$y^|zYpx+2PUSVHw{G}UQOpBul+!ae6Qu1qX$*4T=HnK zmqQZ{86u&VMMSrP-I9Fv-JD3mNaO^iLNdNebFkc4&V{{sV?qtZqr6pae&o_%cYjHV z(56BA*#(m53(I4Io-EGZ9v3Hec0F61>A;gq@96nuiqkAEm>Vu5M8|Ursk>Cm=N0bA za%EXZMzmD5r~M#VNEs8iy2f8YTw_43Ntq)%7D ziT0d=&zv!iSqMBEbzkj_Vc+oLGsaBHRcDN{*t&_S8@BvhVJBDERWsZ8f_+>NajE*H z(#M+Z%Km;8H!rD8WluWLLdlkDc2wrl)U6J0#k`Hl!}&cUyJVTv4p?R3b?8|5?er*_ zUovfW(UQjE*;9){cEzN#8O#n~T~s~H27W6X<)x8gMtyT;F)cX`xh?aZY9aQ#DrP)N zI!U~&Ug{(Nxj*!~K`5g(#WduKr6{F`3TVt`2Jy4r{%QmKS#N*w;D14`PfrYUDKJWXI)OcKfaibT)69A%egvnZF$li4^6ckU0RemXI(s`?oQNH{1& zX*qu~qQxnJXOuR_?=2NKgFdZ0jUEU^R@@s)9y5TOa^rFpGGaKuZpz@LVAxKOYQpUMRAq7Dt2!L$$fN6&iZ@@P3Ap}5WI1v}FB z`eDYU0skq0zpRak^xukn*b_z%_H7T0d#2ga8!*?f3?~T2eb5^izZ@)ITKJKg4%z%N zt{ngm;ClOs`4l>Vg%u%}A+A`3ahhcM_-&SNn%fV|JMZ4n#?|=Hkb2TqJ2d1y7^MjE z>TuLY&tq1fFNqO~8?#39=)C?aL)7N}qA@y?YQ;H;HUqhb;j6<+Xe0*uW)!Cb zRg3vB@nxP79mc-Po_+OL*r1OY-0IDiKje=Mj^uoHB2;U3w=0zOfp!G;cUiK z$|j=uAtc%25*Yd$Oc`-g9DM3cG}AlZOhI6XIK%)Wb+IBL9UO8yf@v~JlC;Css%hfL zrN=keb8aB!>pxUBqVp9hP|XNt^f_9c1M`))am3uWcygHB4tg*=ex=<&@_yN7;HFu% z7gUOTHHJ^K8}KM&^c{Q!Pw>^MBn-8@XTt3hy$q-36e9P5>h!14N9NA>&or3Q05B`6 zf{QoC#kPEHn-XiUV1saTgJsw6bb{8zNoV^%Wepo?N$-?KQ<7yy9($u!X-lp~KXEt* zilbgxMYA$q3{$Y&6rwV-TI;RRHJ^SOu>513;rCvL*Qwth4 z7zy{=UavcZV${=EZ8(f|Ae-pk=4Gws9bcT(Sap_x>x}b@lhf~i@xX)uPMuVDL>7HmL&FFKjo zGVCk$ga29mF#46wdsKkiTmJT)qc1eCf9JPug~1v1rnVm9G6*3yx8n12BMDke3$`oO zQh7gFzmN1k--6XDTFz_9z-ad>`u4;J(4F~;?OM&ERSI-d#?cZK&Dd;c0}d#CJCbv; zVSFD%_Z}37O1z{07XSeN|Fm6eZ`;Na{p^211i0wEiKR%kWXpwNSh3W`tsNIu;uig~ zph-$*%~we3;S~Mvch1Z%Nl`D`NP*U|WO8?Qc6av7V`uzK5`|Qm)BPS3M8lBG$4aJ& zhVYZWz-baa#wLN1E+0ngk8dID4L=%*z(aApz{ZURvt#6{k)I)y#a%=7_nOjfZjr^b?qFf1NJ29#oV=+*h$u`(S-Ci zBvT%cftwSUC=jV2esC#?g@B9b5^L;xxU%zZ4;c#V^pPt?>-#~vZvxI9g9z-5b-ghM zFm{Bi)H|vas4n^|gdv@DTA5S?-ib@`*yofb3QWl8_0K?KbpkjJNpk|#b}H@h1uwvS zCWIO&N(`3#-Nx0;JZ<2?MhZpQOtVcA*)OceP0krTgIs3LB2<&YBT{u_jzoOE{( zn)r^UldoVYh%cDx^`f_hMrWF4o=S=$5d?m3Q1nBxu$4!L&XPtGCE-!j5UY<;M?mhN zbGM|sxb?n8bV_GP{KU(2wG5J$C>O|@yg5*I9**tC0pXoryz$t&vggFVz@D%7 zh^2W@J7d~M?GrsFn0ZsKCeDMQQ$G=kh%_5R_<$q@oO6b2!*S}x9C-kR7^zagTaH$= zKm#@m!nKrT+C)J@&|BD{q=b~4r$KDHh>XY{&jHBy{YcsQspx9+n+`x1&cJlu@q>E8o|K|CZbgYpo0>9U9EIH4UD zFcyZ>u1-q(d%Muj z*bzHPDr3mEQnn9C5tfc8tQB606=Mb`9wl{+C64Sh$BtldSB2h@MSM=sQ@8`m&1omB zehurHN#Y=594y%q4z9MY5hBSJK0r0(*H!J5*~};>Nx*7ceN&7ln#alj0BYdMfAo-X zu+Db^x1W6H(YgryaUKIMM)c8Hvx^IkrwjTI0*iyce!Cs2!SLdi(@dHXJtd6m*|#et z!k4>kAH7n8#SdP2Z)vG7##M!HAj*I)pEKmK1mEGoHVnw>-;}Oncc!esl5Ei1i7gPH}8(_3i4qA~A9e^yLNCwdZFUp<-HG zq5k!pFW@w15y1!lKCCXY-FjfV_1d;8^1RpU9`9S7UZ)1|^c6Ar2Yc&o^oJVJdD6dC z*EfS9;{b%K%Piop=Ie59?Up%w$VyMw_cc8&D&v41;IbQpfR;lprvt495jAdU&GN2eIl zDm3xNtkEf_xb%Y0BlY=mi0riLx7uRZ#8p~R@|*HPKUY|~LQ|Cr%^>cvQq*Vzk(w{n zuZ2RmGnMwS_%o?(x;!JAltP%(6Y8GBiPNXuPjX%s$5ZW{k8Xb;e&mBP^Y6jl-K8v*s}g~Jv20!#VMaKar}5bb>>ay z+jiqeuXlJ{QHo2~p!HvTVPLk$9xYKfWEuoruz8{IM+rRjqNZ+Z%vo**AdOr#GImdgE(9OJ*)-7HPVkg^-Ai(N= zKu{=z+Ro=?(+?b>(9|2%gxzow0i{pf)wi0@18$_tS9`( zUo_|PMXh0RtiQyjX%^Z+_h5xx^uL(#NNll;OKd;YzAZ-bu*c5r(k_t|mP6Rv`MudU zKY2f!exo0G#qZGEJU8+hJ-j+Q?2Dyc&9+{#gL9Gaz;}F9K9`(1u))v*#d9=ect$pE zK~JsWeN8D5x!UEX&D?o5F5d;1I;_*ZT;uH>w|YAup;nIsjIhzmIyErlth9xq73>Ia z0eL9dV)0oQiH9nHm<7_+JF0E6JiVSFTND-7uLF1M6wX#feG_0ise11?KBPu$4ehdFGTwWR^5KkLti!fvzC)?44et+xR z%WMe4MX^3=`?KW68mQDdeAbF&iTQ$%^>X_icXn()7K6%hKs3%4sMHsK_xCUMZ}vz3 z;9Hhsurp^<$MJBZnw=4fO+z}xSq5W}&8B8$^oQCoUy2Afi=xBU%b2ka6}C<)r+qf} zi3z&q5pJx4I~=t@m^-zfGWM&73HDU(yS$&L5o#dF`3nt7mej<<@xjPn%4G8{;225$ zK8Ip5e6t!>iueJzk+?-P!y9-)gWfOpdFsLTHX8L6vOHL2Y$d1itCGnyXd6U6=gKny z{6mw>7sVhC^HTF#lJ311u{88ul3fit$B38R6OFKSC={bqTK5^uYWf7e;0V#RQ9*IXkh<9>*1)o2=m>Dsqqf@Q>!On@$z%0s{~MWByxQI|Qc#Ol=d;lWG6 z+L{SJYzh6F!J+0)i}^!J&j%8Ot~GKVsF|F4yvOHkBOLw-?G0iW_rFdF`Ty{78v2Og zwN736_B=?krWa++aeAgHypQ7?HmQUN>~%Hh@W;-Kc?*ji47PLxxxNF-qL%U1sAX2J zIA$8j>}9_)qj5`BJE@k2cJ$(*y`>J}Wg-GXcK_{&nwDUKeG_LLcs3Uk*}M03s>ND7 zv}H>U**s26h`~MX*Xkq7M6RP&1@b;(v~2nI*uu<@mJ$nl)?XdXnbpcr~F4HB-$7sxToA}A|G10@b#wEmrR)ZK@LY>DN_}dPlq}4QOdrC`O910=^|7>2a?fr{>kgi5%3z$eD z^}bB1c^_0|8E%Nh%v%UHFu^cv>KoFeLd8zIUbVW=%2>No*;b7TGGYXDQ|z*-<;e_y zL&TAJFPnv9G9lV(RaQMx;b^}3cQ_g@eB9d~#l>Yhe#ig(AH=^?^?R28P8C0(md}rr zj!mwTQ}yILupDMojgG|0T2HFoa_RPrHRl;-A!E>5o@IKyUqq z1`#+EVu321tfn}?o{%NAr@$KZl|z8yYL`*g*K zWDHs;*kT2YUwi`q0RR8AT}?{^K@9yXOAnVo~Ct6rCCJ?uddt0MU4 zo0sf-W-O)PrH9g)NixZs-D#4yMmmP8W`peB$Iz{oXIv)3WyzegHVH_H%MmlnKQT(RYQV_ zGk=rSdP-W!*Z-BbOL9_@{uxX@oB&wk3*`qLnuLaTBD#ak7JuiplwMmIN*^(+NG1_w zTPX!RA4yx%gM`t+K(5xK$hthQF{juLkLpEcqzFkZQUMY1J2)7?MKi-eubUWGh)&TW z()%x%P?J==Lq~Qnn`l`xM6uW9nps0&3KVcV+z+9;hXusNCylF{S2~Cqu60FHeM&G^ zjevKv!)S66ne!msMMyp2sg~L^4>cB!{97yZx zww&D`h$M%^0%@iz!YMOGQR2m8!u8y8e}tVAA=mXzM@HS#n=ljjC%LTz=N5bYPkImg z`gj?%-OdMBm**FwVSjk`^FOEi(aY}v00960#9eJ`!Y~m2D~J1{jar;pK%^YuNYND{~k*_oo}{j(oXetQO@BTN444%!`QjeD>O5` zX%MP6R>8n* z;TQWwRXxvQm6r1pDqL?s)hm^9pY*nfgXp3=XS?Ig{(t2bw;lbe_svnSt!hKKqAA2L z=Hnp5d%|cMgMJ}rXXrjY^NX5f6MacMQc?)IKEbJxwb|uQf#^BqP<>Km2NOs363ohGqGtVMv-lY{`Uj$y$ZUY*PjZz_B^S_y~j`Mo8dFr85#-dS)b~ zb8;|CK}jT{N+POCX0oayx@sro@VBI_WA#K^otd~gKtXwxlG4}*LmZlV8ZS9hfxTk_ zdtm~5iYxcNAdxBPfr|J2W`DEIp14$b<+p4?In{@HC6${US|rwp+XA@-kj3mOt-ZBU zd5oNbf2uVFd8?ROTkbT5YP67Uq1M?d5-#_-_t~ki`b3=d&))Yk`%k>@pz0S#B>Uw! zysnzu<-C+@53a!Bs_{Jl00960#9i-7!$1swl`s$;yE4zZ?qDML04j*z>&*>T5QSCd zL?7P#>0K{%xQe2mTJDlxjwVfWX`4iwYqViuj0SNYwGx2vFz2+2Vq$a)XXqo~0FH9n zSX<OmwR{{A>M-d# zPb5(SyyJrSl*Ic~B#-X1vgYcAZ|JfOy?lG{kIVXR?CeYVKd`hOxcw^e*=TFGl%Sw= z_gw@lYj+42Hn{1b!qrQcr>*jL zeLUz+`o$s=1dKqF)|noJNv=vg+E96b7aS zoHPfIq_3LP7N2Q_9OS959V!V*uR3~HWZfFIr~Ci_0RR8IUEOY~KoGv}TWm;v$3vC$#Ip6AZmQ~GsCjL3aF&5(F=iZW=Q;YX7+c)T+Bp3%nsb|>}(-LeG{hnrVqVB5J;1#Xm=U7dDmenPeosf)>D5q=eB42^7 zHQ&7IeF;txPE&TDeox^E9$g)C&=m8$#C^2HnXp4i<5=PuRziJ$9=(o_1Z6m=Mr&XS8E#y>%iS)#3gX;uJYAGaV&@R5 zL);pOry#UZOJ9d%TFPO!6egk1;Xgd+XK2FnUyyrEFpKYWh*bFOzoH+Y`kWG^N3;PIATq+z>NhrS_*9UEhWOuwxt9f zp;!`uFRl~CLKxZ3$Rc4+*N5X%mEWst_?_(<$6Jt3s0YLfHtS0N4sVX{?%?ghk5#nb zML}u#mk_US_iRsPc6tvmfcLMM0TS7y$tqrf2LnvK(d_S(Ru7&%IO>)!Ihk}hdD?aE z-87Ha?S9?8)ah$G1aRtG&NpP-E@9Lq7k}nL$P7QvBNQtOIzAD`@?9B>nWmWTSX!1v zM%3&CrN3aBG2zmYPxv^`ezRMue_E)u5?nTriCU1_Dq(A1a4HAjN)Br$gQ{sh5$m3G z!Y;puP>W9zE%9YSFvyzcpKKoZ?vR*(v{CPs;Y@8dp$@K+b&&85y*cHoFYry=Yf^k^ zhI^RK!N_%CjT|HwW6&ZP_A{{4OxQlgob~Kug8Njf>GLH4;_yHT5v@j%PI;ovJdA9d1ya{VeC`10Lj|o?8F<>PxBsWmzPnnzQ?zg zX8l=aTJ3Iw=}k71?dWb4nqo8h$7Vj#>m+0__h*y4J2L+b)Xj2{8d;aN;@SzW?fMN( z8;OSC1o{siukmV&Yh7Gh;)+rqx~bWv@K{EGhO7#7M>et}YwuXHL91%ZigvXw1W#h; z{7P8)yD<}pE%(~8Z(x^Zo`&pK*i|W)CR}WOsq;&NUt0WPi8_|3WI-+II*5NoZA(k$%?PcVL4B}Q%q_>nPH&aHnsBrYhi(XLVE>{Wd2I8EgvUOtlLBlWmV zhN^hxCb9Gg574}#3xk6!2LST;Z+HU-c?N&1s}JnW8#XG)$kghgnwna*fgY3^<%;7RFhXeJM|WO$*OT%S8rXt)3{e}P3?W&z3Tc9+ znA?{R;~G*M2ouHoM1Gq$Z0an zBgVG6&MdF|bxK-c*qA(%I_xcTU_EyAJrNfl>Mjl1D*32`Vy!Mbj)-FRMSO(1e+3V{ z>cWDyFx@bMf#y~Vu^y7rQK96{SFyG#MpLBe3hs)YblFmFw053zDN}cwFJ+~fY&?|} z*GWSQiKUz2jH)i*bmI0v_Er1{Nb`vL=r-!3-%3Cg&Gg8!ub|VQhYU0b1u^tf7V%`u z^HzD-DtpefUY`4({mB>qxn?yRE}KpHDt%;J4>2Y?^$bX^L^!7=p+s=shgwN}U4J-< z0dt|-7T1m_xm-_~)u=LErXhJE{*i|q5!wAYyC!JY2<;i6eIwL0LI*~uXN2C;(q(~( zj5C#vv*^>YV5KnO)AQIWlBxL3W*QYlzt66RsnX1!2)mVeb`2^b<-c+2( zgi?WajnJME+BZU7BXnSddPeB24uz2o#xSNT=Ty*h&2Trg1GJn^2HnOR@!4?iGz!fS zd4R>o&0jojI2JHJ<)6E-snJa@!u3%W_GIB;*EH~tvbbv;)ztQtSxPAy$fALK+%-;- z-i5o%OtT>R0HA5+Qn7^pz#_|MzKI(-P2}Lfcyy-Vb=GNMn$j(tiy!DS;bT&ix4pR5 zEgbo%dM~Ozh;F+nPxe>qsH=9AQfHvlQ7~{*s=HK0JRh!O|wYz1oDg*Pih9Y7^ehFyZahCcM4cgts$H zczf*$Pcqw!jA*p&47-t=7yWP-C*%)Q_4bneD^PF06XZqS_p=lbBHaD?Z+;IX+n7;mOC>Gy@IJVlg_0ZaV(G(to6 z6h6UNh64avZ&shlA~n(H6EO6#wlXp9b({0;3b*}dust3-{sJysVYUy>u1+sm&8{l2 zlau|Aor~i?j-;2BQnr71cz$$ofhCr0a|bM?nEX*g?lZXMxmpR2fsc$lHobp(cKZ9t z+0}*GrwR}MVFj5#Hj5~qL2yP=X<6Qfw zx$Iv1Y>ROz=u!;x@loA_I=u8HKz`fUe*I?$Ra5Uic3v#$i(VUdvz^4LW4-08&!^(*VhjY!(${~XNKZ@p3XT~ z5w^znM7 zA#&11E22hmyH7Cume1ZhV_?=WQNW1q_JTR|zbpuOvuTMioL;er?;{rnj4+l}4pK&V zlMGaRE>pDh>HTe(*hah{r4;6CzE)fGde!Wqy2HlNPG;M8ztn8eayy9h?s$qJ`L_Lu zk794TW?r_dgso403)KaUt{9Adsbf>>=lp+&EuZGUlK#>!Da?ARQR{a{zgo6zVkUpB zysxkinB3xa;(MdvymB|+Ls3Hd_LO1+$phf#$Zn9rb5a&S5t)(aC`T#B2EnF{v9jal zPl=&><`~sWqID$Edy1gROWdRvbh<%6+1K&3E8XC2Hn&6s| z=*P$deQ(*7vD0;hR|^`;W>M2Lns$Z)MiB*Si(v@*Mm==8$!s#eRGp2rSE}3r1W`z8 z)PFxFjPivIV(uWP*&#|1t<-P#Cv!|=$1fcxF68QTLd*S5C-jCBO7Tyjl!@En_bG@b zNjnlzmK3{;e*pjh|Np!lU2obz?5}v5gc8J35+>S`C=w;@<6egLGF4RqOkztRB4q6} zwZDC5pYL*M0)(;g7Tx*mBX-Q4Kffr)xmuNILlhdwF?^c30?om4ogVZZHmAf6)%I!& zfprlPLJs!ypD%iCae5`E%fNpFSdnmPP~bO0X<(Hl>da-Hv5Xop?pbEW$(3Jtfz{i=+=<^j?rFZ~TXC$I!4$T>khMly2gJd= zX`DwGOp2$8LLJj_*kikfZTMuHIG)fOu zD*t+qAU>Fz)ri)~cfX}fd1sd?@1Mz(cbrTO>&oToa`5)RArOZZ-bduS$u`TMSWTCB z_8M{F6?NudLqkAKRbh$cTu@E?d$=)wMBN6Cz8l4WiHz|3)Zm z?++`AnsM_yoUM^PjlDb29mQj2-5CApOMxy<;dKo3aaS@zZcKoi27rkHAVayw&?TQ5 z)|TQS@@$%`ZeawOI3i)k$)0+`&6q%UCD5ewYF237)@W&|<04lZnuLy$F}+Sa-;G9U zH9Yfrqk`223#U|5MITm0nzlHgG#S>;Bx?070@|r!WbD zgZqtKgc3&S4xQ&~B>vJ7Lh@GoYAHcL$ewokGBX#e;t?IN#uSnaEDC|?+aZ;edeM^f zIS`ma3TbWT`A&Dx|7Q74!hg&00|?s{wcrc(yLwDNjlT7%!3R*Za(KdS30MMw+a#pF zsL?H&^mA4Qgk&i@2*oLNvcn5AB7KA>0rm#~0RR8YUEgooFc5z3f8kD=1S;yJuGMHO z9uTA}QWPd)P~Recq!cYJ41&}>?0@flcW09ngvutQ@e-WeoiFzJa!$_v*75>`sI2=A z2h-5GEjfkXCQ4^yZo_4^60n(Piaj!jn7b&3q7HeW$$xP}H@u9b=Jl;K8Zw*VphB*0 z_M`#gIZl!%QM;QMFP$fhj|hdmu=DiSxtkoRLKGB@(+NIz&~(ZPPZ{4u*~O*h6os$& zVm6=7#^fIzl#VjeM671~zHJ=H(b*~|d{Zn&F0cw!L8LUw*C5W%@P*iM4S%X$2Ui7N zIZ#nl)~J599xdnV9BDQHahl~t1%SIzYHF`fNeAixtO}|b9+xAnW+PduI^CUCA=<3W zCsz?CR+L8Yc=6>q&7bCzBV}(D8TJE4CrEy%)Iw4`0|aOS z5irvW6eo^TA3YGP_=9&}oKbS;F7# z?WlAcc%pdE02ol50Y1Y_8&jeZ5h+S7TVxz|Ey6h!v297mO`j@OaHu`~O~TYgy_hfc zf2Wr?k7g=(9Ql{62<2G{y!vVyqn7^vMM7D=EKp9K@Hyk z00960v|ZbB8c7m;<}Z5ZVM7?&V_6#8TCE)c2-(CS&;lOstYf00ftK7OZbLVg91i{a z=EVTV~lmV`RR2sBQgu=Ku! zfst{Kbn#2{1~>;950PxGK|nT|WSlaGQEh}1jnO;-k5W#lDOo@X?IO*_BEm=l2*h_! zS&&)^DpL12R5|B#^D`y?s9_RaPo^;I6KXpdvVE0IGMtTeoMbu+D6oZ~Gp-t>)9Hk$ z{e4SYG;=fqf7FcDKk+9_JY951ldKTV*^#_Ov!Tcq22AN zPcR>iRxe1SuklbZVoVWjRmO8tsHLrNXmTGluGpp{Ct4I#D_!Il`&IIG29kl(;=3}S z_5`yg%8-Nd&js9M(ZQpH<_eHF6GL@QOlk5s20H>YEQ{%A2G%U6{U)HOzOz49_Q|NGFaU zxwV{3V+7Vd>!^?2`WX@fIdwqqXE-AH>&*Lcoo1!=UUe_)wZ?g)h8#MQP!t`;9c{5W zD-}y?5SG*&oifb*MKhNW%;5`%km}O#=+S$=VkMHme))-%v>xBpXq_!IZs8rV|e18F>(-lJWz@sHE0Dt0M<2 z%`bQxzg0SniERoWf;Y^~Myt^ySkw4l{Y+JV7kE@@3H~6^+i16di}gHRs#|MTx?R<+ zwFxDeLPfifrpfo}?>m*IBaEIniX{iO{O+uIzGmz<6zbJ4E}NAev)#SW zBk2@7na#gJ_!G}o3D?q zU-L>B$>Xcn<-=otwu6z(W`?5Po1M3VgM++FB=1+`PJtQJTCinDb;#7UU_jr%a3(V!o>B&D&=`Uy;Hw$s~V%M$l`7oPn8Q zbfxI+)XbDB`ktbf*Yj`C&ZS+n^U5XlTEsSS!^{?6p|i*y9-qL()8~?T;$A+-UUias zq)KB27>#bDZ>gDK%sY>_Vp;jJx}BNMStlW*1tXeU86WcCKQQnQi`A*U_Rig>_tSM2 z4rZZ%BV59ehjIpN{wOSG=D%s-x+E$4_PUtHyIC0c<58|4toz6UaM@XEVhpe9Tf9eYv1?M@??*B z3tmNC0z_$&EhL}rEt`;tElL;MX6c!yXM_ya$^9tOQgxE$q7p` zSQ+sgCh6imEz~zQ)i{(4=2~}Xgcuf~9i-7tLURbgnATYuFNRYBImsMZd&P!L=Qlw= z8rHs;>+>^zy6Ll6U;${`U#!s$^cUJwzr-AJY19?EjMq1LPu`pj|h zAV080krI1I{=Cs4pY*a@|9I9$okq7;@5sUVadf9-Z1e&8(A}bNO;03yHm-?#r!TEX zn=MtVG@D&j>$JOYd=8Q#k`Os?4Y@6>3IO$GiR|f0LBeHRR^p{^@xK*IqHut?;syH! z{DWeG*&Wd;mZcSb{Q|%JTw28I&FO6oZTe4MwxIC_je@dr_j&$@iPmx$-m<#dSYb6a zS#)^p-pC<{>Yy8+g+~BQCG$w7R6Uldo{pwjS~U2Hg#-TDw*b5a>~HzPB0e^s>q6rU zSx1QBM1%P>g>PtYd%)X(l~Xs>E-IHy%>2-0ht&gJ3|lklnd5hAFL$tsnQa$DV{m7d zuIUhs0LCM3pq!RC4dl^3cP0L4|({`StJ4NcbR+U43SN7&lBqs zYZ2*0uaY499nCzJ5b^+Hc~}-L*Y4DNA3H5sdy{n)M01nL!n-F4!a=Q~!g;6uANte2 zP}OR1P;ItrzpC?gN9MA$>K&Zd!=ifajmq4NlglZN2!VdV5odht*tMQlpEC-u^@1_Svp_TAEKXUs;0Jn9m{%|J+E0xZX|r=&%?Y_hyWIVtEB~HzQpAe3vofx{YeH(R#0P6A$)q zFwaKeJDmxG^Z?JTT-Qiumddy#@b%rcEmvA+s@A@^Y;KtYSIJ#|66{`oBiB%O+iZ4P z*Q+RSMS~=o3i9>eo3I-{ma9nkYT{nKyBVn1h6NsJ)%V@36QjN%<6RJV-aERaU-Zk1u`OB>JK!$^`B35B7vCoN*nw7% ztU7o$YH%(y0WzG-trFAckaKce|8Kqa5z)$X*4B-d8CtY>ut6D@*N>a-Z5cL{W0T)C z23=>>@L;V;GpKdho`nT_iPv5>O-%KC8Jx@bp1Klz7owhNx(fi+FLbar2t4D6zU*%q zQEM-=80sL-12z#fA88N^PqaOHKpt;@G=V4BAWdO^JESZ6wum{olObZ!eVP^0%zvB- zGBac!`y(&>G#eBOnMWI-9V@Tr*8Zl4C+TDDPH1h%BWw?=5-6OY6gcNzO|<*{*|pnh z``&)h=p*j7IQ62Iv`1fhs8=2f=S8cvbhM(d-3*4%HG9~=H6-&^b%oppQbD00wv>CY zw;|o7PQLs@X4j4AE~UL7iDCD>o!w8g(4g{wc@_zMnu!(~-<@%N*i`zZthp@QyQ|Rx zuZ(9uXB}`J<7A7hEJzKW zcm27}7g$k%tB$}1t))wQnrkOFz-b~~XLn`9748jt_{+V&MS_E@5~#>2l)%cdzl7`c z)d@QG-rGwC#}O7Af`hzx;!4BZ58mFUaXbcYIaouv9K0w8J5a)E(kt1V_Ug@1ZtKsz z-G;mpPo=kSO>g;D1z+JBFt~ON0ukd#FQ+h5Wl2S^pp4DhinkWVODurFvdS6d)?$3$ z?33Gc0X+mKzO{JMx(rWYZy_|f8hp)u&=RPoz1QMruFjTily45-U^QBQ>V6Y#|$s^2f?euZ`z##nxn_&lFQn7NgCXx=YzM8+|m(4RjS;~9O8=A$I$w+Yf#xXc$0P5#gf;s~hAUUc@%%bga&0LJ=vy1sKP)C8jL9O7q4qk85`}O1OHYWGj)H7QwJ!`~g zrlzt7mZi=Br(6Sj)7MPcKs@lw!T$jO0RR8A9bHe`K?l5`Ad`|q=T-yvMPc0q!MCeGP+KA-KgeTJc6Wuqd!oL`)R){1LG zGR=$0?A~${R`Z)5)Zq~kr=`T*oU*vpX7_Hif4i?`Wdh8KJI|8^!%`wNP|>dxXv75* zC8W!g)F=OUD3-m& zY$XS6voy*m4Hjn=X4vNVpNNUVg63^kRyU;Dj@Q49Tx@zIbVExjA`fP0`C;`4zKQP9 zGt3ck4P-`q0J>H6=X5H%4h4DikQUEIg0)RIsxim(*Bq<yCRiNFwZifQz_ryhagE_IY!DQIk zeimd@mzJ!L=*M!hz`yZN+AGM%z?>@7CRVElK*=R$a2W(vGfL=G-z|$3XMSW+lEF$s zeoT-^mLm7%GWaHU29!3}Z0b($kv<8ZhnDFB(`*(kwBEGa5hmBoBwifp_+W#zW@FvPI7#JK=JoI$+bur@ZCdBtKgGrDZdZI|vk#RzFgOHX zkIH8!*f+-)BWpAJ1uWe5g1-(s3_O6tz}qg}_JY3-8(w(;!z*vQblVH=f%VZF`soc< z&>MQ_GI|LhPUe_V{7R9vA1w)ahzLYNH6-iRL#u_V0oQb9B=wdtVlOzTGv?bmyuRAT7=b)dZgy0sb zF~+RAO)#GYM5j?pgfv4HpkfcCN}@@R^IE8t1lo6NBOiV`Emn=LgC_t?vuJW}c3nO4 za#Q5$!;GZyW@wQxt`oCu`fM1~hZ(ITo1sMuNu8K&(`VsTjhJoDXJNg37H-97VU2vo zH|H~6FQ4(P_>9-cXMA%$}I(B#r0 zP-`?E5)05H1{0G(JBXu!5db=S!O_{-H8?mv)X&?`Kim&_KovIVjJN%Y7ab+%OW4IQW1D;|5iU5;8OacG^0RR7jVpfNc}8jL5T{ek6Yzf=VlxZ+RjApBZ)#`pzVokSjCu&b)5{m)oyo!N5n}A?qMTvIjz9 zrAsdik}P1vn*J*Khr4dOMG+OSqlAVa8$(~7S|_Qu!=~f=%%I&3zBW6iCB&vYssdEw za_Rct9&TU+f=9oLz+ReHvvu?J?$*ESA;W)w>e0UpK(dTr!R(FVafXR1sS?bfG>&sv zD0Es*g>0>TokmIrI+C+>5x`PDN~eixQtJo++ z&53;jb+{twN<93szD1MMB-M%!b-Yd$RMSe^I)4iFwlsrgIy>pBFJxBvr`B427Q6cm&k{_HF-`(^;{RCtSK{rLG zy%t0cQM=ztLncD#sZ$=#{z6k6kB>_47a6on_IU)3XPf~4J1gsV2mN^KWLbApGsSBa zcJ=7#N>`9KOLZ?1xwwNonu0vvy4-bYdZ+MR;IQVjc~(CmHyVD*S}yEBl^r34CZOA% z%%h!Bv=5DER9Xb*)03sg|1VO1`Lc|*h<`ko!WJtcNO%Nv#f5l@eu(YAkTS{yQ=|l% zOxsyO3#<60M%#C>cfqz7hLv)cu_RZrMJLrT&eA-O5#_EdyTu!U&c84%(8p0tvCcx_ zcHi?meEHAG%B7B6AArbOh|bM?bkOs0{s~1tJteD?wtEgKa|XN>IMKm?f)#cZ4bH9` z9ZAIk@rMwIeTM`IYN~g24Jz&Cw&1So#N`*>sKc_Q_RXT#_&b(Nl++$>D7K0h%3jy+ zw7ZzKqSw4>-Lp}Cr?T5u_E2Y!bXuR}n4~!gr)t;c_*A<_v}5~rt+Vs1u~dpOmKG}~ z@@tbO(=^t9p`DFaKl6&|J1jmZ;WAvopmp01o#4*@8@RxZf(DLM2)-Afei6yWiT~0c zC)!h$FMtYv!lS4l;uKu@b;t*K&v3AX1WB30GM%HfRht&HbLjNy4e8_gsa1pShvww) z4>gE~L)brf1kW5goIn&A)G|~LOIDcY>N)+) z;D05#A~NM2@?>XIL9$eYZYE1A3@o;Mjc8Q}P%}$_Df~LL#g0BA6)4wVxiT`+|axf+H zgh9n?@}-{+A~#rvpl#wwKqu>`coI%u0`{t1S%A(7F52H*}>B!0Sc;@NX$OPTePiY^HN@U@R^dpFPvh^aL2W2$) zNsC2SZ2*j)pl^RlFH~zd-un!5?xC{1gm=@zA$;G>;a0ZFL^S@>F0_-*S9AXbNPimO zH|q6>hhtAa30*=WmhEpT)(BbmjvFI($Qp(L(?XN+grcTCdn)9RRqI+{IDkGgD<-hZ zZgsxODwdXU&E9QIy?}y=jN-In(wVY zw+7N#r2`tz`65{@^5KNM@)Hf1u!^HbOjXu>L*}X_RP%JbRi{B@+xqE;`~HA@0h)Jc zJ@uSVy%(jtkK`;d4+I)bQn3zqHFP#qa3WbU6RzYR)n6~%Uz)7$+++9n}()HBNgiTzYl08#B zPbKEQyX*R`Gz+^s4k5$0k)C zBa^1sh(VFf$ir1a+2C&I6;s(-fK zPIYT1x0_dGs&|2@3L_;*)>K zFm$S2vY>_|BVeVRd$l)jpp3-VH#R{2BB*ykZf7gp+sD~swS^R8KJmbW37BSdA;whE zV;Rgmn}8i*GB&GtIh)2|DDK-V*T5Y+P7J-V&4#0R%v?|wiNltFvjX6&`U z>rI1HKBfhIxTOI6n^%UL;quz~D2}`WdygzT`OBS`WO)RDE-xf;@{0cyXZ{ZW0RR77 zUCR!FFcAC|k4oYfcp%{eyr^dbiiSi>BNF1@yEC(;=*w)+Y!lNo>~VzlDnh-dyH zO=T$JE}0N6$%N0-mU~qt`W_1-#TryD*AD8{5>qJ4a&>gD%Jk~PeJ4AKb8Z!T!m3@g zL=+h^)3o+_+&V4E1klO=`7B~?d_BvL@W4c(P90zjRA#W14_&zUQ?tfestXdIp7s=y zV~3WGNG=OAB!Zf{0rQG*z-=-^ zaf6E=C*h<9xDE~%1iRH8!}JqZXEA~&q-ckC_XN>MDsi;NStE-}k@ZElrcRNe@09s; zo{ofw)1IB-d%*iP)& zyKC>-GbwJ7;uujW843aAE1wZS<7S#Vm47xWi5GiNOW4CZVCFt*EYb7;Xt!%>0#xLp zE$VycwGQ!(x+tIAW zmzf~3ZhA0u*KIe$;KqvST!@r}O~roqk-n|tCF;%TD9(!ZAeia)#>it_Sd1z#~Ol|urrlKdpoQs&LvY$z1UZJXD!vd3Xp zwEG|ZPy-+PyG!cgOU7q^#rzgykvAQRFRho^a9P&~0+>VIHK(9OQkE~tBGN7YO}#Um z&S^sMoA(Sb$(ak)k)vQBA#<%2ghRx>6RMCtcxJpbLV@f_US#x5wtOuLWl+4rJ)b7$ ziX}G=5;Q&uQm`S5go^JTRLKptb1Lhe3WvrMfp1sVV!Nwt@au*q65!9+;M{w-v=K34 z`w0L5|Nop_%MQXI5d0O=Qxi!KUi|_OegiRju+gT6TEE|!9iY?)F&+!-bQhMkyA(#m z;LOW+>YBviy(xG))yU-X_hdr30X$sB@j7+loHRm7>OU|~(Hf1T&bNHWqBHMuZt#C( z!6h^i+^+^3aB`EPNLE|t1TOW)wQ3ABGr>lG5pWS6nAL5iv%G6gcnvnulF#z9QsQVi z_lXRb|LbK+)w9|`AlB0N07PQ!Fil6>4`uc7YRi#;L!XIKepFvRk$6(R=<);r0RR8IUE6XRM-YAX zUu>vy3M_E63${e5{D5uQrHW#!B*%G(Tw5!|N+bw2EZEWCr%!j!4Hj7W5eiK> zzJJ9$vu28gBD!B8Le(HAirey;=x5jRS#m+kRjo^FW0}Tn{Ub4d&^qu^!QD~5YEeVJ zz~ruKM>JN;QonhbmXj-e<|%U>Y4onwd=thw@|%O;c&Vy(iN~6>dwm*!ez%=i?pyy% zoac`^fTkR)zO-PQeQ%(zLXF<}c8%UyQ`B1)Wy_ou*Hg0g7-EAO-&&HY1E&7JLnG>dEIyW+9&Qaid`QWy2w?luS! z%_`;r8<^91ROFhB?Yj)8YggH|xPP@i4!FaAK>Wu^HC#^A} zesUdBFZ_D#LG>&^tNmBoj|Wln^jOE#b^{mIc6XlMpStX7i{!0;hrDRpYA^*=n;qd= zFlhr#CkiexdrN%<2WTp9|Eq0O3&OKicD2Ho5mil?gz9EA#ap@lPzGwvZ%_R7?TL4` zC$80=xT-xN{Af1K$2Y%}MMf{m{QuLt>mP$esw(MWprp+bb_6r%#?Nql!=H|;+qkQZ z^Awy%DMJ~Wqkq`dG-`~?tPwRn_ZuyXMd9QOWq_A!lx%#`RU(9kl+oEBY15NlORq|8 zA;B|ud*_wM5m#vfO|p9?mY~9+(6xyhtH~M29FSfOGgXwHn11gmsX*_rZ(}n*s;X=Y z{J2;@M@NjIPI=xh#>_|b7rowkUL^ShFi0CL{|i|Mh@lTmDPJJCb7&H#R8Jh7I?76t z!!%W+VYVzsE^uRTc%~wiKkI5Fl7!?T%aP!5S&*d!oDf49B}n&@LwIv#`K)<3&&pdG zpa<4M12I(BM#LG~FRcx7)vpomRhr`em`d>Ns1bH{%Ix6{)-QiHIjDfK4#)~^n2MR- zXgbUrtxuf1(a@0x-Z{pSdzSRu$@3~Sus6So@z9@CYyX1D@@ZwEnYn{OIwN`Tr^7iX zx>h#L(6B22%# zHtu_!>k$>)jgLc!$o>_e4hUC{`|F1OUn=e@zgZM zGeY6x`;*sP1Jtb@6^I6r=eROhWLLEHfkiF28Rn*MX@^lRHJV}(q!q1+d)3Y9)NV>X zCv(>?(X^vxerBVo77~5OPS|P(03xxNl|RU9c}scUXcMf+*@2>C7w6uphcmN8aWD&- zlrYv7zOyc#mbWvQTr7(da2%;MmtL+Byd(25O=uiGSZRCf>6BDUJm>I*A)`Bl&*(h^ zKzo;=(hpk`FBipfk(RU*K&v|?)qHbudK^8eWgrg!FZ*!#t>$69P*=$TCILQTd(^q& z`r`sfUlgMuF8=i3E%L{#Tt}Vk7}#hM4L*E0KY5AZ>vGE|+%)Cd?+%GVwRla2BV5od zJ)7k`;=r{aHL`>#-d1#F>;2SdXGHioIUm^k+2m%%$A4rq%>OQdfG+9xiNB*U@JRMg zg!T|Y1u)K_gcF#-^=yd>=95_lfJaBb4;75K8`^+M75IjR^y> zn2!Oj{pm#%8^c9s&c1)zYW;fPdt&{uk%yzoGOK)r|OueLLm__9Qf=1sLOO@)0x# za*5NT{c3u9es7Gp*>Jcl#-mb^YxEYuv(@7%$_*td+sIC|QPBH+4(m>zeUBtWcTy%D z2)EPo$wo)Ot<1N*r9RT=8yte?$AI$-V<+7v3tm=?H4xZ^ zEQPnWuy&#EX=+hNxFyR-UY^B3S^G`qCyeZ^9LCmBfUfEFl4tE0&I8m4iw6+1(JtX# zYxhxj8wFOIDOINg!6@~<$9TN*(|>t! zIc<>XAYs$vWYeUO>o z`YtIyy~2@@*(M=gpZHZ-?T7lcad{%?ywY}FS!~G}1Y!IS00960!nB@P|L7w8LtG3K z>q=dmjsuo#_&ipPEo_iHL{carn}Hk>1YJ>!x?vo?O$sfSKsS+qcTpMv+Z~`?l)wfE ze4$Z(eh$1`LF*7g&q_flSajh93jhEB|Nrb=ZExBz5dPeMVVJ6g!iSIm1EgwVkd{aZ zL0)x+ucDw+6&@g?vl<6n!#j*NHbDrQGn9ALErV=Lpnea z;hSzJG(2bMcm)=^hYmrT<=K-KD6bEiltC?WO7FTur-yOp@~hcet2DnXnF7 z7Poq{EW1$gXL%Hf=(Few8fVal zmRnH&`pWCD6z&y<7QV=`~i&_c%x37N4aRxfzKd~|JHf4zO!#`WF&xotvG ze9S6vClrl9Cw;=u0Sd2c;ZH&{YYY!afq6)DoY(`v4}{XeX$pYEz~{aj>pQY9bLz~= z%DyaWIBJ{gH7y>cmCjiD4rv3krY}iG^M>d3+r5E^A(d^npZX>FMR@dYH`8;>vxbBV zru9u6a>gS|@T(*UFfIi6gO>qB_MMK?Yj~8TJwQ|hj>2$c9_P^1S$Dg5%=bn0o4OGKKfDWO4~f(;oPlb{S?Isvd+kxj5`H2>2pigBknsGf7c zIAiOB@*3mIUTJ)Fc3VAW`sl75TVm-d!Hnjiv=oO3+PNUTrzd!f8qMTWgi^rXiBAz$ zF5mNz-4|f?GC~G`c!>N)zfGF2a9<>9 zF^4ySPe8r?4xcKxd${j1!hM{oX;(kQJ2BDK3Q~Pm3v{07olSy`wR)Ld4xSOUx`R)i zqc!1J#__hUI{Ba%?&0X)c=BFm|(^@sNCc(%xrl{3FA=Je)GQKK3iOe?2}RwK@7_>jpD5_bEOCqh zxUiK}qzO$L2~k=|F$*-huy>x8Vi($Eo}`Tyr;Wdb&J80S)2d^DZZt8nKIjI$FOlzt zFuu(;?h|{ST(1);v_UrM8K*ZtfPS?YtTdAmb1F;H>`~Zbq^Nx|XwaPQ~HJMxbId3W@vTw;@;=Lh*2=b>1-|W$fwO^Q`=c++SvnwR zz&o8B=#)mT>A?nOvz%euBErTZD*Ufgamxjm9+V51Y6`e*NB*{%xQ0EMnL8D`hIV;O zrwdYvVbZZXvduy&yr_U$31#`rkoQw14?n|DWGrF%thu58bac#GCQrbvDqG}Y_U21n z9h(@lY%v7Dwx;7ub{x)RkKs)A2+o+~Pg{XnMHziF%ILLF0Idg;6?p*`;Nr5P#l`&E zWG(I)t;M}Pti=P{v0dA7UeRbZxy;SPM1M>y=CV}_=eG|jd>1wq*#>y!cbMV5coW02n zkL|OT8fyCMFBq*C*Y?1_MrQ+%j|PGbf7b?Ug6!JFc7>8tn*Am8|8MbFO4xgoM!V6F z6tk_Rx;UM&g`Me-7h`aCx>?`Et5p=n?8Gtd@WkCm$a%W5Q~TL>_wZ-gE6cK<-P@<{ zU3+Km=y#gm-NYNd$c`UgO#b~;lZhjZG)k1L4*i_6Kc0>4(wN}63;?1)UB45r zWEOhdO7~P+<1QAu;lfh#mF}k*4O=%`v>yvlt#-q}lE;BG4CtpA2L?gM*qP2~t+HbX zJhixk1)q*g)8R@JJX$}ZZcpk4eo?oq z;Q10ce9U8gq|x8j2}m9EkdP6k&{K`s44K5_U6wU)+*f#)Y=>0d%(gr37(ASeh7ixF zhyUTBlxYun#k|xgsQwtUsG5b-0^3gk=jBAqFB-(Y2up;HNs_i|Be4vkIIUOc3jGn{ zdgEynS9HEvL%+Sh;+UDAWt@AuP`Yd<*u3&WwCNzy$}GH2K=k#E5_4*nm~0%8a}vAUX;ab^N({#nRC$mhK1C zz$gh0B6ROuVh+FhS|r77HWqPI+*NuS9pBUuh+$ui#5K`R{Hs`5^03;5|f9$TrWcRxQ9rxjN@Ux^u!(#kve#g)Gn@UtAA zKnQdMl?L(X@S)Go6Gy8xOue8-n}N>utT(QL`pwR+yTef51xO>2JHCwNcG z)btuc1K#fJtmt9jK~SGyICdnf?)PQs*B7emzqb!2&DWf2-q>9$7RBc8=0<_XB&Dz1 z(HQDru1mKZK?PJEum$qKcL(wU`IgNnnZa(bO|o03w3zI6yCmw`F$(=Tqfr;7%lh6qU?BR9%h0@nf`{lWAp-K@v5Dgprxl0I`m( z7Z}3=VW9jyMK(+WiQ)>IxgD{^&0q#7Gs8KQgIm@03gb^zPM~Q#bVW!Wwn}D#bhpMk z>HfH>nDlv+nf>@`we1bhYf2wT3#c3wAz693syUtq!u$aF5Jk%>0m-t z9Wx6eQ_WMl0R&tbT?6O}rMp9aqE@HVJSPAa69NuzzUd$d&2xQLDnBeM;Ds^Gz-qv| zUFEs@Utpt~l@rcs#lO*6?~GBb?tI9R-8kzs>V1j+g6%=-O9O~bcmr*!%4=c$2VvOB zp+h|<8e10K1mNgnO1H?i2eg!Fjt{L7@MHe>kpZ}~AYu4^x9L5nX)D9f=QG=?%w+Zk;a0`iz=Ck1h zcbzP6$;5vMHz80nQmU&#Ifr2g2s53idvJirb6&CNs%R>?=Y)+EoE650kp~_<@WzHu zp2aOCqhopq(;o$v%U;p+74gP^1fbp!s!kTb&!EO^J%w`a7{dayl*xM%@X7M^X}(7w zpU`)mrsLQg1EZKt0){ScPRt~Ic)p@^9AQIISd}kfdA>dZIGKc<(35e$a;(y|3@XK9 zQT%vZDT{Qq6W)NWiA|Y|yb8X9=z|-I_8>M=-bwv-54ZHT|F(U0TyOg)pE~t-t%iI% zqRVK>*hdk0i%=+8$q_8Ox*qT%G)8}Q6Zq(1J{&G-4KM^6xZ-BQ2fDn+WTceLg7e?? zAkWp2fN!ep1~^4^Apf@Lf$PD`lK4&X%uX!{SW`ZIH&3^!MTE!HO*7%1y>YUbPpx@c zzi9XU`f&@W$bb0t*2m~eS8ZV^2-GZ6XXpA+{#2+ zr0F;+(+|d<@t>xxZ*<4W2S*~op@<}~yc%4Nf<3iqpP+k(1}5){l_pyX<2e## zcscUGp3MBO_mFKdi+R@A(Q8)Qvgj-3R-6bLXQiyu0-+e#IS57A%0W``%o%N@@sTnh z2)AI&_XE5E34h4FmqyEFP*em)-<}%rIl5j=XqVL@x*6v9&vGcncRei}&G?c9K7u4e zV}*h`cAAkLns?RV6Bsv{YP2~gl1`n6%vLrKZYR2>k?l2+&F}z5YE`OLq*kR`GpR-A zh;RV31!WY8N}Gd-=THn{C1z$zQcCCUM0#c(Mos0R{s59@b|R=-^J=)G$q!n~1OR1# z<%L7A2>!*i4jLT=lyb;yz?A|36jqpKfBT&=jsmm?PEy4urn$sg?J6VjT5^tvRT3JwuL1V-F{^svwMn9CCS5@5%p4Y6-TXI zMNk4*u;xcK zk=0$kk>EJWmpxE+uNTrvB2!$8EDBSZwlkW$0kdKUn2nu%ov+5kW&{Y$m6Y2#fDVFh zSgZ%xAi%*c)(9GlgUSn!H0pYFJEtZ!Pi`V{e266L~{!GoeCwLPAK=CX+b0!p6Z_cGiesiEsa`pP%?>gw-U^hJ_BJX5=>w;sA4# zl+XIH(*1@UG09#9th#`UvyT@Go>pmW12Vom?Vk5yf&XfM>$N&>+f7|bb}yiLU__!M zO`l4}R{6A>yufKMp#Mv8-9>lXQd%D@T}hp8D^U-Y7`fM@mA)%g-N)MQcaqgVa@{4E z@K*Qiats;rAk#p)fzJQ=KY!%v!{KQ7k_F#qFY(#~a!_9Fcm|Q49vz>-T}d_AAOGHWQkM2yLLQ#2HdQ6@$TbFmZHY zo;^<3I?YpBfnc>VM(Y~;EK=93Bx)sDmhh?M5Tj2?TU+CDr9;Eou><`)nfr7ZJ@bZ{IMBmtpct(+zn~S_j?!D@b7W&ZdE6{C{~fm8&s;A zN9J<*L1rgg-B~Zn4E0+S@e+$f^BGQNt1C*h?V|q)-hg@V(X(VPjF+B6VW?uHDU4qD zV{${NBL+!n3@LA^FHC--6d6~QUlAl8Fx-mlD?b~}XOA2NYIL*f>W8XtKujPzYNb|; zIDyAQ?|LnWXS2o1Oyc2do#t8Rxyl#<0e9$H#jdU(+XLhpWUWsBL%ki2U}FX53Rc*< z4pur;_S@r6{btWUZoT!Jos(9*<0xZ0w5682gXuR}_7(hgMCXBm^a`Wa!pa%%9;tQ8Lw?+K9cKLIZ8a<}L1y_9J_lyqd-cH& ze)xR5nI3&v{fqy`M|cE&-QuH1K{?wM4hOK2|3AtF#_8xQiU=YXS8TJv{q*Y`kR-0y z^H;6F#{=EbbBBe(d97)k+nAS z00960yj^W?+DH)o%)i)6`k^#72PA2dqpglhAVEs01lLog-pMjxhgFP?Y@C;#`rmI} z*7jmB7@A%_@RptNcy@MYcRlk=pbBRP;Vcq$u($dX{D~lBO8TV%FAe;;CWi5ND(KN^ zl;{J=J;z;8x~zz>!1)tC&U*bM-o0ZkVbxI8qp^zQq!oSkt*^^xFT!sI`A! zwAv*{>FL|^w*-s9?@LH(30ets-b8M~9Rh0kWv2cpD}OKRiK;7rcFjC8 zT`vdT!)avZcQwhgUUwN0!;&Lnhh8ci5yKrv#IW3mC>RBM+kb&eF)5Nf`ndru%U9al zz2rD-b~0y#)d{a^8R$IWE|dxU>1QJ((m%PMpM> z{FSj)6pyyFqO>s8CVN8lQ*=)NnDoSKgz3bVJ145I|Kw%Lo~k8fZR#~&E=TW1$hgu`c~=rXg3l=jDmnL3Xm5_VKnMVS#5~yZ6 zZqVge!j22MBVHk`Is72~3X`}T!B#5btv`mvnKRdubBmkQgy=26NPz3a8GFLFXA}g0 zp>!mT13M9lD^U@9DtwkkUA<12g!G=|534&yQuszUjpY~A4ciY6$9T=@phn*L6!E*@ z(A6q0VL9Ho$Ga!k5{4k(JxGPnAh3=HPb9r(6B$y_pq4Ol=LI9%Gm_1mswbBP82f?n z0v{{zX4F|cFjY_{4k%*um1Ih*Ybei2L1-z01Imd9l3_ewC`_X;;w%=>AcZs%v_%$! zv7Etzsxd#PF=~F02`@|WvgYZL4aR+=HnTRwd5vOOmnqs!{e(i%kML859r-;CB*FA0 z&0-#XL*csE0kleDI0K26;UxRoNBfzgNpPYTHZRLkWfNSBEtG{Pb0wOe z&9{NrA~+CSpJq}eJKhYMq|5BUvI#eeG*1EK%#WaCXs%24*ediGmVNLwe3X%+$e2<8 z^X)BRNoNHFUqn=91*S@p8b2!PkuGYAvI6V}oy*UIA;xM;9R9ImP^3@soT7?Nhp@z0 zFc-YGI$Z!sq9BG9vmP3hNwWwY7&j3fM`Rd1cEoI^_5&U^V2ZDQ?+1@QGffnm%>Xc; zf$mAdoNyL`I9s&Pp15>o2{uL(AYKp0+wN36b;74{9AbA>Q$TEN04-^mZ=jX8($euT zBF>srJ03orH;m(pG+{$^Bwt#q^Q4tV4?Hh;6nsdUS<^U}%QVTrT&aNtPO7SxVc*~t zG@*fLse-1uHuTag0FRA>a*Z6%IFPXySteM^arrAU42ScHVZ?L#ohR=JHYx?&zyW}M zQ^Nt#;XB|Do4k}txSKb5*^(+bdNGwSudS|2SILsE zvPmXQqM}*7mf-`eI*`I;vtUckyN;6Wi=Bq@FflFl5M!N=)A46d`uE}u^jXwOoyf&G zSMq2yHDG3JA}~$B8g#nWTDnW6U-rDyz3EqPHmw1MnfMBq(sM5okvWjLsSJ<4`Cndk&9*7<6TEQX5&XP`+dvLu~D~n#z z#ZGhvEhuxhpLKTvL`JM^9~>b@l&0*!DZ)AdKN{+?+M$6bN3JVrXKs7*sr_pZxwYYo z9~!K`OzA^|P2^h+4Gc^`G8BL)xB>HJ{*+@xF@z~DVJR2NyXk^T$`M+eAgnliJ)_ri zF@W{Ujjh)DyHMgQY~E9Pv;cl>lQKRHyRhC29YlEPCY4co3H*#mM}G6-!Z{ZQptQrK*@rafr)ub0|j3&)eLYBd2dL5J(bWU!lh zOVsczVS~Ju%`siErWgA$fL83G8Q zMZtf5)1-!rurPmgu6upUqEf`%LzP#zoy%UQVZOQ@;(O&#+!Ba2E=?|j*^F!wpR_Yt zY{y@O&nOpn+J4kRHP_{+Kh-Nh4nK?D#DOW>mEd*$wC}QuZD<00ptv-WCV#=^nwEa> zKRX&rDGt63{;nS+|8K{4Sh>hvB#m?ivFD5$&2xk*Z&B+@JgIAAw@|sGu8kS6I@#Gd z(nX5SJZG{i=+O;i&9{j(gEm~ki)ULz(S;TW7DF0Ln*Rp?0RR8Q9qn%7M({U%iV?Dk z9c*K4pae?PguwNx@v&OgvMDX<2*>HS3qx8m`yLqu=$?SQIdvGkN zzFfYV&nZmc#hHDBFrXec3gn|%GEM@ac^$K|w13>l3TF6CJV*WojChMCf5>4m#sDKWPr8Iv)D_yRdiC1QFXOy>Q?Y}6~#pvFkkdw087;n-qali11Y zlsL-uZWRsB+G=U$2(N&0f<>5dYH z3FY1wd`Q?fWNzdPvVBWH^nIs3Yi{bDz=nRVDNawF$8Ze;J}MuMIH z)s5Pmhmt8}(41iKd<37Ra*+JQ(rLEInZ>_Xa@OJI+%B<}gZFpwW@n2VHan@WmmR_B z@gQw$h$Uh>_MM_kK1q!tc4u=!OM!CSM0*6J(cS`+$R{4S7HG35knR}fpbS+G4Kcq9 z%s1~YX|>b4*Q-@ID9i$SBmGiL^oHyu;1H8rV0vD^>ibw9cWlPVAjlr~JsU z+JZf6F5>5ioyo^HQBt!=0!NNCBM@Qn$^a)DwVHH2}lPi}l zKYNmNU*U9Hm^rxC>tx*F+H0--SmPMImNyX=<Bm9Y^bxD`BqJpza9mwI1XRpzUPc?P7Pirr_L-+)qI)ocI9V42RG%+ol6T zm%jNO839w1*)~|2Nk=X<{NOfpqs9Y04uy(DJ%4sLt`V&e9D8>LLcM#F*d}u*QrM?5 z83c|yWDqu=cX2Ry-=mxuI5ym_!-b#dD5Hd}(zE@ha5_xZ;UjzgmqF;P2yvbUP&F*` z9@n%c!wC{zyvBTC8HjCO*-FBfyAYdj){st7kV&EB%2weU_YcH#I@*&}iC3tZDVE?sH-+R{EjMR=nB&{KX>t zWqLJEN53575ZA-04F|j6>4B}Bpy;vL`2xq3LG>o^?p9D!)DM^MCZmrNmLF?16dpaI zUP~IfvAl9R*H?Dyy3y#fYxg!BM2;eoqnB8 z|J0zsL?430^;lh~pm_W+9^5FZyPVBDUjs$uFt%~m!x#UiPb*Y3)Nr_{IQs4VXgC=t zD*vKoSo~UGiG~MRhc!`vlZc{z{CRYCrh(x}+=F3kcvX8#U43OSW z0kJ=+k=JG~M@<+RvI))Z_D6 zK_iecEcUW4gZZ^kz`r3_&{{w38}Od?`h1HsxvMCJd6*&kt0)i`9Fy$pZvX%Q|Nl}7 zcMS3a7SmS1_5^4G5R}6~qqPb#2~gYAl@tu^)QqfwHpCEF5*8GJcGMXXS@Zz_00960 zv|Zg#!Y~kj_P^-k2(o2B_8^9+0TUvL1~K8SDO*h^`wA^68vb{CZ5f?_;@8{K?RxE9 zcl~X5y{kNJ**d?~w2U333CUsQD>9|AyAjwKE~2nr_jDg%8uUxrZukL0S2TMfsnqIC z&a-$XH@4|4f4!K~h!Nq2dD;aEvz4VpFe$pllw&|VrdYWfhH`_!5Gf=fNFw)?%P3O( zSy2$AAdIRv-^^`yQfc zAy(GSt)Nr>yxW*;8rRZx%mr69?Z#kpSKS00960yj@vO!axxID;rG=gu`u1P>Vi@CfKCtgCz3Sa1_#b5DtUJ@ZX(p zwoA7ZDN15P11-DL&eeX??#`&u1uY(%7sn95lKRL92YV*BdPss!HHLXGew-DSZukZ2 zSSIX{yWn<7x8W~wz@k!I?ch|5!{EKK2Mx5Vs;r_{qA)Br{%{^(y~qiWh!$(2no?r^ zd8~lN$)F0d_%FVhTvawbi+65%7MC^1GxDXRh{B@PrqxOHcWlEn@k%M*H2=vx)9h{) z%&%nN#QZ}J@=zJX?#To3U{KL08ld!Hy++}o;kG@&uj%&m)%N34y@v8(2VtGPch}JW2^Nqd?S9>PIowH7vxxZTdm` z`o0s~dMz#!U^#qPFRex1mk|P=Tv@@B(i*$aK5@yFEAgUo9%_25;BYH7y8O{aAVVn> zCjyTarA%pdl{NJ@e!|xBz2;4~8{8r1Y7jhnt^20e@#9wdk=zQfD4u0;baV70IMk`Y z`Vr=*pN`*1N#RTf&IF^Skd|vZt~^V{x^^aT&ZD^|X ze*RoRUf^Ygn7z2zGxXWs&4_^lZW2tJeco>`wsvB|Nq=wS#R1v5dJG$sz|BQbul)^Q1u~#s6i=*LZY@(CCkAk zwrXR9A5EXLTuySm$T6lpExro0 za&g%O#xG*>Q~<=LA?WCN_^YIk;fq&3ybo$LTyhd~bl08cbJH`A;H5s$dd7&@+vcFR z?SQtznpK-TsdCImFsLCbm8AHjoiZ*XB{#h})=z0A}am^IyiR|l+#^3wH z&lX3D;)ud&TpX@R5e^*p#5*1hvHwHSrr_+f-^If8pb`g1!!xbo?aLR_mOGo%ObHQ{ zDy0Bel~IF`CM+?i5gQ8WBpa-N@>QH90G>2n@ogo(3#>e5zdu`rMVRU{AYgON-{0+; z*qNoP8E|z-)b{QG(Kw17xwsd5cc9ZgkxJ-PW#PWYzH#{KV+>$NH}4E!Mya9kwQ7rl zhp9Hk#f|Xu)SE4qSaTCTtw`(gr>IG>9>#Q?ud+10Wg((?;DjnB!MU={IyLF?uS3zkx`Q}$^N@}=jMVO+<(Q;gYs zD;T3N9Uq?HSq7>sL&@~xq9)}$lYS7WvD&+P!!g($DZ@xosF;j`P7XyU;m&cCS#^gIui5!aq4@F$3oavIV9>i3T=?BuPoFqyrMml~PJjI`T^ zRc~8uyNQ+Q9~f!d*e(5l|EL*NU&N_@$^A({#yNf&FtQ3$6hzQqQ!;7m1!`ap&rd_2 zHi+JfxCqr$vx~@I(&ineN($62A1v}Pq47^fzkn>m*Y(E>_C7?IyxL|flur^wz8$K z!H-VoF@UU=VYLB3P1CV-0J)T#?CLEcCoskKllZn^^n)416g{vaK`6@P0RR8A9qn%7Fzi*LYT6Y+%YYNwtzr@z+_qB(2zLJ_MFo0y zow$K$nQm`?w$qffOQ1|pX&-G8$FUv9iQ@##5)xK4H-M{sA!p@GiC`W`KRTY_@dBo} z18ILsS{1vCs~)hX>H%|@*g_&hw#br*L-PM)adG{WfR~#1sg9xOOqdkmKH#|o$Iu|b z)E;5SM$1JsdnX{>d2q$*n|NKPPKpTQPwMTEF1oEh7Cy-AAdz*k5vZkV}_l1n@gO#=$x2Bh)x) z<@;rvtiYzkI7Iq@opqBeJVu&ZzRB!EGON&sf~o0SmKaB=e}xk1O{Ps!R(SFb#b&M5 z#v2qH*cB+O~NEy)Dk;j#gaD0afnqhJ`y^ZIIqUi!T8#p&ohYx>7=b2>M3M+ z0tyAmJF4qvL{o9-H;Ujwmyw9O6B-0a+(lMT1wg`EfC#9hKs$`~%oGvHSKOi7Ttw|( z?Eb%SwxQEt((0(CbllKK5Lrzwntk;Svn)epBJ*9C@JG5`l08D(BJP8B-UMRU)0e_P zF`z4;$Dfwe(fQ2=_X?VFGiD>kd=i3u1$aaFxr*euxf}x;)17YbxxyByE$cHSf3Mb7 z#nYApy9OwtC+neY{#=6%ID^)=4lV?9g+$v@V>5+UrI=mU%RoYP*r-CQkcin0=DLi& z_#sTnfEWep?BJu)G4@IeJ(lYNwG4DAS@`H>P5jt0L;d8b$3GNx7%r2WRS|Z1MZ;A0 z^Rap)4pxnXF=LAyRpO8{YA`i4S&MnDl{)Jf$i0Y9I-GB-Fk8P07PQa24FmZ%m}|7R z1A1X3QiWdSlpKt@vl+&8z!(9lJA8d(_T6foqfI3jQ4WtEO|?d#PM~+HAYH0ZBwGOA zqjj7>b%OxxvS8tL9_pK7 zuUt!M@2>4<-%H|>d5w#sW7t5~O3pKYM8(!(QHChbsIk_8sFp?Wgysq5i zP}CY`Kl_-1VRW*|HD#JMT7&4I!hkhOTZb!$q40Y1duHj2rM4c5fsfa- zS>0fCtipi>L%J_B*eHTK5EI-)va2MbdC7{Dv+oJ`5!^3nf3d^-_fWW;Y0UU(>rq&{ z_b<)R=chM#=V`|ep2DlW(hxT!^klu5!#;bi@hA}+^7_0UKh&$#+6ci#&47OZ00960j9pD{ z8Zi((^DlfPO%5#*sgylY2nZA<5&=~`S!`L zA2cxW(N?%=Hsnq~)UYw+uOw2#&c_0NorC`Ju%-o^`NU)4Fbr0x#(A7nVC3W+h?e)O zw7}9j#w7O`GdXhRn>W`sR6;@bA7LXCMTPY%qHqH0-ew=;!f@7Wa$}8nypxuOJ2{WE zw$rGLn-Qrq)e90Bh^|(&Mawmdrs8bK3*2#wkZBRZJ}T55fzmor=s>aH#dHUO0uN42 zBOhTJakJI-l)704cL#)k{KW5i49I_q7m$kK(6Px83JKl~#=IgUbG`qIsV{eL*t|kb zg*m-btkWYocFnVVg_GtPzV?cC-CqA54mJGz)Uz9F!#;dL7=(;YP*q&rhW)BY%TPb= zgN5EEFrU2YceS5Lw^)Y=ZSacvOP?wuVS}{Jitm32Rt6-dB%tS7S`r>WE$}-la6}|! zW)nH3dX6~i{P9Sth@LbOhb<;3wGxQXK+`I^?yOnmAIyt>5n>|JK^4*yLwWy&tIZ}^ zEtQmyZ1M;}=$cC-IkTR*?&#}aKJNL^GSx7$-A3H%%sToA*n+jAn&*R z&-Z;KcL=~vjJf891C->-%BR&-1;A{j246Q>d~@9{b(ELE=!zaH7wXN8`ynFekEF-v zl*lAHK@Ci5T}{fuXc-=zwjsnWZ!IO5@&cBo$KjJ-PDjD(kUcRc0bwu$=#ArY%F~Eo zdfNzTAiMcGI@lWRYrMMJq+z9oAM~}Z2F6&oT6%N-IEgOUaegjwQk27XacVB?w&eu1 zDbFN&ZVlXFPoq|__@yg_e0&E00RR7_U0rL!KoI;Zd26&M8f_F21&e_S77Hrcrx4n- zgxc6zh1%kO@9pemb2cKD`V>F1F?YAKbC=z@h+O~(niWseZwABQf-}3Ad?CFnO|&x- zTxFU;kLD2}&2OV;MJZt)WTL8Lk*HN7|5gVX?cpigRVH(iFD&u5$_wRhQ6d`D$o2I+ zq!u*2hUBK0R)PdQ=O$wRF!yFWnTGS>AfVlil#Gk~$N(B><`E;P+R8Q?gWUOv6Cu&K zSyHSIGaum|bvNsn<@GJCapx=&g3zLQKnVRmvZL}*@h>wtTLJy)1vJy){FQ$6{GZ z6Y{;(#8OGaf(gw9gL-&6pQTFALcqPikD(puD*cMrD<^r%fHH@q16vDlTAIq!gV9V| z+ki7VtbAX*W3IV4!OVZ%sdDVMyW)+XeYadZ-R)XkZTuKx$=Pwe;$AQ@c;6!9lrRZN z^Qf;$9=1#E=)AfKA1lhf(w{ZUfVGB?N(6n-uFK=VZ=3!|OrfNBrwiN*iE(u@`E*jV zlus)?!zK<@{h4hPf29r5#6#r%`;*&nJe%Ilrs1f69gG~8vT=F-K<;2!5T(tMEMV(q znMcbPqf%|fCx&d3nHERn5lA(;1gF!~EpI5ai{Gx-lte(UJ78xjJtm z_X7X`|No?&%?*Gc424(W>On_w2ckqtj1ZK>@#Xau;msnq%~?UjbAYv};jG9CzEgNZV)9|1r^Rsj^J9~tU|YW8v}M8g{Ml(?!KA4|vS%F5h{cY4X-XT7GD)M|L!;nsp7swR zF8}}l|NpFAX>%G$68)@yQS!ukKmvt8r$^!0KnU+@tz!eQ<=G=TI2xHS0u3O`jt&3! z&G)jdZVpMiGam-ItGbTts=O-erBi=Qy;lEg1j~;ZD5mn`1W+zL23FrLesWG5o5?1t zm`(IM3?ASE;E0q;(-dds(x&Ved_Sp$ht{NI39pxl+6MQE%}8MHf#{gf)#=4`{e5zE zeI>uOi}Qap&XSL{W(%}+pHB>esjNZ7fxAHsp=La$8jb2=@TtpKRp(BZD~S{%M5Axp z?&1#D+#ux_i&`VUD!f$g$RPjkHZtA_C%?TzY*B(!p~@x~@He3r)Lhk2r6kt<%~q_v znx(v#&$L*1_ttDQnR`Y8mey`I8a4qag)W$LquIP}CYQD5`y5WQOIl*N$037ADu=tG z`|a)foCmL8n{}$lkoki~3Rmng1e85G=;N|-Q7~dh2|_QE;02{PMN0R3;&oyGEbAQp zY5y!Ao1LX5bkS*@3z10%fnX5#!tK+1PU3W-e=hDj9yf9ke>ix(2 zds%=RoJ&PE#Pm|VZPkF*XmC-+0lv+~Ed}^MWL#z;YqEzRaPyN5llbG7h|Py_PL}&H zd!QbfXT9{F(3drgEML2tsM)OIjvczlgKrYf3}MnhrV^|9abl3nIlD$OG}9aneAWJn zMiqP?B&p4*fekJ+311HnUhoN-98h^z?qimabD+^|yVM#_FCom~_O_ScdR{N-!TAWM z34j16gXQLO+_u*m&D;D~vem-Yal8_RTb2}_32yud>&t}oRa^j;2luMAgFsMc#=TmN z*2HkX;%qNf~rZ8qgHH65~vz$YZ*NN9o zTkU48-qzX>P&i5%j+KW#Q+T;9N+#P#iTNXgxH`LuC$FTAipLD=(k)q9QaJ=!bcGdu ziB98>jzmsC4L>?Mjwr+pOD6fviaB@*9y>GdEZ3*jk1`qclLcqjcBXiZtHo>3m;Qj= z-E_e2bSk6m*tnafxV0#{+(^{hka&yR-!9GT=J{Wcn8B@1J7FerkO?2}R!VQ8B_Y<# z4sea^5x?ezk>IEq|PvQEZYx6dp`xoeuf5G-Ykm=IGe?$AWg*rO@Qx3 zGeF=7^5{4+`CBZY7p`Ks3z3i>hSC69`bjIDF&YrW#1dv888H`uZVATp< zLy@OeH4LMBCde~|$Zf*mAMfu~7#(zcP}yCGf`LHUq!QTr?eg^c0$D~H&Bj%|A-q;e z(rPs>PcItHYc;H7G?yq|Ls?$!dqpd!$ z<)>RQ&b2;9T~Q`d(wBSa!r*-Z$;{wgSo`OP@t63ZCYkjnKz4~H;%F0<$k0DF>Z-S? zpS)yld%*NOECzvImGyTFaEt9~W$&2#tCyqT#-Li43{aHJp>Fk(v>=*Y@kD;N zx1Clv6V4xzDXqi*%Zh&VL=U%aMdb%Nse8oXba((^&-V+Q zBUNY465@5;dptUqQcpF6nIv$kP3JTywURwsql=hovUR_CtEg}8CK_otCVoY1)KWLH z%Dgjfr)h68?OPFSO(Kg;bPpK9$%9^;cROXn+PBD;q{p(>JlJyHR+L2s4Tnv5ODe(k z)##vDeFq@FNB1mj#t{g~aBNcwS)!JI#XpPQF2RPGIS(h)qyCZhRut9 z5nak&18`hkVsn zW^Cl;lBWGuO>{J({(P^tJ=}>RXz!;J@Z4}2+$Ll8k&n`f27O6Q#Jy^$9Nr%Jf=UVJGjK<0Q=(+cW>ZwJjm)@gNTPjfNnq-h2ZCjQZy(@Ds>SwV3Nnv%*A&0&2KQy?vfb73_oW~lgK7lnB z%_JWTnJH3-1-TP`;H)sM-&*zB#YJnUxAUniM($X6X!&M5DPt-12);0%;LLfZkNGKN z-2K7*&Ls1KEBT2@D9dwp+oSK1d6&yKqQ%e4NY-ia9&|$>TSc{(HYnRK-tqDPA7FXk z?7lV%9a!fh@pNXN3FbE-{@uKDn^xShfnW3VR@r+>KgsTZ%Kh+!cZ@y84N3(vHT9A3+cd zM1jUmFU;os6ei!RziX0@*+chkICuH55&tZlZ6e0tzs9eE9$;SaK6uO@9b<$~@E#C> zQ-t*H`nN{CowPo@dw2dR4w=o=YJ6(cKeTHARkbz4;eOnc{QZ@I zf3gGAX_g(;a6IS#NZ1VK_huo2hQDl`UAKT3A4l+Bx2o9(A1_6W)FNp|l&MlRiXuDv)=FD@7k5=G*AUK3mgyA|$M`BkmYSTSu1 zn54JMsE+=~K^_#W+}?Z(R&*yC$n2lPfA4?-#msr-5XQ#Z%4UP=K%stp)shWSYl+_K zzNEfb%qeO*`Xe45$?rj_a!A3jV#B^F`Ro`N(arfgY(4n1HKT?#*<_qIC}_27?GG(q zh>K~L=U2KT6D|BN00030|D;_}PlGTJ{saDq>eD7@3hqHeVnQMhJ{U>Ii&+*D89~ej z2(mr--@UuimQJ$7>}70}mRxst^gF)ZnHBfBTBTwSSoH^-2EC`rGS9`2`u&rR&9?6- zg{C3_SuqE*mcsx6_(}_D4~iL#!O*0XfQ~GuMQ8=4q{J4ke$9|m08`s$A6T7P{h54y zi;50Mmpwg;bQ#5=2$NSKWyGGB*saQT4UXY3knjpb15bK4AK@{}u*~4fud`l_P=~6#;BNW6uegs@@Is^2M<%Sar4U;_ zwEDHj!mZby5c2R8>EaU`FkwA27iH6YKN3KNo z5TDnv(R0>_1jhj_DNUZg+kB5aC=x1?I9gRM`zgp{6_wefMTsJL2JGd5B|W)+sgq8P zU}J{Kn{^+s&aqNdmkQ>WHybXNUX3=VLYkNU3A;u3X}B$9GOR#WILz*K-kgHudP8!PwWGunkFV&v$uGK zht{0|uJa3AQ}q4l{=U_cfzs9PBxwyTz&k805UrjKz`|v$M1fpWgTba=yexM1CWM4H z_;q$Tt#x1a$=0sHv70dX{;!_y(v_A5W<=ooq%Q!s9NJ(*5!~=Xk~hkSIuI<yGI-+mBm5B$qq;ADq8l(fjHEoI)r{v$>W(C%h(5K7Spp7- z*ILZIkelN_wuh|ZCFY~=55}=t7o0=qk`P#{uF_Pb_YrwdP?c5RFdY_$E|+ zy9wz$+<+s}#6aa-4G^dxO;fl!NAs@`Um z!qsDtD$Qqo&p9M37|BLYxZU=Q%Fg^g#j?;F&WX>*AqF48;>D{)g~iX{?#YItj9O~R zLPC5_L6k_L$P%)Ss2APE2Gc`K)hq`RM|fo0FVMl+NNh&S_Hj-r_s!^*G=6sa#!o*+ zjz9r92oTB}yg=P$E5w6aMYa!QFJc z16C%_ag!rF^7e7Cj}PfIV&%)mRx;OMK&JTwR2D<`@_tY}HH{$&o_O6C&K z7Ysx+rx-aI=-WX{hu0m*2Lr4fM$Jj>toZfqF=D#K--WUVTQT#^5gT&QE)-(CQmatVU(+A*>=_-?ZR>ISHx}8a1RHr%gE1=sYo%%ZODD$VH7R5KJBIxQIL}g(13vi5( zo{Uj0bs9T;o2nw-C00(?ERDB~S!;$;#$g`!P_IF2gH@6tX`F9TF*0G+$UMfxyMLubLq|BK~z&Uo~cr&PQ`wm_Jl$SQl6vS$Hx2gj1nJq#onF?Mz zK>xpBkfpo(f6TkTJ3kSmG={EfNMH8`0gylu@DPXtiQ@%s5s=1{Azc{1?zbB?mr}SF zhtEBow>8~%L2k4;WvAfHYzN6=b`;=crqAOCy5}v=d`^?TX0~BKSnsyr5Z3Gj@FhmaRe-erf)#dLcnS+hRpoO zx>q4p5o&6Q_!96S&00|zJvOLuR4lkkaES*7XmBI!`E{>d2uwUxc)DGKe#P`2^ZrR@ z>_vmO{C#ZfN7%YBfmlVvOr_pPDCgsf*}>^7JOn%=p*U%{SpU40o=+DY=~k`xOukDV=8TN^n94|3z^iZ44GaeAfg%HBd+PWH{gMlxehYj^egFnD&b zS(J&p4>+E~c{p&gY>Rl1Y@_L|1~Y2hH_{@y>3M4?e}VnqTL+>a8(IQMqM?+cQBY7< zX8>ujk3xl!t@gL=S2Fk%9PZZwl->X$C8eQ6QSnr~?19zc1lGV>q;obH$D@3E6o;|` zlO$vdE&4Z42qnOi1e7(ABv6S@p{R`lvzuW#RA=l6_{upTLRXHY_sp1b?3wVA!1-bE zISz)948LS=B8<|*$p|W^3W6O$8%(M{Gf=54AsAq3wI8;R00MN*umkIJb}rI;4>)6G zXvkV|J_x<+Da0f|f=-ErYm-vMuA>~&&>yYRz6x6Ed&jB9(tn*ZMx(~o3tE+3w7iEh zqa#{Z5Ie?4^Es=ONftjMKD=pmJLGF$`m^ROj}6; z(^ygvUyISt22BVzqL0liE++v7msCO$?771qW$tzT{NA)&bZ_U6px9rfzl=q%aE8L4 z=LpYZyk|)!4!2k}z>;u8C6Jsecnb;Al49reK-ob2L`f<2 zmgVKxWCWo^BrBUEx0WPpV^ zh9y^?3`%5aRB$2f6fS=bYb>h_{K?bOcW^-FB4I38=M?_jvRJ=P;qCI-$rOr+GF4?T zvRb19v*W2o%^MP%uz3}lr=GB&W{eBPsU{+KIz!CptB9 z_XQVUM)ESc^vW6N2vvxjg&Di5os7^+pzHv$S~=6kTwEt&tHTq}Q?+om1#<&;w5n+k zFN{?E2t$w}Br$@x{;(h{3^Xz7t%S8A@8ST)pt!y_or_&J-R*5}36A3ZnXSNuA27V@ z*`L21v#G4d*e@EU!MUM76IOeB%84Z&+)M_X&;62HaPQ=?>)xQrm}F~H43cN;|83+F zuCD#2*j4){D$qqJX7rWY^}`$iXjCi?F{f1J0ynA_uylRG`uD&!@x=`mJ)p zwb_}p5w0hR>u4-;EIDVNK*_2%+?$E>>uC|X((5PVKm0YTh8oA8UMv8YcN(cQk#ov7cPT>-;Uk(9?s` z*kNi7b%e4^x+`&o6l{c)IvGa+n_4HFd!uKgi;JyY5r7*xKSlri40(1#9;F-C?ZY6tJ_Uz)dnJOBE`M z;QporAgeziL6c655kmtrVK_SypS?E-{jTPBz+c&lN)tmIpo(cwcFgH0COji^dJb$r zPEM{5j7uFGi-AU(-2=Yw9N24@65DIPdXWh5VC$mxtLP-R$+7V@##)Qq0oNjK#x{cO ziT^X@a(W_3l$%`)o}O|yKcd}dpdhB5kg~x{tiG~iVY~i|voiRSZS%fUJCOKCzJf=9 zeeFWlO!~SfP#_!C&^5+H48<-(( z4g})q`)X^a7IDlklL^QVZo5AE8LQxDtzG&%dM^J1TcPX+3`N=3WO50gKD44YA79zG zptt&CllyLYS3u~QeD1a2=b-0V{|HuqL6;3$Z+;aap*s{K=*$?A$QX&p7@5c#WuOtN zK3p@bN;fPUBSb1YIPNJ(=+tw;{L_aTW#}M<&k|bX4pCyvJa4u3 zFK-Th_7~$HcNT6>e&6StW9dx5zSsU0Jk3_ys3WPl6&Y3@C%I!jrBP9k6Snt#XcXK_ zDgcFmCGy5sF-fT)L?i%Y4wp5de$;Q0i7u`|_8Em|sBt}^K>wZQ0tS{nB2iF*M=RG+ zNWsJjMF*VJ^dZBqi<5x0Wu9}Msgz4KQ)@dBx)i)KE z*E(I_*U#sfySv{&czT=y=B26~-hB3x@|DNQvQefWLhaHJ?W+!l5@ND`sScNDd;QO- zQNcX4d0lc(H~Xo*6|1K3=%iwi|2 zsTX2ZOEw?Da~~<`tyrg(Ij->Bhq#(*a!b_FDNRy3^hwV~p3QGntCr zi&!phWh?@4{oDDiGx5_8%!^NqmIi)Qic4=|)*tf#x*aw(>pY90b#=frSB{J-c~3BM zrTf1_mPg@kJAr!*3QQ%N2Ea@s#tz%3%|*7&Si-^4pS?cc_FNq zo1JV`%Vsz{R4-r-Qp>dS-IH-8KNRP9U5XVoQc)BAQG2vw*Rhy~)4CZQys=11ab-Xc zQPSbSqGiLu9s!auxIA>mV5y-Q{3!9m6K+&_+oGXW++1cczLQJU?s~e5%gcVe+?Vt7 zLujQ0+hL25p;+EE*d;fFZzf_w>6GrDr_o6kkd0DKOB=_+GXBFX~pvL742hUhp;(auF{^)bydE_AF=|XKg%Uz zDWOZLOIXH>!zL=Doc&c_PV1Ak4)&k>7x)Z0-<11!GO}e*ztQPgQf$)ppdDA!EhvgP zZqRX;Y3;9**JZ>|*=w7qlwO=B+8s*04NC7{V7+dN$bH1b&zNc4nP=Vs&WK2|MQ#~1 z*i*;%XXJq&`2~uIg(_5xnS_A4>~BqiSXhV<7Zf0fN&MKNz|JE+NAziK~9tl z=$NQ04UX-XXsS*B^&r`u-MGBTu6l>ly9(annR+!_?3QauJ@x!DPL+#LA+)Q*J;v`L zX`pf=XUkcT#_D8k2Gs0sQCcjGiGLk=W$z%aOy5^xx%4+;xlF@R0tJ^?R1f3p+71XF z{Ubl3ZKJCAH)-Lwt)J>u{oEDgg5vG!&BBcf4*rw-Q{&6v(059AyJCO=rsst=0HVMF z#nAl}@?Q@5nAe#W_z0}`cE@IUk>FPDm34OAK&Ic}V*OfNo@c&~h^!YIte%JlPxO+# z1N?4BU3C$`*uH595SYpuU`GFlAM3wXG6mr`gfGdrKH%H>$}}!7(sdV2KZpJrmClXu zXt$yKm$V!GjmHSJ#?7=R2$F={+C|aS83Oz~XzAWWDK`H`gP~Tky7+9cNovGE#SDm# zo6Uv~7;m$+*_8lD@IvQjU8MoJMiromLY6T$4AUpE5hkG~%uhc>0cg&p$3fl-ikxG? z5qY`CvQ+^kSdoF}XzFOthU*H`CJlNQDOPjPpyY~KZgU|P>-J0=*D-=n))mn@ z9F!+VJ2VJ+>?-|Ct@z36s}Sl?=!0i4yS%qzNp0;$UE_JnUY&J)DqO%k4imSbQ`1KLaDBq`% zey5J@$>PZ3s>Kt?e4?7%#hs)BeA~ZLa0TS*PTK;ctCsV9h(v!bEU`^0tH@=Jr1*$T z9*WHAA%H5gYia%F`1yMJ&^YmM8!j;W?q{y>;^(5zE&pp{`H66I4<1WV`QY3#o3^CZ zwZN}ur11K^h4R$v?Zt>!fBI@u zCd2h}!kIBEIXdHp^&S;kJ8{RT9)o@Xe1S%+i-)B`45TwPLfHDt&Zt`_`fTG>h)@4_ zIF6ZmE|5wtzq<&DkARfp=p(uFQAsxQ$CM${gFq#ow`Qrh3ckhdvO6mKzsGc zT}3p!o;P7?ZG24WuuRIy_>bv$zxkT~)tVy6dA(1TmggeQ**GwTp_3vMz)*ow;cGZj6Wy1~5}ySvHw{xY(!fDfyBJ}3=G zMC_*;xN;+x(VbM&1_@<1v!Ny=kzys0j1vGPm`2=6dUWaN3&&>5Ri^5)M7s{=Ji+HU zwAKw^!~r##fw&@g`Il{qsU4Dm=2FS{fQBJr5D_%L#-WgYo|%dbsR?mxoee*>X@+VX zA%=W#@XwCVk);%!op|_PoI;57*D9NPv2|$UtuV?JlESXz?+vIZbPjf&K7W9*#6B#E zgTGm;c(J#uhI#lIRKxI>lI8YFewI)q(ke9YCacO)TwKcTxV2l?r;5MYIWP2wxkZPV zEal9UonyJ-C9^|~=2YX%(K2W}_#s#s8nht;Fsq-3w$zD;Juj7eU^>KBT9t{6$W|sl zNGu%skiMnpuSpo?9b2OO!}Gf}LQ1*!4R3G$v7(pjdbFvJN;THQ06DE5fQ&}^w{2eG zCfeaXBiY1lSmrSdG=r}B;Cm-`=6E697UR6#{femlZt{#kE zJN*3Z-rJte>F6hH0Wzz@fOI#6mcEv3*$=T`p3miWLTG^fu5mwYtJZ$OHkij#*2fN7 z;$AHgWn`~#e#nV269-S;Z>A26XSuNArKrkUUwlm3$@}hW>={tt44kX@)E{f8b3x#u zLdew-=OQd~uQkL9|1Osx9rzN>ijJ1?vdwEwx>58$Y? zu&@=b_7UYPit1$SCBw%>mp%x>%z`MWG~` zBhEo2{bhEH53R$JRxn%nZV1KnGd~D{1cM*fHAJB0d3=h zGx)PM`gNZX#Ih0VeuS1ntH^!M5iQ0wPlUXsB_%sErmg_x2n(kOfDS5H10`2;lk-0? z;z3ym-(8541^7ZzVI4q^7RbJZ>g*&SR*7mHpao;kTHFtTq_ zL4Xp=r`8A6LK-mKY>n~^82S&wES9G)f1SRcg!x_wah)MN6Cs|L8Ke&O7%|45A3{a= zq-LeNS2dwD7(9pJimB=OMRJxgRt?C_8{f5fgflr&M!1YEKRXq_c0?3^0&<|qm98(O z;Gu@0sjQ)*ER{A=2I@KSHUjDm0bKkj(?{d_j9SxT}WoDKZ<2v4gU3Z@yp zRIZ@|X=2IeX?Tw_v;=TFnDW)NxI?9IUg zC-;O(wq^CcqI%)vfoC#VjWgib$D6A14RU3ct*k-Kc>y-6m30L&ozOurgPFBAG zF`cgh?aLe<1b7Y>k2^3AlEOiRtx706!(a_+VDkRz?E1fsM3b&`>>>jK-(c-oe(14c zbrTMUqXq&20+3}hxLrIuqve)eCYP!^^$*YE9Y-REPZ3fm-@zT5^KX_PxmXICZSN6COnJnc-2}Nqg!q{$%?Hol3BUP3Agb~)@Ktl*4 zEeafs8&o8#Fc|Y4xWjeoCnhr~`jD_lnN)iL77+=^@9rR=iRx_H&#xg@|PB&^k} zYiedrt(ii0jf?>hHlZCU{X$VN^*=g>}zT*DVL!+ zpetAPr`~ka4ZaxyHG6l2aFhM95`|VfidD5v1SNH8e`K|eR-i^ZO1N4Lv~E|^MISYm zaXCqEgUYS_PB8i5$C&bsMC7_x^H!`^V&b7K-&K(7D~5(c@6?LfR|5m8yXPK)(GA$4 zYm8z3DMHM_&z@o%VGpFpc*~q;vLNDIhVzb7x*ovAKE%>gFtc8>LmYM#DPs&FS+pYX zAU_WqZ{HeX4_0m{QTfqbiH0*v2wkvQ2{`E10rICNmls#%wE__@q^7wXk>jacHJJp2 zojMH?%mT!NTaS#Oy}7eB6h@Nl7;91}!6A6$BB!FC;KIMziu4K2mR*ui?g=p=YA=VI zqqVs`=DEJRy+%9u6MAs|q(W>+o_sQFBw-SuSWI|;X}qHapoD2WV8^>H<2*v4p|%x7 zBwr(Vna3WMF^U+P&V#W-gA~xm>y^=mQz%9L;#y=!vLIwR!J*JRG>W_iA{7A0FaYdpfoa&*XVUh7#V< zfX4-9!IIAC(A&7KX^>w5#{6JWZ7-SA~>ab;Porw6GPR6_sv4!_2gn zE!xGsM^`4=zJhx> z$lKQdRfHzt@4BxF`;^Allm!%`r)Acm2X@oA!rYj5pA4$mp$fgZ6eG&|-(M0)w*~6I zMb$s5!zKd^-z_an(;1;Lk^yyqA@>!l6Sa!AGtOIW%2pf2!woUzdWz|!WvK2}5z+H# zY!MA(L51nnph*V8yy)zY4-rH{9|b@qoPh{KJOHp^(!dkmJ8w%}vTn3JV=mtvIRZV- zTcX%pm+cC}aeu~VTg;qfoS&iv)8nsf@pd_zI#=Y#NM6pi@QGkBd3CImjes9q8UX;M zCNEyD=ZhP>k~JD3F3leJ^8K#W*7Qg?u!abxAjC&U8>8K%t(A?R)f zD1fe~12RyIwziCI2LmhF_yB=TYkE7K`RRSKkLGH$V4LW1N~ceW(bblPoLMkMqtMx+ z#D1)4t;rT!`rk`ql5Z-d2K(luXkNIq?r5HHo$z!POQWnUbiHhIRRnbPb4WRsc^u#_ zgF7$-dkahvM3bx14ef%fFyrVP(Z&JR%n332WTo(Urrr%sfa{d}M!1>!TxE<7!(l#% zxq48-0BAY!4)+$JuiEn48!+kFyMn~A|F;qwg*=0o77{^yanPo?V40b|PC9G_xt7|5X z!LJT0y`hX{gjU$uuMdhn>@&F7Ci5|$^IlQ5)Mj5lL6&ie!<}pkE65)f(MTplPgSYc z>YU2M%J~Clf;Xuim{sud-aDM zVls0|omvk4k85KBg2|^$E4yfm$m_5U3}!E`yW@ss$0!nf^q%UVS zWLr*3tC9I#(s#sz{V{sU=v}L}Iw~GSir~_pP+XYZ`|e&`8Vn4Vhg|&m_>b~4rE6=w z`H!B}!Ps(kFy_TAA zQN(>-lvupTs|3B{mjMyTh9m;Hlaf{|C-MrW^y>9aoMGTfz!NN}aNrc2wAaRD9&TSb zbPn6A3s@E{Cb0YNhoG#%F{@%bC)C{EsDj<3W^15go4qw(JAZfe;I#DI$#3Zy$iZ2t z%w_X$uq>82zU#VmTA0CnqI=Ar?j6Bu0L+;-d13Z_ z7P=mBEUyfnU`)NHbCWn37n_f|CC-{RA;F21^sMM6r(6wU&a%r0e)h^IhqU2g_A7;PNB$(o=|9?-5VGzWP>&ziHjQBoU1D*RTrtg> zc+9N*jxw=W!h0agFdX?-AOs)5WPR<_V10|r`}!{zzV95I?T!dsEVJHZ!doI^)nKu^ zk$`wW{4?WhW%inJ1NJ4~PA~7gE0=XNWp5dK#p5@(o*n(H_eUa{zP#-vC9@GxMB?sc z2jWOMppaep*3pw%#5Mn-X^A*qHERY)k22qKpC5XD%!yeV!mS`Dif=XRmfAH zvUzAg0aiht3T=FtZ$2f|PXsMgfK^mdLvt)*q<0_ny?0LE;%rKDWkI|89@2T2a-t*d zgi#UuZeDNLUa_%BXDhW+doXv8tKADulX(8|&9i^z22E~u=b0Bz5AN=jX3FITT&*l4 zJsM%n39A)BO{dm~NO0Z(Ir#3!9fS!8R%Hc6+so@hMkDOdlou}GH* zFm|mr(&y8VaG#L@a&E%Za=oJe>xm&_-E9O(vwXF#67lKKvz(z~M-5A9mvJOE4_;eH z`8W@~1Or9B+1N56AvIJ`n6kkq$MXXapI`QJlOdD>pn3p)XT*X+7EYuS3P8@=7sJdT zkly-HxHKf~AP{ff>|9LE1~(Bkh895Nd*v-Y7jHb@xX`VkUQoI^NjeSp-@GkS%X1?= z0i7ACBGBX$$)=%FVVlrb(rW{ibM5kiy%xzFHrlWmWZ!p;kv()-qj1=u)gVlVJvnWj zI}<_WFV3=Ae{-yt5E#e2C&B8Y*@{?LgThx?i7}Ni2vs z6010~co^p=v}L%T|3dVVu5BbXJHn6muh0^pd*U-4`UmAPA4taB0-FL|oPY%U=;_XN zwe{!K^)TU4uX)ws-^NtyT`b%9K~v%MoqG(M@*bXT!%-!!Z5Fx) zHA+s-Z$Uk(La+n#6N0{A1^_>tx`HYFmnm6P`iDFVfxciS*~PyU)QdmrkWxS~(Sm}# zzN`29SYdCfs4vVfs0~igpf+C3XyTw~q*(uO4C*GQM0jXTPxI#LK@pqP8m*}S+$btR zRg)IUMF8IFDQmI?cyX4+dBbFi%}rkEwJp(QK=0?_>UFV!5u&^{5YJ!P7Kn2+pc!cA33mrK~ZrRNJ2#8!7`JyD8$v%PebKDDr z?2z~zh}E#GNv)_q()ndXF;cpl>qB5bYHZX~gnY@JwNB6vY`YBVV0;h|+KDz@pJu#Cyp)v@wrTL5s?w%J)@q20wcV%4L6Fo3X1b;?owq zS7hGOe*q5@Zr*gj`b`ihmVPXfuG6DC^mYO;)G7z@OBTTg#VYTz;OYVqM8@K|R>9(c z#XW*IV%V-sBG|(+z(4fd@a{PFBuA*9N-IbIE*z~2kV|3-i(SI=^?Kc(G^F^&d_2$2 z>VJE^4`*i2f2uFI>e|*IcIOFKigpTZ1WvzVIMPk%jXQ>X&I{=@g?|!m4XEG$nFQM= zL^R^7PneaXCh@6U@G|IXE(&{cB^5@7(ku!=999Nr{+LKFYkZ&3Crhl|qNw)naY8-p z8JlV5jrxT}^|i=hlQ%zIb|)#OZ)i#U`B?V{7MY*w3kSr#Ld0DV=CWc9)yc{vrs9Vsknei?nrL{~au-;(9crX6k; ztW)o)mhaoy7mpmrwijXYA8fL zX+*roOtn^J@(Q=n2nfT_ADRo;#cgnQUAL5oV(~82EKlNKhYM+|%)Dwheo&E@Q>4?0 z;&L)S0s`Ndo7f7JJMq}OonSNyuy7WB)Qq8{$65q|^O>zQpzCPu>0^o|8{~wt)?{`eJfj5DZYY=!V^u{*3OHUCw`V38q&hVkVg#Z4 zI;T&gp2CHRu^=bcMEfA9_C;u7@uS1R)0lGr#PJA?-ACu73fxL7kJ~m_(1$B|6tn44 z39MnyN5psEV$;u*$k6$eI%6wdqTpVJ#x$E`!3&wn;Z-&6@H82s=qw0zVLu3%4ff;# z8Z7MPCPNSxuNRDk=!lA`NkyPb1FseSo>3vyPROKNvlN&sQ7|ff<%Tno#8aD-I)p6T zb)>kyw*{A+gGS>|x3|UWZa#tQRKSPR(8w2g$wLvMZ5nMU!K;c@QD zR~Tlw#DSKhYzm{=%QrVm_c0CAToNRcexV54#-)RP;I!Kv3cN|Ly4`*d?TsL#nQ#hp zw)7B2&!Wzx`9NlQ3>h@b$Z#vB34_w4*>H8?DlbWEg9V4ccsQskfe0pJC?E&Xc**d^ zV-3N%U?RO%OgW4a!bw<4W*p0@FdAhk8h#rB?p$LBz+B9X!z6G_)aI2eb3HG%a#|=pxiTGM#Xn&+c!0WyH0t<}Db$rI z)Byt4On<1!tw69=a${gFiTmpKLZB~y=~Ekg{~Ht*fG;7gvnm6)IY5^|e+ZOa8GM%Q z55G=Sat}8jyf#oPIhEs!r2TqFMn30Jb$ud&;+bRy;iQdadw_W=R}^4!v_i%vJs&G3 zzlaU$uElxKkJ5vlM$q;pA^*FI1HCi{^-E{%>$ zF^O_wqgXrCq&6umPwgULsob~c&AUhb6Ns>20?p}^87LQjZDf|>ueZuyO9Z@GYcUs} zXoC)3%88Z+4*ypROa%;99HlmY7^<=gm!;f`uqND#Q9RNXK3jaD&G@TU^;deF1h5^S%h>h3 z`rU?Fjww_n30~z$Z*bc(SGZjDWCBg|hVP+2!sNvXLn!mU^X>wpADpuDmVf6^e0udG zX;G5U&xJ?{ujFmZnY@nP@>;D@j+xAt>$0$#W=7px6w=ufgAzz-9V0yn0}g@G&p+QU zU8&gJcJ^qscdLn{G_2Dvi@d^?VsMU#sQr?5#Rtqii9eL)hO65U6RSjoa;L z&`a4Ts7Br$z4MfG?|o1w3#dDUB1J`rAf|oKR{tF0i`)3&vPBz|{rKxbm!a^Iii;$0j z?4Guc6{t9vau7j(liJ*Q?4a*xZntUXD%vj|U+K2LScA{SO0i5%{PWX0si7a}Tmqi{ zLKtbtkw~Od5VSzu(vlTIjwZfZk9sE4#26X2_kt3G(3fr6zhoql4dyUFsp^io$F4DF zIT%9o=BK>IO#tXqHVM;Oa*-87x+6rF#+BZag*Kq&N#2@V(?O*(U@yrHbRW_7h4WoQ zKs}Luea7>B>@R&PJHkgzxrzOrU@BZ_>mX(C)&OXkL|lUG67jcZ4byqxl)AVmkZD18J!#`uX@^jywytyfOc z^cGfx+`r2-LH`h^$i;`iI-4f>Bwqf)^Nvl%V+?d(e_0?QgBoyLNgtBJ3xo#MFD(M8 zK#h@fPKZ{c><}X<16$!9mMg9u(UOpSPE+zw%TiO;SOez`7IhRTGdFsS;Zu`HlZ%#V zPBZ@By?9w;m6hiKV;n_-cup*{9k;A@{<*G631_P^PAuyj44a$imY%(IsBTu)&lgsl zN~Pf$lx~+g0ZbzK*f0I;>^TqFA|jY+&0@Mp2$M(2S~@gM(iG)^*n*S(mGalsyjcQ6 zy6rBVcP|6TrF9t5O{;q!kwfFffI2~`iv(TyCA`WMX*V#O^&P_;U!Jk*bcXDil*acA z)!58-h2~03dJ*=TV_%cY2uN5Ot#<9JwGJS;-kXYS1)nJcc)w>rRqEsd-8LqfQijU4 zmZbCvw*X3P_)#I}`p;#rdLX&sj=0zd6Rz(+Y`$ITs>$B`=NJv1lpjhpmAb2{LhEub ztm1}fpiHCykGCj--J1IP*BjGO`l-^URjN>!1*PS68jYLN07~=lHSgIt%kJM4=U=b* zyFC_+%nZX|zH2}7%&?zcxtfU*@YOT1V>vk(US5@4ym(d>`5BU;)cAh!T_%>Zbf1m2 z=uU-MX(aDmwKw+ZoOMA~|uC8w;0lu8em zY&_@BCeVR}^eeR>F~Ov@b3=PB1NV&4wG~gF%F6@fk6Nw-#&zJsZkqSo2F#nZYFu=k z3;BZUr)XE=ZcYoaRR#Iawg+V#4AI>W=$-sc>W^y4fJnqL2n+T;-=hL$R^7e?dQ8YT zn9}uSX7g9@Argn^7Y`PfCI{SD8>_y3N+U)!!at@Wa8kqYZAtF{rSvM z0N-r=)c-`9CfyBS;eOK4;V^|<;U3iS9)&Vp)e2b&R9&E`#cy~`Za=7X^gtr<9p_I6 zUk^y1HMI2wu#>dsb5;T6Q&oQkz(7K-r6o0@Wtt}VQBMHlK+@w1#H~0^W zeMDPUv2@wcs^1n67Q*4^_h&|;ZiYK|q0+Yd~GP7U` zIOuYlL*Pgla#V8X3;Qa^x{H-frgdSO6iXO$k})vxk7&q$RJj z&Jb%XSB@tewNar$i}?uVdY=dU-5Pw*{;6S(h#=Qy6A#@ z3s`4zH=j!f`Pn;X54V5fYW5ZL6Vdoe%G_twN31(&+f)<^Z4*V;Fd7h5RQ-Z&7-!m) zT^vuScptrgIyagaS@?(E9-j^inB_uOoiY=1)6aPeNrq4ATbN~+Z(`_#k5H<6X9+M=ueVennW5UvwO%yMs!#{W(}(^-9^fN(mrnlA zlc*_s_W#$)Z5O;9D=lyMoY`~N`HC2(46<`aL;E=y(s&FG|0>S?d>ytC`!>%G=_ z>oUQhe5n!YYWSld6QVpgLB+6^C>xhPA}Kv?zywL@Vi6%Ns+2Lu(o_?GDFbQVgR!uV z1Lxoyp`1f5dmZ%8f2qp<&FTJsXE>R|cA*S}9pM1f!*567e9p~ZcAISPIvlstQESr@ z^q*rlsol@TMsD`3qluN7DVjpwutvInVsHS$0^)3{s2oVZezZzMhBUxRjK3lL65pN}+b{H`h2|!lE=SP1XLs-tcN(ao!pX|8QnRu4 zV}7RG$*vA%9vx4C)wv?KC~&kUMTAJ!e1HBNYG=zhD_1NEUTWBJD5#H7C5QuCE!c4) z<;G&Qj^A=LFsoFBD=z#nUE4B>YCs?*4IO*m^Ly}Zk-5FUb;~AW@g9J}>w}>X&_c&jmr}UHe2vQzU&^$z3%#vNa6Mo# z92`nyQf)K-MPKDUr*3bTg)z0fsb7b-IV!QdshsusQ?s!;NLt0HU*<8eLH3X$`X;kz zrSpsBe`gke2AIUzKh^5%yRvO7dpq<$`h!vkzN9QQb~v^aAk`3Ok^d$$iGGxyD+zG! zBBMA5M41@=dtV{We@XQeu5RR_z}>oUJovs1LwN#teJDItz@ER;2f-HVcyV`0fuw}9 zQ|QNTcI@{IS*DJnw+xJz62uIJHz$pWU;7e#op-CTOYTV-asD%qFuNUBE`fRME8l335adg+q zE4@O(U%#)ELz|kq1)9>!%pL6j2cJPIM{IwwSDFQHl+VjX@?Q>1)l zp*TY`JBg2~b(e?08|6z2DSznldjHrCeLc-Zi)F+JshXNb7rQJbufL{`NR#PiT$3Yg zNa{xPP|Ks{fA|1->QgVg`WrS)xd5iIuI(j(mH~^xxzN$o4YU?OC7);7mrfb%-5kK(x5k93z2H(G|3gb zH5Sm=2F)q-lR9UsPxvRhao&8?Fm@AGTpl^o?3hSELG#rR?Dz$nAq}PF4iau{4G6EY zmsV_Ydo0A?)Wkx7;Si24{HHH4V4TVMx zpDnjV0IrmcyjW$ly%p&6ME3jtuT%q64l~jX@ydXdLfrW=Ot>+Qu7t8W-}*xD5qDt2 zR#A+JyGr_AxA$2|VmXu_=A!(srN;z0TTy)4Q8^?C4<|7UA-K>`u5B2@3^(3n0&}1u zcnqRj_TU}wC}C%Z2%1XJT!-=VDLI4qiX7%h?8j+(Ks8CSNCl(6KQ-XZ!UXtBlKCoa z!}SHEAI5=MbY!^G+^?100nq+;%>UQn|BGtRT`ZAhs;zEQ%G-x$pg!uj0AOjfbnizv z))|{rhA)*wOm5pMJm1$Op-Ds6%hswpZZ!1ezH zJQ&00iE0Fsq0FffYzEV%M(|NNQsW%ewjbrC>eqb;vacU=(J`Sg{>?BnhX2W-(C3!n z0pdZ#-eubp8H*tqa}ove`rExC6W8z^<(OI-{-R7hoDiLaa60bc5}l-QIy`izI7x_^ z(mafQI>-kv$WY;mK%2|>*vz;x$2m6P34FLI5YNFCp^~Kesje5(`mozI_3_g=A$WeG zoQx^`pTVHttkSO&FkPjumOT81U-k2G*=)A^@_;{K{3!Lg(GWNTS{D5&|C~JgVg_Hz zq!QGVDt?CvMFEZ-y!_NuZfA1@YgJAXz)#~}Bd#b++%+LJw=qXv9GL!k;mW#%T9u3N zI4fDp%PP9SQPqf9eOkpq!`ofo`Cr%eewI-{!Bm2i&GwtxZH04L$qJk9W~@1HSK{xw zR*-T_PsS4Co@DJN_92dFFWZL#M_rd_Xij$|@K~fQbj=UBi-QA+(w0*Rz2dzzzOV5M zb4HMhwTNE5O(R&nQW_EU0#l3EOXUaQY#9ShmI09*d2hCu_;C2PLz?SNy0D%42i!G^ zP2+)V6{l(YNyN+_TZf%ES0?YwjL&lxcyfl<>{ofvUY43V%uk#=H_iwngm~D%ffxhPDZ4&juh*xZHpfoVdLkvQ-~ZS!t7EN`@_-T-mWl}q}u;6 zsGZ;6`x$b&Ki`>s%~!C8EB8P~0?Nl|@}Ixlztz2QSV4Ym99w*Y4+kse&aH7XS?Y2M zkk2k?^NL==kIG$&=ca0KguftqvEOyq@WexHYQr@~4*Y;G6iLPs=U7SBh_&_@JMEVJyvbdWJvGZX@m>un94i%`;P z-xe7jADgZrwq;pb57dur#d&@wf`je4cDjM_>YQ{`hcDk74r&SaX0l69bPI+l^)Rmf z1pom5|IA(8Z`(Eyf9`*whoGneTA1U&2-b(e4caY0u%>Z}cEA8bmSkItB?_hzrwH=D z?~Y$0B}%fgCfJKVB;N7+c;p>_hvUf0!lD3)@|)TLyUyxB(q-`i#4Y6O^GczD?mo4% zPVD4q9od$2j31*th#C;hPhGJAVO7Mw5-9|97rMx8JOyKgqe@&0@>WS$-oY}!`!-wT z3C$%bPxTlTcWF%GBwB50SQ7D>GCDn-LdRrj$w-z>;+*c`dyygHcl2a&C_uEKKN(Eu zG-9L((_Io15O^o|*#o(Ux}qdygr)evrX?X+66iIOlY%f(l0A8N$}+(YQmUULv5;7_ z;W8uP{R3HL;VDVO2{huqAO$U=yd)22Q}RFy@}yZARYt?j2pTcmtqJ?VWHs;dJF-R z8v`d~nYV=I@YeaA$8S#pZ+Ulhc6l+I>xhlYa@V-tdVcj4tvF)YSik_oe-;b>nN1rH zXxjK$O&bqx+PJl8yYij?H9wzSUe1Fk_%7&MvNIF|mvwklcQpX9-I`^a z>|%vmCqVH(lo^l&n>Kda_)vE614OUXN&-e7N$?91(Y&7=wKs zOs>SzA?&m1+3f)KSy*mH)3dX)@nP(RlOk>-^0nu9U(kKBD5s`SpZz{rzbu#8xL1Tvh z$~2PUmv|V4240gGg7cf%?;y_vwNE%?6W%;EqQ!t__5;=35Z9?&pp^KNH1`-qwGH>-CNa!y|?lvPc3wI)YQ9F`ax z)S_B;HHbza(pP2!n5;h-XOf@XpHT~jTarWye4M`OxrW4rR3m-u86tD_JX+R>aQ1Wmi}ul9o01UV%5o?eV!iCeAQuWXc(u}P_$HU-|HNDfdMR| zp2C z(K}2CI#>YFFew4)O@1{zAk8yahVer5OVWcJe}jXYM`UyX3=07JMUH*gM zY(n<14c&{Q<75X*U&5N$=*U>cIg}d^jzFKmCS;W+F%Mk0&gm|ZXU(0=oZMFw;}zmI zR}@Nc__d2z0GzismVxKq-K!ryf4-UDT+gnAaK64k6WQX^?Beq4^~VNGeFbgK$9|VR z(D3IlEP>V2ni){Klz7Ib+G!GOcN6LG5%~!YB5mFwt*#-@@C)h2Au$1t1ONuKHjHG7 zmKfsgacXe?e`r{mCwa-Z)g*;syAAQ8tP|NzaDqMhHYt;zYOt&sD_=5jo;K^fzCOzj zKw33gc8&UUu`Ci)V6}b_VjOK_hRoLWFntbta~t$b^eDL@T=1t$E4NO zY))JK$}u7JyXGuzG@Lne^h?)N#!3yE%#9hV**E8`YJ&eCdXQ_-Ys2#^5Bz@t00960 z)Lq+Z!!Qi}6+7|a*bm(^N)et+rWy?o9prOxAnkR<~lrmNDtqLd<`VxbZeB4?{* zLV6R>Yy1#YP1$QY?v(+SAY6VtmDFl2kR1nplN|8ED|qVM@XKiUDkzi)vjPnf>8WMi zBjcpCJ+yj?-ElD4;L%SAh5w}%%VAInOaNZsRAZ7i+wQJWgF-qXjtrqMz%}9J0F1Fc zJ3!?d`UNcbmIqSQts5YUMLPg>8N&a7r#cz&$KYhr9Ff9VxaWXVkE&U#5wDHS;3gyZ zq!*=52N`Y(GTar!;Nk$@Ntv zbQ@o|r^`v5S_Dxwc#UoU;INM73K35YyZK4sMt;_jJ>VilJR75TP}$MhVbu(3h`GN? z;)MeuF#EuTH(yg<1m{7LEunA)%Z!B^@xsN&Zuep`AB*oBWFzjUunHOu1Rti>yTtgm zwyZ}#FHrFQXc=l0YKZhy>`7T3D4a2AOFbc-*7CAe5(f-%# zHTg8P6SmGOlRQN(ic_c9t$AnTuudlwNA7P(U0uEnfyk?0__H~a!IhokgUdG5wKR*m zUSEX(@5$kvw7uHyLidM%Cq@nh2t;Zf;VvLZf0 zAt}ej%VY@xIXNsFt5Q(5NXc|h#jLnKS|Y4lR%z6Hri)WxJbPqL&CT6xmbCUXinIXU zAkP4TZYKgK$h*LDGg~b0O;wN@dmD+d6k6R*r*fN-5EJJJY8a112a3e5I;adD;s6d$ zZ+QMMrn_#8sxo6^z2D=P%#Th%iLyRrJSb17o!t?(kF9PiKww^lZGE(C2WQtu_SyNv z!o6&8?)smk==6nRbUGym0Qixi_6igHx(q*`D1AX~zdUm39*V&A;>Ot`ijYVfuNf#H z3uk2-jSvNcDkqUGqF_y`%s~*RNYtND8I;=%OtXr*^M%S6{<{5z&7(Di#aQ>NaI8La zcj^^}{}(a{D4KNIQ9uurFPQ#^$(JEIDu(TMziw8lKG3OyZYUi2AoN?wnK!hh*qy;M z*OcMyV`Y7CH)>g*gl3Dr_=k1B0RRC1|3bg*46YTY;W;T}8=jMbvfU6E*6Jmo>`;=C zS!}IPo?i+yJGm$|u>`apI|!NHFKu$Fn{dIlhG8$g?<8TdPAZf7Q(}ml=a0AV- z-_nJB-4--aAe|(E(*md#$jTrb=E1jya1x3fyoZQG;sobL8Bi9%veX9J42^(XgatjV z1$@pAJpOSiN4eVyeZxLfA=*+MUG(-Zw5hBJ)RqdYB0y~-T~M}GNY2R3PXY6*YZYRw zvG4px^)p6kiE0^IiHvA#150C+wl>6S6BFd2AhaWv;VouT4p;_h!g{8g{k{sNelF{fX}-`JjKPH>)IrDyF5SWrBR@=1ECVfxANP&R&$6p$i&8D5l(`Oscph zJ}FtjkQ}Y~;Bj>1Ef?gNg49}vnPNzuIRF3v0RR8&o!f50FbsyTd5hjvOa&y^ron^k zX4r^m$4^^BZ*V(gb+jsVU4T z8J5Dg$Wes<-0%3ilmabU`=8%CEq>Gz$a!P%ug#DF7jRtg44IGiMbWGE@ujO4uUZCN zAERUd4^PeGRa322s;-D!0ZSKzfib7(m0{2eDsW@n)r)&wXlFh38n%p__w%}fLOv)E zmh)HVH3x6;E+T|(@i#EI#jV8hSW)b!V&VryQ6pgT6$FifDq+lMdzWJ6gOz*?Ew3CZ zm&MCVP2FCP+1jk7wl?cATYI^&eQFKa>mvyNxs)0aR7N)mpqjwRBCMIX+YnSnj+K!? zVC?(>TqffcI<#tgGoxt9ghJR99%RZXTsfmvHuXBXn(5-9?N2pl(IcMhX~3|4W~^Z& zgEsvSMbHNH)VaRKx6EwK_P1?bW=RuB8GNer5xR?II=RX&a+Lx5BxAVZd@ zn&YKn(yAOB;d>^=Mtm7@G}NEFwdA|z3uO~~6z}juO`XARMFwOoeqh#waIC?aoUbmBUxu|i_m66;K z&|yB`MVXyk%8N2f*{m03ruNp>(_aNr;&O7^wob<(Q;9WRAK@$t>!Z z&dT~vWu&@qdJE!|%qL3%@pocmdILxwO;|3{f)jfeu6>~(oZJn4N_%5Nr}W{xY7IeW z8MU!(gj5|5U1j&tk@7gJh;xiwq=(~Jwu%GUDwblac!aGwpI@sOc&*~dwQk5iUtsb9 z00960>|M=j95D<&?^^_VC<%m+LTK|8Jp^)J)(I^%LrAvo-?1%QKelXnr#qX4+?JL7 zd44QQ@_e!|MqY7!Y^8e!>7sN`x**Do&w$>`_)M2z%=jetBj&f7?@2`E9M@ApiL5ry zhf_LhGd+(`%yl*26GZ1R-*K1alqo2%aiQvf)00rxM#cfjC=6YunWQqoJq6*BsL3W* zzm%uvfb5s>PdC|uWOw8!8_(}hA(HK4CbXuWPSsA=&>h!M&Sklb1iaL~lNCzey}piY zuS0XPwf^JInvF5{UGI!@y!b_&2qWXs2@h%-*3eFOBA@eXE-{~iY<3>GvxdNzW5#F`UYfN)NdW|^!gi%6)ut_M8{vt{WgA}fH znXicG+*INJ!cyg1{`g)Z7=TlHi1Q`5)Y7oMl4TTWFj*H8f0(640<9|14b=wuFGWGYu)=@+sg4A(w{dn;eejF=R@_jkrQge3bq7zibGhUG-i02U~w%@R6%h4nb5x zIPTH0coQAUN1A3jpJfcE#b+5qYVujepe7v)-JG@dGo!I?DrFf|XKQZO)_Sq3=j*q> z)Bg9%lP^|PdsbooUe;*r!Ua;gh9|Ak>TMWd4(Swl8^}bjq+SIAn%Bq{urR4Ff|4y7 z-Uhr2TZomsIO%WTgb~gK3WQgI0%^igQW)pF;BJ;hPB;WNwD`ZUu=&2%-#$qP(Tzn~ zsS63S?&5bdC2sK@s#zwi2%j4C#O`{2Ned+hI!%zthB65lQKKw~&YK|a-|Qzj{2u@S z0RR6RG`$4Q(OyCtwVR62oQl?b1z#WrTVf7AU=-snF -Date: Wed Apr 28 18:27:14 2010 +0200 - - Add dummy rule for /usr/include/limits.h - compilation should never try to replace this file - -diff --git a/Makerules b/Makerules -index afceb06..fead8fc 100644 ---- a/Makerules -+++ b/Makerules -@@ -1473,6 +1473,11 @@ endif - endif - endif - -+ -+# slp: Hack to avoid trying to replace /usr/include/limits.h during build -+/usr/include/limits.h: -+ echo "slp: Hit limits.h target." -+ - # Local Variables: - # mode: makefile - # End: diff --git a/packaging/use_fullpath.patch b/packaging/use_fullpath.patch deleted file mode 100644 index 92595d8..0000000 --- a/packaging/use_fullpath.patch +++ /dev/null @@ -1,43 +0,0 @@ -diff --git a/debug/catchsegv.sh b/debug/catchsegv.sh -index 58427a3..4fbfa14 100755 ---- a/debug/catchsegv.sh -+++ b/debug/catchsegv.sh -@@ -51,7 +51,7 @@ Written by Ulrich Drepper.' - esac - fi - --segv_output=`mktemp ${TMPDIR:-/tmp}/segv_output.XXXXXX` || exit -+segv_output=`/bin/mktemp ${TMPDIR:-/tmp}/segv_output.XXXXXX` || exit - - # Redirect stderr to avoid termination message from shell. - (exec 3>&2 2>/dev/null -@@ -84,15 +84,15 @@ if test -s "$segv_output"; then - IFS=$old_IFS - ;; - esac -- sed '/Backtrace/q' "$segv_output" -- sed '1,/Backtrace/d' "$segv_output" | -+ /bin/sed '/Backtrace/q' "$segv_output" -+ /bin/sed '1,/Backtrace/d' "$segv_output" | - (while read line; do -- line=`echo $line | sed "s@^$prog\\(\\[.*\\)@\1@"` -+ line=`echo $line | /bin/sed "s@^$prog\\(\\[.*\\)@\1@"` - case "$line" in -- \[*) addr=`echo "$line" | sed 's/^\[\(.*\)\]$/\1/'` -- complete=`addr2line -f -e "$prog" $addr 2>/dev/null` -+ \[*) addr=`echo "$line" | /bin/sed 's/^\[\(.*\)\]$/\1/'` -+ complete=`/usr/bin/addr2line -f -e "$prog" $addr 2>/dev/null` - if test $? -eq 0; then -- echo "`echo "$complete"|sed 'N;s/\(.*\)\n\(.*\)/\2(\1)/;'`$line" -+ echo "`echo "$complete"| /bin/sed 'N;s/\(.*\)\n\(.*\)/\2(\1)/;'`$line" - else - echo "$line" - fi -@@ -102,6 +102,6 @@ if test -s "$segv_output"; then - esac - done) - fi --rm -f "$segv_output" -+/bin/rm -f "$segv_output" - - exit $exval diff --git a/ports/ChangeLog.arm b/ports/ChangeLog.arm index 8ea3b9e..b3c7372 100644 --- a/ports/ChangeLog.arm +++ b/ports/ChangeLog.arm @@ -1,3 +1,33 @@ +2011-06-30 Richard Sandiford + + * sysdeps/arm/elf/start.S (_start): Align the constant pool to 4 bytes. + +2011-04-01 Ryosei Takagi + + * sysdeps/unix/sysv/linux/arm/eabi/____longjmp_chk.S: + Save and restore r7, and also adjust sp. + +2011-03-21 Joseph Myers + + * sysdeps/arm/eabi/__longjmp.S, sysdeps/arm/eabi/bits/fenv.h, + sysdeps/arm/eabi/fclrexcpt.c, sysdeps/arm/eabi/fedisblxcpt.c, + sysdeps/arm/eabi/feenablxcpt.c, sysdeps/arm/eabi/fegetenv.c, + sysdeps/arm/eabi/fegetexcept.c, sysdeps/arm/eabi/fegetround.c, + sysdeps/arm/eabi/feholdexcpt.c, sysdeps/arm/eabi/fesetenv.c, + sysdeps/arm/eabi/fesetround.c, sysdeps/arm/eabi/fpu_control.h, + sysdeps/arm/eabi/fraiseexcpt.c, sysdeps/arm/eabi/fsetexcptflg.c, + sysdeps/arm/eabi/ftestexcept.c, sysdeps/arm/eabi/setjmp.S, + sysdeps/unix/sysv/linux/arm/____longjmp_chk.S, + sysdeps/unix/sysv/linux/arm/eabi/____longjmp_chk.S: Correct + license reference in last paragraph of license notice. + +2011-02-16 Manjunath Matti + + * sysdeps/arm/sysdep.h (CALL_MCOUNT): Use __gnu_mcount_nc + interface for EABI with GCC 4.4 or later. + (mcount): Define to __gnu_mcount_nc for EABI with GCC 4.4 or + later. + 2011-01-25 Joseph Myers * sysdeps/unix/sysv/linux/arm/bits/mman.h (MADV_HUGEPAGE, diff --git a/ports/ChangeLog.eglibc b/ports/ChangeLog.eglibc index 346fa1d..8ee5fab 100644 --- a/ports/ChangeLog.eglibc +++ b/ports/ChangeLog.eglibc @@ -1,3 +1,13 @@ +2011-07-06 David Kuehling + + * ports/sysdeps/powerpc/powerpc32/e500/fpu/s_fma.c, + ports/sysdeps/powerpc/powerpc32/e500/fpu/s_fmaf.c: New files. + +2011-03-21 Joseph Myers + + * sysdeps/arm/eabi/bits/predefs.h: Correct license reference in + last paragraph of license notice. + 2010-10-12 Joseph Myers * sysdeps/powerpc/powerpc32/e500/fpu/feupdateenv.c (feupdateenv): diff --git a/ports/ChangeLog.mips b/ports/ChangeLog.mips index 0c2285f..94a812c 100644 --- a/ports/ChangeLog.mips +++ b/ports/ChangeLog.mips @@ -1,3 +1,21 @@ +2011-11-17 Joseph Myers + + * sysdeps/unix/sysv/linux/mips/mips64/n64/ftw.c, + sysdeps/unix/sysv/linux/mips/mips64/n64/ftw64.c: New. + +2011-09-06 Joseph Myers + + [BZ #13109] + * sysdeps/unix/sysv/linux/mips/mips64/n64/syscalls.list (fstatfs) + (statfs): New. + * sysdeps/unix/sysv/linux/mips/mips64/n64/fstatfs64.c, + sysdeps/unix/sysv/linux/mips/mips64/n64/statfs64.c: New. + +2011-04-01 Joseph Myers + + * sysdeps/unix/sysv/linux/mips/mips64/n64/syscalls.list: Add + sync_file_range. + 2011-01-25 Joseph Myers * sysdeps/unix/sysv/linux/mips/bits/mman.h (MADV_HUGEPAGE, diff --git a/ports/sysdeps/alpha/Makefile b/ports/sysdeps/alpha/Makefile index 725ae43..ef666e8 100644 --- a/ports/sysdeps/alpha/Makefile +++ b/ports/sysdeps/alpha/Makefile @@ -35,7 +35,8 @@ endif ifeq ($(subdir),elf) # The ld.so startup code cannot use literals until it self-relocates. -CFLAGS-rtld.c = -mbuild-constants +# It uses more than 64k for the small data area. +CFLAGS-rtld.c = -mbuild-constants $(PIC-ccflag) endif # Build everything with full IEEE math support, and with dynamic rounding; @@ -46,3 +47,11 @@ sysdep-CFLAGS += -mieee -mfp-rounding-mode=d # libc.so requires about 16k for the small data area, which is well # below the 64k maximum. pic-ccflag = -fpic + +ifeq ($(subdir),csu) +ifeq (yes,$(build-shared)) +# Compatibility +sysdep_routines += libgcc-compat +shared-only-routines += libgcc-compat +endif +endif diff --git a/ports/sysdeps/alpha/Versions b/ports/sysdeps/alpha/Versions index 76b67a6..cc4949c 100644 --- a/ports/sysdeps/alpha/Versions +++ b/ports/sysdeps/alpha/Versions @@ -3,6 +3,8 @@ libc { # functions with special/multiple interfaces __divqu; __remqu; __divqs; __remqs; __divlu; __remlu; __divls; __remls; __divl; __reml; __divq; __remq; __divqu; __remqu; + # libgcc-compat + __multi3; } } libm { diff --git a/ports/sysdeps/alpha/fpu/feupdateenv.c b/ports/sysdeps/alpha/fpu/feupdateenv.c index c798070..7fc3816 100644 --- a/ports/sysdeps/alpha/fpu/feupdateenv.c +++ b/ports/sysdeps/alpha/fpu/feupdateenv.c @@ -46,4 +46,5 @@ strong_alias (__feupdateenv, __old_feupdateenv) compat_symbol (libm, __old_feupdateenv, feupdateenv, GLIBC_2_1); #endif +libm_hidden_ver (__feupdateenv, feupdateenv) versioned_symbol (libm, __feupdateenv, feupdateenv, GLIBC_2_2); diff --git a/ports/sysdeps/alpha/fpu/ftestexcept.c b/ports/sysdeps/alpha/fpu/ftestexcept.c index a4b3081..34d8113 100644 --- a/ports/sysdeps/alpha/fpu/ftestexcept.c +++ b/ports/sysdeps/alpha/fpu/ftestexcept.c @@ -30,3 +30,4 @@ fetestexcept (int excepts) return tmp & excepts & SWCR_STATUS_MASK; } +libm_hidden_def (fetestexcept) diff --git a/ports/sysdeps/alpha/libgcc-compat.c b/ports/sysdeps/alpha/libgcc-compat.c new file mode 100644 index 0000000..6c8a992 --- /dev/null +++ b/ports/sysdeps/alpha/libgcc-compat.c @@ -0,0 +1,35 @@ +/* pre-.hidden libgcc compatibility + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Guido Guenther + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include +#include + +#if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_2_6) + +typedef int int128_t __attribute__((__mode__(TI))); + +extern int128_t __multi3 (int128_t, int128_t); +int128_t INTUSE (__multi3) (int128_t x, int128_t y) +{ + return __multi3 (x, y); +} +symbol_version (INTUSE (__multi3), __multi3, GLIBC_2.0); + +#endif diff --git a/ports/sysdeps/alpha/stackinfo.h b/ports/sysdeps/alpha/stackinfo.h index 0a281bd..d9dbc35 100644 --- a/ports/sysdeps/alpha/stackinfo.h +++ b/ports/sysdeps/alpha/stackinfo.h @@ -22,7 +22,13 @@ #ifndef _STACKINFO_H #define _STACKINFO_H 1 +#include + /* On Alpha the stack grows down. */ #define _STACK_GROWS_DOWN 1 +/* Default to an executable stack. PF_X can be overridden if PT_GNU_STACK is + * present, but it is presumed absent. */ +#define DEFAULT_STACK_PERMS (PF_R|PF_W|PF_X) + #endif /* stackinfo.h */ diff --git a/ports/sysdeps/alpha/strncmp.S b/ports/sysdeps/alpha/strncmp.S deleted file mode 100644 index ff199eb..0000000 --- a/ports/sysdeps/alpha/strncmp.S +++ /dev/null @@ -1,247 +0,0 @@ -/* Copyright (C) 1996, 1997, 2003 Free Software Foundation, Inc. - Contributed by Richard Henderson (rth@tamu.edu) - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, write to the Free - Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307 USA. */ - -/* Bytewise compare two null-terminated strings of length no longer than N. */ - -#include - - .set noat - .set noreorder - - .text - -ENTRY(strncmp) -#ifdef PROF - ldgp gp, 0(pv) - lda AT, _mcount - jsr AT, (AT), _mcount - .prologue 1 -#else - .prologue 0 -#endif - - xor a0, a1, t2 # e0 : are s1 and s2 co-aligned? - beq a2, $zerolength # .. e1 : - ldq_u t0, 0(a0) # e0 : give cache time to catch up - ldq_u t1, 0(a1) # .. e1 : - and t2, 7, t2 # e0 : - and a0, 7, t4 # .. e1 : find s1 misalignment - lda t3, -1 # e0 : - addq a2, t4, a2 # .. e1 : bias count by s1 misalignment - and a2, 7, t10 # e1 : ofs of last byte in last word - srl a2, 3, a2 # .. e0 : remaining full words in count - and a1, 7, t5 # e0 : find s2 misalignment - bne t2, $unaligned # .. e1 : - - /* On entry to this basic block: - t0 == the first word of s1. - t1 == the first word of s2. - t3 == -1. */ - -$aligned: - mskqh t3, a1, t3 # e0 : mask off leading garbage - nop # .. e1 : - ornot t1, t3, t1 # e0 : - ornot t0, t3, t0 # .. e1 : - cmpbge zero, t1, t7 # e0 : bits set iff null found - beq a2, $eoc # .. e1 : check end of count - unop # e0 : - bne t7, $eos # .. e1 : - unop # e0 : - beq t10, $ant_loop # .. e1 : - - /* Aligned compare main loop. - On entry to this basic block: - t0 == an s1 word. - t1 == an s2 word not containing a null. */ - -$a_loop: - xor t0, t1, t2 # e0 : - bne t2, $wordcmp # .. e1 (zdb) - ldq_u t1, 8(a1) # e0 : - ldq_u t0, 8(a0) # .. e1 : - subq a2, 1, a2 # e0 : - addq a1, 8, a1 # .. e1 : - addq a0, 8, a0 # e0 : - beq a2, $eoc # .. e1 : - cmpbge zero, t1, t7 # e0 : - beq t7, $a_loop # .. e1 : - unop # e0 : - br $eos # .. e1 : - - /* Alternate aligned compare loop, for when there's no trailing - bytes on the count. We have to avoid reading too much data. */ -$ant_loop: - xor t0, t1, t2 # e0 : - bne t2, $wordcmp # .. e1 (zdb) - subq a2, 1, a2 # e0 : - beq a2, $zerolength # .. e1 : - ldq_u t1, 8(a1) # e0 : - ldq_u t0, 8(a0) # .. e1 : - addq a1, 8, a1 # e0 : - addq a0, 8, a0 # .. e1 : - cmpbge zero, t1, t7 # e0 : - beq t7, $ant_loop # .. e1 : - unop # e0 : - br $eos # .. e1 : - - /* The two strings are not co-aligned. Align s1 and cope. */ -$unaligned: - subq a1, t4, a1 # e0 : - unop # : - - /* If s2 misalignment is larger than s2 misalignment, we need - extra startup checks to avoid SEGV. */ - - cmplt t4, t5, t8 # .. e1 : - beq t8, $u_head # e1 : - - mskqh t3, t5, t3 # e0 : - ornot t1, t3, t3 # e0 : - cmpbge zero, t3, t7 # e1 : is there a zero? - beq t7, $u_head # e1 : - - /* We've found a zero in the first partial word of s2. Align - our current s1 and s2 words and compare what we've got. */ - - extql t1, t5, t1 # e0 : - lda t3, -1 # .. e1 : - insql t1, a0, t1 # e0 : - mskqh t3, a0, t3 # e0 : - ornot t1, t3, t1 # e0 : - ornot t0, t3, t0 # .. e1 : - cmpbge zero, t1, t7 # e0 : find that zero again - beq a2, $eoc # .. e1 : and finish up - br $eos # e1 : - - .align 3 -$u_head: - /* We know just enough now to be able to assemble the first - full word of s2. We can still find a zero at the end of it. - - On entry to this basic block: - t0 == first word of s1 - t1 == first partial word of s2. */ - - ldq_u t2, 8(a1) # e0 : load second partial s2 word - lda t3, -1 # .. e1 : create leading garbage mask - extql t1, a1, t1 # e0 : create first s2 word - mskqh t3, a0, t3 # e0 : - extqh t2, a1, t4 # e0 : - ornot t0, t3, t0 # .. e1 : kill s1 garbage - or t1, t4, t1 # e0 : s2 word now complete - ornot t1, t3, t1 # e1 : kill s2 garbage - cmpbge zero, t0, t7 # e0 : find zero in first s1 word - beq a2, $eoc # .. e1 : - lda t3, -1 # e0 : - bne t7, $eos # .. e1 : - subq a2, 1, a2 # e0 : - xor t0, t1, t4 # .. e1 : compare aligned words - mskql t3, a1, t3 # e0 : mask out s2[1] bits we have seen - bne t4, $wordcmp # .. e1 : - or t2, t3, t3 # e0 : - cmpbge zero, t3, t7 # e1 : find zero in high bits of s2[1] - bne t7, $u_final # e1 : - - /* Unaligned copy main loop. In order to avoid reading too much, - the loop is structured to detect zeros in aligned words from s2. - This has, unfortunately, effectively pulled half of a loop - iteration out into the head and half into the tail, but it does - prevent nastiness from accumulating in the very thing we want - to run as fast as possible. - - On entry to this basic block: - t2 == the unshifted low-bits from the next s2 word. */ - - .align 3 -$u_loop: - extql t2, a1, t3 # e0 : - ldq_u t2, 16(a1) # .. e1 : load next s2 high bits - ldq_u t0, 8(a0) # e0 : load next s1 word - addq a1, 8, a1 # .. e1 : - addq a0, 8, a0 # e0 : - nop # .. e1 : - extqh t2, a1, t1 # e0 : - cmpbge zero, t0, t7 # .. e1 : find zero in current s1 word - or t1, t3, t1 # e0 : - beq a2, $eoc # .. e1 : check for end of count - subq a2, 1, a2 # e0 : - bne t7, $eos # .. e1 : - xor t0, t1, t4 # e0 : compare the words - bne t4, $wordcmp # .. e1 (zdb) - cmpbge zero, t2, t4 # e0 : find zero in next low bits - beq t4, $u_loop # .. e1 (zdb) - - /* We've found a zero in the low bits of the last s2 word. Get - the next s1 word and align them. */ -$u_final: - ldq_u t0, 8(a0) # e1 : - extql t2, a1, t1 # .. e0 : - cmpbge zero, t1, t7 # e0 : - bne a2, $eos # .. e1 : - - /* We've hit end of count. Zero everything after the count - and compare whats left. */ - - .align 3 -$eoc: - mskql t0, t10, t0 - mskql t1, t10, t1 - unop - cmpbge zero, t1, t7 - - /* We've found a zero somewhere in a word we just read. - On entry to this basic block: - t0 == s1 word - t1 == s2 word - t7 == cmpbge mask containing the zero. */ - -$eos: - negq t7, t6 # e0 : create bytemask of valid data - and t6, t7, t8 # e1 : - subq t8, 1, t6 # e0 : - or t6, t8, t7 # e1 : - zapnot t0, t7, t0 # e0 : kill the garbage - zapnot t1, t7, t1 # .. e1 : - xor t0, t1, v0 # e0 : and compare - beq v0, $done # .. e1 : - - /* Here we have two differing co-aligned words in t0 & t1. - Bytewise compare them and return (t0 > t1 ? 1 : -1). */ - .align 3 -$wordcmp: - cmpbge t0, t1, t2 # e0 : comparison yields bit mask of ge - cmpbge t1, t0, t3 # .. e1 : - xor t2, t3, t0 # e0 : bits set iff t0/t1 bytes differ - negq t0, t1 # e1 : clear all but least bit - and t0, t1, t0 # e0 : - lda v0, -1 # .. e1 : - and t0, t2, t1 # e0 : was bit set in t0 > t1? - cmovne t1, 1, v0 # .. e1 (zdb) - -$done: - ret # e1 : - - .align 3 -$zerolength: - clr v0 - ret - - END(strncmp) -libc_hidden_builtin_def (strncmp) diff --git a/ports/sysdeps/arm/Makefile b/ports/sysdeps/arm/Makefile new file mode 100644 index 0000000..706d345 --- /dev/null +++ b/ports/sysdeps/arm/Makefile @@ -0,0 +1,7 @@ +ifeq ($(subdir),csu) +ifeq (yes,$(build-shared)) +# Compatibility +sysdep_routines += libgcc-compat +shared-only-routines += libgcc-compat +endif +endif diff --git a/ports/sysdeps/arm/Versions b/ports/sysdeps/arm/Versions new file mode 100644 index 0000000..eb34dd1 --- /dev/null +++ b/ports/sysdeps/arm/Versions @@ -0,0 +1,16 @@ +libc { + GLIBC_2.0 { + # Functions from libgcc. + __ashldi3; __ashrdi3; + __cmpdi2; + __divsi3; + __fixdfdi; + __floatdidf; + __floatdisf; + __modsi3; + __muldi3; + __ucmpdi2; + __udivsi3; + __umodsi3; + } +} diff --git a/ports/sysdeps/arm/dl-tls.h b/ports/sysdeps/arm/dl-tls.h index e0324a7..7be044c 100644 --- a/ports/sysdeps/arm/dl-tls.h +++ b/ports/sysdeps/arm/dl-tls.h @@ -27,3 +27,6 @@ typedef struct extern void *__tls_get_addr (tls_index *ti); + +/* Value used for dtv entries for which the allocation is delayed. */ +#define TLS_DTV_UNALLOCATED ((void *) -1l) diff --git a/ports/sysdeps/arm/eabi/__longjmp.S b/ports/sysdeps/arm/eabi/__longjmp.S index edabdad..f97489e 100644 --- a/ports/sysdeps/arm/eabi/__longjmp.S +++ b/ports/sysdeps/arm/eabi/__longjmp.S @@ -13,10 +13,10 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - You should have received a copy of the GNU General Public License - along with GCC; see the file COPYING. If not, write to the Free - Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA. */ + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ #include #define _SETJMP_H diff --git a/ports/sysdeps/arm/eabi/bits/fenv.h b/ports/sysdeps/arm/eabi/bits/fenv.h index 49e3862..816ebe7 100644 --- a/ports/sysdeps/arm/eabi/bits/fenv.h +++ b/ports/sysdeps/arm/eabi/bits/fenv.h @@ -11,10 +11,10 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - You should have received a copy of the GNU General Public License - along with GCC; see the file COPYING. If not, write to the Free - Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA. */ + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ #ifndef _FENV_H # error "Never use directly; include instead." diff --git a/ports/sysdeps/arm/eabi/bits/predefs.h b/ports/sysdeps/arm/eabi/bits/predefs.h index 5683349..3ef3c62 100644 --- a/ports/sysdeps/arm/eabi/bits/predefs.h +++ b/ports/sysdeps/arm/eabi/bits/predefs.h @@ -11,10 +11,10 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - You should have received a copy of the GNU General Public License - along with GCC; see the file COPYING. If not, write to the Free - Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA. */ + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ #ifndef _FEATURES_H # error "Never use directly; include instead." diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_cond_wait.S b/ports/sysdeps/arm/eabi/bits/wchar.h similarity index 77% rename from nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_cond_wait.S rename to ports/sysdeps/arm/eabi/bits/wchar.h index 9b57fba..9383e3a 100644 --- a/nptl/sysdeps/unix/sysv/linux/i386/i686/pthread_cond_wait.S +++ b/ports/sysdeps/arm/eabi/bits/wchar.h @@ -1,6 +1,6 @@ -/* Copyright (C) 2003 Free Software Foundation, Inc. +/* wchar_t type related definitions. + Copyright (C) 2000 Free Software Foundation, Inc. This file is part of the GNU C Library. - Contributed by Ulrich Drepper , 2003. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -17,4 +17,10 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -#include "../i486/pthread_cond_wait.S" +#ifndef _BITS_WCHAR_H +#define _BITS_WCHAR_H 1 + +#define __WCHAR_MIN ( 0 ) +#define __WCHAR_MAX ( (wchar_t) - 1 ) + +#endif /* bits/wchar.h */ diff --git a/ports/sysdeps/arm/eabi/fclrexcpt.c b/ports/sysdeps/arm/eabi/fclrexcpt.c index 0bdd6a1..fa326ec 100644 --- a/ports/sysdeps/arm/eabi/fclrexcpt.c +++ b/ports/sysdeps/arm/eabi/fclrexcpt.c @@ -12,10 +12,10 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - You should have received a copy of the GNU General Public License - along with GCC; see the file COPYING. If not, write to the Free - Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA. */ + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ #include #include diff --git a/ports/sysdeps/arm/eabi/fedisblxcpt.c b/ports/sysdeps/arm/eabi/fedisblxcpt.c index ab6fe79..31a4dcd 100644 --- a/ports/sysdeps/arm/eabi/fedisblxcpt.c +++ b/ports/sysdeps/arm/eabi/fedisblxcpt.c @@ -13,10 +13,10 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - You should have received a copy of the GNU General Public License - along with GCC; see the file COPYING. If not, write to the Free - Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA. */ + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ #include #include diff --git a/ports/sysdeps/arm/eabi/feenablxcpt.c b/ports/sysdeps/arm/eabi/feenablxcpt.c index f12b453..9c42158 100644 --- a/ports/sysdeps/arm/eabi/feenablxcpt.c +++ b/ports/sysdeps/arm/eabi/feenablxcpt.c @@ -13,10 +13,10 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - You should have received a copy of the GNU General Public License - along with GCC; see the file COPYING. If not, write to the Free - Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA. */ + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ #include #include diff --git a/ports/sysdeps/arm/eabi/fegetenv.c b/ports/sysdeps/arm/eabi/fegetenv.c index 0491381..d2afd77 100644 --- a/ports/sysdeps/arm/eabi/fegetenv.c +++ b/ports/sysdeps/arm/eabi/fegetenv.c @@ -12,10 +12,10 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - You should have received a copy of the GNU General Public License - along with GCC; see the file COPYING. If not, write to the Free - Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA. */ + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ #include #include diff --git a/ports/sysdeps/arm/eabi/fegetexcept.c b/ports/sysdeps/arm/eabi/fegetexcept.c index 8e29ff7..b0e623d 100644 --- a/ports/sysdeps/arm/eabi/fegetexcept.c +++ b/ports/sysdeps/arm/eabi/fegetexcept.c @@ -13,10 +13,10 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - You should have received a copy of the GNU General Public License - along with GCC; see the file COPYING. If not, write to the Free - Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA. */ + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ #include #include diff --git a/ports/sysdeps/arm/eabi/fegetround.c b/ports/sysdeps/arm/eabi/fegetround.c index 6a3442a..e824636 100644 --- a/ports/sysdeps/arm/eabi/fegetround.c +++ b/ports/sysdeps/arm/eabi/fegetround.c @@ -12,10 +12,10 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - You should have received a copy of the GNU General Public License - along with GCC; see the file COPYING. If not, write to the Free - Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA. */ + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ #include #include diff --git a/ports/sysdeps/arm/eabi/feholdexcpt.c b/ports/sysdeps/arm/eabi/feholdexcpt.c index 33c88e7..04bb2fa 100644 --- a/ports/sysdeps/arm/eabi/feholdexcpt.c +++ b/ports/sysdeps/arm/eabi/feholdexcpt.c @@ -12,10 +12,10 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - You should have received a copy of the GNU General Public License - along with GCC; see the file COPYING. If not, write to the Free - Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA. */ + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ #include #include diff --git a/ports/sysdeps/arm/eabi/fesetenv.c b/ports/sysdeps/arm/eabi/fesetenv.c index c47aa65..10bfa38 100644 --- a/ports/sysdeps/arm/eabi/fesetenv.c +++ b/ports/sysdeps/arm/eabi/fesetenv.c @@ -12,10 +12,10 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - You should have received a copy of the GNU General Public License - along with GCC; see the file COPYING. If not, write to the Free - Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA. */ + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ #include #include diff --git a/ports/sysdeps/arm/eabi/fesetround.c b/ports/sysdeps/arm/eabi/fesetround.c index 5523522..efa14b4 100644 --- a/ports/sysdeps/arm/eabi/fesetround.c +++ b/ports/sysdeps/arm/eabi/fesetround.c @@ -12,10 +12,10 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - You should have received a copy of the GNU General Public License - along with GCC; see the file COPYING. If not, write to the Free - Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA. */ + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ #include #include diff --git a/ports/sysdeps/arm/eabi/fpu_control.h b/ports/sysdeps/arm/eabi/fpu_control.h index 9d29994..8b0fa14 100644 --- a/ports/sysdeps/arm/eabi/fpu_control.h +++ b/ports/sysdeps/arm/eabi/fpu_control.h @@ -12,10 +12,10 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - You should have received a copy of the GNU General Public License - along with GCC; see the file COPYING. If not, write to the Free - Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA. */ + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ #ifndef _FPU_CONTROL_H #define _FPU_CONTROL_H diff --git a/ports/sysdeps/arm/eabi/fraiseexcpt.c b/ports/sysdeps/arm/eabi/fraiseexcpt.c index 78441ec..3a41b22 100644 --- a/ports/sysdeps/arm/eabi/fraiseexcpt.c +++ b/ports/sysdeps/arm/eabi/fraiseexcpt.c @@ -12,10 +12,10 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - You should have received a copy of the GNU General Public License - along with GCC; see the file COPYING. If not, write to the Free - Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA. */ + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ #include #include diff --git a/ports/sysdeps/arm/eabi/fsetexcptflg.c b/ports/sysdeps/arm/eabi/fsetexcptflg.c index 28966bb..a844854 100644 --- a/ports/sysdeps/arm/eabi/fsetexcptflg.c +++ b/ports/sysdeps/arm/eabi/fsetexcptflg.c @@ -12,10 +12,10 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - You should have received a copy of the GNU General Public License - along with GCC; see the file COPYING. If not, write to the Free - Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA. */ + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ #include #include diff --git a/ports/sysdeps/arm/eabi/ftestexcept.c b/ports/sysdeps/arm/eabi/ftestexcept.c index 61b81cb..144eef9 100644 --- a/ports/sysdeps/arm/eabi/ftestexcept.c +++ b/ports/sysdeps/arm/eabi/ftestexcept.c @@ -12,10 +12,10 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - You should have received a copy of the GNU General Public License - along with GCC; see the file COPYING. If not, write to the Free - Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA. */ + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ #include #include diff --git a/ports/sysdeps/arm/eabi/setjmp.S b/ports/sysdeps/arm/eabi/setjmp.S index 92f83af..0bc1a15 100644 --- a/ports/sysdeps/arm/eabi/setjmp.S +++ b/ports/sysdeps/arm/eabi/setjmp.S @@ -12,10 +12,10 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - You should have received a copy of the GNU General Public License - along with GCC; see the file COPYING. If not, write to the Free - Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA. */ + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ #include #define _SETJMP_H diff --git a/ports/sysdeps/arm/elf/start.S b/ports/sysdeps/arm/elf/start.S index c69f19d..551b467 100644 --- a/ports/sysdeps/arm/elf/start.S +++ b/ports/sysdeps/arm/elf/start.S @@ -134,6 +134,7 @@ _start: bl abort #ifdef SHARED + .align 2 .L_GOT: .word _GLOBAL_OFFSET_TABLE_ - .L_GOT .word __libc_csu_fini(GOT) diff --git a/ports/sysdeps/arm/libgcc-compat.c b/ports/sysdeps/arm/libgcc-compat.c new file mode 100644 index 0000000..1157ecd --- /dev/null +++ b/ports/sysdeps/arm/libgcc-compat.c @@ -0,0 +1,111 @@ +/* pre-.hidden libgcc compatibility + Copyright (C) 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by GOTO Masanori + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + + +#include +#include + +#if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_2_6) + +extern int64_t __ashldi3 (int64_t, int32_t); +int64_t __ashldi3_internal (int64_t u, int32_t b) +{ + return __ashldi3 (u, b); +} +symbol_version (__ashldi3_internal, __ashldi3, GLIBC_2.0); + +extern int64_t __ashrdi3 (int64_t, int32_t); +int32_t __ashrdi3_internal (int64_t u, int32_t b) +{ + return __ashrdi3 (u, b); +} +symbol_version (__ashrdi3_internal, __ashrdi3, GLIBC_2.0); + +extern int32_t __cmpdi2 (int64_t, int64_t); +int32_t __cmpdi2_internal (int64_t u, int64_t v) +{ + return __cmpdi2 (u, v); +} +symbol_version (__cmpdi2_internal, __cmpdi2, GLIBC_2.0); + +extern int32_t __divsi3 (int32_t, int32_t); +int32_t __divsi3_internal (int32_t u, int32_t v) +{ + return __divsi3 (u, v); +} +symbol_version (__divsi3_internal, __divsi3, GLIBC_2.0); + +extern int64_t __fixdfdi (double); +int64_t __fixdfdi_internal (double d) +{ + return __fixdfdi (d); +} +symbol_version (__fixdfdi_internal, __fixdfdi, GLIBC_2.0); + +extern double __floatdidf (int64_t); +double __floatdidf_internal (int64_t u) +{ + return __floatdidf (u); +} +symbol_version (__floatdidf_internal, __floatdidf, GLIBC_2.0); + +extern float __floatdisf (int64_t); +float __floatdisf_internal (int64_t u) +{ + return __floatdisf (u); +} +symbol_version (__floatdisf_internal, __floatdisf, GLIBC_2.0); + +extern int32_t __modsi3 (int32_t, int32_t); +int32_t __modsi3_internal (int32_t u, int32_t v) +{ + return __modsi3 (u, v); +} +symbol_version (__modsi3_internal, __modsi3, GLIBC_2.0); + +extern int64_t __muldi3 (int64_t, int64_t); +int64_t __muldi3_internal (int64_t u, int64_t v) +{ + return __muldi3 (u, v); +} +symbol_version (__muldi3_internal, __muldi3, GLIBC_2.0); + +extern int32_t __ucmpdi2 (int64_t, int64_t); +int32_t __ucmpdi2_internal (int64_t u, int64_t v) +{ + return __ucmpdi2 (u, v); +} +symbol_version (__ucmpdi2_internal, __ucmpdi2, GLIBC_2.0); + +extern int32_t __udivsi3 (int32_t, int32_t); +int32_t __udivsi3_internal (int32_t u, int32_t v) +{ + return __udivsi3 (u, v); +} +symbol_version (__udivsi3_internal, __udivsi3, GLIBC_2.0); + +extern int32_t __umodsi3 (int32_t, int32_t); +int32_t __umodsi3_internal (int32_t u, int32_t v) +{ + return __umodsi3 (u, v); +} +symbol_version (__umodsi3_internal, __umodsi3, GLIBC_2.0); + +#endif diff --git a/ports/sysdeps/arm/preconfigure b/ports/sysdeps/arm/preconfigure index 4b974cb..e7693d4 100644 --- a/ports/sysdeps/arm/preconfigure +++ b/ports/sysdeps/arm/preconfigure @@ -2,7 +2,7 @@ case "$machine" in arm*) base_machine=arm case $config_os in - linux-gnueabi) + linux-gnueabi*) machine=arm/eabi/$machine if [ "${CFLAGS+set}" != "set" ]; then CFLAGS="-g -O2" diff --git a/ports/sysdeps/arm/shlib-versions b/ports/sysdeps/arm/shlib-versions index ed6603f..036f17f 100644 --- a/ports/sysdeps/arm/shlib-versions +++ b/ports/sysdeps/arm/shlib-versions @@ -1,4 +1,5 @@ -arm.*-.*-linux-gnueabi DEFAULT GLIBC_2.4 +arm.*-.*-linux-gnueabi.* DEFAULT GLIBC_2.4 -arm.*-.*-linux-gnueabi ld=ld-linux.so.3 +arm.*-.*-linux-gnueabihf ld=ld-linux-armhf.so.3 +arm.*-.*-linux-gnueabi.* ld=ld-linux.so.3 arm.*-.*-linux.* ld=ld-linux.so.2 diff --git a/ports/sysdeps/arm/sysdep.h b/ports/sysdeps/arm/sysdep.h index 9ffd7df..5c01ef0 100644 --- a/ports/sysdeps/arm/sysdep.h +++ b/ports/sysdeps/arm/sysdep.h @@ -18,6 +18,7 @@ 02111-1307 USA. */ #include +#include #if (!defined (__ARM_ARCH_2__) && !defined (__ARM_ARCH_3__) \ && !defined (__ARM_ARCH_3M__) && !defined (__ARM_ARCH_4__)) @@ -92,6 +93,16 @@ /* If compiled for profiling, call `mcount' at the start of each function. */ #ifdef PROF +/* Call __gnu_mcount_nc if GCC >= 4.4 and abi = EABI. */ +#if __GNUC_PREREQ(4,4) && defined(__ARM_EABI__) +#define CALL_MCOUNT \ + str lr,[sp, #-4]!; \ + cfi_adjust_cfa_offset (4); \ + cfi_rel_offset (lr, 0); \ + bl PLTJMP(mcount); \ + cfi_adjust_cfa_offset (-4); \ + cfi_restore (lr) +#else /* else call _mcount */ #define CALL_MCOUNT \ str lr,[sp, #-4]!; \ cfi_adjust_cfa_offset (4); \ @@ -100,6 +111,7 @@ ldr lr, [sp], #4; \ cfi_adjust_cfa_offset (-4); \ cfi_restore (lr) +#endif #else #define CALL_MCOUNT /* Do nothing. */ #endif @@ -109,8 +121,12 @@ on this system, the asm identifier `syscall_error' intrudes on the C name space. Make sure we use an innocuous name. */ #define syscall_error __syscall_error +#if __GNUC_PREREQ(4,4) && defined(__ARM_EABI__) +#define mcount __gnu_mcount_nc +#else #define mcount _mcount #endif +#endif #if defined(__ARM_EABI__) /* Tag_ABI_align8_preserved: This code preserves 8-byte diff --git a/ports/sysdeps/hppa/Makefile b/ports/sysdeps/hppa/Makefile index 3cdd6c8..e435336 100644 --- a/ports/sysdeps/hppa/Makefile +++ b/ports/sysdeps/hppa/Makefile @@ -24,6 +24,7 @@ LDFLAGS-c_pic.os += -Wl,--unique=.text* ifeq ($(subdir),elf) CFLAGS-rtld.c += -mdisable-fpregs +CFLAGS-dl-reloc.c += --param inline-unit-growth=100 sysdep-dl-routines += dl-symaddr dl-fptr sysdep_routines += $(sysdep-dl-routines) sysdep-rtld-routines += $(sysdep-dl-routines) diff --git a/ports/sysdeps/hppa/configure b/ports/sysdeps/hppa/configure index b02889e..e0e9984 100644 --- a/ports/sysdeps/hppa/configure +++ b/ports/sysdeps/hppa/configure @@ -1,19 +1,101 @@ + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + # This file is generated from configure.in by Autoconf. DO NOT EDIT! -{ $as_echo "$as_me:$LINENO: checking for assembler line separator" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for assembler line separator" >&5 $as_echo_n "checking for assembler line separator... " >&6; } -if test "${libc_cv_asm_line_sep+set}" = set; then +if test "${libc_cv_asm_line_sep+set}" = set; then : $as_echo_n "(cached) " >&6 else cat > conftest.s <&5 + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 (eval $ac_try) 2>&5 ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then libc_cv_asm_line_sep='!' else if test -z "$enable_hacker_mode"; then @@ -25,7 +107,7 @@ else fi rm -f conftest* fi -{ $as_echo "$as_me:$LINENO: result: $libc_cv_asm_line_sep" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_asm_line_sep" >&5 $as_echo "$libc_cv_asm_line_sep" >&6; } cat >>confdefs.h <<_ACEOF #define ASM_LINE_SEP $libc_cv_asm_line_sep diff --git a/ports/sysdeps/hppa/dl-fptr.h b/ports/sysdeps/hppa/dl-fptr.h index 798ee8c..f72aa7a 100644 --- a/ports/sysdeps/hppa/dl-fptr.h +++ b/ports/sysdeps/hppa/dl-fptr.h @@ -22,6 +22,9 @@ #include +/* Initialize function pointer code. Call before relocation processing. */ +extern void _dl_fptr_init (void); + /* There are currently 33 dynamic symbols in ld.so. ELF_MACHINE_BOOT_FPTR_TABLE_LEN needs to be at least that big. */ #define ELF_MACHINE_BOOT_FPTR_TABLE_LEN 64 diff --git a/ports/sysdeps/hppa/dl-machine.h b/ports/sysdeps/hppa/dl-machine.h index e462fd3..ae4b6c1 100644 --- a/ports/sysdeps/hppa/dl-machine.h +++ b/ports/sysdeps/hppa/dl-machine.h @@ -64,7 +64,8 @@ __hppa_init_bootstrap_fdesc_table (struct link_map *map) } #define ELF_MACHINE_BEFORE_RTLD_RELOC(dynamic_info) \ - __hppa_init_bootstrap_fdesc_table (&bootstrap_map); + __hppa_init_bootstrap_fdesc_table (&bootstrap_map); \ + _dl_fptr_init(); /* Return nonzero iff ELF header is compatible with the running host. */ static inline int diff --git a/ports/sysdeps/hppa/dl-tls.h b/ports/sysdeps/hppa/dl-tls.h index 1bc9aae..56ebfb9 100644 --- a/ports/sysdeps/hppa/dl-tls.h +++ b/ports/sysdeps/hppa/dl-tls.h @@ -27,3 +27,6 @@ typedef struct extern void *__tls_get_addr (tls_index *ti); + +/* Value used for dtv entries for which the allocation is delayed. */ +#define TLS_DTV_UNALLOCATED ((void *) -1l) diff --git a/ports/sysdeps/hppa/elf/configure b/ports/sysdeps/hppa/elf/configure index 0e89b7d..40fda17 100644 --- a/ports/sysdeps/hppa/elf/configure +++ b/ports/sysdeps/hppa/elf/configure @@ -1,12 +1,94 @@ + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + # This file is generated from configure.in by Autoconf. DO NOT EDIT! # Local configure fragment for sysdeps/hppa/elf. if test "$usetls" != no; then # Check for support of thread-local storage handling in assembler and # linker. -{ $as_echo "$as_me:$LINENO: checking for hppa TLS support" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for hppa TLS support" >&5 $as_echo_n "checking for hppa TLS support... " >&6; } -if test "${libc_cv_hppa_tls+set}" = set; then +if test "${libc_cv_hppa_tls+set}" = set; then : $as_echo_n "(cached) " >&6 else cat > conftest.s <<\EOF @@ -41,23 +123,21 @@ test3: ; Done all the TLS tests. EOF if { ac_try='${CC-cc} -c $CFLAGS conftest.s 1>&5' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 (eval $ac_try) 2>&5 ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then libc_cv_hppa_tls=yes else libc_cv_hppa_tls=no fi rm -f conftest* fi -{ $as_echo "$as_me:$LINENO: result: $libc_cv_hppa_tls" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_hppa_tls" >&5 $as_echo "$libc_cv_hppa_tls" >&6; } if test $libc_cv_hppa_tls = yes; then - cat >>confdefs.h <<\_ACEOF -#define HAVE_TLS_SUPPORT 1 -_ACEOF + $as_echo "#define HAVE_TLS_SUPPORT 1" >>confdefs.h fi fi diff --git a/ports/sysdeps/hppa/fpu/fegetenv.c b/ports/sysdeps/hppa/fpu/fegetenv.c index fcf5d2d..cd5a22f 100644 --- a/ports/sysdeps/hppa/fpu/fegetenv.c +++ b/ports/sysdeps/hppa/fpu/fegetenv.c @@ -33,3 +33,4 @@ fegetenv (fenv_t *envp) memcpy(envp, buf, sizeof (*envp)); return 0; } +libm_hidden_def (fegetenv) diff --git a/ports/sysdeps/hppa/fpu/feupdateenv.c b/ports/sysdeps/hppa/fpu/feupdateenv.c index 1714006..5fb9ad3 100644 --- a/ports/sysdeps/hppa/fpu/feupdateenv.c +++ b/ports/sysdeps/hppa/fpu/feupdateenv.c @@ -38,3 +38,4 @@ feupdateenv (const fenv_t *envp) /* Success. */ return 0; } +libm_hidden_def (feupdateenv) diff --git a/ports/sysdeps/hppa/fpu/ftestexcept.c b/ports/sysdeps/hppa/fpu/ftestexcept.c index ac6d4b2..7b61492 100644 --- a/ports/sysdeps/hppa/fpu/ftestexcept.c +++ b/ports/sysdeps/hppa/fpu/ftestexcept.c @@ -32,3 +32,4 @@ fetestexcept (int excepts) return (s.sw[0] >> 27) & excepts & FE_ALL_EXCEPT; } +libm_hidden_def (fetestexcept) diff --git a/ports/sysdeps/hppa/linuxthreads/tls.h b/ports/sysdeps/hppa/linuxthreads/tls.h index 3d33a18..bc90f8d 100644 --- a/ports/sysdeps/hppa/linuxthreads/tls.h +++ b/ports/sysdeps/hppa/linuxthreads/tls.h @@ -100,6 +100,29 @@ typedef struct #define THREAD_SETMEM_NC(descr, member, value) \ ((void) sizeof (descr), THREAD_SELF->member = (value)) +/* Get and set the global scope generation counter in struct pthread. */ +#define THREAD_GSCOPE_FLAG_UNUSED 0 +#define THREAD_GSCOPE_FLAG_USED 1 +#define THREAD_GSCOPE_FLAG_WAIT 2 +#define THREAD_GSCOPE_RESET_FLAG() \ + do \ + { int __res \ + = atomic_exchange_rel (&THREAD_SELF->p_gscope_flag, \ + THREAD_GSCOPE_FLAG_UNUSED); \ + if (__res == THREAD_GSCOPE_FLAG_WAIT) \ + lll_futex_wake (&THREAD_SELF->p_gscope_flag, 1); \ + } \ + while (0) +#define THREAD_GSCOPE_SET_FLAG() \ + do \ + { \ + THREAD_SELF->p_gscope_flag = THREAD_GSCOPE_FLAG_USED; \ + atomic_write_barrier (); \ + } \ + while (0) +#define THREAD_GSCOPE_WAIT() \ + do { /* GL(dl_wait_lookup_done) () */ } while (0) + /* Install the dtv pointer. The pointer passed is to the element with index -1 which contain the length. */ # define INSTALL_DTV(tcbp, dtvp) \ diff --git a/ports/sysdeps/hppa/stackinfo.h b/ports/sysdeps/hppa/stackinfo.h index 318de71..71e8c24 100644 --- a/ports/sysdeps/hppa/stackinfo.h +++ b/ports/sysdeps/hppa/stackinfo.h @@ -22,6 +22,12 @@ #ifndef _STACKINFO_H #define _STACKINFO_H 1 +#include + +/* Default to an executable stack. PF_X can be overridden if PT_GNU_STACK is + * present, but it is presumed absent. */ +#define DEFAULT_STACK_PERMS (PF_R|PF_W|PF_X) + /* On PA the stack grows up. */ #define _STACK_GROWS_UP 1 diff --git a/ports/sysdeps/m68k/Deps b/ports/sysdeps/m68k/Deps new file mode 100644 index 0000000..7682409 --- /dev/null +++ b/ports/sysdeps/m68k/Deps @@ -0,0 +1 @@ +libgcc-compat.c diff --git a/ports/sysdeps/m68k/Makefile b/ports/sysdeps/m68k/Makefile index ca0d500..dd80015 100644 --- a/ports/sysdeps/m68k/Makefile +++ b/ports/sysdeps/m68k/Makefile @@ -33,3 +33,15 @@ CFLAGS-setjmp.c := -fno-omit-frame-pointer ifeq ($(subdir),elf) CFLAGS-rtld.c += -Wno-uninitialized -Wno-unused endif + +# Build objects in libc_nonshared.a with -fPIC (instead of -fpic) to avoid +# possible linkage problems. +CFLAGS-.oS += -fPIC + +ifeq ($(subdir),csu) +ifeq (yes,$(build-shared)) +# Compatibility +sysdep_routines += libgcc-compat +shared-only-routines += libgcc-compat +endif +endif diff --git a/ports/sysdeps/m68k/Versions b/ports/sysdeps/m68k/Versions index f450291..af462a6 100644 --- a/ports/sysdeps/m68k/Versions +++ b/ports/sysdeps/m68k/Versions @@ -2,6 +2,14 @@ libc { GLIBC_2.0 { # Functions from libgcc. __divdi3; __moddi3; __udivdi3; __umoddi3; + __ashldi3; + __ashrdi3; + __fixdfdi; + __fixsfdi; + __fixunsdfdi; + __fixunssfdi; + __floatdidf; + __floatdisf; } } libm { diff --git a/ports/sysdeps/m68k/bits/byteswap.h b/ports/sysdeps/m68k/bits/byteswap.h index a2546c9..53bfb29 100644 --- a/ports/sysdeps/m68k/bits/byteswap.h +++ b/ports/sysdeps/m68k/bits/byteswap.h @@ -30,36 +30,29 @@ #define __bswap_constant_16(x) \ ((((x) >> 8) & 0xffu) | (((x) & 0xffu) << 8)) -#ifdef __GNUC__ -# define __bswap_16(x) \ - (__extension__ \ - ({ unsigned short int __bsx = (x); __bswap_constant_16 (__bsx); })) -#else static __inline unsigned short int __bswap_16 (unsigned short int __bsx) { return __bswap_constant_16 (__bsx); } -#endif /* Swap bytes in 32 bit value. */ #define __bswap_constant_32(x) \ ((((x) & 0xff000000u) >> 24) | (((x) & 0x00ff0000u) >> 8) | \ (((x) & 0x0000ff00u) << 8) | (((x) & 0x000000ffu) << 24)) -#if defined __GNUC__ && __GNUC__ >= 2 && !defined(__mcoldfire__) -# define __bswap_32(x) \ - __extension__ \ - ({ unsigned int __bswap_32_v; \ - if (__builtin_constant_p (x)) \ - __bswap_32_v = __bswap_constant_32 (x); \ - else \ - __asm__ __volatile__ ("ror%.w %#8, %0;" \ - "swap %0;" \ - "ror%.w %#8, %0" \ - : "=d" (__bswap_32_v) \ - : "0" ((unsigned int) (x))); \ - __bswap_32_v; }) +#if !defined(__mcoldfire__) +static __inline unsigned int +__bswap_32 (unsigned int __bsx) +{ + if (__builtin_constant_p (__bsx)) + return __bswap_constant_32 (__bsx); + __asm__ __volatile__ ("ror%.w %#8, %0;" + "swap %0;" + "ror%.w %#8, %0" + : "+d" (__bsx)); + return __bsx; +} #else static __inline unsigned int __bswap_32 (unsigned int __bsx) @@ -81,19 +74,14 @@ __bswap_32 (unsigned int __bsx) | (((x) & 0x00000000000000ffull) << 56)) /* Swap bytes in 64 bit value. */ -# define __bswap_64(x) \ - __extension__ \ - ({ union { unsigned long long int __ll; \ - unsigned long int __l[2]; } __bswap_64_v, __bswap_64_r; \ - if (__builtin_constant_p (x)) \ - __bswap_64_r.__ll = __bswap_constant_64 (x); \ - else \ - { \ - __bswap_64_v.__ll = (x); \ - __bswap_64_r.__l[0] = __bswap_32 (__bswap_64_v.__l[1]); \ - __bswap_64_r.__l[1] = __bswap_32 (__bswap_64_v.__l[0]); \ - } \ - __bswap_64_r.__ll; }) +static __inline unsigned long long +__bswap_64 (unsigned long long __bsx) +{ + if (__builtin_constant_p (__bsx)) + return __bswap_constant_64 (__bsx); + return (__bswap_32 (__bsx >> 32) + | ((unsigned long long) __bswap_32 (__bsx) << 32)); +} #endif #endif /* _BITS_BYTESWAP_H */ diff --git a/ports/sysdeps/m68k/dl-machine.h b/ports/sysdeps/m68k/dl-machine.h index 9bc35e7..e43f879 100644 --- a/ports/sysdeps/m68k/dl-machine.h +++ b/ports/sysdeps/m68k/dl-machine.h @@ -312,6 +312,8 @@ elf_machine_lazy_rel (struct link_map *map, Elf32_Addr *const reloc_addr = (void *) (l_addr + reloc->r_offset); if (ELF32_R_TYPE (reloc->r_info) == R_68K_JMP_SLOT) *reloc_addr += l_addr; + else if (ELF32_R_TYPE (reloc->r_info) == R_68K_NONE) + return; else _dl_reloc_bad_type (map, ELF32_R_TYPE (reloc->r_info), 1); } diff --git a/ports/sysdeps/m68k/libgcc-compat.c b/ports/sysdeps/m68k/libgcc-compat.c new file mode 100644 index 0000000..6f2a935 --- /dev/null +++ b/ports/sysdeps/m68k/libgcc-compat.c @@ -0,0 +1,83 @@ +/* pre-.hidden libgcc compatibility + Copyright (C) 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by GOTO Masanori + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + + +#include +#include + +#if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_2_6) + +extern int64_t __ashldi3 (int64_t, int32_t); +int64_t __ashldi3_internal (int64_t u, int32_t b) +{ + return __ashldi3 (u, b); +} +symbol_version (__ashldi3_internal, __ashldi3, GLIBC_2.0); + +extern int64_t __ashrdi3 (int64_t, int32_t); +int64_t __ashrdi3_internal (int64_t u, int32_t b) +{ + return __ashrdi3 (u, b); +} +symbol_version (__ashrdi3_internal, __ashrdi3, GLIBC_2.0); + +extern int64_t __fixdfdi (double); +int64_t __fixdfdi_internal (double d) +{ + return __fixdfdi (d); +} +symbol_version (__fixdfdi_internal, __fixdfdi, GLIBC_2.0); + +extern int64_t __fixsfdi (float); +int64_t __fixsfdi_internal (float d) +{ + return __fixsfdi (d); +} +symbol_version (__fixsfdi_internal, __fixsfdi, GLIBC_2.0); + +extern int64_t __fixunsdfdi (double); +int64_t __fixunsdfdi_internal (double d) +{ + return __fixunsdfdi (d); +} +symbol_version (__fixunsdfdi_internal, __fixunsdfdi, GLIBC_2.0); + +extern int64_t __fixunssfdi (float); +int64_t __fixunssfdi_internal (float d) +{ + return __fixunssfdi (d); +} +symbol_version (__fixunssfdi_internal, __fixunssfdi, GLIBC_2.0); + +extern double __floatdidf (int64_t); +double __floatdidf_internal (int64_t u) +{ + return __floatdidf (u); +} +symbol_version (__floatdidf_internal, __floatdidf, GLIBC_2.0); + +extern float __floatdisf (int64_t); +float __floatdisf_internal (int64_t u) +{ + return __floatdisf (u); +} +symbol_version (__floatdisf_internal, __floatdisf, GLIBC_2.0); + +#endif diff --git a/ports/sysdeps/mips/Makefile b/ports/sysdeps/mips/Makefile index 9d01522..b7e5e61 100644 --- a/ports/sysdeps/mips/Makefile +++ b/ports/sysdeps/mips/Makefile @@ -11,4 +11,8 @@ ifeq ($(subdir),rt) librt-sysdep_routines += rt-sysdep endif +ifeq ($(subdir),debug) +CFLAGS-backtrace.c += -funwind-tables +endif + ASFLAGS-.os += $(pic-ccflag) diff --git a/ports/sysdeps/mips/backtrace.c b/ports/sysdeps/mips/backtrace.c new file mode 100644 index 0000000..2970294 --- /dev/null +++ b/ports/sysdeps/mips/backtrace.c @@ -0,0 +1 @@ +#include diff --git a/ports/sysdeps/mips/bits/atomic.h b/ports/sysdeps/mips/bits/atomic.h index 11b3467..ca71c80 100644 --- a/ports/sysdeps/mips/bits/atomic.h +++ b/ports/sysdeps/mips/bits/atomic.h @@ -74,7 +74,7 @@ typedef uintmax_t uatomic_max_t; "bne %0,%3,2f\n\t" \ "move %1,%4\n\t" \ "sc %1,%2\n\t" \ - "beqz %1,1b\n" \ + "beqzl %1,1b\n" \ acq "\n\t" \ ".set pop\n" \ "2:\n\t" \ @@ -98,7 +98,7 @@ typedef uintmax_t uatomic_max_t; "bne %0,%3,2f\n\t" \ "move %1,%4\n\t" \ "scd %1,%2\n\t" \ - "beqz %1,1b\n" \ + "beqzl %1,1b\n" \ acq "\n\t" \ ".set pop\n" \ "2:\n\t" \ @@ -192,7 +192,7 @@ typedef uintmax_t uatomic_max_t; "ll %0,%4\n\t" \ "move %1,%3\n\t" \ "sc %1,%2\n\t" \ - "beqz %1,1b\n" \ + "beqzl %1,1b\n" \ acq "\n\t" \ ".set pop\n" \ "2:\n\t" \ @@ -216,7 +216,7 @@ typedef uintmax_t uatomic_max_t; "lld %0,%4\n\t" \ "move %1,%3\n\t" \ "scd %1,%2\n\t" \ - "beqz %1,1b\n" \ + "beqzl %1,1b\n" \ acq "\n\t" \ ".set pop\n" \ "2:\n\t" \ @@ -251,7 +251,7 @@ typedef uintmax_t uatomic_max_t; "ll %0,%4\n\t" \ "addu %1,%0,%3\n\t" \ "sc %1,%2\n\t" \ - "beqz %1,1b\n" \ + "beqzl %1,1b\n" \ acq "\n\t" \ ".set pop\n" \ "2:\n\t" \ @@ -275,7 +275,7 @@ typedef uintmax_t uatomic_max_t; "lld %0,%4\n\t" \ "daddu %1,%0,%3\n\t" \ "scd %1,%2\n\t" \ - "beqz %1,1b\n" \ + "beqzl %1,1b\n" \ acq "\n\t" \ ".set pop\n" \ "2:\n\t" \ diff --git a/ports/sysdeps/mips/dl-machine.h b/ports/sysdeps/mips/dl-machine.h index e2c782a..6d1dc2d 100644 --- a/ports/sysdeps/mips/dl-machine.h +++ b/ports/sysdeps/mips/dl-machine.h @@ -70,7 +70,8 @@ /* If there is a DT_MIPS_RLD_MAP entry in the dynamic section, fill it in with the run-time address of the r_debug structure */ #define ELF_MACHINE_DEBUG_SETUP(l,r) \ -do { if ((l)->l_info[DT_MIPS (RLD_MAP)]) \ +do { if ((l)->l_info[DT_MIPS (RLD_MAP)] && \ + (l)->l_info[DT_MIPS (RLD_MAP)]->d_un.d_ptr) \ *(ElfW(Addr) *)((l)->l_info[DT_MIPS (RLD_MAP)]->d_un.d_ptr) = \ (ElfW(Addr)) (r); \ } while (0) @@ -296,6 +297,18 @@ do { \ # define ARCH_LA_PLTEXIT mips_n64_gnu_pltexit # endif +/* We define an initialization function. This is called very early in + _dl_sysdep_start. */ +#define DL_PLATFORM_INIT dl_platform_init () + +static inline void __attribute__ ((unused)) +dl_platform_init (void) +{ + if (GLRO(dl_platform) != NULL && *GLRO(dl_platform) == '\0') + /* Avoid an empty string which would disturb us. */ + GLRO(dl_platform) = NULL; +} + /* For a non-writable PLT, rewrite the .got.plt entry at RELOC_ADDR to point at the symbol with address VALUE. For a writable PLT, rewrite the corresponding PLT entry instead. */ diff --git a/ports/sysdeps/mips/dl-procinfo.c b/ports/sysdeps/mips/dl-procinfo.c new file mode 100644 index 0000000..b691b79 --- /dev/null +++ b/ports/sysdeps/mips/dl-procinfo.c @@ -0,0 +1,64 @@ +/* Data for Mips version of processor capability information. + Copyright (C) 2007 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Robert Millan . + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +/* This information must be kept in sync with the _DL_PLATFORM_COUNT + definitions in procinfo.h. + + If anything should be added here check whether the size of each string + is still ok with the given array size. + + All the #ifdefs in the definitions are quite irritating but + necessary if we want to avoid duplicating the information. There + are three different modes: + + - PROCINFO_DECL is defined. This means we are only interested in + declarations. + + - PROCINFO_DECL is not defined: + + + if SHARED is defined the file is included in an array + initializer. The .element = { ... } syntax is needed. + + + if SHARED is not defined a normal array initialization is + needed. + */ + +#ifndef PROCINFO_CLASS +#define PROCINFO_CLASS +#endif + +#if !defined PROCINFO_DECL && defined SHARED + ._dl_mips_platforms +#else +PROCINFO_CLASS const char _dl_mips_platforms[4][11] +#endif +#ifndef PROCINFO_DECL += { + "loongson2e", "loongson2f", "octeon", "octeon2" + } +#endif +#if !defined SHARED || defined PROCINFO_DECL +; +#else +, +#endif + +#undef PROCINFO_DECL +#undef PROCINFO_CLASS diff --git a/ports/sysdeps/mips/dl-procinfo.h b/ports/sysdeps/mips/dl-procinfo.h new file mode 100644 index 0000000..f981d22 --- /dev/null +++ b/ports/sysdeps/mips/dl-procinfo.h @@ -0,0 +1,68 @@ +/* Mips version of processor capability information handling macros. + Copyright (C) 2007 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Robert Millan . + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#ifndef _DL_PROCINFO_H +#define _DL_PROCINFO_H 1 + +#include + + +/* Mask to filter out platforms. */ +#define _DL_HWCAP_PLATFORM (-1ULL) + +#define _DL_PLATFORMS_COUNT 4 + +static inline const char * +__attribute__ ((unused)) +_dl_platform_string (int idx) +{ + return GLRO(dl_mips_platforms)[idx]; +}; + +static inline int +__attribute__ ((unused, always_inline)) +_dl_string_platform (const char *str) +{ + int i; + + if (str != NULL) + for (i = 0; i < _DL_PLATFORMS_COUNT; ++i) + { + if (strcmp (str, _dl_platform_string (i)) == 0) + return i; + } + return -1; +}; + +/* We cannot provide a general printing function. */ +#define _dl_procinfo(word) -1 + +/* There are no hardware capabilities defined. */ +#define _dl_hwcap_string(idx) "" + +/* By default there is no important hardware capability. */ +#define HWCAP_IMPORTANT (0) + +/* We don't have any hardware capabilities. */ +#define _DL_HWCAP_COUNT 0 + +#define _dl_string_hwcap(str) (-1) + +#endif /* dl-procinfo.h */ diff --git a/ports/sysdeps/mips/dl-tls.h b/ports/sysdeps/mips/dl-tls.h index 6d3ed6f..69d3893 100644 --- a/ports/sysdeps/mips/dl-tls.h +++ b/ports/sysdeps/mips/dl-tls.h @@ -44,3 +44,6 @@ extern void *__tls_get_addr (tls_index *ti); # define GET_ADDR_OFFSET (ti->ti_offset + TLS_DTV_OFFSET) # define __TLS_GET_ADDR(__ti) (__tls_get_addr (__ti) - TLS_DTV_OFFSET) + +/* Value used for dtv entries for which the allocation is delayed. */ +#define TLS_DTV_UNALLOCATED ((void *) -1l) diff --git a/ports/sysdeps/mips/dl-trampoline.c b/ports/sysdeps/mips/dl-trampoline.c index 2c94140..c4367f7 100644 --- a/ports/sysdeps/mips/dl-trampoline.c +++ b/ports/sysdeps/mips/dl-trampoline.c @@ -26,6 +26,7 @@ #include #include #include +#include /* Get link map for callers object containing STUB_PC. */ static inline struct link_map * @@ -153,17 +154,44 @@ __dl_runtime_resolve (ElfW(Word) sym_index, if (version->hash != 0) { + /* We need to keep the scope around so do some locking. This is + not necessary for objects which cannot be unloaded or when + we are not using any threads (yet). */ + if (!RTLD_SINGLE_THREAD_P) + THREAD_GSCOPE_SET_FLAG (); + sym_map = _dl_lookup_symbol_x (strtab + sym->st_name, l, &sym, l->l_scope, version, ELF_RTYPE_CLASS_PLT, 0, 0); + + /* We are done with the global scope. */ + if (!RTLD_SINGLE_THREAD_P) + THREAD_GSCOPE_RESET_FLAG (); + break; } /* Fall through. */ } case 0: + { + /* We need to keep the scope around so do some locking. This is + not necessary for objects which cannot be unloaded or when + we are not using any threads (yet). */ + int flags = DL_LOOKUP_ADD_DEPENDENCY; + if (!RTLD_SINGLE_THREAD_P) + { + THREAD_GSCOPE_SET_FLAG (); + flags |= DL_LOOKUP_GSCOPE_LOCK; + } + sym_map = _dl_lookup_symbol_x (strtab + sym->st_name, l, &sym, l->l_scope, 0, ELF_RTYPE_CLASS_PLT, - DL_LOOKUP_ADD_DEPENDENCY, 0); + flags, 0); + + /* We are done with the global scope. */ + if (!RTLD_SINGLE_THREAD_P) + THREAD_GSCOPE_RESET_FLAG (); + } } /* Currently value contains the base load address of the object diff --git a/ports/sysdeps/mips/mips32/Makefile b/ports/sysdeps/mips/mips32/Makefile index dec0b02..80c2ebf 100644 --- a/ports/sysdeps/mips/mips32/Makefile +++ b/ports/sysdeps/mips/mips32/Makefile @@ -1,3 +1,11 @@ ifeq ($(filter -mabi=32,$(CC)),) CC += -mabi=32 endif + +ifeq ($(subdir),csu) +ifeq (yes,$(build-shared)) +# Compatibility +sysdep_routines += libgcc-compat +shared-only-routines += libgcc-compat +endif +endif diff --git a/ports/sysdeps/mips/mips32/Versions b/ports/sysdeps/mips/mips32/Versions new file mode 100644 index 0000000..98afb18 --- /dev/null +++ b/ports/sysdeps/mips/mips32/Versions @@ -0,0 +1,8 @@ +libc { + GLIBC_2.0 { + # Functions from libgcc. + __cmpdi2; __ucmpdi2; + __divdi3; __moddi3; __udivdi3; __umoddi3; + __fixdfdi; __floatdidf; __floatdisf; + } +} diff --git a/ports/sysdeps/mips/mips32/libgcc-compat.c b/ports/sysdeps/mips/mips32/libgcc-compat.c new file mode 100644 index 0000000..36863a2 --- /dev/null +++ b/ports/sysdeps/mips/mips32/libgcc-compat.c @@ -0,0 +1,66 @@ +/* pre-.hidden libgcc compatibility + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Guido Guenther + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + + +#include +#include + +#if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_2_6) + +extern int32_t __cmpdi2 (int64_t, int64_t); +int32_t __cmpdi2_internal (int64_t u, int64_t v) +{ + return __cmpdi2 (u, v); +} +symbol_version (__cmpdi2_internal, __cmpdi2, GLIBC_2.0); + + +extern int32_t __ucmpdi2 (int64_t, int64_t); +int32_t __ucmpdi2_internal (int64_t u, int64_t v) +{ + return __ucmpdi2 (u, v); +} +symbol_version (__ucmpdi2_internal, __ucmpdi2, GLIBC_2.0); + + +extern int64_t __fixdfdi (double); +int64_t __fixdfdi_internal (double d) +{ + return __fixdfdi (d); +} +symbol_version (__fixdfdi_internal, __fixdfdi, GLIBC_2.0); + + +extern double __floatdidf (int64_t); +double __floatdidf_internal (int64_t u) +{ + return __floatdidf (u); +} +symbol_version (__floatdidf_internal, __floatdidf, GLIBC_2.0); + + +extern float floatdisf (int64_t); +float __floatdisf_internal (int64_t u) +{ + return __floatdisf (u); +} +symbol_version (__floatdisf_internal, __floatdisf, GLIBC_2.0); + +#endif diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_fma.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_fma.c new file mode 100644 index 0000000..40efd24 --- /dev/null +++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_fma.c @@ -0,0 +1 @@ +#include diff --git a/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_fmaf.c b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_fmaf.c new file mode 100644 index 0000000..5b7663f --- /dev/null +++ b/ports/sysdeps/powerpc/powerpc32/e500/fpu/s_fmaf.c @@ -0,0 +1 @@ +#include diff --git a/ports/sysdeps/unix/alpha/sysdep.h b/ports/sysdeps/unix/alpha/sysdep.h index d9009c1..25979ad 100644 --- a/ports/sysdeps/unix/alpha/sysdep.h +++ b/ports/sysdeps/unix/alpha/sysdep.h @@ -157,6 +157,8 @@ __LABEL(name) \ #else /* !ASSEMBLER */ +#include + /* ??? Linux needs to be able to override INLINE_SYSCALL for one particular special case. Make this easy. */ @@ -399,11 +401,11 @@ __LABEL(name) \ _sc_ret = _sc_0, _sc_err = _sc_19; \ } +#endif /* ASSEMBLER */ + /* Pointer mangling support. Note that tls access is slow enough that we don't deoptimize things by placing the pointer check value there. */ -#include - #if defined NOT_IN_libc && defined IS_IN_rtld # ifdef __ASSEMBLER__ # define PTR_MANGLE(dst, src, tmp) \ @@ -447,4 +449,3 @@ extern const uintptr_t __pointer_chk_guard attribute_relro; # endif #endif -#endif /* ASSEMBLER */ diff --git a/ports/sysdeps/unix/sysv/linux/alpha/____longjmp_chk.S b/ports/sysdeps/unix/sysv/linux/alpha/____longjmp_chk.S index 5194ed8..e0e7106 100644 --- a/ports/sysdeps/unix/sysv/linux/alpha/____longjmp_chk.S +++ b/ports/sysdeps/unix/sysv/linux/alpha/____longjmp_chk.S @@ -58,7 +58,7 @@ ____longjmp_chk: PTR_DEMANGLE2(s3, t1) PTR_DEMANGLE2(fp, t1) #endif - cmpule t0, sp, t1 + cmpule s3, sp, t1 bne t1, .Lfail .align 4 diff --git a/ports/sysdeps/unix/sysv/linux/alpha/bits/fcntl.h b/ports/sysdeps/unix/sysv/linux/alpha/bits/fcntl.h index 860e9ac..fecba9b 100644 --- a/ports/sysdeps/unix/sysv/linux/alpha/bits/fcntl.h +++ b/ports/sysdeps/unix/sysv/linux/alpha/bits/fcntl.h @@ -97,6 +97,8 @@ # define F_SETLEASE 1024 /* Set a lease. */ # define F_GETLEASE 1025 /* Enquire what lease is active. */ # define F_NOTIFY 1026 /* Request notfications on a directory. */ +# define F_SETPIPE_SZ 1031 /* Set pipe page size array. */ +# define F_GETPIPE_SZ 1032 /* Set pipe page size array. */ #endif #ifdef __USE_XOPEN2K8 # define F_DUPFD_CLOEXEC 1030 /* Duplicate file descriptor with @@ -223,6 +225,21 @@ struct f_owner_ex # define SPLICE_F_GIFT 8 /* Pages passed in are a gift. */ #endif +/* Values for `*at' functions. */ +#ifdef __USE_ATFILE +# define AT_FDCWD -100 /* Special value used to indicate + the *at functions should use the + current working directory. */ +# define AT_SYMLINK_NOFOLLOW 0x100 /* Do not follow symbolic links. */ +# define AT_REMOVEDIR 0x200 /* Remove directory instead of + unlinking file. */ +# define AT_SYMLINK_FOLLOW 0x400 /* Follow symbolic links. */ +# define AT_NO_AUTOMOUNT 0x800 /* Suppress terminal automount + traversal. */ +# define AT_EACCESS 0x200 /* Test access permitted for + effective IDs, not real IDs. */ +#endif + __BEGIN_DECLS #ifdef __USE_GNU @@ -250,6 +267,23 @@ extern ssize_t splice (int __fdin, __off64_t *__offin, int __fdout, extern ssize_t tee (int __fdin, int __fdout, size_t __len, unsigned int __flags); +/* Reserve storage for the data of the file associated with FD. */ +# ifndef __USE_FILE_OFFSET64 +extern int fallocate (int __fd, int __mode, __off_t __offset, __off_t __len); +# else +# ifdef __REDIRECT +extern int __REDIRECT (fallocate, (int __fd, int __mode, __off64_t __offset, + __off64_t __len), + fallocate64); +# else +# define fallocate fallocate64 +# endif +# endif +# ifdef __USE_LARGEFILE64 +extern int fallocate64 (int __fd, int __mode, __off64_t __offset, + __off64_t __len); +# endif + #endif __END_DECLS diff --git a/ports/sysdeps/unix/sysv/linux/alpha/bits/resource.h b/ports/sysdeps/unix/sysv/linux/alpha/bits/resource.h index 92d0199..bf8aaed 100644 --- a/ports/sysdeps/unix/sysv/linux/alpha/bits/resource.h +++ b/ports/sysdeps/unix/sysv/linux/alpha/bits/resource.h @@ -100,7 +100,13 @@ enum __rlimit_resource __RLIMIT_RTPRIO = 14, #define RLIMIT_RTPRIO __RLIMIT_RTPRIO - __RLIMIT_NLIMITS = 15, + /* Maximum CPU time that a process scheduled under a real-time + scheduling policy may consume without making a blocking + system call. */ + __RLIMIT_RTTIME = 15, +#define RLIMIT_RTTIME __RLIMIT_RTTIME + + __RLIMIT_NLIMITS = 16, __RLIM_NLIMITS = __RLIMIT_NLIMITS #define RLIMIT_NLIMITS __RLIMIT_NLIMITS #define RLIM_NLIMITS __RLIM_NLIMITS diff --git a/ports/sysdeps/unix/sysv/linux/alpha/bits/statfs.h b/ports/sysdeps/unix/sysv/linux/alpha/bits/statfs.h index d838e6b..157591d 100644 --- a/ports/sysdeps/unix/sysv/linux/alpha/bits/statfs.h +++ b/ports/sysdeps/unix/sysv/linux/alpha/bits/statfs.h @@ -42,7 +42,8 @@ struct statfs __fsid_t f_fsid; int f_namelen; int f_frsize; - int f_spare[5]; + int f_flags; + int f_spare[4]; }; #ifdef __USE_LARGEFILE64 @@ -58,7 +59,8 @@ struct statfs64 __fsid_t f_fsid; int f_namelen; int f_frsize; - int f_spare[5]; + int f_flags; + int f_spare[4]; }; #endif diff --git a/ports/sysdeps/unix/sysv/linux/alpha/dl-support.c b/ports/sysdeps/unix/sysv/linux/alpha/dl-support.c deleted file mode 100644 index 2902176..0000000 --- a/ports/sysdeps/unix/sysv/linux/alpha/dl-support.c +++ /dev/null @@ -1,2 +0,0 @@ -#include "dl-auxv.h" -#include diff --git a/ports/sysdeps/unix/sysv/linux/alpha/fxstatat.c b/ports/sysdeps/unix/sysv/linux/alpha/fxstatat.c index 6fa3aeb..49d0578 100644 --- a/ports/sysdeps/unix/sysv/linux/alpha/fxstatat.c +++ b/ports/sysdeps/unix/sysv/linux/alpha/fxstatat.c @@ -35,6 +35,32 @@ int __fxstatat (int vers, int fd, const char *file, struct stat *st, int flag) { + int result; + INTERNAL_SYSCALL_DECL (err); + +#ifdef __NR_fstatat64 +# ifndef __ASSUME_ATFCTS + if (__have_atfcts >= 0) +# endif + { + result = INTERNAL_SYSCALL (fstatat64, err, 4, fd, file, st, flag); +# ifndef __ASSUME_ATFCTS + if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (result, err), 1) + && INTERNAL_SYSCALL_ERRNO (result, err) == ENOSYS) + __have_atfcts = -1; + else +# endif + if (!__builtin_expect (INTERNAL_SYSCALL_ERROR_P (result, err), 1)) + return 0; + else + { + __set_errno (INTERNAL_SYSCALL_ERRNO (result, err)); + return -1; + } + } +#endif + +#ifndef __ASSUME_ATFCTS if (flag & ~AT_SYMLINK_NOFOLLOW) { __set_errno (EINVAL); @@ -68,7 +94,7 @@ __fxstatat (int vers, int fd, const char *file, struct stat *st, int flag) } INTERNAL_SYSCALL_DECL (err); - int result, errno_out; + int errno_out; struct kernel_stat kst; #if __ASSUME_STAT64_SYSCALL > 0 @@ -114,6 +140,7 @@ __fxstatat (int vers, int fd, const char *file, struct stat *st, int flag) __atfct_seterrno (errno_out, fd, buf); return -1; +#endif } libc_hidden_def (__fxstatat) strong_alias (__fxstatat, __fxstatat64); diff --git a/ports/sysdeps/unix/sysv/linux/alpha/ioperm.c b/ports/sysdeps/unix/sysv/linux/alpha/ioperm.c index 32e96ec..474aa84 100644 --- a/ports/sysdeps/unix/sysv/linux/alpha/ioperm.c +++ b/ports/sysdeps/unix/sysv/linux/alpha/ioperm.c @@ -178,13 +178,13 @@ static struct { static inline void stb_mb(unsigned char val, unsigned long addr) { - __asm__("stb %1,%0; mb" : "=m"(*(vucp)addr) : "r"(val)); + __asm__(".arch ev6; stb %1,%0; mb" : "=m"(*(vucp)addr) : "r"(val)); } static inline void stw_mb(unsigned short val, unsigned long addr) { - __asm__("stw %1,%0; mb" : "=m"(*(vusp)addr) : "r"(val)); + __asm__(".arch ev6; stw %1,%0; mb" : "=m"(*(vusp)addr) : "r"(val)); } static inline void @@ -356,7 +356,7 @@ inline_bwx_inb (unsigned long int port) unsigned long int addr = dense_port_to_cpu_addr (port); unsigned char r; - __asm__ ("ldbu %0,%1" : "=r"(r) : "m"(*(vucp)addr)); + __asm__ (".arch ev6; ldbu %0,%1" : "=r"(r) : "m"(*(vucp)addr)); return r; } @@ -366,7 +366,7 @@ inline_bwx_inw (unsigned long int port) unsigned long int addr = dense_port_to_cpu_addr (port); unsigned short r; - __asm__ ("ldwu %0,%1" : "=r"(r) : "m"(*(vusp)addr)); + __asm__ (".arch ev6; ldwu %0,%1" : "=r"(r) : "m"(*(vusp)addr)); return r; } diff --git a/ports/sysdeps/unix/sysv/linux/alpha/kernel-features.h b/ports/sysdeps/unix/sysv/linux/alpha/kernel-features.h index 9c640f9..a5a4c31 100644 --- a/ports/sysdeps/unix/sysv/linux/alpha/kernel-features.h +++ b/ports/sysdeps/unix/sysv/linux/alpha/kernel-features.h @@ -61,15 +61,23 @@ # define __ASSUME_SIGNALFD4 1 #endif -/* Support for accept4 was added for alpha after 2.6.33-rc1. */ +/* Support for recvmmsg was added for alpha in 2.6.33. */ #if __LINUX_KERNEL_VERSION >= 0x020621 -# define __ASSUME_ACCEPT4 1 +# define __ASSUME_RECVMMSG_SYSCALL 1 +#endif + +/* Support for accept4 was added for alpha in 3.2. */ +#if __LINUX_KERNEL_VERSION >= 0x030200 +# define __ASSUME_ACCEPT4_SYSCALL 1 #endif #include_next #undef __ASSUME_ST_INO_64_BIT +/* Alpha does not have a 64bit syscall, and its native syscall is 32bits. */ +#undef __ASSUME_STATFS64 + /* pselect/ppoll were introduced on alpha just after 2.6.22-rc1. */ #if __LINUX_KERNEL_VERSION < 0x020617 # undef __ASSUME_PSELECT diff --git a/ports/sysdeps/unix/sysv/linux/alpha/nptl/lowlevellock.h b/ports/sysdeps/unix/sysv/linux/alpha/nptl/lowlevellock.h index 7903745..198ef5e 100644 --- a/ports/sysdeps/unix/sysv/linux/alpha/nptl/lowlevellock.h +++ b/ports/sysdeps/unix/sysv/linux/alpha/nptl/lowlevellock.h @@ -23,7 +23,6 @@ #include #include #include -#include #include diff --git a/ports/sysdeps/unix/sysv/linux/alpha/sys/epoll.h b/ports/sysdeps/unix/sysv/linux/alpha/sys/epoll.h index 9f983a5..9177c31 100644 --- a/ports/sysdeps/unix/sysv/linux/alpha/sys/epoll.h +++ b/ports/sysdeps/unix/sysv/linux/alpha/sys/epoll.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2002-2006, 2007, 2008 Free Software Foundation, Inc. +/* Copyright (C) 2002-2008, 2010 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -31,7 +31,7 @@ typedef __sigset_t sigset_t; #endif -/* Flags to be passed to epoll_create2. */ +/* Flags to be passed to epoll_create1. */ enum { EPOLL_CLOEXEC = 010000000, @@ -101,8 +101,9 @@ __BEGIN_DECLS returned by epoll_create() should be closed with close(). */ extern int epoll_create (int __size) __THROW; -/* Same as epoll_create but with an additional FLAGS parameter. */ -extern int epoll_create2 (int __size, int __flags) __THROW; +/* Same as epoll_create but with an FLAGS parameter. The unused SIZE + parameter has been dropped. */ +extern int epoll_create1 (int __flags) __THROW; /* Manipulate an epoll instance "epfd". Returns 0 in case of success, diff --git a/ports/sysdeps/unix/sysv/linux/alpha/syscall.S b/ports/sysdeps/unix/sysv/linux/alpha/syscall.S index 0c40813..02d5d65 100644 --- a/ports/sysdeps/unix/sysv/linux/alpha/syscall.S +++ b/ports/sysdeps/unix/sysv/linux/alpha/syscall.S @@ -31,13 +31,13 @@ * * Usage: * - * long syscall(syscall_number, arg1, arg2, arg3, arg4, arg5) + * long syscall(syscall_number, arg1, arg2, arg3, arg4, arg5, arg6) * * syscall_number = the index of the system call we're invoking - * arg1-arg5 = up to 5 integer arguments to the system call + * arg1-arg6 = up to 6 integer arguments to the system call * * We need to do some arg shifting: the kernel expects the - * syscall number in v0 and the first five args in a0-a4. + * syscall number in v0 and the first six args in a0-a5. * */ @@ -60,6 +60,7 @@ LEAF(__syscall, 0) mov a3, a2 mov a4, a3 mov a5, a4 + ldq a5,0(sp) /* arg6 -> a5 */ call_pal PAL_callsys /* Invoke system call */ bne a3, $error diff --git a/ports/sysdeps/unix/sysv/linux/alpha/sysconf.c b/ports/sysdeps/unix/sysv/linux/alpha/sysconf.c index 51a2a47..30faa3f 100644 --- a/ports/sysdeps/unix/sysv/linux/alpha/sysconf.c +++ b/ports/sysdeps/unix/sysv/linux/alpha/sysconf.c @@ -135,7 +135,7 @@ __sysconf (int name) if (shape <= 0) return shape; - switch (name % 3) + switch ((name - _SC_LEVEL1_ICACHE_SIZE) % 3) { case 0: /* total size */ return shape & -0x100; diff --git a/ports/sysdeps/unix/sysv/linux/am33/bits/fcntl.h b/ports/sysdeps/unix/sysv/linux/am33/bits/fcntl.h index 9a95318..52d5bb7 100644 --- a/ports/sysdeps/unix/sysv/linux/am33/bits/fcntl.h +++ b/ports/sysdeps/unix/sysv/linux/am33/bits/fcntl.h @@ -179,3 +179,20 @@ struct flock64 # define POSIX_FADV_DONTNEED 4 /* Don't need these pages. */ # define POSIX_FADV_NOREUSE 5 /* Data will be accessed once. */ #endif + +/* Values for `*at' functions. */ +#ifdef __USE_ATFILE +# define AT_FDCWD -100 /* Special value used to indicate + the *at functions should use the + current working directory. */ +# define AT_SYMLINK_NOFOLLOW 0x100 /* Do not follow symbolic links. */ +# define AT_REMOVEDIR 0x200 /* Remove directory instead of + unlinking file. */ +# define AT_SYMLINK_FOLLOW 0x400 /* Follow symbolic links. */ +# define AT_NO_AUTOMOUNT 0x800 /* Suppress terminal automount + traversal. */ +# define AT_EACCESS 0x200 /* Test access permitted for + effective IDs, not real IDs. */ +#endif + + diff --git a/ports/sysdeps/unix/sysv/linux/arm/Makefile b/ports/sysdeps/unix/sysv/linux/arm/Makefile index d91b968..a981736 100644 --- a/ports/sysdeps/unix/sysv/linux/arm/Makefile +++ b/ports/sysdeps/unix/sysv/linux/arm/Makefile @@ -20,3 +20,7 @@ endif ifeq ($(subdir),resource) sysdep_routines += oldgetrlimit64 endif + +ifeq ($(subdir),stdlib) +gen-as-const-headers += ucontext_i.sym +endif diff --git a/ports/sysdeps/unix/sysv/linux/arm/____longjmp_chk.S b/ports/sysdeps/unix/sysv/linux/arm/____longjmp_chk.S index 2fa727d..bac2563 100644 --- a/ports/sysdeps/unix/sysv/linux/arm/____longjmp_chk.S +++ b/ports/sysdeps/unix/sysv/linux/arm/____longjmp_chk.S @@ -11,10 +11,10 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - You should have received a copy of the GNU General Public License - along with GCC; see the file COPYING. If not, write to the Free - Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA. */ + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ #include diff --git a/ports/sysdeps/unix/sysv/linux/arm/bits/fcntl.h b/ports/sysdeps/unix/sysv/linux/arm/bits/fcntl.h index 952ae05..a38d3f5 100644 --- a/ports/sysdeps/unix/sysv/linux/arm/bits/fcntl.h +++ b/ports/sysdeps/unix/sysv/linux/arm/bits/fcntl.h @@ -234,6 +234,21 @@ struct f_owner_ex # define SPLICE_F_GIFT 8 /* Pages passed in are a gift. */ #endif +/* Values for `*at' functions. */ +#ifdef __USE_ATFILE +# define AT_FDCWD -100 /* Special value used to indicate + the *at functions should use the + current working directory. */ +# define AT_SYMLINK_NOFOLLOW 0x100 /* Do not follow symbolic links. */ +# define AT_REMOVEDIR 0x200 /* Remove directory instead of + unlinking file. */ +# define AT_SYMLINK_FOLLOW 0x400 /* Follow symbolic links. */ +# define AT_NO_AUTOMOUNT 0x800 /* Suppress terminal automount + traversal. */ +# define AT_EACCESS 0x200 /* Test access permitted for + effective IDs, not real IDs. */ +#endif + __BEGIN_DECLS #ifdef __USE_GNU diff --git a/ports/sysdeps/unix/sysv/linux/arm/clone.S b/ports/sysdeps/unix/sysv/linux/arm/clone.S index 178b0f1..f3d6741 100644 --- a/ports/sysdeps/unix/sysv/linux/arm/clone.S +++ b/ports/sysdeps/unix/sysv/linux/arm/clone.S @@ -81,8 +81,11 @@ ENTRY(__clone) RETINSTR(, lr) cfi_startproc - cfi_undefined (lr) +PSEUDO_END (__clone) + 1: + .fnstart + .cantunwind #ifdef RESET_PID tst ip, #CLONE_THREAD bne 3f @@ -116,6 +119,6 @@ ENTRY(__clone) @ and we are done, passing the return value through r0 b PLTJMP(HIDDEN_JUMPTARGET(_exit)) -PSEUDO_END (__clone) + .fnend weak_alias (__clone, clone) diff --git a/ports/sysdeps/unix/sysv/linux/arm/dl-cache.h b/ports/sysdeps/unix/sysv/linux/arm/dl-cache.h new file mode 100644 index 0000000..e6280c2 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/arm/dl-cache.h @@ -0,0 +1,34 @@ +/* Support for reading /etc/ld.so.cache files written by Linux ldconfig. + Copyright (C) 2011 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Steve McIntyre + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include + +/* Redefine the cache ID for the new hf ABI; the sf ABI inverts the check. */ +#define _DL_CACHE_ARMHF_ID (FLAG_ARM_LIBHF | FLAG_ELF_LIBC6) + +#ifdef __ARM_PCS_VFP +#define _dl_cache_check_flags(flags) \ + ((flags) == _DL_CACHE_ARMHF_ID) +#else +#define _dl_cache_check_flags(flags) \ + ((flags) != _DL_CACHE_ARMHF_ID) +#endif + +#include_next diff --git a/ports/sysdeps/unix/sysv/linux/arm/eabi/____longjmp_chk.S b/ports/sysdeps/unix/sysv/linux/arm/eabi/____longjmp_chk.S index 423e777..9d8e464 100644 --- a/ports/sysdeps/unix/sysv/linux/arm/eabi/____longjmp_chk.S +++ b/ports/sysdeps/unix/sysv/linux/arm/eabi/____longjmp_chk.S @@ -11,10 +11,10 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - You should have received a copy of the GNU General Public License - along with GCC; see the file COPYING. If not, write to the Free - Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA. */ + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ #include @@ -52,13 +52,15 @@ longjmp_msg: cfi_remember_state; \ cmp sp, reg; \ bls .Lok; \ + str r7, [sp, #-4]!; \ + cfi_adjust_cfa_offset (4); \ + cfi_rel_offset (r7, 0); \ mov r5, r0; \ cfi_undefined (r5); \ mov r7, #SYS_ify(sigaltstack); \ - cfi_undefined (r7); \ mov r0, #0; \ - sub sp, sp, #16; /* >= sizeof (stack_t) */ \ - cfi_adjust_cfa_offset (16); \ + sub sp, sp, #12; /* == sizeof (stack_t) */ \ + cfi_adjust_cfa_offset (12); \ cfi_remember_state; \ mov r1, sp; \ swi #0; \ @@ -74,6 +76,11 @@ longjmp_msg: cmp r2, r3; \ bhi .Lok2; \ .Lfail: \ + add sp, sp, #12; \ + cfi_adjust_cfa_offset (-12); \ + ldr r7, [sp], #4; \ + cfi_adjust_cfa_offset (-4); \ + cfi_restore (r7); \ CALL_FAIL \ cfi_restore_state; \ .Lok2: \ diff --git a/ports/sysdeps/unix/sysv/linux/arm/eabi/getcontext.S b/ports/sysdeps/unix/sysv/linux/arm/eabi/getcontext.S new file mode 100644 index 0000000..435eb12 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/arm/eabi/getcontext.S @@ -0,0 +1,113 @@ +/* Copyright (C) 2012 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include + +#include "ucontext_i.h" + + .syntax unified + .text + +/* int getcontext (ucontext_t *ucp) */ + +ENTRY(__getcontext) + /* No need to save r0-r3, d0-d7, or d16-d31. */ + add r1, r0, #MCONTEXT_ARM_R4 + stmia r1, {r4-r11} + + /* Save R13 separately as Thumb can't STM it. */ + str r13, [r0, #MCONTEXT_ARM_SP] + str r14, [r0, #MCONTEXT_ARM_LR] + /* Return to LR */ + str r14, [r0, #MCONTEXT_ARM_PC] + /* Return zero */ + mov r2, #0 + str r2, [r0, #MCONTEXT_ARM_R0] + + /* Save ucontext_t * across the next call. */ + mov r4, r0 + + /* __sigprocmask(SIG_BLOCK, NULL, &(ucontext->uc_sigmask)) */ + mov r0, #SIG_BLOCK + mov r1, #0 + add r2, r4, #UCONTEXT_SIGMASK + bl PLTJMP(__sigprocmask) + + /* Store FP regs. Much of the FP code is copied from arm/eabi/setjmp.S. */ + +#ifdef PIC + ldr r2, 1f + ldr r1, Lrtld_global_ro +0: add r2, pc, r2 + ldr r2, [r2, r1] + ldr r2, [r2, #RTLD_GLOBAL_RO_DL_HWCAP_OFFSET] +#else + ldr r2, Lhwcap + ldr r2, [r2, #0] +#endif + + add r0, r4, #UCONTEXT_REGSPACE + + tst r2, #HWCAP_ARM_VFP + beq Lno_vfp + + /* Store the VFP registers. + Don't use VFP instructions directly because this code + is used in non-VFP multilibs. */ + /* Following instruction is vstmia r0!, {d8-d15}. */ + stc p11, cr8, [r0], #64 + /* Store the floating-point status register. */ + /* Following instruction is vmrs r1, fpscr. */ + mrc p10, 7, r1, cr1, cr0, 0 + str r1, [r0], #4 +Lno_vfp: + + tst r2, #HWCAP_ARM_IWMMXT + beq Lno_iwmmxt + + /* Save the call-preserved iWMMXt registers. */ + /* Following instructions are wstrd wr10, [r0], #8 (etc.) */ + stcl p1, cr10, [r0], #8 + stcl p1, cr11, [r0], #8 + stcl p1, cr12, [r0], #8 + stcl p1, cr13, [r0], #8 + stcl p1, cr14, [r0], #8 + stcl p1, cr15, [r0], #8 +Lno_iwmmxt: + + /* Restore the clobbered R4 and LR. */ + ldr r14, [r4, #MCONTEXT_ARM_LR] + ldr r4, [r4, #MCONTEXT_ARM_R4] + + mov r0, #0 + + DO_RET(r14) + +END(__getcontext) + +#ifdef PIC +1: .long _GLOBAL_OFFSET_TABLE_ - 0b - 8 +Lrtld_global_ro: + .long C_SYMBOL_NAME(_rtld_global_ro)(GOT) +#else +Lhwcap: + .long C_SYMBOL_NAME(_dl_hwcap) +#endif + + +weak_alias(__getcontext, getcontext) diff --git a/ports/sysdeps/unix/sysv/linux/arm/eabi/libc-do-syscall.S b/ports/sysdeps/unix/sysv/linux/arm/eabi/libc-do-syscall.S index d461712..0fca969 100644 --- a/ports/sysdeps/unix/sysv/linux/arm/eabi/libc-do-syscall.S +++ b/ports/sysdeps/unix/sysv/linux/arm/eabi/libc-do-syscall.S @@ -29,6 +29,9 @@ .syntax unified .hidden __libc_do_syscall +#undef CALL_MCOUNT +#define CALL_MCOUNT + ENTRY (__libc_do_syscall) .fnstart push {r7, lr} diff --git a/ports/sysdeps/unix/sysv/linux/arm/eabi/makecontext.c b/ports/sysdeps/unix/sysv/linux/arm/eabi/makecontext.c new file mode 100644 index 0000000..d6ae6f0 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/arm/eabi/makecontext.c @@ -0,0 +1,73 @@ +/* Copyright (C) 2012 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include + +/* Number of arguments that go in registers. */ +#define NREG_ARGS 4 + +/* Take a context previously prepared via getcontext() and set to + call func() with the given int only args. */ +void +__makecontext (ucontext_t *ucp, void (*func) (void), int argc, ...) +{ + extern void __startcontext (void); + unsigned long *funcstack; + va_list vl; + unsigned long *regptr; + unsigned int reg; + int misaligned; + + /* Start at the top of stack. */ + funcstack = (unsigned long *) (ucp->uc_stack.ss_sp + ucp->uc_stack.ss_size); + + /* Ensure the stack stays eight byte aligned. */ + misaligned = ((unsigned long) funcstack & 4) != 0; + + if ((argc > NREG_ARGS) && (argc & 1) != 0) + misaligned = !misaligned; + + if (misaligned) + funcstack -= 1; + + va_start (vl, argc); + + /* Reserve space for the on-stack arguments. */ + if (argc > NREG_ARGS) + funcstack -= (argc - NREG_ARGS); + + ucp->uc_mcontext.arm_sp = (unsigned long) funcstack; + ucp->uc_mcontext.arm_pc = (unsigned long) func; + + /* Exit to startcontext() with the next context in R4 */ + ucp->uc_mcontext.arm_r4 = (unsigned long) ucp->uc_link; + ucp->uc_mcontext.arm_lr = (unsigned long) __startcontext; + + /* The first four arguments go into registers. */ + regptr = &(ucp->uc_mcontext.arm_r0); + + for (reg = 0; (reg < argc) && (reg < NREG_ARGS); reg++) + *regptr++ = va_arg (vl, unsigned long); + + /* And the remainder on the stack. */ + for (; reg < argc; reg++) + *funcstack++ = va_arg (vl, unsigned long); + + va_end (vl); +} +weak_alias (__makecontext, makecontext) diff --git a/ports/sysdeps/unix/sysv/linux/arm/eabi/setcontext.S b/ports/sysdeps/unix/sysv/linux/arm/eabi/setcontext.S new file mode 100644 index 0000000..78003f5 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/arm/eabi/setcontext.S @@ -0,0 +1,101 @@ +/* Copyright (C) 2012 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include + +#include "ucontext_i.h" + + .syntax unified + .text + +/* int setcontext (const ucontext_t *ucp) */ + +ENTRY(__setcontext) + mov r4, r0 + add r0, r0, #UCONTEXT_REGSPACE + + /* Restore the VFP registers. Copied from arm/eabi/__longjmp.S. */ +#ifdef PIC + ldr r2, 1f + ldr r1, Lrtld_global_ro +0: add r2, pc, r2 + ldr r2, [r2, r1] + ldr r2, [r2, #RTLD_GLOBAL_RO_DL_HWCAP_OFFSET] +#else + ldr r2, Lhwcap + ldr r2, [r2, #0] +#endif + + tst r2, #HWCAP_ARM_VFP + beq Lno_vfp_sc + + /* Following instruction is vldmia r0!, {d8-d15}. */ + ldc p11, cr8, [r0], #64 + /* Restore the floating-point status register. */ + ldr r1, [r0], #4 + /* Following instruction is fmxr fpscr, r1. */ + mcr p10, 7, r1, cr1, cr0, 0 +Lno_vfp_sc: + tst r2, #HWCAP_ARM_IWMMXT + beq Lno_iwmmxt_sc + + /* Restore the call-preserved iWMMXt registers. */ + /* Following instructions are wldrd wr10, [r0], #8 (etc.) */ + ldcl p1, cr10, [r0], #8 + ldcl p1, cr11, [r0], #8 + ldcl p1, cr12, [r0], #8 + ldcl p1, cr13, [r0], #8 + ldcl p1, cr14, [r0], #8 + ldcl p1, cr15, [r0], #8 +Lno_iwmmxt_sc: + + /* Now bring back the signal status. */ + mov r0, #SIG_SETMASK + add r1, r4, #UCONTEXT_SIGMASK + mov r2, #0 + bl PLTJMP(__sigprocmask) + + /* Loading r0-r3 makes makecontext easier. */ + add r14, r4, #MCONTEXT_ARM_R0 + ldmia r14, {r0-r12} + ldr r13, [r14, #(MCONTEXT_ARM_SP - MCONTEXT_ARM_R0)] + add r14, r14, #(MCONTEXT_ARM_LR - MCONTEXT_ARM_R0) + ldmia r14, {r14, pc} + +END(setcontext) +weak_alias(__setcontext, setcontext) + + /* Called when a makecontext() context returns. Start the + context in R4 or fall through to exit(). */ +ENTRY(__startcontext) + movs r0, r4 + bne PLTJMP(__setcontext) + + @ New context was 0 - exit + b PLTJMP(_exit) +END(__startcontext) + +#ifdef PIC +1: .long _GLOBAL_OFFSET_TABLE_ - 0b - 8 +Lrtld_global_ro: + .long C_SYMBOL_NAME(_rtld_global_ro)(GOT) +#else +Lhwcap: + .long C_SYMBOL_NAME(_dl_hwcap) +#endif + diff --git a/ports/sysdeps/unix/sysv/linux/arm/eabi/swapcontext.S b/ports/sysdeps/unix/sysv/linux/arm/eabi/swapcontext.S new file mode 100644 index 0000000..09492d0 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/arm/eabi/swapcontext.S @@ -0,0 +1,63 @@ +/* Copyright (C) 2012 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include + +#include "ucontext_i.h" + + .syntax unified + .text + +/* int swapcontext (ucontext_t *oucp, const ucontext_t *ucp) */ + +ENTRY(swapcontext) + + /* Have getcontext() do most of the work then fix up + LR afterwards. Save R3 to keep the stack aligned. */ + push {r0,r1,r3,r14} + cfi_adjust_cfa_offset (16) + cfi_rel_offset (r0,0) + cfi_rel_offset (r1,4) + cfi_rel_offset (r3,8) + cfi_rel_offset (r14,12) + + bl __getcontext + mov r4, r0 + + pop {r0,r1,r3,r14} + cfi_adjust_cfa_offset (-16) + cfi_restore (r0) + cfi_restore (r1) + cfi_restore (r3) + cfi_restore (r14) + + /* Exit if getcontext() failed. */ + cmp r4, #0 + itt ne + movne r0, r4 + RETINSTR(ne, r14) + + /* Fix up LR and the PC. */ + str r13,[r0, #MCONTEXT_ARM_SP] + str r14,[r0, #MCONTEXT_ARM_LR] + str r14,[r0, #MCONTEXT_ARM_PC] + + /* And swap using swapcontext(). */ + mov r0, r1 + b __setcontext + +END(swapcontext) diff --git a/ports/sysdeps/unix/sysv/linux/arm/ioperm.c b/ports/sysdeps/unix/sysv/linux/arm/ioperm.c index 8af1ea3..08a12dd 100644 --- a/ports/sysdeps/unix/sysv/linux/arm/ioperm.c +++ b/ports/sysdeps/unix/sysv/linux/arm/ioperm.c @@ -95,19 +95,13 @@ static struct platform { * values. */ -/* The Linux kernel headers renamed this constant between 2.5.26 and - 2.5.27. It was backported to 2.4 between 2.4.22 and 2.4.23. */ -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,23) -# define BUS_ISA CTL_BUS_ISA -#endif - static int init_iosys (void) { char systype[256]; int i, n; - static int iobase_name[] = { CTL_BUS, BUS_ISA, BUS_ISA_PORT_BASE }; - static int ioshift_name[] = { CTL_BUS, BUS_ISA, BUS_ISA_PORT_SHIFT }; + static int iobase_name[] = { CTL_BUS, CTL_BUS_ISA, BUS_ISA_PORT_BASE }; + static int ioshift_name[] = { CTL_BUS, CTL_BUS_ISA, BUS_ISA_PORT_SHIFT }; size_t len = sizeof(io.base); if (! __sysctl (iobase_name, 3, &io.io_base, &len, NULL, 0) diff --git a/ports/sysdeps/unix/sysv/linux/arm/kernel-features.h b/ports/sysdeps/unix/sysv/linux/arm/kernel-features.h index 3996ae9..2fd70ae 100644 --- a/ports/sysdeps/unix/sysv/linux/arm/kernel-features.h +++ b/ports/sysdeps/unix/sysv/linux/arm/kernel-features.h @@ -57,6 +57,16 @@ # define __ASSUME_SIGNALFD4 1 #endif +/* Support for the recvmmsg syscall was added in 2.6.33. */ +#if __LINUX_KERNEL_VERSION >= 0x020621 +# define __ASSUME_RECVMMSG_SYSCALL 1 +#endif + +/* Support for the accept4 syscall was added in 2.6.36. */ +#if __LINUX_KERNEL_VERSION >= 0x020624 +# define __ASSUME_ACCEPT4_SYSCALL 1 +#endif + #include_next /* Support for pselect6, ppoll and epoll_pwait was added in 2.6.32. */ diff --git a/ports/sysdeps/unix/sysv/linux/arm/nptl/bits/atomic.h b/ports/sysdeps/unix/sysv/linux/arm/nptl/bits/atomic.h index 979db9f..612c113 100644 --- a/ports/sysdeps/unix/sysv/linux/arm/nptl/bits/atomic.h +++ b/ports/sysdeps/unix/sysv/linux/arm/nptl/bits/atomic.h @@ -17,7 +17,6 @@ 02111-1307 USA. */ #include -#include typedef int8_t atomic8_t; diff --git a/ports/sysdeps/unix/sysv/linux/arm/nptl/lowlevellock.h b/ports/sysdeps/unix/sysv/linux/arm/nptl/lowlevellock.h index e745e66..33af1a3 100644 --- a/ports/sysdeps/unix/sysv/linux/arm/nptl/lowlevellock.h +++ b/ports/sysdeps/unix/sysv/linux/arm/nptl/lowlevellock.h @@ -23,7 +23,6 @@ #include #include #include -#include #include #define FUTEX_WAIT 0 diff --git a/ports/sysdeps/unix/sysv/linux/arm/readelflib.c b/ports/sysdeps/unix/sysv/linux/arm/readelflib.c new file mode 100644 index 0000000..e234362 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/arm/readelflib.c @@ -0,0 +1,179 @@ +/* Copyright (C) 2011 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Steve McIntyre + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + + +int process_elf32_file (const char *file_name, const char *lib, int *flag, + unsigned int *osversion, char **soname, + void *file_contents, size_t file_length); + +/* Read an unsigned leb128 value from P, store the value in VAL, return + P incremented past the value. We assume that a word is large enough to + hold any value so encoded; if it is smaller than a pointer on some target, + pointers should not be leb128 encoded on that target. */ +static const unsigned char * +read_uleb128 (const unsigned char *p, unsigned long *val) +{ + unsigned int shift = 0; + unsigned char byte; + unsigned long result; + + result = 0; + do + { + byte = *p++; + result |= (byte & 0x7f) << shift; + shift += 7; + } + while (byte & 0x80); + + *val = result; + return p; +} + + +#define ATTR_TAG_FILE 1 +#define ABI_VFP_args 28 +#define VFP_ARGS_IN_VFP_REGS 1 + +/* Check the ABI in the ARM attributes. Search through the section + headers looking for the ARM attributes section, then check the + VFP_ARGS attribute. */ +static int is_library_hf(const char *file_name, void *file_contents, size_t file_length) +{ + unsigned int i; + ElfW(Ehdr) *ehdr = (ElfW(Ehdr) *) file_contents; + ElfW(Shdr) *shdrs; + + shdrs = file_contents + ehdr->e_shoff; + for (i = 0; i < ehdr->e_shnum; i++) + { + if (SHT_ARM_ATTRIBUTES == shdrs[i].sh_type) + { + /* We've found a likely section. Load the contents and + * check the tags */ + unsigned char *p = (unsigned char *)file_contents + shdrs[i].sh_offset; + unsigned char * end; + + /* Sanity-check the attribute section details. Make sure + * that it's the "aeabi" section, that's all we care + * about. */ + if (*p == 'A') + { + unsigned long len = shdrs[i].sh_size - 1; + unsigned long namelen; + p++; + + while (len > 0) + { + unsigned long section_len = p[0] | p[1] << 8 | p[2] << 16 | p[3] << 24; + if (section_len > len) + section_len = len; + + p += 4; + len -= section_len; + section_len -= 4; + + if (0 != strcmp((char *)p, "aeabi")) + { + p += section_len; + continue; + } + namelen = strlen((char *)p) + 1; + p += namelen; + section_len -= namelen; + + /* We're in a valid section. Walk through this + * section looking for the tag we care about + * (ABI_VFP_args) */ + while (section_len > 0) + { + unsigned long tag, val; + unsigned long size; + + end = p; + tag = (*p++); + + size = p[0] | p[1] << 8 | p[2] << 16 | p[3] << 24; + if (size > section_len) + size = section_len; + p += 4; + + section_len -= size; + end += size; + if (ATTR_TAG_FILE != tag) + { + /* ignore, we don't care */ + p = end; + continue; + } + while (p < end) + { + p = read_uleb128 (p, &tag); + /* Handle the different types of tag. */ + if ( (tag == 4) || (tag == 5) || (tag == 67) ) + { + /* Special cases for string values */ + namelen = strlen((char *)p) + 1; + p += namelen; + } + else + { + p = read_uleb128 (p, &val); + } + if ( (tag == ABI_VFP_args) && (val == VFP_ARGS_IN_VFP_REGS) ) + return 1; + } + } + } + } + } + } + return 0; +} + +/* Returns 0 if everything is ok, != 0 in case of error. */ +int +process_elf_file (const char *file_name, const char *lib, int *flag, + unsigned int *osversion, char **soname, void *file_contents, + size_t file_length) +{ + ElfW(Ehdr) *elf_header = (ElfW(Ehdr) *) file_contents; + int ret; + + /* Explicitly not coping with 64-bit yet... */ + if (elf_header->e_ident [EI_CLASS] != ELFCLASS32) + { + error (0, 0, _("%s is not 32-bit.\n"), file_name); + return 1; + } + ret = process_elf32_file (file_name, lib, flag, osversion, soname, + file_contents, file_length); + + if (!ret) + /* Do we have a hard-float ABI library? */ + if (is_library_hf(file_name, file_contents, file_length)) + *flag = FLAG_ARM_LIBHF|FLAG_ELF_LIBC6; + return ret; +} + +#undef __ELF_NATIVE_CLASS +#undef process_elf_file +#define process_elf_file process_elf32_file +#define __ELF_NATIVE_CLASS 32 +#include "elf/readelflib.c" diff --git a/ports/sysdeps/unix/sysv/linux/arm/sigaction.c b/ports/sysdeps/unix/sysv/linux/arm/sigaction.c index 707c0fa..10375c1 100644 --- a/ports/sysdeps/unix/sysv/linux/arm/sigaction.c +++ b/ports/sysdeps/unix/sysv/linux/arm/sigaction.c @@ -98,13 +98,8 @@ __libc_sigaction (sig, act, oact) memcpy (&kact.sa_mask, &act->sa_mask, sizeof (sigset_t)); kact.sa_flags = act->sa_flags; # ifdef HAVE_SA_RESTORER - if (kact.sa_flags & SA_RESTORER) - kact.sa_restorer = act->sa_restorer; - else - { - kact.sa_restorer = choose_restorer (kact.sa_flags); - kact.sa_flags |= SA_RESTORER; - } + kact.sa_restorer = choose_restorer (kact.sa_flags); + kact.sa_flags |= SA_RESTORER; # endif } @@ -144,13 +139,8 @@ __libc_sigaction (sig, act, oact) k_sigact.sa_mask = act->sa_mask.__val[0]; k_sigact.sa_flags = act->sa_flags; # ifdef HAVE_SA_RESTORER - if (k_sigact.sa_flags & SA_RESTORER) - k_sigact.sa_restorer = act->sa_restorer; - else - { - k_sigact.sa_restorer = choose_restorer (k_sigact.sa_flags); - k_sigact.sa_flags |= SA_RESTORER; - } + k_sigact.sa_restorer = choose_restorer (k_sigact.sa_flags); + k_sigact.sa_flags |= SA_RESTORER; # endif } result = INLINE_SYSCALL (sigaction, 3, sig, diff --git a/ports/sysdeps/unix/sysv/linux/arm/sys/ucontext.h b/ports/sysdeps/unix/sysv/linux/arm/sys/ucontext.h index 9ecff7b..9b4e434 100644 --- a/ports/sysdeps/unix/sysv/linux/arm/sys/ucontext.h +++ b/ports/sysdeps/unix/sysv/linux/arm/sys/ucontext.h @@ -23,7 +23,6 @@ #include #include -#include /* We need the signal context definitions even if they are not used included in . */ @@ -35,47 +34,64 @@ typedef int greg_t; #define NGREG 18 /* Container for all general registers. */ -typedef elf_gregset_t gregset_t; +typedef greg_t gregset_t[NGREG]; /* Number of each register is the `gregset_t' array. */ enum { - R0 = 0, -#define R0 R0 - R1 = 1, -#define R1 R1 - R2 = 2, -#define R2 R2 - R3 = 3, -#define R3 R3 - R4 = 4, -#define R4 R4 - R5 = 5, -#define R5 R5 - R6 = 6, -#define R6 R6 - R7 = 7, -#define R7 R7 - R8 = 8, -#define R8 R8 - R9 = 9, -#define R9 R9 - R10 = 10, -#define R10 R10 - R11 = 11, -#define R11 R11 - R12 = 12, -#define R12 R12 - R13 = 13, -#define R13 R13 - R14 = 14, -#define R14 R14 - R15 = 15 -#define R15 R15 + REG_R0 = 0, +#define REG_R0 REG_R0 + REG_R1 = 1, +#define REG_R1 REG_R1 + REG_R2 = 2, +#define REG_R2 REG_R2 + REG_R3 = 3, +#define REG_R3 REG_R3 + REG_R4 = 4, +#define REG_R4 REG_R4 + REG_R5 = 5, +#define REG_R5 REG_R5 + REG_R6 = 6, +#define REG_R6 REG_R6 + REG_R7 = 7, +#define REG_R7 REG_R7 + REG_R8 = 8, +#define REG_R8 REG_R8 + REG_R9 = 9, +#define REG_R9 REG_R9 + REG_R10 = 10, +#define REG_R10 REG_R10 + REG_R11 = 11, +#define REG_R11 REG_R11 + REG_R12 = 12, +#define REG_R12 REG_R12 + REG_R13 = 13, +#define REG_R13 REG_R13 + REG_R14 = 14, +#define REG_R14 REG_R14 + REG_R15 = 15 +#define REG_R15 REG_R15 }; +struct _libc_fpstate +{ + struct + { + unsigned int sign1:1; + unsigned int unused:15; + unsigned int sign2:1; + unsigned int exponent:14; + unsigned int j:1; + unsigned int mantissa1:31; + unsigned int mantissa0:32; + } fpregs[8]; + unsigned int fpsr:32; + unsigned int fpcr:32; + unsigned char ftype[8]; + unsigned int init_flag; +}; /* Structure to describe FPU registers. */ -typedef elf_fpregset_t fpregset_t; +typedef struct _libc_fpstate fpregset_t; /* Context to describe whole processor state. This only describes the core registers; coprocessor registers get saved elsewhere diff --git a/ports/sysdeps/unix/sysv/linux/arm/ucontext_i.sym b/ports/sysdeps/unix/sysv/linux/arm/ucontext_i.sym new file mode 100644 index 0000000..306292f --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/arm/ucontext_i.sym @@ -0,0 +1,30 @@ +#include +#include +#include +#include + +SIG_BLOCK +SIG_SETMASK + +-- Offsets of the fields in the ucontext_t structure. +#define ucontext(member) offsetof (ucontext_t, member) +#define mcontext(member) ucontext (uc_mcontext.member) + +UCONTEXT_FLAGS ucontext (uc_flags) +UCONTEXT_LINK ucontext (uc_link) +UCONTEXT_STACK ucontext (uc_stack) +UCONTEXT_MCONTEXT ucontext (uc_mcontext) +UCONTEXT_SIGMASK ucontext (uc_sigmask) + +UCONTEXT_REGSPACE ucontext (uc_regspace) + +MCONTEXT_TRAP_NO mcontext (trap_no) +MCONTEXT_ERROR_CODE mcontext (error_code) +MCONTEXT_OLDMASK mcontext (oldmask) +MCONTEXT_ARM_R0 mcontext (arm_r0) +MCONTEXT_ARM_R4 mcontext (arm_r4) +MCONTEXT_ARM_SP mcontext (arm_sp) +MCONTEXT_ARM_LR mcontext (arm_lr) +MCONTEXT_ARM_PC mcontext (arm_pc) +MCONTEXT_ARM_CPSR mcontext (arm_cpsr) +MCONTEXT_FAULT_ADDRESS mcontext (fault_address) diff --git a/ports/sysdeps/unix/sysv/linux/cris/bits/fcntl.h b/ports/sysdeps/unix/sysv/linux/cris/bits/fcntl.h index e14ca25..dcdc884 100644 --- a/ports/sysdeps/unix/sysv/linux/cris/bits/fcntl.h +++ b/ports/sysdeps/unix/sysv/linux/cris/bits/fcntl.h @@ -182,6 +182,21 @@ struct flock64 # define POSIX_FADV_NOREUSE 5 /* Data will be accessed once. */ #endif +/* Values for `*at' functions. */ +#ifdef __USE_ATFILE +# define AT_FDCWD -100 /* Special value used to indicate + the *at functions should use the + current working directory. */ +# define AT_SYMLINK_NOFOLLOW 0x100 /* Do not follow symbolic links. */ +# define AT_REMOVEDIR 0x200 /* Remove directory instead of + unlinking file. */ +# define AT_SYMLINK_FOLLOW 0x400 /* Follow symbolic links. */ +# define AT_NO_AUTOMOUNT 0x800 /* Suppress terminal automount + traversal. */ +# define AT_EACCESS 0x200 /* Test access permitted for + effective IDs, not real IDs. */ +#endif + __BEGIN_DECLS /* Provide kernel hint to read ahead. */ diff --git a/ports/sysdeps/unix/sysv/linux/hppa/____longjmp_chk.S b/ports/sysdeps/unix/sysv/linux/hppa/____longjmp_chk.S new file mode 100644 index 0000000..588f275 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/hppa/____longjmp_chk.S @@ -0,0 +1,7 @@ +/* Jump to the position specified by ENV, causing the + setjmp call there to return VAL, or 1 if VAL is 0. + void __longjmp (__jmp_buf env, int val). */ + +#warning longjmp_chk unimplemented +#define __longjmp ____longjmp_chk +#include<__longjmp.S> diff --git a/ports/sysdeps/unix/sysv/linux/hppa/bits/fcntl.h b/ports/sysdeps/unix/sysv/linux/hppa/bits/fcntl.h index a2c6482..123fd9b 100644 --- a/ports/sysdeps/unix/sysv/linux/hppa/bits/fcntl.h +++ b/ports/sysdeps/unix/sysv/linux/hppa/bits/fcntl.h @@ -46,13 +46,15 @@ #define O_ASYNC 020000 #define O_BLKSEEK 00000100 /* HPUX only */ -#ifdef __USE_GNU -# define O_DIRECT 000040000 /* Direct disk access. */ +#ifdef __USE_XOPEN2K8 # define O_DIRECTORY 000010000 /* Must be a directory. */ # define O_NOFOLLOW 000000200 /* Do not follow links. */ -# define O_NOATIME 004000000 /* Do not set atime. */ # define O_CLOEXEC 010000000 /* Set close_on_exec. */ #endif +#ifdef __USE_GNU +# define O_DIRECT 000040000 /* Direct disk access. */ +# define O_NOATIME 004000000 /* Do not set atime. */ +#endif /* For now Linux has synchronisity options for data and read operations. We define the symbols here but let them do the same as O_SYNC since @@ -85,7 +87,7 @@ #define F_SETLK64 9 /* Set record locking info (non-blocking). */ #define F_SETLKW64 10 /* Set record locking info (blocking). */ -#if defined __USE_BSD || defined __USE_UNIX98 +#if defined __USE_BSD || defined __USE_UNIX98 || defined __USE_XOPEN2K8 # define F_GETOWN 11 /* Get owner of socket (receiver of SIGIO). */ # define F_SETOWN 12 /* Set owner of socket (receiver of SIGIO). */ #endif @@ -101,6 +103,10 @@ # define F_SETLEASE 1024 /* Set a lease. */ # define F_GETLEASE 1025 /* Enquire what lease is active. */ # define F_NOTIFY 1026 /* Request notfications on a directory. */ +# define F_SETPIPE_SZ 1031 /* Set pipe page size array. */ +# define F_GETPIPE_SZ 1032 /* Set pipe page size array. */ +#endif +#ifdef __USE_XOPEN2K8 # define F_DUPFD_CLOEXEC 1030 /* Duplicate file descriptor with close-on-exit set. */ #endif @@ -229,6 +235,21 @@ struct f_owner_ex # define SPLICE_F_GIFT 8 /* Pages passed in are a gift. */ #endif +/* Values for `*at' functions. */ +#ifdef __USE_ATFILE +# define AT_FDCWD -100 /* Special value used to indicate + the *at functions should use the + current working directory. */ +# define AT_SYMLINK_NOFOLLOW 0x100 /* Do not follow symbolic links. */ +# define AT_REMOVEDIR 0x200 /* Remove directory instead of + unlinking file. */ +# define AT_SYMLINK_FOLLOW 0x400 /* Follow symbolic links. */ +# define AT_NO_AUTOMOUNT 0x800 /* Suppress terminal automount + traversal. */ +# define AT_EACCESS 0x200 /* Test access permitted for + effective IDs, not real IDs. */ +#endif + __BEGIN_DECLS #ifdef __USE_GNU diff --git a/ports/sysdeps/unix/sysv/linux/hppa/kernel-features.h b/ports/sysdeps/unix/sysv/linux/hppa/kernel-features.h index e29f6e0..f384ad7 100644 --- a/ports/sysdeps/unix/sysv/linux/hppa/kernel-features.h +++ b/ports/sysdeps/unix/sysv/linux/hppa/kernel-features.h @@ -36,4 +36,10 @@ # define __ASSUME_LWS_CAS 1 #endif +/* Support for the accept4 and recvmmsg syscalls was added in 2.6.34. */ +#if __LINUX_KERNEL_VERSION >= 0x020622 +# define __ASSUME_ACCEPT4_SYSCALL 1 +# define __ASSUME_RECVMMSG_SYSCALL 1 +#endif + #include_next diff --git a/ports/sysdeps/unix/sysv/linux/hppa/linuxthreads/lowlevellock.h b/ports/sysdeps/unix/sysv/linux/hppa/linuxthreads/lowlevellock.h new file mode 100644 index 0000000..3b2b0f1 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/hppa/linuxthreads/lowlevellock.h @@ -0,0 +1,298 @@ +/* Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#ifndef _LOWLEVELLOCK_H +#define _LOWLEVELLOCK_H 1 + +#include +#include +#include +#include +#include + +/* The hppa only has one atomic read and modify memory operation, + load and clear, so hppa uses a kernel helper routine to implement + compare_and_exchange. See atomic.h for the userspace calling + sequence. */ + +#define FUTEX_WAIT 0 +#define FUTEX_WAKE 1 +#define FUTEX_REQUEUE 3 +#define FUTEX_CMP_REQUEUE 4 +#define FUTEX_WAKE_OP 5 +#define FUTEX_OP_CLEAR_WAKE_IF_GT_ONE ((4 << 24) | 1) +#define FUTEX_LOCK_PI 6 +#define FUTEX_UNLOCK_PI 7 +#define FUTEX_TRYLOCK_PI 8 + +/* Initialize locks to zero. */ +#define LLL_MUTEX_LOCK_INITIALIZER (0) + + +/* Type for lock object. */ +typedef int lll_lock_t; + + +#define lll_futex_wait(futexp, val) \ + ({ \ + INTERNAL_SYSCALL_DECL (__err); \ + long int __ret; \ + __ret = INTERNAL_SYSCALL (futex, __err, 4, \ + (futexp), FUTEX_WAIT, (val), 0); \ + __ret; \ + }) + +#define lll_futex_timed_wait(futexp, val, timespec) \ + ({ \ + INTERNAL_SYSCALL_DECL (__err); \ + long int __ret; \ + __ret = INTERNAL_SYSCALL (futex, __err, 4, \ + (futexp), FUTEX_WAIT, (val), (timespec)); \ + __ret; \ + }) + +#define lll_futex_wake(futexp, nr) \ + ({ \ + INTERNAL_SYSCALL_DECL (__err); \ + long int __ret; \ + __ret = INTERNAL_SYSCALL (futex, __err, 4, \ + (futexp), FUTEX_WAKE, (nr), 0); \ + __ret; \ + }) + +#define lll_robust_mutex_dead(futexv) \ + do \ + { \ + int *__futexp = &(futexv); \ + atomic_or (__futexp, FUTEX_OWNER_DIED); \ + lll_futex_wake (__futexp, 1); \ + } \ + while (0) + +/* Returns non-zero if error happened, zero if success. */ +#define lll_futex_requeue(futexp, nr_wake, nr_move, mutex, val) \ + ({ \ + INTERNAL_SYSCALL_DECL (__err); \ + long int __ret; \ + __ret = INTERNAL_SYSCALL (futex, __err, 6, \ + (futexp), FUTEX_CMP_REQUEUE, (nr_wake), \ + (nr_move), (mutex), (val)); \ + __ret; \ + }) + +/* Returns non-zero if error happened, zero if success. */ +#define lll_futex_wake_unlock(futexp, nr_wake, nr_wake2, futexp2) \ + ({ \ + INTERNAL_SYSCALL_DECL (__err); \ + long int __ret; \ + __ret = INTERNAL_SYSCALL (futex, __err, 6, \ + (futexp), FUTEX_WAKE_OP, (nr_wake), \ + (nr_wake2), (futexp2), \ + FUTEX_OP_CLEAR_WAKE_IF_GT_ONE); \ + __ret; \ + }) + +static inline int __attribute__((always_inline)) +__lll_mutex_trylock(lll_lock_t *futex) +{ + return atomic_compare_and_exchange_val_acq (futex, 1, 0) != 0; +} +#define lll_mutex_trylock(lock) __lll_mutex_trylock (&(lock)) + +static inline int __attribute__((always_inline)) +__lll_robust_mutex_trylock(int *futex, int id) +{ + return atomic_compare_and_exchange_val_acq (futex, id, 0) != 0; +} +#define lll_robust_mutex_trylock(lock, id) \ + __lll_robust_mutex_trylock (&(lock), id) + + +static inline int __attribute__((always_inline)) +__lll_mutex_cond_trylock(lll_lock_t *futex) +{ + return atomic_compare_and_exchange_val_acq (futex, 2, 0) != 0; +} +#define lll_mutex_cond_trylock(lock) __lll_mutex_cond_trylock (&(lock)) + + +extern void __lll_lock_wait (lll_lock_t *futex) attribute_hidden; + +static inline void __attribute__((always_inline)) +__lll_mutex_lock(lll_lock_t *futex) +{ + if (atomic_compare_and_exchange_bool_acq (futex, 1, 0) != 0) + __lll_lock_wait (futex); +} +#define lll_mutex_lock(futex) __lll_mutex_lock (&(futex)) + +extern int __lll_robust_lock_wait (int *futex) attribute_hidden; + +static inline int __attribute__ ((always_inline)) +__lll_robust_mutex_lock (int *futex, int id) +{ + int result = 0; + if (atomic_compare_and_exchange_bool_acq (futex, id, 0) != 0) + result = __lll_robust_lock_wait (futex); + return result; +} +#define lll_robust_mutex_lock(futex, id) \ + __lll_robust_mutex_lock (&(futex), id) + +static inline void __attribute__ ((always_inline)) +__lll_mutex_cond_lock (lll_lock_t *futex) +{ + if (atomic_compare_and_exchange_bool_acq (futex, 2, 0) != 0) + __lll_lock_wait (futex); +} +#define lll_mutex_cond_lock(futex) __lll_mutex_cond_lock (&(futex)) + + +#define lll_robust_mutex_cond_lock(futex, id) \ + __lll_robust_mutex_lock (&(futex), (id) | FUTEX_WAITERS) + + +extern int __lll_timedlock_wait (lll_lock_t *futex, const struct timespec *) + attribute_hidden; +extern int __lll_robust_timedlock_wait (int *futex, const struct timespec *) + attribute_hidden; + +static inline int __attribute__ ((always_inline)) +__lll_mutex_timedlock (lll_lock_t *futex, const struct timespec *abstime) +{ + int result = 0; + if (atomic_compare_and_exchange_bool_acq (futex, 1, 0) != 0) + result = __lll_timedlock_wait (futex, abstime); + return result; +} +#define lll_mutex_timedlock(futex, abstime) \ + __lll_mutex_timedlock (&(futex), abstime) + +static inline int __attribute__ ((always_inline)) +__lll_robust_mutex_timedlock (int *futex, const struct timespec *abstime, + int id) +{ + int result = 0; + if (atomic_compare_and_exchange_bool_acq (futex, id, 0) != 0) + result = __lll_robust_timedlock_wait (futex, abstime); + return result; +} +#define lll_robust_mutex_timedlock(futex, abstime, id) \ + __lll_robust_mutex_timedlock (&(futex), abstime, id) + + +static inline void __attribute__ ((always_inline)) +__lll_mutex_unlock (lll_lock_t *futex) +{ + int val = atomic_exchange_rel (futex, 0); + if (__builtin_expect (val > 1, 0)) + lll_futex_wake (futex, 1); +} +#define lll_mutex_unlock(futex) __lll_mutex_unlock(&(futex)) + + +static inline void __attribute__ ((always_inline)) +__lll_robust_mutex_unlock (int *futex, int mask) +{ + int val = atomic_exchange_rel (futex, 0); + if (__builtin_expect (val & mask, 0)) + lll_futex_wake (futex, 1); +} +#define lll_robust_mutex_unlock(futex) \ + __lll_robust_mutex_unlock(&(futex), FUTEX_WAITERS) + + +static inline void __attribute__ ((always_inline)) +__lll_mutex_unlock_force (lll_lock_t *futex) +{ + (void) atomic_exchange_rel (futex, 0); + lll_futex_wake (futex, 1); +} +#define lll_mutex_unlock_force(futex) __lll_mutex_unlock_force(&(futex)) + +#define lll_mutex_islocked(futex) \ + (futex != 0) + +/* Our internal lock implementation is identical to the binary-compatible + mutex implementation. */ + +#define LLL_LOCK_INITIALIZER (0) +#define LLL_LOCK_INITIALIZER_CONST (0) +#define LLL_LOCK_INITIALIZER_LOCKED (1) + + +#define THREAD_INIT_LOCK(PD, LOCK) \ + (PD)->LOCK = LLL_LOCK_INITIALIZER + +extern int lll_unlock_wake_cb (lll_lock_t *__futex) attribute_hidden; + +/* The states of a lock are: + 0 - untaken + 1 - taken by one user + >1 - taken by more users */ + +#define lll_trylock(lock) lll_mutex_trylock (lock) +#define lll_lock(lock) lll_mutex_lock (lock) +#define lll_unlock(lock) lll_mutex_unlock (lock) +#define lll_islocked(lock) lll_mutex_islocked (lock) + +/* The kernel notifies a process which uses CLONE_CLEARTID via futex + wakeup when the clone terminates. The memory location contains the + thread ID while the clone is running and is reset to zero + afterwards. */ +#define lll_wait_tid(tid) \ + do { \ + __typeof (tid) __tid; \ + while ((__tid = (tid)) != 0) \ + lll_futex_wait (&(tid), __tid); \ + } while (0) + +extern int __lll_timedwait_tid (int *, const struct timespec *) + attribute_hidden; + +#define lll_timedwait_tid(tid, abstime) \ + ({ \ + int __res = 0; \ + if ((tid) != 0) \ + __res = __lll_timedwait_tid (&(tid), (abstime)); \ + __res; \ + }) + + +/* Conditional variable handling. */ + +extern void __lll_cond_wait (pthread_cond_t *cond) + attribute_hidden; +extern int __lll_cond_timedwait (pthread_cond_t *cond, + const struct timespec *abstime) + attribute_hidden; +extern void __lll_cond_wake (pthread_cond_t *cond) + attribute_hidden; +extern void __lll_cond_broadcast (pthread_cond_t *cond) + attribute_hidden; + +#define lll_cond_wait(cond) \ + __lll_cond_wait (cond) +#define lll_cond_timedwait(cond, abstime) \ + __lll_cond_timedwait (cond, abstime) +#define lll_cond_wake(cond) \ + __lll_cond_wake (cond) +#define lll_cond_broadcast(cond) \ + __lll_cond_broadcast (cond) + +#endif /* lowlevellock.h */ diff --git a/ports/sysdeps/unix/sysv/linux/hppa/linuxthreads/sysdep-cancel.h b/ports/sysdeps/unix/sysv/linux/hppa/linuxthreads/sysdep-cancel.h index 51d6cf3..c5a3aba 100644 --- a/ports/sysdeps/unix/sysv/linux/hppa/linuxthreads/sysdep-cancel.h +++ b/ports/sysdeps/unix/sysv/linux/hppa/linuxthreads/sysdep-cancel.h @@ -240,3 +240,10 @@ L(stp): ASM_LINE_SEP #endif /* !defined NOT_IN_libc || defined IS_IN_libpthread */ + +#ifndef __ASSEMBLER__ +# define RTLD_SINGLE_THREAD_P \ + __builtin_expect (THREAD_GETMEM (THREAD_SELF, \ + p_multiple_threads) == 0, 1) +#endif + diff --git a/ports/sysdeps/unix/sysv/linux/hppa/nptl/lowlevellock.c b/ports/sysdeps/unix/sysv/linux/hppa/nptl/lowlevellock.c index 9c49640..520e347 100644 --- a/ports/sysdeps/unix/sysv/linux/hppa/nptl/lowlevellock.c +++ b/ports/sysdeps/unix/sysv/linux/hppa/nptl/lowlevellock.c @@ -22,6 +22,7 @@ #include #include #include +#include /* Need THREAD_*, and header.*. */ void __lll_lock_wait (lll_lock_t *futex, int private) diff --git a/ports/sysdeps/unix/sysv/linux/hppa/nptl/lowlevellock.h b/ports/sysdeps/unix/sysv/linux/hppa/nptl/lowlevellock.h index b6f6923..461b377 100644 --- a/ports/sysdeps/unix/sysv/linux/hppa/nptl/lowlevellock.h +++ b/ports/sysdeps/unix/sysv/linux/hppa/nptl/lowlevellock.h @@ -22,10 +22,8 @@ #include #include #include -#include #include #include /* Need __ASSUME_PRIVATE_FUTEX. */ -#include /* Need THREAD_*, and header.*. */ /* HPPA only has one atomic read and modify memory operation, load and clear, so hppa uses a kernel helper routine to implement @@ -290,18 +288,20 @@ __lll_robust_timedlock (int *futex, const struct timespec *abstime, __lll_robust_timedlock (&(futex), abstime, id, private) #define __lll_unlock(futex, private) \ - (void) \ - ({ int val = atomic_exchange_rel (futex, 0); \ - if (__builtin_expect (val > 1, 0)) \ - lll_futex_wake (futex, 1, private); \ + (void) \ + ({ int *__futex = (futex); \ + int val = atomic_exchange_rel (__futex, 0); \ + if (__builtin_expect (val > 1, 0)) \ + lll_futex_wake (__futex, 1, private); \ }) #define lll_unlock(futex, private) __lll_unlock(&(futex), private) #define __lll_robust_unlock(futex,private) \ - (void) \ - ({ int val = atomic_exchange_rel (futex, 0); \ - if (__builtin_expect (val & FUTEX_WAITERS, 0)) \ - lll_futex_wake (futex, 1, private); \ + (void) \ + ({ int *__futex = (futex); \ + int val = atomic_exchange_rel (__futex, 0); \ + if (__builtin_expect (val & FUTEX_WAITERS, 0)) \ + lll_futex_wake (__futex, 1, private); \ }) #define lll_robust_unlock(futex, private) \ __lll_robust_unlock(&(futex), private) diff --git a/ports/sysdeps/unix/sysv/linux/hppa/nptl/sysdep-cancel.h b/ports/sysdeps/unix/sysv/linux/hppa/nptl/sysdep-cancel.h index 6cffa76..46522ad 100644 --- a/ports/sysdeps/unix/sysv/linux/hppa/nptl/sysdep-cancel.h +++ b/ports/sysdeps/unix/sysv/linux/hppa/nptl/sysdep-cancel.h @@ -61,11 +61,53 @@ # undef PSEUDO # define PSEUDO(name, syscall_name, args) \ + ENTRY (__##syscall_name##_nocancel) \ + DOARGS_##args ASM_LINE_SEP \ + stwm TREG, 64(%sp) ASM_LINE_SEP \ + .cfi_offset TREG, 0 ASM_LINE_SEP \ + .cfi_adjust_cfa_offset 64 ASM_LINE_SEP \ + stw %sp, -4(%sp) ASM_LINE_SEP \ + .cfi_offset 30, -4 ASM_LINE_SEP \ + stw %r19, -32(%sp) ASM_LINE_SEP \ + .cfi_offset 19, -32 ASM_LINE_SEP \ + /* Save r19 */ ASM_LINE_SEP \ + SAVE_PIC(TREG) ASM_LINE_SEP \ + /* Do syscall, delay loads # */ ASM_LINE_SEP \ + ble 0x100(%sr2,%r0) ASM_LINE_SEP \ + ldi SYS_ify (syscall_name), %r20 /* delay */ ASM_LINE_SEP \ + ldi NO_ERROR,%r1 ASM_LINE_SEP \ + cmpb,>>=,n %r1,%ret0,L(pre_nc_end) ASM_LINE_SEP \ + /* Restore r19 from TREG */ ASM_LINE_SEP \ + LOAD_PIC(TREG) /* delay */ ASM_LINE_SEP \ + SYSCALL_ERROR_HANDLER ASM_LINE_SEP \ + /* Use TREG for temp storage */ ASM_LINE_SEP \ + copy %ret0, TREG /* delay */ ASM_LINE_SEP \ + /* OPTIMIZE: Don't reload r19 */ ASM_LINE_SEP \ + /* do a -1*syscall_ret0 */ ASM_LINE_SEP \ + sub %r0, TREG, TREG ASM_LINE_SEP \ + /* Store into errno location */ ASM_LINE_SEP \ + stw TREG, 0(%sr0,%ret0) ASM_LINE_SEP \ + /* return -1 as error */ ASM_LINE_SEP \ + ldi -1, %ret0 ASM_LINE_SEP \ +L(pre_nc_end): ASM_LINE_SEP \ + /* No need to LOAD_PIC */ ASM_LINE_SEP \ + /* Undo frame */ ASM_LINE_SEP \ + ldwm -64(%sp),TREG ASM_LINE_SEP \ + .cfi_adjust_cfa_offset -64 ASM_LINE_SEP \ + /* Restore rp before exit */ ASM_LINE_SEP \ + ldw -20(%sp), %rp ASM_LINE_SEP \ + .cfi_restore 2 ASM_LINE_SEP \ + ret ASM_LINE_SEP \ + END(__##syscall_name##_nocancel) ASM_LINE_SEP \ + /**********************************************/ASM_LINE_SEP \ ENTRY (name) \ DOARGS_##args ASM_LINE_SEP \ stwm TREG, 64(%sp) ASM_LINE_SEP \ + .cfi_adjust_cfa_offset 64 ASM_LINE_SEP \ stw %sp, -4(%sp) ASM_LINE_SEP \ + .cfi_offset 30, -4 ASM_LINE_SEP \ stw %r19, -32(%sp) ASM_LINE_SEP \ + .cfi_offset 19, -32 ASM_LINE_SEP \ /* Done setting up frame, continue... */ ASM_LINE_SEP \ SINGLE_THREAD_P ASM_LINE_SEP \ cmpib,<>,n 0,%ret0,L(pseudo_cancel) ASM_LINE_SEP \ @@ -128,26 +170,40 @@ L(pre_end): ASM_LINE_SEP \ /* No need to LOAD_PIC */ ASM_LINE_SEP \ /* Undo frame */ ASM_LINE_SEP \ ldwm -64(%sp),TREG ASM_LINE_SEP \ + .cfi_adjust_cfa_offset -64 ASM_LINE_SEP \ /* Restore rp before exit */ ASM_LINE_SEP \ - ldw -20(%sp), %rp ASM_LINE_SEP + ldw -20(%sp), %rp ASM_LINE_SEP \ + .cfi_restore 2 ASM_LINE_SEP /* Save arguments into our frame */ # define PUSHARGS_0 /* nothing to do */ -# define PUSHARGS_1 PUSHARGS_0 stw %r26, -36(%sr0,%sp) ASM_LINE_SEP -# define PUSHARGS_2 PUSHARGS_1 stw %r25, -40(%sr0,%sp) ASM_LINE_SEP -# define PUSHARGS_3 PUSHARGS_2 stw %r24, -44(%sr0,%sp) ASM_LINE_SEP -# define PUSHARGS_4 PUSHARGS_3 stw %r23, -48(%sr0,%sp) ASM_LINE_SEP -# define PUSHARGS_5 PUSHARGS_4 stw %r22, -52(%sr0,%sp) ASM_LINE_SEP -# define PUSHARGS_6 PUSHARGS_5 stw %r21, -56(%sr0,%sp) ASM_LINE_SEP +# define PUSHARGS_1 PUSHARGS_0 stw %r26, -36(%sr0,%sp) ASM_LINE_SEP \ + .cfi_offset 26, -36 ASM_LINE_SEP +# define PUSHARGS_2 PUSHARGS_1 stw %r25, -40(%sr0,%sp) ASM_LINE_SEP \ + .cfi_offset 25, -40 ASM_LINE_SEP +# define PUSHARGS_3 PUSHARGS_2 stw %r24, -44(%sr0,%sp) ASM_LINE_SEP \ + .cfi_offset 24, -44 ASM_LINE_SEP +# define PUSHARGS_4 PUSHARGS_3 stw %r23, -48(%sr0,%sp) ASM_LINE_SEP \ + .cfi_offset 23, -48 ASM_LINE_SEP +# define PUSHARGS_5 PUSHARGS_4 stw %r22, -52(%sr0,%sp) ASM_LINE_SEP \ + .cfi_offset 22, -52 ASM_LINE_SEP +# define PUSHARGS_6 PUSHARGS_5 stw %r21, -56(%sr0,%sp) ASM_LINE_SEP \ + .cfi_offset 21, -56 ASM_LINE_SEP /* Bring them back from the stack */ # define POPARGS_0 /* nothing to do */ -# define POPARGS_1 POPARGS_0 ldw -36(%sr0,%sp), %r26 ASM_LINE_SEP -# define POPARGS_2 POPARGS_1 ldw -40(%sr0,%sp), %r25 ASM_LINE_SEP -# define POPARGS_3 POPARGS_2 ldw -44(%sr0,%sp), %r24 ASM_LINE_SEP -# define POPARGS_4 POPARGS_3 ldw -48(%sr0,%sp), %r23 ASM_LINE_SEP -# define POPARGS_5 POPARGS_4 ldw -52(%sr0,%sp), %r22 ASM_LINE_SEP -# define POPARGS_6 POPARGS_5 ldw -56(%sr0,%sp), %r21 ASM_LINE_SEP +# define POPARGS_1 POPARGS_0 ldw -36(%sr0,%sp), %r26 ASM_LINE_SEP \ + .cfi_restore 26 ASM_LINE_SEP +# define POPARGS_2 POPARGS_1 ldw -40(%sr0,%sp), %r25 ASM_LINE_SEP \ + .cfi_restore 25 ASM_LINE_SEP +# define POPARGS_3 POPARGS_2 ldw -44(%sr0,%sp), %r24 ASM_LINE_SEP \ + .cfi_restore 24 ASM_LINE_SEP +# define POPARGS_4 POPARGS_3 ldw -48(%sr0,%sp), %r23 ASM_LINE_SEP \ + .cfi_restore 23 ASM_LINE_SEP +# define POPARGS_5 POPARGS_4 ldw -52(%sr0,%sp), %r22 ASM_LINE_SEP \ + .cfi_restore 22 ASM_LINE_SEP +# define POPARGS_6 POPARGS_5 ldw -56(%sr0,%sp), %r21 ASM_LINE_SEP \ + .cfi_restore 21 ASM_LINE_SEP # ifdef IS_IN_libpthread # ifdef PIC diff --git a/ports/sysdeps/unix/sysv/linux/hppa/sys/epoll.h b/ports/sysdeps/unix/sysv/linux/hppa/sys/epoll.h new file mode 100644 index 0000000..03378e5 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/hppa/sys/epoll.h @@ -0,0 +1,144 @@ +/* Copyright (C) 2002-2006, 2007, 2008, 2009 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#ifndef _SYS_EPOLL_H +#define _SYS_EPOLL_H 1 + +#include +#include + +/* Get __sigset_t. */ +#include + +#ifndef __sigset_t_defined +# define __sigset_t_defined +typedef __sigset_t sigset_t; +#endif + + +/* Flags to be passed to epoll_create1. */ +enum + { + EPOLL_CLOEXEC = 010000000, +#define EPOLL_CLOEXEC EPOLL_CLOEXEC + EPOLL_NONBLOCK = 00200004 /* HPUX has separate NDELAY & NONBLOCK */ +#define EPOLL_NONBLOCK EPOLL_NONBLOCK + }; + + +enum EPOLL_EVENTS + { + EPOLLIN = 0x001, +#define EPOLLIN EPOLLIN + EPOLLPRI = 0x002, +#define EPOLLPRI EPOLLPRI + EPOLLOUT = 0x004, +#define EPOLLOUT EPOLLOUT + EPOLLRDNORM = 0x040, +#define EPOLLRDNORM EPOLLRDNORM + EPOLLRDBAND = 0x080, +#define EPOLLRDBAND EPOLLRDBAND + EPOLLWRNORM = 0x100, +#define EPOLLWRNORM EPOLLWRNORM + EPOLLWRBAND = 0x200, +#define EPOLLWRBAND EPOLLWRBAND + EPOLLMSG = 0x400, +#define EPOLLMSG EPOLLMSG + EPOLLERR = 0x008, +#define EPOLLERR EPOLLERR + EPOLLHUP = 0x010, +#define EPOLLHUP EPOLLHUP + EPOLLRDHUP = 0x2000, +#define EPOLLRDHUP EPOLLRDHUP + EPOLLONESHOT = 1u << 30, +#define EPOLLONESHOT EPOLLONESHOT + EPOLLET = 1u << 31 +#define EPOLLET EPOLLET + }; + + +/* Valid opcodes ( "op" parameter ) to issue to epoll_ctl(). */ +#define EPOLL_CTL_ADD 1 /* Add a file descriptor to the interface. */ +#define EPOLL_CTL_DEL 2 /* Remove a file descriptor from the interface. */ +#define EPOLL_CTL_MOD 3 /* Change file descriptor epoll_event structure. */ + + +typedef union epoll_data +{ + void *ptr; + int fd; + uint32_t u32; + uint64_t u64; +} epoll_data_t; + +struct epoll_event +{ + uint32_t events; /* Epoll events */ + epoll_data_t data; /* User data variable */ +}; + + +__BEGIN_DECLS + +/* Creates an epoll instance. Returns an fd for the new instance. + The "size" parameter is a hint specifying the number of file + descriptors to be associated with the new instance. The fd + returned by epoll_create() should be closed with close(). */ +extern int epoll_create (int __size) __THROW; + +/* Same as epoll_create but with an FLAGS parameter. The unused SIZE + parameter has been dropped. */ +extern int epoll_create1 (int __flags) __THROW; + + +/* Manipulate an epoll instance "epfd". Returns 0 in case of success, + -1 in case of error ( the "errno" variable will contain the + specific error code ) The "op" parameter is one of the EPOLL_CTL_* + constants defined above. The "fd" parameter is the target of the + operation. The "event" parameter describes which events the caller + is interested in and any associated user data. */ +extern int epoll_ctl (int __epfd, int __op, int __fd, + struct epoll_event *__event) __THROW; + + +/* Wait for events on an epoll instance "epfd". Returns the number of + triggered events returned in "events" buffer. Or -1 in case of + error with the "errno" variable set to the specific error code. The + "events" parameter is a buffer that will contain triggered + events. The "maxevents" is the maximum number of events to be + returned ( usually size of "events" ). The "timeout" parameter + specifies the maximum wait time in milliseconds (-1 == infinite). + + This function is a cancellation point and therefore not marked with + __THROW. */ +extern int epoll_wait (int __epfd, struct epoll_event *__events, + int __maxevents, int __timeout); + + +/* Same as epoll_wait, but the thread's signal mask is temporarily + and atomically replaced with the one provided as parameter. + + This function is a cancellation point and therefore not marked with + __THROW. */ +extern int epoll_pwait (int __epfd, struct epoll_event *__events, + int __maxevents, int __timeout, + __const __sigset_t *__ss); + +__END_DECLS + +#endif /* sys/epoll.h */ diff --git a/ports/sysdeps/unix/sysv/linux/hppa/sys/eventfd.h b/ports/sysdeps/unix/sysv/linux/hppa/sys/eventfd.h new file mode 100644 index 0000000..751f276 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/hppa/sys/eventfd.h @@ -0,0 +1,54 @@ +/* Copyright (C) 2007, 2008, 2009 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#ifndef _SYS_EVENTFD_H +#define _SYS_EVENTFD_H 1 + +#include + + +/* Type for event counter. */ +typedef uint64_t eventfd_t; + +/* Flags for signalfd. */ +enum + { + EFD_SEMAPHORE = 1, +#define EFD_SEMAPHORE EFD_SEMAPHORE + EFD_CLOEXEC = 010000000, +#define EFD_CLOEXEC EFD_CLOEXEC + EFD_NONBLOCK = 00200004 /* HPUX has separate NDELAY & NONBLOCK */ +#define EFD_NONBLOCK EFD_NONBLOCK + }; + + +__BEGIN_DECLS + +/* Return file descriptor for generic event channel. Set initial + value to COUNT. */ +extern int eventfd (int __count, int __flags) __THROW; + +/* Read event counter and possibly wait for events. */ +extern int eventfd_read (int __fd, eventfd_t *__value); + +/* Increment event counter. */ +extern int eventfd_write (int __fd, eventfd_t __value); + +__END_DECLS + +#endif /* sys/eventfd.h */ diff --git a/ports/sysdeps/unix/sysv/linux/hppa/sys/inotify.h b/ports/sysdeps/unix/sysv/linux/hppa/sys/inotify.h new file mode 100644 index 0000000..d293aee --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/hppa/sys/inotify.h @@ -0,0 +1,105 @@ +/* Copyright (C) 2005, 2006, 2008, 2009 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#ifndef _SYS_INOTIFY_H +#define _SYS_INOTIFY_H 1 + +#include + + +/* Flags for the parameter of inotify_init1. */ +enum + { + IN_CLOEXEC = 010000000, +#define IN_CLOEXEC IN_CLOEXEC + IN_NONBLOCK = 000200004 /* HPUX has separate NDELAY & NONBLOCK */ +#define IN_NONBLOCK IN_NONBLOCK + }; + + +/* Structure describing an inotify event. */ +struct inotify_event +{ + int wd; /* Watch descriptor. */ + uint32_t mask; /* Watch mask. */ + uint32_t cookie; /* Cookie to synchronize two events. */ + uint32_t len; /* Length (including NULs) of name. */ + char name __flexarr; /* Name. */ +}; + + +/* Supported events suitable for MASK parameter of INOTIFY_ADD_WATCH. */ +#define IN_ACCESS 0x00000001 /* File was accessed. */ +#define IN_MODIFY 0x00000002 /* File was modified. */ +#define IN_ATTRIB 0x00000004 /* Metadata changed. */ +#define IN_CLOSE_WRITE 0x00000008 /* Writtable file was closed. */ +#define IN_CLOSE_NOWRITE 0x00000010 /* Unwrittable file closed. */ +#define IN_CLOSE (IN_CLOSE_WRITE | IN_CLOSE_NOWRITE) /* Close. */ +#define IN_OPEN 0x00000020 /* File was opened. */ +#define IN_MOVED_FROM 0x00000040 /* File was moved from X. */ +#define IN_MOVED_TO 0x00000080 /* File was moved to Y. */ +#define IN_MOVE (IN_MOVED_FROM | IN_MOVED_TO) /* Moves. */ +#define IN_CREATE 0x00000100 /* Subfile was created. */ +#define IN_DELETE 0x00000200 /* Subfile was deleted. */ +#define IN_DELETE_SELF 0x00000400 /* Self was deleted. */ +#define IN_MOVE_SELF 0x00000800 /* Self was moved. */ + +/* Events sent by the kernel. */ +#define IN_UNMOUNT 0x00002000 /* Backing fs was unmounted. */ +#define IN_Q_OVERFLOW 0x00004000 /* Event queued overflowed. */ +#define IN_IGNORED 0x00008000 /* File was ignored. */ + +/* Helper events. */ +#define IN_CLOSE (IN_CLOSE_WRITE | IN_CLOSE_NOWRITE) /* Close. */ +#define IN_MOVE (IN_MOVED_FROM | IN_MOVED_TO) /* Moves. */ + +/* Special flags. */ +#define IN_ONLYDIR 0x01000000 /* Only watch the path if it is a + directory. */ +#define IN_DONT_FOLLOW 0x02000000 /* Do not follow a sym link. */ +#define IN_MASK_ADD 0x20000000 /* Add to the mask of an already + existing watch. */ +#define IN_ISDIR 0x40000000 /* Event occurred against dir. */ +#define IN_ONESHOT 0x80000000 /* Only send event once. */ + +/* All events which a program can wait on. */ +#define IN_ALL_EVENTS (IN_ACCESS | IN_MODIFY | IN_ATTRIB | IN_CLOSE_WRITE \ + | IN_CLOSE_NOWRITE | IN_OPEN | IN_MOVED_FROM \ + | IN_MOVED_TO | IN_CREATE | IN_DELETE \ + | IN_DELETE_SELF | IN_MOVE_SELF) + + +__BEGIN_DECLS + +/* Create and initialize inotify instance. */ +extern int inotify_init (void) __THROW; + +/* Create and initialize inotify instance. */ +extern int inotify_init1 (int __flags) __THROW; + +/* Add watch of object NAME to inotify instance FD. Notify about + events specified by MASK. */ +extern int inotify_add_watch (int __fd, const char *__name, uint32_t __mask) + __THROW; + +/* Remove the watch specified by WD from the inotify instance FD. */ +extern int inotify_rm_watch (int __fd, int __wd) __THROW; + +__END_DECLS + +#endif /* sys/inotify.h */ diff --git a/ports/sysdeps/unix/sysv/linux/hppa/sys/procfs.h b/ports/sysdeps/unix/sysv/linux/hppa/sys/procfs.h index ca35489..c0e5a60 100644 --- a/ports/sysdeps/unix/sysv/linux/hppa/sys/procfs.h +++ b/ports/sysdeps/unix/sysv/linux/hppa/sys/procfs.h @@ -29,10 +29,8 @@ GDB unless you know what you are doing. */ #include -#include #include #include -#include #include __BEGIN_DECLS diff --git a/ports/sysdeps/unix/sysv/linux/hppa/sys/signalfd.h b/ports/sysdeps/unix/sysv/linux/hppa/sys/signalfd.h new file mode 100644 index 0000000..da8264e --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/hppa/sys/signalfd.h @@ -0,0 +1,66 @@ +/* Copyright (C) 2007, 2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#ifndef _SYS_SIGNALFD_H +#define _SYS_SIGNALFD_H 1 + +#define __need_sigset_t +#include +#include + + +struct signalfd_siginfo +{ + uint32_t ssi_signo; + int32_t ssi_errno; + int32_t ssi_code; + uint32_t ssi_pid; + uint32_t ssi_uid; + int32_t ssi_fd; + uint32_t ssi_tid; + uint32_t ssi_band; + uint32_t ssi_overrun; + uint32_t ssi_trapno; + int32_t ssi_status; + int32_t ssi_int; + uint64_t ssi_ptr; + uint64_t ssi_utime; + uint64_t ssi_stime; + uint64_t ssi_addr; + uint8_t __pad[48]; +}; + +/* Flags for signalfd. */ +enum + { + SFD_CLOEXEC = 010000000, +#define SFD_CLOEXEC SFD_CLOEXEC + SFD_NONBLOCK = 00200004 /* HPUX has separate NDELAY & NONBLOCK */ +#define SFD_NONBLOCK SFD_NONBLOCK + }; + +__BEGIN_DECLS + +/* Request notification for delivery of signals in MASK to be + performed using descriptor FD.*/ +extern int signalfd (int __fd, const sigset_t *__mask, int __flags) + __THROW __nonnull ((2)); + +__END_DECLS + +#endif /* sys/signalfd.h */ diff --git a/ports/sysdeps/unix/sysv/linux/hppa/sys/timerfd.h b/ports/sysdeps/unix/sysv/linux/hppa/sys/timerfd.h new file mode 100644 index 0000000..78cdfc4 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/hppa/sys/timerfd.h @@ -0,0 +1,60 @@ +/* Copyright (C) 2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#ifndef _SYS_TIMERFD_H +#define _SYS_TIMERFD_H 1 + +#include + + +/* Bits to be set in the FLAGS parameter of `timerfd_create'. */ +enum + { + TFD_CLOEXEC = 010000000, +#define TFD_CLOEXEC TFD_CLOEXEC + TFD_NONBLOCK = 000200004 /* HPUX has separate NDELAY & NONBLOCK */ +#define TFD_NONBLOCK TFD_NONBLOCK + }; + + +/* Bits to be set in the FLAGS parameter of `timerfd_settime'. */ +enum + { + TFD_TIMER_ABSTIME = 1 << 0 +#define TFD_TIMER_ABSTIME TFD_TIMER_ABSTIME + }; + + +__BEGIN_DECLS + +/* Return file descriptor for new interval timer source. */ +extern int timerfd_create (clockid_t __clock_id, int __flags) __THROW; + +/* Set next expiration time of interval timer source UFD to UTMR. If + FLAGS has the TFD_TIMER_ABSTIME flag set the timeout value is + absolute. Optionally return the old expiration time in OTMR. */ +extern int timerfd_settime (int __ufd, int __flags, + __const struct itimerspec *__utmr, + struct itimerspec *__otmr) __THROW; + +/* Return the next expiration time of UFD. */ +extern int timerfd_gettime (int __ufd, struct itimerspec *__otmr) __THROW; + +__END_DECLS + +#endif /* sys/timerfd.h */ diff --git a/ports/sysdeps/unix/sysv/linux/hppa/syscalls.list b/ports/sysdeps/unix/sysv/linux/hppa/syscalls.list index 0f7537c..1b6b311 100644 --- a/ports/sysdeps/unix/sysv/linux/hppa/syscalls.list +++ b/ports/sysdeps/unix/sysv/linux/hppa/syscalls.list @@ -35,3 +35,4 @@ socketpair - socketpair i:iiif __socketpair socketpair setrlimit - setrlimit i:ip __setrlimit setrlimit getrlimit - getrlimit i:ip __getrlimit getrlimit +prlimit64 EXTRA prlimit64 i:iipp prlimit64 diff --git a/ports/sysdeps/unix/sysv/linux/hppa/sysdep.h b/ports/sysdeps/unix/sysv/linux/hppa/sysdep.h index e22e571..670a6a6 100644 --- a/ports/sysdeps/unix/sysv/linux/hppa/sysdep.h +++ b/ports/sysdeps/unix/sysv/linux/hppa/sysdep.h @@ -22,7 +22,6 @@ #include #include -#include /* In order to get __set_errno() definition in INLINE_SYSCALL. */ #ifndef __ASSEMBLER__ @@ -35,32 +34,28 @@ #undef SYS_ify #define SYS_ify(syscall_name) (__NR_##syscall_name) +/* The vfork, fork, and clone syscalls clobber r19 + * and r21. We list r21 as either clobbered or as an + * input to a 6-argument syscall. We must save and + * restore r19 in both PIC and non-PIC cases. + */ /* WARNING: TREG must be a callee saves register so that it doesn't have to be restored after a call to another function */ -#ifdef PIC -# define TREG %r3 -# define SAVE_PIC(SREG) copy %r19, SREG ASM_LINE_SEP -# define LOAD_PIC(LREG) copy LREG, %r19 ASM_LINE_SEP -/* Inline assembly defines */ -# define TREG_ASM "%r4" /* Cant clobber r3, it holds framemarker */ -# define SAVE_ASM_PIC " copy %%r19, %" TREG_ASM "\n" -# define LOAD_ASM_PIC " copy %" TREG_ASM ", %%r19\n" -# define CLOB_TREG TREG_ASM , -# define PIC_REG_DEF register unsigned long __r19 asm("r19"); -# define PIC_REG_USE , "r" (__r19) -#else -# define TREG %r3 -# define SAVE_PIC(SREG) nop ASM_LINE_SEP -# define LOAD_PIC(LREG) nop ASM_LINE_SEP +#define TREG 4 +#define SAVE_PIC(SREG) \ + copy %r19, SREG ASM_LINE_SEP \ + .cfi_register 19, SREG +#define LOAD_PIC(LREG) \ + copy LREG , %r19 ASM_LINE_SEP \ + .cfi_restore 19 /* Inline assembly defines */ -# define TREG_ASM -# define SAVE_ASM_PIC "nop \n" -# define LOAD_ASM_PIC "nop \n" -# define CLOB_TREG -# define PIC_REG_DEF -# define PIC_REG_USE -#endif +#define TREG_ASM "%r4" /* Cant clobber r3, it holds framemarker */ +#define SAVE_ASM_PIC " copy %%r19, %" TREG_ASM "\n" +#define LOAD_ASM_PIC " copy %" TREG_ASM ", %%r19\n" +#define CLOB_TREG TREG_ASM , +#define PIC_REG_DEF register unsigned long __r19 asm("r19"); +#define PIC_REG_USE , "r" (__r19) #ifdef __ASSEMBLER__ @@ -127,12 +122,14 @@ .align ALIGNARG(4) ASM_LINE_SEP \ .export C_SYMBOL_NAME(name) ASM_LINE_SEP \ .type C_SYMBOL_NAME(name),@function ASM_LINE_SEP \ + cfi_startproc ASM_LINE_SEP \ C_LABEL(name) ASM_LINE_SEP \ .PROC ASM_LINE_SEP \ .CALLINFO FRAME=64,CALLS,SAVE_RP,ENTRY_GR=3 ASM_LINE_SEP \ .ENTRY ASM_LINE_SEP \ /* SAVE_RP says we do */ ASM_LINE_SEP \ stw %rp, -20(%sr0,%sp) ASM_LINE_SEP \ + .cfi_offset 2, -20 ASM_LINE_SEP \ /*FIXME: Call mcount? (carefull with stack!) */ /* Some syscall wrappers do not call other functions, and @@ -142,18 +139,21 @@ .align ALIGNARG(4) ASM_LINE_SEP \ .export C_SYMBOL_NAME(name) ASM_LINE_SEP \ .type C_SYMBOL_NAME(name),@function ASM_LINE_SEP \ + cfi_startproc ASM_LINE_SEP \ C_LABEL(name) ASM_LINE_SEP \ .PROC ASM_LINE_SEP \ .CALLINFO FRAME=64,NO_CALLS,SAVE_RP,ENTRY_GR=3 ASM_LINE_SEP \ .ENTRY ASM_LINE_SEP \ /* SAVE_RP says we do */ ASM_LINE_SEP \ stw %rp, -20(%sr0,%sp) ASM_LINE_SEP \ + .cfi_offset 2, -20 ASM_LINE_SEP \ /*FIXME: Call mcount? (carefull with stack!) */ #undef END #define END(name) \ .EXIT ASM_LINE_SEP \ .PROCEND ASM_LINE_SEP \ + cfi_endproc ASM_LINE_SEP \ .size C_SYMBOL_NAME(name), .-C_SYMBOL_NAME(name) ASM_LINE_SEP /* If compiled for profiling, call `mcount' at the start @@ -170,9 +170,7 @@ which means ENTRY(name) DO_CALL(...) - nop - bv 0(2) - nop + bv,n 0(2) */ #define PSEUDO(name, syscall_name, args) \ @@ -180,8 +178,7 @@ /* If necc. load args from stack */ ASM_LINE_SEP \ DOARGS_##args ASM_LINE_SEP \ DO_CALL (syscall_name, args) ASM_LINE_SEP \ - UNDOARGS_##args ASM_LINE_SEP \ - nop ASM_LINE_SEP + UNDOARGS_##args ASM_LINE_SEP #define ret \ /* Return value set by ERRNO code */ ASM_LINE_SEP \ @@ -196,8 +193,7 @@ ENTRY_LEAF (name) ASM_LINE_SEP \ DOARGS_##args ASM_LINE_SEP \ DO_CALL_NOERRNO (syscall_name, args) ASM_LINE_SEP \ - UNDOARGS_##args ASM_LINE_SEP \ - nop ASM_LINE_SEP + UNDOARGS_##args ASM_LINE_SEP #define ret_NOERRNO ret @@ -211,8 +207,7 @@ ENTRY_LEAF (name) ASM_LINE_SEP \ DOARGS_##args ASM_LINE_SEP \ DO_CALL_ERRVAL (syscall_name, args) ASM_LINE_SEP \ - UNDOARGS_##args ASM_LINE_SEP \ - nop ASM_LINE_SEP + UNDOARGS_##args ASM_LINE_SEP #define ret_ERRVAL ret @@ -290,8 +285,12 @@ #define DO_CALL(syscall_name, args) \ /* Create a frame */ ASM_LINE_SEP \ stwm TREG, 64(%sp) ASM_LINE_SEP \ + .cfi_offset TREG, 0 ASM_LINE_SEP \ + .cfi_adjust_cfa_offset 64 ASM_LINE_SEP \ stw %sp, -4(%sp) ASM_LINE_SEP \ + .cfi_offset 30, -4 ASM_LINE_SEP \ stw %r19, -32(%sp) ASM_LINE_SEP \ + .cfi_offset 19, -32 ASM_LINE_SEP \ /* Save r19 */ ASM_LINE_SEP \ SAVE_PIC(TREG) ASM_LINE_SEP \ /* Do syscall, delay loads # */ ASM_LINE_SEP \ @@ -314,8 +313,10 @@ L(pre_end): ASM_LINE_SEP \ /* Restore our frame, restoring TREG */ ASM_LINE_SEP \ ldwm -64(%sp), TREG ASM_LINE_SEP \ + .cfi_adjust_cfa_offset -64 ASM_LINE_SEP \ /* Restore return pointer */ ASM_LINE_SEP \ - ldw -20(%sp),%rp ASM_LINE_SEP + ldw -20(%sp),%rp ASM_LINE_SEP \ + .cfi_restore 2 ASM_LINE_SEP /* We do nothing with the return, except hand it back to someone else */ #undef DO_CALL_NOERRNO diff --git a/ports/sysdeps/unix/sysv/linux/m68k/bits/fcntl.h b/ports/sysdeps/unix/sysv/linux/m68k/bits/fcntl.h index f36507b..93dfb83 100644 --- a/ports/sysdeps/unix/sysv/linux/m68k/bits/fcntl.h +++ b/ports/sysdeps/unix/sysv/linux/m68k/bits/fcntl.h @@ -233,6 +233,21 @@ struct f_owner_ex # define SPLICE_F_GIFT 8 /* Pages passed in are a gift. */ #endif +/* Values for `*at' functions. */ +#ifdef __USE_ATFILE +# define AT_FDCWD -100 /* Special value used to indicate + the *at functions should use the + current working directory. */ +# define AT_SYMLINK_NOFOLLOW 0x100 /* Do not follow symbolic links. */ +# define AT_REMOVEDIR 0x200 /* Remove directory instead of + unlinking file. */ +# define AT_SYMLINK_FOLLOW 0x400 /* Follow symbolic links. */ +# define AT_NO_AUTOMOUNT 0x800 /* Suppress terminal automount + traversal. */ +# define AT_EACCESS 0x200 /* Test access permitted for + effective IDs, not real IDs. */ +#endif + __BEGIN_DECLS #ifdef __USE_GNU diff --git a/ports/sysdeps/unix/sysv/linux/m68k/chown.c b/ports/sysdeps/unix/sysv/linux/m68k/chown.c index e7193dc..e7a0213 100644 --- a/ports/sysdeps/unix/sysv/linux/m68k/chown.c +++ b/ports/sysdeps/unix/sysv/linux/m68k/chown.c @@ -67,3 +67,8 @@ __chown (const char *file, uid_t owner, gid_t group) } libc_hidden_def (__chown) weak_alias (__chown, chown) + +#include +#if SHLIB_COMPAT (libc, GLIBC_2_1, GLIBC_2_2) +compat_symbol (libc, __chown, chown, GLIBC_2_1); +#endif diff --git a/ports/sysdeps/unix/sysv/linux/m68k/kernel-features.h b/ports/sysdeps/unix/sysv/linux/m68k/kernel-features.h index fcff833..1145470 100644 --- a/ports/sysdeps/unix/sysv/linux/m68k/kernel-features.h +++ b/ports/sysdeps/unix/sysv/linux/m68k/kernel-features.h @@ -27,6 +27,9 @@ # define __ASSUME_VFORK_SYSCALL 1 #endif +/* m68k uses socketcall. */ +#define __ASSUME_SOCKETCALL 1 + /* Many syscalls were added in 2.6.10 for m68k. */ #if __LINUX_KERNEL_VERSION >= 132618 # define __ASSUME_TGKILL 1 diff --git a/ports/sysdeps/unix/sysv/linux/m68k/lchown.c b/ports/sysdeps/unix/sysv/linux/m68k/lchown.c index c89de99..3539e4c 100644 --- a/ports/sysdeps/unix/sysv/linux/m68k/lchown.c +++ b/ports/sysdeps/unix/sysv/linux/m68k/lchown.c @@ -1 +1,6 @@ #include + +#include +#if SHLIB_COMPAT (libc, GLIBC_2_1, GLIBC_2_2) +compat_symbol (libc, __lchown, lchown, GLIBC_2_1); +#endif diff --git a/ports/sysdeps/unix/sysv/linux/mips/bits/fcntl.h b/ports/sysdeps/unix/sysv/linux/mips/bits/fcntl.h index 31cb861..f384784 100644 --- a/ports/sysdeps/unix/sysv/linux/mips/bits/fcntl.h +++ b/ports/sysdeps/unix/sysv/linux/mips/bits/fcntl.h @@ -247,6 +247,21 @@ struct f_owner_ex # define SPLICE_F_GIFT 8 /* Pages passed in are a gift. */ #endif +/* Values for `*at' functions. */ +#ifdef __USE_ATFILE +# define AT_FDCWD -100 /* Special value used to indicate + the *at functions should use the + current working directory. */ +# define AT_SYMLINK_NOFOLLOW 0x100 /* Do not follow symbolic links. */ +# define AT_REMOVEDIR 0x200 /* Remove directory instead of + unlinking file. */ +# define AT_SYMLINK_FOLLOW 0x400 /* Follow symbolic links. */ +# define AT_NO_AUTOMOUNT 0x800 /* Suppress terminal automount + traversal. */ +# define AT_EACCESS 0x200 /* Test access permitted for + effective IDs, not real IDs. */ +#endif + __BEGIN_DECLS #ifdef __USE_GNU diff --git a/ports/sysdeps/unix/sysv/linux/mips/bits/resource.h b/ports/sysdeps/unix/sysv/linux/mips/bits/resource.h index a6454c4..5d8fcc9 100644 --- a/ports/sysdeps/unix/sysv/linux/mips/bits/resource.h +++ b/ports/sysdeps/unix/sysv/linux/mips/bits/resource.h @@ -100,7 +100,13 @@ enum __rlimit_resource __RLIMIT_RTPRIO = 14, #define RLIMIT_RTPRIO __RLIMIT_RTPRIO - __RLIMIT_NLIMITS = 15, + /* Maximum CPU time that a process scheduled under a real-time + scheduling policy may consume without making a blocking + system call. */ + __RLIMIT_RTTIME = 15, +#define RLIMIT_RTTIME __RLIMIT_RTTIME + + __RLIMIT_NLIMITS = 16, __RLIM_NLIMITS = __RLIMIT_NLIMITS #define RLIMIT_NLIMITS __RLIMIT_NLIMITS #define RLIM_NLIMITS __RLIM_NLIMITS diff --git a/ports/sysdeps/unix/sysv/linux/mips/getrlimit64.c b/ports/sysdeps/unix/sysv/linux/mips/getrlimit64.c new file mode 100644 index 0000000..10a5495 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/mips/getrlimit64.c @@ -0,0 +1,64 @@ +/* Copyright (C) 2013 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include + +#if _MIPS_SIM == _ABIO32 || _MIPS_SIM == _ABIN32 + +# define getrlimit64 static __internal_getrlimit64 +# undef libc_hidden_def +# define libc_hidden_def(name) +# include +# undef getrlimit64 +# undef libc_hidden_def +# define libc_hidden_def(name) hidden_def (name) + +/* RLIM64_INFINITY was supposed to be a glibc convention rather than + anything seen by the kernel, but it ended being passed to the kernel + through the prlimit64 syscall. Given that a lot of binaries with + the wrong constant value are in the wild, provide a wrapper function + fixing the value after the syscall. */ + +# define GLIBC_RLIM64_INFINITY 0x7fffffffffffffffULL +# define KERNEL_RLIM64_INFINITY 0xffffffffffffffffULL + +int +getrlimit64 (enum __rlimit_resource resource, + struct rlimit64 *rlimits) +{ + struct rlimit64 krlimits; + + if (__internal_getrlimit64 (resource, &krlimits) < 0) + return -1; + + if (krlimits.rlim_cur == KERNEL_RLIM64_INFINITY) + rlimits->rlim_cur = GLIBC_RLIM64_INFINITY; + else + rlimits->rlim_cur = krlimits.rlim_cur; + if (krlimits.rlim_max == KERNEL_RLIM64_INFINITY) + rlimits->rlim_max = GLIBC_RLIM64_INFINITY; + else + rlimits->rlim_max = krlimits.rlim_max; + + return 0; +} + +libc_hidden_def (getrlimit64) + +#else /* !_ABI_O32 && !_ABI_N32 */ +# include +#endif diff --git a/ports/sysdeps/unix/sysv/linux/mips/kernel-features.h b/ports/sysdeps/unix/sysv/linux/mips/kernel-features.h index 092c35d..6dd4b3b 100644 --- a/ports/sysdeps/unix/sysv/linux/mips/kernel-features.h +++ b/ports/sysdeps/unix/sysv/linux/mips/kernel-features.h @@ -37,6 +37,16 @@ # define __ASSUME_SIGNALFD4 1 #endif +/* Support for the accept4 syscall was added in 2.6.31. */ +#if __LINUX_KERNEL_VERSION >= 0x02061f +# define __ASSUME_ACCEPT4_SYSCALL 1 +#endif + +/* Support for the recvmmsg syscall was added in 2.6.33. */ +#if __LINUX_KERNEL_VERSION >= 0x020621 +# define __ASSUME_RECVMMSG_SYSCALL 1 +#endif + #include_next /* The n32 syscall ABI did not have a getdents64 syscall until diff --git a/ports/sysdeps/unix/sysv/linux/mips/mips64/n64/fstatfs64.c b/ports/sysdeps/unix/sysv/linux/mips/mips64/n64/fstatfs64.c new file mode 100644 index 0000000..6e25b02 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/mips/mips64/n64/fstatfs64.c @@ -0,0 +1 @@ +/* Empty. */ diff --git a/ports/sysdeps/unix/sysv/linux/mips/mips64/n64/ftw.c b/ports/sysdeps/unix/sysv/linux/mips/mips64/n64/ftw.c new file mode 100644 index 0000000..4638956 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/mips/mips64/n64/ftw.c @@ -0,0 +1 @@ +#include diff --git a/ports/sysdeps/unix/sysv/linux/mips/mips64/n64/ftw64.c b/ports/sysdeps/unix/sysv/linux/mips/mips64/n64/ftw64.c new file mode 100644 index 0000000..cb02172 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/mips/mips64/n64/ftw64.c @@ -0,0 +1 @@ +#include diff --git a/ports/sysdeps/unix/sysv/linux/mips/mips64/n64/statfs64.c b/ports/sysdeps/unix/sysv/linux/mips/mips64/n64/statfs64.c new file mode 100644 index 0000000..6e25b02 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/mips/mips64/n64/statfs64.c @@ -0,0 +1 @@ +/* Empty. */ diff --git a/ports/sysdeps/unix/sysv/linux/mips/mips64/n64/syscalls.list b/ports/sysdeps/unix/sysv/linux/mips/mips64/n64/syscalls.list index 2c8c4d4..bb0bba6 100644 --- a/ports/sysdeps/unix/sysv/linux/mips/mips64/n64/syscalls.list +++ b/ports/sysdeps/unix/sysv/linux/mips/mips64/n64/syscalls.list @@ -1,5 +1,10 @@ # File name Caller Syscall name # args Strong name Weak names +sync_file_range - sync_file_range i:iiii sync_file_range + prlimit EXTRA prlimit64 i:iipp prlimit prlimit64 fanotify_mark EXTRA fanotify_mark i:iiiis fanotify_mark + +fstatfs - fstatfs i:ip __fstatfs fstatfs fstatfs64 __fstatfs64 +statfs - statfs i:sp __statfs statfs statfs64 __statfs64 diff --git a/ports/sysdeps/unix/sysv/linux/mips/nptl/lowlevellock.h b/ports/sysdeps/unix/sysv/linux/mips/nptl/lowlevellock.h index ab284df..a80f1e9 100644 --- a/ports/sysdeps/unix/sysv/linux/mips/nptl/lowlevellock.h +++ b/ports/sysdeps/unix/sysv/linux/mips/nptl/lowlevellock.h @@ -24,7 +24,6 @@ #include #include #include -#include #include #define FUTEX_WAIT 0 diff --git a/ports/sysdeps/unix/sysv/linux/mips/setrlimit64.c b/ports/sysdeps/unix/sysv/linux/mips/setrlimit64.c new file mode 100644 index 0000000..8609f69 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/mips/setrlimit64.c @@ -0,0 +1,55 @@ +/* Copyright (C) 2013 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include + +#if _MIPS_SIM == _ABIO32 || _MIPS_SIM == _ABIN32 + +# define setrlimit64 static __internal_setrlimit64 +# include +# undef setrlimit64 + +/* RLIM64_INFINITY was supposed to be a glibc convention rather than + anything seen by the kernel, but it ended being passed to the kernel + through the prlimit64 syscall. Given that a lot of binaries with + the wrong constant value are in the wild, provide a wrapper function + fixing the value before the syscall. */ + +# define GLIBC_RLIM64_INFINITY 0x7fffffffffffffffULL +# define KERNEL_RLIM64_INFINITY 0xffffffffffffffffULL + +int +setrlimit64 (enum __rlimit_resource resource, + const struct rlimit64 *rlimits) +{ + struct rlimit64 krlimits; + + if (rlimits->rlim_cur == GLIBC_RLIM64_INFINITY) + krlimits.rlim_cur = KERNEL_RLIM64_INFINITY; + else + krlimits.rlim_cur = rlimits->rlim_cur; + if (rlimits->rlim_max == GLIBC_RLIM64_INFINITY) + krlimits.rlim_max = KERNEL_RLIM64_INFINITY; + else + krlimits.rlim_max = rlimits->rlim_max; + + return __internal_setrlimit64 (resource, &krlimits); +} + +#else /* !_ABI_O32 && !_ABI_N32 */ +# include +#endif diff --git a/ports/sysdeps/unix/sysv/linux/mips/sys/user.h b/ports/sysdeps/unix/sysv/linux/mips/sys/user.h index d5b3b05..5d7c8ce 100644 --- a/ports/sysdeps/unix/sysv/linux/mips/sys/user.h +++ b/ports/sysdeps/unix/sysv/linux/mips/sys/user.h @@ -20,6 +20,7 @@ #define _SYS_USER_H 1 #include +#include /* The whole purpose of this file is for GDB and GDB only. Don't read too much into it. Don't use it for anything other than GDB unless @@ -207,8 +208,7 @@ struct user { #endif -#define PAGE_SHIFT 12 -#define PAGE_SIZE (1UL << PAGE_SHIFT) +#define PAGE_SIZE (sysconf(_SC_PAGESIZE)) #define PAGE_MASK (~(PAGE_SIZE-1)) #define NBPG PAGE_SIZE #define UPAGES 1 diff --git a/posix/Makefile b/posix/Makefile index 2ea35ac..488f959 100644 --- a/posix/Makefile +++ b/posix/Makefile @@ -105,7 +105,7 @@ tests := tstgetopt testfnm runtests \ tst-execvp3 tst-execvp4 \ tst-fnmatch2 tst-cpucount tst-cpuset \ bug-getopt1 bug-getopt2 bug-getopt3 bug-getopt4 \ - bug-getopt5 + bug-getopt5 bug-regex34 tests-$(OPTION_EGLIBC_LOCALE_CODE) \ += tst-fnmatch tst-regexloc bug-regex1 bug-regex5 \ bug-regex23 bug-regex25 @@ -240,6 +240,7 @@ bug-regex23-ENV = LOCPATH=$(common-objpfx)localedata bug-regex25-ENV = LOCPATH=$(common-objpfx)localedata bug-regex26-ENV = LOCPATH=$(common-objpfx)localedata bug-regex30-ENV = LOCPATH=$(common-objpfx)localedata +bug-regex34-ENV = LOCPATH=$(common-objpfx)localedata tst-rxspencer-ARGS = rxspencer/tests ifeq (y,$(OPTION_EGLIBC_LOCALE_CODE)) tst-rxspencer-ARGS += --utf8 diff --git a/posix/bug-regex34.c b/posix/bug-regex34.c new file mode 100644 index 0000000..bb3b613 --- /dev/null +++ b/posix/bug-regex34.c @@ -0,0 +1,46 @@ +/* Test re_search with multi-byte characters in UTF-8. + Copyright (C) 2013 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#define _GNU_SOURCE 1 +#include +#include +#include +#include + +static int +do_test (void) +{ + struct re_pattern_buffer r; + /* ကျွန်ုပ်x */ + const char *s = "\xe1\x80\x80\xe1\x80\xbb\xe1\x80\xbd\xe1\x80\x94\xe1\x80\xba\xe1\x80\xaf\xe1\x80\x95\xe1\x80\xbax"; + + if (setlocale (LC_ALL, "en_US.UTF-8") == NULL) + { + puts ("setlocale failed"); + return 1; + } + memset (&r, 0, sizeof (r)); + + re_compile_pattern ("[^x]x", 5, &r); + /* This was triggering a buffer overflow. */ + re_search (&r, s, strlen (s), 0, strlen (s), 0); + return 0; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/posix/fnmatch.c b/posix/fnmatch.c index 3fb8e7c..e809e8a 100644 --- a/posix/fnmatch.c +++ b/posix/fnmatch.c @@ -379,6 +379,11 @@ fnmatch (pattern, string, flags) XXX Do we have to set `errno' to something which mbsrtows hasn't already done? */ return -1; + if (__builtin_expect (n >= (size_t) -1 / sizeof (wchar_t), 0)) + { + __set_errno (ENOMEM); + return -2; + } wpattern_malloc = wpattern = (wchar_t *) malloc ((n + 1) * sizeof (wchar_t)); assert (mbsinit (&ps)); @@ -423,6 +428,12 @@ fnmatch (pattern, string, flags) XXX Do we have to set `errno' to something which mbsrtows hasn't already done? */ goto free_return; + if (__builtin_expect (n >= (size_t) -1 / sizeof (wchar_t), 0)) + { + free (wpattern_malloc); + __set_errno (ENOMEM); + return -2; + } wstring_malloc = wstring = (wchar_t *) malloc ((n + 1) * sizeof (wchar_t)); diff --git a/posix/fnmatch_loop.c b/posix/fnmatch_loop.c index 2b87f87..6e7a0cc 100644 --- a/posix/fnmatch_loop.c +++ b/posix/fnmatch_loop.c @@ -419,7 +419,7 @@ FCT (pattern, string, string_end, no_leading_period, flags, ends, alloca_used) _NL_CURRENT (LC_COLLATE, _NL_COLLATE_INDIRECTMB); # endif - idx = findidx (&cp); + idx = findidx (&cp, 1); if (idx != 0) { /* We found a table entry. Now see whether the @@ -429,7 +429,7 @@ FCT (pattern, string, string_end, no_leading_period, flags, ends, alloca_used) int32_t idx2; const UCHAR *np = (const UCHAR *) n; - idx2 = findidx (&np); + idx2 = findidx (&np, string_end - n); if (idx2 != 0 && (idx >> 24) == (idx2 >> 24) && len == weights[idx2 & 0xffffff]) @@ -960,14 +960,13 @@ FCT (pattern, string, string_end, no_leading_period, flags, ends, alloca_used) } else if (c == L('[') && *p == L('.')) { - ++p; while (1) { c = *++p; - if (c == '\0') + if (c == L('\0')) return FNM_NOMATCH; - if (*p == L('.') && p[1] == L(']')) + if (c == L('.') && p[1] == L(']')) break; } p += 2; diff --git a/posix/gai.conf b/posix/gai.conf index 195287e..4e154bc 100644 --- a/posix/gai.conf +++ b/posix/gai.conf @@ -62,9 +62,6 @@ # #scopev4 ::ffff:169.254.0.0/112 2 #scopev4 ::ffff:127.0.0.0/104 2 -#scopev4 ::ffff:10.0.0.0/104 5 -#scopev4 ::ffff:172.16.0.0/108 5 -#scopev4 ::ffff:192.168.0.0/112 5 #scopev4 ::ffff:0.0.0.0/96 14 # # For sites which use site-local IPv4 addresses behind NAT there is diff --git a/posix/glob.c b/posix/glob.c index 017180a..b2ac3d7 100644 --- a/posix/glob.c +++ b/posix/glob.c @@ -202,7 +202,7 @@ static const char *next_brace_sub (const char *begin, int flags) __THROW; static int glob_in_dir (const char *pattern, const char *directory, int flags, int (*errfunc) (const char *, int), - glob_t *pglob); + glob_t *pglob, size_t alloca_used); extern int __glob_pattern_type (const char *pattern, int quote) attribute_hidden; @@ -256,13 +256,18 @@ glob (pattern, flags, errfunc, pglob) glob_t *pglob; { const char *filename; - const char *dirname; + char *dirname = NULL; size_t dirlen; int status; size_t oldcount; int meta; int dirname_modified; + int malloc_dirname = 0; glob_t dirs; + int retval = 0; +#ifdef _LIBC + size_t alloca_used = 0; +#endif if (pattern == NULL || pglob == NULL || (flags & ~__GLOB_FLAGS) != 0) { @@ -311,20 +316,26 @@ glob (pattern, flags, errfunc, pglob) const char *next; const char *rest; size_t rest_len; -#ifdef __GNUC__ - char onealt[strlen (pattern) - 1]; -#else - char *onealt = (char *) malloc (strlen (pattern) - 1); - if (onealt == NULL) + char *onealt; + size_t pattern_len = strlen (pattern) - 1; +#ifdef _LIBC + int alloca_onealt = __libc_use_alloca (alloca_used + pattern_len); + if (alloca_onealt) + onealt = alloca_account (pattern_len, alloca_used); + else +#endif { - if (!(flags & GLOB_APPEND)) + onealt = (char *) malloc (pattern_len); + if (onealt == NULL) { - pglob->gl_pathc = 0; - pglob->gl_pathv = NULL; + if (!(flags & GLOB_APPEND)) + { + pglob->gl_pathc = 0; + pglob->gl_pathv = NULL; + } + return GLOB_NOSPACE; } - return GLOB_NOSPACE; } -#endif /* We know the prefix for all sub-patterns. */ alt_start = mempcpy (onealt, pattern, begin - pattern); @@ -335,9 +346,11 @@ glob (pattern, flags, errfunc, pglob) if (next == NULL) { /* It is an illegal expression. */ -#ifndef __GNUC__ - free (onealt); + illegal_brace: +#ifdef _LIBC + if (__builtin_expect (!alloca_onealt, 0)) #endif + free (onealt); return glob (pattern, flags & ~GLOB_BRACE, errfunc, pglob); } @@ -347,13 +360,8 @@ glob (pattern, flags, errfunc, pglob) { rest = next_brace_sub (rest + 1, flags); if (rest == NULL) - { - /* It is an illegal expression. */ -#ifndef __GNUC__ - free (onealt); -#endif - return glob (pattern, flags & ~GLOB_BRACE, errfunc, pglob); - } + /* It is an illegal expression. */ + goto illegal_brace; } /* Please note that we now can be sure the brace expression is well-formed. */ @@ -389,9 +397,10 @@ glob (pattern, flags, errfunc, pglob) /* If we got an error, return it. */ if (result && result != GLOB_NOMATCH) { -#ifndef __GNUC__ - free (onealt); +#ifdef _LIBC + if (__builtin_expect (!alloca_onealt, 0)) #endif + free (onealt); if (!(flags & GLOB_APPEND)) { globfree (pglob); @@ -409,9 +418,10 @@ glob (pattern, flags, errfunc, pglob) assert (next != NULL); } -#ifndef __GNUC__ - free (onealt); +#ifdef _LIBC + if (__builtin_expect (!alloca_onealt, 0)) #endif + free (onealt); if (pglob->gl_pathc != firstc) /* We found some entries. */ @@ -458,7 +468,7 @@ glob (pattern, flags, errfunc, pglob) case is nothing but a notation for a directory. */ if ((flags & (GLOB_TILDE|GLOB_TILDE_CHECK)) && pattern[0] == '~') { - dirname = pattern; + dirname = (char *) pattern; dirlen = strlen (pattern); /* Set FILENAME to NULL as a special flag. This is ugly but @@ -476,9 +486,9 @@ glob (pattern, flags, errfunc, pglob) filename = pattern; #ifdef _AMIGA - dirname = ""; + dirname = (char *) ""; #else - dirname = "."; + dirname = (char *) "."; #endif dirlen = 0; } @@ -488,7 +498,7 @@ glob (pattern, flags, errfunc, pglob) && (flags & GLOB_NOESCAPE) == 0)) { /* "/pattern" or "\\/pattern". */ - dirname = "/"; + dirname = (char *) "/"; dirlen = 1; ++filename; } @@ -514,7 +524,17 @@ glob (pattern, flags, errfunc, pglob) from "d:/", since "d:" and "d:/" are not the same.*/ } #endif - newp = (char *) __alloca (dirlen + 1); +#ifdef _LIBC + if (__libc_use_alloca (alloca_used + dirlen + 1)) + newp = alloca_account (dirlen + 1, alloca_used); + else +#endif + { + newp = malloc (dirlen + 1); + if (newp == NULL) + return GLOB_NOSPACE; + malloc_dirname = 1; + } *((char *) mempcpy (newp, pattern, dirlen)) = '\0'; dirname = newp; ++filename; @@ -554,7 +574,8 @@ glob (pattern, flags, errfunc, pglob) oldcount = pglob->gl_pathc + pglob->gl_offs; goto no_matches; } - return val; + retval = val; + goto out; } } @@ -566,7 +587,8 @@ glob (pattern, flags, errfunc, pglob) && (dirname[2] == '\0' || dirname[2] == '/'))) { /* Look up home directory. */ - const char *home_dir = getenv ("HOME"); + char *home_dir = getenv ("HOME"); + int malloc_home_dir = 0; # ifdef _AMIGA if (home_dir == NULL || home_dir[0] == '\0') home_dir = "SYS:"; @@ -586,7 +608,7 @@ glob (pattern, flags, errfunc, pglob) /* `sysconf' does not support _SC_LOGIN_NAME_MAX. Try a moderate value. */ buflen = 20; - name = (char *) __alloca (buflen); + name = alloca_account (buflen, alloca_used); success = getlogin_r (name, buflen) == 0; if (success) @@ -596,6 +618,7 @@ glob (pattern, flags, errfunc, pglob) long int pwbuflen = GETPW_R_SIZE_MAX (); char *pwtmpbuf; struct passwd pwbuf; + int malloc_pwtmpbuf = 0; int save = errno; # ifndef _LIBC @@ -604,7 +627,18 @@ glob (pattern, flags, errfunc, pglob) Try a moderate value. */ pwbuflen = 1024; # endif - pwtmpbuf = (char *) __alloca (pwbuflen); + if (__libc_use_alloca (alloca_used + pwbuflen)) + pwtmpbuf = alloca_account (pwbuflen, alloca_used); + else + { + pwtmpbuf = malloc (pwbuflen); + if (pwtmpbuf == NULL) + { + retval = GLOB_NOSPACE; + goto out; + } + malloc_pwtmpbuf = 1; + } while (getpwnam_r (name, &pwbuf, pwtmpbuf, pwbuflen, &p) != 0) @@ -614,47 +648,116 @@ glob (pattern, flags, errfunc, pglob) p = NULL; break; } -# ifdef _LIBC - pwtmpbuf = extend_alloca (pwtmpbuf, pwbuflen, + + if (!malloc_pwtmpbuf + && __libc_use_alloca (alloca_used + + 2 * pwbuflen)) + pwtmpbuf = extend_alloca_account (pwtmpbuf, pwbuflen, + 2 * pwbuflen, + alloca_used); + else + { + char *newp = realloc (malloc_pwtmpbuf + ? pwtmpbuf : NULL, 2 * pwbuflen); -# else - pwbuflen *= 2; - pwtmpbuf = (char *) __alloca (pwbuflen); -# endif + if (newp == NULL) + { + if (__builtin_expect (malloc_pwtmpbuf, 0)) + free (pwtmpbuf); + retval = GLOB_NOSPACE; + goto out; + } + pwtmpbuf = newp; + pwbuflen = 2 * pwbuflen; + malloc_pwtmpbuf = 1; + } __set_errno (save); } # else p = getpwnam (name); # endif if (p != NULL) - home_dir = p->pw_dir; + { + if (!malloc_pwtmpbuf) + home_dir = p->pw_dir; + else + { + size_t home_dir_len = strlen (p->pw_dir) + 1; + if (__libc_use_alloca (alloca_used + home_dir_len)) + home_dir = alloca_account (home_dir_len, + alloca_used); + else + { + home_dir = malloc (home_dir_len); + if (home_dir == NULL) + { + free (pwtmpbuf); + retval = GLOB_NOSPACE; + goto out; + } + malloc_home_dir = 1; + } + memcpy (home_dir, p->pw_dir, home_dir_len); + + free (pwtmpbuf); + } + } } } # endif /* ! _LIBC || __OPTION_EGLIBC_GETLOGIN */ if (home_dir == NULL || home_dir[0] == '\0') { if (flags & GLOB_TILDE_CHECK) - return GLOB_NOMATCH; + { + if (__builtin_expect (malloc_home_dir, 0)) + free (home_dir); + retval = GLOB_NOMATCH; + goto out; + } else - home_dir = "~"; /* No luck. */ + home_dir = (char *) "~"; /* No luck. */ } # endif /* WINDOWS32 */ # endif /* Now construct the full directory. */ if (dirname[1] == '\0') { + if (__builtin_expect (malloc_dirname, 0)) + free (dirname); + dirname = home_dir; dirlen = strlen (dirname); + malloc_dirname = malloc_home_dir; } else { char *newp; size_t home_len = strlen (home_dir); - newp = (char *) __alloca (home_len + dirlen); + int use_alloca = __libc_use_alloca (alloca_used + + home_len + dirlen); + if (use_alloca) + newp = alloca_account (home_len + dirlen, alloca_used); + else + { + newp = malloc (home_len + dirlen); + if (newp == NULL) + { + if (__builtin_expect (malloc_home_dir, 0)) + free (home_dir); + retval = GLOB_NOSPACE; + goto out; + } + } + mempcpy (mempcpy (newp, home_dir, home_len), &dirname[1], dirlen); + + if (__builtin_expect (malloc_dirname, 0)) + free (dirname); + dirname = newp; dirlen += home_len - 1; + malloc_dirname = !use_alloca; } dirname_modified = 1; } @@ -662,7 +765,8 @@ glob (pattern, flags, errfunc, pglob) else { char *end_name = strchr (dirname, '/'); - const char *user_name; + char *user_name; + int malloc_user_name = 0; const char *home_dir; char *unescape = NULL; @@ -682,7 +786,18 @@ glob (pattern, flags, errfunc, pglob) else { char *newp; - newp = (char *) __alloca (end_name - dirname); + if (__libc_use_alloca (alloca_used + (end_name - dirname))) + newp = alloca_account (end_name - dirname, alloca_used); + else + { + newp = malloc (end_name - dirname); + if (newp == NULL) + { + retval = GLOB_NOSPACE; + goto out; + } + malloc_user_name = 1; + } if (unescape != NULL) { char *p = mempcpy (newp, dirname + 1, @@ -719,6 +834,7 @@ glob (pattern, flags, errfunc, pglob) # if defined HAVE_GETPWNAM_R || defined _LIBC long int buflen = GETPW_R_SIZE_MAX (); char *pwtmpbuf; + int malloc_pwtmpbuf = 0; struct passwd pwbuf; int save = errno; @@ -728,7 +844,21 @@ glob (pattern, flags, errfunc, pglob) moderate value. */ buflen = 1024; # endif - pwtmpbuf = (char *) __alloca (buflen); + if (__libc_use_alloca (alloca_used + buflen)) + pwtmpbuf = alloca_account (buflen, alloca_used); + else + { + pwtmpbuf = malloc (buflen); + if (pwtmpbuf == NULL) + { + nomem_getpw: + if (__builtin_expect (malloc_user_name, 0)) + free (user_name); + retval = GLOB_NOSPACE; + goto out; + } + malloc_pwtmpbuf = 1; + } while (getpwnam_r (user_name, &pwbuf, pwtmpbuf, buflen, &p) != 0) { @@ -737,40 +867,77 @@ glob (pattern, flags, errfunc, pglob) p = NULL; break; } -# ifdef _LIBC - pwtmpbuf = extend_alloca (pwtmpbuf, buflen, 2 * buflen); -# else - buflen *= 2; - pwtmpbuf = __alloca (buflen); -# endif + if (!malloc_pwtmpbuf + && __libc_use_alloca (alloca_used + 2 * buflen)) + pwtmpbuf = extend_alloca_account (pwtmpbuf, buflen, + 2 * buflen, alloca_used); + else + { + char *newp = realloc (malloc_pwtmpbuf ? pwtmpbuf : NULL, + 2 * buflen); + if (newp == NULL) + { + if (__builtin_expect (malloc_pwtmpbuf, 0)) + free (pwtmpbuf); + goto nomem_getpw; + } + pwtmpbuf = newp; + malloc_pwtmpbuf = 1; + } __set_errno (save); } # else p = getpwnam (user_name); # endif + + if (__builtin_expect (malloc_user_name, 0)) + free (user_name); + + /* If we found a home directory use this. */ if (p != NULL) - home_dir = p->pw_dir; + { + size_t home_len = strlen (p->pw_dir); + size_t rest_len = end_name == NULL ? 0 : strlen (end_name); + + if (__builtin_expect (malloc_dirname, 0)) + free (dirname); + malloc_dirname = 0; + + if (__libc_use_alloca (alloca_used + home_len + rest_len + 1)) + dirname = alloca_account (home_len + rest_len + 1, + alloca_used); + else + { + dirname = malloc (home_len + rest_len + 1); + if (dirname == NULL) + { + if (__builtin_expect (malloc_pwtmpbuf, 0)) + free (pwtmpbuf); + retval = GLOB_NOSPACE; + goto out; + } + malloc_dirname = 1; + } + *((char *) mempcpy (mempcpy (dirname, p->pw_dir, home_len), + end_name, rest_len)) = '\0'; + + dirlen = home_len + rest_len; + dirname_modified = 1; + + if (__builtin_expect (malloc_pwtmpbuf, 0)) + free (pwtmpbuf); + } else - home_dir = NULL; + { + if (__builtin_expect (malloc_pwtmpbuf, 0)) + free (pwtmpbuf); + + if (flags & GLOB_TILDE_CHECK) + /* We have to regard it as an error if we cannot find the + home directory. */ + return GLOB_NOMATCH; + } } - /* If we found a home directory use this. */ - if (home_dir != NULL) - { - char *newp; - size_t home_len = strlen (home_dir); - size_t rest_len = end_name == NULL ? 0 : strlen (end_name); - newp = (char *) __alloca (home_len + rest_len + 1); - *((char *) mempcpy (mempcpy (newp, home_dir, home_len), - end_name, rest_len)) = '\0'; - dirname = newp; - dirlen = home_len + rest_len; - dirname_modified = 1; - } - else - if (flags & GLOB_TILDE_CHECK) - /* We have to regard it as an error if we cannot find the - home directory. */ - return GLOB_NOMATCH; } # endif /* Not Amiga && not WINDOWS32. */ } @@ -904,7 +1071,7 @@ glob (pattern, flags, errfunc, pglob) status = glob_in_dir (filename, dirs.gl_pathv[i], ((flags | GLOB_APPEND) & ~(GLOB_NOCHECK | GLOB_NOMAGIC)), - errfunc, pglob); + errfunc, pglob, alloca_used); if (status == GLOB_NOMATCH) /* No matches in this directory. Try the next. */ continue; @@ -1005,7 +1172,8 @@ glob (pattern, flags, errfunc, pglob) } if (dirname_modified) flags &= ~(GLOB_NOCHECK | GLOB_NOMAGIC); - status = glob_in_dir (filename, dirname, flags, errfunc, pglob); + status = glob_in_dir (filename, dirname, flags, errfunc, pglob, + alloca_used); if (status != 0) { if (status == GLOB_NOMATCH && flags != orig_flags @@ -1068,7 +1236,11 @@ glob (pattern, flags, errfunc, pglob) sizeof (char *), collated_compare); } - return 0; + out: + if (__builtin_expect (malloc_dirname, 0)) + free (dirname); + + return retval; } #if defined _LIBC && !defined glob libc_hidden_def (glob) @@ -1278,7 +1450,7 @@ link_exists2_p (const char *dir, size_t dirlen, const char *fname, static int glob_in_dir (const char *pattern, const char *directory, int flags, int (*errfunc) (const char *, int), - glob_t *pglob) + glob_t *pglob, size_t alloca_used) { size_t dirlen = strlen (directory); void *stream = NULL; @@ -1293,11 +1465,12 @@ glob_in_dir (const char *pattern, const char *directory, int flags, struct globnames *names = &init_names; struct globnames *names_alloca = &init_names; size_t nfound = 0; - size_t allocasize = sizeof (init_names); size_t cur = 0; int meta; int save; + alloca_used += sizeof (init_names); + init_names.next = NULL; init_names.count = INITIAL_COUNT; @@ -1313,20 +1486,36 @@ glob_in_dir (const char *pattern, const char *directory, int flags, { /* Since we use the normal file functions we can also use stat() to verify the file is there. */ - struct stat st; - struct_stat64 st64; + union + { + struct stat st; + struct_stat64 st64; + } ust; size_t patlen = strlen (pattern); - char *fullname = (char *) __alloca (dirlen + 1 + patlen + 1); + int alloca_fullname = __libc_use_alloca (alloca_used + + dirlen + 1 + patlen + 1); + char *fullname; + if (alloca_fullname) + fullname = alloca_account (dirlen + 1 + patlen + 1, alloca_used); + else + { + fullname = malloc (dirlen + 1 + patlen + 1); + if (fullname == NULL) + return GLOB_NOSPACE; + } mempcpy (mempcpy (mempcpy (fullname, directory, dirlen), "/", 1), pattern, patlen + 1); if ((__builtin_expect (flags & GLOB_ALTDIRFUNC, 0) - ? (*pglob->gl_stat) (fullname, &st) - : __stat64 (fullname, &st64)) == 0) + ? (*pglob->gl_stat) (fullname, &ust.st) + : __stat64 (fullname, &ust.st64)) == 0) /* We found this file to be existing. Now tell the rest of the function to copy this name into the result. */ flags |= GLOB_NOCHECK; + + if (__builtin_expect (!alloca_fullname, 0)) + free (fullname); } else { @@ -1414,9 +1603,9 @@ glob_in_dir (const char *pattern, const char *directory, int flags, size_t size = (sizeof (struct globnames) + ((count - INITIAL_COUNT) * sizeof (char *))); - allocasize += size; - if (__libc_use_alloca (allocasize)) - newnames = names_alloca = __alloca (size); + if (__libc_use_alloca (alloca_used + size)) + newnames = names_alloca + = alloca_account (size, alloca_used); else if ((newnames = malloc (size)) == NULL) goto memory_error; diff --git a/posix/glob.h b/posix/glob.h index 89a1886..4aa3203 100644 --- a/posix/glob.h +++ b/posix/glob.h @@ -143,7 +143,7 @@ typedef struct } glob64_t; #endif -#if __USE_FILE_OFFSET64 && __GNUC__ < 2 +#if defined __USE_FILE_OFFSET64 && __GNUC__ < 2 # define glob glob64 # define globfree globfree64 #endif diff --git a/posix/posix_madvise.c b/posix/posix_madvise.c index 6f8d60f..3eba60a 100644 --- a/posix/posix_madvise.c +++ b/posix/posix_madvise.c @@ -28,5 +28,5 @@ posix_madvise (__ptr_t addr, size_t len, int advice) { return ENOSYS; } -stub_warning (posix_madvise) -#include +/* stub_warning (posix_madvise) +#include */ diff --git a/posix/regcomp.c b/posix/regcomp.c index 3a49b87..646fd6f 100644 --- a/posix/regcomp.c +++ b/posix/regcomp.c @@ -3438,19 +3438,18 @@ build_equiv_class (bitset_t sbcset, const unsigned char *name) _NL_COLLATE_EXTRAMB); indirect = (const int32_t *) _NL_CURRENT (LC_COLLATE, _NL_COLLATE_INDIRECTMB); - idx1 = findidx (&cp); - if (BE (idx1 == 0 || cp < name + strlen ((const char *) name), 0)) + idx1 = findidx (&cp, -1); + if (BE (idx1 == 0 || *cp != '\0', 0)) /* This isn't a valid character. */ return REG_ECOLLATE; /* Build single byte matcing table for this equivalence class. */ - char_buf[1] = (unsigned char) '\0'; len = weights[idx1 & 0xffffff]; for (ch = 0; ch < SBC_MAX; ++ch) { char_buf[0] = ch; cp = char_buf; - idx2 = findidx (&cp); + idx2 = findidx (&cp, 1); /* idx2 = table[ch]; */ diff --git a/posix/regex_internal.c b/posix/regex_internal.c index c481d2f..a7d528f 100644 --- a/posix/regex_internal.c +++ b/posix/regex_internal.c @@ -237,13 +237,8 @@ build_wcs_buffer (re_string_t *pstr) else p = (const char *) pstr->raw_mbs + pstr->raw_mbs_idx + byte_idx; mbclen = __mbrtowc (&wc, p, remain_len, &pstr->cur_state); - if (BE (mbclen == (size_t) -2, 0)) - { - /* The buffer doesn't have enough space, finish to build. */ - pstr->cur_state = prev_st; - break; - } - else if (BE (mbclen == (size_t) -1 || mbclen == 0, 0)) + if (BE (mbclen == (size_t) -1 || mbclen == 0 + || (mbclen == (size_t) -2 && pstr->bufs_len >= pstr->len), 0)) { /* We treat these cases as a singlebyte character. */ mbclen = 1; @@ -252,6 +247,12 @@ build_wcs_buffer (re_string_t *pstr) wc = pstr->trans[wc]; pstr->cur_state = prev_st; } + else if (BE (mbclen == (size_t) -2, 0)) + { + /* The buffer doesn't have enough space, finish to build. */ + pstr->cur_state = prev_st; + break; + } /* Write wide character and padding. */ pstr->wcs[byte_idx++] = wc; @@ -334,9 +335,11 @@ build_wcs_upper_buffer (re_string_t *pstr) for (remain_len = byte_idx + mbclen - 1; byte_idx < remain_len ;) pstr->wcs[byte_idx++] = WEOF; } - else if (mbclen == (size_t) -1 || mbclen == 0) + else if (mbclen == (size_t) -1 || mbclen == 0 + || (mbclen == (size_t) -2 && pstr->bufs_len >= pstr->len)) { - /* It is an invalid character or '\0'. Just use the byte. */ + /* It is an invalid character, an incomplete character + at the end of the string, or '\0'. Just use the byte. */ int ch = pstr->raw_mbs[pstr->raw_mbs_idx + byte_idx]; pstr->mbs[byte_idx] = ch; /* And also cast it to wide char. */ @@ -449,7 +452,8 @@ build_wcs_upper_buffer (re_string_t *pstr) for (remain_len = byte_idx + mbclen - 1; byte_idx < remain_len ;) pstr->wcs[byte_idx++] = WEOF; } - else if (mbclen == (size_t) -1 || mbclen == 0) + else if (mbclen == (size_t) -1 || mbclen == 0 + || (mbclen == (size_t) -2 && pstr->bufs_len >= pstr->len)) { /* It is an invalid character or '\0'. Just use the byte. */ int ch = pstr->raw_mbs[pstr->raw_mbs_idx + src_idx]; diff --git a/posix/regex_internal.h b/posix/regex_internal.h index 1a210f9..3f6f69d 100644 --- a/posix/regex_internal.h +++ b/posix/regex_internal.h @@ -26,6 +26,7 @@ #include #include #include +#include #if defined _LIBC # include @@ -775,7 +776,7 @@ re_string_elem_size_at (const re_string_t *pstr, int idx) indirect = (const int32_t *) _NL_CURRENT (LC_COLLATE, _NL_COLLATE_INDIRECTMB); p = pstr->mbs + idx; - tmp = findidx (&p); + tmp = findidx (&p, pstr->len - idx); return p - pstr->mbs - idx; } else diff --git a/posix/regexec.c b/posix/regexec.c index d9c5774..f913e9e 100644 --- a/posix/regexec.c +++ b/posix/regexec.c @@ -200,7 +200,7 @@ static int group_nodes_into_DFAstates (const re_dfa_t *dfa, static int check_node_accept (const re_match_context_t *mctx, const re_token_t *node, int idx) internal_function; -static reg_errcode_t extend_buffers (re_match_context_t *mctx) +static reg_errcode_t extend_buffers (re_match_context_t *mctx, int min_len) internal_function; /* Entry point for POSIX code. */ @@ -1142,11 +1142,12 @@ check_matching (re_match_context_t *mctx, int fl_longest_match, re_dfastate_t *old_state = cur_state; int next_char_idx = re_string_cur_idx (&mctx->input) + 1; - if (BE (next_char_idx >= mctx->input.bufs_len, 0) + if ((BE (next_char_idx >= mctx->input.bufs_len, 0) + && mctx->input.bufs_len < mctx->input.len) || (BE (next_char_idx >= mctx->input.valid_len, 0) && mctx->input.valid_len < mctx->input.len)) { - err = extend_buffers (mctx); + err = extend_buffers (mctx, next_char_idx + 1); if (BE (err != REG_NOERROR, 0)) { assert (err == REG_ESPACE); @@ -1718,12 +1719,13 @@ clean_state_log_if_needed (re_match_context_t *mctx, int next_state_log_idx) { int top = mctx->state_log_top; - if (next_state_log_idx >= mctx->input.bufs_len + if ((next_state_log_idx >= mctx->input.bufs_len + && mctx->input.bufs_len < mctx->input.len) || (next_state_log_idx >= mctx->input.valid_len && mctx->input.valid_len < mctx->input.len)) { reg_errcode_t err; - err = extend_buffers (mctx); + err = extend_buffers (mctx, next_state_log_idx + 1); if (BE (err != REG_NOERROR, 0)) return err; } @@ -2777,7 +2779,7 @@ get_subexp (re_match_context_t *mctx, int bkref_node, int bkref_str_idx) if (bkref_str_off >= mctx->input.len) break; - err = extend_buffers (mctx); + err = extend_buffers (mctx, bkref_str_off + 1); if (BE (err != REG_NOERROR, 0)) return err; @@ -3911,7 +3913,7 @@ check_node_accept_bytes (const re_dfa_t *dfa, int node_idx, _NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAMB); indirect = (const int32_t *) _NL_CURRENT (LC_COLLATE, _NL_COLLATE_INDIRECTMB); - int32_t idx = findidx (&cp); + int32_t idx = findidx (&cp, elem_len); if (idx > 0) for (i = 0; i < cset->nequiv_classes; ++i) { @@ -4095,7 +4097,7 @@ check_node_accept (const re_match_context_t *mctx, const re_token_t *node, static reg_errcode_t internal_function __attribute_warn_unused_result__ -extend_buffers (re_match_context_t *mctx) +extend_buffers (re_match_context_t *mctx, int min_len) { reg_errcode_t ret; re_string_t *pstr = &mctx->input; @@ -4104,8 +4106,10 @@ extend_buffers (re_match_context_t *mctx) if (BE (INT_MAX / 2 / sizeof (re_dfastate_t *) <= pstr->bufs_len, 0)) return REG_ESPACE; - /* Double the lengthes of the buffers. */ - ret = re_string_realloc_buffers (pstr, pstr->bufs_len * 2); + /* Double the lengthes of the buffers, but allocate at least MIN_LEN. */ + ret = re_string_realloc_buffers (pstr, + MAX (min_len, + MIN (pstr->len, pstr->bufs_len * 2))); if (BE (ret != REG_NOERROR, 0)) return ret; diff --git a/posix/spawn_faction_addopen.c b/posix/spawn_faction_addopen.c index f0fa4c0..7f03efe 100644 --- a/posix/spawn_faction_addopen.c +++ b/posix/spawn_faction_addopen.c @@ -19,6 +19,7 @@ #include #include #include +#include #include "spawn_int.h" @@ -36,17 +37,24 @@ posix_spawn_file_actions_addopen (posix_spawn_file_actions_t *file_actions, if (fd < 0 || fd >= maxfd) return EBADF; + char *path_copy = strdup (path); + if (path_copy == NULL) + return ENOMEM; + /* Allocate more memory if needed. */ if (file_actions->__used == file_actions->__allocated && __posix_spawn_file_actions_realloc (file_actions) != 0) - /* This can only mean we ran out of memory. */ - return ENOMEM; + { + /* This can only mean we ran out of memory. */ + free (path_copy); + return ENOMEM; + } /* Add the new value. */ rec = &file_actions->__actions[file_actions->__used]; rec->tag = spawn_do_open; rec->action.open_action.fd = fd; - rec->action.open_action.path = path; + rec->action.open_action.path = path_copy; rec->action.open_action.oflag = oflag; rec->action.open_action.mode = mode; diff --git a/posix/spawn_faction_destroy.c b/posix/spawn_faction_destroy.c index aed3bae..e724970 100644 --- a/posix/spawn_faction_destroy.c +++ b/posix/spawn_faction_destroy.c @@ -19,11 +19,29 @@ #include #include -/* Initialize data structure for file attribute for `spawn' call. */ +#include "spawn_int.h" + +/* Deallocate the file actions. */ int posix_spawn_file_actions_destroy (posix_spawn_file_actions_t *file_actions) { - /* Free the memory allocated. */ + /* Free the paths in the open actions. */ + for (int i = 0; i < file_actions->__used; ++i) + { + struct __spawn_action *sa = &file_actions->__actions[i]; + switch (sa->tag) + { + case spawn_do_open: + free (sa->action.open_action.path); + break; + case spawn_do_close: + case spawn_do_dup2: + /* No cleanup required. */ + break; + } + } + + /* Free the array of actions. */ free (file_actions->__actions); return 0; } diff --git a/posix/spawn_int.h b/posix/spawn_int.h index a3e9347..ff859e1 100644 --- a/posix/spawn_int.h +++ b/posix/spawn_int.h @@ -22,7 +22,7 @@ struct __spawn_action struct { int fd; - const char *path; + char *path; int oflag; mode_t mode; } open_action; diff --git a/posix/tst-spawn.c b/posix/tst-spawn.c index 4b5d894..03d3ad0 100644 --- a/posix/tst-spawn.c +++ b/posix/tst-spawn.c @@ -169,6 +169,7 @@ do_test (int argc, char *argv[]) char fd2name[18]; char fd3name[18]; char fd4name[18]; + char *name3_copy; char *spargv[12]; /* We must have @@ -222,9 +223,15 @@ do_test (int argc, char *argv[]) if (posix_spawn_file_actions_addclose (&actions, fd1) != 0) error (EXIT_FAILURE, errno, "posix_spawn_file_actions_addclose"); /* We want to open the third file. */ - if (posix_spawn_file_actions_addopen (&actions, fd3, name3, + name3_copy = strdup (name3); + if (name3_copy == NULL) + error (EXIT_FAILURE, errno, "strdup"); + if (posix_spawn_file_actions_addopen (&actions, fd3, name3_copy, O_RDONLY, 0666) != 0) error (EXIT_FAILURE, errno, "posix_spawn_file_actions_addopen"); + /* Overwrite the name to check that a copy has been made. */ + memset (name3_copy, 'X', strlen (name3_copy)); + /* We dup the second descriptor. */ fd4 = MAX (2, MAX (fd1, MAX (fd2, fd3))) + 1; if (posix_spawn_file_actions_adddup2 (&actions, fd2, fd4) != 0) @@ -255,6 +262,7 @@ do_test (int argc, char *argv[]) /* Cleanup. */ if (posix_spawn_file_actions_destroy (&actions) != 0) error (EXIT_FAILURE, errno, "posix_spawn_file_actions_destroy"); + free (name3_copy); /* Wait for the child. */ if (waitpid (pid, &status, 0) != pid) diff --git a/posix/tst-sysconf.c b/posix/tst-sysconf.c index e297229..105c7c2 100644 --- a/posix/tst-sysconf.c +++ b/posix/tst-sysconf.c @@ -29,8 +29,12 @@ static struct N (MEMORY_PROTECTION), N (MESSAGE_PASSING), N (MONOTONIC_CLOCK), +#ifdef _POSIX_PRIORITIZED_IO N (PRIORITIZED_IO), +#endif +#ifdef _POSIX_PRIORITY_SCHEDULING N (PRIORITY_SCHEDULING), +#endif N (RAW_SOCKETS), N (READER_WRITER_LOCKS), N (REALTIME_SIGNALS), @@ -42,7 +46,9 @@ static struct N (SPAWN), N (SPIN_LOCKS), N (SPORADIC_SERVER), +#ifdef _POSIX_SYNCHRONIZED_IO N (SYNCHRONIZED_IO), +#endif N (THREAD_ATTR_STACKADDR), N (THREAD_ATTR_STACKSIZE), N (THREAD_CPUTIME), diff --git a/posix/wordexp-test.c b/posix/wordexp-test.c index db418ce..dfb25ad 100644 --- a/posix/wordexp-test.c +++ b/posix/wordexp-test.c @@ -28,6 +28,25 @@ #define IFS " \n\t" +extern void *__dso_handle __attribute__ ((__weak__, __visibility__ ("hidden"))); +extern int __register_atfork (void (*) (void), void (*) (void), void (*) (void), void *); + +static int __app_register_atfork (void (*prepare) (void), void (*parent) (void), void (*child) (void)) +{ + return __register_atfork (prepare, parent, child, + &__dso_handle == NULL ? NULL : __dso_handle); +} + +/* Number of forks seen. */ +static int registered_forks; + +/* For each fork increment the fork count. */ +static void +register_fork (void) +{ + registered_forks++; +} + struct test_case_struct { int retval; @@ -207,6 +226,12 @@ struct test_case_struct { WRDE_SYNTAX, NULL, "$((2+))", 0, 0, { NULL, }, IFS }, { WRDE_SYNTAX, NULL, "`", 0, 0, { NULL, }, IFS }, { WRDE_SYNTAX, NULL, "$((010+4+))", 0, 0, { NULL }, IFS }, + /* Test for CVE-2014-7817. We test 3 combinations of command + substitution inside an arithmetic expression to make sure that + no commands are executed and error is returned. */ + { WRDE_CMDSUB, NULL, "$((`echo 1`))", WRDE_NOCMD, 0, { NULL, }, IFS }, + { WRDE_CMDSUB, NULL, "$((1+`echo 1`))", WRDE_NOCMD, 0, { NULL, }, IFS }, + { WRDE_CMDSUB, NULL, "$((1+$((`echo 1`))))", WRDE_NOCMD, 0, { NULL, }, IFS }, { -1, NULL, NULL, 0, 0, { NULL, }, IFS }, }; @@ -259,6 +284,15 @@ main (int argc, char *argv[]) return -1; } + /* If we are not allowed to do command substitution, we install + fork handlers to verify that no forks happened. No forks should + happen at all if command substitution is disabled. */ + if (__app_register_atfork (register_fork, NULL, NULL) != 0) + { + printf ("Failed to register fork handler.\n"); + return -1; + } + for (test = 0; test_case[test].retval != -1; test++) if (testit (&test_case[test])) ++fail; @@ -368,6 +402,9 @@ testit (struct test_case_struct *tc) printf ("Test %d (%s): ", ++tests, tc->words); + if (tc->flags & WRDE_NOCMD) + registered_forks = 0; + if (tc->flags & WRDE_APPEND) { /* initial wordexp() call, to be appended to */ @@ -379,6 +416,13 @@ testit (struct test_case_struct *tc) } retval = wordexp (tc->words, &we, tc->flags); + if ((tc->flags & WRDE_NOCMD) + && (registered_forks > 0)) + { + printf ("FAILED fork called for WRDE_NOCMD\n"); + return 1; + } + if (tc->flags & WRDE_DOOFFS) start_offs = sav_we.we_offs; diff --git a/posix/wordexp.c b/posix/wordexp.c index 058a7cf..c9df60a 100644 --- a/posix/wordexp.c +++ b/posix/wordexp.c @@ -895,6 +895,10 @@ exec_comm (char *comm, char **word, size_t *word_length, size_t *max_length, pid_t pid; int noexec = 0; + /* Do nothing if command substitution should not succeed. */ + if (flags & WRDE_NOCMD) + return WRDE_CMDSUB; + /* Don't fork() unless necessary */ if (!comm || !*comm) return 0; @@ -2074,9 +2078,6 @@ parse_dollars (char **word, size_t *word_length, size_t *max_length, } } - if (flags & WRDE_NOCMD) - return WRDE_CMDSUB; - (*offset) += 2; return parse_comm (word, word_length, max_length, words, offset, flags, quoted? NULL : pwordexp, ifs, ifs_white); @@ -2188,9 +2189,6 @@ parse_dquote (char **word, size_t *word_length, size_t *max_length, break; case '`': - if (flags & WRDE_NOCMD) - return WRDE_CMDSUB; - ++(*offset); error = parse_backtick (word, word_length, max_length, words, offset, flags, NULL, NULL, NULL); @@ -2349,12 +2347,6 @@ wordexp (const char *words, wordexp_t *pwordexp, int flags) break; case '`': - if (flags & WRDE_NOCMD) - { - error = WRDE_CMDSUB; - goto do_error; - } - ++words_offset; error = parse_backtick (&word, &word_length, &max_length, words, &words_offset, flags, pwordexp, ifs, diff --git a/resolv/Depend b/resolv/Depend index 8d2587b..5c6ec03 100644 --- a/resolv/Depend +++ b/resolv/Depend @@ -1,2 +1,3 @@ linuxthreads nptl +libpthread diff --git a/resolv/nss_dns/dns-host.c b/resolv/nss_dns/dns-host.c index 077e3ce..08ba774 100644 --- a/resolv/nss_dns/dns-host.c +++ b/resolv/nss_dns/dns-host.c @@ -606,7 +606,8 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype, int have_to_map = 0; uintptr_t pad = -(uintptr_t) buffer % __alignof__ (struct host_data); buffer += pad; - if (__builtin_expect (buflen < sizeof (struct host_data) + pad, 0)) + buflen = buflen > pad ? buflen - pad : 0; + if (__builtin_expect (buflen < sizeof (struct host_data), 0)) { /* The buffer is too small. */ too_small: diff --git a/resolv/nss_dns/dns-network.c b/resolv/nss_dns/dns-network.c index f8338fa..f8ba843 100644 --- a/resolv/nss_dns/dns-network.c +++ b/resolv/nss_dns/dns-network.c @@ -402,8 +402,8 @@ getanswer_r (const querybuf *answer, int anslen, struct netent *result, case BYNAME: { - char **ap = result->n_aliases++; - while (*ap != NULL) + char **ap; + for (ap = result->n_aliases; *ap != NULL; ++ap) { /* Check each alias name for being of the forms: 4.3.2.1.in-addr.arpa = net 1.2.3.4 diff --git a/resolv/res_debug.c b/resolv/res_debug.c index f7996a7..3daa44e 100644 --- a/resolv/res_debug.c +++ b/resolv/res_debug.c @@ -189,7 +189,7 @@ do_section(const res_state statp, buf = malloc(buflen += 1024); if (buf == NULL) { fprintf(file, - ";; memory allocation failure\n"); + ";; memory allocation failure\n"); return; } continue; @@ -356,7 +356,7 @@ const struct res_sym __p_class_syms[] = { {C_HS, "HESIOD"}, {C_ANY, "ANY"}, {C_NONE, "NONE"}, - {C_IN, (char *)0} + {C_IN, (char *)0} }; libresolv_hidden_data_def (__p_class_syms) @@ -588,6 +588,7 @@ p_option(u_long option) { case RES_USEBSTRING: return "ip6-bytstring"; case RES_USE_EDNS0: return "edns0"; case RES_USE_DNSSEC: return "dnssec"; + case RES_NOTLDQUERY: return "no-tld-query"; /* XXX nonreentrant */ default: sprintf(nbuf, "?0x%lx?", (u_long)option); return (nbuf); diff --git a/resolv/res_init.c b/resolv/res_init.c index 74715f3..7588432 100644 --- a/resolv/res_init.c +++ b/resolv/res_init.c @@ -545,6 +545,11 @@ res_setoptions(res_state statp, const char *options, const char *source) { } else if (!strncmp(cp, "single-request", sizeof("single-request") - 1)) { statp->options |= RES_SNGLKUP; + } else if (!strncmp(cp, "no_tld_query", + sizeof("no_tld_query") - 1) || + !strncmp(cp, "no-tld-query", + sizeof("no-tld-query") - 1)) { + statp->options |= RES_NOTLDQUERY; } else { /* XXX - print a warning here? */ } diff --git a/resolv/res_libc.c b/resolv/res_libc.c index 5c5b691..f141316 100644 --- a/resolv/res_libc.c +++ b/resolv/res_libc.c @@ -28,6 +28,7 @@ out) since res_init() should go into libc.so but the rest of that file should not. */ +__libc_lock_define_initialized (static, lock); extern unsigned long long int __res_initstamp attribute_hidden; /* We have atomic increment operations on 64-bit platforms. */ #if __WORDSIZE == 64 @@ -35,7 +36,6 @@ extern unsigned long long int __res_initstamp attribute_hidden; # define atomicincunlock(lock) (void) 0 # define atomicinc(var) catomic_increment (&(var)) #else -__libc_lock_define_initialized (static, lock); # define atomicinclock(lock) __libc_lock_lock (lock) # define atomicincunlock(lock) __libc_lock_unlock (lock) # define atomicinc(var) ++var @@ -100,12 +100,12 @@ __res_maybe_init (res_state resp, int preinit) if (resp->options & RES_INIT) { ret = stat (_PATH_RESCONF, &statbuf); + __libc_lock_lock (lock); if ((ret == 0) && (last_mtime != statbuf.st_mtime)) { last_mtime = statbuf.st_mtime; - atomicinclock (lock); atomicinc (__res_initstamp); - atomicincunlock (lock); } + __libc_lock_unlock (lock); if (__res_initstamp != resp->_u._ext.initstamp) { if (resp->nscount > 0) __res_iclose (resp, true); diff --git a/resolv/res_query.c b/resolv/res_query.c index 135ad53..9bd00f1 100644 --- a/resolv/res_query.c +++ b/resolv/res_query.c @@ -123,8 +123,9 @@ __libc_res_nquery(res_state statp, int *answerp2_malloced) { HEADER *hp = (HEADER *) answer; + HEADER *hp2; int n, use_malloc = 0; - u_int oflags = statp->_flags; + u_int oflags = statp->_flags; size_t bufsize = (type == T_UNSPEC ? 2 : 1) * QUERYSIZE; u_char *buf = alloca (bufsize); @@ -211,7 +212,7 @@ __libc_res_nquery(res_state statp, if (statp->options & RES_DEBUG) printf(";; res_nquery: retry without EDNS0\n"); #endif - goto again; + goto again; } #ifdef DEBUG if (statp->options & RES_DEBUG) @@ -241,26 +242,25 @@ __libc_res_nquery(res_state statp, /* __libc_res_nsend might have reallocated the buffer. */ hp = (HEADER *) *answerp; - /* We simplify the following tests by assigning HP to HP2. It - is easy to verify that this is the same as ignoring all - tests of HP2. */ - HEADER *hp2 = answerp2 ? (HEADER *) *answerp2 : hp; - - if (n < (int) sizeof (HEADER) && answerp2 != NULL - && *resplen2 > (int) sizeof (HEADER)) + /* We simplify the following tests by assigning HP to HP2 or + vice versa. It is easy to verify that this is the same as + ignoring all tests of HP or HP2. */ + if (answerp2 == NULL || *resplen2 < (int) sizeof (HEADER)) { - /* Special case of partial answer. */ - assert (hp != hp2); - hp = hp2; + hp2 = hp; } - else if (answerp2 != NULL && *resplen2 < (int) sizeof (HEADER) - && n > (int) sizeof (HEADER)) + else { - /* Special case of partial answer. */ - assert (hp != hp2); - hp2 = hp; + hp2 = (HEADER *) *answerp2; + if (n < (int) sizeof (HEADER)) + { + hp = hp2; + } } + /* Make sure both hp and hp2 are defined */ + assert((hp != NULL) && (hp2 != NULL)); + if ((hp->rcode != NOERROR || ntohs(hp->ancount) == 0) && (hp2->rcode != NOERROR || ntohs(hp2->ancount) == 0)) { #ifdef DEBUG @@ -347,6 +347,7 @@ __libc_res_nsearch(res_state statp, int trailing_dot, ret, saved_herrno; int got_nodata = 0, got_servfail = 0, root_on_list = 0; int tried_as_is = 0; + int searched = 0; __set_errno (0); RES_SET_H_ERRNO(statp, HOST_NOT_FOUND); /* True if we never query. */ @@ -411,6 +412,7 @@ __libc_res_nsearch(res_state statp, for (domain = (const char * const *)statp->dnsrch; *domain && !done; domain++) { + searched = 1; if (domain[0][0] == '\0' || (domain[0][0] == '.' && domain[0][1] == '\0')) @@ -482,11 +484,11 @@ __libc_res_nsearch(res_state statp, } /* - * If the name has any dots at all, and no earlier 'as-is' query - * for the name, and "." is not on the search list, then try an as-is - * query now. + * f the query has not already been tried as is then try it + * unless RES_NOTLDQUERY is set and there were no dots. */ - if (dots && !(tried_as_is || root_on_list)) { + if ((dots || !searched || (statp->options & RES_NOTLDQUERY) == 0) + && !(tried_as_is || root_on_list)) { ret = __libc_res_nquerydomain(statp, name, NULL, class, type, answer, anslen, answerp, answerp2, nanswerp2, resplen2, diff --git a/resolv/res_send.c b/resolv/res_send.c index 716aa03..b7ab377 100644 --- a/resolv/res_send.c +++ b/resolv/res_send.c @@ -120,13 +120,13 @@ static const char rcsid[] = "$BINDId: res_send.c,v 8.38 2000/03/30 20:16:51 vixi #define MAXPACKET 65536 #endif - +#ifdef SOCK_NONBLOCK #ifndef __ASSUME_SOCK_CLOEXEC static int __have_o_nonblock; #else # define __have_o_nonblock 0 #endif - +#endif /* From ev_streams.c. */ @@ -460,7 +460,7 @@ __libc_res_nsend(res_state statp, const u_char *buf, int buflen, malloc(sizeof (struct sockaddr_in6)); if (EXT(statp).nsaddrs[n] != NULL) { memset (mempcpy(EXT(statp).nsaddrs[n], - &statp->nsaddr_list[n], + &statp->nsaddr_list[ns], sizeof (struct sockaddr_in)), '\0', sizeof (struct sockaddr_in6) @@ -569,7 +569,7 @@ __libc_res_nsend(res_state statp, const u_char *buf, int buflen, ansp2_malloced); if (n < 0) return (-1); - if (n == 0) + if (n == 0 && (buf2 == NULL || *resplen2 == 0)) goto next_ns; } else { /* Use datagrams. */ @@ -579,7 +579,7 @@ __libc_res_nsend(res_state statp, const u_char *buf, int buflen, ansp2, nansp2, resplen2, ansp2_malloced); if (n < 0) return (-1); - if (n == 0) + if (n == 0 && (buf2 == NULL || *resplen2 == 0)) goto next_ns; if (v_circuit) // XXX Check whether both requests failed or @@ -996,6 +996,7 @@ reopen (res_state statp, int *terrno, int ns) /* only try IPv6 if IPv6 NS and if not failed before */ if (nsap->sa_family == AF_INET6 && !statp->ipv6_unavail) { +#ifdef SOCK_NONBLOCK if (__builtin_expect (__have_o_nonblock >= 0, 1)) { EXT(statp).nssocks[ns] = socket(PF_INET6, SOCK_DGRAM|SOCK_NONBLOCK, @@ -1008,12 +1009,14 @@ reopen (res_state statp, int *terrno, int ns) #endif } if (__builtin_expect (__have_o_nonblock < 0, 0)) +#endif EXT(statp).nssocks[ns] = socket(PF_INET6, SOCK_DGRAM, 0); if (EXT(statp).nssocks[ns] < 0) statp->ipv6_unavail = errno == EAFNOSUPPORT; slen = sizeof (struct sockaddr_in6); } else if (nsap->sa_family == AF_INET) { +#ifdef SOCK_NONBLOCK if (__builtin_expect (__have_o_nonblock >= 0, 1)) { EXT(statp).nssocks[ns] = socket(PF_INET, SOCK_DGRAM|SOCK_NONBLOCK, @@ -1026,6 +1029,7 @@ reopen (res_state statp, int *terrno, int ns) #endif } if (__builtin_expect (__have_o_nonblock < 0, 0)) +#endif EXT(statp).nssocks[ns] = socket(PF_INET, SOCK_DGRAM, 0); slen = sizeof (struct sockaddr_in); @@ -1052,7 +1056,11 @@ reopen (res_state statp, int *terrno, int ns) __res_iclose(statp, false); return (0); } +#ifdef SOCK_NONBLOCK if (__builtin_expect (__have_o_nonblock < 0, 0)) { +#else + { +#endif /* Make socket non-blocking. */ int fl = __fcntl (EXT(statp).nssocks[ns], F_GETFL); if (fl != -1) @@ -1305,7 +1313,7 @@ send_dg(res_state statp, MSG_TRUNC which is only available on Linux. We can abstract out the Linux-specific feature in the future to detect truncation. */ - if (__builtin_expect (*thisanssizp < *thisresplenp, 0)) { + if (__glibc_unlikely (*thisanssizp < *thisresplenp)) { Dprint(statp->options & RES_DEBUG, (stdout, ";; response may be truncated (UDP)\n") ); @@ -1417,10 +1425,14 @@ send_dg(res_state statp, (*thisresplenp > *thisanssizp) ? *thisanssizp : *thisresplenp); - if (recvresp1 || (buf2 != NULL && recvresp2)) + if (recvresp1 || (buf2 != NULL && recvresp2)) { + *resplen2 = 0; return resplen; + } if (buf2 != NULL) { + /* No data from the first reply. */ + resplen = 0; /* We are waiting for a possible second reply. */ if (hp->id == anhp->id) recvresp1 = 1; @@ -1472,6 +1484,7 @@ send_dg(res_state statp, retval = reopen (statp, terrno, ns); if (retval <= 0) return retval; + pfd[0].fd = EXT(statp).nssocks[ns]; } } goto wait; @@ -1486,7 +1499,7 @@ send_dg(res_state statp, goto err_out; } else { - /* poll should not have returned > 0 in this case. */ + /* poll should not have returned > 0 in this case. */ abort (); } } diff --git a/resolv/resolv.h b/resolv/resolv.h index e49c29d..ed15a70 100644 --- a/resolv/resolv.h +++ b/resolv/resolv.h @@ -102,7 +102,7 @@ typedef res_sendhookact (*res_send_rhook) (const struct sockaddr_in *__ns, # define RES_MAXTIME 65535 /* Infinity, in milliseconds. */ struct __res_state { - int retrans; /* retransmition time interval */ + int retrans; /* retransmition time interval */ int retry; /* number of times to retransmit */ u_long options; /* option flags - see below. */ int nscount; /* number of name servers */ @@ -219,6 +219,8 @@ struct res_sym { #define RES_SNGLKUPREOP 0x00400000 /* -"-, but open new socket for each request */ #define RES_USE_DNSSEC 0x00800000 /* use DNSSEC using OK bit in OPT */ +#define RES_NOTLDQUERY 0x01000000 /* Do not look up unqualified name + as a TLD. */ #define RES_DEFAULT (RES_RECURSE|RES_DEFNAMES|RES_DNSRCH|RES_NOIP6DOTINT) diff --git a/rt/Depend b/rt/Depend index 8d2587b..5c6ec03 100644 --- a/rt/Depend +++ b/rt/Depend @@ -1,2 +1,3 @@ linuxthreads nptl +libpthread diff --git a/rt/bits/mqueue2.h b/rt/bits/mqueue2.h index 4c90609..a6d0815 100644 --- a/rt/bits/mqueue2.h +++ b/rt/bits/mqueue2.h @@ -1,5 +1,5 @@ /* Checking macros for mq functions. - Copyright (C) 2007 Free Software Foundation, Inc. + Copyright (C) 2007, 2011 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -25,16 +25,18 @@ parameter. */ extern mqd_t mq_open (__const char *__name, int __oflag, ...) __THROW __nonnull ((1)); -extern mqd_t __mq_open_2 (__const char *__name, int __oflag) __nonnull ((1)); -extern mqd_t __REDIRECT (__mq_open_alias, (__const char *__name, int __oflag, ...), - mq_open) __nonnull ((1)); +extern mqd_t __mq_open_2 (__const char *__name, int __oflag) + __THROW __nonnull ((1)); +extern mqd_t __REDIRECT_NTH (__mq_open_alias, (__const char *__name, + int __oflag, ...), mq_open) + __nonnull ((1)); __errordecl (__mq_open_wrong_number_of_args, "mq_open can be called either with 2 or 4 arguments"); __errordecl (__mq_open_missing_mode_and_attr, "mq_open with O_CREAT in second argument needs 4 arguments"); __extern_always_inline mqd_t -mq_open (__const char *__name, int __oflag, ...) +__NTH (mq_open (__const char *__name, int __oflag, ...)) { if (__va_arg_pack_len () != 0 && __va_arg_pack_len () != 2) __mq_open_wrong_number_of_args (); diff --git a/scripts/config.guess b/scripts/config.guess index ec46d18..739c0cc 100755 --- a/scripts/config.guess +++ b/scripts/config.guess @@ -1,10 +1,10 @@ #! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, -# Inc. +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 +# Free Software Foundation, Inc. -timestamp='2006-02-27' +timestamp='2009-04-27' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by @@ -56,8 +56,8 @@ version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 -Free Software Foundation, Inc. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -161,6 +161,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched @@ -211,7 +212,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) - echo powerppc-unknown-mirbsd${UNAME_RELEASE} + echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} @@ -323,14 +324,30 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; + s390x:SunOS:*:*) + echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; - i86pc:SunOS:5.*:*) - echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + eval $set_cc_for_build + SUN_ARCH="i386" + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH="x86_64" + fi + fi + echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize @@ -531,7 +548,7 @@ EOF echo rs6000-ibm-aix3.2 fi exit ;; - *:AIX:*:[45]) + *:AIX:*:[456]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 @@ -771,6 +788,8 @@ EOF case ${UNAME_MACHINE} in pc98) echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + amd64) + echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac @@ -778,10 +797,7 @@ EOF i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; - i*:MINGW*:*) - echo ${UNAME_MACHINE}-pc-mingw32 - exit ;; - i*:MSYS_NT-*:*:*) + *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:windows32*:*) @@ -791,12 +807,18 @@ EOF i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; - x86:Interix*:[345]*) - echo i586-pc-interix${UNAME_RELEASE} - exit ;; - EM64T:Interix*:[345]*) - echo x86_64-unknown-interix${UNAME_RELEASE} - exit ;; + *:Interix*:[3456]*) + case ${UNAME_MACHINE} in + x86) + echo i586-pc-interix${UNAME_RELEASE} + exit ;; + EM64T | authenticamd | genuineintel) + echo x86_64-unknown-interix${UNAME_RELEASE} + exit ;; + IA64) + echo ia64-unknown-interix${UNAME_RELEASE} + exit ;; + esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; @@ -830,6 +852,22 @@ EOF echo ${UNAME_MACHINE}-pc-minix exit ;; arm*:Linux:*:*) + eval $set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo ${UNAME_MACHINE}-unknown-linux-gnu + else + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + echo ${UNAME_MACHINE}-unknown-linux-gnueabi + else + echo ${UNAME_MACHINE}-unknown-linux-gnueabihf + fi + fi + exit ;; + avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; cris:Linux:*:*) @@ -919,6 +957,9 @@ EOF if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-gnu + exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in @@ -948,6 +989,9 @@ EOF x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu exit ;; + xtensa*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; i*86:Linux:*:*) # The BFD linker knows what the default object file format is, so # first see if it will tell us. cd to the root directory to prevent @@ -966,9 +1010,6 @@ EOF a.out-i386-linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" exit ;; - coff-i386) - echo "${UNAME_MACHINE}-pc-linux-gnucoff" - exit ;; "") # Either a pre-BFD a.out linker (linux-gnuoldld) or # one that does not give us useful --help. @@ -990,7 +1031,7 @@ EOF LIBC=gnulibc1 # endif #else - #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__sun) + #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) LIBC=gnu #else LIBC=gnuaout @@ -1083,8 +1124,11 @@ EOF pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about - # the processor, so we play safe by assuming i386. - echo i386-pc-msdosdjgpp + # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configury will decide that + # this is a cross-build. + echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 @@ -1122,6 +1166,16 @@ EOF 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; @@ -1197,6 +1251,9 @@ EOF BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + echo i586-pc-haiku + exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; @@ -1206,6 +1263,15 @@ EOF SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux${UNAME_RELEASE} + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux${UNAME_RELEASE} + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux${UNAME_RELEASE} + exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; @@ -1296,6 +1362,9 @@ EOF i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; + i*86:AROS:*:*) + echo ${UNAME_MACHINE}-pc-aros + exit ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 @@ -1456,9 +1525,9 @@ This script, last modified $timestamp, has failed to recognize the operating system you are using. It is advised that you download the most up to date version of the config scripts from - http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.guess + http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD and - http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.sub + http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD If the version you run ($0) is already up to date, please send the following data and any information you think might be diff --git a/scripts/config.sub b/scripts/config.sub index 51938d0..a39437d 100755 --- a/scripts/config.sub +++ b/scripts/config.sub @@ -1,10 +1,10 @@ #! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, -# Inc. +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 +# Free Software Foundation, Inc. -timestamp='2006-02-27' +timestamp='2009-04-17' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software @@ -72,8 +72,8 @@ Report bugs and patches to ." version="\ GNU config.sub ($timestamp) -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 -Free Software Foundation, Inc. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -122,6 +122,7 @@ maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ + kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` @@ -241,20 +242,24 @@ case $basic_machine in | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ - | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ - | fr30 | frv \ + | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ - | m32r | m32rle | m68000 | m68k | m88k | maxq | mb | microblaze | mcore \ + | lm32 \ + | m32c | m32r | m32rle | m68000 | m68k | m88k \ + | maxq | mb | microblaze | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ - | mips64vr | mips64vrel \ + | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ + | mips64r5900 | mips64r5900el \ + | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ @@ -267,6 +272,7 @@ case $basic_machine in | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ + | moxie \ | mt \ | msp430 \ | nios | nios2 \ @@ -275,19 +281,17 @@ case $basic_machine in | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ - | sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ + | score \ + | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ - | sparc | sparc64 | sparc64b | sparc64v | sparc64v2 | sparc86x | sparclet | sparclite \ - | sparcv8 | sparcv9 | sparcv9b | sparcv9v | sparcv9v2 \ - | strongarm \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ + | spu | strongarm \ | tahoe | thumb | tic4x | tic80 | tron \ | v850 | v850e \ | we32k \ - | x86 | xscale | xscalee[bl] | xstormy16 | xtensa \ - | z8k) - basic_machine=$basic_machine-unknown - ;; - m32c) + | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ + | z8k | z80) basic_machine=$basic_machine-unknown ;; m6811 | m68hc11 | m6812 | m68hc12) @@ -319,25 +323,28 @@ case $basic_machine in | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ - | avr-* \ + | avr-* | avr32-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ - | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ + | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ - | m32r-* | m32rle-* \ + | lm32-* \ + | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ - | m88110-* | m88k-* | maxq-* | mcore-* \ + | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ - | mips64vr-* | mips64vrel-* \ + | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ + | mips64r5900-* | mips64r5900el-* \ + | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ @@ -359,22 +366,24 @@ case $basic_machine in | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* \ - | sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | shbe-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ - | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc64v2-* | sparc86x-* | sparclet-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ - | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sparcv9v2-* | strongarm-* | sv1-* | sx?-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ | tahoe-* | thumb-* \ - | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \ | tron-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ - | x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \ - | xstormy16-* | xtensa-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ + | xstormy16-* | xtensa*-* \ | ymp-* \ - | z8k-*) + | z8k-* | z80-*) ;; - m32c-*) + # Recognize the basic CPU types without company name, with glob match. + xtensa*) + basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. @@ -438,6 +447,10 @@ case $basic_machine in basic_machine=m68k-apollo os=-bsd ;; + aros) + basic_machine=i386-pc + os=-aros + ;; aux) basic_machine=m68k-apple os=-aux @@ -446,10 +459,22 @@ case $basic_machine in basic_machine=ns32k-sequent os=-dynix ;; + blackfin) + basic_machine=bfin-unknown + os=-linux + ;; + blackfin-*) + basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; c90) basic_machine=c90-cray os=-unicos ;; + cegcc) + basic_machine=arm-unknown + os=-cegcc + ;; convex-c1) basic_machine=c1-convex os=-bsd @@ -478,8 +503,8 @@ case $basic_machine in basic_machine=craynv-cray os=-unicosmp ;; - cr16c) - basic_machine=cr16c-unknown + cr16) + basic_machine=cr16-unknown os=-elf ;; crds | unos) @@ -517,6 +542,10 @@ case $basic_machine in basic_machine=m88k-motorola os=-sysv3 ;; + dicos) + basic_machine=i686-pc + os=-dicos + ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp @@ -671,6 +700,14 @@ case $basic_machine in basic_machine=m68k-isi os=-sysv ;; + m68knommu) + basic_machine=m68k-unknown + os=-linux + ;; + m68knommu-*) + basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; m88k-omron*) basic_machine=m88k-omron ;; @@ -686,6 +723,10 @@ case $basic_machine in basic_machine=i386-pc os=-mingw32 ;; + mingw32ce) + basic_machine=arm-unknown + os=-mingw32ce + ;; miniframe) basic_machine=m68000-convergent ;; @@ -812,6 +853,14 @@ case $basic_machine in basic_machine=i860-intel os=-osf ;; + parisc) + basic_machine=hppa-unknown + os=-linux + ;; + parisc-*) + basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; pbd) basic_machine=sparc-tti ;; @@ -913,6 +962,10 @@ case $basic_machine in sb1el) basic_machine=mipsisa64sb1el-unknown ;; + sde) + basic_machine=mipsisa32-sde + os=-elf + ;; sei) basic_machine=mips-sei os=-seiux @@ -924,6 +977,9 @@ case $basic_machine in basic_machine=sh-hitachi os=-hms ;; + sh5el) + basic_machine=sh5le-unknown + ;; sh64) basic_machine=sh64-unknown ;; @@ -1013,6 +1069,10 @@ case $basic_machine in basic_machine=tic6x-unknown os=-coff ;; + tile*) + basic_machine=tile-unknown + os=-linux-gnu + ;; tx39) basic_machine=mipstx39-unknown ;; @@ -1088,6 +1148,10 @@ case $basic_machine in basic_machine=z8k-unknown os=-sim ;; + z80-*-coff) + basic_machine=z80-unknown + os=-sim + ;; none) basic_machine=none-none os=-none @@ -1126,10 +1190,10 @@ case $basic_machine in we32k) basic_machine=we32k-att ;; - sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele) + sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; - sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v | sparcv9v2) + sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) @@ -1198,8 +1262,9 @@ case $os in -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ + | -kopensolaris* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ - | -aos* \ + | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ @@ -1208,7 +1273,7 @@ case $os in | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ - | -chorusos* | -chorusrdb* \ + | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ @@ -1218,7 +1283,7 @@ case $os in | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ - | -skyos* | -haiku* | -rdos*) + | -skyos* | -haiku* | -rdos* | -toppers* | -drops*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) @@ -1348,6 +1413,9 @@ case $os in -zvmoe) os=-zvmoe ;; + -dicos*) + os=-dicos + ;; -none) ;; *) @@ -1370,6 +1438,12 @@ else # system, and we'll never get to this point. case $basic_machine in + score-*) + os=-elf + ;; + spu-*) + os=-elf + ;; *-acorn) os=-riscix1.2 ;; @@ -1379,9 +1453,9 @@ case $basic_machine in arm*-semi) os=-aout ;; - c4x-* | tic4x-*) - os=-coff - ;; + c4x-* | tic4x-*) + os=-coff + ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 @@ -1407,6 +1481,9 @@ case $basic_machine in m68*-cisco) os=-aout ;; + mep-*) + os=-elf + ;; mips*-cisco) os=-elf ;; diff --git a/socket/accept4.c b/socket/accept4.c index 40709d5..53a3e96 100644 --- a/socket/accept4.c +++ b/socket/accept4.c @@ -35,8 +35,6 @@ accept4 (fd, addr, addr_len, flags) __set_errno (ENOSYS); return -1; } -libc_hidden_def (accept4) - stub_warning (accept4) #include diff --git a/socket/have_sock_cloexec.c b/socket/have_sock_cloexec.c index 22dccdf..c728d98 100644 --- a/socket/have_sock_cloexec.c +++ b/socket/have_sock_cloexec.c @@ -16,9 +16,14 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ +#include #include #include #if defined SOCK_CLOEXEC && !defined __ASSUME_SOCK_CLOEXEC int __have_sock_cloexec; #endif + +#if defined O_CLOEXEC && !defined __ASSUME_PIPE2 +int __have_pipe2; +#endif diff --git a/stdio-common/Makefile b/stdio-common/Makefile index d590f99..4de9dab 100644 --- a/stdio-common/Makefile +++ b/stdio-common/Makefile @@ -68,7 +68,7 @@ tests := tstscanf test_rdwr test-popen tstgetln test-fseek \ tst-popen tst-unlockedio tst-fmemopen2 tst-put-error tst-fgets \ tst-fwrite bug16 bug17 tst-sprintf2 bug18 \ bug19 tst-popen2 scanf14 scanf15 bug21 bug22 scanf16 scanf17 \ - tst-setvbuf1 + tst-setvbuf1 bug23-2 bug23-3 bug23-4 tests-$(OPTION_EGLIBC_LOCALE_CODE) \ += tst-sscanf tst-swprintf bug15 test-vfprintf bug14 scanf13 tst-grouping tests-$(OPTION_POSIX_WIDE_CHAR_DEVICE_IO) \ @@ -96,7 +96,7 @@ $(objpfx)tst-printf.out: $(objpfx)tst-printf tst-printf.sh $(SHELL) -e tst-printf.sh $(common-objpfx) '$(run-program-prefix)' # eglibc: endif -CFLAGS-vfprintf.c = -Wno-uninitialized +CFLAGS-vfprintf.c = -Wno-uninitialized -fno-delayed-branch CFLAGS-vfwprintf.c = -Wno-uninitialized CFLAGS-tst-printf.c = -Wno-format CFLAGS-tstdiomisc.c = -Wno-format diff --git a/stdio-common/bug23-2.c b/stdio-common/bug23-2.c new file mode 100644 index 0000000..9e0cfe6 --- /dev/null +++ b/stdio-common/bug23-2.c @@ -0,0 +1,70 @@ +#include +#include +#include + +static const char expected[] = "\ +\n\ +a\n\ +abbcd55\ +\n\ +a\n\ +abbcd55\ +\n\ +a\n\ +abbcd55\ +\n\ +a\n\ +abbcd55\ +\n\ +a\n\ +abbcd55\ +\n\ +a\n\ +abbcd55\ +\n\ +a\n\ +abbcd55\ +\n\ +a\n\ +abbcd55\ +\n\ +a\n\ +abbcd55\ +\n\ +a\n\ +abbcd55\ +\n\ +a\n\ +abbcd55\ +\n\ +a\n\ +abbcd55\ +\n\ +a\n\ +abbcd55%%%%%%%%%%%%%%%%%%%%%%%%%%\n"; + +static int +do_test (void) +{ + char *buf = malloc (strlen (expected) + 1); + snprintf (buf, strlen (expected) + 1, + "\n%1$s\n" "%1$s" "%2$s" "%2$s" "%3$s" "%4$s" "%5$d" "%5$d" + "\n%1$s\n" "%1$s" "%2$s" "%2$s" "%3$s" "%4$s" "%5$d" "%5$d" + "\n%1$s\n" "%1$s" "%2$s" "%2$s" "%3$s" "%4$s" "%5$d" "%5$d" + "\n%1$s\n" "%1$s" "%2$s" "%2$s" "%3$s" "%4$s" "%5$d" "%5$d" + "\n%1$s\n" "%1$s" "%2$s" "%2$s" "%3$s" "%4$s" "%5$d" "%5$d" + "\n%1$s\n" "%1$s" "%2$s" "%2$s" "%3$s" "%4$s" "%5$d" "%5$d" + "\n%1$s\n" "%1$s" "%2$s" "%2$s" "%3$s" "%4$s" "%5$d" "%5$d" + "\n%1$s\n" "%1$s" "%2$s" "%2$s" "%3$s" "%4$s" "%5$d" "%5$d" + "\n%1$s\n" "%1$s" "%2$s" "%2$s" "%3$s" "%4$s" "%5$d" "%5$d" + "\n%1$s\n" "%1$s" "%2$s" "%2$s" "%3$s" "%4$s" "%5$d" "%5$d" + "\n%1$s\n" "%1$s" "%2$s" "%2$s" "%3$s" "%4$s" "%5$d" "%5$d" + "\n%1$s\n" "%1$s" "%2$s" "%2$s" "%3$s" "%4$s" "%5$d" "%5$d" + "\n%1$s\n" "%1$s" "%2$s" "%2$s" "%3$s" "%4$s" "%5$d" "%5$d" + "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n", + "a", "b", "c", "d", 5); + return strcmp (buf, expected) != 0; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/stdio-common/bug23-3.c b/stdio-common/bug23-3.c new file mode 100644 index 0000000..57c8cef --- /dev/null +++ b/stdio-common/bug23-3.c @@ -0,0 +1,50 @@ +#include +#include +#include + +int +do_test (void) +{ + size_t instances = 16384; +#define X0 "\n%1$s\n" "%1$s" "%2$s" "%2$s" "%3$s" "%4$s" "%5$d" "%5$d" + const char *item = "\na\nabbcd55"; +#define X3 X0 X0 X0 X0 X0 X0 X0 X0 +#define X6 X3 X3 X3 X3 X3 X3 X3 X3 +#define X9 X6 X6 X6 X6 X6 X6 X6 X6 +#define X12 X9 X9 X9 X9 X9 X9 X9 X9 +#define X14 X12 X12 X12 X12 +#define TRAILER "%%%%%%%%%%%%%%%%%%%%%%%%%%" +#define TRAILER2 TRAILER TRAILER + size_t length = instances * strlen (item) + strlen (TRAILER) + 1; + + char *buf = malloc (length + 1); + snprintf (buf, length + 1, + X14 TRAILER2 "\n", + "a", "b", "c", "d", 5); + + const char *p = buf; + size_t i; + for (i = 0; i < instances; ++i) + { + const char *expected; + for (expected = item; *expected; ++expected) + { + if (*p != *expected) + { + printf ("mismatch at offset %zu (%zu): expected %d, got %d\n", + (size_t) (p - buf), i, *expected & 0xFF, *p & 0xFF); + return 1; + } + ++p; + } + } + if (strcmp (p, TRAILER "\n") != 0) + { + printf ("mismatch at trailer: [%s]\n", p); + return 1; + } + free (buf); + return 0; +} +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/stdio-common/bug23-4.c b/stdio-common/bug23-4.c new file mode 100644 index 0000000..a478564 --- /dev/null +++ b/stdio-common/bug23-4.c @@ -0,0 +1,31 @@ +#include +#include +#include +#include + +#define LIMIT 1000000 + +int +main (void) +{ + struct rlimit lim; + getrlimit (RLIMIT_STACK, &lim); + lim.rlim_cur = 1048576; + setrlimit (RLIMIT_STACK, &lim); + char *fmtstr = malloc (4 * LIMIT + 1); + if (fmtstr == NULL) + abort (); + char *output = malloc (LIMIT + 1); + if (output == NULL) + abort (); + for (size_t i = 0; i < LIMIT; i++) + memcpy (fmtstr + 4 * i, "%1$d", 4); + fmtstr[4 * LIMIT] = '\0'; + int ret = snprintf (output, LIMIT + 1, fmtstr, 0); + if (ret != LIMIT) + abort (); + for (size_t i = 0; i < LIMIT; i++) + if (output[i] != '0') + abort (); + return 0; +} diff --git a/stdio-common/psiginfo.c b/stdio-common/psiginfo.c index 627c21c..a10780d 100644 --- a/stdio-common/psiginfo.c +++ b/stdio-common/psiginfo.c @@ -86,8 +86,12 @@ psiginfo (const siginfo_t *pinfo, const char *s) const char *desc; if (pinfo->si_signo >= 0 && pinfo->si_signo < NSIG && ((desc = INTUSE(_sys_siglist)[pinfo->si_signo]) != NULL - || (pinfo->si_signo >= SIGRTMIN && pinfo->si_signo < SIGRTMAX))) +#ifdef SIGRTMIN + || (pinfo->si_signo >= SIGRTMIN && pinfo->si_signo < SIGRTMAX) +#endif + )) { +#ifdef SIGRTMIN if (desc == NULL) { if (pinfo->si_signo - SIGRTMIN < SIGRTMAX - pinfo->si_signo) @@ -106,6 +110,7 @@ psiginfo (const siginfo_t *pinfo, const char *s) } } else +#endif fprintf (fp, "%s (", _(desc)); const char *base = NULL; diff --git a/stdio-common/tst-sscanf.c b/stdio-common/tst-sscanf.c index a987e87..be0abe8 100644 --- a/stdio-common/tst-sscanf.c +++ b/stdio-common/tst-sscanf.c @@ -197,5 +197,38 @@ main (void) } } + /* BZ #16618 + The test will segfault during SSCANF if the buffer overflow + is not fixed. The size of `s` is such that it forces the use + of malloc internally and this triggers the incorrect computation. + Thus the value for SIZE is arbitrariy high enough that malloc + is used. */ + { +#define SIZE 131072 + CHAR *s = malloc ((SIZE + 1) * sizeof (*s)); + if (s == NULL) + abort (); + for (size_t i = 0; i < SIZE; i++) + s[i] = L('0'); + s[SIZE] = L('\0'); + int i = 42; + /* Scan multi-digit zero into `i`. */ + if (SSCANF (s, L("%d"), &i) != 1) + { + printf ("FAIL: bug16618: SSCANF did not read one input item.\n"); + result = 1; + } + if (i != 0) + { + printf ("FAIL: bug16618: Value of `i` was not zero as expected.\n"); + result = 1; + } + free (s); + if (result != 1) + printf ("PASS: bug16618: Did not crash.\n"); +#undef SIZE + } + + return result; } diff --git a/stdio-common/vfprintf.c b/stdio-common/vfprintf.c index 68adb26..aa48694 100644 --- a/stdio-common/vfprintf.c +++ b/stdio-common/vfprintf.c @@ -248,6 +248,15 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap) 0 if unknown. */ int readonly_format = 0; + /* For the argument descriptions, which may be allocated on the heap. */ + void *args_malloced = NULL; + + /* For positional argument handling. */ + struct printf_spec *specs; + + /* Track if we malloced the SPECS array and thus must free it. */ + bool specs_malloced = false; + /* This table maps a character into a number representing a class. In each step there is a destination label for each class. */ @@ -1660,17 +1669,18 @@ do_positional: /* Array with information about the needed arguments. This has to be dynamically extensible. */ size_t nspecs = 0; - size_t nspecs_max = 32; /* A more or less arbitrary start value. */ - struct printf_spec *specs - = alloca (nspecs_max * sizeof (struct printf_spec)); + /* A more or less arbitrary start value. */ + size_t nspecs_size = 32 * sizeof (struct printf_spec); + specs = alloca (nspecs_size); /* The number of arguments the format string requests. This will determine the size of the array needed to store the argument attributes. */ size_t nargs = 0; - int *args_type; - union printf_arg *args_value = NULL; + size_t bytes_per_arg; + union printf_arg *args_value; int *args_size; + int *args_type; /* Positional parameters refer to arguments directly. This could also determine the maximum number of arguments. Track the @@ -1680,7 +1690,8 @@ do_positional: /* Just a counter. */ size_t cnt; - free (workstart); + if (__builtin_expect (workstart != NULL, 0)) + free (workstart); workstart = NULL; if (! LOCALE_SUPPORT) @@ -1701,14 +1712,42 @@ do_positional: for (f = lead_str_end; *f != L_('\0'); f = specs[nspecs++].next_fmt) { - if (nspecs >= nspecs_max) + if (nspecs * sizeof (*specs) >= nspecs_size) { /* Extend the array of format specifiers. */ + if (nspecs_size * 2 < nspecs_size) + { + __set_errno (ENOMEM); + done = -1; + goto all_done; + } struct printf_spec *old = specs; - specs = extend_alloca (specs, nspecs_max, 2 * nspecs_max); + if (__libc_use_alloca (2 * nspecs_size)) + specs = extend_alloca (specs, nspecs_size, 2 * nspecs_size); + else + { + nspecs_size *= 2; + specs = malloc (nspecs_size); + if (specs == NULL) + { + __set_errno (ENOMEM); + specs = old; + done = -1; + goto all_done; + } + } /* Copy the old array's elements to the new space. */ - memmove (specs, old, nspecs * sizeof (struct printf_spec)); + memmove (specs, old, nspecs * sizeof (*specs)); + + /* If we had previously malloc'd space for SPECS, then + release it after the copy is complete. */ + if (specs_malloced) + free (old); + + /* Now set SPECS_MALLOCED if needed. */ + if (!__libc_use_alloca (nspecs_size)) + specs_malloced = true; } /* Parse the format specifier. */ @@ -1721,13 +1760,38 @@ do_positional: /* Determine the number of arguments the format string consumes. */ nargs = MAX (nargs, max_ref_arg); + /* Calculate total size needed to represent a single argument across + all three argument-related arrays. */ + bytes_per_arg = sizeof (*args_value) + sizeof (*args_size) + + sizeof (*args_type); + + /* Check for potential integer overflow. */ + if (__builtin_expect (nargs > SIZE_MAX / bytes_per_arg, 0)) + { + __set_errno (ERANGE); + done = -1; + goto all_done; + } + + /* Allocate memory for all three argument arrays. */ + if (__libc_use_alloca (nargs * bytes_per_arg)) + args_value = alloca (nargs * bytes_per_arg); + else + { + args_value = args_malloced = malloc (nargs * bytes_per_arg); + if (args_value == NULL) + { + done = -1; + goto all_done; + } + } - /* Allocate memory for the argument descriptions. */ - args_type = alloca (nargs * sizeof (int)); + /* Set up the remaining two arrays to each point past the end of the + prior array, since space for all three has been allocated now. */ + args_size = &args_value[nargs].pa_int; + args_type = &args_size[nargs]; memset (args_type, s->_flags2 & _IO_FLAGS2_FORTIFY ? '\xff' : '\0', - nargs * sizeof (int)); - args_value = alloca (nargs * sizeof (union printf_arg)); - args_size = alloca (nargs * sizeof (int)); + nargs * sizeof (*args_type)); /* XXX Could do sanity check here: If any element in ARGS_TYPE is still zero after this loop, format is invalid. For now we @@ -1910,6 +1974,11 @@ do_positional: { workstart = (CHAR_T *) malloc ((MAX (prec, width) + 32) * sizeof (CHAR_T)); + if (workstart == NULL) + { + done = -1; + goto all_done; + } workend = workstart + (MAX (prec, width) + 32); } } @@ -1985,7 +2054,8 @@ do_positional: break; } - free (workstart); + if (__builtin_expect (workstart != NULL, 0)) + free (workstart); workstart = NULL; /* Write the following constant string. */ @@ -1996,6 +2066,10 @@ do_positional: } all_done: + if (specs_malloced) + free (specs); + if (__builtin_expect (args_malloced != NULL, 0)) + free (args_malloced); if (__builtin_expect (workstart != NULL, 0)) free (workstart); /* Unlock the stream. */ diff --git a/stdio-common/vfscanf.c b/stdio-common/vfscanf.c index bf89ec5..f628b5e 100644 --- a/stdio-common/vfscanf.c +++ b/stdio-common/vfscanf.c @@ -272,16 +272,39 @@ _IO_vfscanf_internal (_IO_FILE *s, const char *format, _IO_va_list argptr, CHAR_T *wp = NULL; /* Workspace. */ size_t wpmax = 0; /* Maximal size of workspace. */ size_t wpsize; /* Currently used bytes in workspace. */ + bool use_malloc = false; #define ADDW(Ch) \ do \ { \ - if (wpsize == wpmax) \ + if (__builtin_expect (wpsize == wpmax, 0)) \ { \ CHAR_T *old = wp; \ - wpmax = (UCHAR_MAX + 1 > 2 * wpmax ? UCHAR_MAX + 1 : 2 * wpmax); \ - wp = (CHAR_T *) alloca (wpmax * sizeof (CHAR_T)); \ - if (old != NULL) \ - MEMCPY (wp, old, wpsize); \ + bool fits = __builtin_expect (wpmax <= SIZE_MAX / sizeof (CHAR_T) / 2, 1); \ + size_t wpneed = MAX (UCHAR_MAX + 1, 2 * wpmax); \ + size_t newsize = fits ? wpneed * sizeof (CHAR_T) : SIZE_MAX; \ + if (!__libc_use_alloca (newsize)) \ + { \ + wp = realloc (use_malloc ? wp : NULL, newsize); \ + if (wp == NULL) \ + { \ + if (use_malloc) \ + free (old); \ + done = EOF; \ + goto errout; \ + } \ + if (! use_malloc) \ + MEMCPY (wp, old, wpsize); \ + wpmax = wpneed; \ + use_malloc = true; \ + } \ + else \ + { \ + size_t s = wpmax * sizeof (CHAR_T); \ + wp = (CHAR_T *) extend_alloca (wp, s, newsize); \ + wpmax = s / sizeof (CHAR_T); \ + if (old != NULL) \ + MEMCPY (wp, old, wpsize); \ + } \ } \ wp[wpsize++] = (Ch); \ } \ @@ -690,7 +713,10 @@ _IO_vfscanf_internal (_IO_FILE *s, const char *format, _IO_va_list argptr, if (Str != NULL) \ add_ptr_to_free (strptr); \ else if (flags & POSIX_MALLOC) \ - goto reteof; \ + { \ + done = EOF; \ + goto errout; \ + } \ } \ else \ Str = ARG (Type *); \ @@ -731,8 +757,11 @@ _IO_vfscanf_internal (_IO_FILE *s, const char *format, _IO_va_list argptr, newstr = (char *) realloc (*strptr, strleng + MB_CUR_MAX); if (newstr == NULL) - /* c can't have `a' flag, only `m'. */ - goto reteof; + { + /* c can't have `a' flag, only `m'. */ + done = EOF; + goto errout; + } else { *strptr = newstr; @@ -778,8 +807,11 @@ _IO_vfscanf_internal (_IO_FILE *s, const char *format, _IO_va_list argptr, effort. */ str = (char *) realloc (*strptr, strsize + 1); if (str == NULL) - /* c can't have `a' flag, only `m'. */ - goto reteof; + { + /* c can't have `a' flag, only `m'. */ + done = EOF; + goto errout; + } else { *strptr = (char *) str; @@ -850,8 +882,12 @@ _IO_vfscanf_internal (_IO_FILE *s, const char *format, _IO_va_list argptr, (strsize + 1) * sizeof (wchar_t)); if (wstr == NULL) - /* C or lc can't have `a' flag, only `m' flag. */ - goto reteof; + { + /* C or lc can't have `a' flag, only `m' + flag. */ + done = EOF; + goto errout; + } else { *strptr = (char *) wstr; @@ -901,8 +937,11 @@ _IO_vfscanf_internal (_IO_FILE *s, const char *format, _IO_va_list argptr, ((strsize + 1) * sizeof (wchar_t))); if (wstr == NULL) - /* C or lc can't have `a' flag, only `m' flag. */ - goto reteof; + { + /* C or lc can't have `a' flag, only `m' flag. */ + done = EOF; + goto errout; + } else { *strptr = (char *) wstr; @@ -1014,7 +1053,10 @@ _IO_vfscanf_internal (_IO_FILE *s, const char *format, _IO_va_list argptr, if (newstr == NULL) { if (flags & POSIX_MALLOC) - goto reteof; + { + done = EOF; + goto errout; + } /* We lose. Oh well. Terminate the string and stop converting, so at least we don't skip any input. */ @@ -1064,7 +1106,10 @@ _IO_vfscanf_internal (_IO_FILE *s, const char *format, _IO_va_list argptr, if (str == NULL) { if (flags & POSIX_MALLOC) - goto reteof; + { + done = EOF; + goto errout; + } /* We lose. Oh well. Terminate the string and stop converting, so at least we don't skip any input. */ @@ -1110,7 +1155,10 @@ _IO_vfscanf_internal (_IO_FILE *s, const char *format, _IO_va_list argptr, if (newstr == NULL) { if (flags & POSIX_MALLOC) - goto reteof; + { + done = EOF; + goto errout; + } /* We lose. Oh well. Terminate the string and stop converting, so at least we don't skip any input. */ @@ -1194,7 +1242,10 @@ _IO_vfscanf_internal (_IO_FILE *s, const char *format, _IO_va_list argptr, if (wstr == NULL) { if (flags & POSIX_MALLOC) - goto reteof; + { + done = EOF; + goto errout; + } /* We lose. Oh well. Terminate the string and stop converting, so at least we don't skip any input. */ @@ -1266,7 +1317,10 @@ _IO_vfscanf_internal (_IO_FILE *s, const char *format, _IO_va_list argptr, if (wstr == NULL) { if (flags & POSIX_MALLOC) - goto reteof; + { + done = EOF; + goto errout; + } /* We lose. Oh well. Terminate the string and stop converting, so at least we don't skip any input. */ @@ -2470,7 +2524,10 @@ _IO_vfscanf_internal (_IO_FILE *s, const char *format, _IO_va_list argptr, if (wstr == NULL) { if (flags & POSIX_MALLOC) - goto reteof; + { + done = EOF; + goto errout; + } /* We lose. Oh well. Terminate the string and stop converting, so at least we don't skip any input. */ @@ -2552,7 +2609,10 @@ _IO_vfscanf_internal (_IO_FILE *s, const char *format, _IO_va_list argptr, if (wstr == NULL) { if (flags & POSIX_MALLOC) - goto reteof; + { + done = EOF; + goto errout; + } /* We lose. Oh well. Terminate the string and stop converting, so at least we don't skip any input. */ @@ -2694,7 +2754,10 @@ _IO_vfscanf_internal (_IO_FILE *s, const char *format, _IO_va_list argptr, if (newstr == NULL) { if (flags & POSIX_MALLOC) - goto reteof; + { + done = EOF; + goto errout; + } /* We lose. Oh well. Terminate the string and stop converting, so at least we don't skip any input. */ @@ -2759,7 +2822,10 @@ _IO_vfscanf_internal (_IO_FILE *s, const char *format, _IO_va_list argptr, goto allocagain; } if (flags & POSIX_MALLOC) - goto reteof; + { + done = EOF; + goto errout; + } /* We lose. Oh well. Terminate the string and stop converting, so at least we don't skip any input. */ @@ -2802,7 +2868,10 @@ _IO_vfscanf_internal (_IO_FILE *s, const char *format, _IO_va_list argptr, if (newstr == NULL) { if (flags & POSIX_MALLOC) - goto reteof; + { + done = EOF; + goto errout; + } /* We lose. Oh well. Terminate the string and stop converting, so at least we don't skip any input. */ @@ -2865,12 +2934,14 @@ _IO_vfscanf_internal (_IO_FILE *s, const char *format, _IO_va_list argptr, /* Unlock stream. */ UNLOCK_STREAM (s); + if (use_malloc) + free (wp); + if (errp != NULL) *errp |= errval; - if (done == EOF) + if (__builtin_expect (done == EOF, 0)) { - reteof: if (__builtin_expect (ptrs_to_free != NULL, 0)) { struct ptrs_to_free *p = ptrs_to_free; @@ -2885,7 +2956,6 @@ _IO_vfscanf_internal (_IO_FILE *s, const char *format, _IO_va_list argptr, ptrs_to_free = p; } } - return EOF; } else if (__builtin_expect (strptr != NULL, 0)) { diff --git a/stdlib/fmtmsg.c b/stdlib/fmtmsg.c index 2a4d16a..27149eb 100644 --- a/stdlib/fmtmsg.c +++ b/stdlib/fmtmsg.c @@ -282,6 +282,8 @@ init (void) sevlevel_var = end + (*end == ':' ? 1 : 0); } + + __libc_lock_unlock (lock); } } diff --git a/stdlib/strtod_l.c b/stdlib/strtod_l.c index a38242a..0d6247e 100644 --- a/stdlib/strtod_l.c +++ b/stdlib/strtod_l.c @@ -63,6 +63,7 @@ extern unsigned long long int ____strtoull_l_internal (const char *, char **, #include #include #include +#include /* The gmp headers need some configuration frobs. */ #define HAVE_ALLOCA 1 @@ -75,7 +76,6 @@ extern unsigned long long int ____strtoull_l_internal (const char *, char **, #include "longlong.h" #include "fpioconst.h" -#define NDEBUG 1 #include @@ -177,19 +177,19 @@ extern const mp_limb_t _tens_in_limb[MAX_DIG_PER_LIMB + 1]; /* Return a floating point number of the needed type according to the given multi-precision number after possible rounding. */ static FLOAT -round_and_return (mp_limb_t *retval, int exponent, int negative, +round_and_return (mp_limb_t *retval, intmax_t exponent, int negative, mp_limb_t round_limb, mp_size_t round_bit, int more_bits) { if (exponent < MIN_EXP - 1) { - mp_size_t shift = MIN_EXP - 1 - exponent; - - if (shift > MANT_DIG) + if (exponent < MIN_EXP - 1 - MANT_DIG) { - __set_errno (EDOM); - return 0.0; + __set_errno (ERANGE); + return negative ? -0.0 : 0.0; } + mp_size_t shift = MIN_EXP - 1 - exponent; + more_bits |= (round_limb & ((((mp_limb_t) 1) << round_bit) - 1)) != 0; if (shift == MANT_DIG) /* This is a special case to handle the very seldom case where @@ -236,6 +236,9 @@ round_and_return (mp_limb_t *retval, int exponent, int negative, __set_errno (ERANGE); } + if (exponent > MAX_EXP) + goto overflow; + if ((round_limb & (((mp_limb_t) 1) << round_bit)) != 0 && (more_bits || (retval[0] & 1) != 0 || (round_limb & ((((mp_limb_t) 1) << round_bit) - 1)) != 0)) @@ -261,6 +264,7 @@ round_and_return (mp_limb_t *retval, int exponent, int negative, } if (exponent > MAX_EXP) + overflow: return negative ? -FLOAT_HUGE_VAL : FLOAT_HUGE_VAL; return MPN2FLOAT (retval, exponent, negative); @@ -274,7 +278,7 @@ round_and_return (mp_limb_t *retval, int exponent, int negative, factor for the resulting number (see code) multiply by it. */ static const STRING_TYPE * str_to_mpn (const STRING_TYPE *str, int digcnt, mp_limb_t *n, mp_size_t *nsize, - int *exponent + intmax_t *exponent #ifndef USE_WIDE_CHAR , const char *decimal, size_t decimal_len, const char *thousands #endif @@ -304,6 +308,7 @@ str_to_mpn (const STRING_TYPE *str, int digcnt, mp_limb_t *n, mp_size_t *nsize, cy += __mpn_add_1 (n, n, *nsize, low); if (cy != 0) { + assert (*nsize < MPNSIZE); n[*nsize] = cy; ++(*nsize); } @@ -338,7 +343,7 @@ str_to_mpn (const STRING_TYPE *str, int digcnt, mp_limb_t *n, mp_size_t *nsize, } while (--digcnt > 0); - if (*exponent > 0 && cnt + *exponent <= MAX_DIG_PER_LIMB) + if (*exponent > 0 && *exponent <= MAX_DIG_PER_LIMB - cnt) { low *= _tens_in_limb[*exponent]; start = _tens_in_limb[cnt + *exponent]; @@ -358,7 +363,10 @@ str_to_mpn (const STRING_TYPE *str, int digcnt, mp_limb_t *n, mp_size_t *nsize, cy = __mpn_mul_1 (n, n, *nsize, start); cy += __mpn_add_1 (n, n, *nsize, low); if (cy != 0) - n[(*nsize)++] = cy; + { + assert (*nsize < MPNSIZE); + n[(*nsize)++] = cy; + } } return str; @@ -416,7 +424,7 @@ ____STRTOF_INTERNAL (nptr, endptr, group, loc) { int negative; /* The sign of the number. */ MPN_VAR (num); /* MP representation of the number. */ - int exponent; /* Exponent of the number. */ + intmax_t exponent; /* Exponent of the number. */ /* Numbers starting `0X' or `0x' have to be processed with base 16. */ int base = 10; @@ -438,7 +446,7 @@ ____STRTOF_INTERNAL (nptr, endptr, group, loc) /* Points at the character following the integer and fractional digits. */ const STRING_TYPE *expp; /* Total number of digit and number of digits in integer part. */ - int dig_no, int_no, lead_zero; + size_t dig_no, int_no, lead_zero; /* Contains the last character read. */ CHAR_TYPE c; @@ -782,7 +790,7 @@ ____STRTOF_INTERNAL (nptr, endptr, group, loc) are all or any is really a fractional digit will be decided later. */ int_no = dig_no; - lead_zero = int_no == 0 ? -1 : 0; + lead_zero = int_no == 0 ? (size_t) -1 : 0; /* Read the fractional digits. A special case are the 'american style' numbers like `16.' i.e. with decimal point but without @@ -804,12 +812,13 @@ ____STRTOF_INTERNAL (nptr, endptr, group, loc) (base == 16 && ({ CHAR_TYPE lo = TOLOWER (c); lo >= L_('a') && lo <= L_('f'); }))) { - if (c != L_('0') && lead_zero == -1) + if (c != L_('0') && lead_zero == (size_t) -1) lead_zero = dig_no - int_no; ++dig_no; c = *++cp; } } + assert (dig_no <= (uintmax_t) INTMAX_MAX); /* Remember start of exponent (if any). */ expp = cp; @@ -832,24 +841,80 @@ ____STRTOF_INTERNAL (nptr, endptr, group, loc) if (c >= L_('0') && c <= L_('9')) { - int exp_limit; + intmax_t exp_limit; /* Get the exponent limit. */ if (base == 16) - exp_limit = (exp_negative ? - -MIN_EXP + MANT_DIG + 4 * int_no : - MAX_EXP - 4 * int_no + 4 * lead_zero + 3); + { + if (exp_negative) + { + assert (int_no <= (uintmax_t) (INTMAX_MAX + + MIN_EXP - MANT_DIG) / 4); + exp_limit = -MIN_EXP + MANT_DIG + 4 * (intmax_t) int_no; + } + else + { + if (int_no) + { + assert (lead_zero == 0 + && int_no <= (uintmax_t) INTMAX_MAX / 4); + exp_limit = MAX_EXP - 4 * (intmax_t) int_no + 3; + } + else if (lead_zero == (size_t) -1) + { + /* The number is zero and this limit is + arbitrary. */ + exp_limit = MAX_EXP + 3; + } + else + { + assert (lead_zero + <= (uintmax_t) (INTMAX_MAX - MAX_EXP - 3) / 4); + exp_limit = (MAX_EXP + + 4 * (intmax_t) lead_zero + + 3); + } + } + } else - exp_limit = (exp_negative ? - -MIN_10_EXP + MANT_DIG + int_no : - MAX_10_EXP - int_no + lead_zero + 1); + { + if (exp_negative) + { + assert (int_no + <= (uintmax_t) (INTMAX_MAX + MIN_10_EXP - MANT_DIG)); + exp_limit = -MIN_10_EXP + MANT_DIG + (intmax_t) int_no; + } + else + { + if (int_no) + { + assert (lead_zero == 0 + && int_no <= (uintmax_t) INTMAX_MAX); + exp_limit = MAX_10_EXP - (intmax_t) int_no + 1; + } + else if (lead_zero == (size_t) -1) + { + /* The number is zero and this limit is + arbitrary. */ + exp_limit = MAX_10_EXP + 1; + } + else + { + assert (lead_zero + <= (uintmax_t) (INTMAX_MAX - MAX_10_EXP - 1)); + exp_limit = MAX_10_EXP + (intmax_t) lead_zero + 1; + } + } + } + + if (exp_limit < 0) + exp_limit = 0; do { - exponent *= 10; - exponent += c - L_('0'); - - if (__builtin_expect (exponent > exp_limit, 0)) + if (__builtin_expect ((exponent > exp_limit / 10 + || (exponent == exp_limit / 10 + && c - L_('0') > exp_limit % 10)), 0)) /* The exponent is too large/small to represent a valid number. */ { @@ -858,7 +923,7 @@ ____STRTOF_INTERNAL (nptr, endptr, group, loc) /* We have to take care for special situation: a joker might have written "0.0e100000" which is in fact zero. */ - if (lead_zero == -1) + if (lead_zero == (size_t) -1) result = negative ? -0.0 : 0.0; else { @@ -877,6 +942,9 @@ ____STRTOF_INTERNAL (nptr, endptr, group, loc) /* NOTREACHED */ } + exponent *= 10; + exponent += c - L_('0'); + c = *++cp; } while (c >= L_('0') && c <= L_('9')); @@ -945,7 +1013,14 @@ ____STRTOF_INTERNAL (nptr, endptr, group, loc) } #endif startp += lead_zero + decimal_len; - exponent -= base == 16 ? 4 * lead_zero : lead_zero; + assert (lead_zero <= (base == 16 + ? (uintmax_t) INTMAX_MAX / 4 + : (uintmax_t) INTMAX_MAX)); + assert (lead_zero <= (base == 16 + ? ((uintmax_t) exponent + - (uintmax_t) INTMAX_MIN) / 4 + : ((uintmax_t) exponent - (uintmax_t) INTMAX_MIN))); + exponent -= base == 16 ? 4 * (intmax_t) lead_zero : (intmax_t) lead_zero; dig_no -= lead_zero; } @@ -987,7 +1062,10 @@ ____STRTOF_INTERNAL (nptr, endptr, group, loc) } /* Adjust the exponent for the bits we are shifting in. */ - exponent += bits - 1 + (int_no - 1) * 4; + assert (int_no <= (uintmax_t) (exponent < 0 + ? (INTMAX_MAX - bits + 1) / 4 + : (INTMAX_MAX - exponent - bits + 1) / 4)); + exponent += bits - 1 + ((intmax_t) int_no - 1) * 4; while (--dig_no > 0 && idx >= 0) { @@ -1027,13 +1105,15 @@ ____STRTOF_INTERNAL (nptr, endptr, group, loc) really integer digits or belong to the fractional part; i.e. we normalize 123e-2 to 1.23. */ { - register int incr = (exponent < 0 ? MAX (-int_no, exponent) - : MIN (dig_no - int_no, exponent)); + register intmax_t incr = (exponent < 0 + ? MAX (-(intmax_t) int_no, exponent) + : MIN ((intmax_t) dig_no - (intmax_t) int_no, + exponent)); int_no += incr; exponent -= incr; } - if (__builtin_expect (int_no + exponent > MAX_10_EXP + 1, 0)) + if (__builtin_expect (exponent > MAX_10_EXP + 1 - (intmax_t) int_no, 0)) { __set_errno (ERANGE); return negative ? -FLOAT_HUGE_VAL : FLOAT_HUGE_VAL; @@ -1218,7 +1298,7 @@ ____STRTOF_INTERNAL (nptr, endptr, group, loc) digits we should have enough bits for the result. The remaining decimal digits give us the information that more bits are following. This can be used while rounding. (Two added as a safety margin.) */ - if (dig_no - int_no > (MANT_DIG - bits + 2) / 3 + 2) + if ((intmax_t) dig_no > (intmax_t) int_no + (MANT_DIG - bits + 2) / 3 + 2) { dig_no = int_no + (MANT_DIG - bits + 2) / 3 + 2; more_bits = 1; @@ -1226,7 +1306,7 @@ ____STRTOF_INTERNAL (nptr, endptr, group, loc) else more_bits = 0; - neg_exp = dig_no - int_no - exponent; + neg_exp = (intmax_t) dig_no - (intmax_t) int_no - exponent; /* Construct the denominator. */ densize = 0; diff --git a/string/Makefile b/string/Makefile index 0d53665..5d66326 100644 --- a/string/Makefile +++ b/string/Makefile @@ -67,6 +67,8 @@ distribute := memcopy.h pagecopy.h tst-svc.expect test-string.h \ str-two-way.h +xtests = tst-strcoll-overflow + include ../Rules diff --git a/string/bits/string2.h b/string/bits/string2.h index d298bed..a798acf 100644 --- a/string/bits/string2.h +++ b/string/bits/string2.h @@ -801,17 +801,17 @@ __stpcpy_small (char *__dest, __extension__ \ ({ size_t __s1_len, __s2_len; \ (__builtin_constant_p (s1) && __builtin_constant_p (s2) \ - && (__s1_len = strlen (s1), __s2_len = strlen (s2), \ + && (__s1_len = __builtin_strlen (s1), __s2_len = __builtin_strlen (s2), \ (!__string2_1bptr_p (s1) || __s1_len >= 4) \ && (!__string2_1bptr_p (s2) || __s2_len >= 4)) \ ? __builtin_strcmp (s1, s2) \ : (__builtin_constant_p (s1) && __string2_1bptr_p (s1) \ - && (__s1_len = strlen (s1), __s1_len < 4) \ + && (__s1_len = __builtin_strlen (s1), __s1_len < 4) \ ? (__builtin_constant_p (s2) && __string2_1bptr_p (s2) \ ? __builtin_strcmp (s1, s2) \ : __strcmp_cg (s1, s2, __s1_len)) \ : (__builtin_constant_p (s2) && __string2_1bptr_p (s2) \ - && (__s2_len = strlen (s2), __s2_len < 4) \ + && (__s2_len = __builtin_strlen (s2), __s2_len < 4) \ ? (__builtin_constant_p (s1) && __string2_1bptr_p (s1) \ ? __builtin_strcmp (s1, s2) \ : __strcmp_gc (s1, s2, __s2_len)) \ diff --git a/string/memmem.c b/string/memmem.c index 3176ab7..55d3343 100644 --- a/string/memmem.c +++ b/string/memmem.c @@ -74,5 +74,6 @@ memmem (const void *haystack_start, size_t haystack_len, else return two_way_long_needle (haystack, haystack_len, needle, needle_len); } +libc_hidden_def (memmem) #undef LONG_NEEDLE_THRESHOLD diff --git a/string/strcoll_l.c b/string/strcoll_l.c index 9e55c91..2e2a889 100644 --- a/string/strcoll_l.c +++ b/string/strcoll_l.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995-1997,2002,2004,2007,2010 Free Software Foundation, Inc. +/* Copyright (C) 1995-1997,2002,2004,2007,2010,2011 Free Software Foundation, Inc. This file is part of the GNU C Library. Written by Ulrich Drepper , 1995. @@ -26,6 +26,7 @@ #include #include #include +#include #ifndef STRING_TYPE # define STRING_TYPE char @@ -43,11 +44,434 @@ #include "../locale/localeinfo.h" +/* Track status while looking for sequences in a string. */ +typedef struct +{ + int len; /* Length of the current sequence. */ + size_t val; /* Position of the sequence relative to the + previous non-ignored sequence. */ + size_t idxnow; /* Current index in sequences. */ + size_t idxmax; /* Maximum index in sequences. */ + size_t idxcnt; /* Current count of indices. */ + size_t backw; /* Current Backward sequence index. */ + size_t backw_stop; /* Index where the backward sequences stop. */ + const USTRING_TYPE *us; /* The string. */ + int32_t *idxarr; /* Array to cache weight indices. */ + unsigned char *rulearr; /* Array to cache rules. */ + unsigned char rule; /* Saved rule for the first sequence. */ + int32_t idx; /* Index to weight of the current sequence. */ + int32_t save_idx; /* Save looked up index of a forward + sequence after the last backward + sequence. */ + const USTRING_TYPE *back_us; /* Beginning of the backward sequence. */ +} coll_seq; + +/* Get next sequence. The weight indices are cached, so we don't need to + traverse the string. */ +static void +get_next_seq_cached (coll_seq *seq, int nrules, int pass, + const unsigned char *rulesets, + const USTRING_TYPE *weights) +{ + size_t val = seq->val = 0; + int len = seq->len; + size_t backw_stop = seq->backw_stop; + size_t backw = seq->backw; + size_t idxcnt = seq->idxcnt; + size_t idxmax = seq->idxmax; + size_t idxnow = seq->idxnow; + unsigned char *rulearr = seq->rulearr; + int32_t *idxarr = seq->idxarr; + + while (len == 0) + { + ++val; + if (backw_stop != ~0ul) + { + /* There is something pushed. */ + if (backw == backw_stop) + { + /* The last pushed character was handled. Continue + with forward characters. */ + if (idxcnt < idxmax) + { + idxnow = idxcnt; + backw_stop = ~0ul; + } + else + { + /* Nothing any more. The backward sequence + ended with the last sequence in the string. */ + idxnow = ~0ul; + break; + } + } + else + idxnow = --backw; + } + else + { + backw_stop = idxcnt; + + while (idxcnt < idxmax) + { + if ((rulesets[rulearr[idxcnt] * nrules + pass] + & sort_backward) == 0) + /* No more backward characters to push. */ + break; + ++idxcnt; + } + + if (backw_stop == idxcnt) + { + /* No sequence at all or just one. */ + if (idxcnt == idxmax) + /* Note that LEN is still zero. */ + break; + + backw_stop = ~0ul; + idxnow = idxcnt++; + } + else + /* We pushed backward sequences. */ + idxnow = backw = idxcnt - 1; + } + len = weights[idxarr[idxnow]++]; + } + + /* Update the structure. */ + seq->val = val; + seq->len = len; + seq->backw_stop = backw_stop; + seq->backw = backw; + seq->idxcnt = idxcnt; + seq->idxnow = idxnow; +} + +/* Get next sequence. Traverse the string as required. */ +static void +get_next_seq (coll_seq *seq, int nrules, const unsigned char *rulesets, + const USTRING_TYPE *weights, const int32_t *table, + const USTRING_TYPE *extra, const int32_t *indirect) +{ +#include WEIGHT_H + size_t val = seq->val = 0; + int len = seq->len; + size_t backw_stop = seq->backw_stop; + size_t backw = seq->backw; + size_t idxcnt = seq->idxcnt; + size_t idxmax = seq->idxmax; + size_t idxnow = seq->idxnow; + unsigned char *rulearr = seq->rulearr; + int32_t *idxarr = seq->idxarr; + const USTRING_TYPE *us = seq->us; + + while (len == 0) + { + ++val; + if (backw_stop != ~0ul) + { + /* There is something pushed. */ + if (backw == backw_stop) + { + /* The last pushed character was handled. Continue + with forward characters. */ + if (idxcnt < idxmax) + { + idxnow = idxcnt; + backw_stop = ~0ul; + } + else + /* Nothing any more. The backward sequence ended with + the last sequence in the string. Note that LEN + is still zero. */ + break; + } + else + idxnow = --backw; + } + else + { + backw_stop = idxmax; + + while (*us != L('\0')) + { + int32_t tmp = findidx (&us, -1); + rulearr[idxmax] = tmp >> 24; + idxarr[idxmax] = tmp & 0xffffff; + idxcnt = idxmax++; + + if ((rulesets[rulearr[idxcnt] * nrules] + & sort_backward) == 0) + /* No more backward characters to push. */ + break; + ++idxcnt; + } + + if (backw_stop >= idxcnt) + { + /* No sequence at all or just one. */ + if (idxcnt == idxmax || backw_stop > idxcnt) + /* Note that LEN is still zero. */ + break; + + backw_stop = ~0ul; + idxnow = idxcnt; + } + else + /* We pushed backward sequences. */ + idxnow = backw = idxcnt - 1; + } + len = weights[idxarr[idxnow]++]; + } + + /* Update the structure. */ + seq->val = val; + seq->len = len; + seq->backw_stop = backw_stop; + seq->backw = backw; + seq->idxcnt = idxcnt; + seq->idxmax = idxmax; + seq->idxnow = idxnow; + seq->us = us; +} + +/* Get next sequence. Traverse the string as required. This function does not + set or use any index or rule cache. */ +static void +get_next_seq_nocache (coll_seq *seq, int nrules, const unsigned char *rulesets, + const USTRING_TYPE *weights, const int32_t *table, + const USTRING_TYPE *extra, const int32_t *indirect, + int pass) +{ +#include WEIGHT_H + size_t val = seq->val = 0; + int len = seq->len; + size_t backw_stop = seq->backw_stop; + size_t backw = seq->backw; + size_t idxcnt = seq->idxcnt; + size_t idxmax = seq->idxmax; + int32_t idx = seq->idx; + const USTRING_TYPE *us = seq->us; + + while (len == 0) + { + ++val; + if (backw_stop != ~0ul) + { + /* There is something pushed. */ + if (backw == backw_stop) + { + /* The last pushed character was handled. Continue + with forward characters. */ + if (idxcnt < idxmax) + { + idx = seq->save_idx; + backw_stop = ~0ul; + } + else + { + /* Nothing anymore. The backward sequence ended with + the last sequence in the string. Note that len is + still zero. */ + idx = 0; + break; + } + } + else + { + /* XXX Traverse BACKW sequences from the beginning of + BACKW_STOP to get the next sequence. Is ther a quicker way + to do this? */ + size_t i = backw_stop; + us = seq->back_us; + while (i < backw) + { + int32_t tmp = findidx (&us, -1); + idx = tmp & 0xffffff; + i++; + } + --backw; + us = seq->us; + } + } + else + { + backw_stop = idxmax; + int32_t prev_idx = idx; + + while (*us != L('\0')) + { + int32_t tmp = findidx (&us, -1); + unsigned char rule = tmp >> 24; + prev_idx = idx; + idx = tmp & 0xffffff; + idxcnt = idxmax++; + + /* Save the rule for the first sequence. */ + if (__glibc_unlikely (idxcnt == 0)) + seq->rule = rule; + + if ((rulesets[rule * nrules + pass] + & sort_backward) == 0) + /* No more backward characters to push. */ + break; + ++idxcnt; + } + + if (backw_stop >= idxcnt) + { + /* No sequence at all or just one. */ + if (idxcnt == idxmax || backw_stop > idxcnt) + /* Note that len is still zero. */ + break; + + backw_stop = ~0ul; + } + else + { + /* We pushed backward sequences. If the stream ended with the + backward sequence, then we process the last sequence we + found. Otherwise we process the sequence before the last + one since the last one was a forward sequence. */ + seq->back_us = seq->us; + seq->us = us; + backw = idxcnt; + if (idxmax > idxcnt) + { + backw--; + seq->save_idx = idx; + idx = prev_idx; + } + if (backw > backw_stop) + backw--; + } + } + + len = weights[idx++]; + /* Skip over indices of previous levels. */ + for (int i = 0; i < pass; i++) + { + idx += len; + len = weights[idx]; + idx++; + } + } + + /* Update the structure. */ + seq->val = val; + seq->len = len; + seq->backw_stop = backw_stop; + seq->backw = backw; + seq->idxcnt = idxcnt; + seq->idxmax = idxmax; + seq->us = us; + seq->idx = idx; +} + +/* Compare two sequences. This version does not use the index and rules + cache. */ +static int +do_compare_nocache (coll_seq *seq1, coll_seq *seq2, int position, + const USTRING_TYPE *weights) +{ + int seq1len = seq1->len; + int seq2len = seq2->len; + size_t val1 = seq1->val; + size_t val2 = seq2->val; + int idx1 = seq1->idx; + int idx2 = seq2->idx; + int result = 0; + + /* Test for position if necessary. */ + if (position && val1 != val2) + { + result = val1 > val2 ? 1 : -1; + goto out; + } + + /* Compare the two sequences. */ + do + { + if (weights[idx1] != weights[idx2]) + { + /* The sequences differ. */ + result = weights[idx1] - weights[idx2]; + goto out; + } + + /* Increment the offsets. */ + ++idx1; + ++idx2; + + --seq1len; + --seq2len; + } + while (seq1len > 0 && seq2len > 0); + + if (position && seq1len != seq2len) + result = seq1len - seq2len; + +out: + seq1->len = seq1len; + seq2->len = seq2len; + seq1->idx = idx1; + seq2->idx = idx2; + return result; +} + +/* Compare two sequences using the index cache. */ +static int +do_compare (coll_seq *seq1, coll_seq *seq2, int position, + const USTRING_TYPE *weights) +{ + int seq1len = seq1->len; + int seq2len = seq2->len; + size_t val1 = seq1->val; + size_t val2 = seq2->val; + int32_t *idx1arr = seq1->idxarr; + int32_t *idx2arr = seq2->idxarr; + int idx1now = seq1->idxnow; + int idx2now = seq2->idxnow; + int result = 0; + + /* Test for position if necessary. */ + if (position && val1 != val2) + { + result = val1 > val2 ? 1 : -1; + goto out; + } + + /* Compare the two sequences. */ + do + { + if (weights[idx1arr[idx1now]] != weights[idx2arr[idx2now]]) + { + /* The sequences differ. */ + result = weights[idx1arr[idx1now]] - weights[idx2arr[idx2now]]; + goto out; + } + + /* Increment the offsets. */ + ++idx1arr[idx1now]; + ++idx2arr[idx2now]; + + --seq1len; + --seq2len; + } + while (seq1len > 0 && seq2len > 0); + + if (position && seq1len != seq2len) + result = seq1len - seq2len; + +out: + seq1->len = seq1len; + seq2->len = seq2len; + return result; +} + int -STRCOLL (s1, s2, l) - const STRING_TYPE *s1; - const STRING_TYPE *s2; - __locale_t l; +STRCOLL (const STRING_TYPE *s1, const STRING_TYPE *s2, __locale_t l) { struct __locale_data *current = l->__locales[LC_COLLATE]; #if __OPTION_EGLIBC_LOCALE_CODE @@ -62,34 +486,6 @@ STRCOLL (s1, s2, l) const USTRING_TYPE *weights; const USTRING_TYPE *extra; const int32_t *indirect; - uint_fast32_t pass; - int result = 0; - const USTRING_TYPE *us1; - const USTRING_TYPE *us2; - size_t s1len; - size_t s2len; - int32_t *idx1arr; - int32_t *idx2arr; - unsigned char *rule1arr; - unsigned char *rule2arr; - size_t idx1max; - size_t idx2max; - size_t idx1cnt; - size_t idx2cnt; - size_t idx1now; - size_t idx2now; - size_t backw1_stop; - size_t backw2_stop; - size_t backw1; - size_t backw2; - int val1; - int val2; - int position; - int seq1len; - int seq2len; - int use_malloc; - -#include WEIGHT_H if (nrules == 0) return STRCMP (s1, s2); @@ -104,7 +500,6 @@ STRCOLL (s1, s2, l) current->values[_NL_ITEM_INDEX (CONCAT(_NL_COLLATE_EXTRA,SUFFIX))].string; indirect = (const int32_t *) current->values[_NL_ITEM_INDEX (CONCAT(_NL_COLLATE_INDIRECT,SUFFIX))].string; - use_malloc = 0; assert (((uintptr_t) table) % __alignof__ (table[0]) == 0); assert (((uintptr_t) weights) % __alignof__ (weights[0]) == 0); @@ -112,18 +507,13 @@ STRCOLL (s1, s2, l) assert (((uintptr_t) indirect) % __alignof__ (indirect[0]) == 0); /* We need this a few times. */ - s1len = STRLEN (s1); - s2len = STRLEN (s2); + size_t s1len = STRLEN (s1); + size_t s2len = STRLEN (s2); /* Catch empty strings. */ - if (__builtin_expect (s1len == 0, 0) || __builtin_expect (s2len == 0, 0)) + if (__glibc_unlikely (s1len == 0) || __glibc_unlikely (s2len == 0)) return (s1len != 0) - (s2len != 0); - /* We need the elements of the strings as unsigned values since they - are used as indeces. */ - us1 = (const USTRING_TYPE *) s1; - us2 = (const USTRING_TYPE *) s2; - /* Perform the first pass over the string and while doing this find and store the weights for each character. Since we want this to be as fast as possible we are using `alloca' to store the temporary @@ -133,411 +523,122 @@ STRCOLL (s1, s2, l) Please note that the localedef programs makes sure that `position' is not used at the first level. */ - if (! __libc_use_alloca ((s1len + s2len) * (sizeof (int32_t) + 1))) - { - idx1arr = (int32_t *) malloc ((s1len + s2len) * (sizeof (int32_t) + 1)); - idx2arr = &idx1arr[s1len]; - rule1arr = (unsigned char *) &idx2arr[s2len]; - rule2arr = &rule1arr[s1len]; - - if (idx1arr == NULL) - /* No memory. Well, go with the stack then. - - XXX Once this implementation is stable we will handle this - differently. Instead of precomputing the indeces we will - do this in time. This means, though, that this happens for - every pass again. */ - goto try_stack; - use_malloc = 1; - } - else - { - try_stack: - idx1arr = (int32_t *) alloca (s1len * sizeof (int32_t)); - idx2arr = (int32_t *) alloca (s2len * sizeof (int32_t)); - rule1arr = (unsigned char *) alloca (s1len); - rule2arr = (unsigned char *) alloca (s2len); - } - idx1cnt = 0; - idx2cnt = 0; - idx1max = 0; - idx2max = 0; - idx1now = 0; - idx2now = 0; - backw1_stop = ~0ul; - backw2_stop = ~0ul; - backw1 = ~0ul; - backw2 = ~0ul; - seq1len = 0; - seq2len = 0; - position = rulesets[0] & sort_position; - while (1) - { - val1 = 0; - val2 = 0; - - /* Get the next non-IGNOREd element for string `s1'. */ - if (seq1len == 0) - do - { - ++val1; - - if (backw1_stop != ~0ul) - { - /* The is something pushed. */ - if (backw1 == backw1_stop) - { - /* The last pushed character was handled. Continue - with forward characters. */ - if (idx1cnt < idx1max) - { - idx1now = idx1cnt; - backw1_stop = ~0ul; - } - else - /* Nothing anymore. The backward sequence ended with - the last sequence in the string. Note that seq1len - is still zero. */ - break; - } - else - idx1now = --backw1; - } - else - { - backw1_stop = idx1max; - - while (*us1 != L('\0')) - { - int32_t tmp = findidx (&us1); - rule1arr[idx1max] = tmp >> 24; - idx1arr[idx1max] = tmp & 0xffffff; - idx1cnt = idx1max++; - - if ((rulesets[rule1arr[idx1cnt] * nrules] - & sort_backward) == 0) - /* No more backward characters to push. */ - break; - ++idx1cnt; - } - - if (backw1_stop >= idx1cnt) - { - /* No sequence at all or just one. */ - if (idx1cnt == idx1max || backw1_stop > idx1cnt) - /* Note that seq1len is still zero. */ - break; - - backw1_stop = ~0ul; - idx1now = idx1cnt; - } - else - /* We pushed backward sequences. */ - idx1now = backw1 = idx1cnt - 1; - } - } - while ((seq1len = weights[idx1arr[idx1now]++]) == 0); - - /* And the same for string `s2'. */ - if (seq2len == 0) - do - { - ++val2; - - if (backw2_stop != ~0ul) - { - /* The is something pushed. */ - if (backw2 == backw2_stop) - { - /* The last pushed character was handled. Continue - with forward characters. */ - if (idx2cnt < idx2max) - { - idx2now = idx2cnt; - backw2_stop = ~0ul; - } - else - /* Nothing anymore. The backward sequence ended with - the last sequence in the string. Note that seq2len - is still zero. */ - break; - } - else - idx2now = --backw2; - } - else - { - backw2_stop = idx2max; - - while (*us2 != L('\0')) - { - int32_t tmp = findidx (&us2); - rule2arr[idx2max] = tmp >> 24; - idx2arr[idx2max] = tmp & 0xffffff; - idx2cnt = idx2max++; - - if ((rulesets[rule2arr[idx2cnt] * nrules] - & sort_backward) == 0) - /* No more backward characters to push. */ - break; - ++idx2cnt; - } - - if (backw2_stop >= idx2cnt) - { - /* No sequence at all or just one. */ - if (idx2cnt == idx2max || backw2_stop > idx2cnt) - /* Note that seq1len is still zero. */ - break; - - backw2_stop = ~0ul; - idx2now = idx2cnt; - } - else - /* We pushed backward sequences. */ - idx2now = backw2 = idx2cnt - 1; - } - } - while ((seq2len = weights[idx2arr[idx2now]++]) == 0); - - /* See whether any or both strings are empty. */ - if (seq1len == 0 || seq2len == 0) - { - if (seq1len == seq2len) - /* Both ended. So far so good, both strings are equal at the - first level. */ - break; - - /* This means one string is shorter than the other. Find out - which one and return an appropriate value. */ - result = seq1len == 0 ? -1 : 1; - goto free_and_return; - } + coll_seq seq1, seq2; + bool use_malloc = false; + int result = 0; - /* Test for position if necessary. */ - if (position && val1 != val2) - { - result = val1 - val2; - goto free_and_return; - } + memset (&seq1, 0, sizeof (seq1)); + seq2 = seq1; - /* Compare the two sequences. */ - do - { - if (weights[idx1arr[idx1now]] != weights[idx2arr[idx2now]]) - { - /* The sequences differ. */ - result = weights[idx1arr[idx1now]] - weights[idx2arr[idx2now]]; - goto free_and_return; - } + size_t size_max = SIZE_MAX / (sizeof (int32_t) + 1); - /* Increment the offsets. */ - ++idx1arr[idx1now]; - ++idx2arr[idx2now]; - - --seq1len; - --seq2len; - } - while (seq1len > 0 && seq2len > 0); + if (MIN (s1len, s2len) > size_max + || MAX (s1len, s2len) > size_max - MIN (s1len, s2len)) + { + /* If the strings are long enough to cause overflow in the size request, + then skip the allocation and proceed with the non-cached routines. */ + } + else if (! __libc_use_alloca ((s1len + s2len) * (sizeof (int32_t) + 1))) + { + seq1.idxarr = (int32_t *) malloc ((s1len + s2len) * (sizeof (int32_t) + 1)); - if (position && seq1len != seq2len) + /* If we failed to allocate memory, we leave everything as NULL so that + we use the nocache version of traversal and comparison functions. */ + if (seq1.idxarr != NULL) { - result = seq1len - seq2len; - goto free_and_return; + seq2.idxarr = &seq1.idxarr[s1len]; + seq1.rulearr = (unsigned char *) &seq2.idxarr[s2len]; + seq2.rulearr = &seq1.rulearr[s1len]; + use_malloc = true; } } + else + { + seq1.idxarr = (int32_t *) alloca (s1len * sizeof (int32_t)); + seq2.idxarr = (int32_t *) alloca (s2len * sizeof (int32_t)); + seq1.rulearr = (unsigned char *) alloca (s1len); + seq2.rulearr = (unsigned char *) alloca (s2len); + } - /* Now the remaining passes over the weights. We now use the - indeces we found before. */ - for (pass = 1; pass < nrules; ++pass) + int rule = 0; + + /* Cache values in the first pass and if needed, use them in subsequent + passes. */ + for (int pass = 0; pass < nrules; ++pass) { + seq1.idxcnt = 0; + seq1.idx = 0; + seq2.idx = 0; + seq1.backw_stop = ~0ul; + seq1.backw = ~0ul; + seq2.idxcnt = 0; + seq2.backw_stop = ~0ul; + seq2.backw = ~0ul; + + /* We need the elements of the strings as unsigned values since they + are used as indices. */ + seq1.us = (const USTRING_TYPE *) s1; + seq2.us = (const USTRING_TYPE *) s2; + /* We assume that if a rule has defined `position' in one section this is true for all of them. */ - idx1cnt = 0; - idx2cnt = 0; - backw1_stop = ~0ul; - backw2_stop = ~0ul; - backw1 = ~0ul; - backw2 = ~0ul; - position = rulesets[rule1arr[0] * nrules + pass] & sort_position; + int position = rulesets[rule * nrules + pass] & sort_position; while (1) { - val1 = 0; - val2 = 0; - - /* Get the next non-IGNOREd element for string `s1'. */ - if (seq1len == 0) - do - { - ++val1; - - if (backw1_stop != ~0ul) - { - /* The is something pushed. */ - if (backw1 == backw1_stop) - { - /* The last pushed character was handled. Continue - with forward characters. */ - if (idx1cnt < idx1max) - { - idx1now = idx1cnt; - backw1_stop = ~0ul; - } - else - { - /* Nothing anymore. The backward sequence - ended with the last sequence in the string. */ - idx1now = ~0ul; - break; - } - } - else - idx1now = --backw1; - } - else - { - backw1_stop = idx1cnt; - - while (idx1cnt < idx1max) - { - if ((rulesets[rule1arr[idx1cnt] * nrules + pass] - & sort_backward) == 0) - /* No more backward characters to push. */ - break; - ++idx1cnt; - } - - if (backw1_stop == idx1cnt) - { - /* No sequence at all or just one. */ - if (idx1cnt == idx1max) - /* Note that seq1len is still zero. */ - break; - - backw1_stop = ~0ul; - idx1now = idx1cnt++; - } - else - /* We pushed backward sequences. */ - idx1now = backw1 = idx1cnt - 1; - } - } - while ((seq1len = weights[idx1arr[idx1now]++]) == 0); - - /* And the same for string `s2'. */ - if (seq2len == 0) - do - { - ++val2; - - if (backw2_stop != ~0ul) - { - /* The is something pushed. */ - if (backw2 == backw2_stop) - { - /* The last pushed character was handled. Continue - with forward characters. */ - if (idx2cnt < idx2max) - { - idx2now = idx2cnt; - backw2_stop = ~0ul; - } - else - { - /* Nothing anymore. The backward sequence - ended with the last sequence in the string. */ - idx2now = ~0ul; - break; - } - } - else - idx2now = --backw2; - } - else - { - backw2_stop = idx2cnt; - - while (idx2cnt < idx2max) - { - if ((rulesets[rule2arr[idx2cnt] * nrules + pass] - & sort_backward) == 0) - /* No more backward characters to push. */ - break; - ++idx2cnt; - } - - if (backw2_stop == idx2cnt) - { - /* No sequence at all or just one. */ - if (idx2cnt == idx2max) - /* Note that seq2len is still zero. */ - break; - - backw2_stop = ~0ul; - idx2now = idx2cnt++; - } - else - /* We pushed backward sequences. */ - idx2now = backw2 = idx2cnt - 1; - } - } - while ((seq2len = weights[idx2arr[idx2now]++]) == 0); + if (__glibc_unlikely (seq1.idxarr == NULL)) + { + get_next_seq_nocache (&seq1, nrules, rulesets, weights, table, + extra, indirect, pass); + get_next_seq_nocache (&seq2, nrules, rulesets, weights, table, + extra, indirect, pass); + } + else if (pass == 0) + { + get_next_seq (&seq1, nrules, rulesets, weights, table, extra, + indirect); + get_next_seq (&seq2, nrules, rulesets, weights, table, extra, + indirect); + } + else + { + get_next_seq_cached (&seq1, nrules, pass, rulesets, weights); + get_next_seq_cached (&seq2, nrules, pass, rulesets, weights); + } /* See whether any or both strings are empty. */ - if (seq1len == 0 || seq2len == 0) + if (seq1.len == 0 || seq2.len == 0) { - if (seq1len == seq2len) + if (seq1.len == seq2.len) /* Both ended. So far so good, both strings are equal at this level. */ break; /* This means one string is shorter than the other. Find out which one and return an appropriate value. */ - result = seq1len == 0 ? -1 : 1; + result = seq1.len == 0 ? -1 : 1; goto free_and_return; } - /* Test for position if necessary. */ - if (position && val1 != val2) - { - result = val1 - val2; - goto free_and_return; - } - - /* Compare the two sequences. */ - do - { - if (weights[idx1arr[idx1now]] != weights[idx2arr[idx2now]]) - { - /* The sequences differ. */ - result = (weights[idx1arr[idx1now]] - - weights[idx2arr[idx2now]]); - goto free_and_return; - } - - /* Increment the offsets. */ - ++idx1arr[idx1now]; - ++idx2arr[idx2now]; - - --seq1len; - --seq2len; - } - while (seq1len > 0 && seq2len > 0); - - if (position && seq1len != seq2len) - { - result = seq1len - seq2len; - goto free_and_return; - } + if (__glibc_unlikely (seq1.idxarr == NULL)) + result = do_compare_nocache (&seq1, &seq2, position, weights); + else + result = do_compare (&seq1, &seq2, position, weights); + if (result != 0) + goto free_and_return; } + + if (__builtin_expect ((seq1.rulearr != NULL), 1)) + rule = seq1.rulearr[0]; + else + rule = seq1.rule; } /* Free the memory if needed. */ free_and_return: if (use_malloc) - free (idx1arr); + free (seq1.idxarr); return result; } diff --git a/string/strxfrm_l.c b/string/strxfrm_l.c index 932bf19..a7328eb 100644 --- a/string/strxfrm_l.c +++ b/string/strxfrm_l.c @@ -42,8 +42,23 @@ #define CONCAT(a,b) CONCAT1(a,b) #define CONCAT1(a,b) a##b +/* Maximum string size that is calculated with cached indices. Right now this + is an arbitrary value open to optimizations. SMALL_STR_SIZE * 4 has to be + lower than __MAX_ALLOCA_CUTOFF. Keep localedata/xfrm-test.c in sync. */ +#define SMALL_STR_SIZE 4095 + #include "../locale/localeinfo.h" +/* Group locale data for shorter parameter lists. */ +typedef struct +{ + uint_fast32_t nrules; + unsigned char *rulesets; + USTRING_TYPE *weights; + int32_t *table; + USTRING_TYPE *extra; + int32_t *indirect; +} locale_data_t; #ifndef WIDE_CHAR_VERSION @@ -82,119 +97,328 @@ utf8_encode (char *buf, int val) } #endif +/* Find next weight and rule index. Inlined since called for every char. */ +static __always_inline size_t +find_idx (const USTRING_TYPE **us, int32_t *weight_idx, + unsigned char *rule_idx, const locale_data_t *l_data, const int pass) +{ + const int32_t *table = l_data->table; + const int32_t *indirect = l_data->indirect; + const USTRING_TYPE *extra = l_data->extra; +#include WEIGHT_H + int32_t tmp = findidx (us, -1); + *rule_idx = tmp >> 24; + int32_t idx = tmp & 0xffffff; + size_t len = l_data->weights[idx++]; -size_t -STRXFRM (STRING_TYPE *dest, const STRING_TYPE *src, size_t n, __locale_t l) + /* Skip over indices of previous levels. */ + for (int i = 0; i < pass; i++) + { + idx += len; + len = l_data->weights[idx++]; + } + + *weight_idx = idx; + return len; +} + +static int +find_position (const USTRING_TYPE *us, const locale_data_t *l_data, + const int pass) { - struct __locale_data *current = l->__locales[LC_COLLATE]; -#if __OPTION_EGLIBC_LOCALE_CODE - uint_fast32_t nrules = current->values[_NL_ITEM_INDEX (_NL_COLLATE_NRULES)].word; -#else - const uint_fast32_t nrules = 0; -#endif - /* We don't assign the following values right away since it might be - unnecessary in case there are no rules. */ - const unsigned char *rulesets; - const int32_t *table; - const USTRING_TYPE *weights; - const USTRING_TYPE *extra; - const int32_t *indirect; + int32_t weight_idx; + unsigned char rule_idx; + const USTRING_TYPE *usrc = us; + + find_idx (&usrc, &weight_idx, &rule_idx, l_data, pass); + return l_data->rulesets[rule_idx * l_data->nrules + pass] & sort_position; +} + +/* Do the transformation. */ +static size_t +do_xfrm (const USTRING_TYPE *usrc, STRING_TYPE *dest, size_t n, + const locale_data_t *l_data) +{ + int32_t weight_idx; + unsigned char rule_idx; uint_fast32_t pass; - size_t needed; + size_t needed = 0; size_t last_needed; - const USTRING_TYPE *usrc; - size_t srclen = STRLEN (src); - int32_t *idxarr; - unsigned char *rulearr; - size_t idxmax; - size_t idxcnt; - int use_malloc; - -#include WEIGHT_H - if (nrules == 0) + /* Now the passes over the weights. */ + for (pass = 0; pass < l_data->nrules; ++pass) { - if (n != 0) - STPNCPY (dest, src, MIN (srclen + 1, n)); + size_t backw_len = 0; + last_needed = needed; + const USTRING_TYPE *cur = usrc; + const USTRING_TYPE *backw_start = NULL; - return srclen; - } + /* We assume that if a rule has defined `position' in one section + this is true for all of them. */ + int position = find_position (cur, l_data, pass); - rulesets = (const unsigned char *) - current->values[_NL_ITEM_INDEX (_NL_COLLATE_RULESETS)].string; - table = (const int32_t *) - current->values[_NL_ITEM_INDEX (CONCAT(_NL_COLLATE_TABLE,SUFFIX))].string; - weights = (const USTRING_TYPE *) - current->values[_NL_ITEM_INDEX (CONCAT(_NL_COLLATE_WEIGHT,SUFFIX))].string; - extra = (const USTRING_TYPE *) - current->values[_NL_ITEM_INDEX (CONCAT(_NL_COLLATE_EXTRA,SUFFIX))].string; - indirect = (const int32_t *) - current->values[_NL_ITEM_INDEX (CONCAT(_NL_COLLATE_INDIRECT,SUFFIX))].string; - use_malloc = 0; + if (position == 0) + { + while (*cur != L('\0')) + { + const USTRING_TYPE *pos = cur; + size_t len = find_idx (&cur, &weight_idx, &rule_idx, l_data, + pass); + int rule = l_data->rulesets[rule_idx * l_data->nrules + pass]; - assert (((uintptr_t) table) % __alignof__ (table[0]) == 0); - assert (((uintptr_t) weights) % __alignof__ (weights[0]) == 0); - assert (((uintptr_t) extra) % __alignof__ (extra[0]) == 0); - assert (((uintptr_t) indirect) % __alignof__ (indirect[0]) == 0); + if ((rule & sort_forward) != 0) + { + /* Handle the pushed backward sequence. */ + if (backw_start != NULL) + { + for (size_t i = backw_len; i > 0; ) + { + int32_t weight_idx; + unsigned char rule_idx; + size_t len = find_idx (&backw_start, &weight_idx, + &rule_idx, l_data, pass); + if (needed + i < n) + for (size_t j = len; j > 0; j--) + dest[needed + i - j] = + l_data->weights[weight_idx++]; + + i -= len; + } - /* Handle an empty string as a special case. */ - if (srclen == 0) - { - if (n != 0) - *dest = L('\0'); - return 0; - } + needed += backw_len; + backw_start = NULL; + backw_len = 0; + } - /* We need the elements of the string as unsigned values since they - are used as indeces. */ - usrc = (const USTRING_TYPE *) src; - - /* Perform the first pass over the string and while doing this find - and store the weights for each character. Since we want this to - be as fast as possible we are using `alloca' to store the temporary - values. But since there is no limit on the length of the string - we have to use `malloc' if the string is too long. We should be - very conservative here. */ - if (! __libc_use_alloca (srclen)) - { - idxarr = (int32_t *) malloc ((srclen + 1) * (sizeof (int32_t) + 1)); - rulearr = (unsigned char *) &idxarr[srclen]; - - if (idxarr == NULL) - /* No memory. Well, go with the stack then. - - XXX Once this implementation is stable we will handle this - differently. Instead of precomputing the indeces we will - do this in time. This means, though, that this happens for - every pass again. */ - goto try_stack; - use_malloc = 1; - } - else - { - try_stack: - idxarr = (int32_t *) alloca (srclen * sizeof (int32_t)); - rulearr = (unsigned char *) alloca (srclen + 1); + /* Now handle the forward element. */ + if (needed + len < n) + while (len-- > 0) + dest[needed++] = l_data->weights[weight_idx++]; + else + /* No more characters fit into the buffer. */ + needed += len; + } + else + { + /* Remember start of the backward sequence & track length. */ + if (backw_start == NULL) + backw_start = pos; + backw_len += len; + } + } + + + /* Handle the pushed backward sequence. */ + if (backw_start != NULL) + { + for (size_t i = backw_len; i > 0; ) + { + size_t len = find_idx (&backw_start, &weight_idx, &rule_idx, + l_data, pass); + if (needed + i < n) + for (size_t j = len; j > 0; j--) + dest[needed + i - j] = + l_data->weights[weight_idx++]; + + i -= len; + } + + needed += backw_len; + } + } + else + { + int val = 1; +#ifndef WIDE_CHAR_VERSION + char buf[7]; + size_t buflen; +#endif + size_t i; + + while (*cur != L('\0')) + { + const USTRING_TYPE *pos = cur; + size_t len = find_idx (&cur, &weight_idx, &rule_idx, l_data, + pass); + int rule = l_data->rulesets[rule_idx * l_data->nrules + pass]; + + if ((rule & sort_forward) != 0) + { + /* Handle the pushed backward sequence. */ + if (backw_start != NULL) + { + for (size_t p = backw_len; p > 0; p--) + { + size_t len; + int32_t weight_idx; + unsigned char rule_idx; + const USTRING_TYPE *backw_cur = backw_start; + + /* To prevent a warning init the used vars. */ + len = find_idx (&backw_cur, &weight_idx, + &rule_idx, l_data, pass); + + for (i = 1; i < p; i++) + len = find_idx (&backw_cur, &weight_idx, + &rule_idx, l_data, pass); + + if (len != 0) + { +#ifdef WIDE_CHAR_VERSION + if (needed + 1 + len < n) + { + dest[needed] = val; + for (i = 0; i < len; ++i) + dest[needed + 1 + i] = + l_data->weights[weight_idx + i]; + } + needed += 1 + len; +#else + buflen = utf8_encode (buf, val); + if (needed + buflen + len < n) + { + for (i = 0; i < buflen; ++i) + dest[needed + i] = buf[i]; + for (i = 0; i < len; ++i) + dest[needed + buflen + i] = + l_data->weights[weight_idx + i]; + } + needed += buflen + len; +#endif + val = 1; + } + else + ++val; + } + + backw_start = NULL; + backw_len = 0; + } + + /* Now handle the forward element. */ + if (len != 0) + { +#ifdef WIDE_CHAR_VERSION + if (needed + 1 + len < n) + { + dest[needed] = val; + for (i = 0; i < len; ++i) + dest[needed + 1 + i] = + l_data->weights[weight_idx + i]; + } + needed += 1 + len; +#else + buflen = utf8_encode (buf, val); + if (needed + buflen + len < n) + { + for (i = 0; i < buflen; ++i) + dest[needed + i] = buf[i]; + for (i = 0; i < len; ++i) + dest[needed + buflen + i] = + l_data->weights[weight_idx + i]; + } + needed += buflen + len; +#endif + val = 1; + } + else + ++val; + } + else + { + /* Remember start of the backward sequence & track length. */ + if (backw_start == NULL) + backw_start = pos; + backw_len++; + } + } + + /* Handle the pushed backward sequence. */ + if (backw_start != NULL) + { + for (size_t p = backw_len; p > 0; p--) + { + size_t len; + int32_t weight_idx; + unsigned char rule_idx; + const USTRING_TYPE *backw_cur = backw_start; + + /* To prevent a warning init the used vars. */ + len = find_idx (&backw_cur, &weight_idx, + &rule_idx, l_data, pass); + + for (i = 1; i < p; i++) + len = find_idx (&backw_cur, &weight_idx, + &rule_idx, l_data, pass); + + if (len != 0) + { +#ifdef WIDE_CHAR_VERSION + if (needed + 1 + len < n) + { + dest[needed] = val; + for (i = 0; i < len; ++i) + dest[needed + 1 + i] = + l_data->weights[weight_idx + i]; + } + needed += 1 + len; +#else + buflen = utf8_encode (buf, val); + if (needed + buflen + len < n) + { + for (i = 0; i < buflen; ++i) + dest[needed + i] = buf[i]; + for (i = 0; i < len; ++i) + dest[needed + buflen + i] = + l_data->weights[weight_idx + i]; + } + needed += buflen + len; +#endif + val = 1; + } + else + ++val; + } + } + } + + /* Finally store the byte to separate the passes or terminate + the string. */ + if (needed < n) + dest[needed] = pass + 1 < l_data->nrules ? L('\1') : L('\0'); + ++needed; } - idxmax = 0; - do + /* This is a little optimization: many collation specifications have + a `position' rule at the end and if no non-ignored character + is found the last \1 byte is immediately followed by a \0 byte + signalling this. We can avoid the \1 byte(s). */ + if (needed > 2 && needed == last_needed + 1) { - int32_t tmp = findidx (&usrc); - rulearr[idxmax] = tmp >> 24; - idxarr[idxmax] = tmp & 0xffffff; - - ++idxmax; + /* Remove the \1 byte. */ + if (--needed <= n) + dest[needed - 1] = L('\0'); } - while (*usrc != L('\0')); - /* This element is only read, the value never used but to determine - another value which then is ignored. */ - rulearr[idxmax] = '\0'; + /* Return the number of bytes/words we need, but don't count the NUL + byte/word at the end. */ + return needed - 1; +} + +/* Do the transformation using weight-index and rule cache. */ +static size_t +do_xfrm_cached (STRING_TYPE *dest, size_t n, const locale_data_t *l_data, + size_t idxmax, int32_t *idxarr, const unsigned char *rulearr) +{ + uint_fast32_t nrules = l_data->nrules; + unsigned char *rulesets = l_data->rulesets; + USTRING_TYPE *weights = l_data->weights; + uint_fast32_t pass; + size_t needed = 0; + size_t last_needed; + size_t idxcnt; - /* Now the passes over the weights. We now use the indeces we found - before. */ - needed = 0; + /* Now the passes over the weights. */ for (pass = 0; pass < nrules; ++pass) { size_t backw_stop = ~0ul; @@ -440,14 +664,93 @@ STRXFRM (STRING_TYPE *dest, const STRING_TYPE *src, size_t n, __locale_t l) dest[needed - 1] = L('\0'); } - /* Free the memory if needed. */ - if (use_malloc) - free (idxarr); - /* Return the number of bytes/words we need, but don't count the NUL byte/word at the end. */ return needed - 1; } + +size_t +STRXFRM (STRING_TYPE *dest, const STRING_TYPE *src, size_t n, __locale_t l) +{ + locale_data_t l_data; + struct __locale_data *current = l->__locales[LC_COLLATE]; + const int32_t *table; + const int32_t *indirect; + const USTRING_TYPE *extra; +#include WEIGHT_H + l_data.nrules = current->values[_NL_ITEM_INDEX (_NL_COLLATE_NRULES)].word; + + /* Handle byte comparison case. */ + if (l_data.nrules == 0) + { + size_t srclen = STRLEN (src); + + if (n != 0) + STPNCPY (dest, src, MIN (srclen + 1, n)); + + return srclen; + } + + /* Handle an empty string, code hereafter relies on strlen (src) > 0. */ + if (*src == L('\0')) + { + if (n != 0) + *dest = L('\0'); + return 0; + } + + /* Get the locale data. */ + l_data.rulesets = (unsigned char *) + current->values[_NL_ITEM_INDEX (_NL_COLLATE_RULESETS)].string; + l_data.table = (int32_t *) + current->values[_NL_ITEM_INDEX (CONCAT(_NL_COLLATE_TABLE,SUFFIX))].string; + l_data.weights = (USTRING_TYPE *) + current->values[_NL_ITEM_INDEX (CONCAT(_NL_COLLATE_WEIGHT,SUFFIX))].string; + l_data.extra = (USTRING_TYPE *) + current->values[_NL_ITEM_INDEX (CONCAT(_NL_COLLATE_EXTRA,SUFFIX))].string; + l_data.indirect = (int32_t *) + current->values[_NL_ITEM_INDEX (CONCAT(_NL_COLLATE_INDIRECT,SUFFIX))].string; + table = l_data.table; + indirect = l_data.indirect; + extra = l_data.extra; + + assert (((uintptr_t) l_data.table) % __alignof__ (l_data.table[0]) == 0); + assert (((uintptr_t) l_data.weights) % __alignof__ (l_data.weights[0]) == 0); + assert (((uintptr_t) l_data.extra) % __alignof__ (l_data.extra[0]) == 0); + assert (((uintptr_t) l_data.indirect) % __alignof__ (l_data.indirect[0]) == 0); + + /* We need the elements of the string as unsigned values since they + are used as indeces. */ + const USTRING_TYPE *usrc = (const USTRING_TYPE *) src; + + /* Allocate cache for small strings on the stack and fill it with weight and + rule indices. If the cache size is not sufficient, continue with the + uncached xfrm version. */ + size_t idxmax = 0; + const USTRING_TYPE *cur = usrc; + int32_t *idxarr = alloca (SMALL_STR_SIZE * sizeof (int32_t)); + unsigned char *rulearr = alloca (SMALL_STR_SIZE + 1); + + do + { + int32_t tmp = findidx (&cur, -1); + rulearr[idxmax] = tmp >> 24; + idxarr[idxmax] = tmp & 0xffffff; + + ++idxmax; + } + while (*cur != L('\0') && idxmax < SMALL_STR_SIZE); + + /* This element is only read, the value never used but to determine + another value which then is ignored. */ + rulearr[idxmax] = '\0'; + + /* Do the transformation. */ + if (*cur == L('\0')) + return do_xfrm_cached (dest, n, &l_data, idxmax, idxarr, rulearr); + else + return do_xfrm (usrc, dest, n, &l_data); +} libc_hidden_def (STRXFRM) #ifndef WIDE_CHAR_VERSION diff --git a/string/tst-strcoll-overflow.c b/string/tst-strcoll-overflow.c new file mode 100644 index 0000000..bb665ac --- /dev/null +++ b/string/tst-strcoll-overflow.c @@ -0,0 +1,61 @@ +/* Copyright (C) 2013 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include +#include +#include +#include + +/* Verify that strcoll does not crash for large strings for which it cannot + cache weight lookup results. The size is large enough to cause integer + overflows on 32-bit as well as buffer overflows on 64-bit. The test should + work reasonably reliably when overcommit is disabled, but it obviously + depends on how much memory the system has. There's a limitation to this + test in that it does not run to completion. Actually collating such a + large string can take days and we can't have xcheck running that long. For + that reason, we run the test for about 5 minutes and then assume that + everything is fine if there are no crashes. */ +#define SIZE 0x40000000ul + +int +do_test (void) +{ + if (setlocale (LC_COLLATE, "en_GB.UTF-8") == NULL) + { + puts ("setlocale failed, cannot test for overflow"); + return 0; + } + + char *p = malloc (SIZE); + + if (p == NULL) + { + puts ("could not allocate memory"); + return 1; + } + + memset (p, 'x', SIZE - 1); + p[SIZE - 1] = 0; + printf ("%d\n", strcoll (p, p)); + return 0; +} + +#define TIMEOUT 300 +#define EXPECTED_SIGNAL SIGALRM +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/sunrpc/bindrsvprt.c b/sunrpc/bindrsvprt.c index d493c9f..c7cfe68 100644 --- a/sunrpc/bindrsvprt.c +++ b/sunrpc/bindrsvprt.c @@ -29,28 +29,108 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include +#include #include +#include #include #include #include #include #include +#define STARTPORT 600 +#define LOWPORT 512 +#define ENDPORT (IPPORT_RESERVED - 1) +#define NPORTS (ENDPORT - STARTPORT + 1) + +/* + * Read the file /etc/rpc.blacklisted, so that we don't bind + * to this ports. + */ + +static int blacklist_read; +static int *list; +static int list_size = 0; + +static void +load_blacklist (void) +{ + FILE *fp; + char *buf = NULL; + size_t buflen = 0; + int size = 0, ptr = 0; + + blacklist_read = 1; + + fp = fopen ("/etc/bindresvport.blacklist", "r"); + if (NULL == fp) + return; + + while (!feof_unlocked (fp)) + { + unsigned long port; + char *tmp, *cp; + ssize_t n = __getline (&buf, &buflen, fp); + if (n < 1) + break; + + cp = buf; + tmp = strchr (cp, '#'); /* remove comments */ + if (tmp) + *tmp = '\0'; + while (isspace ((int)*cp)) /* remove spaces and tabs */ + ++cp; + if (*cp == '\0') /* ignore empty lines */ + continue; + if (cp[strlen (cp) - 1] == '\n') + cp[strlen (cp) - 1] = '\0'; + + port = strtoul (cp, &tmp, 0); + while (isspace(*tmp)) + ++tmp; + if (*tmp != '\0' || (port == ULONG_MAX && errno == ERANGE)) + continue; + + /* Don't bother with out-of-range ports */ + if (port < LOWPORT || port > ENDPORT) + continue; + + if (ptr >= size) + { + size += 10; + list = realloc (list, size * sizeof (int)); + if (list == NULL) + { + free (buf); + return; + } + } + + list[ptr++] = port; + } + + fclose (fp); + + if (buf) + free (buf); + + list_size = ptr; +} + /* * Bind a socket to a privileged IP port */ int bindresvport (int sd, struct sockaddr_in *sin) { + static short startport = STARTPORT; static short port; struct sockaddr_in myaddr; int i; -#define STARTPORT 600 -#define LOWPORT 512 -#define ENDPORT (IPPORT_RESERVED - 1) -#define NPORTS (ENDPORT - STARTPORT + 1) - static short startport = STARTPORT; + if (!blacklist_read) + load_blacklist (); if (sin == (struct sockaddr_in *) 0) { @@ -69,6 +149,7 @@ bindresvport (int sd, struct sockaddr_in *sin) port = (__getpid () % NPORTS) + STARTPORT; } + __set_errno (EADDRINUSE); /* Initialize to make gcc happy. */ int res = -1; @@ -77,12 +158,22 @@ bindresvport (int sd, struct sockaddr_in *sin) again: for (i = 0; i < nports; ++i) { - sin->sin_port = htons (port++); - if (port > endport) - port = startport; + int j; + + sin->sin_port = htons (port); + + /* Check, if this port is not blacklisted. */ + for (j = 0; j < list_size; j++) + if (port == list[j]) + goto try_next_port; + res = __bind (sd, sin, sizeof (struct sockaddr_in)); if (res >= 0 || errno != EADDRINUSE) break; + +try_next_port: + if (++port > endport) + port = startport; } if (i == nports && startport != LOWPORT) diff --git a/sunrpc/clnt_udp.c b/sunrpc/clnt_udp.c index 6bb1ca3..4b5b392 100644 --- a/sunrpc/clnt_udp.c +++ b/sunrpc/clnt_udp.c @@ -456,7 +456,7 @@ send_again: while (inlen < 0 && errno == EINTR); if (inlen < 0) { - if (errno == EWOULDBLOCK) + if (errno == EWOULDBLOCK || errno == EAGAIN) continue; cu->cu_error.re_errno = errno; return (cu->cu_error.re_status = RPC_CANTRECV); diff --git a/sunrpc/svc_tcp.c b/sunrpc/svc_tcp.c index dd66485..2b77fd8 100644 --- a/sunrpc/svc_tcp.c +++ b/sunrpc/svc_tcp.c @@ -44,6 +44,7 @@ #include #include #include +#include #ifdef USE_IN_LIBIO # include @@ -243,6 +244,11 @@ again: { if (errno == EINTR) goto again; + if (errno == EMFILE) + { + struct timespec ts = { .tv_sec = 0, .tv_nsec = 50000000 }; + __nanosleep(&ts , NULL); + } return FALSE; } /* diff --git a/sunrpc/svc_udp.c b/sunrpc/svc_udp.c index f989484..0fa840b 100644 --- a/sunrpc/svc_udp.c +++ b/sunrpc/svc_udp.c @@ -40,6 +40,7 @@ #include #include #include +#include #ifdef IP_PKTINFO #include @@ -272,8 +273,16 @@ again: (int) su->su_iosz, 0, (struct sockaddr *) &(xprt->xp_raddr), &len); xprt->xp_addrlen = len; - if (rlen == -1 && errno == EINTR) - goto again; + if (rlen == -1) + { + if (errno == EINTR) + goto again; + if (errno == EMFILE) + { + struct timespec ts = { .tv_sec = 0, .tv_nsec = 50000000 }; + __nanosleep(&ts , NULL); + } + } if (rlen < 16) /* < 4 32-bit ints? */ return FALSE; xdrs->x_op = XDR_DECODE; diff --git a/sunrpc/svc_unix.c b/sunrpc/svc_unix.c index 29b71b2..47da789 100644 --- a/sunrpc/svc_unix.c +++ b/sunrpc/svc_unix.c @@ -46,6 +46,7 @@ #include #include #include +#include #ifdef USE_IN_LIBIO # include @@ -245,6 +246,11 @@ again: { if (errno == EINTR) goto again; + if (errno == EMFILE) + { + struct timespec ts = { .tv_sec = 0, .tv_nsec = 50000000 }; + __nanosleep(&ts , NULL); + } return FALSE; } /* diff --git a/sysdeps/generic/dl-fptr.h b/sysdeps/generic/dl-fptr.h index d47fb7b..b957fbb 100644 --- a/sysdeps/generic/dl-fptr.h +++ b/sysdeps/generic/dl-fptr.h @@ -40,6 +40,9 @@ struct link_map; extern ElfW(Addr) _dl_boot_fptr_table []; +/* Must be called before any other function. */ +extern void _dl_fptr_init (void); + extern ElfW(Addr) _dl_make_fptr (struct link_map *, const ElfW(Sym) *, ElfW(Addr)); diff --git a/sysdeps/generic/dl-irel.h b/sysdeps/generic/dl-irel.h index 4d7b481..62fa1ce 100644 --- a/sysdeps/generic/dl-irel.h +++ b/sysdeps/generic/dl-irel.h @@ -17,7 +17,14 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -#ifndef _DL_IREL_h +#ifndef _DL_IREL_H #define _DL_IREL_H +static inline DL_FIXUP_VALUE_TYPE +__attribute ((always_inline)) +elf_ifunc_invoke (ElfW(Addr) addr) +{ + return ((DL_FIXUP_VALUE_TYPE (*) (void)) (addr)) (); +} + #endif /* dl-irel.h */ diff --git a/sysdeps/generic/ldconfig.h b/sysdeps/generic/ldconfig.h index fadd5ec..9932ee4 100644 --- a/sysdeps/generic/ldconfig.h +++ b/sysdeps/generic/ldconfig.h @@ -34,6 +34,7 @@ #define FLAG_POWERPC_LIB64 0x0500 #define FLAG_MIPS64_LIBN32 0x0600 #define FLAG_MIPS64_LIBN64 0x0700 +#define FLAG_ARM_LIBHF 0x0900 /* Name of auxiliary cache. */ #define _PATH_LDCONFIG_AUX_CACHE "/var/cache/ldconfig/aux-cache" diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h index e79252f..adf43be 100644 --- a/sysdeps/generic/ldsodefs.h +++ b/sysdeps/generic/ldsodefs.h @@ -39,6 +39,7 @@ #include #include #include +#include /* For __OPTION_EGLIBC_RTLD_DEBUG. */ __BEGIN_DECLS @@ -427,7 +428,7 @@ struct rtld_global /* The object to be initialized first. */ EXTERN struct link_map *_dl_initfirst; -#if HP_TIMING_AVAIL || HP_SMALL_TIMING_AVAIL +#if HP_TIMING_AVAIL || HP_SMALL_TIMING_AVAIL || HP_TIMING_PAD /* Start time on CPU clock. */ EXTERN hp_timing_t _dl_cpuclock_offset; #endif @@ -641,7 +642,7 @@ struct rtld_global_ro /* All search directories defined at startup. */ EXTERN struct r_search_path_elem *_dl_init_all_dirs; -#if HP_TIMING_AVAIL || HP_SMALL_TIMING_AVAIL +#if HP_TIMING_AVAIL || HP_SMALL_TIMING_AVAIL || HP_TIMING_PAD /* Overhead of a high-precision timing measurement. */ EXTERN hp_timing_t _dl_hp_timing_overhead; #endif @@ -692,9 +693,6 @@ struct rtld_global_ro /* List of auditing interfaces. */ struct audit_ifaces *_dl_audit; unsigned int _dl_naudit; - - /* 0 if internal pointer values should not be guarded, 1 if they should. */ - EXTERN int _dl_pointer_guard; }; # define __rtld_global_attribute__ # ifdef IS_IN_rtld @@ -731,7 +729,11 @@ rtld_hidden_proto (_dl_make_stack_executable) might use the variable which results in copy relocations on some platforms. But this does not matter, ld.so can always use the local copy. */ -extern void *__libc_stack_end attribute_relro; +extern void *__libc_stack_end +#ifndef LIBC_STACK_END_NOT_RELRO + attribute_relro +#endif + ; rtld_hidden_proto (__libc_stack_end) /* Parameters passed to the dynamic linker. */ diff --git a/sysdeps/generic/machine-lock.h b/sysdeps/generic/machine-lock.h index db9f444..5ecb265 100644 --- a/sysdeps/generic/machine-lock.h +++ b/sysdeps/generic/machine-lock.h @@ -35,14 +35,21 @@ typedef volatile int __spin_lock_t; /* Unlock LOCK. */ +void __spin_unlock (__spin_lock_t *__lock); + +#ifdef __USE_EXTERN_INLINES _EXTERN_INLINE void __spin_unlock (__spin_lock_t *__lock) { *__lock = 0; } +#endif /* Try to lock LOCK; return nonzero if we locked it, zero if another has. */ +int __spin_try_lock (__spin_lock_t *__lock); + +#ifdef __USE_EXTERN_INLINES _EXTERN_INLINE int __spin_try_lock (__spin_lock_t *__lock) { @@ -51,14 +58,19 @@ __spin_try_lock (__spin_lock_t *__lock) *__lock = 1; return 1; } +#endif /* Return nonzero if LOCK is locked. */ +int __spin_lock_locked (__spin_lock_t *__lock); + +#ifdef __USE_EXTERN_INLINES _EXTERN_INLINE int __spin_lock_locked (__spin_lock_t *__lock) { return *__lock != 0; } +#endif #endif /* machine-lock.h */ diff --git a/sysdeps/generic/machine-sp.h b/sysdeps/generic/machine-sp.h index 25e423e..4769bc5 100644 --- a/sysdeps/generic/machine-sp.h +++ b/sysdeps/generic/machine-sp.h @@ -26,11 +26,15 @@ #define _EXTERN_INLINE __extern_inline #endif +void * __thread_stack_pointer (void); + +#ifdef __USE_EXTERN_INLINES _EXTERN_INLINE void * __thread_stack_pointer (void) { register void *__sp__ ("{STACK-POINTER}"); return __sp__; } +#endif #endif /* machine-sp.h */ diff --git a/sysdeps/generic/paths.h b/sysdeps/generic/paths.h index 439992f..8a6dcc2 100644 --- a/sysdeps/generic/paths.h +++ b/sysdeps/generic/paths.h @@ -68,7 +68,7 @@ /* Provide trailing slash, since mostly used for building pathnames. */ #define _PATH_DEV "/dev/" #define _PATH_TMP "/tmp/" -#define _PATH_VARDB "/var/db/" +#define _PATH_VARDB "/var/lib/misc/" #define _PATH_VARRUN "/var/run/" #define _PATH_VARTMP "/var/tmp/" diff --git a/sysdeps/generic/thread_state.h b/sysdeps/generic/thread_state.h index 7f8c0f8..3d4b0b5 100644 --- a/sysdeps/generic/thread_state.h +++ b/sysdeps/generic/thread_state.h @@ -23,6 +23,7 @@ /* Replace with "i386" or "mips" or whatever. */ +#define MACHINE_NEW_THREAD_STATE_FLAVOR _NEW_THREAD_STATE #define MACHINE_THREAD_STATE_FLAVOR _THREAD_STATE #define MACHINE_THREAD_STATE_COUNT _THREAD_STATE_COUNT diff --git a/sysdeps/gnu/Makefile b/sysdeps/gnu/Makefile index e748f4c..ad13527 100644 --- a/sysdeps/gnu/Makefile +++ b/sysdeps/gnu/Makefile @@ -20,7 +20,7 @@ # Generate the list of strings for errno codes from the section of the # manual which documents the codes. -$(..)sysdeps/gnu/errlist.c: $(..)sysdeps/gnu/errlist.awk \ +$(..)sysdeps/gnu/errlist-disabled.c: $(..)sysdeps/gnu/errlist.awk \ $(..)manual/errno.texi $(AWK) -f $^ > $@-tmp # Make it unwritable so noone will edit it by mistake. diff --git a/sysdeps/i386/Makefile b/sysdeps/i386/Makefile index 99f9208..f68a13f 100644 --- a/sysdeps/i386/Makefile +++ b/sysdeps/i386/Makefile @@ -9,6 +9,11 @@ ifeq ($(subdir),csu) # On i686 we must avoid generating the trampoline functions generated # to get the GOT pointer. CFLAGS-initfini.s += -march=i386 -mtune=i386 -fno-asynchronous-unwind-tables -fno-unwind-tables +ifeq (yes,$(build-shared)) +# Compatibility +sysdep_routines += libgcc-compat +shared-only-routines += libgcc-compat +endif endif ifeq ($(subdir),nptl) diff --git a/sysdeps/i386/Versions b/sysdeps/i386/Versions index b0230d3..04f4b75 100644 --- a/sysdeps/i386/Versions +++ b/sysdeps/i386/Versions @@ -2,6 +2,9 @@ libc { GLIBC_2.0 { # Functions from libgcc. __divdi3; __moddi3; __udivdi3; __umoddi3; + __cmpdi2; __ucmpdi2; + __fixunsdfdi; __fixunssfdi; __fixunsxfdi; + __floatdidf; } GLIBC_2.1 { # global variable diff --git a/sysdeps/i386/dl-irel.h b/sysdeps/i386/dl-irel.h index 30385a1..70cd6b0 100644 --- a/sysdeps/i386/dl-irel.h +++ b/sysdeps/i386/dl-irel.h @@ -26,6 +26,13 @@ #define ELF_MACHINE_IREL 1 +static inline Elf32_Addr +__attribute ((always_inline)) +elf_ifunc_invoke (Elf32_Addr addr) +{ + return ((Elf32_Addr (*) (void)) (addr)) (); +} + static inline void __attribute ((always_inline)) elf_irel (const Elf32_Rel *reloc) @@ -35,7 +42,7 @@ elf_irel (const Elf32_Rel *reloc) if (__builtin_expect (r_type == R_386_IRELATIVE, 1)) { - Elf32_Addr value = ((Elf32_Addr (*) (void)) (*reloc_addr)) (); + Elf32_Addr value = elf_ifunc_invoke(*reloc_addr); *reloc_addr = value; } else diff --git a/sysdeps/i386/dl-procinfo.h b/sysdeps/i386/dl-procinfo.h index d114fec..8fcb1ea 100644 --- a/sysdeps/i386/dl-procinfo.h +++ b/sysdeps/i386/dl-procinfo.h @@ -57,7 +57,7 @@ enum HWCAP_I386_AMD3D = 1 << 31, /* XXX Which others to add here? */ - HWCAP_IMPORTANT = (HWCAP_I386_XMM2) + HWCAP_IMPORTANT = (HWCAP_I386_CMOV | HWCAP_I386_XMM2) }; diff --git a/sysdeps/i386/dl-tls.h b/sysdeps/i386/dl-tls.h index 58705c7..c70ac54 100644 --- a/sysdeps/i386/dl-tls.h +++ b/sysdeps/i386/dl-tls.h @@ -58,3 +58,6 @@ strong_alias (___tls_get_addr, ___tls_get_addr_internal) # endif #endif + +/* Value used for dtv entries for which the allocation is delayed. */ +#define TLS_DTV_UNALLOCATED ((void *) -1l) diff --git a/sysdeps/i386/hp-timing.h b/sysdeps/i386/hp-timing.h new file mode 100644 index 0000000..1029091 --- /dev/null +++ b/sysdeps/i386/hp-timing.h @@ -0,0 +1,34 @@ +/* High precision, low overhead timing functions. i386 version. + Copyright (C) 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#ifndef _i386_HP_TIMING_H +#define _i386_HP_TIMING_H 1 + +#define hp_timing_t hp_timing_t__ +#include +#undef hp_timing_t + +/* We don't use high-precision timers, but we might load an i686 libpthread + which does. */ +#define HP_TIMING_PAD 1 + +/* i686 uses 64bit values for the times. */ +typedef unsigned long long int hp_timing_t; + +#endif /* hp-timing.h */ diff --git a/sysdeps/i386/i686/multiarch/memcpy-ssse3-rep.S b/sysdeps/i386/i686/multiarch/memcpy-ssse3-rep.S index 48a109c..8e81183 100644 --- a/sysdeps/i386/i686/multiarch/memcpy-ssse3-rep.S +++ b/sysdeps/i386/i686/multiarch/memcpy-ssse3-rep.S @@ -110,7 +110,7 @@ __i686.get_pc_thunk.bx: #endif .section .text.ssse3,"ax",@progbits -#if defined SHARED && !defined NOT_IN_libc && !defined USE_AS_BCOPY +#if !defined USE_AS_BCOPY ENTRY (MEMCPY_CHK) movl 12(%esp), %eax cmpl %eax, 16(%esp) diff --git a/sysdeps/i386/i686/multiarch/memcpy-ssse3.S b/sysdeps/i386/i686/multiarch/memcpy-ssse3.S index ec9eeb9..f64f8d2 100644 --- a/sysdeps/i386/i686/multiarch/memcpy-ssse3.S +++ b/sysdeps/i386/i686/multiarch/memcpy-ssse3.S @@ -110,7 +110,7 @@ __i686.get_pc_thunk.bx: #endif .section .text.ssse3,"ax",@progbits -#if defined SHARED && !defined NOT_IN_libc && !defined USE_AS_BCOPY +#if !defined USE_AS_BCOPY ENTRY (MEMCPY_CHK) movl 12(%esp), %eax cmpl %eax, 16(%esp) diff --git a/sysdeps/i386/libgcc-compat.c b/sysdeps/i386/libgcc-compat.c new file mode 100644 index 0000000..52af8fd --- /dev/null +++ b/sysdeps/i386/libgcc-compat.c @@ -0,0 +1,75 @@ +/* pre-.hidden libgcc compatibility + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Guido Guenther + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + + +#include +#include + +#if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_2_6) + +extern int32_t __cmpdi2 (int64_t, int64_t); +int32_t __cmpdi2_internal (int64_t u, int64_t v) +{ + return __cmpdi2 (u, v); +} +symbol_version (__cmpdi2_internal, __cmpdi2, GLIBC_2.0); + + +extern int32_t __ucmpdi2 (int64_t, int64_t); +int32_t __ucmpdi2_internal (int64_t u, int64_t v) +{ + return __ucmpdi2 (u, v); +} +symbol_version (__ucmpdi2_internal, __ucmpdi2, GLIBC_2.0); + + +extern int64_t __fixunsdfdi (double); +int64_t __fixunsdfdi_internal (double d) +{ + return __fixunsdfdi (d); +} +symbol_version (__fixunsdfdi_internal, __fixunsdfdi, GLIBC_2.0); + +extern int64_t __fixunssfdi (float); +int64_t __fixunssfdi_internal (float d) +{ + return __fixunssfdi (d); +} + +symbol_version (__fixunsfdi_internal, __fixunsfdi, GLIBC_2.0); + +typedef float XFtype __attribute__ ((mode (XF))); + +extern int64_t __fixunsxfdi (XFtype); +int64_t __fixunsxfdi_internal (XFtype d) +{ + return __fixunsxfdi (d); +} + +symbol_version (__fixunsxfdi_internal, __fixunsxfdi, GLIBC_2.0); + +extern double __floatdidf (int64_t); +double __floatdidf_internal (int64_t u) +{ + return __floatdidf (u); +} +symbol_version (__floatdidf_internal, __floatdidf, GLIBC_2.0); + +#endif diff --git a/sysdeps/i386/sysdep.h b/sysdeps/i386/sysdep.h index efdc82d..0c27adb 100644 --- a/sysdeps/i386/sysdep.h +++ b/sysdeps/i386/sysdep.h @@ -22,6 +22,13 @@ #ifdef __ASSEMBLER__ +/* This macro will be defined to 1 if GCC has been configured with + --with-arch=i686, causing build failures with __i686.get_pc_thunk. */ +#if defined __i686 +#undef __i686 +#define __i686 __i686 +#endif + /* Syntactic details of assembler. */ #ifdef HAVE_ELF diff --git a/sysdeps/ia64/Makefile b/sysdeps/ia64/Makefile index 2ea937a..bf43c96 100644 --- a/sysdeps/ia64/Makefile +++ b/sysdeps/ia64/Makefile @@ -12,8 +12,8 @@ elide-routines.os += hp-timing ifeq (yes,$(build-shared)) # Compatibility -sysdep_routines += ia64libgcc -shared-only-routines += ia64libgcc +sysdep_routines += libgcc-compat +shared-only-routines += libgcc-compat endif endif diff --git a/sysdeps/ia64/Versions b/sysdeps/ia64/Versions index 56b417d..5ff162e 100644 --- a/sysdeps/ia64/Versions +++ b/sysdeps/ia64/Versions @@ -10,6 +10,10 @@ libc { # Functions from libgcc. __divtf3; __divdf3; __divsf3; __divdi3; __moddi3; __udivdi3; __umoddi3; __multi3; + __divsi3; + __modsi3; + __udivsi3; + __umodsi3; } } libm { diff --git a/sysdeps/ia64/dl-machine.h b/sysdeps/ia64/dl-machine.h index 61b4ea9..a1e31be 100644 --- a/sysdeps/ia64/dl-machine.h +++ b/sysdeps/ia64/dl-machine.h @@ -46,7 +46,8 @@ __ia64_init_bootstrap_fdesc_table (struct link_map *map) } #define ELF_MACHINE_BEFORE_RTLD_RELOC(dynamic_info) \ - __ia64_init_bootstrap_fdesc_table (&bootstrap_map); + __ia64_init_bootstrap_fdesc_table (&bootstrap_map); \ + _dl_fptr_init(); /* Return nonzero iff ELF header is compatible with the running host. */ static inline int __attribute__ ((unused)) diff --git a/sysdeps/ia64/dl-tls.h b/sysdeps/ia64/dl-tls.h index 26f3d2a..c0b9c7c 100644 --- a/sysdeps/ia64/dl-tls.h +++ b/sysdeps/ia64/dl-tls.h @@ -28,3 +28,6 @@ #define DONT_USE_TLS_INDEX 1 extern void *__tls_get_addr (size_t m, size_t offset); + +/* Value used for dtv entries for which the allocation is delayed. */ +#define TLS_DTV_UNALLOCATED ((void *) -1l) diff --git a/sysdeps/ia64/fpu/e_fmod.S b/sysdeps/ia64/fpu/e_fmod.S index dbd0a29..87b6a48 100644 --- a/sysdeps/ia64/fpu/e_fmod.S +++ b/sysdeps/ia64/fpu/e_fmod.S @@ -75,8 +75,8 @@ // // Special cases //==================================================================== -// b=+/-0: return NaN, call libm_error_support -// a=+/-Inf, a=NaN or b=NaN: return NaN +// a=+/-Inf or b=+/-0: return NaN, call libm_error_support +// a=NaN or b=NaN: return NaN // // Registers used //==================================================================== @@ -407,13 +407,13 @@ FMOD_X_NAN_INF: nop.m 999 // also set Denormal flag if necessary (p8) fma.s0 f9=f9,f1,f0 - nop.i 999 ;; +(p8) mov GR_Parameter_TAG=274 ;; } { .mfb nop.m 999 (p8) fma.d.s0 f8=f8,f1,f0 - nop.b 999 ;; +(p8) br.spnt __libm_error_region;; } { .mfb diff --git a/sysdeps/ia64/fpu/e_fmodf.S b/sysdeps/ia64/fpu/e_fmodf.S index 36e5807..9f8cbbd 100644 --- a/sysdeps/ia64/fpu/e_fmodf.S +++ b/sysdeps/ia64/fpu/e_fmodf.S @@ -75,8 +75,8 @@ // Special cases //==================================================================== -// b=+/-0: return NaN, call libm_error_support -// a=+/-Inf, a=NaN or b=NaN: return NaN +// a=+/-Inf or b=+/-0: return NaN, call libm_error_support +// a=NaN or b=NaN: return NaN // Registers used //==================================================================== @@ -413,13 +413,13 @@ FMOD_X_NAN_INF: nop.m 999 // also set Denormal flag if necessary (p8) fma.s0 f9=f9,f1,f0 - nop.i 999 ;; +(p8) mov GR_Parameter_TAG=275 ;; } { .mfb nop.m 999 (p8) fma.s.s0 f8=f8,f1,f0 - nop.b 999 ;; +(p8) br.spnt __libm_error_region;; } { .mfb diff --git a/sysdeps/ia64/fpu/e_fmodl.S b/sysdeps/ia64/fpu/e_fmodl.S index 3e87eb0..3c38654 100644 --- a/sysdeps/ia64/fpu/e_fmodl.S +++ b/sysdeps/ia64/fpu/e_fmodl.S @@ -484,6 +484,11 @@ FMOD_A_NAN_INF: (p8) cmp.ne p7, p0 = GR_SIG_B, r0 nop.i 0 } +{ .mfi + nop.m 0 + fmerge.s FR_X = f8, f8 + nop.i 0 +} ;; { .mfi @@ -509,7 +514,12 @@ FMOD_A_NAN_INF: { .mfb nop.m 0 (p9) frcpa.s0 f8, p7 = f8, f9 - br.ret.sptk b0 + (p9) br.ret.sptk b0 +} +{ .mmb + alloc GR_ARPFS = ar.pfs, 1, 4, 4, 0 + mov GR_Parameter_TAG = 273 + br.sptk __libm_error_region } ;; diff --git a/sysdeps/ia64/fpu/libm_error.c b/sysdeps/ia64/fpu/libm_error.c index 8ef4bb5..cf004fc 100644 --- a/sysdeps/ia64/fpu/libm_error.c +++ b/sysdeps/ia64/fpu/libm_error.c @@ -708,15 +708,18 @@ switch(input_tag) case gammal_negative: case gamma_negative: case gammaf_negative: - case lgammal_negative: - case lgamma_negative: - case lgammaf_negative: case tgammal_negative: case tgamma_negative: case tgammaf_negative: { ERRNO_DOMAIN; break; } + case lgammal_negative: + case lgamma_negative: + case lgammaf_negative: + { + ERRNO_RANGE; break; + } case ldexpl_overflow: case ldexpl_underflow: case ldexp_overflow: @@ -1081,17 +1084,17 @@ switch(input_tag) case powl_zero_to_negative: /* 0**neg */ { - ERRNO_DOMAIN; break; + ERRNO_RANGE; break; } case pow_zero_to_negative: /* 0**neg */ { - ERRNO_DOMAIN; break; + ERRNO_RANGE; break; } case powf_zero_to_negative: /* 0**neg */ { - ERRNO_DOMAIN; break; + ERRNO_RANGE; break; } case powl_neg_to_non_integer: /* neg**non_integral */ @@ -1307,6 +1310,21 @@ switch(input_tag) { ERRNO_DOMAIN; break; } + case fmodl_infinity: + /* fmodl(inf,y) */ + { + ERRNO_DOMAIN; break; + } + case fmod_infinity: + /* fmod(inf,y) */ + { + ERRNO_DOMAIN; break; + } + case fmodf_infinity: + /* fmodf(inf,y) */ + { + ERRNO_DOMAIN; break; + } case coshl_overflow: /* coshl overflows */ { @@ -1373,6 +1391,51 @@ switch(input_tag) { ERRNO_RANGE; break; } + case cosl_infinity: + /* cosl(inf) */ + { + ERRNO_DOMAIN; break; + } + case cos_infinity: + /* cos(inf) */ + { + ERRNO_DOMAIN; break; + } + case cosf_infinity: + /* cosf(inf) */ + { + ERRNO_DOMAIN; break; + } + case sinl_infinity: + /* sinl(inf) */ + { + ERRNO_DOMAIN; break; + } + case sin_infinity: + /* sin(inf) */ + { + ERRNO_DOMAIN; break; + } + case sinf_infinity: + /* sinf(inf) */ + { + ERRNO_DOMAIN; break; + } + case tanl_infinity: + /* tanl(inf) */ + { + ERRNO_DOMAIN; break; + } + case tan_infinity: + /* tan(inf) */ + { + ERRNO_DOMAIN; break; + } + case tanf_infinity: + /* tanf(inf) */ + { + ERRNO_DOMAIN; break; + } default: break; } diff --git a/sysdeps/ia64/fpu/libm_error_codes.h b/sysdeps/ia64/fpu/libm_error_codes.h index 4f0945e..96e67c0 100644 --- a/sysdeps/ia64/fpu/libm_error_codes.h +++ b/sysdeps/ia64/fpu/libm_error_codes.h @@ -195,7 +195,11 @@ typedef enum nextafterl_underflow, nextafter_underflow, nextafterf_underflow, /* 267, 268, 269 */ nexttowardl_underflow, nexttoward_underflow, - nexttowardf_underflow /* 270, 271, 272 */ + nexttowardf_underflow, /* 270, 271, 272 */ + fmodl_infinity, fmod_infinity, fmodf_infinity, /* 273, 274, 275 */ + cosl_infinity, cos_infinity, cosf_infinity, /* 276, 277, 278 */ + sinl_infinity, sin_infinity, sinf_infinity, /* 279, 280, 281 */ + tanl_infinity, tan_infinity, tanf_infinity, /* 282, 283, 284 */ } error_types; #define LIBM_ERROR __libm_error_support diff --git a/sysdeps/ia64/fpu/s_cos.S b/sysdeps/ia64/fpu/s_cos.S index fc121fc..24c258c 100644 --- a/sysdeps/ia64/fpu/s_cos.S +++ b/sysdeps/ia64/fpu/s_cos.S @@ -174,7 +174,7 @@ //============================================================== // general input registers: // r14 -> r26 -// r32 -> r35 +// r32 -> r36 // predicate registers used: // p6 -> p11 @@ -260,6 +260,10 @@ GR_SAVE_B0 = r34 GR_SAVE_GP = r35 GR_SAVE_r_sincos = r36 +GR_Parameter_X = r37 +GR_Parameter_Y = r38 +GR_Parameter_RESULT = r39 +GR_Parameter_TAG = r40 RODATA @@ -474,7 +478,7 @@ _SINCOS_COMMON: // 0x1001a is register_bias + 27. // So if f8 >= 2^27, go to large argument routines { .mfi - alloc r32 = ar.pfs, 1, 4, 0, 0 + alloc r32 = ar.pfs, 1, 4, 4, 0 fclass.m p11,p0 = f8, 0x0b // Test for x=unorm mov sincos_GR_all_ones = -1 // For "inexect" constant create } @@ -681,20 +685,39 @@ _SINCOS_COMMON2: ////////// x = 0/Inf/NaN path ////////////////// _SINCOS_SPECIAL_ARGS: .pred.rel "mutex",p8,p9 + +{ .mfi + nop.m 999 + fclass.m.unc p7,p0 = f8, 0x23 // is x +/- inf? + nop.i 999;; +} + +{ .mfi + nop.m 999 +(p7) fmerge.s f9 = f8,f8 + nop.i 999 +} + // sin(+/-0) = +/-0 // sin(Inf) = NaN // sin(NaN) = NaN { .mfi nop.m 999 (p8) fma.d.s0 f8 = f8, f0, f0 // sin(+/-0,NaN,Inf) - nop.i 999 +(p8) mov GR_Parameter_TAG = 280 } // cos(+/-0) = 1.0 // cos(Inf) = NaN // cos(NaN) = NaN -{ .mfb +{ .mfi nop.m 999 (p9) fma.d.s0 f8 = f8, f0, f1 // cos(+/-0,NaN,Inf) +(p9) mov GR_Parameter_TAG = 277 +} + +{ .mbb + nop.m 999 +(p7) br.cond.spnt __libm_error_region br.ret.sptk b0 // Exit for x = 0/Inf/NaN path };; @@ -766,3 +789,54 @@ LOCAL_LIBM_END(__libm_callout_sincos) .type __libm_cos_large#,@function .global __libm_cos_large# +LOCAL_LIBM_ENTRY(__libm_error_region) +.prologue +{ .mfi + add GR_Parameter_Y=-32,sp // Parameter 2 value + nop.f 0 +.save ar.pfs,GR_SAVE_PFS + mov GR_SAVE_PFS=ar.pfs // Save ar.pfs +} +{ .mfi +.fframe 64 + add sp=-64,sp // Create new stack + nop.f 0 + mov GR_SAVE_GP=gp // Save gp +};; +{ .mmi + stfd [GR_Parameter_Y] = f1,16 // STORE Parameter 2 on stack + add GR_Parameter_X = 16,sp // Parameter 1 address +.save b0, GR_SAVE_B0 + mov GR_SAVE_B0=b0 // Save b0 +};; +.body +{ .mib + stfd [GR_Parameter_X] = f9 // STORE Parameter 1 on stack + add GR_Parameter_RESULT = 0,GR_Parameter_Y // Parameter 3 address + nop.b 0 +} +{ .mib + stfd [GR_Parameter_Y] = f8 // STORE Parameter 3 on stack + add GR_Parameter_Y = -16,GR_Parameter_Y + br.call.sptk b0=__libm_error_support# // Call error handling function +};; +{ .mmi + add GR_Parameter_RESULT = 48,sp + nop.m 0 + nop.i 0 +};; +{ .mmi + ldfd f8 = [GR_Parameter_RESULT] // Get return result off stack +.restore sp + add sp = 64,sp // Restore stack pointer + mov b0 = GR_SAVE_B0 // Restore return address +};; +{ .mib + mov gp = GR_SAVE_GP // Restore gp + mov ar.pfs = GR_SAVE_PFS // Restore ar.pfs + br.ret.sptk b0 // Return +};; + +LOCAL_LIBM_END(__libm_error_region) +.type __libm_error_support#,@function +.global __libm_error_support# diff --git a/sysdeps/ia64/fpu/s_cosf.S b/sysdeps/ia64/fpu/s_cosf.S index bcdf1b0..f0bc9a8 100644 --- a/sysdeps/ia64/fpu/s_cosf.S +++ b/sysdeps/ia64/fpu/s_cosf.S @@ -171,7 +171,7 @@ //============================================================== // general input registers: // r14 -> r19 -// r32 -> r45 +// r32 -> r43 // predicate registers used: // p6 -> p14 @@ -260,6 +260,11 @@ GR_SAVE_PFS = r41 GR_SAVE_B0 = r42 GR_SAVE_GP = r43 +GR_Parameter_X = r44 +GR_Parameter_Y = r45 +GR_Parameter_RESULT = r46 +GR_Parameter_TAG = r47 + RODATA .align 16 @@ -389,7 +394,7 @@ LOCAL_OBJECT_END(double_sin_cos_beta_k4) GLOBAL_IEEE754_ENTRY(sinf) { .mlx - alloc r32 = ar.pfs,1,13,0,0 + alloc r32 = ar.pfs,1,11,4,0 movl sincosf_GR_sig_inv_pi_by_16 = 0xA2F9836E4E44152A //signd of 16/pi } { .mlx @@ -413,7 +418,7 @@ GLOBAL_IEEE754_END(sinf) GLOBAL_IEEE754_ENTRY(cosf) { .mlx - alloc r32 = ar.pfs,1,13,0,0 + alloc r32 = ar.pfs,1,11,4,0 movl sincosf_GR_sig_inv_pi_by_16 = 0xA2F9836E4E44152A //signd of 16/pi } { .mlx @@ -641,20 +646,39 @@ _SINCOSF_COMMON: ////////// x = 0/Inf/NaN path ////////////////// _SINCOSF_SPECIAL_ARGS: .pred.rel "mutex",p8,p9 + +{ .mfi + nop.m 999 + fclass.m.unc p7,p0 = f8, 0x23 // is x +/- inf? + nop.i 999;; +} + +{ .mfi + nop.m 999 +(p7) fmerge.s f9 = f8,f8 + nop.i 999 +} + // sinf(+/-0) = +/-0 // sinf(Inf) = NaN // sinf(NaN) = NaN { .mfi nop.m 999 (p8) fma.s.s0 f8 = f8, f0, f0 // sinf(+/-0,NaN,Inf) - nop.i 999 +(p8) mov GR_Parameter_TAG = 281 } // cosf(+/-0) = 1.0 // cosf(Inf) = NaN // cosf(NaN) = NaN -{ .mfb +{ .mfi nop.m 999 (p9) fma.s.s0 f8 = f8, f0, f1 // cosf(+/-0,NaN,Inf) +(p9) mov GR_Parameter_TAG = 278 +};; + +{ .mbb + nop.m 999 +(p7) br.cond.spnt __libm_error_region br.ret.sptk b0 // Exit for x = 0/Inf/NaN path };; @@ -715,3 +739,54 @@ LOCAL_LIBM_END(__libm_callout_sincosf) .type __libm_cos_large#, @function .global __libm_cos_large# +LOCAL_LIBM_ENTRY(__libm_error_region) +.prologue +{ .mfi + add GR_Parameter_Y=-32,sp // Parameter 2 value + nop.f 0 +.save ar.pfs,GR_SAVE_PFS + mov GR_SAVE_PFS=ar.pfs // Save ar.pfs +} +{ .mfi +.fframe 64 + add sp=-64,sp // Create new stack + nop.f 0 + mov GR_SAVE_GP=gp // Save gp +};; +{ .mmi + stfd [GR_Parameter_Y] = f1,16 // STORE Parameter 2 on stack + add GR_Parameter_X = 16,sp // Parameter 1 address +.save b0, GR_SAVE_B0 + mov GR_SAVE_B0=b0 // Save b0 +};; +.body +{ .mib + stfd [GR_Parameter_X] = f9 // STORE Parameter 1 on stack + add GR_Parameter_RESULT = 0,GR_Parameter_Y // Parameter 3 address + nop.b 0 +} +{ .mib + stfd [GR_Parameter_Y] = f8 // STORE Parameter 3 on stack + add GR_Parameter_Y = -16,GR_Parameter_Y + br.call.sptk b0=__libm_error_support# // Call error handling function +};; +{ .mmi + add GR_Parameter_RESULT = 48,sp + nop.m 0 + nop.i 0 +};; +{ .mmi + ldfd f8 = [GR_Parameter_RESULT] // Get return result off stack +.restore sp + add sp = 64,sp // Restore stack pointer + mov b0 = GR_SAVE_B0 // Restore return address +};; +{ .mib + mov gp = GR_SAVE_GP // Restore gp + mov ar.pfs = GR_SAVE_PFS // Restore ar.pfs + br.ret.sptk b0 // Return +};; + +LOCAL_LIBM_END(__libm_error_region) +.type __libm_error_support#,@function +.global __libm_error_support# diff --git a/sysdeps/ia64/fpu/s_cosl.S b/sysdeps/ia64/fpu/s_cosl.S index 8d71e50..8bb330e 100644 --- a/sysdeps/ia64/fpu/s_cosl.S +++ b/sysdeps/ia64/fpu/s_cosl.S @@ -747,12 +747,16 @@ GR_SAVE_B0 = r39 GR_SAVE_GP = r40 GR_SAVE_PFS = r41 +GR_Parameter_X = r59 +GR_Parameter_Y = r60 +GR_Parameter_RESULT = r61 +GR_Parameter_TAG = r62 .section .text GLOBAL_IEEE754_ENTRY(sinl) { .mlx - alloc r32 = ar.pfs,0,27,2,0 + alloc r32 = ar.pfs,1,26,4,0 movl GR_sig_inv_pi = 0xa2f9836e4e44152a // significand of 1/pi } { .mlx @@ -777,7 +781,7 @@ GLOBAL_IEEE754_END(sinl) GLOBAL_IEEE754_ENTRY(cosl) { .mlx - alloc r32 = ar.pfs,0,27,2,0 + alloc r32 = ar.pfs,1,26,4,0 movl GR_sig_inv_pi = 0xa2f9836e4e44152a // significand of 1/pi } { .mlx @@ -2278,13 +2282,31 @@ SINCOSL_DENORMAL: SINCOSL_SPECIAL: { .mfb nop.m 999 + fclass.m.unc p6,p0 = f8, 0x23 // is x +/- inf? + nop.b 999;; +} + +{ .mfi + nop.m 999 +(p6) fmerge.s f9 = f8,f8 +(p6) cmp.eq.unc p7, p8 = 0x1, GR_Sin_or_Cos;; +} + +{ .mmf +(p7) mov GR_Parameter_TAG = 276 // (cosl) +(p8) mov GR_Parameter_TAG = 279 // (sinl) // // Path for Arg = +/- QNaN, SNaN, Inf // Invalid can be raised. SNaNs // become QNaNs // fmpy.s0 FR_Result = FR_Input_X, f0 - br.ret.sptk b0 ;; +} + +{ .mbb + nop.m 999 +(p6) br.cond.spnt __libm_error_region + br.ret.sptk b0 ;; } GLOBAL_IEEE754_END(cosl) @@ -2363,3 +2385,55 @@ SINCOSL_ARG_TOO_LARGE: LOCAL_LIBM_END(__libm_callout) .type __libm_pi_by_2_reduce#,@function .global __libm_pi_by_2_reduce# + +LOCAL_LIBM_ENTRY(__libm_error_region) +.prologue +{ .mfi + add GR_Parameter_Y=-32,sp // Parameter 2 value + nop.f 0 +.save ar.pfs,GR_SAVE_PFS + mov GR_SAVE_PFS=ar.pfs // Save ar.pfs +} +{ .mfi +.fframe 64 + add sp=-64,sp // Create new stack + nop.f 0 + mov GR_SAVE_GP=gp // Save gp +};; +{ .mmi + stfd [GR_Parameter_Y] = f1,16 // STORE Parameter 2 on stack + add GR_Parameter_X = 16,sp // Parameter 1 address +.save b0, GR_SAVE_B0 + mov GR_SAVE_B0=b0 // Save b0 +};; +.body +{ .mib + stfd [GR_Parameter_X] = f9 // STORE Parameter 1 on stack + add GR_Parameter_RESULT = 0,GR_Parameter_Y // Parameter 3 address + nop.b 0 +} +{ .mib + stfd [GR_Parameter_Y] = f8 // STORE Parameter 3 on stack + add GR_Parameter_Y = -16,GR_Parameter_Y + br.call.sptk b0=__libm_error_support# // Call error handling function +};; +{ .mmi + add GR_Parameter_RESULT = 48,sp + nop.m 0 + nop.i 0 +};; +{ .mmi + ldfd f8 = [GR_Parameter_RESULT] // Get return result off stack +.restore sp + add sp = 64,sp // Restore stack pointer + mov b0 = GR_SAVE_B0 // Restore return address +};; +{ .mib + mov gp = GR_SAVE_GP // Restore gp + mov ar.pfs = GR_SAVE_PFS // Restore ar.pfs + br.ret.sptk b0 // Return +};; + +LOCAL_LIBM_END(__libm_error_region) +.type __libm_error_support#,@function +.global __libm_error_support# diff --git a/sysdeps/ia64/fpu/s_tan.S b/sysdeps/ia64/fpu/s_tan.S index a2f80c8..a4b42c9 100644 --- a/sysdeps/ia64/fpu/s_tan.S +++ b/sysdeps/ia64/fpu/s_tan.S @@ -348,15 +348,10 @@ COMMON_PATH: (p6) br.ret.spnt b0 ;; // Exit for x=0 (tan only) } -{ .mfi +{ .mmi ldfpd tan_P14,tan_P15 = [tan_AD],16 -(p7) frcpa.s0 f8,p9=f0,f0 // Set qnan indef if x=inf - mov tan_GR_10009 = 0x10009 -} -{ .mib ldfpd tan_Q8,tan_Q9 = [tan_ADQ],16 - nop.i 999 -(p7) br.ret.spnt b0 ;; // Exit for x=inf + mov tan_GR_10009 = 0x10009;; } { .mfi @@ -384,6 +379,12 @@ COMMON_PATH: fma.s1 TAN_W_2TO64_RSH = tan_NORM_f8,TAN_INV_PI_BY_2_2TO64,TAN_RSHF_2TO64 };; +{ .mfb +(p7) mov GR_Parameter_Tag = 283 // (tan) +(p7) frcpa.s0 f8,p9=f0,f0 // Set qnan indef if x=inf +(p7) br.cond.spnt __libm_error_region ;; // call error support if tan(+-inf) +} + { .mmf ldfpd tan_P10,tan_P11 = [tan_AD],16 and tan_exp = tan_GR_17_ones, tan_signexp diff --git a/sysdeps/ia64/fpu/s_tanf.S b/sysdeps/ia64/fpu/s_tanf.S index 193d756..cd0febb 100644 --- a/sysdeps/ia64/fpu/s_tanf.S +++ b/sysdeps/ia64/fpu/s_tanf.S @@ -301,11 +301,11 @@ Common_Path: { .mfi cmp.ge p6, p0 = rSignMask, rExpCut // p6 = (E => 0x10009) (p8) frcpa.s0 f8, p0 = f0, f0 // Set qnan indef if x=inf - mov GR_Parameter_Tag = 227 // (cotf) + mov GR_Parameter_Tag = 284 // (tanf) } { .mbb ldfe fPiby2 = [rCoeffB], 16 -(p8) br.ret.spnt b0 // Exit for x=inf +(p8) br.cond.spnt __libm_error_region // call error support if tanf(+-0) (p6) br.cond.spnt Huge_Argument // Branch if |x|>=2^10 } ;; @@ -313,7 +313,7 @@ Common_Path: { .mfi nop.m 0 (p11) fclass.m.unc p6, p0 = f8, 0x07 // Test for x=0 (for cotf) - nop.i 0 + mov GR_Parameter_Tag = 227 // (cotf) } { .mfb nop.m 0 diff --git a/sysdeps/ia64/fpu/s_tanl.S b/sysdeps/ia64/fpu/s_tanl.S index 607a271..95d5145 100644 --- a/sysdeps/ia64/fpu/s_tanl.S +++ b/sysdeps/ia64/fpu/s_tanl.S @@ -3072,21 +3072,32 @@ TANL_UNSUPPORTED: { .mfi nop.m 999 -(p6) fclass.m p6, p7 = f8, 0x7 // Test for zero (cotl only) +(p6) fclass.m.unc p6, p0 = f8, 0x7 // Test for zero (cotl only) + nop.i 999 +} +;; +{ .mfi + nop.m 999 +(p7) fclass.m.unc p7, p0 = f8, 0x23 // Test for inf (tanl only) nop.i 999 } ;; .pred.rel "mutex", p6, p7 -{ .mfi +{ .mfb (p6) mov GR_Parameter_Tag = 225 // (cotl) (p6) frcpa.s0 f8, p0 = f1, f8 // cotl(+-0) = +-Inf - nop.i 999 +(p6) br.cond.spnt __libm_error_region;; +} +{ .mfb +(p7) mov GR_Parameter_Tag = 282 // (tanl) + fmpy.s0 f8 = f8, f0 +(p7) br.cond.spnt __libm_error_region;; } { .mfb nop.m 999 -(p7) fmpy.s0 f8 = f8, f0 -(p7) br.ret.sptk b0 + nop.f 999 + br.ret.sptk b0 } ;; diff --git a/sysdeps/ia64/ia64libgcc.S b/sysdeps/ia64/ia64libgcc.S deleted file mode 100644 index 3f77b06..0000000 --- a/sysdeps/ia64/ia64libgcc.S +++ /dev/null @@ -1,350 +0,0 @@ -/* From the Intel IA-64 Optimization Guide, choose the minimum latency - alternative. */ - -#include -#undef ret - -#include - -#if SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_2_6) - -/* __divtf3 - Compute a 80-bit IEEE double-extended quotient. - farg0 holds the dividend. farg1 holds the divisor. */ - -ENTRY(___divtf3) - cmp.eq p7, p0 = r0, r0 - frcpa.s0 f10, p6 = farg0, farg1 - ;; -(p6) cmp.ne p7, p0 = r0, r0 - .pred.rel.mutex p6, p7 -(p6) fnma.s1 f11 = farg1, f10, f1 -(p6) fma.s1 f12 = farg0, f10, f0 - ;; -(p6) fma.s1 f13 = f11, f11, f0 -(p6) fma.s1 f14 = f11, f11, f11 - ;; -(p6) fma.s1 f11 = f13, f13, f11 -(p6) fma.s1 f13 = f14, f10, f10 - ;; -(p6) fma.s1 f10 = f13, f11, f10 -(p6) fnma.s1 f11 = farg1, f12, farg0 - ;; -(p6) fma.s1 f11 = f11, f10, f12 -(p6) fnma.s1 f12 = farg1, f10, f1 - ;; -(p6) fma.s1 f10 = f12, f10, f10 -(p6) fnma.s1 f12 = farg1, f11, farg0 - ;; -(p6) fma.s0 fret0 = f12, f10, f11 -(p7) mov fret0 = f10 - br.ret.sptk rp -END(___divtf3) - .symver ___divtf3, __divtf3@GLIBC_2.2 - -/* __divdf3 - Compute a 64-bit IEEE double quotient. - farg0 holds the dividend. farg1 holds the divisor. */ - -ENTRY(___divdf3) - cmp.eq p7, p0 = r0, r0 - frcpa.s0 f10, p6 = farg0, farg1 - ;; -(p6) cmp.ne p7, p0 = r0, r0 - .pred.rel.mutex p6, p7 -(p6) fmpy.s1 f11 = farg0, f10 -(p6) fnma.s1 f12 = farg1, f10, f1 - ;; -(p6) fma.s1 f11 = f12, f11, f11 -(p6) fmpy.s1 f13 = f12, f12 - ;; -(p6) fma.s1 f10 = f12, f10, f10 -(p6) fma.s1 f11 = f13, f11, f11 - ;; -(p6) fmpy.s1 f12 = f13, f13 -(p6) fma.s1 f10 = f13, f10, f10 - ;; -(p6) fma.d.s1 f11 = f12, f11, f11 -(p6) fma.s1 f10 = f12, f10, f10 - ;; -(p6) fnma.d.s1 f8 = farg1, f11, farg0 - ;; -(p6) fma.d fret0 = f8, f10, f11 -(p7) mov fret0 = f10 - br.ret.sptk rp - ;; -END(___divdf3) - .symver ___divdf3, __divdf3@GLIBC_2.2 - -/* __divsf3 - Compute a 32-bit IEEE float quotient. - farg0 holds the dividend. farg1 holds the divisor. */ - -ENTRY(___divsf3) - cmp.eq p7, p0 = r0, r0 - frcpa.s0 f10, p6 = farg0, farg1 - ;; -(p6) cmp.ne p7, p0 = r0, r0 - .pred.rel.mutex p6, p7 -(p6) fmpy.s1 f8 = farg0, f10 -(p6) fnma.s1 f9 = farg1, f10, f1 - ;; -(p6) fma.s1 f8 = f9, f8, f8 -(p6) fmpy.s1 f9 = f9, f9 - ;; -(p6) fma.s1 f8 = f9, f8, f8 -(p6) fmpy.s1 f9 = f9, f9 - ;; -(p6) fma.d.s1 f10 = f9, f8, f8 - ;; -(p6) fnorm.s.s0 fret0 = f10 -(p7) mov fret0 = f10 - br.ret.sptk rp - ;; -END(___divsf3) - .symver ___divsf3, __divsf3@GLIBC_2.2 - -/* __divdi3 - Compute a 64-bit integer quotient. - in0 holds the dividend. in1 holds the divisor. */ - -ENTRY(___divdi3) - .regstk 2,0,0,0 - /* Transfer inputs to FP registers. */ - setf.sig f8 = in0 - setf.sig f9 = in1 - ;; - /* Convert the inputs to FP, so that they won't be treated as - unsigned. */ - fcvt.xf f8 = f8 - fcvt.xf f9 = f9 - ;; - /* Compute the reciprocal approximation. */ - frcpa.s1 f10, p6 = f8, f9 - ;; - /* 3 Newton-Raphson iterations. */ -(p6) fnma.s1 f11 = f9, f10, f1 -(p6) fmpy.s1 f12 = f8, f10 - ;; -(p6) fmpy.s1 f13 = f11, f11 -(p6) fma.s1 f12 = f11, f12, f12 - ;; -(p6) fma.s1 f10 = f11, f10, f10 -(p6) fma.s1 f11 = f13, f12, f12 - ;; -(p6) fma.s1 f10 = f13, f10, f10 -(p6) fnma.s1 f12 = f9, f11, f8 - ;; -(p6) fma.s1 f10 = f12, f10, f11 - ;; - /* Round quotient to an integer. */ - fcvt.fx.trunc.s1 f10 = f10 - ;; - /* Transfer result to GP registers. */ - getf.sig ret0 = f10 - br.ret.sptk rp - ;; -END(___divdi3) - .symver ___divdi3, __divdi3@GLIBC_2.2 - -/* __moddi3 - Compute a 64-bit integer modulus. - in0 holds the dividend (a). in1 holds the divisor (b). */ - -ENTRY(___moddi3) - .regstk 2,0,0,0 - /* Transfer inputs to FP registers. */ - setf.sig f14 = in0 - setf.sig f9 = in1 - ;; - /* Convert the inputs to FP, so that they won't be treated as - unsigned. */ - fcvt.xf f8 = f14 - fcvt.xf f9 = f9 - ;; - /* Compute the reciprocal approximation. */ - frcpa.s1 f10, p6 = f8, f9 - ;; - /* 3 Newton-Raphson iterations. */ -(p6) fmpy.s1 f12 = f8, f10 -(p6) fnma.s1 f11 = f9, f10, f1 - ;; -(p6) fma.s1 f12 = f11, f12, f12 -(p6) fmpy.s1 f13 = f11, f11 - ;; -(p6) fma.s1 f10 = f11, f10, f10 -(p6) fma.s1 f11 = f13, f12, f12 - ;; - sub in1 = r0, in1 -(p6) fma.s1 f10 = f13, f10, f10 -(p6) fnma.s1 f12 = f9, f11, f8 - ;; - setf.sig f9 = in1 -(p6) fma.s1 f10 = f12, f10, f11 - ;; - fcvt.fx.trunc.s1 f10 = f10 - ;; - /* r = q * (-b) + a */ - xma.l f10 = f10, f9, f14 - ;; - /* Transfer result to GP registers. */ - getf.sig ret0 = f10 - br.ret.sptk rp - ;; -END(___moddi3) - .symver ___moddi3, __moddi3@GLIBC_2.2 - -/* __udivdi3 - Compute a 64-bit unsigned integer quotient. - in0 holds the dividend. in1 holds the divisor. */ - -ENTRY(___udivdi3) - .regstk 2,0,0,0 - /* Transfer inputs to FP registers. */ - setf.sig f8 = in0 - setf.sig f9 = in1 - ;; - /* Convert the inputs to FP, to avoid FP software-assist faults. */ - fcvt.xuf.s1 f8 = f8 - fcvt.xuf.s1 f9 = f9 - ;; - /* Compute the reciprocal approximation. */ - frcpa.s1 f10, p6 = f8, f9 - ;; - /* 3 Newton-Raphson iterations. */ -(p6) fnma.s1 f11 = f9, f10, f1 -(p6) fmpy.s1 f12 = f8, f10 - ;; -(p6) fmpy.s1 f13 = f11, f11 -(p6) fma.s1 f12 = f11, f12, f12 - ;; -(p6) fma.s1 f10 = f11, f10, f10 -(p6) fma.s1 f11 = f13, f12, f12 - ;; -(p6) fma.s1 f10 = f13, f10, f10 -(p6) fnma.s1 f12 = f9, f11, f8 - ;; -(p6) fma.s1 f10 = f12, f10, f11 - ;; - /* Round quotient to an unsigned integer. */ - fcvt.fxu.trunc.s1 f10 = f10 - ;; - /* Transfer result to GP registers. */ - getf.sig ret0 = f10 - br.ret.sptk rp - ;; -END(___udivdi3) - .symver ___udivdi3, __udivdi3@GLIBC_2.2 - -/* __umoddi3 - Compute a 64-bit unsigned integer modulus. - in0 holds the dividend (a). in1 holds the divisor (b). */ - -ENTRY(___umoddi3) - .regstk 2,0,0,0 - /* Transfer inputs to FP registers. */ - setf.sig f14 = in0 - setf.sig f9 = in1 - ;; - /* Convert the inputs to FP, to avoid FP software assist faults. */ - fcvt.xuf.s1 f8 = f14 - fcvt.xuf.s1 f9 = f9 - ;; - /* Compute the reciprocal approximation. */ - frcpa.s1 f10, p6 = f8, f9 - ;; - /* 3 Newton-Raphson iterations. */ -(p6) fmpy.s1 f12 = f8, f10 -(p6) fnma.s1 f11 = f9, f10, f1 - ;; -(p6) fma.s1 f12 = f11, f12, f12 -(p6) fmpy.s1 f13 = f11, f11 - ;; -(p6) fma.s1 f10 = f11, f10, f10 -(p6) fma.s1 f11 = f13, f12, f12 - ;; - sub in1 = r0, in1 -(p6) fma.s1 f10 = f13, f10, f10 -(p6) fnma.s1 f12 = f9, f11, f8 - ;; - setf.sig f9 = in1 -(p6) fma.s1 f10 = f12, f10, f11 - ;; - /* Round quotient to an unsigned integer. */ - fcvt.fxu.trunc.s1 f10 = f10 - ;; - /* r = q * (-b) + a */ - xma.l f10 = f10, f9, f14 - ;; - /* Transfer result to GP registers. */ - getf.sig ret0 = f10 - br.ret.sptk rp - ;; -END(___umoddi3) - .symver ___umoddi3, __umoddi3@GLIBC_2.2 - -/* __multi3 - Compute a 128-bit multiply of 128-bit multiplicands. - in0/in1 holds one multiplicand (a), in2/in3 holds the other one (b). */ - -ENTRY(___multi3) - .regstk 4,0,0,0 - setf.sig f6 = in1 - movl r19 = 0xffffffff - setf.sig f7 = in2 - ;; - and r14 = r19, in0 - ;; - setf.sig f10 = r14 - and r14 = r19, in2 - xmpy.l f9 = f6, f7 - ;; - setf.sig f6 = r14 - shr.u r14 = in0, 32 - ;; - setf.sig f7 = r14 - shr.u r14 = in2, 32 - ;; - setf.sig f8 = r14 - xmpy.l f11 = f10, f6 - xmpy.l f6 = f7, f6 - ;; - getf.sig r16 = f11 - xmpy.l f7 = f7, f8 - ;; - shr.u r14 = r16, 32 - and r16 = r19, r16 - getf.sig r17 = f6 - setf.sig f6 = in0 - ;; - setf.sig f11 = r14 - getf.sig r21 = f7 - setf.sig f7 = in3 - ;; - xma.l f11 = f10, f8, f11 - xma.l f6 = f6, f7, f9 - ;; - getf.sig r18 = f11 - ;; - add r18 = r18, r17 - ;; - and r15 = r19, r18 - cmp.ltu p7, p6 = r18, r17 - ;; - getf.sig r22 = f6 -(p7) adds r14 = 1, r19 - ;; -(p7) add r21 = r21, r14 - shr.u r14 = r18, 32 - shl r15 = r15, 32 - ;; - add r20 = r21, r14 - ;; - add ret0 = r15, r16 - add ret1 = r22, r20 - br.ret.sptk rp - ;; -END(___multi3) - .symver ___multi3, __multi3@GLIBC_2.2 - -#endif diff --git a/sysdeps/ia64/libgcc-compat.c b/sysdeps/ia64/libgcc-compat.c new file mode 100644 index 0000000..37b86b2 --- /dev/null +++ b/sysdeps/ia64/libgcc-compat.c @@ -0,0 +1,112 @@ +/* pre-.hidden libgcc compatibility + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + + +#include +#include + +#if SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_2_6) + +typedef int int128_t __attribute__((__mode__(TI))); + +extern long double __divtf3 (long double, long double) attribute_hidden; +long double INTUSE (__divtf3) (long double x, long double y) +{ + return __divtf3 (x, y); +} +symbol_version (INTUSE (__divtf3), __divtf3, GLIBC_2.2); + +extern double __divdf3 (double, double) attribute_hidden; +double INTUSE (__divdf3) (double x, double y) +{ + return __divdf3 (x, y); +} +symbol_version (INTUSE (__divdf3), __divdf3, GLIBC_2.2); + +extern float __divsf3 (float, float) attribute_hidden; +float INTUSE (__divsf3) (float x, float y) +{ + return __divsf3 (x, y); +} +symbol_version (INTUSE (__divsf3), __divsf3, GLIBC_2.2); + +extern int64_t __divdi3 (int64_t, int64_t) attribute_hidden; +int64_t INTUSE (__divdi3) (int64_t x, int64_t y) +{ + return __divdi3 (x, y); +} +symbol_version (INTUSE (__divdi3), __divdi3, GLIBC_2.2); + +extern int64_t __moddi3 (int64_t, int64_t) attribute_hidden; +int64_t INTUSE (__moddi3) (int64_t x, int64_t y) +{ + return __moddi3 (x, y); +} +symbol_version (INTUSE (__moddi3), __moddi3, GLIBC_2.2); + +extern uint64_t __udivdi3 (uint64_t, uint64_t) attribute_hidden; +uint64_t INTUSE (__udivdi3) (uint64_t x, uint64_t y) +{ + return __udivdi3 (x, y); +} +symbol_version (INTUSE (__udivdi3), __udivdi3, GLIBC_2.2); + +extern uint64_t __umoddi3 (uint64_t, uint64_t) attribute_hidden; +uint64_t INTUSE (__umoddi3) (uint64_t x, uint64_t y) +{ + return __umoddi3 (x, y); +} +symbol_version (INTUSE (__umoddi3), __umoddi3, GLIBC_2.2); + +extern int128_t __multi3 (int128_t, int128_t) attribute_hidden; +int128_t INTUSE (__multi3) (int128_t x, int128_t y) +{ + return __multi3 (x, y); +} +symbol_version (INTUSE (__multi3), __multi3, GLIBC_2.2); + +extern int64_t __divsi3 (int64_t, int64_t) attribute_hidden; +int64_t INTUSE (__divsi3) (int64_t x, int64_t y) +{ + return __divsi3 (x, y); +} +symbol_version (INTUSE (__divsi3), __divsi3, GLIBC_2.2); + +extern int64_t __modsi3 (int64_t, int64_t) attribute_hidden; +int64_t INTUSE (__modsi3) (int64_t x, int64_t y) +{ + return __modsi3 (x, y); +} +symbol_version (INTUSE (__modsi3), __modsi3, GLIBC_2.2); + +extern uint64_t __udivsi3 (uint64_t, uint64_t) attribute_hidden; +uint64_t INTUSE (__udivsi3) (uint64_t x, uint64_t y) +{ + return __udivsi3 (x, y); +} +symbol_version (INTUSE (__udivsi3), __udivsi3, GLIBC_2.2); + +extern uint64_t __umodsi3 (uint64_t, uint64_t) attribute_hidden; +uint64_t INTUSE (__umodsi3) (uint64_t x, uint64_t y) +{ + return __umodsi3 (x, y); +} +symbol_version (INTUSE (__umodsi3), __umodsi3, GLIBC_2.2); + +#endif diff --git a/sysdeps/ieee754/ldbl-128/s_nexttowardf.c b/sysdeps/ieee754/ldbl-128/s_nexttowardf.c index 1f37d80..89e18e7 100644 --- a/sysdeps/ieee754/ldbl-128/s_nexttowardf.c +++ b/sysdeps/ieee754/ldbl-128/s_nexttowardf.c @@ -19,7 +19,8 @@ static char rcsid[] = "$NetBSD: $"; #endif #include "math.h" -#include "math_private.h" +#include +#include #ifdef __STDC__ float __nexttowardf(float x, long double y) @@ -69,7 +70,13 @@ static char rcsid[] = "$NetBSD: $"; } } hy = hx&0x7f800000; - if(hy>=0x7f800000) return x+x; /* overflow */ + if(hy>=0x7f800000) { + x = x+x; /* overflow */ + if (FLT_EVAL_METHOD != 0) + /* Force conversion to float. */ + asm ("" : "+m"(x)); + return x; + } if(hy<0x00800000) { float u = x*x; /* underflow */ math_force_eval (u); /* raise underflow flag */ diff --git a/sysdeps/m68k/framestate.c b/sysdeps/m68k/framestate.c new file mode 100644 index 0000000..139597f --- /dev/null +++ b/sysdeps/m68k/framestate.c @@ -0,0 +1,2 @@ + + diff --git a/sysdeps/m68k/unwind-pe.c b/sysdeps/m68k/unwind-pe.c new file mode 100644 index 0000000..068bdac --- /dev/null +++ b/sysdeps/m68k/unwind-pe.c @@ -0,0 +1,6 @@ +#include +#include + +#define _LIBC_DEFINITIONS +#define NO_BASE_OF_ENCODED_VALUE +#include "unwind-pe.h" diff --git a/sysdeps/mach/configure b/sysdeps/mach/configure index 32763eb..13490ca 100644 --- a/sysdeps/mach/configure +++ b/sysdeps/mach/configure @@ -373,7 +373,7 @@ $as_echo "$as_me: error: you need Mach headers supporting task_info.creation_tim fi mach_interface_list= -for ifc in mach mach4 \ +for ifc in mach mach4 gnumach \ clock clock_priv host_priv host_security ledger lock_set \ processor processor_set task thread_act vm_map \ memory_object memory_object_default default_pager \ diff --git a/sysdeps/mach/configure.in b/sysdeps/mach/configure.in index 2f82c3a..101a884 100644 --- a/sysdeps/mach/configure.in +++ b/sysdeps/mach/configure.in @@ -53,7 +53,7 @@ dnl but we don't do a check for that here because in a bare dnl environment the compile against those headers will fail. dnl mach_interface_list= -for ifc in mach mach4 \ +for ifc in mach mach4 gnumach \ clock clock_priv host_priv host_security ledger lock_set \ processor processor_set task thread_act vm_map \ memory_object memory_object_default default_pager \ diff --git a/sysdeps/mach/hurd/Makefile b/sysdeps/mach/hurd/Makefile index 95d7ba3..230ed28 100644 --- a/sysdeps/mach/hurd/Makefile +++ b/sysdeps/mach/hurd/Makefile @@ -87,7 +87,7 @@ $(common-objpfx)errnos.d: $(mach-errnos-deps) -e 's, \.\./, $(..),g' > $@t mv -f $@t $@ -$(hurd)/bits/errno.h: $(common-objpfx)stamp-errnos ; +$(hurd)/bits/errno-disabled.h: $(common-objpfx)stamp-errnos ; $(common-objpfx)stamp-errnos: $(hurd)/errnos.awk $(errno.texinfo) \ $(mach-errnos-deps) $(common-objpfx)errnos.d $(AWK) -f $^ > $(hurd)/bits/errno.h-tmp @@ -172,6 +172,10 @@ $(objpfx)librtld.map: $(rpcuserlibs:.so=_pic.a) CFLAGS-dl-load.c = -DEXTERNAL_MAP_FROM_FD endif +ifeq ($(subdir),posix) +CFLAGS-confstr.c += -DLIBPTHREAD_VERSION='"libpthread 0.3"' +endif + # We need these libs to link static programs in the libc source tree, too. ifeq (yes,$(build-static)) link-libc-static := -Wl,-\( \ diff --git a/sysdeps/mach/hurd/bits/errno.h b/sysdeps/mach/hurd/bits/errno.h index a7d57ad..b1fa965 100644 --- a/sysdeps/mach/hurd/bits/errno.h +++ b/sysdeps/mach/hurd/bits/errno.h @@ -182,8 +182,10 @@ enum __error_t_codes #define EBACKGROUND _HURD_ERRNO (100)/* Inappropriate operation for background process */ EDIED = _HURD_ERRNO (101), #define EDIED _HURD_ERRNO (101)/* Translator died */ +#if 0 ED = _HURD_ERRNO (102), #define ED _HURD_ERRNO (102)/* ? */ +#endif EGREGIOUS = _HURD_ERRNO (103), #define EGREGIOUS _HURD_ERRNO (103)/* You really blew it this time */ EIEIO = _HURD_ERRNO (104), @@ -212,8 +214,8 @@ enum __error_t_codes #define EPROTO _HURD_ERRNO (116)/* Protocol error */ ETIME = _HURD_ERRNO (117), #define ETIME _HURD_ERRNO (117)/* Timer expired */ - ECANCELED = _HURD_ERRNO (118), -#define ECANCELED _HURD_ERRNO (118)/* Operation canceled */ + ECANCELED = _HURD_ERRNO (119), +#define ECANCELED _HURD_ERRNO (119)/* Operation canceled */ /* Errors from . */ EMACH_SEND_IN_PROGRESS = 0x10000001, @@ -297,7 +299,7 @@ enum __error_t_codes }; -#define _HURD_ERRNOS 119 +#define _HURD_ERRNOS 120 /* User-visible type of error codes. It is ok to use `int' or `kern_return_t' for these, but with `error_t' the debugger prints diff --git a/sysdeps/mach/hurd/bits/fcntl.h b/sysdeps/mach/hurd/bits/fcntl.h index b4147ce..085b64c 100644 --- a/sysdeps/mach/hurd/bits/fcntl.h +++ b/sysdeps/mach/hurd/bits/fcntl.h @@ -1,6 +1,5 @@ /* O_*, F_*, FD_* bit values for GNU. - Copyright (C) 1993,1994,1996,1997,1998,1999,2000,2001,2004,2007 - Free Software Foundation, Inc. + Copyright (C) 1993-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -55,7 +54,9 @@ #ifdef __USE_GNU # define O_NOLINK 0x0040 /* No name mappings on final component. */ # define O_NOTRANS 0x0080 /* No translator on final component. */ +#endif +#ifdef __USE_XOPEN2K8 # define O_NOFOLLOW 0x00100000 /* Produce ENOENT if file is a symlink. */ # define O_DIRECTORY 0x00200000 /* Produce ENOTDIR if not a directory. */ #endif @@ -119,7 +120,7 @@ once the file has been opened. */ #define O_TRUNC 0x00010000 /* Truncate file to zero length. */ -#ifdef __USE_GNU +#ifdef __USE_XOPEN2K8 # define O_CLOEXEC 0x00400000 /* Set FD_CLOEXEC. */ #endif @@ -159,7 +160,7 @@ #define F_SETFD 2 /* Set file descriptor flags. */ #define F_GETFL 3 /* Get file status flags. */ #define F_SETFL 4 /* Set file status flags. */ -#if defined __USE_BSD || defined __USE_UNIX98 +#if defined __USE_BSD || defined __USE_UNIX98 || defined __USE_XOPEN2K8 # define F_GETOWN 5 /* Get owner (receiver of SIGIO). */ # define F_SETOWN 6 /* Set owner (receiver of SIGIO). */ #endif @@ -167,7 +168,7 @@ #define F_SETLK 8 /* Set record locking info (non-blocking). */ #define F_SETLKW 9 /* Set record locking info (blocking). */ -#ifdef __USE_GNU +#ifdef __USE_XOPEN2K8 # define F_DUPFD_CLOEXEC 1030 /* Duplicate, set FD_CLOEXEC on new one. */ #endif @@ -219,3 +220,18 @@ struct flock64 # define POSIX_FADV_DONTNEED 4 /* Don't need these pages. */ # define POSIX_FADV_NOREUSE 5 /* Data will be accessed once. */ #endif + +/* Values for `*at' functions. */ +#ifdef __USE_ATFILE +# define AT_FDCWD -100 /* Special value used to indicate + the *at functions should use the + current working directory. */ +# define AT_SYMLINK_NOFOLLOW 0x100 /* Do not follow symbolic links. */ +# define AT_REMOVEDIR 0x200 /* Remove directory instead of + unlinking file. */ +# define AT_SYMLINK_FOLLOW 0x400 /* Follow symbolic links. */ +# define AT_NO_AUTOMOUNT 0x800 /* Suppress terminal automount + traversal. */ +# define AT_EACCESS 0x200 /* Test access permitted for + effective IDs, not real IDs. */ +#endif diff --git a/sysdeps/mach/hurd/bits/ioctls.h b/sysdeps/mach/hurd/bits/ioctls.h index 8718aac..106b227 100644 --- a/sysdeps/mach/hurd/bits/ioctls.h +++ b/sysdeps/mach/hurd/bits/ioctls.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1992,93,96,97,98,99,2001,2007 Free Software Foundation, Inc. +/* Copyright (C) 1992-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -149,15 +149,33 @@ enum __ioctl_datum { IOC_8, IOC_16, IOC_32, IOC_64 }; #define _IOT_SIMPLE(type) _IOT (_IOTS (type), 1, 0, 0, 0, 0) /* Basic C types. */ -#define _IOT__IOTBASE_int _IOT_SIMPLE (int) #define _IOT__IOTBASE_char _IOT_SIMPLE (char) #define _IOT__IOTBASE_short _IOT_SIMPLE (short) +#define _IOT__IOTBASE_int _IOT_SIMPLE (int) +#define _IOT__IOTBASE_long _IOT_SIMPLE (long) +#define _IOT_char _IOT_SIMPLE (char) +#define _IOT_short _IOT_SIMPLE (short) +#define _IOT_int _IOT_SIMPLE (int) +#define _IOT_long _IOT_SIMPLE (long) + +#define _IOT__IOTBASE_int8_t _IOT_SIMPLE (int8_t) +#define _IOT__IOTBASE_uint8_t _IOT_SIMPLE (uint8_t) +#define _IOT__IOTBASE_int16_t _IOT_SIMPLE (int16_t) +#define _IOT__IOTBASE_uint16_t _IOT_SIMPLE (uint16_t) +#define _IOT__IOTBASE_int32_t _IOT_SIMPLE (int32_t) +#define _IOT__IOTBASE_uint32_t _IOT_SIMPLE (uint32_t) +#define _IOT__IOTBASE_int64_t _IOT_SIMPLE (int64_t) +#define _IOT__IOTBASE_uint64_t _IOT_SIMPLE (uint64_t) + +#define _IOT__IOTBASE_size_t _IOT_SIMPLE (size_t) +#define _IOT__IOTBASE_ssize_t _IOT_SIMPLE (ssize_t) /* Standard flavors of ioctls. _IOT_foobar is defined either in this file, or where struct foobar is defined. */ #define _IO(g, n) _IOC (IOC_VOID, (g), (n), 0) +#define _IOIW(g, n, t) _IOC (IOC_VOID, (g), (n), _IOC_ENCODE_TYPE (t)) #define _IOR(g, n, t) _IOC (IOC_OUT, (g), (n), _IOC_ENCODE_TYPE (t)) #define _IOW(g, n, t) _IOC (IOC_IN, (g), (n), _IOC_ENCODE_TYPE (t)) #define _IOWR(g, n, t) _IOC (IOC_INOUT, (g), (n), _IOC_ENCODE_TYPE (t)) @@ -173,6 +191,10 @@ enum __ioctl_datum { IOC_8, IOC_16, IOC_32, IOC_64 }; #define _IOC_ENCODE_TYPE_1(typespec) _IOC_ENCODE_TYPE_2(typespec) #define _IOC_ENCODE_TYPE_2(typespec) _IOT_##typespec +/* Also, ignore signedness. */ +#define _IOTBASE_unsigned +#define _IOTBASE_signed + /* ioctls verbatim from 4.4 . */ @@ -260,8 +282,10 @@ enum __ioctl_datum { IOC_8, IOC_16, IOC_32, IOC_64 }; #define SIOCSPGRP _IOW('s', 8, int) /* set process group */ #define SIOCGPGRP _IOR('s', 9, int) /* get process group */ +#if 0 #define SIOCADDRT _IOW('r', 10, struct ortentry) /* add route */ #define SIOCDELRT _IOW('r', 11, struct ortentry) /* delete route */ +#endif #define SIOCSIFADDR _IOW('i', 12, struct ifreq) /* set ifnet address */ #define OSIOCGIFADDR _IOWR('i',13, struct ifreq) /* get ifnet address */ @@ -283,12 +307,16 @@ enum __ioctl_datum { IOC_8, IOC_16, IOC_32, IOC_64 }; #define SIOCGIFMETRIC _IOWR('i',23, struct ifreq_int) /* get IF metric */ #define SIOCSIFMETRIC _IOW('i',24, struct ifreq_int) /* set IF metric */ #define SIOCDIFADDR _IOW('i',25, struct ifreq) /* delete IF addr */ +#if 0 #define SIOCAIFADDR _IOW('i',26, struct ifaliasreq) /* add/chg IF alias */ +#endif +#if 0 #define SIOCSARP _IOW('i', 30, struct arpreq) /* set arp entry */ #define OSIOCGARP _IOWR('i',31, struct arpreq) /* get arp entry */ #define SIOCGARP _IOWR('i',38, struct arpreq) /* get arp entry */ #define SIOCDARP _IOW('i', 32, struct arpreq) /* delete arp entry */ +#endif #define SIOCGIFMTU _IOWR('i', 51, struct ifreq_int)/* get IF mtu */ #define SIOCSIFMTU _IOW('i', 52, struct ifreq_int) /* set IF mtu */ diff --git a/sysdeps/mach/hurd/bits/libc-lock.h b/sysdeps/mach/hurd/bits/libc-lock.h index 90e46e0..876786d 100644 --- a/sysdeps/mach/hurd/bits/libc-lock.h +++ b/sysdeps/mach/hurd/bits/libc-lock.h @@ -21,6 +21,9 @@ #define _BITS_LIBC_LOCK_H 1 #if (_LIBC - 0) || (_CTHREADS_ - 0) +#if (_LIBC - 0) +#include +#endif #include #include @@ -188,6 +191,10 @@ struct __libc_once __libc_lock_unlock (ONCE_CONTROL.lock); \ } while (0) +/* Get once control variable. */ +#define __libc_once_get(ONCE_CONTROL) \ + (!ONCE_CONTROL.done) + #ifdef _LIBC /* We need portable names for some functions. E.g., when they are used as argument to __libc_cleanup_region_start. */ diff --git a/sysdeps/mach/hurd/bits/posix_opt.h b/sysdeps/mach/hurd/bits/posix_opt.h index 775c921..2bbcaa0 100644 --- a/sysdeps/mach/hurd/bits/posix_opt.h +++ b/sysdeps/mach/hurd/bits/posix_opt.h @@ -1,5 +1,5 @@ /* Define POSIX options for GNU/Hurd. - Copyright (C) 1998,2000,2001,2002,2006,2009 Free Software Foundation, Inc. + Copyright (C) 1998-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -31,6 +31,9 @@ /* Processes have a saved set-user-ID and a saved set-group-ID. */ #define _POSIX_SAVED_IDS 1 +/* Priority scheduling is not supported. */ +#undef _POSIX_PRIORITY_SCHEDULING + /* Synchronizing file data is supported, but msync is missing. */ #undef _POSIX_SYNCHRONIZED_IO @@ -60,27 +63,58 @@ #undef _POSIX_NO_TRUNC /* Overlong file names get error? */ #undef _POSIX_SYNC_IO /* File supports O_SYNC et al? */ +/* X/Open realtime support is not supported. */ +#undef _XOPEN_REALTIME + +/* X/Open thread realtime support is not supported. */ +#undef _XOPEN_REALTIME_THREADS -/* We do not have the POSIX threads interface. */ -#define _POSIX_THREADS -1 +/* XPG4.2 shared memory is supported. */ +#define _XOPEN_SHM 1 + +/* Tell we have POSIX threads. */ +#define _POSIX_THREADS 200112L /* We have the reentrant functions described in POSIX. */ #define _POSIX_REENTRANT_FUNCTIONS 1 #define _POSIX_THREAD_SAFE_FUNCTIONS 200809L -/* These are all things that won't be supported when _POSIX_THREADS is not. */ +/* We do not provide priority scheduling for threads. */ #define _POSIX_THREAD_PRIORITY_SCHEDULING -1 -#define _POSIX_THREAD_ATTR_STACKSIZE -1 -#define _POSIX_THREAD_ATTR_STACKADDR -1 -#define _POSIX_SEMAPHORES -1 + +/* We support user-defined stack sizes. */ +#define _POSIX_THREAD_ATTR_STACKSIZE 200112L + +/* We support user-defined stacks. */ +#define _POSIX_THREAD_ATTR_STACKADDR 200112L + +/* We do not support priority inheritence. */ +#define _POSIX_THREAD_PRIO_INHERIT -1 + +/* We do not support priority protection. */ +#define _POSIX_THREAD_PRIO_PROTECT -1 + +#ifdef __USE_XOPEN2K8 +/* We do not support priority inheritence for robust mutexes. */ +# define _POSIX_THREAD_ROBUST_PRIO_INHERIT -1 + +/* We do not support priority protection for robust mutexes. */ +# define _POSIX_THREAD_ROBUST_PRIO_PROTECT -1 +#endif + +/* We support POSIX.1b semaphores. */ +#define _POSIX_SEMAPHORES 200112L /* Real-time signals are not yet supported. */ #define _POSIX_REALTIME_SIGNALS -1 /* Asynchronous I/O might supported with the existing ABI. */ #define _POSIX_ASYNCHRONOUS_IO 0 +#undef _POSIX_ASYNC_IO /* Alternative name for Unix98. */ #define _LFS_ASYNCHRONOUS_IO _POSIX_ASYNCHRONOUS_IO +/* Support for prioritization is not available. */ +#undef _POSIX_PRIORITIZED_IO /* The LFS support in asynchronous I/O is also available. */ #define _LFS64_ASYNCHRONOUS_IO _POSIX_ASYNCHRONOUS_IO @@ -102,14 +136,17 @@ /* GNU libc provides regular expression handling. */ #define _POSIX_REGEXP 1 -/* Reader/Writer locks are not available. */ -#define _POSIX_READER_WRITER_LOCKS -1 +/* Reader/Writer locks are available. */ +#define _POSIX_READER_WRITER_LOCKS 200112L /* We have a POSIX shell. */ #define _POSIX_SHELL 1 -/* We cannot support the Timeouts option without _POSIX_THREADS. */ -#define _POSIX_TIMEOUTS -1 +/* We support the Timeouts option. */ +#define _POSIX_TIMEOUTS 200112L + +/* We support spinlocks. */ +#define _POSIX_SPIN_LOCKS 200112L /* The `spawn' function family is supported. */ #define _POSIX_SPAWN 200809L @@ -118,7 +155,7 @@ #define _POSIX_TIMERS 0 /* The barrier functions are not available. */ -#define _POSIX_BARRIERS -1 +#define _POSIX_BARRIERS 200112L /* POSIX message queues could be available in future. */ #define _POSIX_MESSAGE_PASSING 0 @@ -157,9 +194,4 @@ /* Typed memory objects are not available. */ #define _POSIX_TYPED_MEMORY_OBJECTS -1 -/* No support for priority inheritance or protection so far. */ -#define _POSIX_THREAD_PRIO_INHERIT -1 -#define _POSIX_THREAD_PRIO_PROTECT -1 - - #endif /* bits/posix_opt.h */ diff --git a/sysdeps/mach/hurd/bits/sigaction.h b/sysdeps/mach/hurd/bits/sigaction.h new file mode 100644 index 0000000..d3a4220 --- /dev/null +++ b/sysdeps/mach/hurd/bits/sigaction.h @@ -0,0 +1,81 @@ +/* Copyright (C) 1991,92,96,97,98,2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#ifndef _SIGNAL_H +# error "Never include directly; use instead." +#endif + +/* These definitions match those used by the 4.4 BSD kernel. + If the operating system has a `sigaction' system call that correctly + implements the POSIX.1 behavior, there should be a system-dependent + version of this file that defines `struct sigaction' and the `SA_*' + constants appropriately. */ + +/* Structure describing the action to be taken when a signal arrives. */ +struct sigaction + { + /* Signal handler. */ +#ifdef __USE_POSIX199309 + union + { + /* Used if SA_SIGINFO is not set. */ + __sighandler_t sa_handler; + /* Used if SA_SIGINFO is set. */ + void (*sa_sigaction) (int, siginfo_t *, void *); + } + __sigaction_handler; +# define sa_handler __sigaction_handler.sa_handler +# define sa_sigaction __sigaction_handler.sa_sigaction +#else + __sighandler_t sa_handler; +#endif + + /* Additional set of signals to be blocked. */ + __sigset_t sa_mask; + + /* Special flags. */ + int sa_flags; + }; + +/* Bits in `sa_flags'. */ +#if defined __USE_UNIX98 || defined __USE_MISC +# define SA_ONSTACK 0x0001 /* Take signal on signal stack. */ +#endif +#if defined __USE_UNIX98 || defined __USE_MISC || defined __USE_XOPEN2K8 +# define SA_RESTART 0x0002 /* Restart syscall on signal return. */ +# define SA_NODEFER 0x0010 /* Don't automatically block the signal when + its handler is being executed. */ +# define SA_RESETHAND 0x0004 /* Reset to SIG_DFL on entry to handler. */ +# define SA_SIGINFO 0x0040 /* Signal handler with SA_SIGINFO args */ +#endif +#define SA_NOCLDSTOP 0x0008 /* Don't send SIGCHLD when children stop. */ + +#ifdef __USE_MISC +# define SA_INTERRUPT 0 /* Historical no-op ("not SA_RESTART"). */ + +/* Some aliases for the SA_ constants. */ +# define SA_NOMASK SA_NODEFER +# define SA_ONESHOT SA_RESETHAND +# define SA_STACK SA_ONSTACK +#endif + + +/* Values for the HOW argument to `sigprocmask'. */ +#define SIG_BLOCK 1 /* Block signals. */ +#define SIG_UNBLOCK 2 /* Unblock signals. */ +#define SIG_SETMASK 3 /* Set the set of blocked signals. */ diff --git a/sysdeps/mach/hurd/bits/stat.h b/sysdeps/mach/hurd/bits/stat.h index b64a658..8245f39 100644 --- a/sysdeps/mach/hurd/bits/stat.h +++ b/sysdeps/mach/hurd/bits/stat.h @@ -1,5 +1,4 @@ -/* Copyright (C) 1992-1994,1996,1997,1999,2000,2005,2010 - Free Software Foundation, Inc. +/* Copyright (C) 1992-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -59,12 +58,27 @@ struct stat __off64_t st_size; /* Size in bytes. */ #endif - __time_t st_atime; /* Access time, seconds */ - unsigned long int st_atime_usec; /* and microseconds. */ - __time_t st_mtime; /* Modification time, seconds */ - unsigned long int st_mtime_usec; /* and microseconds. */ - __time_t st_ctime; /* Status change time, seconds */ - unsigned long int st_ctime_usec; /* and microseconds. */ +#if defined __USE_MISC || defined __USE_XOPEN2K8 + /* Nanosecond resolution timestamps are stored in a format + equivalent to 'struct timespec'. This is the type used + whenever possible but the Unix namespace rules do not allow the + identifier 'timespec' to appear in the header. + Therefore we have to handle the use of this header in strictly + standard-compliant sources special. */ + struct timespec st_atim; /* Time of last access. */ + struct timespec st_mtim; /* Time of last modification. */ + struct timespec st_ctim; /* Time of last status change. */ +# define st_atime st_atim.tv_sec /* Backward compatibility. */ +# define st_mtime st_mtim.tv_sec +# define st_ctime st_ctim.tv_sec +#else + __time_t st_atime; /* Time of last access. */ + unsigned long int st_atimensec; /* Nscecs of last access. */ + __time_t st_mtime; /* Time of last modification. */ + unsigned long int st_mtimensec; /* Nsecs of last modification. */ + __time_t st_ctime; /* Time of last status change. */ + unsigned long int st_ctimensec; /* Nsecs of last status change. */ +#endif __blksize_t st_blksize; /* Optimal size for I/O. */ @@ -108,12 +122,24 @@ struct stat64 __off64_t st_size; /* Size in bytes. */ - __time_t st_atime; /* Access time, seconds */ - unsigned long int st_atime_usec; /* and microseconds. */ - __time_t st_mtime; /* Modification time, seconds */ - unsigned long int st_mtime_usec; /* and microseconds. */ - __time_t st_ctime; /* Status change time, seconds */ - unsigned long int st_ctime_usec; /* and microseconds. */ +#if defined __USE_MISC || defined __USE_XOPEN2K8 + /* Nanosecond resolution timestamps are stored in a format + equivalent to 'struct timespec'. This is the type used + whenever possible but the Unix namespace rules do not allow the + identifier 'timespec' to appear in the header. + Therefore we have to handle the use of this header in strictly + standard-compliant sources special. */ + struct timespec st_atim; /* Time of last access. */ + struct timespec st_mtim; /* Time of last modification. */ + struct timespec st_ctim; /* Time of last status change. */ +#else + __time_t st_atime; /* Time of last access. */ + unsigned long int st_atimensec; /* Nscecs of last access. */ + __time_t st_mtime; /* Time of last modification. */ + unsigned long int st_mtimensec; /* Nsecs of last modification. */ + __time_t st_ctime; /* Time of last status change. */ + unsigned long int st_ctimensec; /* Nsecs of last status change. */ +#endif __blksize_t st_blksize; /* Optimal size for I/O. */ @@ -131,7 +157,10 @@ struct stat64 }; #endif -#define _STATBUF_ST_BLKSIZE /* Tell code we have this member. */ +/* Tell code we have these members. */ +#define _STATBUF_ST_BLKSIZE +/* Nanosecond resolution time values are supported. */ +#define _STATBUF_ST_NSEC /* Encoding of the file mode. */ @@ -194,9 +223,40 @@ struct stat64 S_IUSEUNK|S_IUNKNOWN|07777)) #endif -/* Default file creation mask (umask). */ #ifdef __USE_BSD + +/* Default file creation mask (umask). */ # define CMASK 0022 + + +/* Definitions of flags stored in file flags word. */ + +/* Super-user and owner changeable flags. */ +# define UF_SETTABLE 0x0000ffff /* mask of owner changeable flags */ +# define UF_NODUMP 0x00000001 /* do not dump file */ +# define UF_IMMUTABLE 0x00000002 /* file may not be changed */ +# define UF_APPEND 0x00000004 /* writes to file may only append */ +# define UF_OPAQUE 0x00000008 /* directory is opaque wrt. union */ +# define UF_NOUNLINK 0x00000010 /* file may not be removed or renamed */ + +/* Super-user changeable flags. */ +# define SF_SETTABLE 0xffff0000 /* mask of superuser changeable flags */ +# define SF_ARCHIVED 0x00010000 /* file is archived */ +# define SF_IMMUTABLE 0x00020000 /* file may not be changed */ +# define SF_APPEND 0x00040000 /* writes to file may only append */ +# define SF_NOUNLINK 0x00100000 /* file may not be removed or renamed */ +# define SF_SNAPSHOT 0x00200000 /* snapshot inode */ + +__BEGIN_DECLS + +/* Set file flags for FILE to FLAGS. */ +extern int chflags (__const char *__file, unsigned long int __flags) __THROW; + +/* Set file flags of the file referred to by FD to FLAGS. */ +extern int fchflags (int __fd, unsigned long int __flags) __THROW; + +__END_DECLS + #endif #endif /* bits/stat.h */ diff --git a/sysdeps/mach/hurd/brk.c b/sysdeps/mach/hurd/brk.c index 931b260..74f74e8 100644 --- a/sysdeps/mach/hurd/brk.c +++ b/sysdeps/mach/hurd/brk.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991,92,93,94,95,96,97,99,2000 Free Software Foundation, Inc. +/* Copyright (C) 1991-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -64,7 +64,7 @@ weak_alias (__brk, brk) int _hurd_set_brk (vm_address_t addr) { - error_t err; + error_t err = 0; vm_address_t pagend = round_page (addr); vm_address_t pagebrk = round_page (_hurd_brk); long int rlimit; @@ -101,8 +101,22 @@ _hurd_set_brk (vm_address_t addr) if (pagend > _hurd_data_end) { + vm_address_t alloc_start = _hurd_data_end; + /* We didn't allocate enough space! Hopefully we can get some more! */ - err = __vm_allocate (__mach_task_self (), &pagebrk, pagend - pagebrk, 0); + + if (_hurd_data_end > pagebrk) + /* First finish allocation. */ + err = __vm_protect (__mach_task_self (), pagebrk, + alloc_start - pagebrk, 0, + VM_PROT_READ|VM_PROT_WRITE|VM_PROT_EXECUTE); + if (! err) + _hurd_brk = alloc_start; + + if (! err) + err = __vm_allocate (__mach_task_self (), &alloc_start, + pagend - alloc_start, 0); + if (! err) _hurd_data_end = pagend; } diff --git a/sysdeps/mach/hurd/check_native.c b/sysdeps/mach/hurd/check_native.c new file mode 100644 index 0000000..8a829aa --- /dev/null +++ b/sysdeps/mach/hurd/check_native.c @@ -0,0 +1,9 @@ +#include + +void +__check_native (uint32_t a1_index, int *a1_native, + uint32_t a2_index, int *a2_native) +{ +#warning __check_native() not yet implemented + return; +} diff --git a/sysdeps/mach/hurd/chflags.c b/sysdeps/mach/hurd/chflags.c index a0b427c..0d42274 100644 --- a/sysdeps/mach/hurd/chflags.c +++ b/sysdeps/mach/hurd/chflags.c @@ -25,7 +25,7 @@ /* XXX shouldn't this be __chflags? */ int -chflags (const char *file, int flags) +chflags (const char *file, unsigned long int flags) { error_t err; file_t port = __file_name_lookup (file, 0, 0); diff --git a/sysdeps/mach/hurd/chroot.c b/sysdeps/mach/hurd/chroot.c index fde0164..0ba765e 100644 --- a/sysdeps/mach/hurd/chroot.c +++ b/sysdeps/mach/hurd/chroot.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991,92,93,94,95,97,99,2001 Free Software Foundation, Inc. +/* Copyright (C) 1991-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -38,6 +38,9 @@ chroot (const char *path) len = strlen (path); if (len >= 2 && path[len - 2] == '/' && path[len - 1] == '.') lookup = path; + else if (len == 0) + /* Special-case empty file name according to POSIX. */ + return __hurd_fail (ENOENT); else { char *n = alloca (len + 3); diff --git a/sysdeps/mach/hurd/configure b/sysdeps/mach/hurd/configure index ebf8bb0..4c2bf11 100755 --- a/sysdeps/mach/hurd/configure +++ b/sysdeps/mach/hurd/configure @@ -87,3 +87,5 @@ if test "x$libc_cv_hurd_version" != xok; then $as_echo "$as_me: error: Hurd headers not installed or too old" >&2;} { (exit 1); exit 1; }; } fi + +use_ldconfig=yes diff --git a/sysdeps/mach/hurd/configure.in b/sysdeps/mach/hurd/configure.in index 87c07c1..c70fb81 100644 --- a/sysdeps/mach/hurd/configure.in +++ b/sysdeps/mach/hurd/configure.in @@ -36,3 +36,5 @@ AC_TRY_COMPILE(dnl if test "x$libc_cv_hurd_version" != xok; then AC_MSG_ERROR(Hurd headers not installed or too old) fi + +use_ldconfig=yes diff --git a/sysdeps/mach/hurd/dirfd.c b/sysdeps/mach/hurd/dirfd.c index fde13fa..6c530fd 100644 --- a/sysdeps/mach/hurd/dirfd.c +++ b/sysdeps/mach/hurd/dirfd.c @@ -1,5 +1,5 @@ /* dirfd -- Return the file descriptor used by a DIR stream. Hurd version. - Copyright (C) 1995, 1996 Free Software Foundation, Inc. + Copyright (C) 1995-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -26,6 +26,8 @@ int dirfd (DIR *dirp) { int fd; + + HURD_CRITICAL_BEGIN; __mutex_lock (&_hurd_dtable_lock); for (fd = 0; fd < _hurd_dtablesize; ++fd) if (_hurd_dtable[fd] == dirp->__fd) @@ -36,6 +38,7 @@ dirfd (DIR *dirp) fd = -1; } __mutex_unlock (&_hurd_dtable_lock); + HURD_CRITICAL_END; return fd; } diff --git a/sysdeps/mach/hurd/dl-sysdep.c b/sysdeps/mach/hurd/dl-sysdep.c index 6f27874..56d1780 100644 --- a/sysdeps/mach/hurd/dl-sysdep.c +++ b/sysdeps/mach/hurd/dl-sysdep.c @@ -1,6 +1,5 @@ /* Operating system support for run-time dynamic linker. Hurd version. - Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2010 - Free Software Foundation, Inc. + Copyright (C) 1995-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -18,6 +17,10 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ +/* In the static library, this is all handled by dl-support.c + or by the vanilla definitions in the rest of the C library. */ +#ifdef SHARED + #include #include #include @@ -59,6 +62,8 @@ void *__libc_stack_end; hp_timing_t _dl_cpuclock_offset; #endif +/* TODO: this is never properly initialized in here. */ +void *_dl_random attribute_relro = NULL; struct hurd_startup_data *_dl_hurd_data; @@ -102,12 +107,26 @@ static void fmh(void) { max=a; break;} fmha=a+=fmhs;} if (err) assert(err==KERN_NO_SPACE); - if (!fmha)fmhs=0;else{ - fmhs=max-fmha; - err = __vm_map (__mach_task_self (), - &fmha, fmhs, 0, 0, MACH_PORT_NULL, 0, 1, - VM_PROT_NONE, VM_PROT_NONE, VM_INHERIT_COPY); - assert_perror(err);} + if (!fmha) + fmhs=0; + else + while (1) { + fmhs=max-fmha; + err = __vm_map (__mach_task_self (), + &fmha, fmhs, 0, 0, MACH_PORT_NULL, 0, 1, + VM_PROT_NONE, VM_PROT_NONE, VM_INHERIT_COPY); + if (!err) + break; + if (err != KERN_INVALID_ADDRESS && err != KERN_NO_SPACE) + assert_perror(err); + vm_address_t new_max = (max - 1) & 0xf0000000U; + if (new_max >= max) { + fmhs = 0; + fmha = 0; + break; + } + max = new_max; + } } /* XXX loser kludge for vm_map kernel bug */ #endif @@ -316,7 +335,7 @@ open_file (const char *file_name, int flags, return MACH_PORT_NULL; } - assert (!(flags & ~O_READ)); + assert (!(flags & ~(O_READ | O_CLOEXEC))); startdir = _dl_hurd_data->portarray[file_name[0] == '/' ? INIT_PORT_CRDIR : INIT_PORT_CWDIR]; @@ -669,3 +688,5 @@ _dl_init_first (int argc, ...) { /* This no-op definition only gets used if libc is not linked in. */ } + +#endif /* SHARED */ diff --git a/sysdeps/mach/hurd/dl-sysdep.h b/sysdeps/mach/hurd/dl-sysdep.h index 4b21b77..d63e03d 100644 --- a/sysdeps/mach/hurd/dl-sysdep.h +++ b/sysdeps/mach/hurd/dl-sysdep.h @@ -1,5 +1,5 @@ /* System-specific settings for dynamic linker code. Hurd version. - Copyright (C) 2002, 2005 Free Software Foundation, Inc. + Copyright (C) 2002-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -25,7 +25,8 @@ #define RTLD_PRIVATE_ERRNO 0 #ifdef SHARED -/* _dl_argv cannot be attribute_relro, because the stack-switching +/* _dl_argv and __libc_stack_end cannot be attribute_relro, because the stack-switching libc initializer for using cthreads might write into it. */ # define DL_ARGV_NOT_RELRO 1 +# define LIBC_STACK_END_NOT_RELRO 1 #endif diff --git a/sysdeps/mach/hurd/dup2.c b/sysdeps/mach/hurd/dup2.c index 3abd30c..77d379d 100644 --- a/sysdeps/mach/hurd/dup2.c +++ b/sysdeps/mach/hurd/dup2.c @@ -1,4 +1,5 @@ -/* Copyright (C) 1991, 92, 93, 94, 95, 97, 2002 Free Software Foundation, Inc. +/* Copyright (C) 1991-2012 Free Software Foundation, Inc. + This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -16,119 +17,20 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -#include -#include #include -#include -#include /* Duplicate FD to FD2, closing the old FD2 and making FD2 be open on the same file as FD is. Return FD2 or -1. */ int -__dup2 (fd, fd2) - int fd; - int fd2; +__dup2 (int fd, int fd2) { - struct hurd_fd *d; - - /* Extract the ports and flags from FD. */ - d = _hurd_fd_get (fd); - if (d == NULL) - { - errno = EBADF; - return -1; - } - - HURD_CRITICAL_BEGIN; - - __spin_lock (&d->port.lock); - if (d->port.port == MACH_PORT_NULL) - { - __spin_unlock (&d->port.lock); - errno = EBADF; - fd2 = -1; - } - else if (fd2 == fd) - /* FD is valid and FD2 is already the same; just return it. */ - __spin_unlock (&d->port.lock); - else - { - struct hurd_userlink ulink, ctty_ulink; - int flags = d->flags; - io_t ctty = _hurd_port_get (&d->ctty, &ctty_ulink); - io_t port = _hurd_port_locked_get (&d->port, &ulink); /* Unlocks D. */ - - if (fd2 < 0) - { - errno = EBADF; - fd2 = -1; - } - else - { - /* Get a hold of the destination descriptor. */ - struct hurd_fd *d2; - - if (fd2 >= _hurd_dtablesize) - { - /* The table is not large enough to hold the destination - descriptor. Enlarge it as necessary to allocate this - descriptor. */ - __mutex_unlock (&_hurd_dtable_lock); - /* We still hold FD1's lock, but this is safe because - _hurd_alloc_fd will only examine the cells starting - at FD2. */ - d2 = _hurd_alloc_fd (NULL, fd2); - if (d2) - __spin_unlock (&d2->port.lock); - __mutex_lock (&_hurd_dtable_lock); - } - else - { - d2 = _hurd_dtable[fd2]; - if (d2 == NULL) - { - /* Must allocate a new one. We don't initialize the port - cells with this call so that if it fails (out of - memory), we will not have already added user - references for the ports, which we would then have to - deallocate. */ - d2 = _hurd_dtable[fd2] = _hurd_new_fd (MACH_PORT_NULL, - MACH_PORT_NULL); - } - } - - if (d2 == NULL) - { - fd2 = -1; - if (errno == EINVAL) - errno = EBADF; /* POSIX.1-1990 6.2.1.2 ll 54-55. */ - } - else - { - /* Give the ports each a user ref for the new descriptor. */ - __mach_port_mod_refs (__mach_task_self (), port, - MACH_PORT_RIGHT_SEND, 1); - if (ctty != MACH_PORT_NULL) - __mach_port_mod_refs (__mach_task_self (), ctty, - MACH_PORT_RIGHT_SEND, 1); - - /* Install the ports and flags in the new descriptor slot. */ - __spin_lock (&d2->port.lock); - d2->flags = flags & ~FD_CLOEXEC; /* Dup clears FD_CLOEXEC. */ - _hurd_port_set (&d2->ctty, ctty); - _hurd_port_locked_set (&d2->port, port); /* Unlocks D2. */ - } - } - __mutex_unlock (&_hurd_dtable_lock); - - _hurd_port_free (&d->port, &ulink, port); - if (ctty != MACH_PORT_NULL) - _hurd_port_free (&d->ctty, &ctty_ulink, port); - } + int flags = 0; - HURD_CRITICAL_END; + if (fd2 == fd) + /* See the comment in dup3. */ + flags = -1; - return fd2; + return __dup3 (fd, fd2, flags); } libc_hidden_def (__dup2) weak_alias (__dup2, dup2) diff --git a/sysdeps/mach/hurd/dup3.c b/sysdeps/mach/hurd/dup3.c new file mode 100644 index 0000000..523ca42 --- /dev/null +++ b/sysdeps/mach/hurd/dup3.c @@ -0,0 +1,140 @@ +/* Duplicate a file descriptor to a given number, with flags. Hurd version. + Copyright (C) 1991-2012 Free Software Foundation, Inc. + + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include +#include +#include +#include +#include + +/* Duplicate FD to FD2, closing the old FD2 and making FD2 be + open on the same file as FD is, and setting FD2's flags according to FLAGS. + Return FD2 or -1. */ +int +__dup3 (int fd, int fd2, int flags) +{ + struct hurd_fd *d; + + /* Both passing flags different from O_CLOEXEC and FD2 being the same as FD + are invalid. */ + if ((flags & ~O_CLOEXEC + || fd2 == fd) + /* ... with the exception in case that dup2 behavior is requested: if FD + is valid and FD2 is already the same then just return it. */ + && ! (flags == -1 + && fd2 == fd)) + return __hurd_fail (EINVAL); + + /* Extract the ports and flags from FD. */ + d = _hurd_fd_get (fd); + if (d == NULL) + return __hurd_fail (EBADF); + + HURD_CRITICAL_BEGIN; + + __spin_lock (&d->port.lock); + if (d->port.port == MACH_PORT_NULL) + { + __spin_unlock (&d->port.lock); + fd2 = __hurd_fail (EBADF); + } + else if (fd2 == fd) + __spin_unlock (&d->port.lock); + else + { + struct hurd_userlink ulink, ctty_ulink; + int d_flags = d->flags; + io_t ctty = _hurd_port_get (&d->ctty, &ctty_ulink); + io_t port = _hurd_port_locked_get (&d->port, &ulink); /* Unlocks D. */ + + if (fd2 < 0) + fd2 = __hurd_fail (EBADF); + else + { + /* Get a hold of the destination descriptor. */ + struct hurd_fd *d2; + + __mutex_lock (&_hurd_dtable_lock); + + if (fd2 >= _hurd_dtablesize) + { + /* The table is not large enough to hold the destination + descriptor. Enlarge it as necessary to allocate this + descriptor. */ + __mutex_unlock (&_hurd_dtable_lock); + d2 = _hurd_alloc_fd (NULL, fd2); + if (d2) + __spin_unlock (&d2->port.lock); + __mutex_lock (&_hurd_dtable_lock); + } + else + { + d2 = _hurd_dtable[fd2]; + if (d2 == NULL) + { + /* Must allocate a new one. We don't initialize the port + cells with this call so that if it fails (out of + memory), we will not have already added user + references for the ports, which we would then have to + deallocate. */ + d2 = _hurd_dtable[fd2] = _hurd_new_fd (MACH_PORT_NULL, + MACH_PORT_NULL); + } + } + __mutex_unlock (&_hurd_dtable_lock); + + if (d2 == NULL) + { + fd2 = -1; + if (errno == EINVAL) + errno = EBADF; /* POSIX.1-1990 6.2.1.2 ll 54-55. */ + } + else + { + /* Give the ports each a user ref for the new descriptor. */ + __mach_port_mod_refs (__mach_task_self (), port, + MACH_PORT_RIGHT_SEND, 1); + if (ctty != MACH_PORT_NULL) + __mach_port_mod_refs (__mach_task_self (), ctty, + MACH_PORT_RIGHT_SEND, 1); + + /* Install the ports and flags in the new descriptor slot. */ + __spin_lock (&d2->port.lock); + if (flags & O_CLOEXEC) + d2->flags = d_flags | FD_CLOEXEC; + else + /* dup clears FD_CLOEXEC. */ + d2->flags = d_flags & ~FD_CLOEXEC; + _hurd_port_set (&d2->ctty, ctty); + _hurd_port_locked_set (&d2->port, port); /* Unlocks D2. */ + } + } + + _hurd_port_free (&d->port, &ulink, port); + if (ctty != MACH_PORT_NULL) + _hurd_port_free (&d->ctty, &ctty_ulink, port); + } + + HURD_CRITICAL_END; + + return fd2; +} +libc_hidden_def (__dup3) +weak_alias (__dup3, dup3) diff --git a/sysdeps/mach/hurd/execve.c b/sysdeps/mach/hurd/execve.c index 8af8b33..ba5f5a9 100644 --- a/sysdeps/mach/hurd/execve.c +++ b/sysdeps/mach/hurd/execve.c @@ -1,4 +1,5 @@ -/* Copyright (C) 1991, 92, 93, 94, 95, 97 Free Software Foundation, Inc. +/* Copyright (C) 1991, 92, 93, 94, 95, 97, 2010 + Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -35,7 +36,8 @@ __execve (file_name, argv, envp) return -1; /* Hopefully this will not return. */ - err = _hurd_exec (__mach_task_self (), file, argv, envp); + err = _hurd_exec_file_name (__mach_task_self (), file, + file_name, argv, envp); /* Oh well. Might as well be tidy. */ __mach_port_deallocate (__mach_task_self (), file); diff --git a/sysdeps/mach/hurd/fchflags.c b/sysdeps/mach/hurd/fchflags.c index 71bcbf0..a83ac13 100644 --- a/sysdeps/mach/hurd/fchflags.c +++ b/sysdeps/mach/hurd/fchflags.c @@ -26,7 +26,7 @@ /* XXX should be __fchflags? */ int -fchflags (int fd, int flags) +fchflags (int fd, unsigned long int flags) { error_t err; diff --git a/sysdeps/mach/hurd/fexecve.c b/sysdeps/mach/hurd/fexecve.c index d6eb7c0..e925d68 100644 --- a/sysdeps/mach/hurd/fexecve.c +++ b/sysdeps/mach/hurd/fexecve.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1993, 1994, 1997 Free Software Foundation, Inc. +/* Copyright (C) 1993, 1994, 1997, 2010 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -26,8 +26,9 @@ int fexecve (int fd, char *const argv[], char *const envp[]) { - error_t err = HURD_DPORT_USE (fd, _hurd_exec (__mach_task_self (), port, - argv, envp)); + error_t err = HURD_DPORT_USE (fd, _hurd_exec_file_name (__mach_task_self (), + port, NULL, + argv, envp)); if (! err) err = EGRATUITOUS; return __hurd_fail (err); diff --git a/sysdeps/mach/hurd/fork.c b/sysdeps/mach/hurd/fork.c index 3288f18..97d520f 100644 --- a/sysdeps/mach/hurd/fork.c +++ b/sysdeps/mach/hurd/fork.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1994,1995,1996,1997,1999,2001,2002,2004,2005,2006 +/* Copyright (C) 1994,1995,1996,1997,1999,2001,2002,2004,2005,2006,2011 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -313,7 +313,7 @@ __fork (void) { /* This is a send right or a dead name. Give the child as many references for it as we have. */ - mach_port_urefs_t refs, *record_refs = NULL; + mach_port_urefs_t refs = 0, *record_refs = NULL; mach_port_t insert; mach_msg_type_name_t insert_type = MACH_MSG_TYPE_COPY_SEND; if (portnames[i] == newtask || portnames[i] == newproc) @@ -455,14 +455,10 @@ __fork (void) (err = __mach_port_insert_right (newtask, ss->thread, thread, MACH_MSG_TYPE_COPY_SEND))) LOSE; - /* We have one extra user reference created at the beginning of this - function, accounted for by mach_port_names (and which will thus be - accounted for in the child below). This extra right gets consumed - in the child by the store into _hurd_sigthread in the child fork. */ if (thread_refs > 1 && (err = __mach_port_mod_refs (newtask, ss->thread, MACH_PORT_RIGHT_SEND, - thread_refs))) + thread_refs - 1))) LOSE; if ((_hurd_msgport_thread != MACH_PORT_NULL) /* Let user have none. */ && ((err = __mach_port_deallocate (newtask, _hurd_msgport_thread)) || @@ -523,6 +519,11 @@ __fork (void) #endif MACHINE_THREAD_STATE_SET_PC (&state, (unsigned long int) _hurd_msgport_receive); + + /* Do special thread setup for TLS if needed. */ + if (err = _hurd_tls_fork (sigthread, _hurd_msgport_thread, &state)) + LOSE; + if (err = __thread_set_state (sigthread, MACHINE_THREAD_STATE_FLAVOR, (natural_t *) &state, statecount)) LOSE; @@ -533,7 +534,7 @@ __fork (void) _hurd_longjmp_thread_state (&state, env, 1); /* Do special thread setup for TLS if needed. */ - if (err = _hurd_tls_fork (thread, &state)) + if (err = _hurd_tls_fork (thread, ss->thread, &state)) LOSE; if (err = __thread_set_state (thread, MACHINE_THREAD_STATE_FLAVOR, @@ -616,10 +617,6 @@ __fork (void) for (i = 0; i < _hurd_nports; ++i) __spin_unlock (&_hurd_ports[i].lock); - /* We are one of the (exactly) two threads in this new task, we - will take the task-global signals. */ - _hurd_sigthread = ss->thread; - /* Claim our sigstate structure and unchain the rest: the threads existed in the parent task but don't exist in this task (the child process). Delay freeing them until later @@ -639,6 +636,25 @@ __fork (void) ss->next = NULL; _hurd_sigstates = ss; __mutex_unlock (&_hurd_siglock); + /* Earlier on, the global sigstate may have been tainted and now needs to + be reinitialized. Nobody is interested in its present state anymore: + we're not, the signal thread will be restarted, and there are no other + threads. + + We can't simply allocate a fresh global sigstate here, as + _hurd_thread_sigstate will call malloc and that will deadlock trying + to determine the current thread's sigstate. */ +#if 0 + _hurd_thread_sigstate_init (_hurd_global_sigstate, MACH_PORT_NULL); +#else + /* Only reinitialize the lock -- otherwise we might have to do additional + setup as done in hurdsig.c:_hurdsig_init. */ + __spin_lock_init (&_hurd_global_sigstate->lock); +#endif + + /* We are one of the (exactly) two threads in this new task, we + will take the task-global signals. */ + _hurd_sigstate_set_global_rcv (ss); /* Fetch our new process IDs from the proc server. No need to refetch our pgrp; it is always inherited from the parent (so @@ -647,8 +663,10 @@ __fork (void) err = __USEPORT (PROC, __proc_getpids (port, &_hurd_pid, &_hurd_ppid, &_hurd_orphaned)); - /* Forking clears the trace flag. */ + /* Forking clears the trace flag and pending masks. */ __sigemptyset (&_hurdsig_traced); + __sigemptyset (&_hurd_global_sigstate->pending); + __sigemptyset (&ss->pending); /* Run things that want to run in the child task to set up. */ RUN_HOOK (_hurd_fork_child_hook, ()); diff --git a/sysdeps/mach/hurd/ftok.c b/sysdeps/mach/hurd/ftok.c new file mode 100644 index 0000000..8d8b5cb --- /dev/null +++ b/sysdeps/mach/hurd/ftok.c @@ -0,0 +1,43 @@ +/* Copyright (C) 1995, 1996, 2000, 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , August 1995. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include +#include + + +/* In the Hurd, we use the second-to-most-significant bit as flag for + private keys. We use a different order of the components so that + the biggest one---the inode number---is affected by this. */ + +key_t +ftok (pathname, proj_id) + const char *pathname; + int proj_id; +{ + struct stat64 st; + key_t key; + + if (__xstat64 (_STAT_VER, pathname, &st) < 0) + return (key_t) -1; + + key = ((st.st_dev & 0xff) | ((proj_id & 0xff) << 8) + | ((st.st_ino & 0x3fff) << 16)); + + return key; +} diff --git a/sysdeps/mach/hurd/gai_misc.h b/sysdeps/mach/hurd/gai_misc.h new file mode 100644 index 0000000..ee8117f --- /dev/null +++ b/sysdeps/mach/hurd/gai_misc.h @@ -0,0 +1,44 @@ +#include +#include + +#define gai_start_notify_thread __gai_start_notify_thread +#define gai_create_helper_thread __gai_create_helper_thread + +extern inline void +__gai_start_notify_thread (void) +{ + sigset_t ss; + sigemptyset (&ss); + sigprocmask(SIG_SETMASK, &ss, NULL); +} + +extern inline int +__gai_create_helper_thread (pthread_t *threadp, void *(*tf) (void *), + void *arg) +{ + pthread_attr_t attr; + + /* Make sure the thread is created detached. */ + pthread_attr_init (&attr); + pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED); + + /* The helper thread needs only very little resources. */ + (void) pthread_attr_setstacksize (&attr, 0x10000); + + /* Block all signals in the helper thread. To do this thoroughly we + temporarily have to block all signals here. */ + sigset_t ss; + sigset_t oss; + sigfillset (&ss); + sigprocmask(SIG_SETMASK, &ss, &oss); + + int ret = pthread_create (threadp, &attr, tf, arg); + + /* Restore the signal mask. */ + sigprocmask(SIG_SETMASK, &oss, NULL); + + (void) pthread_attr_destroy (&attr); + return ret; +} + +#include_next diff --git a/sysdeps/mach/hurd/getgroups.c b/sysdeps/mach/hurd/getgroups.c index 919336e..9dbe95d 100644 --- a/sysdeps/mach/hurd/getgroups.c +++ b/sysdeps/mach/hurd/getgroups.c @@ -31,6 +31,9 @@ __getgroups (n, gidset) int ngids; void *crit; + if (n < 0) + return __hurd_fail (EINVAL); + crit = _hurd_critical_section_lock (); __mutex_lock (&_hurd_id.lock); @@ -54,7 +57,7 @@ __getgroups (n, gidset) /* Now that the lock is released, we can safely copy the group set into the user's array, which might fault. */ if (ngids > n) - ngids = n; + return __hurd_fail (EINVAL); memcpy (gidset, gids, ngids * sizeof (gid_t)); } else diff --git a/sysdeps/mach/hurd/getlogin_r.c b/sysdeps/mach/hurd/getlogin_r.c index f4d5fae..f4dcb15 100644 --- a/sysdeps/mach/hurd/getlogin_r.c +++ b/sysdeps/mach/hurd/getlogin_r.c @@ -30,13 +30,21 @@ getlogin_r (name, name_len) char *name; size_t name_len; { - static char login[1024]; /* XXX */ + string_t login; error_t err; + size_t len; if (err = __USEPORT (PROC, __proc_getlogin (port, login))) return errno = err; - strncpy (name, login, name_len); + len = __strnlen (login, sizeof login - 1) + 1; + if (len > name_len) + { + errno = ERANGE; + return errno; + } + + memcpy (name, login, len); return 0; } libc_hidden_def (getlogin_r) diff --git a/sysdeps/mach/hurd/hp-timing.h b/sysdeps/mach/hurd/hp-timing.h new file mode 100644 index 0000000..933fb83 --- /dev/null +++ b/sysdeps/mach/hurd/hp-timing.h @@ -0,0 +1,41 @@ +/* High precision, low overhead timing functions. Generic version. + Copyright (C) 1998, 2000 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 1998. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#ifndef _HP_TIMING_H +#define _HP_TIMING_H 1 + +/* We don't have support for high precision timing for now. */ + +/* Provide dummy definitions. */ +#define HP_TIMING_AVAIL (0) +#define HP_TIMING_INLINE (0) +typedef int hp_timing_t; +#define HP_TIMING_ZERO(Var) +#define HP_TIMING_NOW(var) +#define HP_TIMING_DIFF_INIT() +#define HP_TIMING_DIFF(Diff, Start, End) +#define HP_TIMING_ACCUM(Sum, Diff) +#define HP_TIMING_ACCUM_NT(Sum, Diff) +#define HP_TIMING_PRINT(Buf, Len, Val) + +/* Since this implementation is not available we tell the user about it. */ +#define HP_TIMING_NONAVAIL 1 + +#endif /* hp-timing.h */ diff --git a/sysdeps/mach/hurd/i386/Makefile b/sysdeps/mach/hurd/i386/Makefile index 0eef17e..5f98809 100644 --- a/sysdeps/mach/hurd/i386/Makefile +++ b/sysdeps/mach/hurd/i386/Makefile @@ -2,3 +2,7 @@ ifeq ($(subdir),misc) sysdep_routines += ioperm sysdep_headers += sys/io.h endif + +ifeq ($(subdir),debug) +gen-as-const-headers += signal-defines.sym +endif diff --git a/sysdeps/mach/hurd/i386/____longjmp_chk.S b/sysdeps/mach/hurd/i386/____longjmp_chk.S new file mode 100644 index 0000000..f499fbd --- /dev/null +++ b/sysdeps/mach/hurd/i386/____longjmp_chk.S @@ -0,0 +1,107 @@ +/* Copyright (C) 2001-2012 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include +#include + +#include +/* #include */ +#define SS_ONSTACK 1 + + + .section .rodata.str1.1,"aMS",@progbits,1 + .type longjmp_msg,@object +longjmp_msg: + .string "longjmp causes uninitialized stack frame" + .size longjmp_msg, .-longjmp_msg + + +#ifdef PIC +# define CALL_FAIL movl %ebx, %ecx; /* TODO: what's this mov good for? */ \ + cfi_register(%ebx,%ecx); \ + LOAD_PIC_REG (bx); \ + leal longjmp_msg@GOTOFF(%ebx), %eax; \ + call HIDDEN_JUMPTARGET(__fortify_fail) +#else +# define CALL_FAIL movl $longjmp_msg, %eax; \ + call HIDDEN_JUMPTARGET(__fortify_fail) +#endif + + + .text +ENTRY (____longjmp_chk) + movl 4(%esp), %ecx /* User's jmp_buf in %ecx. */ + + /* Save the return address now. */ + movl (JB_PC*4)(%ecx), %edx + /* Get the stack pointer. */ + movl (JB_SP*4)(%ecx), %edi + cfi_undefined(%edi) + PTR_DEMANGLE (%edx) + PTR_DEMANGLE (%edi) + + cmpl %edi, %esp + /* Jumping to a higher-address frame is always allowed. */ + jbe .Lok + + /* Passing here, we're either about to do something invalid, or we're + executing on an alternative signal stack. */ + + /* TODO: need locking? */ + /* struct hurd_sigstate * _hurd_self_sigstate (void) */ + call _hurd_self_sigstate + /* TODO: %eax and %eax->sigaltstack are always valid? */ + + testl $SS_ONSTACK, (HURD_SIGSTATE__SIGALTSTACK__OFFSET + SIGALTSTACK__SS_FLAGS__OFFSET)(%eax) + /* Fail if SS_ONSTACK is not set. */ + jz .Lfail + + movl (HURD_SIGSTATE__SIGALTSTACK__OFFSET + SIGALTSTACK__SS_SP__OFFSET)(%eax), %ebx + addl (HURD_SIGSTATE__SIGALTSTACK__OFFSET + SIGALTSTACK__SS_SIZE__OFFSET)(%eax), %ebx + subl %edi, %ebx + cmpl (HURD_SIGSTATE__SIGALTSTACK__OFFSET + SIGALTSTACK__SS_SIZE__OFFSET)(%eax), %ebx + /* TODO: comment this calculation. */ + jae .Lok + +.Lfail: CALL_FAIL + +.Lok: /* We add unwind information for the target here. */ + cfi_def_cfa(%ecx, 0) + cfi_register(%eip, %edx) + cfi_register(%esp, %edi) + cfi_offset(%ebx, JB_BX*4) + cfi_offset(%esi, JB_SI*4) + cfi_offset(%edi, JB_DI*4) + cfi_offset(%ebp, JB_BP*4) + + movl 8(%esp), %eax /* Second argument is return value. */ + movl %edi, %esp + + /* Restore registers. */ + movl (JB_BX*4)(%ecx), %ebx + movl (JB_SI*4)(%ecx), %esi + movl (JB_DI*4)(%ecx), %edi + movl (JB_BP*4)(%ecx), %ebp + cfi_restore(%ebx) + cfi_restore(%esi) + cfi_restore(%edi) + cfi_restore(%ebp) + + /* Jump to saved PC. */ + jmp *%edx +END (____longjmp_chk) diff --git a/sysdeps/mach/hurd/i386/bits/sigcontext.h b/sysdeps/mach/hurd/i386/bits/sigcontext.h index a78dd2f..1956d41 100644 --- a/sysdeps/mach/hurd/i386/bits/sigcontext.h +++ b/sysdeps/mach/hurd/i386/bits/sigcontext.h @@ -96,6 +96,10 @@ struct sigcontext #define sc_ps sc_efl +/* The deprecated sigcode values below are passed as an extra, non-portable + argument to regular signal handlers. You should use SA_SIGINFO handlers + instead, which use the standard POSIX signal codes. */ + /* Codes for SIGFPE. */ #define FPE_INTOVF_TRAP 0x1 /* integer overflow */ #define FPE_INTDIV_FAULT 0x2 /* integer divide by zero */ diff --git a/sysdeps/mach/hurd/i386/exc2signal.c b/sysdeps/mach/hurd/i386/exc2signal.c index a6bf750..7ffeb5f 100644 --- a/sysdeps/mach/hurd/i386/exc2signal.c +++ b/sysdeps/mach/hurd/i386/exc2signal.c @@ -24,8 +24,8 @@ /* Translate the Mach exception codes, as received in an `exception_raise' RPC, into a signal number and signal subcode. */ -void -_hurd_exception2signal (struct hurd_signal_detail *detail, int *signo) +static void +exception2signal (struct hurd_signal_detail *detail, int *signo, int posix) { detail->error = 0; @@ -37,44 +37,62 @@ _hurd_exception2signal (struct hurd_signal_detail *detail, int *signo) break; case EXC_BAD_ACCESS: - if (detail->exc_code == KERN_INVALID_ADDRESS - || detail->exc_code == KERN_PROTECTION_FAILURE - || detail->exc_code == KERN_WRITE_PROTECTION_FAILURE) - *signo = SIGSEGV; - else - *signo = SIGBUS; - detail->code = detail->exc_subcode; + switch (detail->exc_code) + { + case KERN_INVALID_ADDRESS: + case KERN_MEMORY_FAILURE: + *signo = SIGSEGV; + detail->code = posix ? SEGV_MAPERR : detail->exc_subcode; + break; + + case KERN_PROTECTION_FAILURE: + case KERN_WRITE_PROTECTION_FAILURE: + *signo = SIGSEGV; + detail->code = posix ? SEGV_ACCERR : detail->exc_subcode; + break; + + default: + *signo = SIGBUS; + detail->code = 0; + break; + } detail->error = detail->exc_code; break; case EXC_BAD_INSTRUCTION: *signo = SIGILL; - if (detail->exc_code == EXC_I386_INVOP) - detail->code = ILL_INVOPR_FAULT; - else if (detail->exc_code == EXC_I386_STKFLT) - detail->code = ILL_STACK_FAULT; - else - detail->code = 0; + switch (detail->exc_code) + { + case EXC_I386_INVOP: + detail->code = posix ? ILL_ILLOPC : ILL_INVOPR_FAULT; + break; + + case EXC_I386_STKFLT: + detail->code = posix ? ILL_BADSTK : ILL_STACK_FAULT; + break; + + default: + detail->code = 0; + break; + } break; case EXC_ARITHMETIC: + *signo = SIGFPE; switch (detail->exc_code) { case EXC_I386_DIV: /* integer divide by zero */ - *signo = SIGFPE; - detail->code = FPE_INTDIV_FAULT; + detail->code = posix ? FPE_INTDIV : FPE_INTDIV_FAULT; break; case EXC_I386_INTO: /* integer overflow */ - *signo = SIGFPE; - detail->code = FPE_INTOVF_TRAP; + detail->code = posix ? FPE_INTOVF : FPE_INTOVF_TRAP; break; /* These aren't anywhere documented or used in Mach 3.0. */ case EXC_I386_NOEXT: case EXC_I386_EXTOVR: default: - *signo = SIGFPE; detail->code = 0; break; @@ -83,51 +101,43 @@ _hurd_exception2signal (struct hurd_signal_detail *detail, int *signo) Give an error code corresponding to the first bit set. */ if (detail->exc_subcode & FPS_IE) { - *signo = SIGILL; - detail->code = ILL_FPEOPR_FAULT; + /* NB: We used to send SIGILL here but we can't distinguish + POSIX vs. legacy with respect to what signal we send. */ + detail->code = posix ? FPE_FLTINV : 0 /*ILL_FPEOPR_FAULT*/; } else if (detail->exc_subcode & FPS_DE) { - *signo = SIGFPE; - detail->code = FPE_FLTDNR_FAULT; + detail->code = posix ? FPE_FLTUND : FPE_FLTDNR_FAULT; } else if (detail->exc_subcode & FPS_ZE) { - *signo = SIGFPE; - detail->code = FPE_FLTDIV_FAULT; + detail->code = posix ? FPE_FLTDIV : FPE_FLTDIV_FAULT; } else if (detail->exc_subcode & FPS_OE) { - *signo = SIGFPE; - detail->code = FPE_FLTOVF_FAULT; + detail->code = posix ? FPE_FLTOVF : FPE_FLTOVF_FAULT; } else if (detail->exc_subcode & FPS_UE) { - *signo = SIGFPE; - detail->code = FPE_FLTUND_FAULT; + detail->code = posix ? FPE_FLTUND : FPE_FLTUND_FAULT; } else if (detail->exc_subcode & FPS_PE) { - *signo = SIGFPE; - detail->code = FPE_FLTINX_FAULT; + detail->code = posix ? FPE_FLTRES : FPE_FLTINX_FAULT; } else { - *signo = SIGFPE; detail->code = 0; } break; /* These two can only be arithmetic exceptions if we - are in V86 mode, which sounds like emulation to me. - (See Mach 3.0 i386/trap.c.) */ + are in V86 mode. (See Mach 3.0 i386/trap.c.) */ case EXC_I386_EMERR: - *signo = SIGFPE; - detail->code = FPE_EMERR_FAULT; + detail->code = posix ? 0 : FPE_EMERR_FAULT; break; case EXC_I386_BOUND: - *signo = SIGFPE; - detail->code = FPE_EMBND_FAULT; + detail->code = posix ? FPE_FLTSUB : FPE_EMBND_FAULT; break; } break; @@ -144,7 +154,7 @@ _hurd_exception2signal (struct hurd_signal_detail *detail, int *signo) if (detail->exc_code == EXC_I386_BOUND) { *signo = SIGFPE; - detail->code = FPE_SUBRNG_FAULT; + detail->code = posix ? FPE_FLTSUB : FPE_SUBRNG_FAULT; } else { @@ -155,12 +165,33 @@ _hurd_exception2signal (struct hurd_signal_detail *detail, int *signo) case EXC_BREAKPOINT: *signo = SIGTRAP; - if (detail->exc_code == EXC_I386_SGL) - detail->code = DBG_SINGLE_TRAP; - else if (detail->exc_code == EXC_I386_BPT) - detail->code = DBG_BRKPNT_FAULT; - else - detail->code = 0; + switch (detail->exc_code) + { + case EXC_I386_SGL: + detail->code = posix ? TRAP_BRKPT : DBG_SINGLE_TRAP; + break; + + case EXC_I386_BPT: + detail->code = posix ? TRAP_BRKPT : DBG_BRKPNT_FAULT; + break; + + default: + detail->code = 0; + break; + } break; } } + +void +_hurd_exception2signal (struct hurd_signal_detail *detail, int *signo) +{ + exception2signal (detail, signo, 1); +} + +void +_hurd_exception2signal_legacy (struct hurd_signal_detail *detail, int *signo) +{ + exception2signal (detail, signo, 0); +} + diff --git a/sysdeps/mach/hurd/i386/init-first.c b/sysdeps/mach/hurd/i386/init-first.c index 60823bd..21a7165 100644 --- a/sysdeps/mach/hurd/i386/init-first.c +++ b/sysdeps/mach/hurd/i386/init-first.c @@ -37,9 +37,6 @@ extern void __init_misc (int, char **, char **); #ifdef USE_NONOPTION_FLAGS extern void __getopt_clean_environment (char **); #endif -#ifndef SHARED -extern void _dl_non_dynamic_init (void) internal_function; -#endif extern void __libc_global_ctors (void); unsigned int __hurd_threadvar_max; @@ -104,10 +101,6 @@ init1 (int argc, char *arg0, ...) char **argv = &arg0; char **envp = &argv[argc + 1]; struct hurd_startup_data *d; -#ifndef SHARED - extern ElfW(Phdr) *_dl_phdr; - extern size_t _dl_phnum; -#endif while (*envp) ++envp; @@ -118,27 +111,9 @@ init1 (int argc, char *arg0, ...) data block; the argument strings start there. */ if ((void *) d == argv[0]) { -#ifndef SHARED - /* We may need to see our own phdrs, e.g. for TLS setup. - Try the usual kludge to find the headers without help from - the exec server. */ - extern const void _start; - const ElfW(Ehdr) *const ehdr = &_start; - _dl_phdr = (ElfW(Phdr) *) ((const void *) ehdr + ehdr->e_phoff); - _dl_phnum = ehdr->e_phnum; - assert (ehdr->e_phentsize == sizeof (ElfW(Phdr))); -#endif return; } -#ifndef SHARED - __libc_enable_secure = d->flags & EXEC_SECURE; - - _dl_phdr = (ElfW(Phdr) *) d->phdr; - _dl_phnum = d->phdrsz / sizeof (ElfW(Phdr)); - assert (d->phdrsz % sizeof (ElfW(Phdr)) == 0); -#endif - _hurd_init_dtable = d->dtable; _hurd_init_dtablesize = d->dtablesize; @@ -172,13 +147,16 @@ init (int *data) char **envp = &argv[argc + 1]; struct hurd_startup_data *d; unsigned long int threadvars[_HURD_THREADVAR_MAX]; +#ifndef SHARED + extern ElfW(Phdr) *_dl_phdr; + extern size_t _dl_phnum; +#endif /* Provide temporary storage for thread-specific variables on the startup stack so the cthreads initialization code can use them for malloc et al, or so we can use malloc below for the real threadvars array. */ memset (threadvars, 0, sizeof threadvars); - threadvars[_HURD_THREADVAR_LOCALE] = (unsigned long int) &_nl_global_locale; __hurd_threadvar_stack_offset = (unsigned long int) threadvars; /* Since the cthreads initialization code uses malloc, and the @@ -192,6 +170,39 @@ init (int *data) ++envp; d = (void *) ++envp; + /* If we are the bootstrap task started by the kernel, + then after the environment pointers there is no Hurd + data block; the argument strings start there. */ + if ((void *) d == argv[0]) + { +#ifndef SHARED + /* We may need to see our own phdrs, e.g. for TLS setup. + Try the usual kludge to find the headers without help from + the exec server. */ + extern const void __executable_start; + const ElfW(Ehdr) *const ehdr = &__executable_start; + _dl_phdr = (ElfW(Phdr) *) ((const void *) ehdr + ehdr->e_phoff); + _dl_phnum = ehdr->e_phnum; + assert (ehdr->e_phentsize == sizeof (ElfW(Phdr))); +#endif + } + else + { +#ifndef SHARED + __libc_enable_secure = d->flags & EXEC_SECURE; + + _dl_phdr = (ElfW(Phdr) *) d->phdr; + _dl_phnum = d->phdrsz / sizeof (ElfW(Phdr)); + assert (d->phdrsz % sizeof (ElfW(Phdr)) == 0); +#endif + } + +#ifndef SHARED + /* We need to setup TLS before starting sigthread */ + extern void __pthread_initialize_minimal(void); + __pthread_initialize_minimal(); +#endif + /* The user might have defined a value for this, to get more variables. Otherwise it will be zero on startup. We must make sure it is set properly before before cthreads initialization, so cthreads can know @@ -212,6 +223,8 @@ init (int *data) void switch_stacks (void); + __libc_stack_end = newsp; + /* Copy per-thread variables from that temporary area onto the new cthread stack. */ memcpy (__hurd_threadvar_location_from_sp (0, newsp), @@ -242,8 +255,8 @@ init (int *data) /* Push the user code address on the top of the new stack. It will be the return address for `init1'; we will jump there with NEWSP as the stack pointer. */ - *--newsp = data[-1]; - ((void **) data)[-1] = switch_stacks; + *--newsp = __builtin_return_address (0); + * ((void **) __builtin_frame_address (0) + 1) = &switch_stacks; /* Force NEWSP into %ecx and &init1 into %eax, which are not restored by function return. */ asm volatile ("# a %0 c %1" : : "a" (newsp), "c" (&init1)); @@ -320,11 +333,11 @@ first_init (void) stack set up just as the user will see it, so it can switch stacks. */ void -_dl_init_first (void) +_dl_init_first (int argc, ...) { first_init (); - init ((int *) __builtin_frame_address (0) + 2); + init (&argc); } #endif @@ -351,23 +364,23 @@ strong_alias (posixland_init, __libc_init_first); This poorly-named function is called by static-start.S, which should not exist at all. */ void -_hurd_stack_setup (void) +_hurd_stack_setup (void *arg, ...) { - intptr_t caller = (intptr_t) __builtin_return_address (0); + void *caller = (&arg)[-1]; void doinit (intptr_t *data) { /* This function gets called with the argument data at TOS. */ - void doinit1 (void) + void doinit1 (volatile int argc, ...) { - init ((int *) __builtin_frame_address (0) + 2); + init ((int *) &argc); } /* Push the user return address after the argument data, and then jump to `doinit1' (above), so it is as if __libc_init_first's caller had called `doinit1' with the argument data already on the stack. */ - *--data = caller; + *--data = (intptr_t) caller; asm volatile ("movl %0, %%esp\n" /* Switch to new outermost stack. */ "movl $0, %%ebp\n" /* Clear outermost frame pointer. */ "jmp *%1" : : "r" (data), "r" (&doinit1) : "sp"); @@ -376,7 +389,7 @@ _hurd_stack_setup (void) first_init (); - _hurd_startup ((void **) __builtin_frame_address (0) + 2, &doinit); + _hurd_startup (&arg, &doinit); } #endif diff --git a/sysdeps/mach/hurd/i386/signal-defines.sym b/sysdeps/mach/hurd/i386/signal-defines.sym new file mode 100644 index 0000000..9521bd7 --- /dev/null +++ b/sysdeps/mach/hurd/i386/signal-defines.sym @@ -0,0 +1,10 @@ +#include +#include + +-- + +HURD_SIGSTATE__SIGALTSTACK__OFFSET offsetof(struct hurd_sigstate, sigaltstack) + +SIGALTSTACK__SS_SP__OFFSET offsetof(struct sigaltstack, ss_sp) +SIGALTSTACK__SS_SIZE__OFFSET offsetof(struct sigaltstack, ss_size) +SIGALTSTACK__SS_FLAGS__OFFSET offsetof(struct sigaltstack, ss_flags) diff --git a/sysdeps/mach/hurd/i386/sigreturn.c b/sysdeps/mach/hurd/i386/sigreturn.c index 60b0d00..8cb92ef 100644 --- a/sysdeps/mach/hurd/i386/sigreturn.c +++ b/sysdeps/mach/hurd/i386/sigreturn.c @@ -1,4 +1,5 @@ -/* Copyright (C) 1991,92,94,95,96,97,98,2001 Free Software Foundation, Inc. +/* Copyright (C) 1991,92,94,95,96,97,98,2001,2011 + Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -39,7 +40,7 @@ __sigreturn (struct sigcontext *scp) } ss = _hurd_self_sigstate (); - __spin_lock (&ss->lock); + _hurd_sigstate_lock (ss); /* Remove the link on the `active resources' chain added by _hurd_setup_sighandler. Its purpose was to make sure @@ -51,19 +52,19 @@ __sigreturn (struct sigcontext *scp) ss->intr_port = scp->sc_intr_port; /* Check for pending signals that were blocked by the old set. */ - if (ss->pending & ~ss->blocked) + if (_hurd_sigstate_pending (ss) & ~ss->blocked) { /* There are pending signals that just became unblocked. Wake up the signal thread to deliver them. But first, squirrel away SCP where the signal thread will notice it if it runs another handler, and arrange to have us called over again in the new reality. */ ss->context = scp; - __spin_unlock (&ss->lock); + _hurd_sigstate_unlock (ss); __msg_sig_post (_hurd_msgport, 0, 0, __mach_task_self ()); /* If a pending signal was handled, sig_post never returned. If it did return, the pending signal didn't run a handler; proceed as usual. */ - __spin_lock (&ss->lock); + _hurd_sigstate_lock (ss); ss->context = NULL; } @@ -74,7 +75,7 @@ __sigreturn (struct sigcontext *scp) abort (); } else - __spin_unlock (&ss->lock); + _hurd_sigstate_unlock (ss); /* Destroy the MiG reply port used by the signal handler, and restore the reply port in use by the thread when interrupted. */ diff --git a/sysdeps/mach/hurd/i386/tls.h b/sysdeps/mach/hurd/i386/tls.h index d98b485..ea59ad1 100644 --- a/sysdeps/mach/hurd/i386/tls.h +++ b/sysdeps/mach/hurd/i386/tls.h @@ -72,7 +72,7 @@ _hurd_tls_init (tcbhead_t *tcb, int secondcall) /* Get the first available selector. */ int sel = -1; - error_t err = __i386_set_gdt (tcb->self, &sel, desc); + kern_return_t err = __i386_set_gdt (tcb->self, &sel, desc); if (err == MIG_BAD_ID) { /* Old kernel, use a per-thread LDT. */ @@ -96,16 +96,16 @@ _hurd_tls_init (tcbhead_t *tcb, int secondcall) /* Fetch the selector set by the first call. */ int sel; asm ("mov %%gs, %w0" : "=q" (sel) : "0" (0)); - if (__builtin_expect (sel, 0x50) & 4) /* LDT selector */ + if (__builtin_expect (sel, 0x48) & 4) /* LDT selector */ { - error_t err = __i386_set_ldt (tcb->self, sel, &desc, 1); + kern_return_t err = __i386_set_ldt (tcb->self, sel, &desc, 1); assert_perror (err); if (err) return "i386_set_ldt failed"; } else { - error_t err = __i386_set_gdt (tcb->self, &sel, desc); + kern_return_t err = __i386_set_gdt (tcb->self, &sel, desc); assert_perror (err); if (err) return "i386_set_gdt failed"; @@ -142,9 +142,40 @@ _hurd_tls_init (tcbhead_t *tcb, int secondcall) #include -/* Set up TLS in the new thread of a fork child, copying from our own. */ -static inline error_t __attribute__ ((unused)) -_hurd_tls_fork (thread_t child, struct i386_thread_state *state) +/* Set up TLS in the new thread of a fork child, copying from the original. */ +static inline kern_return_t __attribute__ ((unused)) +_hurd_tls_fork (thread_t child, thread_t orig, struct i386_thread_state *state) +{ + /* Fetch the selector set by _hurd_tls_init. */ + int sel; + asm ("mov %%gs, %w0" : "=q" (sel) : "0" (0)); + if (sel == state->ds) /* _hurd_tls_init was never called. */ + return 0; + + struct descriptor desc, *_desc = &desc; + int err; + unsigned int count; + + if (__builtin_expect (sel, 0x48) & 4) /* LDT selector */ + err = __i386_get_ldt (orig, sel, 1, &_desc, &count); + else + err = __i386_get_gdt (orig, sel, &desc); + + assert_perror (err); + if (err) + return err; + + if (__builtin_expect (sel, 0x48) & 4) /* LDT selector */ + err = __i386_set_ldt (child, sel, &desc, 1); + else + err = __i386_set_gdt (child, &sel, desc); + + state->gs = sel; + return err; +} + +static inline kern_return_t __attribute__ ((unused)) +_hurd_tls_new (thread_t child, struct i386_thread_state *state, tcbhead_t *tcb) { /* Fetch the selector set by _hurd_tls_init. */ int sel; @@ -152,11 +183,13 @@ _hurd_tls_fork (thread_t child, struct i386_thread_state *state) if (sel == state->ds) /* _hurd_tls_init was never called. */ return 0; - tcbhead_t *const tcb = THREAD_SELF; HURD_TLS_DESC_DECL (desc, tcb); - error_t err; + kern_return_t err; + + tcb->tcb = tcb; + tcb->self = child; - if (__builtin_expect (sel, 0x50) & 4) /* LDT selector */ + if (__builtin_expect (sel, 0x48) & 4) /* LDT selector */ err = __i386_set_ldt (child, sel, &desc, 1); else err = __i386_set_gdt (child, &sel, desc); diff --git a/sysdeps/mach/hurd/i386/tlsdesc.sym b/sysdeps/mach/hurd/i386/tlsdesc.sym new file mode 100644 index 0000000..a358f7e --- /dev/null +++ b/sysdeps/mach/hurd/i386/tlsdesc.sym @@ -0,0 +1,19 @@ +#include +#include +#include +#include +#include + +-- + +-- We have to override sysdeps/i386/tlsdesc.sym to adapt to our libpthread. + +-- Abuse tls.h macros to derive offsets relative to the thread register. + +DTV_OFFSET offsetof(tcbhead_t, dtv) + +TLSDESC_ARG offsetof(struct tlsdesc, arg) + +TLSDESC_GEN_COUNT offsetof(struct tlsdesc_dynamic_arg, gen_count) +TLSDESC_MODID offsetof(struct tlsdesc_dynamic_arg, tlsinfo.ti_module) +TLSDESC_MODOFF offsetof(struct tlsdesc_dynamic_arg, tlsinfo.ti_offset) diff --git a/sysdeps/mach/hurd/i386/trampoline.c b/sysdeps/mach/hurd/i386/trampoline.c index 99d9308..63fe717 100644 --- a/sysdeps/mach/hurd/i386/trampoline.c +++ b/sysdeps/mach/hurd/i386/trampoline.c @@ -1,5 +1,5 @@ /* Set thread_state for sighandler, and sigcontext to recover. i386 version. - Copyright (C) 1994,1995,1996,1997,1998,1999,2005,2008 + Copyright (C) 1994,1995,1996,1997,1998,1999,2005,2008,2011 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -21,13 +21,66 @@ #include #include #include +#include #include #include #include #include "hurdfault.h" #include +#include +/* Fill in a siginfo_t structure for SA_SIGINFO-enabled handlers. */ +static void fill_siginfo (siginfo_t *si, int signo, + const struct hurd_signal_detail *detail, + const struct machine_thread_all_state *state) +{ + si->si_signo = signo; + si->si_errno = detail->error; + si->si_code = detail->code; + + /* XXX We would need a protocol change for sig_post to include + * this information. */ + si->si_pid = -1; + si->si_uid = -1; + + /* Address of the faulting instruction or memory access. */ + if (detail->exc == EXC_BAD_ACCESS) + si->si_addr = (void *) detail->exc_subcode; + else + si->si_addr = (void *) state->basic.eip; + + /* XXX On SIGCHLD, this should be the exit status of the child + * process. We would need a protocol change for the proc server + * to send this information along with the signal. */ + si->si_status = 0; + + si->si_band = 0; /* SIGPOLL is not supported yet. */ + si->si_value.sival_int = 0; /* sigqueue() is not supported yet. */ +} + +/* Fill in a ucontext_t structure SA_SIGINFO-enabled handlers. */ +static void fill_ucontext (ucontext_t *uc, const struct sigcontext *sc) +{ + uc->uc_flags = 0; + uc->uc_link = NULL; + uc->uc_sigmask = sc->sc_mask; + uc->uc_stack.ss_sp = (__ptr_t) sc->sc_esp; + uc->uc_stack.ss_size = 0; + uc->uc_stack.ss_flags = 0; + + /* Registers. */ + memcpy (&uc->uc_mcontext.gregs[REG_GS], &sc->sc_gs, + (REG_TRAPNO - REG_GS) * sizeof (int)); + uc->uc_mcontext.gregs[REG_TRAPNO] = 0; + uc->uc_mcontext.gregs[REG_ERR] = 0; + memcpy (&uc->uc_mcontext.gregs[REG_EIP], &sc->sc_eip, + (NGREG - REG_EIP) * sizeof (int)); + + /* XXX FPU state. */ + memset (&uc->uc_mcontext.fpregs, 0, sizeof (fpregset_t)); +} + struct sigcontext * _hurd_setup_sighandler (struct hurd_sigstate *ss, __sighandler_t handler, int signo, struct hurd_signal_detail *detail, @@ -40,18 +93,37 @@ _hurd_setup_sighandler (struct hurd_sigstate *ss, __sighandler_t handler, extern const void _hurd_intr_rpc_msg_in_trap; extern const void _hurd_intr_rpc_msg_cx_sp; extern const void _hurd_intr_rpc_msg_sp_restored; + struct sigaction *action; void *volatile sigsp; struct sigcontext *scp; struct { int signo; - long int sigcode; - struct sigcontext *scp; /* Points to ctx, below. */ + union + { + /* Extra arguments for traditional signal handlers */ + struct + { + long int sigcode; + struct sigcontext *scp; /* Points to ctx, below. */ + } legacy; + + /* Extra arguments for SA_SIGINFO handlers */ + struct + { + siginfo_t *siginfop; /* Points to siginfo, below. */ + ucontext_t *uctxp; /* Points to uctx, below. */ + } posix; + }; void *sigreturn_addr; void *sigreturn_returns_here; struct sigcontext *return_scp; /* Same; arg to sigreturn. */ + + /* NB: sigreturn assumes link is next to ctx. */ struct sigcontext ctx; struct hurd_userlink link; + ucontext_t ucontext; + siginfo_t siginfo; } *stackframe; if (ss->context) @@ -65,7 +137,7 @@ _hurd_setup_sighandler (struct hurd_sigstate *ss, __sighandler_t handler, sizeof (state->basic)); memcpy (&state->fpu, &ss->context->sc_i386_float_state, sizeof (state->fpu)); - state->set |= (1 << i386_THREAD_STATE) | (1 << i386_FLOAT_STATE); + state->set |= (1 << i386_REGS_SEGS_STATE) | (1 << i386_FLOAT_STATE); } } @@ -77,7 +149,11 @@ _hurd_setup_sighandler (struct hurd_sigstate *ss, __sighandler_t handler, interrupted RPC frame. */ state->basic.esp = state->basic.uesp; - if ((ss->actions[signo].sa_flags & SA_ONSTACK) && + /* XXX what if handler != action->handler (for instance, if a signal + * preemptor took over) ? */ + action = & _hurd_sigstate_actions (ss) [signo]; + + if ((action->sa_flags & SA_ONSTACK) && !(ss->sigaltstack.ss_flags & (SS_DISABLE|SS_ONSTACK))) { sigsp = ss->sigaltstack.ss_sp + ss->sigaltstack.ss_size; @@ -139,15 +215,9 @@ _hurd_setup_sighandler (struct hurd_sigstate *ss, __sighandler_t handler, = &stackframe->link.thread.next; ss->active_resources = &stackframe->link; - /* Set up the arguments for the signal handler. */ - stackframe->signo = signo; - stackframe->sigcode = detail->code; - stackframe->scp = stackframe->return_scp = scp = &stackframe->ctx; - stackframe->sigreturn_addr = &__sigreturn; - stackframe->sigreturn_returns_here = firewall; /* Crash on return. */ - /* Set up the sigcontext from the current state of the thread. */ + scp = &stackframe->ctx; scp->sc_onstack = ss->sigaltstack.ss_flags & SS_ONSTACK ? 1 : 0; /* struct sigcontext is laid out so that starting at sc_gs mimics a @@ -161,6 +231,35 @@ _hurd_setup_sighandler (struct hurd_sigstate *ss, __sighandler_t handler, &state->fpu, &scp->sc_i386_float_state, sizeof (state->fpu)); + /* Set up the arguments for the signal handler. */ + stackframe->signo = signo; + if (action->sa_flags & SA_SIGINFO) + { + stackframe->posix.siginfop = &stackframe->siginfo; + stackframe->posix.uctxp = &stackframe->ucontext; + fill_siginfo (&stackframe->siginfo, signo, detail, state); + fill_ucontext (&stackframe->ucontext, scp); + } + else + { + if (detail->exc) + { + int nsigno; + _hurd_exception2signal_legacy (detail, &nsigno); + assert (nsigno == signo); + } + else + detail->code = 0; + + stackframe->legacy.sigcode = detail->code; + stackframe->legacy.scp = &stackframe->ctx; + } + + /* Set up the bottom of the stack. */ + stackframe->sigreturn_addr = &__sigreturn; + stackframe->sigreturn_returns_here = firewall; /* Crash on return. */ + stackframe->return_scp = &stackframe->ctx; + _hurdsig_end_catch_fault (); if (! ok) diff --git a/sysdeps/mach/hurd/ifreq.h b/sysdeps/mach/hurd/ifreq.h new file mode 100644 index 0000000..92cb7b9 --- /dev/null +++ b/sysdeps/mach/hurd/ifreq.h @@ -0,0 +1,45 @@ +/* Copyright (C) 1999, 2002, 2003, 2011 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Andreas Jaeger . + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include +#include +#include +#include +#include +#include +#include + +static inline struct ifreq * +__if_nextreq (struct ifreq *ifr) +{ +#ifdef _HAVE_SA_LEN + if (ifr->ifr_addr.sa_len > sizeof ifr->ifr_addr) + return (struct ifreq *) ((char *) &ifr->ifr_addr + ifr->ifr_addr.sa_len); +#endif + return ifr + 1; +} + +extern void __ifreq (struct ifreq **ifreqs, int *num_ifs, int sockfd); + + +static inline void +__if_freereq (struct ifreq *ifreqs, int num_ifs) +{ + munmap (ifreqs, num_ifs * sizeof (struct ifreq)); +} diff --git a/sysdeps/mach/hurd/ioctl.c b/sysdeps/mach/hurd/ioctl.c index bcc78bc..829b5cd 100644 --- a/sysdeps/mach/hurd/ioctl.c +++ b/sysdeps/mach/hurd/ioctl.c @@ -1,5 +1,4 @@ -/* Copyright (C) 1992,93,94,95,96,97,99,2000,2002,2005 - Free Software Foundation, Inc. +/* Copyright (C) 1992-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -89,7 +88,7 @@ __ioctl (int fd, unsigned long int request, ...) void *p; #endif - void *arg; + void *arg = NULL; error_t err; @@ -112,7 +111,7 @@ __ioctl (int fd, unsigned long int request, ...) if (_IOC_INOUT (request) & IOC_IN) { /* We don't want to advance ARG since it will be used to copy out - too if IOC_OUT is also set. */ + too if IOC_OUT is also set. */ void *argptr = arg; /* Pack an argument into the message buffer. */ @@ -140,7 +139,7 @@ __ioctl (int fd, unsigned long int request, ...) in (_IOT_COUNT1 (type), _IOT_TYPE1 (type)); in (_IOT_COUNT2 (type), _IOT_TYPE2 (type)); } - else if (_IOC_INOUT (request) == IOC_VOID) + else if (_IOC_INOUT (request) == IOC_VOID && _IOT_COUNT0 (type) != 0) { /* The RPC takes a single integer_t argument. Rather than pointing to the value, ARG is the value itself. */ @@ -209,11 +208,15 @@ __ioctl (int fd, unsigned long int request, ...) return msg.header.RetCode; } - va_list ap; + if (_IOT_COUNT0 (type) != 0) + { + /* Data need either be sent, received, or even both. */ + va_list ap; - va_start (ap, request); - arg = va_arg (ap, void *); - va_end (ap); + va_start (ap, request); + arg = va_arg (ap, void *); + va_end (ap); + } { /* Check for a registered handler for REQUEST. */ diff --git a/sysdeps/mach/hurd/kernel-features.h b/sysdeps/mach/hurd/kernel-features.h index ad159aa..5a376c0 100644 --- a/sysdeps/mach/hurd/kernel-features.h +++ b/sysdeps/mach/hurd/kernel-features.h @@ -21,11 +21,5 @@ Almost none of these are used outside of sysdeps/unix/sysv/linux code. But those referring to POSIX-level features like O_* flags can be. */ -#include - -/* If a system defines the O_CLOEXEC constant but it is sometimes ignored, - it must override this file to define __ASSUME_O_CLOEXEC conditionally - (or not at all) to indicate when O_CLOEXEC actually works. */ -#ifdef O_CLOEXEC -# define __ASSUME_O_CLOEXEC 1 -#endif +#define __ASSUME_O_CLOEXEC 1 +#define __ASSUME_DUP3 1 diff --git a/sysdeps/mach/hurd/kill.c b/sysdeps/mach/hurd/kill.c index a9946e0..ac7ffc7 100644 --- a/sysdeps/mach/hurd/kill.c +++ b/sysdeps/mach/hurd/kill.c @@ -65,7 +65,7 @@ __kill (pid_t pid, int sig) { if (msgport != MACH_PORT_NULL) /* Send a signal message to his message port. */ - return __msg_sig_post (msgport, sig, 0, refport); + return __msg_sig_post (msgport, sig, SI_USER, refport); /* The process has no message port. Perhaps try direct frobnication of the task. */ diff --git a/sysdeps/mach/hurd/ldsodefs.h b/sysdeps/mach/hurd/ldsodefs.h new file mode 100644 index 0000000..1f6d64f --- /dev/null +++ b/sysdeps/mach/hurd/ldsodefs.h @@ -0,0 +1,52 @@ +/* Run-time dynamic linker data structures for loaded ELF shared objects. + Copyright (C) 2001, 2002, 2003, 2006, 2009, 2010, 2011 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#ifndef _LDSODEFS_H + +#include + +/* Get the real definitions. */ +#include_next + +/* Now define our stuff. */ + +/* Initialization which is normally done by the dynamic linker. */ +extern void _dl_non_dynamic_init (void) internal_function; + +/* Accept binaries which identify the binary as using Linux extensions. */ +#define VALID_ELF_HEADER(hdr,exp,size) (memcmp (hdr, exp, size) == 0 \ + || memcmp (hdr, expected2, size) == 0) +#define VALID_ELF_OSABI(osabi) (osabi == ELFOSABI_SYSV \ + || osabi == ELFOSABI_GNU) +#define VALID_ELF_ABIVERSION(osabi,ver) \ + (ver == 0 || (osabi == ELFOSABI_GNU && ver < LIBC_ABI_MAX)) +#define MORE_ELF_HEADER_DATA \ + static const unsigned char expected2[EI_PAD] = \ + { \ + [EI_MAG0] = ELFMAG0, \ + [EI_MAG1] = ELFMAG1, \ + [EI_MAG2] = ELFMAG2, \ + [EI_MAG3] = ELFMAG3, \ + [EI_CLASS] = ELFW(CLASS), \ + [EI_DATA] = byteorder, \ + [EI_VERSION] = EV_CURRENT, \ + [EI_OSABI] = ELFOSABI_GNU \ + } + +#endif /* ldsodefs.h */ diff --git a/sysdeps/mach/hurd/mkdir.c b/sysdeps/mach/hurd/mkdir.c index b7e8074..d35276f 100644 --- a/sysdeps/mach/hurd/mkdir.c +++ b/sysdeps/mach/hurd/mkdir.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991,93,94,95,96,97,2002 Free Software Foundation, Inc. +/* Copyright (C) 1991-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -20,6 +20,7 @@ #include #include #include +#include /* Create a directory named FILE_NAME with protections MODE. */ int @@ -29,7 +30,10 @@ __mkdir (file_name, mode) { error_t err; const char *name; - file_t parent = __directory_name_split (file_name, (char **) &name); + file_t parent; + if (!strcmp (file_name, "/")) + return __hurd_fail (EEXIST); + parent = __directory_name_split (file_name, (char **) &name); if (parent == MACH_PORT_NULL) return -1; err = __dir_mkdir (parent, name, mode & ~_hurd_umask); diff --git a/sysdeps/mach/hurd/mkdirat.c b/sysdeps/mach/hurd/mkdirat.c index a300745..13eb2e3 100644 --- a/sysdeps/mach/hurd/mkdirat.c +++ b/sysdeps/mach/hurd/mkdirat.c @@ -1,6 +1,5 @@ /* Create a directory named relative to another open directory. Hurd version. - Copyright (C) 1991,1993,1994,1995,1996,1997,2002,2006 - Free Software Foundation, Inc. + Copyright (C) 1991-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -23,6 +22,7 @@ #include #include #include +#include int mkdirat (fd, path, mode) @@ -32,7 +32,10 @@ mkdirat (fd, path, mode) { error_t err; const char *name; - file_t parent = __directory_name_split_at (fd, path, (char **) &name); + file_t parent; + if (!strcmp (path, "/")) + return __hurd_fail (EEXIST); + parent = __directory_name_split_at (fd, path, (char **) &name); if (parent == MACH_PORT_NULL) return -1; err = __dir_mkdir (parent, name, mode & ~_hurd_umask); diff --git a/sysdeps/mach/hurd/mlock.c b/sysdeps/mach/hurd/mlock.c index bb96c9c..66ba512 100644 --- a/sysdeps/mach/hurd/mlock.c +++ b/sysdeps/mach/hurd/mlock.c @@ -1,5 +1,5 @@ /* mlock -- guarantee pages are resident in memory. Mach/Hurd version. - Copyright (C) 2001 Free Software Foundation, Inc. + Copyright (C) 2001-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -40,7 +40,7 @@ mlock (const void *addr, size_t len) page = trunc_page ((vm_address_t) addr); len = round_page ((vm_address_t) addr + len) - page; err = __vm_wire (hostpriv, __mach_task_self (), page, len, - VM_PROT_ALL); /* XXX ? */ + VM_PROT_READ); __mach_port_deallocate (__mach_task_self (), hostpriv); return err ? __hurd_fail (err) : 0; diff --git a/sysdeps/mach/hurd/mmap.c b/sysdeps/mach/hurd/mmap.c index 1d1460c..79e66d9 100644 --- a/sysdeps/mach/hurd/mmap.c +++ b/sysdeps/mach/hurd/mmap.c @@ -51,15 +51,20 @@ __mmap (__ptr_t addr, size_t len, int prot, int flags, int fd, off_t offset) { /* vm_allocate has (a little) less overhead in the kernel too. */ err = __vm_allocate (__mach_task_self (), &mapaddr, len, - !(flags & MAP_FIXED)); + !mapaddr); - if (err == KERN_NO_SPACE && (flags & MAP_FIXED)) + if (err == KERN_NO_SPACE) { - /* XXX this is not atomic as it is in unix! */ - /* The region is already allocated; deallocate it first. */ - err = __vm_deallocate (__mach_task_self (), mapaddr, len); - if (!err) - err = __vm_allocate (__mach_task_self (), &mapaddr, len, 0); + if (flags & MAP_FIXED) + { + /* XXX this is not atomic as it is in unix! */ + /* The region is already allocated; deallocate it first. */ + err = __vm_deallocate (__mach_task_self (), mapaddr, len); + if (!err) + err = __vm_allocate (__mach_task_self (), &mapaddr, len, 0); + } + else if (mapaddr) + err = __vm_allocate (__mach_task_self (), &mapaddr, len, 1); } return err ? (__ptr_t) (long int) __hurd_fail (err) : (__ptr_t) mapaddr; @@ -135,21 +140,32 @@ __mmap (__ptr_t addr, size_t len, int prot, int flags, int fd, off_t offset) err = __vm_map (__mach_task_self (), &mapaddr, (vm_size_t) len, (vm_address_t) 0, - ! (flags & MAP_FIXED), + !mapaddr, memobj, (vm_offset_t) offset, ! (flags & MAP_SHARED), vmprot, VM_PROT_ALL, (flags & MAP_SHARED) ? VM_INHERIT_SHARE : VM_INHERIT_COPY); - if (err == KERN_NO_SPACE && (flags & MAP_FIXED)) + if (err == KERN_NO_SPACE) { - /* XXX this is not atomic as it is in unix! */ - /* The region is already allocated; deallocate it first. */ - err = __vm_deallocate (__mach_task_self (), mapaddr, len); - if (! err) + if (flags & MAP_FIXED) + { + /* XXX this is not atomic as it is in unix! */ + /* The region is already allocated; deallocate it first. */ + err = __vm_deallocate (__mach_task_self (), mapaddr, len); + if (! err) + err = __vm_map (__mach_task_self (), + &mapaddr, (vm_size_t) len, (vm_address_t) 0, + 0, memobj, (vm_offset_t) offset, + ! (flags & MAP_SHARED), + vmprot, VM_PROT_ALL, + (flags & MAP_SHARED) ? VM_INHERIT_SHARE + : VM_INHERIT_COPY); + } + else if (mapaddr) err = __vm_map (__mach_task_self (), &mapaddr, (vm_size_t) len, (vm_address_t) 0, - 0, memobj, (vm_offset_t) offset, + 1, memobj, (vm_offset_t) offset, ! (flags & MAP_SHARED), vmprot, VM_PROT_ALL, (flags & MAP_SHARED) ? VM_INHERIT_SHARE diff --git a/sysdeps/mach/hurd/opendir.c b/sysdeps/mach/hurd/opendir.c index 23e04ed..ddee9f6 100644 --- a/sysdeps/mach/hurd/opendir.c +++ b/sysdeps/mach/hurd/opendir.c @@ -1,5 +1,4 @@ -/* Copyright (C) 1993,1994,1995,1996,1997,1998,2001,2003,2005,2006 - Free Software Foundation, Inc. +/* Copyright (C) 1993-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -51,9 +50,11 @@ _hurd_fd_opendir (struct hurd_fd *d) return NULL; /* Set the descriptor to close on exec. */ + HURD_CRITICAL_BEGIN; __spin_lock (&d->port.lock); d->flags |= FD_CLOEXEC; __spin_unlock (&d->port.lock); + HURD_CRITICAL_END; dirp->__fd = d; dirp->__data = dirp->__ptr = NULL; diff --git a/sysdeps/mach/hurd/powerpc/init-first.c b/sysdeps/mach/hurd/powerpc/init-first.c index 21b5054..2047cac 100644 --- a/sysdeps/mach/hurd/powerpc/init-first.c +++ b/sysdeps/mach/hurd/powerpc/init-first.c @@ -32,9 +32,6 @@ extern void __init_misc (int, char **, char **); #ifdef USE_NONOPTION_FLAGS extern void __getopt_clean_environment (char **); #endif -#ifndef SHARED -extern void _dl_non_dynamic_init (void) internal_function; -#endif extern void __libc_global_ctors (void); unsigned int __hurd_threadvar_max; diff --git a/sysdeps/mach/hurd/profil.c b/sysdeps/mach/hurd/profil.c index 0426f67..fa5c016 100644 --- a/sysdeps/mach/hurd/profil.c +++ b/sysdeps/mach/hurd/profil.c @@ -69,6 +69,8 @@ update_waiter (u_short *sample_buffer, size_t size, size_t offset, u_int scale) if (! err) err = __mach_setup_thread (__mach_task_self (), profile_thread, &profile_waiter, NULL, NULL); + if (! err) + err = __mach_setup_tls(profile_thread); } else err = 0; diff --git a/sysdeps/mach/hurd/ptsname.c b/sysdeps/mach/hurd/ptsname.c index b68cd9c..e4cc4e6 100644 --- a/sysdeps/mach/hurd/ptsname.c +++ b/sysdeps/mach/hurd/ptsname.c @@ -19,6 +19,7 @@ #include #include +#include #include #include #include @@ -34,32 +35,41 @@ ptsname (int fd) error_t err; err = __ptsname_r (fd, peername, sizeof (peername)); - if (err) - __set_errno (err); return err ? NULL : peername; } -/* Store at most BUFLEN characters of the pathname of the slave pseudo - terminal associated with the master FD is open on in BUF. - Return 0 on success, otherwise an error number. */ +/* We can't make use of STP, but do it that way for conformity with the Linux + version... */ int -__ptsname_r (int fd, char *buf, size_t buflen) +__ptsname_internal (int fd, char *buf, size_t buflen, struct stat64 *stp) { - char peername[1024]; /* XXX */ + string_t peername; size_t len; error_t err; - peername[0] = '\0'; if (err = HURD_DPORT_USE (fd, __term_get_peername (port, peername))) - return _hurd_fd_error (fd, err); + return __hurd_dfail (fd, err), errno; - len = strlen (peername) + 1; + len = __strnlen (peername, sizeof peername - 1) + 1; if (len > buflen) - return ERANGE; + { + errno = ERANGE; + return ERANGE; + } memcpy (buf, peername, len); return 0; } + + +/* Store at most BUFLEN characters of the pathname of the slave pseudo + terminal associated with the master FD is open on in BUF. + Return 0 on success, otherwise an error number. */ +int +__ptsname_r (int fd, char *buf, size_t buflen) +{ + return __ptsname_internal (fd, buf, buflen, NULL); +} weak_alias (__ptsname_r, ptsname_r) diff --git a/sysdeps/mach/hurd/readlinkat.c b/sysdeps/mach/hurd/readlinkat.c new file mode 100644 index 0000000..b70f9c8 --- /dev/null +++ b/sysdeps/mach/hurd/readlinkat.c @@ -0,0 +1,64 @@ +/* Copyright (C) 1991-2012 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include +#include +#include +#include +#include +#include + +/* Read the contents of the symbolic link FILE_NAME relative to FD into no more + than LEN bytes of BUF. The contents are not null-terminated. + Returns the number of characters read, or -1 for errors. */ +ssize_t +readlinkat (fd, file_name, buf, len) + int fd; + const char *file_name; + char *buf; + size_t len; +{ + error_t err; + file_t file; + struct stat64 st; + + file = __file_name_lookup_at (fd, 0, file_name, O_READ | O_NOLINK, 0); + if (file == MACH_PORT_NULL) + return -1; + + err = __io_stat (file, &st); + if (! err) + if (S_ISLNK (st.st_mode)) + { + char *rbuf = buf; + + err = __io_read (file, &rbuf, &len, 0, len); + if (!err && rbuf != buf) + { + memcpy (buf, rbuf, len); + __vm_deallocate (__mach_task_self (), (vm_address_t)rbuf, len); + } + } + else + err = EINVAL; + + __mach_port_deallocate (__mach_task_self (), file); + + return err ? __hurd_fail (err) : len; +} +libc_hidden_def (readlinkat) diff --git a/sysdeps/mach/hurd/recvfrom.c b/sysdeps/mach/hurd/recvfrom.c index 2aca570..5d0c767 100644 --- a/sysdeps/mach/hurd/recvfrom.c +++ b/sysdeps/mach/hurd/recvfrom.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1994, 1997, 1999, 2001, 2002 Free Software Foundation, Inc. +/* Copyright (C) 1994-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -55,7 +55,7 @@ __recvfrom (fd, buf, n, flags, addrarg, addr_len) return __hurd_sockfail (fd, flags, err); /* Get address data for the returned address port if requested. */ - if (addr != NULL) + if (addr != NULL && addrport != MACH_PORT_NULL) { char *buf = (char *) addr; mach_msg_type_number_t buflen = *addr_len; @@ -89,6 +89,8 @@ __recvfrom (fd, buf, n, flags, addrarg, addr_len) if (buflen > 0) addr->sa_family = type; } + else if (addr_len != NULL) + *addr_len = 0; __mach_port_deallocate (__mach_task_self (), addrport); diff --git a/sysdeps/mach/hurd/recvmsg.c b/sysdeps/mach/hurd/recvmsg.c index 33897b8..ee7d8bb 100644 --- a/sysdeps/mach/hurd/recvmsg.c +++ b/sysdeps/mach/hurd/recvmsg.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2001, 2002 Free Software Foundation, Inc. +/* Copyright (C) 2001, 2002, 2010 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -33,13 +33,33 @@ __libc_recvmsg (int fd, struct msghdr *message, int flags) addr_port_t aport; char *data = NULL; mach_msg_type_number_t len = 0; - mach_port_t *ports; + mach_port_t *ports, *newports; mach_msg_type_number_t nports = 0; + struct cmsghdr *cmsg; char *cdata = NULL; mach_msg_type_number_t clen = 0; size_t amount; char *buf; - int i; + int nfds, *fds; + int i, j; + + error_t reauthenticate (mach_port_t port, mach_port_t *result) + { + error_t err; + mach_port_t ref; + ref = __mach_reply_port (); + do + err = __io_reauthenticate (port, ref, MACH_MSG_TYPE_MAKE_SEND); + while (err == EINTR); + if (!err) + do + err = __USEPORT (AUTH, __auth_user_authenticate (port, + ref, MACH_MSG_TYPE_MAKE_SEND, + result)); + while (err == EINTR); + __mach_port_destroy (__mach_task_self (), ref); + return err; + } /* Find the total number of bytes to be read. */ amount = 0; @@ -136,6 +156,85 @@ __libc_recvmsg (int fd, struct msghdr *message, int flags) message->msg_controllen = clen; memcpy (message->msg_control, cdata, message->msg_controllen); + /* SCM_RIGHTS ports. */ + if (nports > 0) + { + newports = __alloca (nports * sizeof (mach_port_t)); + + /* Reauthenticate all ports here. */ + for (i = 0; i < nports; i++) + { + err = reauthenticate (ports[i], &newports[i]); + __mach_port_deallocate (__mach_task_self (), ports[i]); + if (err) + { + for (j = 0; j < i; j++) + __mach_port_deallocate (__mach_task_self (), newports[j]); + for (j = i+1; j < nports; j++) + __mach_port_deallocate (__mach_task_self (), ports[j]); + + __vm_deallocate (__mach_task_self (), (vm_address_t) cdata, clen); + __hurd_fail (err); + } + } + + j = 0; + for (cmsg = CMSG_FIRSTHDR (message); + cmsg; + cmsg = CMSG_NXTHDR (message, cmsg)) + { + if (cmsg->cmsg_level == SOL_SOCKET && cmsg->cmsg_type == SCM_RIGHTS) + { + fds = (int *) CMSG_DATA (cmsg); + nfds = (cmsg->cmsg_len - CMSG_ALIGN (sizeof (struct cmsghdr))) + / sizeof (int); + + for (i = 0; i < nfds && j < nports; i++) + { + /* The fd's flags are passed in the control data. */ + fds[i] = _hurd_intern_fd (newports[j++], fds[i], 0); + if (fds[i] == -1) + { + err = errno; + goto cleanup; + } + } + } + } + + if (j != nports) + err = EGRATUITOUS; + + if (err) + cleanup: + { + /* Clean up all the file descriptors. */ + nports = j; + j = 0; + for (cmsg = CMSG_FIRSTHDR (message); + cmsg; + cmsg = CMSG_NXTHDR (message, cmsg)) + { + if (cmsg->cmsg_level == SOL_SOCKET + && cmsg->cmsg_type == SCM_RIGHTS) + { + fds = (int *) CMSG_DATA (cmsg); + nfds = (cmsg->cmsg_len + - CMSG_ALIGN (sizeof (struct cmsghdr))) + / sizeof (int); + for (i = 0; i < nfds && j < nports; i++, j++) + _hurd_fd_close (_hurd_fd_get (fds[i])); + } + } + + for (; j < nports; j++) + __mach_port_deallocate (__mach_task_self (), newports[j]); + + __vm_deallocate (__mach_task_self (), (vm_address_t) cdata, clen); + __hurd_fail (err); + } + } + __vm_deallocate (__mach_task_self (), (vm_address_t) cdata, clen); return (buf - data); diff --git a/sysdeps/mach/hurd/sendmsg.c b/sysdeps/mach/hurd/sendmsg.c index 118fd59..fb8dd2d 100644 --- a/sysdeps/mach/hurd/sendmsg.c +++ b/sysdeps/mach/hurd/sendmsg.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2001,2002,2004 Free Software Foundation, Inc. +/* Copyright (C) 2001,2002,2004,2010 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -32,6 +32,10 @@ ssize_t __libc_sendmsg (int fd, const struct msghdr *message, int flags) { error_t err = 0; + struct cmsghdr *cmsg; + mach_port_t *ports = NULL; + mach_msg_type_number_t nports = 0; + int *fds, nfds; struct sockaddr_un *addr = message->msg_name; socklen_t addr_len = message->msg_namelen; addr_port_t aport = MACH_PORT_NULL; @@ -44,6 +48,7 @@ __libc_sendmsg (int fd, const struct msghdr *message, int flags) mach_msg_type_number_t len; mach_msg_type_number_t amount; int dealloc = 0; + int socketrpc = 0; int i; /* Find the total number of bytes to be written. */ @@ -101,6 +106,46 @@ __libc_sendmsg (int fd, const struct msghdr *message, int flags) } } + /* SCM_RIGHTS support: get the number of fds to send. */ + cmsg = CMSG_FIRSTHDR (message); + for (; cmsg; cmsg = CMSG_NXTHDR (message, cmsg)) + if (cmsg->cmsg_level == SOL_SOCKET && cmsg->cmsg_type == SCM_RIGHTS) + nports += (cmsg->cmsg_len - CMSG_ALIGN (sizeof (struct cmsghdr))) + / sizeof (int); + + if (nports) + ports = __alloca (nports * sizeof (mach_port_t)); + + nports = 0; + for (cmsg = CMSG_FIRSTHDR (message); + cmsg; + cmsg = CMSG_NXTHDR (message, cmsg)) + { + if (cmsg->cmsg_level == SOL_SOCKET && cmsg->cmsg_type == SCM_RIGHTS) + { + fds = (int *) CMSG_DATA (cmsg); + nfds = (cmsg->cmsg_len - CMSG_ALIGN (sizeof (struct cmsghdr))) + / sizeof (int); + + for (i = 0; i < nfds; i++) + { + err = HURD_DPORT_USE + (fds[i], + ({ + err = __io_restrict_auth (port, &ports[nports], + 0, 0, 0, 0); + if (! err) + nports++; + /* We pass the flags in the control data. */ + fds[i] = descriptor->flags; + })); + + if (err) + goto out; + } + } + } + if (addr) { if (addr->sun_family == AF_LOCAL) @@ -110,9 +155,8 @@ __libc_sendmsg (int fd, const struct msghdr *message, int flags) file_t file = __file_name_lookup (addr->sun_path, 0, 0); if (file == MACH_PORT_NULL) { - if (dealloc) - __vm_deallocate (__mach_task_self (), data.addr, len); - return -1; + err = errno; + goto out; } err = __ifsock_getsockaddr (file, &aport); __mach_port_deallocate (__mach_task_self (), file); @@ -120,11 +164,7 @@ __libc_sendmsg (int fd, const struct msghdr *message, int flags) /* The file did not grok the ifsock protocol. */ err = ENOTSOCK; if (err) - { - if (dealloc) - __vm_deallocate (__mach_task_self (), data.addr, len); - return __hurd_fail (err); - } + goto out; } else err = EIEIO; @@ -143,8 +183,9 @@ __libc_sendmsg (int fd, const struct msghdr *message, int flags) /* Send the data. */ err = __socket_send (port, aport, flags, data.ptr, len, - NULL, - MACH_MSG_TYPE_COPY_SEND, 0, + ports, + MACH_MSG_TYPE_COPY_SEND, + nports, message->msg_control, message->msg_controllen, &amount); @@ -153,11 +194,19 @@ __libc_sendmsg (int fd, const struct msghdr *message, int flags) } err; })); + socketrpc = 1; + + out: + for (i = 0; i < nports; i++) + __mach_port_deallocate (__mach_task_self (), ports[i]); if (dealloc) __vm_deallocate (__mach_task_self (), data.addr, len); - return err ? __hurd_sockfail (fd, flags, err) : amount; + if (socketrpc) + return err ? __hurd_sockfail (fd, flags, err) : amount; + else + return __hurd_fail (err); } weak_alias (__libc_sendmsg, sendmsg) diff --git a/sysdeps/mach/hurd/sendto.c b/sysdeps/mach/hurd/sendto.c index 478a5c9..8aafc30 100644 --- a/sysdeps/mach/hurd/sendto.c +++ b/sysdeps/mach/hurd/sendto.c @@ -34,11 +34,11 @@ __sendto (int fd, const struct sockaddr_un *addr, socklen_t addr_len) { - addr_port_t aport; - error_t err; + addr_port_t aport = MACH_PORT_NULL; + error_t err = 0; size_t wrote; - if (addr->sun_family == AF_LOCAL) + if (addr != NULL && addr->sun_family == AF_LOCAL) { /* For the local domain, we must look up the name as a file and talk to it with the ifsock protocol. */ @@ -53,13 +53,11 @@ __sendto (int fd, if (err) return __hurd_fail (err); } - else - err = EIEIO; /* Get an address port for the desired destination address. */ err = HURD_DPORT_USE (fd, ({ - if (err) + if (aport == MACH_PORT_NULL && addr != NULL) err = __socket_create_address (port, addr->sun_family, (char *) addr, diff --git a/sysdeps/mach/hurd/setitimer.c b/sysdeps/mach/hurd/setitimer.c index fec64a8..2511f96 100644 --- a/sysdeps/mach/hurd/setitimer.c +++ b/sysdeps/mach/hurd/setitimer.c @@ -1,5 +1,4 @@ -/* Copyright (C) 1994,1995,1996,1997,2000,2001,2005 - Free Software Foundation, Inc. +/* Copyright (C) 1994-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -105,7 +104,7 @@ timer_thread (void) __msg_sig_post_request (_hurd_msgport, _hurd_itimer_port, MACH_MSG_TYPE_MAKE_SEND_ONCE, - SIGALRM, 0, __mach_task_self ()); + SIGALRM, SI_TIMER, __mach_task_self ()); break; case MACH_RCV_INTERRUPTED: @@ -194,7 +193,7 @@ setitimer_locked (const struct itimerval *new, struct itimerval *old, run `restart_itimer' each time a SIGALRM would arrive. */ static struct hurd_signal_preemptor preemptor = { - __sigmask (SIGALRM), 0, 0, + __sigmask (SIGALRM), SI_TIMER, SI_TIMER, &restart_itimer, }; __mutex_lock (&_hurd_siglock); @@ -202,6 +201,7 @@ setitimer_locked (const struct itimerval *new, struct itimerval *old, { preemptor.next = _hurdsig_preemptors; _hurdsig_preemptors = &preemptor; + _hurdsig_preempted_set |= preemptor.signals; } __mutex_unlock (&_hurd_siglock); @@ -220,14 +220,15 @@ setitimer_locked (const struct itimerval *new, struct itimerval *old, /* Start up the itimer thread running `timer_thread' (below). */ if (err = __thread_create (__mach_task_self (), &_hurd_itimer_thread)) - return __hurd_fail (err); + goto out; _hurd_itimer_thread_stack_base = 0; /* Anywhere. */ _hurd_itimer_thread_stack_size = __vm_page_size; /* Small stack. */ - if (err = __mach_setup_thread (__mach_task_self (), + if ((err = __mach_setup_thread (__mach_task_self (), _hurd_itimer_thread, &timer_thread, &_hurd_itimer_thread_stack_base, &_hurd_itimer_thread_stack_size)) + || (err = __mach_setup_tls(_hurd_itimer_thread))) { __thread_terminate (_hurd_itimer_thread); _hurd_itimer_thread = MACH_PORT_NULL; diff --git a/sysdeps/mach/hurd/setresgid.c b/sysdeps/mach/hurd/setresgid.c index 8fcf26e..29d2b5a 100644 --- a/sysdeps/mach/hurd/setresgid.c +++ b/sysdeps/mach/hurd/setresgid.c @@ -1,5 +1,5 @@ /* setresgid -- set real group ID, effective group ID, and saved-set group ID - Copyright (C) 2002, 2005, 2006 Free Software Foundation, Inc. + Copyright (C) 2002-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -29,7 +29,6 @@ __setresgid (gid_t rgid, gid_t egid, gid_t sgid) { auth_t newauth; error_t err; - gid_t agids[2] = { rgid, sgid }; HURD_CRITICAL_BEGIN; __mutex_lock (&_hurd_id.lock); @@ -38,31 +37,78 @@ __setresgid (gid_t rgid, gid_t egid, gid_t sgid) if (!err) { /* Make a new auth handle which has EGID as the first element in the - list of effective gids. */ + list of effective gids. */ - if (_hurd_id.gen.ngids > 0) + uid_t *newgen, *newaux; + uid_t auxs[2] = { rgid, sgid }; + size_t ngen, naux; + + newgen = _hurd_id.gen.gids; + ngen = _hurd_id.gen.ngids; + if (egid != -1) + { + if (_hurd_id.gen.ngids == 0) + { + /* No effective gids now. The new set will be just UID. */ + newgen = &egid; + ngen = 1; + } + else + { + _hurd_id.gen.gids[0] = egid; + _hurd_id.valid = 0; + } + } + + newaux = _hurd_id.aux.gids; + naux = _hurd_id.aux.ngids; + if (rgid != -1) { - _hurd_id.gen.gids[0] = egid; - _hurd_id.valid = 0; + if (_hurd_id.aux.ngids == 0) + { + newaux = &rgid; + naux = 1; + } + else + { + _hurd_id.aux.gids[0] = rgid; + _hurd_id.valid = 0; + } } - if (_hurd_id.aux.ngids > 1) + + if (sgid != -1) { - _hurd_id.aux.gids[0] = rgid; - _hurd_id.aux.gids[1] = sgid; - _hurd_id.valid = 0; + if (rgid == -1) + { + if (_hurd_id.aux.ngids >= 1) + auxs[0] = _hurd_id.aux.gids[0]; + else if (_hurd_id.gen.ngids >= 1) + auxs[0] = _hurd_id.gen.gids[0]; + else + /* Not even an effective GID. + Fall back to the only GID we have. */ + auxs[0] = sgid; + } + if (_hurd_id.aux.ngids <= 1) + { + /* No saved gids now. The new set will be just UID. */ + newaux = auxs; + naux = 2; + } + else + { + _hurd_id.aux.gids[1] = sgid; + _hurd_id.valid = 0; + } } err = __USEPORT (AUTH, __auth_makeauth (port, NULL, MACH_MSG_TYPE_COPY_SEND, 0, _hurd_id.gen.uids, _hurd_id.gen.nuids, _hurd_id.aux.uids, _hurd_id.aux.nuids, - _hurd_id.gen.ngids ? _hurd_id.gen.gids : &egid, - _hurd_id.gen.ngids ?: 1, - _hurd_id.aux.ngids > 1 ? _hurd_id.aux.gids : agids, - _hurd_id.aux.ngids > 1 ? _hurd_id.aux.ngids : 2, + newgen, ngen, newaux, naux, &newauth)); } - __mutex_unlock (&_hurd_id.lock); HURD_CRITICAL_END; diff --git a/sysdeps/mach/hurd/setresuid.c b/sysdeps/mach/hurd/setresuid.c index ccf8d08..43720cd 100644 --- a/sysdeps/mach/hurd/setresuid.c +++ b/sysdeps/mach/hurd/setresuid.c @@ -1,5 +1,5 @@ /* setresuid -- set real user ID, effective user ID, and saved-set user ID - Copyright (C) 2002, 2005, 2006 Free Software Foundation, Inc. + Copyright (C) 2002-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -29,7 +29,6 @@ __setresuid (uid_t ruid, uid_t euid, uid_t suid) { auth_t newauth; error_t err; - uid_t auids[2] = { ruid, suid }; HURD_CRITICAL_BEGIN; __mutex_lock (&_hurd_id.lock); @@ -38,26 +37,74 @@ __setresuid (uid_t ruid, uid_t euid, uid_t suid) if (!err) { /* Make a new auth handle which has EUID as the first element in the - list of effective uids. */ + list of effective uids. */ - if (_hurd_id.gen.nuids > 0) + uid_t *newgen, *newaux; + uid_t auxs[2] = { ruid, suid }; + size_t ngen, naux; + + newgen = _hurd_id.gen.uids; + ngen = _hurd_id.gen.nuids; + if (euid != -1) { - _hurd_id.gen.uids[0] = euid; - _hurd_id.valid = 0; + if (_hurd_id.gen.nuids == 0) + { + /* No effective uids now. The new set will be just UID. */ + newgen = &euid; + ngen = 1; + } + else + { + _hurd_id.gen.uids[0] = euid; + _hurd_id.valid = 0; + } } - if (_hurd_id.aux.nuids > 1) + + newaux = _hurd_id.aux.uids; + naux = _hurd_id.aux.nuids; + if (ruid != -1) + { + if (_hurd_id.aux.nuids == 0) + { + newaux = &ruid; + naux = 1; + } + else + { + _hurd_id.aux.uids[0] = ruid; + _hurd_id.valid = 0; + } + } + + if (suid != -1) { - _hurd_id.aux.uids[0] = ruid; - _hurd_id.aux.uids[1] = suid; - _hurd_id.valid = 0; + if (ruid == -1) + { + if (_hurd_id.aux.nuids >= 1) + auxs[0] = _hurd_id.aux.uids[0]; + else if (_hurd_id.gen.nuids >= 1) + auxs[0] = _hurd_id.gen.uids[0]; + else + /* Not even an effective UID. + Fall back to the only UID we have. */ + auxs[0] = suid; + } + if (_hurd_id.aux.nuids <= 1) + { + /* No saved uids now. The new set will be just UID. */ + newaux = auxs; + naux = 2; + } + else + { + _hurd_id.aux.uids[1] = suid; + _hurd_id.valid = 0; + } } err = __USEPORT (AUTH, __auth_makeauth (port, NULL, MACH_MSG_TYPE_COPY_SEND, 0, - _hurd_id.gen.nuids ? _hurd_id.gen.uids : &euid, - _hurd_id.gen.nuids ?: 1, - _hurd_id.aux.nuids > 1 ? _hurd_id.aux.uids : auids, - _hurd_id.aux.nuids > 1 ? _hurd_id.aux.nuids : 2, + newgen, ngen, newaux, naux, _hurd_id.gen.gids, _hurd_id.gen.ngids, _hurd_id.aux.gids, _hurd_id.aux.ngids, &newauth)); diff --git a/sysdeps/mach/hurd/shmat.c b/sysdeps/mach/hurd/shmat.c new file mode 100644 index 0000000..148a60c --- /dev/null +++ b/sysdeps/mach/hurd/shmat.c @@ -0,0 +1,78 @@ +/* Copyright (C) 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "sysvshm.h" + +/* Attach the shared memory segment associated with SHMID to the data + segment of the calling process. SHMADDR and SHMFLG determine how + and where the segment is attached. */ +void * +__shmat (int shmid, const void *shmaddr, int shmflg) +{ + error_t err; + char filename[sizeof (SHM_DIR) - 1 + SHM_NAMEMAX]; + int fd; + void *addr; + struct stat statbuf; + int res; + + sprintf (filename, SHM_DIR SHM_NAMEPRI, shmid); + fd = __open (filename, (shmflg & SHM_RDONLY) ? O_RDONLY : O_RDWR); + if (fd < 0) + { + if (errno == ENOENT) + errno = EINVAL; + return (void *) -1; + } + + res = __fstat (fd, &statbuf); + if (res < 0) + { + __close (fd); + return (void *) -1; + } + + addr = __mmap ((void *) shmaddr, statbuf.st_size, + PROT_READ | ((shmflg & SHM_RDONLY) ? 0 : PROT_WRITE), + MAP_SHARED, fd, 0); + __close (fd); + if (addr == MAP_FAILED) + return (void *) -1; + + err = __sysvshm_add (addr, statbuf.st_size); + if (err) + { + munmap (addr, statbuf.st_size); + return (void *) -1; + } + + return addr; +} + +weak_alias(__shmat, shmat) diff --git a/sysdeps/mach/hurd/shmctl.c b/sysdeps/mach/hurd/shmctl.c new file mode 100644 index 0000000..0d8eea6 --- /dev/null +++ b/sysdeps/mach/hurd/shmctl.c @@ -0,0 +1,132 @@ +/* Copyright (C) 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "sysvshm.h" + +/* Provide operations to control over shared memory segments. */ +int +__shmctl (int id, int cmd, struct shmid_ds *buf) +{ + error_t err = 0; + int fd; + int res; + char filename[sizeof (SHM_DIR) - 1 + SHM_NAMEMAX]; + struct stat statbuf; + + sprintf (filename, SHM_DIR SHM_NAMEPRI, id); + /* SysV requires read access for IPC_STAT. */ + fd = __open (filename, O_NORW); + if (fd < 0) + { + if (errno == ENOENT) + errno = EINVAL; + return -1; + } + + res = __fstat (fd, &statbuf); + if (res < 0) + { + err = errno; + __close (fd); + errno = err; + return -1; + } + + switch (cmd) + { + case IPC_STAT: + + buf->shm_perm.__key = id; + buf->shm_perm.uid = statbuf.st_uid; + buf->shm_perm.gid = statbuf.st_gid; + + /* We do not support the creator. */ + buf->shm_perm.cuid = statbuf.st_uid; + buf->shm_perm.cgid = statbuf.st_gid; + + /* We just want the protection bits. */ + buf->shm_perm.mode = statbuf.st_mode & 0777; + /* Hopeless. We do not support a sequence number. */ + buf->shm_perm.__seq = statbuf.st_ino; + buf->shm_segsz = statbuf.st_size; + + /* Hopeless. We do not support any of these. */ + buf->shm_atime = statbuf.st_atime; + buf->shm_dtime = statbuf.st_mtime; + /* Well, this comes at least close. */ + buf->shm_ctime = statbuf.st_ctime; + + /* We do not support the PID. */ + buf->shm_cpid = 0; + buf->shm_lpid = 0; + + if (statbuf.st_mode & S_IMMAP0) + buf->shm_nattch = 0; + else + /* 42 is the answer. Of course this is bogus, but for most + applications, this should be fine. */ + buf->shm_nattch = 42; + + break; + + case IPC_SET: + if (statbuf.st_uid != buf->shm_perm.uid + || statbuf.st_gid != buf->shm_perm.gid) + { + res = __fchown (fd, + (statbuf.st_uid != buf->shm_perm.uid) + ? buf->shm_perm.uid : -1, + (statbuf.st_gid != buf->shm_perm.gid) + ? buf->shm_perm.gid : -1); + if (res < 0) + err = errno; + } + + if (!err && statbuf.st_mode & 0777 != buf->shm_perm.mode & 0777) + { + res = __fchmod (fd, (statbuf.st_mode & ~0777) + | (buf->shm_perm.mode & 0777)); + if (res < 0) + err = errno; + } + break; + + case IPC_RMID: + res = __unlink (filename); + /* FIXME: Check error (mapping ENOENT to EINVAL). */ + break; + + default: + err = EINVAL; + } + + __close (fd); + errno = err; + return err ? -1 : 0; +} + +weak_alias(__shmctl, shmctl) diff --git a/sysdeps/mach/hurd/shmdt.c b/sysdeps/mach/hurd/shmdt.c new file mode 100644 index 0000000..cdafef0 --- /dev/null +++ b/sysdeps/mach/hurd/shmdt.c @@ -0,0 +1,51 @@ +/* Copyright (C) 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "sysvshm.h" + +/* Detach shared memory segment starting at address specified by + SHMADDR from the caller's data segment. */ +int +__shmdt (const void *shmaddr) +{ + error_t err; + size_t size; + + err = __sysvshm_remove ((void *) shmaddr, &size); + if (err) + { + errno = err; + return -1; + } + + __munmap ((void *) shmaddr, size); + return 0; +} + +weak_alias(__shmdt, shmdt) diff --git a/sysdeps/mach/hurd/shmget.c b/sysdeps/mach/hurd/shmget.c new file mode 100644 index 0000000..6620472 --- /dev/null +++ b/sysdeps/mach/hurd/shmget.c @@ -0,0 +1,242 @@ +/* Copyright (C) 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "sysvshm.h" + +/* Create a new shared memory segment file without linking it into the + filesystem. Return the directory and file ports in R_DIR and R_FILE. */ +static error_t +create_shm_file (size_t size, int flags, file_t *r_dir, file_t *r_file) +{ + error_t err; + file_t dir; + file_t file; + + flags &= 0777; + + /* Get a port to the directory that will contain the file. */ + dir = __file_name_lookup (SHM_DIR, 0, 0); + if (dir == MACH_PORT_NULL) + return errno; + + /* Create an unnamed file in the directory. */ + err = __dir_mkfile (dir, O_RDWR, flags, &file); + if (err) + { + __mach_port_deallocate (__mach_task_self (), dir); + return err; + } + + err = __file_set_size (file, size); + if (err) + { + __mach_port_deallocate (__mach_task_self (), file); + __mach_port_deallocate (__mach_task_self (), dir); + + return err; + } + + *r_dir = dir; + *r_file = file; + + return 0; +} + + +/* Open the shared memory segment *R_KEY and return a file descriptor + to it in R_FD. If KEY is IPC_PRIVATE, use a private key and return + it in R_KEY. */ +static error_t +get_exclusive (int shmflags, size_t size, key_t *r_key, int *r_fd) +{ + error_t err; + file_t dir; + file_t file; + char filename[SHM_NAMEMAX]; + key_t key = *r_key; + bool is_private; + + /* Create the shared memory segment. */ + err = create_shm_file (size, shmflags, &dir, &file); + if (err) + return err; + + if (key == IPC_PRIVATE) + { + is_private = true; + key = SHM_PRIV_KEY_START; + + /* Try to link the shared memory segment into the filesystem + (exclusively). Private segments have negative keys. */ + do + { + sprintf (filename, SHM_NAMEPRI, key); + err = __dir_link (dir, file, filename, 1); + if (!err) + { + /* We are done. */ + *r_key = key; + break; + } + else if (err == EEXIST) + { + /* Check if we ran out of keys. If not, try again with new + key. */ + if (key == SHM_PRIV_KEY_END) + err = ENOSPC; + else + err = 0; + + key--; + } + } + while (!err); + } + else + { + /* Try to link the shared memory segment into the filesystem + (exclusively) under the given key. */ + sprintf (filename, SHM_NAMEPRI, key); + err = __dir_link (dir, file, filename, 1); + } + + __mach_port_deallocate (__mach_task_self (), dir); + + if (!err) + { + int fd; + + /* Get a file descriptor for that port. */ + fd = _hurd_intern_fd (file, O_RDWR, 1); /* dealloc on error */ + if (fd < 0) + err = errno; + else + *r_fd = fd; + } + + return err; +} + + +/* Open the shared memory segment KEY (creating it if it doesn't yet + exist) and return a file descriptor to it in R_FD. */ +static error_t +get_shared (int shmflags, size_t size, key_t key, int *r_fd) +{ + error_t err = 0; + char filename[sizeof (SHM_DIR) - 1 + SHM_NAMEMAX]; + int fd = -1; + sprintf (filename, SHM_DIR SHM_NAMEPRI, key); + + do + { + fd = __open (filename, O_NORW, shmflags & 0777); + + if (fd < 0 && errno != ENOENT) + /* We give up. */ + return errno; + else if (fd >= 0) + { + int res; + struct stat statbuf; + + /* Check the size (we only need to do this if we did not + create the shared memory segment file ourselves). */ + res = __fstat (fd, &statbuf); + if (res < 0) + { + err = errno; + __close (fd); + return err; + } + + if (statbuf.st_size < size) + { + __close (fd); + return EINVAL; + } + } + else + { + /* The memory segment doesn't exist. */ + if (shmflags & IPC_CREAT) + { + /* Try to create it exclusively. */ + err = get_exclusive (shmflags, size, &key, &fd); + if (err == EEXIST) + /* If somebody created it in the meanwhile, just try again. */ + err = 0; + } + else + err = ENOENT; + } + } + while (fd < 0 && !err); + + if (!err) + *r_fd = fd; + else + *r_fd = -1; + + return err; +} + +/* Return an identifier for an shared memory segment of at least size + SIZE which is associated with KEY. */ +int +__shmget (key_t key, size_t size, int shmflags) +{ + error_t err; + int fd; + + if (key == IPC_PRIVATE || shmflags & IPC_EXCL) + /* An exclusive shared memory segment must be created. */ + err = get_exclusive (shmflags, size, &key, &fd); + else + err = get_shared (shmflags, size, key, &fd); + + if (err) + { + errno = err; + return -1; + } + + /* From here, we can't fail. That's important, as otherwise we + would need to unlink the file if we created it (in that case, the + code above would have to be changed to pass a "created" flag down + to the caller). */ + + __close (fd); + + return key; +} + +weak_alias(__shmget, shmget) diff --git a/sysdeps/mach/hurd/sigaction.c b/sysdeps/mach/hurd/sigaction.c index fe452e8..bedf14c 100644 --- a/sysdeps/mach/hurd/sigaction.c +++ b/sysdeps/mach/hurd/sigaction.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2002, 2007 +/* Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2002, 2007, 2011 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -51,15 +51,15 @@ __sigaction (sig, act, oact) ss = _hurd_self_sigstate (); __spin_lock (&ss->critical_section_lock); - __spin_lock (&ss->lock); - old = ss->actions[sig]; + _hurd_sigstate_lock (ss); + old = _hurd_sigstate_actions (ss) [sig]; if (act != NULL) - ss->actions[sig] = a; + _hurd_sigstate_actions (ss) [sig] = a; if (act != NULL && sig == SIGCHLD && (a.sa_flags & SA_NOCLDSTOP) != (old.sa_flags & SA_NOCLDSTOP)) { - __spin_unlock (&ss->lock); + _hurd_sigstate_unlock (ss); /* Inform the proc server whether or not it should send us SIGCHLD for stopped children. We do this in a critical section so that no @@ -67,8 +67,8 @@ __sigaction (sig, act, oact) __USEPORT (PROC, __proc_mod_stopchild (port, !(a.sa_flags & SA_NOCLDSTOP))); - __spin_lock (&ss->lock); - pending = ss->pending & ~ss->blocked; + _hurd_sigstate_lock (ss); + pending = _hurd_sigstate_pending (ss) & ~ss->blocked; } else if (act != NULL && (a.sa_handler == SIG_IGN || a.sa_handler == SIG_DFL)) /* We are changing to an action that might be to ignore SIG signals. @@ -77,11 +77,11 @@ __sigaction (sig, act, oact) back and then SIG is unblocked, the signal pending now should not arrive. So wake up the signal thread to check the new state and do the right thing. */ - pending = ss->pending & __sigmask (sig); + pending = _hurd_sigstate_pending (ss) & __sigmask (sig); else pending = 0; - __spin_unlock (&ss->lock); + _hurd_sigstate_unlock (ss); __spin_unlock (&ss->critical_section_lock); if (pending) diff --git a/sysdeps/mach/hurd/sigpending.c b/sysdeps/mach/hurd/sigpending.c index 84ac927..f582d45 100644 --- a/sysdeps/mach/hurd/sigpending.c +++ b/sysdeps/mach/hurd/sigpending.c @@ -1,4 +1,5 @@ -/* Copyright (C) 1991, 1993, 1994, 1995, 1997 Free Software Foundation, Inc. +/* Copyright (C) 1991, 1993, 1994, 1995, 1997, 2011 + Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -38,9 +39,9 @@ sigpending (set) } ss = _hurd_self_sigstate (); - __spin_lock (&ss->lock); - pending = ss->pending; - __spin_unlock (&ss->lock); + _hurd_sigstate_lock (ss); + pending = _hurd_sigstate_pending (ss); + _hurd_sigstate_unlock (ss); *set = pending; return 0; diff --git a/sysdeps/mach/hurd/sigprocmask.c b/sysdeps/mach/hurd/sigprocmask.c index cbb5ecc..b12dc19 100644 --- a/sysdeps/mach/hurd/sigprocmask.c +++ b/sysdeps/mach/hurd/sigprocmask.c @@ -1,4 +1,5 @@ -/* Copyright (C) 1991,92,93,94,95,96,97,2002 Free Software Foundation, Inc. +/* Copyright (C) 1991,92,93,94,95,96,97,2002,2011 + Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -40,7 +41,7 @@ __sigprocmask (how, set, oset) ss = _hurd_self_sigstate (); - __spin_lock (&ss->lock); + _hurd_sigstate_lock (ss); old = ss->blocked; @@ -61,7 +62,7 @@ __sigprocmask (how, set, oset) break; default: - __spin_unlock (&ss->lock); + _hurd_sigstate_unlock (ss); errno = EINVAL; return -1; } @@ -69,9 +70,9 @@ __sigprocmask (how, set, oset) ss->blocked &= ~_SIG_CANT_MASK; } - pending = ss->pending & ~ss->blocked; + pending = _hurd_sigstate_pending (ss) & ~ss->blocked; - __spin_unlock (&ss->lock); + _hurd_sigstate_unlock (ss); if (oset != NULL) *oset = old; diff --git a/sysdeps/mach/hurd/sigsuspend.c b/sysdeps/mach/hurd/sigsuspend.c index 7e32472..2e55e30 100644 --- a/sysdeps/mach/hurd/sigsuspend.c +++ b/sysdeps/mach/hurd/sigsuspend.c @@ -1,5 +1,5 @@ -/* Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2002, 2007 - Free Software Foundation, Inc. +/* Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2002, 2007, + 2011 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -43,7 +43,7 @@ __sigsuspend (set) ss = _hurd_self_sigstate (); - __spin_lock (&ss->lock); + _hurd_sigstate_lock (ss); oldmask = ss->blocked; if (set != NULL) @@ -51,11 +51,11 @@ __sigsuspend (set) ss->blocked = newmask & ~_SIG_CANT_MASK; /* Notice if any pending signals just became unblocked. */ - pending = ss->pending & ~ss->blocked; + pending = _hurd_sigstate_pending (ss) & ~ss->blocked; /* Tell the signal thread to message us when a signal arrives. */ ss->suspended = wait; - __spin_unlock (&ss->lock); + _hurd_sigstate_unlock (ss); if (pending) /* Tell the signal thread to check for pending signals. */ @@ -66,10 +66,11 @@ __sigsuspend (set) MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL); __mach_port_destroy (__mach_task_self (), wait); - __spin_lock (&ss->lock); - ss->blocked = oldmask; /* Restore the old mask. */ - pending = ss->pending & ~ss->blocked; /* Again check for pending signals. */ - __spin_unlock (&ss->lock); + /* Restore the old mask and check for pending signals again. */ + _hurd_sigstate_lock (ss); + ss->blocked = oldmask; + pending = _hurd_sigstate_pending(ss) & ~ss->blocked; + _hurd_sigstate_unlock (ss); if (pending) /* Tell the signal thread to check for pending signals. */ diff --git a/sysdeps/mach/hurd/sigwait.c b/sysdeps/mach/hurd/sigwait.c index 9794076..af50f74 100644 --- a/sysdeps/mach/hurd/sigwait.c +++ b/sysdeps/mach/hurd/sigwait.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996,97,2001,02 Free Software Foundation, Inc. +/* Copyright (C) 1996,97,2001,2002,2011 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -28,7 +28,7 @@ int __sigwait (const sigset_t *set, int *sig) { struct hurd_sigstate *ss; - sigset_t mask, ready; + sigset_t mask, ready, blocked; int signo = 0; struct hurd_signal_preemptor preemptor; jmp_buf buf; @@ -50,8 +50,8 @@ __sigwait (const sigset_t *set, int *sig) /* Make sure this is all kosher */ assert (__sigismember (&mask, signo)); - /* Make sure this signal is unblocked */ - __sigdelset (&ss->blocked, signo); + /* Restore the blocking mask. */ + ss->blocked = blocked; return pe->handler; } @@ -72,10 +72,11 @@ __sigwait (const sigset_t *set, int *sig) __sigemptyset (&mask); ss = _hurd_self_sigstate (); - __spin_lock (&ss->lock); + _hurd_sigstate_lock (ss); /* See if one of these signals is currently pending. */ - __sigandset (&ready, &ss->pending, &mask); + sigset_t pending = _hurd_sigstate_pending (ss); + __sigandset (&ready, &pending, &mask); if (! __sigisemptyset (&ready)) { for (signo = 1; signo < NSIG; signo++) @@ -103,7 +104,11 @@ __sigwait (const sigset_t *set, int *sig) preemptor.next = ss->preemptors; ss->preemptors = &preemptor; - __spin_unlock (&ss->lock); + /* Unblock the expected signals */ + blocked = ss->blocked; + ss->blocked &= ~mask; + + _hurd_sigstate_unlock (ss); /* Wait. */ __mach_msg (&msg, MACH_RCV_MSG, 0, sizeof (msg), wait, @@ -114,7 +119,7 @@ __sigwait (const sigset_t *set, int *sig) { assert (signo); - __spin_lock (&ss->lock); + _hurd_sigstate_lock (ss); /* Delete our preemptor. */ assert (ss->preemptors == &preemptor); @@ -123,7 +128,7 @@ __sigwait (const sigset_t *set, int *sig) all_done: - spin_unlock (&ss->lock); + _hurd_sigstate_unlock (ss); __mach_port_destroy (__mach_task_self (), wait); *sig = signo; diff --git a/sysdeps/mach/hurd/socket.c b/sysdeps/mach/hurd/socket.c index a707ed9..b29a6e6 100644 --- a/sysdeps/mach/hurd/socket.c +++ b/sysdeps/mach/hurd/socket.c @@ -57,7 +57,7 @@ __socket (domain, type, protocol) isn't supported. */ if (err == MACH_SEND_INVALID_DEST || err == MIG_SERVER_DIED || err == MIG_BAD_ID || err == EOPNOTSUPP) - err = EPFNOSUPPORT; + err = EAFNOSUPPORT; if (err) return __hurd_fail (err); diff --git a/sysdeps/mach/hurd/spawni.c b/sysdeps/mach/hurd/spawni.c index 244ca2d..d4ede8a 100644 --- a/sysdeps/mach/hurd/spawni.c +++ b/sysdeps/mach/hurd/spawni.c @@ -1,5 +1,5 @@ /* spawn a new process running an executable. Hurd version. - Copyright (C) 2001,02,04 Free Software Foundation, Inc. + Copyright (C) 2001,02,04,10 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -44,7 +44,7 @@ __spawni (pid_t *pid, const char *file, int use_path) { pid_t new_pid; - char *path, *p, *name; + char *path, *p, *name, *filename; size_t len; size_t pathlen; short int flags; @@ -60,14 +60,14 @@ __spawni (pid_t *pid, const char *file, that remains visible after an exec is registration with the proc server, and the inheritance of various values and ports. All those inherited values and ports are what get collected up and passed in the - file_exec RPC by an exec call. So we do the proc server registration - here, following the model of fork (see fork.c). We then collect up - the inherited values and ports from this (parent) process following - the model of exec (see hurd/hurdexec.c), modify or replace each value - that fork would (plus the specific changes demanded by ATTRP and - FILE_ACTIONS), and make the file_exec RPC on the requested executable - file with the child process's task port rather than our own. This - should be indistinguishable from the fork + exec implementation, + file_exec_file_name RPC by an exec call. So we do the proc server + registration here, following the model of fork (see fork.c). We then + collect up the inherited values and ports from this (parent) process + following the model of exec (see hurd/hurdexec.c), modify or replace each + value that fork would (plus the specific changes demanded by ATTRP and + FILE_ACTIONS), and make the file_exec_file_name RPC on the requested + executable file with the child process's task port rather than our own. + This should be indistinguishable from the fork + exec implementation, except that all errors will be detected here (in the parent process) and return proper errno codes rather than the child dying with 127. @@ -239,26 +239,29 @@ __spawni (pid_t *pid, const char *file, assert (! __spin_lock_locked (&ss->critical_section_lock)); __spin_lock (&ss->critical_section_lock); - __spin_lock (&ss->lock); + _hurd_sigstate_lock (ss); ints[INIT_SIGMASK] = ss->blocked; - ints[INIT_SIGPENDING] = ss->pending; + ints[INIT_SIGPENDING] = 0; ints[INIT_SIGIGN] = 0; /* Unless we were asked to reset all handlers to SIG_DFL, pass down the set of signals that were set to SIG_IGN. */ - if ((flags & POSIX_SPAWN_SETSIGDEF) == 0) - for (i = 1; i < NSIG; ++i) - if (ss->actions[i].sa_handler == SIG_IGN) - ints[INIT_SIGIGN] |= __sigmask (i); - - /* We hold the sigstate lock until the exec has failed so that no signal - can arrive between when we pack the blocked and ignored signals, and - when the exec actually happens. A signal handler could change what + { + struct sigaction *actions = _hurd_sigstate_actions (ss); + if ((flags & POSIX_SPAWN_SETSIGDEF) == 0) + for (i = 1; i < NSIG; ++i) + if (actions[i].sa_handler == SIG_IGN) + ints[INIT_SIGIGN] |= __sigmask (i); + } + + /* We hold the critical section lock until the exec has failed so that no + signal can arrive between when we pack the blocked and ignored signals, + and when the exec actually happens. A signal handler could change what signals are blocked and ignored. Either the change will be reflected in the exec, or the signal will never be delivered. Setting the critical section flag avoids anything we call trying to acquire the sigstate lock. */ - __spin_unlock (&ss->lock); + _hurd_sigstate_unlock (ss); /* Set signal mask. */ if ((flags & POSIX_SPAWN_SETSIGMASK) != 0) @@ -545,7 +548,7 @@ __spawni (pid_t *pid, const char *file, if (! use_path || strchr (file, '/') != NULL) /* The FILE parameter is actually a path. */ - err = child_lookup (file, O_EXEC, 0, &execfile); + err = child_lookup (filename = file, O_EXEC, 0, &execfile); else { /* We have to search for FILE on the path. */ @@ -572,20 +575,18 @@ __spawni (pid_t *pid, const char *file, p = path; do { - char *startp; - path = p; p = __strchrnul (path, ':'); if (p == path) /* Two adjacent colons, or a colon at the beginning or the end of `PATH' means to search the current directory. */ - startp = name + 1; + filename = name + 1; else - startp = (char *) memcpy (name - (p - path), path, p - path); + filename = (char *) memcpy (name - (p - path), path, p - path); /* Try to open this file name. */ - err = child_lookup (startp, O_EXEC, 0, &execfile); + err = child_lookup (filename, O_EXEC, 0, &execfile); switch (err) { case EACCES: @@ -622,14 +623,27 @@ __spawni (pid_t *pid, const char *file, inline error_t exec (file_t file) { - return __file_exec (file, task, - (__sigismember (&_hurdsig_traced, SIGKILL) - ? EXEC_SIGTRAP : 0), - args, argslen, env, envlen, - dtable, MACH_MSG_TYPE_COPY_SEND, dtablesize, - ports, MACH_MSG_TYPE_COPY_SEND, _hurd_nports, - ints, INIT_INT_MAX, - NULL, 0, NULL, 0); + error_t err = __file_exec_file_name + (file, task, + __sigismember (&_hurdsig_traced, SIGKILL) ? EXEC_SIGTRAP : 0, + filename, args, argslen, env, envlen, + dtable, MACH_MSG_TYPE_COPY_SEND, dtablesize, + ports, MACH_MSG_TYPE_COPY_SEND, _hurd_nports, + ints, INIT_INT_MAX, NULL, 0, NULL, 0); + + /* Fallback for backwards compatibility. This can just be removed + when __file_exec goes away. */ + if (err == MIG_BAD_ID) + return __file_exec (file, task, + (__sigismember (&_hurdsig_traced, SIGKILL) + ? EXEC_SIGTRAP : 0), + args, argslen, env, envlen, + dtable, MACH_MSG_TYPE_COPY_SEND, dtablesize, + ports, MACH_MSG_TYPE_COPY_SEND, _hurd_nports, + ints, INIT_INT_MAX, + NULL, 0, NULL, 0); + + return err; } /* Now we are out of things that can fail before the file_exec RPC, diff --git a/sysdeps/mach/hurd/symlink.c b/sysdeps/mach/hurd/symlink.c index 857e236..1cbab8b 100644 --- a/sysdeps/mach/hurd/symlink.c +++ b/sysdeps/mach/hurd/symlink.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991, 92, 93, 94, 95, 96, 97 Free Software Foundation, Inc. +/* Copyright (C) 1991-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -47,19 +47,22 @@ __symlink (from, to) err = __dir_mkfile (dir, O_WRITE, 0777 & ~_hurd_umask, &node); if (! err) - /* Set the node's translator to make it a symlink. */ - err = __file_set_translator (node, - FS_TRANS_EXCL|FS_TRANS_SET, - FS_TRANS_EXCL|FS_TRANS_SET, 0, - buf, sizeof (_HURD_SYMLINK) + len, - MACH_PORT_NULL, MACH_MSG_TYPE_COPY_SEND); + { + /* Set the node's translator to make it a symlink. */ + err = __file_set_translator (node, + FS_TRANS_EXCL|FS_TRANS_SET, + FS_TRANS_EXCL|FS_TRANS_SET, 0, + buf, sizeof (_HURD_SYMLINK) + len, + MACH_PORT_NULL, MACH_MSG_TYPE_COPY_SEND); - if (! err) - /* Link the node, now a valid symlink, into the target directory. */ - err = __dir_link (dir, node, name, 1); + if (! err) + /* Link the node, now a valid symlink, into the target directory. */ + err = __dir_link (dir, node, name, 1); + + __mach_port_deallocate (__mach_task_self (), node); + } __mach_port_deallocate (__mach_task_self (), dir); - __mach_port_deallocate (__mach_task_self (), node); if (err) return __hurd_fail (err); diff --git a/sysdeps/mach/hurd/symlinkat.c b/sysdeps/mach/hurd/symlinkat.c index 9a51c66..0eee410 100644 --- a/sysdeps/mach/hurd/symlinkat.c +++ b/sysdeps/mach/hurd/symlinkat.c @@ -1,6 +1,5 @@ /* Create a symbolic link named relative to an open directory. Hurd version. - Copyright (C) 1991,1992,1993,1994,1995,1996,1997,2006 - Free Software Foundation, Inc. + Copyright (C) 1991-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -54,19 +53,22 @@ symlinkat (from, fd, to) err = __dir_mkfile (dir, O_WRITE, 0777 & ~_hurd_umask, &node); if (! err) - /* Set the node's translator to make it a symlink. */ - err = __file_set_translator (node, - FS_TRANS_EXCL|FS_TRANS_SET, - FS_TRANS_EXCL|FS_TRANS_SET, 0, - buf, sizeof (_HURD_SYMLINK) + len, - MACH_PORT_NULL, MACH_MSG_TYPE_COPY_SEND); + { + /* Set the node's translator to make it a symlink. */ + err = __file_set_translator (node, + FS_TRANS_EXCL|FS_TRANS_SET, + FS_TRANS_EXCL|FS_TRANS_SET, 0, + buf, sizeof (_HURD_SYMLINK) + len, + MACH_PORT_NULL, MACH_MSG_TYPE_COPY_SEND); - if (! err) - /* Link the node, now a valid symlink, into the target directory. */ - err = __dir_link (dir, node, name, 1); + if (! err) + /* Link the node, now a valid symlink, into the target directory. */ + err = __dir_link (dir, node, name, 1); + + __mach_port_deallocate (__mach_task_self (), node); + } __mach_port_deallocate (__mach_task_self (), dir); - __mach_port_deallocate (__mach_task_self (), node); if (err) return __hurd_fail (err); diff --git a/sysdeps/mach/hurd/sys/param.h b/sysdeps/mach/hurd/sys/param.h index 699ba35..29cb1e3 100644 --- a/sysdeps/mach/hurd/sys/param.h +++ b/sysdeps/mach/hurd/sys/param.h @@ -119,6 +119,10 @@ #define MAX(a,b) (((a)>(b))?(a):(b)) +/* Unit of `st_blocks'. */ +#define DEV_BSIZE 512 + + /* Scale factor for scaled integers used to count %cpu time and load avgs. The number of CPU `tick's that map to a unique `%age' can be expressed diff --git a/sysdeps/mach/hurd/tls.h b/sysdeps/mach/hurd/tls.h index 8ad3f1a..81d7c68 100644 --- a/sysdeps/mach/hurd/tls.h +++ b/sysdeps/mach/hurd/tls.h @@ -1,5 +1,7 @@ /* Definitions for thread-local data handling. Hurd version. - Copyright (C) 2003, 2005, 2007 Free Software Foundation, Inc. + + Copyright (C) 2003, 2005, 2007, 2009 Free Software Foundation, Inc. + This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -23,7 +25,9 @@ #if defined HAVE_TLS_SUPPORT && !defined __ASSEMBLER__ # include +# include # include +# include # include # include diff --git a/sysdeps/mach/hurd/ttyname_r.c b/sysdeps/mach/hurd/ttyname_r.c index 5f6c9c3..5718fca 100644 --- a/sysdeps/mach/hurd/ttyname_r.c +++ b/sysdeps/mach/hurd/ttyname_r.c @@ -43,7 +43,7 @@ __ttyname_r (int fd, char *buf, size_t buflen) len = strlen (nodename) + 1; if (len > buflen) { - errno = EINVAL; + errno = ERANGE; return errno; } diff --git a/sysdeps/mach/hurd/xstatconv.c b/sysdeps/mach/hurd/xstatconv.c index e28643c..d6314e2 100644 --- a/sysdeps/mach/hurd/xstatconv.c +++ b/sysdeps/mach/hurd/xstatconv.c @@ -1,5 +1,5 @@ /* Convert between `struct stat' format, and `struct stat64' format. - Copyright (C) 2000,01,02 Free Software Foundation, Inc. + Copyright (C) 2000-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -42,12 +42,9 @@ xstat64_conv (struct stat *buf, const struct stat64 *buf64) buf->st_uid = buf64->st_uid; buf->st_gid = buf64->st_gid; buf->st_size = buf64->st_size; - buf->st_atime = buf64->st_atime; - buf->st_atime_usec = buf64->st_atime_usec; - buf->st_mtime = buf64->st_mtime; - buf->st_mtime_usec = buf64->st_mtime_usec; - buf->st_ctime = buf64->st_ctime; - buf->st_ctime_usec = buf64->st_ctime_usec; + buf->st_atim = buf64->st_atim; + buf->st_mtim = buf64->st_mtim; + buf->st_ctim = buf64->st_ctim; buf->st_blksize = buf64->st_blksize; buf->st_blocks = buf64->st_blocks; buf->st_author = buf64->st_author; diff --git a/sysdeps/mach/i386/machine-lock.h b/sysdeps/mach/i386/machine-lock.h index 33602f4..b0700d9 100644 --- a/sysdeps/mach/i386/machine-lock.h +++ b/sysdeps/mach/i386/machine-lock.h @@ -35,6 +35,9 @@ typedef __volatile int __spin_lock_t; /* Unlock LOCK. */ +void __spin_unlock (__spin_lock_t *__lock); + +#ifdef __USE_EXTERN_INLINES _EXTERN_INLINE void __spin_unlock (__spin_lock_t *__lock) { @@ -43,9 +46,13 @@ __spin_unlock (__spin_lock_t *__lock) : "=&r" (__unlocked), "=m" (*__lock) : "0" (0) : "memory"); } +#endif /* Try to lock LOCK; return nonzero if we locked it, zero if another has. */ +int __spin_try_lock (__spin_lock_t *__lock); + +#ifdef __USE_EXTERN_INLINES _EXTERN_INLINE int __spin_try_lock (__spin_lock_t *__lock) { @@ -55,14 +62,19 @@ __spin_try_lock (__spin_lock_t *__lock) : "memory"); return !__locked; } +#endif /* Return nonzero if LOCK is locked. */ +int __spin_lock_locked (__spin_lock_t *__lock); + +#ifdef __USE_EXTERN_INLINES _EXTERN_INLINE int __spin_lock_locked (__spin_lock_t *__lock) { return *__lock != 0; } +#endif #endif /* machine-lock.h */ diff --git a/sysdeps/mach/i386/sysdep.h b/sysdeps/mach/i386/sysdep.h index 4fc5d50..d3e569e 100644 --- a/sysdeps/mach/i386/sysdep.h +++ b/sysdeps/mach/i386/sysdep.h @@ -18,6 +18,9 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ +#ifndef _MACH_I386_SYSDEP_H +#define _MACH_I386_SYSDEP_H 1 + /* Defines RTLD_PRIVATE_ERRNO and USE_DL_SYSINFO. */ #include #include @@ -55,6 +58,15 @@ #define STACK_GROWTH_DOWN +/* Pointer mangling is not yet supported for Hurd. */ +#ifdef __ASSEMBLER__ +#define PTR_MANGLE(var) +#define PTR_DEMANGLE(var) +#else +#define PTR_MANGLE(var) (void) (var) +#define PTR_DEMANGLE(var) (void) (var) +#endif + /* Get the machine-independent Mach definitions. */ #include @@ -64,3 +76,5 @@ #undef ENTRY #undef ALIGN #include + +#endif /* mach/i386/sysdep.h */ diff --git a/sysdeps/mach/i386/thread_state.h b/sysdeps/mach/i386/thread_state.h index cefea2c..106ebc0 100644 --- a/sysdeps/mach/i386/thread_state.h +++ b/sysdeps/mach/i386/thread_state.h @@ -17,9 +17,13 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ +#ifndef _MACH_I386_THREAD_STATE_H +#define _MACH_I386_THREAD_STATE_H 1 + #include -#define MACHINE_THREAD_STATE_FLAVOR i386_THREAD_STATE +#define MACHINE_NEW_THREAD_STATE_FLAVOR i386_THREAD_STATE +#define MACHINE_THREAD_STATE_FLAVOR i386_REGS_SEGS_STATE #define MACHINE_THREAD_STATE_COUNT i386_THREAD_STATE_COUNT #define machine_thread_state i386_thread_state @@ -28,6 +32,14 @@ #define SP uesp #define SYSRETURN eax +#define MACHINE_THREAD_STATE_FIX_NEW(ts) do { \ + asm ("mov %%cs, %w0" : "=q" ((ts)->cs)); \ + asm ("mov %%ds, %w0" : "=q" ((ts)->ds)); \ + asm ("mov %%es, %w0" : "=q" ((ts)->es)); \ + asm ("mov %%fs, %w0" : "=q" ((ts)->fs)); \ + asm ("mov %%gs, %w0" : "=q" ((ts)->gs)); \ +} while(0) + struct machine_thread_all_state { int set; /* Mask of bits (1 << FLAVOR). */ @@ -36,3 +48,5 @@ struct machine_thread_all_state }; #include + +#endif /* mach/i386/thread_state.h */ diff --git a/sysdeps/mach/nanosleep.c b/sysdeps/mach/nanosleep.c index e433adb..a3bc5ed 100644 --- a/sysdeps/mach/nanosleep.c +++ b/sysdeps/mach/nanosleep.c @@ -1,5 +1,5 @@ /* nanosleep -- sleep for a period specified with a struct timespec - Copyright (C) 2002 Free Software Foundation, Inc. + Copyright (C) 2002-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -28,6 +28,15 @@ __nanosleep (const struct timespec *requested_time, { mach_port_t recv; struct timeval before, after; + + if (requested_time->tv_sec < 0 + || requested_time->tv_nsec < 0 + || requested_time->tv_nsec >= 1000000000) + { + errno = EINVAL; + return -1; + } + const mach_msg_timeout_t ms = requested_time->tv_sec * 1000 + (requested_time->tv_nsec + 999999) / 1000000; @@ -36,16 +45,22 @@ __nanosleep (const struct timespec *requested_time, if (remaining && __gettimeofday (&before, NULL) < 0) return -1; - (void) __mach_msg (NULL, MACH_RCV_MSG|MACH_RCV_TIMEOUT|MACH_RCV_INTERRUPT, - 0, 0, recv, ms, MACH_PORT_NULL); + error_t err = __mach_msg (NULL, MACH_RCV_MSG|MACH_RCV_TIMEOUT|MACH_RCV_INTERRUPT, + 0, 0, recv, ms, MACH_PORT_NULL); __mach_port_destroy (mach_task_self (), recv); - if (remaining && __gettimeofday (&after, NULL) < 0) - return -1; - - if (remaining) + if (err == EMACH_RCV_INTERRUPTED) { - timersub (&after, &before, &after); - TIMEVAL_TO_TIMESPEC (&after, remaining); + if (remaining && __gettimeofday (&after, NULL) >= 0) + { + struct timeval req_time, elapsed, rem; + TIMESPEC_TO_TIMEVAL (&req_time, requested_time); + timersub (&after, &before, &elapsed); + timersub (&req_time, &elapsed, &rem); + TIMEVAL_TO_TIMESPEC (&rem, remaining); + } + + errno = EINTR; + return -1; } return 0; diff --git a/sysdeps/mach/powerpc/machine-lock.h b/sysdeps/mach/powerpc/machine-lock.h index 96af221..b0e228b 100644 --- a/sysdeps/mach/powerpc/machine-lock.h +++ b/sysdeps/mach/powerpc/machine-lock.h @@ -35,6 +35,9 @@ typedef __volatile long int __spin_lock_t; /* Unlock LOCK. */ +void __spin_unlock (__spin_lock_t *__lock); + +#ifdef __USE_EXTERN_INLINES _EXTERN_INLINE void __spin_unlock (__spin_lock_t *__lock) { @@ -45,9 +48,13 @@ __spin_unlock (__spin_lock_t *__lock) bne- 0b\n\ " : "=&r" (__locked) : "r" (__lock), "r" (0) : "cr0"); } +#endif /* Try to lock LOCK; return nonzero if we locked it, zero if another has. */ +int __spin_try_lock (register __spin_lock_t *__lock); + +#ifdef __USE_EXTERN_INLINES _EXTERN_INLINE int __spin_try_lock (register __spin_lock_t *__lock) { @@ -59,9 +66,13 @@ __spin_try_lock (register __spin_lock_t *__lock) " : "=&r" (__rtn) : "r" (__lock), "r" (1) : "cr0"); return !__rtn; } +#endif /* Return nonzero if LOCK is locked. */ +int __spin_lock_locked (__spin_lock_t *__lock); + +#ifdef __USE_EXTERN_INLINES _EXTERN_INLINE int __spin_lock_locked (__spin_lock_t *__lock) { @@ -73,6 +84,7 @@ __spin_lock_locked (__spin_lock_t *__lock) " : "=&r" (__rtn) : "r" (__lock) : "cr0"); return __rtn; } +#endif #endif /* machine-lock.h */ diff --git a/sysdeps/mach/powerpc/machine-sp.h b/sysdeps/mach/powerpc/machine-sp.h index 267707b..5885b2a 100644 --- a/sysdeps/mach/powerpc/machine-sp.h +++ b/sysdeps/mach/powerpc/machine-sp.h @@ -31,6 +31,9 @@ # endif #endif +void * __thread_stack_pointer (void); + +#ifdef __USE_EXTERN_INLINES _EXTERN_INLINE void * __thread_stack_pointer (void) { @@ -38,5 +41,6 @@ __thread_stack_pointer (void) __asm__ ("mr %0, 1" : "=r" (__sp__)); return __sp__; } +#endif #endif /* machine-sp.h */ diff --git a/sysdeps/mach/powerpc/thread_state.h b/sysdeps/mach/powerpc/thread_state.h index e6ca104..4ef1fe1 100644 --- a/sysdeps/mach/powerpc/thread_state.h +++ b/sysdeps/mach/powerpc/thread_state.h @@ -19,6 +19,7 @@ #include +#define MACHINE_NEW_THREAD_STATE_FLAVOR PPC_THREAD_STATE #define MACHINE_THREAD_STATE_FLAVOR PPC_THREAD_STATE #define MACHINE_THREAD_STATE_COUNT PPC_THREAD_STATE_COUNT diff --git a/sysdeps/mach/thread_state.h b/sysdeps/mach/thread_state.h index 38effdf..4445c2e 100644 --- a/sysdeps/mach/thread_state.h +++ b/sysdeps/mach/thread_state.h @@ -38,6 +38,9 @@ ((ts)->SP = (unsigned long int) (stack) + (size)) #endif #endif +#ifndef MACHINE_THREAD_STATE_FIX_NEW +#define MACHINE_THREAD_STATE_FIX_NEW(ts) +#endif /* These functions are of use in machine-dependent signal trampoline implementations. */ diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c index c61c72a..f98e133 100644 --- a/sysdeps/posix/getaddrinfo.c +++ b/sysdeps/posix/getaddrinfo.c @@ -196,7 +196,22 @@ gaih_inet_serv (const char *servicename, const struct gaih_typeproto *tp, &rc, &herrno, NULL, &localcanon)); \ if (rc != ERANGE || herrno != NETDB_INTERNAL) \ break; \ - tmpbuf = extend_alloca (tmpbuf, tmpbuflen, 2 * tmpbuflen); \ + if (!malloc_tmpbuf && __libc_use_alloca (alloca_used + 2 * tmpbuflen)) \ + tmpbuf = extend_alloca_account (tmpbuf, tmpbuflen, 2 * tmpbuflen, \ + alloca_used); \ + else \ + { \ + char *newp = realloc (malloc_tmpbuf ? tmpbuf : NULL, \ + 2 * tmpbuflen); \ + if (newp == NULL) \ + { \ + result = -EAI_MEMORY; \ + goto free_and_return; \ + } \ + tmpbuf = newp; \ + malloc_tmpbuf = true; \ + tmpbuflen = 2 * tmpbuflen; \ + } \ } \ if (status == NSS_STATUS_SUCCESS && rc == 0) \ h = &th; \ @@ -207,8 +222,9 @@ gaih_inet_serv (const char *servicename, const struct gaih_typeproto *tp, if (herrno == NETDB_INTERNAL) \ { \ __set_h_errno (herrno); \ - _res.options = old_res_options; \ - return -EAI_SYSTEM; \ + _res.options |= old_res_options & RES_USE_INET6; \ + result = -EAI_SYSTEM; \ + goto free_and_return; \ } \ if (herrno == TRY_AGAIN) \ no_data = EAI_AGAIN; \ @@ -278,6 +294,7 @@ gaih_inet (const char *name, const struct gaih_service *service, bool got_ipv6 = false; const char *canon = NULL; const char *orig_name = name; + size_t alloca_used = 0; if (req->ai_protocol || req->ai_socktype) { @@ -310,7 +327,7 @@ gaih_inet (const char *name, const struct gaih_service *service, if (tp->name[0]) { st = (struct gaih_servtuple *) - __alloca (sizeof (struct gaih_servtuple)); + alloca_account (sizeof (struct gaih_servtuple), alloca_used); if ((rc = gaih_inet_serv (service->name, tp, req, st))) return rc; @@ -334,7 +351,8 @@ gaih_inet (const char *name, const struct gaih_service *service, continue; newp = (struct gaih_servtuple *) - __alloca (sizeof (struct gaih_servtuple)); + alloca_account (sizeof (struct gaih_servtuple), + alloca_used); if ((rc = gaih_inet_serv (service->name, tp, req, newp))) { @@ -362,7 +380,7 @@ gaih_inet (const char *name, const struct gaih_service *service, if (req->ai_socktype || req->ai_protocol) { - st = __alloca (sizeof (struct gaih_servtuple)); + st = alloca_account (sizeof (struct gaih_servtuple), alloca_used); st->next = NULL; st->socktype = tp->socktype; st->protocol = ((tp->protoflag & GAI_PROTO_PROTOANY) @@ -379,7 +397,8 @@ gaih_inet (const char *name, const struct gaih_service *service, { struct gaih_servtuple *newp; - newp = __alloca (sizeof (struct gaih_servtuple)); + newp = alloca_account (sizeof (struct gaih_servtuple), + alloca_used); newp->next = NULL; newp->socktype = tp->socktype; newp->protocol = tp->protocol; @@ -391,10 +410,17 @@ gaih_inet (const char *name, const struct gaih_service *service, } } + bool malloc_name = false; + bool malloc_addrmem = false; + struct gaih_addrtuple *addrmem = NULL; + bool malloc_canonbuf = false; + char *canonbuf = NULL; + bool malloc_tmpbuf = false; + char *tmpbuf = NULL; + int result = 0; if (name != NULL) { - at = __alloca (sizeof (struct gaih_addrtuple)); - + at = alloca_account (sizeof (struct gaih_addrtuple), alloca_used); at->family = AF_UNSPEC; at->scopeid = 0; at->next = NULL; @@ -412,6 +438,7 @@ gaih_inet (const char *name, const struct gaih_service *service, rc = __idna_to_ascii_lz (name, &p, idn_flags); if (rc != IDNA_SUCCESS) { + /* No need to jump to free_and_return here. */ if (rc == IDNA_MALLOC_ERROR) return -EAI_MEMORY; if (rc == IDNA_DLOPEN_ERROR) @@ -422,8 +449,8 @@ gaih_inet (const char *name, const struct gaih_service *service, no new string has been allocated. */ if (p != name) { - name = strdupa (p); - free (p); + name = p; + malloc_name = true; } } #endif @@ -441,23 +468,59 @@ gaih_inet (const char *name, const struct gaih_service *service, at->family = AF_INET6; } else - return -EAI_ADDRFAMILY; + { + result = -EAI_ADDRFAMILY; + goto free_and_return; + } if (req->ai_flags & AI_CANONNAME) canon = name; } else if (at->family == AF_UNSPEC) { - char *namebuf = (char *) name; char *scope_delim = strchr (name, SCOPE_DELIMITER); + int e; - if (__builtin_expect (scope_delim != NULL, 0)) - { - namebuf = alloca (scope_delim - name + 1); - *((char *) __mempcpy (namebuf, name, scope_delim - name)) = '\0'; - } + { + bool malloc_namebuf = false; + char *namebuf = (char *) name; + + if (__builtin_expect (scope_delim != NULL, 0)) + { + if (malloc_name) + *scope_delim = '\0'; + else + { + if (__libc_use_alloca (alloca_used + + scope_delim - name + 1)) + { + namebuf = alloca_account (scope_delim - name + 1, + alloca_used); + *((char *) __mempcpy (namebuf, name, + scope_delim - name)) = '\0'; + } + else + { + namebuf = strndup (name, scope_delim - name); + if (namebuf == NULL) + { + assert (!malloc_name); + return -EAI_MEMORY; + } + malloc_namebuf = true; + } + } + } + + e = inet_pton (AF_INET6, namebuf, at->addr); - if (inet_pton (AF_INET6, namebuf, at->addr) > 0) + if (malloc_namebuf) + free (namebuf); + else if (scope_delim != NULL && malloc_name) + /* Undo what we did above. */ + *scope_delim = SCOPE_DELIMITER; + } + if (e > 0) { if (req->ai_family == AF_UNSPEC || req->ai_family == AF_INET6) at->family = AF_INET6; @@ -468,7 +531,10 @@ gaih_inet (const char *name, const struct gaih_service *service, at->family = AF_INET; } else - return -EAI_ADDRFAMILY; + { + result = -EAI_ADDRFAMILY; + goto free_and_return; + } if (scope_delim != NULL) { @@ -490,7 +556,10 @@ gaih_inet (const char *name, const struct gaih_service *service, at->scopeid = (uint32_t) strtoul (scope_delim + 1, &end, 10); if (*end != '\0') - return GAIH_OKIFUNSPEC | -EAI_NONAME; + { + result = GAIH_OKIFUNSPEC | -EAI_NONAME; + goto free_and_return; + } } } @@ -510,53 +579,81 @@ gaih_inet (const char *name, const struct gaih_service *service, int no_more; int old_res_options; - /* If we do not have to look for IPv4 and IPv6 together, use - the simple, old functions. */ - if (req->ai_family == AF_INET - || (req->ai_family == AF_INET6 - && ((req->ai_flags & AI_V4MAPPED) == 0 - || (req->ai_flags & AI_ALL) == 0))) + /* If we do not have to look for IPv6 addresses, use + the simple, old functions, which do not support + IPv6 scope ids. */ + if (req->ai_family == AF_INET) { int family = req->ai_family; size_t tmpbuflen = 512; - char *tmpbuf = alloca (tmpbuflen); + assert (tmpbuf == NULL); + tmpbuf = alloca_account (tmpbuflen, alloca_used); int rc; struct hostent th; struct hostent *h; int herrno; - simple_again: while (1) { rc = __gethostbyname2_r (name, family, &th, tmpbuf, tmpbuflen, &h, &herrno); if (rc != ERANGE || herrno != NETDB_INTERNAL) break; - tmpbuf = extend_alloca (tmpbuf, tmpbuflen, 2 * tmpbuflen); + + if (!malloc_tmpbuf + && __libc_use_alloca (alloca_used + 2 * tmpbuflen)) + tmpbuf = extend_alloca_account (tmpbuf, tmpbuflen, + 2 * tmpbuflen, + alloca_used); + else + { + char *newp = realloc (malloc_tmpbuf ? tmpbuf : NULL, + 2 * tmpbuflen); + if (newp == NULL) + { + result = -EAI_MEMORY; + goto free_and_return; + } + tmpbuf = newp; + malloc_tmpbuf = true; + tmpbuflen = 2 * tmpbuflen; + } } if (rc == 0) { - if (h == NULL) + if (h != NULL) { - if (req->ai_family == AF_INET6 - && (req->ai_flags & AI_V4MAPPED) - && family == AF_INET6) + int i; + /* We found data, count the number of addresses. */ + for (i = 0; h->h_addr_list[i]; ++i) + ; + if (i > 0 && *pat != NULL) + --i; + + if (__libc_use_alloca (alloca_used + + i * sizeof (struct gaih_addrtuple))) + addrmem = alloca_account (i * sizeof (struct gaih_addrtuple), + alloca_used); + else { - /* Try again, this time looking for IPv4 - addresses. */ - family = AF_INET; - goto simple_again; + addrmem = malloc (i + * sizeof (struct gaih_addrtuple)); + if (addrmem == NULL) + { + result = -EAI_MEMORY; + goto free_and_return; + } + malloc_addrmem = true; } - } - else - { - /* We found data, now convert it into the list. */ - for (int i = 0; h->h_addr_list[i]; ++i) + + /* Now convert it into the list. */ + struct gaih_addrtuple *addrfree = addrmem; + for (i = 0; h->h_addr_list[i]; ++i) { if (*pat == NULL) { - *pat = __alloca (sizeof (struct gaih_addrtuple)); + *pat = addrfree++; (*pat)->scopeid = 0; } (*pat)->next = NULL; @@ -581,15 +678,16 @@ gaih_inet (const char *name, const struct gaih_service *service, if (herrno == NETDB_INTERNAL) { __set_h_errno (herrno); - return -EAI_SYSTEM; - } - if (herrno == TRY_AGAIN) - { - return -EAI_AGAIN; + result = -EAI_SYSTEM; } - /* We made requests but they turned out no data. - The name is known, though. */ - return GAIH_OKIFUNSPEC | -EAI_NODATA; + else if (herrno == TRY_AGAIN) + result = -EAI_AGAIN; + else + /* We made requests but they turned out no data. + The name is known, though. */ + result = GAIH_OKIFUNSPEC | -EAI_NODATA; + + goto free_and_return; } goto process_list; @@ -613,21 +711,56 @@ gaih_inet (const char *name, const struct gaih_service *service, bool added_canon = (req->ai_flags & AI_CANONNAME) == 0; char *addrs = air->addrs; + if (__libc_use_alloca (alloca_used + + air->naddrs * sizeof (struct gaih_addrtuple))) + addrmem = alloca_account (air->naddrs + * sizeof (struct gaih_addrtuple), + alloca_used); + else + { + addrmem = malloc (air->naddrs + * sizeof (struct gaih_addrtuple)); + if (addrmem == NULL) + { + result = -EAI_MEMORY; + goto free_and_return; + } + malloc_addrmem = true; + } + + struct gaih_addrtuple *addrfree = addrmem; for (int i = 0; i < air->naddrs; ++i) { socklen_t size = (air->family[i] == AF_INET ? INADDRSZ : IN6ADDRSZ); if (*pat == NULL) { - *pat = __alloca (sizeof (struct gaih_addrtuple)); + *pat = addrfree++; (*pat)->scopeid = 0; } uint32_t *pataddr = (*pat)->addr; (*pat)->next = NULL; if (added_canon || air->canon == NULL) (*pat)->name = NULL; - else - canon = (*pat)->name = strdupa (air->canon); + else if (canonbuf == NULL) + { + size_t canonlen = strlen (air->canon) + 1; + if ((req->ai_flags & AI_CANONIDN) != 0 + && __libc_use_alloca (alloca_used + canonlen)) + canonbuf = alloca_account (canonlen, alloca_used); + else + { + canonbuf = malloc (canonlen); + if (canonbuf == NULL) + { + result = -EAI_MEMORY; + goto free_and_return; + } + malloc_canonbuf = true; + } + canon = (*pat)->name = memcpy (canonbuf, air->canon, + canonlen); + } if (air->family[i] == AF_INET && req->ai_family == AF_INET6 @@ -657,20 +790,26 @@ gaih_inet (const char *name, const struct gaih_service *service, free (air); if (at->family == AF_UNSPEC) - return GAIH_OKIFUNSPEC | -EAI_NONAME; + { + result = GAIH_OKIFUNSPEC | -EAI_NONAME; + goto free_and_return; + } goto process_list; } else if (err == 0) /* The database contains a negative entry. */ - return 0; + goto free_and_return; else if (__nss_not_use_nscd_hosts == 0) { if (herrno == NETDB_INTERNAL && errno == ENOMEM) - return -EAI_MEMORY; - if (herrno == TRY_AGAIN) - return -EAI_AGAIN; - return -EAI_SYSTEM; + result = -EAI_MEMORY; + else if (herrno == TRY_AGAIN) + result = -EAI_AGAIN; + else + result = -EAI_SYSTEM; + + goto free_and_return; } } #endif @@ -699,13 +838,30 @@ gaih_inet (const char *name, const struct gaih_service *service, _res.options &= ~RES_USE_INET6; size_t tmpbuflen = 1024; - char *tmpbuf = alloca (tmpbuflen); + malloc_tmpbuf = !__libc_use_alloca (alloca_used + tmpbuflen); + assert (tmpbuf == NULL); + if (!malloc_tmpbuf) + tmpbuf = alloca_account (tmpbuflen, alloca_used); + else + { + tmpbuf = malloc (tmpbuflen); + if (tmpbuf == NULL) + { + result = -EAI_MEMORY; + goto free_and_return; + } + } while (!no_more) { no_data = 0; - nss_gethostbyname4_r fct4 - = __nss_lookup_function (nip, "gethostbyname4_r"); + nss_gethostbyname4_r fct4 = NULL; + + /* gethostbyname4_r sends out parallel A and AAAA queries and + is thus only suitable for PF_UNSPEC. */ + if (req->ai_family == PF_UNSPEC) + fct4 = __nss_lookup_function (nip, "gethostbyname4_r"); + if (fct4 != NULL) { int herrno; @@ -728,20 +884,65 @@ gaih_inet (const char *name, const struct gaih_service *service, no_data = herrno == NO_DATA; break; } - tmpbuf = extend_alloca (tmpbuf, - tmpbuflen, 2 * tmpbuflen); - } - no_inet6_data = no_data; + if (!malloc_tmpbuf + && __libc_use_alloca (alloca_used + 2 * tmpbuflen)) + tmpbuf = extend_alloca_account (tmpbuf, tmpbuflen, + 2 * tmpbuflen, + alloca_used); + else + { + char *newp = realloc (malloc_tmpbuf ? tmpbuf : NULL, + 2 * tmpbuflen); + if (newp == NULL) + { + result = -EAI_MEMORY; + goto free_and_return; + } + tmpbuf = newp; + malloc_tmpbuf = true; + tmpbuflen = 2 * tmpbuflen; + } + } if (status == NSS_STATUS_SUCCESS) { + assert (!no_data); + no_data = 1; + if ((req->ai_flags & AI_CANONNAME) != 0 && canon == NULL) canon = (*pat)->name; while (*pat != NULL) - pat = &((*pat)->next); + { + if ((*pat)->family == AF_INET + && req->ai_family == AF_INET6 + && (req->ai_flags & AI_V4MAPPED) != 0) + { + uint32_t *pataddr = (*pat)->addr; + (*pat)->family = AF_INET6; + pataddr[3] = pataddr[0]; + pataddr[2] = htonl (0xffff); + pataddr[1] = 0; + pataddr[0] = 0; + pat = &((*pat)->next); + no_data = 0; + } + else if (req->ai_family == AF_UNSPEC + || (*pat)->family == req->ai_family) + { + pat = &((*pat)->next); + + no_data = 0; + if (req->ai_family == AF_INET6) + got_ipv6 = true; + } + else + *pat = ((*pat)->next); + } } + + no_inet6_data = no_data; } else { @@ -804,18 +1005,40 @@ gaih_inet (const char *name, const struct gaih_service *service, if (cfct != NULL) { const size_t max_fqdn_len = 256; - char *buf = alloca (max_fqdn_len); + if ((req->ai_flags & AI_CANONIDN) != 0 + && __libc_use_alloca (alloca_used + + max_fqdn_len)) + canonbuf = alloca_account (max_fqdn_len, + alloca_used); + else + { + canonbuf = malloc (max_fqdn_len); + if (canonbuf == NULL) + { + result = -EAI_MEMORY; + goto free_and_return; + } + malloc_canonbuf = true; + } char *s; if (DL_CALL_FCT (cfct, (at->name ?: name, - buf, max_fqdn_len, + canonbuf, + max_fqdn_len, &s, &rc, &herrno)) == NSS_STATUS_SUCCESS) canon = s; else - /* Set to name now to avoid using - gethostbyaddr. */ - canon = name; + { + /* Set to name now to avoid using + gethostbyaddr. */ + if (malloc_canonbuf) + { + free (canonbuf); + malloc_canonbuf = false; + } + canon = name; + } } } status = NSS_STATUS_SUCCESS; @@ -844,28 +1067,33 @@ gaih_inet (const char *name, const struct gaih_service *service, nip = nip->next; } - _res.options = old_res_options; + _res.options |= old_res_options & RES_USE_INET6; if (no_data != 0 && no_inet6_data != 0) { /* If both requests timed out report this. */ if (no_data == EAI_AGAIN && no_inet6_data == EAI_AGAIN) - return -EAI_AGAIN; + result = -EAI_AGAIN; + else + /* We made requests but they turned out no data. The name + is known, though. */ + result = GAIH_OKIFUNSPEC | -EAI_NODATA; - /* We made requests but they turned out no data. The name - is known, though. */ - return GAIH_OKIFUNSPEC | -EAI_NODATA; + goto free_and_return; } } process_list: if (at->family == AF_UNSPEC) - return GAIH_OKIFUNSPEC | -EAI_NONAME; + { + result = GAIH_OKIFUNSPEC | -EAI_NONAME; + goto free_and_return; + } } else { struct gaih_addrtuple *atr; - atr = at = __alloca (sizeof (struct gaih_addrtuple)); + atr = at = alloca_account (sizeof (struct gaih_addrtuple), alloca_used); memset (at, '\0', sizeof (struct gaih_addrtuple)); if (req->ai_family == AF_UNSPEC) @@ -904,30 +1132,56 @@ gaih_inet (const char *name, const struct gaih_service *service, /* Only the first entry gets the canonical name. */ if (at2 == at && (req->ai_flags & AI_CANONNAME) != 0) { + char *tmpbuf2 = NULL; + bool malloc_tmpbuf2 = false; + if (canon == NULL) { struct hostent *h = NULL; int herrno; struct hostent th; - size_t tmpbuflen = 512; - char *tmpbuf = NULL; + size_t tmpbuf2len = 512; do { - tmpbuf = extend_alloca (tmpbuf, tmpbuflen, tmpbuflen * 2); + if (__libc_use_alloca (alloca_used + 2 * tmpbuf2len)) + tmpbuf2 = extend_alloca_account (tmpbuf2, tmpbuf2len, + tmpbuf2len * 2, + alloca_used); + else + { + char *newp = realloc (malloc_tmpbuf2 ? tmpbuf2 : NULL, + 2 * tmpbuf2len); + if (newp == NULL) + { + if (malloc_tmpbuf2) + free (tmpbuf2); + result = -EAI_MEMORY; + goto free_and_return; + } + + tmpbuf2 = newp; + tmpbuf2len = 2 * tmpbuf2len; + malloc_tmpbuf2 = true; + } + rc = __gethostbyaddr_r (at2->addr, ((at2->family == AF_INET6) ? sizeof (struct in6_addr) : sizeof (struct in_addr)), - at2->family, &th, tmpbuf, - tmpbuflen, &h, &herrno); + at2->family, &th, tmpbuf2, + tmpbuf2len, &h, &herrno); } while (rc == ERANGE && herrno == NETDB_INTERNAL); if (rc != 0 && herrno == NETDB_INTERNAL) { + if (malloc_tmpbuf2) + free (tmpbuf2); + __set_h_errno (herrno); - return -EAI_SYSTEM; + result = -EAI_SYSTEM; + goto free_and_return; } if (h != NULL) @@ -954,11 +1208,16 @@ gaih_inet (const char *name, const struct gaih_service *service, int rc = __idna_to_unicode_lzlz (canon, &out, idn_flags); if (rc != IDNA_SUCCESS) { + if (malloc_tmpbuf2) + free (tmpbuf2); + if (rc == IDNA_MALLOC_ERROR) - return -EAI_MEMORY; - if (rc == IDNA_DLOPEN_ERROR) - return -EAI_SYSTEM; - return -EAI_IDN_ENCODE; + result = -EAI_MEMORY; + else if (rc == IDNA_DLOPEN_ERROR) + result = -EAI_SYSTEM; + else + result = -EAI_IDN_ENCODE; + goto free_and_return; } /* In case the output string is the same as the input string no new string has been allocated and we @@ -973,10 +1232,25 @@ gaih_inet (const char *name, const struct gaih_service *service, #ifdef HAVE_LIBIDN make_copy: #endif - canon = strdup (canon); - if (canon == NULL) - return -EAI_MEMORY; + if (malloc_canonbuf) + /* We already allocated the string using malloc. */ + malloc_canonbuf = false; + else + { + canon = strdup (canon); + if (canon == NULL) + { + if (malloc_tmpbuf2) + free (tmpbuf2); + + result = -EAI_MEMORY; + goto free_and_return; + } + } } + + if (malloc_tmpbuf2) + free (tmpbuf2); } family = at2->family; @@ -1002,7 +1276,8 @@ gaih_inet (const char *name, const struct gaih_service *service, if (ai == NULL) { free ((char *) canon); - return -EAI_MEMORY; + result = -EAI_MEMORY; + goto free_and_return; } ai->ai_flags = req->ai_flags; @@ -1055,7 +1330,18 @@ gaih_inet (const char *name, const struct gaih_service *service, at2 = at2->next; } } - return 0; + + free_and_return: + if (malloc_name) + free ((char *) name); + if (malloc_addrmem) + free (addrmem); + if (malloc_canonbuf) + free (canonbuf); + if (malloc_tmpbuf) + free (tmpbuf); + + return result; } @@ -1101,10 +1387,6 @@ static const struct scopeentry /* Link-local addresses: scope 2. */ { { { 169, 254, 0, 0 } }, htonl_c (0xffff0000), 2 }, { { { 127, 0, 0, 0 } }, htonl_c (0xff000000), 2 }, - /* Site-local addresses: scope 5. */ - { { { 10, 0, 0, 0 } }, htonl_c (0xff000000), 5 }, - { { { 172, 16, 0, 0 } }, htonl_c (0xfff00000), 5 }, - { { { 192, 168, 0, 0 } }, htonl_c (0xffff0000), 5 }, /* Default: scope 14. */ { { { 0, 0, 0, 0 } }, htonl_c (0x00000000), 14 } }; @@ -1456,13 +1738,13 @@ rfc3484_sort (const void *p1, const void *p2, void *arg) /* Fill in the results in all the records. */ for (int i = 0; i < src->nresults; ++i) - if (src->results[i].index == a1_index) + if (a1_index != -1 && src->results[i].index == a1_index) { assert (src->results[i].native == -1 || src->results[i].native == a1_native); src->results[i].native = a1_native; } - else if (src->results[i].index == a2_index) + else if (a2_index != -1 && src->results[i].index == a2_index) { assert (src->results[i].native == -1 || src->results[i].native == a2_native); @@ -2183,11 +2465,27 @@ getaddrinfo (const char *name, const char *service, __typeof (once) old_once = once; __libc_once (once, gaiconf_init); /* Sort results according to RFC 3484. */ - struct sort_result results[nresults]; - size_t order[nresults]; + struct sort_result *results; + size_t *order; struct addrinfo *q; struct addrinfo *last = NULL; char *canonname = NULL; + bool malloc_results; + + malloc_results + = !__libc_use_alloca (nresults * (sizeof (*results) + sizeof (size_t))); + if (malloc_results) + { + results = malloc (nresults * (sizeof (*results) + sizeof (size_t))); + if (results == NULL) + { + free (in6ai); + return EAI_MEMORY; + } + } + else + results = alloca (nresults * (sizeof (*results) + sizeof (size_t))); + order = (size_t *) (results + nresults); /* If we have information about deprecated and temporary addresses sort the array now. */ @@ -2243,8 +2541,20 @@ getaddrinfo (const char *name, const char *service, } socklen_t sl = sizeof (results[i].source_addr); +#ifdef __FreeBSD_kernel__ + struct sockaddr_in6 sa_in6; + const struct sockaddr *sa = &sa_in6; + memcpy(&sa_in6, q->ai_addr, q->ai_family == AF_INET6 ? + sizeof(struct sockaddr_in6) : sizeof(struct sockaddr_in)); + /* The FreeBSD kernel doesn't allow connections on port 0. Use + port 1 instead, as on the FreeBSD libc. */ + if (sa_in6.sin6_port == htons(0)) + sa_in6.sin6_port = htons(1); +#else + const struct sockaddr *sa = q->ai_addr; +#endif if (fd != -1 - && __connect (fd, q->ai_addr, q->ai_addrlen) == 0 + && __connect (fd, sa, q->ai_addrlen) == 0 && __getsockname (fd, (struct sockaddr *) &results[i].source_addr, &sl) == 0) @@ -2265,7 +2575,14 @@ getaddrinfo (const char *name, const char *service, tmp.addr[0] = 0; tmp.addr[1] = 0; tmp.addr[2] = htonl (0xffff); - tmp.addr[3] = sinp->sin_addr.s_addr; + /* Special case for lo interface, the source address + being possibly different than the interface + address. */ + if ((ntohl(sinp->sin_addr.s_addr) & 0xff000000) + == 0x7f000000) + tmp.addr[3] = htonl(0x7f000001); + else + tmp.addr[3] = sinp->sin_addr.s_addr; } else { @@ -2338,7 +2655,7 @@ getaddrinfo (const char *name, const char *service, __libc_lock_define_initialized (static, lock); __libc_lock_lock (lock); - if (old_once && gaiconf_reload_flag) + if (__libc_once_get(old_once) && gaiconf_reload_flag) gaiconf_reload (); qsort_r (order, nresults, sizeof (order[0]), rfc3484_sort, &src); __libc_lock_unlock (lock); @@ -2354,6 +2671,9 @@ getaddrinfo (const char *name, const char *service, /* Fill in the canonical name into the new first entry. */ p->ai_canonname = canonname; + + if (malloc_results) + free (results); } free (in6ai); diff --git a/sysdeps/powerpc/dl-tls.h b/sysdeps/powerpc/dl-tls.h index 957d4b4..441a736 100644 --- a/sysdeps/powerpc/dl-tls.h +++ b/sysdeps/powerpc/dl-tls.h @@ -17,6 +17,8 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ +#ifndef _PPC_DL_TLS_H +# define _PPC_DL_TLS_H 1 /* Type used for the representation of TLS information in the TOC. */ typedef struct @@ -47,3 +49,8 @@ extern void *__tls_get_addr (tls_index *ti); # define GET_ADDR_OFFSET (ti->ti_offset + TLS_DTV_OFFSET) # define __TLS_GET_ADDR(__ti) (__tls_get_addr (__ti) - TLS_DTV_OFFSET) #endif + +/* Value used for dtv entries for which the allocation is delayed. */ +#define TLS_DTV_UNALLOCATED ((void *) -1l) + +#endif /* dl-tls.h */ diff --git a/sysdeps/powerpc/powerpc32/dl-irel.h b/sysdeps/powerpc/powerpc32/dl-irel.h index 3f204cd..a31e1ed 100644 --- a/sysdeps/powerpc/powerpc32/dl-irel.h +++ b/sysdeps/powerpc/powerpc32/dl-irel.h @@ -26,6 +26,13 @@ #define ELF_MACHINE_IRELA 1 +static inline Elf32_Addr +__attribute ((always_inline)) +elf_ifunc_invoke (Elf32_Addr addr) +{ + return ((Elf32_Addr (*) (void)) (addr)) (); +} + static inline void __attribute ((always_inline)) elf_irela (const Elf32_Rela *reloc) @@ -35,7 +42,7 @@ elf_irela (const Elf32_Rela *reloc) if (__builtin_expect (r_type == R_PPC_IRELATIVE, 1)) { Elf32_Addr *const reloc_addr = (void *) reloc->r_offset; - Elf32_Addr value = ((Elf32_Addr (*) (void)) reloc->r_addend) (); + Elf32_Addr value = elf_ifunc_invoke(reloc->r_addend); *reloc_addr = value; } else diff --git a/sysdeps/powerpc/powerpc32/dl-trampoline.S b/sysdeps/powerpc/powerpc32/dl-trampoline.S index 6a158c3..bd815c7 100644 --- a/sysdeps/powerpc/powerpc32/dl-trampoline.S +++ b/sysdeps/powerpc/powerpc32/dl-trampoline.S @@ -137,6 +137,7 @@ _dl_prof_resolve: stw r9,40(r1) stw r10,44(r1) stw r0,8(r1) +#ifndef __NO_FPRS__ # Save the floating point registers stfd fp1,48(r1) stfd fp2,56(r1) @@ -146,6 +147,7 @@ _dl_prof_resolve: stfd fp6,88(r1) stfd fp7,96(r1) stfd fp8,104(r1) +#endif # XXX TODO: store vmx registers # Load the extra parameters. addi r6,r1,16 @@ -169,6 +171,7 @@ _dl_prof_resolve: lwz r4,20(r1) lwz r3,16(r1) lwz r0,12(r1) +#ifndef __NO_FPRS__ # Load the floating point registers. lfd fp1,48(r1) lfd fp2,56(r1) @@ -178,6 +181,7 @@ _dl_prof_resolve: lfd fp6,88(r1) lfd fp7,96(r1) lfd fp8,104(r1) +#endif # ...unwind the stack frame, and jump to the PLT entry we updated. addi r1,r1,320 bctr diff --git a/sysdeps/powerpc/powerpc64/dl-irel.h b/sysdeps/powerpc/powerpc64/dl-irel.h index 6cded50..56e1cc5 100644 --- a/sysdeps/powerpc/powerpc64/dl-irel.h +++ b/sysdeps/powerpc/powerpc64/dl-irel.h @@ -23,15 +23,17 @@ #include #include +#include +#include #define ELF_MACHINE_IRELA 1 -typedef struct +static inline Elf64_Addr +__attribute ((always_inline)) +elf_ifunc_invoke (Elf64_Addr addr) { - Elf64_Addr fd_func; - Elf64_Addr fd_toc; - Elf64_Addr fd_aux; -} Elf64_FuncDesc; + return ((Elf64_Addr (*) (void)) (addr)) (); +} static inline void __attribute ((always_inline)) @@ -42,13 +44,13 @@ elf_irela (const Elf64_Rela *reloc) if (__builtin_expect (r_type == R_PPC64_IRELATIVE, 1)) { Elf64_Addr *const reloc_addr = (void *) reloc->r_offset; - Elf64_Addr value = ((Elf64_Addr (*) (void)) reloc->r_addend) (); + Elf64_Addr value = elf_ifunc_invoke(reloc->r_addend); *reloc_addr = value; } else if (__builtin_expect (r_type == R_PPC64_JMP_IREL, 1)) { Elf64_Addr *const reloc_addr = (void *) reloc->r_offset; - Elf64_Addr value = ((Elf64_Addr (*) (void)) reloc->r_addend) (); + Elf64_Addr value = elf_ifunc_invoke(reloc->r_addend); *(Elf64_FuncDesc *) reloc_addr = *(Elf64_FuncDesc *) value; } else diff --git a/sysdeps/powerpc/powerpc64/power7/Makefile b/sysdeps/powerpc/powerpc64/power7/Makefile new file mode 100644 index 0000000..b0f4520 --- /dev/null +++ b/sysdeps/powerpc/powerpc64/power7/Makefile @@ -0,0 +1,5 @@ +ifeq ($(subdir),elf) +# Prevent the use of VSX registers and insns in _dl_start, which under -O3 +# optimization may require a TOC reference before relocations are resolved. +CFLAGS-rtld.c += -mno-vsx +endif diff --git a/sysdeps/s390/dl-tls.h b/sysdeps/s390/dl-tls.h index 0560462..deeb192 100644 --- a/sysdeps/s390/dl-tls.h +++ b/sysdeps/s390/dl-tls.h @@ -75,3 +75,6 @@ __tls_get_offset:\n\ + (unsigned long) __builtin_thread_pointer (); }) #endif + +/* Value used for dtv entries for which the allocation is delayed. */ +#define TLS_DTV_UNALLOCATED ((void *) -1l) diff --git a/sysdeps/s390/fpu/libm-test-ulps b/sysdeps/s390/fpu/libm-test-ulps index 989722e..444cc3d 100644 --- a/sysdeps/s390/fpu/libm-test-ulps +++ b/sysdeps/s390/fpu/libm-test-ulps @@ -338,9 +338,9 @@ ildouble: 2 ldouble: 2 Test "Real part of: cpow (2 + 3 i, 4 + 0 i) == -119.0 - 120.0 i": double: 1 -float: 4 +float: 5 idouble: 1 -ifloat: 4 +ifloat: 5 ildouble: 3 ldouble: 3 Test "Imaginary part of: cpow (2 + 3 i, 4 + 0 i) == -119.0 - 120.0 i": @@ -1117,9 +1117,9 @@ ldouble: 1 Function: Real part of "cpow": double: 2 -float: 4 +float: 5 idouble: 2 -ifloat: 4 +ifloat: 5 ildouble: 10 ldouble: 10 diff --git a/sysdeps/s390/s390-32/Makefile b/sysdeps/s390/s390-32/Makefile index 057862d..5897dcd 100644 --- a/sysdeps/s390/s390-32/Makefile +++ b/sysdeps/s390/s390-32/Makefile @@ -9,3 +9,11 @@ CFLAGS-rtld.c += -Wno-uninitialized -Wno-unused CFLAGS-dl-load.c += -Wno-unused CFLAGS-dl-reloc.c += -Wno-unused endif + +ifeq ($(subdir),csu) +ifeq (yes,$(build-shared)) +# Compatibility +sysdep_routines += libgcc-compat +shared-only-routines += libgcc-compat +endif +endif diff --git a/sysdeps/s390/s390-32/Versions b/sysdeps/s390/s390-32/Versions index 2b020f8..55b3386 100644 --- a/sysdeps/s390/s390-32/Versions +++ b/sysdeps/s390/s390-32/Versions @@ -2,5 +2,13 @@ libc { GLIBC_2.0 { # Functions from libgcc. __divdi3; __moddi3; __udivdi3; __umoddi3; + __cmpdi2; + __fixdfdi; + __fixsfdi; + __fixunsdfdi; + __fixunssfdi; + __floatdidf; + __floatdisf; + __ucmpdi2; } } diff --git a/sysdeps/s390/s390-32/libgcc-compat.c b/sysdeps/s390/s390-32/libgcc-compat.c new file mode 100644 index 0000000..72e2662 --- /dev/null +++ b/sysdeps/s390/s390-32/libgcc-compat.c @@ -0,0 +1,83 @@ +/* pre-.hidden libgcc compatibility + Copyright (C) 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by GOTO Masanori + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + + +#include +#include + +#if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_2_6) + +extern int32_t __cmpdi2 (int64_t, int64_t); +int32_t __cmpdi2_internal (int64_t u, int64_t v) +{ + return __cmpdi2 (u, v); +} +symbol_version (__cmpdi2_internal, __cmpdi2, GLIBC_2.0); + +extern int64_t __fixdfdi (double); +int64_t __fixdfdi_internal (double d) +{ + return __fixdfdi (d); +} +symbol_version (__fixdfdi_internal, __fixdfdi, GLIBC_2.0); + +extern int64_t __fixsfdi (float); +int64_t __fixsfdi_internal (float d) +{ + return __fixsfdi (d); +} +symbol_version (__fixsfdi_internal, __fixsfdi, GLIBC_2.0); + +extern int64_t __fixunsdfdi (double); +int64_t __fixunsdfdi_internal (double d) +{ + return __fixunsdfdi (d); +} +symbol_version (__fixunsdfdi_internal, __fixunsdfdi, GLIBC_2.0); + +extern int64_t __fixunssfdi (float); +int64_t __fixunssfdi_internal (float d) +{ + return __fixunssfdi (d); +} +symbol_version (__fixunssfdi_internal, __fixunssfdi, GLIBC_2.0); + +extern double __floatdidf (int64_t); +double __floatdidf_internal (int64_t u) +{ + return __floatdidf (u); +} +symbol_version (__floatdidf_internal, __floatdidf, GLIBC_2.0); + +extern float __floatdisf (int64_t); +float __floatdisf_internal (int64_t u) +{ + return __floatdisf (u); +} +symbol_version (__floatdisf_internal, __floatdisf, GLIBC_2.0); + +extern int32_t __ucmpdi2 (int64_t, int64_t); +int32_t __ucmpdi2_internal (int64_t u, int64_t v) +{ + return __ucmpdi2 (u, v); +} +symbol_version (__ucmpdi2_internal, __ucmpdi2, GLIBC_2.0); + +#endif diff --git a/sysdeps/s390/s390-64/utf16-utf32-z9.c b/sysdeps/s390/s390-64/utf16-utf32-z9.c index 14daf21..5bcaaae 100644 --- a/sysdeps/s390/s390-64/utf16-utf32-z9.c +++ b/sysdeps/s390/s390-64/utf16-utf32-z9.c @@ -169,7 +169,10 @@ gconv_end (struct __gconv_step *data) register unsigned long long outlen asm("11") = outend - outptr; \ uint64_t cc = 0; \ \ - asm volatile ("0: " INSTRUCTION " \n\t" \ + asm volatile (".machine push \n\t" \ + ".machine \"z9-109\" \n\t" \ + "0: " INSTRUCTION " \n\t" \ + ".machine pop \n\t" \ " jo 0b \n\t" \ " ipm %2 \n" \ : "+a" (pOutput), "+a" (pInput), "+d" (cc), \ diff --git a/sysdeps/s390/s390-64/utf8-utf16-z9.c b/sysdeps/s390/s390-64/utf8-utf16-z9.c index 5f73f3c..812a42f 100644 --- a/sysdeps/s390/s390-64/utf8-utf16-z9.c +++ b/sysdeps/s390/s390-64/utf8-utf16-z9.c @@ -151,7 +151,10 @@ gconv_end (struct __gconv_step *data) register unsigned long long outlen asm("11") = outend - outptr; \ uint64_t cc = 0; \ \ - asm volatile ("0: " INSTRUCTION " \n\t" \ + asm volatile (".machine push \n\t" \ + ".machine \"z9-109\" \n\t" \ + "0: " INSTRUCTION " \n\t" \ + ".machine pop \n\t" \ " jo 0b \n\t" \ " ipm %2 \n" \ : "+a" (pOutput), "+a" (pInput), "+d" (cc), \ diff --git a/sysdeps/s390/s390-64/utf8-utf32-z9.c b/sysdeps/s390/s390-64/utf8-utf32-z9.c index 17ef8bc..0ffd848 100644 --- a/sysdeps/s390/s390-64/utf8-utf32-z9.c +++ b/sysdeps/s390/s390-64/utf8-utf32-z9.c @@ -155,7 +155,10 @@ gconv_end (struct __gconv_step *data) register unsigned long long outlen asm("11") = outend - outptr; \ uint64_t cc = 0; \ \ - asm volatile ("0: " INSTRUCTION " \n\t" \ + asm volatile (".machine push \n\t" \ + ".machine \"z9-109\" \n\t" \ + "0: " INSTRUCTION " \n\t" \ + ".machine pop \n\t" \ " jo 0b \n\t" \ " ipm %2 \n" \ : "+a" (pOutput), "+a" (pInput), "+d" (cc), \ diff --git a/sysdeps/sh/dl-tls.h b/sysdeps/sh/dl-tls.h index 98e2f19..b5e0348 100644 --- a/sysdeps/sh/dl-tls.h +++ b/sysdeps/sh/dl-tls.h @@ -27,3 +27,6 @@ typedef struct extern void *__tls_get_addr (tls_index *ti); + +/* Value used for dtv entries for which the allocation is delayed. */ +#define TLS_DTV_UNALLOCATED ((void *) -1l) diff --git a/sysdeps/sparc/dl-tls.h b/sysdeps/sparc/dl-tls.h index 6edf8d5..0e14762 100644 --- a/sysdeps/sparc/dl-tls.h +++ b/sysdeps/sparc/dl-tls.h @@ -27,3 +27,6 @@ typedef struct extern void *__tls_get_addr (tls_index *ti); + +/* Value used for dtv entries for which the allocation is delayed. */ +#define TLS_DTV_UNALLOCATED ((void *) -1l) diff --git a/sysdeps/sparc/sparc32/Makefile b/sysdeps/sparc/sparc32/Makefile index 6529ad8..e2f0c16 100644 --- a/sysdeps/sparc/sparc32/Makefile +++ b/sysdeps/sparc/sparc32/Makefile @@ -24,6 +24,14 @@ ifeq ($(subdir),csu) CFLAGS-initfini.s += -mcpu=v7 endif +ifeq ($(subdir),csu) +ifeq (yes,$(build-shared)) +# Compatibility +sysdep_routines += libgcc-compat +shared-only-routines += libgcc-compat +endif +endif + # We distribute these files, even though they are generated, # so as to avoid the need for a functioning m4 to build the library. divrem := sdiv udiv rem urem diff --git a/sysdeps/sparc/sparc32/Versions b/sysdeps/sparc/sparc32/Versions index aa36082..a53ff1c 100644 --- a/sysdeps/sparc/sparc32/Versions +++ b/sysdeps/sparc/sparc32/Versions @@ -1,5 +1,9 @@ libc { GLIBC_2.0 { .div; .mul; .rem; .udiv; .umul; .urem; + __divdi3; __moddi3; __udivdi3; __umoddi3; __muldi3; + __ashldi3; __ashrdi3; __lshrdi3; __cmpdi2; __ucmpdi2; + __fixdfdi; __fixsfdi; __fixunsdfdi; __fixunssfdi; + __floatdidf; __floatdisf; } } diff --git a/sysdeps/sparc/sparc32/dl-irel.h b/sysdeps/sparc/sparc32/dl-irel.h index 1891938..4eaaa37 100644 --- a/sysdeps/sparc/sparc32/dl-irel.h +++ b/sysdeps/sparc/sparc32/dl-irel.h @@ -24,9 +24,17 @@ #include #include #include +#include #define ELF_MACHINE_IRELA 1 +static inline Elf32_Addr +__attribute ((always_inline)) +elf_ifunc_invoke (Elf32_Addr addr) +{ + return ((Elf32_Addr (*) (int)) (addr)) (GLRO(dl_hwcap)); +} + static inline void __attribute ((always_inline)) elf_irela (const Elf32_Rela *reloc) @@ -36,13 +44,13 @@ elf_irela (const Elf32_Rela *reloc) if (__builtin_expect (r_type == R_SPARC_IRELATIVE, 1)) { Elf32_Addr *const reloc_addr = (void *) reloc->r_offset; - Elf32_Addr value = ((Elf32_Addr (*) (void)) reloc->r_addend) (); + Elf32_Addr value = elf_ifunc_invoke(reloc->r_addend); *reloc_addr = value; } else if (__builtin_expect (r_type == R_SPARC_JMP_IREL, 1)) { Elf32_Addr *const reloc_addr = (void *) reloc->r_offset; - Elf32_Addr value = ((Elf32_Addr (*) (void)) reloc->r_addend) (); + Elf32_Addr value = elf_ifunc_invoke(reloc->r_addend); sparc_fixup_plt (reloc, reloc_addr, value, 0, 1); } diff --git a/sysdeps/sparc/sparc32/dl-machine.h b/sysdeps/sparc/sparc32/dl-machine.h index 9631db3..f8e8fe4 100644 --- a/sysdeps/sparc/sparc32/dl-machine.h +++ b/sysdeps/sparc/sparc32/dl-machine.h @@ -399,7 +399,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc, && __builtin_expect (ELFW(ST_TYPE) (sym->st_info) == STT_GNU_IFUNC, 0) && __builtin_expect (sym->st_shndx != SHN_UNDEF, 1)) { - value = ((Elf32_Addr (*) (void)) value) (); + value = ((Elf32_Addr (*) (int)) value) (GLRO(dl_hwcap)); } switch (r_type) @@ -430,11 +430,11 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc, *reloc_addr = value; break; case R_SPARC_IRELATIVE: - value = ((Elf32_Addr (*) (void)) value) (); + value = ((Elf32_Addr (*) (int)) value) (GLRO(dl_hwcap)); *reloc_addr = value; break; case R_SPARC_JMP_IREL: - value = ((Elf32_Addr (*) (void)) value) (); + value = ((Elf32_Addr (*) (int)) value) (GLRO(dl_hwcap)); /* Fall thru */ case R_SPARC_JMP_SLOT: { @@ -562,7 +562,7 @@ elf_machine_lazy_rel (struct link_map *map, else if (r_type == R_SPARC_JMP_IREL) { Elf32_Addr value = map->l_addr + reloc->r_addend; - value = ((Elf32_Addr (*) (void)) value) (); + value = ((Elf32_Addr (*) (int)) value) (GLRO(dl_hwcap)); sparc_fixup_plt (reloc, reloc_addr, value, 1, 1); } else if (r_type == R_SPARC_NONE) diff --git a/sysdeps/sparc/sparc32/dl-plt.h b/sysdeps/sparc/sparc32/dl-plt.h index bfb891f..0fbd950 100644 --- a/sysdeps/sparc/sparc32/dl-plt.h +++ b/sysdeps/sparc/sparc32/dl-plt.h @@ -18,6 +18,9 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ +#ifndef _DL_PLT_H +#define _DL_PLT_H + /* Some SPARC opcodes we need to use for self-modifying code. */ #define OPCODE_NOP 0x01000000 /* nop */ #define OPCODE_CALL 0x40000000 /* call ?; add PC-rel word address */ @@ -95,3 +98,5 @@ sparc_fixup_plt (const Elf32_Rela *reloc, Elf32_Addr *reloc_addr, return value; } + +#endif /* dl-plt.h */ diff --git a/sysdeps/sparc/sparc32/hp-timing.h b/sysdeps/sparc/sparc32/hp-timing.h new file mode 100644 index 0000000..344fec5 --- /dev/null +++ b/sysdeps/sparc/sparc32/hp-timing.h @@ -0,0 +1,34 @@ +/* High precision, low overhead timing functions. i386 version. + Copyright (C) 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#ifndef _SPARC_HP_TIMING_H +#define _SPARC_HP_TIMING_H 1 + +#define hp_timing_t hp_timing_t__ +#include +#undef hp_timing_t + +/* We don't use high-precision timers, but we might load an sparcv9 libpthread + which does. */ +#define HP_TIMING_PAD 1 + +/* sparcv9 uses 64bit values for the times. */ +typedef unsigned long long int hp_timing_t; + +#endif /* hp-timing.h */ diff --git a/sysdeps/sparc/sparc32/libgcc-compat.c b/sysdeps/sparc/sparc32/libgcc-compat.c new file mode 100644 index 0000000..3a5f83f --- /dev/null +++ b/sysdeps/sparc/sparc32/libgcc-compat.c @@ -0,0 +1,121 @@ +/* pre-.hidden libgcc compatibility + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Guido Guenther + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + + +#include +#include + +#if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_2_6) + +extern int64_t __ashldi3 (int64_t, int32_t); +int64_t __ashldi3_internal (int64_t u, int32_t b) +{ + return __ashldi3 (u, b); +} +symbol_version (__ashldi3_internal, __ashldi3, GLIBC_2.0); + + +extern int64_t __ashrdi3 (int64_t, int32_t); +int64_t __ashrdi3_internal (int64_t u, int32_t b) +{ + return __ashrdi3 (u, b); +} +symbol_version (__ashrdi3_internal, __ashrdi3, GLIBC_2.0); + + +extern int64_t __lshrdi3 (int64_t, int32_t); +int64_t __lshrdi3_internal (int64_t u, int32_t b) +{ + return __lshrdi3 (u, b); +} +symbol_version (__lshrdi3_internal, __lshrdi3, GLIBC_2.0); + +extern int32_t __cmpdi2 (int64_t, int64_t); +int32_t __cmpdi2_internal (int64_t u, int64_t v) +{ + return __cmpdi2 (u, v); +} +symbol_version (__cmpdi2_internal, __cmpdi2, GLIBC_2.0); + + +extern int32_t __ucmpdi2 (int64_t, int64_t); +int32_t __ucmpdi2_internal (int64_t u, int64_t v) +{ + return __ucmpdi2 (u, v); +} +symbol_version (__ucmpdi2_internal, __ucmpdi2, GLIBC_2.0); + + +extern int64_t __fixdfdi (double); +int64_t __fixdfdi_internal (double d) +{ + return __fixdfdi (d); +} +symbol_version (__fixdfdi_internal, __fixdfdi, GLIBC_2.0); + + +extern int64_t __fixsfdi (float); +int64_t __fixsfdi_internal (float d) +{ + return __fixsfdi (d); +} +symbol_version (__fixsfdi_internal, __fixsfdi, GLIBC_2.0); + + +extern int64_t __fixunsdfdi (double); +int64_t __fixunsdfdi_internal (double d) +{ + return __fixunsdfdi (d); +} +symbol_version (__fixunsdfdi_internal, __fixunsdfdi, GLIBC_2.0); + +extern int64_t __fixunssfdi (float); +int64_t __fixunssfdi_internal (float d) +{ + return __fixunssfdi (d); +} + +symbol_version (__fixunssfdi_internal, __fixunssfdi, GLIBC_2.0); + + +extern double __floatdidf (int64_t); +double __floatdidf_internal (int64_t u) +{ + return __floatdidf (u); +} +symbol_version (__floatdidf_internal, __floatdidf, GLIBC_2.0); + + +extern float floatdisf (int64_t); +float __floatdisf_internal (int64_t u) +{ + return __floatdisf (u); +} +symbol_version (__floatdisf_internal, __floatdisf, GLIBC_2.0); + + +extern int64_t __muldi3 (int64_t, int64_t); +int64_t __muldi3_internal (int64_t u, int64_t v) +{ + return __muldi3 (u, v); +} +symbol_version (__muldi3_internal, __muldi3, GLIBC_2.0); + +#endif diff --git a/sysdeps/sparc/sparc64/dl-irel.h b/sysdeps/sparc/sparc64/dl-irel.h index 1a2a0a3..e356ac6 100644 --- a/sysdeps/sparc/sparc64/dl-irel.h +++ b/sysdeps/sparc/sparc64/dl-irel.h @@ -24,9 +24,17 @@ #include #include #include +#include #define ELF_MACHINE_IRELA 1 +static inline Elf64_Addr +__attribute ((always_inline)) +elf_ifunc_invoke (Elf64_Addr addr) +{ + return ((Elf64_Addr (*) (int)) (addr)) (GLRO(dl_hwcap)); +} + static inline void __attribute ((always_inline)) elf_irela (const Elf64_Rela *reloc) @@ -36,13 +44,13 @@ elf_irela (const Elf64_Rela *reloc) if (__builtin_expect (r_type == R_SPARC_IRELATIVE, 1)) { Elf64_Addr *const reloc_addr = (void *) reloc->r_offset; - Elf64_Addr value = ((Elf64_Addr (*) (void)) reloc->r_addend) (); + Elf64_Addr value = elf_ifunc_invoke(reloc->r_addend); *reloc_addr = value; } else if (__builtin_expect (r_type == R_SPARC_JMP_IREL, 1)) { Elf64_Addr *const reloc_addr = (void *) reloc->r_offset; - Elf64_Addr value = ((Elf64_Addr (*) (void)) reloc->r_addend) (); + Elf64_Addr value = elf_ifunc_invoke(reloc->r_addend); struct link_map map = { .l_addr = 0 }; /* 'high' is always zero, for large PLT entries the linker diff --git a/sysdeps/sparc/sparc64/dl-machine.h b/sysdeps/sparc/sparc64/dl-machine.h index 82ab5a4..aaa22d6 100644 --- a/sysdeps/sparc/sparc64/dl-machine.h +++ b/sysdeps/sparc/sparc64/dl-machine.h @@ -430,7 +430,7 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc, if (sym != NULL && __builtin_expect (ELFW(ST_TYPE) (sym->st_info) == STT_GNU_IFUNC, 0) && __builtin_expect (sym->st_shndx != SHN_UNDEF, 1)) - value = ((Elf64_Addr (*) (void)) value) (); + value = ((Elf64_Addr (*) (int)) value) (GLRO(dl_hwcap)); switch (r_type) { @@ -460,11 +460,11 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc, *reloc_addr = value; break; case R_SPARC_IRELATIVE: - value = ((Elf64_Addr (*) (void)) value) (); + value = ((Elf64_Addr (*) (int)) value) (GLRO(dl_hwcap)); *reloc_addr = value; break; case R_SPARC_JMP_IREL: - value = ((Elf64_Addr (*) (void)) value) (); + value = ((Elf64_Addr (*) (int)) value) (GLRO(dl_hwcap)); /* Fall thru */ case R_SPARC_JMP_SLOT: #ifdef RESOLVE_CONFLICT_FIND_MAP @@ -658,7 +658,7 @@ elf_machine_lazy_rel (struct link_map *map, || r_type == R_SPARC_IRELATIVE) { Elf64_Addr value = map->l_addr + reloc->r_addend; - value = ((Elf64_Addr (*) (void)) value) (); + value = ((Elf64_Addr (*) (int)) value) (GLRO(dl_hwcap)); if (r_type == R_SPARC_JMP_IREL) { /* 'high' is always zero, for large PLT entries the linker diff --git a/sysdeps/sparc/sparc64/dl-plt.h b/sysdeps/sparc/sparc64/dl-plt.h index ca2fe3b..ed8abfa 100644 --- a/sysdeps/sparc/sparc64/dl-plt.h +++ b/sysdeps/sparc/sparc64/dl-plt.h @@ -17,6 +17,9 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ +#ifndef _DL_PLT_H +#define _DL_PLT_H + /* We have 4 cases to handle. And we code different code sequences for each one. I love V9 code models... */ static inline void __attribute__ ((always_inline)) @@ -161,3 +164,5 @@ sparc64_fixup_plt (struct link_map *map, const Elf64_Rela *reloc, __asm __volatile ("flush %0" : : "r" (insns)); } } + +#endif /* dl-plt.h */ diff --git a/sysdeps/sparc/sparc64/multiarch/memcpy.S b/sysdeps/sparc/sparc64/multiarch/memcpy.S index a708de1..c12dc3b 100644 --- a/sysdeps/sparc/sparc64/multiarch/memcpy.S +++ b/sysdeps/sparc/sparc64/multiarch/memcpy.S @@ -32,26 +32,10 @@ ENTRY(memcpy) or %o3, %lo(_GLOBAL_OFFSET_TABLE_+4), %o3 1: add %o7, %o3, %o3 mov %o5, %o7 - sethi %hi(_rtld_global_ro), %o2 - or %o2, %lo(_rtld_global_ro), %o2 -# ifdef __arch64__ - ldx [%o3 + %o2], %o2 - ldx [%o2 + RTLD_GLOBAL_RO_DL_HWCAP_OFFSET], %o2 -# else - ld [%o3 + %o2], %o2 - ld [%o2 + RTLD_GLOBAL_RO_DL_HWCAP_OFFSET + 4], %o2 -# endif -# else - set _dl_hwcap, %o3 -# ifdef __arch64__ - ldx [%o3], %o2 -# else - ld [%o3 + 4], %o2 -# endif # endif - andcc %o2, 0x80, %g0 ! HWCAP_SPARC_N2 + andcc %o0, 0x80, %g0 ! HWCAP_SPARC_N2 be 1f - andcc %o2, 0x40, %g0 ! HWCAP_SPARC_BLKINIT + andcc %o0, 0x40, %g0 ! HWCAP_SPARC_BLKINIT # ifdef SHARED sethi %gdop_hix22(__memcpy_niagara2), %o1 xor %o1, %gdop_lox10(__memcpy_niagara2), %o1 @@ -61,7 +45,7 @@ ENTRY(memcpy) ba 10f nop 1: be 1f - andcc %o2, 0x20, %g0 ! HWCAP_SPARC_ULTRA3 + andcc %o0, 0x20, %g0 ! HWCAP_SPARC_ULTRA3 # ifdef SHARED sethi %gdop_hix22(__memcpy_niagara1), %o1 xor %o1, %gdop_lox10(__memcpy_niagara1), %o1 diff --git a/sysdeps/sparc/sparc64/multiarch/memset.S b/sysdeps/sparc/sparc64/multiarch/memset.S index 23e513f..2e27448 100644 --- a/sysdeps/sparc/sparc64/multiarch/memset.S +++ b/sysdeps/sparc/sparc64/multiarch/memset.S @@ -32,24 +32,8 @@ ENTRY(memset) or %o3, %lo(_GLOBAL_OFFSET_TABLE_+4), %o3 1: add %o7, %o3, %o3 mov %o5, %o7 - sethi %hi(_rtld_global_ro), %o2 - or %o2, %lo(_rtld_global_ro), %o2 -# ifdef __arch64__ - ldx [%o3 + %o2], %o2 - ldx [%o2 + RTLD_GLOBAL_RO_DL_HWCAP_OFFSET], %o2 -# else - ld [%o3 + %o2], %o2 - ld [%o2 + RTLD_GLOBAL_RO_DL_HWCAP_OFFSET + 4], %o2 -# endif -# else - set _dl_hwcap, %o3 -# ifdef __arch64__ - ldx [%o3], %o2 -# else - ld [%o3 + 4], %o2 -# endif # endif - andcc %o2, 0x40, %g0 ! HWCAP_SPARC_BLKINIT + andcc %o0, 0x40, %g0 ! HWCAP_SPARC_BLKINIT be 9f nop # ifdef SHARED @@ -84,24 +68,8 @@ ENTRY(__bzero) or %o3, %lo(_GLOBAL_OFFSET_TABLE_+4), %o3 1: add %o7, %o3, %o3 mov %o5, %o7 - sethi %hi(_rtld_global_ro), %o2 - or %o2, %lo(_rtld_global_ro), %o2 -# ifdef __arch64__ - ldx [%o3 + %o2], %o2 - ldx [%o2 + RTLD_GLOBAL_RO_DL_HWCAP_OFFSET], %o2 -# else - ld [%o3 + %o2], %o2 - ld [%o2 + RTLD_GLOBAL_RO_DL_HWCAP_OFFSET + 4], %o2 -# endif -# else - set _dl_hwcap, %o3 -# ifdef __arch64__ - ldx [%o3], %o2 -# else - ld [%o3 + 4], %o2 -# endif # endif - andcc %o2, 0x40, %g0 ! HWCAP_SPARC_BLKINIT + andcc %o0, 0x40, %g0 ! HWCAP_SPARC_BLKINIT be 9f nop # ifdef SHARED @@ -114,8 +82,8 @@ ENTRY(__bzero) nop 9: # ifdef SHARED - sethi %gdop_hix22(__memset_ultra1), %o1 - xor %o1, %gdop_lox10(__memset_ultra1), %o1 + sethi %gdop_hix22(__bzero_ultra1), %o1 + xor %o1, %gdop_lox10(__bzero_ultra1), %o1 # else set __bzero_ultra1, %o1 # endif diff --git a/sysdeps/unix/dirstream.h b/sysdeps/unix/dirstream.h index 8303f07..347b519 100644 --- a/sysdeps/unix/dirstream.h +++ b/sysdeps/unix/dirstream.h @@ -40,8 +40,15 @@ struct __dirstream off_t filepos; /* Position of next entry to read. */ - /* Directory block. */ - char data[0] __attribute__ ((aligned (__alignof__ (void*)))); + int errcode; /* Delayed error code. */ + + /* Directory block. We must make sure that this block starts + at an address that is aligned adequately enough to store + dirent entries. Using the alignment of "void *" is not + sufficient because dirents on 32-bit platforms can require + 64-bit alignment. We use "long double" here to be consistent + with what malloc uses. */ + char data[0] __attribute__ ((aligned (__alignof__ (long double)))); }; #define _DIR_dirfd(dirp) ((dirp)->fd) diff --git a/sysdeps/unix/opendir.c b/sysdeps/unix/opendir.c index fbf14f5..8a9df84 100644 --- a/sysdeps/unix/opendir.c +++ b/sysdeps/unix/opendir.c @@ -146,6 +146,7 @@ weak_alias (__opendir, opendir) #ifdef __ASSUME_O_CLOEXEC # define check_have_o_cloexec(fd) 1 #else +#ifdef O_CLOEXEC static int check_have_o_cloexec (int fd) { @@ -154,6 +155,7 @@ check_have_o_cloexec (int fd) return __have_o_cloexec > 0; } #endif +#endif DIR * @@ -208,6 +210,7 @@ __alloc_dir (int fd, bool close_fd, const struct stat64 *statp) dirp->size = 0; dirp->offset = 0; dirp->filepos = 0; + dirp->errcode = 0; return dirp; } diff --git a/sysdeps/unix/readdir_r.c b/sysdeps/unix/readdir_r.c index e166174..9bc095d 100644 --- a/sysdeps/unix/readdir_r.c +++ b/sysdeps/unix/readdir_r.c @@ -42,6 +42,7 @@ __READDIR_R (DIR *dirp, DIRENT_TYPE *entry, DIRENT_TYPE **result) DIRENT_TYPE *dp; size_t reclen; const int saved_errno = errno; + int ret; __libc_lock_lock (dirp->lock); @@ -72,10 +73,10 @@ __READDIR_R (DIR *dirp, DIRENT_TYPE *entry, DIRENT_TYPE **result) bytes = 0; __set_errno (saved_errno); } + if (bytes < 0) + dirp->errcode = errno; dp = NULL; - /* Reclen != 0 signals that an error occurred. */ - reclen = bytes != 0; break; } dirp->size = (size_t) bytes; @@ -108,29 +109,46 @@ __READDIR_R (DIR *dirp, DIRENT_TYPE *entry, DIRENT_TYPE **result) dirp->filepos += reclen; #endif - /* Skip deleted files. */ +#ifdef NAME_MAX + if (reclen > offsetof (DIRENT_TYPE, d_name) + NAME_MAX + 1) + { + /* The record is very long. It could still fit into the + caller-supplied buffer if we can skip padding at the + end. */ + size_t namelen = _D_EXACT_NAMLEN (dp); + if (namelen <= NAME_MAX) + reclen = offsetof (DIRENT_TYPE, d_name) + namelen + 1; + else + { + /* The name is too long. Ignore this file. */ + dirp->errcode = ENAMETOOLONG; + dp->d_ino = 0; + continue; + } + } +#endif + + /* Skip deleted and ignored files. */ } while (dp->d_ino == 0); if (dp != NULL) { -#ifdef GETDENTS_64BIT_ALIGNED - /* The d_reclen value might include padding which is not part of - the DIRENT_TYPE data structure. */ - reclen = MIN (reclen, - offsetof (DIRENT_TYPE, d_name) + sizeof (dp->d_name)); -#endif *result = memcpy (entry, dp, reclen); -#ifdef GETDENTS_64BIT_ALIGNED +#ifdef _DIRENT_HAVE_D_RECLEN entry->d_reclen = reclen; #endif + ret = 0; } else - *result = NULL; + { + *result = NULL; + ret = dirp->errcode; + } __libc_lock_unlock (dirp->lock); - return dp != NULL ? 0 : reclen ? errno : 0; + return ret; } #ifdef __READDIR_R_ALIAS diff --git a/sysdeps/unix/rewinddir.c b/sysdeps/unix/rewinddir.c index 051e935..d781f57 100644 --- a/sysdeps/unix/rewinddir.c +++ b/sysdeps/unix/rewinddir.c @@ -33,5 +33,6 @@ rewinddir (dirp) dirp->filepos = 0; dirp->offset = 0; dirp->size = 0; + dirp->errcode = 0; __libc_lock_unlock (dirp->lock); } diff --git a/sysdeps/unix/sysv/linux/accept4.c b/sysdeps/unix/sysv/linux/accept4.c index 9ef9f47..758903b 100644 --- a/sysdeps/unix/sysv/linux/accept4.c +++ b/sysdeps/unix/sysv/linux/accept4.c @@ -25,6 +25,14 @@ #include #include +/* Do not use the accept4 syscall on socketcall architectures unless + it was added at the same time as the socketcall support or can be + assumed to be present. */ +#if defined __ASSUME_SOCKETCALL \ + && !defined __ASSUME_ACCEPT4_SYSCALL_WITH_SOCKETCALL \ + && !defined __ASSUME_ACCEPT4_SYSCALL +# undef __NR_accept4 +#endif #ifdef __NR_accept4 int @@ -43,7 +51,7 @@ accept4 (int fd, __SOCKADDR_ARG addr, socklen_t *addr_len, int flags) return result; } #elif defined __NR_socketcall -# ifndef __ASSUME_ACCEPT4 +# ifndef __ASSUME_ACCEPT4_SOCKETCALL extern int __internal_accept4 (int fd, __SOCKADDR_ARG addr, socklen_t *addr_len, int flags) attribute_hidden; @@ -84,7 +92,8 @@ accept4 (int fd, __SOCKADDR_ARG addr, socklen_t *addr_len, int flags) return -1; } # else -/* When __ASSUME_ACCEPT4 accept4 is defined in internal_accept4.S. */ +/* When __ASSUME_ACCEPT4_SOCKETCALL accept4 is defined in + internal_accept4.S. */ # endif #else int diff --git a/sysdeps/unix/sysv/linux/bits/resource.h b/sysdeps/unix/sysv/linux/bits/resource.h index ca2c9f0..40b581b 100644 --- a/sysdeps/unix/sysv/linux/bits/resource.h +++ b/sysdeps/unix/sysv/linux/bits/resource.h @@ -100,7 +100,13 @@ enum __rlimit_resource __RLIMIT_RTPRIO = 14, #define RLIMIT_RTPRIO __RLIMIT_RTPRIO - __RLIMIT_NLIMITS = 15, + /* Maximum CPU time that a process scheduled under a real-time + scheduling policy may consume without making a blocking + system call. */ + __RLIMIT_RTTIME = 15, +#define RLIMIT_RTTIME __RLIMIT_RTTIME + + __RLIMIT_NLIMITS = 16, __RLIM_NLIMITS = __RLIMIT_NLIMITS #define RLIMIT_NLIMITS __RLIMIT_NLIMITS #define RLIM_NLIMITS __RLIM_NLIMITS diff --git a/sysdeps/unix/sysv/linux/check_native.c b/sysdeps/unix/sysv/linux/check_native.c index 6e6624a..58db4cd 100644 --- a/sysdeps/unix/sysv/linux/check_native.c +++ b/sysdeps/unix/sysv/linux/check_native.c @@ -77,13 +77,7 @@ __check_native (uint32_t a1_index, int *a1_native, memset (&nladdr, '\0', sizeof (nladdr)); nladdr.nl_family = AF_NETLINK; -#ifdef PAGE_SIZE - /* Help the compiler optimize out the malloc call if PAGE_SIZE - is constant and smaller or equal to PTHREAD_STACK_MIN/4. */ - const size_t buf_size = PAGE_SIZE; -#else const size_t buf_size = __getpagesize (); -#endif bool use_malloc = false; char *buf; diff --git a/sysdeps/unix/sysv/linux/check_pf.c b/sysdeps/unix/sysv/linux/check_pf.c index b789a32..7720b58 100644 --- a/sysdeps/unix/sysv/linux/check_pf.c +++ b/sysdeps/unix/sysv/linux/check_pf.c @@ -25,6 +25,8 @@ #include #include #include +#include +#include #include #include @@ -71,13 +73,7 @@ make_request (int fd, pid_t pid, bool *seen_ipv4, bool *seen_ipv6, memset (&nladdr, '\0', sizeof (nladdr)); nladdr.nl_family = AF_NETLINK; -#ifdef PAGE_SIZE - /* Help the compiler optimize out the malloc call if PAGE_SIZE - is constant and smaller or equal to PTHREAD_STACK_MIN/4. */ - const size_t buf_size = PAGE_SIZE; -#else const size_t buf_size = __getpagesize (); -#endif bool use_malloc = false; char *buf; diff --git a/sysdeps/unix/sysv/linux/clock_settime.c b/sysdeps/unix/sysv/linux/clock_settime.c index 8c52456..4acd2b8 100644 --- a/sysdeps/unix/sysv/linux/clock_settime.c +++ b/sysdeps/unix/sysv/linux/clock_settime.c @@ -18,6 +18,7 @@ #include #include +#include #include "kernel-posix-cpu-timers.h" #include diff --git a/sysdeps/unix/sysv/linux/dl-osinfo.h b/sysdeps/unix/sysv/linux/dl-osinfo.h index df07869..285c6aa 100644 --- a/sysdeps/unix/sysv/linux/dl-osinfo.h +++ b/sysdeps/unix/sysv/linux/dl-osinfo.h @@ -17,10 +17,13 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ +#include #include #include #include #include +#include +#include #ifndef MIN # define MIN(a,b) (((a)<(b))?(a):(b)) @@ -62,7 +65,12 @@ dl_fatal (const char *str) static inline uintptr_t __attribute__ ((always_inline)) _dl_setup_stack_chk_guard (void *dl_random) { - uintptr_t ret; + uintptr_t ret = 0; + /* Having a leading zero byte protects the stack guard from being + overwritten with str* write operations or exposed by an + unterminated str* read operation. */ + unsigned char *p = ((unsigned char *) &ret) + 1; + int size = sizeof (ret) - 1; #ifndef __ASSUME_AT_RANDOM if (__builtin_expect (dl_random == NULL, 0)) { @@ -70,23 +78,49 @@ _dl_setup_stack_chk_guard (void *dl_random) int fd = __open ("/dev/urandom", O_RDONLY); if (fd >= 0) { - ssize_t reslen = __read (fd, &ret, sizeof (ret)); + ssize_t reslen = __read (fd, p, size); __close (fd); - if (reslen == (ssize_t) sizeof (ret)) + if (reslen == (ssize_t) size) return ret; } # endif - ret = 0; - unsigned char *p = (unsigned char *) &ret; - p[sizeof (ret) - 1] = 255; - p[sizeof (ret) - 2] = '\n'; + /* Lacking any other form of randomized stack guard, add other + terminators in an attempt to block things like fgets, etc. */ + p[size - 1] = 255; + p[size - 2] = '\n'; +#ifdef HP_TIMING_NOW + hp_timing_t hpt; + HP_TIMING_NOW (hpt); + hpt = (hpt & 0xffff) << 8; + ret ^= hpt; +#endif + uintptr_t stk; + /* Avoid GCC being too smart. */ + asm ("" : "=r" (stk) : "r" (p)); + stk &= 0x7ffff0; +#if __BYTE_ORDER == __LITTLE_ENDIAN + stk <<= (__WORDSIZE - 23); +#elif __WORDSIZE == 64 + stk <<= 31; +#endif + ret ^= stk; + /* Avoid GCC being too smart. */ + p = (unsigned char *) &errno; + asm ("" : "=r" (stk) : "r" (p)); + stk &= 0x7fff00; +#if __BYTE_ORDER == __LITTLE_ENDIAN + stk <<= (__WORDSIZE - 29); +#else + stk >>= 8; +#endif + ret ^= stk; } else #endif /* We need in the moment only 8 bytes on 32-bit platforms and 16 bytes on 64-bit platforms. Therefore we can use the data directly and not use the kernel-provided data to seed a PRNG. */ - memcpy (&ret, dl_random, sizeof (ret)); + memcpy (p, dl_random, size); return ret; } diff --git a/sysdeps/unix/sysv/linux/getpagesize.c b/sysdeps/unix/sysv/linux/getpagesize.c index 0866079..fe9bc8e 100644 --- a/sysdeps/unix/sysv/linux/getpagesize.c +++ b/sysdeps/unix/sysv/linux/getpagesize.c @@ -28,7 +28,7 @@ int __getpagesize () { -#ifdef __ASSUME_AT_PAGESIZE +#if 0 && defined __ASSUME_AT_PAGESIZE assert (GLRO(dl_pagesize) != 0); return GLRO(dl_pagesize); #else diff --git a/sysdeps/unix/sysv/linux/i386/accept4.S b/sysdeps/unix/sysv/linux/i386/accept4.S index 1d05eff..8edcc4d 100644 --- a/sysdeps/unix/sysv/linux/i386/accept4.S +++ b/sysdeps/unix/sysv/linux/i386/accept4.S @@ -24,7 +24,7 @@ #define EINVAL 22 #define ENOSYS 38 -#ifdef __ASSUME_ACCEPT4 +#ifdef __ASSUME_ACCEPT4_SOCKETCALL # define errlabel SYSCALL_ERROR_LABEL #else # define errlabel .Lerr @@ -116,7 +116,7 @@ L(pseudo_end): ret #endif -#ifndef __ASSUME_ACCEPT4 +#ifndef __ASSUME_ACCEPT4_SOCKETCALL /* The kernel returns -EINVAL for unknown socket operations. We need to convert that error to an ENOSYS error. */ .Lerr: cmpl $-EINVAL, %eax diff --git a/sysdeps/unix/sysv/linux/i386/bits/fcntl.h b/sysdeps/unix/sysv/linux/i386/bits/fcntl.h index 944a320..80af479 100644 --- a/sysdeps/unix/sysv/linux/i386/bits/fcntl.h +++ b/sysdeps/unix/sysv/linux/i386/bits/fcntl.h @@ -234,6 +234,21 @@ struct f_owner_ex # define SPLICE_F_GIFT 8 /* Pages passed in are a gift. */ #endif +/* Values for `*at' functions. */ +#ifdef __USE_ATFILE +# define AT_FDCWD -100 /* Special value used to indicate + the *at functions should use the + current working directory. */ +# define AT_SYMLINK_NOFOLLOW 0x100 /* Do not follow symbolic links. */ +# define AT_REMOVEDIR 0x200 /* Remove directory instead of + unlinking file. */ +# define AT_SYMLINK_FOLLOW 0x400 /* Follow symbolic links. */ +# define AT_NO_AUTOMOUNT 0x800 /* Suppress terminal automount + traversal. */ +# define AT_EACCESS 0x200 /* Test access permitted for + effective IDs, not real IDs. */ +#endif + __BEGIN_DECLS #ifdef __USE_GNU diff --git a/sysdeps/unix/sysv/linux/i386/clone.S b/sysdeps/unix/sysv/linux/i386/clone.S index f73a4b5..54524ec 100644 --- a/sysdeps/unix/sysv/linux/i386/clone.S +++ b/sysdeps/unix/sysv/linux/i386/clone.S @@ -120,9 +120,6 @@ L(pseudo_end): ret L(thread_start): - cfi_startproc; - /* Clearing frame pointer is insufficient, use CFI. */ - cfi_undefined (eip); /* Note: %esi is zero. */ movl %esi,%ebp /* terminate the stack frame */ #ifdef RESET_PID @@ -155,7 +152,6 @@ L(nomoregetpid): jmp L(haspid) .previous #endif - cfi_endproc; cfi_startproc PSEUDO_END (BP_SYM (__clone)) diff --git a/sysdeps/unix/sysv/linux/i386/dl-cache.h b/sysdeps/unix/sysv/linux/i386/dl-cache.h new file mode 100644 index 0000000..766bba4 --- /dev/null +++ b/sysdeps/unix/sysv/linux/i386/dl-cache.h @@ -0,0 +1 @@ +#include diff --git a/sysdeps/unix/sysv/linux/i386/readdir64_r.c b/sysdeps/unix/sysv/linux/i386/readdir64_r.c index f96f16a..08cf99d 100644 --- a/sysdeps/unix/sysv/linux/i386/readdir64_r.c +++ b/sysdeps/unix/sysv/linux/i386/readdir64_r.c @@ -19,7 +19,6 @@ #define __READDIR_R __readdir64_r #define __GETDENTS __getdents64 #define DIRENT_TYPE struct dirent64 -#define GETDENTS_64BIT_ALIGNED 1 #include diff --git a/sysdeps/unix/sysv/linux/i386/sysconf.c b/sysdeps/unix/sysv/linux/i386/sysconf.c index ff3cf9f..eda526d 100644 --- a/sysdeps/unix/sysv/linux/i386/sysconf.c +++ b/sysdeps/unix/sysv/linux/i386/sysconf.c @@ -135,7 +135,7 @@ static const struct intel_02_cache_info { 0xdc, 12, 64, M(_SC_LEVEL3_CACHE_SIZE), 2097152 }, { 0xdd, 12, 64, M(_SC_LEVEL3_CACHE_SIZE), 4194304 }, { 0xde, 12, 64, M(_SC_LEVEL3_CACHE_SIZE), 8388608 }, - { 0xe3, 16, 64, M(_SC_LEVEL3_CACHE_SIZE), 2097152 }, + { 0xe2, 16, 64, M(_SC_LEVEL3_CACHE_SIZE), 2097152 }, { 0xe3, 16, 64, M(_SC_LEVEL3_CACHE_SIZE), 4194304 }, { 0xe4, 16, 64, M(_SC_LEVEL3_CACHE_SIZE), 8388608 }, { 0xea, 24, 64, M(_SC_LEVEL3_CACHE_SIZE), 12582912 }, @@ -186,6 +186,57 @@ intel_check_word (int name, unsigned int value, bool *has_level_2, /* No need to look further. */ break; } + else if (byte == 0xff) + { + /* CPUID leaf 0x4 contains all the information. We need to + iterate over it. */ + unsigned int eax; + unsigned int ebx; + unsigned int ecx; + unsigned int edx; + + unsigned int round = 0; + while (1) + { + asm volatile ("xchgl %%ebx, %1; cpuid; xchgl %%ebx, %1" + : "=a" (eax), "=r" (ebx), "=c" (ecx), "=d" (edx) + : "0" (4), "2" (round)); + + enum { null = 0, data = 1, inst = 2, uni = 3 } type = eax & 0x1f; + if (type == null) + /* That was the end. */ + break; + + unsigned int level = (eax >> 5) & 0x7; + + if ((level == 1 && type == data + && folded_rel_name == M(_SC_LEVEL1_DCACHE_SIZE)) + || (level == 1 && type == inst + && folded_rel_name == M(_SC_LEVEL1_ICACHE_SIZE)) + || (level == 2 && folded_rel_name == M(_SC_LEVEL2_CACHE_SIZE)) + || (level == 3 && folded_rel_name == M(_SC_LEVEL3_CACHE_SIZE)) + || (level == 4 && folded_rel_name == M(_SC_LEVEL4_CACHE_SIZE))) + { + unsigned int offset = M(name) - folded_rel_name; + + if (offset == 0) + /* Cache size. */ + return (((ebx >> 22) + 1) + * (((ebx >> 12) & 0x3ff) + 1) + * ((ebx & 0xfff) + 1) + * (ecx + 1)); + if (offset == 1) + return (ebx >> 22) + 1; + + assert (offset == 2); + return (ebx & 0xfff) + 1; + } + + ++round; + } + /* There is no other cache information anywhere else. */ + break; + } else { if (byte == 0x49 && folded_rel_name == M(_SC_LEVEL3_CACHE_SIZE)) diff --git a/sysdeps/unix/sysv/linux/ia64/bits/fcntl.h b/sysdeps/unix/sysv/linux/ia64/bits/fcntl.h index 2189a97..241aaff 100644 --- a/sysdeps/unix/sysv/linux/ia64/bits/fcntl.h +++ b/sysdeps/unix/sysv/linux/ia64/bits/fcntl.h @@ -229,6 +229,21 @@ struct f_owner_ex # define SPLICE_F_GIFT 8 /* Pages passed in are a gift. */ #endif +/* Values for `*at' functions. */ +#ifdef __USE_ATFILE +# define AT_FDCWD -100 /* Special value used to indicate + the *at functions should use the + current working directory. */ +# define AT_SYMLINK_NOFOLLOW 0x100 /* Do not follow symbolic links. */ +# define AT_REMOVEDIR 0x200 /* Remove directory instead of + unlinking file. */ +# define AT_SYMLINK_FOLLOW 0x400 /* Follow symbolic links. */ +# define AT_NO_AUTOMOUNT 0x800 /* Suppress terminal automount + traversal. */ +# define AT_EACCESS 0x200 /* Test access permitted for + effective IDs, not real IDs. */ +#endif + __BEGIN_DECLS #ifdef __USE_GNU diff --git a/sysdeps/unix/sysv/linux/ia64/sys/user.h b/sysdeps/unix/sysv/linux/ia64/sys/user.h index 0392187..a56e0e0 100644 --- a/sysdeps/unix/sysv/linux/ia64/sys/user.h +++ b/sysdeps/unix/sysv/linux/ia64/sys/user.h @@ -21,6 +21,7 @@ #include #include +#include /* This definition comes directly from the kernel headers. If anything changes in them this header has to be changed, too. */ @@ -45,7 +46,7 @@ struct user char u_comm[32]; /* User command name. */ }; -#define NBPG PAGE_SIZE +#define NBPG (sysconf(_SC_PAGESIZE)) #define UPAGES 1 #define HOST_TEXT_START_ADDR (u.start_code) #define HOST_DATA_START_ADDR (u.start_data) diff --git a/sysdeps/unix/sysv/linux/ia64/sysconf.c b/sysdeps/unix/sysv/linux/ia64/sysconf.c index 4b5d1ce..8d940be 100644 --- a/sysdeps/unix/sysv/linux/ia64/sysconf.c +++ b/sysdeps/unix/sysv/linux/ia64/sysconf.c @@ -33,7 +33,7 @@ long int __sysconf (int name) { if (name == _SC_CPUTIME || name == _SC_THREAD_CPUTIME) - return has_cpuclock () ? 200112L : -1; + return has_cpuclock () ? _POSIX_VERSION : -1; /* Everything else is handled by the more general code. */ return linux_sysconf (name); diff --git a/sysdeps/unix/sysv/linux/ifaddrs.c b/sysdeps/unix/sysv/linux/ifaddrs.c index 84f223d..a3a58af 100644 --- a/sysdeps/unix/sysv/linux/ifaddrs.c +++ b/sysdeps/unix/sysv/linux/ifaddrs.c @@ -144,13 +144,7 @@ __netlink_request (struct netlink_handle *h, int type) ssize_t read_len; bool done = false; -#ifdef PAGE_SIZE - /* Help the compiler optimize out the malloc call if PAGE_SIZE - is constant and smaller or equal to PTHREAD_STACK_MIN/4. */ - const size_t buf_size = PAGE_SIZE; -#else const size_t buf_size = __getpagesize (); -#endif bool use_malloc = false; char *buf; diff --git a/sysdeps/unix/sysv/linux/internal_accept4.S b/sysdeps/unix/sysv/linux/internal_accept4.S index ffc5536..f0c61b5 100644 --- a/sysdeps/unix/sysv/linux/internal_accept4.S +++ b/sysdeps/unix/sysv/linux/internal_accept4.S @@ -1,8 +1,18 @@ #include #include + +/* Do not use the accept4 syscall on socketcall architectures unless + it was added at the same time as the socketcall support or can be + assumed to be present. */ +#if defined __ASSUME_SOCKETCALL \ + && !defined __ASSUME_ACCEPT4_SYSCALL_WITH_SOCKETCALL \ + && !defined __ASSUME_ACCEPT4_SYSCALL +# undef __NR_accept4 +#endif + #if !defined __NR_accept4 && defined __NR_socketcall # define socket accept4 -# ifdef __ASSUME_ACCEPT4 +# ifdef __ASSUME_ACCEPT4_SOCKETCALL # define __socket accept4 # else # define __socket __internal_accept4 diff --git a/sysdeps/unix/sysv/linux/internal_recvmmsg.S b/sysdeps/unix/sysv/linux/internal_recvmmsg.S index 66c1357..6b776b9 100644 --- a/sysdeps/unix/sysv/linux/internal_recvmmsg.S +++ b/sysdeps/unix/sysv/linux/internal_recvmmsg.S @@ -1,8 +1,18 @@ #include #include + +/* Do not use the recvmmsg syscall on socketcall architectures unless + it was added at the same time as the socketcall support or can be + assumed to be present. */ +#if defined __ASSUME_SOCKETCALL \ + && !defined __ASSUME_RECVMMSG_SYSCALL_WITH_SOCKETCALL \ + && !defined __ASSUME_RECVMMSG_SYSCALL +# undef __NR_recvmmsg +#endif + #if !defined __NR_recvmmsg && defined __NR_socketcall # define socket recvmmsg -# ifdef __ASSUME_RECVMMSG +# ifdef __ASSUME_RECVMMSG_SOCKETCALL # define __socket recvmmsg # else # define __socket __internal_recvmmsg diff --git a/sysdeps/unix/sysv/linux/kernel-features.h b/sysdeps/unix/sysv/linux/kernel-features.h index c220dca..bc84e38 100644 --- a/sysdeps/unix/sysv/linux/kernel-features.h +++ b/sysdeps/unix/sysv/linux/kernel-features.h @@ -85,6 +85,18 @@ # define __ASSUME_SENDFILE 1 #endif +/* Some architectures use the socketcall multiplexer for some or all + socket-related operations, via a socket.S file in glibc, instead of + separate syscalls. __ASSUME_SOCKETCALL is defined for such + architectures. */ +#if defined __i386__ \ + || defined __powerpc__ \ + || defined __s390__ \ + || defined __sh__ \ + || defined __sparc__ +# define __ASSUME_SOCKETCALL 1 +#endif + /* Only very old kernels had no real symlinks for terminal descriptors in /proc/self/fd. */ #if __LINUX_KERNEL_VERSION >= 131584 @@ -498,10 +510,36 @@ # define __ASSUME_SIGNALFD4 1 #endif -/* Support for the accept4 syscall was added in 2.6.28. */ -#if __LINUX_KERNEL_VERSION >= 0x02061c \ - && (defined __i386__ || defined __x86_64__ || defined __powerpc__ \ - || defined __sparc__ || defined __s390__) +/* Support for accept4 functionality was added in 2.6.28, but for some + architectures using a separate syscall rather than socketcall that + syscall was only added later, and some architectures first had + socketcall support then a separate syscall. Define + __ASSUME_ACCEPT4_SOCKETCALL if glibc uses socketcall on this + architecture and accept4 is available through socketcall, + __ASSUME_ACCEPT4_SYSCALL if it is available through a separate + syscall, __ASSUME_ACCEPT4_SYSCALL_WITH_SOCKETCALL if it became + available through a separate syscall at the same time as through + socketcall, and __ASSUME_ACCEPT4 if the accept4 function is known + to work. */ +#if __LINUX_KERNEL_VERSION >= 0x02061c && defined __ASSUME_SOCKETCALL +# define __ASSUME_ACCEPT4_SOCKETCALL 1 +#endif + +/* The accept4 syscall was added for x86_64 and SPARC in 2.6.28, + for PowerPC and SH in 2.6.37, and for IA64 in 3.3. */ +#if (__LINUX_KERNEL_VERSION >= 0x02061c \ + && (defined __x86_64__ || defined __sparc__)) \ + || (__LINUX_KERNEL_VERSION >= 0x020625 \ + && (defined __powerpc__ || defined __sh__)) \ + || (__LINUX_KERNEL_VERSION >= 0x030300 \ + && (defined __ia64)) +# define __ASSUME_ACCEPT4_SYSCALL 1 +#endif +#ifdef __sparc__ +# define __ASSUME_ACCEPT4_SYSCALL_WITH_SOCKETCALL 1 +#endif + +#if defined __ASSUME_ACCEPT4_SOCKETCALL || defined __ASSUME_ACCEPT4_SYSCALL # define __ASSUME_ACCEPT4 1 #endif @@ -526,8 +564,26 @@ # define __ASSUME_F_GETOWN_EX 1 #endif -/* Support for the recvmmsg syscall was added in 2.6.33. */ -#if __LINUX_KERNEL_VERSION >= 0x020621 +/* Support for recvmmsg functionality was added in 2.6.33. The macros + defined correspond to those for accept4. */ +#if __LINUX_KERNEL_VERSION >= 0x020621 && defined __ASSUME_SOCKETCALL +# define __ASSUME_RECVMMSG_SOCKETCALL 1 +#endif + +/* The recvmmsg syscall was added for i386, x86_64n SPARC and IA64 in + 2.6.33, and for PowerPC and SH in 2.6.37. */ +#if (__LINUX_KERNEL_VERSION >= 0x020621 \ + && (defined __i386__ || defined __x86_64__ || defined __sparc__ \ + || defined __ia64__)) \ + || (__LINUX_KERNEL_VERSION >= 0x020625 \ + && (defined __powerpc__ || defined __sh__)) +# define __ASSUME_RECVMMSG_SYSCALL 1 +#endif +#if defined __i386__ || defined __sparc__ +# define __ASSUME_RECVMMSG_SYSCALL_WITH_SOCKETCALL 1 +#endif + +#if defined __ASSUME_RECVMMSG_SOCKETCALL || defined __ASSUME_RECVMMSG_SYSCALL # define __ASSUME_RECVMMSG 1 #endif diff --git a/sysdeps/unix/sysv/linux/ldsodefs.h b/sysdeps/unix/sysv/linux/ldsodefs.h index 5d5b1b4..cf20217 100644 --- a/sysdeps/unix/sysv/linux/ldsodefs.h +++ b/sysdeps/unix/sysv/linux/ldsodefs.h @@ -58,9 +58,9 @@ extern void _dl_non_dynamic_init (void) internal_function; #define VALID_ELF_HEADER(hdr,exp,size) (memcmp (hdr, exp, size) == 0 \ || memcmp (hdr, expected2, size) == 0) #define VALID_ELF_OSABI(osabi) (osabi == ELFOSABI_SYSV \ - || osabi == ELFOSABI_LINUX) + || osabi == ELFOSABI_GNU) #define VALID_ELF_ABIVERSION(osabi,ver) \ - (ver == 0 || (osabi == ELFOSABI_LINUX && ver < LIBC_ABI_MAX)) + (ver == 0 || (osabi == ELFOSABI_GNU && ver < LIBC_ABI_MAX)) #define MORE_ELF_HEADER_DATA \ static const unsigned char expected2[EI_PAD] = \ { \ @@ -71,7 +71,7 @@ extern void _dl_non_dynamic_init (void) internal_function; [EI_CLASS] = ELFW(CLASS), \ [EI_DATA] = byteorder, \ [EI_VERSION] = EV_CURRENT, \ - [EI_OSABI] = ELFOSABI_LINUX \ + [EI_OSABI] = ELFOSABI_GNU \ } #endif /* ldsodefs.h */ diff --git a/sysdeps/unix/sysv/linux/netinet/if_fddi.h b/sysdeps/unix/sysv/linux/netinet/if_fddi.h index 1a0ec92..c5d5f0a 100644 --- a/sysdeps/unix/sysv/linux/netinet/if_fddi.h +++ b/sysdeps/unix/sysv/linux/netinet/if_fddi.h @@ -23,6 +23,7 @@ #include #include +#include #include #ifdef __USE_BSD diff --git a/sysdeps/unix/sysv/linux/paths.h b/sysdeps/unix/sysv/linux/paths.h index f4860f2..2fda9c6 100644 --- a/sysdeps/unix/sysv/linux/paths.h +++ b/sysdeps/unix/sysv/linux/paths.h @@ -68,7 +68,7 @@ /* Provide trailing slash, since mostly used for building pathnames. */ #define _PATH_DEV "/dev/" #define _PATH_TMP "/tmp/" -#define _PATH_VARDB "/var/db/" +#define _PATH_VARDB "/var/lib/misc/" #define _PATH_VARRUN "/var/run/" #define _PATH_VARTMP "/var/tmp/" diff --git a/sysdeps/unix/sysv/linux/posix_fadvise.c b/sysdeps/unix/sysv/linux/posix_fadvise.c index 30a6d9e..1ccbad9 100644 --- a/sysdeps/unix/sysv/linux/posix_fadvise.c +++ b/sysdeps/unix/sysv/linux/posix_fadvise.c @@ -35,6 +35,19 @@ posix_fadvise (int fd, off_t offset, off_t len, int advise) return INTERNAL_SYSCALL_ERRNO (ret, err); return 0; #else +# ifdef __NR_fadvise64_64 + INTERNAL_SYSCALL_DECL (err); + int ret = INTERNAL_SYSCALL (fadvise64_64, err, 6, fd, + __LONG_LONG_PAIR ((long) (offset >> 31), + (long) offset), + __LONG_LONG_PAIR ((long) (len >> 31), + (long) len), + advise); + if (INTERNAL_SYSCALL_ERROR_P (ret, err)) + return INTERNAL_SYSCALL_ERRNO (ret, err); + return 0; +# else return ENOSYS; +# endif #endif } diff --git a/sysdeps/unix/sysv/linux/powerpc/bits/fcntl.h b/sysdeps/unix/sysv/linux/powerpc/bits/fcntl.h index ea760f6..60c1970 100644 --- a/sysdeps/unix/sysv/linux/powerpc/bits/fcntl.h +++ b/sysdeps/unix/sysv/linux/powerpc/bits/fcntl.h @@ -234,6 +234,21 @@ struct f_owner_ex # define SPLICE_F_GIFT 8 /* Pages passed in are a gift. */ #endif +/* Values for `*at' functions. */ +#ifdef __USE_ATFILE +# define AT_FDCWD -100 /* Special value used to indicate + the *at functions should use the + current working directory. */ +# define AT_SYMLINK_NOFOLLOW 0x100 /* Do not follow symbolic links. */ +# define AT_REMOVEDIR 0x200 /* Remove directory instead of + unlinking file. */ +# define AT_SYMLINK_FOLLOW 0x400 /* Follow symbolic links. */ +# define AT_NO_AUTOMOUNT 0x800 /* Suppress terminal automount + traversal. */ +# define AT_EACCESS 0x200 /* Test access permitted for + effective IDs, not real IDs. */ +#endif + __BEGIN_DECLS #ifdef __USE_GNU diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h b/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h index aab4b72..e714c4c 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h @@ -172,7 +172,7 @@ : "r9", "r10", "r11", "r12", \ "cr0", "ctr", "lr", "memory"); \ err = (long int) r0; \ - (int) r3; \ + r3; \ }) #undef INLINE_SYSCALL @@ -219,7 +219,7 @@ : "r9", "r10", "r11", "r12", \ "cr0", "ctr", "memory"); \ err = r0; \ - (int) r3; \ + r3; \ }) #define INTERNAL_SYSCALL(name, err, nr, args...) \ INTERNAL_SYSCALL_NCS (__NR_##name, err, nr, args) diff --git a/sysdeps/unix/sysv/linux/recvmmsg.c b/sysdeps/unix/sysv/linux/recvmmsg.c index 0c08171..f1c0e31 100644 --- a/sysdeps/unix/sysv/linux/recvmmsg.c +++ b/sysdeps/unix/sysv/linux/recvmmsg.c @@ -24,6 +24,14 @@ #include #include +/* Do not use the recvmmsg syscall on socketcall architectures unless + it was added at the same time as the socketcall support or can be + assumed to be present. */ +#if defined __ASSUME_SOCKETCALL \ + && !defined __ASSUME_RECVMMSG_SYSCALL_WITH_SOCKETCALL \ + && !defined __ASSUME_RECVMMSG_SYSCALL +# undef __NR_recvmmsg +#endif #ifdef __NR_recvmmsg int @@ -42,7 +50,7 @@ recvmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags, return result; } #elif defined __NR_socketcall -# ifndef __ASSUME_RECVMMSG +# ifndef __ASSUME_RECVMMSG_SOCKETCALL extern int __internal_recvmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags, const struct timespec *tmo) @@ -86,7 +94,8 @@ recvmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags, return -1; } # else -/* When __ASSUME_RECVMMSG recvmmsg is defined in internal_recvmmsg.S. */ +/* When __ASSUME_RECVMMSG_SOCKETCALL recvmmsg is defined in + internal_recvmmsg.S. */ # endif #else int diff --git a/sysdeps/unix/sysv/linux/s390/bits/fcntl.h b/sysdeps/unix/sysv/linux/s390/bits/fcntl.h index 05c7a3b..b05ef4b 100644 --- a/sysdeps/unix/sysv/linux/s390/bits/fcntl.h +++ b/sysdeps/unix/sysv/linux/s390/bits/fcntl.h @@ -255,6 +255,21 @@ struct f_owner_ex # define SPLICE_F_GIFT 8 /* Pages passed in are a gift. */ #endif +/* Values for `*at' functions. */ +#ifdef __USE_ATFILE +# define AT_FDCWD -100 /* Special value used to indicate + the *at functions should use the + current working directory. */ +# define AT_SYMLINK_NOFOLLOW 0x100 /* Do not follow symbolic links. */ +# define AT_REMOVEDIR 0x200 /* Remove directory instead of + unlinking file. */ +# define AT_SYMLINK_FOLLOW 0x400 /* Follow symbolic links. */ +# define AT_NO_AUTOMOUNT 0x800 /* Suppress terminal automount + traversal. */ +# define AT_EACCESS 0x200 /* Test access permitted for + effective IDs, not real IDs. */ +#endif + __BEGIN_DECLS #ifdef __USE_GNU diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h b/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h index 5bfdc44..2ecde4f 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h +++ b/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h @@ -368,12 +368,12 @@ DECLARGS_##nr(args) \ register long _ret asm("2"); \ asm volatile ( \ - "lr 11,14\n\t" \ + "lr 10,14\n\t" \ "basr 14,%1\n\t" \ - "lr 14,11\n\t" \ + "lr 14,10\n\t" \ : "=d" (_ret) \ : "d" (fn) ASMFMT_##nr \ - : "cc", "memory", "0", "1", "11" CLOBBER_##nr); \ + : "cc", "memory", "0", "1", "10" CLOBBER_##nr); \ _ret; }) /* Pointer mangling support. */ diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h b/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h index 6491a3b..9e9f996 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h +++ b/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h @@ -370,12 +370,12 @@ DECLARGS_##nr(args) \ register long _ret asm("2"); \ asm volatile ( \ - "lgr 11,14\n\t" \ + "lgr 10,14\n\t" \ "basr 14,%1\n\t" \ - "lgr 14,11\n\t" \ + "lgr 14,10\n\t" \ : "=d" (_ret) \ : "a" (fn) ASMFMT_##nr \ - : "cc", "memory", "0", "1", "11" CLOBBER_##nr); \ + : "cc", "memory", "0", "1", "10" CLOBBER_##nr); \ _ret; }) /* Pointer mangling support. */ diff --git a/sysdeps/unix/sysv/linux/sh/bits/fcntl.h b/sysdeps/unix/sysv/linux/sh/bits/fcntl.h index df21f6a..a430133 100644 --- a/sysdeps/unix/sysv/linux/sh/bits/fcntl.h +++ b/sysdeps/unix/sysv/linux/sh/bits/fcntl.h @@ -235,6 +235,21 @@ struct f_owner_ex # define SPLICE_F_GIFT 8 /* Pages passed in are a gift. */ #endif +/* Values for `*at' functions. */ +#ifdef __USE_ATFILE +# define AT_FDCWD -100 /* Special value used to indicate + the *at functions should use the + current working directory. */ +# define AT_SYMLINK_NOFOLLOW 0x100 /* Do not follow symbolic links. */ +# define AT_REMOVEDIR 0x200 /* Remove directory instead of + unlinking file. */ +# define AT_SYMLINK_FOLLOW 0x400 /* Follow symbolic links. */ +# define AT_NO_AUTOMOUNT 0x800 /* Suppress terminal automount + traversal. */ +# define AT_EACCESS 0x200 /* Test access permitted for + effective IDs, not real IDs. */ +#endif + __BEGIN_DECLS #ifdef __USE_GNU diff --git a/sysdeps/unix/sysv/linux/sparc/bits/fcntl.h b/sysdeps/unix/sysv/linux/sparc/bits/fcntl.h index bf8f3d6..9d48f50 100644 --- a/sysdeps/unix/sysv/linux/sparc/bits/fcntl.h +++ b/sysdeps/unix/sysv/linux/sparc/bits/fcntl.h @@ -40,6 +40,7 @@ #define O_TRUNC 0x0400 /* not fcntl */ #define O_EXCL 0x0800 /* not fcntl */ #define O_SYNC 0x802000 +#define O_FSYNC O_SYNC #define O_NONBLOCK 0x4000 #define O_NDELAY (0x0004 | O_NONBLOCK) #define O_NOCTTY 0x8000 /* not fcntl */ @@ -245,6 +246,21 @@ struct f_owner_ex # define SPLICE_F_GIFT 8 /* Pages passed in are a gift. */ #endif +/* Values for `*at' functions. */ +#ifdef __USE_ATFILE +# define AT_FDCWD -100 /* Special value used to indicate + the *at functions should use the + current working directory. */ +# define AT_SYMLINK_NOFOLLOW 0x100 /* Do not follow symbolic links. */ +# define AT_REMOVEDIR 0x200 /* Remove directory instead of + unlinking file. */ +# define AT_SYMLINK_FOLLOW 0x400 /* Follow symbolic links. */ +# define AT_NO_AUTOMOUNT 0x800 /* Suppress terminal automount + traversal. */ +# define AT_EACCESS 0x200 /* Test access permitted for + effective IDs, not real IDs. */ +#endif + __BEGIN_DECLS #ifdef __USE_GNU diff --git a/sysdeps/unix/sysv/linux/sparc/bits/resource.h b/sysdeps/unix/sysv/linux/sparc/bits/resource.h index 6e4fc97..44d3ba3 100644 --- a/sysdeps/unix/sysv/linux/sparc/bits/resource.h +++ b/sysdeps/unix/sysv/linux/sparc/bits/resource.h @@ -100,7 +100,13 @@ enum __rlimit_resource __RLIMIT_RTPRIO = 14, #define RLIMIT_RTPRIO __RLIMIT_RTPRIO - __RLIMIT_NLIMITS = 15, + /* Maximum CPU time that a process scheduled under a real-time + scheduling policy may consume without making a blocking + system call. */ + __RLIMIT_RTTIME = 15, +#define RLIMIT_RTTIME __RLIMIT_RTTIME + + __RLIMIT_NLIMITS = 16, __RLIM_NLIMITS = __RLIMIT_NLIMITS #define RLIMIT_NLIMITS __RLIMIT_NLIMITS #define RLIM_NLIMITS __RLIM_NLIMITS @@ -124,11 +130,11 @@ enum __rlimit_resource #ifndef __USE_FILE_OFFSET64 # define RLIM_INFINITY ((long int)(~0UL >> 1)) #else -# define RLIM_INFINITY 0x7fffffffffffffffLL +# define RLIM_INFINITY 0xffffffffffffffffLL #endif #ifdef __USE_LARGEFILE64 -# define RLIM64_INFINITY 0x7fffffffffffffffLL +# define RLIM64_INFINITY 0xffffffffffffffffLL #endif #endif diff --git a/sysdeps/unix/sysv/linux/sys/param.h b/sysdeps/unix/sysv/linux/sys/param.h index 19c119a..da8f5e4 100644 --- a/sysdeps/unix/sysv/linux/sys/param.h +++ b/sysdeps/unix/sysv/linux/sys/param.h @@ -1,4 +1,5 @@ -/* Copyright (C) 1995-1997,2000,2001,2003,2008 Free Software Foundation, Inc. +/* Copyright (C) 1995-1997,2000,2001,2003,2008,2011 + Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -28,7 +29,7 @@ #include /* The kernel headers defines ARG_MAX. The value is wrong, though. */ -#ifndef __undef_ARG_MAX +#ifdef __undef_ARG_MAX # undef ARG_MAX # undef __undef_ARG_MAX #endif diff --git a/sysdeps/unix/sysv/linux/tcsetattr.c b/sysdeps/unix/sysv/linux/tcsetattr.c index f73ec88..e8df472 100644 --- a/sysdeps/unix/sysv/linux/tcsetattr.c +++ b/sysdeps/unix/sysv/linux/tcsetattr.c @@ -48,7 +48,12 @@ tcsetattr (fd, optional_actions, termios_p) const struct termios *termios_p; { struct __kernel_termios k_termios; + struct __kernel_termios k_termios_old; unsigned long int cmd; + int retval, old_retval; + + /* Preserve the previous termios state if we can. */ + old_retval = INLINE_SYSCALL (ioctl, 3, fd, TCGETS, &k_termios_old); switch (optional_actions) { @@ -80,6 +85,54 @@ tcsetattr (fd, optional_actions, termios_p) memcpy (&k_termios.c_cc[0], &termios_p->c_cc[0], __KERNEL_NCCS * sizeof (cc_t)); - return INLINE_SYSCALL (ioctl, 3, fd, cmd, &k_termios); + retval = INLINE_SYSCALL (ioctl, 3, fd, cmd, &k_termios); + + /* The Linux kernel silently ignores the invalid c_cflag on pty. + We have to check it here, and return an error. But if some other + setting was successfully changed, POSIX requires us to report + success. */ + if ((retval == 0) && (old_retval == 0)) + { + int save = errno; + retval = INLINE_SYSCALL (ioctl, 3, fd, TCGETS, &k_termios); + if (retval) + { + /* We cannot verify if the setting is ok. We don't return + an error (?). */ + __set_errno (save); + retval = 0; + } + else if ((k_termios_old.c_oflag != k_termios.c_oflag) || + (k_termios_old.c_lflag != k_termios.c_lflag) || + (k_termios_old.c_line != k_termios.c_line) || + ((k_termios_old.c_iflag | IBAUD0) != (k_termios.c_iflag | IBAUD0))) + { + /* Some other setting was successfully changed, which + means we should not return an error. */ + __set_errno (save); + retval = 0; + } + else if ((k_termios_old.c_cflag | (PARENB & CREAD & CSIZE)) != + (k_termios.c_cflag | (PARENB & CREAD & CSIZE))) + { + /* Some other c_cflag setting was successfully changed, which + means we should not return an error. */ + __set_errno (save); + retval = 0; + } + else if ((termios_p->c_cflag & (PARENB | CREAD)) + != (k_termios.c_cflag & (PARENB | CREAD)) + || ((termios_p->c_cflag & CSIZE) + && (termios_p->c_cflag & CSIZE) + != (k_termios.c_cflag & CSIZE))) + { + /* It looks like the Linux kernel silently changed the + PARENB/CREAD/CSIZE bits in c_cflag. Report it as an + error. */ + __set_errno (EINVAL); + retval = -1; + } + } + return retval; } libc_hidden_def (tcsetattr) diff --git a/sysdeps/unix/sysv/linux/wordsize-64/creat64.c b/sysdeps/unix/sysv/linux/wordsize-64/creat64.c index c106e2b..a3c1353 100644 --- a/sysdeps/unix/sysv/linux/wordsize-64/creat64.c +++ b/sysdeps/unix/sysv/linux/wordsize-64/creat64.c @@ -1 +1,5 @@ /* Defined as alias for the syscall. */ +#include +#ifndef __NR_creat +#include "../../../../../io/creat64.c" +#endif diff --git a/sysdeps/unix/sysv/linux/wordsize-64/readdir_r.c b/sysdeps/unix/sysv/linux/wordsize-64/readdir_r.c index 12ca1a1..adb92db 100644 --- a/sysdeps/unix/sysv/linux/wordsize-64/readdir_r.c +++ b/sysdeps/unix/sysv/linux/wordsize-64/readdir_r.c @@ -1,5 +1,4 @@ #define readdir64_r __no_readdir64_r_decl -#define GETDENTS_64BIT_ALIGNED 1 #include #undef readdir64_r weak_alias (__readdir_r, readdir64_r) diff --git a/sysdeps/unix/sysv/linux/x86_64/bits/fcntl.h b/sysdeps/unix/sysv/linux/x86_64/bits/fcntl.h index ac029fd..0246fb0 100644 --- a/sysdeps/unix/sysv/linux/x86_64/bits/fcntl.h +++ b/sysdeps/unix/sysv/linux/x86_64/bits/fcntl.h @@ -249,6 +249,21 @@ struct f_owner_ex # define SPLICE_F_GIFT 8 /* Pages passed in are a gift. */ #endif +/* Values for `*at' functions. */ +#ifdef __USE_ATFILE +# define AT_FDCWD -100 /* Special value used to indicate + the *at functions should use the + current working directory. */ +# define AT_SYMLINK_NOFOLLOW 0x100 /* Do not follow symbolic links. */ +# define AT_REMOVEDIR 0x200 /* Remove directory instead of + unlinking file. */ +# define AT_SYMLINK_FOLLOW 0x400 /* Follow symbolic links. */ +# define AT_NO_AUTOMOUNT 0x800 /* Suppress terminal automount + traversal. */ +# define AT_EACCESS 0x200 /* Test access permitted for + effective IDs, not real IDs. */ +#endif + __BEGIN_DECLS #ifdef __USE_GNU diff --git a/sysdeps/unix/sysv/linux/x86_64/clone.S b/sysdeps/unix/sysv/linux/x86_64/clone.S index db42f20..8a12b09 100644 --- a/sysdeps/unix/sysv/linux/x86_64/clone.S +++ b/sysdeps/unix/sysv/linux/x86_64/clone.S @@ -89,9 +89,6 @@ L(pseudo_end): ret L(thread_start): - cfi_startproc; - /* Clearing frame pointer is insufficient, use CFI. */ - cfi_undefined (rip); /* Clear the frame pointer. The ABI suggests this be done, to mark the outermost frame obviously. */ xorl %ebp, %ebp @@ -116,7 +113,6 @@ L(thread_start): /* Call exit with return value from function call. */ movq %rax, %rdi call HIDDEN_JUMPTARGET (_exit) - cfi_endproc; cfi_startproc; PSEUDO_END (BP_SYM (__clone)) diff --git a/sysdeps/unix/sysv/linux/x86_64/dl-cache.h b/sysdeps/unix/sysv/linux/x86_64/dl-cache.h index cb647ab..c22051b 100644 --- a/sysdeps/unix/sysv/linux/x86_64/dl-cache.h +++ b/sysdeps/unix/sysv/linux/x86_64/dl-cache.h @@ -22,4 +22,23 @@ #define _dl_cache_check_flags(flags) \ ((flags) == _DL_CACHE_DEFAULT_ID) -#include +#define add_system_dir(dir) \ + do \ + { \ + size_t len = strlen (dir); \ + char path[len + 3]; \ + memcpy (path, dir, len + 1); \ + if (len >= 6 && ! memcmp (path + len - 6, "/lib32", 6)) \ + { \ + len -= 2; \ + path[len] = '\0'; \ + } \ + add_dir (path); \ + if (len >= 4 && ! memcmp (path + len - 4, "/lib", 4)) \ + { \ + memcpy (path + len, "32", 3); \ + add_dir (path); \ + } \ + } while (0) + +#include diff --git a/sysdeps/unix/sysv/linux/x86_64/getcontext.S b/sysdeps/unix/sysv/linux/x86_64/getcontext.S index 4bbc7a4..09129d9 100644 --- a/sysdeps/unix/sysv/linux/x86_64/getcontext.S +++ b/sysdeps/unix/sysv/linux/x86_64/getcontext.S @@ -62,6 +62,7 @@ ENTRY(__getcontext) movq %rcx, oFPREGS(%rdi) /* Save the floating-point environment. */ fnstenv (%rcx) + fldenv (%rcx) stmxcsr oMXCSR(%rdi) /* Save the current signal mask with diff --git a/sysdeps/unix/sysv/linux/x86_64/sys/user.h b/sysdeps/unix/sysv/linux/x86_64/sys/user.h index ceadcf4..e49662a 100644 --- a/sysdeps/unix/sysv/linux/x86_64/sys/user.h +++ b/sysdeps/unix/sysv/linux/x86_64/sys/user.h @@ -24,6 +24,7 @@ you know what you are doing. */ #include +#include #if __WORDSIZE == 64 @@ -164,8 +165,7 @@ struct user }; #endif /* __WORDSIZE */ -#define PAGE_SHIFT 12 -#define PAGE_SIZE (1UL << PAGE_SHIFT) +#define PAGE_SIZE (sysconf(_SC_PAGESIZE)) #define PAGE_MASK (~(PAGE_SIZE-1)) #define NBPG PAGE_SIZE #define UPAGES 1 diff --git a/sysdeps/wordsize-64/Makefile b/sysdeps/wordsize-64/Makefile new file mode 100644 index 0000000..9903f51 --- /dev/null +++ b/sysdeps/wordsize-64/Makefile @@ -0,0 +1,6 @@ +ifeq ($(subdir),misc) +tests += tst-writev + +# Time enough for a large writev syscall to complete. +tst-writev-ENV = TIMEOUTFACTOR="10" +endif diff --git a/sysdeps/wordsize-64/tst-writev.c b/sysdeps/wordsize-64/tst-writev.c new file mode 100644 index 0000000..2d068c2 --- /dev/null +++ b/sysdeps/wordsize-64/tst-writev.c @@ -0,0 +1,108 @@ +/* Copyright (C) 2011 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ryan S. Arnold , 2011. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include +#include +#include +#include +#include +#include +#include + + +/* The purpose of this test is to verify that the INTERNAL_[V]SYSCALL_NCS + macros on 64-bit platforms don't cast the return type to (int) which would + erroneously sign extend the return value should the high bit of the bottom + half of the word be '1'. */ + +#if 0 +/* Used to test the non power-of-2 code path. */ +#undef IOV_MAX +#define IOV_MAX 1000 +#endif + +/* writev() should report that it has written EXPECTED number of bytes. */ +#define EXPECTED ((size_t) INT32_MAX + 1) + +static int +do_test (void) +{ + struct iovec iv[IOV_MAX]; + /* POSIX doesn't guarantee that IOV_MAX is pow of 2 but we're optimistic. */ + size_t bufsz = EXPECTED / IOV_MAX; + size_t bufrem = EXPECTED % IOV_MAX; + + /* If there's a remainder then IOV_MAX probably isn't a power of 2 and we + need to make bufsz bigger so that the last iovec, iv[IOV_MAX-1], is free + for the remainder. */ + if (bufrem) + { + bufsz = bufsz + 1; + bufrem = EXPECTED - (bufsz * (IOV_MAX - 1)); + } + + /* We writev to /dev/null since we're just testing writev's return value. */ + int fd = open (_PATH_DEVNULL, O_WRONLY); + if (fd == -1) + { + printf ("Unable to open /dev/null for writing.\n"); + return -1; + } + + iv[0].iov_base = malloc (bufsz); + if (iv[0].iov_base == NULL) + { + printf ("malloc (%zu) failed.\n", bufsz); + close (fd); + return -1; + } + iv[0].iov_len = bufsz; + + /* We optimistically presume that there isn't a remainder and set all iovec + instances to the same base and len as the first instance. */ + for (int i = 1; i < IOV_MAX; i++) + { + /* We don't care what the data is so reuse the allocation from iv[0]; */ + iv[i].iov_base = iv[0].iov_base; + iv[i].iov_len = iv[0].iov_len; + } + + /* If there is a remainder then we correct the last iov_len. */ + if (bufrem) + iv[IOV_MAX - 1].iov_len = bufrem; + + /* Write junk to /dev/null with the writev syscall in order to get a return + of INT32_MAX+1 bytes to verify that the INTERNAL_SYSCALL wrappers aren't + mangling the result if the signbit of a 32-bit number is set. */ + ssize_t ret = writev (fd, iv, IOV_MAX); + + free (iv[0].iov_base); + close (fd); + + if (ret != (ssize_t) EXPECTED) + { + printf ("writev() return value: %zd != EXPECTED: %zd\n", ret, EXPECTED); + return 1; + } + + return 0; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/sysdeps/x86_64/cacheinfo.c b/sysdeps/x86_64/cacheinfo.c index eae54e7..146656d 100644 --- a/sysdeps/x86_64/cacheinfo.c +++ b/sysdeps/x86_64/cacheinfo.c @@ -130,7 +130,7 @@ static const struct intel_02_cache_info { 0xdc, 12, 64, M(_SC_LEVEL3_CACHE_SIZE), 2097152 }, { 0xdd, 12, 64, M(_SC_LEVEL3_CACHE_SIZE), 4194304 }, { 0xde, 12, 64, M(_SC_LEVEL3_CACHE_SIZE), 8388608 }, - { 0xe3, 16, 64, M(_SC_LEVEL3_CACHE_SIZE), 2097152 }, + { 0xe2, 16, 64, M(_SC_LEVEL3_CACHE_SIZE), 2097152 }, { 0xe3, 16, 64, M(_SC_LEVEL3_CACHE_SIZE), 4194304 }, { 0xe4, 16, 64, M(_SC_LEVEL3_CACHE_SIZE), 8388608 }, { 0xea, 24, 64, M(_SC_LEVEL3_CACHE_SIZE), 12582912 }, @@ -181,6 +181,57 @@ intel_check_word (int name, unsigned int value, bool *has_level_2, /* No need to look further. */ break; } + else if (byte == 0xff) + { + /* CPUID leaf 0x4 contains all the information. We need to + iterate over it. */ + unsigned int eax; + unsigned int ebx; + unsigned int ecx; + unsigned int edx; + + unsigned int round = 0; + while (1) + { + asm volatile ("xchgl %%ebx, %1; cpuid; xchgl %%ebx, %1" + : "=a" (eax), "=r" (ebx), "=c" (ecx), "=d" (edx) + : "0" (4), "2" (round)); + + enum { null = 0, data = 1, inst = 2, uni = 3 } type = eax & 0x1f; + if (type == null) + /* That was the end. */ + break; + + unsigned int level = (eax >> 5) & 0x7; + + if ((level == 1 && type == data + && folded_rel_name == M(_SC_LEVEL1_DCACHE_SIZE)) + || (level == 1 && type == inst + && folded_rel_name == M(_SC_LEVEL1_ICACHE_SIZE)) + || (level == 2 && folded_rel_name == M(_SC_LEVEL2_CACHE_SIZE)) + || (level == 3 && folded_rel_name == M(_SC_LEVEL3_CACHE_SIZE)) + || (level == 4 && folded_rel_name == M(_SC_LEVEL4_CACHE_SIZE))) + { + unsigned int offset = M(name) - folded_rel_name; + + if (offset == 0) + /* Cache size. */ + return (((ebx >> 22) + 1) + * (((ebx >> 12) & 0x3ff) + 1) + * ((ebx & 0xfff) + 1) + * (ecx + 1)); + if (offset == 1) + return (ebx >> 22) + 1; + + assert (offset == 2); + return (ebx & 0xfff) + 1; + } + + ++round; + } + /* There is no other cache information anywhere else. */ + break; + } else { if (byte == 0x49 && folded_rel_name == M(_SC_LEVEL3_CACHE_SIZE)) @@ -254,7 +305,13 @@ intel_check_word (int name, unsigned int value, bool *has_level_2, static long int __attribute__ ((noinline)) handle_intel (int name, unsigned int maxidx) { - assert (maxidx >= 2); + if (maxidx < 2) + { + /* This should never happen as all Intel i686 CPU support a CPUID + level of 2 minimum. However valgrind sometimes load the i686 + library with a P55C CPUID. Return 0 in that case. */ + return 0; + } /* OK, we can use the CPUID instruction to get all info about the caches. */ diff --git a/sysdeps/x86_64/dl-irel.h b/sysdeps/x86_64/dl-irel.h index d2d5c06..19f9457 100644 --- a/sysdeps/x86_64/dl-irel.h +++ b/sysdeps/x86_64/dl-irel.h @@ -26,6 +26,13 @@ #define ELF_MACHINE_IRELA 1 +static inline Elf64_Addr +__attribute ((always_inline)) +elf_ifunc_invoke (Elf64_Addr addr) +{ + return ((Elf64_Addr (*) (void)) (addr)) (); +} + static inline void __attribute ((always_inline)) elf_irela (const Elf64_Rela *reloc) @@ -35,7 +42,7 @@ elf_irela (const Elf64_Rela *reloc) if (__builtin_expect (r_type == R_X86_64_IRELATIVE, 1)) { - Elf64_Addr value = ((Elf64_Addr (*) (void)) reloc->r_addend) (); + Elf64_Addr value = elf_ifunc_invoke(reloc->r_addend); *reloc_addr = value; } else diff --git a/sysdeps/x86_64/dl-tls.h b/sysdeps/x86_64/dl-tls.h index 9b389ed..205d06f 100644 --- a/sysdeps/x86_64/dl-tls.h +++ b/sysdeps/x86_64/dl-tls.h @@ -27,3 +27,6 @@ typedef struct dl_tls_index extern void *__tls_get_addr (tls_index *ti); + +/* Value used for dtv entries for which the allocation is delayed. */ +#define TLS_DTV_UNALLOCATED ((void *) -1l) diff --git a/sysdeps/x86_64/dl-trampoline.S b/sysdeps/x86_64/dl-trampoline.S index 5564a11..258c609 100644 --- a/sysdeps/x86_64/dl-trampoline.S +++ b/sysdeps/x86_64/dl-trampoline.S @@ -1,5 +1,5 @@ /* PLT trampolines. x86-64 version. - Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. + Copyright (C) 2004, 2005, 2007, 2009, 2011 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -27,8 +27,9 @@ .align 16 cfi_startproc _dl_runtime_resolve: + cfi_adjust_cfa_offset(16) # Incorporate PLT subq $56,%rsp - cfi_adjust_cfa_offset(72) # Incorporate PLT + cfi_adjust_cfa_offset(56) movq %rax,(%rsp) # Preserve registers otherwise clobbered. movq %rcx, 8(%rsp) movq %rdx, 16(%rsp) @@ -139,24 +140,34 @@ L(have_avx): movl $1, %eax cpuid movq %r11,%rbx # Restore rbx - movl $1, %eax - testl $(1 << 28), %ecx + xorl %eax, %eax + // AVX and XSAVE supported? + andl $((1 << 28) | (1 << 27)), %ecx + cmpl $((1 << 28) | (1 << 27)), %ecx jne 2f - negl %eax -2: movl %eax, L(have_avx)(%rip) + xorl %ecx, %ecx + // Get XFEATURE_ENABLED_MASK + xgetbv + andl $0x6, %eax + cmpl $0x6, %eax + // Nonzero if SSE and AVX state saving is enabled. + sete %al +2: leal -1(%eax,%eax), %eax + movl %eax, L(have_avx)(%rip) cmpl $0, %eax 1: js L(no_avx) # define RESTORE_AVX +# define MORE_CODE # include "dl-trampoline.h" .align 16 L(no_avx): # endif -# undef RESTORE_AVX -# include "dl-trampoline.h" +# undef RESTORE_AVX +# include "dl-trampoline.h" cfi_endproc .size _dl_runtime_profile, .-_dl_runtime_profile @@ -176,11 +187,20 @@ _dl_x86_64_save_sse: movl $1, %eax cpuid movq %r11,%rbx # Restore rbx - movl $1, %eax - testl $(1 << 28), %ecx + xorl %eax, %eax + // AVX and XSAVE supported? + andl $((1 << 28) | (1 << 27)), %ecx + cmpl $((1 << 28) | (1 << 27)), %ecx jne 2f - negl %eax -2: movl %eax, L(have_avx)(%rip) + xorl %ecx, %ecx + // Get XFEATURE_ENABLED_MASK + xgetbv + andl $0x6, %eax + cmpl $0x6, %eax + // Nonzero if SSE and AVX state saving is enabled. + sete %al +2: leal -1(%eax,%eax), %eax + movl %eax, L(have_avx)(%rip) cmpl $0, %eax 1: js L(no_avx5) diff --git a/sysdeps/x86_64/dl-trampoline.h b/sysdeps/x86_64/dl-trampoline.h index 5d49ed4..1c39579 100644 --- a/sysdeps/x86_64/dl-trampoline.h +++ b/sysdeps/x86_64/dl-trampoline.h @@ -1,6 +1,6 @@ /* Partial PLT profile trampoline to save and restore x86-64 vector registers. - Copyright (C) 2009 Free Software Foundation, Inc. + Copyright (C) 2009, 2011 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -195,14 +195,14 @@ _dl_call_pltexit. The La_x86_64_regs is being pointed by rsp now, so we just need to allocate the sizeof(La_x86_64_retval) space on the stack, since the alignment has already been taken care of. */ -# ifdef RESTORE_AVX +#ifdef RESTORE_AVX /* sizeof(La_x86_64_retval). Need extra space for 2 SSE registers to detect if xmm0/xmm1 registers are changed by audit module. */ subq $(LRV_SIZE + XMM_SIZE*2), %rsp -# else +#else subq $LRV_SIZE, %rsp # sizeof(La_x86_64_retval) -# endif +#endif movq %rsp, %rcx # La_x86_64_retval argument to %rcx. /* Fill in the La_x86_64_retval structure. */ @@ -212,7 +212,7 @@ movaps %xmm0, LRV_XMM0_OFFSET(%rcx) movaps %xmm1, LRV_XMM1_OFFSET(%rcx) -# ifdef RESTORE_AVX +#ifdef RESTORE_AVX /* This is to support AVX audit modules. */ vmovdqu %ymm0, LRV_VECTOR0_OFFSET(%rcx) vmovdqu %ymm1, LRV_VECTOR1_OFFSET(%rcx) @@ -221,14 +221,14 @@ by audit module. */ vmovdqa %xmm0, (LRV_SIZE)(%rcx) vmovdqa %xmm1, (LRV_SIZE + XMM_SIZE)(%rcx) -# endif +#endif fstpt LRV_ST0_OFFSET(%rcx) fstpt LRV_ST1_OFFSET(%rcx) movq 24(%rbx), %rdx # La_x86_64_regs argument to %rdx. movq 40(%rbx), %rsi # Copy args pushed by PLT in register. - movq 32(%rbx), %rdi # %rdi: link_map, %rsi: reloc_index + movq 32(%rbx), %rdi # %rdi: link_map, %rsi: reloc_index call _dl_call_pltexit /* Restore return registers. */ @@ -238,7 +238,7 @@ movaps LRV_XMM0_OFFSET(%rsp), %xmm0 movaps LRV_XMM1_OFFSET(%rsp), %xmm1 -# ifdef RESTORE_AVX +#ifdef RESTORE_AVX /* Check if xmm0/xmm1 registers are changed by audit module. */ vpcmpeqq (LRV_SIZE)(%rsp), %xmm0, %xmm2 vpmovmskb %xmm2, %esi @@ -253,7 +253,7 @@ vmovdqu LRV_VECTOR1_OFFSET(%rsp), %ymm1 1: -# endif +#endif fldt LRV_ST1_OFFSET(%rsp) fldt LRV_ST0_OFFSET(%rsp) @@ -267,3 +267,10 @@ # (eats the reloc index and link_map) cfi_adjust_cfa_offset(-48) retq + +#ifdef MORE_CODE + cfi_adjust_cfa_offset(48) + cfi_rel_offset(%rbx, 0) + cfi_def_cfa_register(%rbx) +# undef MORE_CODE +#endif diff --git a/sysdeps/x86_64/fpu/e_powl.S b/sysdeps/x86_64/fpu/e_powl.S index 4959bea..f6a09c8 100644 --- a/sysdeps/x86_64/fpu/e_powl.S +++ b/sysdeps/x86_64/fpu/e_powl.S @@ -154,7 +154,7 @@ ENTRY(__ieee754_powl) fucompp // 1.0 : x : y fnstsw fxch // x : 1.0 : y - test $4500,%eax + test $0x4500,%eax jz 7f fsub %st(1) // x-1 : 1.0 : y fyl2xp1 // log2(x) : y diff --git a/sysdeps/x86_64/memset.S b/sysdeps/x86_64/memset.S index f6eb71f..cf4caf4 100644 --- a/sysdeps/x86_64/memset.S +++ b/sysdeps/x86_64/memset.S @@ -23,7 +23,7 @@ #define __STOS_LOWER_BOUNDARY $8192 #define __STOS_UPPER_BOUNDARY $65536 - .text + .text #if !defined NOT_IN_libc && !defined USE_MULTIARCH ENTRY(__bzero) mov %rsi,%rdx /* Adjust parameter. */ @@ -417,7 +417,7 @@ L(P4Q0): mov %edx,-0x4(%rdi) retq .balign 16 -#if defined(USE_EXTRA_TABLE) +#ifdef USE_EXTRA_TABLE L(P5QI): mov %rdx,-0x95(%rdi) #endif L(P5QH): mov %rdx,-0x8d(%rdi) @@ -596,6 +596,8 @@ L(A6Q0): mov %dx,-0x6(%rdi) jmp L(aligned_now) L(SSE_pre): +#else +L(aligned_now): #endif #if !defined USE_MULTIARCH || defined USE_SSE2 # fill RegXMM0 with the pattern @@ -606,16 +608,16 @@ L(SSE_pre): jge L(byte32sse2_pre) add %r8,%rdi -#ifndef PIC +# ifndef PIC lea L(SSExDx)(%rip),%r9 jmpq *(%r9,%r8,8) -#else +# else lea L(SSE0Q0)(%rip),%r9 lea L(SSExDx)(%rip),%rcx movswq (%rcx,%r8,2),%rcx lea (%rcx,%r9,1),%r9 jmpq *%r9 -#endif +# endif L(SSE0QB): movdqa %xmm0,-0xb0(%rdi) L(SSE0QA): movdqa %xmm0,-0xa0(%rdi) @@ -881,16 +883,16 @@ L(byte32sse2): lea 0x80(%rdi),%rdi jge L(byte32sse2) add %r8,%rdi -#ifndef PIC +# ifndef PIC lea L(SSExDx)(%rip),%r11 jmpq *(%r11,%r8,8) -#else +# else lea L(SSE0Q0)(%rip),%r11 lea L(SSExDx)(%rip),%rcx movswq (%rcx,%r8,2),%rcx lea (%rcx,%r11,1),%r11 jmpq *%r11 -#endif +# endif .balign 16 L(sse2_nt_move_pre): @@ -916,20 +918,20 @@ L(sse2_nt_move): jge L(sse2_nt_move) sfence add %r8,%rdi -#ifndef PIC +# ifndef PIC lea L(SSExDx)(%rip),%r11 jmpq *(%r11,%r8,8) -#else +# else lea L(SSE0Q0)(%rip),%r11 lea L(SSExDx)(%rip),%rcx movswq (%rcx,%r8,2),%rcx lea (%rcx,%r11,1),%r11 jmpq *%r11 -#endif +# endif .pushsection .rodata .balign 16 -#ifndef PIC +# ifndef PIC L(SSExDx): .quad L(SSE0Q0), L(SSE1Q0), L(SSE2Q0), L(SSE3Q0) .quad L(SSE4Q0), L(SSE5Q0), L(SSE6Q0), L(SSE7Q0) @@ -979,7 +981,7 @@ L(SSExDx): .quad L(SSE4QB), L(SSE5QB), L(SSE6QB), L(SSE7QB) .quad L(SSE8QB), L(SSE9QB), L(SSE10QB), L(SSE11QB) .quad L(SSE12QB), L(SSE13QB), L(SSE14QB), L(SSE15QB) -#else +# else L(SSExDx): .short L(SSE0Q0) -L(SSE0Q0) .short L(SSE1Q0) -L(SSE0Q0) @@ -1196,14 +1198,14 @@ L(SSExDx): .short L(SSE13QB)-L(SSE0Q0) .short L(SSE14QB)-L(SSE0Q0) .short L(SSE15QB)-L(SSE0Q0) -#endif +# endif .popsection #endif /* !defined USE_MULTIARCH || defined USE_SSE2 */ .balign 16 +#ifndef USE_MULTIARCH L(aligned_now): -#ifndef USE_MULTIARCH cmpl $0x1,__x86_64_preferred_memory_instruction(%rip) jg L(SSE_pre) #endif /* USE_MULTIARCH */ @@ -1246,17 +1248,17 @@ L(8byte_move_loop): L(8byte_move_skip): andl $127,%r8d - lea (%rdi,%r8,1),%rdi + lea (%rdi,%r8,1),%rdi #ifndef PIC - lea L(setPxQx)(%rip),%r11 - jmpq *(%r11,%r8,8) # old scheme remained for nonPIC + lea L(setPxQx)(%rip),%r11 + jmpq *(%r11,%r8,8) # old scheme remained for nonPIC #else - lea L(Got0)(%rip),%r11 + lea L(Got0)(%rip),%r11 lea L(setPxQx)(%rip),%rcx movswq (%rcx,%r8,2),%rcx - lea (%rcx,%r11,1),%r11 - jmpq *%r11 + lea (%rcx,%r11,1),%r11 + jmpq *%r11 #endif .balign 16 @@ -1290,16 +1292,16 @@ L(8byte_stos_skip): ja L(8byte_nt_move) andl $7,%r8d - lea (%rdi,%r8,1),%rdi + lea (%rdi,%r8,1),%rdi #ifndef PIC - lea L(setPxQx)(%rip),%r11 - jmpq *(%r11,%r8,8) # old scheme remained for nonPIC + lea L(setPxQx)(%rip),%r11 + jmpq *(%r11,%r8,8) # old scheme remained for nonPIC #else - lea L(Got0)(%rip),%r11 + lea L(Got0)(%rip),%r11 lea L(setPxQx)(%rip),%rcx movswq (%rcx,%r8,2),%rcx lea (%rcx,%r11,1),%r11 - jmpq *%r11 + jmpq *%r11 #endif .balign 16 @@ -1338,16 +1340,16 @@ L(8byte_nt_move_loop): L(8byte_nt_move_skip): andl $127,%r8d - lea (%rdi,%r8,1),%rdi + lea (%rdi,%r8,1),%rdi #ifndef PIC - lea L(setPxQx)(%rip),%r11 - jmpq *(%r11,%r8,8) # old scheme remained for nonPIC + lea L(setPxQx)(%rip),%r11 + jmpq *(%r11,%r8,8) # old scheme remained for nonPIC #else - lea L(Got0)(%rip),%r11 + lea L(Got0)(%rip),%r11 lea L(setPxQx)(%rip),%rcx movswq (%rcx,%r8,2),%rcx - lea (%rcx,%r11,1),%r11 - jmpq *%r11 + lea (%rcx,%r11,1),%r11 + jmpq *%r11 #endif END (memset) diff --git a/sysdeps/x86_64/multiarch/init-arch.c b/sysdeps/x86_64/multiarch/init-arch.c index f0d2bb7..46abee6 100644 --- a/sysdeps/x86_64/multiarch/init-arch.c +++ b/sysdeps/x86_64/multiarch/init-arch.c @@ -111,6 +111,18 @@ __init_cpu_features (void) else kind = arch_kind_other; + if (__cpu_features.cpuid[COMMON_CPUID_INDEX_1].ecx & bit_AVX) + { + /* Reset the AVX bit in case OSXSAVE is disabled. */ + if ((__cpu_features.cpuid[COMMON_CPUID_INDEX_1].ecx & bit_OSXSAVE) == 0 + || ({ unsigned int xcrlow; + unsigned int xcrhigh; + asm ("xgetbv" + : "=a" (xcrlow), "=d" (xcrhigh) : "c" (0)); + (xcrlow & 6) != 6; })) + __cpu_features.cpuid[COMMON_CPUID_INDEX_1].ecx &= ~bit_AVX; + } + __cpu_features.family = family; __cpu_features.model = model; atomic_write_barrier (); diff --git a/sysdeps/x86_64/multiarch/init-arch.h b/sysdeps/x86_64/multiarch/init-arch.h index 6e409b8..b0789bd 100644 --- a/sysdeps/x86_64/multiarch/init-arch.h +++ b/sysdeps/x86_64/multiarch/init-arch.h @@ -29,6 +29,8 @@ # define bit_SSSE3 (1 << 9) # define bit_SSE4_1 (1 << 19) # define bit_SSE4_2 (1 << 20) +# define bit_OSXSAVE (1 << 27) +# define bit_AVX (1 << 28) # define index_SSE2 COMMON_CPUID_INDEX_1*CPUID_SIZE+CPUID_EDX_OFFSET # define index_SSSE3 COMMON_CPUID_INDEX_1*CPUID_SIZE+CPUID_ECX_OFFSET diff --git a/sysdeps/x86_64/multiarch/memcpy-ssse3-back.S b/sysdeps/x86_64/multiarch/memcpy-ssse3-back.S index 48c974e..bdd114a 100644 --- a/sysdeps/x86_64/multiarch/memcpy-ssse3-back.S +++ b/sysdeps/x86_64/multiarch/memcpy-ssse3-back.S @@ -49,7 +49,7 @@ ud2 .section .text.ssse3,"ax",@progbits -#if defined SHARED && !defined NOT_IN_libc +#if !defined USE_AS_BCOPY ENTRY (MEMCPY_CHK) cmpq %rdx, %rcx jb HIDDEN_JUMPTARGET (__chk_fail) diff --git a/sysdeps/x86_64/multiarch/memcpy-ssse3.S b/sysdeps/x86_64/multiarch/memcpy-ssse3.S index 9a878d3..cd7e45f 100644 --- a/sysdeps/x86_64/multiarch/memcpy-ssse3.S +++ b/sysdeps/x86_64/multiarch/memcpy-ssse3.S @@ -49,7 +49,7 @@ ud2 .section .text.ssse3,"ax",@progbits -#if defined SHARED && !defined NOT_IN_libc +#if !defined USE_AS_BCOPY ENTRY (MEMCPY_CHK) cmpq %rdx, %rcx jb HIDDEN_JUMPTARGET (__chk_fail) diff --git a/time/strftime_l.c b/time/strftime_l.c index 93974a4..8f2d431 100644 --- a/time/strftime_l.c +++ b/time/strftime_l.c @@ -518,13 +518,17 @@ __strftime_internal (s, maxsize, format, tp, tzset_called ut_argument only a few elements. Dereference the pointers only if the format requires this. Then it is ok to fail if the pointers are invalid. */ # define a_wkday \ - ((const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(ABDAY_1) + tp->tm_wday)) + ((const CHAR_T *) (tp->tm_wday < 0 || tp->tm_wday > 6 \ + ? "?" : _NL_CURRENT (LC_TIME, NLW(ABDAY_1) + tp->tm_wday))) # define f_wkday \ - ((const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(DAY_1) + tp->tm_wday)) + ((const CHAR_T *) (tp->tm_wday < 0 || tp->tm_wday > 6 \ + ? "?" : _NL_CURRENT (LC_TIME, NLW(DAY_1) + tp->tm_wday))) # define a_month \ - ((const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(ABMON_1) + tp->tm_mon)) + ((const CHAR_T *) (tp->tm_mon < 0 || tp->tm_mon > 11 \ + ? "?" : _NL_CURRENT (LC_TIME, NLW(ABMON_1) + tp->tm_mon))) # define f_month \ - ((const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(MON_1) + tp->tm_mon)) + ((const CHAR_T *) (tp->tm_mon < 0 || tp->tm_mon > 11 \ + ? "?" : _NL_CURRENT (LC_TIME, NLW(MON_1) + tp->tm_mon))) # define ampm \ ((const CHAR_T *) _NL_CURRENT (LC_TIME, tp->tm_hour > 11 \ ? NLW(PM_STR) : NLW(AM_STR))) @@ -534,8 +538,10 @@ __strftime_internal (s, maxsize, format, tp, tzset_called ut_argument # define ap_len STRLEN (ampm) #else # if !HAVE_STRFTIME -# define f_wkday (weekday_name[tp->tm_wday]) -# define f_month (month_name[tp->tm_mon]) +# define f_wkday (tp->tm_wday < 0 || tp->tm_wday > 6 \ + ? "?" : weekday_name[tp->tm_wday]) +# define f_month (tp->tm_mon < 0 || tp->tm_mon > 11 \ + ? "?" : month_name[tp->tm_mon]) # define a_wkday f_wkday # define a_month f_month # define ampm (L_("AMPM") + 2 * (tp->tm_hour > 11)) @@ -1329,7 +1335,7 @@ __strftime_internal (s, maxsize, format, tp, tzset_called ut_argument *tzset_called = true; } # endif - zone = tzname[tp->tm_isdst]; + zone = tp->tm_isdst <= 1 ? tzname[tp->tm_isdst] : "?"; } #endif if (! zone) diff --git a/time/tst-mktime2.c b/time/tst-mktime2.c index 0e4fd1e..407e940 100644 --- a/time/tst-mktime2.c +++ b/time/tst-mktime2.c @@ -2,6 +2,7 @@ #include #include #include +#include static time_t time_t_max; static time_t time_t_min; diff --git a/time/tst-strftime.c b/time/tst-strftime.c index 374fba4..af3ff72 100644 --- a/time/tst-strftime.c +++ b/time/tst-strftime.c @@ -4,6 +4,56 @@ #include +static int +do_bz18985 (void) +{ + char buf[1000]; + struct tm ttm; + int rc, ret = 0; + + memset (&ttm, 1, sizeof (ttm)); + ttm.tm_zone = NULL; /* Dereferenced directly if non-NULL. */ + rc = strftime (buf, sizeof (buf), "%a %A %b %B %c %z %Z", &ttm); + + if (rc == 66) + { + const char expected[] + = "? ? ? ? ? ? 16843009 16843009:16843009:16843009 16844909 +467836 ?"; + if (0 != strcmp (buf, expected)) + { + printf ("expected:\n %s\ngot:\n %s\n", expected, buf); + ret += 1; + } + } + else + { + printf ("expected 66, got %d\n", rc); + ret += 1; + } + + /* Check negative values as well. */ + memset (&ttm, 0xFF, sizeof (ttm)); + ttm.tm_zone = NULL; /* Dereferenced directly if non-NULL. */ + rc = strftime (buf, sizeof (buf), "%a %A %b %B %c %z %Z", &ttm); + + if (rc == 30) + { + const char expected[] = "? ? ? ? ? ? -1 -1:-1:-1 1899 "; + if (0 != strcmp (buf, expected)) + { + printf ("expected:\n %s\ngot:\n %s\n", expected, buf); + ret += 1; + } + } + else + { + printf ("expected 30, got %d\n", rc); + ret += 1; + } + + return ret; +} + static struct { const char *fmt; @@ -104,7 +154,7 @@ do_test (void) } } - return result; + return result + do_bz18985 (); } #define TEST_FUNCTION do_test () diff --git a/time/tzfile.c b/time/tzfile.c index f4cba46..d24057c 100644 --- a/time/tzfile.c +++ b/time/tzfile.c @@ -26,6 +26,7 @@ #include #include #include +#include #define NOID #include @@ -234,23 +235,58 @@ __tzfile_read (const char *file, size_t extra, char **extrap) goto read_again; } + if (__builtin_expect (num_transitions + > ((SIZE_MAX - (__alignof__ (struct ttinfo) - 1)) + / (sizeof (time_t) + 1)), 0)) + goto lose; total_size = num_transitions * (sizeof (time_t) + 1); total_size = ((total_size + __alignof__ (struct ttinfo) - 1) & ~(__alignof__ (struct ttinfo) - 1)); types_idx = total_size; - total_size += num_types * sizeof (struct ttinfo) + chars; + if (__builtin_expect (num_types + > (SIZE_MAX - total_size) / sizeof (struct ttinfo), 0)) + goto lose; + total_size += num_types * sizeof (struct ttinfo); + if (__builtin_expect (chars > SIZE_MAX - total_size, 0)) + goto lose; + total_size += chars; + if (__builtin_expect (__alignof__ (struct leap) - 1 + > SIZE_MAX - total_size, 0)) + goto lose; total_size = ((total_size + __alignof__ (struct leap) - 1) & ~(__alignof__ (struct leap) - 1)); leaps_idx = total_size; + if (__builtin_expect (num_leaps + > (SIZE_MAX - total_size) / sizeof (struct leap), 0)) + goto lose; total_size += num_leaps * sizeof (struct leap); - tzspec_len = (sizeof (time_t) == 8 && trans_width == 8 - ? st.st_size - (ftello (f) - + num_transitions * (8 + 1) - + num_types * 6 - + chars - + num_leaps * 12 - + num_isstd - + num_isgmt) - 1 : 0); + tzspec_len = 0; + if (sizeof (time_t) == 8 && trans_width == 8) + { + off_t rem = st.st_size - ftello (f); + if (__builtin_expect (rem < 0 + || (size_t) rem < (num_transitions * (8 + 1) + + num_types * 6 + + chars), 0)) + goto lose; + tzspec_len = (size_t) rem - (num_transitions * (8 + 1) + + num_types * 6 + + chars); + if (__builtin_expect (num_leaps > SIZE_MAX / 12 + || tzspec_len < num_leaps * 12, 0)) + goto lose; + tzspec_len -= num_leaps * 12; + if (__builtin_expect (tzspec_len < num_isstd, 0)) + goto lose; + tzspec_len -= num_isstd; + if (__builtin_expect (tzspec_len == 0 || tzspec_len - 1 < num_isgmt, 0)) + goto lose; + tzspec_len -= num_isgmt + 1; + if (__builtin_expect (SIZE_MAX - total_size < tzspec_len, 0)) + goto lose; + } + if (__builtin_expect (SIZE_MAX - total_size - tzspec_len < extra, 0)) + goto lose; /* Allocate enough memory including the extra block requested by the caller. */ -- 2.7.4

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/VjxgaV5u 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%0A5SSWe?Lk}^yqC6B&a}!gl)KVO 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%0A1vWZ{N|#0&-lre8E2HRx-B>$Dxnpz4e;h+ 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

O@p8l+%XhAy1@e2S(RvzJ;`b}eR)jS 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 z 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

l|>8Hw7lk$C`%N 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