Compare commits

...

10 commits

Author SHA1 Message Date
Bradley M. Kuhn
9368de336a Conservancy: remove depends_on, at least temporarily.
Some checks failed
Javascript build and test / lint (14.6.0, ubuntu-20.04) (push) Has been cancelled
Javascript build and test / jest (14.6.0, ubuntu-20.04) (push) Has been cancelled
Javascript build and test / webpack (14.6.0, ubuntu-20.04) (push) Has been cancelled
Placeholders / notice_js (push) Has been cancelled
Placeholders / notice_ruby (push) Has been cancelled
Placeholders / lint (14.6.0, ubuntu-20.04) (push) Has been cancelled
Placeholders / jest (14.6.0, ubuntu-20.04) (push) Has been cancelled
Placeholders / webpack (14.6.0, ubuntu-20.04) (push) Has been cancelled
Placeholders / main_build (14.6.0, ubuntu-20.04, 2.7.3) (push) Has been cancelled
Ruby test and build / main_build (14.6.0, ubuntu-20.04, 2.7.3) (push) Has been cancelled
I don't currently understand how depends_on works in Docker, so I'm
just removing it for now until I know what to put it in its place.
2021-08-10 10:52:08 -07:00
Bradley M. Kuhn
2d959ab8be Conservancy Houdini: use our bullseye build & our container name. 2021-08-10 10:52:08 -07:00
5b3e1f9d67 docker: run rvm install script from correct path 2021-08-10 10:36:10 -07:00
Bradley M. Kuhn
d6e334ea1c docker: rvm installation, but don't use get.rvm.io script.
The README.md currently suggests these commands to install rvm:

     curl -sSL https://rvm.io/mpapis.asc | gpg --import -
     curl -sSL https://rvm.io/pkuczynski.asc | gpg --import -
     curl -sSL https://get.rvm.io | bash -s stable
     source $HOME/.rvm/scripts/rvm
     echo 'source "$HOME/.rvm/scripts/rvm"' >> ~/.bashrc
     rvm install 2.7.3 --disable-binary --with-jemalloc

Instead of downloading the https://get.rvm.io script, just put the
two keys in the repository and do the basic operations that are
required, rather than grabbing a shell script from a website and just
running it.

Also, run `rvm autolibs disable` so that the `rvm` command, which
does not run as root, will not seek to use sudo.  I checked the
Debian system requirements that `rvm requirements` was looking for,
and added those to `script/build/debian/prebuild.sh`.

Hopefully, the semantics of `rvm requirements` is that it will exit
non-zero if some requirements are missing, which is the desired
behavior, since it flags that `script/build/debian/prebuild.sh` must
be updated.
2021-08-09 19:37:04 -07:00
Bradley M. Kuhn
bede0068a6 docker: do not use houdini user account before it exists. 2021-08-09 19:01:01 -07:00
Bradley M. Kuhn
3f8fe71762 docker: bullseye includes Postgres 13, does not have 12 (it seems) 2021-08-09 19:01:01 -07:00
Bradley M. Kuhn
2b21fcfc30 docs: note build-from-source goal, but yet undone for yarn & nodejs
Our goal in this document is to explain how to build virtually all
the dependencies for Houdini from source (in part to vet licenses and
easy AGPL compliance, but also to operate more securely).  Initially,
it won't be possible to do that so begin documenting places where
items are not built from source.
2021-08-09 19:01:01 -07:00
Bradley M. Kuhn
d2c6ce6d48 docker: Node/Yarn: install nodesource & yarn keys from local copy
As an additional security measure, don't use the network version of
setup_14.x.  Instead, save nodesource and yarn keys locally and do
the operations in the Dockerfile to install the keys.  Then, simply
do the apt install of the dependencies needed from both places.

Keep a copy of the setup_14.x in the data directory as well.  In
future, it might be useful to have a script that compares the
versions of that script and keys on the nodesource and yarn websites
— mainly to semi-automatically verify if upstream details have
changed.
2021-08-09 19:00:58 -07:00
Bradley M. Kuhn
6d783df5f1 docker: begin rewrite of Dockerfile setup for current instructions
First step in rewriting the Dockerfile to match the current
setup/installation/configuration instructions as found in README.md.

First step it to comment out some of the later stuff, and begin setup
of installing everything into /houdini (instead of /myapp) and doing
everything under the houdini user.
2021-08-09 16:55:39 -07:00
Bradley M. Kuhn
41ac73b00c docker: docker-compose: switch to version 3, call this houdini image 2021-08-09 16:55:39 -07:00
13 changed files with 1382 additions and 36 deletions

View file

