2022-01-01 18:54:23 +00:00
|
|
|
|
# Copyright (C) 1991-2022 Free Software Foundation, Inc.
|
1995-02-18 01:27:10 +00:00
|
|
|
|
# This file is part of the GNU C Library.
|
|
|
|
|
|
|
|
|
|
# The GNU C Library is free software; you can redistribute it and/or
|
2001-07-06 04:58:11 +00:00
|
|
|
|
# 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.
|
1995-02-18 01:27:10 +00:00
|
|
|
|
|
|
|
|
|
# The GNU C Library is distributed in the hope that it will be useful,
|
|
|
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
2001-07-06 04:58:11 +00:00
|
|
|
|
# Lesser General Public License for more details.
|
1995-02-18 01:27:10 +00:00
|
|
|
|
|
2001-07-06 04:58:11 +00:00
|
|
|
|
# You should have received a copy of the GNU Lesser General Public
|
2012-02-09 23:18:22 +00:00
|
|
|
|
# License along with the GNU C Library; if not, see
|
Prefer https to http for gnu.org and fsf.org URLs
Also, change sources.redhat.com to sourceware.org.
This patch was automatically generated by running the following shell
script, which uses GNU sed, and which avoids modifying files imported
from upstream:
sed -ri '
s,(http|ftp)(://(.*\.)?(gnu|fsf|sourceware)\.org($|[^.]|\.[^a-z])),https\2,g
s,(http|ftp)(://(.*\.)?)sources\.redhat\.com($|[^.]|\.[^a-z]),https\2sourceware.org\4,g
' \
$(find $(git ls-files) -prune -type f \
! -name '*.po' \
! -name 'ChangeLog*' \
! -path COPYING ! -path COPYING.LIB \
! -path manual/fdl-1.3.texi ! -path manual/lgpl-2.1.texi \
! -path manual/texinfo.tex ! -path scripts/config.guess \
! -path scripts/config.sub ! -path scripts/install-sh \
! -path scripts/mkinstalldirs ! -path scripts/move-if-change \
! -path INSTALL ! -path locale/programs/charmap-kw.h \
! -path po/libc.pot ! -path sysdeps/gnu/errlist.c \
! '(' -name configure \
-execdir test -f configure.ac -o -f configure.in ';' ')' \
! '(' -name preconfigure \
-execdir test -f preconfigure.ac ';' ')' \
-print)
and then by running 'make dist-prepare' to regenerate files built
from the altered files, and then executing the following to cleanup:
chmod a+x sysdeps/unix/sysv/linux/riscv/configure
# Omit irrelevant whitespace and comment-only changes,
# perhaps from a slightly-different Autoconf version.
git checkout -f \
sysdeps/csky/configure \
sysdeps/hppa/configure \
sysdeps/riscv/configure \
sysdeps/unix/sysv/linux/csky/configure
# Omit changes that caused a pre-commit check to fail like this:
# remote: *** error: sysdeps/powerpc/powerpc64/ppc-mcount.S: trailing lines
git checkout -f \
sysdeps/powerpc/powerpc64/ppc-mcount.S \
sysdeps/unix/sysv/linux/s390/s390-64/syscall.S
# Omit change that caused a pre-commit check to fail like this:
# remote: *** error: sysdeps/sparc/sparc64/multiarch/memcpy-ultra3.S: last line does not end in newline
git checkout -f sysdeps/sparc/sparc64/multiarch/memcpy-ultra3.S
2019-09-07 05:40:42 +00:00
|
|
|
|
# <https://www.gnu.org/licenses/>.
|
1995-02-18 01:27:10 +00:00
|
|
|
|
|
|
|
|
|
subdir := mach
|
|
|
|
|
|
|
|
|
|
include ../Makeconfig
|
|
|
|
|
|
1995-03-27 17:44:04 +00:00
|
|
|
|
headers = mach_init.h mach.h mach_error.h mach-shortcuts.h mach/mach_traps.h \
|
1995-02-18 01:27:10 +00:00
|
|
|
|
$(interface-headers) mach/mach.h mach/mig_support.h mach/error.h \
|
2018-03-03 23:42:20 +00:00
|
|
|
|
$(lock-headers) machine-sp.h bits/mach/param.h
|
1995-04-01 09:01:49 +00:00
|
|
|
|
lock = spin-solid spin-lock mutex-init mutex-solid
|
hurd: Reimplement libc locks using mach's gsync
* hurd/Makefile (routines): Add hurdlock.
* hurd/Versions (GLIBC_PRIVATE): Added new entry to export the above
interface.
(HURD_CTHREADS_0.3): Remove __libc_getspecific.
* hurd/hurdpid.c: Include <lowlevellock.h>
(_S_msg_proc_newids): Use lll_wait to synchronize.
* hurd/hurdsig.c: (reauth_proc): Use __mutex_lock and __mutex_unlock.
* hurd/setauth.c: Include <hurdlock.h>, use integer for synchronization.
* mach/Makefile (lock-headers): Remove machine-lock.h.
* mach/lock-intern.h: Include <lowlevellock.h> instead of
<machine-lock.h>.
(__spin_lock_t): New type.
(__SPIN_LOCK_INITIALIZER): New macro.
(__spin_lock, __spin_unlock, __spin_try_lock, __spin_lock_locked,
__mutex_init, __mutex_lock_solid, __mutex_unlock_solid, __mutex_lock,
__mutex_unlock, __mutex_trylock): Use lll to implement locks.
* mach/mutex-init.c: Include <lowlevellock.h> instead of <cthreads.h>.
(__mutex_init): Initialize with lll.
* manual/errno.texi (EOWNERDEAD, ENOTRECOVERABLE): New errno values.
* sysdeps/mach/Makefile: Add libmachuser as dependencies for libs
needing lll.
* sysdeps/mach/hurd/bits/errno.h: Regenerate.
* sysdeps/mach/hurd/cthreads.c (__libc_getspecific): Remove function.
* sysdeps/mach/hurd/bits/libc-lock.h: Remove file.
* sysdeps/mach/hurd/setpgid.c: Include <lowlevellock.h>.
(__setpgid): Use lll for synchronization.
* sysdeps/mach/hurd/setsid.c: Likewise with __setsid.
* sysdeps/mach/bits/libc-lock.h: Include <tls.h> and <lowlevellock.h>
instead of <cthreads.h>.
(_IO_lock_inexpensive): New macro
(__libc_lock_recursive_t, __rtld_lock_recursive_t): New structures.
(__libc_lock_self0): New declaration.
(__libc_lock_owner_self): New macro.
(__libc_key_t): Remove type.
(_LIBC_LOCK_INITIALIZER): New macro.
(__libc_lock_define_initialized, __libc_lock_init, __libc_lock_fini,
__libc_lock_fini_recursive, __rtld_lock_fini_recursive,
__libc_lock_lock, __libc_lock_trylock, __libc_lock_unlock,
__libc_lock_define_initialized_recursive,
__rtld_lock_define_initialized_recursive,
__libc_lock_init_recursive, __libc_lock_trylock_recursive,
__libc_lock_lock_recursive, __libc_lock_unlock_recursive,
__rtld_lock_initialize, __rtld_lock_trylock_recursive,
__rtld_lock_lock_recursive, __rtld_lock_unlock_recursive
__libc_once_define, __libc_mutex_unlock): Reimplement with lll.
(__libc_lock_define_recursive, __rtld_lock_define_recursive,
_LIBC_LOCK_RECURSIVE_INITIALIZER, _RTLD_LOCK_RECURSIVE_INITIALIZER):
New macros.
Include <libc-lockP.h> to reimplement libc_key* with pthread_key*.
* hurd/hurdlock.c: New file.
* hurd/hurdlock.h: New file.
* mach/lowlevellock.h: New file
2018-03-18 17:22:55 +00:00
|
|
|
|
lock-headers = lock-intern.h spin-lock.h
|
1995-02-18 01:27:10 +00:00
|
|
|
|
routines = $(mach-syscalls) $(mach-shortcuts) \
|
2020-11-13 15:56:51 +00:00
|
|
|
|
mach_init mig_strncpy mig_memcpy msg \
|
1995-02-18 01:27:10 +00:00
|
|
|
|
mig-alloc mig-dealloc mig-reply \
|
|
|
|
|
msg-destroy msgserver \
|
|
|
|
|
mach_error errstring error_compat errsystems \
|
2002-02-17 07:13:23 +00:00
|
|
|
|
devstream setup-thread $(lock)
|
|
|
|
|
|
1995-02-18 01:27:10 +00:00
|
|
|
|
# The RPC interfaces go in a separate library.
|
Thu Mar 16 00:04:41 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
* locale/C-ctype.c: New correct data generated by drepper.
* Rules: Don't use $(libc.a).
Parsing of grouped numbers contributed by Ulrich Drepper.
* stdlib/strtol.c (__strtol_internal): Renamed from strtol. Take
new flag arg; if nonzero, parse locale-dependent thousands
grouping and interpret only the prefix that is correctly grouped.
(strtol): Define this to call _strtol_internal with zero for the flag.
Use a weak symbol for the definition.
* stdlib/strtod.c (strtod, __strtod_internal): Likewise.
Check for the exponent of the number overflowing the float format.
* stdlib/stdlib.h (__strtof, __strtold): Declarations removed.
(__strto{f,d,ld,l,ul,q,uq}_internal): Declare these functions.
[__OPTIMIZE__]: Define inline functions calling those.
* stdlib/grouping.h: New file, written by drepper.
* stdlib/Makefile (distribute): Add grouping.h.
* stdio/vfscanf.c: Grok %' modifier to numeric conversions. Call
__strtoX_internal with the grouping flag set iff the modifier is
present.
Wed Mar 15 00:40:54 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
* sysdeps/generic/memchr.c: Fix typos: limit.h -> limits.h.
* mach/Machrules: Produce static deps for all object flavors.
[interface-library]: Remove all these variables and rules.
($(interface-library)-routines): Define this variable.
(extra-libs): Append $(interface-library) to this.
* mach/Makefile (interface-library): Omit .a suffix.
* hurd/Makefile: Likewise.
Tue Mar 14 23:40:31 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
* stdio/internals.c (flushbuf): If !FLUSH_ONLY, don't skip out
early if no new data in buffer after priming.
* Makerules (object-suffixes, libtypes): Move all these variables
to Makeconfig.
* Makeconfig (object-suffixes, libtypes): Moved here from Makerules.
* Makerules (build-extra-lib): New canned sequence.
* sysdeps/mach/hurd/euidaccess.c: Include fcntl.h. Declare ERR;
fix uses of FILE and PORT. Remove bogus weak alias for `access'.
* sysdeps/mach/hurd/dirfd.c: Include hurd/fd.h and errno.h.
Add missing semicolon.
* sysdeps/mach/hurd/opendir.c: Include hurd/fd.h. Use a `struct
hurd_fd *' temp var, since DIRP->__fd is a `void *'.
* sysdeps/mach/hurd/readdir.c: Include hurd/fd.h.
* stdlib/wcstombs.c: #if 0 out code for non-ASCII chars until the
locale data format is implemented.
* sysdeps/mach/hurd/i386/trampoline.c (_hurd_setup_sighandler):
Pass &__sigreturn on the stack to the trampoline code, so it is
not position-dependent.
* stdio/printf_fp.c (NDEBUG): Define this to disable assert.
Don't include <stdarg.h>.
(__printf_fp): Last arg ARGS is now `const void **const';
dereference ARGS[0] instead of using va_arg.
* locale/setlocale.c: In LC_ALL case, initialize CATEGORY before
loop to install data.
* locale/loadlocale.c (_nl_category_num_items): Use _NL_ITEM_INDEX
to extract number from item code.
(_nl_load_locale): Close the descriptor when finished.
* malloc/realloc.c (_realloc_internal): Call _malloc_internal in
place of malloc.
* time/tzfile.c (__tzfile_default): Initialize RULE_STDOFF to zero.
1995-03-16 05:32:45 +00:00
|
|
|
|
interface-library := libmachuser
|
2002-02-17 07:13:23 +00:00
|
|
|
|
|
1996-06-05 19:07:37 +00:00
|
|
|
|
# We produce mach_interface.h from mach.defs because there is already a
|
|
|
|
|
# <mach/mach.h> that is not the interface header (thanks CMU).
|
2002-02-17 07:13:23 +00:00
|
|
|
|
mach-interface-list := $(patsubst mach,mach_interface,$(mach-interface-list))
|
1996-06-05 19:52:56 +00:00
|
|
|
|
mach/mach_interface.defs = mach/mach.defs
|
2002-02-17 07:13:23 +00:00
|
|
|
|
|
1996-06-05 19:52:56 +00:00
|
|
|
|
# Similarly for memory_object_user vs. memory_object
|
2002-02-17 07:13:23 +00:00
|
|
|
|
mach-interface-list := $(patsubst memory_object,memory_object_user,\
|
|
|
|
|
$(mach-interface-list))
|
1996-06-05 19:52:56 +00:00
|
|
|
|
mach/memory_object_user.defs = mach/memory_object.defs
|
2002-02-17 07:13:23 +00:00
|
|
|
|
|
|
|
|
|
user-interfaces := $(addprefix mach/,$(mach-interface-list) \
|
|
|
|
|
mach_port mach_host exc \
|
2012-03-07 10:17:13 +00:00
|
|
|
|
)\
|
2002-02-17 07:13:23 +00:00
|
|
|
|
$(addprefix device/,device device_request)
|
|
|
|
|
|
1996-02-14 06:39:32 +00:00
|
|
|
|
server-interfaces := mach/exc
|
2002-02-17 07:13:23 +00:00
|
|
|
|
|
1995-02-18 01:27:10 +00:00
|
|
|
|
# Clear any environment value.
|
|
|
|
|
generated =
|
2017-08-27 20:26:49 +00:00
|
|
|
|
|
|
|
|
|
# Avoid ssp before TLS is initialized.
|
|
|
|
|
CFLAGS-mach_init.o = $(no-stack-protector)
|
|
|
|
|
CFLAGS-RPC_vm_statistics.o = $(no-stack-protector)
|
|
|
|
|
CFLAGS-RPC_vm_map.o = $(no-stack-protector)
|
|
|
|
|
CFLAGS-RPC_vm_protect.o = $(no-stack-protector)
|
|
|
|
|
CFLAGS-RPC_i386_set_gdt.o = $(no-stack-protector)
|
|
|
|
|
CFLAGS-RPC_i386_set_ldt.o = $(no-stack-protector)
|
|
|
|
|
CFLAGS-RPC_task_get_special_port.o = $(no-stack-protector)
|
1995-02-18 01:27:10 +00:00
|
|
|
|
|
2002-02-19 00:22:30 +00:00
|
|
|
|
# Translate GNU names for CPUs into the names used in Mach header files.
|
|
|
|
|
mach-machine = $(patsubst powerpc,ppc,$(base-machine))
|
|
|
|
|
|
1995-02-18 01:27:10 +00:00
|
|
|
|
# Define mach-syscalls and sysno-*.
|
|
|
|
|
ifndef inhibit_mach_syscalls
|
1998-09-04 10:57:18 +00:00
|
|
|
|
-include $(objpfx)mach-syscalls.mk
|
1995-02-18 01:27:10 +00:00
|
|
|
|
endif
|
2016-03-20 18:50:58 +00:00
|
|
|
|
$(objpfx)mach-syscalls.mk: syscalls.awk Makefile libc-modules.h
|
1995-02-18 01:27:10 +00:00
|
|
|
|
# Go kludges!!!
|
1998-07-14 15:37:33 +00:00
|
|
|
|
$(make-target-directory)
|
2001-12-02 22:13:05 +00:00
|
|
|
|
# We must use $(CFLAGS) to get -O flags that affect #if's in header files.
|
1996-05-12 16:38:08 +00:00
|
|
|
|
echo '#include <mach/syscall_sw.h>' | \
|
2003-05-28 21:05:12 +00:00
|
|
|
|
$(CC) $(CFLAGS) $(CPPFLAGS) -E -MD -MP -MF $@-dep -MT $@ \
|
|
|
|
|
-x c-header - \
|
2002-02-19 00:22:30 +00:00
|
|
|
|
-D_MACH_`echo $(mach-machine) | tr a-z A-Z`_SYSCALL_SW_H_=1 | \
|
1996-05-12 16:38:08 +00:00
|
|
|
|
sed -n -e 's/^kernel_trap(\(.*\),\([-0-9]*\),\([0-9]*\))$$/\1 \2 \3/p'\
|
1998-04-21 18:15:51 +00:00
|
|
|
|
| $(AWK) -f $< > $@-new
|
2003-05-28 21:05:12 +00:00
|
|
|
|
ifneq (,$(objpfx))
|
|
|
|
|
sed $(sed-remove-objpfx) $@-dep >> $@-new
|
|
|
|
|
else
|
|
|
|
|
cat $@-dep >> $@-new
|
|
|
|
|
endif
|
|
|
|
|
rm -f $@-dep
|
1998-06-22 17:08:51 +00:00
|
|
|
|
mv -f $@-new $@
|
1995-02-18 01:27:10 +00:00
|
|
|
|
generated += mach-syscalls.mk
|
|
|
|
|
|
|
|
|
|
ifndef mach-syscalls
|
|
|
|
|
# We cannot make the deps properly until we know how to make the system
|
|
|
|
|
# call functions, and for that we must know what they all are.
|
|
|
|
|
no_deps=t
|
|
|
|
|
else
|
|
|
|
|
$(mach-syscalls:%=$(objpfx)%.S): $(objpfx)%.S: $(objpfx)mach-syscalls.mk
|
2002-05-13 01:48:25 +00:00
|
|
|
|
(echo '#include <sysdep.h>'; \
|
|
|
|
|
echo 'kernel_trap (__$*,$(sysno-$*),$(nargs-$*))'; \
|
2018-06-16 00:47:51 +00:00
|
|
|
|
echo 'weak_alias (__$*, $*)'; \
|
|
|
|
|
echo 'libc_hidden_def (__$*)') > $@-new
|
1998-06-22 17:08:51 +00:00
|
|
|
|
mv -f $@-new $@
|
1995-02-18 01:27:10 +00:00
|
|
|
|
generated += $(mach-syscalls:=.S)
|
|
|
|
|
endif # mach-syscalls
|
|
|
|
|
|
2002-02-19 00:22:30 +00:00
|
|
|
|
# These syscalls that look like RPCs actually have no RPC equivalents.
|
|
|
|
|
mach-shortcuts := $(filter-out device_writev_request \
|
|
|
|
|
device_read_overwrite_request \
|
|
|
|
|
device_read_overwrite \
|
|
|
|
|
vm_read_overwrite \
|
|
|
|
|
thread_switch \
|
|
|
|
|
,\
|
1995-02-18 01:27:10 +00:00
|
|
|
|
$(patsubst syscall_%,%,$(filter syscall_%,$(mach-syscalls))))
|
|
|
|
|
|
|
|
|
|
ifndef mach-shortcuts
|
|
|
|
|
# Forget about mach_interface.defs for this run. On the next run,
|
|
|
|
|
# $(mach-shortcuts) will be set, and that will change how
|
|
|
|
|
# mach_interface.defs is processed: it will get the -D flags below.
|
2002-02-17 07:13:23 +00:00
|
|
|
|
user-interfaces := $(filter-out $(mach-interface-list:%=mach/%) \
|
2018-01-28 18:38:09 +00:00
|
|
|
|
mach/mach_port mach/mach_host mach/mach4 mach/gnumach \
|
1995-02-18 01:27:10 +00:00
|
|
|
|
device/device_request,\
|
|
|
|
|
$(user-interfaces))
|
|
|
|
|
endif
|
|
|
|
|
|
1996-08-29 19:45:04 +00:00
|
|
|
|
# For some reason, the calls in this file are `protected' by an ifdef.
|
|
|
|
|
MIGFLAGS-mach/mach4=-DMACH_PCSAMPLE
|
|
|
|
|
|
1995-02-18 01:27:10 +00:00
|
|
|
|
# Make the MiG stubs for $(mach-shortcuts) be CALL_rpc.
|
|
|
|
|
migdefines += $(foreach call,$(mach-shortcuts),-D$(call)=$(call)_rpc)
|
2002-02-17 07:13:23 +00:00
|
|
|
|
$(mach-interface-list:%=mach/%.uh) \
|
|
|
|
|
mach/mach_host.uh mach/mach_port.uh: $(objpfx)mach-syscalls.mk
|
1995-02-18 01:27:10 +00:00
|
|
|
|
|
|
|
|
|
ifdef mach-shortcuts
|
|
|
|
|
$(mach-shortcuts:%=$(objpfx)%.c): $(objpfx)%.c: shortcut.awk \
|
|
|
|
|
$(objpfx)RPC_%_rpc.c
|
1998-04-21 18:15:51 +00:00
|
|
|
|
$(AWK) -v alias=$* -v call=__$* -v rpc=__$*_rpc \
|
|
|
|
|
-v syscall=__syscall_$* -f $^ > $@-new
|
1998-06-22 17:08:51 +00:00
|
|
|
|
mv -f $@-new $@
|
1995-02-18 01:27:10 +00:00
|
|
|
|
generated += $(mach-shortcuts:%=%.c)
|
|
|
|
|
endif # mach-shortcuts
|
|
|
|
|
|
|
|
|
|
# Generate mach-shortcuts.h, which will contain the prototypes for the
|
|
|
|
|
# shortcutted kernel RPC functions.
|
2002-02-17 07:13:23 +00:00
|
|
|
|
$(objpfx)mach-shortcuts.h: $(mach-interface-list:%=$(objpfx)mach/%.h) \
|
1996-08-12 23:22:12 +00:00
|
|
|
|
$(objpfx)mach/mach_host.h \
|
1995-02-18 01:27:10 +00:00
|
|
|
|
$(objpfx)mach/mach_port.h
|
|
|
|
|
# The first line gets us one paragraph per line, with @s separating real lines.
|
|
|
|
|
# The second line selects paragraphs for the shortcutted functions.
|
1996-12-20 01:39:50 +00:00
|
|
|
|
# The third line removes `_rpc' from the names and reconstitutes the lines.
|
2018-03-03 23:13:47 +00:00
|
|
|
|
( echo "#include <mach/mach_types.h>" ; \
|
|
|
|
|
echo "#include <mach/message.h>" ; \
|
|
|
|
|
echo ; \
|
|
|
|
|
cat $^ | tr \\012 @ | sed s/@@/@%/g | tr % \\012 \
|
|
|
|
|
| grep '^/\* Routine [a-z0-9_]*_rpc \*/' \
|
|
|
|
|
| sed 's/_rpc//g' | tr @ \\012 ) > $@-new
|
1998-06-22 17:08:51 +00:00
|
|
|
|
mv -f $@-new $@
|
1995-02-18 01:27:10 +00:00
|
|
|
|
generated += mach-shortcuts.h
|
|
|
|
|
|
|
|
|
|
before-compile += $(objpfx)mach-shortcuts.h
|
|
|
|
|
|
|
|
|
|
include Machrules
|
|
|
|
|
include ../Rules
|
|
|
|
|
|
|
|
|
|
|
1995-05-08 09:11:25 +00:00
|
|
|
|
# A gcc bug prevents the generated file from working properly,
|
|
|
|
|
# so we have one in the distribution for the time being.
|
1995-02-18 01:27:10 +00:00
|
|
|
|
generated += errsystems.c
|
|
|
|
|
$(objpfx)errsystems.c: errsystems.awk err_*.sub \
|
|
|
|
|
$(wildcard $(addsuffix /err_*.sub,$(+sysdep_dirs)))
|
1998-04-21 18:15:51 +00:00
|
|
|
|
$(AWK) -v subsys='$(filter-out $<,$^)' -f $^ > $@.n
|
1998-06-22 17:08:51 +00:00
|
|
|
|
mv -f $@.n $@
|
2002-12-31 02:04:37 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Convenient target to update all the generated source files.
|
|
|
|
|
.PHONY: generated
|
|
|
|
|
generated: $(addprefix $(common-objpfx),$(common-generated)) \
|
|
|
|
|
$(addprefix $(objpfx),$(generated))
|
2003-02-15 22:59:19 +00:00
|
|
|
|
|
|
|
|
|
.PHONY: mach-before-compile
|
|
|
|
|
mach-before-compile: $(mach-before-compile)
|