Bug 199042 - graphics/cairo does not build on FreeBSD arm r280772 (can't link with -lpthread)
Summary: graphics/cairo does not build on FreeBSD arm r280772 (can't link with -lpthread)
Status: Closed FIXED
Alias: None
Product: Ports & Packages
Classification: Unclassified
Component: Individual Port(s) (show other bugs)
Version: Latest
Hardware: arm Any
: --- Affects Some People
Assignee: freebsd-gnome (Nobody)
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2015-03-30 18:22 UTC by Ulrich Grey
Modified: 2015-04-13 07:32 UTC (History)
3 users (show)

See Also:
bugzilla: maintainer-feedback? (gnome)


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Ulrich Grey 2015-03-30 18:22:04 UTC
Ports Revision 382670
##
And the following internal features:
  pthread:       no (can't link with -lpthread or -pthread)
  gtk-doc:       no
  gcov support:  no
  symbol-lookup: no (requires bfd)
  test surfaces: no (disabled, use --enable-test-surfaces to enable)
  ps testing:    no (requires libspectre)
  pdf testing:   no (requires poppler-glib >= 0.17.4)
  svg testing:   no (requires librsvg-2.0 >= 2.35.0)
...
===>  Building for cairo-1.12.18_1,2
...
--- cairo-arc.lo ---
In file included from cairo-arc.c:37:
In file included from ./cairoint.h:396:
In file included from ./cairo-scaled-font-private.h:45:
In file included from ./cairo-mutex-type-private.h:45:
./cairo-mutex-impl-private.h:262:3: error: "XXX: No mutex implementation found.  Cairo will not work with multiple threads.  Define CAIRO_NO_MUTEX to 1 to acknowledge and accept this limitation and compile cairo without thread-safety support."
--- cairo-array.lo ---
In file included from cairo-array.c:39:
In file included from ./cairoint.h:396:
In file included from ./cairo-scaled-font-private.h:45:
In file included from ./cairo-mutex-type-private.h:45:
./cairo-mutex-impl-private.h:262:3: error: "XXX: No mutex implementation found.  Cairo will not work with multiple threads.  Define CAIRO_NO_MUTEX to 1 to acknowledge and accept this limitation and compile cairo without thread-safety support."
--- cairo-atomic.lo ---
In file included from cairo-atomic.c:34:
In file included from ./cairoint.h:396:
In file included from ./cairo-scaled-font-private.h:45:
In file included from ./cairo-mutex-type-private.h:45:
./cairo-mutex-impl-private.h:262:3: error: "XXX: No mutex implementation found.  Cairo will not work with multiple threads.  Define CAIRO_NO_MUTEX to 1 to acknowledge and accept this limitation and compile cairo without thread-safety support."
--- cairo-analysis-surface.lo ---
In file included from cairo-analysis-surface.c:37:
In file included from ./cairoint.h:396:
In file included from ./cairo-scaled-font-private.h:45:
In file included from ./cairo-mutex-type-private.h:45:
./cairo-mutex-impl-private.h:262:3: error: "XXX: No mutex implementation found.  Cairo will not work with multiple threads.  Define CAIRO_NO_MUTEX to 1 to acknowledge and accept this limitation and compile cairo without thread-safety support."
# error "XXX: No mutex implementation found.  Cairo will not work with multiple threads.  Define CAIRO_NO_MUTEX to 1 to acknowledge and accept this limitation and compile cairo without thread-safety support."
  ^
./cairo-mutex-impl-private.h:271:11: error: unknown type name 'cairo_mutex_impl_t'
  typedef cairo_mutex_impl_t cairo_recursive_mutex_impl_t;
          ^
In file included from cairo-analysis-surface.c:37:
In file included from ./cairoint.h:396:
In file included from ./cairo-scaled-font-private.h:45:
./cairo-mutex-type-private.h:49:3: error: "CAIRO_MUTEX_IMPL_LOCK not defined.  Check cairo-mutex-impl-private.h."
# error "CAIRO_MUTEX_IMPL_LOCK not defined.  Check cairo-mutex-impl-private.h."
  ^
--- cairo-arc.lo ---
# error "XXX: No mutex implementation found.  Cairo will not work with multiple threads.  Define CAIRO_NO_MUTEX to 1 to acknowledge and accept this limitation and compile cairo without thread-safety support."
  ^
./cairo-mutex-impl-private.h:271:11: error: unknown type name 'cairo_mutex_impl_t'
  typedef cairo_mutex_impl_t cairo_recursive_mutex_impl_t;
          ^
In file included from cairo-arc.c:37:
In file included from ./cairoint.h:396:
In file included from ./cairo-scaled-font-private.h:45:
./cairo-mutex-type-private.h:49:3: error: "CAIRO_MUTEX_IMPL_LOCK not defined.  Check cairo-mutex-impl-private.h."
# error "CAIRO_MUTEX_IMPL_LOCK not defined.  Check cairo-mutex-impl-private.h."
  ^
./cairo-mutex-type-private.h:52:3: error: "CAIRO_MUTEX_IMPL_UNLOCK not defined.  Check cairo-mutex-impl-private.h."
# error "CAIRO_MUTEX_IMPL_UNLOCK not defined.  Check cairo-mutex-impl-private.h."
  ^
--- cairo-array.lo ---
# error "XXX: No mutex implementation found.  Cairo will not work with multiple threads.  Define CAIRO_NO_MUTEX to 1 to acknowledge and accept this limitation and compile cairo without thread-safety support."
  ^
./cairo-mutex-impl-private.h:271:11: error: unknown type name 'cairo_mutex_impl_t'
  typedef cairo_mutex_impl_t cairo_recursive_mutex_impl_t;
          ^
In file included from cairo-array.c:39:
In file included from ./cairoint.h:396:
In file included from ./cairo-scaled-font-private.h:45:
./cairo-mutex-type-private.h:49:3: error: "CAIRO_MUTEX_IMPL_LOCK not defined.  Check cairo-mutex-impl-private.h."
# error "CAIRO_MUTEX_IMPL_LOCK not defined.  Check cairo-mutex-impl-private.h."
  ^
--- cairo-atomic.lo ---
# error "XXX: No mutex implementation found.  Cairo will not work with multiple threads.  Define CAIRO_NO_MUTEX to 1 to acknowledge and accept this limitation and compile cairo without thread-safety support."
  ^
./cairo-mutex-impl-private.h:271:11: error: unknown type name 'cairo_mutex_impl_t'
  typedef cairo_mutex_impl_t cairo_recursive_mutex_impl_t;
          ^
In file included from cairo-atomic.c:34:
In file included from ./cairoint.h:396:
In file included from ./cairo-scaled-font-private.h:45:
./cairo-mutex-type-private.h:49:3: error: "CAIRO_MUTEX_IMPL_LOCK not defined.  Check cairo-mutex-impl-private.h."
# error "CAIRO_MUTEX_IMPL_LOCK not defined.  Check cairo-mutex-impl-private.h."
  ^
./cairo-mutex-type-private.h:52:3: error: "CAIRO_MUTEX_IMPL_UNLOCK not defined.  Check cairo-mutex-impl-private.h."
--- cairo-analysis-surface.lo ---
./cairo-mutex-type-private.h:52:3: error: "CAIRO_MUTEX_IMPL_UNLOCK not defined.  Check cairo-mutex-impl-private.h."
# error "CAIRO_MUTEX_IMPL_UNLOCK not defined.  Check cairo-mutex-impl-private.h."
  ^
./cairo-mutex-type-private.h:55:3: error: "CAIRO_MUTEX_IMPL_NIL_INITIALIZER not defined.  Check cairo-mutex-impl-private.h."
# error "CAIRO_MUTEX_IMPL_NIL_INITIALIZER not defined.  Check cairo-mutex-impl-private.h."
  ^
./cairo-mutex-type-private.h:139:3: error: "CAIRO_MUTEX_IMPL_LOCK not defined"
# error "CAIRO_MUTEX_IMPL_LOCK not defined"
  ^
./cairo-mutex-type-private.h:142:3: error: "CAIRO_MUTEX_IMPL_UNLOCK not defined"
# error "CAIRO_MUTEX_IMPL_UNLOCK not defined"
  ^
./cairo-mutex-type-private.h:151:3: error: "CAIRO_MUTEX_IMPL_NIL_INITIALIZER not defined"
# error "CAIRO_MUTEX_IMPL_NIL_INITIALIZER not defined"
  ^
--- cairo-arc.lo ---
./cairo-mutex-type-private.h:55:3: error: "CAIRO_MUTEX_IMPL_NIL_INITIALIZER not defined.  Check cairo-mutex-impl-private.h."
# error "CAIRO_MUTEX_IMPL_NIL_INITIALIZER not defined.  Check cairo-mutex-impl-private.h."
  ^
./cairo-mutex-type-private.h:139:3: error: "CAIRO_MUTEX_IMPL_LOCK not defined"
# error "CAIRO_MUTEX_IMPL_LOCK not defined"
  ^
./cairo-mutex-type-private.h:142:3: error: "CAIRO_MUTEX_IMPL_UNLOCK not defined"
# error "CAIRO_MUTEX_IMPL_UNLOCK not defined"
  ^
./cairo-mutex-type-private.h:151:3: error: "CAIRO_MUTEX_IMPL_NIL_INITIALIZER not defined"
# error "CAIRO_MUTEX_IMPL_NIL_INITIALIZER not defined"
  ^
--- cairo-atomic.lo ---
# error "CAIRO_MUTEX_IMPL_UNLOCK not defined.  Check cairo-mutex-impl-private.h."
  ^
--- cairo-array.lo ---
./cairo-mutex-type-private.h:52:3: error: "CAIRO_MUTEX_IMPL_UNLOCK not defined.  Check cairo-mutex-impl-private.h."
# error "CAIRO_MUTEX_IMPL_UNLOCK not defined.  Check cairo-mutex-impl-private.h."
  ^
--- cairo-atomic.lo ---
./cairo-mutex-type-private.h:55:3: error: "CAIRO_MUTEX_IMPL_NIL_INITIALIZER not defined.  Check cairo-mutex-impl-private.h."
--- cairo-array.lo ---
./cairo-mutex-type-private.h:55:3: error: "CAIRO_MUTEX_IMPL_NIL_INITIALIZER not defined.  Check cairo-mutex-impl-private.h."
# error "CAIRO_MUTEX_IMPL_NIL_INITIALIZER not defined.  Check cairo-mutex-impl-private.h."
--- cairo-atomic.lo ---
# error "CAIRO_MUTEX_IMPL_NIL_INITIALIZER not defined.  Check cairo-mutex-impl-private.h."
  ^
--- cairo-array.lo ---
  ^
--- cairo-atomic.lo ---
./cairo-mutex-type-private.h:139:3: error: "CAIRO_MUTEX_IMPL_LOCK not defined"
--- cairo-array.lo ---
./cairo-mutex-type-private.h:139:3: error: "CAIRO_MUTEX_IMPL_LOCK not defined"
--- cairo-atomic.lo ---
# error "CAIRO_MUTEX_IMPL_LOCK not defined"
--- cairo-array.lo ---
# error "CAIRO_MUTEX_IMPL_LOCK not defined"
  ^
./cairo-mutex-type-private.h:142:3: error: "CAIRO_MUTEX_IMPL_UNLOCK not defined"
# error "CAIRO_MUTEX_IMPL_UNLOCK not defined"
  ^
./cairo-mutex-type-private.h:151:3: error: "CAIRO_MUTEX_IMPL_NIL_INITIALIZER not defined"
--- cairo-atomic.lo ---
  ^
--- cairo-array.lo ---
# error "CAIRO_MUTEX_IMPL_NIL_INITIALIZER not defined"
  ^
--- cairo-atomic.lo ---
./cairo-mutex-type-private.h:142:3: error: "CAIRO_MUTEX_IMPL_UNLOCK not defined"
# error "CAIRO_MUTEX_IMPL_UNLOCK not defined"
  ^
./cairo-mutex-type-private.h:151:3: error: "CAIRO_MUTEX_IMPL_NIL_INITIALIZER not defined"
# error "CAIRO_MUTEX_IMPL_NIL_INITIALIZER not defined"
  ^
--- cairo-arc.lo ---
./cairo-mutex-type-private.h:161:9: error: unknown type name 'cairo_mutex_impl_t'
typedef cairo_mutex_impl_t cairo_mutex_t;
        ^
--- cairo-analysis-surface.lo ---
./cairo-mutex-type-private.h:161:9: error: unknown type name 'cairo_mutex_impl_t'
typedef cairo_mutex_impl_t cairo_mutex_t;
        ^
--- cairo-array.lo ---
./cairo-mutex-type-private.h:161:9: error: unknown type name 'cairo_mutex_impl_t'
typedef cairo_mutex_impl_t cairo_mutex_t;
--- cairo-atomic.lo ---
./cairo-mutex-type-private.h:161:9: error: unknown type name 'cairo_mutex_impl_t'
typedef cairo_mutex_impl_t cairo_mutex_t;
        ^
--- cairo-array.lo ---
        ^
--- cairo-atomic.lo ---
9 errors generated.
--- cairo-arc.lo ---
9 errors generated.
--- cairo-atomic.lo ---
*** [cairo-atomic.lo] Error code 1

make[5]: stopped in /usr/local/DEVEL/NeuPorts/head/graphics/cairo/work/cairo-1.12.18/src
--- cairo-arc.lo ---
*** [cairo-arc.lo] Error code 1

make[5]: stopped in /usr/local/DEVEL/NeuPorts/head/graphics/cairo/work/cairo-1.12.18/src
--- cairo-array.lo ---
9 errors generated.
*** [cairo-array.lo] Error code 1

make[5]: stopped in /usr/local/DEVEL/NeuPorts/head/graphics/cairo/work/cairo-1.12.18/src
--- cairo-analysis-surface.lo ---
In file included from cairo-analysis-surface.c:45:
./cairo-surface-snapshot-inline.h:54:5: warning: implicit declaration of function 'CAIRO_MUTEX_IMPL_LOCK' is invalid in C99 [-Wimplicit-function-declaration]
    CAIRO_MUTEX_LOCK (snapshot->mutex);
    ^
./cairo-mutex-type-private.h:169:27: note: expanded from macro 'CAIRO_MUTEX_LOCK'
#define CAIRO_MUTEX_LOCK                CAIRO_MUTEX_IMPL_LOCK
                                        ^
In file included from cairo-analysis-surface.c:45:
./cairo-surface-snapshot-inline.h:56:5: warning: implicit declaration of function 'CAIRO_MUTEX_IMPL_UNLOCK' is invalid in C99 [-Wimplicit-function-declaration]
    CAIRO_MUTEX_UNLOCK (snapshot->mutex);
    ^
./cairo-mutex-type-private.h:170:29: note: expanded from macro 'CAIRO_MUTEX_UNLOCK'
#define CAIRO_MUTEX_UNLOCK              CAIRO_MUTEX_IMPL_UNLOCK
                                        ^
cairo-analysis-surface.c:111:5: warning: implicit conversion from enumeration type 'enum _cairo_internal_surface_type' to different enumeration type 'cairo_surface_type_t' (aka 'enum _cairo_surface_type') [-Wenum-conversion]
    CAIRO_INTERNAL_SURFACE_TYPE_NULL,
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cairo-analysis-surface.c:158:9: warning: implicit conversion from enumeration type 'enum _cairo_status' to different enumeration type 'cairo_int_status_t' (aka 'enum _cairo_int_status') [-Wenum-conversion]
        return CAIRO_STATUS_SUCCESS;
        ~~~~~~ ^~~~~~~~~~~~~~~~~~~~
cairo-analysis-surface.c:164:19: warning: implicit conversion from enumeration type 'cairo_status_t' (aka 'enum _cairo_status') to different enumeration type 'cairo_int_status_t' (aka 'enum _cairo_int_status') [-Wenum-conversion]
        return tmp->base.status;
        ~~~~~~ ~~~~~~~~~~^~~~~~
cairo-analysis-surface.c:177:46: warning: implicit conversion from enumeration type 'enum _cairo_int_status' to different enumeration type 'cairo_status_t' (aka 'enum _cairo_status') [-Wenum-conversion]
    analysis_status = tmp->has_unsupported ? CAIRO_INT_STATUS_IMAGE_FALLBACK : CAIRO_INT_STATUS_SUCCESS;
                    ~                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cairo-analysis-surface.c:177:80: warning: implicit conversion from enumeration type 'enum _cairo_int_status' to different enumeration type 'cairo_status_t' (aka 'enum _cairo_status') [-Wenum-conversion]
    analysis_status = tmp->has_unsupported ? CAIRO_INT_STATUS_IMAGE_FALLBACK : CAIRO_INT_STATUS_SUCCESS;
                    ~                                                          ^~~~~~~~~~~~~~~~~~~~~~~~
cairo-analysis-surface.c:182:9: warning: implicit conversion from enumeration type 'cairo_status_t' (aka 'enum _cairo_status') to different enumeration type 'cairo_int_status_t' (aka 'enum _cairo_int_status') [-Wenum-conversion]
        return status;
        ~~~~~~ ^~~~~~
cairo-analysis-surface.c:184:12: warning: implicit conversion from enumeration type 'cairo_status_t' (aka 'enum _cairo_status') to different enumeration type 'cairo_int_status_t' (aka 'enum _cairo_int_status') [-Wenum-conversion]
    return analysis_status;
    ~~~~~~ ^~~~~~~~~~~~~~~
cairo-analysis-surface.c:282:9: warning: implicit conversion from enumeration type 'cairo_status_t' (aka 'enum _cairo_status') to different enumeration type 'cairo_int_status_t' (aka 'enum _cairo_int_status') [-Wenum-conversion]
        return cairo_region_union_rectangle (&surface->supported_region, rect);
        ~~~~~~ ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cairo-analysis-surface.c:290:14: warning: implicit conversion from enumeration type 'cairo_status_t' (aka 'enum _cairo_status') to different enumeration type 'cairo_int_status_t' (aka 'enum _cairo_int_status') [-Wenum-conversion]
    status = cairo_region_union_rectangle (&surface->fallback_region, rect);
           ~ ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cairo-analysis-surface.c:406:45: warning: implicit conversion from enumeration type 'enum _cairo_status' to different enumeration type 'cairo_int_status_t' (aka 'enum _cairo_int_status') [-Wenum-conversion]
        cairo_int_status_t backend_source_status = CAIRO_STATUS_SUCCESS;
                           ~~~~~~~~~~~~~~~~~~~~~   ^~~~~~~~~~~~~~~~~~~~
cairo-analysis-surface.c:407:43: warning: implicit conversion from enumeration type 'enum _cairo_status' to different enumeration type 'cairo_int_status_t' (aka 'enum _cairo_int_status') [-Wenum-conversion]
        cairo_int_status_t backend_mask_status = CAIRO_STATUS_SUCCESS;
                           ~~~~~~~~~~~~~~~~~~~   ^~~~~~~~~~~~~~~~~~~~
cairo-analysis-surface.c:490:11: warning: implicit conversion from enumeration type 'cairo_status_t' (aka 'enum _cairo_status') to different enumeration type 'cairo_int_status_t' (aka 'enum _cairo_int_status') [-Wenum-conversion]
        status = _cairo_path_fixed_stroke_extents (path, style,
               ~ ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cairo-analysis-surface.c:599:11: warning: implicit conversion from enumeration type 'cairo_status_t' (aka 'enum _cairo_status') to different enumeration type 'cairo_int_status_t' (aka 'enum _cairo_int_status') [-Wenum-conversion]
        status = _cairo_scaled_font_glyph_device_extents (scaled_font,
               ~ ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cairo-analysis-surface.c:675:11: warning: implicit conversion from enumeration type 'cairo_status_t' (aka 'enum _cairo_status') to different enumeration type 'cairo_int_status_t' (aka 'enum _cairo_int_status') [-Wenum-conversion]
        status = _cairo_scaled_font_glyph_device_extents (scaled_font,
               ~ ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cairo-analysis-surface.c:690:5: warning: implicit conversion from enumeration type 'enum _cairo_internal_surface_type' to different enumeration type 'cairo_surface_type_t' (aka 'enum _cairo_surface_type') [-Wenum-conversion]
    CAIRO_INTERNAL_SURFACE_TYPE_ANALYSIS,
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cairo-analysis-surface.c:835:12: warning: implicit conversion from enumeration type 'enum _cairo_status' to different enumeration type 'cairo_int_status_t' (aka 'enum _cairo_int_status') [-Wenum-conversion]
    return CAIRO_STATUS_SUCCESS;
    ~~~~~~ ^~~~~~~~~~~~~~~~~~~~
cairo-analysis-surface.c:884:5: warning: implicit conversion from enumeration type 'enum _cairo_internal_surface_type' to different enumeration type 'cairo_surface_type_t' (aka 'enum _cairo_surface_type') [-Wenum-conversion]
    CAIRO_INTERNAL_SURFACE_TYPE_NULL,
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
19 warnings and 9 errors generated.
*** [cairo-analysis-surface.lo] Error code 1

make[5]: stopped in /usr/local/DEVEL/NeuPorts/head/graphics/cairo/work/cairo-1.12.18/src
4 errors

make[5]: stopped in /usr/local/DEVEL/NeuPorts/head/graphics/cairo/work/cairo-1.12.18/src
*** [all] Error code 2

make[4]: stopped in /usr/local/DEVEL/NeuPorts/head/graphics/cairo/work/cairo-1.12.18/src
1 error

make[4]: stopped in /usr/local/DEVEL/NeuPorts/head/graphics/cairo/work/cairo-1.12.18/src
*** [all-recursive] Error code 1

make[3]: stopped in /usr/local/DEVEL/NeuPorts/head/graphics/cairo/work/cairo-1.12.18
1 error

make[3]: stopped in /usr/local/DEVEL/NeuPorts/head/graphics/cairo/work/cairo-1.12.18
*** [all] Error code 2

make[2]: stopped in /usr/local/DEVEL/NeuPorts/head/graphics/cairo/work/cairo-1.12.18
1 error

make[2]: stopped in /usr/local/DEVEL/NeuPorts/head/graphics/cairo/work/cairo-1.12.18
===> Compilation failed unexpectedly.
Try to set MAKE_JOBS_UNSAFE=yes and rebuild before reporting the failure to
the maintainer.
*** Error code 1
Comment 1 Ulrich Grey 2015-04-01 10:47:55 UTC
I am building on native arm hardware (wandboard-quad):

FreeBSD wqtest 11.0-CURRENT FreeBSD 11.0-CURRENT #0 r280772M: Sat Mar 28 11:28:48 UTC 2015     gwgpi@wqtest:/usr/local/DEVEL/obj/usr/local/DEVEL/SRC/head/sys/WANDBOARD-QUAD  arm

There are no entries in make.conf and src.conf.

The kernel is built with: options ARM_NEW_PMAP.

I have not changed the ports default options.
Comment 2 Mikael Urankar freebsd_committer freebsd_triage 2015-04-01 11:50:40 UTC
(In reply to Ulrich Grey from comment #1)
I think the problem is in gnu ld not the port itself, can you try https://reviews.freebsd.org/D2194

my build log on armv6hf, CURRENT r280132:
http://mikael.urankar.free.fr/FreeBSD/arm/build_logs/cairo-1.12.18.log
Comment 3 Ulrich Grey 2015-04-02 09:27:13 UTC
I have patched the source tree FreeBSD 11.0-CURRENT #0 r280772M with this patch: 

https://reviews.freebsd.org/D2194

I have built a new image (crochet, wandboard-quad) and rebuilt graphics/cairo with all dependencies. Now the build completed successfully.
Comment 4 Koop Mast freebsd_committer freebsd_triage 2015-04-13 07:32:39 UTC
This issue was due to lack of support in binutils like the review linked in #2 mentioned. Since the problem has been fixed in HEAD, close this PR.

Thanks for reporting.