@ -4,6 +4,8 @@
!package.json
!package-lock.json
!script/build/debian/*.sh
!docker/data/*.key
!docker/data/*.list
!Rakefile
!config/*
!gems/*

View file

@ -1,17 +1,51 @@
FROM ruby:2.6.6-stretch
ARG USER
RUN mkdir /myapp
COPY script/build/debian/prebuild.sh myapp/script/build/debian/prebuild.sh
RUN myapp/script/build/debian/prebuild.sh
COPY script/build/debian/node.sh myapp/script/build/debian/node.sh
RUN myapp/script/build/debian/node.sh
COPY script/build/debian/postgres.sh myapp/script/build/debian/postgres.sh
RUN myapp/script/build/debian/postgres.sh
COPY gems /myapp/gems/
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN gem install bundler -v "~>1.0"
RUN bundle install
CMD rake -T
# syntax=docker/dockerfile:1
FROM bullseye-base
COPY script/build/debian/prebuild.sh houdini/script/build/debian/prebuild.sh
RUN houdini/script/build/debian/prebuild.sh
# Use NodeSource for installation of Node 14.x
COPY --chown=root:root docker/data/nodesource.list /etc/apt/sources.list.d/nodesource.list
COPY --chown=root:root docker/data/nodesource.gpg.key /usr/share/keyrings/nodesource.gpg.key
RUN gpg --dearmor < /usr/share/keyrings/nodesource.gpg.key > /usr/share/keyrings/nodesource.gpg
RUN rm -f /usr/share/keyrings/nodesource.gpg.key
RUN chown root.root /usr/share/keyrings/nodesource.gpg
RUN chmod 644 /usr/share/keyrings/nodesource.gpg
# Use yarnkpkg for installation of Yarn
COPY --chown=root:root docker/data/yarn.list /etc/apt/sources.list.d/yarn.list
RUN chmod 644 /etc/apt/sources.list.d/yarn.list
COPY --chown=root:root docker/data/yarnpkg.gpg.key /usr/share/keyrings/yarnpkg.gpg.key
RUN gpg --dearmor < /usr/share/keyrings/yarnpkg.gpg.key > /usr/share/keyrings/yarnpkg.gpg
RUN rm -f /usr/share/keyrings/yarnpkg.gpg.key
RUN chown root.root /usr/share/keyrings/yarnpkg.gpg
RUN chmod 644 /usr/share/keyrings/yarnpkg.gpg
# Run script to put keys in place and install
COPY --chown=root:root script/build/debian/node.sh houdini/script/build/debian/node.sh
RUN houdini/script/build/debian/node.sh
# Switch to houdini user, rest of file run in as that user after created
RUN /sbin/useradd --home-dir /houdini --create-home --shell /bin/bash houdini
RUN chown -R houdini.houdini /houdini
USER houdini
# Install RVM 1.29.12
COPY --chown=houdini:houdini docker/data/rvm-mpapis.gpg.key /houdini/keys-for-rvm/rvm-mpapis.gpg.key
RUN gpg --import /houdini/keys-for-rvm/rvm-mpapis.gpg.key
COPY --chown=houdini:houdini docker/data/pkuczynski.gpg.key /houdini/keys-for-rvm/pkuczynski.gpg.key
RUN gpg --import /houdini/keys-for-rvm/pkuczynski.gpg.key
RUN curl --fail --location --max-redirs 10 --connect-timeout 30 --retry-delay 2 --retry 3 -sS --create-dirs --output /houdini/.rvm/archives/rvm-1.29.12.tgz https://github.com/rvm/rvm/archive/1.29.12.tar.gz
RUN curl --fail --location --max-redirs 10 --connect-timeout 30 --retry-delay 2 --retry 3 -sS --create-dirs --output /houdini/.rvm/archives/rvm-1.29.12.tgz.asc https://github.com/rvm/rvm/releases/download/1.29.12/1.29.12.tar.gz.asc
RUN gpg /houdini/.rvm/archives/rvm-1.29.12.tgz.asc
RUN mkdir -p /houdini/.rvm/src/rvm
RUN cd /houdini/.rvm/src/rvm && tar xzf /houdini/.rvm/archives/rvm-1.29.12.tgz --no-same-owner --strip-components 1
RUN cd /houdini/.rvm/src/rvm && ./scripts/install --path /houdini/.rvm
ENV PATH="$PATH:/houdini/.rvm/bin"
RUN echo 'source "/houdini/.rvm/scripts/rvm"' >> ~/.bashrc
RUN rvm autolibs disable
RUN rvm requirements
RUN rvm install 2.7.3 --disable-binary --with-jemalloc
# COPY script/build/debian/postgres.sh houdini/script/build/debian/postgres.sh
# RUN houdini/script/build/debian/postgres.sh
# COPY gems /houdini/gems/
# WORKDIR /houdini
# COPY Gemfile /houdini/Gemfile
# COPY Gemfile.lock /houdini/Gemfile.lock
# RUN gem install bundler -v "~>1.0"
# RUN bundle install
# CMD rake -T

View file

@ -1,17 +1,16 @@
# License: CC0-1.0
version: '2'
version: '3'
services:
build:
houdini:
container_name: conservancy-houdini
build:
context: ../..
dockerfile: docker/build/Dockerfile
depends_on:
- db
- memcached
image: conservancy-houdini:latest
environment:
- DATABASE_HOST=db
volumes:
- ../../:/myapp
- ../../:/houdini
db:
image: postgres:12.0
environment:

View file

@ -0,0 +1,52 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1
Comment: GPGTools - https://gpgtools.org
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
=CLGF
-----END PGP PUBLIC KEY BLOCK-----

View file

@ -0,0 +1,2 @@
deb [signed-by=/usr/share/keyrings/nodesource.gpg] https://deb.nodesource.com/node_14.x bullseye main
deb-src [signed-by=/usr/share/keyrings/nodesource.gpg] https://deb.nodesource.com/node_14.x bullseye main

View file

@ -0,0 +1,51 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
iWTuv7mXY0bNG+s=
=X3ZS
-----END PGP PUBLIC KEY BLOCK-----

View file

@ -0,0 +1,580 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v2
mQINBFRQA8EBEADrLHxW4807EJMzDjhrR5+FRy5/3616nyLlbWFTLnS1/i514L7Z
LVzbho4eZWjErRWqT1mr+E7dr/c8Ei5J8kUMqm5MoSkCoc5Y7Gp0jKhfDF4Megpd
X2ZKw7VG+4GZU9gxbm+6ymHeDAFRfQjUoHzCZsdsgnhi1C58kMoY39dFidlk24AG
E7y8WEg42yzSyJFjK5+qdGuKTBK4UmYM3uxHbxZgBLZ1PQ9DhsToauTqQSJEFzC+
r4qQeO6CeZAUEhgCt3HnmKE8hdARQelNRICrQc/Gpd3c3Wcpi3zj61cRqTCDBtNJ
h66bN+b6MilfT1S+9YMqLACXIWRcXPPUUWanmleguzGfngRjr/qf2PF6g2HYsp40
4M3CE0JX5O5iD4A81b5duuhIzZhJu1LFyn0uPX/zHlEwo36cQF3ElbsKyX6woXpx
hbHf67y6oQdSivhJvshJamRHxgi+bU6kkiiY0E8L5/8h309TVpd0wXfYfMPeE+V6
GsLjbxlU2bYrVxocREZpjCzqKBCmbZZxAd9eQPl8dYAs7kpxh8v3N9PEs0TRH2rh
KYjhKE++G/XuFOc6lm2gE5SnmwcDdJlIQm8YhW2LF/tTmQjAnxu4ILeWHwufhubv
BWn2UkdkGitrKEUmk9z24BMRKdPy0aALblvLCtri+2mf7ZaP9Stkdr/7yQARAQAB
tC1NaWNoYWwgUGFwaXMgKFJWTSBzaWduaW5nKSA8bXBhcGlzQGdtYWlsLmNvbT6J
AjkEEwECACMFAlRQA8ECGwMHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIXgAAKCRA4
BLuC053A43HpD/9jf4DoYEu4adwJXJFSlUZMLZc7yNKwa2zsgBLZAzHuXc1lDDaJ
H+1hp7huxlq65EwmBJ5I8NgndBf42C0AYDXVVTQp6EW4tfnaW7zZgOcKZYp8Gu2G
HFIUPX28hm6VFJZCTo66yMVq+2a8GHhN/KgPbCd+eKIAzMWK859IYQgpXXqPgB3V
ERTGO34pBbz5GZ3BuYZvHo6Dp7Nb1RTaRdqCWXGabWz23+Gdni3K6ohNF87io7EK
SNcyzn81qG5oiYNwDMXt8T8nIIagUk7accQ6fw75FpFbZaR+nbOD7v88us40f6K9
WYV6qsOKAXygeTT63jLLLcLqe/uKRmKCO8fitIav8MHEtNOeQeQkG0O9YUCRpZvh
PlUbOhFO6iShs/AqPxIel33A65LjRpcxYNzbdgfnmdf5KEd3Uc8yafDIdSYrsSsS
xUW+/8V/dqt8igCcx4oypqmQc1BlYx4luUugqwgSOxPLN88jN4jnBQ3WKFscmhww
jYD4RqN1fxsPzk/Zh3rrq3zbpW4CtK9E8JWvbYzGUHYwI+2C9BRGPuYdD1wYpO59
OvX2EJOm3tV2iQwDVAfsVioRgXIkbIhkC2NFcYBfu+BgQNgvLFl5x6ojFo5+xStY
6gvnIpjCosNzme83KphH3pDJ5xMG7in+8kn4IZSScbPpMoCyNaSZHt2dQokCOgQT
AQIAJAIbAwIeAQIXgAULCQgHAwUVCgkICwUWAgMBAAUCWLHkagIZAQAKCRA4BLuC
053A4wYhD/92zRC7wYn5hYnAdh18hm8XBa3O0BRqf4u2S9TxB016QnvJltuNi6es
52a8jIt4EgpdB48XtrFW441PI9j/36FdXGNUouMc6n3cGkl2OK+OHWhqFS+4hma+
R7IUml9/eT0Hxr+AnNUpP5WVqzWRFnrk/7y72pcthjQGtkJH/G5xfAfipIqLJFs2
bD2/AUvPcwo0d7jIcrpF/E2G6A+NvS9M6/7czV+bL9Ir9r3D4grhFq6jHmtmg+RF
YuNvwXL+lJE2r/dCglhGzmeTSxpJpiLt1bEf+lY0enSt3rcA5LMa4w9VyGVdudnV
D/v9cosyASau0DjTZix3Y2i2YHuz6+SLYdQXshX6yCwdbLDscO+PK7rcAzflHEsd
a50E1dvGOI62LHXx9iMZM4cnKizaSH81ABtPjRgxYNszh18ct1luzHGtlle3swI8
RRh8MZxVPefIlXd6gHZx4ikZtg/TU5vRBS80dXLteQ2phrnL3Kw248SIMW8WJk7U
5Hhvad++x+j9B+JG2mgqIuyAk8ggH9o5S5bv/mLLnqbONwpMk4qOCWHDaG4GVtpY
dA5Mt9NQ45wgm1QR/W17bcsTINDlfztdrQC0WXEm2N8XgmW4N1pEOM6uM18sTw3j
bw4JmLbLlMMVhGG6zU7/91l7JejBMVoWn/q4dAyRSUkO9p0rOiQpM4hGBBARAgAG
BQJVgnPQAAoJEHLp2vNurPoaO/IAnjejWuDgkEBSwPyuiUL+PRQaPuubAJ94kw+N
Yjr6NA6S3sSOtzn5hQwlhohGBBARAgAGBQJWKb/tAAoJEHLQvqdBoXDoNdAAoLDm
d7hVy0D7vxZEmbhNXwfpOT3eAJ9XAwfmRRi1SpqzZ2q5gR+FUBNmX4heBBARCAAG
BQJVqS2VAAoJEKy9TW1HdUO+eRsBAJVAyIbv1/pgZiRNPqGj+cD4s8W7v9eI60eX
EY13RgU9AP9kKzJxTrdAKsr1jM4UZ3Ep0BBE342uWUxKblKvSDhr4IhkBBERCAAM
BQJVyd5ZBYMHhh+AAAoJEAsh+or6GXlv4MkA/RG2UZNSNNCFlb6w/VSNUfawzE4U
S2m22dQI7IFgogKhAP93v8Dc+mAZOB9g+Tc2pMaPZO05yaF9METRaUoxOwcIjIhk
BBERCgAMBQJWLyFOBYMAKjAAAAoJEJ9l+8IS7C34i5QBAIT2K2SIB6dI63RNIb02
aIJWrAtXy/W0RlIkKzSi1LYxAP0ZgbS28LRPK02O/KeGNJUXyiSbUdZNtiC6Yv8H
AR12nokBHAQQAQIABgUCVTv5bAAKCRARj8pkUvMtL5XFB/kBtJiiLGUQxkhcFfIJ
3F6t3wdkdRIKIDpfn7NWLybiogZZfvZI7DuGGSQFqZVojimQiLkUJNCha+wl/8Js
VsEeV1uK6snJnLZlFgnVesCcawi6mZdj3s4U9enADWiKY5aDZgM8KhiGjAAUAuU4
9OEw0UVG1R1GxQtVC8HRo3/uWuKT+HFKamX/q7dCH4Awpwue4YMbWnb7uA1ybtWJ
SVos7VphbjWQJ6Cw3jLUcL2OXYMQLu0RS1IO7oVTyrHxWVsM6VFlG8fcRy3OZKo2
ElHGm+LVIt2yO2uEI0GW1m5saki96XJJl+MEdIfRgwVsJv7UfaPQeLJq77ZxytP1
H84TiQEiBBABAgAMBQJUbFRzBQMAEnUAAAoJEJcQuJvKV618WroIALXmeFAuF+me
QdnjHwE2R8V3jNF4FtL8pS5KlmQ+fc+zPnnz7XBEs62aEYCsdDDaSLE3MdxRNcvY
mS2GfXR9Pez2Be8r3yeZqMRM7X9LTpwcA3OJ4MAJeeqRRoP8CLcJyJpbd55xJsnq
3wdzF/uZbIXVVFVqiqu5N9oUQNxe8bGbW2vHEuToLFB1MqTrbYBgpoPKscjoOyks
CdoCyAkwqkXecc4UxLrfaGD7593a+MHdIxGOX8OLtusm+V3kJPq3qBzwWz1vXG92
JPS6fm+X0mqtOzrQEnmf1lK28BocJATtdMurjhpyDPA746wADmx5OHXvABl3Vwcw
DkaktYNHzLGJASIEEAECAAwFAlR+HlwFAwASdQAACgkQlxC4m8pXrXzVCwf/VmLk
6cHjgTd142FA5aQNL7N2PMcFOFwRrV3kE9VVRjeBw089GSgp5j1en/EzcTnZTOnT
MtTq7A0VlzlVoGAGGBC0air18EYHK6/jL1XyfaLR9m339x1IPEmsvT+WmoT7fTku
CPfUodwuaUggjQ0xK5PCZ43cINAvdfbCfmjq0fKWlEGf658pbu40ylpJ90bNHnEx
xHV2NqvTvfdFpPQlTpDGRNVEbV/XPluCcuJYi7VQp9Ba6tOPTPnIz3+XxZps1awK
N/7mwwYTMn5LDtc9u0v/vjztATqRlcm5FmL3oBl/P0ITgb5DXM/C7sI0dQzTPL6n
9BRFDN0eEYjS6VvrBIkBIgQQAQIADAUCVLI2pgUDABJ1AAAKCRCXELibyletfHkn
B/9Lt/DjYop8TLJ+avdD2OUMpSBhPG80GzvW1H2HeDnW9BJwMdWxYOKD/VYnn4+n
ZM0MDwMA55zeQ0sYzcwAMj7bpLzBPOraB0OZbc+bGi3P6qb0jkQtBFwCMYPI+ZOb
MR0UPeDiUI/S90ysJkMa+hhhfToQLjlF2RkgNC+GVquOAi5HgpoZYBGGouMxD1aM
CsMtXS+Ho+w4OtUUGnS4dcK/6MnQ3qnz+sQ3M6mPjlrDfRrscI8YJW1UNpX34Ut8
fOzaF8NafD1vMDWIIF5pLo/034k0wYt5cFbW7CZbI43pQ+Sq817NVP+qtIgYXf7Y
GfsZdreZpsZn3pBE9viUfoDPiQEiBBABAgAMBQJU1cz4BQMAEnUAAAoJEJcQuJvK
V6187hoH/izErvBf7zj/faquV9JxuV25XYLEK58Cy16ahrYClgbwG6V9oToqmryN
K3yC4jRnC4UR3In1sWD2krhOkytaFQtOi831LWnxQ4ouazvnZSiugckwVWowIycK
NTPnaBFGIP+3lhN2MCMDGvixUg/gKY//KtltzLEbsHp1kdB1B1Vs1OFK8C+QvUAT
t3E4/kDW7WMjRF5i2zNLy0TIdDTAqMYT4BqfWQkbK+a8CBOcrlLoVym7kScgwMQE
zvrwHrjGAOs3crJonciRn0ysnhEL9oi3VJbytG38K5vv6w0G4ItvHFV0v8PAd+pt
wEgf+TmV0UQslhn63hYUprNj9YZ7T22JASIEEAECAAwFAlTnk1cFAwASdQAACgkQ
lxC4m8pXrXxm/Qf/fCDOsqHpPtZ8VLiEBob4ZS+i9s4Wsv7HCarW2+/8aPdmnCSx
xl0QenEIwFmh0GRhf8rcvsB/bmX17fMl5OXj/41HK2duM5L8PqdKwj/CNt0nbTeS
Ti6+OPWZIQrVftVUW7PBkCQEMADA9vPUYiTZeS6tuCwt6/AxPVtOdSAeQpNrT0cJ
sw2t0XJqO+Yd6h7po7ZuKE3OCY1A4VgZiSNuuqFZyPxB93GhaBb3gv0ocPNdsOBl
0+gq2GSDwXoncHaJNqoJCniOJlKgyBqlcI5vwkONSgSq9uWbiR+//ZJf4D9dAE9E
6Fd0ETp5JL3+w1SDyUW1o+UvxFTP9GpNPb/W/IkBIgQQAQIADAUCVPi27gUDABJ1
AAAKCRCXELibyletfM82CACp9P95WhnkCWM3Fg8Nnhe+sQsUmxQCXL0v1mgI6XBN
HQbeYiz+5EeWZe1+UnTAJg6K+eYl3jA5wvD5VtIaYiImf111LiFq5oz/t9c1/RM6
MDW6ezwHE2kUbNtt1HPZz+HwLtXLuPK8mFlrvBOybdHPJKY//nn3mqUkwHfgThgL
/7NAc3WitJkBoWnjPPXnoWzYJybMmYfwcDVIZASZLmAiCIFCNC31p8xGxh2WFDXs
GmVf4r9oAItFknK21KX/vSeqkwQBCg0jN8kSaLKpf3WbR/Kj2SHcvUSl39yngdyq
GdGPKXxmnJhoOOcCDnOWZsdgFbmfKVz+Mjs4x/FcJCXeiQEiBBABAgAMBQJVCnYP
BQMAEnUAAAoJEJcQuJvKV61861IIAI0+ZyAJ6VPyGUZ7WKdgbVEkT8D1CvFqR9Yn
vzAIu3mHZ2twswkURT5BxiOh11zWZDT2e92xTtFZyqrG9CRlflID3ZcAL5hB5Ix6
zhmYL5/mpEANHjk4uKnZ8dnVEoRfoFZq6kss0theCnqwTruz+sDF/54o4FDoWl5c
WW4EzO2pf1nHTYdTJlnJzs2S+aob9XC0d2a8u/CesM4H1dyRjcfN1h9Q9FMNHHYF
U8r2ZX+L1pZGOa7ZSN5o74YJrP206EPo6OlcC2eEa7e43vA+KYX2+FoZ/P6n4YtW
l226fS/KjErQGRHuFXrMmtFPgI45bfNLCwyu+aIRbrtX1NNnnJmJASIEEAECAAwF
AlUcQXUFAwASdQAACgkQlxC4m8pXrXyOaQf+P/ZTh3f7FFJEZkYUnigeew+6XsXI
7I4m2BWo7+Oz+jaSBBgN2FDHMwi6FFCrq3Aoygbvh5u+2gJ1PtWgx8vPlhkXesXr
wJO/385oHk0MnDYVtEDd7PJ9RRyn3GIJ6gnvwqoeDC+siP8qtty04a//7CGNTamk
3tRIIiunYIFefpdRI8hKsTCN0PNVzB5pMiAizuHcy7I3pB9iCSF4M9CZXE/GFnyz
QnA4fji0xX7qLfQqiLn8Hz6c0X5eEj8uIpQG/ln3gWd4410lxDbbzz0Z05hevsb5
+eZZ6cX0BdNAARzQeSRlyHqawWWEeVfpqG6X5cULF+TM68Tnibz+9884RYkBIgQQ
AQIADAUCVS4N/AUDABJ1AAAKCRCXELibyletfNFRB/9mhyLM3nZA7pSkvbcwedr3
IOLDNgHWzO68ZAbLYtIkR0W/ZYCVtBhy4ZgevxhpDUiec9Po5zmq8syl5CdiOf5l
FD5aZab6pytK9KMQXDbnWfoHm5W8vpgrpDwvrk6TR51LLp4+3ql29dDyzNW684gv
1FToWCnYBgM64CbX+m0DRZXanAJtERyOkQU2+8/crR2XGK76oaV3a4xa035DKWW5
qSDsEmmDRnVtpVFFp2GlXiqVhhqE4QxU6MrrBjIfIwK3WMlFR8g7/O8/FH0Lbmmy
8ddBqeK5G54BuFh7kbpEpSmq+DoGJIqKvBlOJDBUMabOdlCPHJMrHB4dIg4GbNim
iQEiBBABAgAMBQJVOK/DBQMAEnUAAAoJEJcQuJvKV618sPQH/1YeEQfDzi0Tb96f
S3fdXLmpGI7VzwoHuw6e3HrwN+5Ohb9PfAgglEvPos0h0pXPfc8vnr0NCppNDtPV
wrj21XgGKmMkBvJc933pv9fIGHKOBpfNRkOMjerA7+bRWzB97jB1wV0BMGhBPdxE
P4CSt4e/zVP3T1BXYw5/q5Tcm4/aPv9SxmlQ46DnayAuGvukZAdb8Uw7DOp+lIkW
OSg0qgcWbplDfD8C8X0LjbRKDqtJPK4HrpttR9k1No9t/tUzapLkCAj/UDTf9CXp
vRzx+a1XjlA7KQl6dGiRf9NFvPvhgRu7coT22pBEYJxbVZxsK+p301HGYzBcE011
4MVvxDuJASIEEAECAAwFAlVKZgAFAwASdQAACgkQlxC4m8pXrXzdPwf+IuXJq2cr
K4HE4Tc+brD1elE7JKh+YEbDfJxKc/q7HWiEQkvk7A0ZR5vM/o1vSyeJn6vuyvZe
LehVbIGMKUvBZBlCg4iWfGTkdQMPp06SZvK4udq/WQWaiBkK1ITWcs5yEfP0XDSN
rgQOF/ldu4ijSUxiBp/iqPRa79Q/6G3h3epoXvHJYNGFlWH5UefmLA3lNxPT0kMp
xlqFsoO7N/xJPw5n59OjHX/C5mwuEmhjQODs6Kju+vARJZnEIlenFgqKDfTZt+r+
i4nyz/OsGoYo9bseXwf7gOTeUgPWQqE3DYk+1AwHKwI/AevP/QOlGvOEt56vlofH
UtTGuj6G9JT5TYkBIgQQAQIADAUCVVwywgUDABJ1AAAKCRCXELibyletfMNWB/9R
lxa6kg7d7qe3KAuI3rFJPC1DPHMAo6hQnMDcLQywvGbHX4CpFecWFcU6NQf2ZsJ2
sAjjzjhq+C5HdJu4KuO9oG2XuItVmNwCzcXlXRGeFKa32+DgSy/KijnPQy0y37WS
fqhQ7uREkwYjqtfhHLpJcp/CSLusy74FPETtfOqIg1rwTdLFQTp6ktWjzQDWmMlk
6aZTvLCKn0WxzIMofPhVa8fV6XrK1xb8FHfGBeIGrCAAtrdz4sjVXJNXegvI7dy1
mDYewLST+d2L9/c2IYOCG57hVN0JbwJQ6qc07SwtQaHYrnK0cjcPKjg3+EsHAfYq
U6UHD/ULEBH8FumXe4LoiQEiBBABAgAMBQJVtIZ3BQMAEnUAAAoJEJcQuJvKV618
f34IAJB7bp15KWkzba32ZhR9X1ZyQE27UDhy325CDgBj/Hl2TmmrmXXdLX4ABKUV
jUXnDwvwNX7I06Mjvanj0vyZqqahVlG3H+/0NOQK6HR7fHhsIwmjG1PnVsH8VTVg
uKkrvt9deRAAW+Ou7AyASpm7J3TOsnRhPt/ARPf2UWfgO27KDm4xkSrO2oNDzzY8
mcMuGs7x2oRU7kvD9m09V4yKA2MD1byWDSgpGlsjPUm3HM7pMPPq2nLYRDVTw8qH
VHcG+QFHoFKmdqgaHbjkf5QIMMrkE7nkkHEu2WbiQXWabXGOHhUTjYvZwspwKYo7
lgveMq9zN48mBTAasTAREa43/XCJASIEEAECAAwFAlXGUx0FAwASdQAACgkQlxC4
m8pXrXxQsgf8CQYJ8AOQ5bYQZU2Y8qIhS5wdBknpPG0g0dz+soGdLdJU7ghPlFhn
O3IMTdGY54gkwzIcNx+h7RmvO8LdTtkYJeTr5SQhrzZ/UZ57WW4RP3rfEGrrbvnm
nGX+7E+I/TiVbwGZ/+0thXrOjRzOW1A4W2GHEXpgdqqzFOwi0bccUCqlt0Y8srmP
xtWremTLyhqD2Z1WLEHwmOKO5C8/2eGQhkzemhAoLtVLzFZgr/uGs7czHoupg8NW
UaVjLxRGCVw5YtJqF+0Nm0K588AZxbKBz9mYrEbnTowjXb5uAlkc/Vt/GpQHO7Wc
uQxO5lgy1aa2tzi1MZYvUiCQ3NuUbIf6ZYkBIgQQAQIADAUCVelCvQUDABJ1AAAK
CRCXELibyletfAvgCACeSuI+u19RMTny5XMY/HaX5fcVgaQ/ELIHnBWcDIUkdSfH
jmqubxO0D/0Yr7clmMcX2OTZA/zQXJb15No35nJYHNGEeJMQD4DiEIYSr17CzEkf
fd1lm1p5iMh62io0DmKImgQXTP5/EWR6zb20g8n4WopT8ID0ttbIOjkWodcm/k2L
x8QFjq5lJkLVoOSrtaQM/jCbvPDW192Mz6vF9xnmvi3zoj2q0RJ8/Gm5hOBEAml2
DJJBXMGsnElcEF9ONkL/Ykfep/z+TZlayhkW/4GYrltjRWxO+YQ92h1G1t3FzYTj
R7eh42fWK3mv/eTa75jAm9B0hmUAaqOhrZZWTLdUiQEiBBABAgAMBQJWDNsYBQMA
EnUAAAoJEJcQuJvKV618ucwH/0eXrYJ/9jDlcF0K8SeeRhSmvnExJU2QObdeEO9Q
1PSg7aawqwT7KtHi4rDDIU5SgrV2voTetVajYFtUZrDVFlfh5tH+U3tTXI+blxL+
kydJqvxS7dHQgA/XoAYTUcqKxqbZdOZLsHMzSPS80Wgo2THSZLGCq3q0Ofb0sMlN
zx/IP1XTKcGP7nTeLKJzDIgG4CZCbvENE833DmSJ/cj6Ub1dg3/CWaGmENBEIuuc
MLy2GTqMwUJ4H4gYKZMDNvq4VqDYOVI5LPRA/ikkUkNBPkVr8pAuYdd0AZIcge5G
ngi9NrEHbp0cGyc50lUJLHhm3TmdXFvx8hnBwVHntqDgZROJAhwEEAECAAYFAlUL
nbQACgkQ38HrN0mTV788ZQ//Tu6uaI7sHBe9Vwwbc32mpCpcY7vLUM71X72qAJg7
tNDw4AHbhzR2jhZGPXnNX1yVZZlqPaTjkjCmlmpXIGTW9U3IjO7sL96dZeL4WxCr
Jiv4Jukv/YApA8eDejEMnnaF2uYAhvuTf5G5OoTe2U65dPsxuOGkIDcfWRfvXQ3m
srz9TakcWhwvQACNwYJKitplkW9nlZGNGGWWrI0SHKYy0GivAEb/ieXJ8m+WqP0A
xJOp9xb8TNsjyYEvw/05Ipuw+D3Hdy79eUNH9Dm0ojEEnOzeImPvNOv1SrnNesR1
6vcgOcFZvW+bW10Jz7LN3rtkHE2VZg6XO+ApnWWveZJ2typ9jrZIu8W/8/8UE1Ds
NRVEDv50zXwNY5++f8yRrhCqfMHAX06ALqkzuZ9T6cm8/dNp8X2dWnhipLcuT0SG
BzAoinu+ZDWtu/d9aNh24z3PNS942F8pNiJo9sZvWadtmSWQ4oMiWe/i044gSfjz
l5ZTh4atbtN8VRoyW7nt0ID+nIElvfjq9h/PEsPklEzllz8b9M+vnujVmVejzxXe
07Qfxq5lRGcZ1FLyDusomSWEGX07+Icci0MI7x4HgDl+HkKOrt9pYt9PweHQ0CGA
a4tE/sCQL9C4V2iZCuynBtp8PjiOTS3AkQbhFksrdUA36iY0nTmSjKmwW8O6VaHv
aICJAhwEEAECAAYFAlUzySgACgkQuEPm/Y03/elnKg//SJPD2ZmUO+uZ7zp7ABfX
5uq34vnNUBTmE/pTxj9XUISD7QfAtTSf0tdWljIR+ZexSPVBSEOIiLhw6fugYpKL
5bMUFgq4brlJfxNbZQc8jDe3YEQ81RNiZ7rp37g4OyvSAYRiWaEU56CjbUpmJVm2
QbVQ+9St2LsKPawxTvS011PZMklLgbN1PDSUtwgd58YOC2RAZTI/l4YfsVsmggK7
rEkpc4JhH01gYKDfmHn0t1sWL8XRQszv0somOkEQy6fgRltlp+f44e0ctmK84Q9L
76CSwwXvpGQ7WCXj6O2QcLnmdxxLq26eC32bfEQx91JiOzxVMybzwyRwwJVcJPpu
UPQqI+ttcyzPVJuL4ftRZTE4ZbYJfAYKWn1nR4/W/Mczh8sOUmixff4I9ssBY4oe
29Dt4gAOUAxSArHkmSqOSuaPlw6+lOWy4hZU8m1VksvvncM0hA8+riq6jdLDcKfu
Va86BZV6RF8T5J9/0s/JsRvYne1rETWC3xwy1G7T+47gYM8Zu+xcQCHzVVDOJKEx
aEpOpWFGJGTqURv0FU6AsPC6Ih8z6C09TrxZp3/wPbwrvY8TYdxxbYznW52+PEoT
8WJSK5AAC377dup31StDR+fgwqv4l+FxhvDI/XvMPFwnmiQafytndIbZlzCOGw7e
hNBErB6AIASa10DjFRyHRKSJAhwEEAECAAYFAlXpuAoACgkQERlLE5n7/iRK8RAA
oT+WOyX8Rwtdoyhl8lJHuIkWgwiVGexH02arw5e1ruMxi8Oxr5ky/+K+sOF68hD+
+ousYlqhsUkLWRR8e1kb4tTrVIul8Zc5hBuDbMkUJd+edywgQXAKXuEcMJAK4X6K
cS4Vd64bGSOZVIdUwiqA4OaRj/2KbCoCFcBWxbP5wew+A9S4vI17ks23F7xdRnwD
ikvf+t/fd0VnbCo4LiYOOO7WxxRUdL2sotuOXnNKGYBPa1ireKpuqK7dhE0uWjWn
stlK9fDGmSYmNdhQcqglz3F+Y2OynWZ12/Hz0UbaSAvZOabqH2GRymGv4JOBGTB4
/Hp9BhuVcn89JjDXcpuxZ7cZwB9jQ48qa+9YqPWf5Zm+tQcuCuo+3wpDZqM9Pmk/
qeHEfYeJDJrIHmUc7gN8ZhdVDSCHuRJd2KWwgniYJByTCdzSAwMBW3XBQINjZi+r
is6Fb3PiiAE4GP23O76zCnqlcLwIuODiRqu7EPI8BQfbQTuHdgrd0oXJXUhfF5r+
UIBQh4d1c78tYU8AHXZHtxj6wpnw163zfUhcVqzRxo7AEBp0GxIRyNk+S+IFoWhz
XeY4blg41tePiW3UF/i9sGiPUqYEi3F9snH3OAr1pahxeX+iM+6aQFzVdLCN4Z48
Ke8aiBiHqTk8hECuBEEMNxPyB2a6QvEQodW0/KExmiGJAhwEEAECAAYFAlXp1tIA
CgkQERlLE5n7/iSALg/9HwmJYjV2ngboTFIlGc35NtpS9SFmvcVmuvJ6F4fKwZM5
ejtkKHI8BskIxMq7uObK+qK8lBF3gyh+fhc+eoaF7ycyWA7T5H5u87Ox27Lrjp1F
3lD5EKTO+0pXS99qii9MWGD3B2k2eqM9+aNrWNQjbPjDwdRxFNugI1g10GVwUDm9
f8wbnC3OaKC3sorEoX4iCosFcwLU8sqiKDal9zvuUXB2fOWswt5AOBf57S4+yaY3
lrEsyCJm7wicx2ZCTiaT/dUbkYrma+cYutDVzLwj3ENsMGf0ezDemahcdzWoGOrB
c5waAv2GA3LdihdYM1cj7Pfo10YpFk0Bbg5ot54mAOKu+Ab4ObvM83AdS3Z4oUMn
OHqghsOlO3Xo18I3aDdhOjj4N7BnPHiSWVx+GGqyiptHmqgIAD3rmmA7DCdXpXQO
GtvUltyS/9J3h595c7Wch25hjUP4jDYcsR1yo1qjG0pc2UVRCpRIMJT5A8SQVrH6
eFfKWame+Rq45CHPWUTOE8XgqWPm7LR/p1g2bmjCVfZBv2Rr/eM0M517iR5SlVWl
2odw/TrBo+DO5dHuBPH6CVSIJhNidN+xX65fm/EZboQbn+5/u3TA7DQEJoB6hAPD
ye/x6ZAb4nEKDRLcQ38nWI1SYNjPH68OgeKBdibPzyXcg4+TKKejA3/pgmUUUNiJ
AhwEEAEIAAYFAlSO8rgACgkQpeSidHXJsFAetxAAyQ3xpH5/DvrT6Po/SF02JvWk
bMJp+DFvshTQYIE5ujIMA8XZuV3Zg1yvSTenh16iFJkhoZPt3NPx+BKxhnbLP7pQ
tmke18GyG+CMjYZ1n1fogzeGilHgFdNNRkeslQlyT/fc0jGlUG0rTSB+s+aTV+y9
szcRYTYQVPveRJ3Q8q5yxFb6wdJZCooK0FjneRF0WNhWAgpP0ijnbCI3KB/iz45g
XEFueuUcPYgXDD7VcMOho7xlHzCHzLYpiZJPjGiA80mWWcOoeNbSYvAm7By7M3Sm
IixumKcJ+9z5N8J9+G5cwHljh8gKqozkXtyZ/rq9rFkCbv91LdRuCSBnthQo1Wq4
y+zL2/TsifSeccRp30xgS1ELly4CSg4a7MIgCzaXfSE65hJV5Bna53BMEJocQDtS
CxPimERg4ftXtjT/4Nzzul6yV00Ap8bQpUKVFNYega3lFF5pi3GxvI3my+TRHFZq
/IrOBvuoErYAMXwZShjQ3+BcBBS1D01ZxMgtWoWhf78aPem6PhlBjPivne5Y2tzj
N3GjlMsCN040W3B0c2Fo3LcVPrYF03V+w799CVFdNaiNBzJqSg71oX8xuXzxshw1
0877IlRifHTP3OSzYKrz8whkMH/rKfxNKQsXiG1o2QuWzcoN17Ylw8pvPgTyz8lS
QpU0fVbjf8CjZRyL09eJAh8EMAEIAAkFAlVvKjMCHQAACgkQVeoO2yDWPHAqeQ/9
FcNNQirxpyGpoBxSM05XMeX+hqPcfWIEp23qrG+PRbNmcv6isrlA2T+l36PniU2e
vlSUksByJUnC7VKWZebIg9TFHmy7MjzCHB89/LyCXc4uLl7E5BYXAP23Npf7GR8G
Wwxp9uz66qDzW65RK1EQ4PlLPxOtLOmfvsN2BUCmXXZO+Iz/SAB3DqZqtCCsokUf
mkOGtLTXZAoAXDkwatiOWBIEU+6pgGXUNmO0CpYB5iVQKM2d9ovCVommJUs4VXFH
SxrQv4Qj0MsmfoPGdeU9w2Zysm6ejosUYJIQm0OcppI/qmVoEQHfWJ0rgKlS73xC
1nweiMAkFxRpB+bA/ls+X9InUDOiZmuamsu9QKsMaG5fimskvncTjONol0c1vhJQ
Obf9hGr8+COFSOlHQ19T2j3L/56Duxckglx/CET0GgpSy0i8cSEGkA4kFsIVOZ34
2UwkVlO9vgzPUZUWouw29psqmaFNlJloSFACBR0ekI8DyocspSd+vFbyd+kI+pcn
3iH+lxgO/TYyFEhpC3kJMB3wqe7U1zaeGvUf+TYGjZ8DOqUnODoNbx+p+IpIh/E0
Xn+9IOWXTRgFltttzVJZbdg2rzjH9q5KhIzu6vNXKyzVWJ5+qARxS++kaWDPkbQ+
XvleatsNXS5oO5qthwyGvoLHp3cXNlS+DvvkX075VZqJAiIEEgEIAAwFAlVuEEIF
gweGH4AACgkQVeoO2yDWPHARyg/7B0tg+QLCUQfVczQ8p8LmCi9B/clzq0yNM00S
dpxQ6QYMNM8+ap1MbvxhYhde5fLTx+vadQtpgJVbLJ3ITxnEwTyuT93RjdIzizKB
WWxjaaKx1z16edLvutNUcU1XJO86Hli8kYpTlRYHN5Ev3B2K9M4yz9dNZdcGtYy7
xotSqe6ZA/SdgjrIDIADhdyx9kqvKkaH6vGD+MkfcRwMo2y+kPrWwKKPlf5ZMoYz
b/ssCsslCSommChbia1AFm6nol3otYtZKhCtAGdI6X1nt5whZHPdjbM3N0Kbz24B
fw28ZTXtz1Xssfi/8S3RMXRj0iE9Vh0rMGLojG6dV1jn47st7o6PRjFiPWzO8F5J
GzR/jmgTD21AxP354+Ee44gu4BEFzJoec/j+gOncJBH2poBGhNacY5np/hqhfOE6
F4utovGtewNpKwgtfJoSOda75mcHYLpQ/+Vwfioz4ybV6FxeRLLv8rnxa5bvf3AR
WKri6Wgpbxvt227RMM/2Q1x4b5svdsnMe1r1SQgxDjjgBkZHBXlFMlhOKWBXh5LM
ucOHcPKsySIEsGCbTmgMRfTEelwsIrm5cnXmu5Y49tH4RFaR4hFrtm2SGj3ij6Y1
Ckus8IEUIZy5UTxdT8/1DS0xqE8Mpgknr+QMGGU6lkRmI5S1vryr0h7/xKILpPWe
7Kgt/NaJAiIEEgEKAAwFAlX8s64FgweGH4AACgkQZiPr6cFZ3iOy0w/+ID8JeMyN
frbhLv6Jz2G8GaDrw2mnXtVoQpyJGbNsJKSVRowAsX+qC0Ksgr68whGi3xZ3yVLb
Wz//1QhtEhyDlzNLB+DARigeze9hjLxQc6B2Ad6YTJMqo/VMswjCYh17hLjAoTrL
Fmu4/7k8M8Gs4J7O7YF9uhRVZVeoNKg3cUNwKLC6ITjjEoUruTeQdxIl/HKs+QXQ
RzNlXMdlnCkX5brdNv9zlnjfVJNojVWXpHx7Rk5R0FDZdPcbvW0ytUaIvt5GkmSN
RRk0KP6uezXSIezeuTZNgiopq5I5IMolIb4gAp5uoZD90OLE7AutEzpOfn4PSbyI
GpirCoBFdz4Xp1mD4QAfXDBO9HIUMXyuaARJh5NzBCveorYgeYo1U2tBxCrQ8tAZ
9ppWVX2jkgbanoRx0Gys/CzZu4pjeWjWIO74SmvEDfn5q5wpMcsFsD0HqMQKUDWF
lGjS6vVHQlalARCxYn4AAKokd4MhWmEuH9k1RnXd9spMRuOiF/SLeimBfUB0t/bM
zgST1UATVEQfys1npr4Ei7EsjUhDsgezpHjeDCxPHs7pFuRXBE7ZJoVrbSUddLH0
6wF/7PtO8yEea/i4lWHcol7bUgqeSF1vdscqnEAGt0n95gZBkUYy1ZU1O1s/F+oV
ZGYZGQntosrWNwjbvLomu4oeDOXSvdeto2WJAlwEMAEIAEYFAlVvKrU/HSBzaWdu
ZWQgYWNjaWRlbnRseSAtIHRob3VnaHQgSSB3YXMgb24gYSBkaWZmZXJlbnQga2V5
IC0gbXkgYmFkAAoJEFXqDtsg1jxw+JcQALGUBRfuTnlTk6nRhrrIoHqobRpghzAH
yYe5jaIasMtRDcDbpNk8CFdZTdLKlTjPtn66vA4DALe1MXmJg1jQIorl7caEzNRW
aBLnqpKRfm8YNkfWty9i3TXOVdIeAmp1/5tHtCxkR5Q5QhFR/YBns8BncmSKT9P4
cjvGkPU/UKhJdAKGgseJviXwmPmq28cXdxPymaZisRvGr0dbwJuIUMvXWj8n8ahA
5l3D3hfllI+PyQ4jteGR5gtITIRBoN4sAftngqtpioYDuglv+d1WkvyEprZ+247G
IBofa9RMB6wfxRT6ydpkrtEF7WAB/x+pij8GEizcpc5bNJiQ6xFQ8jZFDFYG/0hz
cxC3s6xAoMkOP9FhcmKxBAEJbf4OF0KPRPh5A8mPcH3XvnZ8PfvZ4dMtduOO+h8f
Tx29n5aA4sdlo5QXqyR3j+jtv+ZOOpArHN0oEyknEz65q+AzwaRkFRU9tC6obbvM
L+J99D9Hk58lQzZfeWTXk1Fq9K3E5ZLY5nSUdZrBudKbDWGFCCnV1HmC1ScMrIu9
nUn+p4Fia3ZBAp6f6EcqG2czHAgpZnupVVe2O/wYFhIJ5FD64oZfzP+axovHLTnJ
rDdyCbLUCgDSSEQqh6bxaEn7Jk+uzxCh6+eVpVvjY+29vunJ3LM2C1t6XXvU42dH
J1JW3+ekNs3wiQEcBBEBCAAGBQJWQhaFAAoJEGwCgZ5DT1NrW0oH/j7UWA9qUuXJ
evMnN+KqEA64m8ZUQKmR2OCrR0HN41m1Y/IRG4uXSRgGsOyhrBFZf6tXd70oSx5u
Vq9/VL35CknLXGkgI3B6j8zJeaTR2PaH+cabIBJGBlcIg2J4J2SDYJ0FHQg9RMvq
EJxTAVfOSr94q/kuKYpQnvAX4PaBTxM/630mhPqmpa9oWF7EVlngy7d+X9gvnhoj
2rcFYMUnsmmSinMDxmO6x1/4FbTlyl7debjyyCpk3sHdMlpJPeuAN8bq7ZbSdO9R
1nh2aQBakUGNoeKB0/y26PYzC/z2nuQRXS+fg1StD/qweoveaSObBwd+iqlc40YE
0tn6MPy+vmeJASIEEAECAAwFAlXYHrQFAwASdQAACgkQlxC4m8pXrXy9MQf/Yjig
vy7vkRc7st7k4Yh/mSBrgrkH3TmHrOkRs7WiOz39H+3JykyUC9o8Wi3CUrJSAM6t
lcXaC1nLhEXgzq10hvkLEEAoIqFrGFC9FMchQDHJtSkCnX10CVvGsNMQhSRFx/By
DZvruS76Okf2fsLn0wtsmdEOczFNJgmc5T5X0sPnCc+ld1lUwCz5avvbaAwZOAFY
sF5WB4ZfUiuSHJt8e7iuT1f/Up7s/Nb7QqhnrTJNQlMUeX3oQOeznXoJgrPODVdm
zrMlNFa7pqZ/ghaAImqoI+4mwE1GaELQax9UGax6z7kpWZoZcf5aavsqOdvEN87f
mnEcfGKhokEsZGNDaIkCIAQQAQIACgUCVsyvjgMFAXgACgkQBlr6EMH+SczwZw//
QLERibCOZYYE+vvi9ADUbH4eQWvfEAz0af0kSmSQkGYCEHv46zvtkKocTGR0f766
xpkaAfYT8N5AZiw6S9bpzMtgpbFbf4cS2g2smzfSOL2qbrCUEh0djaCXqfFNF0XU
fLAAqooDpSu087/eShojGO/JaN3gFAW059d0wAyNl+DRaHeSop3rjtx3q7jHonoZ
LFfYawcSHBrSZ59RE2HeXW0mCqiHVEyhi2Zk77PFo8Qf1CWQMJv2dMlhleXbYqZ7
7/uHBt7QKlr7yrNU2iLF3V86SrJQd223jMikGBqEr/qRyS3gwZSTDYgiwC0pM/LV
Pv5nD3qsMtpUEuVLwgwIDtwM0Ni3bY0HXc55KbqdkXQcIacygloJOut//aV8HfPM
asexX4hDREUVQzLwF1Ti8n2FZQE0dBe9x22CfFkNUON9cPNC2/MsT9MrEHURqYle
xymLDpSrl1V29mJsQSXJTuWBP+tk7RSoVcF0WRNc501TODc7k4M8ZxAH6IeJ0x0n
Er9Y4aM/YUkuQcg1J0TNhNqwCDe4W+zKCRFzd7H+8ZESWAx3eNR2JJcYznyGWi6A
azuD85hpS4VZ2KNtSNmOzwTiMLyy0Yn2FCLvxvNLog1LZQT0yY0YRGRa8K2tbakz
tkfDG5iDL3b9SA2CjcqzofjttHmckZWbm3Tt7H/wnJWIXgQQEQgABgUCVz7gagAK
CRCWzmRGHmPOqbtiAQCuBB4bWZKcylbG3Oezok/hbc1DpdMCnTyZsyxwybHvJAEA
xQre9ibXTO5jf/kjZhPZMTQPo46eQ90WzYkMH2ARcxKJAhwEEAECAAYFAldVQooA
CgkQpdgo0PxUF3mjSxAAnjxRvDVLkEKNZS5UekKLuiWjOuT9RnkXwbj63mQgTFVF
qFhwhWa+QswuTk/8517JNXvDO9K3c1QRYskc69riffuNq0TYTNlKhYX7E7UolIzV
fqWgS9QuoWJ68TJ79pmEhy5oVQncCmqw8HAHFEUeXdBGExfAioTvYTQwXEck60nm
sLVKaAGWs3oOkqyWS0rgrDox1gxEsRY+C+Dhxznbsq6v8rO7A3mN9Sw5KRFgw+kT
fC9XF6/sjw9qXPDKQk4PUd2GjXB4Bkl4CWeNPc2uXk6AKDYH9HMPWAmY2nURqt5h
D2I3YenweiPhhkwkuhnXpiXvgYmS/68c1v+OSsp8pUcDulHKyAzFc4s4S5G/1YzJ
C8f8EVwYaFGV0hxqUM935pm0p1ByBQLStgaIXlmtOpb9L4Dfwa2l4O8eQ7BZTiqF
g4lsy+j4ik9GNxZxCJluJMTkj6cUDiZxSqEKdoc5nc/QGdW5chR2H5frLrMNHB8v
tfO/Y97oV86vRXTv+7wcPPau1PNIkbuUOpwaKUHeIPtaeb8EWQQFRbO774z8zmuZ
xmhmAe0bQCnMCZ+RUgWsUYKt0JK2Sw7kcn+OHsPes0/XxjKHEryMFQfjQxW25fTP
K6Z4UdrlWz+a6vPCo9F9hLs6sLuhRHkXr9knjyeLVA+2b1ct5XVbByt3KDGcf9mJ
ARwEEAEIAAYFAlfS2UQACgkQcFcHTyG0wyb5Fgf/SL4ICw3ZbIzMIBlxi+cs0S/o
+NA1wfs6tEf9jANafjUWVI21I1U2TpYzvPPKtePb+0eU+7y54MTtv5JgzhYPhm6U
CW8LqlxPTQkNMYQ96a9e658RvTDX2zygn5Z/NFkOtllkK8QkjhQoLayYna/sWSxb
xGFXLFBK49/bXKuaTuxDKr07yUvI2F6k9Y5Myus6kCJ4NYic1TM92d/axlmEczXl
AviyHDZfpDBn80t/Ny/kCQitzsqZd99mIyOxdNGQccVmvdrWFTr1sxzqeCrdEv/P
m6BssAEgCSeMuAisOKvxb7bSdp11Jn1QAtel+CCauUppe8PwaTeCb6j9Uvh3kIkC
HAQQAQgABgUCV9id/AAKCRAiH2Cqv58MHjvjD/wPlf0hf8zFrU0VSR7yTaXMF4Hx
In45lNfaOfvcMad4NvoWIoYfKKiebypxndjuVGPFO8beuODJPCYMhYt21LO4k1AZ
WBGSHTRFRnCdZKa7FOpBUpXHLTPtn2DiHLBaFm8KcYtGMTy/0zrNds2qN1Cr3AjH
vnW42u14Q6TNpLIExpClfPOkGL2LOkB9p6TFPZdhRLQOcwvZtgvmc6dvQRxvBMWF
0BkkeJProlg/J0mNvLou44YlSwc5xE4nf/3V+eru3immWOgK1Tzcf+glBZ1kpzWJ
fRncjVFspyMPy9uijhrfy6G76ff3yh8rJGTu7hYB/Qcb486kcNyeqVqUyTCTSSmL
9qktm/cCcn+3wOcyf7Mu8TV+HkTe2B3d+Xse/9k4ShtcLem8rBEZPNS48vJvqjyR
G/2a9Vn53/Uzz84dzZuBg2PVtJsHTDWUy8intHYufH3w/U6yAw0Lwi98MTHVua+B
Q6dT1jmOEonoISig/my+xHBYTvhgxLHovUDCusbHZ2oMfCaqJhYqAbFfHnA6frpy
1fVavy46B8Xn0ML6T4SD/YiLTdx7Tmc9b/cFWh/XS8oHS7FYy/JoYxvnCowwZYfO
TEO23QQ10iXVC4nsUGFKw3R3mTA45BSpdaLR9FCzalqO1rdXHNaEOX4y1N0PsbYz
DhiB9hjEnHMQ7qlfD4kCIgQTAQgADAUCWAEMcQWDB4YfgAAKCRCtlLoWnbtb8i1d
D/9+laY2r549Hhv+Q+TJbdhKjzXTj5132/3KqM0LO4fOZDfse3eXUL3rqArqdbjy
zfifbk6EQzblt3qFKYNYKwGokLPxYtG8GV4npDSmDreREKKd4bdbY2aty8NTLnCM
ynqpBd8pgq8KIxG1t6PA4asj1r0rupaKf7HLhJrY6YzcdGk7BN6epzMcdPViTgV2
BTVXZw47PcKSdgzGttE8D6YAV/P+XZtNYpzAlROgPPwS28p8cTqpba5A+ulp2ECf
OW4hR4Evq8FswbnHo8DGkpmt38SgttKtbF4Lgp247bUTKuzl3H1xgOisIQrjQtdF
NQ1kuRbNO3iyLema1laO9ULjfWIuoDkryGx/d51GGD+v7mnASKU+Aylawzx3UkXd
fuDJvvaqskYjovPWDUOpmyekKjzOCGgUDrPV2IVCAyioEnLNK71kNdKhvcS636Yq
eFGpjcXAn+tgA3WbjohFIQLzLDh1wNPMJgu6/bacP9jXmB1VgtbZLhQcnootaRYr
o0BFzimmw+KIqK3uFVtGvsWhSfpalPiOtr1fle0COM0jB/8fkt7xnENWSGndw5L4
oeu2G0eYLw1npHhrh44PeMlrT/7+Gp5USezfD+C20h/EFMb2XB9Vur1mGzwOkEF6
mvRvykeGRtDznV0AzoAmgwRo01iqcLMzGuj++O6O7YRv1YkBHAQQAQgABgUCV9su
PQAKCRCqB1RMY1VuQN9kCADHlRsbDiopA+SW2s25Hm3ffxxXGtBqMR3Q1p2jiVuB
YRfrGjDufRl+j+Ftfzx9/0xvp9wY7N/hQjiWtu/afSC1jRflKo73bLLtCcOUVHuI
z8ic/z5ijVM37vOinbWSJySgadIgx8EKfsc6i/Djdqr6Jok1GemGgTAXaVVd1Klx
Mqb5GEoay7a2t1HStQXeefF4EyYgDa4WZ7/N/xUyo+u/TxmhYinuDrmEIQg+W/xw
PAWLfS4ZWzmNVOGqjhaI3zFLBmj1lTqo4Gi7+kWKg6VKrMg18OOmDZDiV5JX7O4R
Fe3OoHYHsCATEbim2zfNRoEFQ8ehPXutqmRBbHTM1ThHiQIcBBABCAAGBQJYK23Q
AAoJEPvzmoyQR8kOEBoQAKIhg6CxM8BcdYfzd9rYCgF+Tnwh6dgbshonTGI5Cm2S
uCFapV5mreJY+2i1e4kvCcCPYp68uGZ840+aUlOsFKOj6o+AG2h+W7kfpPLJIp5T
aHb7pZzfFrqMZ6eykFt6xufMFSCfUwIeGCbB2JpAuw83GGQabbbuvyrdHHhyoX/s
3Az7kgTFxdtBfusbLB40BuoXrdL5v86ejZDf/LQm8AyWj7p8Z2B0XMgJRqN3DFEp
cAqFbGuNkSOkxYbP502QhOzLeOx0KgTrOJiryFnbVO2UkhdUkFPDGbHc/2TN1F2L
U1WK7HXlnURR8EjyPMNCEccVGBsFGCpZS4JXYrboC122KEpmWbr9/5FLGi4Rv7r4
J0wp4Iyoo1kYmBYDr3GZ7TYP3MlP7irqrqnnE3B2zJ/yTlFxXgZsFOCyCwx133GX
Pg7IxfQPqKSplGmv3lXzEk02j4fSB4kaMenQv6HpRPIwgNCL77tqJMv2RTORxU72
HX3fpIKl2bOISCMfNCh4M39pBHOssuYisozm7KfUCNzyUlUvqR0/sRqfO/QZ/Fvx
EMG9msd28ynliY5QUVWE/WWO6jggkCS2DJFY6UGaO/xmBu6U2Mcw8Zi67orA2PNB
6glSnaCOgKg4O9smCRJTodG3ljYhzL24jEugAAVWeelv/I3ApKq9a19xz8Uy9nxI
iQIcBBABCAAGBQJYUSjkAAoJENE+lt1iUR3UFvoP/1oMRWhDr1DpxLklQZzvQ2nB
g8b+fj6q5C65H5jO+BIUpx+ZVMciKT4XuyQBsF/RU/cwLlGJr9JI0N4nsb+Axuul
yERwgG/20Ti4s4Qpm2HIw+omk4rcdfRVjcKM6AwvPphC9FdX7K06BC1LhihyrKUQ
3UdaZ8LRDQekYOQs5ZrXLRHZ18WVg35eGVTzrpoOEd/q98GGWfpZu5qkCb19JUvw
PreqEm/b6hm3lQZcFW2DOINf8RORGM5ixnFG179Ex/V9JfpVGBpjBnYKJvv1gPXq
jwHuFxt11qMBp04vBoW1jqIWSysucCzyml/stYoni0l6aRBrpU8RiaSAh7RGFhoH
L2b6DI7pPjVVaj+UqbX1p/hSxrifiYcSJyUzysPN6N/uVYLQr3d211A64+nJ8/9T
PLWYjFyl9x/5IK5HPiC3AfUQLF8RAPsQZEbyTgUoLJ0C+SU2m2Bwqd51uri3+nqd
3ST9568SEWXMIdBSaIOPMgE1pWYjbLszIG/SI6QYMLMPuadEYTXFAo5t+XU9D8GQ
Uq753d/RokFz7SYEyYtXJP8oboXBwwtcTf0Mm3y9qSwbFbrrY7oBoKLouHalsy12
6UYAkAryORfWt1F7QA1t98aD4VHbBvBTpjOQ7xUpxiymeVY3FBRYXJ0MDYWYHHkd
rCKvAIeDBTC94HwbH2hXiQEiBBABAgAMBQJWHqdeBQMAEnUAAAoJEJcQuJvKV618
TBoH/0C4vQPup/0XJxy6iXTfxxdlfYyCcI1Te+3MPSS8rH9Ni55b2CPRUfhUXcLX
/RRj6sj/Q82UZHsJXoMK1vposPMA0nxhRdNuQmwnmgxahr4HAE7bK9WoOVz9utF1
TL6VrQy+EcpiG2bUrYjG+gzfl+INFJdCW/Rra1n0EehJWYWF6fc8rYD/QqPdkEoI
qw/7fmMwRVEk76F0EKe60AEbX0LtyyJBgQnS2Oj/jVymG12SfQ/luNDmAvAws5ma
J1lKsGNkdx/EcEutexinvrRcmDGJx++sWjccSc5r57Xf0ij6TnTS7zyB6/JYFhje
Nz77Lg+fz847RIkjhfs7b8Y+BDqJASIEEAECAAwFAliGJ8sFAwASdQAACgkQlxC4
m8pXrXwH0wf9FfEQtmFJidMsGg/Q6G7U7v1oes6u2wS8bgQSkRkkX8YH4W8bASIe
B+R0mqhcRDS2CZpMZ1E67bCbC9+PkcLqaU7sVkA8MGooIKfHhYaZdGe6r1sHpJGS
FbapqZh4osrjsuAn2FngMS33Vh7Ksmk6EL20VC7IUzvfqwmhrO+WtTnpqqyQsCMG
j96V5m0uhQEHgxdWTzMidbADMO9fk/z9SkCeLhCZS1SrH4vDq3LpGxQx8MIlxGxB
5IG4xtqJ+jxREIimUCm5Aq0swlHk2KPDr6lOg/2PEO0v6UdWizNSs2Al8XjTA5J2
n/Qa/SSAFDbnPdZmeJGbkXhHmVXeXw76ZYkCHAQRAQgABgUCWJQumAAKCRBsqXE2
yMf7YmJdD/91XyPbmzqnhFebEvdCsLajyl5jkr27kEiZXMV+mzDMXY9Jtp2c+W5n
MLJIOWm4JMLIOqH+l+pxj2IEwAOn7YrzD0FRLCIXw1TzF37G+bJnnFMJALBWdeVt
sGEbg8izp3vscgENxh4aOPSuWsUFTU4FhsR7f2iKGN8ViYCHLT6L+5cNnvzWNbGZ
beYmnz03ID1xCigwmHLv/J/Xs56GxNTYQjkcLCJ2SSuJkxllQcm/W44Tx3BXBKU1
m+PsmI5h7KcBCHuMooKxtbsX1oLWq3fWUTZFZzikKBk1VyDNvo7sXaYDVSd9TrFr
tw2oc7Ha0tlM3wqK/iOvSblimsEOM4BsTwxv0Pa7YWnWQAiOjF1AbPDqO96LJVQE
U9onL/6lGaARntlttuj5GVZHrpyKlKj8Gvca3fzNVARtTbP95vCnFPsB6rLLX/kB
sa6qADX/fKODP8CPNl++sFm5G9DLUkp3L0RlIWkfE8FWwxbqSbtxkZlUK3H9ixqs
f74jf8vfPzcI9ioagaOHyLp2XsCiaO8xY5UJT5TjvVgvahzj0imP8M1BZcbgwsct
pqb0BeTy3gSLWYz6ZbMcFgtpOZaePFkuqU5RyA8BtKEdj6wu+Scd8ISACypxolAk
4FBsqG7TpHO31pFr1KZd1wufYMEddd7kwkjH4yR6p0f+d1KOgagJeokBIgQQAQIA
DAUCWJe9VgUDABJ1AAAKCRCXELibyletfBGrB/0WcqMm2qRijR10C5jDTpF+ccr1
busMjc4g6ctVXPt8E5xmvUmj7hRIfiJo43BkhqrkW2K+azSwY3MXmFLnhNER7CcT
1OJjYIbYEoD5f6+ZOtIyXH8u6er3Tdwr50i/a1fXPUJip/OwBK5yfTMx9pIB1uup
qDK58lr1k4idC1WGN7sOnKbTb/yF43WPmV1jvOnPIcWQAEkF5UDj5rFonEK/8EuK
jOxvNfsJC8EGoi3mssu3WUNe8zDBuUDWV3ZQvR5ZuqJdCWTSwAdWCX8f1SJflO5y
4mcF/JVUB/9TN7yCuK1AVfe0hNL3FMLUq+e4WMqM1BCcDIYYZz9WLNsN+EpJiQI3
BBMBAgAhAhsDAh4BAheABQJUUAQIBQsJCAcDBRUKCQgLBRYCAwEAAAoJEDgEu4LT
ncDjO7EP/Ryz+mS6Odz/5Rn/4CM1S11WBrR7GPccWz6KF4CfqaRMna6Kb8IsM00n
Bf1AnmKn4DrQXhOff9rsKLhekMPETJjY4Zfnex6VlKkQh7miRSChKZN8OftaCjUA
6ZSdnjSX4PTmqaHomhriSDOVBVXEq5HrMmfxgavJ/Fn9cEkA7drVi0Pi5eXvt+su
w7EJm+/WPjNBK4NE24b65lGk0F8ySloS/Km5wdAOjmbqMYl5FgK16naJFUpSUVNL
PHjmxEfP+Zfrahs5OqHzr6MlIMkvUNPAHZPUSp9TkB1udK8naLlQj4luPdOudToB
T07ZjFfYemMAj8tBOccRiiWPFT7trWjFsezeKK9i1/tTWVcA23Rn9Wh7Ws/Ta2nP
hEISqTt1++2GUJ8EaW2ajxv5cCZI2mf2UUsYJMkjKk3kfA0cN5DgPvwnZRsN34j0
in6WzxkyI7lA8Alx4N4dh40vG5bUPoEW4Bw9UmZqIjsswotLVQQfTKPAVgCTYEDH
q2xe/eipGzBf9VvxOzYkgd6+EDiBz2lptj2H3EZebFEHuA7wyqWnOSDXisVfV19+
qO6myXHQ3kU7DQ5oWruHCsPEQRFtDC82zs3iEXGUjG9GcvCHVPvh/PoT+eKGKQsO
GDOJKJc9epvnM6N8q1jXYYYBeYXxjg+BLI//T48R/YLzkbmUk92xiQEiBBABAgAM
BQJYuqyTBQMAEnUAAAoJEJcQuJvKV618yd8H/0PhhEJiD378fuC+LauHgZAKqn8h
wS0EjlPAIYmFcQZC4cDd2duS47xC09RHkr6N8G0wUTBkyCxgWmPHcqQZ3twrVKun
T6aYP8gGATeUUDhE+yLF50v6+qmo/3B9cKbCAsDU/vKgi4KOhz/aka7a7bck9/BN
a20uR3Qjo28nT9Q10Klcuxl55Qe8qD5P+WlR9UsDTMpOo8AzWpGJt9H59+LaTdmf
z3oSo7m7sv3qDnatj/Yc9V1z4O3iloAYluKRbywxcNNE/yiBsoB2JV0pZ8sMEonp
BtEOLrPahiJ1z74P+wCNFxAitHtu3f6A1JFazUgdC2SQz8Jr39jmHFgwAj+0Jk1p
Y2hhbCBQYXBpcyA8bWljaGFsLnBhcGlzQHRvcHRhbC5jb20+iQI3BBMBCAAhBQJY
scQzAhsDBQsJCAcCBhUICQoLAgQWAgMBAh4BAheAAAoJEDgEu4LTncDj4xgP/3sT
nG/1pZDSFkQLiiOuyFMoZ+x/X/R/UK+y87o+2Gu9UFuy4jICs6k7CMqe5ca4XRSI
B9QWyq/bs1bx/4cVEpiwwKMkxIWrseXTtsKJ8+hWhElzLL8cNTFCz+4ax7PKE8eC
GTUXcyMyzAe0SysHI2bCWFfQe8RGEy+1cnLH5+qO2MwLDKKN4+at2ADZFrYn4FEZ
8wvlb9/is1iN7h7+s2GDPpvEJrrnpeHeNTX1BEeykvbjW+Bsb89g6kJfks7PvhD+
BQwVMaNrmjR8KYi+GaopHdQ30yLWD4ck97B+UYZnqSKk7E8NOpwU22b31VlZgI/J
XWeXgQ5cY58J0ShGmbfypHXerthzlm6UHzjg6g+yujqDrxaOPTdfxYAzJmX5ztk3
D9xMEhCAD8ypefTdMGQb0B2q5Yjsl3sHqNNqxTeg1iorUNz6UtEhX3RmGrTDdY0r
gn0prjgiMTEMWWxAmgeYw/gOkpWfEZNrX64La65OkhTg+aBZEe6broHrc1x6dXpo
RkxGJrlRfcsxOcgy2M0/C0gk1L1yYWXRL4yENkQ/hNuPZmdDtrvWxcSTnMPfclwq
6kklflC099ujCZf5NuOG80mZi03917LQBtgWp4INmG+B6aLY52KuINmWXm25wYPY
5MfEbyO2KzngJSpxdR90GbP4F5lri2Ho9eSByisb0dLq0ugBEAABAQAAAAAAAAAA
AAAAAP/Y/+AAEEpGSUYAAQEBAGAAYAAA/+EAQEV4aWYAAElJKgAIAAAAAQBphwQA
AQAAABoAAAAAAAAAAgACoAkAAQAAAJ8AAAADoAkAAQAAAJ8AAAAAAAAA/9sAQwAI
BgYHBgUIBwcHCQkICgwUDQwLCwwZEhMPFB0aHx4dGhwcICQuJyAiLCMcHCg3KSww
MTQ0NB8nOT04MjwuMzQy/9sAQwEJCQkMCwwYDQ0YMiEcITIyMjIyMjIyMjIyMjIy
MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy/8AAEQgAnwCfAwEi
AAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIB
AwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNi
coIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0
dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfI
ycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEA
AAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYS
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
2lPgP440izPGh5s38Oc=
=8riE
-----END PGP PUBLIC KEY BLOCK-----

352
docker/data/setup_14.x Executable file
View file

@ -0,0 +1,352 @@
#!/bin/bash
# Discussion, issues and change requests at:
# https://github.com/nodesource/distributions
#
# Script to install the NodeSource Node.js 14.x repo onto a
# Debian or Ubuntu system.
#
# Run as root or insert `sudo -E` before `bash`:
#
# curl -sL https://deb.nodesource.com/setup_14.x | bash -
# or
# wget -qO- https://deb.nodesource.com/setup_14.x | bash -
#
# CONTRIBUTIONS TO THIS SCRIPT
#
# This script is built from a template in
# https://github.com/nodesource/distributions/tree/master/deb/src
# please don't submit pull requests against the built scripts.
#
export DEBIAN_FRONTEND=noninteractive
SCRSUFFIX="_14.x"
NODENAME="Node.js 14.x"
NODEREPO="node_14.x"
NODEPKG="nodejs"
print_status() {
echo
echo "## $1"
echo
}
if test -t 1; then # if terminal
ncolors=$(which tput > /dev/null && tput colors) # supports color
if test -n "$ncolors" && test $ncolors -ge 8; then
termcols=$(tput cols)
bold="$(tput bold)"
underline="$(tput smul)"
standout="$(tput smso)"
normal="$(tput sgr0)"
black="$(tput setaf 0)"
red="$(tput setaf 1)"
green="$(tput setaf 2)"
yellow="$(tput setaf 3)"
blue="$(tput setaf 4)"
magenta="$(tput setaf 5)"
cyan="$(tput setaf 6)"
white="$(tput setaf 7)"
fi
fi
print_bold() {
title="$1"
text="$2"
echo
echo "${red}================================================================================${normal}"
echo "${red}================================================================================${normal}"
echo
echo -e " ${bold}${yellow}${title}${normal}"
echo
echo -en " ${text}"
echo
echo "${red}================================================================================${normal}"
echo "${red}================================================================================${normal}"
}
bail() {
echo 'Error executing command, exiting'
exit 1
}
exec_cmd_nobail() {
echo "+ $1"
bash -c "$1"
}
exec_cmd() {
exec_cmd_nobail "$1" || bail
}
node_deprecation_warning() {
if [[ "X${NODENAME}" == "Xio.js 1.x" ||
"X${NODENAME}" == "Xio.js 2.x" ||
"X${NODENAME}" == "Xio.js 3.x" ||
"X${NODENAME}" == "XNode.js 0.10" ||
"X${NODENAME}" == "XNode.js 0.12" ||
"X${NODENAME}" == "XNode.js 4.x LTS Argon" ||
"X${NODENAME}" == "XNode.js 5.x" ||
"X${NODENAME}" == "XNode.js 6.x LTS Boron" ||
"X${NODENAME}" == "XNode.js 7.x" ||
"X${NODENAME}" == "XNode.js 8.x LTS Carbon" ||
"X${NODENAME}" == "XNode.js 9.x" ||
"X${NODENAME}" == "XNode.js 10.x" ||
"X${NODENAME}" == "XNode.js 11.x" ||
"X${NODENAME}" == "XNode.js 13.x" ||
"X${NODENAME}" == "XNode.js 15.x" ]]; then
print_bold \
" DEPRECATION WARNING " "\
${bold}${NODENAME} is no longer actively supported!${normal}
${bold}You will not receive security or critical stability updates${normal} for this version.
You should migrate to a supported version of Node.js as soon as possible.
Use the installation script that corresponds to the version of Node.js you
wish to install. e.g.
* ${green}https://deb.nodesource.com/setup_12.x — Node.js 12 LTS \"Erbium\"${normal}
* ${green}https://deb.nodesource.com/setup_14.x — Node.js 14 LTS \"Fermium\"${normal} (recommended)
* ${green}https://deb.nodesource.com/setup_16.x — Node.js 16 \"Gallium\"${normal}
Please see ${bold}https://github.com/nodejs/Release${normal} for details about which
version may be appropriate for you.
The ${bold}NodeSource${normal} Node.js distributions repository contains
information both about supported versions of Node.js and supported Linux
distributions. To learn more about usage, see the repository:
${bold}https://github.com/nodesource/distributions${normal}
"
echo
echo "Continuing in 20 seconds ..."
echo
sleep 20
fi
}
script_deprecation_warning() {
if [ "X${SCRSUFFIX}" == "X" ]; then
print_bold \
" SCRIPT DEPRECATION WARNING " "\
This script, located at ${bold}https://deb.nodesource.com/setup${normal}, used to
install Node.js 0.10, is deprecated and will eventually be made inactive.
You should use the script that corresponds to the version of Node.js you
wish to install. e.g.
* ${green}https://deb.nodesource.com/setup_12.x — Node.js 12 LTS \"Erbium\"${normal}
* ${green}https://deb.nodesource.com/setup_14.x — Node.js 14 LTS \"Fermium\"${normal} (recommended)
* ${green}https://deb.nodesource.com/setup_16.x — Node.js 16 \"Gallium\"${normal}
Please see ${bold}https://github.com/nodejs/Release${normal} for details about which
version may be appropriate for you.
The ${bold}NodeSource${normal} Node.js Linux distributions GitHub repository contains
information about which versions of Node.js and which Linux distributions
are supported and how to use the install scripts.
${bold}https://github.com/nodesource/distributions${normal}
"
echo
echo "Continuing in 20 seconds (press Ctrl-C to abort) ..."
echo
sleep 20
fi
}
setup() {
script_deprecation_warning
node_deprecation_warning
print_status "Installing the NodeSource ${NODENAME} repo..."
if $(uname -m | grep -Eq ^armv6); then
print_status "You appear to be running on ARMv6 hardware. Unfortunately this is not currently supported by the NodeSource Linux distributions. Please use the 'linux-armv6l' binary tarballs available directly from nodejs.org for Node.js 4 and later."
exit 1
fi
PRE_INSTALL_PKGS=""
# Check that HTTPS transport is available to APT
# (Check snaked from: https://get.docker.io/ubuntu/)
if [ ! -e /usr/lib/apt/methods/https ]; then
PRE_INSTALL_PKGS="${PRE_INSTALL_PKGS} apt-transport-https"
fi
if [ ! -x /usr/bin/lsb_release ]; then
PRE_INSTALL_PKGS="${PRE_INSTALL_PKGS} lsb-release"
fi
if [ ! -x /usr/bin/curl ] && [ ! -x /usr/bin/wget ]; then
PRE_INSTALL_PKGS="${PRE_INSTALL_PKGS} curl"
fi
# Used by apt-key to add new keys
if [ ! -x /usr/bin/gpg ]; then
PRE_INSTALL_PKGS="${PRE_INSTALL_PKGS} gnupg"
fi
# Populating Cache
print_status "Populating apt-get cache..."
exec_cmd 'apt-get update'
if [ "X${PRE_INSTALL_PKGS}" != "X" ]; then
print_status "Installing packages required for setup:${PRE_INSTALL_PKGS}..."
# This next command needs to be redirected to /dev/null or the script will bork
# in some environments
exec_cmd "apt-get install -y${PRE_INSTALL_PKGS} > /dev/null 2>&1"
fi
IS_PRERELEASE=$(lsb_release -d | grep 'Ubuntu .*development' >& /dev/null; echo $?)
if [[ $IS_PRERELEASE -eq 0 ]]; then
print_status "Your distribution, identified as \"$(lsb_release -d -s)\", is a pre-release version of Ubuntu. NodeSource does not maintain official support for Ubuntu versions until they are formally released. You can try using the manual installation instructions available at https://github.com/nodesource/distributions and use the latest supported Ubuntu version name as the distribution identifier, although this is not guaranteed to work."
exit 1
fi
DISTRO=$(lsb_release -c -s)
check_alt() {
if [ "X${DISTRO}" == "X${2}" ]; then
echo
echo "## You seem to be using ${1} version ${DISTRO}."
echo "## This maps to ${3} \"${4}\"... Adjusting for you..."
DISTRO="${4}"
fi
}
check_alt "SolydXK" "solydxk-9" "Debian" "stretch"
check_alt "Kali" "sana" "Debian" "jessie"
check_alt "Kali" "kali-rolling" "Debian" "bullseye"
check_alt "Sparky Linux" "Tyche" "Debian" "stretch"
check_alt "Sparky Linux" "Nibiru" "Debian" "buster"
check_alt "MX Linux 17" "Horizon" "Debian" "stretch"
check_alt "MX Linux 18" "Continuum" "Debian" "stretch"
check_alt "MX Linux 19" "patito feo" "Debian" "buster"
check_alt "Linux Mint" "maya" "Ubuntu" "precise"
check_alt "Linux Mint" "qiana" "Ubuntu" "trusty"
check_alt "Linux Mint" "rafaela" "Ubuntu" "trusty"
check_alt "Linux Mint" "rebecca" "Ubuntu" "trusty"
check_alt "Linux Mint" "rosa" "Ubuntu" "trusty"
check_alt "Linux Mint" "sarah" "Ubuntu" "xenial"
check_alt "Linux Mint" "serena" "Ubuntu" "xenial"
check_alt "Linux Mint" "sonya" "Ubuntu" "xenial"
check_alt "Linux Mint" "sylvia" "Ubuntu" "xenial"
check_alt "Linux Mint" "tara" "Ubuntu" "bionic"
check_alt "Linux Mint" "tessa" "Ubuntu" "bionic"
check_alt "Linux Mint" "tina" "Ubuntu" "bionic"
check_alt "Linux Mint" "tricia" "Ubuntu" "bionic"
check_alt "Linux Mint" "ulyana" "Ubuntu" "focal"
check_alt "Linux Mint" "ulyssa" "Ubuntu" "focal"
check_alt "Linux Mint" "uma" "Ubuntu" "focal"
check_alt "LMDE" "betsy" "Debian" "jessie"
check_alt "LMDE" "cindy" "Debian" "stretch"
check_alt "LMDE" "debbie" "Debian" "buster"
check_alt "elementaryOS" "luna" "Ubuntu" "precise"
check_alt "elementaryOS" "freya" "Ubuntu" "trusty"
check_alt "elementaryOS" "loki" "Ubuntu" "xenial"
check_alt "elementaryOS" "juno" "Ubuntu" "bionic"
check_alt "elementaryOS" "hera" "Ubuntu" "bionic"
check_alt "elementaryOS" "odin" "Ubuntu" "focal"
check_alt "Trisquel" "toutatis" "Ubuntu" "precise"
check_alt "Trisquel" "belenos" "Ubuntu" "trusty"
check_alt "Trisquel" "flidas" "Ubuntu" "xenial"
check_alt "Trisquel" "etiona" "Ubuntu" "bionic"
check_alt "Uruk GNU/Linux" "lugalbanda" "Ubuntu" "xenial"
check_alt "BOSS" "anokha" "Debian" "wheezy"
check_alt "BOSS" "anoop" "Debian" "jessie"
check_alt "BOSS" "drishti" "Debian" "stretch"
check_alt "BOSS" "unnati" "Debian" "buster"
check_alt "bunsenlabs" "bunsen-hydrogen" "Debian" "jessie"
check_alt "bunsenlabs" "helium" "Debian" "stretch"
check_alt "bunsenlabs" "lithium" "Debian" "buster"
check_alt "Tanglu" "chromodoris" "Debian" "jessie"
check_alt "PureOS" "green" "Debian" "sid"
check_alt "PureOS" "amber" "Debian" "buster"
check_alt "Devuan" "jessie" "Debian" "jessie"
check_alt "Devuan" "ascii" "Debian" "stretch"
check_alt "Devuan" "beowulf" "Debian" "buster"
check_alt "Devuan" "ceres" "Debian" "sid"
check_alt "Deepin" "panda" "Debian" "sid"
check_alt "Deepin" "unstable" "Debian" "sid"
check_alt "Deepin" "stable" "Debian" "buster"
check_alt "Pardus" "onyedi" "Debian" "stretch"
check_alt "Liquid Lemur" "lemur-3" "Debian" "stretch"
check_alt "Astra Linux" "orel" "Debian" "stretch"
check_alt "Ubilinux" "dolcetto" "Debian" "stretch"
if [ "X${DISTRO}" == "Xdebian" ]; then
print_status "Unknown Debian-based distribution, checking /etc/debian_version..."
NEWDISTRO=$([ -e /etc/debian_version ] && cut -d/ -f1 < /etc/debian_version)
if [ "X${NEWDISTRO}" == "X" ]; then
print_status "Could not determine distribution from /etc/debian_version..."
else
DISTRO=$NEWDISTRO
print_status "Found \"${DISTRO}\" in /etc/debian_version..."
fi
fi
print_status "Confirming \"${DISTRO}\" is supported..."
if [ -x /usr/bin/curl ]; then
exec_cmd_nobail "curl -sLf -o /dev/null 'https://deb.nodesource.com/${NODEREPO}/dists/${DISTRO}/Release'"
RC=$?
else
exec_cmd_nobail "wget -qO /dev/null -o /dev/null 'https://deb.nodesource.com/${NODEREPO}/dists/${DISTRO}/Release'"
RC=$?
fi
if [[ $RC != 0 ]]; then
print_status "Your distribution, identified as \"${DISTRO}\", is not currently supported, please contact NodeSource at https://github.com/nodesource/distributions/issues if you think this is incorrect or would like your distribution to be considered for support"
exit 1
fi
if [ -f "/etc/apt/sources.list.d/chris-lea-node_js-$DISTRO.list" ]; then
print_status 'Removing Launchpad PPA Repository for NodeJS...'
exec_cmd_nobail 'add-apt-repository -y -r ppa:chris-lea/node.js'
exec_cmd "rm -f /etc/apt/sources.list.d/chris-lea-node_js-${DISTRO}.list"
fi
print_status 'Adding the NodeSource signing key to your keyring...'
keyring='/usr/share/keyrings'
node_key_url="https://deb.nodesource.com/gpgkey/nodesource.gpg.key"
local_node_key="$keyring/nodesource.gpg"
if [ -x /usr/bin/curl ]; then
exec_cmd "curl -s $node_key_url | gpg --dearmor | tee $local_node_key >/dev/null"
else
exec_cmd "wget -q -O - $node_key_url | gpg --dearmor | tee $local_node_key >/dev/null"
fi
print_status "Creating apt sources list file for the NodeSource ${NODENAME} repo..."
exec_cmd "echo 'deb [signed-by=$local_node_key] https://deb.nodesource.com/${NODEREPO} ${DISTRO} main' > /etc/apt/sources.list.d/nodesource.list"
exec_cmd "echo 'deb-src [signed-by=$local_node_key] https://deb.nodesource.com/${NODEREPO} ${DISTRO} main' >> /etc/apt/sources.list.d/nodesource.list"
print_status 'Running `apt-get update` for you...'
exec_cmd 'apt-get update'
yarn_site='https://dl.yarnpkg.com/debian'
yarn_key_url="$yarn_site/pubkey.gpg"
local_yarn_key="$keyring/yarnkey.gpg"
print_status """Run \`${bold}sudo apt-get install -y ${NODEPKG}${normal}\` to install ${NODENAME} and npm
## You may also need development tools to build native addons:
sudo apt-get install gcc g++ make
## To install the Yarn package manager, run:
curl -sL $yarn_key_url | gpg --dearmor | sudo tee $local_yarn_key >/dev/null
echo \"deb [signed-by=$local_yarn_key] $yarn_site stable main\" | sudo tee /etc/apt/sources.list.d/yarn.list
sudo apt-get update && sudo apt-get install yarn
"""
}
## Defer setup until we have the complete script
setup

1
docker/data/yarn.list Normal file
View file

@ -0,0 +1 @@
deb [signed-by=/usr/share/keyrings/yarnpkg.gpg] https://dl.yarnpkg.com/debian stable main

243
docker/data/yarnpkg.gpg.key Normal file
View file

@ -0,0 +1,243 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
mQINBFf0j5oBEADS6cItqCbf4lOLICohq2aHqM5I1jsz3DC4ddIU5ONbKXP1t0wk
FEUPRzd6m80cTo7Q02Bw7enh4J6HvM5XVBSSGKENP6XAsiOZnY9nkXlcQAPFRnCn
CjEfoOPZ0cBKjn2IpIXXcC+7xh4p1yruBpOsCbT6BuzA+Nm9j4cpRjdRdWSSmdID
TyMZClmYm/NIfCPduYvNZxZXhW3QYeieP7HIonhZSHVu/jauEUyHLVsieUIvAOJI
cXYpwLlrw0yy4flHe1ORJzuA7EZ4eOWCuKf1PgowEnVSS7Qp7lksCuljtfXgWelB
XGJlAMD90mMbsNpQPF8ywQ2wjECM8Q6BGUcQuGMDBtFihobb+ufJxpUOm4uDt0y4
zaw+MVSi+a56+zvY0VmMGVyJstldPAcUlFYBDsfC9+zpzyrAqRY+qFWOT2tj29R5
ZNYvUUjEmA/kXPNIwmEr4oj7PVjSTUSpwoKamFFE6Bbha1bzIHpdPIRYc6cEulp3
dTOWfp+Cniiblp9gwz3HeXOWu7npTTvJBnnyRSVtQgRnZrrtRt3oLZgmj2fpZFCE
g8VcnQOb0iFcIM7VlWL0QR4SOz36/GFyezZkGsMlJwIGjXkqGhcEHYVDpg0nMoq1
qUvizxv4nKLanZ5jKrV2J8V09PbL+BERIi6QSeXhXQIui/HfV5wHXC6DywARAQAB
tBxZYXJuIFBhY2thZ2luZyA8eWFybkBkYW4uY3g+iQI5BBMBCAAjBQJX9I+aAhsD
BwsJCAcDAgEGFQgCCQoLBBYCAwECHgECF4AACgkQFkawG4blAxB52Q/9FcyGIEK2
QamDhookuoUGGYjIeN+huQPWmc6mLPEKS2Vahk5jnJKVtAFiaqINiUtt/1jZuhF2
bVGITvZK79kM6lg42xQcnhypzQPgkN7GQ/ApYqeKqCh1wV43KzT/CsJ9TrI0SC34
qYHTEXXUprAuwQitgAJNi5QMdMtauCmpK+Xtl/72aetvL8jMFElOobeGwKgfLo9+
We2EkKhSwyiy3W5TYI1UlV+evyyT+N0pmhRUSH6sJpzDnVYYPbCWa2b+0D/PHjXi
edKcely/NvqyVGoWZ+j41wkp5Q0wK2ybURS1ajfaKt0OcMhRf9XCfeXAQvU98mEk
FlfPaq0CXsjOy8eJXDeoc1dwxjDi2YbfHel0CafjrNp6qIFG9v3JxPUU19hG9lxD
Iv7VXftvMpjJCo/J4Qk+MOv7KsabgXg1iZHmllyyH3TY4AA4VA+mlceiiOHdXbKk
Q3BfS1jdXPV+2kBfqM4oWANArlrFTqtop8PPsDNqh/6SrVsthr7WTvC5q5h/Lmxy
Krm4Laf7JJMvdisfAsBbGZcR0Xv/Vw9cf2OIEzeOWbj5xul0kHT1vHhVNrBNanfe
t79RTDGESPbqz+bTS7olHWctl6TlwxA0/qKlI/PzXfOg63Nqy15woq9buca+uTcS
ccYO5au+g4Z70IEeQHsq5SC56qDR5/FvYyu5Ag0EV/SPmgEQANDSEMBKp6ER86y+
udfKdSLP9gOv6hPsAgCHhcvBsks+ixeX9U9KkK7vj/1q6wodKf9oEbbdykHgIIB1
lzY1l7u7/biAtQhTjdEZPh/dt3vjogrJblUEC0rt+fZe325ociocS4Bt9I75Ttkd
nWgkE4uOBJsSllpUbqfLBfYR58zz2Rz1pkBqRTkmJFetVNYErYi2tWbeJ59GjUN7
w1K3GhxqbMbgx4dF5+rjGs+KI9k6jkGeeQHqhDk+FU70oLVLuH2Dmi9IFjklKmGa
3BU7VpNxvDwdoV7ttRYEBcBnPOmL24Sn4Xhe2MDCqgJwwyohd9rk8neV7GtavVea
Tv6bnzi1iJRgDld51HFWG8X+y55i5cYWaiXHdHOAG1+t35QUrczm9+sgkiKSk1II
TlEFsfwRl16NTCMGzjP5kGCm/W+yyyvBMw7CkENQcd23fMsdaQ/2UNYJau2PoRH/
m+IoRehIcmE0npKeLVTDeZNCzpmfY18T542ibK49kdjZiK6G/VyBhIbWEFVu5Ll9
+8GbcO9ucYaaeWkFS8Hg0FZafMk59VxKiICKLZ5he/C4f0UssXdyRYU6C5BH8UTC
QLg0z8mSSL+Wb2iFVPrn39Do7Zm8ry6LBCmfCf3pI99Q/1VaLDauorooJV3rQ5kC
JEiAeqQtLOvyoXIex1VbzlRUXmElABEBAAGJAh8EGAEIAAkFAlf0j5oCGwwACgkQ
FkawG4blAxAUUQ//afD0KLHjClHsA/dFiW+5qVzI8kPMHwO1QcUjeXrB6I3SluOT
rLSPhOsoS72yAaU9hFuq8g9ecmFrl3Skp/U4DHZXioEmozyZRp7eVsaHTewlfaOb
6g7+v52ktYdomcp3BM5v/pPZCnB5rLrH2KaUWbpY6V6tqtCHbF7zftDqcBENJDXf
hiCqS19J08GZFjDEqGDrEj3YEmEXZMN7PcXEISPIz6NYI6rw4yVH8AXfQW6vpPzm
ycHwI0QsVW2NQdcZ6zZt+phm6shNUbN2iDdg3BJICmIvQf8qhO3bOh0Bwc11FLHu
MKuGVxnWN82HyIsuUB7WDLBHEOtg61Zf1nAF1PQK52YuQz3EWI4LL9OqVqfSTY1J
jqIfj+u1PY2UHrxZfxlz1M8pXb1grozjKQ5aNqBKRrcMZNx71itR5rv18qGjGR2i
Sciu/xah7zAroEQrx72IjYt03tbk/007CvUlUqFIFB8kY1bbfX8JAA+TxelUniUR
2CY8eom5HnaPpKE3kGXZ0jWkudbWb7uuWcW1FE/bO+VtexpBL3SoXmwbVMGnJIEi
Uvy8m6ez0kzLXzJ/4K4b8bDO4NjFX2ocKdzLA89Z95KcZUxEG0O7kaDCu0x3BEge
uArJLecD5je2/2HXAdvkOAOUi6Gc/LiJrtInc0vUFsdqWCUK5Ao/MKvdMFW5Ag0E
V/SP2AEQALRcYv/hiv1n3VYuJbFnEfMkGwkdBYLGo3hiHKY8xrsFVePl9SkL8aqd
C310KUFNI42gGY/lz54RUHOqfMszTdafFrmwU18ECWGo4oG9qEutIKG7fkxcvk2M
tgsOMZFJqVDS1a9I4QTIkv1ellLBhVub9S7vhe/0jDjXs9IyOBpYQrpCXAm6SypC
fpqkDJ4qt/yFheATcm3s8ZVTsk2hiz2jnbqfvpte3hr3XArDjZXr3mGAp3YY9JFT
zVBOhyhT/92e6tURz8a/+IrMJzhSyIDel9L+2sHHo9E+fA3/h3lg2mo6EZmRTuvE
v9GXf5xeP5lSCDwS6YBXevJ8OSPlocC8Qm8ziww6dy/23XTxPg4YTkdf42i7VOpS
pa7EvBGne8YrmUzfbrxyAArK05lo56ZWb9ROgTnqM62wfvrCbEqSHidN3WQQEhMH
N7vtXeDPhAd8vaDhYBk4A/yWXIwgIbMczYf7Pl7oY3bXlQHb0KW/y7N3OZCr5mPW
94VLLH/v+T5R4DXaqTWeWtDGXLih7uXrG9vdlyrULEW+FDSpexKFUQe83a+Vkp6x
GX7FdMC9tNKYnPeRYqPF9UQEJg+MSbfkHSAJgky+bbacz+eqacLXMNCEk2LXFV1B
66u2EvSkGZiH7+6BNOar84I3qJrU7LBD7TmKBDHtnRr9JXrAxee3ABEBAAGJBEQE
GAEIAA8FAlf0j9gCGwIFCQHhM4ACKQkQFkawG4blAxDBXSAEGQEIAAYFAlf0j9gA
CgkQ0QH3iZ1B88PaoA//VuGdF5sjxRIOAOYqXypOD9/Kd7lYyxmtCwnvKdM7f8O5
iD8oR2Pk1RhYHjpkfMRVjMkaLfxIRXfGQsWfKN2Zsa4zmTuNy7H6X26XW3rkFWpm
dECz1siGRvcpL6NvwLPIPQe7tST72q03u1H7bcyLGk0sTppgMoBND7yuaBTBZkAO
WizR+13x7FV+Y2j430Ft/DOe/NTc9dAlp6WmF5baOZClULfFzCTf9OcS2+bo68oP
gwWwnciJHSSLm6WRjsgoDxo5f3xBJs0ELKCr4jMwpSOTYqbDgEYOQTmHKkX8ZeQA
7mokc9guA0WK+DiGZis85lU95mneyJ2RuYcz6/VDwvT84ooe1swVkC2palDqBMwg
jZSTzbcUVqZRRnSDCe9jtpvF48WK4ZRiqtGO6Avzg1ZwMmWSr0zHQrLrUMTq/62W
KxLyj2oPxgptRg589hIwXVxJRWQjFijvK/xSjRMLgg73aNTq6Ojh98iyKAQ3HfzW
6iXBLLuGfvxflFednUSdWorr38MspcFvjFBOly+NDSjPHamNQ2h19iHLrYT7t4ve
nU9PvC+ORvXGxTN8mQR9btSdienQ8bBuU/mg/c417w6WbY7tkkqHqUuQC9LoaVdC
QFeE/SKGNe+wWN/EKi0QhXR9+UgWA41Gddi83Bk5deuTwbUeYkMDeUlOq3yyemcG
VxAA0PSktXnJgUj63+cdXu7ustVqzMjVJySCKSBtwJOge5aayonCNxz7KwoPO34m
Gdr9P4iJfc9kjawNV79aQ5aUH9uU2qFlbZOdO8pHOTjy4E+J0wbJb3VtzCJc1Eaa
83kZLFtJ45Fv2WQQ2Nv3Fo+yqAtkOkaBZv9Yq0UTaDkSYE9MMzHDVFx11TT21NZD
xu2QiIiqBcZfqJtIFHN5jONjwPG08xLAQKfUNROzclZ1h4XYUT+TWouopmpNeay5
JSNcp5LsC2Rn0jSFuZGPJ1rBwB9vSFVA/GvOj8qEdfhjN3XbqPLVdOeChKuhlK0/
sOLZZG91SHmT5SjP2zM6QKKSwNgHX4xZt4uugSZiY13+XqnrOGO9zRH8uumhsQmI
eFEdT27fsXTDTkWPI2zlHTltQjH1iebqqM9gfa2KUt671WyoL1yLhWrgePvDE+He
r002OslvvW6aAIIBki3FntPDqdIH89EEB4UEGqiA1eIZ6hGaQfinC7/IOkkm/mEa
qdeoI6NRS521/yf7i34NNj3IaL+rZQFbVWdbTEzAPtAs+bMJOHQXSGZeUUFrEQ/J
ael6aNg7mlr7cacmDwZWYLoCfY4w9GW6JHi6i63np8EA34CXecfor7cAX4XfaokB
XjyEkrnfV6OWYS7f01JJOcqYANhndxz1Ph8bxoRPelf5q+W5Ag0EWBU7dwEQAL1p
wH4prFMFMNV7MJPAwEug0Mxf3OsTBtCBnBYNvgFB+SFwKQLyDXUujuGQudjqQPCz
/09MOJPwGCOi0uA0BQScJ5JAfOq33qXi1iXCj9akeCfZXCOWtG3Izc3ofS6uee7K
fWUF1hNyA3PUwpRtM2pll+sQEO3y/EN7xYGUOM0mlCawrYGtxSNMlWBlMk/y5HK9
upz+iHwUaEJ4PjV+P4YmDq0PnPvXE4qhTIvxx0kO5oZF0tAJCoTg1HE7o99/xq9Z
rejDR1JJj6btNw1YFQsRDLxRZv4rL9He10lmLhiQE8QN7zOWzyJbRP++tWY2d2zE
yFzvsOsGPbBqLDNkbb9d8Bfvp+udG13sHAEtRzI2UWe5SEdVHobAgu5l+m10WlsN
TG/L0gJe1eD1bwceWlnSrbqw+y+pam9YKWqdu18ETN6CeAbNo4w7honRkcRdZyoG
p9zZf3o1bGBBMla6RbLuJBoRDOy2Ql7B+Z87N0td6KlHI6X8fNbatbtsXR7qLUBP
5oRb6nXX4+DnTMDbvFpE2zxnkg+C354Tw5ysyHhM6abB2+zCXcZ3holeyxC+BUrO
gGPyLH/s01mg2zmttwC1UbkaGkQ6SwCoQoFEVq9Dp96B6PgZxhEw0GMrKRw53LoX
4rZif9Exv6qUFsGY8U9daEdDPF5UHYe7t/nPpfW3ABEBAAGJBEQEGAEIAA8CGwIF
AlokZSMFCQQWmKMCKcFdIAQZAQgABgUCWBU7dwAKCRBGwhMN/SSX9XKdD/4/dWSy
7h+ejbq8DuaX1vNXea79f+DNTUerJKpi/1nDOTajnXZnhCShP/yVF6kgbu8AVFDM
+fno/P++kx+IwNp/q2HGzzCm/jLeb6txAhAo7iw3fDAU89u8zzAahjp8Zq8iQsoo
hfLUGnNEaW0Z25/Rzb37Jy/NxxCnK5OtmThmXveQvIFLx8K34xlZ6MwyiUO64smI
dtdyLr492LciZpvJK1s2cliZLKu40dwseWAhvK6BOIBx1PLQGL/Pwx95jCNUDASR
fhvY3C27B5gvO6kE5O/RKpgKYF25k5uRLkscxn7liH0d+t3Ti4x07lwiLLQCwZ6F
NELdfJp5rtCT33es1wYTNfss0HUYHYFdKr0Vg9v6rR7B/yTwuv0TRYbR28M5olKR
IZ52B0DVDO9OCkACRVaxeWSxKFV/g1WyTE1QYNFo8t5EH4hX/mM76RGwW46DlOWS
fpyC7X4GfmAh+/SfL0rtN4Lr3uBFAhwrx1vW3xeJ2BIptGaxJgRpELLdz3HDb83s
MtT8mzeBXwVR3txmlpg36T96sx3J+osDugV34ctsDkO7/3vXIXz/oGh/zOmMH35A
9EgBGlxE4RxBfPT122XzBbwzSvT3Gmdr7QmTonEX6y0P3v6HOKRBcjFS0JePfmmz
1RJLG/Vy7PQxoV1YZbXc66C03htDYM2B6VtMNQkQFkawG4blAxCiVRAAhq/1L5Yl
smItiC6MROtPP+lfAWRmMSkoIuAtzkV/orqPetwWzjYLgApOvVXBuf9FdJ5vAx1I
XG3mDx6mQQWkr4t9onwCUuQ7lE29qmvCHB3FpKVJPKiGC6xK38t5dGAJtbUMZBQb
1vDuQ7new8dVLzBSH1VZ7gx9AT+WEptWznb1US1AbejO0uT8jsVc/McK4R3LQmVy
9+hbTYZFz1zCImuv9SCNZPSdLpDe41QxcMfKiW7XU4rshJULKd4HYG92KjeJU80z
gCyppOm85ENiMz91tPT7+A4O7XMlOaJEH8t/2SZGBE/dmHjSKcWIpJYrIZKXTrNv
7rSQGvweNG5alvCAvnrLJ2cRpU1Rziw7auEU1YiSse+hQ1ZBIzWhPMunIdnkL/BJ
unBTVE7hPMMG7alOLy5Z0ikNytVewasZlm/dj5tEsfvF7tisVTZWVjWCvEMTP5fe
cNMEAwbZdBDyQBAN00y7xp4Pwc/kPLuaqESyTTt8jGek/pe7/+6fu0GQmR2gZKGa
gAxeZEvXWrxSJp/q81XSQGcO6QYMff7VexY3ncdjSVLro+Z3ZtYt6aVIGAEEA5UE
341yCGIeN+nr27CXD4fHF28aPh+AJzYh+uVjQhHbL8agwcyCMLgU88u1U0tT5Qtj
wnw+w+3UNhROvn495REpeEwD60iVeiuF5FW5Ag0EWbWWowEQALCiEk5Ic40W7/v5
hqYNjrRlxTE/1axOhhzt8eCB7eOeNOMQKwabYxqBceNmol/guzlnFqLtbaA6yZQk
zz/K3eNwWQg7CfXO3+p/dN0HtktPfdCk+kY/t7StKRjINW6S9xk9KshiukmdiDq8
JKS0HgxqphBB3tDjmo6/RiaOEFMoUlXKSU+BYYpBpLKg53P8F/8nIsK2aZJyk8Xu
Bd0UXKI+N1gfCfzoDWnYHs73LQKcjrTaZQauT81J7+TeWoLI28vkVxyjvTXAyjSB
nhxTYfwUNGSoawEXyJ1uKCwhIpklxcCMI9Hykg7sKNsvmJ4uNcRJ7cSRfb0g5DR9
dLhR+eEvFd+o4PblKk16AI48N8Zg1dLlJuV2cAtl0oBPk+tnbZukvkS5n1IzTSmi
iPIXvK2t506VtfFEw4iZrJWf2Q9//TszBM3r1FPATLH7EAeG5P8RV+ri7L7NvzP6
ZQClRDUsxeimCSe8v/t0OpheCVMlM9TpVcKGMw8ig/WEodoLOP4iqBs4BKR7fuyd
jDqbU0k/sdJTltp7IIdK1e49POIQ7pt+SUrsq/HnPW4woLC1WjouBWyr2M7/a0Sl
dPidZ2BUAK7O9oXosidZMJT7dBp3eHrspY4bdkSxsd0nshj0ndtqNktxkrSFRkoF
pMz0J/M3Q93CjdHuTLpTHQEWjm/7ABEBAAGJBEQEGAEIAA8FAlm1lqMCGwIFCQJ2
LQACKQkQFkawG4blAxDBXSAEGQEIAAYFAlm1lqMACgkQ4HTRbrb/TeMpDQ//eOIs
CWY2gYOGACw42JzMVvuTDrgRT4hMhgHCGeKzn1wFL1EsbSQV4Z6pYvnNayuEakgI
z14wf4UFs5u1ehfBwatmakSQJn32ANcAvI0INAkLEoqqy81mROjMc9FFrOkdqjcN
7yN0BzH9jNYL/gsvmOOwOu+dIH3C1Lgei844ZR1BZK1900mohuRwcji0sdROMcrK
rGjqd4yb6f7yl0wbdAxA3IHT3TFGczC7Y41P2OEpaJeVIZZgxkgQsJ14qK/QGpdK
vmZAQpjHBipeO/H+qxyOT5Y+f15VLWGOOVL090+ZdtF7h3m4X2+L7xWsFIgdOprf
O60gq3e79YFfgNBYU5BGtJGFGlJ0sGtnpzx5QCRka0j/1E5lIu00sW3WfGItFd48
hW6wHCloyoi7pBR7xqSEoU/U5o7+nC8wHFrDYyqcyO9Q3mZDw4LvlgnyMOM+qLv/
fNgO9USE4T30eSvc0t/5p1hCKNvyxHFghdRSJqn70bm6MQY+kd6+B/k62Oy8eCwR
t4PR+LQEIPnxN7xGuNpVO1oMyhhO41osYruMrodzw81icBRKYFlSuDOQ5jlcSajc
6TvF22y+VXy7nx1q/CN4tzB/ryUASU+vXS8/QNM6qI/QbbgBy7VtHqDbs2KHp4cP
0j9KYQzMrKwtRwfHqVrwFLkCp61EHwSlPsEFiglpMg/8DQ92O4beY0n7eSrilwEd
Jg89IeepTBm1QYiLM33qWLR9CABYAIiDG7qxviHozVfX6kUwbkntVpyHAXSbWrM3
kD6jPs3u/dimLKVyd29AVrBSn9FC04EjtDWsj1KB7HrFN4oo9o0JLSnXeJb8FnPf
3MitaKltvj/kZhegozIs+zvpzuri0LvoB4fNA0T4eAmxkGkZBB+mjNCrUHIakyPZ
VzWGL0QGsfK1Q9jvw0OErqHJYX8A1wLre/HkBne+e5ezS6Mc7kFW33Y1arfbHFNA
e12juPsOxqK76qNilUbQpPtNvWP3FTpbkAdodMLq/gQ+M5yHwPe8SkpZ8wYCfcwE
emz/P+4QhQB8tbYbpcPxJ+aQjVjcHpsLdrlSY3JL/gqockR7+97GrCzqXbgvsqiW
r16Zyn6mxYWEHn9HXMh3b+2IYKFFXHffbIBq/mfibDnZtQBrZpn2uyh6F2ZuOsZh
0LTD7RL53KV3fi90nS00Gs1kbMkPycL1JLqvYQDpllE2oZ1dKDYkwivGyDQhRNfE
RL6JkjyiSxfZ2c84r2HPgnJTi/WBplloQkM+2NfXrBo6kLHSC6aBndRKk2UmUhrU
luGcQUyfzYRFH5kVueIYfDaBPus9gb+sjnViFRpqVjefwlXSJEDHWP3Cl2cuo2mJ
jeDghj400U6pjSUW3bIC/PK5Ag0EXCxEEQEQAKVjsdljwPDGO+48879LDa1d7GEu
/Jm9HRK6INCQiSiS/0mHkeKa6t4DRgCY2ID9lFiegx2Er+sIgL0chs16XJrFO21u
kw+bkBdm2HYUKSsUFmr/bms8DkmAM699vRYVUAzO9eXG/g8lVrAzlb3RT7eGHYKd
15DT5KxXDQB+T+mWE9qD5RJwEyPjSU+4WjYF+Rr9gbSuAt5UySUb9jTR5HRNj9wt
b4YutfP9jbfqy8esQVG9R/hpWKb2laxvn8Qc2Xj93qNIkBt/SILfx9WDJl0wNUmu
+zUwpiC2wrLFTgNOpq7g9wRPtg5mi8MXExWwSF2DlD54yxOOAvdVACJFBXEcstQ3
SWg8gxljG8eLMpDjwoIBax3DZwiYZjkjJPeydSulh8vKoFBCQkf2PcImXdOk2HqO
V1L7FROM6fKydeSLJbx17SNjVdQnq1OsyqSO0catAFNptMHBsN+tiCI29gpGegao
umV9cnND69aYvyPBgvdtmzPChjSmc6rzW1yXCJDm2qzwm/BcwJNXW5B3EUPxc0qS
Wste9fUna0G4l/WMuaIzVkuTgXf1/r9HeQbjtxAztxH0d0VgdHAWPDkUYmztcZ4s
d0PWkVa18qSrOvyhI96gCzdvMRLX17m1kPvP5PlPulvqizjDs8BScqeSzGgSbbQV
m5Tx4w2uF4/n3FBnABEBAAGJBEQEGAECAA8FAlwsRBECGwIFCQIKEgACKQkQFkaw
G4blAxDBXSAEGQECAAYFAlwsRBEACgkQI+cWZ4i2Ph6B0g//cPis3v2M6XvAbVoM
3GIMXnsVj1WAHuwA/ja7UfZJ9+kV/PiMLkAbW0fBj0/y0O3Ry12VVQGXhC+Vo4j6
C8qwFP4OXa6EsxHXuvWMIztBaX1Kav613aXBtxp6tTrud0FFUh4sDc1RREb3tMr6
y5cvFJgnrdWcX1gsl6ODcgWBGNc6ZX7H7j48hMR6KmNeZocW7p8W+BgDQJqXYwVN
L15qOHzVAh0dWsFLE9gwBTmDCY03x9arxSNDGCXyxt6E77LbNVIoSRlEbkvi6j33
nEbuERICYl6CltXQCyiVKjheJcLMjbgv5+bLCv2zfeJ/WyOmOGKpHRu+lBV1Gvli
RxUblVlmjWPhYPBZXGyjII16Tqr+ilREcZFW+STccbrVct75JWLbxwlEmix+W1Hw
SRCR+KHx3Cur4ZPMOBlPsFilOOsNa7ROUB56t7zv21Ef3BeeaCd9c4kzNGN8d1ic
EqSXoWWPqgST0LZPtZyqWZVnWrHChVHfrioxhSnw8O3wY1A2GSahiCSvvjvOeEoJ
yU21ZMw6AVyHCh6v42oYadBfGgFwNo5OCMhNxNy/CcUrBSDqyLVTM5QlNsT75Ys7
kHHnc+Jk+xx4JpiyNCz5LzcPhlwpqnJQcjJdY1hDhK75Ormj/NfCMeZ8g1aVPX4x
Eq8AMyZYhZ5/lmM+13Rdv8ZW6FK7HQ/+IAKzntxOjw0MzCXkksKdmIOZ2bLeOVI8
aSLaUmoT5CLuoia9g7iFHlYrSY+01riRrAaPtYx0x8onfyVxL9dlW/Fv5+qc1fF5
FxdhyIgdqgzm82TnXHu/haUxYmUvNrbsmmNl5UTTOf+YQHMccKFdYfZ2rCBtbN2n
iXG1tuz2+k83pozu4mJ1rOOLNAsQoY3yR6OODte1FyOgp7blwDhTIoQb8/UiJ7CM
BI3OPrfoXFAnhYoxeRSAN4UFu9/HIkqfaQgRPCZS1gNerWF6r6yz9AZWUZqjSJss
jBqXCtK9bGbTYBZk+pw3H9Nd0RJ2WJ9qPqmlmUr1wdqct0ChsJx1xAT86QrssicJ
/HFFmF45hlnGkHUBWLaVJt8YkLb/DqOIbVbwyCLQtJ80VQLEeupfmu5QNsTpntRY
NKf8cr00uc8vSYXYFRxa5H5oRT1eoFEEjDDvokNnHXfT+Hya44IjYpzaqvAgeDp6
sYlOdtWIv/V3s+trxACwTkRN7zw3lLTbT8PK9szK0fYZ5KHG1/AKH+mbZ6qNc/25
PNbAFRtttLGuEIC3HJ12IAp2JdjioeD2OnWLu4ZeCT2CKKFsleZPrSyCrn3gyZPm
fYvv5h2JbQNO6uweOrZENWX5SU43OBoplbuKJZsMP6p6NahuGnIeJLlv509JYAf/
HN4ARyvvOpOJBFsEGAEIACYCGwIWIQRy7PRqVrStOckHu7cWRrAbhuUDEAUCYA3F
QQUJB6PoMAIpwV0gBBkBAgAGBQJcLEQRAAoJECPnFmeItj4egdIP/3D4rN79jOl7
wG1aDNxiDF57FY9VgB7sAP42u1H2SffpFfz4jC5AG1tHwY9P8tDt0ctdlVUBl4Qv
laOI+gvKsBT+Dl2uhLMR17r1jCM7QWl9Smr+td2lwbcaerU67ndBRVIeLA3NUURG
97TK+suXLxSYJ63VnF9YLJejg3IFgRjXOmV+x+4+PITEeipjXmaHFu6fFvgYA0Ca
l2MFTS9eajh81QIdHVrBSxPYMAU5gwmNN8fWq8UjQxgl8sbehO+y2zVSKEkZRG5L
4uo995xG7hESAmJegpbV0AsolSo4XiXCzI24L+fmywr9s33if1sjpjhiqR0bvpQV
dRr5YkcVG5VZZo1j4WDwWVxsoyCNek6q/opURHGRVvkk3HG61XLe+SVi28cJRJos
fltR8EkQkfih8dwrq+GTzDgZT7BYpTjrDWu0TlAeere879tRH9wXnmgnfXOJMzRj
fHdYnBKkl6Flj6oEk9C2T7WcqlmVZ1qxwoVR364qMYUp8PDt8GNQNhkmoYgkr747
znhKCclNtWTMOgFchwoer+NqGGnQXxoBcDaOTgjITcTcvwnFKwUg6si1UzOUJTbE
++WLO5Bx53PiZPsceCaYsjQs+S83D4ZcKapyUHIyXWNYQ4Su+Tq5o/zXwjHmfINW
lT1+MRKvADMmWIWef5ZjPtd0Xb/GVuhSCRAWRrAbhuUDEMTLEACyFHe0SPm4rMMA
E6dyadTJP8wRoI2epQciRqitIhANhmJ244WyqPWV3tDTgH/TaWPV7DerL6d2jOnw
mdfT5JeXkWrGf5Gxwz619UFx/S4VpPOQf4eJb1Z9WaOdQ87A9+BwwO8d+2XROhMm
iAetVo6jhvil0xR5t9HYg/uUSUu+tlHXlwPjdlYHUwUnt8HftoefWLXJj8ADHir1
slw7jjFR/INE2dWqk6Lx2Ala+3yHN7/vpfOYvY4EyTvIeyLSoVn0fzUrsIv3HQSR
WogO3MykjkiMjNbhdH8CXbEiQ1MiFKsugyi0kY6HOIe3//+cZ4xXlQLsLRnV3xm9
e/xGOte4M8o05JaUCrcsCmubOnqUIaZmDF9bITHI7bhkxLkvXopoxx4UodiL4PPG
OarAdRD2Y73eI7W6QhqZt8267tsLx4qe0q8/pCr7gX60E9hOSx2NszyS0FPME2CI
4vxVR+GxS8gzp5hFQ8OUaSC9a6eb4YI66bDhkRog0GrMagX3JJI2172blRyp8Fe7
DAEUOb/xCcaKdv6waT+pqtrOaxDArDVRPVVqDlr1fY0lJis92ycBk4Gs8pAYiMEZ
lGUoh5MouBEPP7HtfZTMlsQm8J5hq3cJ+AxUPSbGTWUCql7hGpT4S97mpyATuLnW
qLZmBgDHhpHEmUQmONKSSpzSjjAS6LkCDQRcN/VvARAAoEHIkyjFDsfoCxA/b2qN
jz+l8OI2WhAMdqxReg7JN9R61qbetj9RYIcWswPSO84c0ioRUk+xJavEFh/6Lg00
QKwJKPf0kd1Us6SfqklxGczOaWNLyiM7JthFRNMp0qVX6NjLqGoCNO+d/+nNk6s2
x4rLECj/EROmE3ZQQEo5nBXmPlhXpVem23rGfXEQvXDNqFmvqrP+Befn/+aDpo89
QIm3sE8G0LfgcajIdSfgLH+NJTvOVAtXXVXJPK39Njr1aBzWTbWhLS2bji7DwP7h
shdh7DE2rS623vlzvkkrms8oKkiRpKATdhQ8CEx+mhTFKCj6GtNqhwttCbf98N9G
piHD0has65YtgQQjk2pLR62rZf6czagRfKbFQzXjl2JxS/bsHVhTkhyJFqgDcHCS
Xe7K8uGTAE2AkakGhGyDJYqGVSl0w5IAU8dqDQMc0IpsVMbFk4nX4GgOwixwrzrg
Ch0jRi+EwUHJYZHBAyzNCkr++D25R0gwNhPMjSKe8Ks6G3hH3XP/ZVlceW/gPfxR
ixUTk/q7s3xPpPhLMREEpKS1aGcmYxEkrkVBDAzNYKdKP1MYwLn4lh4yNFXWlTCl
nDyI6UODTHwt8xDddtnT9u+U+xc6OJiYcCOstl+ovS9HmM/Kt9VTEX9cckEEL1IS
+9esQMr4b5X02Y1q9Q2uEucAEQEAAYkEWwQYAQgAJgIbAhYhBHLs9GpWtK05yQe7
txZGsBuG5QMQBQJgDcVSBQkHmDbjAinBXSAEGQECAAYFAlw39W8ACgkQT3dnk2lH
W6p0eg/+K2JJu1RbTSLJPFYQhLcxX+5d2unkuNLIy3kArtZuB992E2Fw00okPGtu
PdSyk2ygh4DeYnwmabIWChi7LDp+YnqcI4GfMxNG6RsHs+A/77rLBST3BB1sejZp
pmKCQZDSC2pvYaZBpS80UvftCZ9RFdY+kTC22Btn/5ekiQOfIqhUH9CyGWS/YlGc
iomVIVn1hSPN8l4EpBCDtceRaephvzjQIZT3AxOfSlpwJviYjAOkSX4qWyIjC5Ke
5kfEOldUuBN1JGAm45tKlrz/LD/+VOc2IWpbkOIAVSldUgpRyiIJQAZ80trNxrJI
7ncaID8lAa7pBptJiL0KorRjk3c6Y7p830Nwe0J5e5+W1RzN4wlR8+9uuRyP8Mcw
z/Hz2jwMiv38Vk4tAOe4PYNZuDnpjZ28yCpF3UUgvzjarubFAcg2jd8SauCQFlmO
fvT+1qIMSeLmWBOdlzJTUpJRcZqnkEE4WtiMSlxyWVFvUwOmKSGi8CLoGW1Ksh9t
hQ9zKhvVUiVoKn4Z79HXr4pX6rnp+mweJ2dEZtlqD7HxjVTlCHn9fzClt/Nt0h72
1fJbS587AC/ZMgg5GV+GKu6Mij0sPAowUJVCIwN9uK/GHICZEAoMSngP8xzKnhU5
FD38vwBvsqbKxTtICrv2NuwnQ0WBBQ58w5mv2RCMr2W6iegSKIAJEBZGsBuG5QMQ
U8oQAMjiPEOFmgRcuhvhlzXT53d/1b8sfG4MV9c45xKE65L+kPoSGzvNWYumB2Kw
Qzf8tWu+6PmOljj1Ofyilqm3bblOasHWgDGPTSOcBaVhl8nZrS3o2fzZy7aQKYE3
gQBZ6+jzhHQzrnQURpR+s/mdSO3+Gs+6kBmh9dkIQ8U1cfaAbZgy17BipPZkpwjr
ltTcDyJniQyEm7L6yV6MWt2TiFUA5IvyH+hTSKrLHnR7+lYDEo28wV8f8UcLrUpQ
joiCOWZeNCubaIxHHoGtCE+zkhSsuW9lGSX0rzQlmx1vclrYwyMKhlpDOqy8kzdI
Ws7VF3vCXRi6fWSA7apRtQQ7PbuZOOyYTaEkEuJ5CfWhFGy3eikiXilPk05ECZd3
/uMB1dmPFKT+MbUDCA/b8amfkNTLg+RFNX+5isMLkrJ+8k13ueTp/PToGMIkYsbR
+HRm0HmrdqGFPl7o+0xXUT4wGbQD8QfK81lzH1QQhsu+12OsFt+jQC3IDYiXOUBk
zgkwMlt8C0vU0i/EElpqx/0n19iHv7XvPn5q0MdNBS5pW+DOho0D+z+NM9MWpYUu
ymC/28jo8Olju+9DZuZwEUEbptmltcA8UQ5r4FHx4m3sfCmCs1QUeb8TPNL0x8OA
XnADXbxMgGYTNX7YvdUw3a8M73stqnN9M8lUXln7ulOCee2z
=IgpF
-----END PGP PUBLIC KEY BLOCK-----

View file

@ -1,13 +1,14 @@
# Bootstrapping a Houdini Instance Using Docker
This file complements [the existing docker documentation](docker.md). The file
documents, in great detail, how to bootstrap Houdini into a docker image from
complete scratch. Special attention was given to verifying the licensing
requirements and details, and to attempt to reproduce the creation of the
Docker image from scratch in the most complete way. Some of the instructions
herein are not specific to Houdini or Ruby on Rails applications at all;
rather, they are simply documentation of steps that at least one user went
through to bootstrap to a usable docker image.
This file complements [the existing docker documentation](docker.md). The
file documents, in great detail, how to bootstrap Houdini into a docker
image, primarily from source code wherever possible, from complete scratch.
Special attention was given to verifying the licensing requirements and
details, and to attempt to reproduce the creation of the Docker image from
scratch in the most complete way. Some of the instructions herein are not
specific to Houdini or Ruby on Rails applications at all; rather, they are
simply documentation of steps that at least one user went through to
bootstrap to a usable docker image.
Commands that were run as pure root have the `#` in front of them; commands
run as a regular user (which sometimes include `sudo`, so note that some of
@ -33,3 +34,31 @@ If the last command gets the error …
the `docker` group.
This creates a docker image named `bullseye-base` on your system.
## Building Node 14 from Source
Currently, the default Docker image uses the Debian `nodejs` version
`14.17.4-deb-1nodesource1` as downloaded from this apt-source entry:
deb [signed-by=/usr/share/keyrings/nodesource.gpg] https://deb.nodesource.com/node_14.x bullseye main
… which leads to this line in the apt-get output:
Get:9 https://deb.nodesource.com/node_14.x bullseye/main amd64 nodejs amd64 14.17.4-deb-1nodesource1 [25.0 MB]
We have not yet provided a method yet to bootstrap the necessary version of
Node from source.
## Building Yarn 14 from Source
Currently, the default Docker image uses the Debian `nodejs` version
`1.22.5-1` as downloaded from this apt-source entry:
deb [signed-by=/usr/share/keyrings/nodesource.gpg] https://deb.nodesource.com/node_14.x bullseye main
… which leads to this line in the apt-get output:
Get:6 https://dl.yarnpkg.com/debian stable/main amd64 yarn all 1.22.5-1 [891 kB]
We have not provided a method yet to bootstrap the necessary version of
Yarn from source.

View file

@ -1,7 +1,8 @@
#!/usr/bin/env bash
# License: AGPL-3.0-or-later WITH WTO-AP-3.0-or-later
# Full license explanation at https://github.com/houdiniproject/houdini/blob/master/LICENSE
set -e
curl -sL https://deb.nodesource.com/setup_14.x | bash -
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
apt-get update -qq && apt-get install -y nodejs yarn
apt-get update && apt-get install gcc g++ make && \
apt install git postgresql-13 libpq-dev libjemalloc-dev libvips42 yarn -yy

View file

@ -1,4 +1,4 @@
#!/usr/bin/env bash
set -e
apt-get update -qq && apt-get install -y build-essential
apt-get update -qq && apt-get install -y build-essential curl lsb-release gpg gawk autoconf automake bison libffi-dev libgdbm-dev libncurses5-dev libsqlite3-dev libtool libyaml-dev pkg-config sqlite3 zlib1g-dev libgmp-dev libreadline-dev libssl-dev