aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.file-metadatabin7874 -> 8367 bytes
-rw-r--r--reproduce/software/config/checksums.conf7
-rw-r--r--reproduce/software/config/versions.conf6
-rw-r--r--reproduce/software/make/basic.mk98
-rw-r--r--reproduce/software/make/high-level.mk13
-rwxr-xr-xreproduce/software/shell/configure.sh43
6 files changed, 69 insertions, 98 deletions
diff --git a/.file-metadata b/.file-metadata
index 1cea790..1b9ba37 100644
--- a/.file-metadata
+++ b/.file-metadata
Binary files differ
diff --git a/reproduce/software/config/checksums.conf b/reproduce/software/config/checksums.conf
index b173589..b9fb637 100644
--- a/reproduce/software/config/checksums.conf
+++ b/reproduce/software/config/checksums.conf
@@ -1,6 +1,7 @@
# sha512 checksums of all the necessary software tarballs.
#
# Copyright (C) 2018-2020 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+# Copyright (C) 2019-2020 Raul Infante-Sainz <infantesainz@gmail.com>
#
# This Makefile is part of Maneage. Maneage is free software: you can
# redistribute it and/or modify it under the terms of the GNU General
@@ -30,7 +31,8 @@ findutils-checksum = 650a24507f8f4ebff83ad28dd27daa4785b4038dcaadc4fe00823b976e8
flock-checksum = 2fe663839b5fd03a08e8b3d0596ce1b4216d8f19a1c4da4fa3db8b409aa4aa292358cc671be857e0f308315458bb2e10288f9d2152dce9940085d33cb7e4a24b
gawk-checksum = 3734740b7406ddfec9e04bb7774e76c6446cba76642a6180266e7b1822de20aab824c29c4e417256d877762ef04ef3f9df855cd4a3ca414a9225323b49d79195
gcc-checksum = a12dff52af876aee0fd89a8d09cdc455f35ec46845e154023202392adc164848faf8ee881b59b681b696e27c69fd143a214014db4214db62f9891a1c8365c040
-git-checksum = c0bb29b3689ec2e157f90df849599ca149a08fc0c69f6a68b1f3219b6335d521983e6ed58cd364b86398e4dcf9e84892fb9eded79a1c97b74150edca299cf671
+gettext-checksum = 08d20c659004a77e607af17df15f5ce9bd4fc0feca9436aa206b0cbd2516f9f0c98c7ee1faacf7ff429f9b0dd9de219947b300216887a60727602a688acabc82
+git-checksum = 5d92d07b171c5cd6e89a29c1211c73c1c900cd51c74d690aebfb4a3d0e93b541b09b42b6d6a1a82f5c3d953096771f9a8605c63be139f559f58698c1a0eabcfc
gmp-checksum = 8aea94f867174eacac44f395ceb9212530c208e8de69d0bb53056f52360317230fc84ac177fd3ffc9fdb19a07c7549305dcc34c83c34821ccfab9dc63a16e67e
grep-checksum = e4805dbddf7cd0f0faf412557d408509650c1ccf703bc450f10a3f727c690dbfaa1235aa81939a0e4b7ac6190f88c15ea1fcc562b343d4b4c7550f967aeb15db
gzip-checksum = 7939043e74554ced0c1c05d354ab4eb36cd6dce89ad79d02ccdc5ed6b7ee390759689b2d47c07227b9b44a62851afe7c76c4cae9f92527d999f3f1b4df1cccff
@@ -38,6 +40,8 @@ isl-checksum = 85d0b40f4dbf14cb99d17aa07048cdcab2dc3eb527d2fbb1e84c41b2de5f35102
libbsd-checksum = 435822b8f2495a5e2705e5ab5c834a4f0f3a177b3e5c46a7c6162924507ca984e957e94a512b5ebd0067ecb413bac458fade357709ef199e9b75edf0315de91c
libiconv-checksum = 365dac0b34b4255a0066e8033a8b3db4bdb94b9b57a9dca17ebf2d779139fe935caf51a465d17fd8ae229ec4b926f3f7025264f37243432075e5583925bb77b7
libtool-checksum = a6eef35f3cbccf2c9e2667f44a476ebc80ab888725eb768e91a3a6c33b8c931afc46eb23efaee76c8696d3e4eed74ab1c71157bcb924f38ee912c8a90a6521a4
+libunistring-checksum = 01dcab6e05ea4c33572bf96cc0558bcffbfc0e62fc86410cef06c1597a0073d5750525fe2dee4fdb39c9bd704557fcbab864f9645958108a2e07950bc539fe54
+libxml2-checksum = cb7784ba4e72e942614e12e4f83f4ceb275f3d738b30e3b5c1f25edf8e9fa6789e854685974eed95b362049dbf6c8e7357e0327d64c681ed390534ac154e6810
lzip-checksum= 0349b4c6c0b41e601b7ee381c3254d741397beb3ef9354c08162f346f131f4f48f6613ee0a610cdc6d827530df634f884ecfeee35215b10045a40fee76f8e938
m4-checksum = a92cad4441b3fd7c033837389ca3499494523d364a5fda043d92c517051510f1758b3b837f0477f42d2258a179ab79a4993e5d1694ef2673db6d96d1faff84fe
make-checksum = 9a1185cc468368f4ec06478b1cfa343bf90b5cd7c92c0536567db0315b0ee909af53ecce3d44cfd93dd137dbca1ed13af5713e8663590c4fdd21ea635d78496b
@@ -106,7 +110,6 @@ libnsl-checksum = a3c8f674357674b7ed4b26c05adde607f39be8d6dc9ff715448e1fcc5fc23d
libpng-checksum = 59e8c1059013497ae616a14c3abbe239322d3873c6ded0912403fc62fb260561768230b6ab997e2cccc3b868c09f539fd13635616b9fa0dd6279a3f63ec7e074
libtiff-checksum = d213e5db09fd56b8977b187c5a756f60d6e3e998be172550c2892dbdb4b2a8e8c750202bc863fe27d0d1c577ab9de1710d15e9f6ed665aadbfd857525a81eea8
libtirpc-checksum = 392f391f9fc1bd68d81dc44e4058831a64b32790b5c8c37338b0ab416fad2ae4d16389e632596734dba09780347918cc65c6f134e0c1afd09e81ec250785ed23
-libxml2-checksum = cb7784ba4e72e942614e12e4f83f4ceb275f3d738b30e3b5c1f25edf8e9fa6789e854685974eed95b362049dbf6c8e7357e0327d64c681ed390534ac154e6810
missfits-checksum = 32727f5eb30573a1cedacb8900e2536867e4815059eee32e64e3db65be9291b8a91b9f45b2c9f3cf6fc2a8cc448012ea3d502bdd9dee516008e17d5086aee795
netpbm-checksum = 064720f8a9d0a502488e1af4daecdbf3936910996507ca6f311073a0ad842346692a148eb1ddf7b717f7b108f60500246cb4b83f4d3665f5fc285a84ae1d63d6
openblas-checksum = 91b3074eb922453bf843158b4281cde65db9e8bbdd7590e75e9e6cdcb486157f7973f2936f327bb3eb4f1702ce0ba51ae6729d8d4baf2d986c50771e8f696df0
diff --git a/reproduce/software/config/versions.conf b/reproduce/software/config/versions.conf
index d19f095..6caa449 100644
--- a/reproduce/software/config/versions.conf
+++ b/reproduce/software/config/versions.conf
@@ -28,7 +28,8 @@ file-version = 5.36
findutils-version = 4.7.0
gawk-version = 5.0.1
gcc-version = 9.2.0
-git-version = 2.23.0
+gettext-version = 0.20.2
+git-version = 2.26.2
gmp-version = 6.1.2
grep-version = 3.3
gzip-version = 1.10
@@ -36,6 +37,8 @@ isl-version = 0.18
libbsd-version = 0.9.1
libiconv-version = 1.16
libtool-version = 2.4.6
+libunistring-version = 0.9.10
+libxml2-version = 2.9.9
lzip-version= 1.20
m4-version = 1.4.18
make-version = 4.3
@@ -102,7 +105,6 @@ libnsl-version = 1.2.0-4a062cf
libpng-version = 1.6.37
libtiff-version = 4.0.10
libtirpc-version = 1.1.4
-libxml2-version = 2.9.9
missfits-version = 2.8.0
openblas-version = 0.3.5
openmpi-version = 4.0.1
diff --git a/reproduce/software/make/basic.mk b/reproduce/software/make/basic.mk
index 1709082..3c03fdc 100644
--- a/reproduce/software/make/basic.mk
+++ b/reproduce/software/make/basic.mk
@@ -124,6 +124,7 @@ tarballs = $(foreach t, bash-$(bash-version).tar.lz \
findutils-$(findutils-version).tar.xz \
gawk-$(gawk-version).tar.lz \
gcc-$(gcc-version).tar.xz \
+ gettext-$(gettext-version).tar.xz \
git-$(git-version).tar.xz \
gmp-$(gmp-version).tar.lz \
grep-$(grep-version).tar.xz \
@@ -132,6 +133,8 @@ tarballs = $(foreach t, bash-$(bash-version).tar.lz \
libbsd-$(libbsd-version).tar.xz \
libiconv-$(libiconv-version).tar.gz \
libtool-$(libtool-version).tar.xz \
+ libunistring-$(libunistring-version).tar.xz \
+ libxml2-$(libxml2-version).tar.gz \
lzip-$(lzip-version).tar.gz \
m4-$(m4-version).tar.gz \
make-$(make-version).tar.gz \
@@ -176,6 +179,7 @@ $(tarballs): $(tdir)/%: | $(lockdir)
elif [ $$n = findutils ]; then c=$(findutils-checksum); w=http://ftp.gnu.org/gnu/findutils; \
elif [ $$n = gawk ]; then c=$(gawk-checksum); w=http://ftp.gnu.org/gnu/gawk; \
elif [ $$n = gcc ]; then c=$(gcc-checksum); w=http://ftp.gnu.org/gnu/gcc/gcc-$(gcc-version); \
+ elif [ $$n = gettext ]; then c=$(gettext-checksum); w=https://ftp.gnu.org/gnu/gettext; \
elif [ $$n = git ]; then c=$(git-checksum); w=http://mirrors.edge.kernel.org/pub/software/scm/git; \
elif [ $$n = gmp ]; then c=$(gmp-checksum); w=https://gmplib.org/download/gmp; \
elif [ $$n = grep ]; then c=$(grep-checksum); w=http://ftp.gnu.org/gnu/grep; \
@@ -184,6 +188,8 @@ $(tarballs): $(tdir)/%: | $(lockdir)
elif [ $$n = libbsd ]; then c=$(libbsd-checksum); w=http://libbsd.freedesktop.org/releases; \
elif [ $$n = libiconv ]; then c=$(libiconv-checksum); w=https://ftp.gnu.org/pub/gnu/libiconv; \
elif [ $$n = libtool ]; then c=$(libtool-checksum); w=http://ftp.gnu.org/gnu/libtool; \
+ elif [ $$n = libunistring ]; then c=$(libunistring-checksum); w=http://ftp.gnu.org/gnu/libunistring; \
+ elif [ $$n = libxml2 ]; then c=$(libxml2-checksum); w=ftp://xmlsoft.org/libxml2; \
elif [ $$n = lzip ]; then c=$(lzip-checksum); w=http://download.savannah.gnu.org/releases/lzip; \
elif [ $$n = m4 ]; then \
mergenames=0; \
@@ -312,9 +318,6 @@ $(ibidir)/low-level-links: | $(ibdir) $(ildir)
# executable name `glibtool'.
$(call makelink,libtool)
- # GNU Gettext (translate messages)
- $(call makelink,msgfmt)
-
# Necessary libraries:
# Libdl (for dynamic loading libraries at runtime)
# POSIX Threads library for multi-threaded programs.
@@ -610,24 +613,14 @@ else
needpatchelf = $(ibidir)/patchelf
endif
$(ibidir)/bash: $(needpatchelf) \
+ $(ibidir)/gettext \
$(ibidir)/readline \
$(tdir)/bash-$(bash-version).tar.lz
- # Delete the (possibly) existing Bash executable.
+ # Delete the (possibly) existing Bash executable in the project,
+ # let it use the default shell of the host.
rm -f $(ibdir)/bash
- # Build Bash. Note that we aren't building Bash with
- # `--with-installed-readline'. This is because (as described above)
- # Bash needs the `LD_LIBRARY_PATH' set properly before it is
- # run. Within a recipe, things are fine (we do set
- # `LD_LIBRARY_PATH'). However, Make will also call the shell
- # outside of the recipe (for example in the `foreach' Make
- # function!). In such cases, our new `LD_LIBRARY_PATH' is not set.
- # This will cause a crash in the shell and thus the Makefile,
- # complaining that it can't find `libreadline'. Therefore, even
- # though we build readline below, we won't link Bash with an
- # external readline.
- #
# Bash has many `--enable' features which are already enabled by
# default. As described in the manual, they are mainly useful when
# you disable them all with `--enable-minimal-config' and enable a
@@ -635,9 +628,14 @@ $(ibidir)/bash: $(needpatchelf) \
if [ "x$(static_build)" = xyes ]; then stopt="--enable-static-link";\
else stopt=""; \
fi; \
- $(call gbuild, bash-$(bash-version),, \
- --with-installed-readline=$(ildir) $$stopt, \
- -j$(numthreads))
+ export CFLAGS="$$CFLAGS \
+ -DDEFAULT_PATH_VALUE='\"$(ibdir)\"' \
+ -DSTANDARD_UTILS_PATH='\"$(ibdir)\"' \
+ -DSYS_BASHRC='\"$(BASH_ENV)\"' "; \
+ $(call gbuild, bash-$(bash-version),, $$stopt \
+ --with-installed-readline=$(ildir) \
+ --with-curses=yes, \
+ -j$(numthreads))
# Atleast on GNU/Linux systems, Bash doesn't include RPATH by
# default. So, we have to manually include it, currently we are
@@ -676,7 +674,7 @@ perl-conflddlflags =
else
perl-conflddlflags = -Dlddlflags="-shared $$LDFLAGS"
endif
-$(ibidir)/perl: $(ibidir)/bash \
+$(ibidir)/perl: $(ibidir)/make \
$(tdir)/perl-$(perl-version).tar.gz
major_version=$$(echo $(perl-version) \
| sed -e's/\./ /g' \
@@ -690,11 +688,6 @@ $(ibidir)/perl: $(ibidir)/bash \
echo; echo "Tar error"; exit 1; \
fi \
&& cd perl-$(perl-version) \
- && sed -e's|\#\! /bin/sh|\#\! $(ibdir)/bash|' \
- -e's|\#\!/bin/sh|\#\! $(ibdir)/bash|' \
- Configure > Configure-tmp \
- && mv -f Configure-tmp Configure \
- && chmod +x Configure \
&& ./Configure -des \
-Dusethreads \
-Duseshrplib \
@@ -715,8 +708,8 @@ $(ibidir)/perl: $(ibidir)/bash \
-Dcccdlflags='-fPIC' \
$(perl-conflddlflags) \
-Dldflags="$$LDFLAGS" \
- && make SHELL=$(ibdir)/bash -j$(numthreads) \
- && make SHELL=$(ibdir)/bash install \
+ && make -j$(numthreads) \
+ && make install \
&& cd .. \
&& rm -rf perl-$(perl-version) \
&& cd $$topdir \
@@ -747,7 +740,8 @@ $(ibidir)/perl: $(ibidir)/bash \
# an error).
#
# Coreutils uses Perl to create man pages!
-$(ibidir)/coreutils: $(ibidir)/perl \
+$(ibidir)/coreutils: $(ibidir)/bash \
+ $(ibidir)/perl \
$(ibidir)/openssl \
$(tdir)/coreutils-$(coreutils-version).tar.xz
cd $(ddir) \
@@ -971,7 +965,34 @@ $(ibidir)/libiconv: $(ibidir)/pkg-config \
$(call gbuild, libiconv-$(libiconv-version), static) \
&& echo "GNU libiconv $(libiconv-version)" > $@
+$(ibidir)/libunistring: $(ibidir)/make \
+ $(tdir)/libunistring-$(libunistring-version).tar.xz
+ $(call gbuild, libunistring-$(libunistring-version), static,, \
+ -j$(numthreads)) \
+ && echo "GNU libunistring $(libunistring-version)" > $@
+
+$(ibidir)/libxml2: $(ibidir)/make \
+ $(tdir)/libxml2-$(libxml2-version).tar.gz
+ # The libxml2 tarball also contains Python bindings which are built
+ # and installed to a system directory by default. If you don't need
+ # the Python bindings, the easiest solution is to compile without
+ # Python support: `./configure --without-python'. If you really need
+ # the Python bindings, use `--with-python-install-dir=DIR' instead.
+ $(call gbuild, libxml2-$(libxml2-version), static, \
+ --without-python) \
+ && echo "Libxml2 $(libxml2-version)" > $@
+
+$(ibidir)/gettext: $(ibidir)/m4 \
+ $(ibidir)/libxml2 \
+ $(ibidir)/ncurses \
+ $(ibidir)/libiconv \
+ $(ibidir)/libunistring \
+ $(tdir)/gettext-$(gettext-version).tar.xz
+ $(call gbuild, gettext-$(gettext-version), static, V=1) \
+ && echo "GNU gettext $(gettext-version)" > $@
+
$(ibidir)/git: $(ibidir)/curl \
+ $(ibidir)/gettext \
$(ibidir)/libiconv \
$(tdir)/git-$(git-version).tar.xz
if [ x$(on_mac_os) = xyes ]; then \
@@ -1013,9 +1034,7 @@ $(ibidir)/libbsd: $(ibidir)/coreutils \
#
# [1] https://raw.githubusercontent.com/macports/macports-ports/edf0ee1e2cf/devel/m4/files/secure_snprintf.patch
# [2] https://github.com/Homebrew/homebrew-core/blob/master/Formula/m4.rb
-$(ibidir)/m4: $(ibidir)/sed \
- $(ibidir)/texinfo \
- $(ibidir)/coreutils \
+$(ibidir)/m4: $(ibidir)/texinfo \
$(tdir)/m4-$(m4-version).tar.gz
cd $(ddir); \
unpackdir=m4-$(m4-version); \
@@ -1025,15 +1044,14 @@ $(ibidir)/m4: $(ibidir)/sed \
fi \
&& cd $$unpackdir \
&& if [ x$(on_mac_os) = xyes ]; then \
- sed -i -e's|if !(((__GLIBC__ > 2|if !defined(__APPLE__) \&\& !(((__GLIBC__ > 2|' lib/vasnprintf.c; \
+ sed 's|if !(((__GLIBC__ > 2|if !defined(__APPLE__) \&\& !(((__GLIBC__ > 2|' \
+ lib/vasnprintf.c > lib/vasnprintf_edited.c; \
+ mv lib/vasnprintf_edited.c lib/vasnprintf.c; \
fi \
- && sed -i -e's|\#\! /bin/sh|\#\! $(ibdir)/bash|' \
- -e's|\#\!/bin/sh|\#\! $(ibdir)/bash|' \
- configure \
- && ./configure --prefix=$(idir) SHELL=$(ibdir)/bash \
- LDFLAGS="$(LDFLAGS)" CPPFLAGS="$(CPPFLAGS)" \
- && make SHELL=$(ibdir)/bash V=1 -j$(numthreads) \
- && make SHELL=$(ibdir)/bash V=1 install \
+ && ./configure --prefix=$(idir) LDFLAGS="$(LDFLAGS)" \
+ CPPFLAGS="$(CPPFLAGS)" \
+ && make V=1 -j$(numthreads) \
+ && make V=1 install \
&& cd .. \
&& rm -rf $$unpackdir \
&& echo "GNU M4 $(m4-version)" > $@
@@ -1128,7 +1146,7 @@ $(ibidir)/mpfr: $(ibidir)/gmp \
$(call gbuild, mpfr-$(mpfr-version), static, , , make check) \
&& echo "GNU Multiple Precision Floating-Point Reliably $(mpfr-version)" > $@
-$(ibidir)/pkg-config: $(ibidir)/coreutils \
+$(ibidir)/pkg-config: $(ibidir)/make \
$(tdir)/pkg-config-$(pkgconfig-version).tar.gz
# An existing `libiconv' can cause a conflict with `pkg-config',
# this is why `libiconv' depends on `pkg-config'. On a clean build,
diff --git a/reproduce/software/make/high-level.mk b/reproduce/software/make/high-level.mk
index 21cc4ea..8caa968 100644
--- a/reproduce/software/make/high-level.mk
+++ b/reproduce/software/make/high-level.mk
@@ -180,7 +180,6 @@ tarballs = $(foreach t, apachelog4cxx-$(apachelog4cxx-version).tar.lz \
libnsl-$(libnsl-version).tar.gz \
libpng-$(libpng-version).tar.xz \
libtirpc-$(libtirpc-version).tar.bz2 \
- libxml2-$(libxml2-version).tar.gz \
missfits-$(missfits-version).tar.gz \
netpbm-$(netpbm-version).tar.gz \
openblas-$(openblas-version).tar.gz \
@@ -280,7 +279,6 @@ $(tarballs): $(tdir)/%: | $(lockdir)
c=$(libgit2-checksum)
w=https://github.com/libgit2/libgit2/archive/v$(libgit2-version).tar.gz
elif [ $$n = libtirpc ]; then c=$(libtirpc-checksum); w=https://downloads.sourceforge.net/libtirpc
- elif [ $$n = libxml2 ]; then c=$(libxml2-checksum); w=ftp://xmlsoft.org/libxml2
elif [ $$n = missfits ]; then c=$(missfits-checksum); w=https://www.astromatic.net/download/missfits
elif [ $$n = netpbm ]; then c=$(netpbm-checksum); w=http://akhlaghi.org/maneage-software
elif [ $$n = openblas ]; then
@@ -689,17 +687,6 @@ $(ibidir)/libtirpc: $(tdir)/libtirpc-$(libtirpc-version).tar.bz2
--disable-gssapi, V=1) \
echo "libtirpc $(libtirpc-version)" > $@
-$(ibidir)/libxml2: | $(tdir)/libxml2-$(libxml2-version).tar.gz
- # The libxml2 tarball also contains Python bindings which are built and
- # installed to a system directory by default. If you don't need the Python
- # bindings, the easiest solution is to compile without Python support:
- # ./configure --without-python
- # If you really need the Python bindings, try the
- # --with-python-install-dir=DIR option
- $(call gbuild, libxml2-$(libxml2-version), static, \
- --without-python) \
- && echo "Libxml2 $(libxml2-version)" > $@
-
$(ibidir)/openblas: $(tdir)/openblas-$(openblas-version).tar.gz
if [ x$(on_mac_os) = xyes ]; then \
export CC=clang; \
diff --git a/reproduce/software/shell/configure.sh b/reproduce/software/shell/configure.sh
index cce6e62..a381fcf 100755
--- a/reproduce/software/shell/configure.sh
+++ b/reproduce/software/shell/configure.sh
@@ -316,44 +316,6 @@ static_build=no
-# Check for GNU gettext
-# ---------------------
-#
-# Some of the basic sofware need GNU gettext which we don't yet install.
-has_gettext=0
-if type msgfmt > /dev/null 2>/dev/null; then has_gettext=1; fi
-if [ $has_gettext = 0 ]; then
- cat <<EOF
-______________________________________________________
-!!!!!!! GNU gettext NOT FOUND !!!!!!!
-
-Some of the core programs in Maneage require a running GNU gettext on the
-host. Unfortuantely we haven't had the time yet to include its installation
-in Maneage, but it is defined as task #15616 so we don't forget. Generally,
-GNU gettext is already available on many systems, so it hasn't been
-reported too commonly. But please consider helping in this if you have
-time and interest.
-
-Until we include gettext's installation in Maneage, please use your package
-manager to install GNU gettext, then re-run the configuration to
-continue. Here are the relevant commands on some common GNU/Linux
-distributions (you'll only need one of them, or a similar command, if you
-use another package manager):
-
- apt install gettext
- yum install gettext
- pacman -S gettext
-
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-EOF
- exit 1
-fi
-
-
-
-
-
# If we are on a Mac OS system
# ----------------------------
#
@@ -1375,11 +1337,10 @@ analysis, you can safely ignore this warning and continue.
If you later have internet access and would like to add TeX live to your
project, please delete the respective files, then re-run configure as shown
-below. Within configure, answer 'n' (for "no") when asked to re-write the
-configuration files.
+below.
rm .local/version-info/tex/texlive-ready-tlmgr
- ./project configure
+ ./project configure -e
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!