--- /dev/null
--- /dev/null
++opendht (2.4.12-7) unstable; urgency=medium
++
++ [ Petter Reinholdtsen ]
++ * Add debian/patches/1010-man-page-formatting.patch by Jakob Haufe
++ to address lintian
++ warning: macro 'mF' not defined [usr/share/man/man1/dhtnode.1.gz:1].
++ * Sponsor upload to unstable.
++
++ -- Amin Bandali <bandali@gnu.org> Wed, 22 Feb 2023 15:20:06 -0500
++
++opendht (2.4.12-6) experimental; urgency=medium
++
++ [ Petter Reinholdtsen ]
++ * debian/libopendht-c2.symbols: Exclude symbols on hurd-i386 and sh4
++ too.
++
++ [ Amin Bandali ]
++ * debian/control: Taking over the maintenance of the package; many
++ thanks, Alexandre!
++ * debian/libopendht-c2.symbols: Add three symbols on armel.
++
++ * Upload sponsored by Petter Reinholdtsen.
++
++ -- Amin Bandali <bandali@gnu.org> Mon, 20 Feb 2023 23:25:50 -0500
++
++opendht (2.4.12-5) unstable; urgency=medium
++
++ [ Amin Bandali ]
++ * debian/libopendht-c2.symbols: Add exclusions for various symbols
++ across most supported architectures per buildd.debian.org logs.
++
++ [ Petter Reinholdtsen ]
++ * debian/rules: Use DEB_BUILD_GNU_TYPE for locating build directory.
++ * Sponsor upload to unstable.
++
++ -- Amin Bandali <bandali@gnu.org> Tue, 07 Feb 2023 16:42:22 -0500
++
++opendht (2.4.12-4) unstable; urgency=medium
++
++ * debian/control: Switch 'python3-all' to 'python3-all-dev:any' to
++ hopefully fix builds broken with 'fatal error: Python.h: No such
++ file or directory'. Also tweak a few descriptions.
++
++ * Upload sponsored by Petter Reinholdtsen.
++
++ -- Amin Bandali <bandali@gnu.org> Tue, 07 Feb 2023 02:21:56 -0500
++
++opendht (2.4.12-3) unstable; urgency=medium
++
++ * Fix build more generally on architectures like ARM EABI (armel)
++ and little-endian MIPS (mipsel) that don't have native 64-bit
++ atomic operations by linking against libatomic. (Closes: #1030615)
++ * Address several lintian warnings:
++ - Drop usr/include/opendht/opendht_c.h from libopendht-dev;
++ it already belongs in libopendht-c-dev. (Closes: #1030696)
++ - debian/control: Add 'Multi-Arch: same' for libopendht2 and
++ libopendht-c2.
++
++ * Upload sponsored by Petter Reinholdtsen.
++
++ -- Amin Bandali <bandali@gnu.org> Tue, 07 Feb 2023 01:27:18 -0500
++
++opendht (2.4.12-2) experimental; urgency=medium
++
++ * Switch from static to shared library. Upstream has declared their
++ API and ABI stable, therefore we now build and provide a shared
++ library rather than a static one.
++ * Add python3-opendht providing OpenDHT Python 3 bindings
++ (Closes: #850051).
++ * Add simple debian/tests/test-run-python to validate Python 3
++ bindings.
++ * Add OpenDHT C shared library and bindings.
++
++ * Upload sponsored by Petter Reinholdtsen.
++
++ -- Amin Bandali <bandali@gnu.org> Sat, 04 Feb 2023 01:07:30 -0500
++
++opendht (2.4.12-1.2) unstable; urgency=medium
++
++ * Fix build more generally on architectures like ARM EABI (armel)
++ and little-endian MIPS (mipsel) that don't have native 64-bit
++ atomic operations by linking against libatomic. (Closes: #1030615)
++
++ * Upload sponsored by Petter Reinholdtsen.
++
++ -- Amin Bandali <bandali@gnu.org> Sun, 05 Feb 2023 13:10:19 -0500
++
++opendht (2.4.12-1.1) unstable; urgency=medium
++
++ * Attempt to fix build on armel.
++
++ * Upload sponsored by Petter Reinholdtsen.
++
++ -- Amin Bandali <bandali@gnu.org> Sat, 04 Feb 2023 13:02:57 -0500
++
++opendht (2.4.12-1) unstable; urgency=medium
++
++ * New upstream version 2.4.12.
++ * debian/copyright: Remove vestigial 'Files-Excluded: src/argon2/*'
++ and update copyright years.
++ * Update package descriptions per upstream.
++
++ * Upload sponsored by Petter Reinholdtsen.
++
++ -- Amin Bandali <bandali@gnu.org> Sat, 04 Feb 2023 01:05:20 -0500
++
++opendht (2.4.10-1) unstable; urgency=medium
++
++ * Collab-maint upload with maintainer approval.
++
++ * New upstream version 2.4.10 (Closes: 1016489).
++ - Refreshed patches to remove fuzzies.
++ - Updated package description to relect new C++17 requirement.
++ - Dropped call to dh_dwz during build as it fail on
++ debian/dhtnode/usr/bin/dhtnode.
++ * Added patch header in pkgconfig-extras.patch.
++ * Switched patches to 0000/1000/2000 naming convention.
++ * Added build-essential and pkg-config as autopkgtest dependencies.
++ * Changed dependency for libmsgpack-dev to prefer new libmsgpack-cxx-dev
++ (Closes: #1019113).
++
++ -- Petter Reinholdtsen <pere@debian.org> Tue, 27 Dec 2022 10:03:41 +0100
++
++opendht (2.3.1-3) unstable; urgency=medium
++
++ * Collab-maint upload with maintainer approval.
++
++ * Updated standards version from 4.5.0 to 4.6.2. No changes needed.
++ * Switched build dependency libncurses5-dev to libncurses-dev.
++ * Corrected notation for new uploader.
++ * Added pkgconfig-extras.patch with libraries needed to link
++ simple C++ client.
++ * Added simple autopkgtest C++ build test.
++
++ -- Petter Reinholdtsen <pere@debian.org> Mon, 26 Dec 2022 07:55:50 +0100
++
++opendht (2.3.1-2) unstable; urgency=medium
++
++ * Collab-maint upload with maintainer approval.
++
++ * Acknowledge NMU (Closes: #1026871).
++ * Added Amin Bandali as uploader.
++
++ -- Petter Reinholdtsen <pere@debian.org> Sun, 25 Dec 2022 06:42:25 +0100
++
++opendht (2.3.1-1.1) unstable; urgency=medium
++
++ * Non-maintainer upload using salsa Debian team git repo.
++
++ [ Amin Bandali ]
++ * d/watch: Tweak opts to use newly-suggested format in the current
++ uscan(1) manual for GitHub repositories, helping correctly detect
++ new releases again (partly fixes #1016489).
++
++ [ Federico Ceratto ]
++ * Configure service sandbox (Closes: #1007163).
++ * Bump up Standards-Version from 4.0.0 to 4.5.0.
++ * Switch to debhelper-compat 12.
++
++ [ Petter Reinholdtsen ]
++ * Switched build and binary dependency for libargon2-0-dev to libargon2-dev
++ (Closes: #1005699).
++
++ -- Petter Reinholdtsen <pere@debian.org> Thu, 22 Dec 2022 22:33:19 +0100
++
++opendht (2.3.1-1) unstable; urgency=medium
++
++ [ Amin Bandali ]
++ * d/watch: Update to version=4 and use newly-suggested opts format
++ in the current uscan(1) manual for GitHub repositories. This is
++ motivated in part by a change in devscripts-2.21.5 that makes
++ uscan die when filenamemangle fails.
++
++ [ Alexandre Viau ]
++ * New upstream version.
++
++ -- Alexandre Viau <aviau@debian.org> Sat, 20 Nov 2021 23:59:14 -0500
++
++opendht (2.1.10-1) unstable; urgency=medium
++
++ * New upstream version. (Closes: 978562)
++
++ -- Alexandre Viau <aviau@debian.org> Fri, 01 Jan 2021 14:02:19 -0500
++
++opendht (2.1.9.5-1) unstable; urgency=medium
++
++ [ Alexandre Viau ]
++ * New upstream version.
++
++ [ Amin Bandali ]
++ * Bump debhelper compat level up to 10.
++
++ -- Alexandre Viau <aviau@debian.org> Tue, 08 Dec 2020 17:56:05 -0500
++
++opendht (2.1.6-1) unstable; urgency=medium
++
++ [ Amin Bandali ]
++ * New upstream version.
++ * Enable OpenDHT proxy features.
++
++ [ Alexandre Viau ]
++ * Rules-Requires-Root: no.
++
++ -- Alexandre Viau <aviau@debian.org> Sat, 10 Oct 2020 16:35:04 -0400
++
++opendht (2.1.4-1) unstable; urgency=medium
++
++ * New upstream version.
++ * dhtnode.conf: remove -v. (Closes: #959226)
++
++ -- Alexandre Viau <aviau@debian.org> Sat, 15 Aug 2020 12:42:20 -0400
++
++opendht (2.1.1-1) unstable; urgency=medium
++
++ * New upstream version.
++ * Depend on librestinio-dev, libasio-dev.
++ * Refresh patches.
++
++ -- Alexandre Viau <aviau@debian.org> Sat, 16 May 2020 13:08:04 -0400
++
++opendht (1.8.1-1) unstable; urgency=medium
++
++ * New upstream version.
++
++ -- Alexandre Viau <aviau@debian.org> Sat, 05 Jan 2019 21:57:00 -0500
++
++opendht (1.8.0-1) unstable; urgency=medium
++
++ * New upstream version.
++
++ -- Alexandre Viau <aviau@debian.org> Mon, 10 Dec 2018 20:15:28 -0500
++
++opendht (1.7.4-1) unstable; urgency=medium
++
++ * New upstream version.
++
++ -- Alexandre Viau <aviau@debian.org> Sat, 18 Aug 2018 15:51:19 -0400
++
++opendht (1.7.2-1) unstable; urgency=medium
++
++ * New upstream version.
++ * Fix maintainer-script-should-not-use-recursive-chown-or-chmod.
++
++ -- Alexandre Viau <aviau@debian.org> Tue, 26 Jun 2018 18:08:36 -0400
++
++opendht (1.6.0-1) unstable; urgency=medium
++
++ * d/watch: exclude release candidates.
++ * d/copyright: fix insecure-copyright-format-uri.
++
++ -- Alexandre Viau <aviau@debian.org> Tue, 27 Feb 2018 06:11:11 +0000
++
++opendht (1.5.0-3) unstable; urgency=medium
++
++ * Build with msgpack-c v2 API.
++
++ -- Alexandre Viau <aviau@debian.org> Thu, 01 Feb 2018 17:47:24 +0000
++
++opendht (1.5.0-2) unstable; urgency=medium
++
++ * Move to salsa.debian.org.
++
++ -- Alexandre Viau <aviau@debian.org> Thu, 28 Dec 2017 17:09:51 -0500
++
++opendht (1.5.0-1) unstable; urgency=medium
++
++ * New upstream snapshot.
++
++ -- Alexandre Viau <aviau@debian.org> Thu, 23 Nov 2017 19:44:27 -0500
++
++opendht (1.4.1-1) unstable; urgency=medium
++
++ * New upstream snapshot.
++ * Use msgpack v1 API.
++
++ -- Alexandre Viau <aviau@debian.org> Wed, 15 Nov 2017 20:54:42 -0500
++
++opendht (1.3.6-1) unstable; urgency=medium
++
++ * New upstream snapshot.
++
++ -- Alexandre Viau <aviau@debian.org> Fri, 25 Aug 2017 16:44:04 -0400
++
++opendht (1.3.5-1) unstable; urgency=medium
++
++ * New upstream snapshot.
++
++ -- Alexandre Viau <aviau@debian.org> Wed, 02 Aug 2017 15:41:36 -0400
++
++opendht (1.3.4-3) unstable; urgency=medium
++
++ * Remove unneeded multiarch.patch.
++
++ -- Alexandre Viau <aviau@debian.org> Sun, 02 Jul 2017 14:35:50 -0400
++
++opendht (1.3.4-2) unstable; urgency=medium
++
++ * dhtnode.service: restart on-failure
++
++ -- Alexandre Viau <aviau@debian.org> Sat, 01 Jul 2017 15:20:42 -0400
++
++opendht (1.3.4-1) unstable; urgency=medium
++
++ * New upstream snapshot.
++ * dhtnode: include systemd service.
++
++ -- Alexandre Viau <aviau@debian.org> Sat, 01 Jul 2017 14:51:02 -0400
++
++opendht (1.3.3-2) unstable; urgency=medium
++
++ * Install CMakeFiles. (Closes: #866586)
++
++ -- Alexandre Viau <aviau@debian.org> Fri, 30 Jun 2017 16:03:24 -0400
++
++opendht (1.3.3-1) unstable; urgency=medium
++
++ * New upstream snapshot. (Closes: #866078)
++ * Refresh patches.
++ * Remove use-debian-argon2.patch.
++ * Remove python bindings mention.
++ * Bump Standards-Version to 4.0.0.
++ * Build-Depend on pkg-config.
++
++ -- Alexandre Viau <aviau@debian.org> Tue, 27 Jun 2017 18:42:38 -0400
++
++opendht (1.2.1~dfsg1-8) unstable; urgency=medium
++
++ * dev package: Add library dependencies (Closes: #849561).
++
++ -- Alexandre Viau <aviau@debian.org> Wed, 28 Dec 2016 17:11:11 -0500
++
++opendht (1.2.1~dfsg1-7) unstable; urgency=medium
++
++ [ Alexandre Viau ]
++ * Import Gianfranco's work (Closes: #843788).
++
++ [ Gianfranco Costamagna ]
++ * Multiarchify the package.
++
++ -- Alexandre Viau <aviau@debian.org> Wed, 09 Nov 2016 11:28:54 -0500
++
++opendht (1.2.1~dfsg1-6) unstable; urgency=medium
++
++ * libopendht-dev now breaks+replaces libopendht1 (Closes: #843680)
++
++ -- Alexandre Viau <aviau@debian.org> Tue, 08 Nov 2016 13:13:44 -0500
++
++opendht (1.2.1~dfsg1-5) unstable; urgency=medium
++
++ * Don't ship libopendht1. Debian policy allows for shipping
++ only static libraries since OpenDHT's API is not stable
++ enough.
++
++ -- Alexandre Viau <aviau@debian.org> Mon, 07 Nov 2016 13:14:31 -0500
++
++opendht (1.2.1~dfsg1-4) unstable; urgency=medium
++
++ * Add libopendht.shlibs.
++
++ -- Alexandre Viau <aviau@debian.org> Sat, 05 Nov 2016 01:00:46 -0400
++
++opendht (1.2.1~dfsg1-3) unstable; urgency=medium
++
++ * Remove pkg-kde-tools dependency.
++
++ -- Alexandre Viau <aviau@debian.org> Fri, 04 Nov 2016 16:10:56 -0400
++
++opendht (1.2.1~dfsg1-2) unstable; urgency=medium
++
++ * Link against argon2.
++
++ -- Alexandre Viau <aviau@debian.org> Fri, 04 Nov 2016 03:29:16 -0400
++
++opendht (1.2.1~dfsg1-1) unstable; urgency=medium
++
++ * Remove symbols file.
++ * Refresh use-debian-argon2.patch.
++ * Remove build_versioned_shared_library.patch.
++ * Use manpage from source.
++
++ -- Alexandre Viau <aviau@debian.org> Wed, 29 Jun 2016 15:52:22 +0200
++
++opendht (0.6.1~dfsg1-1) experimental; urgency=medium
++
++ * Initial release. (Closes: #809362)
++
++ -- Alexandre Viau <aviau@debian.org> Mon, 27 Jun 2016 13:09:11 +0200
--- /dev/null
--- /dev/null
++Source: opendht
++Section: libs
++Priority: optional
++Maintainer: Amin Bandali <bandali@gnu.org>
++Build-Depends: debhelper-compat (= 12),
++ cmake,
++ dh-exec,
++ pkg-config,
++ libgnutls28-dev,
++ libmsgpack-cxx-dev | libmsgpack-dev (>= 1.2),
++ libmsgpack-cxx-dev | libmsgpack-dev (<= 4.0.0),
++ libreadline6-dev,
++ libncurses-dev,
++ libargon2-dev,
++ librestinio-dev,
++ libasio-dev,
++ libjsoncpp-dev,
++ libhttp-parser-dev,
++ libssl-dev,
++ libfmt-dev,
++ nettle-dev,
++# Python 3 bindings
++ dh-python,
++ python3-all-dev:any,
++ python3-setuptools,
++ cython3
++Standards-Version: 4.6.2
++Homepage: https://github.com/savoirfairelinux/opendht
++Vcs-Git: https://salsa.debian.org/debian/opendht.git
++Vcs-Browser: https://salsa.debian.org/debian/opendht
++Rules-Requires-Root: no
++
++Package: libopendht-dev
++Architecture: any
++Multi-Arch: same
++Section: libdevel
++Depends: ${misc:Depends},
++ libopendht2 (=${binary:Version}),
++ libgnutls28-dev,
++ libmsgpack-cxx-dev | libmsgpack-dev (>= 1.2),
++ libmsgpack-cxx-dev | libmsgpack-dev (<= 4.0.0),
++ libreadline6-dev,
++ libncurses-dev,
++ libargon2-dev,
++ librestinio-dev,
++ libasio-dev,
++ libjsoncpp-dev,
++ libhttp-parser-dev,
++ libssl-dev,
++ libfmt-dev,
++ nettle-dev
++Description: Development files for the libopendht library
++ OpenDHT is a lightweight C++17 Distributed Hash Table implementation.
++ .
++ OpenDHT provides an easy to use distributed in-memory data store.
++ Every node in the network can read and write values to the store.
++ Values are distributed over the network, with redundancy.
++ .
++ Overview of features:
++ * Lightweight and scalable, designed for large networks and small
++ devices
++ * High resilience to network disruption
++ * Public key cryptography layer providing optional data signature
++ and encryption (using GnuTLS)
++ * IPv4 and IPv6 support
++ * Clean and powerful C++17 map API
++ * Bindings for C and Python 3
++ * REST API with optional HTTP client+server with push notification
++ support
++ .
++ This package contains the C++ library headers and other
++ development files.
++
++Package: libopendht2
++Architecture: any
++Multi-Arch: same
++Depends: ${misc:Depends},
++ ${shlibs:Depends}
++Description: Lightweight C++17 distributed hash table implementation
++ OpenDHT is a lightweight C++17 Distributed Hash Table implementation.
++ .
++ OpenDHT provides an easy to use distributed in-memory data store.
++ Every node in the network can read and write values to the store.
++ Values are distributed over the network, with redundancy.
++ .
++ Overview of features:
++ * Lightweight and scalable, designed for large networks and small
++ devices
++ * High resilience to network disruption
++ * Public key cryptography layer providing optional data signature
++ and encryption (using GnuTLS)
++ * IPv4 and IPv6 support
++ * Clean and powerful C++17 map API
++ * Bindings for C and Python 3
++ * REST API with optional HTTP client+server with push notification
++ support
++ .
++ This package contains the C++ shared library.
++
++Package: libopendht-c-dev
++Architecture: any
++Multi-Arch: same
++Section: libdevel
++Depends: ${misc:Depends},
++ libopendht-c2 (=${binary:Version}),
++ libopendht-dev,
++ libgnutls28-dev,
++ libargon2-dev
++Description: Development files for the libopendht-c library
++ OpenDHT is a lightweight C++17 Distributed Hash Table implementation.
++ .
++ OpenDHT provides an easy to use distributed in-memory data store.
++ Every node in the network can read and write values to the store.
++ Values are distributed over the network, with redundancy.
++ .
++ Overview of features:
++ * Lightweight and scalable, designed for large networks and small
++ devices
++ * High resilience to network disruption
++ * Public key cryptography layer providing optional data signature
++ and encryption (using GnuTLS)
++ * IPv4 and IPv6 support
++ * Clean and powerful C++17 map API
++ * Bindings for C and Python 3
++ * REST API with optional HTTP client+server with push notification
++ support
++ .
++ This package contains the C bindings library header and other
++ development files.
++
++Package: libopendht-c2
++Architecture: any
++Multi-Arch: same
++Depends: ${misc:Depends},
++ ${shlibs:Depends},
++ libopendht2 (=${binary:Version})
++Description: Lightweight C++17 distributed hash table implementation - C wrapper
++ OpenDHT is a lightweight C++17 Distributed Hash Table implementation.
++ .
++ OpenDHT provides an easy to use distributed in-memory data store.
++ Every node in the network can read and write values to the store.
++ Values are distributed over the network, with redundancy.
++ .
++ Overview of features:
++ * Lightweight and scalable, designed for large networks and small
++ devices
++ * High resilience to network disruption
++ * Public key cryptography layer providing optional data signature
++ and encryption (using GnuTLS)
++ * IPv4 and IPv6 support
++ * Clean and powerful C++17 map API
++ * Bindings for C and Python 3
++ * REST API with optional HTTP client+server with push notification
++ support
++ .
++ This package contains the C shared library.
++
++Package: python3-opendht
++Architecture: any
++Depends: ${misc:Depends},
++ ${python3:Depends},
++ ${shlibs:Depends},
++ libopendht2 (=${binary:Version})
++Description: Python 3 bindings for libopendht C++ library
++ OpenDHT is a lightweight C++17 Distributed Hash Table implementation.
++ .
++ OpenDHT provides an easy to use distributed in-memory data store.
++ Every node in the network can read and write values to the store.
++ Values are distributed over the network, with redundancy.
++ .
++ Overview of features:
++ * Lightweight and scalable, designed for large networks and small
++ devices
++ * High resilience to network disruption
++ * Public key cryptography layer providing optional data signature
++ and encryption (using GnuTLS)
++ * IPv4 and IPv6 support
++ * Clean and powerful C++17 map API
++ * Bindings for C and Python 3
++ * REST API with optional HTTP client+server with push notification
++ support
++ .
++ This package contains the Python 3 bindings.
++
++Package: dhtnode
++Architecture: any
++Section: net
++Depends: ${misc:Depends},
++ ${shlibs:Depends},
++ libopendht2 (=${binary:Version}),
++ adduser
++Description: OpenDHT node binary
++ OpenDHT is a lightweight C++17 Distributed Hash Table implementation.
++ .
++ OpenDHT provides an easy to use distributed in-memory data store.
++ Every node in the network can read and write values to the store.
++ Values are distributed over the network, with redundancy.
++ .
++ Overview of features:
++ * Lightweight and scalable, designed for large networks and small
++ devices
++ * High resilience to network disruption
++ * Public key cryptography layer providing optional data signature
++ and encryption (using GnuTLS)
++ * IPv4 and IPv6 support
++ * Clean and powerful C++17 map API
++ * Bindings for C and Python 3
++ * REST API with optional HTTP client+server with push notification
++ support
++ .
++ This package contains the dhtnode binary.
--- /dev/null
--- /dev/null
++Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
++Upstream-Name: ring
++Upstream-Contact: Alexandre Viau <alexandre.viau@savoirfairelinux.net>
++Source: https://github.com/savoirfairelinux/opendht
++
++Files: *
++Copyright: 2014-2023 Savoir-faire Linux Inc.
++License: GPL-3+
++Comment: The 'or later' clause was recently added by upstream
++ in the README to clarify the status of the licensing.
++ - https://github.com/savoirfairelinux/opendht/commit/041a9e0e7f3aea399a17e014b6022eb01880a4a9
++ It will be available in the README of the next release. Note that
++ the headers already mention "or later".
++
++Files: debian/*
++Copyright: 2016 Alexandre Viau <aviau@debian.org>
++License: Expat
++
++Files: include/opendht/securedht.h
++Copyright: 2014-2022 Savoir-faire Linux Inc.
++License: GPL-3-with-openssl-exception
++ 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 3 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 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
++ .
++ Additional permission under GNU GPL version 3 section 7:
++ .
++ If you modify this program, or any covered work, by linking or
++ combining it with the OpenSSL project's OpenSSL library (or a
++ modified version of that library), containing parts covered by the
++ terms of the OpenSSL or SSLeay licenses, Savoir-faire Linux Inc.
++ grants you additional permission to convey the resulting work.
++ Corresponding Source for a non-source form of such a combination
++ shall include the source code for the parts of OpenSSL used as well
++ as that of the covered work.
++
++Files: include/opendht/dht.h
++ src/dht.cpp
++Copyright: 2009-2014 Juliusz Chroboczek
++ 2014-2022 Savoir-faire Linux Inc.
++License: Expat
++
++Files: m4/ax_cxx_compile_stdcxx.m4
++Copyright: 2008 Benjamin Kosnik <bkoz@redhat.com>
++ 2012 Zack Weinberg <zackw@panix.com>
++ 2013 Roy Stogner <roystgnr@ices.utexas.edu>
++ 2014-2015 Google Inc.
++ 2015 Paul Norman <penorman@mac.com>
++ 2015 Moritz Klammler <moritz@klammler.eu>
++ 2016-2022 Savoir-faire Linux Inc.
++License: GNUAllPermissive
++
++License: GPL-3+
++ 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 3 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 General Public License for more details.
++ ․
++ The complete text of the GNU General Public License version 3
++ can be found in `/usr/share/common-licenses/GPL-3`.
++
++License: Expat
++ Permission is hereby granted, free of charge, to any person obtaining a copy of
++ this software and associated documentation files (the "Software"), to deal in
++ the Software without restriction, including without limitation the rights to
++ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
++ the Software, and to permit persons to whom the Software is furnished to do so,
++ subject to the following conditions:
++ .
++ The above copyright notice and this permission notice shall be included in all
++ copies or substantial portions of the Software.
++ .
++ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
++ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
++ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
++ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
++ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
++
++License: GNUAllPermissive
++ Copying and distribution of this file, with or without modification, are
++ permitted in any medium without royalty provided the copyright notice
++ and this notice are preserved. This file is offered as-is, without any
++ warranty.
--- /dev/null
--- /dev/null
++DHT_ARGS=-b bootstrap.ring.cx -p 4222
--- /dev/null
--- /dev/null
++var/lib/opendht
--- /dev/null
--- /dev/null
++#! /usr/bin/dh-exec
++usr/bin/dhtnode
++debian/dhtnode.conf => etc/default/dhtnode
--- /dev/null
--- /dev/null
++doc/dhtnode.1
--- /dev/null
--- /dev/null
++#!/bin/sh
++# postinst script for dhtnode
++#
++# see: dh_installdeb(1)
++
++set -e
++
++# summary of how this script can be called:
++# * <postinst> `configure' <most-recently-configured-version>
++# * <old-postinst> `abort-upgrade' <new version>
++# * <conflictor's-postinst> `abort-remove' `in-favour' <package>
++# <new-version>
++# * <postinst> `abort-remove'
++# * <deconfigured's-postinst> `abort-deconfigure' `in-favour'
++# <failed-install-package> <version> `removing'
++# <conflicting-package> <version>
++# for details, see http://www.debian.org/doc/debian-policy/ or
++# the debian-policy package
++
++
++case "$1" in
++ configure)
++ # create an opendht group and user
++ adduser --system \
++ --home /var/lib/opendht \
++ --disabled-password \
++ --disabled-login \
++ --no-create-home \
++ --quiet \
++ --group opendht
++
++ if [ -d /var/lib/opendht ]; then
++ chown opendht:opendht /var/lib/opendht
++ fi
++
++ ;;
++
++ abort-upgrade|abort-remove|abort-deconfigure)
++ ;;
++
++ *)
++ echo "postinst called with unknown argument \`$1'" >&2
++ exit 1
++ ;;
++esac
++
++# dh_installdeb will replace this with shell code automatically
++# generated by other debhelper scripts.
++
++#DEBHELPER#
++
++exit 0
--- /dev/null
--- /dev/null
++#!/bin/sh
++# postrm script for dhtnode
++#
++# see: dh_installdeb(1)
++
++set -e
++
++# summary of how this script can be called:
++# * <postrm> `remove'
++# * <postrm> `purge'
++# * <old-postrm> `upgrade' <new-version>
++# * <new-postrm> `failed-upgrade' <old-version>
++# * <new-postrm> `abort-install'
++# * <new-postrm> `abort-install' <old-version>
++# * <new-postrm> `abort-upgrade' <old-version>
++# * <disappearer's-postrm> `disappear' <overwriter>
++# <overwriter-version>
++# for details, see http://www.debian.org/doc/debian-policy/ or
++# the debian-policy package
++
++
++case "$1" in
++ purge|remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear)
++ # Stuff we always do
++ # ...
++
++ # Only remove /var/lib/opendht on purge
++ if [ "${1}" = "purge" ] ; then
++ rm -rf /var/lib/opendht
++ fi
++ ;;
++
++ *)
++ echo "postrm called with unknown argument \`$1'" >&2
++ exit 1
++ ;;
++esac
++
++# dh_installdeb will replace this with shell code automatically
++# generated by other debhelper scripts.
++
++#DEBHELPER#
++
++exit 0
--- /dev/null
--- /dev/null
++[Unit]
++Description=OpenDHT standalone node
++Documentation=man:dhtnode(1)
++After=network.target
++ConditionPathExists=/etc/default/dhtnode
++
++[Service]
++Type=simple
++User=opendht
++Group=opendht
++EnvironmentFile=/etc/default/dhtnode
++ExecStart=/usr/bin/dhtnode -s $DHT_ARGS
++Restart=on-failure
++RestartSec=2s
++LimitNOFILE=65536
++WorkingDirectory=/tmp
++
++# Hardening
++CapabilityBoundingSet=CAP_NET_BIND_SERVICE
++LockPersonality=yes
++NoNewPrivileges=yes
++PrivateDevices=yes
++PrivateTmp=yes
++PrivateUsers=yes
++ProtectClock=yes
++ProtectControlGroups=yes
++ProtectHome=yes
++ProtectHostname=yes
++ProtectKernelLogs=yes
++ProtectKernelModules=yes
++ProtectKernelTunables=yes
++ProtectSystem=strict
++ReadOnlyDirectories=/
++ReadWriteDirectories=-/proc/self
++ReadWriteDirectories=-/var/run
++RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6
++RestrictNamespaces=yes
++RestrictRealtime=yes
++SystemCallArchitectures=native
++SystemCallFilter=@system-service
++
++[Install]
++WantedBy=multi-user.target
--- /dev/null
--- /dev/null
++[DEFAULT]
++pristine-tar = True
--- /dev/null
--- /dev/null
++usr/include/opendht/opendht_c.h
++usr/lib/*/libopendht-c.so
++usr/lib/*/pkgconfig/opendht-c.pc
--- /dev/null
--- /dev/null
++usr/lib/*/libopendht-c.so.*
--- /dev/null
--- /dev/null
++libopendht-c.so.2 libopendht-c2 #MINVER#
++ _ZNSt12_Vector_baseIhSaIhEED1Ev@Base 2.4.12
++ _ZNSt12_Vector_baseIhSaIhEED2Ev@Base 2.4.12
++ _ZNSt14_Function_baseD1Ev@Base 2.4.12
++ _ZNSt14_Function_baseD2Ev@Base 2.4.12
++ (arch=armel riscv64)_ZNSt16_Sp_counted_baseILN9__gnu_cxx12_Lock_policyE1EE10_M_releaseEv@Base 2.4.12
++ (arch=!armel !riscv64)_ZNSt16_Sp_counted_baseILN9__gnu_cxx12_Lock_policyE2EE10_M_releaseEv@Base 2.4.12
++ (arch=!armel !armhf !i386 !hurd-i386 !mipsel !hppa !m68k !powerpc !riscv64 !sparc64 !x32 !sh4)_ZNSt16_Sp_counted_baseILN9__gnu_cxx12_Lock_policyE2EE24_M_release_last_use_coldEv@Base 2.4.12
++ (arch=armel riscv64)_ZTIN9__gnu_cxx7__mutexE@Base 2.4.12
++ (arch=armel riscv64)_ZTISt11_Mutex_baseILN9__gnu_cxx12_Lock_policyE1EE@Base 2.4.12
++ (arch=!armel !riscv64)_ZTISt11_Mutex_baseILN9__gnu_cxx12_Lock_policyE2EE@Base 2.4.12
++ (arch=armel riscv64)_ZTISt16_Sp_counted_baseILN9__gnu_cxx12_Lock_policyE1EE@Base 2.4.12
++ (arch=!armel !riscv64)_ZTISt16_Sp_counted_baseILN9__gnu_cxx12_Lock_policyE2EE@Base 2.4.12
++ (arch=armel armhf)_ZTISt19_Sp_make_shared_tag@Base 2.4.12
++ (arch=armel riscv64)_ZTSN9__gnu_cxx7__mutexE@Base 2.4.12
++ (arch=armel riscv64)_ZTSSt11_Mutex_baseILN9__gnu_cxx12_Lock_policyE1EE@Base 2.4.12
++ (arch=!armel !riscv64)_ZTSSt11_Mutex_baseILN9__gnu_cxx12_Lock_policyE2EE@Base 2.4.12
++ (arch=armel riscv64)_ZTSSt16_Sp_counted_baseILN9__gnu_cxx12_Lock_policyE1EE@Base 2.4.12
++ (arch=!armel !riscv64)_ZTSSt16_Sp_counted_baseILN9__gnu_cxx12_Lock_policyE2EE@Base 2.4.12
++ _ZTSSt19_Sp_make_shared_tag@Base 2.4.12
++ _ZZNSt19_Sp_make_shared_tag5_S_tiEvE5__tag@Base 2.4.12
++ dht_blob_delete@Base 2.4.12
++ dht_blob_get_data@Base 2.4.12
++ dht_certificate_delete@Base 2.4.12
++ dht_certificate_get_id@Base 2.4.12
++ dht_certificate_get_long_id@Base 2.4.12
++ dht_certificate_get_publickey@Base 2.4.12
++ dht_certificate_import@Base 2.4.12
++ dht_identity_delete@Base 2.4.12
++ dht_identity_generate@Base 2.4.12
++ dht_infohash_from_hex@Base 2.4.12
++ dht_infohash_from_hex_null@Base 2.4.12
++ dht_infohash_get@Base 2.4.12
++ dht_infohash_get_from_string@Base 2.4.12
++ dht_infohash_is_zero@Base 2.4.12
++ dht_infohash_print@Base 2.4.12
++ dht_infohash_random@Base 2.4.12
++ dht_infohash_zero@Base 2.4.12
++ dht_op_token_delete@Base 2.4.12
++ dht_pkid_print@Base 2.4.12
++ dht_privatekey_decrypt@Base 2.4.12
++ dht_privatekey_delete@Base 2.4.12
++ dht_privatekey_export@Base 2.4.12
++ dht_privatekey_generate@Base 2.4.12
++ dht_privatekey_get_publickey@Base 2.4.12
++ dht_privatekey_import@Base 2.4.12
++ dht_publickey_check_signature@Base 2.4.12
++ dht_publickey_delete@Base 2.4.12
++ dht_publickey_encrypt@Base 2.4.12
++ dht_publickey_export@Base 2.4.12
++ dht_publickey_get_id@Base 2.4.12
++ dht_publickey_get_long_id@Base 2.4.12
++ dht_publickey_import@Base 2.4.12
++ dht_runner_bootstrap@Base 2.4.12
++ dht_runner_cancel_listen@Base 2.4.12
++ dht_runner_cancel_put@Base 2.4.12
++ dht_runner_config_default@Base 2.4.12
++ dht_runner_delete@Base 2.4.12
++ dht_runner_get@Base 2.4.12
++ dht_runner_get_bound_port@Base 2.4.12
++ dht_runner_get_id@Base 2.4.12
++ dht_runner_get_node_id@Base 2.4.12
++ dht_runner_get_public_address@Base 2.4.12
++ dht_runner_is_running@Base 2.4.12
++ dht_runner_listen@Base 2.4.12
++ dht_runner_new@Base 2.4.12
++ dht_runner_ping@Base 2.4.12
++ dht_runner_put@Base 2.4.12
++ dht_runner_put_encrypted@Base 2.4.12
++ dht_runner_put_signed@Base 2.4.12
++ dht_runner_run@Base 2.4.12
++ dht_runner_run_config@Base 2.4.12
++ dht_runner_shutdown@Base 2.4.12
++ dht_value_get_data@Base 2.4.12
++ dht_value_get_id@Base 2.4.12
++ dht_value_get_owner@Base 2.4.12
++ dht_value_get_recipient@Base 2.4.12
++ dht_value_get_user_type@Base 2.4.12
++ dht_value_new@Base 2.4.12
++ dht_value_new_from_string@Base 2.4.12
++ dht_value_ref@Base 2.4.12
++ dht_value_set_user_type@Base 2.4.12
++ dht_value_unref@Base 2.4.12
++ dht_version@Base 2.4.12
--- /dev/null
--- /dev/null
++usr/include/*
++usr/lib/*/libopendht.so
++usr/lib/*/pkgconfig/opendht.pc
++usr/lib/*/cmake/opendht/*
--- /dev/null
--- /dev/null
++usr/lib/*/libopendht.so.*
--- /dev/null
--- /dev/null
++From 9155a8401d79a69a68052e3c8145da1187240d20 Mon Sep 17 00:00:00 2001
++From: Amin Bandali <amin.bandali@savoirfairelinux.com>
++Date: Sun, 5 Feb 2023 12:56:24 -0500
++Subject: [PATCH] build/cmake: Link libatomic where needed for 64-bit atomic
++ ops.
++Forwarded: https://github.com/savoirfairelinux/opendht/pull/653
++Last-Update: 2023-02-05
++
++Link against libatomic also on architectures that need it for 64-bit
++atomic operations. ARM EABI (armel) and little-endian MIPS (mipsel)
++are two such architectures.
++---
++ CMakeLists.txt | 4 +++-
++ 1 file changed, 3 insertions(+), 1 deletion(-)
++
++diff --git a/CMakeLists.txt b/CMakeLists.txt
++index 6e434bb5..3869af4d 100644
++--- a/CMakeLists.txt
+++++ b/CMakeLists.txt
++@@ -48,7 +48,9 @@ set (CMAKE_CXX_STANDARD 17)
++ set (CMAKE_CXX_STANDARD_REQUIRED on)
++
++ # Dependencies
++-if (NOT HAVE_CXX_ATOMICS_WITHOUT_LIB)
+++if (NOT HAVE_CXX_ATOMICS_WITHOUT_LIB
+++ # For ARM EABI (armel), little-endian MIPS (mipsel), etc.
+++ OR NOT HAVE_CXX_ATOMICS64_WITHOUT_LIB)
++ link_libraries (atomic)
++ endif ()
++
++--
++2.39.1
++
--- /dev/null
--- /dev/null
++Description: Correct dhtnode(1) man page formatting
++ This fixes the following lintian issue:
++ 22: warning: macro 'mF' not defined [usr/share/man/man1/dhtnode.1.gz:1]
++Author: Jakob Haufe
++Origin: https://people.debian.org/~sur5r/dhtnode-manpage/dhtnode.1.EX.diff
++Forwarded: no
++Reviewed-By: Petter Reinholdtsen
++Last-Update: 2023-02-22
++
++--- opendht-2.4.12.orig/doc/dhtnode.1
+++++ opendht-2.4.12/doc/dhtnode.1
++@@ -19,7 +19,7 @@
++ .SH DESCRIPTION
++ Runs an OpenDHT node, with a CLI (default) or as a daemon (with \fB'-d'\fP or \fB'-s'\fP).
++ Commands available in the interactive shell are:
++-.EE
+++.EX
++ h, help Print this help message.
++ q, quit Quit the program.
++ log Start/stop printing DHT logs.
++@@ -39,6 +39,7 @@ Commands available in the interactive sh
++ private key.
++ e [key] [dest] [str] Put string value at [key], encrypted for [dest] with
++ its public key (if found).
+++.EE
++ .SH OPTIONS
++ .TP
++ \fB\-h\fP
--- /dev/null
--- /dev/null
++Description: Disable building and installing Python bindings by upstream
++ Comment out the build and install bits from python/CMakeLists.txt so
++ we could do so from debian/rules.
++Author: Amin Bandali <bandali@gnu.org>
++Forwarded: no
++Last-Update: 2023-01-29
++
++diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt
++index 595cded..cd74c18 100644
++--- a/python/CMakeLists.txt
+++++ b/python/CMakeLists.txt
++@@ -5,15 +5,15 @@ set(CURRENT_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
++ configure_file(setup.py.in setup.py)
++ configure_file(pyproject.toml pyproject.toml COPYONLY)
++
++-add_custom_target(python ALL
++- COMMAND python3 setup.py build
++- DEPENDS opendht opendht_cpp.pxd opendht.pyx pyproject.toml)
+++# add_custom_target(python ALL
+++# COMMAND python3 setup.py build
+++# DEPENDS opendht opendht_cpp.pxd opendht.pyx pyproject.toml)
++
++-add_custom_target(dist
++- COMMAND python3 -m build
++- DEPENDS opendht opendht_cpp.pxd opendht.pyx pyproject.toml)
+++# add_custom_target(dist
+++# COMMAND python3 -m build
+++# DEPENDS opendht opendht_cpp.pxd opendht.pyx pyproject.toml)
++
++-install(CODE "execute_process(COMMAND python3 setup.py install --root=\$ENV{DESTDIR}/ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})")
+++# install(CODE "execute_process(COMMAND python3 setup.py install --root=\$ENV{DESTDIR}/ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})")
++ if (OPENDHT_TOOLS)
++ install(PROGRAMS tools/dhtcluster.py DESTINATION ${CMAKE_INSTALL_BINDIR} RENAME dhtcluster)
++-endif()
++\ No newline at end of file
+++endif()
--- /dev/null
--- /dev/null
++0xxx: Grabbed from upstream development.
++1xxx: Possibly relevant for upstream adoption.
++2xxx: Only relevant for official Debian release.
--- /dev/null
--- /dev/null
++1000-cmake-fix-no-atomic-64.patch
++1010-man-page-formatting.patch
++2000-cmake-python-no-build-install.patch
--- /dev/null
--- /dev/null
++usr/lib/python3*/*-packages/opendht*
--- /dev/null
--- /dev/null
++#!/usr/bin/make -f
++# -*- makefile -*-
++
++include /usr/share/dpkg/architecture.mk
++
++# export DH_VERBOSE = 1
++PYVERS = $(shell py3versions -vs)
++
++# Hardening
++export DEB_BUILD_MAINT_OPTIONS = hardening=+all
++DPKG_EXPORT_BUILDFLAGS = 1
++include /usr/share/dpkg/buildflags.mk
++
++CONFIGURE_FLAGS += -DOPENDHT_SHARED=ON
++CONFIGURE_FLAGS += -DOPENDHT_STATIC=OFF
++CONFIGURE_FLAGS += -DCMAKE_POSITION_INDEPENDENT_CODE=ON
++CONFIGURE_FLAGS += -DOPENDHT_PROXY_SERVER=ON
++CONFIGURE_FLAGS += -DOPENDHT_PROXY_CLIENT=ON
++CONFIGURE_FLAGS += -DOPENDHT_PUSH_NOTIFICATIONS=ON
++CONFIGURE_FLAGS += -DOPENDHT_PYTHON=ON
++CONFIGURE_FLAGS += -DOPENDHT_C=ON
++
++%:
++ dh $@ --without autoreconf --with python3
++
++override_dh_auto_configure:
++ dh_auto_configure -- ${CONFIGURE_FLAGS}
++
++clean-python%:
++ ( [ -d "obj-$(DEB_BUILD_GNU_TYPE)"/python ] && \
++ cd "obj-$(DEB_BUILD_GNU_TYPE)"/python && \
++ python$* setup.py clean ) || true
++
++build-python%:
++ cd "obj-$(DEB_BUILD_GNU_TYPE)"/python && \
++ python$* setup.py build
++
++install-python%:
++ cd "obj-$(DEB_BUILD_GNU_TYPE)"/python && \
++ python$* setup.py install \
++ --root=$(CURDIR)/debian/tmp \
++ --install-layout=deb
++
++execute_after_dh_auto_clean: $(PYVERS:%=clean-python%)
++ $(RM) $(CURDIR)/python/opendht.cpp
++execute_after_dh_auto_build: $(PYVERS:%=build-python%)
++execute_after_dh_auto_install: $(PYVERS:%=install-python%)
++ rm -f $(CURDIR)/debian/tmp/usr/share/man/man1/dhtnode.1
++execute_after_dh_install:
++ rm -f $(CURDIR)/debian/libopendht-dev/usr/include/opendht/opendht_c.h
++
++override_dh_installinit:
++ echo override_dh_installinit
++
++# Skip dh_dwz set as it fail on debian/dhtnode/usr/bin/dhtnode in version 2.4.10
++override_dh_dwz:
++ #dh_dwz
--- /dev/null
--- /dev/null
++3.0 (quilt)
--- /dev/null
--- /dev/null
++Tests: test-compile-cpp, test-run-python
++Depends: @, build-essential, pkg-config
--- /dev/null
--- /dev/null
++#!/bin/sh
++#
++# Compile simple C++ client to validate headers and libraries are
++# properly set up. Not running, as network might not be available
++# when testing.
++
++cd $AUTOPKGTEST_TMP
++
++# Example code fetched from <URL: https://github.com/savoirfairelinux/opendht >
++cat <<EOF > simpleclient.cpp
++#include <opendht.h>
++#include <vector>
++
++int main()
++{
++ dht::DhtRunner node;
++
++ // Launch a dht node on a new thread, using a
++ // generated RSA key pair, and listen on port 4222.
++ node.run(4222, dht::crypto::generateIdentity(), true);
++
++ // Join the network through any running node,
++ // here using a known bootstrap node.
++ node.bootstrap("bootstrap.jami.net", "4222");
++
++ // put some data on the dht
++ std::vector<uint8_t> some_data(5, 10);
++ node.put("unique_key", some_data);
++
++ // put some data on the dht, signed with our generated private key
++ node.putSigned("unique_key_42", some_data);
++
++ // get data from the dht
++ node.get("other_unique_key", [](const std::vector<std::shared_ptr<dht::Value>>& values) {
++ // Callback called when values are found
++ for (const auto& value : values)
++ std::cout << "Found value: " << *value << std::endl;
++ return true; // return false to stop the search
++ });
++
++ // wait for dht threads to end
++ node.join();
++ return 0;
++}
++EOF
++LIBS="$(pkg-config --libs opendht)"
++if c++ -o simpleclient simpleclient.cpp $LIBS; then
++ echo success: building C++ client succeeded
++else
++ echo error: building C++ client failed
++ exit 1
++fi
++
++rm -f simpleclient.cpp simpleclient
--- /dev/null
--- /dev/null
++#!/usr/bin/env python3
++#
++# Run simple Python 3 excerpt to validate the Python 3 bindings.
++# Not testing networking, as it might not be available when testing.
++
++import opendht as dht
++
++node = dht.DhtRunner()
++
++node.run()
++assert node.isRunning()
++
++node.join()
++assert not node.isRunning()
--- /dev/null
--- /dev/null
++version=4
++opts="filenamemangle=s%(?:.*?)?v?(\d[\d.]*@ARCHIVE_EXT@)%@PACKAGE@-$1%" \
++ https://github.com/savoirfairelinux/opendht/tags \
++ (?:.*?/)?v?@ANY_VERSION@@ARCHIVE_EXT@