From b28b0bd5f13135d64dca024f629100b3e30d47b2 Mon Sep 17 00:00:00 2001 From: rhatto Date: Tue, 24 Jul 2007 02:01:18 +0000 Subject: [PATCH] fixed a bug on 0.5 and tagged as 0.5.1 git-svn-id: svn+slack://slack.fluxo.info/var/svn/simplepkg@407 04377dda-e619-0410-9926-eae83683ac58 --- tags/0.5.1/README | 2 + tags/0.5.1/conf/generic.mkSlackBuild.new | 250 ++++ tags/0.5.1/conf/repos.conf.new | 41 + tags/0.5.1/conf/simplepkg.conf.new | 152 +++ tags/0.5.1/doc/CHANGELOG | 409 ++++++ tags/0.5.1/doc/COPYING | 340 +++++ tags/0.5.1/doc/README | 428 +++++++ tags/0.5.1/doc/README.pt_BR | 444 +++++++ tags/0.5.1/doc/README.simplaret | 319 +++++ tags/0.5.1/doc/README.simplaret.pt_BR | 445 +++++++ tags/0.5.1/doc/TODO | 5 + tags/0.5.1/doc/mkbuild.tex | 627 +++++++++ tags/0.5.1/doc/simplepkg.pdf | Bin 0 -> 96342 bytes tags/0.5.1/doc/simplepkg.tex | 395 ++++++ tags/0.5.1/install/doinst.sh | 3 + tags/0.5.1/install/slack-desc | 19 + tags/0.5.1/lib/common.sh | 711 +++++++++++ tags/0.5.1/simplepkg.SlackBuild | 73 ++ tags/0.5.1/src/createpkg | 501 ++++++++ tags/0.5.1/src/jail-commit | 175 +++ tags/0.5.1/src/jail-update | 61 + tags/0.5.1/src/lspkg | 132 ++ tags/0.5.1/src/mkbuild | 680 ++++++++++ tags/0.5.1/src/mkjail | 113 ++ tags/0.5.1/src/rebuildpkg | 87 ++ tags/0.5.1/src/repos | 87 ++ tags/0.5.1/src/simplaret | 1131 +++++++++++++++++ tags/0.5.1/src/templatepkg | 980 ++++++++++++++ .../openoffice.d/etc/profile.d/lang.csh | 33 + .../openoffice.d/etc/profile.d/lang.sh | 33 + .../openoffice.d/opt/OpenOffice.org | 1 + .../templates/openoffice/openoffice.perms | 0 .../openoffice/openoffice.s/post-install.sh | 22 + .../templates/openoffice/openoffice.template | 60 + .../0.5.1/templates/slackware/slackware.perms | 0 .../templates/slackware/slackware.template | 566 +++++++++ .../vserver-legacy.d/etc/apache/httpd.conf | 1046 +++++++++++++++ .../vserver-legacy.d/etc/apache/php.ini | 1122 ++++++++++++++++ .../vserver-legacy.d/etc/apache/vhosts | 0 .../vserver-legacy/vserver-legacy.d/etc/hosts | 21 + .../vserver-legacy.d/etc/logrotate.d/apache | 11 + .../vserver-legacy.d/etc/profile | 87 ++ .../vserver-legacy.d/etc/rc.d/rc.0 | 110 ++ .../vserver-legacy.d/etc/rc.d/rc.4 | 256 ++++ .../vserver-legacy.d/etc/rc.d/rc.6 | 110 ++ .../vserver-legacy.d/etc/rc.d/rc.K | 88 ++ .../vserver-legacy.d/etc/rc.d/rc.M | 256 ++++ .../vserver-legacy.d/etc/rc.d/rc.S | 294 +++++ .../vserver-legacy.d/etc/rc.d/rc.httpd | 21 + .../vserver-legacy.d/etc/rc.d/rc.inet2 | 129 ++ .../vserver-legacy.d/etc/rc.d/rc.inetd | 36 + .../vserver-legacy.d/etc/rc.d/rc.ip_forward | 64 + .../vserver-legacy.d/etc/rc.d/rc.local | 5 + .../vserver-legacy.d/etc/rc.d/rc.mysqld | 80 ++ .../vserver-legacy.d/etc/rc.d/rc.postfix | 45 + .../vserver-legacy.d/etc/rc.d/rc.sendmail | 38 + .../vserver-legacy.d/etc/rc.d/rc.serial | 132 ++ .../vserver-legacy.d/etc/rc.d/rc.sshd | 50 + .../vserver-legacy.d/etc/rc.d/rc.syslog | 42 + .../vserver-legacy.d/etc/rc.d/rc.sysvinit | 58 + .../vserver-legacy.d/etc/rssh.conf | 48 + .../vserver-legacy.d/etc/ssh/sshd_config | 103 ++ .../var/www/htdocs/missing.html | 12 + .../vserver-legacy.d/var/www/missing.html | 12 + .../vserver-legacy/vserver-legacy.perms | 36 + .../vserver-legacy/vserver-legacy.s/GPG-KEY | 88 ++ .../vserver-legacy.s/devices.tar.gz | Bin 0 -> 322 bytes .../vserver-legacy/vserver-legacy.s/skel.conf | 70 + .../vserver-legacy.s/vserver-legacy.sh | 49 + .../vserver-legacy/vserver-legacy.template | 251 ++++ .../vserver/vserver.d/etc/apache/httpd.conf | 1046 +++++++++++++++ .../vserver/vserver.d/etc/apache/php.ini | 1122 ++++++++++++++++ .../vserver/vserver.d/etc/apache/vhosts | 0 .../templates/vserver/vserver.d/etc/hosts | 21 + .../vserver/vserver.d/etc/logrotate.d/apache | 11 + .../templates/vserver/vserver.d/etc/profile | 87 ++ .../templates/vserver/vserver.d/etc/rc.d/rc | 11 + .../templates/vserver/vserver.d/etc/rc.d/rc.0 | 110 ++ .../templates/vserver/vserver.d/etc/rc.d/rc.4 | 256 ++++ .../templates/vserver/vserver.d/etc/rc.d/rc.6 | 110 ++ .../templates/vserver/vserver.d/etc/rc.d/rc.K | 88 ++ .../templates/vserver/vserver.d/etc/rc.d/rc.M | 256 ++++ .../templates/vserver/vserver.d/etc/rc.d/rc.S | 294 +++++ .../vserver/vserver.d/etc/rc.d/rc.httpd | 21 + .../vserver/vserver.d/etc/rc.d/rc.inet2 | 129 ++ .../vserver/vserver.d/etc/rc.d/rc.inetd | 36 + .../vserver/vserver.d/etc/rc.d/rc.ip_forward | 64 + .../vserver/vserver.d/etc/rc.d/rc.local | 5 + .../vserver/vserver.d/etc/rc.d/rc.mysqld | 80 ++ .../vserver/vserver.d/etc/rc.d/rc.postfix | 45 + .../vserver/vserver.d/etc/rc.d/rc.sendmail | 38 + .../vserver/vserver.d/etc/rc.d/rc.serial | 132 ++ .../vserver/vserver.d/etc/rc.d/rc.sshd | 50 + .../vserver/vserver.d/etc/rc.d/rc.syslog | 42 + .../vserver/vserver.d/etc/rc.d/rc.sysvinit | 58 + .../templates/vserver/vserver.d/etc/rssh.conf | 48 + .../vserver/vserver.d/etc/ssh/sshd_config | 103 ++ .../vserver.d/var/www/htdocs/missing.html | 12 + .../vserver/vserver.d/var/www/missing.html | 12 + tags/0.5.1/templates/vserver/vserver.perms | 37 + .../0.5.1/templates/vserver/vserver.s/GPG-KEY | 88 ++ .../vserver/vserver.s/devices.tar.gz | Bin 0 -> 320 bytes .../templates/vserver/vserver.s/vserver.sh | 55 + tags/0.5.1/templates/vserver/vserver.template | 250 ++++ tags/0.5.1/utils/add-gpl | 33 + tags/0.5.1/utils/add-slack-required | 63 + tags/0.5.1/utils/convert-template-scheme | 35 + tags/0.5.1/utils/merge-template | 37 + tags/0.5.1/utils/metapkg | 72 ++ tags/0.5.1/utils/searchpkg | 36 + 110 files changed, 19088 insertions(+) create mode 100644 tags/0.5.1/README create mode 100644 tags/0.5.1/conf/generic.mkSlackBuild.new create mode 100644 tags/0.5.1/conf/repos.conf.new create mode 100644 tags/0.5.1/conf/simplepkg.conf.new create mode 100644 tags/0.5.1/doc/CHANGELOG create mode 100644 tags/0.5.1/doc/COPYING create mode 100644 tags/0.5.1/doc/README create mode 100644 tags/0.5.1/doc/README.pt_BR create mode 100644 tags/0.5.1/doc/README.simplaret create mode 100644 tags/0.5.1/doc/README.simplaret.pt_BR create mode 100644 tags/0.5.1/doc/TODO create mode 100644 tags/0.5.1/doc/mkbuild.tex create mode 100644 tags/0.5.1/doc/simplepkg.pdf create mode 100644 tags/0.5.1/doc/simplepkg.tex create mode 100644 tags/0.5.1/install/doinst.sh create mode 100644 tags/0.5.1/install/slack-desc create mode 100644 tags/0.5.1/lib/common.sh create mode 100755 tags/0.5.1/simplepkg.SlackBuild create mode 100644 tags/0.5.1/src/createpkg create mode 100755 tags/0.5.1/src/jail-commit create mode 100755 tags/0.5.1/src/jail-update create mode 100755 tags/0.5.1/src/lspkg create mode 100755 tags/0.5.1/src/mkbuild create mode 100755 tags/0.5.1/src/mkjail create mode 100755 tags/0.5.1/src/rebuildpkg create mode 100755 tags/0.5.1/src/repos create mode 100755 tags/0.5.1/src/simplaret create mode 100755 tags/0.5.1/src/templatepkg create mode 100755 tags/0.5.1/templates/openoffice/openoffice.d/etc/profile.d/lang.csh create mode 100755 tags/0.5.1/templates/openoffice/openoffice.d/etc/profile.d/lang.sh create mode 120000 tags/0.5.1/templates/openoffice/openoffice.d/opt/OpenOffice.org create mode 100644 tags/0.5.1/templates/openoffice/openoffice.perms create mode 100755 tags/0.5.1/templates/openoffice/openoffice.s/post-install.sh create mode 100644 tags/0.5.1/templates/openoffice/openoffice.template create mode 100644 tags/0.5.1/templates/slackware/slackware.perms create mode 100644 tags/0.5.1/templates/slackware/slackware.template create mode 100644 tags/0.5.1/templates/vserver-legacy/vserver-legacy.d/etc/apache/httpd.conf create mode 100644 tags/0.5.1/templates/vserver-legacy/vserver-legacy.d/etc/apache/php.ini create mode 100644 tags/0.5.1/templates/vserver-legacy/vserver-legacy.d/etc/apache/vhosts create mode 100644 tags/0.5.1/templates/vserver-legacy/vserver-legacy.d/etc/hosts create mode 100644 tags/0.5.1/templates/vserver-legacy/vserver-legacy.d/etc/logrotate.d/apache create mode 100644 tags/0.5.1/templates/vserver-legacy/vserver-legacy.d/etc/profile create mode 100755 tags/0.5.1/templates/vserver-legacy/vserver-legacy.d/etc/rc.d/rc.0 create mode 100644 tags/0.5.1/templates/vserver-legacy/vserver-legacy.d/etc/rc.d/rc.4 create mode 100755 tags/0.5.1/templates/vserver-legacy/vserver-legacy.d/etc/rc.d/rc.6 create mode 100755 tags/0.5.1/templates/vserver-legacy/vserver-legacy.d/etc/rc.d/rc.K create mode 100755 tags/0.5.1/templates/vserver-legacy/vserver-legacy.d/etc/rc.d/rc.M create mode 100755 tags/0.5.1/templates/vserver-legacy/vserver-legacy.d/etc/rc.d/rc.S create mode 100644 tags/0.5.1/templates/vserver-legacy/vserver-legacy.d/etc/rc.d/rc.httpd create mode 100755 tags/0.5.1/templates/vserver-legacy/vserver-legacy.d/etc/rc.d/rc.inet2 create mode 100644 tags/0.5.1/templates/vserver-legacy/vserver-legacy.d/etc/rc.d/rc.inetd create mode 100644 tags/0.5.1/templates/vserver-legacy/vserver-legacy.d/etc/rc.d/rc.ip_forward create mode 100755 tags/0.5.1/templates/vserver-legacy/vserver-legacy.d/etc/rc.d/rc.local create mode 100644 tags/0.5.1/templates/vserver-legacy/vserver-legacy.d/etc/rc.d/rc.mysqld create mode 100644 tags/0.5.1/templates/vserver-legacy/vserver-legacy.d/etc/rc.d/rc.postfix create mode 100644 tags/0.5.1/templates/vserver-legacy/vserver-legacy.d/etc/rc.d/rc.sendmail create mode 100755 tags/0.5.1/templates/vserver-legacy/vserver-legacy.d/etc/rc.d/rc.serial create mode 100755 tags/0.5.1/templates/vserver-legacy/vserver-legacy.d/etc/rc.d/rc.sshd create mode 100755 tags/0.5.1/templates/vserver-legacy/vserver-legacy.d/etc/rc.d/rc.syslog create mode 100755 tags/0.5.1/templates/vserver-legacy/vserver-legacy.d/etc/rc.d/rc.sysvinit create mode 100644 tags/0.5.1/templates/vserver-legacy/vserver-legacy.d/etc/rssh.conf create mode 100644 tags/0.5.1/templates/vserver-legacy/vserver-legacy.d/etc/ssh/sshd_config create mode 100644 tags/0.5.1/templates/vserver-legacy/vserver-legacy.d/var/www/htdocs/missing.html create mode 100644 tags/0.5.1/templates/vserver-legacy/vserver-legacy.d/var/www/missing.html create mode 100644 tags/0.5.1/templates/vserver-legacy/vserver-legacy.perms create mode 100644 tags/0.5.1/templates/vserver-legacy/vserver-legacy.s/GPG-KEY create mode 100644 tags/0.5.1/templates/vserver-legacy/vserver-legacy.s/devices.tar.gz create mode 100644 tags/0.5.1/templates/vserver-legacy/vserver-legacy.s/skel.conf create mode 100644 tags/0.5.1/templates/vserver-legacy/vserver-legacy.s/vserver-legacy.sh create mode 100644 tags/0.5.1/templates/vserver-legacy/vserver-legacy.template create mode 100644 tags/0.5.1/templates/vserver/vserver.d/etc/apache/httpd.conf create mode 100644 tags/0.5.1/templates/vserver/vserver.d/etc/apache/php.ini create mode 100644 tags/0.5.1/templates/vserver/vserver.d/etc/apache/vhosts create mode 100644 tags/0.5.1/templates/vserver/vserver.d/etc/hosts create mode 100644 tags/0.5.1/templates/vserver/vserver.d/etc/logrotate.d/apache create mode 100644 tags/0.5.1/templates/vserver/vserver.d/etc/profile create mode 100755 tags/0.5.1/templates/vserver/vserver.d/etc/rc.d/rc create mode 100755 tags/0.5.1/templates/vserver/vserver.d/etc/rc.d/rc.0 create mode 100644 tags/0.5.1/templates/vserver/vserver.d/etc/rc.d/rc.4 create mode 100755 tags/0.5.1/templates/vserver/vserver.d/etc/rc.d/rc.6 create mode 100755 tags/0.5.1/templates/vserver/vserver.d/etc/rc.d/rc.K create mode 100755 tags/0.5.1/templates/vserver/vserver.d/etc/rc.d/rc.M create mode 100755 tags/0.5.1/templates/vserver/vserver.d/etc/rc.d/rc.S create mode 100644 tags/0.5.1/templates/vserver/vserver.d/etc/rc.d/rc.httpd create mode 100755 tags/0.5.1/templates/vserver/vserver.d/etc/rc.d/rc.inet2 create mode 100644 tags/0.5.1/templates/vserver/vserver.d/etc/rc.d/rc.inetd create mode 100644 tags/0.5.1/templates/vserver/vserver.d/etc/rc.d/rc.ip_forward create mode 100755 tags/0.5.1/templates/vserver/vserver.d/etc/rc.d/rc.local create mode 100644 tags/0.5.1/templates/vserver/vserver.d/etc/rc.d/rc.mysqld create mode 100644 tags/0.5.1/templates/vserver/vserver.d/etc/rc.d/rc.postfix create mode 100644 tags/0.5.1/templates/vserver/vserver.d/etc/rc.d/rc.sendmail create mode 100755 tags/0.5.1/templates/vserver/vserver.d/etc/rc.d/rc.serial create mode 100755 tags/0.5.1/templates/vserver/vserver.d/etc/rc.d/rc.sshd create mode 100755 tags/0.5.1/templates/vserver/vserver.d/etc/rc.d/rc.syslog create mode 100755 tags/0.5.1/templates/vserver/vserver.d/etc/rc.d/rc.sysvinit create mode 100644 tags/0.5.1/templates/vserver/vserver.d/etc/rssh.conf create mode 100644 tags/0.5.1/templates/vserver/vserver.d/etc/ssh/sshd_config create mode 100644 tags/0.5.1/templates/vserver/vserver.d/var/www/htdocs/missing.html create mode 100644 tags/0.5.1/templates/vserver/vserver.d/var/www/missing.html create mode 100644 tags/0.5.1/templates/vserver/vserver.perms create mode 100644 tags/0.5.1/templates/vserver/vserver.s/GPG-KEY create mode 100644 tags/0.5.1/templates/vserver/vserver.s/devices.tar.gz create mode 100644 tags/0.5.1/templates/vserver/vserver.s/vserver.sh create mode 100644 tags/0.5.1/templates/vserver/vserver.template create mode 100755 tags/0.5.1/utils/add-gpl create mode 100755 tags/0.5.1/utils/add-slack-required create mode 100755 tags/0.5.1/utils/convert-template-scheme create mode 100755 tags/0.5.1/utils/merge-template create mode 100755 tags/0.5.1/utils/metapkg create mode 100755 tags/0.5.1/utils/searchpkg diff --git a/tags/0.5.1/README b/tags/0.5.1/README new file mode 100644 index 0000000..d4d1463 --- /dev/null +++ b/tags/0.5.1/README @@ -0,0 +1,2 @@ +See doc/README for more information. +Portuguese documentation at doc/README.pt_BR. diff --git a/tags/0.5.1/conf/generic.mkSlackBuild.new b/tags/0.5.1/conf/generic.mkSlackBuild.new new file mode 100644 index 0000000..6b5473e --- /dev/null +++ b/tags/0.5.1/conf/generic.mkSlackBuild.new @@ -0,0 +1,250 @@ +################################################### +## Generic template for SlackBuilds +## +## Version 0.8.1 - Luis ( luis at riseup d0t net) +## +################################################### + all +#!/bin/bash +# +# SlackBuild for [[PROGRAM NAME]] +# [[PROGRAM URL]] +# +# Author: [[SLACKBUILD AUTHOR]] +# + + + all +# Look for slackbuildrc +if [ -f ~/.slackbuildrc ]; then + source ~/.slackbuildrc +elif [ -f /etc/slackbuildrc ]; then + source /etc/slackbuildrc +fi + + + all +# Set variables +CWD="$(pwd)" +SRC_NAME="[[SOURCE NAME]]" +PKG_NAME="[[PACKAGE NAME]]" +ARCH=${ARCH:=[[ARCH]]} +SRC_VERSION=${VERSION:=[[VERSION]]} +PKG_VERSION="$(echo "$SRC_VERSION" | tr '[[:blank:]-]' '_')" +BUILD=${BUILD:=1[[SLACKBUILD AUTHOR INITIALS]]} +SRC_DIR=${SRC_DIR:=$CWD}/$PKG_NAME +TMP=${TMP:=/tmp} +PKG=${PKG:=$TMP/package-$PKG_NAME} +REPOS=${REPOS:=$TMP} +PREFIX=${PREFIX:=[[PREFIX]]} +PKG_SRC="$TMP/$SRC_NAME-$SRC_VERSION" +CONF_OPTIONS=${CONF_OPTIONS:=[[OTHER CONFIGURE ARGS]]} +NUMJOBS=${NUMJOBS:="-j4"} + + + all +# Set system libraries' path and optmization flags based on $ARCH +LIBDIR="$PREFIX/lib" + +if [ "$ARCH" = "i386" ]; then + SLKCFLAGS="-O2 -march=i386 -mcpu=i686" +elif [ "$ARCH" = "i486" ]; then + SLKCFLAGS="-O2 -march=i486 -mcpu=i686" +elif [ "$ARCH" = "i686" ]; then + SLKCFLAGS="-O2 -march=i686" +elif [ "$ARCH" = "s390" ]; then + SLKCFLAGS="-O2" +elif [ "$ARCH" = "x86_64" ]; then + SLKCFLAGS="-O2" + LIBDIR="$PREFIX/lib64" +fi + + + on +# Set error codes (used by createpkg) +ERROR_WGET=31; ERROR_MAKE=32; ERROR_INSTALL=33 +ERROR_MD5=34; ERROR_CONF=35; ERROR_HELP=36 +ERROR_TAR=37; ERROR_MKPKG=38; ERROR_GPG=39 +ERROR_PATCH=40; ERROR_VCS=41; ERROR_MKDIR=42 + + + all +# Clean up any leftovers of previous builds +rm -rf "$PKG_SRC" 2> /dev/null +rm -rf "$PKG" 2> /dev/null + +# Create directories if necessary +mkdir -p "$SRC_DIR" || exit $ERROR_MKDIR +mkdir -p "$PKG" || exit $ERROR_MKDIR +mkdir -p "$REPOS" || exit $ERROR_MKDIR + + + on +# Dowload source if necessary +SRC="$SRC_NAME-$SRC_VERSION.tar.[[SOURCE EXTENSION]]" +URL="[[DOWNLOAD FOLDER URL]]/$SRC" + +if [ ! -s "$SRC_DIR/$SRC" ] || ! [[DECOMPRESSOR]] [[DECOMPRESSOR TEST FLAG]] "$SRC_DIR/$SRC" 2> /dev/null; then + wget "$URL" -O "$SRC_DIR/$SRC" || exit $ERROR_WGET +fi + + + off +# Download source's MD5 checksum if necessary and check it +if [ ! -s "$SRC_DIR/$SRC.[[MD5SUM EXTENSION]]" ]; then + wget "$URL.[[MD5SUM EXTENSION]]" -O "$SRC_DIR/$SRC.[[MD5SUM EXTENSION]]" || exit $ERROR_WGET +fi + +MD5SUM_SRC="$(md5sum "$SRC_DIR/$SRC" | cut -d " " -f 1)" +MD5SUM_URL="$(grep "$SRC[ \t]*$" "$SRC_DIR/$SRC.[[MD5SUM EXTENSION]]" | cut -d " " -f 1)" + +[ "$MD5SUM_SRC" == "$MD5SUM_URL" ] || exit $ERROR_MD5 + + + off +# Import minimized signing key from +# [[SIGNING KEY URL]] +gpg --import << EOKEY || exit $ERROR_GPG +[[SIGNING KEY]] +EOKEY + +# Dowload source's signature if necessary and check it +if [ ! -s "$SRC_DIR/$SRC.sig" ]; then + wget "$URL.sig" -O "$SRC_DIR/$SRC.sig" || exit $ERROR_WGET +fi + +gpg --verify "$SRC_DIR/$SRC.sig" "$SRC_DIR/$SRC" || exit $ERROR_GPG + + + all +# Untar +cd "$TMP" +tar --no-same-owner --no-same-permissions -xvf "$SRC_DIR/$SRC" || exit $ERROR_TAR +cd "$PKG_SRC" + + + off +# Patch source +patches="[[PATCH FILES]] + $PKG_NAME.diff $PKG_NAME-$PKG_VERSION.diff + $PKG_NAME-$PKG_VERSION-$ARCH.diff $PKG_NAME-$ARCH.diff" +for patch in $patches; do + if [ -f "$CWD/$patch" ]; then + patch -Np[[NUMBER OF PREFIX SLASHES TO STRIP]] < "$CWD/$patch" || exit $ERROR_PATCH + elif [ -f "$CWD/patches/$patch" ]; then + patch -Np[[NUMBER OF PREFIX SLASHES TO STRIP]] < "$CWD/patches/$patch" || exit $ERROR_PATCH + fi +done + + + on +# Configure +CFLAGS="$SLKCFLAGS" \ + CXXFLAGS="$SLKCFLAGS" \ + ./configure \ + --prefix="$PREFIX" --libdir="$LIBDIR" "$CONF_OPTIONS" || exit $ERROR_CONF + + + all +# Compile +make $NUMJOBS || exit $ERROR_MAKE + + + all +# Install +make install DESTDIR="$PKG" || exit $ERROR_INSTALL + + + on +# Strip binaries +( cd "$PKG" + find . | xargs file | grep "executable" | grep ELF | cut -f 1 -d : | \ + xargs strip --strip-unneeded 2> /dev/null + find . | xargs file | grep "shared object" | grep ELF | cut -f 1 -d : | \ + xargs strip --strip-unneeded 2> /dev/null +) + + + off +# Compress and link manpages +if [ -d "$PKG/$PREFIX/man" ]; then + ( cd "$PKG/$PREFIX/man" + for manpagedir in $(find . -type d -name "man*") ; do + ( cd $manpagedir + for eachpage in $( find . -type l -maxdepth 1) ; do + ln -s $( readlink $eachpage ).gz $eachpage.gz + rm $eachpage + done + gzip -9 *.? + ) + done + ) +fi + + + off +# Compress info files +if [ -d "$PKG/$PREFIX/info" ]; then + ( cd "$PKG/$PREFIX/info" + rm -f dir + gzip -9 * + ) +fi + + + on +# Install documentation +DOCS="[[DOCUMENTATION FILES]]" +mkdir -p "$PKG/usr/doc/$PKG_NAME-$PKG_VERSION" || exit $ERROR_MKDIR +cp -a $DOCS "$PKG/usr/doc/$PKG_NAME-$PKG_VERSION" + + + on +# Add package description (slack-desc) +mkdir -p "$PKG/install" || exit $ERROR_MKDIR +cat << EODESC > "$PKG/install/slack-desc" +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' +# on the right side marks the last column you can put a character in. You must +# make exactly 11 lines for the formatting to be correct. It's also +# customary to leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +[[SLACK-DESC]] +EODESC + + + off +# Add a post-installation script (doinst.sh) +cat << EOSCRIPT > "$PKG/install/doinst.sh" +config() { + NEW="\$1" + OLD="\$(dirname \$NEW)/\$(basename \$NEW .new)" + # If there's no config file by that name, mv it over: + if [ ! -r \$OLD ]; then + mv \$NEW \$OLD + elif [ "\$(cat \$OLD | md5sum)" = "\$(cat \$NEW | md5sum)" ]; then + # toss the redundant copy + rm \$NEW + fi + # Otherwise, we leave the .new copy for the admin to consider... +} + +config path/to/config_file.new +[[REST OF DOINST.SH]] +EOSCRIPT + + + all +# Build the package +cd "$PKG" +makepkg -l y -c n "$REPOS/$PKG_NAME-$PKG_VERSION-$ARCH-$BUILD.tgz" || exit $ERROR_MKPKG + + + on +# Delete source and build directories if requested +if [ "$CLEANUP" == "yes" ]; then + rm -rf "$PKG_SRC" "$PKG" +fi + diff --git a/tags/0.5.1/conf/repos.conf.new b/tags/0.5.1/conf/repos.conf.new new file mode 100644 index 0000000..1d77419 --- /dev/null +++ b/tags/0.5.1/conf/repos.conf.new @@ -0,0 +1,41 @@ +# +# repository definitions for simplaret +# please dont use any spaces inside a repository definition +# + +# root repositories +ROOT-i386="tds%http://slackware.mirrors.tds.net/pub/slackware/" +ROOT-i386="sarava%http://slack.sarava.org/slackware/" +ROOT-x86_64="sarava%http://slack.sarava.org/slamd64/" +ROOT-x86_64="slackadelic%http://mirror1.slackadelic.com/slamd64/" +ROOT-x86_64="heanet%http://ftp.heanet.ie/pub/slamd64/" +ROOT-powerpc="workaround%http://slackintosh.workaround.ch/pub/slackintosh/" +ROOT-s390="ibiblio%http://distro.ibiblio.org/pub/linux/distributions/slack390/" + +# noarch +NOARCH="sarava%http://slack.sarava.org/packages/noarch" + +# i386 10.2 +REPOS-i386-10.2="sarava%http://slack.sarava.org/packages/slackware/slackware-10.2/" +PATCHES-i386-10.2="sarava%http://slack.sarava.org/packages/slackware/slackware-10.2/patches/" + +# x86_64 10.2 +REPOS-x86_64-10.2="sarava%http://slack.sarava.org/packages/slamd64/slamd64-10.2/" +PATCHES-x86_64-10.2="sarava%http://slack.sarava.org/packages/slamd64/slamd64-10.2/patches/" + +# x86_64 10.2b +REPOS-x86_64-10.2b="sarava%http://slack.sarava.org/packages/slamd64/slamd64-10.2b/" +PATCHES-x86_64-10.2b="sarava%http://slack.sarava.org/packages/slamd64/slamd64-10.2b/patches/" + +# i386 11.0 +REPOS-i386-11.0="sarava%http://slack.sarava.org/packages/slackware/slackware-11.0/" +PATCHES-i386-11.0="sarava%http://slack.sarava.org/packages/slackware/slackware-11.0/patches/" + +# x86_64 11.0 +REPOS-x86_64-11.0="sarava%http://slack.sarava.org/packages/slamd64/slamd64-11.0/" +PATCHES-x86_64-11.0="sarava%http://slack.sarava.org/slamd64/slamd64-11.0/patches/" + +# powerpc 11.0 +REPOS-powerpc-11.0="sarava%http://slack.sarava.org/packages/slackintosh/slackintosh-11.0/" +PATCHES-powerpc-11.0="workaround%http://slackintosh.workaround.ch/pub/slackintosh/11.0/patches/" + diff --git a/tags/0.5.1/conf/simplepkg.conf.new b/tags/0.5.1/conf/simplepkg.conf.new new file mode 100644 index 0000000..50ea4ad --- /dev/null +++ b/tags/0.5.1/conf/simplepkg.conf.new @@ -0,0 +1,152 @@ +# +# /etc/simplepkg/simplepkg.conf +# + +# Default architecture: set this option if you dont want simplepkg +# to use the value from /etc/slackware-version +# DEFAULT_ARCH="i386" + +# Default version: set this option if you dont want simplepkg; +# to use the value from /etc/slackware-version +# DEFAULT_VERSION="11.0" + +# Where jails are placed +JAIL_ROOT="/vservers" + +# Wheter mkjial should add new jails in the jail list; +# to enable it, set to "1" or "yes" +ADD_TO_JAIL_LIST="1" + +# Whether mkjail should clean the package cache before installation +# to enable it, set to "1" or "yes" +SIMPLARET_CLEAN="1" + +# whether mkjail should clean the package cache after the installation; +# to enable it, set to "1" or "yes" +SIMPLARET_DELETE_DOWN="1" + +# Whether mkjail should issue a simplaret --update before install the jail; +# to enable it, set to "1" or "yes" +SIMPLARET_UPDATE="1" + +# Wheter try to download from the next repository on failed download. +SIMPLARET_DOWNLOAD_FROM_NEXT_REPO="1" + +# Wheter delete also patches when simplaret --purge is called; +# to enable it, set to "1" or "yes" +SIMPLARET_PURGE_PATCHES="1" + +# Whether delete each package rigth after its installation; +# to enable it, set to "1" or "yes" +SIMPLARET_DELETE_DURING="0" + +# Delete packages older than N weeks from the cache +SIMPLARET_PURGE_WEEKS="3" + +# Where patches are placed +PATCHES_DIR="/var/simplaret/patches" + +# Place to store your packages +STORAGE="/var/simplaret/packages" + +# Whether to use passive ftp transfers; +# to enable it, set to "1" or "yes" +PASSIVE_FTP="1" + +# Http retrieval tool; +# available parameters are "wget" or "curl" +HTTP_TOOL="curl" + +# Ftp retrieval tool; +# available parameters are "wget", "curl" or "ncftpget" +FTP_TOOL="curl" + +# Set connection timeout in seconds +CONNECT_TIMEOUT="20" + +# ROOT repository package priority +ROOT_PRIORITY="patches slackware extra testing pasture" + +# REPOS repository package priority +REPOS_PRIORITY="patches slackware extra testing pasture" + +# Whether to check package signatures (you should have the repository +# maintainer key on your keyring) +SIGNATURE_CHECKING="0" + +# Whether simplaret will try to solve dependencies by looking +# for packages' slack-required +DEPENDENCY_CHECKING="1" + +# Enabling this option (i.e, setting to "1" or "yes"), simplaret will +# donwload even # already applied patches, a good option when you plan +# to keep local copies of all needed patches for your system +DOWNLOAD_EVEN_APPLIED_PATCHES="0" + +# Enabling this option (i.e, setting to "1" or "yes"), simplaret will +# look at your standard repositories for new packages; if it find a +# package with different version of your current installed package and +# also this package isnt in the packages folder, then the new package +# is applied; if in doubt, just say no or leave blank. Otherwise set it +# either to "yes" or "1" and remember that if enabling this feature can +# cause problems if you use more than one REPOS definition for each +# ARCH and VERSION. Also, this option can be very slow. +CONSIDER_ALL_PACKAGES_AS_PATCHES="0" + +# Enabling this option (i.e, setting to "1" or "yes"), simplaret will +# store patches it finds on ROOT repositories on +# +# $PATCHES_DIR/$ARCH/$VERSION/root-$repository_name. +# +# By default this option is turned off because it breaks the standard +# way to store packages and can cause some confusion, but its an useful +# feature if you like to see all patches apart from common packages and/or +# stored in the same tree. +STORE_ROOT_PATCHES_ON_PATCHES_DIR="0" + +# Set to yes if your templates will be placed in a subversion repository +# This just work if TEMPLATE_STORAGE_STYLE is set to own-folder (default) +TEMPLATES_UNDER_SVN="no" + +# Where your templates will be located. +# Dont change it except you know what you're doing. +TEMPLATE_FOLDER="/etc/simplepkg/templates" + +# This variable controls in which folder / subfolder your templates will +# be stored. Possible values are: +# +# - simplepkg-folder: templates are stored at /etc/simplepkg +# - templates-folder: templates are stored at /etc/simplepkg/templates +# - own-folder: each template stored at its own folder +# at /etc/simplepkg/templates/template-name +# +# This variable has backwards purposes only, so dont change it. +TEMPLATE_STORAGE_STYLE="own-folder" + +#--------------------------------------------------------------------- +# MKBUILD AND CREATEPKG SECTION +#--------------------------------------------------------------------- +# Set SlackBuilds default directory from scripts +SLACKBUILDS_DIR="/var/slackbuilds" + +# Set binaries default repository directory +#MAKEPKG_REPOS="/var/createpkg" + +# Set sources default directory +#SOURCE_DIR="/var/sources" + +# Set color style +# possible values are: color,gray, none +#COLOR_MODE="none" + +# Remove old packages from repository tree by createpkg +# 0 enable +# 1 desable +#REMOVE_OLD_PACKAGE=1 + +# Move package to SlackBuilds-like tree +# 0 enable +# 1 desable +#MOVE_BIN_PACKAGE=1 + +#--------------------------------------------------------------------- diff --git a/tags/0.5.1/doc/CHANGELOG b/tags/0.5.1/doc/CHANGELOG new file mode 100644 index 0000000..d9446f3 --- /dev/null +++ b/tags/0.5.1/doc/CHANGELOG @@ -0,0 +1,409 @@ +simplepkg changelog +=================== + +0.5.1 +===== + + - bugfix on metadata generation + +0.5pre23 +======== + + - updated documentation + +0.5pre22 +======== + + - simplaret: + - small fix + - common.sh: + - fixes on metafiles generation + +0.5pre21 +======== + + - templatepkg: + - now --delete can also remove the file from a jail + +0.5pre20 +======== + + - small changes + - jail-commit: + - template files security + +0.5pre19 +======== + + - simplaret: + - bugfixes + - options --get and --install now can work + with full file name. + +0.5pre15-18 +=========== + + - bugfixes + +0.5pre14 +======== + + - simplaret + - added variable REPOS_PRIORITY + - added variable SIMPLARET_DOWNLOAD_FROM_NEXT_REPO + + - lspkg: + - small bugfix + + - common.sh: + - on search_template, doesnt return a template from + defaults/ if the function is called with --update + + - utils/add-slack-required: + - command line enhancement + +0.5pre9 - 0.5pre13 +================== + + - bugfix releases + +0.5pre8 +======= + + - lspkg: + - bugfix + + - common.sh: + - bugfix in function slash + +0.5pre7 +======= + + - simplaret: + - fixed bug for ROOT definitions when there is packages + inside of folders different than ROOT_PRIORITY + +0.5pre6 +======= + + - repos: + - FILE_LIST generation fix + + - mkjail: + - new config variable ADD_TO_JAIL_LIST controls wheter to + add new jails into the JAIL_LIST file + +0.5pre5 +======= + + - jail-commit + - SILENT env variable to decrease verbosity + +0.5pre4 +======= + + - templatepkg: + - small fixes + - help usage summary improvements + - now using variable TEMPLATE_FOLDER + - SILENT env variable to decrease verbosity + - option -p | --post-install renamed to -b | --batch-edit + - option -p | --post-install now used to build a package from a template + - option -d | --delete now can also remove post-install scripts + + - common.sh + - small fixes + - now using variable TEMPLATE_FOLDER + + - jail-commit: + - calling templatepkg silently + - small fixes + +0.5pre3 +======= + + - again, lots of bugfixes + + - jail-commit: + - update a template just once if finds more than one entry + for a template in the jailist + +0.5pre2 +======= + + - lots of bugfixes + + - templatepkg: + - now creates missing components in a template + +0.5pre1 +======= + + Lots of changes! + + - repos: cosmetic changes + + - lspkg: + - support for $ROOT env variable + - some improvements + + - CHANGELOG cleanup + + - subversion repository support for templates + + - metapkg moved to utils/ + + - simplaret: + - new config variables: + - STORE_ROOT_PATCHES_ON_PATCHES_DIR + - SIGNATURE_CHECKING + - ROOT=/otherroot works for --install, --remove and --upgrade + - signature checking + - dependency checking through slack-required + + - mkjail: + - added support for slack-required as templates + - templates now can be stored either on + - /etc/simplepkg/template_name.template + - /etc/simplepkg/templates/template_name.template + - /etc/simplepkg/templates/template_name/template_name.template + + - jail-update + - old script renamed to jail-commit + - now update a jail from a template + - svn repository support + + - jail-commit + - new script, commit changes from a jail to the templates + - svn repository support + + - templatepkg: + - major rewrite + - svn repository support + - now supports a tagfile or slack-required as a template + - new/changed options + -c | --create: improvements + -a | --add: changed to add files into a template + -u | --update: update a template + -d | --delete: delete files or folders from a template + -s | --sync: sync /etc/simplepkg/templates working copy + -e | --export: export /etc/simplepkg/templates to a svn repository + -i | --import: grab /etc/simplepkg/templates from a svn repository + -r | --remove: remove a template + -l | --list: list templates + -p | --post-install: add or edit post-installation scripts + -t | --template-edit: edit template package list + -h | --help: display this summary + +0.4.9pre18-23 +============= + + - simplaret: + - enhanced http retrieval: curl support + - enhanced verbosity + - get-patches small changes + - various fixes + +0.4.9pre10-17 +============= + + - lots of simplaret fixes + +0.4.9pre9 +========= + + - createpkg: + - speedup + - ncftpget support + - timeout support + - sets the correct architecture + + - deleted jail-upgrade + + - removed swaret support + +0.4.9pre8 +========= + + - createpkg: bugfix + + - common.sh: + - enhanced config file evaluation + - fixed function default_arch + + - simplaret: + - config evaluation via common.sh + - new config parameter SIMPLARET_PURGE_PATCHES + +0.4.9pre7 +========= + + - repos: added patches/ metafile creation + + - jail-upgrade: + - added option CONSIDER_ALL_PACKAGES_AS_PATCHES + - merged swaret and simplaret upgrade procedures + - act recursively on patches' folder + + - simplaret: lots of changes, most important are: + - new repository scheme, take a look at repos.conf.new. + - --get looks first to PATCHES repositories, then ROOT, + then REPOS and finally at NOARCH repositories; the + firts matching package is downloaded. + - new config parameter ROOT_PRIORITY set the priority + of folder lookup at a ROOT repository, defaults to + "patches slackware extra testing pasture". + - for --get, check if an already existing package + in the local repository has the same version and + build number, otherwise erase the old and download + the new one. + - fixed --get-paches + - added --upgrade option + - added --install + - added --remove + - new config parameter DOWNLOAD_EVEN_APPLIED_PATCHES + + - createpkg: lots of changes + +0.4.9pre6 +========= + + - createpkg: + - fixes + - now with slackbuild error handling + - increased verbosity + + - small fixes on rebuildpkg + + - lspkg enhancements + + - simplaret fix on --purge + + - updated default repos.conf + +0.4.9pre5 +========= + + - added script "repos" + + - moved simplaret to /usr/bin + +0.4.9pre4 +========= + + - createpkg: better command line evaluation, + now using "upgradepkg --install-new" to + install a package and added the command + line option --no-deps so createpkg doesn't + goes down to solve all slack-required + dependencies. + +0.4.9pre3 +========= + + - small fix on createpkg when handling with + slackbuilds with similar names + +0.4.9pre2 +========= + + - fixed simplepkg.SlackBuild + + - fixed doinst.sh + + - re-organized the source repository + + - added createpkg + + - updated README and README.pt_BR + +0.4.8 +===== + + - simplaret: removed extra folder from slamd64 definition + + - fixed a typo + +0.4.7 +===== + + - templatepkg bugfix on blank template lines and on package deletion + changed simplaret working dir in simplaret.conf.new + +0.4.6 +===== + + - small bugfix on jail-update that prevented template update + +0.4.5 +===== + + - vserver template update + +0.4.4 +===== + + - WARNING option on config file for simplaret + + - SILENT env var, if a non-zero value, keeps simplaret + work silenty when purging and works like if WANRING is set + to not null. + + - added SIMPLARET_DELETE_DURING config parameter: when set + to a non-zero value deletes each package rigth after its + installation + +0.4.3 +===== + + - added openoffice.org template + +0.4.2 +===== + + - common.sh: fix on install_packages when handling + with similar package names + +0.4.1 +===== + + - templatepkg: fixed tagfiles and comment handling + +0.4 +=== + + - multi-plataform and version management + + now simplepkg supports jails with architectures and versions + others than the main system, read the docs for details. + + - added simplaret: a small script for downloading packages + + - jail-upgrade + + * arch checking via /etc/slackware-version on each jail + * supports multi-arch and multi-version repository + * integrated with simplaret + + - common.sh: improved functions to support simplaret + +0.3.7-0.3.9 +=========== + + - bugfix releases + +0.3.6 +===== + + - added "-u" option to eval_config to ask for a swaret --update + +0.3.5 +===== + + - "main" jail support for jail-update + +0.3.4 +===== + + - Started changelog :) + diff --git a/tags/0.5.1/doc/COPYING b/tags/0.5.1/doc/COPYING new file mode 100644 index 0000000..d60c31a --- /dev/null +++ b/tags/0.5.1/doc/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + 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 2 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/tags/0.5.1/doc/README b/tags/0.5.1/doc/README new file mode 100644 index 0000000..47143ca --- /dev/null +++ b/tags/0.5.1/doc/README @@ -0,0 +1,428 @@ +Simplepkg: installation manager and packaging system +---------------------------------------------------- + +Author: Silvio Rhatto +Licence: GPL + +Simplepkg is a non-intrusive management system running on top of pkgtool made of a +set of scripts which helps the sysadmin and developing cycles of an slackware system. +It can be used to create packages and repositories as long as the operational system +installation and config file change tracking. + +Documentation +------------- + + English documentation: README | http://slack.sarava.org/simplepkg-en + Portuguese documentation: REAMDE.pt_BR | http://slack.sarava.org/simplepkg + +Description +----------- + +All GNU/Linux distributions comes with a well developed packaging system. The question now +is how pratical is the way to install, configure and control any changes in a system. + +As an example, suppose you should keep a list of about 200 slackware machines, some +of them used as desktops, others as mail or webservers. If you lost some hardrives +or usually need to re-install or update some of those boxes. + +Using the slackware installation cd and configuring by hand all the time you got a crash +is a time loss activity and you'll never know if something remained missconfigured. An +alternative is to keep a complete backup of a machine or some parts of the tree, but for +a large number of different boxes this procedure costs a lots of resources. + +Simplepkg offers an alternative sollution for this and other problems related to installation +management, allowing you to keep templates of each machine and install a custom slackware +system with just one or a few commands. Creating and upgrading chroot and vservers is easy +with simplepkg. + +Package and installation management is not everything simplepkg can do. It can also be used +to create vservers, create packages and store system configuration files in a subversion +repository. + +Simplepkg works with any (official or not) slackware port that follows the minimum system +guidelines. + +Architecture +------------ + +Simplepkg is a set of scripts wrote in the KISS philosophy. Its a pretty simple system, composed +by the following commands: + + - mkjail: build a slackware jail/installation in a folder + - templatepkg: create or update a package list of an installation template + - lspkg: show installed packages and its contents + - jail-commit: update all configuration files of a template + - jail-update: jail-commit counterpart + - rebuildpkg: rebuild a package based on its /var/log/packages entry + - simplaret: package retrieval tool + - createpkg: donwload, compile and package creationg script + - repos: creates and manages binary repositories + - mkbuild: app to build slackware build scripts + +Installation +------------ + +The latest version of simplepkg is locate at http://slack.sarava.org/packages/noarch/. +Install it with the usual way: + + installpkg simplepkg-VERSION-noarch-BUILD.tgz + +Simplepkg usage +--------------- + +The three main simplepkg uses are: + + - Package managemen + - Jail/installation creation and management + - Package creation + +Package management is made with simplaret app, whose behaviour is detailed in its own document. +The following sections will only show how simplepkg can be used to manage jails and template +and create packages. + +Creating templates +------------------ + +Initially, simplepkg was built to help slackware install automation. To do that, it uses installation +templates -- lists of installed packages, post-installation scripts and config files -- allowing the +creation of installation profiles that can be used for system replication in other partition or even +custom chroot building. + +Template creation is done with "templatepkg" script. To create a template called "my-slackware" containig +the installed package list of your slackware installation, just type + + templatepkg -c my-slackware + +The -c (or --create) flag tells templatepkg to create the /etc/simplepkg/templates/my-slackware folder +with the following components: + + - /etc/simplepkg/templates/my-slackware/my-slackware.d: template config files + - /etc/simplepkg/templates/my-slackware/my-slackware.s: post-installation scripts + - /etc/simplepkg/templates/my-slackware/my-slackware.perms: metadata for config files + - /etc/simplepkg/templates/my-slackware/my-slackware.template: installaed package list + +This four components are enough to store all slackware installation characteristics: the package list +controls with applications are installed, the config file folder can contain all desired configurations +for any installed application and the post-installation scripts take care of all procedures that should +be executed exactly after the system installation. The my-slackware.perms file contains metadata for the +saved config files, i.e, permission and ownership. + +If you want to build a template from a installation placed in another folder or partition thats not your +current root dir, just type something like + + templatepkg -c my-slackware /mnt/slackware + +where /mnt/slackware is the place where this alternative system is installed. After created, the template +will contain just the installed package list or that folder. As the folder /var/log/packages of your +installation doesn't keep information about the package installation order, its recommended that you +manually edit the template's package list. To do that, just type + + templatepkg -e my-slackware + +To add configuration files inside the template, type something like + + templatepkg -a my-slackware /etc/hosts + +This should add /etc/hosts file to "my-slackware" template. Beyond just automatically copy the file +when you install a new system using this template, simplepkg can also take care of every change that +/etc/hosts can suffer on your system, such as file content or permission and ownership change. If you're +also storing your templates in a subversion repository, you'll be able to track all changes it ever had. + +WARNING: avoid the storage in a template of config files that contains important security information +such as passwords or secret keys. The prefered place to put such stuff is a secured backup. + +Creating jails and replicating installations +-------------------------------------------- + +As long as your template was created and populated with the package list, configuration files and +post-installation scripts (what will be treated in another section), your can replicate your slackware +installation as simpler than typing the following command: + + mkjail jail my-slackware + +This creates a fresh slackware tree at /vservers/jail with all packages listed in the template "my-slackware" +and all saved config files. The package installation is made by simplaret app, that should be properly configured. +The standard simplaret configuration should work for most situations. + +If you want to install your jail in a place other than /vservers (this standard location can be changed through +simpleokg config file), say /mnt/hda2, just use something like that: + + ROOT=/mnt mkjail hda2 my-slackware + +The above command does exactly what you think: installs slackware in /mnt/hda2 with exactly the same packages +you have on your system, replacing the need of the slackware installer! + +In case no template specified, mkjail uses the one stored /etc/simplepkg/default, if exists. Simplepkg already +came if some pre-built templates at /etc/simplepkg/defaults/templates. + +Post-installation scripts +------------------------- + +Optionally, its possible to keep post-installation scripts inside a template. Such scripts are executed by mkjail +exactly after a jail is installed and the template config files copied. To create or edit a post-installation +script, just type + + templatepkg -b my-slackware script-name.sh + +This adds the script-name.sh at "my-slackware" template. Mkjail passes two command line arguments to a post-install +script: the upward folder and the jail's name ("/mnt" and "hda2" from our previous example). Then, an example script +is something like that: + + #!/bin/bash + chroot $1/$2/ sbin/ldconfig + +Listing template contents +------------------------- + +To list available templates or the template content, use commands such as + + templatepkg -l + templatepkg -l my-slackware + +Removing files from a template +------------------------------ + +As you did to add files, you can easily remove then from a template, using a comand such as + + templatepkg -d my-slackware /etc/hosts + +This removes the file /etc/hosts from "my-slackware" template. + +Removing a template +------------------- + +To remove a template, just type + + templatepkg -r my-slackware + +Updating a template +------------------- + +Now that we just talked about creating templates and jails, its time to cover another application, this time +used to keep a template always updated. Jail-commit is a script that copies all config file changes (content, +permissions and ownership) from a installation to a simplepkg template. + +For instance, if one wants to copy all changes from /mnt/hda2 jail into "my-slackware" template, he or she +just needs to type the following command: + + jail-commit /mnt/hda2 my-slackware + +Not just the package list from "my-slackware" template is updated according the installed packages from +/mnt/hda2/var/log/packages: all config files from "my-slackware" template are compared it the ones from +the jail and in case of any difference they're copied from the jail back to the template. Permissions +and file ownership commit into the template works at the same way. + +Jail-commit allows that a template to being kept always updated and mirroring the actual configuration +of an installed system. But if you want just to commit into the template just the installed package +list, simply type + + templatepkg -u my-template + +To make life even easier, there's also a feature of keeping a list of all installed slackware system in +the box in the file /etc/simplepkg/jailist. This file, despite its use by simplaret (what is described +in its own text), allow jail-commit to run with no arguments. + +Suppose you have three slackware installations: the root system and two more: + + - /mnt/slackware-1 using "slackware-1" template + - /mnt/slackware-2 using "slackware-2" template + +If your /etc/simplepkg/jailist has the following lines: + + /mnt/slackware-1 + /mnt/slackware-2 + +then the command + + jail-commit + +will update both "slackware-1" and "slackware-2" templates according, respectivelly, the contents of +/mnt/slackware-1 and /mnt/slackware-2. If you also have a template called "main", then jail-commit +will sync the contents of your root system with that template. + +You can even add the following line at root's crontab + + 20 4 * * * jail-commit + +so all your templates get updated everyday. If your system is configured to send emails, then crontab's +jail-commit output you give a summary of yesterday changes your system suffered, both config file changes +and package additions and removals. + +Restoring changes in a jail +--------------------------- + +The opposite operation of jail-commit also is possible: suppose you edited some config files in your system but +suddenly wants to go back and copy all config files from a template to your jail. To do that, just use the command + + jail-update /mnt/hda2 my-slackware + +Storing templates inside a Subversion repository +------------------------------------------------ + +In order to increase once more the control and flexibility of template contents, simplepkg can also handle templates +inside a subversion repository. To do that, edit first the config gile /etc/simplepkg/simplepkg.conf and set the +parameter TEMPLATES_UNDER_SVN to "yes". + +Then, create a fresh subversion repository to keep your templates with a command like that: + + svnadmin create /var/svn/simplepkg --fs-type fsfs + +Then, you just need to import your templates with + + templatepkg -e file:///var/svn/simplepkg + +From now jail-commit will commit automatically any template changes to the svn repository. If, in the other hand, +you wish to grab the changes from the svn repository to your local copy, use + + templatepkg -s + +In case you want to import a template folder from an existing repository, use + + templatepkg -i file:///var/svn/simplepkg + +where file:///var/svn/simplepkg is the repository path. + +Upgrading jails +--------------- + +Jail and installed system upgrading is done through simplaret and also supports /etc/simplepkg/jailist file. +For more info on how it works, take a look at simplaret own documentation. + +Different archs and versions +---------------------------- + +Simplepkg was idealized to permit a template to create jails from any architecture and version +of a slackware-like system. Upgrading tasks also are unified. This feature just works if you +use simplaret and not swaret as the package retrieval tool. + +As another example, to create an slack 10.1 installation (assuming your /etc/simplepkg/repos.conf with +the right configuration), just type + + VERSION=10.1 mkjail my-jail server-template + +Different archs can be used too. If you have a x86_64 system and wants to install a slack 10.2 +in a partition, try something like + + ARCH=i386 VERSION=10.2 ROOT=/mnt mkjail hda2 my-slackware + +Note that the templates are arch and version independent, as they just contain package names, +configuration files and scripts. For this reason, the commands templatepkg, metapkg, lspkg and +jail-update can be used normaly. + +Creating a package from a template +---------------------------------- + +If, for any reason, you wish to build a package from an existing template, try the command + + templatepkg -p template-name + +Although that should work smoothly, its not the recommended behaviour, as simplepkg was designed +to deal easily with templates and repositories. + +Building packages +----------------- + +Until now, we just showed simplepkg applications used to manage installations and packages. +But simplepkg can also create packages using createpkg script: it downloads, builds and +packages software that has an available script from a SlackBuild in a repository, working +like a slackware ports system. + +Createpkg works with any SlackBuild repository but works better and is well integrated if +they are compliant with the standards from + + http://slack.sarava.org/wiki/Main/SlackBuilds + +Specifically, createpkg was built to use slackbuilds from http://slack.sarava.org/slackbuilds +through a subversion repository. + +To fetch all scripts from slack.sarava.org, type + + createpkg --sync + +Then, you can list all available script using + + createpkg --list + +To search for a script, use something like + + createpkg --search latex2html + +This searches for a SlackBuild for the program "latex2html". If you want to build that package, +just type + + createpkg latex2html + +The resulting package should be available at /tmp or at the folder specified by the environment +variable $REPOS. To create and install the package, type + + createpkg --install latex2html + +If the package has dependencies listed in a slack-required file that aren't installed in the +system, then createpkg will try to process then before the desired package's SlackBuild: if +the dependencies aren't available in the SlackBuild tree, then createpkg will call simplaret +and try to install the package from a binary repository. If you want to avoid createpkg's +dependency checking, just use it with the flag --no-deps. + +For more information about createpkg, type + + createpkg --help + +or take a look at http://slack.sarava.org/wiki/Main/SlackBuilds. + +Auxiliar applications +--------------------- + +Simplepkg comes also with the following tools: + + - lspkg: show installed packages and its contents + - rebuildpkg: rebuild a package based on its /var/log/packages entry + - repos: creates and manages binary repositories + - mkbuild: app to build slackware build scripts + +The command lspkg is used to show installed packages. Also, Simplepkg comes with an additional helper +tool that recover installed packages which the original .tgz file was lost. The command rebuildpkg +rebuilds a package from their entry in /var/log/packages. As an example, + + rebuildpkg coreutils + +rebuilds the coreutils package using the files, scripts and metainformations stored in +/var/log/packages/ and /var/log/scripts/. + +For their time, scripts repos and mkbuild are used, respectivelly, to create and manage binary repositories +and to create SlackBuild scripts. + +Configuration parameters +------------------------ + +Simplepkg's config file is /etc/simplepkg/simplepkg.conf and it keeps parameters used by all scripts. +In this section, we won't cover any parameter that's just used by simplaret, whose settings are covered +in its own documentation. + + - JAIL_ROOT: Where jails are placed by mkjail. Default: "/vservers". + + - ADD_TO_JAIL_LIST: Wheter mkjial should add new jails to /etc/simplepkg/jailist. Default is "1" (enabled). + + - TEMPLATES_UNDER_SVN: Set to yes if your templates will be placed in a subversion repository. Default + is "no" (disabled). + + - TEMPLATE_FOLDER: Where your templates will be located. Default is "/etc/simplepkg/templates" and + dont change it except you know what you're doing. + + - TEMPLATE_STORAGE_STYLE: This variable controls in which folder / subfolder your templates will + be stored. Default value is "own-folder" and you'll just need to change that if you're storing + your templates using an old simplepkg format and wants to keep compatibilty. + +Its important to note that all boolean parameters in the config file can be set either to "1" or "yes" +to enable and "0" or "no" to disable. + +Additional information +---------------------- + +Simplepkg was written by Silvio Rhatto (rhatto at riseup.net) and is released under GPL license. The code +can be obtained from the subversion repository: + + svn checkout svn://slack.sarava.org/simplepkg + +Simplepkg's wiki is http://slack.sarava.org/wiki/Main/SimplePKG and its mailing list address is +http://listas.sarava.org/wws/info/slack. + diff --git a/tags/0.5.1/doc/README.pt_BR b/tags/0.5.1/doc/README.pt_BR new file mode 100644 index 0000000..138125e --- /dev/null +++ b/tags/0.5.1/doc/README.pt_BR @@ -0,0 +1,444 @@ +Simplepkg: gerenciamento de instalações e pacotes +------------------------------------------------- + +Autor: Silvio Rhatto +Licença: GPL + +O simplepkg é um sistema de gerenciamento de sistemas slackware que roda sobre o pkgtool. +Ele é composto por vários scripts que desempenham funções de administração e desenvolvimento de +sistemas do tipo Slackware, procurando fechar um circuito de produção, envolvendo a construção, +a instalação de pacotes e até mesmo a instalação do sistema de forma automatizada. + +Do lado do desenvolvedor/a, ele ajuda na criação de SlackBuilds e construção de pacotes. +Do lado do administrador/a, ele possibilita a instalação automatizada de sistemas, instalação +de pacotes e a criação de "templates" de instalação -- que contém todos os arquivos de configuração, +informações de permissões e scripts de pós-instalação de uma dada máquina ou jaula. + +Documentação +------------ + +A documentação mais atualizada do simplepkg está em http://slack.sarava.org/simplepkg. + +Descrição +--------- + +Todas as distribuições de GNU/Linux já tem algum sistema de empacotamento amadurecido. A questão +agora é a praticidade de instalar e controlar o que está instalado, tanto pacotes como arquivos +de configuração de uma máquina, além da facilidade na criação de pacotes. + +Imagine por exemplo se você precisa manter uma lista de pacotes de 200 máquinas slackware, sendo +que algumas são usadas como desktop, outras como servidores web, alguma sendo o servidor de email +e assim por diante. Imagine agora que você perca o disco de algumas dessas máquinas ou que precise +cotidianamente reinstalar ou atualizar um sistema. + +Usar o cd de instalação do slackware e configurar na mão toda a vez que der um pau faria com que +você ficasse louco/a e desperdiçasse muito tempo, além do que sempre ocorre de esquecermos algum +detalhe ou pacote durante a configuração do sistema. Manter um backup completo de cada máquina, +por outro lado, pode ser muito custoso se o número delas for muito grande. + +O simplepkg permite que você mantenha um template para cada grupo de máquinas e com apenas um +comando instalar o template numa partição. Além do template, você precisa configurar o simplepkg +para obter pacotes de um repositório local ou remoto. + +Gerenciar instalações e pacotes não é tudo o que o simplepkg faz. Ele pode ser usado até na +criação de jaula e vservers, podendo manter toda a configuração das máquinas num repositório +Subversion. + +O simplepkg funciona não apenas com o Slackware mas com qualquer port (oficial ou não) que +siga minimamente os padrões oficiais. + +Arquitetura +----------- + +O simplepkg é um conjunto de scripts escritos com a filosofia KISS (Keep It Simple, Stupid) em mente. +Ele é um sistema muito simples, composto pelos seguintes comandos: + + - mkjail: constrói uma jaula/instalação de slackware numa pasta + - templatepkg: criar ou adiciona pacotes a um template + - lspkg: lista pacotes instalados + - jail-update: inverso do jail-commit + - jail-commit: atualiza o template + - rebuildpkg: reconstrói um pacote a partir de sua entrada no /var/log/packages + - simplaret: obtém pacotes de repositórios locais ou remotos + - createpkg: baixa, compila e empacota software de acordo com scripts presentes num repositório + - repos: cria e mantém repositórios + - mkbuild: cria scripts de construção de pacotes + +Instalando o simplepkg +---------------------- + +Para baixar o pacote do simplepkg, vá em http://slack.sarava.org/packages/noarch/. Depois, basta usar +o comando + + installpkg simplepkg-VERSAO-noarch-BUILD.tgz + +Usando o simplepkg +------------------ + +As três principais aplicações desse conjunto são: + + - Gerenciamento de pacotes + - Criação e manutenção de jaulas + - Criação de pacotes + +O gerencamento de pacotes é feito através do simplaret, e por ser algo bem específico está detalhado +no artigo correspondente. As seções a seguir mostrarão como o simplepkg pode ser utilizado para criar +e manter jaulas, assim como também criar pacotes. + +Criando templates de instalação +------------------------------- + +Originalmente, o simplepkg foi desenvolvido para ajudar na automatização de instalações de sistemas +slackware. Para isso, ele trabalha com templates -- listas com pacotes instalados, scripts e arquivos +de configuração -- permitindo criar perfis de instalação que podem ser então usados para instalar o +sistema numa outra partição ou criar um chroot. + +A construção de um template é feita através do programa templatepkg. Para criar um template de nome +"meu-slackware" contendo a lista de pacotes atualmente instalados no seu sistema, digite + + templatepkg -c meu-slackware + +A opção -c (ou --create) criará a pasta /etc/simplepkg/templates/meu-slackware, que conterá os +seguintes componentes: + + - /etc/simplepkg/templates/meu-slackware/meu-slackware.d: cópia de arquivos de configuração + - /etc/simplepkg/templates/meu-slackware/meu-slackware.s: scripts de pós-instalação + - /etc/simplepkg/templates/meu-slackware/meu-slackware.perms: informações sobre arquivos + - /etc/simplepkg/templates/meu-slackware/meu-slackware.template: lista de pacotes + +Esses quatro componentes são suficientes para armazenar todas as características de uma instalação +de slackware: a lista de pacotes controla o software instalado (a partir do conteúdo da pasta +/var/log/packages), a cópia dos arquivos de configuração controla as personalizações feitas para o uso +dos aplicativos e os scripts de pós-instalação cuidam de qualquer rotina que precisa ser realizada +exatamente após a instalação do sistema. Já o arquivo de informações sobre arquivos contém as permissões, +o dono/a e grupo de cada arquivo de configuração presente no template. + +Se você quiser criar um template a partir de uma instalação de slackware presente numa outra partição +do sistema que não seja a raíz, basta usar um comando do tipo + + templatepkg -c meu-slackware /mnt/slackware + +onde /mnt/slackware é o local onde o sistema alternativo está instalado. Após criado, o template possuirá +apenas a lista de pacotes contendo o nome dos aplicativos instalados no seu sistema. Como a pasta +/var/log/packages não preserva a ordem de instalação dos pacotes, então talvez você queira editar manualmente +a lista de pacotes de um template. Para isso, use o comando + + templatepkg -e meu-slackware + +Para adicionar um arquivo de configuração no seu novo template, basta dar um comando como + + templatepkg -a meu-slackware /etc/hosts + +Isso adicionará o arquivo /etc/hosts no template "meu-slackware". Além de salvar o arquivo e copiá-lo +automaticamente quando você instalar seu sistema, o simplepkg ainda pode tomar conta de qualquer alteração +que o /etc/hosts sofrer no sistema, seja mudança no conteúdo do arquivo, dono ou permissão. Se você ainda +estiver armazenando seus templates num repositório svn (o que veremos a seguir), o simplepkg pode ainda +manter um histórico completo das alterações do arquivo. + +ATENÇÂO: evite ao máximo deixar arquivos contendo senhas ou chaves privadas num template. O lugar mais +adequado para deixar esse tipo de coisa é num backup seguro. + +Criando jaulas e replicando instalações +--------------------------------------- + +Uma vez que um template foi criado com uma lista de pacotes e opcionalmente com arquivos de configuração +e scripts de pós-instalação (que serão detalhados a seguir), você pode replicar sua instalação de slackware +utilizando o comando + + mkjail jaula meu-slackware + +Isso cria uma nova árvore do slackware em /vservers/jaula contendo todos os pacotes e arquivos de configuração +do template "meu-slackware". A instalação dos pacotes será feita pelo aplicativo simplaret, que deve estar +configurado corretamente e cuja configuração padrão deve funcionar para a maioria dos casos. + +Se você quiser instalar essa jaula em outro local que não seja a pasta /vservers (esse local padrão pode ser +mudado pelo arquivo de configuração do simplepkg), basta usar um comando do tipo + + ROOT=/mnt mkjail hda2 meu-slackware + +O comando acima faz exatamente o que você está pensando: replica sua instalação slackware em /mnt/hda2, +dispensando totalmente o programa de instalação do slackware! + +Caso nenhum template for especificado, o mkjail utiliza o template /etc/simplepkg/default. O simplepkg já vem +com alguns templates padrões, presentes em /etc/simplepkg/defaults/templates. + +Scripts de pós-instalação +------------------------- + +Opcionalmente, é possível manter scripts de pós-instalação num template. Tais script são executados exatamente +após a instalação de uma jaula e cópia de arquivos de configuração pelo mkjail. Para criar ou editar um script +de pós-instalação, use um comando como + + templatepkg -b meu-slackware nome-do-script.sh + +Isso adicionará o script nome-do-script.sh no template "meu-slackware". O mkjail passa dois argumentos para +cada script de pós-instalação: a pasta superior e o nome da jaula ("/mnt" e "hda2" no nosso exemplo anterior). +Assim, um exemplo de script seria algo como + + #!/bin/bash + chroot $1/$2/ sbin/ldconfig + +Listando o conteúdo de um template +---------------------------------- + +Para listar os templates disponíveis ou o conteúdo de um template, use comandos como + + templatepkg -l + templatepkg -l meu-slackware + +Removendo arquivos de um template +--------------------------------- + +Analogamente à forma como se adicona arquivos num template, removê-los pode ser feito com o seguinte comando: + + templatepkg -d meu-slackware /etc/hosts + +Isso remove o arquivo /etc/hosts do template "meu-slackware". + +Apagando um template +-------------------- + +Para apagar um template, basta utilizar um comando como + + templatepkg -r meu-slackware + +Atualizando um template +----------------------- + +Agora que já abordamos as opções do templatepkg, é hora de visitarmos um outro aplicativo, desta vez utilizado +para manter um template atualizado. O jail-commit é um script que copia as alterações dos arquivos (conteúdo, +propriedade e permissões) de um template a partir do conteúdo de uma jaula ou instalação. + +Por exemplo, caso se queira copiar as alterações da jaula /mnt/hda2 no template "meu-slackware", basta usar o +comando + + jail-commit /mnt/hda2 meu-slackware + +Além da lista de pacotes do template "meu-slackware" ser atualizada de acordo com a lista de pacotes presente +em /mnt/hda2/var/log/packages, todos os arquivos de configuração presentes no template "meu-slackware" serão +comparados com os correspondentes da pasta /mnt/hda2 e as diferenças são copiadas para o template. Da mesma +forma, as permissões e informação de dono/grupo dos arquivos também é atualizada no template. + +O comando jail-commit possibilita que um template sempre esteja atualizado e refletindo a configuração atual +de uma instalação de slackware. Se você quiser atualizar apenas a lista de pacotes de um template, porém, use + + templatepkg -u meu-template + +Para facilitar ainda mais o controle das alterações do sistema, existe ainda uma facilidade do arquivo +/etc/simplepkg/jailist. Esse arquivo serve, além de outros propósitos descritos na documentação do simplaret, +para que o jail-commit saiba de antemão quais são as instalações de sistema do tipo Slackware presentes numa +máquina, além da instalação principal na raíz do sistema. + +Suponha que uma máquina possua duas instalações de slackware, além da principal (raíz): + + - /mnt/slackware-1 usando o template "slackware-1" + - /mnt/slackware-2 usando o template "slackware-2" + +Se o arquivo /etc/simplepkg/jailist contiver as seguintes linhas, + + /mnt/slackware-1 + /mnt/slackware-2 + +então o comando + + jail-commit + +atualizará o template "slackware-1" de acordo com o conteúdo da jaula /mnt/slackware-1 e o template "slackware-2" +com o conteúdo da jaula /mnt/slackware-2. Se, além desses dois templates, existir um outro de nome "main", então +o jail-commit sem argumentos também copiará as atualizações da instalação raíz, deixando-as no template "main". + +Você pode inclusive colocar uma entrada no crontab do tipo + + 20 4 * * * jail-commit + +para que seus templates sejam atualizados diariamente. Se você ainda possui o envio de emails configurado na sua +máquina, então a saída do jail-commit será enviada pelo cron diariamente para seu email, contendo diffs das alterações +de arquivos de configuração a lista de pacotes adicionados ou removidos no sistema. + +Restaurando arquivos de configuração numa jaula +----------------------------------------------- + +A operação contrária ao que o jail-commit faz também é possível: suponha que você mexeu na configuração do sistema +mas se arrependeu das alterações e deseja voltar a configuração para o modo como ela se encontra no seu template, +basta usar o comando + + jail-update /mnt/hda2 meu-slackware + +Armazenando as configurações no repositório Subversion +------------------------------------------------------ + +Para aumentar ainda mais a flexibilidade e o controle do conteúdo dos templates, é possível armazená-los num +repositório Subversion. Para isso, edite o arquivo /etc/simplepkg/simplepkg.conf e deixe o parâmetro de configuração +TEMPLATES_UNDER_SVN com o valor "yes". + +Depois, crie um repositório subversion para armazenar seus templates, usando algo como + + svnadmin create /var/svn/simplepkg --fs-type fsfs + +Com o repositório criado, basta importar seus templates com o comando + + templatepkg -e file:///var/svn/simplepkg + +A partir daí, o comando jail-commit enviará automaticamente todas as alterações dos templates para o repositório +subversion. Se, por outro lado, você quiser baixar as alterações dos templates que estão no repositório remoto +para sua cópia local, use o comando + + templatepkg -s + +Caso você queira importar uma pasta de templates de um repositório já existente, use + + templatepkg -i file:///var/svn/simplepkg + +onde file:///var/svn/simplepkg é o camninho do repositório. + +Atualização de jaulas +--------------------- + +A atualização de jaulas e sistemas instalados é feita através do simplaret e também utiliza o arquivo +/etc/simplepkg/jailist. Para mais informações a respeito, consulte a documentação do simplaret para mais detalhes. + +Arquiteturas e versões diferentes +--------------------------------- + +O simplepkg foi idealizado para permitir que um mesmo template possa ser usado para criar jaulas de +arquiteturas e versões diferentes de sistemas padrão slackware. A atualização desses sistemas também +é unificada. Essa possibilidade só é permitida se você usa o simplaret e não o swaret como ferramenta +de obtenção de pacotes. + +Por exemplo, para criar uma instalação de slackware 10.1 (assumindo que suas definições de repositórios +do /etc/simplepkg/repos.conf contenham locais com slack 10.1), basta usar o comando + + VERSION=10.1 mkjail minha-jaula template-servidor + +Arquiteturas diferentes também podem ser usadas. Se você está num sistema x86_64 e quer instalar um +slack 10.2 numa partição, experimente + + ARCH=i386 VERSION=10.2 ROOT=/mnt mkjail hda2 meu-slackware + +Note que os templates independem de arquitetura e versão, já que eles só contém nomes de pacotes, +arquivos de configuração e scripts. + +Criando um pacote de um template +-------------------------------- + +Se, por algum motivo, você quiser construir um pacote com o conteúdo de um template, experimente +o comando + + templatepkg -p nome-do-template + +No entanto, o simplepkg foi criado para que esse tipo de comportamento seja evitado, já que é mais +simples manter templates de configuração do que pacotes contendo a configuração de uma instalação. + +Construindo pacotes +------------------- + +Até aqui, apenas mostramos os aplicativos do simplepkg usados para a manutenção de instalações +de slackware. No entanto, uma das outras finalidades desta suíte é a construção de pacotes, o +que é feita pelo programa createpkg, Como dito anteriormente, o createpkg: baixa, compila e +empacota software de acordo com scripts presentes num repositório de scripts, funcionando com +um gerenciador de "ports" para slackware. + +O createpkg pode funcionar com qualquer tipo de script de construção de pacotes (SlackBuilds) +mas funcionará melhor se os mesmos seguirem o padrão descrito na página + + http://slack.sarava.org/wiki/Main/SlackBuilds + +Especificamente, o createpkg foi desenvolvido para utilizar os slackbuild disponíveis em +http://slack.sarava.org/slackbuilds. O createpkg trabalha com repositórios do tipo subversion. + +Para obter os scripts do repositório do slack.sarava.org, digite + + createpkg --sync + +Em seguida, você pode listas todos os scripts disponíveis: + + createpkg --list + +Para buscar por um pacote, use + + createpkg --search latex2html + +No caso, a busca é feita pelo SlackBuild do aplicativo "latex2html". Suponha agora que você queira +construir o pacote desse aplicativo: + + createpkg latex2html + +O pacote resultante estará na pasta /tmp ou no valor especificado pela variável de ambiente $REPOS. +Para criar e também instalar o pacote, basta + + createpkg --install latex2html + +Se o pacote possuir dependências listadas num arquivo slack-required e que não estiverem instaladas +no sistema, o createpkg tentará processá-las uma a uma antes de tentar construir o pacote desejado: +se as dependências não forem encontradas no repositório de scripts, então o createpkg tentará +baixá-las de um repositório binário através do simplaret. Se você não quiser que a resolução de +dependências seja seguida, use a opção --no-deps. + +Para mais detalhes de funcionamento, experimente o comando + + createpkg --help + +ou então acesse a página http://slack.sarava.org/wiki/Main/SlackBuilds. + +Aplicativos auxiliares +---------------------- + +O simplepkg acompanha ainda alguns aplicativos auxiliares: + + - lspkg: lista pacotes instalados + - rebuildpkg: reconstrói um pacote a partir de sua entrada no /var/log/packages + - repos: cria e mantém repositórios + - mkbuild: cria scripts de construção de pacotes + +O comando lspkg é um utilitário simples para a visualização de pacotes instalados no sistema. Já o +rebuildpkg ajuda a recuperar pacotes instalados cujo tgz original foi perdido. O comando rebuildpkg +reconstrói um pacote a partir de uma entrada no /var/log/packages. O comando + + rebuildpkg coreutils + +reconstrói um pacote do coreutils usando os arquivos e as metainformações listadas no arquivo +do /var/log/packages/ correspondente ao coreutils. + +Por fim, os scripts repos e mkbuild são os que se encontram na etapa de maior desenvolvimento: repos +cria um repositório de pacotes a partir de uma pasta contendo pacotes do tipo pkgtool e o mkbuild +é um aplicativo para auxiliar a criação de scripts de construção de pacotes que podem ser utilizados +sozinhos ou pelo o createpkg. + +Parâmetros de configuração +-------------------------- + +O arquivo de configuração do simplepkg é o /etc/simplepkg/simplepkg.conf. Ele contém parâmetros de +configuração de todos os scripts, porém neste texto não trataremos das opções específicas ao simplaret, +as quais tem uma seção específica no artigo correspondente. + + - JAIL_ROOT: pasta padrão onde as jaulas são criadas pelo mkjail. Valor padrão: "/vservers". + + - ADD_TO_JAIL_LIST: controla se uma jaula criada pelo mkjail deve ser adicionada automaticamente + no arquivo /etc/simplepkg/jailist. O valor padrão é "1" (habilitado). + + - TEMPLATES_UNDER_SVN: indica se os templates estão armazenados num repositório subversion. + O valor padrão é "no" (não). + + - TEMPLATE_FOLDER: indica qual é a pasta de templates. O valor padrão é "/etc/simplepkg/templates" + e não é recomendável alterá-lo. + + - TEMPLATE_STORAGE_STYLE: controla a forma de armazenamento de templates. O valor padrão é + "own-folder" e essa opção apenas deve ser modificada se você armazena seus templates num + formato antigo do simplepkg e deseja manter compatibilidade. + +Vale lembrar que todas as opções booleanas (isto é, que podem ser apenas habilitadas ou desabilitadas) +do simplepkg.conf tem os seguintes valores permitidos: "1" e "yes" para habilitado e "0" ou "no" para +desabilitado. + +Mais informações +---------------- + +O simplepkg foi escrito por Silvio Rhatto (rhatto at riseup.net) sob licença GPL e seu código fonte é +disponibilizado através do repositório subversion: + + svn checkout svn://slack.sarava.org/simplepkg + +O wiki de desenvolvimento: http://slack.sarava.org/wiki/Main/SimplePKG e o endereço da lista de discussão +utilizada para discussões sobre simplepkg ou mesmo distribuições e pacotes do tipo Slackware é +http://listas.sarava.org/wws/info/slack. + diff --git a/tags/0.5.1/doc/README.simplaret b/tags/0.5.1/doc/README.simplaret new file mode 100644 index 0000000..397d913 --- /dev/null +++ b/tags/0.5.1/doc/README.simplaret @@ -0,0 +1,319 @@ +simplaret: simplepkg retrieval tool +----------------------------------- + +Simplaret is a simplepkg tool used to download packages from local and remote repositories. +With simplaret, one can grab packages for all archictectures and versions of slackware-like +distributions that follows the mirror guidelines, allowing an easy management all +jails and slackware installations in a machine, no matter wich arquiteture or version +each one has. + +It was inspired in swaret behavior but don't tries to get its complexity level, but +execute package download in a different way, where the local repository is organized +by archictecture and version. It can also search for packages. It runs on top of pkgtool +and is totally non-instrusive and can search, add, remove and upgrade packages. + +Documentation +------------- + +The always updated english documentation is hosted at http://slack.sarava.org/simplaret-en + +Downloading and installing +-------------------------- + +Simplaret comes with simplepkg, wich installation and configuration is detailed at +http://slack.sarava.org/simplepkg. Simplaret uses /etc/simplepkg/simplepkg.conf for its definitions +and /etc/simplepkg/repos.conf for repository information. The default configuration should work +for almost everyone. + +Using simplaret +--------------- + +Simplaret stores its data in system wide folders. Then, some funcionality will just be available +if its run with root user capabilities. The first thing you need to do with simplaret is to fetch +repository metadata, using + + simplaret --update + +or simply + + simplaret update + +as simplepkg supports both command line behaviour (--update or just update). After that, you can +search for packages using commands like + + simplaret search ekiga + +The result should be something like + + REPOS repository sarava, arch: i386, version: 11.0: ekiga-2.0.5-i586-1rd.tgz + +As we'll see afterwards, "REPOS" means the repository type, "sarava" is the repository name, +"arch" is the package architecture (i386 in this case) and "version" is the repository version +(11.0 in this case). + +To install this package, just type + + simplaret install ekiga + +By default, if simplaret finds in the repository a slack-required file for this package (i.e, the +file ekiga.slack-required in the same folder of the binary package) then it will try to install +all unmet dependencies. This default behaviour can be disabled through config file parameters. + +If you just want to download the package, type + + simplaret get ekiga + +In the case of simplaret finds more than one package with the same name, it will get in the order +that the "search" option shows them. The search precedence can also be defined by config file +parameters. For instance, the command + + simplaret search kernel-generic + +can return something like + + ROOT repository sarava, arch: i386, version: 11.0: kernel-generic-2.6.17.13-i486-1.tgz + ROOT repository sarava, arch: i386, version: 11.0: kernel-generic-2.6.18-i486-1.tgz + +So the command + + simplaret install kernel-generic + +will attempt to install the package "kernel-generic-2.6.17.13-i486-1.tgz" and not the file +"kernel-generic-2.6.18-i486-1.tgz". If you want to force simplaret to get and specific package, +use its complete file name: + + simplaret install kernel-generic-2.6.18-i486-1.tgz + +If a package is already installed in the system, the --install option will try to upgrade it +if the version or build number between the installed package and the one in the repository +are different. So the command + + simplaret install simplepkg + +updates simplepkg in the case there's a new version. To remove a package, type + + simplaret remove nome-do-pacote + +That's just an alias for the standard removepkg command. + +Simplaret stores downloaded packages in a system folder that defaults to /var/simplaret. +As you get more and more packages, simplaret will consume more space ir your disk. To +erase your local repository folder, use the command + + simplaret purge + +This will erase just the packages from the current arch and version. Details about how to +erase the repository for different arch and version are in another session. + +You can also force simplaret to erase just old packages. The following command erases just +packages older than six weeks or more: + + simplaret purge -w 3 + +Downloading patches and upgrading the system +-------------------------------------------- + +Simplaret hasn't just about package installing and removal, it has two more important +features: patches retrieval and application. Assuming that the patches repository of +your slackware flavour is correctly configured (what should work with almost everyone +with the default configuration), you can fetch the available patches using the command + + simplaret get-patches + +If you don't just donwload but also apply those patches, use + + simplaret upgrade + +Working with more than one architecture and version +--------------------------------------------------- + +Until now we just looked what is the requirement for all package management system: package +retrieval, installation, search, upgrade and dependency resolution. What makes simplaret +different from another tools is the ability to deal with different architectures and versions +and slackware installations. + +The features descibed in this section will just make sense after you read the next section, when +we'll talk about multiple slackware installations and jails in the same computer. + +Suppose you're running Slackware (arch i386) bit wants to update the package list from Slamd64 +version 11.0 (arch x86_64). To do that, just type + + ARCH=x86_64 VERSION=11.0 simplaret update + +This command grabs the Slamd64 package list without confliting in any way with the standard and +already downloaded i386 Slackware package list. This doesn't happens because simplaret stores +metadata from different archs and versions at different folders. + +Its optional to pass ARCH and VERSION environment variables to simplaret. If one or none of them +was specified, simplaret uses the standar system value, obtained from the file /etc/slackware-version, +or uses config parameters to do that. + +As an example, to search for a package in the arch powerpc (Slackintosh) version 11.0, just type + + ARCH=powerpc VERSION=11.0 simplaret search package-name + +All command previously mentioned can work that way, except those that install or remove packages as +its dangerous to mix packages from different archs and versions in the same system. + +Working with multiple installations +----------------------------------- + +The previously section mentions a feature that just makes sense in systems where there's more than +one slackware-like installation using different archs and versions. + +Say you have a x86_64 machine with three installed systems: + + - Slamd64 11.0 at the root folder + - Slackware 11.0 at /mnt/slackware-1 + - Slackware 10.2 at /mnt/slackware-2 + +In the case of package install or patch retrieval and application, simplaret supports the environment +variable ROOT to specify which folder simplaret should look for a system. + +Then, to install a package at /mnt/slackware-1, just type + + ARCH=i386 VERSION=11.0 simplaret update + ROOT=/mnt/slackware-1 simplaret install package-name + +The first command just updates the package list and the second makes simplepkg install the package with +using /mnt/slackware-1 arch and version. If you want to do the same at /mnt/slackware-2, use the analogous +command + + ARCH=i386 VERSION=10.2 simplaret update + ROOT=/mnt/slackware-2 simplaret install package-name + +There's also a feature to make patch retrieval and application with just one command, using the file +/etc/simplepkg/jailist. This file is used by simplepkg's mkjail script to store with jails you have +on your system but is also used by simplaret to upgrade all jails with just one command. + +Considering that your box has the three previously mentioned slackware installation. Then, to add +/mnt/slackware-1 and /mnt/slackware-2 in the automatic upgrade list, add the following lines in your +/etc/simplepkg/jailist (without spaces): + + /mnt/slackware-1 + /mnt/slackware-2 + +The root system doesn't need to be added in this file. Then, you can get the patches for all your three +systems with the command + + simplaret get-patches + +To get the patches and/or apply them in all jails (including the root system), use + + simplaret upgrade + +This feature makes easier to keep all your installations always upgraded. + +The repos.conf file +------------------- + +Now that we just talked about all simplaret features, its time to take a tour at its configuration +files. The first one we'll say about is the repository definition file, /etc/simplepkg/repos.conf. + +If you don't mind to make an advanced simplaret usage, then probably you can just leave this section +as the default config should work for almost all standard situations and you'll just need to edit +repos.conf to change repository priorities. + +The repos.conf file contains one repository definition per line using the following syntax: + + TYPE[-ARCH][-VERSION]="name%URL" + +The content in brackets are optional depending on the repository type as we'll see later in this +section. The repository types supported by simplaret are: + + - PATCHES: used for repositories containing patches and which file metadata is the file + FILE_LIST instead the standard FILELIST.TXT; example: + + PATCHES-i386-11.0="sarava%http://slack.sarava.org/packages/slackware/slackware-11.0/patches/" + + This defines a patches repository for arch i386 (official Slackware), version 11.0 and named + as "sarava". + + Its optional to have a PATCHES definition in order to get patches: the ROOT repository definition + just take care of that and you'll just need to use a PATCHES definition if you want to give + precedence to some patches repository over all other definition types. + + - ROOT: this type specifies the default slackware-like repository, where the content is sorted + by version. An official slackware repository then is defined as + + ROOT-i386="tds%http://slackware.mirrors.tds.net/pub/slackware/" + + ROOT repositories needs just the arch definition, a name and an URL. In the previous case, + we have a ROOT repository called "tds". It doesn't need any version information as its already + considers tha the content is sorted in folders like + + http://slackware.mirrors.tds.net/pub/slackware/slackware-10.2/ and + http://slackware.mirrors.tds.net/pub/slackware/slackware-11.0/ + + - REPOS: this repository type ir arch and version oriented, like + + REPOS-i386-11.0="sarava%http://slack.sarava.org/packages/slackware/slackware-11.0/" + + In the above case, a repository called "sarava" is defined using arch i386 and version 11.0 + with URL http://slack.sarava.org/packages/slackware/slackware-11.0/. This repository type is + recommended when using non-official repositories. + + - NOARCH: the last type is used to define repositories where packages are arch and version + independent, like + + NOARCH="sarava%http://slack.sarava.org/packages/noarch" + +In any repository type, the supperted URL schemes are http://, ftp:// or file:// (for local +repositories). + +As simplaret supports more than one repository definition for each type, arch or version, each +definition has its own name. Definitions can have the same name just if they're dont use the +same repository type and/or arch and version. + +There's also a priority rule between the repository types wich defines a precedence order. +Repositories are searched according the following order: + + - PATCHES has the highest priority: if a package from a given arch and version is not found + in the first (if existent) PATCHES definition, then the next one is searched until all + PATCHES definitions are searched. + + - Then, the package is searched in all ROOT defintions in the order they appear at repos.conf. + + - The next searched repository type is REPOS in the specified arch an version, in the order + they appear at repos.conf. + + - At last, NOARCH type is searched in the order they're defined. + +In the case you're issuing an upgrade or just geting patches, simplaret by default will just +search in PATCHES and ROOT definitions. + +At REPOS and ROOT is also possible to specify its internal search order according its subfolders. + +Configuration file simplepkg.conf +--------------------------------- + +Simplaret also stores its configurations inside simplepkg's configuration file +/etc/simplepkg/simplepkg.conf. This file is well commented and you should find there a description +of all supported options. + +But why use that? +----------------- + +You may ask why someone wishes to use such tool. + +Simplaret was written with a *x86 environment in mind, where lots of jails with different archs +and versions are installed. Suppose a x86_64 with the following chroots installed: + + - slamd64 11.0 + - slackware 10.0 + - slackware 11.0 with additional i686 packages + - uSlack (i386 uClibc) + +Keep all this stuff update manually is really a headache. Simplaret just tries to make it trivial. + +Additional information +---------------------- + +Simplaret was written by Silvio Rhatto (rhatto at riseup.net) and is released under GPL license. The code +can be obtained from the subversion repository: + + svn checkout svn://slack.sarava.org/simplepkg + +Simplepkg's wiki is http://slack.sarava.org/wiki/Main/SimplePKG and its mailing list address is +http://listas.sarava.org/wws/info/slack. + diff --git a/tags/0.5.1/doc/README.simplaret.pt_BR b/tags/0.5.1/doc/README.simplaret.pt_BR new file mode 100644 index 0000000..672eb8e --- /dev/null +++ b/tags/0.5.1/doc/README.simplaret.pt_BR @@ -0,0 +1,445 @@ +simplaret: ferramenta para obtenção de pacotes +---------------------------------------------- + +O simplaret é a ferramenta do simplepkg utilizada para obter pacotes de repositórios locais +ou remotos. Com ele, você pode não só baixar pacotes do seu sistema Slackware como também pode +baixar de qualquer versão ou arquitetura cujo repositório siga os Mirror Guidelines do Slackware, +como por exemplo Slamd64 e Slackintosh, permitindo que você gerencie facilmente todas as suas +jaulas e instalações de Slackware, independentemente da arquitetura ou versão que elas utilizem. + +Além da obtenção, o simplaret ainda pode fazer a instalação, a remoção ou a atualização dos +pacotes de um sistema e também das demais jaulas existentes numa máquina. + +O simplaret é totalmente não-intrusivo no sistema e roda sobre o pkgtool. + +Documentação +------------ + +A documentação atualizada do simplaret se encontra em http://slack.sarava.org/simplaret. + +Obtendo e instalando +-------------------- + +O simplaret acompanha o simplepkg e por isso sua instalação é feita baixando o pacote do simplepkg +em http://slack.sarava.org/packages/noarch/ e em seguida instalando-o com o comando + + installpkg simplepkg-VERSAO-noarch-BUILD.tgz + +A partir daí você já pode utilizar o simplaret para baixar pacotes dos repositórios padrão ou +então alterar a lista de repositórios do arquivo /etc/simplepkg/repos.conf ou a configuração +do aplicativo pelo arquivo /etc/simplepkg/simplepkg.conf. + +Usando o simplaret +------------------ + +Em geral, como o simplaret armazena as informações em pastas do sistema, algumas funcionalidades +só estarão disponíveis quando o mesmo é rodado pelo superusuário do sistema. + +Antes de explorar todas as funcionalidades do simplaret, é necessário atualizar a lista de +pacotes para sua arquitetura e versão, o que pode ser feito com o comando + + simplaret --update + +ou simplesmente + + simplaret update + +já que o simplaret suporta que suas opções básicas de linha de comando sejam passas precedidas +por dois hífens ou não (--update ou update). + +Depois de atualizar a lista de pacotes, experimente buscar por um pacote com um comando do tipo + + simplaret search ekiga + +O resultado pode ser algo do tipo + + REPOS repository sarava, arch: i386, version: 11.0: ekiga-2.0.5-i586-1rd.tgz + +Como veremos adiante, "REPOS" significa o tipo de repositório, "sarava" é o nome do +repositório, "arch" mostra a arquitetura do pacote e do repositório (i386, no caso) +e "version" a versão do repositório (11.0, no caso). + +Para instalar esse pacote, basta o comando + + simplaret install ekiga + +Por padrão, se o simplaret encontrar no repositório um arquivo slack-required referente +ao pacote en questão (ou seja, um arquivo ekiga.slack-required na mesma pasta que o pacote +do ekiga, neste caso), então o simplaret tentará instalar todos os requisitos contidos nesse +slack-required, caso já não estejam instalados no sistema. Essa resolução de dependências +automática pode, no entanto, ser desabilitada através de um parâmetro de configuração, como +veremos a seguir. + +Se você apenas quiser baixar o pacote, digite apenas + + simplaret get ekiga + +No caso do simplaret encontrar mais de um pacote com o mesmo nome, ele baixará na ordem que +a opção "search" listá-los, sendo que essa precedência é definida de acordo com a ordem em +que os repositórios estão listados no arquivo de configuração. Por exemplo, o comando + + simplaret search kernel-generic + +pode retornar algo como + + ROOT repository sarava, arch: i386, version: 11.0: kernel-generic-2.6.17.13-i486-1.tgz + ROOT repository sarava, arch: i386, version: 11.0: kernel-generic-2.6.18-i486-1.tgz + +Assim, o comando + + simplaret install kernel-generic + +instalará o pacote "kernel-generic-2.6.17.13-i486-1.tgz" ao invés do pacote +"kernel-generic-2.6.18-i486-1.tgz". Caso você queira forçar a instalação do +segundo pacote, basta especificá-lo com o nome completo: + + simplaret install kernel-generic-2.6.18-i486-1.tgz + +Se um pacote já estiver instalado no sistema, a opção install fará o upgrade do mesmo, caso +a versão ou o build number do pacote presente no repositório for diferente da instalada no +sistema. Assim, o comando + + simplaret install simplepkg + +atualiza o simplepkg caso haja uma nova versão disponível nalgum repositório. + +Para remover um pacote, digite + + simplaret remove nome-do-pacote + +o que na verdade é apenas uma chamada indireta ao removepkg. + +O simplaret armazena pacotes baixados de repositórios numa pasta local do sistema, que +por padrão é /var/simplaret. Conforme você vai baixando e instalando pacotes, essa pasta +tende a crescer e ocupar muito espaço. Para apagar os pacotes, basta usar o comando + + simplaret purge + +Isso apagará apenas os pacotes da arquitetura e versão usadas atualmente. Detalhes de +como apagar os pacotes de todas a arquiteturas e versões serão dados numa seção seguinte. + +Você também pode forçar o simplaret a apagar apenas pacotes antigos. O comando a seguir +apaga apenas os pacotes baixados a três semanas ou mais (ou seja, os pacotes baixados a +menos de três semanas continuam armazenados): + + simplaret purge -w 3 + +Baixando patches e atualizando o sistema +---------------------------------------- + +O simplaret possui, além do básico do gerenciamento de pacotes, duas funcionalidades +adicionais: a obtenção e a aplicação de patches (pacotes contendo atualizações e +correções de segurança). + +Assumindo que os repositórios contendo patches para sua distribuição do tipo Slackware +estejam corretamente configurados, o que ocorre com a configuração padrão que acompanha +o simplepkg e que veremos a seguir como alterá-la, você pode baixar os patches disponíveis +para o seu sistema com o comando + + simplaret get-patches + +Se você quiser não só baixar mas também atualizar seu sistema, isto é, fazer um upgrade com +os patches disponíveis, use + + simplaret upgrade + +Trabalhando com múltiplas arquiteturas e versões +------------------------------------------------ + +Até aqui vimos apenas o que é a obrigação de qualquer sistema de gerenciamento de pacotes possuir: +obtenção de pacotes, instalação, busca e atualização do sistema. O que diferencia o simplaret das +outras ferramentas, além do esquema de resolução de dependências, é sua capacidade de lidar +simultaneamente com múltiplas arquiteturas, versões e até instalações de sistemas do tipo Slackware. + +O uso dos seguintes comandos só fará sentido à luz da próxima seção, onde trataremos a respeito de +múltiplas instalações e jaulas num mesmo computador, porém é um pré-requisito para entendê-la. + +Supondo que você esteja rodando Slackware (arquitetura i386) mas que queira atualizar a lista de +pacotes do sistema Slamd64 versão 11.0 (arquitetura x86_64), basta usar o comando + + ARCH=x86_64 VERSION=11.0 simplaret update + +Esse comando baixará a lista de pacotes para o Slamd64 sem conflitar de nenhuma forma com a lista +e os pacotes já baixados para o Slackware. Isso acontece porque o simplaret armazena as informações +e os pacotes de cada repositório em pastas próprias, organizadas de acordo com a arquitetura e versão. + +Passar as variaveis ARCH e VERSION para o simplaret é opcional. Se qualquer uma delas não foi especificada, +o simplaret utilizará o valor padrão do seu sistema, usualmente obtido do arquivo /etc/slackware-version +ou então especificada através do arquivo de configuração do simplepkg. + +Por exemplo, para pesquisar por um pacote da arquitetura powerpc (distribuição Slackintosh) na versão 11.0, +basta o comando + + ARCH=powerpc VERSION=11.0 simplaret search nome-do-pacote + +Todos os comandos apresentados anteriormente funcionarão dessa maneira, à exceção daqueles que instalam ou +fazer a atualização de pacotes, já que em geral é destrutivo misturar pacotes de arquiteturas e versões +diferentes num mesmo sistema. + +Trabalhando com múltiplas instalações +------------------------------------- + +A funcionalidade apresentada na seção anterior só faz sentido quando existirem sistemas, jaulas e/ou +vservers instalados num mesmo computador. + +Suponha que você possua uma máquina x86_64 com três sistemas instalados: + + - Slamd64 11.0 na raíz + - Slackware 11.0 em /mnt/slackware-1 + - Slackware 10.2 em /mnt/slackware-2 + +No caso da instalação de pacotes, da obtenção e aplicação de atualizações, o simplaret suporta a +variável de ambiente ROOT para especificar qual é a pasta na qual o simplaret deve buscar o sistema. + +Para instalar um pacote no Slackware contido em /mnt/slackware-1, basta usar os comandos + + ARCH=i386 VERSION=11.0 simplaret update + ROOT=/mnt/slackware-1 simplaret install nome-do-pacote + +O primeiro comando apenas atualiza a lista de pacotes e o segundo faz com que o simplaret baixe +o pacote da arquitetura e versão do sistema presente em /mnt/slackware-1 bem como efetue sua instalação. + +Para o caso da instalação em /mnt/slackware-2, o uso é análogo: + + ARCH=i386 VERSION=10.2 simplaret update + ROOT=/mnt/slackware-2 simplaret install nome-do-pacote + +Existe ainda uma facilidade para que a obtenção e aplicação de atualizações seja feita de forma única, +através do arquivo /etc/simplepkg/jailist. Esse arquivo serve, além de outros propósitos descritos na +documentação do simplepkg, para que o simplaret saiba de antemão quais são as instalações de sistema +do tipo Slackware presentes numa máquina, além da instalação principal na raíz do sistema. + +Considerando que a máquina possua as três instalações citadas no início deste tópico, a atualização +automática das mesmas pode ser feita quando o arquivo /etc/simplepkg/jailist contiver as seguintes +linhas (sem espaços no início de cada uma): + + /mnt/slackware-1 + /mnt/slackware-2 + +O sistema principal, contido na raíz do sistema, não precisa estar listado nesse arquivo. Se todas +as suas instalações de sistema do tipo Slackware estiverem constando corretamente no /etc/simplepkg/jailist, +o seguinte comando baixará as atualizações disponíveis para todas elas, incluindo o sistema contido na raíz: + + simplaret get-patches + +Analogamente, o seguinte comando baixará e/ou aplicará todas as atualizações disponíveis em todas as +instalações, incluindo o sistema contido na raíz: + + simplaret upgrade + +Desse modo, o gerenciamento de pacotes numa máquina que contenha mais de uma instalação do tipo Slackware +fica unificada e consequentemente simplificada. + +O arquivo repos.conf +-------------------- + +Agora que o comportamento do simplaret foi delineado, é importante descrever o arquivo de definição de +repositórios, o /etc/simplepkg/repos.conf. Se você não pretende fazer um uso avançado do simplaret, +provavelmente pode deixar de ler esta e a próxima seção, já que para o uso corriqueiro do simplaret +você provavelmente não precisará alterar seu repos.conf, a não ser que queira mudar o espelho de download +dos seus pacotes ou montar um esquema avançado para a escolha e priorização de repositórios. + +O arquivo /etc/simplepkg/repos.conf contém uma definição de repositório por linha e a sintaxe de cada +uma delas é: + + TIPO[-ARQUITETURA][-VERSAO]="nome%URL" + +O conteúdo demarcado por colchetes é opcional dependendo do tipo de repositório, como veremos a seguir. +Os tipos de repositório aceitos pelo simplaret são: + + - PATCHES: definição para repositórios que contenham patches (pacotes de atualização) e cuja lista + de arquivos é FILE_LIST e não FILELIST.TXT; exemplo: + + PATCHES-i386-11.0="sarava%http://slack.sarava.org/packages/slackware/slackware-11.0/patches/" + + No caso da definição acima, temos um repositório de patches para a arquitetura i386 (distribuição + Slackware), versão 11.0 e o nome dado ao repositório é "sarava". + + Possuir uma definição do tipo PATCHES é opcional para ter acesso às atualizações: a definição + de repositório ROOT, que veremos em seguida, já lida com patches: o tipo de repositório PATCHES + serve apenas se você quiser utilizar algum repositório não-oficial como fonte de patches + prioritária, já que repositório PATCHES são pesquisados pelo simplaret antes de qualquer outro. + + Em resumo, se você não tiver um bom motivo para usar esse tipo de repositório, evite-o. + + - ROOT: são tipos de repositórios cujo conteúdo está dividido por versão. O exemplo tradicional + deste caso é o próprio repositório oficial das distribuições: + + ROOT-i386="tds%http://slackware.mirrors.tds.net/pub/slackware/" + + Repositórios ROOT necessitam apenas de uma definição de arquitetura, um nome e uma URL. No caso + acima, temos a definição de repositório ROOT de nome "tds", ou seja, não há definição de versão, + já que o simplaret considerará que a versão desejada está numa subpasta dessa URL. Ou seja, + definições ROOT implicam que as pastas contendo pacotes de cada versão estejam bem separadas, + ou seja, pastas como http://slackware.mirrors.tds.net/pub/slackware/slackware-10.2/ e + http://slackware.mirrors.tds.net/pub/slackware/slackware-11.0/. + + - REPOS: este tipo de repositório é orientado a arquitetura e versão, como por exemplo + + REPOS-i386-11.0="sarava%http://slack.sarava.org/packages/slackware/slackware-11.0/" + + No caso acima, um repositório de nome "sarava" é definido para a arquitetura i386 e versão + 11.0 com a URL http://slack.sarava.org/packages/slackware/slackware-11.0/. Esse tipo de definição + é recomendado para repositórios não-oficiais. + + - NOARCH: o último tipo de definição é usado para repositórios cujos pacotes são independentes + de arquitetura e versão da distribuição. Como exemplo temos um repositório do Projeto Slack: + + NOARCH="sarava%http://slack.sarava.org/packages/noarch" + +Em qualquer tipo de repositório, a URL pode ser do tipo http://, ftp:// ou file:// (para repositórios +locais). + +Como podem haver mais de uma definição de repositório para cada tipo, versão e/ou arquitetura, +as mesmas são diferenciadas de acordo com o nome. Definições de repositório podem ter nomes idênticos, +desde que se refiram a tipo de repositório e/ou arquitetura e versão diferentes. + +Existe ainda uma prioridade dentre tipos de repositório e ordens de precedência. Numa pesquisa, +repositórios são pesquisados de acordo com a seguinte ordem: + + - PATCHES tem prioridade mais alta: caso um pacote de uma dada arquitetura e versão não seja + encontrado no primeiro repositório PATCHES do repos.conf, o próximo repositório definido na + ordem em que ele aparece no arquivo é pesquisado, e assim por diante. + + - Em seguida, pacotes são procurados nas definições ROOT da arquitetura em questão, na ordem + em que aparecem no repos.conf. + + - Depois, são os pacotes de repositórios REPOS daquela arquitetura e versão são pesquisados, + na ordem em que aparecem no repos.conf. + + - Por fim, repositórios NOARCH são pesquisados, na ordem em que são definidos. + +Em resumo, o simplaret tem uma ordem de precedência e execução de repositórios e para busca e obtenção +de pacotes: pacotes são exibidos de acordo com a ordem e precedência descritas acima. No caso da ontenção +de pacotes, o primeiro repositório que possuí-lo será utilizado, isto é, caso o pacote não for solicitado +explicitamente com seu nome de arquivo completo mas sim apenas com seu nome. + +No caso da obtenção de patches, por padrão apenas repositórios do tipo PATCHES e ROOT são pesquisados, +a não ser que isso seja configurado como contrário. + +Em repositórios do tipo REPOS e ROOT ainda é possível, através de parâmetros de configuração, explicitar +a ordem de pastas que são pesquisadas dentro dos repositórios, algo que veremos a seguir e facilita no +caso do usuário estar interessado em dar prioridade para aplicativos em fase de testes (usualmente +armazenados na pasta testing/) ou pacotes antigos (pasture). + +Parâmetros de configuração do simplepkg.conf +-------------------------------------------- + +Nesta seção os parâmetros do arquivo de configuração /etc/simplepkg/simplepkg.conf relevantes ao +simplaret estão descritos. Para uma lista completa de todos os parâmetros disponíveis, consulte o +simplepkg.conf contido no pacote do simplepkg. Aqui estão descritos apenas os principais, que são: + + - STORAGE: local de armazenameto dos pacotes baixados e das informações de repositório. + O valor padrão é /var/simplaret/packages. + + - PATCHES_DIR: local de armazenamento de pacotes que são patches (atualizações), isto é, o + local de armazenamento de pacotes de repositórios do tipo PATCHES (e eventualmente de + patches encontrados em repositórios do tipo ROOT, como veremos a seguir). O valor padrão + é /var/simplaret/patches. + + - SIMPLARET_DOWNLOAD_FROM_NEXT_REPO: indica se o simplaret deve tentar baixar um pacote do + próximo repositório (caso exista) quando o download do repositório atual tiver falhado. + Valores possíveis são "1" ou "yes" para habilitar a opção (que é o comportamento padrão) + ou "0" ou "no" para desabilitá-la. + + - SIMPLARET_PURGE_PATCHES: indica se o conteúdo da pasta de patches também deve ser apagado + quando o comando "simplaret --purge" é chamado. Use "yes" ou "1" para habilitar e "no" ou + "0" para desabilitar. O valor padrão é "1". + + - SIMPLARET_PURGE_WEEKS: controla o número de semanas a partir do qual o simplaret irá apagar + pacotes quando chamado com o comando "simplaret --purge", o que é equivalente a usar o + comando "simplaret --purge -w N". O valor padrão é "3". Para desabilitar essa opção, atribua + o valor "0". + + - PASSIVE_FTP: Indica se o simplaret deve fazer as transferências de FTP no modo passivo. + O valor padrão é "1" (habilitado). + + - HTTP_TOOL: especifica qual a ferramenta para obtenção de arquivos via protocolo HTTP. + As opções disponíveis são "curl" e "wget", sendo que a opção padrão é "curl". + + - FTP_TOOL: especifica qual a ferramenta para obtenção de arquivos via protocolo FTP. + As opções disponíveis são "curl", "wget" e "ncftpget", sendo que a opção padrão é "curl". + + - CONNECT_TIMEOUT: tempo máximo de espera para uma conexão de rede, dado em segundos. + O valor padrão é "20". + + - ROOT_PRIORITY: especifica a ordem de prioridades das pastas de repositórios do tipo + ROOT numa pesquisa. O valor padrão é "patches slackware extra testing pasture", + indicando que a pasta de patches tem precedência sobre todas as outras no repositório, + sendo seguida pela pasta slackware e depois pelas extra, testing e pasture. Como + podem existir nomes de pacotes idênticos nessas pastas, o estabelecimento de uma + ordem se faz necessária. + + - REPOS_PRIORITY: da mesma forma como repositorios ROOT necessitam de uma prioridade + de pesquisa em pastas, este parâmetro de configuração especifica a prioridade de + pastas em repositórios do tipo REPOS. O valor padrão é + "patches slackware extra testing pasture". + + - SIGNATURE_CHECKING: indica se o simplaret deve checar pela assinatura dos pacotes + baixados, caso ela esteja disponível. Você deve ter a chave pública do distribuidor + dos pacotes no seu chaveiro. O valor padrão é "0" (desabilitado). + + - DEPENDENCY_CHECKING: indica se o simplaret deve trabalhar com a resuloção de dependências + caso ele encontre, no repositório, um arquivo slack-required correspondente ao pacote que + está sendo instalado. O valor padrão é "1" (habilitado). + + - DOWNLOAD_EVEN_APPLIED_PATCHES: indica de o simplaret deve baixar todos os patches + disponíveis a uma dada instalação de sistema do tipo Slackware, mesmo que os mesmo + já se encontrem aplicados. Esta opção é útil se você quiser manter uma cópia local + das atualizações existentes para seu sistema. O valor padrão é "0" (desabilitado). + + - CONSIDER_ALL_PACKAGES_AS_PATCHES: especifica se o simplaret deve, durante a obtenção + de pacotes de atualização, procurar por atualizações também nos tipos de repositórios + REPOS e NOARCH. Com essa opção, o simplaret faz uma pesquisa pelo pacote e, se sua versão + ou buildnumber da primeira ocorrência não bater com as do pacote atualmente instalado, + ele baixa e o aplica, mesmo que seja um pacote de repositórios do tipo REPOS ou NOARCH. + O valor padrão é "0" (desabilitado). O uso dessa opção não é muito recomendado por poder + causar confusão e deixar o simplaret mais lento, mas pode ser útil caso você esteja + usando um repositório não-oficial que sempre atualiza seus pacotes. + + - STORE_ROOT_PATCHES_ON_PATCHES_DIR: controla se o simplaret deve armazenar os patches baixados + de repositórios do tipo ROOT na mesma pasta de armazenamento de patches provenientes de + repositórios do tipo PATCHES. É uma opção útil apenas se você quiser manter todos os patches + de repositórios ROOT e PATCHES num mesmo local. O valor padrão é "0" (desabilitado). + +Vale lembrar que todas as opções booleanas (isto é, que podem ser apenas habilitadas ou desabilitadas) +do simplepkg.conf tem os seguintes valores permitidos: "1" e "yes" para habilitado e "0" ou "no" para +desabilitado. + +Mas para quê serve isso? +------------------------ + +Você pode estar se perguntando: para que mais um gerenciador de pacotes para o Slackware e quem utilizaria +uma ferramenta que baixa pacotes de várias arquiteturas? + +O simplaret foi escrito tendo em mente um ambiente *86 onde várias jaulas de diferentes arquiteturas estão +instaladas. Suponha por exemplo uma máquina x86_64 que possua as seguintes jaulas: + + - Slamd64 11.0 + - Slackware 11.0 + - Slackware 11.0 com pacotes adicionais em i686 + - ucSlack (uClibc para i386) + +O condenado/a em questão que roda todas essas jaulas, pelos mais diversos motivos, pode ter uma grande dor +de cabeça para manter os pacotes em ordem de forma manual. Com o simplaret e eventualmente com o simplepkg, +a tarefa se torna trivial. + +Além disso, as inúmeras novas tecnologias de virtualização poderão necessitar de um sistema de gerenciamento +de pacotes que trabalha simultaneamente com múltiplas arquiteturas e versões. + +Mesmo que você possua apenas um único sistema do tipo Slackware em seu computador ou trabalhe apenas com uma +única arquitetura e/ou versão, o simplaret possui todas as funcionalidades necessárias para facilitar seu +dia-a-dia de gerenciamento de pacotes. + +Mais informações +---------------- + +O simplaret foi escrito por Silvio Rhatto (rhatto at riseup.net) e é disponibilizado dentro do pacote do +simplepkg e sob a licença GPL. Para obter o código fonte, digite + + svn checkout svn://slack.sarava.org/simplepkg + +O wiki de desenvolvimento: http://slack.sarava.org/wiki/Main/SimplePKG e o endereço da lista de discussão +utilizada para discussões sobre simplaret, simplepkg ou mesmo distribuições e pacotes do tipo Slackware é +http://listas.sarava.org/wws/info/slack. + diff --git a/tags/0.5.1/doc/TODO b/tags/0.5.1/doc/TODO new file mode 100644 index 0000000..9178f6e --- /dev/null +++ b/tags/0.5.1/doc/TODO @@ -0,0 +1,5 @@ +simplepkg todo list +------------------- + +TODO list at http://slack.sarava.org/wiki/Main/SimplePKG + diff --git a/tags/0.5.1/doc/mkbuild.tex b/tags/0.5.1/doc/mkbuild.tex new file mode 100644 index 0000000..9e620ae --- /dev/null +++ b/tags/0.5.1/doc/mkbuild.tex @@ -0,0 +1,627 @@ +\documentclass[12pt,a4paper,oneside]{article} +%\usepackage[T1]{fontenc} +\usepackage[latin1]{inputenc} +\usepackage[dvips]{graphicx} +%\usepackage{subfigure} +\usepackage{mdwlist} +\usepackage{a4} +%\topmargin -.5in +%\addtolength{\hoffset}{-1.0cm} +%\addtolength{\textwidth}{3.0cm} +%\textwidth = 400pt +%\textheight = 680pt + +\makeatletter + +%\usepackage[pdftex]{color,graphicx} +%\DeclareGraphicsExtensions{.jpg,.pdf,.mps,.png} + +\usepackage[brazil]{babel} +\usepackage[dvips]{graphicx} +%\usepackage{textdraw} + +\input texdraw +%\newenvironment{textdraw}{\leavevmode\btexdraw}{\etexdraw} + +\newcommand{\rcap}[1]{Capítulo \ref{#1}} +\newcommand{\rfig}[1]{Figura \ref{#1}} +\newcommand{\rtab}[1]{Tabela \ref{#1}} +\newcommand{\rsec}[1]{Seção \ref{#1}} + +\makeatother + +\begin{document} + + +\title{Construindo SlackBuilds com mkbuild} + +\author{Rudson Alves} + +\date{\today} + +\maketitle + +%\pagenumbering{roman} + +\tableofcontents{} +%\listoffigures +%\listoftables + +%\abstract{...} + + +\section{Introdução} + +O \textit{mkbuild} é um programa em \textit{script shell} destinado a construção de \textit{Slackbuilds}, \textit{scripts} utilizados para a construção de pacotes no \textit{Slackware}. + +\section{O modelo generic.mkSlackBuild} + +O \textit{mkbuild} utiliza o modelo padrão \textit{generic.mkSlackBuild}, armazenado em + +\begin{verbatim} +/etc/simplepkg/defaults/mkbuild/ +\end{verbatim} + +Este modelo é uma versão setorizada do \textit{generic.SlackBuild}, levemente modificada. O \textit{generic.SlackBuild} é um modelo genérico de \textit{Slackbuilds} disponibilizado na árvore de \textit{Slackbuilds} do \textit{Slack.Sarava}, para servir como modelo para a construção dos \textit{scripts}. Outros modelos setorizados podem ser utilizados pelo \textit{mkbuild}, a única limitação é quanto ao nome da seção \textit{slackdesc}, que não poderá ser alterada. + + +\subsection{Os Campos} + +O modelo \verb!generic.mkSlackBuild! é um \textit{SlackBuild} genérico com vários campos destacados por duplo colchetes, \verb![[! \dots \verb!]]!, com mostra o trecho abaixo: + +\begin{verbatim} +... + all +# Set variables +CWD="$(pwd)" +SRC_NAME="[[SOURCE NAME]]" +PKG_NAME="[[PACKAGE NAME]]" +ARCH=${ARCH:=[[ARCH]]} +SRC_VERSION=${VERSION:=[[VERSION]]} +PKG_VERSION="$(echo "$SRC_VERSION" | tr '[[:blank:]-]' '_')" +BUILD=${BUILD:=1[[SLACKBUILD AUTHOR INITIALS]]} +... +PREFIX=${PREFIX:=[[PREFIX]]} +PKG_SRC="$TMP/$SRC_NAME-$SRC_VERSION" + +... +\end{verbatim} + +Uma breve descrição destes campos é apresentada na tabela abaixo: \\ +\\ +\begin{tabular}{l|l} +\hline \hline +\textbf{Campo} & \textbf{Descrição}\\ +\hline \hline +PROGRAM NAME & nome do programa \\ +PROGRAM URL & \textit{URL} da fonte do pacote \\ +SLACKBUILD AUTHOR & nome do autor \\ +SOURCE NAME & nome da fonte, sem versão ou extensão \\ +PACKAGE NAME & nome do pacote e ser gerado \\ +ARCH & arquitetura do pacote. Padrão \verb!i486! \\ +VERSION & versão do pacote \\ +SLACKBUILD AUTHOR INITIALS & assinatura utilizada pelo autor \\ +PREFIX & prefixo da instalação (\verb!/usr!, \verb!/opt!, ...)\\ +SOURCE EXTENSION & extensão da fonte (\verb!bz2!, \verb!gz!, ...) \\ +DOWNLOAD FOLDER URL & \textit{URL} da pasta onde se encontra a fonte \\ +DECOMPRESSOR & o descompressor para a fonte (\verb!gunzip!, \verb!bunzip2!, ...) \\ +DECOMPRESSOR TEST FLAG & \textit{flag} de teste do descompressor \\ +SIGNING KEY URL & \textit{URL} da chave \textit{gpg} do fonte \\ +SIGNING KEY & chave \textit{gpg} da fonte \\ +MD5SUM EXTENSION & extensão utilizada pelo arquivo \textit{md5sum}\\ +PATCH FILES & arquivo \textit{path} \\ +NUMBER OF PREFIX SLASHES TO STRIP & \dots \\ +SOURCE NAME CONSTRUCTION STRING & string para a construção do nome do arquivo. O padrão é \$SRC\_NAME-\$VERSION.tar.\$EXTENSION \\ +OTHER CONFIGURE ARGS & argumentos de configuração passados ao \verb!./configure! \\ +DOCUMENTATION FILES & lista de arquivos para a pasta \verb!/usr/doc/PACKAGE! \\ +SLACK-DESC & conteúdo do \verb!slack-desc!, descrição do pacote \\ +REST OF DOINST.SH & conteúdo do \verb!doinst.sh! \\ +\hline +\end{tabular} +\\\\ + +Em alguns casos o nome do pacote difere do nome da fonte, como é o caso da fonte \verb!sigc++!, que gera o pacote de nome \verb!libsiggc++!. Por este motivo que existem os campos \textit{SOURCE NAME} e \textit{PACKAGE NAME}. Para uma compreensão mais profunda destes campos, aconselho ler o \textit{script} \textit{generic.SlackBuild}. + + +\subsection{As Seções} + +As seções no modelo \verb!generic.mkSlackBuild!, são iniciadas pela \textit{tag} \verb!! e terminadas com \verb!!, como em um código \textit{html}, \underline{sem espaços}. + +A única seção que não pode ter seu nome alterado é \textit{slackdesc}. Esta seção é editada de uma forma diferenciada pelo \textit{mkbuild} e a alteração de seu nome poderá gerar erro. + +Cada seção possui uma \textit{flag} com os possíveis valores: + +\begin{description} + \item[on] habilitado; + \item[off] desabilitado; + \item[all] sempre habilitado. +\end{description} + +A intenção destas \textit{flags} é gerar um padrão para as seções, deixando em \textbf{all} as seções que deverão estar sempre habilitadas e \textbf{on} ou \textbf{off} seções que podem ser habilitadas ou desabilitadas de acordo com as necessidades do \textit{SlackBuild} que será construído. + +As seções padrões do \verb!generic.mkSlackBuild! são listadas na tabela abaixo: +\\\\ +\begin{tabular}{l|l|c} +\hline +Seção & Descrição & Flag \\ +\hline +head & cabeçalho do \textit{SlackBuild} & all \\ +slackbuildrc & carrega \textit{script} \verb!slackbuildrc! & off \\ +set\_variables & inicia as variáveis & all \\ +slkflags & carrega \textit{flags} para compilação & all \\ +error\_codes & códigos de erro para o \verb!createpkg! & off \\ +start\_structure & cria diretórios para compilação & all \\ +download\_source & baixa a fonte do pacote & off \\ +md5sum\_download\_and\_check\_0 & verifica \textit{md5sum} da fonte por código & off \\ +md5sum\_download\_and\_check\_1 & verifica \textit{md5sum} da fonte por arquivo & off \\ +gpg\_signature\_check & verifica assinatura \textit{gpg} da fonte & off \\ +untar\_source & desempacota a fonte & all \\ +path\_source & aplica \textit{path} a fonte & off \\ +configure & configura pacote & off \\ +make\_package & compila o pacote & all \\ +install\_package & instala o pacote em diretório temporário & all \\ +strip\_binaries & limpa binários & off \\ +compress\_manpages & comprime páginas de manuais & off \\ +compress\_info\_files & comprime arquivos \textit{info} & off \\ +install\_documentation & instala documentação & off \\ +slackdesc & \textit{slackdesc} do pacote & off \\ +postinstall\_script & \textit{script} de pós-instalação & off \\ +build\_package & constrói pacote & all \\ +clean\_builds & remove fontes e instalação temporária & off \\ +\hline +\end{tabular} +\\\\ + + +\section{Configuração} + +Por hora, o \textit{mkbuild} utiliza apenas um variável de configuração em \verb!/etc/simplepkg/simplepkg.conf!. A variável \textit{SLACKBUILDS\_DIR} é necessária para utilizar o \textit{mkbuild} com a opção ``\textit{-c}'' ou ``-\textit{-commit}'', que incorpora os arquivos \textit{SlackBuild} e \textit{slack-required} à estrutura de diretórios do \textit{Slack.Sarava}, na cópia local. + + +\section{Criando o SlackBuild de um aplicativo} + +Para fazer um \textit{SlackBuild} com o \textit{mkbuild} é necessário criar um arquivo com os parâmetros que deseja que sejam passados para o modelo. Um arquivo de configuração simples, \textit{sample-Pyrex-small.mkbuild}, é apresentado abaixo: + +\begin{verbatim} +#-------------------- +# Variables +#-------------------- +# Author name +[[SLACKBUILD AUTHOR]]="Adalberto Simão Nader" + +# +# Complete URL address or URL base address ( without $SRC_NAME-$VERSION... ) +[[DOWNLOAD FOLDER URL]]="http://www.cosc.canterbury.ac.nz/greg.ewing/python/Pyrex/Pyrex-0.9.5.1a.tar.gz" + +# +# Default enable sections: +# head, set_variables, slkflags, start_structure, untar_source, +# make_package, install_package, build_package +# Warning: don't remove '#>>' and "#<<" tags. +#>> Start SlackBuild Sections: + on: slackbuildrc + on: slkflags + on: error_codes + on: download_source + on: configure + on: strip_binaries + on: install_documentation + on: slackdesc + on: clean_builds +#<< End SlackBuild Sections + +#------------------ +# Sections changes +#------------------ +#>slackdesc +pyrex: Pyrex by Slack.Sarava +pyrex: +pyrex: Pyrex is a language specially designed for writing Python extension +pyrex: modules. Its designed to bridge the gap between the nice, high-level, +pyrex: easy-to-use world of Python and the messy, low-level world of C. +pyrex: +pyrex: +pyrex: +pyrex: +pyrex: +pyrex: +#$ & maior \\ +$>=$ & maior ou igual \\ +\hline +\end{tabular} + +Os campos \textit{CONDIÇÃO} e \textit{VERSÃO} podem ser omitidos. Cada pacote da dependência deve ser separado por um ``:''. + +Para o \textit{SLACK REQUIRED} definido com a linha: + +\begin{verbatim} +[[SLACK REQUIRED]]="dep1 >= 1.1.1: dep2 >= 2.2.2:dep3:dep4:dep5 = 1.0" +\end{verbatim} + +\noindent será gerado o arquivo \textit{slack-required} abaixo: + +\begin{verbatim} +# Dependency list to Pyrex +# +# dependency [condition] [version]] +dep1 >= 1.1.1 +dep2 >= 2.2.2 +dep3 +dep4 +dep5 = 1.0 +\end{verbatim} + + +\subsubsection{SLACKBUILD MODEL} + +Este parâmetro contém o nome do modelo utilizado para gerar os \textit{SlackBuilds}. O valor padrão é \textit{generic.mkSlackBuild}. Outros modelos podem ser utilizados adicionando-se o arquivo do modelo no diretório \verb!/etc/simplepkg/defaults/mkbuild/!. A linha abaixo + +\begin{verbatim} +[[SLACKBUILD MODEL]]="generic.mkSlackBuild.2" +\end{verbatim} + +\noindent define o modelo \textit{generic.mkSlackBuild.2} para a construção do \textit{SlackBuild}. + + +\subsubsection{SLACKBUILD PATH} + +Este parâmetro é necessário apenas para uso com a opção ``-c'', \textit{commit}. Ele indica o diretório, na estrutura de diretórios do Slack.Sarava, onde o \textit{SlackBuild} construído deverá ser armasenado. Se este parâmetro não for passado, o \textit{mkbuild} irá pesquisá-lo no repositório do \textit{gentoo}, pela \textit{internet}. Caso não consiga resolver com esta pesquisa, o \textit{SlackBuild} será colocado em um diretório padrão, para \textit{scripts} não classificados, em \verb!others/unclassified/$PKG_NAME!. + +\begin{verbatim} +[[SLACKBUILD PATH]]="dev/python/pyrex" +\end{verbatim} + +A estrutura de diretórios para armazenamento dos \textit{SlackBuilds} adotadas pelo \textit{Slack.Sarava} segue o mesmo padrão do \textit{portage} do \textit{gentoo}. + + +\subsubsection{Outros Parâmetros} + +Outros parâmetros podem ser passados para substituição no modelo \textit{generic.mkSlackBuild}, como o parâmetro \textit{MD5SUM EXTENSION} no trecho abaixo: + +\begin{verbatim} +#[[PATCH FILES]]="" +#[[MD5SUM CODE]]="" +[[MD5SUM EXTENSION]]="047574eb5d1b7848a70d4130035f1f3c" +#[[SIGNING KEY]]="" +#[[SIGNING KEY URL]]="" +#[[PATCH FILES]]="" +\end{verbatim} + +Além destes parâmetros padrões do \textit{generic.mkSlackBuild}, qualquer outro parâmetro pode ser criado e incluído ao modelo. Para isto é necessário que seu nome seja incluído entre duplo colchetes como no exemplo abaixo: + +\begin{verbatim} +[[NEW PARAMETER]]="new value" +\end{verbatim} + +O \textit{mkbuild} irá procurar a ocorrência da seqüência \textit{[[NEW PARAMETER]]} no modelo passado por \textit{[[SLACKBUILD MODEL]]} e irá substitui-lo por ``\textit{new value}''. + + +\subsection{Habilitando seções} + +As seções do modelo \textit{generic.mkSlackBuild} são habilitadas na seção iniciada por ``\#$>>$'' e terminada por ``\#$<<$'', no arquivos de parâmetros. Como as seções estão desabilitadas no modelo padrão, \textit{generic.mkSlackBuild}, esta seção do arquivo de parâmetros tem apenas que habilitar as seções desejadas do modelo. + +\begin{verbatim} +#>> Start SlackBuild Sections: + on: slackbuildrc + on: slkflags + on: error_codes + on: download_source + on: configure + on: strip_binaries + on: install_documentation +# linha ignorada + on: slackdesc + on: clean_builds +#<< End SlackBuild Sections +\end{verbatim} + +No caso do exemplo acima, são habilitadas as seções: \textit{slackbuildrc}, \textit{slkflags}, \textit{error\_codes}, \textit{download\_source}, \textit{configure}, \textit{strip\_binaries}, \textit{install\_documentation}, \textit{slackdesc} e \textit{clean\_builds}. Linhas iniciadas por uma tralha, \#, são ignoradas. + + +\subsubsection{Substituição de seções do modelo} + +Em algumas situações pode ser necessário substituir o conteúdo de uma seção. Estas mudanças nas seções são feitas por iniciar uma seção, no arquivo de parâmetros, por ``\verb!#>nome_da_seção!'' e terminar por ``\verb!#untar_source +# Untar program + +# Change to temp dir +cd "$TMP" + +# Uncompress e untar source +gunzip "$SRC_DIR/$SRC" | tar --no-same-owner --no-same-permissions -xvf || exit $ERROR_TAR + +# Change to source dir +cd "$PKG_SRC" +#slackdesc +pyrex: Pyrex by Slack.Sarava +pyrex: +pyrex: Pyrex is a language specially designed for writing Python extension +pyrex: modules. Its designed to bridge the gap between the nice, high-level, +pyrex: easy-to-use world of Python and the messy, low-level world of C. +pyrex: +pyrex: +pyrex: +pyrex: +pyrex: +pyrex: +#slackdesc! e \verb!# input file with build rules and variables + + Input options: + -a, --author + author name + -ai, --author_initials + author signature + -cs, --const_string + construction string to source name + -u, --url + url address to source + -pn, --pkg_name + package name + -sn, --src_name + source name + -pv, --pkg_version + package version + -md, --model + SlackBuild model file + -j, --jobs + Number of jobs to run simultaneously + --prefix + Prefix install directory + + Program options: + -h, --help + this help mesage + -c, --commit + commit SlackBuilds in local svn tree + -v, --version + program version + +EXAMPLES + mkbuild --prefix /usr/local pyrex.mkbuild + build pyrex.SlackBuild with prefix /usr/local and pyrex.mkbuild + variables and options definitions. + +AUTHOR + Written by Rduson R. Alves + + +REPORTING BUGS + Report bugs to + +COPYRIGHT + Copyright © 2006 Free Software Foundation, Inc. + This is free software. You may redistribute copies of it under the + terms of the GNU General Public License + . There is NO WARRANTY, to the + extent permitted by law. +\end{verbatim} + +Uma opção interessante é a \textit{-c}, utilizada para adicionar e atualizar uma cópia da lista de \textit{SlackBuilds}, localmente. + + +\end{document} + diff --git a/tags/0.5.1/doc/simplepkg.pdf b/tags/0.5.1/doc/simplepkg.pdf new file mode 100644 index 0000000000000000000000000000000000000000..22cc869d662d73dbf82a939f9a5bd5272947906e GIT binary patch literal 96342 zcma&NQh6d8(DkxokM$4cToI%SB4V_R zbj(nsW7lzoP;3MY1olQ&P&_>JGNyLsE*1pr|4EeS#Vl=HOq~em#cT{+OhrtM?M+Pi z_@JC!oJCims&hsAk!1;4_deCR<^l~De?C7MJnxr2)ZZSEe$_ukC9P-g__?NvPCAzD6wl-~MZ2E9_;Y;x-cKpeYebjB z@Z+oy1*zTNKRg1$=%_~U_{!v!pxr&@b9oEURb3t&B=e$U#c+KK<7PDsrz|jGVq&HH z^M~k7ovJ;2y61^#lrD#cc)H#&g2K!i8szDXb#eFl2H!9W87Q+NYyPU^sN{zZ;Khlz z3wvk=lO*ipMngv`1e}i7I=eMQMY}-Ojv;+}n`#ga?h7Ti@LpWEtZa_!>(Q(riDpAl zAicx?I{(s`DGV9U(52`E#~ghB2(L3-sL(A**HjjY-4pGJqAUx_&40e^9(tq7EXg3O z;M7G?wD2jE&y?sEv_vVKrCo%$Bv4Yr*P2B3fD9KvKnaJDdXQEPc|R$FS;E-Gfmx|} zz2&>+y%@=GZU>N}P!=wSj<}Xcd6ne=JroN2-3nuGn$}jAU`|jIpNR zEBN9@Bj0DsA!t%f$Db#S#eiD03YioDwEq#+vo9Uk5H@^JWOKd?>QJm^3x~~K2t=*~ zvOr(7=yunX_PP%TGKES|A3z@k6su2kv)tcf1#(b6Ah5AVJsJQ*RHESrR$p=S&W0qL zJ!pVmKF;|65nOSb#?TuB;RAmG3!*(I>iLSEJ}Y?*;^@%52W!dXv%X5EKaO(9#s|qJ zGk_gh1K_cl>GRvp)n1lm41=ALge0%r;mF=cEwh|~J_9z8KKt)z7ud=~LLAdU1sZLZ z<3d_NEKJs$Pp|`%O`?Ru^L4~(1ji`$bNd5NcTgM{KC}wxqFwfJ8Tl=yKI~fDSN2;g zK@5@k?1JXukW4Q7K(cU=IP9?g`o#5O12<~>Cq z@!_~ZQZ`~ETs~MpESy3R9%1d77zd(^agBNly|}Vn?Q5Hn%kh?2StahjKqa*Z;t@|b zYYfAE8mjFAO-CVL55lZx7E8b(;ZN$06nu9^v`U42lCy_RZDYfTUNDMBdRH+3pr0Pz zz;OGLvm?QchhSTpn|%l}!Z^e&-O$rHa5SH*?53ek)Co1G7(n zDeyz2jrwjCrlXz;={Lx%(9xKxpi|~_Qhp^O-s`QP7x3GqMbn$`&JZlQZ(hXNsw-2` zaUCR>xR*vA$Qh4lu&=LcuAk*6WU~LJ`7ra^a3ylWDEE{+Uq~aIn(+ zSGq`m=Bg!WgQ8v0uE}#?>e{wKW%yhetha18_!YUEg)5a1%r?!OjaUZ-M`}xzI4;Au zl4|^pMYEM-I@2%OpAZlgn2_g;!^EbGoDfuRjfxmqw?$4dVKKa|^MEyu4}K*dVj6n8 zuVpH+e$KrK4FoVD@J!W^G%l2UY;X}}+tO*6g+vt16t(IjwvhIF5`IT?;%S_!tG8u1 zQycmiD1MnJWw)p&he{V6E}^%4L(No_*0>b9>%MZ~ia0gAMS=PVl=QCJv_*B2zVk}5 z?=@QCiAs)`qJ(FikSqqK6Y6>jv&OTt9-3zP{N6)okw~^IF73n1N}ivWBK%7U8?j09 z%4C3T%-$lDmpNP;5?yb-#nA(CWY15y{+K|)6}sNmvO!i>@e z&AQ4Ln?aqgh&PIX4oVw$3xZ4FG3Db<1*wRnG?l`Avf#*ex`YBa^vEqIdZ!vNUZFr) zc)RONRmB?F(x5RDE)0jRYpPm35jbzqjkUV=GN23p-*+KOhx}q&m^!!y;Te zvusgV0-Ry1z5vm8vRWX&1=+@T>1IB^ahso3w;b-RjAh3rs;?-Yx5~`Fed}AEO>Vkt z{$pJG)E!Z>U`Af>Yn6K2sL^XU;{x?Q`=Td%QW~#yb`}KY4pAjxc+`CHH+ICa}^aWh8eH^Wt(+VsL{vYfSLLG8glm_=ffDL|N9jn1s2nX_HtJw~PLX4mx=v(>0cq5!Qxvwqg{p|R!?e#S)r7KGr^Qo&(EQhAy8IZ zpUWCWauLtqWhFRYP@eBRMwG`zE)<3*$roQKZ+KT{{`U9&bMVV3&~OsWxhPpDC*Di8 zp1dDeFBJYkq9)2E-PTl=8dn%(Vo%^;cUxF53m7lwr}JovRcny(NES(9QtA49wZijE z%VtMmnW8BwMHwEE1D){x#s!@mS@GPWS`cwci+nTYjSm<=po{vDfc5AXW+4To@!n<3 z1tc2Xy;b^c-MN+@6fZ+C%og7!zh341C+2M24O$360Q7JOH<5l%e$FMh03<3zM)_i3 ztPyAj1<$ubIc}}nV(v++y4gCAlIpGMh&Cre&+fHX4S{PxXd-)9u1hUznpx31=}<7` zU`nbQ@N5>X`beS7VFRuER;GzyCD5S$C1dkhyV)<#R7t}$WRkn2J%)cu zJ7AeHfPpY|Db`NK>vR2ji`8-KOt-8|+!q^0KM|Zux85zIjvp)+0j6v$dNa+0JF)Y7 z94EMN0{nVkX5qn^9aa(4 zld*2MjX>u4YAvOxnfBvQCiqFww%-G2!n_tqs*S?9aT$7r781g9()VSf?qfV2muHctT+ zk{INI`H;It=Q9xiKOyEK+#v4H%~=5vBp~YOQnBw^^iDnlnL9_bt-#Fi&0P5t2ucD? zoZ(49N$^%f0u|nV<=~=u9n*Y)IHG~-dfcDwu0&=H+lf-_LPloHsb?NB)lBVBasQft^)h+XrY!6a{iplQVzi~X2bRa=J%{F5#} zND<~EC|#~T79<0#XLj|BFdy5;A%G2Q^ zpbM#@dwFk&UKqLE^qdX6lV*Ey0A@hCQ@W(qHEPckD(5bC^=DU{4}0|_RZ#XRd!q`TSOyc4vJ6Mh5#|`)(KE zgc{cKlRB~gBN28}rOf4_b^C%K!)+qQEF^P}*u}c+9FI-?2}dM4Py*=;Jp*!9Jid9G zrQTwy8U?ot%Tqz;#A={q^+epcsmNN|Hx4pOf|;mx2vz)@%;RtbxdkyU2Qp9ZDX^1{ zx!Fuf9koL!`ODOS>Av-k-~uM@Cb7YWp8L`FW&UjHopzA*yHUvB(G(u3T9lLdOW{h+ zDLgk7#wM-Os7_OL8Y;pw(c#|@JXGEQ_o-LKm@WFJaipgC*^8I?(6(;<9(bQ2v{IO# z1k8DFTWL~noShV#$c-vBPrC2gXB&1{IV!l*<8>P)_nUBu#2EbGl4_IWp_esor541f zJ0-}40abO8*=G@bm!y_w^f*t79TC)@ucq~3Z8qt$(Rorc*ErTPse2Wj(2gE?O&juJ z=WJ0+qOm>44v-X1Zbu}PjBZEdj2^!io{Lk&QruonsX_d6} zWJ9HJE|Fl~)*zo@>TDhg>CqG4*fT`Q?M(2F4L6`}2JT~BKKrS#)LAST8l}BNTCvTL zZuGP{M}TbUwf-A(<`f)sYlQMalL^f3bxBUsJcI2@&7eE<9A-3H>`LTWX@klpF^fXJ zKKTCe66SuP4g#&}H_OA(8Kb52s#BMrBCth7ie_$tFlM{d*et9#1nP{)gNyujP1Wim z=9cVrb$+qA-n&cQ-c?^QT{_kPM-Yc|^a@Cam2Z2(#9j7mHrJS8cy^F^xork=@v56g z91i2ya`~wTo)>QxCjOjOgmI|B_u-C&aK{;N-}4o4vg!(VKBFu@idl~4=gmL zvCuYE!sPN!sZm6m@q2+p{>Q*q1x_J+88z1e-Lo`g*(VpS8jW_wU|I=>F`gRGaJC)3 zoq=@P;3nmG8Ru#K{B@8uAju{qIN%j%n`U9?))gjJ*&4AGyTWDG?5!Fsp&Jad8(!-g zHwO8&s{zYTgYPr@Fjb;u{o!$Z@zMs1Gae*U)WU0TBxVE-)8?Zln(lK&SGRNXI+yN8 zI_vxykM0~oPcHH`&s41pT&c&h-9H%JxZ;j&^G-!)PH~C1z|Wo`w`o__p_TJr<2c&b zTmDsf^hvEw^TeROxZWR$VuD~AHEv282h%3?Nr zhr^|qw{&G$D4Nx3Dr@>Q-bDU^wzR8o-Ox4Pm1h(Snmwnk=_ek8u#l&!BU4nf0>a36 zM%`&vd(4)H0WI4PmvVCcj|~Le-!X-X(Pu7?6pMJt#T~I+{$*az5x~#xg*^@U6cq;+ zX45q<`o0|F>rv-o?P~_bp)v+CSzlwUCqN6D0*bF_ZBm+VIAKlitVXcUf)Xh-7?-On z8I*15$~Ekv;ET4TD|VefmlNqK7sJP?RadV%YB;1p>NuDFd>CtVk*36pkh;6PALPGp zcuCAPWK%nn|0AIO^ZT!~`md_`?_^t10SeaA$D0R`K^D8{+L*nnh%So7-?gzLSnEK=4Db>sR?tf&DMCfKqeOPf~T zNA)z&V1k=0Zg)ZW_rLC(; zU+(nQsw^7O@k|#1YcntByWWq3(y%DW?azp-g%P4|==a7XxP`C$XKtwiNlW|UZH^39 ze&FM0YI{ti$B#=AvD(eck1vM{(Rlm(o3ndWvOM{E;3yw0|EVmOTMUu+0`ZI-Gt#4$H z-f=^slHH$o#{TG|i(uW}%ab(bRP58&+S7ae5EI4t!JfIFIP1C?EFly=Q2F6C;W!=| zMMxVS3BXn8FTo;!(DfFNKENJ)C^>RawMEo2kCN$5MdAC%b*nde-hsV zWrV*R2|AIkm-=M$B<+!>SRV2ag#8;n!MB!v=3FlnYY0)Q5||PhonFoowO*OPq%7@< zVmXXNT!uJ95RYH0pDhgtFd4~HVHBoH4?`n`j!svi3K3lcTav(JMkf1c0P&y#r5PUr z=rIeiJXHo(u0JVBjByIaaTYL$dWE&x0~Y2XK#qT#6~OWDm%uq%!?neRCC1s2BAe|>XmlJj17tVPAH@Uj zz~K)!!EA-J45%%`lWzD;n)etQY9=t~bW7$bm>?mJFx@C$5*3F0)3%YQ7*k<&YV+Qb z&a<@&uO01!LvZM6?co;YRG`lc$QaInyyQcDH0#AiG4tnWyzlmLd{qNq^TX~QHHz)n zh7Pz>f(2UzI4>)~PVZjlCa9e$yL;Md!dIPnYgj3!F0bjl%vM|~y&AjrVVCv|MU4Y+ z7bQq!q&oxuQ~R}CGMR~sGcX;K}&%5oeM-TmE#NYtRE(C~9XSdfzL>r4}o;H(V zfGg<`Jn|>80T9ky*Ep&NG5}HQl(h|>3txe>(zn#WK|WmXgg+>7;QB~7GCOl3)VLHx zwd$VwPw8VQhhi8!unmhKJRSKKEJw@iozog8si`$q6WztxV1{JEF)@87x_&wi>Os}m zXQ`o%ay%P_E}Vg&7qh%lYT{VqRHSWYriWSpSLkMWo{VI`y&=e)h(U?H&jLM?Vl)Ho z#o`#)(`*^CaTrl7kA@2-B?82b)pFgKC`0+rLn zt#K_8K2{26vwuNtFqfEUko8B8Uh#2r^I1qkVxc!eMGNEkuhEotRDvAixp^BSfQZ=? zyXPO~8f3;N4*#q*5qkEwc3F`72d4ihhIfQ98=dA;#TH^{u!n9;hv*+Bx{@t=Z)aTR za#c$@hL?VrDF(oI5U=o)`5N3vh#MacM_f{f!05Xz?Q@urLd?eR0G2s;yCn1NS0`A- zBs-hvYZE4c6sHg_v9`!jPw~lslm#qTJEAqKTXUNSxLV|m76f30U1?0Jt%Oh07|};F zZd0;Hvu@=qA9egwZE@p#P8PMa4NXiU98Uu#6@J>6tC$4Q5eE4Wzi6qnI?PP~H>ng7 z76qgh^B&8DBpn!@`VMFgXhrt~xVT=H=%H{R8x|X)HZ?dBpIyHO#YapB@CNcuTZyb!fU%ZSPIR8js(Ub~O7yGH#uV3+77tSzxGS%wU;EZ;ASHLP0 zgn&-eisd!Mx(e1Cf8wX#6{Z$;jxw<-`)F%3suepBh`|m?*!LIR3OiR+&Yc2zbp&?s z+#o{@*#-yTMFFcGP&V9FO@mx@HYZUr-qk6>t_9182TnUK=+7wAE4MLXsQ8`=6%q$`&5(>n_Xd(PgICNZ1^!%F|UB(Xhj9S2HCRu0fP61`q9 zh#Ivj@VzwV+LoEDp)8F+w1Rx}s;oY(*%a44f?wC-k-ja@4fRHUVaQ|RE+K3`^W{t- zP%~|JV1^)~J&&nt-0Q3k#d;RbO~QaZXSlSFp7YDV{XQ$xvZXf*Nw(?lsW2wo#ou&Q zIV5X6#UuKS*Q9W2LJrRF1lK6_6M#Yrf&VdPCx-MlsMdHuMUjXz#YzbPcjlZp8qlo% zEdrQadHj56wc#Mi-2y8~y;50?d2#0Kx+}c$>=3rtuD_HF3vBud_?h#p zW%Rn)9C5J$5NGLh#U}^82cjz?B+L?58pygWB;Ezv=7^#1a8BG&&1fyxi5<~G7xpLn zwuM^hPFD@pgQ~5%im5DVrV->+xZJKavBj;Po7f{4%BTH2Dfuk-8eFOU-pQ0cUigG% zv9JQlNZ}fRhltyurabi}S@)i_sE2J>6Nn6Ro%n(t!d12UCl|d}keMBpJ*QjhqO9B- z$8T2Y4iQH9O&q~?Q4p6#DA@ssdcWM0sn_s@WDAYjIadf{Wlq zBTXmXV4uHoiD7F1UN;3vO@SqEMHpsaJ9nY+O2~WIOZ@oq0VP)d(K*WFt+1LRtdDbv z$?{1+xM})E2|TR~n7pXS@bAlnPjVHo9(PWa6e9#5lRfwI*Lbj*bn_pbK!nkD=_iA_B78+R`-DQMWt+%+8?hO#xZ4w z(S|M$b)nfK64Ekw`h5ZEWBf&eg=F?bBNUf-8%N;g6&L?|2~_M?L^?T*Usz-4fpZg4 zBYMEQUUDXLYs;8Mzs&!={ouEK+5(0K86!pJ5|~K-Zy*?C zsDBoZ*2e$`o&|rHh{|{}TLSPNFw_OyTVKxO0z!CXL7|uGY_=?O)FYiUTDKnDj2}Jb zw0K5yY@%6I$w{pm7@Kske`O>h2)lJ_^Nw@0{UZ{dj7 zt6Mg1PpNGQ@+s&T`=GmD%wVk(f`q+S4+~%6h`5&qXJT-)FMsqdP0qdI0o&`_>4K#E z;bt-7=JV&#BVtM+mFVUTqc7SmSA0$Nd-(h-9?$w4=5}dx?iOgp76aNymvS+s5UAt$ zDmot0VnH7F->IjZ^I6P^Vi9xN0qKyTgRNo7cF@t9G_@m6nkfM$U&0%(|2!jBzB}!h?Q^M$9_pzv^{>d&Nrc7pUcISDC)0n zStiY=b;%(H2`$o{h5{gaou`n`+4XVW{S&`1oe0eTfU5sZOaG-RW@aYF|A(rW|BF!n z4gbGA0Tzb;8>+g|k+jDhL+nKcGwMgjhs@iB9#*`IvX3i+6p2i{ z?gxC{QeLrkm7h5x(s~s{fI((n(srfQx4k=Q&^T`B_dEGBpNqr$-5Ec6QWrmbpS$1t zSePQt=;fgM+XOa7tQ$k_Cs#~!+tAm;7;#4MYo#W>CKGZ z5MM2Q=c;G)PIh>pJsJv&uexrEZvREoPuJaWV%rwk>8&`X_G`iSEss~GC`8#rW;dkK z@y)oywL&fuL0<~zfZTW?a5^cJ%EDlk4{w66-6W zE~5UsP884(4RPo;smIX^l5M7T+bDSNXI>*F`a+${ZV7;vnAb!LW9V(nyYWVpeHVOS9LcJz$ou6EaqnBmJvZHpfVzLHbvg5L?*kc zTRXXxpqJ_{lEG+i(lnQHTw*WprsO^f#shY9Y-Dq1EXD+%l<6{`ELCZfhVF67go!H- z87V@IjYd$83RYYj6@vIh`V#%kK6VVeR$=s@P2`epGIH?#ZCCyJ+FMT5A=8PEz2kCn zj)%TMrH|mWsPYPxvy({RYOzhSyrusb(G6Vd0otREQ0;}VXDJ2v zUi$I*W>-XEk5B>b;w>elSm8iKibK4`QG{FHo!nhASELmjmO9J*GBAt$eg2X zJ(Jj)bCC|>%Tn{-^pPOFn%D-cp!#STuzQy%@dh6IFyod1O8A+@e_D4+`H^EThcGiZ z86Ja*e?jK?4^;n9Z^6+A0Rpn63d>UWi}-z?(~89XzTM0X!63N-Ccco^2wK4NJwqNX zawd~QElU#HX$6q+UO}%N0tw_XRVFUvYnb;T2yz9|)&!iPrI0B>hMInX5Z{1QmtnOy6q(BT2bK3WOj#M%#F>Z8cJychQR0!anQiVLtWuZ~+n3atGyU5!O1 zxeee!L$RBCSf}bopws05VsOj!0V+HV2Bi+{?{|wILe0SflfH(~VWpaS0CzSl$V6@gNYO-cQs|>Nhl@UWnMUcol2x4)2ie!84v-t^>p zOU`kEkMk(4tkaGp#bhApOiJ(`E`2L#HZ4{cO&F@;XZWzmm5caYWF~oQ*2lrBG^t$| zkw3@7PwT+INL{K?&A07Su(?h(aEC>6CU?EY{VO+kj)PRdL~I9=CN|T@L>LLQvTbE) zKkaUtfN=9?+oVGU5n^G=j^oO{0SpbMP%ywE{_O^@bMbl1c(F7Eys^{?~9e`6`@5HC;E41p)Q#j|nLS94uAg$u;;;$0LMCRo zMpx4!?>Q5%8CUSYYwf_WwDCo1)`s5>H9#7K$Uo7~Dx=0ALYYhrepaU~jLjI*r@ZujXdQ3YF}zYC=7b zVKNl_>>++Y#$9;EG7%MEjslDMHvz^AA=znm**&QlfS#lo$*GpI3Ym%(urebXxV&es zM?Z$qBgr=`RK9ZYNkz!Xy~Xh1VGyNVsMVkAHVw zcLNq=!+H+506p9ETs=gMK6FI0>#JJ#g-R`;aX!v55DELiqREftGOyO~_88a4ji6X< zUI!Mbevn(ZDAV9dk8c;Dd}V-9;u`8U@8%;I7N5|N#+Sc!IAZ8?&tVYrEvSUrtd}vM{nPfHxH*SU!WCWpKf)L?Ku2wT%C@tn7!9f5_DD zvznh*oZAH9Hot!r-XGL9QA!_8ZZC0S_n4m-U^VIYd8NDQ`ONa~wVI#w-+RW-YovBM zG(DRJV6X~?dG)#w>A)L`g3c_*f!PQ;)Cp>P#d&jnVlveQx=GocTg;F+1K27WjZh>V zi>bIW^$Hup?ol+y!S&rMN0r>~Vhw?wk8a`u)dxJ1OD8NRJ?z>I+hHDdKVKXmq1QT^ zk@Lp!^v@JG3LOH|^V+bP3#RvYR)01KT2!*ErMqHZcd5&H{cnx5k&qihmTJJHl3Lk?Yn^pD;fy}(pLS&PHJWvtw62`RXZz7#{I0qOS}#$ z?{sjOI)DVYjeKqUo|!xol3E9uy{5VPR>H`v)kI8K$NFTjHB{0&&d6DcWd{>;Wt~^R zO6BA6NgXuCB9#5-1Yv=W1SV`;NR;iH$&69>qRtYYF2s zRvsqDoc3tYTjB_^%wnsmc*rj*dxv&6BsdH)pjdN7oKzKe^3 zA~tm7*UBntk4M+n;^cpB!iuc4>x1Enqt?w!RI67jp<af7kKYY^*~Z1n;4qw)b=r}P$` zW1g*Ppl?LEL_W`0h@{?hhM3h08(%0@8>eGyxCoi}$u2DIc8KL7lpWku*ZmhiJX&{@ z+VWE_Mm-~sc4;TJ-QNYFz2|}Y0?;TxU>gxwj6V8RX4Yzn!2Jv$3%a#oM>003_@>T7 zwNa*uEf%hc=b4yLX-4nVT0rh}u$kG|O)YVZLi7n)L1LimgpgXM#kxi;N2(%J+jEws zCUi2>BP)LX#Yi60E)BM|v4E}PCU>(-g|J7vi?seGL(e#hLVt(aDZS;kHYb1_PHsr9 z@NW5V)FwMIDgIkubKL+k#Sq&^J>>Eo1b&sVEv7OD>U!? zec0_$=yB5olLGmU30NLhci1K&>HGT~9fk^Y+jtVxmN>x0an#!uW4f&n38MD6bbof# z(pbl4%CS0ud{;kz#srqC*6r!=tydNc9yd)ELMPB&xn5i*>z_oPYkCXX$gU~&J#((b zHaPQ$vS}+09B-E@R6l9fPO393zM4%~FKC$VRuZD>+iU4xZ8>~o-`~)Q77_qT*vPd? z4_p^Cfqs4*7ZD1MSj`KJY6{dJtt|)~yQ1o)&7`}0Eop@fp@5FSvEagq2#&dMQVL=$ z7HEegF6}%)oU0LKSP_CLjG9?!E=R-Ssujx(CO}0zhW%6u#U*F9KQ&#JtA28OcbflvIjb*shE)D<$TeG z{Fw=jmkyUgF+bj){zP~1TVr%1L7KAJtldq&wV!uB?q1HJJ<}Kxwm;W3;7IugW=wik zDv^C=yy)5?A61VgN?F&QgEP=&Jq;w}Ts`S@+`XX?$weD@tQo_BlmW0hWsdsG7!+G_Xh*BQ-_UZ>d`)k1HNOd;a2TZm+37< zJi^yf_}-^m`Ki;Z|Dpeslsgd6O|xRj_ca8_0{o_u=2RFe#Nf)7I2#nL{?z6Ghv2nj z?$l*vnb{jsLnOZPpaU&`oRu3v-mJ3jg;}nles(M$wOP%X{HNAQ;a8Zz3`n?Dn$Seb z!+<3BxYiqCdfY;=GF< zT4da>Z0q)a#OBUn-D6|7+cwPzqxHh|H7=X){9~PG75!Fz(>PV1Hes21VnlcFP(Uay zh_}G~%Gw%!`Uy#?()UK&O8UEyHf=|nGE#pevwvGs205JW;Ud-P`m_{T#2-B2Y2PD~ zRvQpq|6{ED)YHztK-cHx`o#YJ;vZCP^!*t~_Gx#VBpwY~qMMHW_!2lmAPNzP5Tqj$CN>1!49{}8t>)uAwkfZ~Rb1v~ z-fg}3l2B7mmTlbTR^EDjUoJfDWN1BS4Eo*t$?NfYymv&I&+YOlnD>SKNznCvWQmqaJ;zpO{bY z=JXYo)m>ajdwr(oPEvQ5mhH_incp*al8U(dN&@HV=y(~Yq8R;i#GFFws^u@5wAJ$b zbStg?_Lecun^zVa@*8fjA4Lam0;!wBpVe0K^_5=gEh~eESNzXTeJ*aX4c3>~W}+Y8 zCoxVV;}BsNDQU?ZovYsTMp2nVr+R(UJ%c&4$khmG-S)@Q3wrI@Qeuke<=416x)~$c zCxCObzPAh3dvlaCp%ov(dUKSM);|Mf+67Gec&G1wgT^Dmvi-345YkjtJogsYNYQgP z`&o}u81@N7S;!FMA7SWp{`H?i#nAWEMBMKP6h&_X%)nU&HiNn=0v(dAw7Jxl4EU{N zZ#(|%t1|*r!7~ikyfLEKv--*GoiN%0@K>$FI%Y>*J(8|})k>Y&M72jiN2wC%=4~?y zRE$)XY%`t>wNJN$7Ca)l5N()bA-%De}c&$OR|%C{b4ZQz!2Kna6o z!KNU*4w6oRB(Pj+d?lbRY}$>7GsRaItlCapSn)$$k0crX{RW!*9LPDWc2yY52WRdhq2j^ zXy>?Ou2wg0S#<YV8RXQW&-SP116i(8V;tER-J6ldamoX&y~L^owO)q>yEadQOQU z1x@?UVex8Fd9gXGxs^Gy-Q|MH7t5F>4$Zz|Sx!kixU)B!s8u2Xcjf8nP!SYkj)?JC z(jk=rW$PT&%v%Q0)cng*Io007C8GJe1@c#&rIuZ3Q-uU`CD{5>ST}0TnL9rdW-6{z z7v?HQ`qaonde?B!ld7vV(~G#ll?r*2b_>8=i(BapTrhcxC?~s4iCIxt3T5pouEBe0 zyT--9{Y{SXQ7>0ph`*!kGg>gEo1CtMPc5wiKV+U4O?x(pNE8frq5Akc2O0ngr(hSh zy=yiHt{Z>5yNHf5i{RVck#Lg*BtK2jUw2e*ic4j*9AmkF7zqj>CupHEXJuoAh58Xj zcJ-fKa96~yhXi5;C$3rsOaC<$^`vuqPif@*s~r>_(IsF$0g+8-z7|3TKYns?D&VjT z(v4@=s(|z|H9~#1;tX`P>4U)4mj~AXNi7Z|WA?NyGXiQl4fmDRu&Gs>xD?%4#7yHP zjHWWM)yn3L$j$)iw^?K$*=XSP2(cgLI4Qobkk{wRjyv<~m^a`_WD4pzAzFatrsP-l z+!QkUHZ}o&-trhlaMwqbEE~C6$<%)-g7RTjd^Wo`=*COW0-OksxAtZSdr14~q3Q2} zKloCAqxbGpjqgS*n%LnH8#-YaPA-B#tm#R|`9cYbD+MnQi8Nd!Twk)Oq1oC~6yXhn zgn=PbudyTbRnc09z`mwSzZK@!@MENL+=0zDDUd7K0u+a~;2t)F%PtVK z%*K&3{Sga=V7)heGR(K|RlSdqRPqg{?OXtG{-^_naEi@>PRax)0mo4ai~#j~U=XhF z$b=?D<~4e4Ac;!>%YwQ2T?kRDqQtDK)bsPYKUaSnlHl$26SK-P{x@CC*G%J$V; zSZ~Wh6{EAWK>G7vK+f)d)svBRSs^mzOOZStZ6o8v0f~4=m~l|?M@3${?$RC$mXyL9 zWkeQqJA&jbPMCWOJdjlgAXEpsI{UUb|D?-BqSORk^6%7#a-`SJaXUq#oE;^18{~PV zBwMiVFG+A>5X~T{-8^->i6uNDdrA|Yw?n?9mj3GL2KWbM=zVT!fc|l<-k!D3)Uq`i zn4At76_G%|^FS8(jMiPo0ZC*th2(lzNHi3j1*tnTw_hlU-XG_3Y2t?SU~O2E3waXT zjBCi`D-}~TihrBxN za`2sqiWu!41@`l=VX|qhil@(AE`Q1c5&5Vs9P|WLSr;SwvVFqUP(&+lgY`CZKP3I~ z6C(`-vQ9OD(2Bt>8VjpT2XPrmXAuz|WxNqn!&_A^J%y3L1@D=GxM{yoWxm`S>`!A+ z;U;dcIxhD`KhfRMw}Gz=Q5tn8fr%+txU-|pY%={#8IJ{D5B}GRdWq)OXuZq}T8D3x zcP8s;g0{bwMb-@*n7L?%QIl)~5j+;NQ7A|L@Yy(|=q==s&L8FuNxhv#J8xnsilUBW zmOjUCl4{p7DkvHo{TSKRZ z0M$RbtR^X_lrkaGtjAK?VsoAq+hmhuKLYDkO6^;yZ?)sX9cdf~@;gM*JT%WHAZR*! zRe7W^gffGj5z|QnW}&#`aD9l_e6*lCl9EG5^|rRyNX6#cF4ntW+Y$z#4gKsoHHiSk+dQtlxAn3FsfLnG94)|aUz zT%__bsht}JD)<(T=7j(-SSW%NID5e#IjFv-Gd_r}z) z^N<$~WfaKqS&r>zT)S|nZi#PLw(+v`9H$MOXC2GO{v@0>P&k!V>Gd!9o{UTq&)F9g zsvwbT(iq{j7Ix|()guBs@>C>jT;1tO;$CG!!+3{N*;I~Scq{<+VV;8pG(4eb?v%M+ z4#*ZY0<<>%9>ewRiRT`zlS3*MK!0^g2tGp=i->o~GqS?b+8B_I3&8Fiy!`;E?oi`O$%5N$ zK#1LYOyhH3=F%a*02sC@MI9chAg!(sKsS35WiOpz3Xb_PH#m?;q<9;awq8OHCRmS( z<{CvV0|bwX>7tQ<0{OIVyXthn-I76tL9Tx&t7~kbg@sV-EU47R2u3WAAOYsV?u4D7 z2QKOKURr*GaLGlI{__S?yXGTS!@AzDl ztI3^#qI1}hJT_`XLQycq;kFUjnU1r{pAjtL;2sN&A2#RO2E&3Z8q<*1SNQo?F&1_kxVO?H`o>S2th!Ws`zJ&wwY8KQp4 zIhr@_t)&n&0>jm1ukn^?TALvHE!Iu>l#7k*6!)$9_R%C0dak$55y*rmxd6r1As9&D5oi4^|J{C=p9|kY z;ucst)4k7WDY$c0d3?jEFTjK?csq;)@bfCdp9Ia9%ls+rjcBx?4E69(2ZJ%RtS88nl_4vbT(ILJ{D^1AAdqNU@ zl79YF&m%BM$1BpH)ZxB_7FBi$OfmqH$jF9quFZGv^#~>#`Meh^Y9GCu;5zzX?t-aH zTO$rGul(VvYjxnyQchd6Kgm0A19j(`C*6ABx8cUOIi(2FsI*b(oY;o=j?r=E3UMp= z78#V2$qS?f;j=eD(TJFjN>AQ5C9cf_*UMpXU3$gKl7D*1+BD$u&r`N-DYF+JVWS`J zjQg-+j3|$`kIrhR}qGx|`08T^2Wta8WSh_OMk3ei>D{scX6 z+Z#cvU>khlzKm{D{m6W#%P1}8PJEB9&;QU*k3_!pX{@GJz~s!V(=FHE^)#Ft9iCS_ z7j6a9B<|OAiCoITAfC}!7<;)8R4oT_RRMV1nGA;hRG#u1><=ITS0`9+sdtrtz`E$F zjvWxgRK+-TVU!X;a;Lvk$n{ue6@@KBxn#r3e#Ucp6V6Nd1mvT+P>>s}BJ* zzba5|w7iq1?{CXZgR$WyowUadE%Ogpx5=CI6)m%Hp|A9)TH07Puq&gujikX)L;Vs{ zhby7oty(9``bmZ?>#1SBC$h*@%R9a$^0qTs>kI{ChBR*aXbrEgoMz`Nh3pF^uaAhl zpRhcBggQwtF8vEB2k_+%@qXLMx75J=qgAl{Fib9>Ykl0s&Ft{Fwh5*~uTQs>!)s>! z@u5~1qRdG0V1kRBDS(T)JKZju6R^x0ONk63@ih7(2CZGmDIMDviLy!eQ%yQ<(C6~- zM|ZQfKQ}l$qlp8_#b=!MxLoKJ``HP)u-oV*!1ru#PaBLNFi_^e-bPQNbYoP;qI)KQ zZZt1vw)sA{PL&z$Ql=F|)7e{6>9>*BvUUvoe5C{f(S?-0_ajX-oO3g>3!m zsXJ1oZ|ktU1o{lN9D5zf{ZAOEBFhlA5YZdMWyE(7dqgS4(8__4o(MOI(WdDL3Sh2d za@W81Zu`iTOH1qFCC+Ho>svG4meE&~V&^69Hxe7}U(k;Rh6F-vPHH0W5{0*>g$=y< zvOnEFvxFnpgCGT~JLuP)D5@QKUkCcJkEKXuM!Y$^&A4 z8}t`X2)Y+0T7^dId6Q_`uA%r?>{qv0pZcGdc5GekB~h9d6kTcYviWxi$!(5|`1Ie7cc!=abatrm*tZ4FT4&pp zAJLSt#Az=dViT8}+t&H@lpR_~4ZdlnLb`@`lTp_5&V`+?lMVS)JZ^SrZh*T7eb(W^ zGyc7q59%H0{RNy9&UgJ!b?kq@BP<*Y|ErF%GX94;#>(`6QpdEW?MOKhd&O}Oy!PKP zUhc4_AKyNMuq7Y@#DG$^Tm_-Vt&zy|5@lQw!@f7m8@6>!TJ;j9VGu+ME#8~29pBYe zdn+#Bu_>3t4)nf%-yZg+)n}~bZsCqjUhi(7_67qc?5r>RMpH9)@dmW9#HtupE~ocf z!A&|gD2zn5+|h$uES=mv?w;9XxQkU#`fY!?u32Q}*=%ABREG4sHh1K>DYI5r-mc$` zgH@zTuVK4C9To;Ojau9mXF$jkBsUWu8XsIg;l!gE7G@LepCTbsP}qvES!GiDwcsC% z>$oT`Te!D&rA~#nm8mf1z{J6h}FBI+c6IOQ$@K`B^r4-ILg9i0{y1y5joEWfG!pMOc3o0rWH>6Zj zLAotV4OHEkN0MN&faK7!hh$UxBaf%0*YvFH8V>9UaUEh@2a5Ign#BC=1*iEB`DzVb z_d;C3o-BE{>L)Ez>r^a*D;$)1eY-(xut~&=f^n z?Bl~Xa00fSu{TjiJs(l3xt}Jn-UGX%e}d7Xnxn=x+1!Pn6ZRy(V>tuB3~r4l?zJ^8 z(!NYo2zVT4z<8>}rQX&86A%^|mn}0F8-!Io0%BQhDEF>hq1j_t+SnHY5tI zY)C4fn4peF=de?oppdG*a>)m}qT(77=crTJs$oXKEa69>yXm}6Lx+_m=<5Wew{#&7 z0yV>x*}KCHjm@QzFC}hfJkL3glnF#PMCQ*R=nKRK0{r6Dx%E<#@at~lDnALtp>rq5 z4Gh=E^UEO+8l!l}K|{a$AhCx!#Dl@1t+SgXxlSkDKGXnE%X^=fL%THE*Ei;G1wF*m z5O8E3!49)gMe0*tkwe_?K*GqE?7_}1cv=U911P|UuzRogd^0tsXsbD(gX?s|Ig9&@ z3yV4g>JH_XdnK$W7Us(WM0!<2iwGm5I89lu*=8&o|ZJ# zh;3&Vg@gftuWcS6lOHnTpcVcHfnK_ZLKsel;*TRJpvzOJ7`^#ZxY#K5*4&vF7HA~+ z2BgF4!SM|J7jQ6$_0ZI0irc#3>oMb)O6l=@r*6ZSyT~oxB1Pi<=YD7F^@zYjw=i9E zlH)vLJ)rgXpyLgBTc2T-7G`lv>VoN55JWgg&)8 zt`3nhqY~AO8&$n)e7lNcPn0Wjj^maw)TacoBIl8U;d?Tzb7;*V1pJ?(c=w(V14kh= zzeU8js#wBvVfV^H&*5qMophb4xE6f*^|nJK9YBIzd3O<; zjNssHQsTGTGf9^z^@8M!%3_I<>*5pt4a#B)|%08w85UK-i6s)r_rtjdxY+~(YY znr3>p5C$GXcF21&%KW4%?*LiMK5o@Jd|_m8&c3rQ;L?bo;u`3~`BuH_c1%n(=%S+M zR8=Kth(icuo~0@BYE8a{>7I4mccnFp*QRU;=g&T;c)6vMvzp}mDT8zXKa1 zex7yeS*J@Ksrs2F;4J1E9Gy?1%BqiVZ)r4nP2B0&SC?(HkSYWg$POorIfQW9v$+Dv zh;ieV8}WkAq5U>3Dz;is(yNb{xT)4a1Zsc{2GDgJx2#p?1FU|{wCFD>n+t`xU}q>p zb^Jh-%wzG7x$p2)UR2uqa00YVHoM=5T@i!u^U10_n|V3)IW>YgswDe5Ly|vjHUH=w z{o0v7>yVgJzLDUAP8F9sEg$-nHeBr`D0wT{-+DabjMn9Sxj~F(g7a#LDlk6_VL($? zjIo%|oOO9TbD2$fq;T8@Sqq|gC5^7g_t#q}E173+0!nmoxtnTL2ftm6NHoyu7cryu z=03VF<>j=~!X26Vh*(;8j|{&<;zVm^kb)-^!?uJM)ZP(pD}V#PG$oko^LhV(;KZ0C z*rCgJ9a#o(S4nWAXy8U2(X49jJOZ!;OKk9Xwk_=VXiFa`(McJJl+Ry>hP$9u!iQ9p zHLML`)u&5ofx=B+QXu;*Wf4>>&ZuDlD}&nz$=;h4aiqOO2y$rY;Bu_9~kG zhtvJjFhU$XT3huaWc+0TN*i8;K*vDoDU|}ohc$nHA`ksnE30vo0Y02jzg@%o+m`9< z(5UG3Uy$T4NYSW0y)O2PSdfQzpP7j>Lp(UlMR{sVsS0tF8epyOC$o&H1FQ`|4JD9f`XkH3X4E1Zt3?)a zkr$Nm^d$JAH$JCLuU#obunxIUuV@|{8Yu9mBk31MQ6B4FRV2zCWzFRBh6W8 z)M8L%Q6=fA{=9u!OILZ?sD?_bB6=tz7e0jqfY094ScoGgn7K!wBZ3^3roR*cX zsKkWsdh07rOo6;Bf3T>KWVCvZN2evGqSsmypG+%c#SYT0b<*q`N2hfzLtRty**zAa zk!V;lR+*s$flbBpwwkm@JjlOzIQhg*SWYF!qcV`o*yZpleOUH73=la#1dSBG<}Sw5 z9cQcS7+>`m5>6}lmD=evRljbu`>&1lK$lfRr?&AdDY8?!+9awX7k2C;LT;Wz41w=8 zYoB4%6rm*$$ETbVkfa<5xZWDOY_pz|J33~Na~57`%v}KTr6j(*{Sr&cPmKqZ_u>3} z)~PZdNnb(tv{1sgW=)yF-tfS)j12Nr@m$+MR`obfxB|r%()Ve6T}UH)-0e2`c)3Gs zpZ_d&%|43?(YaN~*BbWJeLcJ!4-bJCB+1920+J3^_!OJOP=C3Ff%^sY{sIu2Wo`Y( zwEW*w@PB#9Ozdo&|C7mQ{h#{t|Ch;U{jc)#|F4()FO&b@O=oC8!@g7;aIS9jH-|R* zcG7S}0*JU_Avy;j31aOO-okj&Xq&gV-5e@99Z|N==>p7Q#=w9)Fug@N3DiJULMpKkZ3YvSZxj`H7Zovg1L$gbl2VJM?+K97gv!Udh| ze*-hmJspJ2@_1sT`0rYIHyV@1<^FkI5}Z)Uw%se&-?+e??x5W4<(2E27jRf$%gld? ze6g~Bb8hxvqRPU?_T*Pl^7c2xVK_#V+tsjoaqENYYZe~;D>!o19AnFV{WFku_8sNY zd9`CFy}dVlqTW^Uo!~~2Yi;@LI}`7;WK-(Q&hO(memwgJ$$!>fN77NLH zf52(BA*zd7I?+FakQqyi2E;%QrF(K#J!GyIZq&W30;F!;%-RC9F3nwk#T*0bV_e<~zOI~)9uXW; zT^#CuZ~fC(LXAC2W$NK(R>$jSIjyPu89;|u*{>+NS@Ql;}=O83|;tc2!pm96K?~ z{oU-?5Tv&N4I`#OqoPN&&~n!R9o%ih?YrrK@vbPV ztJ7Tx3oT{u-8@W>AmGIi&D~2vbT7nI@uVO;HQ%Hjgv#!L$tY5+Mjk*GfxQF1!&IXl zxuJ*r_f(FDu`Il}iEv{cu9NW{JA+V}UzVFQFm_mv%evhAfvQdty_DTL3)`l`h3GRO z+<1jix@IBD(4L(EOs7pI#z?0%rkA{W1hRWIG)ZI+?76dY>HfHKe38%mhZ_LI{*g3T z(N7t#rS}#yz(6FJm{4z*0|F+1*GkFHj8RNyh@}&W>?!%rxO0ZcSuCrNFxTA*4qI_& zq5xa-jAqOY#M2Bf8T&{vRfsdzm(aLGFe9K0hxpMVL&P_M!J0PoXD&m^{e+7fT^q5 zlIBZ%ASz26fhI%c6ql0a+VD^<5Sw7tO~NL;RPKWzAD6|yP}Jdf^k+1(s=TuDS2bbz zRSxqYcb$Td^v1}LB+@G7E`|!j+c~(9f$Y4?I;$zUG;Ac@@9%ggGJ@`yo{G7W4<-Cc zU}MrFTb1Q=WS$YRk`hkc0J&7KZ@47L4J~1gcq*mQPFnuS1--O&9rMf2T}GZIv`$GS z5KonsqyCyQ8U9BX%3AQ+L#QnkRdWz|wP*kfwzXB*ARnHwbdC^9YUkU2#XhqbVKgZ~Qc*;QZ*Zs{W(YdtJ~uG4a0cXt1I-f3rw zJS)VS2i!QvpG4bVD7v5V$Xm7y;Wb_D&Sg!|3OG&%JBszMfStwFh3ZXUo(3_*m*+KS zef87`oPeV5W@%P6x6ZA7h0-m`Mcl=pfnziC*_41a9*dr!RsbSix~L)gHxgeafkATq zGKc2ewx5r;j^oBgzGU|vgGO>zRS*w@H5+e7UK)vL#?BOE05oyo-OTP+&%?;46P?$U4Jgg6CtogkqZ`1-7{SfVyqR<3+kNc%RJ#l; z+Cvq;M5NcMD&#`zML}#$VX3DYnErkg6-JS`$`!Eox3^Jul_QDOSy#=W^Neu)oElPq zVZtYe-p*C9BFh(0%@*2~!7Lh|Ynhp0lsog6>#1G=AvTaz-LiPa7GklhL{SwBrmUo$ zZJp`YiTqdKfCqmi1BywX{DC(MDkBy22D0u7txhua&(O~wjp5a;cbA(m z`>A4`ISp1w=Wh8Y~GxgwTmokgIGs?TKz^*jx3LMVDvs74%!yiJ@e zUd>sjsU{5vl4S&>pN4K4LB=4VS*_`XET9tz%xg%d2IYCc&C(`{FlEbKDwe(^oP<>G zb)cMvnK30(Y%~JEj%5Vxd#kHcTWx@XJ_$bPS7IKL9;U6O(@e9&17EGjs@a+G7A5)G zH#BE}PU^+|qlR7j?-l+ihG{N}GmpN%bpZBu~u zl$Zu>k-V_yqR4(i_o@#q@_9Qd4|XHFkz+!~Y;-rR<21KH(lztu6!tKC=NhA;%)f=2bpFHvA2x!3r6P zAG9JUS_ilR&ru&q9%*Pbj)wMol&Ch_sT7-%wzB6r8T3&3AOg}9Hte?eYko){7-V7gWdnQK-{rjXlTevV?6CPVFCA!V zfGs4|_35Nx8dfLsZwBHx0AE>5nsKC*aedB|Rih8Xsk13@ciC#1^83IB7Mf!xP@Zve z>Mg4J2iuPu(C$v6Y%}FGh_{>SM#?0K-KXa$C!qlCw_|f|Sj8I~qY%dlU%@R$e_Srt zKOMHzU8eaT1S)AAmOd0)+6FRctL>BV2nQX$L6BRMe^>gP&g$UQW`PlGK59;FjGLj_3Ud02SsyR@R&tbp5$qWm44I!(8@tUH?^^ z!xvJG=OaaL^@~)ZJ zN4+sTogxBlOcVuo0op3Y#XR+Bf*K{ZtFnxaEOS2Hv7lve!{7iY;^be!;pv2694;hj z|J-8!kpk|oRIcy;T&e2eLzDGcyLIO%n1(YywK;lf)_hoPaq?8C=C&UW;z#;Nzi8JM z<=lt#AoXzbZP8?F)&%$*1{#5 zQ~o8mUXtzu0>%^>Mxz57`pJ&$hTdNV>8P!KWJ5aBK}R*v^Ss5JeK1D%bQUh}aF#3} z0Amnvi=LK6+_pV*(nlKVR{^p~XI_9JHKPogXCEdV+b2?hmhr{V^JtXgIsXH}ZE_o` zBh-sIf8h^6uo`Bpgtn>HgYN{0cO3maxlV^7=T9R4CFIdegm z3i{lCUrwNF#%X=k^pM7a4TXRWqvV5lIII1F2NBS86 z+{XshZppAk0ok*IQCd^;>PPstc+p%+C=;q9)!e}NcSkj+8e||N_sg=MTcCKq+a{W& z+gJ@Lu_29KU=r=CJl6e+WOV+^JY>belzmMqQ&R|ep?HTay$wKkyCq(qo)J<`{I8TM zr3y2wvhVUWJI3^h1Y+~wG|WZq`T;|yQ7;ka#sfQ?gIf}B2Z6T~8R3OBZg+#_tSET$ zc5KvHb)MWM%-Hy1tP>E#7g^XJfAR{n&LcDvLJIysF#h_-_*+A%*c~Gk{}6j*MxM>^ z@<|TaB6{+z)=KFh6J7Yn5k=hvu+QRKyNz2`{T9qeNvh(88a=wFsRI!V3ONG`Eo_*Y z^a=xdymE9}JT@SpHILRnMYV$(ic5#C2=6F@J)Y{EE!X1XS5L-r`rTWSL12}Im#Feu zzMD8cprbigY(ygTqhD`?g5TIU*%2AU1wx{jjm-Ed4yIVV-4ci<9rI7j(S`_as#dB` z(}0iw%|n+rQed{Nn~A@La3@vBw9!Pk*~^}?pah^1!hY@cW9c>+j$2KXO+Ev(qmm=w zhaI?BvD?w()s>x$?Jh21CNeuo_SqEen$5EcpFWF~I$@CK_&*Wq7Tttq_!Le%#!nAESg^Wm z82i%gNxkZpBM8O&3-l207A(TPw*T?)@jR0tjZe?y+5y-xVR-As9P7~_Rjgigl9Rvu`?VF$hg!)&-;Q=AoOOEAGpg6vL zqYs&CuWo|u=&96?$o0D|f@!>aNEYXIncI(}FdL-lKb`ibor!jVM6a4eg5fbZz;Z2aiYN9wE z1q?^wInd_Ur%eE#9|k{Ap=mpv>I9=8!0$G-mqQ5Xh*WuHdu!FhN&ECJ&9+$Rh{?kb zBO>Zl-?`l#Sej(r1Fyyyw<@NY=My$ z!!KTbyFpgny|;i^a@?&drXqthC4REDgHPwFD`r}8UL^LhZ6(T#k;o0l$qFzh2bj2z z!ZT~y<;>q<-k#9J;7;CKGKQ+?9?1{a)QBG$(H&+ei`KyFETeFRwpyT^nF+Lq>pk8Q z6GI+74rp6i$8#CKaG{7@-ho+#8GO4E{p@@`4`;P^ulRNF+Cl%R)cg;Aj)jHkf0Y_G z=Kt_D*;xKBO3gneozp)i-OT$ixcd3QA$9JK(>ZKCeUFDCsnj|hy^N#%0hLse`T7Bo zl8QC%!{#EaehD@P3_fXOMbhLyI%5jh-1q*aiEh;}!79)%r5}E74P1|#tB+$d(q(U7 zFL@<8b-Gs7WbSC`k%_9BMHwEv9`Sb}UFJI{>E-zon=;PO!=vLOk=HiV$ zeQC=t-xoHGQn_V3fjxp_x3Z&;JB(H5+C)DHHOz$R{wT)t2@@|BAyAL%2(0e=G_*TT z(%gV;O{uQ@UNLJBi>p)f_PHR&^<6Pe64O9^iu&3D+`LGfBK*jk`ACWys0LhAO_z&I z$*DG@yHP=^XctBCwHtm|SP8SB%A7rvDT5XVD;eG-;K8XAyh+x+R~0GF+{rHpAJlu!%4B@P9oNIg#g&3XTxjgqD8NnZP~Pbx}&yBQ-m;!g)nBLbcX z7Wo8p%zT`j1;+($l!c&ErVSOig#4=VtA%}%Ybg&z!M7(lD&$qai0qzcS}Pd^cxBd7 znyc?s5h^#vzl37YQ%bA|_bg4Q*aQ@j>Qw2q{bmWUp;b}zyS^t^ey-%Jr4f!_?Gkh> zjl}o}4;H)NOiSFa^}FMZjcjmY%%8|kHu*^2ON}ufoK09L8k>>~L9CLD-)$|x3gF88 zokhVqR*;s^!fKQ}h6(?+jnV#%>99nOQJJiw3AsMct+I*doaAc@hy3~7)5S$NlW?q@ zi2x{u^v4mRf5Zdp@(|#B2i*d?v3vjnSa}Wv<~J`7ZIo1sN>9xhxrwL)3)NQj2ed3_ ziQA@m;4v*3#<8(5?-^MU;65p43znamrblnA9~kiGAh#c%fvgokIY-yRVh2lNDQdJ1 zKgBiJB#}M4#;_ z!7DrADv^z>cSK%ljmfB6(GAG}zQVy!ym4+TvN`VKC8{;HZcE>#42?7G*EBX{a`@Xs zP0Xk?S#_UkV}e1NX(AxOr3rZAn{ijt#Wf5&1FC!9d_snyBOVr3}?8F|W-9R+mPr*!>7d#7MwXzeNU2$vTDwRtv! z>Pb@vaWT??w9fSB%{-Ln7%Qj>FefSnJaA5WG6M4FjV3;E*TsKRf0f1IgC73-1Q3Zc zOdV}dtk|nDn*o=E23V)T_(P&yb^A1yz-N)=WJ!CaQxZQxvB2_^Uml(O8^Mf5WfLke zOP^0&7yAGl@sg-xe=r$*^lS8Oae5|TZ>hj-z*NgE0;n!Ikzy278TFoIX_2sdAu=8> zYfQM=6$1w_>=U}GVMynp>+Qd!Ysvu=&|QRl4--*z`0Gq=-;&Pp^y$SJf$)V;JPk2k zneYJ!ZcZ%B23AE`&aKu=n??f+{DpWk+Ge`1oYt{cUBQwRK0nNY*ugjm(4*imPUcW4 z+cHT*M7=RJS>w9k$yun`&G*n*3ZZgs-RL}d8f!Y$nr0$EkABlXL*5#ZQ*?eqYkrHB zS0Iu^rzo0meAM*Y3TL4@e~~u{VEKY0O0u#SL+vi?SY%Ph{5_8L_CzYRr3Zh2M|Pr9 zU&W#b`-Hl!HH_kGx{J`-g|Xu>?I>ZbB`G*xeIxNCpAxZm#ZIBC?6$rmJ#T`I2lx}9 zXUrOGz3z0#;O%%wN>eoHrLd^6eswi#BizYDI9I2k)02EgA`~Gz30s2AsV;(}^OhNG zs-g{o4TV~}6xcbniA&|Ak^u3VvN^A&j8s5 zwVU<(UHou%C2KNg-$_~Jw6YT;fUYE-Q9GnNz4{X-3vR(|>mescNx?Vmm6L>Bg&GPJ z827klo|dx<(9w~Z5<{j2>R_9@^}tUf+9(b83ul%1FNU+U8K^qa0j5?AjIGUtkj3Yi zij;8#XWdxXWtW8OKyx!e^){>lM`nAqaD5*RqxZj`T+w#q?P|}jLA!ZNTE(AUNV{c= zMgT@xGJ!4olmN|=sP(tu&hE`Tc}iMjoMqfV?rfS)4*Bv&tu96$P}R4CM-ZD$Afxrp z@A!@gneGKdY~u14rN7Z zw~0V~p)lC2JW-WmMm4%!b*UTzXK*D`Fi$6?g1qoW996ETKY15e5Yx@QV|K~EV#k~t zA8RL=iR+$p6NMV+OzbUyjecasLf7Du%^GI&#{~^}7mKeWCRT7H5yg#p<7z6!wpX~W zd|JbwLSB34ss1j0hhn8G9-v>h=`-&zzN>XU@k=_>Rb2$Vxao1P|W+D$Wv=1E)`jOcc=RH zBF7DNrG#rct;k70e&3)KTKXHvR-NIfVzYy+S}o0Sdzb^DxFB6~BC<8>mHKgJaG|>s zD%6Bpzdnl6KX{6nDm!O5{J$7(Le5N`M=V-ftX+Hh{x8-X9P185w z8&-1a{;yEWX=xo3p7px&hm>YC9OBqfvPv8|h(tV(qD(QU=!p)y>yp@&^0#gq)Snl0 zs&JTJZX$9tNswe_pfG87*&s?e|1npEmdMwt=E~;8Xk2d+O+jtEaR5Utsh2i&Q#M`N@ZW-)-uQ7qLKdY9!0oS zf0UGLZ=Sf$>9s`?X-P1x9)0uEXJ=0ySNU{(=+6ZLI4!xhMhDA6QVklXB+8Qz-J9Bu zLlt?4k99z^bvB9#)eIAzJyXyiZ74X2dm+4jy`bUG?IkThBO72e=I;KDZ^*s{e4w=c zEZyGux$P-Fl4r!h9WTcppH|O$Fs>3MR#b-9x|I3+^QvaxSL`1?J{_MQdzZVr%je0- zOY+JfznbHVz1p|j+1_uUAD%DA@6zROta$an`Sn`|Y6D3{+8PnSTClp#$7Bit8RIl>Qj0?2A&M)0bJAUz z%S#8fHei?-xvXedn|GuoWerTKsO!b(h!G^a0CWIM-+b$ROmTkD8?XU+m;RtkfYG}jdUw)( zm%sJe{g38`d0&CKMV^ILKIFu2@(%nZcqZvtf5OjuU`Z>@q@-Of@!BSmG1L3pVZdXg zqI0VHw2(Pt4S(MQqR4DeGFaQ!cO=6an~`>mSKzW0PN&YXkSo1$vJ^%tu#Tu1xNO#?r?Ht2-Z`Iq0QcW8aISU_aikT!U1}C&| zYf*YuBqN-S;bf7rr}b2&*Rq}%`!Kg|79C9hE;uGJn8|<+s$8iQ&9;atS96~v>Rb$_ zsy#GHn*D3|F6%bI7_5V9#Vzjg6R99%lL^h}S!>W>RR)o*LDiFHr$?~W&XPqWxiWc6>oi$+ zKRY-^>?=@>5~mSPwYr=jB~#brLA)yAkP0e|H+@Gi+O1Mo`e*ECgO69Dum!>I&xK^& z6$Erjr|5E{=kChWdd|+F#Y%lqYH)8(U>yiLFK1`lLlrt&TR&i!Q@}6weQ_0eFjrmT z7D4{nWWvO<9Npkim zb1d0Nt?=cZAg{j8{<3z}7pXEQPA2BE*Bd-i#0ulj?KW|m3k%qoy*|v@obVBtjk0cQ zdPGMa1@CR>DD>KOLN4{C;30C^ThRjN-2lxZZpj2WpC#Dcr=|L(uBi>$U1a)ewTeF{ z3tsV#uDE-pH#A@BdN5khZ9$s@0V1&^z!@zI#q-atR8skemv!XFXv!Rt9U<}!I|0)v zR6oN995RogR857<3BcQJDzZR~)>mzr;PRB_%}$^!4Zn^PO|qH(onUr8`hP9Xor5rL|UZbsPdWAwcx zSZc%7ki%oVQBNjBfK2zH(7rsnl3o|{+O1mSN%m%kBtfPP-S05Ydb7sYP-JA#!*k-p zX5;EuD+RSvV%UW1RVb)Ou}j-F`s9zpykx6*^45ey&2RL|3+pp?>W8oS6?LW*YDyb- zQwa`l*N+Q;5UW+gB?alYH59gcbpF0IcaJi8_Y`rT&7*6KaN`Z=f14* zF19L#tecptju~C~1!%Mr_WWrqcP-pBUtOxQv ziSEr2Q9BcMLK`{A`CqJqO; z{sC?KH6-l#AfzDQr|6@}O%LxinelY*6wXD&@>%t^g0`rtXex&BE2-x`tj&2U+0oX! zWOvh{(iRup|A-)aYx&W>n#pF6#zsh~+gIDfI2p*Q-cUIRALeNmER* z7eMQB3)75%^Bf-mzPHxTZjFcT@TjT_OE82$xdI|$U6HP1FX^Ml=(HoTJ^tg{hpO+el#%yu8bkbkg_|>r`QC(W+up&P(HXU@? zSli-QO12;EpxwDCUH(OK@DjAGD?bB8+e+{1#i&^t<+^$L24l2_&|2%}1$s!0+#2iV ziKK+l=mQ$0X;ie$H^g@O$3kgjg}sQ`MWH%yS64v(TsUbnm7%g#c?nE6Oq|zZzs1fK z3tuRY@%@tC&5&tAI&II7JI{$}-a2 zG&?sfdHIrIwFO)eDahgP_nw_Qge7w6SrW55gp^!A1V?OdF7Ml-`sS>w7q{f0?75Y@ z9wf?!`Q99!H+0w&5~Tx~L@dkZ_yxqG&R~En6%@eJnlLsstRN7_7=wG_*1c6yESrbOV&DnjD!%{0zK=GL<=p zo;Rh`S{ZqH>0jN3)F19EDdGO25h;y^;E*M;l}Axe6(JC7Ryp|<%d-x3dpt1j5YG!80@}c@?gxLUwdb zp`z@&fa?{x1u_ISuV2SH^F%pF(-lBB2jA`swo!-$K(u^U(1JIy*$@s(2+a^2A|FNY z2uusrH=18jOz@ZKF+kK2VIImw>-;*v{9`%QqjZ8r3hv!4s-zf&7{+KzW z8HH_88QBApJs=>poEohweg+IB@2sF{HOI0MyN`gKSjA530zp-pK51XR2T=k#gY^C` z7b*#o|K^CuDvBYc(KC_TP@Ew6sD{*wc-bJhORVDxeOKcH5@*CA&B&*r-#wN6*L*qf zcEW269H>it&(ZU<1YLVzD#Q&9%*g;df7f9%Eyd`M+X|yhnSy84T;W`mXTcqCo&I5k zzoi`js)qgL z&9;?j%OYfF?I>aD2hSH0b7ZBnK3P-Bo3WbPDZ8kuXT*Dxt*Ou|eC+@PEbqNqoxwUaQmlx7RkiO4=|ixz7fI*&;J zfeVW}m-fQM-s08Pb>H>tx~+}%hyu_ZDDs)w_zQ=u zurJmw!4Gc{AAC4UFOH0$FFu0RcA=5KDR{Xty4b^_W;h`-2O^9z_yFob=v5he(@uf1 z#x-I!P|TD?q36k>JQRP8pBESz++^wEd&9 zovSBDQb6u39beMW&bzO484dJF2Lu3z(&zJ|GVIaqZn4Ndjjusw#7}pc-m+NsJ9*ZM zSlURAW&T_pj88xT#7s(z;~E)(n*5d2-o*TeTu}(~fZv|-eLES2pXuT7>Y3*}2N6PM zL$U`{=ww8^3xi6l`ncO!fA99Q*6nuxzPtL;!}f6ff&4igoaGPXfBk8A-(DYmWz(xV zt;?2nbnyZL&}^Lrd*{Q9iYm=J|&p%D5K|f|!>MLF}Ru!e9$O<`eVTXO5nkHwRw!L)NNmk?C0*fDxvU z;m~KEW=slDZT@i`!_r;WXB5B?Qn2p!IPMAm5i)>4V0Xw)QGRbr-PcR77a5XRC0=88 zB2I&zJpBG!-b|w(z}KhS>vy1N3P4o>yWSZ!K?v>?jun(rvzuidcecUCH%Xw~go*TGCS%Mga zAmo;-ZYQPGAMYA;?Q6C+w#a=l7M|iPqAi4BflZP+Jk+KfcXdS9j*-2zdzO$3i(w_y zcz{V64BG@U19NsB;LJtOUCxH0*Iy*!VLXF}DjM~p@dapnjc$ZKrnkD(QmF4Su-zTP z_q9lb^7qJ?NZFt%wC>qW@m8$&@oyXM?m|^pC@W%8^qiynEZCMR27=b|$j8+ov?e$c zNxyTVR?d#unO&QTNGYNWnAC8?VQ1A2%w}jArK5v5B4*hz6FF<2<2DSIi4}(49I88X zTVWk_^o#`W8r5lxc}CGkz4&F&eYx-`UCKPY>ZFjskI}xI+6Q=cpQ^ z*)v&9{WClkiHjGukis1xmq?)$J+52UFwmzs?GE~tw7=QWOO(?9k50uN)LSl&6f~c2 z+1n~9L)ab{b4EY_6E14zYlZSJG?c_Dll7qbGK$Y4(~@PIXg0x+}TO4II+* zj9wauLJ>Yd^uYQm`4nnM%!BGgF_4asG74)WBaCBG>@gi3U&T*_pA9^I^x&=rb9P7+F8baO3dG?O9 zs$~SZfk?Dw4_R4HS2lvxMH-;Mx4E9zwcz)N0smHw zvyhkl3ze_lJNNDjTG%K%3qlU}qe1-xZy z7mxgM$V>GHJT>x36P%%;sp=-ek{1LUv@qxp_oRE*0q2kx?qXE-+6v?ym&-va`OVyB z#Vd|Ac#*5sZUm6I0F$_}${>GV*xO!{0XSe!^5(B?Fv@mzejvzFHx_xVl06D{TuQK4 z+25&}Rzi0pd@~l!sK9*9xRaYV#zk|J^eu|(k&wY_vrSfO&tKdo#?MvkXG*B5xgZzK zEBa|Kt=7m-K{@EM;>d%J@7EunueG-(e;kdw6`*9&s+gz=b2vp!+V_y?8>8g4;ggth z8lJ__?8`U zUUVxS=qc7O7f5k7(^VuXUlvHUp|-svQcQIfy>? zkUyNF8Ws9Da5_6}3Z1v7)s&k9wK`d9RvM2iL1|$HlnZW&Gl6n_)P*LV1wP@g*t?q$ z`DqYS=M)~Z=w{a!Vz{sL4x;G51)M`P?K7g8R`M30;yf_UyGA|7tjq*lXT z7a=wLCil~~bPRI|>bIkniV|M}DuU@P#%Z*N$M-)S61W``tTOm(an#s}z@e{}ce|g9 z;RlLqVA+3+pU{ul$&EiG#BYsYotTSg!C%{HK^Ny^DV>N+ouMz19y4gT%#hc zrTGeYCdc#vai;2RLctd`Gdu!W@7bJyP9k2}_7nD}t$|sbTMQ${xtWKa)tL07=~PBb_uf*U znm|k56?$4U_2iyoT3V0B&*WH5A8otA(=o7t3S}0wr&_5^TcWvEJ03R*O0d2kWnGTWtR|1t{CUl>&5G{eu4!%ddQRSoxwdkc#cNt5WSGm)w(d18aW5VdN3(TUtPELE67rLlmQjX-X?ZFp zR>v28k|_qI@{f9`QP8=-tjb^3_a@mISrALD;;_1a_TXpvj9>7Ddwx~{k*=0&P25shvxZ%dMuPC&Tzi78_0IX~F$rHRp8y@yM3j#~BG> zm?G`S^SJ3AOV0&LI5T6RfXS@j83M?>;C+Lg0QkP`imGpMlnmnXCru^u{CW9_{>C4d zwNu3U@f;Th#X1TXevBX#+n|`lp^W^rK^x)R+ZrI$5bQ1i`omaLwIAoVz;Gk*@eyPAa2?uD~>@Rti=J*VmVBm zToioS{G=^(X_V(9apAO%fqqI;WT>(k!0~(p07t;{Sf@@7g=y=p0MC9I%}Ay5VIlF6 z_ntX%g*kC%lmzbwb3w`J&4vsFj?fF5Dx}=gDO|GMYVl0+M|nZN^CVKS=DRq$_7s@8 z0xbrox6W_p18g=<%ya}qoI&Mt>v+M>7OCM01N(hYERHXg#=ldirywCI=D{~g|sLXzAHb#d3VU>st*?SY7C*UH+)WXWj-itM&_0rf4Ug~sAoK3d0 z(78;-(%Ez(G4wY;@W{iS;Zdsn~dq{6W_|iK>weN$-h_%5WRdGc2ekL!7HVdH#@$%2~72+ZynMp}-T~l}s(vBUU_z z?=EJ$V96`F1VWg*M~ukE)@_V7HA2>Y&Y%?s;-1Ds8#x_XD!YJvldhuDZRTiO98Io#9z zCCe(T%4IfKIrnEWexeMRc#uB1Vj(nR&zkb)&Z6Rg(G{Hcvi7K%;h2V$$YMzADn64! zeV`1_PFwzC^1e#)9%(-|Cxj&cx>UD3L6p$q&rPHqb9;egP#XF5?PUX(r4;lvG`OrxDVPrz-pfDia-kRBz+|GmpS|seV*}Nj< zE>cUXtb39>6;$)>jM1T3RHJI|%CPbsGmgZnNEY$66Eg~uV3OMR{2 zdvwAk(XQj06R58_DqNGgG{Hia&$$Ep`UYCet$r?AzY-LVK{+%bdd1h*9;$5Wt7_ka zqZtsXKW2-`n%q5CLWeC+Y`3f)OHc2}5k}rr!zio`Vfk_{J*U*Z#W^sp5Q3fUd!vI2 zaQ=QCL`wUwY~oz=agaWWZmv@tTLlj6EPVcAF5x|8Kk`%|#at`VOO(})9?Ld)Him;U z#?a^P1huTe@5aGbmS@}YgRpV@EvXEWgtpP4X}Iy8!gopt=4HPCb!l*XE?Vs$^t_z( z8bm%Ac$1grf9YP)Mxe2Mm)lm%d_$XaZ|5d|bmrog6mO>)N$H9KXYSzB+CEMZB7@Q# z2dv2_bVKdcT0JAC$CA>Z#)rC}Ptz?sqZ|^}6Zw6`)I8 zuDCr%F<6!qQ0y9&IHDKcrFOElVM4yFTxi~9@%At#Cf1HnYmU+R((r}vaOFW!a*?eh z)^gmEI1N%+?&~J1lPPM4DD_U*jjp ze)G8=7R$cIA5>55hl4a(RxKv{%;4Q16qtO*6Hoa5;si;j5IS|Zmp6UKY@drR{@Ah? z^h6BB*6KChs9=*3BWhul5^0^EQ^siR!EQ-g>=FBC<8)e?PaHrE&?2{{LL(Z|q|T?N zn>;wgPxYi`K!Sc;k&@vxC|o*azK)#07uxtUC>Bk_ej_NnmRR`eEw016pO`R0F(e!d zveCY13+_uC0gmI`2Vwme;qYASY~~X=r1*oWKG+nj&nua+BT9Q*>GpmyC~{9Nm7CT- z=XKn7%CP0ap3lUVO2+EsGraFd6?d8t$6=4MkNd?GAq!ySK8v{|Xm$euZ@XfRbur)x_)PDvAX`@3BLb%)g>${NjvGW7xd$g%|D z8cb}>9%pZQ2NEJzvf0dGuBQ%%1ns#Q8^+9D(b@Z6A}1$>)z}{AusP5nN|rUjF0jR>Z1}Y3YQ=kFydV1 zXx|vCXGQQ*Q-o_i*Kciu z(`#Iv-MkQDR<+**G1({x=A#5^ge+MMfsw9-R>TK}ifuO0x!mCN<;O25rtUF@ueImq zk7cEka!w!KW3}~Gv3)BVEOR&F&vvHhcdLjh>=o%cV56!(QNrXXEb~f;>9!6c{ek?> zZxi&x2qFgI#be9m+aqmrFOeW@anoT>?>SXdOS5n-<`MYJQhD8*`<|!$9O@O{kBtF+ zL0b)oHOOESnEk_EVuWdzmph-gun033w)cuF0IN3|2l8&ug+A~&Y7528_mvAs)gaA1 zG80B-qu(gh5BL1l2EoV|N6s3|oQG-cUTgU(D_A@Aw2E zgVKg0JvFyjkF&|Fc(OGxK0}igMhLokTy9-{$3NZmx{l!g@n1)nztZS2v9SNO-Gu$; z-jbig&c73bu>Tx%{;!EareBtKsK0DCanUA#a6kLJF6XpXSWnk59}+8i`j!i2SG(6c z|8p-&1oMn2(Hq|Hbw#0rdNEOzZi>A=ga_+aL@LxX=hOVnsy3vGIM0J#@7!#xPt2^8 zdMgob_N`8LZ`P)Lg0;%dwMI3|czOIQiJQhHOsJHC-r?o1>ypIldKyIN$%aj@hxu8} z>Jni(sV;t9H4li6Jga)ruTdDns_44g9aik%mJPbv6K0^zA3KP(Ra&|E$)F}6gK96H4CP9G zO%B&HQZHO#qVWphrtxb%ypbwr&TuONKB3(fWtDcpbRP~h_8891<$U{kR*Qz$w|Okm zFO#=wlC5aIHfXT)7pG9k*H}t53ot=bZw%#uc$?p6_O%s&9b=LTS-=0PpQz>|FZK|V zcDH%4H*MpBg;WX$LwZwvgF-xYk0{RxPQg;wwtRzL`wX%hJEE*CN`D0Rk_!aUnwhRB z>D_o%0#ucdnqiQOl((DI2crJyJi}m+isbi!=~4obMNSwt!Tu-v%;Z25pb7TPSw#qw z%$)3e!F_HCn&Zn&J~cB7;F2xwjqQ0?nka>9p&g7mxGJAxf53=mZMF4sN-htH6%@hq zMoG(Jfs1g(1Rl^=_{3Zfp4#V^a!iybN(2)qsu8d#$MbV9yps~)iuLo>T~m+o6W7vU zK9g~Qu10er_AcC{q`ziUD`z>S9jX-}1<6G0NsOz70TF^PJm-RA%SOYsJDm%715naz z#-oDAhgR}X+CD2omfyv!ZmF_?LB(JYR_CT!EtFI98~mRfR%>Y`g-Jn*_{C&XLd*CKh ztCTt&Z|IM8h5#QrH}xPR*FYu?L!o3)*!)II(y++TQ#3F>dLr{YS#5ScFo6S6?{x`C zNlkdkM?{ZlI-L}tGAPsVKCE)_`;-#nbQ`e5gNY*wW9#mblIDs7F-=+FGU!O)^gu`@ z`p;oyt!ve)MPr2PT0x@hVN^HYjQS~5AQ9y-66kyv!#M`G+HF{3u@OcN6V*?#Sm+`=IAFlRIu*Y~hy~%+iP8CrApQ!}>3(scO6yM*ezgaklF(60_ z$<1{>7@Rjez&V``x*|%(4RjOoK?4A>V_S0?sfgsOo>K9+FIjj|x#N7#6{my1bXYm~1MQWmYv=1&GK@n-wW!*p%n%N6xtM1d39NVxt z$W;%{)0Cnwc{h)xEXXbNCA^6zHE>if%sd>XJx&m1Q|%VVh0YHU2c#;LpXP7Wy1`0p zCoHqb)5W7dMV|O}-zGG!14A3cD?L9O_yNg`rOnViSOoOjArXB#aso&kdKEh-sY%K- zXcPt}r?9CV63?J6N}_JgqEc2`uew+<;S^gTXczNCto>VV_~R6m=0&jRPnW(I-~02BeDUzj)1G=MZ zAA)WGQn*%u%_8Vuq$&_bhY0*v!^UE^*G!Q>OP{xu|c zO#H9}O*2#3N^731OxQPWL846{Z-nW8C`>fbWFHTC>Es?DIxw%P(>RBIN=L7PnW~9f z;=X@Q0T1dY@dsa-dlav$jHVxAYfg_ZwyCx7WZG^pC6}{H@L(tz);%On84KB{!|BQ6 zpUNk_vIMsv3z<%qzf#b}x1v`${B}rRg&ydm<7(wi#5)o~KEJj@L0%saF9#rfIWWUl zwM`B0-8A4Kg7`R9dt~tatmx9mj{V&J+~&M?LmmnJB*qpZ@-w~S1aM;0fl7&QFtuov zZ#@Kp>`M+^h3UK;_lnwI+Ef3UXM z1EQkuK}3x&>IT580xVm=eEkExXe!|PcfiX&qp0wZklGCNDPk7u3aHy>%E(YjU0(5W znh$hxUF&En3#OYm%Al!N=>6HmUG0irw8^Gc-qP7-1#~ zLvHy948la~Xb2uN5#z!w-B}<*lzJasGRQ-6kW!Lfwo7lXCR!>sW)8#_cFG!>ROE+c zg9m|WGhz+HVFf+X$HEz2V>Xy>FCei1P<)W3+5KenY4eRl1-3{qS2ssHwh6~HWRjgF_vr;$d6goXHjpYdpVY!;I25sPIAzZ1yL+7jFo3>auk5nDQw!JP#f^#C0@ay^ zoe&J{e&hO~%D^NkDTNnfPWOi?$guYq&NSb%K`PTape$EF9}Xm;YZX;kf>6Rf(VSV&N}&_^P`+NF21;AIr_~m?1IU8~zpF%&CLpgmD8MLw$joVF4pq zK}OrBn;;`hcR^5y<5rQ;K#B&68B_X;z9NZO!DGgcTJUF&)?8TgEjI6ooyV`Pv7y{k#x7?us?r_QgJc>(=3h*=-&Umaxl zM2lvgyItt97;@op1lKw)7zofBwL~}cC|=%q_9;1WgVJNQ_1=rMOY@x!ELt5`c4SHSlHpRvRgA@Qs^Zga=_l{s_ zjWHQ{=c%i1#cFC;Iyc10e9J~uUfUj6%4K#^KNCGc?8YwCcRbTh8O{lTQKYUzi>cOE zRqhOSw~kX#%j^EBA555RW4U(1HHR4doQx!SvV}PcI=dr268hMd`pD7K^x%0-ooDfV z1+gwLPjgQD+TArabxu!pwo|I_17B12X5b<-RfMWBB*?Q&;Pxfg+W^rvxdO+BH&0Jn zh%0I7P&SMnp(IQ?vavcLx90)26WCO>149kE3g&s$>1u;4-!F1i$*KQG)DIu|2CW^ zu&Rz)#_S&a^sMniMwo&t+!IC`=>-wa)t$8;8%_Mn;mO6$8>)ujj(1crJr;xxwf1be zQ_?|xk;1(0QBf;Y+$HWw*dlZCAW6Xn5R zp9(UI3NhZf&7}HzXlhuuu2$fw?*i+WmK!-s9;QV=K9D=;EqxD#w$4t&v4`6}53uB- z2vW9ld;rm1C~#MDp)S8(%Y9dB1-(z^Q6@+pGEY#QD30sPRvetJ%ySym0NXy%OyLf( zajhXXXW&p>V&l#8>>H(tY0Z3P6I6nfeXnhb`nI`|nMK(eR4xw|hA|~o|AT*Qcbhjl z4KkpqH?Gx=|13A!o+c;C^cha)a@w48O&Ds!6ZDQmmuq!Qt3OZhnMhout?R}fxf2%F z@OhtSeD7(-RfH*x$OJB30Gqsdj&CFVE~!0E*MtUq*&640$Leu z1u2+-QgS-Qt1grEZjxZdoijQ_ho;6#?qJPAA@GFNzoxMxY4JVsG{rk_h32-Qsa25*i>s(8ATvW-5`Y;Zg3-lR=hHNF?>Y%(J}CpS-@wXJTdg^(LR==bo8=oM++q zd4j?JI?vLrDi)>Ci#BpcA&YKa?S8($LSEUhnP&gU3%*^=5V zW;OF<3U`01`O26;@h!}Sd|e=umsZBcqaxsI!sY7C^$DzF0Z>sG*X&enA=G_KP;cLl>KQoL}UF<}@+ z&^L-c5Ne;D!AS5Pmj{bsE-#-%1P}C$@$6^N_whJkEC6>K64J z+=};La{p=g5pt0X5>EDj1yhjfO;`TF+tEAR5h(^$((^i=tqDryWge0+zMK4<^h9NR zk86iYp)pyHSX*9BotGVL;3Vl`byU|*SYI?tyLgl+e3?pv85Q3oETO(}y2s^(ig0E> zavD=SFmCXOEYFWWpmjU)|4=oBFgLRhZSIut&g`f#1&Qwx9i(kQ%86_arS}H)Li#|6 zzQPTm3=L#`Q&ZOjmBr z`GxJuWqz^Bj1rUCa)u(&6fu3B>5CJV8G95Hj&I#(%mI_|$wZ_e5F8DD4=q^(<|b?qXJoq~W496rlQ5{t z8vJ;viu)^WXVu)A;zwP03q=4WbdB9s@rPV%g8Lj@9n2qsGD1-VH)K(iXoBL$L{SvHV%ys{I1aXBjNxUc8^q!x^JGhNLVuY%_Qo> zw?azqQedl1`t&Fn=zKD2WR&plGStWhyh}tZ-|$2EG&Ne9Q-Vf{v}m>jK!Cpb(HLL` zveA>7S4&kk^i{We#jHCphDaD8!q^HT97SlPpr}mzxSXzk^J%edF*HAsPAloVYm2B1 zWjytbCR?dd%}h-n#$>8GMqjGz?NOvGS{r-vS)~VTM~;l-xldfRtfV45I^V%QU!WhJ zAZm+8iy*dve8v{Uw2bRwvj~vimp95Mfnhwj@)Er0D0=Q{X6H7ir{wQKAb5~Su1Q3z zcIP@77ujiG;|0rexIZ+FeWj25<^$aX78=mB>J+wBkReW>6i8^cVfc~ohyBJ$KW)6- zan)y@OPTn5iM$+U@|<{;BnSvmQ5%#9nKJ@SOnm>?kOSV#t)nA<%M}NpFF>f0hQP*^ ziG}%X8l)eEziq_pPIU~T7J z+=wYkGG3}heSBykO95%B*!PX3@{8tV(E2=ypttfiba0oAB!9$cZ%5Vcl#-FgOH9{w ziT;ofbp;blygI!IV-Vd^=VnpBBor5C2WI= zJ_@cV7L;D$7(zeIguVwTWj0S$!x?FPn!TC&2i38vN>FF|H^*T!`cPTqtS@toMnX++ zl#SacUIYFt`E!Bul~~=iV&}nCBn{xb3dql~D%Dwtnl=?O`SII=o}DR>R^)c5H*n9M z9G?_*FYHhu_xz->ogcMOBM2{f5FXWNm@H@ut+B>cR+NQiye9!_Xh5{}ITZz?nWfs(j~Qd)=)5btPIJRr5G zh16=l@?G?0LX=4~?dGY?7Ii)T1dA(FauZjFqbh+ZA-F(%klBy(rf!f$Qw>|HpDYR)u z)mGHmX%bVpfy;BMWdxokL27_8)wds=S4<%FRJCo3h#z4}Ek}8!bl;(Fk*{8N zo2lN~9J~ijfJ;Th3JS9|}naz(xVA(<7Gw4Men!Xe`@U->R78nEP^sl9nxsTT9mzQ53H0 zS6v$Rg64SgOUR344YWZ_L$c8^n0(sZUQDMXCE( zm;t<5pnQ*Y5Fv=zQJc;oja(QJGroY}X4jW58kY6(#_veG}5 zPBol7vz$#|vO{P_%M{%zyh3-YufcK*`_Y)1Hq8!|brDyA;tkG#6%R>D<|xf_u5Ow% zjgT5*ZMz<{>`M9BXnn&Ty?ASyj}G%ks3Cf4O<(*+G+by#P0JQlto4PH$8Q*#5Tqw#e|U%hbwn94Pm?nzn&gb_l#37e9Tk+k|`$sDS2M{i_8z8&xI3Y1tz>1P?}mZ zVWSumhL7{0kTv?-OThZT`j$I7B0T(^ITF6`onz=Mfi;n`VdB8LMzsAXlGGTT+gIr= z)f>G)cXS@dk{c_Go7dI>mzU;Pl=(BjfmAqU@4>ru2?5(A+K;+<;%J5AF>-TV;~u%u zhT|?GB;DBL`~G6U!}G?OMV1qyf+7 zyt@iA?-*^bK2UP6IiL#PvS`w+aJZ{~luP|;3KGT5?^c>p*F-xq{Gq%3}te>Ts&@j?^~eMoDAmk|wwMp*xe2;VoxD z_FWTtT_T^q%*xe}kJGk-Uu9wbSETbo&+(Y_m4iep1!8wemLjjPQ}d6Hs;7LFab^6^ zb7n*j?S`-+dvQR$rTEPxJoABc{LR2f#Qa?tf-k39GJQDt?HQ=(?bVn662iWQraz-qMpjnFUm@&oZwlpItPSX7 zbc_t>Bn|XUboi~D3DkZDxU39}1Z*6P8UQ+3D|;P#0|NS&U)dU1+7tZDYA5@0+rZAs z!B)?}?&Wo(jIEWPoPoU>os6I`0iC>ov;9jwA!mCLx!0>ygKLL>G4*-7vWct~->?=S%OG_(zJ2j@)E^GXam+|$$ zg`Yq96EM@S{C_XR_)h?4emx)UPl_`C!I6KUDAUiq{;!?*6Cv||nCHxYkmwJRGXI6< zZyGZHArybpkma{=)qjG9EI%poBFL{&$?_MPzY)HkOZPhsS$@5C{||AQ^))-gp9ooB z$C&@9H?L=b{Em?Ir(FCwHvPXqLotgNL&5*wXgKTd3dH)i0{yMwf63^d^2qvsS7ZJq zQnueUhwU#^e{=mcOUCasW&00n4*MUB{zER=|A6~bxBoOoY_E#-n=yLbS@1hx_Mg4_ z|3L`Y|KR(d!2i(ye=tg~D^&gg>2DcH{*&U$@dw}kK+5rl9ry>NuX8-VBmJACFVg?w zG6`ONrX2y@2NQie0yV%N&tUw60LUfy4h z`e#Fbikd7t;FafpTl7~~|ErXd8Nm38flii@5y1E=*Dsg!0LE7g`4q$kFz{@2o zfZ>%~FPF>!hCiz@FalnJk{6r(a+e;!@LKKf#+d%uef&$%ukQSJ{dm=^mvDqY?I)4x zU+5!BCkCM7x3bkYu>B((VxVPa{uv7y=-CsfG0}6-vcB+)k?AGBEIl&;GY2Cr69+2+ zBQqN<6ASCh?|yQDfX>+7-kOt$(eUNZ&Rj>&jMh%aR>x6?*2>oC<(Bo!ofkIPyDcNSzgz(5N{4f5&nE%>36Nvrl;k2@iZ(f^t22NZ2zVudNoeE4kqUMcK^Zvy~ZTJ zXu`$@VEZSfdJR*4m9x_W*#ETY{|ov47De{ov#SB zU8w(ETgdU#c>d0xf2r!P5ydZ59E^b1n!llX4KjX}|3;PnSEzo|x?k?%C(RfHUc9@x zy@4&Au=&e~UC==9r-zp?ur#taCU|jAFP@W^*UsM7K*s{$oDLiVZ21HX1O@^G3=9k@ zASoxoK>zcS_y!yJ1_$H@7c@-nru5bqJPZ~z3>K{P1`PR{8R?n<;hGi^2oxAtSVB#} z%G$-&#K_p5fLwrrfPsU9jeyU>z}7@h$C5x&$KKe$LdX8)i#dUum7a-#y$dY?pSd}K z?9Uo@1TXUk2DXj{`hT=6U}a(L@B*FSXH;Tq2?PWLObi4B4g~UoZSWabQUM75CRi@} z`u*;8KC8y}gBXwpUh1*ihQ4Y$r_= ze(X1JbBI8z(BLrt&|u8apwO_O(0eim>3cvJXP9=HZlP7FdA?thr^ZU#GT$wYR(1W`)h!gLd1T%hKfJF1_`@{#SEJ=t`3Yb{%jqi zl?Y`Khh`naof)nFczJ@~8&5z;Rr9$Sfft&4LjOx?$OK?-|fhQTHtN41i0HJz+#+G!r$2 zU>!dTQirALe|}{6h>{=}_lD(m_*v4ne$>tgSf%M~<$2dfWHg_KtV4-m<#)vO}0(+aiRd zGxyBQIt{6IVz=wfG(a{|bu2kuRy32h(a|$^X)yE&G zuq0&)Y#>FIZ#b7#27ZcvA9P>Nl;mqL7JrINCppYOJeE|-MY7yLf#_mW5N32 z!>KTCg}4OYHs?qQs0BW8n0Hn+qF>NdAmFp8b9LzZFW8nE#JJ~jf7B#9d4tJyPLJJ} ziNj(q?~kU3W=x`duQIFp4tXF5dOI5>o)cR9GPx{iLw22gQ3_+~y@vo|*Qq`_E-q|~ zr-DphojsKkmYOfea(u#MpHu(9`-5%hb)6;ISn7k6(=5)Z)x;^N71=46x_N(4@d&yb z0cPU*xSVBGGZO#z)s(y(E*M>mp3^czkHSgvp&tVMAhph%Dhm1kr+sAfZ7j*FZ7#{3(P}0Xb(7~O&(*cdJihalA=mVHy&6XVs zQMlo9Db}6Jo{xjOl~B+Rc}q{p*yphNqqaz7oRiJ(fP=^Jd%AsM)YbR=x>&CWyMP#T zB2>#=^oenR&Auu5T2yRgc@Mf&5lj~-D|r{3c{jde%wub0NsJGx)K2P9+_2^;>hn!?kTgs#CX{ zA*%7~W(%VPKC{k=lvF+?Q|PlAUNGu?z6x7cdtDDjHpU?jEm~o>E1gXRy{;MgHMpM^ z3Y?Yc^)|VYAL1S{S(*=S?1$tGj!Wgek>B*Lu$$$?oG1>scij0p7qQjqtaZZhVW}J^ z4t7xxv2qcwdPvI}>T1g3Z3*x>I`X;hTqmbE1&-T8j#s*?P?$~e3pDeC6%ZXklnnS2 z6gmazaN3WnJQer8c_d}n02x7K2q*e}GKkx>?0!gks%N5((WXiJ&K8R^`GD#KkwT=y z*dV%onGy+|Wm#PHiQBr(qu7MGan9jG>)ybU>`LU;XTeCFzVX#rI{W#0y(`$KZk`Vd zm(DVDXfx|sWwjD<@ZCc#GQn$oLfr{M8OZc*W+N4 zo=@O392??>)wS?!_>a!p1JhMSB&qA#?Naxt?F_uDv|o#PEa^7pE~{DEg(!!O`m_)Yf#?# z&gk~Ep`g_0xz{w|@@;rL!`lyhfts=_j`slZC_fxmf1zCx6iMmzwigQga$^x>_X zBT0dEsk}@#Ws_N5yanQ(FB%bB>RjA5`BPY4^tah70Xh0EGJo&ZQ0bQ~j#b$7a)wVn zD5uN!UiKQ?jRuy$S$GNP8VKR*cd+Zk09+|nurF+laA!>scAt}*t)GSpuy-*=oUKA0 zW23n7)7Sc(C;cjdP_TUX`Zu#aMxsx8dg#S{$gjkp^HMLOwDzKyTK@Wsfic$1?)>;R za!PDOvvcB;tPUP$^@6N1pX+UA`~YP;b&oUCi{cco=960uVe`gqihKzP@At7d3@uzFk| z3+kO26M1GI?gQ+~DkFxWc&*TMW`FWFhjVGcZdCCu?{0WQ2rf76n$Lyey10^SA%aM;9!=q3&r`gf_CT!hn6D>eY7$f&N@{9z;$HDQ zuedGYP#VLtJtv*Cp1lc>d|sWKT3s(t!$uvYzTP!>b?;jAmb7Q7L6UO^OHEmu`)$mR zsiD3wW4Gf&p(We#>SK5R9CZ&z&tVp-+t!VbAz||l6}_YBT((=6yFsj#T8$2$nBGmt zNh;w&nSk!BUzurKK|6f>+QeGPNTd~qsT}hKBY7jVsUb8t(BTYwT2t-jyZYz^O`C*z zllDxl?nwufrd09GcYm4I@imp~zK|LRA8CTjlv{U_$gY@Ct`@5h?r%APVZ*jGS%4vA zP9$AI1{#Q1!U}?x_Zko;(J_kApOe}Nw~+6D_;!kj+hSo4-jwFz)Wb_)q_z*0!_+np zw-QJXnsJ6t-tL!ejh>WwM3u|TQ@2l zE##NWTO>Le+xyie{o{1#{JZkA;}9=o#eb-FY*>yec9xOBViulKffX0O9 zD2W>cL4GjX3OL#O zmhNxhF^6JEKrxlJj-JrrG2btJmmHK{$^DRnhXp#&Nr0-}j`tw$5&CGFcMWV;avla6 z@pkqY0Q`<6t9Stu4XAfS-S^NRKwCj8_-V+%wepZ^`NRMj^m|bVzr0T0!93_oE>YZu zcau9q^o8f3)oGq5R8a?PmiWh%z~x1CoYbLmTxDoUdOMwarJfV@k5kCYS+r;f&rn?c zsgaC^Vnwd#Vnzf}1o;troqi)#n z?520Yo~ioU@6@RSvDsvC)#M$4$+E~Xn>r=1kL>Wdp{odizN-O}VLJspf20PUv01^pj(KKZ&>8PEkti10jEl!DBj zG)}Ps#2YJEl$hu=L0`6EQ>~+zeUtbY5f{x|NU${7V(%r=!d6iPq&m~Ll3?|;6^ZTjKTQGS~;KG}2KrNOBB0#g5`|Cp@>h`Rxf)liDDq7udAUhVdIK5yfNMIx^x>lLDY)iybd^)4tWXbgB-VJzR&4r8u z=*F%IWc&s$6RvgHP9eJO@S>pwR~~C9!OPZ)0N1Ctdjn8nQ6}JNilUb?eNB{nATtO?wIULk4r|*%RJRE zID=JCNRyeXw_C`jAiYayPOfw+8h_-IoqwllY&hm(bX;Ut{$3POL0vX%GHxARJ|16y zW_(Tvne3JRLt|(#DvqQvq`T-OLesVXsV*_HEO1l3iQJ4gI;0=HmS}=#036xJ#(MEu zWw99@CrM}RNU*$pCJBn6`MOSP(TQ%;wNeOX_`%(l(9xr-S8NeBv4!I+dyavxw%+nX zUCg~u<{|CMfhL%Pwj5|d^yEa8yjaAVfp>|o5Y{S#8Sd$09v${TPGBAG^BGgkeoN=| zCD_&Uk|GvloKv4Q%W8@vj_wVMGfW75 zq{4KN05Lspk6tug|r{bC;~2~je>`bi4v2Rp4FA7&yu6qOVUj$P%lY&Q)kQmkV+|P z0r|uVy|z3BCduKjPbWW}K4NC1Qe-A+kEIVPm#8JHjFXf%aT>ZIo$3p4%|5^6DnAXZ zCmSu2ZF*~8WwgYIjJzZ}>vlvKH>u7Zfqf`yHwmU7zuzU03PwOw;ox{h#iQ-r4&LN^nq(GeY*L`f-he(4I{o>$J3&XYa~b#?%3%~* z%Sk=#Vb|V-e)nJ?#(KXe#gQCNvta{##KcixB*0ivG!aW}CF&-n52GA1 z)^F=PQ2lg_Dhpk~y7T`_joo ztALPgiC~H+CYqohnLF}c>CQq(wnLdFAJfy_ed|7Jt>2IFH=STF*XWH9y86M__8L7s zd76-mHIa#($6cu7Ia4zm*m0;bwB`j#Jxc5{ef{{D?ziNEA+0OIe-qsV{A;(!>xB5X ziRCUNrpi!cG>F?owvs$m6vvIUY)FuX7&;K!)>LnDRc>``uSZ8Z{^-2GGVpk;D zBB)H>ktGW2g7V`g{>qV|H~8>b-cIM%C%s#Cr-3|}{{pS$55u-S5x%m>@4l_qdtxF^ zI=WEj{9{}|VU${UB|(5Lk%<}^MY!g)E zIAwteZ2lOB&ziMc)#sLt$S-l^GnjI}4$t;yrO$@RJKErrL;EB{le=!tCbyLl3~TBr z>qn&rl*aZy#-lhhz|Nx6%uR}nKblANcc;{Nnp@ARQM2S4;B_8><`aZY2)D4Yg7@bq z{@BeyZ83g~SDIR@an)ut`ug466Zp;MRm)HqQxQ*~5*9M@E#lW9Ek`WBA^>!^eFkcK zZ;NS5QNSY`y65S51G?5jG!z6m4s(;2`uFjLIAIgICSx3(1uoJWo{{*tbG&=i;4zYme(k=U&w#8!h~9fE4dt6e zm;_1xsj8ZYy4>X9%O?mjX2Fuu;dpm$gptMI6CAJGE#zES?23qNa!$#H2{#@ST)}s1 z4!u;#ypXx4AJj@No>4**PLmxSPX1~4HOst~>1v5??|r*;h{p8qNyevs0w?^&glWju zJ#%ROa`}w3x69o;>RvIt6#B-|f7#3`wsnZ>V7^4h5}M-AV0XW6kne*!IO?N^)b8~f zID?8WJA`cZdE2{}{e)@NvctDDG2d*tbUmg2db`_-N|nCGHGfUS+`x*IVff-sPJ}6| zGh%nS>0YGdB;b$)gYcO+VT~kdRc3)IB2vCVjjWI)A@Y&iF^Bp0akK~V{}vtfjOL{^ zBE&||r#7H-oGO$wNt0pM;19vE!NxM+lQ6fdWd}$p{($5Qa&P@Fc;SCDa8`!@Tl(Vs zkKE}0GcaUi_`hP-|49suO$-c;3`|T+++X10SXh2Bs`^PVeRk5aKSOQ$z{u+DPrUkRM~990^241UY4GvE!GB5b$x8pfPxb#ii~qu~Ow26* zjbRxX{v&w$-#FI)5zGDujxW`KazQz5!6&2%6TnM@tR}MuUq~T^8lnjeA%R1MgbG}{ zNkH}E z>{AP4MPkr}TqK78WPHAAQZS%g_h5+55`+K`G->PU$^K-ugka&we zMWN^Q%PPi59#)nfyz}}_51P}?u@>#WM9?~TA7*-lnOCOHGRJ44^3ZZ}xjz>_rG}9X z>Q1Y3n#|)K;|PwCkvz?ncC3Jd3Y-sCzA)cG z=R!iQkPtjeQP8;y>DGfuVKHE#vAF+O#IxzvZG$3rK>y5xExTCMj3Jmc^_=jM!~#2q zLQIvk;bu6cQLZR19N*)Pi-L5Br9i2LZ(p!&TKc5RyYF}XYtbn@y#P!9!;e&yOCf~& zBh$?|U1GGZWFR?Gea`}D6$*eB;$8$VnTBx1r?r@F-pR2FBxtwMQUnnm#@(HQS*gXRc2O4JqgaG0*@kK1qaAx?mJ*SQ41GiU!>iiG$U zQgt9wtNZ?0`A?mBn2?cq*Wx=@0$goFblSp}ZxOJ8fa)J#whyhPxVeOJ`yieK2jqE; z8-Ifa4;+jQh!A`t5hJpLL9xi9jo^2y&0W^&PJ;hj(!WD`p z3y&xJG^IJ!z##~>@NJYVZ1g>S=SOkpVzal?UjTe)z<{qDyr@;1)39w5;X3OU+>m0Fc zGUi|)O4?8tYqA9JV+~xokDPH$(9iG1+PVHpb-P^f}TeY%a0qs^Kp@ae$5gJ(Jv$D6$@#qZQF2!Dt)EUQu>k z-Q1_*7z+#@)$>UBTnDy0Y*en|>*M~hQS0%o-rT;mD7^N&cYJ!=t+pfZ#x^~F>>wuy zKHc{Rj|>ucyEg;UdUB*VE@SZFK&2Lo|M@GwMMD=TeXyj1^*VO#c?Q%Bz!L$JkdLLq z-6o3LxhKqGQ;0n22_-ro*v#*Ch8f%a;tKmbk5Z9q*8={j&XmbueC2sb6J*&^jD67j0!>@~P)OE=4=GTLK5kl>#qqA{SM}{iQ zd3vk8ga`6ixL*Y=t?|YJo&$yFVozjkw;g`{>BE(+Tm)_ILx-dOzDy9PTn1rXr_x;F3Xv<>JBRT7+2K`1rdV&n`VUe)fxb_2M&j=>05x4X#Xf=nV27IWK# z%oG{?X>1KRe`vd8DQD4|P%9Cf8X(>q<#CJO6)JF~QV>fBfog+6Ga6#f{CL-I82hs* z%f|ceD)+kR7Q`xWXB*E{TgK7$kckk_MqW4K2fM*=T7`OvWkw|i1gW(L0=D%JYaP>h zG3LszXk(Pi22Q#o@&6nFWt)^m>kh%>Jl0>tiky=do4Db*=+JF2>3gr=FRlEj=j`w1 za61XHQ@LNHA0`Sq?VUdPy$s~KNzMFF69Q0~1dmJHJ#Y%bA1tonQcP&$lDeeqy*{_G zuNM>~khZlIe^9jvEh$WZZt zahuhty>Cx)30F)#r<}`SWo$Vm*|Yg)qZS=kS~bV_7WfB~{!9_zZx3~dMb>BT2k|26 zx~7dv#kdfr3k@TYRvy(ST$>uQjQ)YLe+GrenMlEZn*{T`Iuhig>k97JTXCsAx%;0q zdCD**%QrnlbfrBW0~F6ECv z9}0tPTbrCNs^LEB=T<0vL*F?|9qHjqdt>o$#1cW;@@i#W6ggj1$Z^TDvBh@m&y~o% zDRPE($0LCG+~oRo1}sr{%~pMi zK*L9!hUb^;8@*0k|5j%vv8FJqoX62nt_;(ZmGTxv=}32&q&+w3~3$)E>RUq90yWuP(BF4T^i$H zlEXkV1W9Hq*Kd_fOhn4>XyySQ70Y)Ak_gLM3`0mr#QS`l_uB{ly*MMLM!+iRpY!Q5 z+*(#q7#xdmG#`CytCwpT|3wAYVygSM#di6#UW438sWyQ6)bD=S=V`C}7S;u?OxN>U z1%adAsLjg*d#y36%`%BVOFusKp%L+22qDrwE*^s?FAvqVP!uh-eb~mBHm!<|hFNKR zD=I>@Xu&?>*mvHmHk=jvxFF%`QiAJs*L>b+GlLSORYW?qJEz%=JAuif)=i+LI2GdL zVK0O?#fJfA+kOA23JNfjizmcBH#_tzI3Et^{2ue+QDwc;NGr8+V&#OIdE#C?(MUxQDRV2u z|tCTQ>-j2?R3ffeZv*USV;$x+AkjE{(ZX^{>ybXG8lK8AYg26}r&GO!( zNRn?JJZ(5KZZq-k3Ai(o+*41^FMrwf!(CpI;_DcFeN&#A2rlDuhmXnCNLqhS@fo)XLq1mTb=c4YNNA& z5iM#_evxLlYft#b`IbS)^ZbgDcG;wXWF3`lxZcCy?)Ux4^@{8zd;^y;&@dHIuP{^` z1=U;ZtiMhBMG(Ug{5E~-8l$nMWPIyy3hDG3R>i)94>(eT1q#w(&UHa(_hXvjhp*p;2KH$p6+PcWf z9dC8@i(-@yK2B17D#Kq`C;e9qf;>u?T=*QOF~_u=G|bYkchO=aYPO&Yjg1mulobG} zKTdSZid0LX>Xc^i=f!Cnxs{*u{h0{GAXSW!qOI|CA;z<#wv1Wz@ zV^$RbQn$7Yi?j^d6x{pM# z868zrkk9cm>h<(FWsoxfkk!^toX;K(;8jkq!$moQ?k@xgpv~e5-TDvuD2Zan#Ki_~ z4IPXtI^G$R4rPcf@?2n|qCs%=U{=ewiQOuczj$u=gS$Gs@h^V}vg4ftSuMTtbQ*uA;u4(xn z(q;pnK!SY?Nc>#U^rQ#~VJ;}-nsImSV;&|haq3WD1?l#4cD8M?CPu)NV6v9O!xz|h zl|MXXP|&77N*I@?udORb19in8nwfGw;?zJFF8CL1N2fO=tC*IaBJ6%D(}zbQm67NK z#eu|Ph~lVKyWMsaWWpNFO>0A14caj~e{<)8G4-*bKlJRm@|{kfi|+jQk2M#`zJt`0 zVZIo4@Ws!VF3fYvM!N9YkkCr0?{7D;cR0K6{q{isr8ut5c(8T88z2r)CJFa4h=&d5 zk4)_T!;-pdo8F{t75A- z6}`+~Wr7IcVGGA;b~JKhK;!P&kpLR~H!w*>i!2WvOG!P;(oPo;X*58(n)H3h{f|cQ zT?zIk!HQH{ZO0~d2+w>s`M?l1!@2BU4eK)UxKf3S#34H% zEOL4jE1GOoNFN`s1vMLPnP7m$`Xy$)%2XI-9cs2$ftyC8)S_qYq>X*;Z||bPJsU2c zvkzp``L8S5kGLgH@O|V^OkCvYo z%Rh7%%Tb1Yer3Duz5TBk*MBRoEbL7GvpJZN;Xj=B{|(6XKYrZ!56D&H38A5~+WCSn zW@g{Tbo1+CJ$PgYnbpl0**I2Lu_5}2tS6RXsSsAVH?xqPl3CbYKmZKp1wHoopN?p? zBx1}RNt%_>GJdeL)iRLeY;QNy^W(qo=^^5#d8vE*+I#yN8*yPK94SIHo>NLa8jte* zOvf)VgwVSGL-sNDu? z$`zZ!I%o0QXs(oN67nHt_x29sqJ55mzk|DvA?pL>?g;U;e~DF#am_-*y=qo!C!Vk@ zwNJ4>Lf6lqQJ;l^fl3$u6yu_Wd%TZ@Ev2xUPtuH1xGilu{Ns~04fX1phqK@IcTwV} zA|Um#n7wNZM4fgEx!Frmrv5Z*xPefQSS${o$?WR$a711ri^K9^j&=;iu0NBnU6K*pITTvqIj!7UHQJ`aiKdAswMExQB*>y zMEYkaBC$ql3DcI5DHm6?EFoJ#KjXK=X-Q3&l_?chJ})s@!7t}t2tJqDRPd?j{{}4Q zHx`$uFtG+0Rkl@NPUJxs;#Me3Bq}KyE(uU&V~da~M5-iJK(u5K$j_(XxQe4%8(SY* zKX!4b`V?`hkaAmw#TEIRu`!x=`7iVoip$Ne^YY)8Uh@{Yi`+W@ej?o3x1y}KtluwG18svhH!|AG`d>1C8op4zjN)2AWDd$egbu=t%Hy_i z^Wj(EdH5^r7`W9R+eiPj25XP#rZzMxHhwj_l|#wZ%3+gVChYBsN~0BRl%@U}RV#tJ}&2$LxyPhaUji!K;S!nc=(pAabJ38{?!l^sD}cL_?oUlK5^Yj~lOQzlV}3`hLQQupvR{@$pVUBxl^Oz5En9!KI4t7EGWxW+sH-q&H+ zHtB}sHekP6Y_Y}RppxvRve_{j3$TcwZ8AI2DhR2Jqm7J9BoA$G z`2g@NIvt3RimN^6B?431Z&J0b5oR+>(-G{#yexp51micX$#hW~0<9Yse(Alo8RGv0}KZr5qt1) z%uBUt)fHJgR+&`aK_piFlweyfBBWsS@Ny_EiRQuP!qo|Py*UXe1j616XjNRBX0WJA zyqERDuKb=Rqo$;01>nN;XJl&zxLo((J>jL3&}))gviSjVkH78~Y7S}?pUF3a$ujjO z*)gH&98=YJbdmrIq}TQv;+5l$G3IE<5YPwhhKC z4;A>wi$^G}(d{#$h8sUCuZkaF%=f8JW6_ujlUyZ!6yB;}cVc6W3E;0^OY4`6hbrv9KV) z#;e^_uCJQyfO#9Vb#D}JfT#t~zYSV-bZt%Zy6`gS@~CMY)pQqwy|-*2y`KP# zOv+cG6^Fb)*;p0I0i^fdNZREZ(PTPnI-z6rAR1)E-}RkpQf4ORE}2ySp2dm7dyaeQ z!ZQpfDAOGx%(2eB-xMJqQUF$7o$Of z_YCTueRED1pC}2)_4l+&cT%}&j0;e=YSQ&zQ-EW2sDNpr)BVWst05sYW9drvs62%# zR^+i}40<2G5D#&g`Wzga4eW~%V!3F-h@5;}gvF}VQq59BXRzTZ>G!(ZLEpx01k4Dd z6tg$2TO75iZU%bh#Y4P98ZCUGlGfS%6i5ZEes#2OWAGXzLioiOv_sC08sCvzh4Rj8 z@W4+CN6&d%5IG&*xxab8@bcVwtHeOhcj<3+2JhrWKRRH2Z!W!p{kngxBZ=yomd=mD z*)*^BKd@p$equbBgKWmF848~B;1Ldk_?wNgc^vo8nK-OGa&9N!XK{ah=pG*eG;pk} z`wPpwO`zSnrNtOX=$fndYQE*rJ}=%NsbdDf{h69m ze52j^neU3|SZnN>A!05vKu0Jflt3bjmy&{ob_X+iY3u^M$iuMreU`l}VGY`gxoyO! z&U&(~6%Fak^>+}DIk_LyAZa+biAeP6^Z&s=RFl}9Agw}^L>w1MA6iG1A40?Pp%Y^~1CB0} zR-hNz_W1A^dVRBJ`g?$Y{UJ4u6RVHpz6+#Ya37mwtw0$~)v3@+Er?<`2ChyJ$8tZt zDW|D8_%egpR4BD|vxH?#bia1C?m>nGJep2q(<#nR1(`)uC1jeIG(NGXxaE;Tcb?>} z7BnI-{TrFa_&156gx#j&#q-BhUFIFyI66_wb4zp|$In6Qzo9hCGgj0%vi~3N9sR`x zQa(RSA`FURCRd-Ling)}vFbVXqQ93oCRs;>gFU$uQS@H7f5f_01zf}PZVMI!-L)~u zs6KZ^9UFdK+E*mOlAH@FPi^(|tX*Z&5sKE*70>}PSUl(|2$k5_e00WOZyxP%*S{`MK3?oG_Xhk zVRqH+ncuGMQ`I__gp3-9*e|h3*gm$3eTa*31hg}iLtdo-SUNlvUd2X1sHr+$S*i^% zC5iA5=;Whtjz+s6M4^(Bg-trxU3Wjl<7%`Qf5b1oVjj0$f+MTT>+&lRkjG0zgyApU zsx2h);*TQdzbbW4M9>=4T4Fymgm0qj_x@1%LD?O4$|BM=gJzIS_}3*1!3Dnn)A;o9 z;51|KOIY(Af3}B<8HvqncejrRxskR*0bS!Z`7(1-qOKE_hJuT;zM=D&t#KS1V6*pB z=?My62H7}a%0C~ZV{Spn8M#=Yth9{1t3@wC@N|CI)lXVLQY}VT6p4k=alXIS$0|IviZp#Q4YX*9-Eh3~QkT^-tV#oW*BKm*BHdO1pa) zZPM)n-7hi(r?!bX8!vOS70!cxzfRQ+#Je!cJ$bGKua7*%b8>AN=}iZA8d*5)5Ox-~ z&XbQY<-Q$2e0X*{e-@ck;g7|H;B!@c96?z(to#5_WY%5H)%#R*J z>pmH(nJ6GbgkN6(q-w|_tsu)@`+n0xvP6WPcF3|ME73pv(qik?&}p%BL)yFpC9%q4 zf%20!;IowEEqYB^H!0AoufFTyKshN5zexVwl*SF&!;wy2G^PLHqWSV!94?jQl*KLg zMaXqUF7v5e#t%XpUqX z;Cil>U+l1Oe=xteIwy|)H&C0cTs`pj9_i_PnHaJa|C5Fr3J z)0b99t$;7ZhcPaZuUc|9P4Ch?ZjAgqJhRJhW@!#f6Jo`II?ih5BFp97vcOX{u{IYi zvzQ(A$f1B88z)YKJ^#5+nyT@WJw9=IF_gVL%fx>yp|!?M7tDk{_83Cfe00%b?GjY7 z1a02q4W}bVTz-SY|3$@h(-7YG^?`m>fLSn1e16do7u(lI{`%BaCw)H=zW&IY?>CC; zEkwA#rijB2+&ffzJi1+X7Wq;!%5@r-r=u7Ps;GlDv+S_KpbE8&phBEsx_v!TFmixbDQLbJuY?IR8R{(GRtiUzMHGrs`JZ{ z^x%ZJniP{zn{%X1INo5OzbMgQORa6`(M1~^v>*9*N$Yo|}^#_HkCodJIs+2rt~ zYkx2Mn=uIEEuCM4RQ(lz?-dVO30g|^U3Dngrh*ke(ByGh5--+ujHhZ&I{fUjVt~48 zg1qWwc+4Lm>X96b#gxGhIP*qGEJxeYtkjKCEYN*NXZnbRGke&-kCLv(W@pg3BV?RnK%N;;h|y-PWsumI}pw zEx8$O_`*H22(+}Nk|v5Vd#X7zlGs5{cw&W~P6hGCVB={yhD7y{ixtaa0#Ko@xGpTI z=66ZW-$4mEYvUY)hAd2`sL;9BRhM07g<-5-{`()n3Kf*FLT+#B;ngC>Spo>cZff`P z732F@b~7r_KgSxNBXkokP?lX08MPURCyOtlSN_g-;;^a;q90u+t1DDbBWWDe&`hga zoAwRXJ)QSJSzh~2sXZ)uk#_#mW?rivtw6?nx<0~gJPV+9zhBK9$5P4I+7|oP z%}+m)V*6#XPdgcgP}Oy{&3@BOS*(?$FSFoNR6v~cL*+v;@gKxYxMs<-N(-6U#p%G@ zOohi2&F1X3Rn_E3iv#Kh&*z=lx@_;Pcs#0~(X;*$4H4!x1j3fpUd1iC1N+9|X;xQ# zNOPp>=M_;z8+A;gkS305W^n_mSM4$B)YfU;7vy^rSLdWuuy=0Fp%U&2%C zGa15nN+;vOR3hXh2}#}Y0d4~6-(a6Vq7~xK7DEI$&4}4e%8y9|>x@JHX2|MA&OPf8 zyj&1IFIJmz*!4#-TAP|8Aw7BvQKl~2(KwLQ<(0Cu8e3p3q>Ti*<`vAOke=+84oO7$ zw49VeEv|o^2J)5fpp`b_Yn`mKOP)P;g>3k(0abiD1_z>Zmm4|x1}g*0Sk1N6?6n%T z+rUQ%%ivYLS!cpktx5#RTN!$w+5<|f4j+?T`8vll&m9v*9!i9jl~DVCWSq0V+XsX? z+jBc@b-5KVi!MRO%xk{s5BubHt^f9A{rdiyfeszQKF#(pR}0*{?ATBJVPU^wvMY@Q ztZ@GIbi_~HZA`}(V1D1B>3oyt`dc5ha_Jmxz47lwep*?1)`#V0pLM6Auh97T*03eD1|y4<+PkbblDY@xr**2(Mmx|OSQQ$nV5;I=l({C1wU|0n zKmRv7TJq_r1k*QqQS$*qScmeTHXAetO#p|N)dMmu=BxNaBp4hc6Sq+zg~bn$PItbn zmt{gvrj@7f?}<0uRBpe$7JctGF~@c``FV0dmB-(WilNa_F50O|sA0a~e#f;GRIzH2 z0@-j1y}FM;@gOqL?`Qsdr?Z8yNlF@w&JshVoSW-^3q$f1!yRG+oru}%OKI%Uf;H_! zChI881B zRv{B}9n0j6oK%~u!{2${BKCJ8K9}qY;GEfveiyy2wNXn9;89MD#E-cLV%3M7&HEf5gv?V5Zv_zEl9jI7YzxOR|D|TMvIg|41rcUxcX|+k zLaEvj#dGOQyV#IoXYu60AiG?`pO3l^Bzy~!nH`JGEDdHuR zf#rr(akw|XlQ6ux`*U0uKLhHts0OPX3Y0P)#W)|D8Rm}rd?-3Y?NDOv0HYT^y4(N4 z>yuH(ebT5Lj-t+n2Uj{$DEJRNTW_l0$VyTjS#OO`N<@XnX~LtSzLVDUNTqmcfnI-~ zJX3Y4FW8Q;KF$VWPG6K{3b)TNUd*P)qe0iRQR4evZ(vWc0@K#Gs>YSv=g^QjE(0G$ zW&4|PljG%AY9k!dLv6OIBbQ3gi<-|9%A{8Xp^2{*sGJK@HiXT!0|W0T~g+1%xGKPG`9UJ9T2xRRz*`V^#* zqQj;2Qn0Y~&WC?T4GNu~#c<7M7o_+NVLn9k&AK#q0!Zh8+5!d6vo)8>`tJ>!edO)| z+IFS^rAAu&Q_9ybz#fnXqM2ie%m)q|q1lZv$@f0si0?cE(BRR#+ZoG9BcUd1XnB<@3`n`@br>Z3|J(b_3C81(^1HuTH=`(l)EoWrb zpdIiP&@Q1fCn618i)INLN$O@64dq;4l^8KiXcNKuVMHGX89fvX)BwLlbn3X?gz$ds z5N5$;#-HTP(p2>Eo;~#+0;!apkYo7^g&yxgIdD*iG5*7SUDuepqYx}t#|Db#op_Us z6(ve%KlyF0E%L2~4uQOc@7Hr%)r~DtbF8#{Pl*T=wH2bIn%>|1N?O8+*#n_^8_8!u z-xF2#ki90mxwKiB!s%Q4yl~uPeOmpreumqxiM&Rijer~WI28;qH45`?Y;m+D{0z1>-V`#x zVzxfnuuMMn@w+tnTEE?BuSFoL?*fZ_jaHZoJ%BMR7bS#H-Ei@X7HJx&Wba8HF+lMJg3*xc5F|DYRhW zyV+yxAkl#w*}pX)JzD}i?J|NaNb|QTsq4rGv-)32Z<^>xg+06P;qF6!sSJOKYfCaR zCv|;pzI>mLqRRqp>ZWyl{$_5UGfS^_Fc32~qb>V3Zx;9aIdF#8p@&tsJr`%!p2e$( z1*6kLA)ca8`54PmkwvylO~R5{^p)7lG#p?prDzri>VdYjj)&pxz~3&*@^WoEdcJTS zSgK+d{emEOl5YK9rHcQR1pb#f&(6s5AL{)7pG7u|4FAtfHnAE|DyXZiHLZnJA|hbY zgd3ERARW;h?#;Xo_1k3i?K}cLd+4cu@Mr72?SOwiYSLU^Jh#S zKJ%0+ zL+TKb#--U~t@<$D>={8Fs8g~V`gp9%$g{Bmb%qxFIf+sva@JdT!fvBs@9%G7Ya5)s zc9-=A13a6gf;)zOdiVpaGx$ioJA(K~Pw@iUtBCacw-IYttTj4W2m-p#c4mqn$N!L6}apcmN^q+zGIxm#Ej`a5~?}UJyLC)lMy-PWyX2f z-_Asx0XJo1M%)yYIcQ^~#;lCVZU)Dk?r64Sx?{e=6c+==9MoV^onc}|GRRztxtp+rqWo9$2Jbe<1h#7<%+QWYr_f6Ebs(EX zn0`SVxSa90E@Pf}94;eiBvZ7WvX?D$4`?aHz%@l;6vQ3wPw**(NkVbcEw^6~HpKW? zk&7~zHy?uA#5fu`n09dwIK&w?$0pR5hDq;vuZILiuLi-hKY{`6&{d3@qf1o@+_WQS zmZYdY?i5D3fK|6vZVn}dv0GgR6fPD7$MqQ}T-?aK=c!7jRf|?>nz=bSsQ~8bJhFPZ zH8rPSbbSX-@)2k3`6zO!dxI=GxT5~B zxA|)QB*79byezb;D78^wjKYLvi@uA#+tshvSOfQ9=s(UuuNABc(~;$@G%L@%o7qX( zT0m@Q3EJ&#kT~8Dn$|JDCN5g!3qotj732Z<)180; z&%Kj<1pRJojZWghD5BPXOV)?dWIQ-9Y~=uTOMtYlhO-oFD}&rr2MxL?n#8B=Q{ELj zxrf5}L7*DG;&S!2@$8wL$(lgoIjpMP0mT=2X~QJAGqunvmov+RoKeT3GU1Kv4es!| zz#NHvJn>Z&YO8dGw}o+7ro=0vyf-dSJk_%h8m$6N(J(SXRy3uh2NtH-J3IJ#XtP`A zp1n z?g=s{xc9*|bxq9IM*H{I%y;)mP|dc8jdj?>Aw0(A8%@S1|C~+!P~YYb5&tbj***>r z{CvuRX&^(vW3N-A_#F>1K^c_Pf-2}@+usHuAmdGd#%@fZpA6#~JCVH^H_6MTBfT;| zv_6|FK@)jx?41*(9M4xnAsrCo;p(Oo#^bU)LE((`CSLbbk>-H4D(t7}{L1=5}Hpw>YcC)3_lQdK&;|?54 zo{T3edc{`v9gtH3`#}%QI6#qM-$C*Y()Q8g%mGgB>-cv|U3_;-%$d~jlI{0l9XM>c zkm<(}zLOFxGWi1qa{^(!sXQO`Du(6qZyiEHR$BNXj=GbzujLxkTyY<+v<;L>_Wh7Z zX;k*Hx-W>`l2Nw)HU(*fJY!USG0UyqYPc>4rI1m_98{b;nt1z3hkgEA9x<~Gyhec? zc3T3=M(}H9i_%Lh7EI~9Vf7(=eDgm+$JB=SnUv&CS7oMD9T{V=W0%R~@v-SUk%`@W z2=&*8!i}escJcDh{PgOh0u&pR3Y1XaP3XBbo?yZ2vlz zOU}{5_@{eFhZWnS_>sK8Cn$_V7xnedq3vYpQrJ^gZz|`^%okn~heT6Hu6FgcDyw2` zUlcsVhQ*-rTDW1@l!>5lcJ$CS&er$I z)swb-d{^g{>R&h)-R^-?u;zK^rxk`9Y*U(jjNhYJskdXXQHnN$+e2uw`NDVUpt zC)|&fkf4Z^17fh_2Z^(pj-N9>VtD8BR`9{`w>Do8TRdewN4oc=U2 z7SK#C3VEj1_dQhHQm#R;l{<xOeEvD0W zF3cwRBh-T;G^mL?MpWZvC07aKd|43d3#OZ=?@I1!Us&z=QTFO~$z_qtaJ;0#V7vd>B zF{+JOgFj$*dW|i)-MG1}=lrylMB=$qA8f?VFtdl)A+WodDmd(UJ5+|X%8&m=H71PE zq#>oYWaoG#chf5qJNl(_WnSLIky;v* zWpie_NqTyF`249fg|d3*w!FStkaD?@e|g@~l^U}G#i>|O>yu~fVi=o2-Lzb38Du1# zaq~5(T;U<3aV0=Pt<{!BHX+}MH|BwSPtmBMil>^igb19?DY~RRWWtuneo*2f*n{9y zq`!B=6woE6tU!T^hL*CloV)EtJzjC}lF#e=L4W!wqC^g`aMf7_oIvD9S?jZPPG22d zTVwPjtGa9T12hkw#3joblj*_ut9pQTu|cP^nRFh+7nuzqo}z4)qcJ{EI-sU+=2g(= zRazlfygk7{Jv><1npyx8Dn_+kQMB8VJg8W-AHlLwtc*b3F>&S>nmSGvlq8Jmy%jd@3eIl6&!u ziVU<{;tPUn#pk3HiAJKa(Rh@}AHX9s=(O%UO}!uJf3YU>QK5MR&4bpITHPLsdA*APP z&#JFI95g0f_;RGIX`hxZQde~>SxBIw+SI%-W3Pdg&KbIl-6O(LW)0<3=cFhZtE-?Y zEfPk7#OdPt%WQNhUmX`}6|eW1=eJ5V#b<#WYSRTFcA`J)*N4@VpVY8*5lR<_Nz~ed zN|VWGiBClsqxU+gA)fNH)(=o=Q|0g(d~O|b*AIPAVuftZy|cMer_sa6UY%oCG#2cr z{@vYuwEFSZ^W87-2e5p@FH1gEk8*lR!jx8*H*8Yfk^Jm!KbquFGfw85&f{wDt`%5U zsoX?UBR_$)s3dpH#(U5wcsIBpXZ8e3Tqj2N{ym1k%T;~QEqK#BOFDlj%<4Q8dB=uJ z5rz{dF@HOMGy-Y$xQPD($t=r%f%X?t3VKC4`y0R}N(%PAizVn%>T+K!qaYB0G$f^4 zmJ~;eI>cGGxv%hl^!6q2P=0O0MV3g2WC8E*Y0!;4Go>W?*hX8=k#v`?dg9h`SJ|&jri=Ulbr3tZyxfd39CL}*JcdL z)Ab1rQ|EV^ZW2X#j5o5rJ^cFN#k0J&pSUIKr20-?idXM1mx7sw)ZD7H$EZ``-U)e* z&lB2|tM{KA(sUnApOfy%dAv)tnG6plB4NWoJJZ*xPA7^YGI;2m(TYwKCBqZtWdBUrP zKB*@{_F~#CRXIjv%&YsRu}+$@X9_JbQJmL%*cCI!U~cd3#5tepQMh@0-|hKxuif^4 zEKo;&`w_IU_4BTNH;&!b?bIgD*L1qgH(brQm2p{obI$t~#mEDPTGS1UCS|IHMC9Ik zrg+vy>`ZuSni*T?)-r0FxMefuP=2`u_u2A$`{ibf#`jCUY1WLjed49V&ZixFf6&pS-Re+_edUn* zNTT-Cz6<>7-7QIMo@HsNd7-MaQ7@?vN4z{9aU}w)#Zvw9gP+t4Y>WnZ%k+Eoujt9o z7|*UR6j3bERN_w6e)!XV_iI}$FgapIlYtlcQ{=^+r|$_13E6Q8sAV6^ZZV3{MkYqCMko>y@5+@`-LD;)Ue94=3@Ptf!veAF@Hri*tN< zlgyJES#y_b+ng|ZU;AFdMX8z87}mjtL9g$--~BwR-NS7XER$K+mtey6_Ud+CiV8x? zOvu~0nXtzZRni=Xl_C|-E5E0M5#z(2$eaqgW3%rKHOICp&bQv1h4^?UZ}5%j=$=mJ zsXj}wHP}5xYMO~n<4!;jOW-djozK0|y&cBZQ*(Et_x|K}p-fRU^{LmwphWE9CxS+l z_#`mGJLSquz7C1aP+}aem!@1*(3WY9*s^`k93ubcL9TnpTsVy4ZhVW0PV}4CN%}&; z#hveg;upQy`02pZs|a6NJ_qCO12fH+510-n<}p0W*sHaj#Dnys$l^vOd==TQNL4o2 z!FF#*l_Sj*B`n?E5aevTwJ^x2gX)KSrohRQaw-H&*V4tXo6wzYN2j@XoKQ+fL==_>?wt0Jg$M`tzcC_*UzWT?8 zuW}JTM$#iWy&pOy+uDsM^;LJGbc+U#!2$+fCYsmipc_XmwhVQD6EkLiYxAyu?(5f# zCXH@-Hgl|t)5)J{n+mwNpHDxKin5O~(ZMOn!`>;W!;ER8GCRCAa|wQT6nz9{jR$fn z3)Eh+;7e>%tj8bXvK4Q2dH-x}<`9{}3&-KyF496YZ%upuDjdsniu%nQh zd+i~*uj&Va;p!J|HWLa_zAp-1r}#M3hGnV)-g5KCnmDk9*t0m%4E~zpf3EnTA>pgA z&v1~eq4no?u~g4meM}S0tG8bNdgFSHPLi*^!%rJ zsrh%23T~{jmn_u{tvtL(M{VuCDjrtWN@#h81Qd| zlcvzMum_YJKWzPPAKDcl7~toa>LBF2i*e)|*xL z-ZeMa<|7l)BwcREXU_X3?5^DA>2Ch_=#BICCGjGb)^r*!LDsbX2dvA8>0zooDX@!7 zG$HZ|SeJOO;O5-}0#6j5TEb?oB6zQszwOzs6{%5QpwJM`;^xToX)37n zNAu?*#YV;{)T73hJs*V+oY>x+@Qm~0oGj&c19^!&dI}^V_2Cgl_omuT$CP>>_5GrZ zIL&<&v`sI+dhHvSQG5LLwy~pd!KKW2F%s=dG;Jo*(WGn_{cUAinp^Z2_V3BH&e=Ci z(`~CgxjSKRRcr~&%#bqKw7^bf=oCeJ?K$|tJc+)td&t@NF0VExYQfY9Dc@gK zGZ_3MZ_$IUzTYF^N$efxO)Ud^hV-*KIAoE#N;^#j^P_vw+PMR{$2Y!XF1-s@p68}hXg_}$GD5`%WsdoXxl5ly60;Y*x4FWeW=*>{(g)=($tRz+P?7{ z-^&O}c*M^8q7Gr%w_zn^S#2L&g0ocjbdIXQY(O6>E z#RNp{rrYToi^@#3uldM)n0P?r)r-HFGJ%^?+plx9rcbBuap`4)mr|pnm6ImNb&fh_ z?Aqj06T+lG3OuI2>&va)JvULG1BleOwBN*rC~Qkh)w7sB=`)*sG1%NHc-w8dDvk6s z&X!F+{NtQ4`IL^X1^b&x=Tcku+wQae;CZohx}UN=TwHg{_Hoh7((I$$$4Pe*Brjaf z^n2M$IDqw0i^*0o^hwHm)ibFh6`pr7LmQ{sy(=<32~k_$##h-YH+MDqhd?l6T(aPo zsc@e`iO)T6xYYwPN*K1h)GY0}W3MFx@5POzu?ai8Og^hr!h<#>C_0_?(z|hnt$k1P z$CmNOTN7K=Ir3xA3MV0+xgDWx+C}IbW$ib#*@S6{&x_~zI7wZeGl1yb8Q-33Qf6wD zk;!V%`N;f0i=;&}y~9U-Q42x#+O5;tl_zymDtaplZSJW1k@zMoyRLA3Z&hXPhUKXB zyx?}$xJXN*Iv^t6ybtUaYGF;E>7fcCup#bLev$goRW~njdnk=xwxT_P(!QE_T%IJoWDRMrS_XJVSsbJGT@@@s;YoYfi+!V12Lf12#1^bmCnPa}LQsqJg{s$=g)I{aKRg&=+r z_KV`n%lDW6wz9Ew)Di-P$NV`I=-)bPY3V0zexJ3JuXj>MySH2hamiI@Q%-VNRq4CW z3NE_c--PeC}__$E0aro1ox@A<+tE(Zsn z6Hc=7enc`Hd3&e+!G0}KM#ildNc~LNv@8dy_kNezc0IrIrE}3Pm+I&Wg;&E4FPL8s zi(O=X__}^JPtZr1Kf_|Xd07|rd+8#nFjxr3ky?@HYqRMMiMkKubRWuF)Ugg3S@6I5 z)}%(kAMo~ZVhzkaH{W7H!M{%-Z&y<2i+U?_Oi_@&{M~I`o1N;So%!x;vkP^oKN!e3 zq*y6$FZhIcU&z-$c+pvX75m*%AzuQy%?_)>Izzm6U25KSO@R&(9UK7L%nnebUW*wL+;>wBS>{b65`1>=Q8she#c{tgY_ufCog z8~bS0ck(Im*(s|}4)bnx`&gbFR{nLU(Bxp>9QFjqo_lpwwydcgb3)gSH7lm>;;ar* zvb|9!D*kNqB;WBvVV66l*oNM#a&11Dk9Xa1-mbYy^?OKEq)Ay%f0r|73;JF6<)EL+ zo3Dya?DCtNd@7O>`?0_N<#2D_6cxcn^zsWQf3-N;Ob+fJ)g7WXW#@nL(h>Z95-&as zJ$zP3RhMP3{do3mW7AXih-7rr=6%O!o{FN`idt=aU2?YRsA>ul5n&i3V)cQ1*L~-$ zcJ(@yi^qZup%KNt=Z@`vi&F4Irf0BiBvpscoMyelke4dpJ{)dLq@7KV-Eu@E4n?;a zcPQ}J=aGtF#(^K(=+&O4oT$D_G1omuC@tgZ)4=Z=*z6TeCWM5vUWU+ANhZNB z&k~uoY-BQq+r_zO%LG}C?3L!XyoUnycnf>Ahr_$6iCC3DV&y~DA z1KW3To60e&JPNmuEK%@nO6`D8vfyqv7Up22j`ZjfO_ME-TIugMln%Kwnh=?IZrl5Q z3W=W%9~h;&?@T6r*(CMj6DpFs_`_*ay~`%?Q8!y2brcSD?Z{!g=SYhbHr!Q?*^zd& z^GR2O&94ADl<}GKXAPx7W#pQvnTifk(zp5#Tu*wH;|yb-i&5I>wQ@EG9rm64Vln(vTGx!*YDdNA78c16uU1A{uiC>^ zO@#T~QeRHgYVR7pm^DFli{qpPn^^q~{hv?#2n_G9>_cAr_Ab52xuciWn{(-nbpG4U)apvCKv$LdQe!Nd%xu2eK9rF}_VI`JNw8*UbbUIt z|EEUC6W1;q1%uCcOa7VaS)GF_p_11FRoYZECruQ3eoHV|jdS8rUcxuCs#2`xgsEe^-!(L|} zQ5L)uxu=5GneSnIAeec{(*TuwDQw_S^ds}P83E~hOvNkQ`XM_b1s&Ay>>SxN8vLQx z(L>Eh>)}(DgXO8L#Ybsw@kME|33SKkU1rbK7Og#Ux}{xWPr1i2!Y6ju{Zhcg(Bsm9Dd2vC!as_fa{RlH$NHA46z|g<^8ux-02?$dG#^UxMt9?s8=%T zu#TL6n0=ivwaZJ(uEilI&-yE7PZdWtjf7F!nWywmH7b)FmA)kq2OiG7Z6$pw*E}-u z)Z_-6YQ63aQvUYaQ>ooNeBO`5GDOnwVnz(MITsACMn%Pl<;1X_n=~dUACX$COs9`^Q24bekNhxQ;AYT@KAR znmVn&Zay59IK`)C!d_V zTkk$YV^Tq1{8anb(Wf>^Q@V0RGtPH)yS7mz3b&c?mWwz2OnvDQ*)ftP;U3xH#WoxH z#kugd@(nRD^OoFBZN`+U%J){@xVG#U`6(&WjaM(&np28@e_uIup5fxBp5~i%Dx;H= zdQSW^V>{zWd*HH(CX&jzXSr=-oGwa)-E`&Q4<}*DY~D#mWIpA7$KjS(@0u4lu%Txc zTic#mdWwDbIbT0R9=>NVa?`F-*)}e${ZZ6-C=+4W9pB#kf}O&9@P4pV=aKu$2OH}Z zl%6!98TdX*hD_-Nc$+=QPU1-3%W=6;qE+DdIk{ZEv^|o05z^jGf}I12dcUUh&Z!9m ziyGU$94Mx}8#A)6zrD+_KlhDrsLqcs_d{5B8`_Es@NxCT&>WzC&*^@#lVby7IZe;qD6o-v>YA4{9h?7mI7W z1q+><%Ng zb~b|r9Ml%~HonNPgO|MF$~(SkQdaQ{yB4f3!6-OODgjsM<{rD(b>m}KH`%N)WOG2J zFhlHfYM%2|xiD#)%@GZ!Kg?KVcZ_I-#Sm*#DctXDLp$Q1xQOq4*l848C!F;@D=Q?3G_CI zp!ENiW@s$)QnBWVjAR=9Ud#)AJVQi`605bnZ}$mS-ycj>y?!r5hu^{|TiZg#PCM`g zdw%ewD6w>ZDH+O_Q>$ar)jo7A)$9<%_48b3N8fLUTk$LNehq$VH|-PHFn;EE%SV@~ zcY{0?$HlGbD7fVJok5y*_}xD(`a)^1nYE2j(#_+~4|m;?xiB^OdXV(?)&RV{Qf@#$ zusXD+B0A8prfy?QkHDw1gjY7kr<~uLem-Mzw)3NH3N^0*#i!bv+%7)CtrUV=1QF>IZb`Kna4r*YB&zx%!en0cF^b+H7x@xlN0;>VsdU0 z=7ljo6H0@%Q|uLZe81g%&OMWxxBoLSok;xAAh`#pccX_QhTedKSJCnL$EFC8z1uAr z&9zDI+L~i!eFlEk*mK#A|5P9Soc+KiQ`#SXzv4Nkq``f^1NlcLzsZ{IL#s}W9kFwI zQIyBde+w?CMq#UCc}nZ*15JnV7apTk9DPrkLTj<}5~Cpz>-Op0$vU_u&7=Iyz0 zVLQviUmc$;*iXUwqTqFfj-KepYPG4*#@#f+C8v_DWLQL6&ZswcYm$ohf71CT*bo;M z(R)t?FN_@{ptqp*BI(YEFp~s)WjT*sZhm0)oqmgrZuo|vw0ybo@QutSx}*`Nk(~1H zVfEL>)QQvqA3rCJ;<+mN`p<4J>C*{KciXj7N7bc!DtS@~V`3qD%Pluh{_J{!=#g@X3#or7l)g%-tb3|WtOi=IiA zB$O96WQK+snEUT(405oNeI0Qnqyks1?W=rYKJlS|XIVwtyK&boN8T`>GwaUEDvwR* z88Q6cpVxH!n&@CuAS`>&BR3*(^SC>zjlyvN6Y+ji%g5Fdk36K6xPcaLrS< zn(E@L#?%7$KB=n?`5LFRZxq~rYx7k&)THKF&lB58D&8l({U5y_jt1&E6`gcQb~Kum zsoxWK|Ks#ishK@`6|Jv#2WFdK3mQJbEO+F93G4Qgv1k^Jr!mf|GaR>q%dS{Ip0y1M zy&LK%(B^w7Q2J7d?b}nL_t|5MCaB!#^kC^E;kojtn*dnh>q)< z$~VT|6uZa3>P)G_&J#e|t4tR!BywCorLL*>b6rhgF;_((3nKndV9nr3(|*quDKn~M zN0g>q$?d6LI<$FfuwUhN#sfm^Tfd&$Jvd#_&t1_abDv~yPM@TuJ3xV;h2^(*i=(fhC~cgbXQ9MJJ?p@r{kEHr`{!fqKZ(N z)$j~=*gx|#s!^r+a~Ut}Y;K3icsBm|KC0+@HT$Ko8PD51td)=T$23@SMn5(8-5~Jj zIMG%m!guqIAQ4pDyW?k%rBe-dSl2%z>h3Nr&@?}KUCHsDLBr{QZZ6;0ZR#We4pE(y zpkX^f?pxxY>!RCf;lq;B-+U2n8^0%Z^==DIwyA-4?qiDDYVdL6j(9VPUe6N0(<49M zYD=ARQ%Y5guQ$hVDqXNr^P)dx{#8EMA#=39==KHo2`X{TNi|Us>XSRvU4tiER zP00B2wLU3ChIHFjVt%ki_99Y`Ql`ddbG5Xfb>+ zD)|sxA}RNa`b=5PslTcF()m4j!k<+J#J_cX&%*C6FVptS7&}c?J5LocvjN;49Pq2X@8P!?yGevBeJ|FQhVYFtfjPy*#@CiDP1?-b7XAW!6!c z4f~?BCE@66&WC3*pVs%czJE~E^6|){i0<)}7o#%QZ_Ff3R(+bTJQf{T#Vvd3T02~* z-nGP`B+w^j*m&%2@21p3p5k+aGZ`CpeylJaNe&XS+Bk8VIY0g|tum?WEv<}!lBuq$ zR`K(%Vltk3ZC^k1md#vKE7p2tk$F?LXu?v(J1@yk#g!qZ;kxqhNk5OTDr&9_MIW0z z7@{oIidioOUdPQo=tPl*FNyZT4E%SisWR33o{rkN>+t5I*BY`446CfTWqsv*57_UL z-t~lONMXYl>=zDZh40&H>nZ9&^%d|e^j^Z76tA&NKiDu)Y*O`N+P}o#)~D!H#{Cal z2k9*W^@KLNk8Um#z8F6pn3S{Y@*c;Mv-T-+AGImOIWv(VE`EWwV|Sl3!0XTd8af+j z^Ee>bCXM#GIU<_&6=i2MN5Ckmo#x=nBw}H{-^&9#rVbo4weuICqu^t{#3zK(x+At% zk7BA)&?7HKlk;v2_2o`Ak3)Pf?rykR?2XbIHSbBLWwX|zb5+-qXpcYL#SO31n0^uU zqWfNCb@B@ZzEVya)SF{ECojGErAQ@J-Ex2@n~qc*{rXx8<<-zo&Z+m;?(}v);1sQj zKCcllM2pE9Elp#j#0Frc)a-yY7fJR-`12`*COXuE-z`1Uqp^= zsXM5d&GLkv9y8X_)zWITx;d-KL+>`$i5VFkhpud=v3mR_ z2d|)>`hD}pQmPoF1cSrGR@=jtigbBF-_Q7?4Z}|}o8M_S)BSG2FCZScA?ospj-+!~ ziTk!T!WpgIZ%rhc(~pm)#3?m4j+RoN|9o?P;?28As!`3pe zmOs_S7!Kce>Os}{tSc!AH^c8^W;S}<4H{$`GRu+0mmR*+EbW-F?Wn3uheuAKifgn? z@0QZkP??ka-dxWmJW4;&@*bZawBPw|;ZYA|3c9{cTrgKy7GKR_X^N?@<@*}xvc+}e zinLl|eMMWpQ=}g_SvhjKy!h@hcjq=u+k@qqh1gq|ytAfh#KQe2nB-V&!e?(x-wD__ z!ezsJJff5z_c~6$+T@3|gF>~rk}35>$0ibDb33)8aKQ6NeGF7@X?sL2N$KW{d@L;r zs`I}wq5b-*MRa=2+rT5IJNq{I#XGWoxnB9b?+I)94#IvI^MlE^5BFOcvK}gav{O;Z z+tu-wVz2o&Gv=*tg{6*}Jks|1T-M-_z*5OjB0(2y&qi}OcDgWW|JS@8x?4TBVx;zm z?Kwy#bk^vheLf3g?a7&m=I`#q#JW%QIw9za)Z5e}hC;nX%Ifb^jdS(}!KXvC0!qVA zT?;?gp#OP%RNxtB24mALlg%a-1;g&!PaV}f=4F~ zRqiext8ymQ34PJ5iPURZ<^@Vd!u{aTO5>h(Zkgl>&(x^7@Y&{ZaDsM5^r4-sy?eU* z3JYcAg~FfTu+nOJK=qvD7MFv?d`lU8NFN=${Q&1+yKhKmyH;*No)kBo8IJMSO@X^l zu6)wbQ>o%i^>um3+#dQ!NB609UihvW-h4<eFB;wZuI0EVfm}=3NS(%`Erq(=^Ki`=)4|k};8#dYaGcFRR?E3f!_K;*^uy zVN&p2Y0iD7ZqZM^E6s;vVVxS#Rv;~#1V zSiC!aDXVG8v^RFl)D-a((sYzPj-1`3feE3|K#o`EAedcV2u7m34?oKv;@Fn=^Q%Fj zwYCHO9n3ez+Hd}S5uSTkjp=bzb;wAs?GD#_A_Du~coyCLG5`4cyaaeD^S~Q4kI|;z&u6Ca{>mWD^_Mf9=J|d<_@xPZ()o`R zuF+<9Hr(|;ohZB2YGQbcYL&oCiVo^M2ebQ+ux33kv-YIDHc2U?+}H0m?yH6}yl8yz z+>jvWksCL^$nf^h=a(4K98W3AOv@0{gFiE&J`tnr_hqVRbE*@glkpFYz{AZ}(hT}T zk*!hPdBaaC7&|Ump{ECetR`OVzwK^#hJxA3BU`PfFi|&llAV`jKziaV&FQBy1oLMz zSp}K)2SW{LUfeb?izHgJDeDe?Et#V^eRp~?LOPl!JbfR{!RoUgraV6!jH`OjGREa3 zd_n??yX|S&`;JvcY_z$7Lx`r_b=Tm2z3qF$&AKwQbvQ=fnMjc03T#fE!%l2%&fDD; zcwSg)N6V<{SGS823P&pXqZ7bQ_~Zzw*(e=$lJaG6#mx(&5t8^mwPVavOl?uZlP)Z z76vSR;RZoKWB)|`|JE075Uam%Q*zWtQ>T}sCN8K-k1s*rDOcO|lVoNXCSBKv_q7FU z47-1i#N#Uj*H4cK?`BWee43tIbbUcP%F<7D_q^z!#@{ZcGc)yg5tBqL?FNUh9PWes&LH41+= zmDmDd~M3HDqXwNwA?Ql^Btv^$+<+EDQa-@3AHLVGfTB@KMpA{G@*V{>5kM; zV!Nzr&|WpMw#dM}EW;eOn`9rUMhmm(OkAjcbljb!nyZtRD9>b8&t@)I6w{|@&%Z0A zH$-{YnZ84n8kMqv+Y&>$1C#M`KNSurXx6=J8df6p*@ed)QV4VOvO8rpqwr%YgumYE z#76h%)l!uL9fwwsdbBsV({Z%5N1bhfw%U7GnhM#F1bFu-&FRXXoJ;rje= zfiU}Km#^jFV^x9IdKE^PXJ|5x$XzNf$*#`5Q8|C&^A(24IC$NyFVAbld;(3!lyn@Z zj+q)inv|rBtHw$RZXJnaU=i9-<$cQ6e57(u=g`R?>4&_YR&}a+7|WT&DU8G1B4uw; z*3|9ZL%D;lt+l+AJu0Nqleg9U%f_8eW0VHhy@g&|zBgb$%aY}pB>1sPe!qoWOB1sH zQu%bPhjLJ0vBc2}B)=r3ty9_qVR_@n45CQwl=md}$O#JKkb~PYGq$|_u4Z@km*PF7 z6wUn9Kqq`&id5F}$RVqpzDHW)gtgfl;m31Mdq=+-Ha7w{!&|1JZ?|W_CrV0@bn=`R#vaX7Q9bE_fre=xy7aI7^e%Qv6Fre!! zNu%Q*b6U47PwDm>uCVh|9hHGo>WWnH_vB>y=Q!Bfj+Ja^tB3m)eYYFlKjE&{!z?87 z_TdyYRs@ec$yhIIoOoil`<6W~9s2v4b@=9GzHPa`ot*(;?sWKq*MrM@c`xvdhSAP# zdxM&e7_2&Sv>{HnDDr4h@>An>{dd`;V=6_0PEvP;bI!bG7H*tkJmIc$<|&m$`_Pf& zkvtk2?>9AJ(&qR*6C)=mYW^k!tBJT=)8bT~=zewgFU$q^Sd z5gl65cr^y!w2dTNlS5{wEJ`w~32n){)H<(;7$_c07oZw(uT8sg--ktvDrwi|S81C% z#U`r9_LqBcjAaH?hsc=^e?2}%oe)fUJV27?f`EN4p@L;5je2M6)|p8uD=Ju>fWq+u*+F#P|2M3!gIEgcFMhoe*T9&43@JST6me# z=*LSggyVP+pM8^)#W1XFmpQd&wz4yB3|A~Rsfd+n8JDax=_YIu>-VnWr{894`*u82 zL>oTXQJl$eT$G|bYD3quobeV;nyk(R)mhq0Vr2XfUenqhh?B z)gf=88ym~n)UjK)Yib|=+F(DHJ3?$?|;7|n}IYRu+ zYH;4>c=ws7wyff`hp44^TicG%F=Qb--s@003H#r7)3|ufnu7eYdZ)6ka~vTIO!}(5$_~&>`oSK{}RwIMHipO1in=$c6Sn|LNiPvelLo?r#tJ z6H@50#Amvf?MjYS*a`#>Dt@_XB*(y$AxSMRU*k5CKY&*&ZZ{lCdp0O(sB182_~Pl! zoc)$ULqD``zInxAB-4Jq$wJSih{D|{Y!|E3Zrf@9qycB#LyYv3Q;%yC%=Z!b50u{J zbR=1q40Ufk8YRv%z+slrA0Lxe6y?K0eK6ul#pCJ1>ynKk-s%*)qo&6`T|C$pm}D%b z-rN=BS65v-`|Z<{;!1r#pX*{2Ph@{yl;W71=ZK&0ve_Q*Rx>YrlA#Jtn$?&=J)prP z=rsFR_K!6toqH~s_JEK7P-|(=+-S=^>{H9|fFXDDDwT@Z)P+N0}hU0DX zgWOuW=Ut2$-Xx7r5U=~##hmWSW0R55s~V)=^yS##EzggC3m_n;52X!}5)!DT00IyF z7#LJ2B?Xr=b0sP{Il94RwUx9D4~xhj(pE=Ez@Z`qqN@eT*4fR81j9iaVYJ{nC!LAp zM|5x{Tav4ryp0(NhQh+t&Hh~L*;=~UxEjGQ5)vkKa79N8CrevLYq*}RqpYK=?eF^) z#}7+OFAWW~EVTJOG!-5Bqes-h&~$Xx4h=;P1nh$Nz;1<}=r4vfUy-QJ$)X7Wc;kxQZZa$F77 zG_{WEK$5Dm7FQ&czFP-Z^m1Gggx|=bFnAbB0tdq&5M&8iAqi{b0*8h`NWgFy3=E6I z!>||>42OdTio#QEDVo;`h~{5*aC@!p(O|~6bcE$pm5|iSS# z0O8Sq^*{uG2_XO#A=k&@=@#pu7BC~XhI#_8mH%W6Aa+9-0~$b>E`6fF*$qqOWPG4| zB%X{D9^gi%n}h@%`4g0*2uScklWDM220@0}KreFNi&O>uE)xl$-Q+#;>udMYzD=No z|F(7`;8s>}D_gjgJskoIw{&u|C%U@Y(joA0Ym%7<5pHJT?nb0TqTv=qOIv$;GddI+ z?&9v`Mzl1yC)rxtxX}^7Gh32{yMvWI(Tfg&M8Uxdotdi*xWvNUZ0#+H%Pj{)>DBJn z;HZMOqB4+QIei3jwfjZz zj@%C&)c#+2Eo%)R@B2P+qNU|p7;p~(nI02_scfp1hmW_DO^_g00Y3A#oC{^HSO4ll+Spd7henL!8tQVd8=RISEB z#ZXmOK^wB~YmtD4u#R6{PdhL;$Xr5VM}8-p%Y`d2Y7AK*7oPvF0~yq%8h<{Kz~G{Q zkAyx!jm6&nJYRK1evShsZ^2Y!$v@`1styRY2}`3|8s%EZpawJ|2oGqyOP?sHY_Xg? zHs~4+xC6$Ahuj&c4~>)j3ChtD&g(r(a;^<<$2`8f^=3EkgRi`)j(S%Lx8LX+o*fLP!fNj5`JLgEwnRzj z^MCmqha|_X|H~dAuLvj(#d9FcUl`*;8ItVC(ZGyAS2#d(at#b&F}z1%fUgCuq0hA# zfIgN9GYkQk{*UGZdi;MhAIrkEzXf6BjK*>hD_KhBu!flf@h^E1IXNdUBMF!oWKKc$ z0mRNGa3y;)YgZVW4le6zL3DJ33hChTX3ok)C_Y@ch4LxTGtiI@uHt59Z)+jzXl+jf zyoGDK5gl}4cyM*d7Q~*8)?{Z3%@ja4Aj_gnbQ1!RDF{AE!sM|j+1e99WJ7j+e!SLq=_!>X7+G(xGel6+!1a8KLnS9d&AvqNJJvs32q73fLl4ali>1j zXE=z|UEPQzTUR^yVYmX^3a$uuwe^CN;MQ=WmxaBV1KbsE1GhQpY(sQ}Yr)B^fxE$N z;m)9ulOiNS<@1K{>U9D zT+Scz?Gk^0aQ#*4us|GtlY1f0v10sW>-J~-=B4cZlAxoMAnGl2o2tEGyx&xZ7 zg9ZY6vQm4%H?;p?28j?PK9JBD0I`AO1rifYASRHAC_&P(BpU};%7y!HK~N#{{wQ2^ zk@324hvmcqK{I68mQm|p<@TBc#-c(3Lj#cu4-D3Slv*gnYHF>pHR=n~*57L9YzC5H z_CzZ;K*0s&gVYeBCHV93+l6I zI>|HK-{$jA0_6|YSCV{{vm+;d{}qz2nF0T{Lty5E$6|r2!>l!>pl~_4$+yeM4Icj0 znj#=4xRTr;%le1hkZJ&`0kYTu)K?jgRjz_Ox&Bu$Ts=Ep5GjyKS+E@-C-)z<9Y`RE zD^Wxvm!U{bc#)m;ZyT{_YggI>$P|zb0VGEYMqrtPUXq}NOxkLDyyTi8PrM*U3yv5# z;FUtN%6oxy(8|zqJ@30_ez+twVD~%$1iDx}_AfGnhkWVpun*Lsga4KpaN6%WB7e&5+r5*!dQ@#SG5b1#|>pGCoX#8ULAjc$5Ab^}ONU344;shKTheeVhxq{Kz zIywF`QUEh?0vdrPtP2V(P$2;Kd$I|LGk0c?VP*LN94V9f*tFaj$*D~N~sN2EZ45QxP3q{B(9B^_92T28tpjL`oG z2tmMz<0a5oke^rwD==w+B#rfhRn#Ni-Tfn?Dim0F}9Ig9k)#tOH9)q1f0lNJg8kD$;16toDt9`!)1zt$cB zb%x}8(H<>vitvwsP&lkOSbV{OxMV$81hPe6Wh#((V13t`3WUTzLPKIP;vfTyCm_~? z1|$a!Njq5ITc*M&kTwL+a2WI-xmc7y@+$j(TP_fbPH{b8{|Uh$tMH-#l2<(c>qsp+ zkad7z2q;uSSYdpY2sy) zfkdEy^}u0KtNi_V~ z0GA8~Vo|f!frSFG92zW}fVIeV%e?wam`M;A9fhU0If`9;N z%XOfk(FDR;i-86I-Vo?s)1NI*kjYSf!0}BPL zG~g5nF4togl7RaQvyfm3bTzYT2UAzz|VD#3A zJXk*ZBl6PHi{HIpw$Q3ca=)N*GN1 zNJKMeCZk~HMif$z1ecc#3-E3eW0Y@Z}h*mIXGYdN~5d^hl-Q8?JC2*xiJn88~vUC*^{*8tgs0)@B z!R}Z(iQj)<;~)mCv|7Oy%FrMm0MLd0V2+Dr1QZ5ZLR(RW#uA{T1y+_}0E(;12om6w zy;WtP5j3S;(H8ivwf*5ho_|$6JOK}h@`|<~Foi6{$}$2LwWcjr0=*g!JeWqVsfWQs z+XzklO-D@|9(190BaVTT=#^UFh$(jX>ii{vtzokYHR{55RzSE39aX z1fsD91|H0CR@DP0VvXE`vb8+If`r$qwg3itHT^(%18u)qF%~o)xkmRv88nSpT@Syy zKM)bG(FFiwO+6GEOtjbZ2mI06GHB6%6H!$I)wrQ>_%*f|jbE#mUw zSN8|%t+BCS!`0e)kXK#}7qiw^fLZWb`+_H|v1?#&67-FMm3R=qBKVpz44BcZu7`zo zcCKg(cEEy#t2JfNCbX6HFyv##SC@f39;@mR2v8PiWj&CMT@3>Ze8uXqV1ch#jRy`X z0qx&i(H|&VGd>^%&{qgn)&t*qSj{(JI@j1C$egam7l`wkm;sc56|j{s@DivsdJf9g z*f8J%ps!1<7$5L>Yj_SM4ch#=vK|nQ)ied0FxSQmSm2QUv~?qyfz3T6@a-%ZT-(;0 z2nA;_xR#TX8w^-%D4nn3XypV06oP4ibqA2;7qW4EG8Or<+=-SxJ6I%bBw2WEi3uIZ Y*}FpNdUD7|0Ld6Uoq&MiVI{i%2WTQnkpKVy literal 0 HcmV?d00001 diff --git a/tags/0.5.1/doc/simplepkg.tex b/tags/0.5.1/doc/simplepkg.tex new file mode 100644 index 0000000..610ed08 --- /dev/null +++ b/tags/0.5.1/doc/simplepkg.tex @@ -0,0 +1,395 @@ +\documentclass{article} +\usepackage[brazilian]{babel} +\usepackage[latin1]{inputenc} +\usepackage[dvips]{graphics} +\usepackage{hyperref} +\newcommand\link{\hyperlink} + +\title{Gerenciamento de instalações e metapacotes com o simplepkg} +\author{Silvio Rhatto} + +\begin{document}\label{start} +\maketitle + +\begin{abstract} +O \emph{simplepkg} é um sistema de gerenciamento de sistemas slackware que roda sobre o pkgtool. Ele é composto por vários scripts que desempenham funções de administração e desenvolvimento de sistemas do tipo Slackware, procurando fechar um circuito de produção, envolvendo a construção, a instalação de pacotes e até mesmo a instalação do sistema de forma automatizada. + +Do lado do desenvolvedor/a, ele ajuda na criação de SlackBuilds e construção de pacotes. Do lado do administrador/a, ele possibilita a instalação automatizada de sistemas, instalação de pacotes e a criação de "templates" de instalação -- que contém todos os arquivos de configuração, informações de permissões e scripts de pós-instalação de uma dada máquina ou jaula. +\end{abstract} + +\section{Descrição} + +Todas as distribuições de GNU/Linux já tem algum sistema de empacotamento amadurecido. A questão agora é a praticidade de instalar e controlar o que está instalado, tanto pacotes como arquivos de configuração de uma máquina, além da facilidade na criação de pacotes. + +Imagine por exemplo se você precisa manter uma lista de pacotes de 200 máquinas slackware, sendo que algumas são usadas como desktop, outras como servidores web, alguma sendo o servidor de email e assim por diante. Imagine agora que você perca o disco de algumas dessas máquinas ou que precise cotidianamente reinstalar ou atualizar um sistema. + +Usar o cd de instalação do slackware e configurar na mão toda a vez que der um pau faria com que você ficasse louco/a e desperdiçasse muito tempo, além do que sempre ocorre de esquecermos algum detalhe ou pacote durante a configuração do sistema. Manter um backup completo de cada máquina, por outro lado, pode ser muito custoso se o número delas for muito grande. + +O \emph{simplepkg} permite que você mantenha um template para cada grupo de máquinas e com apenas um comando instalar o template numa partição. Além do template, você precisa configurar o \emph{simplepkg} para obter pacotes de um repositório local ou remoto. + +Gerenciar instalações e pacotes não é tudo o que o \emph{simplepkg} faz. Ele pode ser usado até na criação de jaula e vservers, podendo manter toda a configuração das máquinas num repositório Subversion. + +O \emph{simplepkg} funciona não apenas com o Slackware mas com qualquer port (oficial ou não) que siga minimamente os padrões oficiais. + +\section{Arquitetura} + +O \emph{simplepkg} é um conjunto de scripts escritos com a filosofia KISS (Keep It Simple, Stupid) em mente. Ele é um sistema muito simples, composto pelos seguintes comandos: + +\begin{itemize} + \item mkjail: constrói uma jaula/instalação de slackware numa pasta + \item templatepkg: criar ou adiciona pacotes a um template + \item lspkg: lista pacotes instalados + \item jail-update: inverso do jail-commit + \item jail-commit: atualiza o template + \item rebuildpkg: reconstrói um pacote a partir de sua entrada no /var/log/packages + \item simplaret: obtém pacotes de repositórios locais ou remotos + \item createpkg: baixa, compila e empacota software de acordo com scripts presentes num repositório + \item repos: cria e mantém repositórios + \item mkbuild: cria scripts de construção de pacotes +\end{itemize} + +\section{Instalando o simplepkg} + +Para baixar o pacote do \emph{simplepkg}, vá em \link{http://slack.sarava.org/packages/noarch/}{http://slack.sarava.org/packages/noarch/}. Depois, basta usar o comando + +\begin{verbatim} +installpkg simplepkg-VERSAO-noarch-BUILD.tgz +\end{verbatim} + +\section{Usando o simplepkg} + +As três principais aplicações desse conjunto são: + +\begin{itemize} + \item Gerenciamento de pacotes + \item Criação e manutenção de jaulas + \item Criação de pacotes +\end{itemize} + +O gerencamento de pacotes é feito através do \link{http://slack.sarava.org/simplaret}{simplaret}, e por ser algo bem específico está detalhado no artigo correspondente. As seções a seguir mostrarão como o \emph{simplepkg} pode ser utilizado para criar e manter jaulas, assim como também criar pacotes. + +\section{Criando templates de instalação} + +Originalmente, o \emph{simplepkg} foi desenvolvido para ajudar na automatização de instalações de sistemas slackware. Para isso, ele trabalha com templates -- listas com pacotes instalados, scripts e arquivos de configuração -- permitindo criar perfis de instalação que podem ser então usados para instalar o sistema numa outra partição ou criar um chroot. + +A construção de um template é feita através do programa templatepkg. Para criar um template de nome "meu-slackware" contendo a lista de pacotes atualmente instalados no seu sistema, digite + +\begin{verbatim} +templatepkg -c meu-slackware +\end{verbatim} + +A opção -c (ou --create) criará a pasta /etc/simplepkg/templates/meu-slackware, que conterá os seguintes componentes: + +\begin{itemize} + \item \emph{/etc/simplepkg/templates/meu-slackware/meu-slackware.d}: cópia de arquivos de configuração + \item \emph{/etc/simplepkg/templates/meu-slackware/meu-slackware.s}: scripts de pós-instalação + \item \emph{/etc/simplepkg/templates/meu-slackware/meu-slackware.perms}: informações sobre arquivos + \item \emph{/etc/simplepkg/templates/meu-slackware/meu-slackware.template}: lista de pacotes +\end{itemize} + +Esses quatro componentes são suficientes para armazenar todas as características de uma instalação de slackware: a lista de pacotes controla o software instalado (a partir do conteúdo da pasta \emph{/var/log/packages}), a cópia dos arquivos de configuração controla as personalizações feitas para o uso dos aplicativos e os scripts de pós-instalação cuidam de qualquer rotina que precisa ser realizada exatamente após a instalação do sistema. Já o arquivo de informações sobre arquivos contém as permissões, o dono/a e grupo de cada arquivo de configuração presente no template. + +Se você quiser criar um template a partir de uma instalação de slackware presente numa outra partição do sistema que não seja a raíz, basta usar um comando do tipo + +\begin{verbatim} +templatepkg -c meu-slackware /mnt/slackware +\end{verbatim} + +onde /mnt/slackware é o local onde o sistema alternativo está instalado. Após criado, o template possuirá apenas a lista de pacotes contendo o nome dos aplicativos instalados no seu sistema. Como a pasta /var/log/packages não preserva a ordem de instalação dos pacotes, então talvez você queira editar manualmente a lista de pacotes de um template. Para isso, use o comando + +\begin{verbatim} +templatepkg -e meu-slackware +\end{verbatim} + +Para adicionar um arquivo de configuração no seu novo template, basta dar um comando como + +\begin{verbatim} +templatepkg -a meu-slackware /etc/hosts +\end{verbatim} + +Isso adicionará o arquivo /etc/hosts no template "meu-slackware". Além de salvar o arquivo e copiá-lo automaticamente quando você instalar seu sistema, o \emph{simplepkg} ainda pode tomar conta de qualquer alteração que o /etc/hosts sofrer no sistema, seja mudança no conteúdo do arquivo, dono ou permissão. Se você ainda estiver armazenando seus templates num repositório svn (o que veremos a seguir), o \emph{simplepkg} pode ainda manter um histórico completo das alterações do arquivo. + +ATENÇÂO: evite ao máximo deixar arquivos contendo senhas ou chaves privadas num template. O lugar mais adequado para deixar esse tipo de coisa é num backup seguro. + +\section{Criando jaulas e replicando instalações} + +Uma vez que um template foi criado com uma lista de pacotes e opcionalmente com arquivos de configuração e scripts de pós-instalação (que serão detalhados a seguir), você pode replicar sua instalação de slackware utilizando o comando + +\begin{verbatim} +mkjail jaula meu-slackware +\end{verbatim} + +Isso cria uma nova árvore do slackware em /vservers/jaula contendo todos os pacotes e arquivos de configuração do template "meu-slackware". A instalação dos pacotes será feita pelo aplicativo \link{http://slack.sarava.org/simplaret}{simplaret}, que deve estar configurado corretamente e cuja configuração padrão deve funcionar para a maioria dos casos. + +Se você quiser instalar essa jaula em outro local que não seja a pasta /vservers (esse local padrão pode ser mudado pelo arquivo de configuração do \emph{simplepkg}), basta usar um comando do tipo + +\begin{verbatim} +ROOT=/mnt mkjail hda2 meu-slackware +\end{verbatim} + +O comando acima faz exatamente o que você está pensando: replica sua instalação slackware em /mnt/hda2, dispensando totalmente o programa de instalação do slackware! + +Caso nenhum template for especificado, o mkjail utiliza o template /etc/simplepkg/default. O \emph{simplepkg} já vem com alguns templates padrões, presentes em /etc/simplepkg/defaults/templates. + +\section{Scripts de pós-instalação} + +Opcionalmente, é possível manter scripts de pós-instalação num template. Tais script são executados exatamente +após a instalação de uma jaula e cópia de arquivos de configuração pelo mkjail. Para criar ou editar um script +de pós-instalação, use um comando como + +\begin{verbatim} +templatepkg -b meu-slackware nome-do-script.sh +\end{verbatim} + +Isso adicionará o script nome-do-script.sh no template "meu-slackware". O mkjail passa dois argumentos para cada script de pós-instalação: a pasta superior e o nome da jaula ("/mnt" e "hda2" no nosso exemplo anterior). Assim, um exemplo de script seria algo como + +\begin{verbatim} +#!/bin/bash +chroot $1/$2/ sbin/ldconfig +\end{verbatim} + +\section{Listando o conteúdo de um template} + +Para listar os templates disponíveis ou o conteúdo de um template, use comandos como + +\begin{verbatim} +templatepkg -l +templatepkg -l meu-slackware +\end{verbatim} + +\section{Removendo arquivos de um template} + +Analogamente à forma como se adicona arquivos num template, removê-los pode ser feito com o seguinte comando: + +\begin{verbatim} +templatepkg -d meu-slackware /etc/hosts +\end{verbatim} + +Isso remove o arquivo /etc/hosts do template "meu-slackware". + +\section{Apagando um template} + +Para apagar um template, basta utilizar um comando como + +\begin{verbatim} +templatepkg -r meu-slackware +\end{verbatim} + +\section{Atualizando um template} + +Agora que já abordamos as opções do templatepkg, é hora de visitarmos um outro aplicativo, desta vez utilizado para manter um template atualizado. O jail-commit é um script que copia as alterações dos arquivos (conteúdo, propriedade e permissões) de um template a partir do conteúdo de uma jaula ou instalação. + +Por exemplo, caso se queira copiar as alterações da jaula /mnt/hda2 no template "meu-slackware", basta usar o comando + +\begin{verbatim} +jail-commit /mnt/hda2 meu-slackware +\end{verbatim} + +Além da lista de pacotes do template "meu-slackware" ser atualizada de acordo com a lista de pacotes presente em /mnt/hda2/var/log/packages, todos os arquivos de configuração presentes no template "meu-slackware" serão comparados com os correspondentes da pasta /mnt/hda2 e as diferenças são copiadas para o template. Da mesma forma, as permissões e informação de dono/grupo dos arquivos também é atualizada no template. + +O comando jail-commit possibilita que um template sempre esteja atualizado e refletindo a configuração atual de uma instalação de slackware. Se você quiser atualizar apenas a lista de pacotes de um template, porém, use + +\begin{verbatim} +templatepkg -u meu-template +\end{verbatim} + +Para facilitar ainda mais o controle das alterações do sistema, existe ainda uma facilidade do arquivo /etc/simplepkg/jailist. Esse arquivo serve, além de outros propósitos descritos na \link{http://slack.sarava.org/simplaret}{documentação do simplaret}, para que o jail-commit saiba de antemão quais são as instalações de sistema do tipo Slackware presentes numa máquina, além da instalação principal na raíz do sistema. + +Suponha que uma máquina possua duas instalações de slackware, além da principal (raíz): + +\begin{itemize} + \item /mnt/slackware-1 usando o template "slackware-1" + \item /mnt/slackware-2 usando o template "slackware-2" +\end{itemize} + +Se o arquivo /etc/simplepkg/jailist contiver as seguintes linhas, + +\begin{verbatim} +/mnt/slackware-1 +/mnt/slackware-2 +\end{verbatim} + +então o comando + +\begin{verbatim} +jail-commit +\end{verbatim} + +atualizará o template "slackware-1" de acordo com o conteúdo da jaula /mnt/slackware-1 e o template "slackware-2" com o conteúdo da jaula /mnt/slackware-2. Se, além desses dois templates, existir um outro de nome "main", então o jail-commit sem argumentos também copiará as atualizações da instalação raíz, deixando-as no template "main". + +Você pode inclusive colocar uma entrada no crontab do tipo + +\begin{verbatim} +20 4 * * * jail-commit +\end{verbatim} + +para que seus templates sejam atualizados diariamente. Se você ainda possui o envio de emails configurado na sua máquina, então a saída do jail-commit será enviada pelo cron diariamente para seu email, contendo diffs das alterações de arquivos de configuração a lista de pacotes adicionados ou removidos no sistema. + +\section{Restaurando arquivos de configuração numa jaula} + +A operação contrária ao que o jail-commit faz também é possível: suponha que você mexeu na configuração do sistema mas se arrependeu das alterações e deseja voltar a configuração para o modo como ela se encontra no seu template, basta usar o comando + +\begin{verbatim} +jail-update /mnt/hda2 meu-slackware +\end{verbatim} + +\section{Armazenando as configurações no repositório Subversion} + +Para aumentar ainda mais a flexibilidade e o controle do conteúdo dos templates, é possível armazená-los num repositório Subversion. Para isso, edite o arquivo /etc/simplepkg/simplepkg.conf e deixe o parâmetro de configuração \emph{TEMPLATES\_UNDER\_SVN} com o valor "yes". + +Depois, crie um repositório subversion para armazenar seus templates, usando algo como + +\begin{verbatim} +svnadmin create /var/svn/simplepkg --fs-type fsfs +\end{verbatim} + +Com o repositório criado, basta importar seus templates com o comando + +\begin{verbatim} +templatepkg -e file:///var/svn/simplepkg +\end{verbatim} + +A partir daí, o comando jail-commit enviará automaticamente todas as alterações dos templates para o repositório subversion. Se, por outro lado, você quiser baixar as alterações dos templates que estão no repositório remoto para sua cópia local, use o comando + +\begin{verbatim} +templatepkg -s +\end{verbatim} + +Caso você queira importar uma pasta de templates de um repositório já existente, use + +\begin{verbatim} +templatepkg -i file:///var/svn/simplepkg +\end{verbatim} + +onde file:///var/svn/simplepkg é o camninho do repositório. + +\section{Atualização de jaulas} + +A atualização de jaulas e sistemas instalados é feita através do \link{http://slack.sarava.org/simplaret}{simplaret} e também utiliza o arquivo /etc/simplepkg/jailist. Para mais informações a respeito, consulte a \link{http://slack.sarava.org/simplaret}{documentação do simplaret} para mais detalhes. + +\section{Arquiteturas e versões diferentes} + +O \emph{simplepkg} foi idealizado para permitir que um mesmo template possa ser usado para criar jaulas de arquiteturas e versões diferentes de sistemas padrão slackware. A atualização desses sistemas também é unificada. Essa possibilidade só é permitida se você usa o \link{http://slack.sarava.org/simplaret}{simplaret} e não o swaret como ferramenta de obtenção de pacotes. + +Por exemplo, para criar uma instalação de slackware 10.1 (assumindo que suas definições de repositórios do /etc/simplepkg/repos.conf contenham locais com slack 10.1), basta usar o comando + +\begin{verbatim} +VERSION=10.1 mkjail minha-jaula template-servidor +\end{verbatim} + +Arquiteturas diferentes também podem ser usadas. Se você está num sistema x86\_64 e quer instalar um slack 10.2 numa partição, experimente + +\begin{verbatim} +ARCH=i386 VERSION=10.2 ROOT=/mnt mkjail hda2 meu-slackware +\end{verbatim} + +Note que os templates independem de arquitetura e versão, já que eles só contém nomes de pacotes, arquivos de configuração e scripts. + +\section{Criando um pacote de um template} + +Se, por algum motivo, você quiser construir um pacote com o conteúdo de um template, experimente o comando + +\begin{verbatim} +templatepkg -p nome-do-template +\end{verbatim} + +No entanto, o \emph{simplepkg} foi criado para que esse tipo de comportamento seja evitado, já que é mais simples manter templates de configuração do que pacotes contendo a configuração de uma instalação. + +\section{Construindo pacotes} + +Até aqui, apenas mostramos os aplicativos do \emph{simplepkg} usados para a manutenção de instalações de slackware. No entanto, uma das outras finalidades desta suíte é a construção de pacotes, o que é feita pelo programa createpkg, Como dito anteriormente, o createpkg: baixa, compila e empacota software de acordo com scripts presentes num repositório de scripts, funcionando com um gerenciador de "ports" para slackware. + +O createpkg pode funcionar com qualquer tipo de script de construção de pacotes (SlackBuilds) mas funcionará melhor se os mesmos seguirem o padrão descrito na página + +\begin{verbatim} +http://slack.sarava.org/wiki/Main/SlackBuilds +\end{verbatim} + +Especificamente, o createpkg foi desenvolvido para utilizar os slackbuild disponíveis em \link{http://slack.sarava.org/slackbuilds}{http://slack.sarava.org/slackbuilds}. O createpkg trabalha com repositórios do tipo subversion. + +Para obter os scripts do repositório do slack.sarava.org, digite + +\begin{verbatim} +createpkg --sync +\end{verbatim} + +Em seguida, você pode listas todos os scripts disponíveis: + +\begin{verbatim} +createpkg --list +\end{verbatim} + +Para buscar por um pacote, use + +\begin{verbatim} +createpkg --search latex2html +\end{verbatim} + +No caso, a busca é feita pelo SlackBuild do aplicativo "latex2html". Suponha agora que você queira construir o pacote desse aplicativo: + +\begin{verbatim} +createpkg latex2html +\end{verbatim} + +O pacote resultante estará na pasta /tmp ou no valor especificado pela variável de ambiente \emph{\$REPOS}. Para criar e também instalar o pacote, basta + +\begin{verbatim} +createpkg --install latex2html +\end{verbatim} + +Se o pacote possuir dependências listadas num arquivo slack-required e que não estiverem instaladas no sistema, o createpkg tentará processá-las uma a uma antes de tentar construir o pacote desejado: se as dependências não forem encontradas no repositório de scripts, então o createpkg tentará baixá-las de um repositório binário através do \link{http://slack.sarava.org/simplaret}{simplaret}. Se você não quiser que a resolução de dependências seja seguida, use a opção --no-deps. + +Para mais detalhes de funcionamento, experimente o comando + +\begin{verbatim} +createpkg --help +\end{verbatim} + +ou então acesse a página http://slack.sarava.org/wiki/Main/SlackBuilds. + +\section{Aplicativos auxiliares} + +O \emph{simplepkg} acompanha ainda alguns aplicativos auxiliares: + +\begin{itemize} + \item lspkg: lista pacotes instalados + \item rebuildpkg: reconstrói um pacote a partir de sua entrada no /var/log/packages + \item repos: cria e mantém repositórios + \item mkbuild: cria scripts de construção de pacotes +\end{itemize} + +O comando lspkg é um utilitário simples para a visualização de pacotes instalados no sistema. Já o rebuildpkg ajuda a recuperar pacotes instalados cujo tgz original foi perdido. O comando rebuildpkg reconstrói um pacote a partir de uma entrada no /var/log/packages. O comando + +\begin{verbatim} +rebuildpkg coreutils +\end{verbatim} + +reconstrói um pacote do coreutils usando os arquivos e as metainformações listadas no arquivo do /var/log/packages/ correspondente ao coreutils. + +Por fim, os scripts repos e mkbuild são os que se encontram na etapa de maior desenvolvimento: repos cria um repositório de pacotes a partir de uma pasta contendo pacotes do tipo pkgtool e o mkbuild é um aplicativo para auxiliar a criação de scripts de construção de pacotes que podem ser utilizados sozinhos ou pelo o createpkg. + +\section{Parâmetros de configuração} + +O arquivo de configuração do \emph{simplepkg} é o /etc/simplepkg/simplepkg.conf. Ele contém parâmetros de configuração de todos os scripts, porém neste texto não trataremos das opções específicas ao \link{http://slack.sarava.org/simplaret}{simplaret}, as quais tem uma seção específica no artigo correspondente. + +\begin{itemize} + \item \emph{JAIL\_ROOT}: pasta padrão onde as jaulas são criadas pelo mkjail. Valor padrão: "/vservers". + \item \emph{ADD\_TO\_JAIL\_LIST}: controla se uma jaula criada pelo mkjail deve ser adicionada automaticamente no arquivo /etc/simplepkg/jailist. O valor padrão é "1" (habilitado). + \item \emph{TEMPLATES\_UNDER\_SVN}: indica se os templates estão armazenados num repositório subversion. O valor padrão é "no" (não). + \item \emph{TEMPLATE\_FOLDER}: indica qual é a pasta de templates. O valor padrão é "/etc/simplepkg/templates" e não é recomendável alterá-lo. + \item \emph{TEMPLATE\_STORAGE\_STYLE}: controla a forma de armazenamento de templates. O valor padrão é "own-folder" e essa opção apenas deve ser modificada se você armazena seus templates num formato antigo do \emph{simplepkg} e deseja manter compatibilidade. +\end{itemize} + +Vale lembrar que todas as opções booleanas (isto é, que podem ser apenas habilitadas ou desabilitadas) do simplepkg.conf tem os seguintes valores permitidos: "1" e "yes" para habilitado e "0" ou "no" para desabilitado. + +\section{Mais informações} + +O \emph{simplepkg} foi escrito por Silvio Rhatto (rhatto at riseup.net) sob licença GPL e seu código fonte é disponibilizado através do repositório subversion: + +\begin{verbatim} +svn checkout svn://slack.sarava.org/simplepkg +\end{verbatim} + +O wiki de desenvolvimento: http://slack.sarava.org/wiki/Main/SimplePKG e o endereço da lista de discussão utilizada para discussões sobre o \emph{simplepkg} ou mesmo distribuições e pacotes do tipo Slackware é http://listas.sarava.org/wws/info/slack. + +\end{document} diff --git a/tags/0.5.1/install/doinst.sh b/tags/0.5.1/install/doinst.sh new file mode 100644 index 0000000..a61648e --- /dev/null +++ b/tags/0.5.1/install/doinst.sh @@ -0,0 +1,3 @@ +( if [ ! -f "etc/simplepkg/simplepkg.conf" ]; then mv etc/simplepkg/simplepkg.conf.new etc/simplepkg/simplepkg.conf; fi ) +( if [ ! -f "etc/simplepkg/repos.conf" ]; then mv etc/simplepkg/repos.conf.new etc/simplepkg/repos.conf; fi ) +( if [ ! -f "etc/simplepkg/generic.mkslackbuild" ]; then mv etc/simplepkg/generic.mkSlackBuild.new etc/simplepkg/generic.mkSlackBuild; fi ) diff --git a/tags/0.5.1/install/slack-desc b/tags/0.5.1/install/slack-desc new file mode 100644 index 0000000..38ea489 --- /dev/null +++ b/tags/0.5.1/install/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' +# on the right side marks the last column you can put a character in. You must +# make exactly 11 lines for the formatting to be correct. It's also +# customary to leave one space after the ':'. + + |-----handy-ruler-------------------------------------------------------| +simplepkg: simplepkg (slackware management system) +simplepkg: +simplepkg: simplepkg is a very small set of scripts intended to help slackware +simplepkg: users and developers, like the createpkg packaging tool, simplaret +simplepkg: package retrieval, mkjail chroot installer and templatepkg template +simplepkg: management system. +simplepkg: +simplepkg: +simplepkg: +simplepkg: +simplepkg: diff --git a/tags/0.5.1/lib/common.sh b/tags/0.5.1/lib/common.sh new file mode 100644 index 0000000..980bbac --- /dev/null +++ b/tags/0.5.1/lib/common.sh @@ -0,0 +1,711 @@ +#!/bin/bash +# +# common.sh: common functions for simplepkg +# feedback: rhatto at riseup.net | gpl +# +# Uses some functions from pkgtools, which license is: +# +# Copyright 1999 Patrick Volkerding, Moorhead, Minnesota, USA +# Copyright 2001, 2002, 2003 Slackware Linux, Inc., Concord, California, USA +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + +BASE_CONF="/etc/simplepkg" +CONF="$BASE_CONF/simplepkg.conf" +JAIL_LIST="$BASE_CONF/jailist" +SIMPLARET="simplaret" + +# ----------------------------------------------- +# pkgtool functions +# ----------------------------------------------- + +function package_name { + + STRING=`basename $1 .tgz` + # Check for old style package name with one segment: + if [ "`echo $STRING | cut -f 1 -d -`" = "`echo $STRING | cut -f 2 -d -`" ]; then + echo $STRING + else # has more than one dash delimited segment + # Count number of segments: + INDEX=1 + while [ ! "`echo $STRING | cut -f $INDEX -d -`" = "" ]; do + INDEX=`expr $INDEX + 1` + done + INDEX=`expr $INDEX - 1` # don't include the null value + # If we don't have four segments, return the old-style (or out of spec) package name: + if [ "$INDEX" = "2" -o "$INDEX" = "3" ]; then + echo $STRING + else # we have four or more segments, so we'll consider this a new-style name: + NAME=`expr $INDEX - 3` + NAME="`echo $STRING | cut -f 1-$NAME -d -`" + echo $NAME + fi + fi + +} + +# ----------------------------------------------- +# package info functions +# ----------------------------------------------- + +function package_version { + + # get VERSION from a package name + local file pack version + file="`basename $1`" + pack="`package_name $1`" + version="`echo $file | sed -e "s/^$pack-//" | cut -d "-" -f 1`" + echo $version + +} + +function package_arch { + + # get ARCH from a package name + local file pack arch + file="`basename $1`" + pack="`package_name $1`" + arch="`echo $file | sed -e "s/^$pack-//" | cut -d "-" -f 2`" + echo $arch + +} + +function package_build { + + # get BUILD from a package name + local file pack build + file="`basename $1 .tgz`" + pack="`package_name $1`" + build="`echo $file | sed -e "s/^$pack-//" | cut -d "-" -f 3`" + echo $build + +} + +# ----------------------------------------------- +# package administrative functions +# ----------------------------------------------- + +function install_packages { + + local check installed unable_to_install root + + # check if is time to clean the local repository + if [ "$SIMPLARET_CLEAN" == "1" ]; then + ARCH=$ARCH VERSION=$VERSION $SIMPLARET --purge + elif [ ! -z "$SIMPLARET_PURGE_WEEKS" ] && [ "$SIMPLARET_PURGE_WEEKS" != "0" ]; then + ARCH=$ARCH VERSION=$VERSION $SIMPLARET --purge -w $SIMPLARET_PURGE_WEEKS + fi + + root="$JAIL_ROOT/$server" + + # now tries to install each package listed in the template + for pack in `cat $TEMPLATE | grep -v -e "^#" | cut -d : -f 1 | awk '{ print $1 }'`; do + + # try to install the package + ROOT=/$root ARCH=$ARCH VERSION=$VERSION $SIMPLARET --install $pack --skip-checks + + # check if the package was installed + pack="`echo $pack | sed -e 's/\+/\\\+/'`" + installed=`eval "ls /$root/var/log/packages/ | egrep -E '^$pack-[^-]+-[^-]+-[^-]+$'"` + check=$? + + if [ ! -z "$installed" ] && [ "$check" == "0" ]; then + # the package is installed + if [ ! -z "$SIMPLARET_DELETE_DURING" ] && [ "$SIMPLARET_DELETE_DURING" != "0" ]; then + SILENT=1 ARCH=$ARCH VERSION=$VERSION $SIMPLARET --purge + fi + else + unable_to_install="$unable_to_install\n\t$pack" + fi + + done + + # purge packages, if needed + if [ "$SIMPLARET_DELETE_DOWN" == "1" ]; then + ARCH=$ARCH VERSION=$VERSION $SIMPLARET --purge + fi + + if [ ! -z "$unable_to_install" ]; then + echo "mkjail was unable to install the following packages on $root:" + echo -e "$unable_to_install" + fi + +} + +function remove_packages { + + for pack in `cat $TEMPLATE | grep -v -e "^#" | cut -d : -f 1`; do + ROOT=/$JAIL_ROOT/$server removepkg $pack + done + +} + +# ----------------------------------------------- +# config file functions +# ----------------------------------------------- + +function eval_parameter { + + # usage: eval $1 parameter from $CONF + # return the evaluated parameter if available or $2 $3 ... $n + + if grep -qe "^$1=" $CONF; then + grep -e "^$1=" $CONF | cut -d = -f 2 | sed -e 's/"//g' -e "s/'//g" | sed -e 's/ *#.*$//' + else + shift + echo $* + fi + +} + +function eval_boolean_parameter { + + # get a boolean parameter from the configuration + + local value + + # get the value + value="`eval_parameter $1 $2`" + + # force case insensitiveness + value="`echo $value | tr '[:upper:]' '[:lower:]'`" + + # convert it to wheter 0 or 1 + if [ "$value" == "yes" ] || [ "$value" == "1" ]; then + echo 1 + else + echo 0 + fi + +} + +function eval_config { + + # simplepkg config file evaluation + # usage: eval_config [-u] + + if [ -f "$CONF" ]; then + + DEFAULT_ARCH="`eval_parameter DEFAULT_ARCH $(default_arch)`" + DEFAULT_VERSION="`eval_parameter DEFAULT_VERSION $(default_version)`" + + STORAGE="`eval_parameter STORAGE /var/simplaret/packages`" + JAIL_ROOT="`eval_parameter JAIL_ROOT /vservers`" + PATCHES_DIR="`eval_parameter PATCHES_DIR /var/simplaret/patches`" + ROOT_PRIORITY="`eval_parameter ROOT_PRIORITY patches slackware extra testing pasture`" + REPOS_PRIORITY="`eval_parameter REPOS_PRIORITY patches slackware extra testing pasture`" + SIMPLARET_PURGE_WEEKS="`eval_parameter SIMPLARET_PURGE_WEEKS 0`" + FTP_TOOL="`eval_parameter FTP_TOOL curl`" + HTTP_TOOL="`eval_parameter HTTP_TOOL curl`" + CONNECT_TIMEOUT="`eval_parameter CONNECT_TIMEOUT 0`" + TEMPLATE_FOLDER="`eval_parameter TEMPLATE_BASE /etc/simplepkg/templates`" + TEMPLATE_STORAGE_STYLE="`eval_parameter TEMPLATE_STORAGE_STYLE own-folder`" + + SIMPLARET_CLEAN="`eval_boolean_parameter SIMPLARET_CLEAN 1`" + SIMPLARET_DELETE_DOWN="`eval_boolean_parameter SIMPLARET_DELETE_DOWN 1`" + SIMPLARET_UPDATE="`eval_boolean_parameter SIMPLARET_UPDATE 0`" + SIMPLARET_DELETE_DURING="`eval_boolean_parameter SIMPLARET_DELETE_DURING 0`" + SIMPLARET_PURGE_PATCHES="`eval_boolean_parameter SIMPLARET_PURGE_PATCHES 1`" + SIMPLARET_DOWNLOAD_FROM_NEXT_REPO="`eval_boolean_parameter SIMPLARET_DOWNLOAD_FROM_NEXT_REPO 1`" + PASSIVE_FTP="`eval_boolean_parameter PASSIVE_FTP 0`" + WARNING="`eval_boolean_parameter WARNING 0`" + SIGNATURE_CHECKING="`eval_boolean_parameter SIGNATURE_CHECKING 0`" + DEPENDENCY_CHECKING="`eval_boolean_parameter DEPENDENCY_CHECKING 1`" + TEMPLATES_UNDER_SVN="`eval_boolean_parameter TEMPLATES_UNDER_SVN 0`" + ADD_TO_JAIL_LIST="`eval_boolean_parameter ADD_TO_JAIL_LIST 1`" + + # Enabling this option (i.e, setting to "1" or "yes"), simplaret will + # donwload even # already applied patches, a good option when you plan + # to keep local copies of all needed patches for your system + DOWNLOAD_EVEN_APPLIED_PATCHES="`eval_boolean_parameter DOWNLOAD_EVEN_APPLIED_PATCHES 0`" + + # Enabling this option, jail-upgrade will look at your + # standard repositories for new packages; if it find a package + # with different version of your current installed package and + # also this package isnt in the packages folder, then the new + # package is apllied; if in doubt, just say no or leave blank. + CONSIDER_ALL_PACKAGES_AS_PATCHES="`eval_boolean_parameter CONSIDER_ALL_PACKAGES_AS_PATCHES 0`" + + # Enabling this option (i.e, setting to "1" or "yes"), simplaret will + # store patches it finds on ROOT repositories on + # + # $PATCHES_DIR/$ARCH/$VERSION/root-$repository_name. + # + # By default this option is turned off because it breaks the standard + # way to store packages and can cause some confusion, but its an useful + # feature if you like to see all patches apart from common packages and/or + # stored in the same tree. + STORE_ROOT_PATCHES_ON_PATCHES_DIR="`eval_boolean_parameter STORE_ROOT_PATCHES_ON_PATCHES_DIR 0`" + + # now we place "patches" on the top of ROOT_PRIORITY + ROOT_PRIORITY="patches `echo $ROOT_PRIORITY | sed -e 's/patches//'`" + + else + echo $1 error: config file $CONFIG not found + exit 1 + fi + + if [ ! -d "$STORAGE" ]; then + mkdir -p $STORAGE + fi + + if [ ! -d "$PATCHES_DIR" ]; then + mkdir -p $PATCHES_DIR + fi + + if [ -z "$ARCH" ]; then + ARCH="$DEFAULT_ARCH" + fi + + if [ -z "$VERSION" ]; then + VERSION="$DEFAULT_VERSION" + fi + + if [ "$FTP_TOOL" != "wget" ] && [ "$FTP_TOOL" != "curl" ] && [ "$FTP_TOOL" != "ncftpget" ]; then + echo "$1 configuration error: invalid value $FTP_TOOL for config parameter FTP_TOOL" + echo "$1 assuming value \"curl\" for variable FTP_TOOL" + FTP_TOOL="curl" + fi + + if [ "$HTTP_TOOL" != "wget" ] && [ "$HTTP_TOOL" != "curl" ]; then + echo "$1 configuration error: invalid value $HTTP_TOOL for config parameter HTTP_TOOL" + echo "$1 assuming value \"curl\" for variable HTTP_TOOL" + HTTP_TOOL="curl" + fi + + if which $SIMPLARET &> /dev/null; then + if [ "$SIMPLARET_UPDATE" == "1" ]; then + if [ "$2" == "-u" ]; then + ARCH=$ARCH VERSION=$VERSION $SIMPLARET --update + fi + fi + else + echo "$SIMPLARET not found, please install it before run $0" + fi + + if [ "$TEMPLATE_STORAGE_STYLE" != "simplepkg-folder" ] && \ + [ "$TEMPLATE_STORAGE_STYLE" != "templates-folder" ] && \ + [ "$TEMPLATE_STORAGE_STYLE" != "own-folder" ]; then + TEMPLATE_STORAGE_STYLE="own-folder" + fi + + if [ ! -z "$ROOT" ]; then + JAIL_ROOT="$ROOT" + fi + +} + +# ----------------------------------------------- +# arch and version functions +# ----------------------------------------------- + +function default_version { + + # get version from /etc/slackware-version + if [ -f "$1/etc/slackware-version" ]; then + cat $1/etc/slackware-version | awk '{ print $2 }' | sed -e 's/.0$//' + else + echo "none" + fi + +} + +function default_arch { + + # get arch from /etc/slackware-version + + local arch + arch="`cat $1/etc/slackware-version | awk '{ print $3 }' | sed -e 's/(//' -e 's/)//'`" + + if [ -z "$arch" ]; then + echo i386 + else + echo $arch + fi + +} + +# ----------------------------------------------- +# template functions +# ----------------------------------------------- + +function search_default_template { + + if [ -e "$BASE_CONF/default.template" ]; then + TEMPLATE_BASE="$BASE_CONF/default" + echo $BASENAME using default template + elif [ -e "$TEMPLATE_FOLDER/default.template" ]; then + TEMPLATE_BASE="$TEMPLATE_FOLDER/default" + echo $BASENAME: using default template + elif [ -e "$TEMPLATE_FOLDER/default/default.template" ]; then + TEMPLATE_BASE="$TEMPLATE_FOLDER/default/default" + echo $BASENAME: using default template + elif [ -e "$BASE_CONF/defaults/templates/default/default.template" ]; then + TEMPLATE_BASE="$BASE_CONF/defaults/templates/default" + echo $BASENAME using default template + else + echo $BASENAME: error: default template not found + echo $BASENAME: please create a template using templatepkg + return 1 + fi + +} + +function search_template { + + # determine the template to be used + # usage: search-template [--new | --update] + + # + # templates can be stored either on + # + # - $BASE_CONF/template_name.template + # - $TEMPLATE_FOLDER/template_name.template + # - $TEMPLATE_FOLDER/template_name/template_name.template + # + # also, there's a folder for "oficial" simplepkg templates, + # $BASE_CONF/defaults/templates/ and you can override any template + # in the default folder by placing a template with the same name + # in the template storage folders + # + + if [ -f "$BASE_CONF/$1.template" ]; then + TEMPLATE_BASE="$BASE_CONF/$1" + elif [ -f "$TEMPLATE_FOLDER/$1.template" ]; then + TEMPLATE_BASE="$TEMPLATE_FOLDER/$1" + elif [ -f "$TEMPLATE_FOLDER/$1/$1.template" ]; then + TEMPLATE_BASE="$TEMPLATE_FOLDER/$1/$1" + elif [ -f "$BASE_CONF/defaults/templates/$1/$1.template" ] && \ + [ "$2" != "--update" ]; then + TEMPLATE_BASE="$BASE_CONF/defaults/templates/$1/$1" + else + if [ "$2" == "--new" ]; then + # we need to return the path for a new template + if [ "$TEMPLATE_STORAGE_STYLE" == "simplepkg-folder" ]; then + TEMPLATE_BASE="$BASE_CONF/$1" + elif [ "$TEMPLATE_STORAGE_STYLE" == "templates-folder" ]; then + TEMPLATE_BASE="$TEMPLATE_FOLDER/$1" + else + TEMPLATE_BASE="$TEMPLATE_FOLDER/$1/$1" + fi + elif [ "$2" == "--update" ]; then + return 1 + else + echo $BASENAME: template $1 not found + search_default_template + fi + fi + +} + +# ----------------------------------------------- +# unix permission functions +# ----------------------------------------------- + +function numeric_perm { + + # get the numeric permission of a file + # usage: numeric_perm + + # just a bit of forbidden secrets + + if [ -a "$1" ]; then + ls -lnd $1 | awk '{ print $1 }' | \ + sed -e 's/^.//' -e 's/r/4/g' -e 's/w/2/g' -e 's/x/1/g' \ + -e 's/-/0/g' -e 's/\(.\)\(.\)\(.\)/\1+\2+\3/g' | \ + fold -w5 | bc -l | xargs | sed -e 's/ //g' + fi + +} + +function get_owner { + + # get the numeric owner for a file + # usage: get_owner + + if [ -a "$1" ]; then + ls -lnd $1 | awk '{ print $3 }' + fi + +} + +function get_group { + + # get the numeric group for a file + # usage: get_group + + if [ -a "$1" ]; then + ls -lnd $1 | awk '{ print $4 }' + fi + +} + +# ----------------------------------------------- +# subversion functions +# ----------------------------------------------- + +function use_svn { + + # check if svn usage is enabled + + if [ "$TEMPLATES_UNDER_SVN" == "1" ] && \ + [ "$TEMPLATE_STORAGE_STYLE" == "own-folder" ]; then + return 0 + else + return 1 + fi + +} + +function svn_check { + + # check if a file is under svn + # usage: svn_check + + local cwd folder + + cwd="`pwd`" + folder="`dirname $1`" + + if [ -d "$folder/.svn" ]; then + + cd $folder + + if [ "`svn status $1 | awk '{ print $1 }'`" == "?" ]; then + return 1 + else + return 0 + fi + + cd $cwd + + else + + return 1 + + fi + +} + +# ----------------------------------------------- +# update jail functions +# ----------------------------------------------- + +function update_template_files { + + # update template files from svn + # usage: update_template_files + + if use_svn && [ -d "$TEMPLATE_BASE.d/.svn" ]; then + echo Checking out last template revision from svn... + cd `dirname $TEMPLATE_BASE` + svn update + fi + +} + +function copy_template_files { + + # copy template files into jail + # usage: copy_template_files + + if [ -d "$1" ]; then + if [ -d "$TEMPLATE_BASE.d" ]; then + echo "Copying template files to $1..." + if use_svn && [ -d "$TEMPLATE_BASE.d/.svn" ]; then + rsync -av --exclude=.svn $TEMPLATE_BASE.d/ $1/ + else + rsync -av $TEMPLATE_BASE.d/ $1/ + fi + fi + fi + +} + +function set_jail_perms { + + # set template file permissions under a jail + # usage: set_jail_perms + + if [ -s "$TEMPLATE_BASE.perms" ]; then + echo Setting jail $1 permissions... + cat $TEMPLATE_BASE.perms | while read entry; do + file="`echo $entry | cut -d ";" -f 1`" + if [ -e "$TEMPLATE_BASE.d/$file" ] && [ -a "$1/$file" ]; then + owner="`echo $entry | cut -d ";" -f 2`" + group="`echo $entry | cut -d ";" -f 3`" + perms="`echo $entry | cut -d ";" -f 4`" + chmod $perms $1/$file + chown $owner:$group $1/$file + fi + done + fi + +} + +# ----------------------------------------------- +# repository build functions +# ----------------------------------------------- + +function svn_add_meta { + + find . -name '*meta' -exec svn add {} 2> /dev/null \; + +} + +function gen_filelist { + + # generate FILELIST.TXT + # usage: gen_filelist + + find . -type f -name '*.tgz' -follow -print | sort | tr '\n' '\0' | \ + xargs -0r ls -ldL --time-style=long-iso > FILELIST.TXT + echo "Created new FILELIST.TXT" + +} + +function gen_patches_filelist { + + # generate FILE_LIST + # usage: gen_patches_filelist + + if [ ! -z "$1" ] && [ -d "$1" ]; then + + cwd="`pwd`" + cd $1 + for file in `find | grep -e ".tgz$"`; do ls -l $file; done > FILE_LIST + cd $cwd + + if [ "$1" == "." ]; then + echo "Created new FILE_LIST" + else + echo "Created new $1/FILE_LIST" + fi + + fi + +} + +function gen_packages_txt { + + # generate PACKAGES.TXT + # usage: gen_packages_txt + + if [ ! -z "$1" ] && [ -d "$1" ]; then + + cwd="`pwd`" + cd $1 + + echo '' > PACKAGES.TXT + find . -type f -name '*.meta' -exec cat {} \; >> PACKAGES.TXT + cat PACKAGES.TXT | gzip -9 -c - > PACKAGES.TXT.gz + cd $cwd + + if [ "$1" == "." ]; then + echo "Created new PACKAGES.TXT and PACKAGES.TXT.gz" + else + echo "Created new $1/PACKAGES.TXT and $1/PACKAGES.TXT.gz" + fi + + fi + +} + +function gen_md5_checksums { + + # generate CHECKSUMS.md5 + # usage: gen_md5_checksums + + if [ -d "$1" ]; then + + cwd="`pwd`" + cd $1 + + echo '' > CHECKSUMS.md5 + find . -type f -name '*.tgz' -exec md5sum {} \; >> CHECKSUMS.md5 + cat CHECKSUMS.md5 | gzip -9 -c - > CHECKSUMS.md5.gz + cd $cwd + + if [ "$1" == "." ]; then + echo "Created new CHECKSUMS.md5 and CHECKSUMS.md5.gz" + else + echo "Created new $1/CHECKSUMS.md5 and $1/CHECKSUMS.md5.gz" + fi + + fi + +} + +function gen_meta { + + # generate metafiles + # usage: gen_meta + + if [ ! -f $1 ]; then + echo "File not found: $1" + exit 1; + else + echo "Processing $1" + fi + + if [ "`echo $1|grep -E '(.*{1,})\-(.*[\.\-].*[\.\-].*).tgz[ ]{0,}$'`" == "" ]; then + return; + fi + + NAME=$(echo $1|sed -re "s/(.*\/)(.*.tgz)$/\2/") + LOCATION=$(echo $1|sed -re "s/(.*)\/(.*.tgz)$/\1/") + SIZE=$( expr `gunzip -l $1 | tail -n 1|awk '{print $1}'` / 1024 ) + USIZE=$( expr `gunzip -l $1 | tail -n 1|awk '{print $2}'` / 1024 ) + REQUIRED=$(tar xzfO $1 install/slack-required 2>/dev/null|xargs -r -iZ echo -n "Z,"|sed -e "s/,$//") + CONFLICTS=$(tar xzfO $1 install/slack-conflicts 2>/dev/null|xargs -r -iZ echo -n "Z,"|sed -e "s/,$//") + SUGGESTS=$(tar xzfO $1 install/slack-suggests 2>/dev/null|xargs -r ) + METAFILE=${NAME%tgz}meta + + echo "PACKAGE NAME: $NAME" > $LOCATION/$METAFILE + + if [ -n "$DL_URL" ]; then + echo "PACKAGE MIRROR: $DL_URL" >> $LOCATION/$METAFILE + fi + + echo "PACKAGE LOCATION: $LOCATION" >> $LOCATION/$METAFILE + echo "PACKAGE SIZE (compressed): $SIZE K" >> $LOCATION/$METAFILE + echo "PACKAGE SIZE (uncompressed): $USIZE K" >> $LOCATION/$METAFILE + echo "PACKAGE REQUIRED: $REQUIRED" >> $LOCATION/$METAFILE + echo "PACKAGE CONFLICTS: $CONFLICTS" >> $LOCATION/$METAFILE + echo "PACKAGE SUGGESTS: $SUGGESTS" >> $LOCATION/$METAFILE + echo "PACKAGE DESCRIPTION:" >> $LOCATION/$METAFILE + + tar xzfO $1 install/slack-desc | grep -E '\w+\:'|grep -v '^#' >> $LOCATION/$METAFILE + + echo "" >> $LOCATION/$METAFILE + +} + +# ----------------------------------------------- +# misc functions +# ----------------------------------------------- + +function slash { + + # remove additional slashes + echo $* | sed -e 's/\/\+/\//g' + +} + diff --git a/tags/0.5.1/simplepkg.SlackBuild b/tags/0.5.1/simplepkg.SlackBuild new file mode 100755 index 0000000..153267a --- /dev/null +++ b/tags/0.5.1/simplepkg.SlackBuild @@ -0,0 +1,73 @@ +#!/bin/bash +# +# SlackBuild script for simplepkg +# + +PACKAGE="simplepkg" +PACK_DIR="package-$PACKAGE" +BUILD=${BUILD:=1rha} +VERSION="0.5.1" +ARCH="noarch" +LIBEXEC="/usr/libexec/$PACKAGE" +BINDIR="/usr/bin" +BINARY_LIST="simplaret repos lspkg mkbuild" +SBINDIR="/usr/sbin" +SBINARY_LIST="exec-slackbuild mkjail templatepkg jail-update jail-commit metapkg rebuildpkg createpkg exec-slackbuild" +LIB_LIST="common.sh" +DOC_DIR="/usr/doc" +DOC_LIST="COPYING TODO CHANGELOG README README.pt_BR README.simplaret README.simplaret.pt_BR" + +rm -rf $PACK_DIR +mkdir -p $PACK_DIR/install +cp install/slack-desc $PACK_DIR/install +cp install/doinst.sh $PACK_DIR/install + +mkdir -p $PACK_DIR/$SBINDIR +for binary in $SBINARY_LIST; do + if [ -f "src/$binary" ]; then + cp src/$binary $PACK_DIR/$SBINDIR + chmod +x $PACK_DIR/$SBINDIR/$binary + fi +done + +mkdir -p $PACK_DIR/$BINDIR +for binary in $BINARY_LIST; do + cp src/$binary $PACK_DIR/$BINDIR/ + chmod +x $PACK_DIR/$BINDIR/$binary +done + +mkdir -p $PACK_DIR/$LIBEXEC +for lib in $LIB_LIST; do + cp lib/$lib $PACK_DIR/$LIBEXEC/ +done + +rm -rf $PACK_DIR/$DOC_DIR +mkdir -p $PACK_DIR/$DOC_DIR/$PACKAGE-$VERSION +for file in $DOC_LIST; do + cp doc/$file $PACK_DIR/$DOC_DIR/$PACKAGE-$VERSION/ +done + +mkdir -p $PACK_DIR/etc/$PACKAGE/{defaults,templates} +rsync -av --exclude=.svn templates/* $PACK_DIR/etc/$PACKAGE/defaults/templates/ +chmod +x $PACK_DIR/etc/$PACKAGE/defaults/templates/vserver/vserver.s/*.sh +chmod +x $PACK_DIR/etc/$PACKAGE/defaults/templates/vserver-legacy/vserver-legacy.s/*.sh +cp conf/simplepkg.conf.new $PACK_DIR/etc/$PACKAGE +cp conf/repos.conf.new $PACK_DIR/etc/$PACKAGE +cp conf/generic.mkSlackBuild.new $PACK_DIR/etc/$PACKAGE +cp utils/exec-slackbuild $PACK_DIR/$SBINDIR/ + +if [ -f "$PACK_DIR/usr/sbin/jail-upgrade" ]; then + cd $PACK_DIR/usr/sbin && ln -s jail-upgrade vserver-upgrade + cd - +fi + +cd $PACK_DIR +chown -R root.root * + +makepkg -c y -l y ../simplepkg-$VERSION-$ARCH-$BUILD.tgz +cd .. + +if [ "$CLEANUP" != "no" ]; then + rm -rf $PACK_DIR +fi + diff --git a/tags/0.5.1/src/createpkg b/tags/0.5.1/src/createpkg new file mode 100644 index 0000000..a80b033 --- /dev/null +++ b/tags/0.5.1/src/createpkg @@ -0,0 +1,501 @@ +#!/bin/bash +# +# createpkg: package builder using http://slack.sarava.org/slackbuilds scripts +# feedback: rhatto at riseup.net | gpl +# +# createpkg 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 2 of the License, or any later version. +# +# createpkg 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., 59 Temple +# Place - Suite 330, Boston, MA 02111-1307, USA +# +# /etc/simplepkg/slackbuildrc parameters: +# +# SLACKBUILDS_DIR="/folder/to/place/slackbuilds", defaults to /var/slackbuilds +# SVN="svn://repository", defaults do svn://slack.sarava.org/slackbuilds +# SYNC="yes|no", whether to always update the repository +# +# TODO +# +# - optionally show a dependency tree before create the package +# - in function solve_dep: resolve program versions +# - mkdir source directory - error... (please check!) + +#--------------------------------------------------- +# Createpkg functions +#--------------------------------------------------- + +CREATEPKG_VERSION="1.0.4.1" + +function error_codes { + + # Slackbuilds error codes + ERROR_WGET=31 # wget error + ERROR_MAKE=32 # make source error + ERROR_INSTALL=33 # make install error + ERROR_MD5=34 # md5sum error + ERROR_CONF=35 # ./configure error + ERROR_HELP=36 # dasable + ERROR_TAR=37 # tar error + ERROR_MKPKG=38 # makepkg error + ERROR_GPG=39 # gpg check error + ERROR_PATCH=40 # patch error + ERROR_VCS=41 # cvs error + ERROR_MKDIR=42 # make directory error + + # Createpkg error codes + ERROR_INSTPKG=200 # installpkg error + ERROR_DEPEN=201 # dependency error + SCRIPT_OR_PACKAGE_NOT_FOUND=202 # Script or package not found +} + +function eecho { + + # echoes a message + # usage: eecho + # message-type can be: commun, messag, error, normal + + echo -e "${1}${2}${normal}" + +} + +function handle_error { + + # This function deals with internal createpkg errors + # and also with non-zero exit codes from slackbuilds + # Input: $1 - error code + # Output: Error mensage + # + # check slackbuild exit status are: + # + # ERROR_WGET=31; ERROR_MAKE=32; ERROR_INSTALL=33 + # ERROR_MD5=34; ERROR_CONF=35; ERROR_HELP=36 + # ERROR_TAR=37; ERROR_MKPKG=38 ERROR_GPG=39 + # ERROR_PATCH=40; ERROR_VCS=41; ERROR_MKDIR=42 + # + # thanks to rudsonalves at yahoo.com.br for this spec. + + # we don't want to process when exit status = 0 + [ "$1" == "0" ] && return + + # Exit codes + case $1 in + 2) usage ;; + 3) eecho $alert "$BASENAME: could not update the repository $2" ;; + 4) eecho $alert "$BASENAME: could not create folder $2" ;; + 5) eecho $alert "$BASENAME: script not found for $2" ;; + $ERROR_WGET) + eecho $error "$BASENAME: error downloading source/package for $2" ;; + $ERROR_MAKE) + eecho $error "$BASENAME: error compiling $2 source code" ;; + $ERROR_INSTALL) + eecho $error "$BASENAME: error installing $2" ;; + $ERROR_MD5) + eecho $error "$BASENAME: error on source code integrity check for $2" ;; + $ERROR_CONF) + eecho $error "$BASENAME: error configuring the source code for $2" ;; + $ERROR_HELP) + exit 0 ;; # its supposed to never happen here :P + $ERROR_TAR) + eecho $error "$BASENAME: error decompressing source code for $2" ;; + $ERROR_MKPKG) + eecho $error "$BASENAME: error creating package $2" ;; + $ERROR_GPG) + eecho $error "$BASENAME: error verifying GPG signature the source code for $2" ;; + $ERROR_PATCH) + eecho $error "$BASENAME: error patching the source code for $2" ;; + $ERROR_VCS) + eecho $error "$BASENAME: error downloading $2 source from version control system" ;; + $ERROR_MKDIR) + eecho $error "$BASENAME: make directory $2 error, aborting" ;; + $ERROR_INSTPKG) + eecho $error "$BASENAME: install package $2 error, aborting" ;; + $ERROR_DEPEN) + eecho $error "$BASENAME: dependency solve error, aborting" ;; + *) eecho $error "$BASENAME: unknown error or user interrupt" ;; + $SCRIPT_OR_PACKAGE_NOT_FOUND) + eecho $error "$BASENAME: SlackBuild or package not found" ;; + esac + + exit $1 + +} + +function build_repo { + + # Checkout a new slackbuild working copy + BASEDIR="`dirname $SLACKBUILDS_DIR`" + mkdir -p $BASEDIR || handle_error 4 $BASEDIR + cd $BASEDIR + svn checkout $SVN + cd $SLACKBUILDS_DIR + +} + +function usage { + + # Help mensage + eecho $commun "Createpkg version $CREATEPKG_VERSION\n" + eecho $commun "Usage: createpkg [--install/-i] package-name" + eecho $commun " createpkg --no-deps/-np package-name" + eecho $commun " createpkg --search/-s package-name" + eecho $commun " createpkg --info/-f package-name" + eecho $commun " createpkg --list/-l" + eecho $commun " createpkg --sync" + eecho $commun " createpkg --help/-h" +} + +function check_config { + + # check the configuration + TMP=${TMP:=/tmp}; + REPOS=${REPOS:=$TMP}; + # Create $TMP and $REPOS if need + [ ! -e $TPM ] && mkdir $TMP + [ ! -e $REPOS ] && mkdir $REPOS + # + SLACKBUILDS_DIR=${SLACKBUILDS_DIR:=/var/slackbuilds} + SVN=${SVN:=svn://slack.sarava.org/slackbuilds} + SYNC=${SYNC:=no} + BASEDIR="`dirname $SLACKBUILDS_DIR`" + +} + +function solve_dep { + + # Solve dependency + local PACK="$1" + local COND="$2" + local VER="$3" + + # Check package in local system + PACK="`echo $PACK | sed -e 's/\+/\\\+/'`" + INSTALLED=`eval "ls /var/log/packages/ | egrep -E '^$PACK-[^-]+-[^-]+-[^-]+$'"` + CHECK=$? + + # TODO: Make check version procedures + if [ -z "$INSTALLED" ]; then + if [ $CHECK -ne 0 ]; then + # Check package in SlackBuilds tree + eecho $messag "$BASENAME: processing $PACKAGE dependency $PACK" + SYNC=no CREATEPKG_CHILD=$CREATEPKG_CHILD createpkg --install $PACK + + # check if the package was built and installed + EXIT_CODE="$?" + + if [ "$EXIT_CODE" == "5" ]; then + + # exit code 5 == slackbuild not found + # try to use simplaret + ARCH=$DEFAULT_ARCH simplaret --update + ARCH=$DEFAULT_ARCH simplaret --install $PACK + EXIT_CODE="$?" + if [ "$EXIT_CODE" != "0" ]; then + handle_error $SCRIPT_OR_PACKAGE_NOT_FOUND $PACK + fi + + elif [ "$EXIT_CODE" != "0" ]; then + handle_error $EXIT_CODE $PACK + fi + + fi + fi + +} + +function check_repo { + + # Verify if repository exist + [ ! -d "$SLACKBUILDS_DIR" ] && build_repo + +} + +function sync_repo { + + # Synchronize repository + cd $SLACKBUILDS_DIR + svn update || build_repo + #simplaret --update + +} + +function find_slackbuild { + + # Find SlackBuild script in the repository + find $SLACKBUILDS_DIR -iname $1.SlackBuild + +} + +function info_builds { + + # Show packages info + if [ "$PKG_PATH" != "" ]; then + for i in $PKG_PATH; do + PACKAGE=`basename $i .SlackBuild` + NAME_UP=`echo $PACKAGE | tr [a-z] [A-Z]` + eecho $commun "$NAME_UP: " + + PKG_DIR=`dirname $i` + if [ -e $PKG_DIR/slack-desc ]; then + eval "cat $PKG_DIR/slack-desc | grep '^$PACKAGE:' | cut -f2- -d:" + eecho $normal + else + eval "cat $i | grep '^$PACKAGE:' | cut -f2- -d:" + eecho $normal + fi + + if [ -e $PKG_DIR/slack-required ]; then + eecho $commun "slack-required" + cat $PKG_DIR/slack-required | sed 's/^/ /' + fi + done + fi + +} + +function list_builds { + + # List all available SlackBuilds + cd $SLACKBUILDS_DIR + echo "Sarava SlackBuilds list" + # level 1 + for i in *; do + if [ -d $i ]; then + echo -e " $i: " + ( + cd $i + # level 2 + for j in *; do + if [ -d $j ]; then + eecho $commun " $j" + ( + cd $j + BUILD="`ls *.SlackBuild 2>/dev/null`" + if [ "$BUILD" != "" ]; then + # level 3 + for k in $BUILD; do + eecho $messag " $k" + done + else + BUILD="" + fi + for k in *; do + if [ -d $k ]; then + eecho $messag " $k.SlackBuild" + fi + done + ) + fi + done + ) + fi + done + +} + +function color_select { + + # Select color mode: gray, color or none (*) + # commun - Communication + # messag - Commum messages + # error - Error messages + # normal - turn off color + case "$1" in + 'gray') + commun="\033[37;1m" + messag="\033[37;1m" + error="\033[30;1m" + alert="\033[37m" + normal="\033[m" + ;; + 'color') + commun="\033[34;1m" # green + messag="\033[32;1m" # blue + error="\033[31;1m" # red + alert="\033[33;1m" # yellow + normal="\033[m" # normal + ;; + *) + commun="" + messag="" + error="" + alert="" + normal="" + ;; + esac + +} + +#--------------------------------------------------- +# Starting createpkg +#--------------------------------------------------- +# Common functions +COMMON="/usr/libexec/simplepkg/common.sh" +SIMPLEPKG_CONF="/etc/simplepkg/simplepkg.conf" + +# Loading error codes +error_codes + +# First load simplepkg helper functions +source $COMMON && source $SIMPLEPKG_CONF +if [ $? -ne 0 ]; then + eecho $error "error: file $COMMON not found, check your $BASENAME installation" + exit 1 +fi + +# Load slackbuildrc definitions +if [ -f ~/.slackbuildrc ]; then + source ~/.slackbuildrc +else + source /etc/slackbuildrc 2>/dev/null +fi + +# Select color mode: gray, color or none (*) +color_select $COLOR + +# This is used to show how many children process we have +if [ -z "$CREATEPKG_CHILD" ]; then + CREATEPKG_CHILD="1" +else + let CREATEPKG_CHILD++ +fi + +BASENAME="`basename $0`[$CREATEPKG_CHILD]" + +check_config +check_repo + +case $1 in + '--search'|'-s') + [ $# -ne 2 ] && handle_error 2 # two parameters is required + find_slackbuild $2 + exit + ;; + '--info'|'-f') + [ $# -ne 2 ] && handle_error 2 # two parameters is required + PKG_PATH=`find_slackbuild $2` + info_builds + exit + ;; + '--install'|'-i') + [ $# -ne 2 ] && handle_error 2 # two parameters is required + PACKAGE="$2" + INSTALL="1" + ;; + '--no-deps'|'-nd') + [ $# -ne 2 ] && handle_error 2 # two parameters is required + NO_DEPS="1" + PACKAGE="$2" + ;; + '--sync') + sync_repo + exit 0 + ;; + '--help'|'-h'|'') + usage + exit 0 + ;; + '--list'|'-l') + list_builds + exit 0 + ;; + *) + if [ "${1:0:1}" != "-" ]; then + PACKAGE="$1" + else + handle_error 2 + fi + ;; +esac + +# Synchronize repository +[ "$SYNC" == "yes" ] && sync_repo + +# Get SlackBuild script +BUILD_SCRIPT="`find_slackbuild $PACKAGE`" + +# Check SlackBuild script found +if [ -z "$BUILD_SCRIPT" ]; then + handle_error 5 $PACKAGE +fi + +# Select one SlackBuild +if [ "`echo $BUILD_SCRIPT | wc -w`" -gt 1 ]; then + AUX="$PS3" + PS3="Choice: " + LIST=`echo $BUILD_SCRIPT | sed 's/ /\n/g' | sed -r 's/.*\/(.*)\.SlackBuild$/\1/'`" EXIT" + + select PACKAGE in `echo $LIST`; do + break + done + + if [ "$PACKAGE" = "EXIT" ]; then + eecho $error "error: None package select" + exit 1 + fi + + # Select only one SlackBuild in BUILD_SCRIPT + BUILD_SCRIPT=`echo $BUILD_SCRIPT | sed 's/ /\n/g' | grep "/$PACKAGE.SlackBuild"` + PS3="$AUX" +else + #PACKAGE=`echo $BUILD_SCRIPT | sed -r 's/.*\/(.*)\.SlackBuild$/\1/'` + PACKAGE=`basename $BUILD_SCRIPT .SlackBuild` +fi + +# Get dirname and script name from slackbuild +SCRIPT_BASE="`dirname $BUILD_SCRIPT`" +SCRIPT_NAME="`basename $BUILD_SCRIPT`" +eecho $messag "$BASENAME: found script $PACKAGE.SlackBuild, now checking for dependencies" + +# Sets the package's slack-required +if [ -f "$SCRIPT_BASE/$PACKAGE.slack-required" ]; then + SLACK_REQUIRED="$SCRIPT_BASE/$PACKAGE.slack-required" +elif [ -f "$SCRIPT_BASE/slack-required" ]; then + SLACK_REQUIRED="$SCRIPT_BASE/slack-required" +fi + +if [ ! -z "$SLACK_REQUIRED" -a "$NO_DEPS" != "1" ]; then + # this routine checks for dependencies in package's slack-required + ( grep '^[^#]' $SLACK_REQUIRED | while read dep; do + if [ ! -z "$dep" ]; then + PROGRAM="`echo $dep | awk '{ print $1 }'`" + CONDITION="`echo $dep | awk '{ print $2 }' | tr [=\>\<] [egl]`" + VERSION="`echo $dep | awk '{ print $3 }' | tr -dc '[:digit:]'`" + solve_dep $PROGRAM $CONDITION $VERSION + fi + true + done ) + if [ $? -ne 0 ]; then + eecho $messag "$BASENAME: dependency solve error" + exit 1 + fi + eecho $messag "$BASENAME: done checking for $PACKAGE dependencies" +else + eecho $messag "$BASENAME: no unmet dependencies for $PACKAGE" +fi + +eecho $messag "$BASENAME: processing $SCRIPT_NAME" + +# Change to script base directory +cd $SCRIPT_BASE + +# Execute SlackBuild script with variables protection +( INTERACT=no sh ./$SCRIPT_NAME ) + +# Check if package was built +handle_error $? $PACKAGE + +PKG_TGZ="`ls -1 -c $REPOS/$PACKAGE-*-*-*.tgz | head -n 1`" + +if [ "$INSTALL" == "1" ]; then + # as we dont have the full package file name, we'll + # use the newer file name that matches our wildcard: + + upgradepkg --install-new $PKG_TGZ +fi diff --git a/tags/0.5.1/src/jail-commit b/tags/0.5.1/src/jail-commit new file mode 100755 index 0000000..f40e5cd --- /dev/null +++ b/tags/0.5.1/src/jail-commit @@ -0,0 +1,175 @@ +#!/bin/bash +# +# jail-commit: update config files from a jail to a template +# feedback: rhatto@riseup.net | gpl +# +# Jail-commit 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 2 of the License, or any later version. +# +# Jail-commit 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., 59 Temple +# Place - Suite 330, Boston, MA 02111-1307, USA +# + +COMMON="/usr/libexec/simplepkg/common.sh" +BASENAME="`basename $0`" + +if [ -f "$COMMON" ]; then + source $COMMON + eval_config $BASENAME +else + echo "error: file $COMMON found, check your $BASENAME installation" + exit 1 +fi + +function usage { + + echo $BASENAME: commit a jail configuration into a template + echo "usage: \"$BASENAME [ [template]]\"" + echo " \"$BASENAME --all\" to commit all templates" + echo " \"$BASENAME --help\" for help" + +} + +function template_merge { + + # copy differences between the jail + # and the template in the template folder + + # usage: template_merge + + if [ -z "$1" ] || [ ! -d "$TEMPLATE_BASE.d" ]; then + return 1 + fi + + echo "" > $TEMPLATE_BASE.perms.tmp + cd $TEMPLATE_BASE.d + + for file in `find | grep -v -e "/.svn$" | grep -v -e "/.svn/" | grep -v -e "^\.$"`; do + + if [[ -e "$file" && -e "$1/$file" ]]; then + + if [ ! -d "$file" ] && [ ! -h "$file" ]; then + if ! diff $file $1/$file; then + echo Updating $file + cp -af $1/$file $file + fi + elif [ -h "$file" ]; then + if [ "`readlink $file`" != "`readlink $1/$file`" ]; then + rm -f $file + ln -s `readlink $1/$file` $file + fi + fi + + perms="`numeric_perm $1/$file`" + owner="`get_owner $1/$file`" + group="`get_group $1/$file`" + + # secure the file + chown root.root $TEMPLATE_BASE.d/$file + chmod $perms $TEMPLATE_BASE.d/$file + + echo "$file;$owner;$group;$perms" >> $TEMPLATE_BASE.perms.tmp + + else + if [ ! -e "$1/$file" ]; then + echo $BASENAME: warning: missing file `slash $1/$file` + fi + fi + + done + + cat $TEMPLATE_BASE.perms.tmp | sed '/^$/d' > $TEMPLATE_BASE.perms + rm -f $TEMPLATE_BASE.perms.tmp + + if ! svn_check $TEMPLATE_BASE,perms; then + svn add $TEMPLATE_BASE,perms + fi + +} + +function template_svn_commit { + + # issue a svn_commit from a template folder + # usage: template_svn_commit + + if use_svn && [ -d "$1/.svn" ]; then + cd $1 + echo First checking out from the repository... + svn update + echo Commiting changes to the repository... + svn commit -m "changes for `date`" + if [ "$?" != "0" ]; then + echo $BASENAME: commit error + fi + fi + +} + +function do_commit { + + # commit jail changes to a repository + # usage: do_commit [template] + + local jailpath template + + jailpath="$1" + jail="`basename $jailpath`" + + if [ ! -z "$2" ]; then + template="$2" + else + template="$jail" + fi + + search_template $template --update + if [ "$?" == "0" ] && ! echo "$TEMPLATE_UPDATE_LIST" | grep -q " `basename $TEMPLATE_BASE` "; then + TEMPLATE_UPDATE_LIST=" $TEMPLATE_UPDATE_LIST `basename $TEMPLATE_BASE` " # the spaces are important + if [ "$jailpath" == "/" ]; then + echo Updating main installation... + else + echo Updating $jailpath... + fi + if [ -d "$TEMPLATE_BASE.d" ] || [ -a "$TEMPLATE_BASE.template" ]; then + SILENT=yes templatepkg -u $template $jailpath + template_merge $jailpath + fi + else + if [ -z "$SILENT" ]; then + echo $BASENAME: template $template not found + fi + return 1 + fi + +} + +TEMPLATE_UPDATE_LIST="" + +if [ "$1" == "--help" ]; then + usage +elif [ "$1" == "--all" ]; then + template_svn_commit $BASE_CONF/templates +elif echo $1 | grep -q -e "^--"; then + usage +elif [ ! -z "$1" ]; then + do_commit $1 $2 + if [ "$?" == "0" ]; then + template_svn_commit `dirname $TEMPLATE_BASE` + fi +else + SILENT="yes" + if [ -e $JAIL_LIST ]; then + for jailpath in `cat $JAIL_LIST`; do + do_commit $jailpath + done + fi + # main jail + do_commit / main + template_svn_commit $BASE_CONF/templates +fi + diff --git a/tags/0.5.1/src/jail-update b/tags/0.5.1/src/jail-update new file mode 100755 index 0000000..c5a008f --- /dev/null +++ b/tags/0.5.1/src/jail-update @@ -0,0 +1,61 @@ +#!/bin/bash +# +# jail-update: update config files from a jail to a template +# feedback: rhatto@riseup.net | gpl +# +# Jail-update 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 2 of the License, or any later version. +# +# Jail-update 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., 59 Temple +# Place - Suite 330, Boston, MA 02111-1307, USA +# + +COMMON="/usr/libexec/simplepkg/common.sh" +BASENAME="`basename $0`" + +if [ -f "$COMMON" ]; then + source $COMMON + eval_config $BASENAME +else + echo "error: file $COMMON found, check your $BASENAME installation" + exit 1 +fi + +function usage { + + echo "$BASENAME: update a jail configuration from a template" + echo "usage: $BASENAME [template]" + +} + +if [ -z "$1" ] || [ "$1" == "--help" ] || echo $1 | grep -q -e "^--"; then + usage + exit 1 +fi + +if [ -z "$2" ]; then + template_name="`basename $1`" +else + template_name="$2" +fi + +search_template $template_name --update + +if [ "$?" != "0" ]; then + echo $BASENAME: template $template_name not found + exit 1 +elif [ ! -d "$1" ]; then + echo $BASENAME: jail $1 not found + exit 1 +fi + +update_template_files +copy_template_files $1 +set_jail_perms $1 + diff --git a/tags/0.5.1/src/lspkg b/tags/0.5.1/src/lspkg new file mode 100755 index 0000000..01900f2 --- /dev/null +++ b/tags/0.5.1/src/lspkg @@ -0,0 +1,132 @@ +#!/bin/bash +# +# lspkg v0.3: view installed and contents of slackware packages +# +# feedback: rhatto at riseup.net | gpl +# +# Lspkg 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 2 of the License, or any later version. +# +# Lspkg 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., 59 Temple +# Place - Suite 330, Boston, MA 02111-1307, USA +# + +COMMON="/usr/libexec/simplepkg/common.sh" + +if [ -f "$COMMON" ]; then + source $COMMON +else + echo "error: file $COMMON not found, check your `basename $0` installation" + exit 1 +fi + +function head_line { + echo "usage: [ROOT=/otherroot] `basename $0` [option expression]" +} + +function usage { + head_line + echo " +options are: + + -v, --view: view installed package contents + -p, --print: print the contents of a package file + -r, --remove: remove matching packages + -s, --search: search a file under installed packages + -d, --description: show matching packages' descriptions +" +} + +# ----------------------------------------------------- +# lspkg +# ----------------------------------------------------- + +if [ $# -eq 2 ]; then + LIST_PKGS="`ls /$ROOT/var/log/packages/$2-[0-9]* 2> /dev/null`" + if [ -z "$LIST_PKGS" ]; then + LIST_PKGS="`ls /$ROOT/var/log/packages/$2* 2> /dev/null`" + fi +elif [ $# -eq 1 ]; then + LIST_PKGS="`ls /$ROOT/var/log/packages/$1-[0-9]* 2> /dev/null`" + if [ -z "$LIST_PKGS" ]; then + LIST_PKGS="`ls /$ROOT/var/log/packages/$1* 2> /dev/null`" + fi +else + LIST_PKGS="`ls /$ROOT/var/log/packages/ 2> /dev/null`" +fi + +LIST_PKGS="`slash $LIST_PKGS`" + +case $1 in + "-h"|"--help") + usage + ;; + "-v"|"--view") + if [ ! -z "$2" ]; then + if [ ! -z "$LIST_PKGS" ]; then + for file in $LIST_PKGS; do + less $file + done + else + if [ ! -z "$ROOT" ]; then + echo "$2: package not found on /$ROOT/var/log/packages" + else + echo "$2: package not found on /var/log/packages" + fi + fi + else + head_line + exit 1 + fi + ;; + "-p"|"--print") + if [ -f "$2" ]; then + tar ztvf $2 + else + echo $2: file not found + fi + ;; + "-r"|"--remove") + if [ ! -z "$2" ]; then + if [ ! -z "$LIST_PKGS" ]; then + removepkg /$ROOT/var/log/packages/$1-[0-9]* + fi + fi + ;; + "-s"|"--search") + if [ ! -z "$2" ]; then + eval "grep -l '\/$2$' /$ROOT/var/log/packages/*" + fi + ;; + "-d"|"--description") + if [ ! -z "$2" ]; then + for file in $LIST_PKGS; do + pack="`package_name $file`" + echo -e " Package description for $file:\n" + sed -n "/^$pack:/ { s/$pack://; p; }" $file + done + else + head_line + exit 1 + fi + ;; + *) + if [ ! -z "$LIST_PKGS" ]; then + for pack in $LIST_PKGS; do + echo $pack + done + else + if [ ! -z "$ROOT" ]; then + echo "$1: package not found on /$ROOT/var/log/packages" + else + echo "$1: package not found on /var/log/packages" + fi + fi + ;; +esac diff --git a/tags/0.5.1/src/mkbuild b/tags/0.5.1/src/mkbuild new file mode 100755 index 0000000..fce2533 --- /dev/null +++ b/tags/0.5.1/src/mkbuild @@ -0,0 +1,680 @@ +#!/bin/bash +# +# Script para gerar SlackBuild +# Por Rudson R. Alves +# +# Este script auxilia a criação de SlackBuilds, com o modelo +# do Luiz do Sarava Linux +# +# SlackBuilds são scripts utilizados no Slackware para gerar +# pacotes tgz. +# +# Version 0.9.8 +PROG_VERSION=0.9.8 + +#-------------------------------------------------------------------- +# Functions +#-------------------------------------------------------------------- +function mkbuild_use() + +{ + # mkbuild help function + echo " +NAME + mkbuild - create SlackBuild script from .mkbuild input file + +SYNOPSIS + mkbuild [OPIONS] [mkbuild_file] + +DESCRIPTION + input file with build rules and variables + + Input options: + -a, --author + author name + -ai, --author_initials + author signature + -cs, --const_string + construction string to source name + -u, --url + url address to source + -pn, --pkg_name + package name + -sn, --src_name + source name + -pv, --pkg_version + package version + -md, --model + SlackBuild model file + -j, --jobs + Number of jobs to run simultaneously + --prefix + Prefix install directory + + Program options: + -h, --help + this help mesage + -c, --commit + commit SlackBuilds in local svn tree + -v, --version + program version + +EXAMPLES + mkbuild --prefix /usr/local pyrex.mkbuild + build pyrex.SlackBuild with prefix /usr/local and pyrex.mkbuild + variables and options definitions. + +AUTHOR + Written by Rduson R. Alves + +AVAILABILITY + by svn: svn checkout svn://slack.sarava.org/simplepkg + this mkbuild is found in branches/0.6/ + +REPORTING BUGS + Report bugs to + +COPYRIGHT + Copyright © 2006 Free Software Foundation, Inc. + This is free software. You may redistribute copies of it under the + terms of the GNU General Public License + . There is NO WARRANTY, to the + extent permitted by law. +" | less +} + +function error_codes { + + # Start error codes function + NULL_STRING=499 + ERROR_FILE_NOT_FOUND=500 + ERROR_CONSTRUCTION=501 + ERROR_PROGRAM=502 + ERROR_INPUT_PAR=503 +} + +function mkbuild_error { + + # Error function + case $1 in + "$ERROR_FILE_NOT_FOUND") + echo "File $2 not found!" + ;; + "$ERROR_CONSTRUCTION") + echo "Construction error in $2 variable." + ;; + "$ERROR_PROGRAM") + echo "Program logical error." + ;; + "$ERROR_INPUT_PAR") + echo "Input parameter $2 error. See \"mkbuild --help\"." + ;; + *) + echo "Unknow error!" + ;; + esac + exit $1 +} + +function is_number { + + # Check if argument is a number + local -i int + if [ $# -eq 0 ]; then + return 1 + else + (let int=$1) 2>/dev/null + return $? # Exit status of the let thread + fi +} + +function set_parameters { + + # Get and set mkbuild variables with parameters input + # Use: set_parameters $@ + # where $@ are the parameters input + # + ALL_PAR=( $@ ) # carrega todos os parâmetros + N_PAR=$# # carrega o número de parâmetros + + i=0 # inicia o contador + # Checa todos os parâmetros passados + while [ $i -lt $N_PAR ]; do + # get parameter[i] + PAR=${ALL_PAR[$i]} + case $PAR in + '-c'|'--commit') + # Commit directory + COMMIT=1 + ;; + '-d'|'--debug') + # Debug mode + set -x + ;; + '-h'|'--help' ) + # Show help mesage + mkbuild_use && exit 0 + ;; + '-v'|'--version') + # Show program version + echo -e "\nmkbuild version $PROG_VERSION\n" && exit 0 + ;; + '-a'|'--author') + # Enter with author name + let i++ + AUTHOR=${ALL_PAR[$i]} + [ ${AUTHOR:0:1} = "-" ] && mkbuild_error $ERROR_INPUT_PAR AUTHOR + ;; + '-ai'|'--author_initials') + # Enter with author name + let i++ + AUTHOR_INITIALS=${ALL_PAR[$i]} + [ ${AUTHOR_INITIALS:0:1} = "-" ] && mkbuild_error $ERROR_INPUT_PAR AUTHOR_INITIALS + ;; + '-cs'|'--const_string') + # Enter with construction source name string + let i++ + CONST_STRING=${ALL_PAR[$i]} + [ ${CONST_STRING:0:1} = "-" ] && mkbuild_error $ERROR_INPUT_PAR CONST_STRING + ;; + '-md'|'--model') + # Enter with SlackBuild model + let i++ + MODEL=${ALL_PAR[$i]} + [ ${MODEL:0:1} = "-" ] && mkbuild_error $ERROR_INPUT_PAR MODEL + ;; + '-j'|'--jobs') + # Enter with SlackBuild model + let i++ + NUMJOBS=${ALL_PAR[$i]} + [ ${NUMJOBS:0:1} = "-" ] && mkbuild_error $ERROR_INPUT_PAR NUMJOBS + [ ! is_number $NUMJOBS ] && mkbuild_error $ERROR_INPUT_PAR NUMJOBS + NUMJOBS="-j$NUMJOBS" + ;; + '--prefix') + # Enter with SlackBuild model + let i++ + PREFIX=${ALL_PAR[$i]} + [ ${PREFIX:0:1} = "-" ] && mkbuild_error $ERROR_INPUT_PAR PREFIX + ;; + '-pn'|'--pkg_name') + # Enter with package name + let i++ + PKG_NAME=${ALL_PAR[$i]} + [ ${PKG_NAME:0:1} = "-" ] && mkbuild_error $ERROR_INPUT_PAR PKG_NAME + ;; + '-pv'|'pkg_version') + # Enter with package version + let i++ + VERSION=${ALL_PAR[$i]} + [ ${VERSION:0:1} = "-" ] && mkbuild_error $ERROR_INPUT_PAR VERSION + ;; + '-sn'|'--src_name') + # Enter with source name + let i++ + SRC_NAME=${ALL_PAR[$i]} + [ ${SRC_NAME:0:1} = '-' ] && mkbuild_error $ERROR_INPUT_PAR SRC_NAME + ;; + '-u'|'--url') + # Enter with url address + let i++ + URL=${ALL_PAR[$i]} + [ ${URL:0:1} = '-' ] && mkbuild_error $ERROR_INPUT_PAR URL + ;; + *) + # mkbuild input file + MK_INPUT_FILE="${PAR//.mkbuild}.mkbuild" + [ ! -e $MK_INPUT_FILE ] && mkbuild_error $ERROR_FILE_NOT_FOUND $MK_INPUT_FILE + ;; + esac + let i++ + done +} + +function get_variable { + + # Get variable value from mkbuild file (MK_INPUT_FILE) + [ $# -ne 1 ] && mkbuild_error $ERROR_PROGRAM + [ -z $MK_INPUT_FILE ] && echo "Warning: no [mkbuild_file]." && return 0 + + grep "^\[\[${1}\]\]" $MK_INPUT_FILE | cut -f2 -d\" +} + +function edit_file { + + # Edit file $3, by change string [[$1]] to $2 + local STR_OLD + local STR_NEW + + [ $# -ne 3 ] && mkbuild_error $ERROR_PROGRAM + STR_OLD=$( echo $1 | sed 's/\//\\\//g' ) + STR_NEW=$( echo $2 | sed 's/\//\\\//g' ) + eval "sed 's/\[\[$STR_OLD\]\]/$STR_NEW/' $3 > $AUX_TMP" + mv $AUX_TMP $3 +} + +function edit_file_full { + + # Edit file $3, by change string $1 to $2 + local STR_OLD + local STR_NEW + + [ $# -ne 3 ] && mkbuild_error $ERROR_PROGRAM + STR_OLD=$( echo $1 | sed 's/\//\\\//g' ) + STR_NEW=$( echo $2 | sed 's/\//\\\//g' ) + eval "sed 's/$STR_OLD/$STR_NEW/' $3 > $AUX_TMP" + mv $AUX_TMP $3 +} + +function start_build { + + # Build initial sections + [ $# -ne 1 ] && mkbuild_error $ERROR_PROGRAM + + edit_file "SLACKBUILD AUTHOR" "$AUTHOR" $1 + edit_file "SLACKBUILD AUTHOR INITIALS" $AUTHOR_INITIALS $1 + edit_file "SOURCE NAME" "$SRC_NAME" $1 + edit_file "PROGRAM NAME" "$PKG_NAME" $1 + edit_file "PACKAGE NAME" "$PKG_NAME" $1 + edit_file "DECOMPRESSOR" "$DECOMPRESSOR" $1 + edit_file "DECOMPRESSOR TEST FLAG" "$DECOMPRESSOR_TEST_FLAG" $1 + edit_file "PROGRAM URL" "$URL" $1 + edit_file "ARCH" "$ARCH" $1 + [ `is_number $NUMJOBS` ] && NUMJOBS="-j${NUMJOBS}" + edit_file "NUMBER OF JOBS" "$NUMJOBS" $1 + edit_file "VERSION" $VERSION $1 + edit_file "SOURCE NAME CONSTRUCTION STRING" "$CONST_STRING" $1 + edit_file "EXTENSION" "$EXTENSION" $1 + edit_file "DOWNLOAD FOLDER URL" "$URL_BASE" $1 + edit_file "OTHER CONFIGURE ARGS" "$OPTIONS" $1 + edit_file "DOCUMENTATION FILES" "$DOCFILES" $1 + edit_file "PREFIX" "$PREFIX" $1 + + edit_file_full "\$EXTENSION" "$EXTENSION" $1 +} + +function clear_files { + + # Remove temporary files + rm $AUX_TMP 2>/dev/null + rm $SLACKBUILD_TEMP 2>/dev/null +} + +function set_status { + + # Set status section + # $1 - Section + # $2 - Status + # $3 - file + [ $# -ne 3 ] && mkbuild_error $ERROR_PROGRAM + if [ "`get_status $1 $3`" != "all" ]; then + eval "sed 's/^<$1>.*$/<$1> $2/' $3" > $AUX_TMP + mv $AUX_TMP $3 + else + echo "Warning: Section $1 have status all. Can't change!" + fi +} + +function get_status { + + # Get status from section + # $1 - Section + # $2 - file + [ $# -ne 2 ] && mkbuild_error $ERROR_PROGRAM + eval "sed '/^<$1>.*$/! d' $2" +} + +function activate_sections { + + # Enable and desable sections + ACTIONS_LIST=`sed '/^#>>/,/< off/, /^<\/[a-z].*>$/ d' $SLACKBUILD_TEMP > $AUX_TMP + # Remove sections names + sed '/^<.*$/ d' $AUX_TMP > $SLACKBUILD_TEMP + # Remove clear lines + sed ':i ; $! N; s/\n// ; t i' $SLACKBUILD_TEMP | sed 's///g' | sed 's///g' | sed 's//\n/g' > $AUX_TMP + sed '1,/^#\!/ {/^#\!/ b; d }' $AUX_TMP > $SLACKBUILD +} + +function section_edit { + + # Edit sections by change you values + [ -z $MK_INPUT_FILE ] && return 0 + + SECTION_LIST=`grep '^#>[a-z]' $MK_INPUT_FILE | cut -c3-` + + # Check for sections change + [ -z "$SECTION_LIST" ] && return 0 + + # Change sections + for i in $SECTION_LIST; do + if [ "$i" = "slackdesc" ]; then + # Special slackdesc section + slackdesc_edit > $AUX_TMP + mv $AUX_TMP $SLACKBUILD_TEMP + else + # Others sections + section_change $i + fi + done +} + +function slackdesc_edit { + + # Edit slackdesc section + sed -n '1,/|-----/ { // b; /|-----/ b; p; }' $SLACKBUILD_TEMP + echo -n $PKG_NAME | tr [a-z+\-] " " + echo -n "|-----handy-ruler" + let N=18+${#PKG_NAME} + for i in `seq $N $SLACKDESC_LEN`; do + echo -n "-" + done + echo -en "|\n" + + sed -n '/#>slackdesc/,/#/! d' $SLACKBUILD_TEMP > $AUX_TMP" + # Paste new section + eval "sed -n '/#>$1/,/#<$1/ { /^#>/ b; /^#> $AUX_TMP" + # Copy second halt + eval "sed '/^<\/$1>/,$ ! d' $SLACKBUILD_TEMP >> $AUX_TMP" + + mv $AUX_TMP $SLACKBUILD_TEMP +} + +function make_slack_required { + + # Build slack-required file + [ -e slack-required ] && mv slack-required slack-required.old + [ -z "$SLACK_REQUIRED" ] && return 0 + + echo -e "# Dependency list to $SRC_NAME\n#\n# dependency [condition] [version]]" > slack-required + + echo $SLACK_REQUIRED | sed 's/:/\n/g' | while read i; do + REQ=`echo $i | awk '{ print $1 }'` + CON=`echo $i | awk '{ print $2 }'` + VER=`echo $i | awk '{ print $3 }'` + echo -e "$REQ\t\t$CON\t\t$VER" >> slack-required + done +} + +function change_others_fields { + + # Change others fields started by '[[' in .mkbuild file + grep '\[\[[A-Za-z]' $MK_INPUT_FILE | while read i; do + CHANGE="`echo $i | sed 's/\[\[\(.*\)\]\]=\"\(.*\)\"/\1/'`" + VALUE="`echo $i | sed 's/\[\[\(.*\)\]\]=\"\(.*\)\"/\2/'`" + edit_file "$CHANGE" "$VALUE" $SLACKBUILD + done +} + +function commit_slackbuild { + + # Commit SlackBuild in local Slack.Sarava tree + # Get SlackBuild path + SLACKBUILD_PATH=`validate_parameter "$SLACKBUILD_PATH" "SLACKBUILD PATH" ""` + if [ $? != 0 ]; then + # Mount SlackBuild path + AUX=`lynx -dump http://gentoo-portage.com/Search?search=$PKG_NAME | sed -n '/Results:/,+1 { /Results:/ b ; p }' | head --lines=1 | tr -d " "` + [ ! -z $AUX ] && SLACKBUILD_PATH="`dirname $AUX | tr - /`/`basename $AUX`" || SLACKBUILD_PATH="others/unclassified/$PKG_NAME" + fi + + # check SlackBuilds directory + [ ! -e $SLACKBUILDS_DIR ] && createpkg --sync + # change to SlackBuilds directory + cd $SLACKBUILDS_DIR/ + + # Add SlackBuild scripts + # check path + [ ! -e $SLACKBUILD_PATH ] && svn_mkdir $SLACKBUILD_PATH + # add SlackBuild + svn_add $SLACKBUILD $SLACKBUILD_PATH + + # check slack-required + # add slack-required + [ -e $WORK/slack-required ] && svn_add slack-required $SLACKBUILD_PATH + + cd $WORK +} + +function svn_mkdir { + + # svn make directory + [ $# -ne 1 ] && mkbuild_error 0 + + echo "svn_mkdir $1 $2" + DIR_LIST=`echo $1 | tr '/' ' '` + + DIR="" + for i in $DIR_LIST; do + DIR=$DIR/$i + [ ! -e ${DIR:1} ] && svn mkdir ${DIR:1} + done +} + +function svn_add { + + # svn add file + [ $# -ne 2 ] && mkbuild_error 0 + + # copy file + if [ -e $2/$1 ]; then + echo "$2/$1 exist. Overwriter it." + cp $WORK/$1 $2/ + else + cp $WORK/$1 $2/ + # add file to svn tree + svn add $2/$1 + fi +} + +function is_number { + + # Check if $1 is a number + local -i int + if [ $# -eq 0 ]; then + return 1 + else + (let int=$1) 2>/dev/null + return $? # Exit status of the let thread + fi +} + +function validate_parameter { + + # Validate parameter in .mkbuild file + if [ ! -z "$1" ]; then + echo "$1" + else + local STRING="`get_variable "$2"`" + if [ -z "$STRING" ]; then + [ ! -z "$3" ] && echo "$3" || return 1 + else + echo "$STRING" + fi + fi +} + +function decompress_find { + + # Find decompressor program and test flag + case $EXTENSION in + 'gz'|'GZ') + DECOMPRESSOR="gunzip" + DECOMPRESSOR_TEST_FLAG="-t" + ;; + 'bz2'|'BZ2') + DECOMPRESSOR="bunzip2" + DECOMPRESSOR_TEST_FLAG="-t" + ;; + 'zip'|'ZIP') + DECOMPRESSOR="unzip" + DECOMPRESSOR_TEST_FLAG="-t" + ;; + *) + mkbuild_error $ERROR_CONSTRUCTION "DECOMPRESSOR" + ;; + esac +} + +#============================= +# Main Program +#============================= +#----------------------------- +# Common functions +COMMON="/usr/libexec/simplepkg/common.sh" +SIMPLEPKG_CONF="/etc/simplepkg/simplepkg.conf" +WORK=`pwd` +LANG=en_US +COMMIT=0 + +if [ -f "$COMMON" ]; then + source $COMMON +else + echo "error: file $COMMON found, check your $BASENAME installation" + mk_exit 0 +fi + +# createpkg and mkbuild section +SLACKBUILDS_DIR="`eval_parameter SLACKBUILDS_DIR /var/slackbuilds`" +#----------------------------- + +# Start variables +DOWNLOAD_SOURCE=0 # desable download source +# Auxiliar file +AUX_TMP=/tmp/mkbuild_tmp.$RANDOM +# Derectory to SlackBuild models +MODEL_DIR=${MODEL_DIR:="/etc/simplepkg/defaults/mkbuild"} +# SlackDesk line length +SLACKDESC_LEN=78 + +# Load error codes +error_codes + +[ $# -eq 0 ] && mkbuild_use && exit 1 + +# Configure input parameters +set_parameters $@ + +# Get values +# Author name +AUTHOR=${AUTHOR:="`get_variable "SLACKBUILD AUTHOR"`"} +[ -z "$AUTHOR" ] && mkbuild_error $ERROR_CONSTRUCTION "SLACKBUILD AUTHOR" + +# Author initials +STR_MOUNT=`echo $AUTHOR | sed 's/ /\n/g' | sed 's/^\([A-Z]\).*/\1/' | sed ':i; $!N; s/\n//; ti' | tr [A-Z] [a-z]` +AUTHOR_INITIALS="`validate_parameter "$AUTHOR_INITIALS" "SLACKBUILD AUTHOR INITIALS" "$STR_MOUNT"`" || mkbuild_error $ERROR_CONSTRUCTION "SLACKBUILD AUTHOR INITIALS" + +# URL program +URL=`validate_parameter "$URL" "DOWNLOAD FOLDER URL" ""` || mkbuild_error $ERROR_CONSTRUCTION "URL" + +STR_MOUNT="`echo $URL | rev | cut -c1-3 | rev | tr -d '.'`" +if [ $STR_MOUNT = "gz" -o $STR_MOUNT = "tgz" -o $STR_MOUNT = "bz2" -o $STR_MOUNT = "zip" ]; then + SOURCE_NAME=`basename $URL` + URL_BASE=`dirname $URL` +else + URL_BASE=$URL +fi + +# Extension +EXTENSION=`validate_parameter "$EXTENSION" "EXTENSION" "$STR_MOUNT"` || mkbuild_error $ERROR_CONSTRUCTION "EXTENSION" + +# Build archteture +ARCH=`validate_parameter "$ARCH" "ARCH" "i486"` + +# Source name +STR_MOUNT=`echo $SOURCE_NAME | sed -r 's/(.*)-(.*)\.(.*\..*)$/\1/'` +SRC_NAME=`validate_parameter "$SRC_NAME" "SOURCE NAME" "$STR_MOUNT"` || mkbuild_error $ERROR_CONSTRUCTION "SOURCE NAME" + +# Package name +STR_MOUNT=`echo $SRC_NAME | tr [A-Z_] [a-z\-]` +PKG_NAME=`validate_parameter "$PKG_NAME" "PACKAGE NAME" "$STR_MOUNT"` + +# Version +STR_MOUNT=`echo $SOURCE_NAME | sed -r 's/(.*)-(.*)\.(.*\..*)$/\2/'` +VERSION=`validate_parameter "$VERSION" "VERSION" $STR_MOUNT` || mkbuild_error $ERROR_CONSTRUCTION "VERSION" + +# Construction source name string +CONST_STRING="`validate_parameter "$CONST_STRING" "SOURCE NAME CONSTRUCTION STRING" "\\\$SRC_NAME-\\\$VERSION.tar.$EXTENSION"`" + +# Build Source Name +[ -z $SOURCE_NAME ] && SOURCE_NAME=`eval "echo $CONST_STRING"` + +# Decompressor program and test flag +DECOMPRESSOR=`validate_parameter "$DECOMPRESSOR" "DECOMPRESSOR" ""` || decompress_find + +DECOMPRESSOR_TEST_FLAG=`validate_parameter "$DECOMPRESSOR_TEST_FLAG" "DECOMPRESSOR TEST FLAG" ""` || mkbuild_error $ERROR_CONSTRUCTION "DECOMPRESSOR TEST FLAG" + +# Documentations list +DOCFILES=`validate_parameter "$DOCFILES" "DOCUMENTATION FILES" "NEWS TODO README AUTHORS INSTALL ChangeLog MAINTAINERS COPYING readme.*"` + +# ./configure option +OPTIONS=`validate_parameter "$OPTIONS" "OTHER CONFIGURE ARGS" ""` + +# PREFIX +PREFIX=`validate_parameter "$PREFIX" "PREFIX" "/usr"` + +# Number of jobs +NUMJOBS=`validate_parameter "$NUMJOBS" "NUMBER OF JOBS" ""` + +# Make slack-required file. +SLACK_REQUIRED=`validate_parameter "$SLACK_REQUIRED" "SLACK REQUIRED" ""` + +# SlackBuild model +MODEL=`validate_parameter "$MODEL" "SLACKBUILD MODEL" "generic.mkSlackBuild"` + +# +# Start build SlackBuild +SLACKBUILD=${PKG_NAME}.SlackBuild +SLACKBUILD_TEMP=$SLACKBUILD.tmp +cp $MODEL_DIR/$MODEL $SLACKBUILD_TEMP + +# Change Strings from model +start_build $SLACKBUILD_TEMP + +# On/Off sections +activate_sections + +# Change sections +section_edit + +# Remove off sections +build_slackbuild + +# Make slack-required file +make_slack_required + +if [ -e slack-required ]; then + DEPENDENCY_LIST="`cat slack-required | awk '{print $1}' | grep '^[a-z]' | tr '\012' ' '`" + edit_file "REQUIRES" "$DEPENDENCY_LIST" $SLACKBUILD +else + edit_file "REQUIRES" "Null" $SLACKBUILD +fi + +# Others changes +change_others_fields + +# Clear temporary files +clear_files + +[ $COMMIT -eq 1 ] && commit_slackbuild + diff --git a/tags/0.5.1/src/mkjail b/tags/0.5.1/src/mkjail new file mode 100755 index 0000000..f6c935c --- /dev/null +++ b/tags/0.5.1/src/mkjail @@ -0,0 +1,113 @@ +#!/bin/bash +# +# mkjail v0.4: chroot jail maker +# +# feedback: rhatto at riseup.net | GPL +# +# Mkjail 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 2 of the License, or any later version. +# +# Mkjail 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., 59 Temple +# Place - Suite 330, Boston, MA 02111-1307, USA +# + +COMMON="/usr/libexec/simplepkg/common.sh" +BASENAME="`basename $0`" + +if [ -f "$COMMON" ]; then + source $COMMON +else + echo "error: file $COMMON found, check your `basename $0` installation" + exit 1 +fi + +function usage { + + echo "usage: [ARCH=arch] [VERSION=version] [ROOT=/otherroot] $BASENAME [template]" + exit 1 + +} + +function exec_post_install_scripts { + + # exec post installation scripts + # usage: exec_post_install_script + + local list + + if [ -z "$2" ]; then + return 1 + fi + + echo "$BASENAME: executing template scripts..." + if [ -d "$TEMPLATE_BASE.s" ]; then + for file in $TEMPLATE_BASE.s/*; do + if [ -x "$file" ]; then + $file $1 $2 + fi + done + fi + +} + +function jailist_update { + + # update the jail list file + # usage: jailist_update + + if [ "$ADD_TO_JAIL_LIST" == "1" ]; then + touch $JAIL_LIST + if ! grep -q -e "^$1\$" $JAIL_LIST; then + echo $1 >> $JAIL_LIST + fi + fi + +} + +if [ -z "$1" ]; then + usage +else + server="$1" + eval_config $BASENAME -u +fi + +if [ ! -z "$2" ]; then + search_template $2 + result="$?" +else + search_default_template + result="$?" +fi + +if [ "$result" != "0" ]; then + exit 1 +fi + +TEMPLATE="$TEMPLATE_BASE.template" + +if [ ! -d "$JAIL_ROOT/$server" ]; then + mkdir -p $JAIL_ROOT/$server +else + if [ ! -z "`ls $JAIL_ROOT/$server | grep -v 'lost+found'`" ]; then + echo $BASENAME: error: folder $JAIL_ROOT/$server already exists and seens to be not empty + echo $BASENAME: probably the jail $1 already exists + exit 1 + fi +fi + +echo "$BASENAME: instaling packages into $JAIL_ROOT/$server using $TEMPLATE..." + +install_packages +copy_template_files $JAIL_ROOT/$server +set_jail_perms $JAIL_ROOT/$server +jailist_update $JAIL_ROOT/$server +exec_post_install_scripts $JAIL_ROOT $server + +echo $BASENAME: done creating $server jail + diff --git a/tags/0.5.1/src/rebuildpkg b/tags/0.5.1/src/rebuildpkg new file mode 100755 index 0000000..6d3d10c --- /dev/null +++ b/tags/0.5.1/src/rebuildpkg @@ -0,0 +1,87 @@ +#!/bin/bash +# +# rebuildpkg: build a package from a /var/log/packages entry +# +# feedback: rhatto at riseup.net | gpl +# +# Rebuildpkg 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 2 of the License, or any later version. +# +# Rebuildpkg 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., 59 Temple +# Place - Suite 330, Boston, MA 02111-1307, USA +# + +COMMON="/usr/libexec/simplepkg/common.sh" +TMP="/tmp" + +function usage { + echo "usage: ROOT=/otherroot `basename $0` " +} + +if [ -f "$COMMON" ]; then + source $COMMON +else + echo "error: file $COMMON found, check your `basename $0` installation" + exit 1 +fi + +if [ -z "$1" ]; then + usage + exit 1 +fi + +pack="$1" + +for file in `ls $ROOT/var/log/packages/$pack*`; do + if [[ "`package_name $file.tgz`" == "$pack" ]]; then + package_file="$file" + break + fi +done + +if [ -z "$package_file" ]; then + echo error: package $pack does not exist + exit 1 +fi + +if [ -d "$TMP/package-$pack" ]; then + rm -rf $TMP/package-$pack +fi + +mkdir $TMP/package-$pack +cd $TMP/package-$pack + +for file in `grep -v -e "^PACKAGE NAME:" -e "^UNCOMPRESSED PACKAGE SIZE:" \ + -e "^COMPRESSED PACKAGE SIZE:" -e "^PACKAGE LOCATION:" \ + -e "^PACKAGE DESCRIPTION:" -e "^$pack:" -e "^FILE LIST:" $package_file`; do + + if [ "$file" != "install" ] && [ "$file" != "install/slack-desc" ] && [ "$file" != "install/doinst,sh" ]; then + if [ -d /$file ]; then + mkdir -p $TMP/package-$pack/$file + elif [ -f /$file ]; then + cp /$file $TMP/package-$pack/$file + else + echo file /$file was not found, please add it manually, exploding and making the package again + fi + fi + +done + +mkdir $TMP/package-$pack/install +grep "^$pack:" $package_file > $TMP/package-$pack/install/slack-desc + +package_name="`grep "PACKAGE NAME:" $package_file | awk '{ print $3 }'`" + +if [ -f "$ROOT/var/log/scripts/$package_name" ]; then + cp $ROOT/var/log/scripts/$package_name $TMP/package-$pack/install/doinst.sh +fi + +makepkg $package_name.tgz +mv $package_name.tgz $TMP/ +echo "done: package rebuilt and stored at $TMP/$package_name.tgz" diff --git a/tags/0.5.1/src/repos b/tags/0.5.1/src/repos new file mode 100755 index 0000000..e4a17ee --- /dev/null +++ b/tags/0.5.1/src/repos @@ -0,0 +1,87 @@ +#!/bin/bash +# +# repos script got from +# http://software.jaos.org/BUILD/slapt-get/FAQ.html#slgFAQ17 +# +# 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 2 of the License, or +# any later version. +# +# Changes by rhatto at riseup.net to fit http://slack.sarava.org needs +# + +BASENAME="`basename $0`" +REPOS_CONF="/etc/simplepkg/repos.conf" +COMMON="/usr/libexec/simplepkg/common.sh" + +if [ -f "$COMMON" ]; then + source $COMMON +else + echo "error: file $COMMON found, check your $BASENAME installation" + exit 1 +fi + +function usage { + + echo "`basename $0` [pkg [file]|all|new|svnmeta|PACKAGESTXT|FILELIST|MD5]" + +} + +function do_all { + + for pkg in `find . -type f -name '*.tgz' -print`; do + gen_meta $pkg + done + $0 PACKAGESTXT + $0 FILELIST + $0 MD5 + +} + +# --------------------------------- +# main +# --------------------------------- + +case "$1" in + pkg) + if [ -n "$2" ]; then + gen_meta $2 + else + usage + fi + ;; + all) + do_all + ;; + new) + for pkg in `find . -type f -name '*.tgz' -print`; do + if [ ! -f ${pkg%tgz}meta ]; then + gen_meta $pkg + fi + done + ;; + svnmeta) + svn_add_meta + ;; + PACKAGESTXT) + gen_packages_txt . + gen_packages_txt patches + ;; + FILELIST) + gen_filelist + gen_patches_filelist patches + ;; + MD5) + gen_md5_checksums . + gen_md5_checksums patches + ;; + usage) + usage + ;; + *) + do_all + svn_add_meta + ;; +esac + diff --git a/tags/0.5.1/src/simplaret b/tags/0.5.1/src/simplaret new file mode 100755 index 0000000..c8cc2f7 --- /dev/null +++ b/tags/0.5.1/src/simplaret @@ -0,0 +1,1131 @@ +#!/bin/bash +# +# simplaret v0.2: simplepkg's retrieval tool +# feedback: rhatto at riseup.net | gpl +# +# Simplaret 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 2 of the License, or any later version. +# +# Simplaret 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., 59 Temple +# Place - Suite 330, Boston, MA 02111-1307, USA +# + +BASENAME="`basename $0`" +REPOS_CONF="/etc/simplepkg/repos.conf" +COMMON="/usr/libexec/simplepkg/common.sh" + +if [ -f "$COMMON" ]; then + source $COMMON +else + echo "error: file $COMMON found, check your $BASENAME installation" + exit 1 +fi + +function simplaret_usage { + + echo "usage: [ARCH=otherarch] [VERSION=otherversion] $BASENAME