1dnl Process this file with autoconf to produce a configure script.
2dnl
3dnl   Copyright (C) 2012-2024 Free Software Foundation, Inc.
4dnl
5dnl This file is free software; you can redistribute it and/or modify
6dnl it under the terms of the GNU General Public License as published by
7dnl the Free Software Foundation; either version 3 of the License, or
8dnl (at your option) any later version.
9dnl
10dnl This program is distributed in the hope that it will be useful,
11dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
12dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13dnl GNU General Public License for more details.
14dnl
15dnl You should have received a copy of the GNU General Public License
16dnl along with this program; see the file COPYING3.  If not see
17dnl <http://www.gnu.org/licenses/>.
18dnl
19
20m4_include([../bfd/version.m4])
21m4_include([../config/debuginfod.m4])
22AC_INIT([binutils], BFD_VERSION)
23AC_CONFIG_SRCDIR(ar.c)
24
25AC_CANONICAL_TARGET
26
27AM_INIT_AUTOMAKE
28AM_SILENT_RULES([yes])
29
30AC_PROG_CC
31AC_GNU_SOURCE
32AC_USE_SYSTEM_EXTENSIONS
33
34LT_INIT
35ACX_LARGEFILE
36
37ac_checking=
38. ${srcdir}/../bfd/development.sh
39test "$development" = true && ac_checking=yes
40AC_ARG_ENABLE(checking,
41[  --enable-checking       enable run-time checks],
42[case "${enableval}" in
43  no|none)  ac_checking= ;;
44  *)          ac_checking=yes ;;
45esac])dnl
46if test x$ac_checking != x ; then
47  AC_DEFINE(ENABLE_CHECKING, 1, [Define if you want run-time sanity checks.])
48fi
49
50AC_ARG_ENABLE(targets,
51[  --enable-targets        alternative target configurations],
52[case "${enableval}" in
53  yes | "") AC_MSG_ERROR(enable-targets option must specify target names or 'all')
54            ;;
55  no)       enable_targets= ;;
56  *)        enable_targets=$enableval ;;
57esac])dnl
58
59
60AC_ARG_ENABLE(deterministic-archives,
61[AS_HELP_STRING([--enable-deterministic-archives],
62                    [ar and ranlib default to -D behavior])], [
63if test "${enableval}" = no; then
64  default_ar_deterministic=0
65else
66  default_ar_deterministic=1
67fi], [default_ar_deterministic=0])
68
69AC_DEFINE_UNQUOTED(DEFAULT_AR_DETERMINISTIC, $default_ar_deterministic,
70                       [Should ar and ranlib use -D behavior by default?])
71
72
73AC_ARG_ENABLE(default-strings-all,
74[AS_HELP_STRING([--disable-default-strings-all],
75                    [strings defaults to --data behavior])], [
76if test "${enableval}" = no; then
77  default_strings_all=0
78else
79  default_strings_all=1
80fi], [default_strings_all=1])
81
82AC_DEFINE_UNQUOTED(DEFAULT_STRINGS_ALL, $default_strings_all,
83                       [Should strings use -a behavior by default?])
84
85
86AC_ARG_ENABLE(f-for-ifunc-symbols,
87[AS_HELP_STRING([--enable-f-for-ifunc-symbols],
88          [Have nm use F and f for global and local ifunc symbols])], [
89if test "${enableval}" = no; then
90  default_f_for_ifunc=0
91else
92  default_f_for_ifunc=1
93fi], [default_f_for_ifunc=0])
94
95AC_DEFINE_UNQUOTED(DEFAULT_F_FOR_IFUNC_SYMBOLS, $default_f_for_ifunc,
96                       [Have nm use F and f for global and local ifunc symbols])
97
98
99AC_ARG_ENABLE(follow-debug-links,
100[AS_HELP_STRING([--enable-follow-debug-links],
101          [Have readelf and objdump follow debug links by default])], [
102if test "${enableval}" = no; then
103  default_for_follow_links=0
104else
105  default_for_follow_links=1
106fi], [default_for_follow_links=1])
107
108AC_DEFINE_UNQUOTED(DEFAULT_FOR_FOLLOW_LINKS, $default_for_follow_links,
109                       [Have readelf and objdump follow debug links by default])
110
111
112
113
114AC_ARG_ENABLE(colored-disassembly,
115[AS_HELP_STRING([--enable-colored-disassembly],
116          [Have objdump use colors in its disassembly by default])], [
117if test "${enableval}" = no; then
118  default_for_colored_disassembly=0
119else
120  default_for_colored_disassembly=1
121fi], [default_for_colored_disassembly=0])
122
123AC_DEFINE_UNQUOTED(DEFAULT_FOR_COLORED_DISASSEMBLY, $default_for_colored_disassembly,
124                       [Have objdump use colors in its disassembly by default])
125
126
127AC_DEBUGINFOD
128
129GCC_ENABLE([libctf], [yes], [], [Handle .ctf type-info sections])
130if test "${enable_libctf}" = yes; then
131    AC_DEFINE(ENABLE_LIBCTF, 1, [Handle .ctf type-info sections])
132fi
133AM_CONDITIONAL(ENABLE_LIBCTF, test "${enable_libctf}" = yes)
134
135AM_BINUTILS_WARNINGS
136
137AC_CONFIG_HEADERS(config.h:config.in)
138
139AH_VERBATIM([00_CONFIG_H_CHECK],
140[/* Check that config.h is #included before system headers
141   (this works only for glibc, but that should be enough).  */
142#if defined(__GLIBC__) && !defined(__FreeBSD_kernel__) && !defined(__CONFIG_H__)
143#  error config.h must be #included before system headers
144#endif
145#define __CONFIG_H__ 1])
146
147if test -z "$target" ; then
148    AC_MSG_ERROR(Unrecognized target system type; please check config.sub.)
149fi
150if test -z "$host" ; then
151    AC_MSG_ERROR(Unrecognized host system type; please check config.sub.)
152fi
153
154AC_PROG_YACC
155AM_PROG_LEX
156
157ALL_LINGUAS="bg ca da es fi fr hr id it ja pt ro ru rw sk sr sv tr uk vi zh_CN zh_TW"
158ZW_GNU_GETTEXT_SISTER_DIR
159AM_PO_SUBDIRS
160
161AM_MAINTAINER_MODE
162AM_CONDITIONAL(GENINSRC_NEVER, false)
163AC_EXEEXT
164if test -n "$EXEEXT"; then
165  AC_DEFINE(HAVE_EXECUTABLE_SUFFIX, 1,
166              [Does the platform use an executable suffix?])
167fi
168AC_DEFINE_UNQUOTED(EXECUTABLE_SUFFIX, "${EXEEXT}",
169                       [Suffix used for executables, if any.])
170
171# host-specific stuff:
172
173HDEFINES=
174
175. ${srcdir}/../bfd/configure.host
176
177AC_SUBST(HDEFINES)
178AR=${AR-ar}
179AC_SUBST(AR)
180AC_PROG_RANLIB
181AC_PROG_INSTALL
182
183BFD_CC_FOR_BUILD
184
185DEMANGLER_NAME=c++filt
186case "${host}" in
187  *-*-go32* | *-*-msdos*)
188    DEMANGLER_NAME=cxxfilt
189esac
190AC_SUBST(DEMANGLER_NAME)
191
192# We use headers from include/ that check various HAVE_*_H macros, thus
193# should ensure they are set by configure.  This is true even when C99
194# guarantees they are available.
195# plugin-api.h tests HAVE_STDINT_H and HAVE_INTTYPES_H
196# Besides those, we need to check anything used in binutils/ not in C99.
197AC_CHECK_HEADERS(fcntl.h inttypes.h stdint.h sys/file.h \
198                     sys/stat.h sys/time.h sys/types.h unistd.h)
199AC_HEADER_SYS_WAIT
200AC_FUNC_MMAP
201AC_CHECK_FUNCS(fseeko fseeko64 getc_unlocked mkdtemp mkstemp utimensat utimes)
202
203AC_MSG_CHECKING([for mbstate_t])
204AC_TRY_COMPILE([#include <wchar.h>],
205[mbstate_t teststate;],
206have_mbstate_t=yes, have_mbstate_t=no)
207AC_MSG_RESULT($have_mbstate_t)
208if test x"$have_mbstate_t" = xyes; then
209  AC_DEFINE(HAVE_MBSTATE_T,1,[Define if mbstate_t exists in wchar.h.])
210fi
211
212# Copied from gnulib stat-time.m4.
213# We should just switch over to using gnulib.
214AC_CHECK_MEMBERS([struct stat.st_atim.tv_nsec],
215  [AC_CACHE_CHECK([whether struct stat.st_atim is of type struct timespec],
216     [ac_cv_typeof_struct_stat_st_atim_is_struct_timespec],
217     [AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
218        [[
219          #include <sys/types.h>
220          #include <sys/stat.h>
221          #if HAVE_SYS_TIME_H
222          # include <sys/time.h>
223          #endif
224          #include <time.h>
225          struct timespec ts;
226          struct stat st;
227        ]],
228        [[
229          st.st_atim = ts;
230        ]])],
231        [ac_cv_typeof_struct_stat_st_atim_is_struct_timespec=yes],
232        [ac_cv_typeof_struct_stat_st_atim_is_struct_timespec=no])])
233   if test $ac_cv_typeof_struct_stat_st_atim_is_struct_timespec = yes; then
234     AC_DEFINE([TYPEOF_STRUCT_STAT_ST_ATIM_IS_STRUCT_TIMESPEC], [1],
235       [Define to 1 if the type of the st_atim member of a struct stat is
236        struct timespec.])
237   fi],
238  [AC_CHECK_MEMBERS([struct stat.st_atimespec.tv_nsec], [],
239     [AC_CHECK_MEMBERS([struct stat.st_atimensec], [],
240        [AC_CHECK_MEMBERS([struct stat.st_atim.st__tim.tv_nsec], [], [],
241           [#include <sys/types.h>
242            #include <sys/stat.h>])],
243        [#include <sys/types.h>
244         #include <sys/stat.h>])],
245     [#include <sys/types.h>
246      #include <sys/stat.h>])],
247  [#include <sys/types.h>
248   #include <sys/stat.h>])
249
250# Some systems have frexp only in -lm, not in -lc.
251AC_SEARCH_LIBS(frexp, m)
252
253AM_LC_MESSAGES
254
255AC_MSG_CHECKING(for a known getopt prototype in unistd.h)
256AC_CACHE_VAL(bu_cv_decl_getopt_unistd_h,
257[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include <unistd.h>], [extern int getopt (int, char *const*, const char *);])],
258bu_cv_decl_getopt_unistd_h=yes, bu_cv_decl_getopt_unistd_h=no)])
259AC_MSG_RESULT($bu_cv_decl_getopt_unistd_h)
260if test $bu_cv_decl_getopt_unistd_h = yes; then
261  AC_DEFINE([HAVE_DECL_GETOPT], 1,
262              [Is the prototype for getopt in <unistd.h> in the expected format?])
263fi
264
265# Under Next 3.2 <utime.h> apparently does not define struct utimbuf
266# by default.
267AC_MSG_CHECKING([for utime.h])
268AC_CACHE_VAL(bu_cv_header_utime_h,
269[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include <sys/types.h>
270#ifdef HAVE_TIME_H
271#include <time.h>
272#endif
273#include <utime.h>],
274[struct utimbuf s;])],
275bu_cv_header_utime_h=yes, bu_cv_header_utime_h=no)])
276AC_MSG_RESULT($bu_cv_header_utime_h)
277if test $bu_cv_header_utime_h = yes; then
278  AC_DEFINE(HAVE_GOOD_UTIME_H, 1, [Does <utime.h> define struct utimbuf?])
279fi
280
281AC_CHECK_DECLS([asprintf, environ, getc_unlocked, stpcpy, strnlen])
282
283# Link in zlib/zstd if we can.  This allows us to read compressed debug
284# sections.  This is used only by readelf.c (objdump uses bfd for
285# reading compressed sections).
286AM_ZLIB
287AC_ZSTD
288
289BFD_BINARY_FOPEN
290
291# Support for the msgpack C library.
292AC_ARG_WITH([msgpack],
293              AC_HELP_STRING([--with-msgpack], [Enable msgpack support (auto/yes/no)]),
294              [],
295              [with_msgpack=auto])
296
297AS_IF([test "$with_msgpack" != no],
298  [PKG_CHECK_MODULES(MSGPACK, msgpack,
299    [AC_DEFINE([HAVE_MSGPACK], [1], [Define to 1 if msgpack is available.])],
300    [AS_IF([test "$with_msgpack" = yes],
301      [AC_MSG_ERROR([--with-msgpack was given, but msgpack is missing or unusable.])])])])
302
303# target-specific stuff:
304
305# Canonicalize the secondary target names.
306if test -n "$enable_targets"; then
307    for targ in `echo $enable_targets | sed 's/,/ /g'`
308    do
309          result=`$ac_config_sub $targ 2>/dev/null`
310          if test -n "$result"; then
311              canon_targets="$canon_targets $result"
312          else
313              # Allow targets that config.sub doesn't recognize, like "all".
314              canon_targets="$canon_targets $targ"
315          fi
316    done
317fi
318
319AC_CHECK_HEADER(iconv.h)
320AM_ICONV
321
322BUILD_SRCONV=
323BUILD_DLLTOOL=
324DLLTOOL_DEFS=
325DLLTOOL_DEFAULT=
326BUILD_WINDRES=
327BUILD_WINDMC=
328BUILD_DLLWRAP=
329BUILD_MISC=
330BUILD_INSTALL_MISC=
331OBJDUMP_DEFS=
332OBJDUMP_PRIVATE_VECTORS=
333OBJDUMP_PRIVATE_OFILES=
334od_vectors=
335
336for targ in $target $canon_targets
337do
338    case $targ in
339    all | *-*-hms*)
340          BUILD_SRCONV='$(SRCONV_PROG)'
341          ;;
342    esac
343
344    case $targ in
345    all | spu-*-*)
346          BUILD_MISC='bin2c$(EXEEXT_FOR_BUILD)'
347          ;;
348    esac
349
350    case $targ in
351    powerpc*-*-linux* | powerpc*-*-elf* | powerpc*-*-eabi*)
352          BUILD_INSTALL_MISC=embedspu
353          ;;
354    esac
355
356    case $targ in
357    mep-*)
358          OBJDUMP_DEFS="-DSKIP_ZEROES=256 -DSKIP_ZEROES_AT_END=0"
359          ;;
360changequote(,)dnl
361    powerpc*-aix5.[01])
362          ;;
363    powerpc*-aix[5-9].*)
364changequote([,])dnl
365          OBJDUMP_DEFS="-DAIX_WEAK_SUPPORT"
366          ;;
367    esac
368
369    case $targ in
370    aarch64-*-mingw*)
371          BUILD_DLLTOOL='$(DLLTOOL_PROG)$(EXEEXT)'
372          if test -z "$DLLTOOL_DEFAULT"; then
373              DLLTOOL_DEFAULT="-DDLLTOOL_DEFAULT_AARCH64"
374          fi
375          DLLTOOL_DEFS="$DLLTOOL_DEFS -DDLLTOOL_AARCH64"
376          BUILD_WINDRES='$(WINDRES_PROG)$(EXEEXT)'
377          BUILD_WINDMC='$(WINDMC_PROG)$(EXEEXT)'
378          BUILD_DLLWRAP='$(DLLWRAP_PROG)$(EXEEXT)'
379          ;;
380    arm-wince-pe* | arm-*-wince | arm*-*-cegcc* | arm*-*-mingw32ce*)
381          BUILD_DLLTOOL='$(DLLTOOL_PROG)$(EXEEXT)'
382          if test -z "$DLLTOOL_DEFAULT"; then
383              DLLTOOL_DEFAULT="-DDLLTOOL_DEFAULT_ARM_WINCE"
384          fi
385          DLLTOOL_DEFS="$DLLTOOL_DEFS -DDLLTOOL_ARM_WINCE -DDLLTOOL_ARM"
386          BUILD_WINDRES='$(WINDRES_PROG)$(EXEEXT)'
387          BUILD_WINDMC='$(WINDMC_PROG)$(EXEEXT)'
388          ;;
389    arm-*-pe*)
390          BUILD_DLLTOOL='$(DLLTOOL_PROG)$(EXEEXT)'
391          if test -z "$DLLTOOL_DEFAULT"; then
392              DLLTOOL_DEFAULT="-DDLLTOOL_DEFAULT_ARM"
393          fi
394          DLLTOOL_DEFS="$DLLTOOL_DEFS -DDLLTOOL_ARM"
395          BUILD_WINDRES='$(WINDRES_PROG)$(EXEEXT)'
396          BUILD_WINDMC='$(WINDMC_PROG)$(EXEEXT)'
397          ;;
398changequote(,)dnl
399    i[3-7]86-*-pe* | i[3-7]86-*-cygwin* | i[3-7]86-*-mingw32** | all)
400changequote([,])dnl
401          BUILD_DLLTOOL='$(DLLTOOL_PROG)$(EXEEXT)'
402          if test -z "$DLLTOOL_DEFAULT"; then
403              DLLTOOL_DEFAULT="-DDLLTOOL_DEFAULT_I386"
404          fi
405          DLLTOOL_DEFS="$DLLTOOL_DEFS -DDLLTOOL_I386"
406          BUILD_WINDRES='$(WINDRES_PROG)$(EXEEXT)'
407          BUILD_WINDMC='$(WINDMC_PROG)$(EXEEXT)'
408          BUILD_DLLWRAP='$(DLLWRAP_PROG)$(EXEEXT)'
409          ;;
410changequote(,)dnl
411    i[3-7]86-*-interix)
412changequote([,])dnl
413          BUILD_DLLTOOL='$(DLLTOOL_PROG)'
414          if test -z "$DLLTOOL_DEFAULT"; then
415              DLLTOOL_DEFAULT="-DDLLTOOL_DEFAULT_I386"
416          fi
417          DLLTOOL_DEFS="$DLLTOOL_DEFS -DDLLTOOL_I386"
418          ;;
419    mcore-*-pe)
420          BUILD_DLLTOOL='$(DLLTOOL_PROG)$(EXEEXT)'
421          if test -z "$DLLTOOL_DEFAULT"; then
422              DLLTOOL_DEFAULT="-DDLLTOOL_DEFAULT_MCORE"
423          fi
424          DLLTOOL_DEFS="$DLLTOOL_DEFS -DDLLTOOL_MCORE"
425          BUILD_WINDRES='$(WINDRES_PROG)$(EXEEXT)'
426          BUILD_WINDMC='$(WINDMC_PROG)$(EXEEXT)'
427          ;;
428    mcore-*-elf)
429          BUILD_DLLTOOL='$(DLLTOOL_PROG)$(EXEEXT)'
430          if test -z "$DLLTOOL_DEFAULT"; then
431              DLLTOOL_DEFAULT="-DDLLTOOL_DEFAULT_MCORE_ELF"
432          fi
433          DLLTOOL_DEFS="$DLLTOOL_DEFS -DDLLTOOL_MCORE_ELF"
434          ;;
435    sh*-*-pe)
436          BUILD_DLLTOOL='$(DLLTOOL_PROG)$(EXEEXT)'
437          if test -z "$DLLTOOL_DEFAULT"; then
438              DLLTOOL_DEFAULT="-DDLLTOOL_DEFAULT_SH"
439          fi
440          DLLTOOL_DEFS="$DLLTOOL_DEFS -DDLLTOOL_SH"
441          BUILD_WINDRES='$(WINDRES_PROG)$(EXEEXT)'
442          BUILD_WINDMC='$(WINDMC_PROG)$(EXEEXT)'
443          ;;
444    x86_64-*-mingw* | x86_64-*-cygwin*)
445          BUILD_DLLTOOL='$(DLLTOOL_PROG)$(EXEEXT)'
446          if test -z "$DLLTOOL_DEFAULT"; then
447              DLLTOOL_DEFAULT="-DDLLTOOL_DEFAULT_MX86_64"
448          fi
449          DLLTOOL_DEFS="$DLLTOOL_DEFS -DDLLTOOL_MX86_64"
450          BUILD_WINDRES='$(WINDRES_PROG)$(EXEEXT)'
451          BUILD_WINDMC='$(WINDMC_PROG)$(EXEEXT)'
452          BUILD_DLLWRAP='$(DLLWRAP_PROG)$(EXEEXT)'
453          ;;
454    esac
455
456    # Add objdump private vectors.
457    case $targ in
458    all)
459          od_vectors="objdump_private_desc_elf32_avr objdump_private_desc_xcoff\
460                        objdump_private_desc_pe objdump_private_desc_mach_o"
461          ;;
462    avr-*-*)
463          od_vectors="$od_vectors objdump_private_desc_elf32_avr"
464          ;;
465    powerpc*-*-aix* | rs6000-*-aix*)
466          od_vectors="$od_vectors objdump_private_desc_xcoff"
467          ;;
468    *-*-pe* | *-*-cygwin* | *-*-mingw*)
469           od_vectors="$od_vectors objdump_private_desc_pe"
470           ;;
471    *-*-darwin*)
472          od_vectors="$od_vectors objdump_private_desc_mach_o"
473          ;;
474    esac
475done
476
477# Uniq objdump private vector, build objdump target ofiles.
478od_files=
479f=""
480for i in $od_vectors ; do
481    case " $f " in
482    *" $i "*) ;;
483    *)
484          f="$f $i"
485          OBJDUMP_PRIVATE_VECTORS="$OBJDUMP_PRIVATE_VECTORS &$i,"
486          case $i in
487          objdump_private_desc_elf32_avr)
488              od_files="$od_files od-elf32_avr" ;;
489          objdump_private_desc_xcoff)
490              od_files="$od_files od-xcoff" ;;
491          objdump_private_desc_pe)
492              od_files="$od_files od-pe" ;;
493          objdump_private_desc_mach_o)
494              od_files="$od_files od-macho" ;;
495          *) AC_MSG_ERROR(*** unknown private vector $i) ;;
496          esac
497          ;;
498    esac
499done
500
501# Uniq objdump target ofiles
502f=""
503for i in $od_files ; do
504    case " $f " in
505    *" $i "*) ;;
506    *)
507          f="$f $i"
508          OBJDUMP_PRIVATE_OFILES="$OBJDUMP_PRIVATE_OFILES $i.$objext"
509          ;;
510    esac
511done
512
513DLLTOOL_DEFS="$DLLTOOL_DEFS $DLLTOOL_DEFAULT"
514
515if test "${with_windres+set}" = set; then
516            BUILD_WINDRES='$(WINDRES_PROG)$(EXEEXT)'
517fi
518
519if test "${with_windmc+set}" = set; then
520            BUILD_WINDMC='$(WINDMC_PROG)$(EXEEXT)'
521fi
522
523OBJDUMP_DEFS="${OBJDUMP_DEFS} -DOBJDUMP_PRIVATE_VECTORS=\"${OBJDUMP_PRIVATE_VECTORS}\""
524
525AC_SUBST(BUILD_SRCONV)
526AC_SUBST(BUILD_DLLTOOL)
527AC_SUBST(DLLTOOL_DEFS)
528AC_SUBST(BUILD_WINDRES)
529AC_SUBST(BUILD_WINDMC)
530AC_SUBST(BUILD_DLLWRAP)
531AC_SUBST(BUILD_MISC)
532AC_SUBST(BUILD_INSTALL_MISC)
533AC_SUBST(OBJDUMP_DEFS)
534AC_SUBST(OBJDUMP_PRIVATE_OFILES)
535
536AC_DEFINE_UNQUOTED(TARGET, "${target}", [Configured target name.])
537
538targ=$target
539. $srcdir/../bfd/config.bfd
540if test "x$targ_underscore" = "xyes"; then
541    UNDERSCORE=1
542else
543    UNDERSCORE=0
544fi
545AC_DEFINE_UNQUOTED(TARGET_PREPENDS_UNDERSCORE, $UNDERSCORE,
546 [Define to 1 if user symbol names have a leading underscore, 0 if not.])
547
548# Emulation
549targ=$target
550. ${srcdir}/configure.tgt
551EMULATION=$targ_emul
552EMULATION_VECTOR=$targ_emul_vector
553
554AC_SUBST(EMULATION)
555AC_SUBST(EMULATION_VECTOR)
556
557# Required for html and install-html
558AC_SUBST(datarootdir)
559AC_SUBST(docdir)
560AC_SUBST(htmldir)
561AC_SUBST(pdfdir)
562
563AC_CONFIG_FILES(Makefile po/Makefile.in:po/Make-in)
564AC_OUTPUT
565
566GNU_MAKE_JOBSERVER
567